Index: /framspy/framsfiles/_context.py
===================================================================
--- /framspy/framsfiles/_context.py	(revision 1104)
+++ /framspy/framsfiles/_context.py	(revision 1104)
@@ -0,0 +1,72 @@
+import os.path
+from xml.etree import ElementTree
+
+_FRAMSCRIPT_XML_PATH = os.path.join((os.path.dirname(__file__)), '', 'framscript.xml')
+
+
+def _create_specs_from_xml():
+    contexts = {'sim file', 'gen file'}
+    specs = dict()
+    for child in _get_root():
+        context = _get_context(child)
+        classname = _get_name(child)
+        context_key = (context, classname)
+        specs[context_key] = dict()
+        contexts.add(context)
+
+        for element in child:
+            if _is_field(element):
+                spec = dict()
+                key = _get_name(element)
+                dtype = _get_type(element)
+                if dtype is None:
+                    continue
+
+                if 'min' in element.attrib:
+                    spec['min'] = _get_min(element, dtype)
+                if 'max' in element.attrib:
+                    spec['max'] = _get_max(element, dtype)
+
+                spec['dtype'] = dtype
+                specs[context_key][key] = spec
+
+    return specs, contexts
+
+
+def _get_type(node):
+    # possible types as of 1.03.2021: {'float', 'untyped', 'integer', 'string', 'text', 'void'}
+    type_att = node.attrib['type']
+    if type_att == 'string':
+        return str
+    if type_att == 'integer':
+        return int
+    if type_att == 'float':
+        return float
+    return None
+
+
+def _get_root():
+    return ElementTree.parse(_FRAMSCRIPT_XML_PATH).getroot()
+
+
+def _get_context(node):
+    return node.attrib['context']
+
+
+def _get_name(node):
+    return node.attrib['name']
+
+
+def _get_min(node, dtype):
+    return dtype(node.attrib['min'])
+
+
+def _get_max(node, dtype):
+    return dtype(node.attrib['max'])
+
+
+def _is_field(node):
+    return node.tag == 'element' and 'type' in node.attrib
+
+
+_specs, _contexts = _create_specs_from_xml()
Index: /framspy/framsfiles/framscript.xml
===================================================================
--- /framspy/framsfiles/framscript.xml	(revision 1104)
+++ /framspy/framsfiles/framscript.xml	(revision 1104)
@@ -0,0 +1,9984 @@
+<?xml version="1.0"?>
+<!DOCTYPE framscript SYSTEM "framscript.dtd">
+<?xml-stylesheet type="text/xsl" href="framscript.xsl"?>
+<framscript>
+    <type name="expdef" context="expdef file">
+        <element name="name" type="string"/>
+        <element name="info" type="string"/>
+        <element name="code" type="string" flags="16384"/>
+        <element name="neurons" type="string"/>
+    </type>
+    <type name="prop" context="properties file">
+        <element name="id" type="string"/>
+        <element name="name" type="string"/>
+        <element name="type" type="string"/>
+        <element name="flags" type="integer"/>
+        <element name="help" type="string"/>
+        <element name="group" type="string"/>
+    </type>
+    <type name="stat" context="state file">
+        <element name="id" type="string"/>
+        <element name="name" type="string"/>
+        <element name="type" type="string"/>
+        <element name="flags" type="integer"/>
+        <element name="help" type="string"/>
+        <element name="group" type="string"/>
+    </type>
+    <type name="style" context="style file">
+        <description><![CDATA[General visual style properties.]]></description>
+        <element name="style" type="string" default="standard"/>
+        <element name="name" type="string" flags="19"/>
+        <element name="info" type="string" flags="19"/>
+        <element name="code" type="string" flags="16419"/>
+        <element name="streload" function="true" flags="2"/>
+        <element name="rebuild" function="true" flags="34"/>
+        <element name="tex" type="integer" min="0" max="2" default="1"/>
+        <element name="smooth" type="integer" min="0" max="1" default="1"/>
+        <element name="neurons" type="integer" min="0" max="1" default="1"/>
+        <element name="dust" type="integer" min="0" max="1" default="1"/>
+        <element name="energy" type="integer" min="0" max="1" default="1"/>
+    </type>
+    <type name="show" context="show file">
+        <description><![CDATA[Properties of a show for the Framsticks Theater (from the *.show file).]]></description>
+        <element name="show" type="string"/>
+        <element name="name" type="string" flags="50"/>
+        <element name="info" type="string" flags="50"/>
+        <element name="dispinfo" type="integer" min="0" max="2" flags="2"/>
+        <element name="userspeed" type="integer" min="0" max="5" default="3" flags="2"/>
+        <element name="showlog" type="integer" min="0" max="1" flags="2"/>
+        <element name="code" type="string" flags="16418"/>
+        <element name="expdef" type="string" flags="34"/>
+        <element name="reload" function="true" flags="2"/>
+        <element name="dummy" function="true" flags="2">
+            <description><![CDATA[This is the empty item in the Theater's menu]]></description>
+        </element>
+        <element name="about" function="true" flags="34"/>
+        <element name="prev_show" type="string" flags="35"/>
+        <element name="switchmode" type="integer" min="0" max="3" flags="32"/>
+        <element name="switchtime" type="integer" min="0" max="9999" flags="32">
+            <description><![CDATA[time between switching (seconds)]]></description>
+        </element>
+        <element name="switchshows" type="string" flags="32">
+            <description>
+                <![CDATA[names of the shows participating in automatic switching (comma separated). Use * as a wildcard.]]></description>
+        </element>
+        <element name="includeshows" type="string" flags="32">
+            <description><![CDATA[names of shows included in the show menu. Use * as a wildcard.]]></description>
+        </element>
+        <element name="excludeshows" type="string" flags="32">
+            <description><![CDATA[names of shows excluded from the show menu. Use * as a wildcard.]]></description>
+        </element>
+        <element name="openfilename" type="string" flags="33">
+            <description><![CDATA[Filename to be opened in onAppOpenFile()]]></description>
+        </element>
+    </type>
+    <type name="class" context="neuro file">
+        <element name="name" type="string"/>
+        <element name="longname" type="string"/>
+        <element name="description" type="string"/>
+        <element name="code" type="string" flags="16384"/>
+        <element name="prefinputs" type="integer"/>
+        <element name="prefoutput" type="integer" min="0" max="1"/>
+        <element name="preflocation" type="integer" min="0" max="2" default="0"/>
+        <element name="shape_types" type="integer" min="0" max="3" default="3"/>
+        <element name="joint_shapes" type="integer" min="0" max="15" default="15"/>
+        <element name="icon" type="string"/>
+        <element name="vhints" type="integer"/>
+    </type>
+    <type name="script" context="script file">
+        <element name="name" type="string"/>
+        <element name="code" type="string" flags="16384"/>
+        <element name="help" type="string"/>
+        <element name="group" type="string"/>
+    </type>
+    <type name="CheckpointEvent" context="Global context">
+        <description>
+            <![CDATA[Used in onSlaveCheckpoint() which is called when a Slave Simulator checkpoint is reached.]]></description>
+        <element name="index" type="integer" flags="1"/>
+        <element name="slave" type="Simulator" flags="1"/>
+        <element name="ticks" type="integer" flags="1"/>
+        <element name="data" type="untyped" flags="1"/>
+    </type>
+    <type name="Collision" context="Global context">
+        <description>
+            <![CDATA[Used in collision handlers (On___Collision). Contains the detailed information about the colliding parts (Part1,Part2 and their associated MechParts and Creatures). See the onFoodCollision() function in standard.expdef]]></description>
+        <element name="Part1" type="Object" flags="1"/>
+        <element name="Part2" type="Object" flags="1"/>
+        <element name="MechPart1" type="Object" flags="1"/>
+        <element name="MechPart2" type="Object" flags="1"/>
+        <element name="Creature1" type="Object" flags="1"/>
+        <element name="Creature2" type="Object" flags="1"/>
+    </type>
+    <type name="CrCollision" context="Global context">
+        <description><![CDATA[Used in creature collision handlers (On___CrCollision).]]></description>
+        <element name="Creature1" type="Object" flags="1"/>
+        <element name="Creature2" type="Object" flags="1"/>
+    </type>
+    <type name="Creature" context="Global context">
+        <description><![CDATA[The object inside the simulated world, including its physical structure, neural network and performance data. Food pieces, obstacles and other movable objects can be implemented as Creatures even though the are not "alive".
+Before version 4.0rc4 the static Creature object was used in event handlers and in functions operating on the "selected" creature. This is now deprecated as all operations can be performed using the more convenient direct access (see GenePools). For event handlers, the creature object will be passed as argument, like this:
+function onDied(cr) {Simulator.print("Creature "+cr.name+" has died");}
+See also: Population.]]></description>
+        <element name="name" type="string" max="40"/>
+        <element name="genotype" type="string" flags="1"/>
+        <element name="info" type="string">
+            <description><![CDATA[Additional info or comments]]></description>
+        </element>
+        <element name="group" type="untyped" deprecated="true" flags="8227">
+            <description><![CDATA[Deprecated. Use population instead.]]></description>
+        </element>
+        <element name="population" type="Population" flags="35"/>
+        <element name="index" type="integer" flags="35">
+            <description>
+                <![CDATA[Note that the index changes depending on the current creature position in the population. Use Creature.uid if you need a permanent identifier that persists through the entire object lifetime.]]></description>
+        </element>
+        <element name="num" type="integer">
+            <description><![CDATA[Acts as a unique identifier, but less strict than "uid". Unlike "uid", "num" can be changed and therefore can be saved and restored, providing persistence and continuity beyond a single application run. "num" is only guaranteed to be unique if it is autogenerated and not changed by the user, otherwise it is user's responsibility to manage the proper values of "num". Autogenerated "num" is always equal to the largest previously used "num" + 1. The largest previously used value is stored in Simulator.last_creature_num and can be changed as well (and is automatically saved and restored as a part of the Simulator state). Limitation: being a 32-bit integer, "num" overflows at about 2 billion counts.
+See also: uid]]></description>
+        </element>
+        <element name="gnum" type="integer"/>
+        <element name="buildproblems" type="integer" flags="34"/>
+        <element name="energ0" type="float" deprecated="true" flags="8226"/>
+        <element name="energy0" type="float"/>
+        <element name="idleen" type="float">
+            <description>
+                <![CDATA[The amount of energy subtracted from the energy of this creature in each simulation step, as in: cr.energy-=cr.idleen;]]></description>
+        </element>
+        <element name="energy" type="float"/>
+        <element name="perf" type="integer" min="0" max="2" deprecated="true" flags="8226">
+            <description><![CDATA[Replaced by perf_measuring]]></description>
+        </element>
+        <element name="perf_measuring" type="integer" min="0" max="2">
+            <description>
+                <![CDATA[The initial value of this property is taken from Population.initial_perf_measuring]]></description>
+        </element>
+        <element name="nnenabled" type="integer" min="0" max="2" deprecated="true" flags="8226">
+            <description><![CDATA[Replaced by nn_active]]></description>
+        </element>
+        <element name="nn_active" type="integer" min="0" max="2">
+            <description><![CDATA[The initial value of this property is taken from Population.nn_active]]></description>
+        </element>
+        <element name="bodysim" type="integer" min="0" max="1" default="1" deprecated="true" flags="8226">
+            <description><![CDATA[Replaced by physics_active]]></description>
+        </element>
+        <element name="physics_active" type="integer" min="0" max="1" default="1">
+            <description><![CDATA[(Physical) body simulation can be disabled for individual objects which makes them immovable. Disabled objects can still participate in collisions depending on their collisions masks. The initial value of this property is taken from Population.initial_physics_active.
+
+Bugs: the standard collision handler does not work for disabled objects when ODE simulation is used. It means that these objects won't physically interact with other objects. The custom (scripting) handlers work as expected.]]></description>
+        </element>
+        <element name="selfcol" type="integer" min="0" max="1" deprecated="true" flags="8226">
+            <description><![CDATA[Replaced by self_collisions]]></description>
+        </element>
+        <element name="self_collisions" type="integer" min="0" max="1">
+            <description>
+                <![CDATA[Enable/disable detection of self-collisions (within a creature body). They can only occur when using the ODE simulation engine. If enabled, the creature will have its sticks collide during lifespan.  The initial value of this property is taken from Population.initial_self_collisions.]]></description>
+        </element>
+        <element name="selfcolstate" function="true" type="integer" deprecated="true" flags="8224">
+            <description><![CDATA[Replaced by selfCollisionsCount()]]></description>
+            <arguments/>
+        </element>
+        <element name="selfCollisionsCount" function="true" type="integer" flags="32">
+            <description><![CDATA[Returns the number of self-collisions detected in the creature.]]></description>
+            <arguments/>
+        </element>
+        <element name="lifespan" type="integer">
+            <description>
+                <![CDATA[While the creature's performance measurement is enabled, the creature's lifespan is incremented in "performance sampling period" intervals.]]></description>
+        </element>
+        <element name="steps_after_birth" type="integer">
+            <description><![CDATA["Birth" is the moment when the simulation of a creature starts.]]></description>
+        </element>
+        <element name="steps_in_lifespan" type="integer">
+            <description>
+                <![CDATA["Lifespan" is the period during simulation of a creature when its performance measurement is enabled.]]></description>
+        </element>
+        <element name="distance" type="float"/>
+        <element name="c_velocity" type="float"/>
+        <element name="c_vertvelocity" type="float"/>
+        <element name="c_vertpos" type="float"/>
+        <element name="velocity" type="float"/>
+        <element name="vertpos" type="float"/>
+        <element name="vertvel" type="float"/>
+        <element name="pos_x" type="float" deprecated="true" flags="8195">
+            <description>
+                <![CDATA[(pos_x,pos_y,pos_z) is the point of minimal coordinates ("bottom left corner") of the creature, including imaginary Part sizes (Part.s, usually 1.0). See also: Creature.moveAbs]]></description>
+        </element>
+        <element name="pos_y" type="float" deprecated="true" flags="8195">
+            <description><![CDATA[See Creature.pos_x]]></description>
+        </element>
+        <element name="pos_z" type="float" deprecated="true" flags="8195">
+            <description><![CDATA[See Creature.pos_x]]></description>
+        </element>
+        <element name="size_x" type="float" deprecated="true" flags="8195">
+            <description><![CDATA[(size_x,size_y,size_z) are dimensions of the axis-aligned bounding box of the creature, including the imaginary part sizes (Part.s, usually 1.0). A creature consisting of a single default Part has the size of (2.0,2.0,2.0) - twice the Part.s value (like a sphere diameter is twice its radius).
+See also: Creature.moveAbs]]></description>
+        </element>
+        <element name="size_y" type="float" deprecated="true" flags="8195">
+            <description><![CDATA[See Creature.size_x]]></description>
+        </element>
+        <element name="size_z" type="float" deprecated="true" flags="8195">
+            <description><![CDATA[See Creature.size_x]]></description>
+        </element>
+        <element name="center_x" type="float" deprecated="true" flags="8193">
+            <description><![CDATA[Center of gravity]]></description>
+        </element>
+        <element name="center_y" type="float" deprecated="true" flags="8193">
+            <description><![CDATA[Center of gravity]]></description>
+        </element>
+        <element name="center_z" type="float" deprecated="true" flags="8193">
+            <description><![CDATA[Center of gravity]]></description>
+        </element>
+        <element name="bboxLow" type="XYZ" flags="3"/>
+        <element name="bboxHigh" type="XYZ" flags="3"/>
+        <element name="bboxCenter" type="XYZ" flags="1"/>
+        <element name="bboxSize" type="XYZ" flags="3"/>
+        <element name="bboxGroundOffset" type="float" flags="3">
+            <description><![CDATA[Due to multiple modes of simulation and Part shapes, you need to add this value to the intended creature bottom elevation to get the 'z' coordinate of the bboxLow that places the creature exactly on the specific height level.
+Example:
+creature.locationSetBboxLow(10,10,0+creature.bboxGroundOffset); //bottom of the crearture will be at level 0 on a flat ground]]></description>
+        </element>
+        <element name="centerOfGravity" type="XYZ" flags="3">
+            <description><![CDATA[Only updated once every 'perfperiod' steps!]]></description>
+        </element>
+        <element name="numparts" type="integer" flags="3"/>
+        <element name="numjoints" type="integer" flags="3"/>
+        <element name="numneurons" type="integer" flags="3"/>
+        <element name="numconnections" type="integer" flags="3"/>
+        <element name="data" type="Dictionary" flags="32768"/>
+        <element name="user1" type="untyped" deprecated="true" flags="8192"/>
+        <element name="user2" type="untyped" deprecated="true" flags="8192"/>
+        <element name="user3" type="untyped" deprecated="true" flags="8192"/>
+        <element name="move" function="true" type="void" deprecated="true" flags="8224">
+            <description><![CDATA[Replaced by locationMoveBy().]]></description>
+            <arguments>
+                <argument name="dx" type="float"/>
+                <argument name="dy" type="float"/>
+                <argument name="dz" type="float"/>
+            </arguments>
+        </element>
+        <element name="locationMoveBy" function="true" type="void" flags="32">
+            <description><![CDATA[Shift the creature by a given vector (in world coordinates).]]></description>
+            <arguments>
+                <argument name="dx" type="float"/>
+                <argument name="dy" type="float"/>
+                <argument name="dz" type="float"/>
+            </arguments>
+        </element>
+        <element name="moveAbs" function="true" type="void" deprecated="true" flags="8224">
+            <description><![CDATA[Replaced by locationSetBboxLow().]]></description>
+            <arguments>
+                <argument name="x" type="float"/>
+                <argument name="y" type="float"/>
+                <argument name="z" type="float"/>
+            </arguments>
+        </element>
+        <element name="locationSetBboxLow" function="true" type="void" flags="32">
+            <description>
+                <![CDATA[Moves the creature as determined by the "low" corner (the one with the lower coordinate values) of the bounding box of a creature.]]></description>
+            <arguments>
+                <argument name="x" type="float"/>
+                <argument name="y" type="float"/>
+                <argument name="z" type="float"/>
+            </arguments>
+        </element>
+        <element name="locationSetBboxCenter" function="true" type="void" flags="32">
+            <description>
+                <![CDATA[Moves the creature as determined by the center of the bounding box of a creature.]]></description>
+            <arguments>
+                <argument name="x" type="float"/>
+                <argument name="y" type="float"/>
+                <argument name="z" type="float"/>
+            </arguments>
+        </element>
+        <element name="moveLocal" function="true" type="void" deprecated="true" flags="8224">
+            <description><![CDATA[Replaced by locationMoveLocalBy]]></description>
+            <arguments>
+                <argument name="dx" type="float"/>
+                <argument name="dy" type="float"/>
+                <argument name="dz" type="float"/>
+            </arguments>
+        </element>
+        <element name="locationMoveLocalBy" function="true" type="void" flags="32">
+            <description>
+                <![CDATA[Local coordinates are measured with respect to the position and orientation of the first Part.]]></description>
+            <arguments>
+                <argument name="dx" type="float"/>
+                <argument name="dy" type="float"/>
+                <argument name="dz" type="float"/>
+            </arguments>
+        </element>
+        <element name="localToWorld" function="true" type="XYZ" flags="32">
+            <description>
+                <![CDATA[Local coordinates are measured with respect to the position and orientation of the first Part.]]></description>
+            <arguments>
+                <argument name="x" type="float"/>
+                <argument name="y" type="float"/>
+                <argument name="z" type="float"/>
+            </arguments>
+        </element>
+        <element name="worldToLocal" function="true" type="XYZ" flags="32">
+            <description>
+                <![CDATA[Local coordinates are measured with respect to the position and orientation of the first Part.]]></description>
+            <arguments>
+                <argument name="x" type="float"/>
+                <argument name="y" type="float"/>
+                <argument name="z" type="float"/>
+            </arguments>
+        </element>
+        <element name="orient" type="Orient" flags="33">
+            <description>
+                <![CDATA[By convention, the orientation of the creature is equal to the orientation of its first Part.]]></description>
+        </element>
+        <element name="rotate" function="true" type="void" flags="32">
+            <description>
+                <![CDATA[Rotate the creature around X, Y and Z axes. Should only be used immediately after creating a new creature (before the first simulation step is performed for this creature), otherwise further simulation can be disturbed.]]></description>
+            <arguments>
+                <argument name="x" type="float"/>
+                <argument name="y" type="float"/>
+                <argument name="z" type="float"/>
+            </arguments>
+        </element>
+        <element name="rotateLocal" function="true" type="void" flags="32">
+            <description>
+                <![CDATA[Rotate the creature around (local) X, Y and Z axes. Should only be used immediately after creating a new creature (before the first simulation step is performed for this creature), otherwise further simulation can be disturbed.]]></description>
+            <arguments>
+                <argument name="x" type="float"/>
+                <argument name="y" type="float"/>
+                <argument name="z" type="float"/>
+            </arguments>
+        </element>
+        <element name="drive" type="XYZ" flags="34">
+            <description><![CDATA[Measured in global coordinates.]]></description>
+        </element>
+        <element name="driveLocal" type="XYZ" flags="34">
+            <description><![CDATA[Measured in local coordinates, that is, with respect to the current orientation of the creature.
+See also: Creature.orient]]></description>
+        </element>
+        <element name="localDrive" type="XYZ" deprecated="true" flags="8226">
+            <description><![CDATA[This field is now called driveLocal.]]></description>
+        </element>
+        <element name="getPart" function="true" type="Part" flags="32">
+            <arguments>
+                <argument name="index" type="integer"/>
+            </arguments>
+        </element>
+        <element name="getJoint" function="true" type="Joint" flags="32">
+            <arguments>
+                <argument name="index" type="integer"/>
+            </arguments>
+        </element>
+        <element name="getNeuroDef" function="true" type="NeuroDef" flags="32">
+            <arguments>
+                <argument name="index" type="integer"/>
+            </arguments>
+        </element>
+        <element name="getMechPart" function="true" type="MechPart" flags="32">
+            <arguments>
+                <argument name="index" type="integer"/>
+            </arguments>
+        </element>
+        <element name="getMechJoint" function="true" type="MechJoint" flags="32">
+            <arguments>
+                <argument name="index" type="integer"/>
+            </arguments>
+        </element>
+        <element name="getNeuro" function="true" type="Neuro" flags="32">
+            <arguments>
+                <argument name="index" type="integer"/>
+            </arguments>
+        </element>
+        <element name="outdated_neuro_classes" type="untyped" flags="35">
+            <description>
+                <![CDATA[Names of the neuron classes that have been modified after this creature was built]]></description>
+        </element>
+        <element name="selfmask" type="integer" min="0" max="2147483647" default="0" flags="32">
+            <description>
+                <![CDATA[Creature's selfmask is set according to the Creature's Population.selfmask. See Population.selfmask for detailed information about collision handling.]]></description>
+        </element>
+        <element name="othermask" type="integer" min="0" max="2147483647" default="0" flags="32">
+            <description>
+                <![CDATA[Creature's othermask is set according to the Creature's Population.othermask. See Population.selfmask for detailed information about collision handling.]]></description>
+        </element>
+        <element name="geno" type="Geno" flags="35">
+            <description><![CDATA[Source genotype for this creature]]></description>
+        </element>
+        <element name="model" type="Model" flags="35">
+            <description><![CDATA[Source Model for this creature]]></description>
+        </element>
+        <element name="liveModel" type="Model" flags="35">
+            <description>
+                <![CDATA[A Model object that is a copy of the current (temporary) geometry of this creature]]></description>
+        </element>
+        <element name="uid" type="string" flags="1">
+            <description><![CDATA[Unique identifier that is generated on object creation. "uid" is only unique during a single application run. Subsequent runs generate the same sequence of uid values.
+See also: num]]></description>
+        </element>
+        <element name="signals" type="CreatureSignals" flags="35"/>
+        <element name="boundingBoxCollisions" function="true" type="integer" flags="34">
+            <description><![CDATA[Checks approximate collisions for the selected creature.
+Returns the collision mask calculated as ( mask & colliding_creatures.othermask ). Usually called with mask=0, which has the special meaning of using the current creature.selmask instead of 0, so that it detects the same type of collisions as the current experiment configuration.
+Passing non-zero mask value uses it instead of creature.selfmask, allowing you to include or exclude other colliding populations, as if creature.selfmask were modified temporarily.]]></description>
+            <arguments>
+                <argument name="mask" type="integer"/>
+            </arguments>
+        </element>
+        <element name="checkCollisions" function="true" type="untyped" flags="34">
+            <description><![CDATA[Returns zero if the creature does not collide with other creatures.
+Arguments:
+- mask: if not zero, temporarily replaces creature.selfmask. For details see boundingBoxCollisions()
+- accuracy:
+ 0 = testing creature bounding boxes
+ 1 = testing creature elements]]></description>
+            <arguments>
+                <argument name="mask" type="integer"/>
+                <argument name="accuracy" type="integer"/>
+            </arguments>
+        </element>
+        <element name="transferEnergyTo" function="true" type="float" flags="32">
+            <description><![CDATA[Transfers at most the requested_amount_of_energy from this creature to the recipient. Returns the amount of energy actually transferred.
+The function will only transfer positive amounts and will not transfer more energy than this creature has, so the function is equivalent to:
+if (this.energy>0 && requested_amount_of_energy>0)
+{
+  var amount = Math.min(requested_amount_of_energy, this.energy);
+  recipient.energy += amount;
+  this.energy -= amount;
+}
+
+Calling this function from inside the collision handler to transfer energy between colliding parts automatically adds the relevant MechPart references, as if transferEnergyToPart was called, i.e.
+	Collision.Creature1.transferEnergyTo(Collision.Creature2, e);
+is equivalent to:
+	Collision.Creature1.transferEnergyToPart(Collision.Part1, Collision.Creature2, Collision.Part2, e);
+When this behavior is not intended, explicit nulls in transferEnergyToPart() can be used to avoid associating the energy transfer with the currently colliding parts, like this:
+	Collision.Creature1.transferEnergyToPart(null, Collision.Creature2, null, e);]]></description>
+            <arguments>
+                <argument name="recipient" type="Creature"/>
+                <argument name="requested_amount_of_energy" type="float"/>
+            </arguments>
+        </element>
+        <element name="transferEnergyToPart" function="true" type="float" flags="32">
+            <description><![CDATA[Transfer energy between specific parts of two creatures. Part arguments are only used for visualization and can be null, which would mean "the entire creature".
+See also: transferEnergyTo()]]></description>
+            <arguments>
+                <argument name="source part" type="MechPart"/>
+                <argument name="recipient creature" type="Creature"/>
+                <argument name="recipient part" type="MechPart"/>
+                <argument name="requested_amount_of_energy" type="float"/>
+            </arguments>
+        </element>
+    </type>
+    <type name="CreatureSettings" context="Global context">
+        <description><![CDATA[Creature building parameters]]></description>
+        <element name="minjoint" type="float" min="0" max="100" default="0.0"/>
+        <element name="maxjoint" type="float" min="0" max="100" default="2.0"/>
+        <element name="randinit" type="float" min="0" max="10" default="0.01">
+            <description>
+                <![CDATA[Allowed range for initializing all neuron states with uniform distribution random numbers and zero mean. Set to 0 for deterministic initialization.]]></description>
+        </element>
+        <element name="nnoise" type="float" min="0" max="1" default="0.0">
+            <description>
+                <![CDATA[Gaussian neural noise: a random value is added to each neural output in each simulation step. Set standard deviation here to add random noise, or 0 for deterministic simulation.]]></description>
+        </element>
+        <element name="touchrange" type="float" min="0" max="100" default="1.0"/>
+        <element name="bnoise_struct" type="float" min="0" max="10" default="0.0">
+            <description>
+                <![CDATA[When >0, body constructs of creatures (position of Parts) will be randomly disturbed when they are created.]]></description>
+        </element>
+        <element name="bnoise_vel" type="float" min="0" max="10" default="0.0">
+            <description>
+                <![CDATA[Random velocities will be applied to all body Parts (in MechaStick) or rigid segments (in ODE) of newly created creatures.]]></description>
+        </element>
+    </type>
+    <type name="CreatureSignals" context="Global context">
+        <description>
+            <![CDATA[Signal sources associated with a creature. See also: Signal, WorldSignals, NeuroSignals.]]></description>
+        <element name="add" function="true" type="Signal">
+            <arguments>
+                <argument name="channel" type="string"/>
+            </arguments>
+        </element>
+        <element name="addProperty" function="true" type="Signal" flags="256">
+            <description><![CDATA[Create a signal that automatically reflects one of the creature's properties (i.e. its power is equal to the property value).
+Example:
+Creature.signals.addProperty("energy","energy"); //then, Neuro.signals.receive("energy") in a custom neuron would work similarly to a built-in smell sensor.]]></description>
+            <arguments>
+                <argument name="channel" type="string"/>
+                <argument name="property" type="untyped"/>
+            </arguments>
+        </element>
+        <element name="receive" function="true" type="float">
+            <description><![CDATA[Receive the aggregated signal power in a given channel.]]></description>
+            <arguments>
+                <argument name="channel" type="string"/>
+            </arguments>
+        </element>
+        <element name="receiveSet" function="true" type="Vector">
+            <description>
+                <![CDATA[Get all signals in the specified range. Returns a read-only vector object containing Signal objects - individual signals can be accessed as result[0], .., result[result.size-1].]]></description>
+            <arguments>
+                <argument name="channel" type="string"/>
+                <argument name="max distance" type="float"/>
+            </arguments>
+        </element>
+        <element name="receiveFilter" function="true" type="float">
+            <description><![CDATA[Receive the aggregated signal power in a given channel.
+
+Additional filtering options:
+- Max distance only receives the neighbor signals (based on their physical location)
+- Flavor filtering: only signals having the flavor similar to the specified value will be received. The flavorfilter value is the difference of flavor that reduces the received signal to 0. The "flavor attenuation" is linear, i.e., signals differing by (filter/2) in flavor will be reduced to 50%.]]></description>
+            <arguments>
+                <argument name="channel" type="string"/>
+                <argument name="max distance" type="float"/>
+                <argument name="flavor" type="float"/>
+                <argument name="flavorfilter" type="float"/>
+            </arguments>
+        </element>
+        <element name="receiveSingle" function="true" type="Signal">
+            <description>
+                <![CDATA[Find the signal source that has the highest signal power (taking into account distance).]]></description>
+            <arguments>
+                <argument name="channel" type="string"/>
+                <argument name="max distance" type="float"/>
+            </arguments>
+        </element>
+        <element name="get" function="true" type="Signal">
+            <arguments>
+                <argument name="index" type="integer"/>
+            </arguments>
+        </element>
+        <element name="size" type="integer" flags="1"/>
+        <element name="clear" function="true" type="void">
+            <arguments/>
+        </element>
+    </type>
+    <type name="CreatureSnapshot" context="Global context">
+        <description><![CDATA[A data object consisting of the same fields as the serialized Creature. Typically used for reading a Creature back from a file; Population.add(snapshot_object) recreates the Creature object from the snapshot. When the creature is added to a population and it happens to collide with the terrain, the creature will be automatically moved upwards just enough to avoid the collision.
+Serialized Creature preserves most of its data fields (including the 'data' dictionary) but only keeps aggregated information about its physical state, which is body orientation and location of the bounding box center. Individual physical body parts' locations, states and neuron states are lost.
+Restoring the state of a formerly living, serialized creature using its CreatureSnapshot is not perfect. Apart from losing information about individual body and brain parts and their states, the usual flow of calculating performance may be disturbed, which is related to the 'performance sampling period' being interrupted as well as the specifics of the 'freezing period' mechanism. In consequence, the intended behavior of 'lifespan', 'steps_in_lifespan', and performance fields may be broken. For example, when period=100, after every 100 'steps_in_lifespan', the 'lifespan' increases by 100 and the new performance data is calculated. When the period is interrupted by saving/restoring, 'steps_in_lifespan' continues to increase from the saved value, but performance counters will be waiting another full 100 steps before the next update, losing the information from the unfinished period. The resulting 'lifespan' will be lower than it would have been without interruptions, and will be inconsistent with 'steps_in_lifespan'. Because of these issues, it is strongly advised to thoroughly inspect and test the behavior of the restored Creatures in various moments in their lifepspan, and use CreatureSnapshot only when necessary.
+See also: scripts/standard_exploadsave.inc
+See also: Population.add()
+]]></description>
+        <element name="new" function="true" type="Creature">
+            <arguments/>
+        </element>
+        <element name="name" type="string" max="40"/>
+        <element name="genotype" type="string"/>
+        <element name="info" type="string">
+            <description><![CDATA[Additional info or comments]]></description>
+        </element>
+        <element name="num" type="integer">
+            <description><![CDATA[Acts as a unique identifier, but less strict than "uid". Unlike "uid", "num" can be changed and therefore can be saved and restored, providing persistence and continuity beyond a single application run. "num" is only guaranteed to be unique if it is autogenerated and not changed by the user, otherwise it is user's responsibility to manage the proper values of "num". Autogenerated "num" is always equal to the largest previously used "num" + 1. The largest previously used value is stored in Simulator.last_creature_num and can be changed as well (and is automatically saved and restored as a part of the Simulator state). Limitation: being a 32-bit integer, "num" overflows at about 2 billion counts.
+See also: uid]]></description>
+        </element>
+        <element name="gnum" type="integer"/>
+        <element name="energy0" type="float"/>
+        <element name="idleen" type="float">
+            <description>
+                <![CDATA[The amount of energy subtracted from the energy of this creature in each simulation step, as in: cr.energy-=cr.idleen;]]></description>
+        </element>
+        <element name="energy" type="float"/>
+        <element name="perf_measuring" type="integer" min="0" max="2">
+            <description>
+                <![CDATA[The initial value of this property is taken from Population.initial_perf_measuring]]></description>
+        </element>
+        <element name="nn_active" type="integer" min="0" max="2">
+            <description><![CDATA[The initial value of this property is taken from Population.nn_active]]></description>
+        </element>
+        <element name="physics_active" type="integer" min="0" max="1" default="1">
+            <description><![CDATA[(Physical) body simulation can be disabled for individual objects which makes them immovable. Disabled objects can still participate in collisions depending on their collisions masks. The initial value of this property is taken from Population.initial_physics_active.
+
+Bugs: the standard collision handler does not work for disabled objects when ODE simulation is used. It means that these objects won't physically interact with other objects. The custom (scripting) handlers work as expected.]]></description>
+        </element>
+        <element name="self_collisions" type="integer" min="0" max="1">
+            <description>
+                <![CDATA[Enable/disable detection of self-collisions (within a creature body). They can only occur when using the ODE simulation engine. If enabled, the creature will have its sticks collide during lifespan.  The initial value of this property is taken from Population.initial_self_collisions.]]></description>
+        </element>
+        <element name="lifespan" type="integer">
+            <description>
+                <![CDATA[While the creature's performance measurement is enabled, the creature's lifespan is incremented in "performance sampling period" intervals.]]></description>
+        </element>
+        <element name="steps_after_birth" type="integer">
+            <description><![CDATA["Birth" is the moment when the simulation of a creature starts.]]></description>
+        </element>
+        <element name="steps_in_lifespan" type="integer">
+            <description>
+                <![CDATA["Lifespan" is the period during simulation of a creature when its performance measurement is enabled.]]></description>
+        </element>
+        <element name="distance" type="float"/>
+        <element name="c_velocity" type="float"/>
+        <element name="c_vertvelocity" type="float"/>
+        <element name="c_vertpos" type="float"/>
+        <element name="velocity" type="float"/>
+        <element name="vertpos" type="float"/>
+        <element name="vertvel" type="float"/>
+        <element name="center_x" type="float" deprecated="true" flags="8192">
+            <description><![CDATA[Center of gravity]]></description>
+        </element>
+        <element name="center_y" type="float" deprecated="true" flags="8192">
+            <description><![CDATA[Center of gravity]]></description>
+        </element>
+        <element name="center_z" type="float" deprecated="true" flags="8192">
+            <description><![CDATA[Center of gravity]]></description>
+        </element>
+        <element name="bboxCenter" type="XYZ"/>
+        <element name="data" type="Dictionary" flags="32768"/>
+        <element name="user1" type="untyped" deprecated="true" flags="8192"/>
+        <element name="user2" type="untyped" deprecated="true" flags="8192"/>
+        <element name="user3" type="untyped" deprecated="true" flags="8192"/>
+        <element name="orient" type="Orient" flags="32">
+            <description>
+                <![CDATA[By convention, the orientation of the creature is equal to the orientation of its first Part.]]></description>
+        </element>
+        <element name="selfmask" type="integer" min="0" max="2147483647" default="0" flags="32">
+            <description>
+                <![CDATA[Creature's selfmask is set according to the Creature's Population.selfmask. See Population.selfmask for detailed information about collision handling.]]></description>
+        </element>
+        <element name="othermask" type="integer" min="0" max="2147483647" default="0" flags="32">
+            <description>
+                <![CDATA[Creature's othermask is set according to the Creature's Population.othermask. See Population.selfmask for detailed information about collision handling.]]></description>
+        </element>
+        <element name="uid" type="string">
+            <description><![CDATA[Unique identifier that is generated on object creation. "uid" is only unique during a single application run. Subsequent runs generate the same sequence of uid values.
+See also: num]]></description>
+        </element>
+    </type>
+    <type name="Dictionary" context="Global context">
+        <description><![CDATA[Dictionary associates stored values with string keys ("key" is the first argument in get/set/remove functions). Integer key can be used to enumerate all elements (note that while iterating, the elements are returned in no particular order).
+Examples:
+	var d;
+	d=Dictionary.new();
+	d.set("name","John");
+	d.set("age",44);
+Another way of doing the same:
+	d={};
+	d["name"]="John";
+	d["age"]=44;
+And the most concise way:
+	d={ "name":"John", "age":44 };
+Iterating:
+	for(var v in d) Simulator.print(v); //values
+	for(var k in d.keys) Simulator.print(k+" is "+d[k]); //keys
+	for(var i=0;i<d.size;i++) Simulator.print(d.getKey(i)+" is "+d.get(i)); //by index]]></description>
+        <element name="clear" function="true" type="void" flags="256">
+            <arguments/>
+        </element>
+        <element name="size" type="integer" flags="257"/>
+        <element name="remove" function="true" type="void" flags="256">
+            <description>
+                <![CDATA[Removes the named or indexed element (depending on the argument type: string or int).]]></description>
+            <arguments>
+                <argument name="key" type="untyped"/>
+            </arguments>
+        </element>
+        <element name="get" function="true" type="untyped" flags="256">
+            <description><![CDATA[Retrieves the named or indexed element (depending on the argument type: string or int). Accessing nonexistent keys is an error (use hasKey() if necessary).
+object.get(key) can be shortened to object[key].]]></description>
+            <arguments>
+                <argument name="key" type="untyped"/>
+            </arguments>
+        </element>
+        <element name="getKey" function="true" type="string" flags="256">
+            <description><![CDATA[Returns the key of the indexed element (0 <= index < size).]]></description>
+            <arguments>
+                <argument name="index" type="integer"/>
+            </arguments>
+        </element>
+        <element name="hasKey" function="true" type="integer" flags="256">
+            <description><![CDATA[Returns 1 (interpreted as true) if dictionary contains the supplied key, or 0 (false) otherwise.
+Example:
+   if (obj.hasKey("a"))
+      x = obj->a;]]></description>
+            <arguments>
+                <argument name="key" type="string"/>
+            </arguments>
+        </element>
+        <element name="set" function="true" type="untyped" flags="256">
+            <description><![CDATA[Set element value for the specified key or index (depending on the argument type: string or int).
+Returns the value previously associated with the given key (or index).
+object.set(key,value) can be shortened to object[key]=value. Literal string keys can use even shorter notation: object->key=value instead of object.set("key",value)
+Note the difference in the returned value:
+  var old_value=object.set("key",new_value); //'old_value' gets the value previously associated with "key"
+  var x=object["key"]=new_value; //'x' becomes 'new_value', consistently with the semantics of the assignment operator. The value previously associated with "key" is lost.]]></description>
+            <arguments>
+                <argument name="key" type="untyped"/>
+                <argument name="value" type="untyped"/>
+            </arguments>
+        </element>
+        <element name="find" function="true" type="untyped" flags="256">
+            <description><![CDATA[Returns the element key or null if not found.]]></description>
+            <arguments>
+                <argument name="value" type="untyped"/>
+            </arguments>
+        </element>
+        <element name="new" function="true" type="Dictionary">
+            <description><![CDATA[Empty directory can be also created using the {} expression.]]></description>
+            <arguments/>
+        </element>
+        <element name="toString" type="string" flags="257"/>
+        <element name="clone" function="true" type="Dictionary" flags="256">
+            <description>
+                <![CDATA[The resulting clone is a shallow copy (contains the same object references as the original). A deep copy can be obtained through serialization: String.deserialize(String.serialize(object));]]></description>
+            <arguments/>
+        </element>
+        <element name="assign" function="true" type="void" flags="256">
+            <description>
+                <![CDATA[Replaces current dictionary with dictionary contents from another object.]]></description>
+            <arguments>
+                <argument type="untyped"/>
+            </arguments>
+        </element>
+        <element name="iterator" type="Object" flags="257"/>
+        <element name="keys" type="Object" flags="257">
+            <description><![CDATA[Iterate over this object to get all keys: for(k in dict.keys) ...]]></description>
+        </element>
+    </type>
+    <type name="EnergyParticles" context="Global context">
+        <element name="enpa_lifespan_min" type="integer" min="1" max="100" default="20">
+            <description>
+                <![CDATA[Particle's lifespan is a random number taken from the specified range [min,max]]]></description>
+        </element>
+        <element name="enpa_lifespan_max" type="integer" min="1" max="100" default="30">
+            <description>
+                <![CDATA[Particle's lifespan is a random number taken from the specified range [min,max]]]></description>
+        </element>
+        <element name="enpa_amount_min" type="float" min="0" max="1000" default="1.0">
+            <description>
+                <![CDATA[A particle is emitted if the amount of energy transferred in a single step exceeds this threshold]]></description>
+        </element>
+        <element name="enpa_amount_max" type="float" min="0.01" max="1000" default="5.0">
+            <description>
+                <![CDATA[A maximum amount of energy a single particle can represent. If energy transferred in a single simulation step exceeds this amount, more particles are created.]]></description>
+        </element>
+        <element name="enpa_step_maxparticles" type="integer" min="1" max="100" default="5">
+            <description>
+                <![CDATA[Limit the number of particles created in a single step for each energy transfer]]></description>
+        </element>
+        <element name="enpa_random_pos" type="float" min="0" max="1" default="0.3">
+            <description>
+                <![CDATA[The amount of random shift used for individual particles (uniform distribution)]]></description>
+        </element>
+        <element name="enpa_turn" type="float" min="0" max="1" default="0.15">
+            <description>
+                <![CDATA[Ignore (0) or directly follow (1) the potentially moving target of a particle. Intermediate values create momentum effect as if the target was gradually adjusted.]]></description>
+        </element>
+        <element name="enpa_speedup" type="float" min="0" max="1" default="0.05">
+            <description>
+                <![CDATA[Increase particle speed by this factor in each simulation step. This can help reach moving targets (along with "Turn towards target").]]></description>
+        </element>
+        <element name="enpa_fade" type="float" min="0" max="1" default="0.9">
+            <description>
+                <![CDATA[Gradually decrease particle size before it disappears when its energy transfer has ended while the particle was on its way. The remaining energy amount is multiplied by this factor in each step. 0 means: disappear immediately, 1 means: don't decrease the size at all. Note that these parameters only concern visualization and the actual energy was already transferred.]]></description>
+        </element>
+        <element name="enpa_total_limit" type="integer" min="10" max="10000" default="1000">
+            <description>
+                <![CDATA[Limit the total number of existing energy particles (to save performance)]]></description>
+        </element>
+        <element name="enpa_display_min" type="float" min="0" max="1" default="0.2">
+            <description><![CDATA[Visible particle size at minimum energy]]></description>
+        </element>
+        <element name="enpa_display_max" type="float" min="0" max="1" default="0.3">
+            <description><![CDATA[Visible particle size at maximum energy]]></description>
+        </element>
+    </type>
+    <type name="File" context="Global context">
+        <description>
+            <![CDATA[Provides read/write access to the filesystem. Can be used in the experiment definition to save the experiment state (onExpSave) or any other information. Files are created in the "data/scripts_output" subdirectory, which is either near the Framsticks executable (if this subdirectory is writable) or in your user Documents directory.]]></description>
+        <element name="name" type="string" flags="1"/>
+        <element name="path" type="string" flags="1"/>
+        <element name="info" type="string"/>
+        <element name="writeNameObject" function="true" type="void" flags="32">
+            <arguments>
+                <argument name="name" type="string"/>
+                <argument type="Object"/>
+            </arguments>
+        </element>
+        <element name="writeObject" function="true" type="void" flags="32">
+            <arguments>
+                <argument type="Object"/>
+            </arguments>
+        </element>
+        <element name="writeObjectBegin" function="true" type="void" flags="32">
+            <arguments>
+                <argument type="Object"/>
+            </arguments>
+        </element>
+        <element name="writeObjectField" function="true" type="void" flags="32">
+            <arguments>
+                <argument type="Object"/>
+                <argument name="field index or name" type="untyped"/>
+            </arguments>
+        </element>
+        <element name="writeObjectFields" function="true" type="void" flags="32">
+            <arguments>
+                <argument type="Object"/>
+            </arguments>
+        </element>
+        <element name="writeObjectFieldForce" function="true" type="void" flags="32">
+            <arguments>
+                <argument type="Object"/>
+                <argument name="field index or name" type="untyped"/>
+            </arguments>
+        </element>
+        <element name="writeObjectFieldsForce" function="true" type="void" flags="32">
+            <arguments>
+                <argument type="Object"/>
+            </arguments>
+        </element>
+        <element name="writeObjectEnd" function="true" type="void" flags="32">
+            <arguments/>
+        </element>
+        <element name="writeString" function="true" type="void" flags="32">
+            <arguments>
+                <argument name="anything" type="untyped"/>
+            </arguments>
+        </element>
+        <element name="writeComment" function="true" type="void" flags="32">
+            <arguments>
+                <argument name="anything" type="string"/>
+            </arguments>
+        </element>
+        <element name="readLine" function="true" type="string" flags="32">
+            <description>
+                <![CDATA[Returns the next line read from file or null when there are no more lines.]]></description>
+            <arguments/>
+        </element>
+        <element name="readObject" function="true" type="void" flags="32">
+            <arguments>
+                <argument type="Object"/>
+            </arguments>
+        </element>
+        <element name="EOF" type="integer" min="0" max="1" flags="33"/>
+        <element name="readUntilEOF" function="true" type="string" flags="32">
+            <arguments/>
+        </element>
+        <element name="getContents" function="true" type="string" flags="32">
+            <description>
+                <![CDATA[Shortcut to: var f=File.open(filename); c=f.readUntilEOF(); f.close(); return c;]]></description>
+            <arguments>
+                <argument name="filename" type="string"/>
+            </arguments>
+        </element>
+        <element name="create" function="true" type="File" flags="32">
+            <arguments>
+                <argument name="filename" type="string"/>
+                <argument name="description" type="string"/>
+            </arguments>
+        </element>
+        <element name="createDirect" function="true" type="File" flags="32">
+            <description><![CDATA[Returns null if the file can't be created]]></description>
+            <arguments>
+                <argument name="filename" type="string"/>
+                <argument name="description" type="string"/>
+            </arguments>
+        </element>
+        <element name="append" function="true" type="File " flags="32">
+            <arguments>
+                <argument name="filename" type="string"/>
+                <argument name="description" type="string"/>
+            </arguments>
+        </element>
+        <element name="appendDirect" function="true" type="File " flags="32">
+            <description><![CDATA[Returns null if the file can't be appended]]></description>
+            <arguments>
+                <argument name="filename" type="string"/>
+                <argument name="description" type="string"/>
+            </arguments>
+        </element>
+        <element name="flush" function="true" type="void" flags="32">
+            <description><![CDATA[Useful for unbuffered disk files only (openDirect, appendDirect)]]></description>
+            <arguments/>
+        </element>
+        <element name="open" function="true" type="File " flags="32">
+            <description><![CDATA[Returns null if the file can't be read]]></description>
+            <arguments>
+                <argument name="filename" type="string"/>
+            </arguments>
+        </element>
+        <element name="stdin" type="File" flags="1"/>
+        <element name="stdout" type="File" flags="1"/>
+        <element name="new" function="true" type="File " flags="32">
+            <arguments/>
+        </element>
+        <element name="newFromString" function="true" type="File " flags="32">
+            <arguments>
+                <argument name="text" type="string"/>
+            </arguments>
+        </element>
+        <element name="close" function="true" type="string" flags="32">
+            <description><![CDATA[Returns file contents if it has been buffered.]]></description>
+            <arguments/>
+        </element>
+        <element name="exists" function="true" type="integer" flags="32">
+            <description><![CDATA[Sample:
+File.exists("walking.gen") -> returns 0 or 1.]]></description>
+            <arguments/>
+        </element>
+        <element name="pathseparator" type="string" flags="33"/>
+        <element name="callURL" function="true" type="Dictionary" flags="32">
+            <arguments>
+                <argument name="url" type="string"/>
+                <argument name="post data or null" type="untyped"/>
+                <argument name="callback or null" type="FunctionReference"/>
+            </arguments>
+        </element>
+    </type>
+    <type name="FunctionReference" context="Global context">
+        <description><![CDATA[Function reference objects are created using the 'function' operator. The referenced function can be called using the 'call' operator:
+
+	function abc(a,b)
+	{ return a+b; }
+
+	var f=function abc;
+	Simulator.print(typeof(f)); //"FunctionReference"
+	Simulator.print(call(f)(123,321)); //444]]></description>
+    </type>
+    <type name="GenePool" context="Global context">
+        <description><![CDATA[GenePool objects are accessed by GenePools[index], or Genotype.genepool and created by GenePools.addGroup(). Usage of the static GenePool object is not recommended.
+You can iterate directly over Genotypes in the GenePool using for(...in...) loops:
+	for(var genotype in GenePools[0]) Simulator.print(genotype.name);
+
+See also: GenePools]]></description>
+        <element name="name" type="string"/>
+        <element name="index" type="integer" flags="35"/>
+        <element name="size" type="integer" flags="3">
+            <description>
+                <![CDATA[In standard.expdef, this is equivalent to the number of unique genotypes. Standard experiment definition uses the Genotype.instances field to indicate that some genotypes exist in multiple instances despite having only one item in the group. Other experiment definitions may create multiple copies of the same genotype.]]></description>
+        </element>
+        <element name="genotype_instances" type="integer" flags="3">
+            <description>
+                <![CDATA[A sum of Genotype.instances values of all Genotypes in this gene pool.]]></description>
+        </element>
+        <element name="totalpop" type="integer" deprecated="true" flags="8195">
+            <description><![CDATA[Please use 'genotype_instances' instead of this field.]]></description>
+        </element>
+        <element name="fitness" type="string">
+            <description><![CDATA[(intended for advanced users)]]></description>
+        </element>
+        <element name="fitfun" type="integer" min="0" max="1" default="0">
+            <description><![CDATA[Enables fitness scaling.]]></description>
+        </element>
+        <element name="fitm" type="float" min="0" max="10" default="2.0">
+            <description><![CDATA[Lower threshold: how many standard deviations below average?
+(avg - n * stddev) - used for fitness shifting]]></description>
+        </element>
+        <element name="fitma" type="float" min="1" max="10" default="2.0">
+            <description><![CDATA[The best genotype is as many times
+better than the average one.]]></description>
+        </element>
+        <element name="get" function="true" type="Genotype" flags="34">
+            <arguments>
+                <argument name="index" type="integer"/>
+            </arguments>
+        </element>
+        <element name="findGeno" function="true" type="integer" deprecated="true" flags="8226">
+            <description><![CDATA[Finds the Genotype whose genes are identical to the supplied Geno object.
+Returns the Genotype index or -1 if not found.
+Deprecated. Use the more versatile GenePool.findGenotype() instead of this function.]]></description>
+            <arguments>
+                <argument type="Geno"/>
+            </arguments>
+        </element>
+        <element name="findGenotype" function="true" type="Genotype" flags="34">
+            <description><![CDATA[Finds the Genotype whose genes are identical to the supplied Genotype object, Geno object, or genotype string.
+Returns the Genotype object or null if not found.]]></description>
+            <arguments>
+                <argument name="Genotype object or Geno object or string genotype" type="untyped"/>
+            </arguments>
+        </element>
+        <element name="findUID" function="true" type="integer" flags="34">
+            <arguments>
+                <argument name="uid" type="string"/>
+            </arguments>
+        </element>
+        <element name="addGeno" function="true" type="Genotype" deprecated="true" flags="8226">
+            <description><![CDATA[Creates a new Genotype from the supplied Geno object.
+Returns the created Genotype.
+Deprecated. Use the more versatile GenePool.add() instead of this function.]]></description>
+            <arguments>
+                <argument type="Geno"/>
+            </arguments>
+        </element>
+        <element name="createFromGeno" function="true" type="Genotype" deprecated="true" flags="8226">
+            <description><![CDATA[same as addGeno (to comply with createFrom... convention)
+Deprecated. Use the more versatile GenePool.add() instead of this function.]]></description>
+            <arguments>
+                <argument type="Geno"/>
+            </arguments>
+        </element>
+        <element name="createFromString" function="true" type="Genotype" deprecated="true" flags="8226">
+            <description><![CDATA[Uses the supplied string argument.
+Deprecated. Use the more versatile GenePool.add() instead of this function.]]></description>
+            <arguments>
+                <argument name="genotype" type="string"/>
+            </arguments>
+        </element>
+        <element name="add" function="true" type="Genotype" flags="34">
+            <description><![CDATA[Creates a new Genotype from the supplied Geno or string.
+Returns the created Genotype.]]></description>
+            <arguments>
+                <argument name="Geno object or string genotype" type="untyped"/>
+            </arguments>
+        </element>
+        <element name="worst" function="true" type="Genotype" flags="34">
+            <description>
+                <![CDATA[Returns the genotype object having the lowest fitness. Unrated genotypes (with instances=0) are ranked lower than those having at least one instance.]]></description>
+            <arguments/>
+        </element>
+        <element name="best" function="true" type="Genotype" flags="34">
+            <description>
+                <![CDATA[Returns the genotype object having the highest fitness. Unrated genotypes (with instances=0) are ranked lower than those having at least one instance.]]></description>
+            <arguments/>
+        </element>
+        <element name="random" function="true" type="Genotype" flags="34">
+            <description>
+                <![CDATA[Returns a random genotype object disregarding fitness value, but taking into account 'instances'. Unrated genotypes (with instances=0) are treated as if they had instances=1.]]></description>
+            <arguments/>
+        </element>
+        <element name="roulette" function="true" type="Genotype" flags="34">
+            <description>
+                <![CDATA[Returns a randomly selected, fitness-proportional genotype object. Unrated genotypes (with instances=0) are treated as if they had instances=1 and average fitness.]]></description>
+            <arguments/>
+        </element>
+        <element name="revroulette" function="true" type="Genotype" flags="34">
+            <description>
+                <![CDATA[Returns a randomly selected, reverse fitness-proportional genotype object. Unrated genotypes (with instances=0) are treated as if they had instances=1 and average fitness.]]></description>
+            <arguments/>
+        </element>
+        <element name="tournament" function="true" type="Genotype" flags="34">
+            <description>
+                <![CDATA[Returns a tournament winner genotype object. Unrated genotypes (with instances=0) are treated as if they had instances=1 and average fitness.]]></description>
+            <arguments>
+                <argument name="genotypes in tournament" type="integer"/>
+            </arguments>
+        </element>
+        <element name="randomLikeGeno" function="true" type="Genotype" flags="34">
+            <description><![CDATA[Returns a random genotype index similar to the target genotype. Unrated genotypes (with instances=0) are treated as if they had instances=1 and average fitness. Read about details:
+http://www.framsticks.com/bib/Komosinski-et-al-2001
+http://www.framsticks.com/bib/Komosinski-and-Kubiak-2011
+http://www.framsticks.com/bib/Komosinski-2016]]></description>
+            <arguments>
+                <argument name="minimum similarity" type="float"/>
+                <argument name="target" type="Geno"/>
+            </arguments>
+        </element>
+        <element name="rouletteLikeGeno" function="true" type="Genotype" flags="34">
+            <description><![CDATA[Returns a random genotype similar to the target genotype, fitness-proportional. Unrated genotypes (with instances=0) are treated as if they had instances=1 and average fitness. Read about details:
+http://www.framsticks.com/node/795
+http://www.framsticks.com/bib/Komosinski-and-Kubiak-2011
+http://www.framsticks.com/bib/Komosinski-2016]]></description>
+            <arguments>
+                <argument name="minimum similarity" type="float"/>
+                <argument name="target" type="Geno"/>
+            </arguments>
+        </element>
+        <element name="delete" function="true" type="void" flags="34">
+            <description><![CDATA[Deletes a genotype.]]></description>
+            <arguments>
+                <argument name="genotype object or index" type="untyped"/>
+            </arguments>
+        </element>
+        <element name="deleteOne" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Deletes one individual, i.e. decreases its 'instances' and deletes the genotype if the 'instances' goes to 0.]]></description>
+            <arguments>
+                <argument name="genotype object or index" type="untyped"/>
+            </arguments>
+        </element>
+        <element name="clear" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Delete all genotypes. GenePools[group].clear() is equivalent to GenePools.clearGroup(group)]]></description>
+            <arguments/>
+        </element>
+        <element name="mergeInstances" function="true" type="void" flags="34">
+            <description><![CDATA[Merges instances of the same genotype.]]></description>
+            <arguments/>
+        </element>
+        <element name="splitInstances" function="true" type="void" flags="34">
+            <description><![CDATA[Splits genotype instances.]]></description>
+            <arguments/>
+        </element>
+        <element name="iterator" type="Object" flags="291"/>
+        <element name="getStatsMin" function="true" type="float" flags="32">
+            <description>
+                <![CDATA[Retrieves data from stats.* object. Can only be used for fields covered by stats.* (subset of Genotype fields).]]></description>
+            <arguments>
+                <argument name="field name" type="string"/>
+            </arguments>
+        </element>
+        <element name="getStatsAvg" function="true" type="float" flags="32">
+            <description>
+                <![CDATA[Retrieves data from stats.* object. Can only be used for fields covered by stats.* (subset of Genotype fields).]]></description>
+            <arguments>
+                <argument name="field name" type="string"/>
+            </arguments>
+        </element>
+        <element name="getStatsMax" function="true" type="float" flags="32">
+            <description>
+                <![CDATA[Retrieves data from stats.* object. Can only be used for fields covered by stats.* (subset of Genotype fields).]]></description>
+            <arguments>
+                <argument name="field name" type="string"/>
+            </arguments>
+        </element>
+        <element name="refreshGUI" function="true" type="void" flags="32">
+            <description><![CDATA[Notify list content changed]]></description>
+            <arguments/>
+        </element>
+    </type>
+    <type name="GenePools" context="Global context">
+        <description><![CDATA[Manages all genotypes in the experiment, organized in one or more groups.
+You can iterate directly over GenePool objects in the GenePools collection using for(...in...) loops:
+	for(var pool in GenePools) Simulator.print(pool.name);
+
+Before version 4.0rc4, some operations could only be performed on the "selected" genotype (the one pointed to by group/genotype fields in GenePools). Currently, the more convenient and recommended way is to call Genotype's or GenePool's functions that operate directly on the passed objects.
+
+The old way:
+	GenePools.newGenotype("X");
+	GenePools.mutateSelected();
+	Genotype.info="my favorite genotype";
+	GenePools.copySelected(0);
+
+Doing the same the new way:
+	var g=Genotype.newFromGeno(GenMan.mutate(Geno.newFromString("X")));
+	g.info="my favorite genotype";
+	g.moveTo(GenePools[0]);]]></description>
+        <element name="group" type="integer" deprecated="true" flags="8226">
+            <description><![CDATA[Index of the currently selected group (GenePool).]]></description>
+        </element>
+        <element name="size" type="integer" flags="3"/>
+        <element name="genotype" type="integer" deprecated="true" flags="8226">
+            <description>
+                <![CDATA[Index of the currently selected genotype or -1 if no genotype is selected.]]></description>
+        </element>
+        <element name="newGenotype" function="true" type="void" deprecated="true" flags="8226">
+            <description>
+                <![CDATA[Makes a new genotype from the supplied string and select the genotype. The resulting genotype is stored in the static Genotype object detached from the genotype group. After calling this function GenePools.genotype is -1 indicating that no genotype from the group is selected. (call "copySelected" if you want to add this gentype to the genotype group).]]></description>
+            <arguments>
+                <argument name="genotype" type="string"/>
+            </arguments>
+        </element>
+        <element name="deleteSelected" function="true" type="void" deprecated="true" flags="8226">
+            <description>
+                <![CDATA[Deletes selected genotype from the gene pool (uses the selected genotype object).]]></description>
+            <arguments/>
+        </element>
+        <element name="deleteOne" function="true" type="void" deprecated="true" flags="8226">
+            <description>
+                <![CDATA[Deletes one individual from the gene pool = decreases 'instances' and deletes the genotype if the 'instances' goes to 0.]]></description>
+            <arguments>
+                <argument name="genotype index" type="integer"/>
+            </arguments>
+        </element>
+        <element name="copySelected" function="true" type="void" deprecated="true" flags="8226">
+            <description><![CDATA[Copies the selected genotype to another group.]]></description>
+            <arguments>
+                <argument name="groupindex" type="integer"/>
+            </arguments>
+        </element>
+        <element name="getFromCreature" function="true" type="void" deprecated="true" flags="8226">
+            <description>
+                <![CDATA[Copies a genotype from the selected creature. The resulting genotype is stored in the static Genotype object detached from the genotype group.]]></description>
+            <arguments/>
+        </element>
+        <element name="getFromCreatureObject" function="true" type="void" deprecated="true" flags="8226">
+            <description>
+                <![CDATA[Copies a genotype from the creature object passed in argument. The resulting genotype is stored in the static Genotype object detached from the genotype group.]]></description>
+            <arguments>
+                <argument type="Creature"/>
+            </arguments>
+        </element>
+        <element name="addPerformanceFromCreature" function="true" type="void" deprecated="true" flags="8226">
+            <description>
+                <![CDATA[Updates the current Genotype's performance values merging them with the current Creture's performance. It assumes the Genotype.instances has a reasonable value and performs the proper weighting. Use your own function instead if these conditions are not met in your experiment.]]></description>
+            <arguments/>
+        </element>
+        <element name="mutateSelected" function="true" type="void" deprecated="true" flags="8226">
+            <description>
+                <![CDATA[Mutates the selected genotype. The resulting genotype is stored in the static Genotype object detached from the genotype group. After calling this function GenePools.genotype is -1 indicating that no genotype from the group is selected.]]></description>
+            <arguments/>
+        </element>
+        <element name="crossoverSelected" function="true" type="void" deprecated="true" flags="8226">
+            <description>
+                <![CDATA[Crossovers the selected genotype with another one (from the genotype group). The resulting genotype is stored in the static Genotype object detached from the genotype group. After calling this function GenePools.genotype is -1 indicating that no genotype from the group is selected.]]></description>
+            <arguments>
+                <argument name="other index" type="integer"/>
+            </arguments>
+        </element>
+        <element name="worst" function="true" type="integer" deprecated="true" flags="8226">
+            <description>
+                <![CDATA[Gets the worst (lowest fitness) genotype index. Unrated genotypes (instances=0) are ranked lower than those having at least one instance.]]></description>
+            <arguments/>
+        </element>
+        <element name="random" function="true" type="integer" deprecated="true" flags="8226">
+            <description><![CDATA[Gets random genotype index.]]></description>
+            <arguments/>
+        </element>
+        <element name="roulette" function="true" type="integer" deprecated="true" flags="8226">
+            <description>
+                <![CDATA[Gets a randomly selected, fitness-proportional genotype index. Unrated genotypes (with instances=0) are treated as if they had instances=1 and average fitness.]]></description>
+            <arguments/>
+        </element>
+        <element name="revroulette" function="true" type="integer" deprecated="true" flags="8226">
+            <description>
+                <![CDATA[Gets a randomly selected, reverse fitness-proportional genotype index. Unrated genotypes (with instances=0) are treated as if they had instances=1 and average fitness.]]></description>
+            <arguments/>
+        </element>
+        <element name="tournament" function="true" type="integer" deprecated="true" flags="8226">
+            <description>
+                <![CDATA[Gets tournament winner genotype. Unrated genotypes (with instances=0) are treated as if they had instances=1 and average fitness.]]></description>
+            <arguments>
+                <argument name="genotypes in tournament" type="integer"/>
+            </arguments>
+        </element>
+        <element name="randomLikeThis" function="true" type="integer" deprecated="true" flags="8226">
+            <description>
+                <![CDATA[Gets a random genotype index similar to the selected one. Unrated genotypes (with instances=0) are treated as if they had instances=1 and average fitness.]]></description>
+            <arguments>
+                <argument name="minimum similarity" type="float"/>
+            </arguments>
+        </element>
+        <element name="likeThisRoulette" function="true" type="integer" deprecated="true" flags="8226">
+            <description>
+                <![CDATA[Gets a random genotype similar to the selected one, fitness-proportional. Unrated genotypes (with instances=0) are treated as if they had instances=1 and average fitness.]]></description>
+            <arguments>
+                <argument name="minimum similarity" type="float"/>
+            </arguments>
+        </element>
+        <element name="findGenotype" function="true" type="integer" deprecated="true" flags="8226">
+            <description><![CDATA[Finds a genotype identical to the currently selected genotype. It is only useful when the currently selected genotype is not on the list of genotypes (for example it is a result of a genetic operator)
+Deprecated. Use the more versatile GenePool.findGenotype() instead of this function.]]></description>
+            <arguments/>
+        </element>
+        <element name="findGenotypeForCreature" function="true" type="integer" deprecated="true" flags="8226">
+            <description><![CDATA[Finds a genotype identical to the genotype of the selected Creature.
+Deprecated. Use the more versatile GenePool.findGenotype() instead of this function.]]></description>
+            <arguments/>
+        </element>
+        <element name="addGroup" function="true" type="GenePool" flags="34">
+            <description><![CDATA[Adds a new gene pool.]]></description>
+            <arguments>
+                <argument name="name" type="string"/>
+            </arguments>
+        </element>
+        <element name="deleteGroup" function="true" type="void" flags="34">
+            <description><![CDATA[Removes a gene pool.]]></description>
+            <arguments>
+                <argument name="index" type="integer"/>
+            </arguments>
+        </element>
+        <element name="clear" function="true" type="void" flags="34">
+            <description><![CDATA[Removes all gene pools except the first one.]]></description>
+            <arguments/>
+        </element>
+        <element name="clearGroup" function="true" type="void" deprecated="true" flags="8226">
+            <description>
+                <![CDATA[GenePools[group].clear() is more "object oriented" than GenePools.clearGroup(group)]]></description>
+            <arguments>
+                <argument name="index" type="integer"/>
+            </arguments>
+        </element>
+        <element name="get" function="true" type="GenePool" flags="34">
+            <arguments>
+                <argument name="index" type="integer"/>
+            </arguments>
+        </element>
+        <element name="iterator" type="Object" flags="289"/>
+    </type>
+    <type name="GenMan" context="Global context">
+        <description>
+            <![CDATA[Manages various genetic operations, using appropriate operators for the argument genotype format.]]></description>
+        <element name="gen_hist" type="integer" min="0" max="1" default="0" flags="2">
+            <description><![CDATA[Required for phylogenetic analysis]]></description>
+        </element>
+        <element name="gen_hilite" type="integer" min="0" max="1" default="1">
+            <description><![CDATA[Use colors for genes?
+(slows down viewing/editing of huge genotypes)]]></description>
+        </element>
+        <element name="gen_extmutinfo" type="integer" min="0" max="2" default="0">
+            <description>
+                <![CDATA[If active, information about employed mutation method will be stored in the 'info' field of each mutated genotype.]]></description>
+        </element>
+        <element name="operReport" function="true" type="void" flags="2">
+            <description><![CDATA[Show available genetic operators]]></description>
+            <arguments/>
+        </element>
+        <element name="toHTML" function="true" type="string" flags="2">
+            <description><![CDATA[returns genotype expressed as colored HTML]]></description>
+            <arguments>
+                <argument type="string"/>
+            </arguments>
+        </element>
+        <element name="toHTMLshort" function="true" type="string" flags="2">
+            <description><![CDATA[returns genotype (abbreviated if needed) in colored HTML format]]></description>
+            <arguments>
+                <argument type="string"/>
+            </arguments>
+        </element>
+        <element name="toLaTeX" function="true" type="string" flags="2">
+            <description><![CDATA[returns genotype in colored LaTeX format]]></description>
+            <arguments>
+                <argument type="string"/>
+            </arguments>
+        </element>
+        <element name="validate" function="true" type="Geno" flags="34">
+            <description><![CDATA[returns validated (if possible) Geno object from supplied Geno]]></description>
+            <arguments>
+                <argument type="Geno"/>
+            </arguments>
+        </element>
+        <element name="mutate" function="true" type="Geno" flags="34">
+            <description><![CDATA[returns mutated Geno object from supplied Geno]]></description>
+            <arguments>
+                <argument type="Geno"/>
+            </arguments>
+        </element>
+        <element name="crossOver" function="true" type="Geno" flags="34">
+            <description><![CDATA[returns crossed over genotype]]></description>
+            <arguments>
+                <argument type="Geno"/>
+                <argument type="Geno"/>
+            </arguments>
+        </element>
+        <element name="getSimplest" function="true" type="Geno" flags="34">
+            <description>
+                <![CDATA[returns the simplest genotype for a given encoding (format). "0" means f0, "4" means f4, etc.]]></description>
+            <arguments>
+                <argument name="format" type="string"/>
+            </arguments>
+        </element>
+        <element name="_propertyClear" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Using most _property functions is restricted for internal purposes. Use "property:" or "state:" definitions in your script files to change object properties.]]></description>
+            <arguments/>
+        </element>
+        <element name="_propertyAdd" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Using most _property functions is restricted for internal purposes. Use "property:" or "state:" definitions in your script files to change object properties.]]></description>
+            <arguments>
+                <argument name="id" type="string"/>
+                <argument name="type description" type="string"/>
+                <argument name="name" type="string"/>
+                <argument name="flags" type="integer"/>
+                <argument name="help text" type="string"/>
+            </arguments>
+        </element>
+        <element name="_propertyRemove" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Using most _property functions is restricted for internal purposes. Use "property:" or "state:" definitions in your script files to change object properties.]]></description>
+            <arguments>
+                <argument name="index" type="integer"/>
+            </arguments>
+        </element>
+        <element name="_propertyChange" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Using most _property functions is restricted for internal purposes. Use "property:" or "state:" definitions in your script files to change object properties.]]></description>
+            <arguments>
+                <argument name="id" type="string"/>
+                <argument name="type description" type="string"/>
+                <argument name="name" type="string"/>
+                <argument name="flags" type="integer"/>
+                <argument name="help text" type="string"/>
+            </arguments>
+        </element>
+        <element name="_propertyAddGroup" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Using most _property functions is restricted for internal purposes. Use "property:" or "state:" definitions in your script files to change object properties.]]></description>
+            <arguments>
+                <argument name="name" type="string"/>
+            </arguments>
+        </element>
+        <element name="_propertyRemoveGroup" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Using most _property functions is restricted for internal purposes. Use "property:" or "state:" definitions in your script files to change object properties.]]></description>
+            <arguments>
+                <argument name="index" type="integer"/>
+            </arguments>
+        </element>
+        <element name="_propertyExists" function="true" type="integer" flags="34">
+            <arguments>
+                <argument name="name" type="string"/>
+            </arguments>
+        </element>
+        <element name="_property_changed_index" type="integer" flags="35"/>
+        <element name="_property_changed_id" type="string" flags="35"/>
+        <element name="genoper_f0" type="integer" min="0" max="0" flags="65">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="genoper_f0s" type="integer" min="0" max="0" flags="65">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="genoper_f1" type="integer" min="0" max="0" flags="65">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="genoper_f2" type="integer" min="0" max="0" flags="65">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="genoper_f3" type="integer" min="0" max="0" flags="65">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="genoper_f4" type="integer" min="0" max="0" flags="65">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="genoper_f8" type="integer" min="0" max="0" flags="65">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="genoper_f9" type="integer" min="0" max="0" flags="65">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="genoper_fF" type="integer" min="0" max="0" flags="65">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="genoper_fn" type="integer" min="0" max="0" flags="65">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="genoper_fB" type="integer" min="0" max="0" flags="65">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="genoper_fH" type="integer" min="0" max="0" flags="65">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="genoper_fL" type="integer" min="0" max="0" flags="65">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="genoper_fS" type="integer" min="0" max="0" flags="65">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="neuadd_N" type="integer" min="0" max="1">
+            <description><![CDATA[Standard neuron
+
+Characteristics:
+   supports any number of inputs
+   provides output value
+   does not require location in body
+
+
+Properties:
+   Inertia (in) float 0..1 (default 0.8)
+   Force (fo) float 0..999 (default 0.04)
+   Sigmoid (si) float -99999..99999 (default 2)
+   State (s) float -1..1 (default 0)]]></description>
+        </element>
+        <element name="neuadd_Nu" type="integer" min="0" max="1">
+            <description><![CDATA[Works like standard neuron (N) but the output value is scaled to 0...+1 instead of -1...+1.
+Having 0 as one of the saturation states should help in "gate circuits", where input signal is passed through or blocked depending on the other singal.
+
+Characteristics:
+   supports any number of inputs
+   provides output value
+   does not require location in body
+
+
+Properties:
+   Inertia (in) float 0..1 (default 0.8)
+   Force (fo) float 0..999 (default 0.04)
+   Sigmoid (si) float -99999..99999 (default 2)
+   State (s) float -1..1 (default 0)]]></description>
+        </element>
+        <element name="neuadd_G" type="integer" min="0" max="1">
+            <description><![CDATA[Tilt sensor.
+Signal is proportional to sin(angle) = most sensitive in horizontal orientation.
+0=the stick is horizontal
++1/-1=the stick is vertical
+
+Characteristics:
+   does not use inputs
+   provides output value
+   should be located on a Joint
+]]></description>
+        </element>
+        <element name="neuadd_Gpart" type="integer" min="0" max="1">
+            <description><![CDATA[Tilt sensor. Signal is directly proportional to the tilt angle.
+0=the part X axis is horizontal
++1/-1=the axis is vertical
+
+Characteristics:
+   does not use inputs
+   provides output value
+   should be located on a Part
+
+
+Properties:
+   rotation.y (ry) float -6.282..6.282 (default 0)
+   rotation.z (rz) float -6.282..6.282 (default 0)]]></description>
+        </element>
+        <element name="neuadd_T" type="integer" min="0" max="1">
+            <description><![CDATA[Touch and proximity sensor (Tcontact and Tproximity combined)
+-1=no contact
+0=just touching
+>0=pressing, value depends on the force applied (not implemented in ODE mode)
+
+Characteristics:
+   does not use inputs
+   provides output value
+   should be located on a Part
+
+
+Properties:
+   Range (r) float 0..1 (default 1)
+   rotation.y (ry) float -6.282..6.282 (default 0)
+   rotation.z (rz) float -6.282..6.282 (default 0)]]></description>
+        </element>
+        <element name="neuadd_Tcontact" type="integer" min="0" max="1">
+            <description><![CDATA[Touch sensor.
+-1=no contact
+0=the Part is touching the obstacle
+>0=pressing, value depends on the force applied (not implemented in ODE mode)
+
+Characteristics:
+   does not use inputs
+   provides output value
+   should be located on a Part
+]]></description>
+        </element>
+        <element name="neuadd_Tproximity" type="integer" min="0" max="1">
+            <description><![CDATA[Proximity sensor detecting obstacles along the X axis.
+-1=distance is "r" or more
+0=zero distance
+
+Characteristics:
+   does not use inputs
+   provides output value
+   should be located on a Part
+
+
+Properties:
+   Range (r) float 0..1 (default 1)
+   rotation.y (ry) float -6.282..6.282 (default 0)
+   rotation.z (rz) float -6.282..6.282 (default 0)]]></description>
+        </element>
+        <element name="neuadd_S" type="integer" min="0" max="1">
+            <description><![CDATA[Smell sensor. Aggregated "smell of energy" experienced from all energy objects (creatures and food pieces).
+Close objects have bigger influence than the distant ones: for each energy source, its partial feeling is proportional to its energy/(distance^2)
+
+Characteristics:
+   does not use inputs
+   provides output value
+   should be located on a Part
+]]></description>
+        </element>
+        <element name="neuadd_Constant" type="integer" min="0" max="1">
+            <description><![CDATA[Constant value
+
+Characteristics:
+   does not use inputs
+   provides output value
+   does not require location in body
+]]></description>
+        </element>
+        <element name="neuadd_Bend_muscle" type="integer" min="0" max="1">
+            <description><![CDATA[Characteristics:
+   uses single input
+   does not provide output value
+   should be located on a Joint
+
+
+Properties:
+   power (p) float 0.01..1 (default 0.25)
+   bending range (r) float 0..1 (default 1)]]></description>
+        </element>
+        <element name="neuadd_Rotation_muscle" type="integer" min="0" max="1">
+            <description><![CDATA[Characteristics:
+   uses single input
+   does not provide output value
+   should be located on a Joint
+
+
+Properties:
+   power (p) float 0.01..1 (default 1)]]></description>
+        </element>
+        <element name="neuadd_M" type="integer" min="0" max="1">
+            <description><![CDATA[Characteristics:
+   uses single input
+   does not provide output value
+   should be located on a Joint
+
+
+Properties:
+   power (p) float 0.01..1 (default 1)
+   axis (a) integer 0..1 (default 0)]]></description>
+        </element>
+        <element name="neuadd_D" type="integer" min="0" max="1">
+            <description><![CDATA[Calculate the difference between the current and previous input value. Multiple inputs are aggregated with respect to their weights
+
+Characteristics:
+   supports any number of inputs
+   provides output value
+   does not require location in body
+]]></description>
+        </element>
+        <element name="neuadd_Fuzzy" type="integer" min="0" max="1">
+            <description><![CDATA[Refer to publications to learn more about this neuron.
+
+Characteristics:
+   supports any number of inputs
+   provides output value
+   does not require location in body
+
+
+Properties:
+   number of fuzzy sets (ns) integer
+   number of rules (nr) integer
+   fuzzy sets (fs) string (default "")
+   fuzzy rules (fr) string (default "")]]></description>
+        </element>
+        <element name="neuadd_VEye" type="integer" min="0" max="1">
+            <description><![CDATA[Refer to publications to learn more about this neuron.
+
+Characteristics:
+   uses single input
+   provides output value
+   should be located on a Part
+
+
+Properties:
+   target.x (tx) float
+   target.y (ty) float
+   target.z (tz) float
+   target shape (ts) string (default "")
+   perspective (p) float 0.1..10 (default 1)
+   scale (s) float 0.1..100 (default 1)
+   show hidden lines (h) integer 0..1 (default 0)
+   output lines count (each line needs four channels) (o) integer 0..99 (default 0)
+   debug (d) integer 0..1 (default 0)]]></description>
+        </element>
+        <element name="neuadd_VMotor" type="integer" min="0" max="1">
+            <description><![CDATA[Must be connected to the VEye and properly set up. Refer to publications to learn more about this neuron.
+
+Characteristics:
+   supports any number of inputs
+   provides output value
+   does not require location in body
+
+
+Properties:
+   number of basic features (noIF) integer
+   number of degrees of freedom (noDim) integer
+   parameters (params) string]]></description>
+        </element>
+        <element name="neuadd_Sti" type="integer" min="0" max="1">
+            <description><![CDATA[Characteristics:
+   uses single input
+   does not provide output value
+   should be located on a Part
+]]></description>
+        </element>
+        <element name="neuadd_LMu" type="integer" min="0" max="1">
+            <description><![CDATA[Characteristics:
+   uses single input
+   does not provide output value
+   should be located on a Joint
+
+
+Properties:
+   power (p) float 0.01..1 (default 1)]]></description>
+        </element>
+        <element name="neuadd_Water" type="integer" min="0" max="1">
+            <description><![CDATA[Output signal:
+0=on or above water surface
+1=under water (deeper than 1)
+0..1=in the transient area just below water surface
+
+Characteristics:
+   does not use inputs
+   provides output value
+   should be located on a Part
+]]></description>
+        </element>
+        <element name="neuadd_Energy" type="integer" min="0" max="1">
+            <description><![CDATA[The current energy level divided by the initial energy level.
+Usually falls from initial 1.0 down to 0.0 and then the creature dies. It can rise above 1.0 if enough food is ingested
+
+Characteristics:
+   does not use inputs
+   provides output value
+   does not require location in body
+]]></description>
+        </element>
+        <element name="neuadd_Ch" type="integer" min="0" max="1">
+            <description><![CDATA[Combines all input signals into a single multichannel output; Note: ChSel and ChMux are the only neurons which support multiple channels. Other neurons discard everything except the first channel.
+
+Characteristics:
+   supports any number of inputs
+   provides output value
+   does not require location in body
+]]></description>
+        </element>
+        <element name="neuadd_ChMux" type="integer" min="0" max="1">
+            <description><![CDATA[Outputs the selected channel from the second (multichannel) input. The first input is used as the selector value (-1=select first channel, .., 1=last channel)
+
+Characteristics:
+   uses 2 inputs
+   provides output value
+   does not require location in body
+]]></description>
+        </element>
+        <element name="neuadd_ChSel" type="integer" min="0" max="1">
+            <description><![CDATA[Outputs a single channel (selected by the "ch" parameter) from multichannel input
+
+Characteristics:
+   uses single input
+   provides output value
+   does not require location in body
+
+
+Properties:
+   channel (ch) integer]]></description>
+        </element>
+        <element name="neuadd_Rnd" type="integer" min="0" max="1">
+            <description><![CDATA[Generates random noise (subsequent random values in the range of -1..+1)
+
+Characteristics:
+   does not use inputs
+   provides output value
+   does not require location in body
+]]></description>
+        </element>
+        <element name="neuadd_Sin" type="integer" min="0" max="1">
+            <description><![CDATA[Output frequency = f0+input
+
+Characteristics:
+   uses single input
+   provides output value
+   does not require location in body
+
+
+Properties:
+   base frequency (f0) float -1..1 (default 0.0628319)
+   time (t) float 0..6.28319 (default 0)]]></description>
+        </element>
+        <element name="f0_nodel_tag" type="integer" min="0" max="1" default="1">
+            <description><![CDATA[You can tag elements using their 'i' field and the i="mi=d" tag.
+Mutations will not delete such elements.
+The i="mi=dm" combination is allowed.]]></description>
+        </element>
+        <element name="f0_nomod_tag" type="integer" min="0" max="1" default="1">
+            <description><![CDATA[You can tag elements using their 'i' field and the i="mi=m" tag.
+Mutations will not modify properties of such elements.
+The i="mi=md" combination is allowed.]]></description>
+        </element>
+        <element name="f0_p_new" type="float" min="0" max="100" default="5.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0_p_del" type="float" min="0" max="100" default="5.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0_p_swp" type="float" min="0" max="100" default="10.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0_p_pos" type="float" min="0" max="100" default="10.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0_p_den" type="float" min="0" max="100" default="0.0">
+            <description><![CDATA[Density only has an influence under water]]></description>
+        </element>
+        <element name="f0_p_frc" type="float" min="0" max="100" default="10.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0_p_ing" type="float" min="0" max="100" default="10.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0_p_asm" type="float" min="0" max="100" default="0.0">
+            <description>
+                <![CDATA[The interpretation and influence of this property must be implemented by the experiment definition]]></description>
+        </element>
+        <element name="f0_j_new" type="float" min="0" max="100" default="5.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0_j_del" type="float" min="0" max="100" default="5.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0_j_stm" type="float" min="0" max="100" default="0.0">
+            <description>
+                <![CDATA[The interpretation and influence of this property must be implemented by the experiment definition]]></description>
+        </element>
+        <element name="f0_j_stf" type="float" min="0" max="100" default="10.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0_j_rsf" type="float" min="0" max="100" default="10.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0_j_vred" type="float" min="0" max="100" default="0.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0_j_vgrn" type="float" min="0" max="100" default="0.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0_j_vblu" type="float" min="0" max="100" default="0.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0_n_new" type="float" min="0" max="100" default="5.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0_n_del" type="float" min="0" max="100" default="5.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0_n_prp" type="float" min="0" max="100" default="10.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0_c_new" type="float" min="0" max="100" default="5.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0_c_del" type="float" min="0" max="100" default="5.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0_c_wei" type="float" min="0" max="100" default="10.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0s_nodel_tag" type="integer" min="0" max="1" default="1">
+            <description><![CDATA[You can tag elements using their 'i' field and the i="mi=d" tag.
+Mutations will not delete such elements.
+The i="mi=dm" combination is allowed.]]></description>
+        </element>
+        <element name="f0s_nomod_tag" type="integer" min="0" max="1" default="1">
+            <description><![CDATA[You can tag elements using their 'i' field and the i="mi=m" tag.
+Mutations will not modify properties of such elements.
+The i="mi=md" combination is allowed.]]></description>
+        </element>
+        <element name="f0s_circle_section" type="integer" min="0" max="1" default="1">
+            <description><![CDATA[Ensure that ellipsoids and cylinders have circle cross-section]]></description>
+        </element>
+        <element name="f0s_use_elli" type="integer" min="0" max="1" default="1">
+            <description><![CDATA[Use ellipsoids in mutations]]></description>
+        </element>
+        <element name="f0s_use_cub" type="integer" min="0" max="1" default="1">
+            <description><![CDATA[Use cuboids in mutations]]></description>
+        </element>
+        <element name="f0s_use_cyl" type="integer" min="0" max="1" default="1">
+            <description><![CDATA[Use cylinders in mutations]]></description>
+        </element>
+        <element name="f0s_p_new" type="float" min="0" max="100" default="5.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0s_p_del" type="float" min="0" max="100" default="5.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0s_p_swp" type="float" min="0" max="100" default="10.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0s_p_pos" type="float" min="0" max="100" default="10.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0s_p_rot" type="float" min="0" max="100" default="10.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0s_p_scale" type="float" min="0" max="100" default="10.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0s_p_frc" type="float" min="0" max="100" default="10.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0s_p_ing" type="float" min="0" max="100" default="10.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0s_p_asm" type="float" min="0" max="100" default="0.0">
+            <description>
+                <![CDATA[The interpretation and influence of this property must be implemented by the experiment definition]]></description>
+        </element>
+        <element name="f0s_j_new" type="float" min="0" max="100" default="5.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0s_j_del" type="float" min="0" max="100" default="5.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0s_j_stm" type="float" min="0" max="100" default="0.0">
+            <description>
+                <![CDATA[The interpretation and influence of this property must be implemented by the experiment definition]]></description>
+        </element>
+        <element name="f0s_j_vred" type="float" min="0" max="100" default="0.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0s_j_vgrn" type="float" min="0" max="100" default="0.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0s_j_vblu" type="float" min="0" max="100" default="0.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0s_n_new" type="float" min="0" max="100" default="5.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0s_n_del" type="float" min="0" max="100" default="5.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0s_n_prp" type="float" min="0" max="100" default="10.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0s_c_new" type="float" min="0" max="100" default="5.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0s_c_del" type="float" min="0" max="100" default="5.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0s_c_wei" type="float" min="0" max="100" default="10.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f1_xo_propor" type="integer" min="0" max="1" default="1">
+            <description><![CDATA[Cross over (exchange) corresponding segments of the two parent genotypes?
+
+f1 uses a two-point crossing over.
+If this option is turned on, cut points will be selected proportionally to neural genes.
+Thus, if both parents have the same number of neurons, then this will be preserved in their children.]]></description>
+        </element>
+        <element name="f1_smX" type="float" min="0" max="100" default="0.05"/>
+        <element name="f1_smJunct" type="float" min="0" max="100" default="0.02"/>
+        <element name="f1_smComma" type="float" min="0" max="100" default="0.02"/>
+        <element name="f1_smModif" type="float" min="0" max="100" default="0.1">
+            <description><![CDATA[Modifiers: LlRrCcQqFfMmIiEeWwAaSsDdGgBb]]></description>
+        </element>
+        <element name="f1_mut_exmod" type="string" max="30">
+            <description><![CDATA[Modifiers that will not be added nor deleted during mutation
+(all: LlRrCcQqFfMmIiEeWwAaSsDdGgBb)]]></description>
+        </element>
+        <element name="f1_nmNeu" type="float" min="0" max="100" default="0.05">
+            <description><![CDATA[Adds a (connected) neuron or removes a neuron]]></description>
+        </element>
+        <element name="f1_nmConn" type="float" min="0" max="100" default="0.1">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f1_nmProp" type="float" min="0" max="100" default="0.1">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f1_nmWei" type="float" min="0" max="100" default="1.0"/>
+        <element name="f1_nmVal" type="float" min="0" max="100" default="0.05"/>
+        <element name="f2_mutAddOper" type="float" min="0" max="1" default="0.4">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f2_mutJointElem" type="float" min="0" max="1" default="0.33">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f2_mutNeuroElem" type="float" min="0" max="1" default="0.33">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f2_mutConnElem" type="float" min="0" max="1" default="0.33">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f2_mutDelOper" type="float" min="0" max="1" default="0.1">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f2_mutHandleOper" type="float" min="0" max="1" default="0.3">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f2_mutPropOper" type="float" min="0" max="1" default="0.2">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f3_mutSubstitution" type="float" min="0" max="1" default="0.6">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f3_mutSubstPerChar" type="float" min="0" max="1" default="0.1">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f3_mutDelIns" type="float" min="0" max="1" default="0.1">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f3_mutDelInsPerChar" type="float" min="0" max="1" default="0.05">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f3_mutDelInsLength" type="integer" min="1" max="100" default="5">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f3_mutDuplication" type="float" min="0" max="1" default="0.05">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f3_mutTranslocation" type="float" min="0" max="1" default="0.15">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f3_xovGeneTransfer" type="float" min="0" max="1" default="0.8">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f3_xovCrossingOver" type="float" min="0" max="1" default="0.2">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f4_mut_add" type="float" min="0" max="100" default="50.0">
+            <description><![CDATA[mutation: probability of adding a node]]></description>
+        </element>
+        <element name="f4_mut_add_div" type="float" min="0" max="100" default="20.0">
+            <description><![CDATA[add node mutation: probability of adding a division]]></description>
+        </element>
+        <element name="f4_mut_add_conn" type="float" min="0" max="100" default="15.0">
+            <description><![CDATA[add node mutation: probability of adding a neural connection]]></description>
+        </element>
+        <element name="f4_mut_add_neupar" type="float" min="0" max="100" default="5.0">
+            <description><![CDATA[add node mutation: probability of adding a neuron property/modifier]]></description>
+        </element>
+        <element name="f4_mut_add_rep" type="float" min="0" max="100" default="10.0">
+            <description><![CDATA[add node mutation: probability of adding a repetition]]></description>
+        </element>
+        <element name="f4_mut_add_simp" type="float" min="0" max="100" default="50.0">
+            <description><![CDATA[add node mutation: probability of adding a random, simple gene]]></description>
+        </element>
+        <element name="f4_mut_del" type="float" min="0" max="100" default="20.0">
+            <description><![CDATA[mutation: probability of deleting a node]]></description>
+        </element>
+        <element name="f4_mut_mod" type="float" min="0" max="100" default="30.0">
+            <description><![CDATA[mutation: probability of changing a node]]></description>
+        </element>
+        <element name="f4_mut_exmod" type="string" max="30">
+            <description><![CDATA[Modifiers that will not be added nor deleted during mutation
+(all: LlRrCcQqFfMmIiEeWwAaSsDdGgBb)]]></description>
+        </element>
+        <element name="f8_mut_chg_begin_arg" type="float" min="0" max="100" default="7.0">
+            <description><![CDATA[mutation: probability of changing a beginning argument]]></description>
+        </element>
+        <element name="f8_mut_chg_arg" type="float" min="0" max="100" default="7.0">
+            <description><![CDATA[mutation: probability of changing a production's argument]]></description>
+        </element>
+        <element name="f8_mut_del_comm" type="float" min="0" max="100" default="8.0">
+            <description><![CDATA[mutation: probability of deleting a command]]></description>
+        </element>
+        <element name="f8_mut_insert_comm" type="float" min="0" max="100" default="8.0">
+            <description><![CDATA[mutation: probability of inserting commands]]></description>
+        </element>
+        <element name="f8_mut_enc" type="float" min="0" max="100" default="8.0">
+            <description><![CDATA[mutation: probability of encapsulating commands]]></description>
+        </element>
+        <element name="f8_mut_chg_cond_sign" type="float" min="0" max="100" default="7.0">
+            <description><![CDATA[mutation: probability of changing a condition sign]]></description>
+        </element>
+        <element name="f8_mut_add_param" type="float" min="0" max="100" default="8.0">
+            <description><![CDATA[mutation: probability of adding a parameter to the production]]></description>
+        </element>
+        <element name="f8_mut_add_cond" type="float" min="0" max="100" default="8.0">
+            <description><![CDATA[mutation: probability of adding a condition to the subproduction]]></description>
+        </element>
+        <element name="f8_mut_add_subprod" type="float" min="0" max="100" default="8.0">
+            <description><![CDATA[mutation: probability of adding a subproduction]]></description>
+        </element>
+        <element name="f8_mut_chg_iter_number" type="float" min="0" max="100" default="7.0">
+            <description><![CDATA[mutation: probability of changing a number of iterations]]></description>
+        </element>
+        <element name="f8_mut_del_param" type="float" min="0" max="100" default="8.0">
+            <description><![CDATA[mutation: probability of deleting a parameter]]></description>
+        </element>
+        <element name="f8_mut_del_cond" type="float" min="0" max="100" default="8.0">
+            <description><![CDATA[mutation: probability of deleting a condition]]></description>
+        </element>
+        <element name="f8_mut_add_loop" type="float" min="0" max="100" default="0.0">
+            <description><![CDATA[mutation: probability of adding a loop]]></description>
+        </element>
+        <element name="f8_mut_del_loop" type="float" min="0" max="100" default="0.0">
+            <description><![CDATA[mutation: probability of deleting a loop]]></description>
+        </element>
+        <element name="f8_mut_del_prod" type="float" min="0" max="100" default="8.0">
+            <description><![CDATA[mutation: probability of deleting a production]]></description>
+        </element>
+        <element name="f9_mut" type="float" min="0" max="1" default="0.1">
+            <description>
+                <![CDATA[How many genes should be mutated during single mutation (1=all genes, 0.1=ten percent)]]></description>
+        </element>
+        <element name="fF_xover" type="float" min="0.5" max="1" default="0.5">
+            <description><![CDATA[0.5 => children are averaged parents.
+0.8 => children are only 20% different from parents.
+1.0 => each child is identical to one parent (no crossover).]]></description>
+        </element>
+        <element name="fn_xover" type="float" min="0.5" max="1" default="0.9">
+            <description><![CDATA[0.5 => children are averaged parents.
+0.8 => children are only 20% different from parents.
+1.0 => each child is identical to one parent (no crossover).]]></description>
+        </element>
+        <element name="fn_xover_random" type="integer" min="0" max="1" default="1">
+            <description>
+                <![CDATA[If active, the amount of linear mix is random in each crossover operation, so the "Fraction inherited in linear mix crossover" parameter is ignored.]]></description>
+        </element>
+        <element name="fn_mut_bound_low" type="string" default="[-10.0, -10.0]">
+            <description><![CDATA[A vector of lower bounds (one real value for each variable)]]></description>
+        </element>
+        <element name="fn_mut_bound_high" type="string" default="[10.0, 10.0]">
+            <description><![CDATA[A vector of higher bounds (one real value for each variable)]]></description>
+        </element>
+        <element name="fn_mut_stddev" type="string" default="[0.1, 0.1]">
+            <description><![CDATA[A vector of standard deviations (one real value for each variable)]]></description>
+        </element>
+        <element name="fn_mut_single_var" type="integer" min="0" max="1" default="0">
+            <description>
+                <![CDATA[If active, only a single randomly selected variable will be mutated in each mutation operation. Otherwise all variables will be mutated.]]></description>
+        </element>
+        <element name="fB_mut_substitution" type="float" min="0" max="1" default="0.6">
+            <description><![CDATA[Probability of mutation by changing single random letter in genotype]]></description>
+        </element>
+        <element name="fB_mut_insertion" type="float" min="0" max="1" default="0.095">
+            <description>
+                <![CDATA[Probability of mutation by inserting characters in random place of genotype]]></description>
+        </element>
+        <element name="fB_mut_nclassins" type="float" min="0" max="1" default="0.005">
+            <description>
+                <![CDATA[Probability of mutation by inserting neuron class definition in random place of genotype]]></description>
+        </element>
+        <element name="fB_mut_deletion" type="float" min="0" max="1" default="0.1">
+            <description><![CDATA[Probability of mutation by deleting random characters in genotype]]></description>
+        </element>
+        <element name="fB_mut_duplication" type="float" min="0" max="1" default="0.0">
+            <description>
+                <![CDATA[Probability of mutation by copying single *gene* of genotype and appending it to the beginning of this genotype]]></description>
+        </element>
+        <element name="fB_mut_translocation" type="float" min="0" max="1" default="0.15">
+            <description><![CDATA[Probability of mutation by replacing two substrings in genotype]]></description>
+        </element>
+        <element name="fB_cross_gene_transfer" type="float" min="0" max="1" default="0.0">
+            <description>
+                <![CDATA[Probability of crossing over by transferring single genes from both parents to beginning of each other]]></description>
+        </element>
+        <element name="fB_cross_crossover" type="float" min="0" max="1" default="1.0">
+            <description>
+                <![CDATA[Probability of crossing over by random distribution of genes from both parents to both children]]></description>
+        </element>
+        <element name="fH_mut_addition" type="float" min="0" max="1" default="0.3">
+            <description><![CDATA[Probability of adding new element to genotype]]></description>
+        </element>
+        <element name="fH_mut_add_joint" type="float" min="0" max="1" default="0.33">
+            <description><![CDATA[Probability of adding new stick handle]]></description>
+        </element>
+        <element name="fH_mut_add_neuron" type="float" min="0" max="1" default="0.33">
+            <description><![CDATA[Probability of adding new neuron handle]]></description>
+        </element>
+        <element name="fH_mut_add_connection" type="float" min="0" max="1" default="0.33">
+            <description><![CDATA[Probability of adding new connection handle]]></description>
+        </element>
+        <element name="fH_mut_deletion" type="float" min="0" max="1" default="0.1">
+            <description><![CDATA[Probability of removing element from genotype]]></description>
+        </element>
+        <element name="fH_mut_handle" type="float" min="0" max="1" default="0.3">
+            <description><![CDATA[Probability of changing values in vectors of handle]]></description>
+        </element>
+        <element name="fH_mut_property" type="float" min="0" max="1" default="0.3">
+            <description><![CDATA[Probability of changing properties of handles]]></description>
+        </element>
+        <element name="fL_maxdefinedwords" type="integer" min="0" max="100" default="10">
+            <description><![CDATA[Maximum number of words that can be defined in L-System]]></description>
+        </element>
+        <element name="fL_axm_mut_prob" type="float" min="0" max="1" default="0.2">
+            <description><![CDATA[Probability of performing mutation operations on axiom]]></description>
+        </element>
+        <element name="fL_rul_mut_prob" type="float" min="0" max="1" default="0.8">
+            <description>
+                <![CDATA[Probability of performing mutation operations on the successor of random rule]]></description>
+        </element>
+        <element name="fL_mut_addition" type="float" min="0" max="1" default="0.2">
+            <description>
+                <![CDATA[Probability of adding random existing word to the axiom or one of successors]]></description>
+        </element>
+        <element name="fL_mut_add_stick" type="float" min="0" max="1" default="0.2">
+            <description><![CDATA[Probability of adding stick]]></description>
+        </element>
+        <element name="fL_mut_add_neuro" type="float" min="0" max="1" default="0.2">
+            <description><![CDATA[Probability of adding neuron]]></description>
+        </element>
+        <element name="fL_mut_add_conn" type="float" min="0" max="1" default="0.2">
+            <description><![CDATA[Probability of adding connection]]></description>
+        </element>
+        <element name="fL_mut_add_rot" type="float" min="0" max="1" default="0.2">
+            <description><![CDATA[Probability of adding one of rotation words]]></description>
+        </element>
+        <element name="fL_mut_add_branch" type="float" min="0" max="1" default="0.2">
+            <description><![CDATA[Probability of adding branch with rotation and stick]]></description>
+        </element>
+        <element name="fL_mut_add_other" type="float" min="0" max="1" default="0.4">
+            <description><![CDATA[Probability of adding other word, defined in genotype]]></description>
+        </element>
+        <element name="fL_mut_worddefaddition" type="float" min="0" max="1" default="0.05">
+            <description><![CDATA[Probability of adding new word definition to the genotype]]></description>
+        </element>
+        <element name="fL_mut_ruleaddition" type="float" min="0" max="1" default="0.1">
+            <description><![CDATA[Probability of adding new rule definition for existing word]]></description>
+        </element>
+        <element name="fL_mut_rulecond" type="float" min="0" max="1" default="0.1">
+            <description><![CDATA[Probability of modifying random rule condition]]></description>
+        </element>
+        <element name="fL_mut_changeword" type="float" min="0" max="1" default="0.3">
+            <description>
+                <![CDATA[Probability of changing word name or formula of a random word from axiom or one of successors]]></description>
+        </element>
+        <element name="fL_mut_changeword_formula" type="float" min="0" max="1" default="0.7">
+            <description><![CDATA[Probability of changing formula in word]]></description>
+        </element>
+        <element name="fL_mut_changeword_name" type="float" min="0" max="1" default="0.3">
+            <description><![CDATA[Probability of changing name in word]]></description>
+        </element>
+        <element name="fL_mut_changeiter" type="float" min="0" max="1" default="0.3">
+            <description><![CDATA[Probability of changing number of iterations of L-Systems]]></description>
+        </element>
+        <element name="fL_mut_changeiter_step" type="float" min="0" max="1" default="1.0">
+            <description><![CDATA[Minimal step that should be used for changing iterations in L-Systems]]></description>
+        </element>
+        <element name="fL_mut_deletion" type="float" min="0" max="1" default="0.2">
+            <description>
+                <![CDATA[Probability of deleting random word from axiom or random successor (also deletes rule if there is only one word in successor)]]></description>
+        </element>
+        <element name="fS_mut_add_part" type="float" min="0" max="100" default="10.0">
+            <description><![CDATA[mutation: probability of adding a part]]></description>
+        </element>
+        <element name="fS_mut_rem_part" type="float" min="0" max="100" default="10.0">
+            <description><![CDATA[mutation: probability of deleting a part]]></description>
+        </element>
+        <element name="fS_mut_mod_part" type="float" min="0" max="100" default="10.0">
+            <description><![CDATA[mutation: probability of changing the part type]]></description>
+        </element>
+        <element name="fS_mut_change_joint" type="float" min="0" max="100" default="10.0">
+            <description><![CDATA[mutation: probability of changing a joint]]></description>
+        </element>
+        <element name="fS_mut_add_param" type="float" min="0" max="100" default="10.0">
+            <description><![CDATA[mutation: probability of adding a parameter]]></description>
+        </element>
+        <element name="fS_mut_rem_param" type="float" min="0" max="100" default="10.0">
+            <description><![CDATA[mutation: probability of removing a parameter]]></description>
+        </element>
+        <element name="fS_mut_mod_param" type="float" min="0" max="100" default="10.0">
+            <description><![CDATA[mutation: probability of modifying a parameter]]></description>
+        </element>
+        <element name="fS_mut_mod_mod" type="float" min="0" max="100" default="10.0">
+            <description><![CDATA[mutation: probability of modifying a modifier]]></description>
+        </element>
+        <element name="fS_mut_add_neuro" type="float" min="0" max="100" default="10.0">
+            <description><![CDATA[mutation: probability of adding a neuron]]></description>
+        </element>
+        <element name="fS_mut_rem_neuro" type="float" min="0" max="100" default="10.0">
+            <description><![CDATA[mutation: probability of removing a neuron]]></description>
+        </element>
+        <element name="fS_mut_mod_neuro_conn" type="float" min="0" max="100" default="10.0">
+            <description><![CDATA[mutation: probability of changing a neuron connection]]></description>
+        </element>
+        <element name="fS_mut_add_neuro_conn" type="float" min="0" max="100" default="10.0">
+            <description><![CDATA[mutation: probability of adding a neuron connection]]></description>
+        </element>
+        <element name="fS_mut_rem_neuro_conn" type="float" min="0" max="100" default="10.0">
+            <description><![CDATA[mutation: probability of removing a neuron connection]]></description>
+        </element>
+        <element name="fS_mut_mod_neuro_params" type="float" min="0" max="100" default="10.0">
+            <description><![CDATA[mutation: probability of changing a neuron param]]></description>
+        </element>
+        <element name="fS_circle_section" type="integer" min="0" max="1" default="1">
+            <description><![CDATA[Ensure that ellipsoids and cylinders have circle cross-section]]></description>
+        </element>
+        <element name="fS_use_elli" type="integer" min="0" max="1" default="1">
+            <description><![CDATA[Use ellipsoids in mutations]]></description>
+        </element>
+        <element name="fS_use_cub" type="integer" min="0" max="1" default="1">
+            <description><![CDATA[Use cuboids in mutations]]></description>
+        </element>
+        <element name="fS_use_cyl" type="integer" min="0" max="1" default="1">
+            <description><![CDATA[Use cylinders in mutations]]></description>
+        </element>
+        <element name="fS_mut_add_part_strong" type="integer" min="0" max="1" default="1">
+            <description><![CDATA[Add part mutation will produce more parametrized parts]]></description>
+        </element>
+    </type>
+    <type name="GenManStats" context="Global context">
+        <description><![CDATA[Statistics for genetic operations.]]></description>
+        <element name="gen_count" type="integer" flags="1">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="gen_mvalid" type="integer" flags="1">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="gen_mvalidated" type="integer" flags="1">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="gen_minvalid" type="integer" flags="1">
+            <description><![CDATA[couldn't be repaired]]></description>
+        </element>
+        <element name="gen_mfailed" type="integer" flags="1">
+            <description><![CDATA[couldn't be performed]]></description>
+        </element>
+        <element name="gen_xovalid" type="integer" flags="1">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="gen_xovalidated" type="integer" flags="1">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="gen_xoinvalid" type="integer" flags="1">
+            <description><![CDATA[couldn't be repaired]]></description>
+        </element>
+        <element name="gen_xofailed" type="integer" flags="1">
+            <description><![CDATA[couldn't be performed]]></description>
+        </element>
+        <element name="gen_mutimpr" type="float" flags="1">
+            <description><![CDATA[total cumulative mutation change]]></description>
+        </element>
+        <element name="gen_xoimpr" type="float" flags="1">
+            <description><![CDATA[total cumulative crossover change]]></description>
+        </element>
+        <element name="clrstats" function="true" type="void" flags="2">
+            <description><![CDATA[]]></description>
+            <arguments/>
+        </element>
+    </type>
+    <type name="Geno" context="Global context">
+        <description><![CDATA[All information about a single genotype.
+This is a genetics-only object which does not contain any performance data. See also: Genotype class]]></description>
+        <element name="name" type="string" max="40" flags="256"/>
+        <element name="rawgenotype" type="string" flags="257">
+            <description><![CDATA[Genotype, excluding the format specifier]]></description>
+        </element>
+        <element name="info" type="string" flags="256">
+            <description><![CDATA[Additional information or comments]]></description>
+        </element>
+        <element name="format" type="string" flags="257">
+            <description><![CDATA[Genotype format]]></description>
+        </element>
+        <element name="genotype" type="string" flags="257">
+            <description><![CDATA[Genes as a string of characters]]></description>
+        </element>
+        <element name="isValid" type="integer" min="0" max="1" deprecated="true" flags="8449">
+            <description><![CDATA[Use 'is_valid' instead of 'isValid'.]]></description>
+        </element>
+        <element name="is_valid" type="integer" min="-1" max="1" default="-1" flags="256">
+            <description><![CDATA[0 = invalid genotype
+1 = valid genotype
+-1 = validity is not known. This is a transient state. The value of "is_valid" will never be -1 when read. It is safe to treat is_valid as boolean in statements like "if (g.is_valid) ...". Setting "is_valid=-1" will make it 0 or 1 again. This third state (-1) is only needed for loading Genotype objects from files where the "is_valid" field might not be present.]]></description>
+        </element>
+        <element name="getConverted" function="true" type="Geno" flags="256">
+            <arguments>
+                <argument name="format" type="string"/>
+            </arguments>
+        </element>
+        <element name="getConvertedWithCheckpoints" function="true" type="Geno" flags="256">
+            <description><![CDATA[See also Model.newWithCheckpoints()]]></description>
+            <arguments>
+                <argument name="format" type="string"/>
+            </arguments>
+        </element>
+        <element name="f0genotype" type="string" flags="257">
+            <description><![CDATA[converted to f0 genotype]]></description>
+        </element>
+        <element name="new" function="true" type="Geno">
+            <arguments/>
+        </element>
+        <element name="newFromString" function="true" type="Geno">
+            <arguments>
+                <argument name="genotype" type="string"/>
+            </arguments>
+        </element>
+        <element name="newFrom" function="true" type="Geno">
+            <arguments>
+                <argument name="genotype" type="string"/>
+                <argument name="format" type="string"/>
+                <argument name="name" type="string"/>
+                <argument name="description" type="string"/>
+            </arguments>
+        </element>
+        <element name="autoname" type="string" flags="257"/>
+        <element name="toVector" type="Vector" flags="257"/>
+        <element name="newFromVector" function="true" type="Geno">
+            <arguments>
+                <argument type="Vector"/>
+            </arguments>
+        </element>
+    </type>
+    <type name="Genotype" context="Global context">
+        <description>
+            <![CDATA[A Genotype with the associated performance information. Adding genotypes to GenePool makes them accessible in Framsticks GUI and enables the use of GenePool selection methods. See also GenePools.]]></description>
+        <element name="name" type="string" max="40"/>
+        <element name="genotype" type="string">
+            <description><![CDATA[Genes as a string of characters.]]></description>
+        </element>
+        <element name="info_timestamp" type="float" min="0" max="-1" default="0.0"/>
+        <element name="info_author" type="string" max="100"/>
+        <element name="info_author_ispublic" type="integer" min="0" max="1" default="1"/>
+        <element name="info_email" type="string" max="100"/>
+        <element name="info_email_ispublic" type="integer" min="0" max="1" default="0"/>
+        <element name="info" type="string" min="1" max="1000">
+            <description><![CDATA[Short description of key features of this creature.]]></description>
+        </element>
+        <element name="info_origin" type="integer" min="0" max="4" default="0">
+            <description><![CDATA[Declaration of how this genotype originated.]]></description>
+        </element>
+        <element name="info_how_created" type="string" min="1" max="1000">
+            <description>
+                <![CDATA[Description of the process of designing and/or evolving this genotype.]]></description>
+        </element>
+        <element name="info_performance" type="string" min="1" max="1000">
+            <description>
+                <![CDATA[Description of why this genotype is special/interesting and how it performs.]]></description>
+        </element>
+        <element name="simi" type="float" flags="3">
+            <description><![CDATA[Average of (1+dissimilarity(thisgeno,othergeno)) calculated for all other Genotype instances. This property is meant as fitness multiplier, included in the fitness function when similarity speciation (ExpProperties.cr_simi) is enabled.
+Read about details of dissimilarity calculation and its applications:
+http://www.framsticks.com/bib/Komosinski-et-al-2001
+http://www.framsticks.com/bib/Komosinski-and-Kubiak-2011
+http://www.framsticks.com/bib/Komosinski-2016]]></description>
+        </element>
+        <element name="energ0" type="float" deprecated="true" flags="8227"/>
+        <element name="energy0" type="float" min="0" max="-1" default="0.0" flags="16"/>
+        <element name="strsiz" type="integer" deprecated="true" flags="8227"/>
+        <element name="strjoints" type="integer" deprecated="true" flags="8227"/>
+        <element name="nnsiz" type="integer" deprecated="true" flags="8227"/>
+        <element name="nncon" type="integer" deprecated="true" flags="8227"/>
+        <element name="numparts" type="integer" flags="16"/>
+        <element name="numjoints" type="integer" flags="16"/>
+        <element name="numneurons" type="integer" flags="16"/>
+        <element name="numconnections" type="integer" flags="16"/>
+        <element name="num" type="integer">
+            <description><![CDATA[Acts as a unique identifier, but less strict than "uid". Unlike "uid", "num" can be changed and therefore can be saved and restored, providing persistence and continuity beyond a single application run. "num" is only guaranteed to be unique if it is autogenerated and not changed by the user, otherwise it is user's responsibility to manage the proper values of "num". "Genotype.num" is generated on adding a Genotype object to a group, unless it already has a non-zero "num" (previously autogenerated or user-assigned). Autogenerated "num" is always equal to the largest previously used "num" + 1. The largest previously used value is stored in Simulator.last_genotype_num and can be changed as well (and is automatically saved and restored as a part of the Simulator state). Limitation: being a 32-bit integer, "num" overflows at about 2 billion counts.
+See also: uid]]></description>
+        </element>
+        <element name="gnum" type="integer"/>
+        <element name="popsiz" type="integer" deprecated="true" flags="8226">
+            <description><![CDATA[Please use 'instances' instead of 'popsiz'.]]></description>
+        </element>
+        <element name="instances" type="integer">
+            <description><![CDATA[Copies of this genotype]]></description>
+        </element>
+        <element name="lifespan" type="float">
+            <description><![CDATA[Average life span]]></description>
+        </element>
+        <element name="velocity" type="float">
+            <description><![CDATA[Average velocity]]></description>
+        </element>
+        <element name="distance" type="float"/>
+        <element name="vertvel" type="float"/>
+        <element name="vertpos" type="float"/>
+        <element name="fit" type="float" flags="3"/>
+        <element name="fit2" type="float" flags="3">
+            <description><![CDATA[Fitness shifted by (avg-n*stddev)]]></description>
+        </element>
+        <element name="f0genotype" type="string" flags="3">
+            <description><![CDATA[converted to f0 genotype]]></description>
+        </element>
+        <element name="convtrace1" type="string" flags="3"/>
+        <element name="data" type="Dictionary" flags="32768"/>
+        <element name="user1" type="untyped" deprecated="true" flags="8192"/>
+        <element name="user2" type="untyped" deprecated="true" flags="8192"/>
+        <element name="user3" type="untyped" deprecated="true" flags="8192"/>
+        <element name="mutate" function="true" type="void">
+            <arguments/>
+        </element>
+        <element name="isValid" type="integer" min="0" max="1" deprecated="true" flags="8227">
+            <description><![CDATA[Use 'is_valid' instead of 'isValid'.]]></description>
+        </element>
+        <element name="is_valid" type="integer" min="-1" max="1" default="-1" flags="32">
+            <description><![CDATA[0 = invalid genotype
+1 = valid genotype
+-1 = validity is not known. This is a transient state. The value of "is_valid" will never be -1 when read. It is safe to treat is_valid as boolean in statements like "if (g.is_valid) ...". Setting "is_valid=-1" will make it 0 or 1 again. This third state (-1) is only needed for loading Genotype objects from files where the "is_valid" field might not be present.]]></description>
+        </element>
+        <element name="getNormalized" function="true" type="float" flags="32">
+            <arguments>
+                <argument name="property name or index" type="untyped"/>
+            </arguments>
+        </element>
+        <element name="geno" type="Geno" flags="35">
+            <description><![CDATA[A Geno object for this Genotype]]></description>
+        </element>
+        <element name="uid" type="string" flags="1">
+            <description><![CDATA[Unique identifier that is generated on object creation. "uid" is only unique during a single application run. Subsequent runs generate the same sequence of uid values.
+See also: num]]></description>
+        </element>
+        <element name="getModel" function="true" type="Model" flags="32">
+            <arguments/>
+        </element>
+        <element name="splitInstances" function="true" type="void" flags="32">
+            <arguments/>
+        </element>
+        <element name="newFromString" function="true" type="Genotype" flags="32">
+            <arguments>
+                <argument name="genotype" type="string"/>
+            </arguments>
+        </element>
+        <element name="newFromGeno" function="true" type="Genotype" flags="32">
+            <arguments>
+                <argument type="Geno"/>
+            </arguments>
+        </element>
+        <element name="newFromCreature" function="true" type="Genotype" flags="32">
+            <arguments>
+                <argument type="Creature"/>
+            </arguments>
+        </element>
+        <element name="addPerformanceFromCreature" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Updates the Genotype's performance values merging them with the supplied Creture's performance. It assumes the Genotype.instances has a reasonable value and performs the proper weighting. Use your own function instead if these conditions are not met in your experiment.]]></description>
+            <arguments>
+                <argument type="Creature"/>
+            </arguments>
+        </element>
+        <element name="moveTo" function="true" type="void" flags="32">
+            <description><![CDATA[the genotype is removed from its current pool when pool=null]]></description>
+            <arguments>
+                <argument name="pool" type="GenePool"/>
+            </arguments>
+        </element>
+        <element name="clone" function="true" type="Genotype" flags="32">
+            <description>
+                <![CDATA[Returns a duplicated genotype, not attached to any gene pool. All genotype fields are copied including 'data' (for which Dictionary.clone() produces a shallow copy).]]></description>
+            <arguments/>
+        </element>
+        <element name="delete" function="true" type="void" flags="32">
+            <arguments/>
+        </element>
+        <element name="deleteOne" function="true" type="void" flags="32">
+            <description><![CDATA[]]></description>
+            <arguments/>
+        </element>
+        <element name="genepool" type="GenePool" flags="35">
+            <description><![CDATA[GenePool object or null when not in pool]]></description>
+        </element>
+        <element name="index" type="integer" flags="35">
+            <description><![CDATA[-1 when not in pool.
+Note that the index changes depending on the current genotype position in the pool. Use Genotype.uid if you need a permanent identifier that persists through the entire object lifetime.]]></description>
+        </element>
+        <element name="beforeLoad" function="true" type="void" flags="32">
+            <arguments/>
+        </element>
+        <element name="afterLoad" function="true" type="void" flags="32">
+            <arguments/>
+        </element>
+    </type>
+    <type name="Interface" context="Global context">
+        <description><![CDATA[Used to query for object member descriptions. Examples:
+  Simulator.print(Interface.makeFrom(Populations[0]).getType("perfperiod"));
+  Simulator.print(Interface.makeFrom(Populations[0]).getMin("perfperiod"));
+  Simulator.print(Interface.makeFrom(Populations[0]).getMax("perfperiod"));
+  Simulator.print(Interface.makeFrom(Populations[0]).getDefault("perfperiod"));
+  Simulator.print(Interface.makeFrom(Joint.*).getMax("dx"));
+  Simulator.print(Interface.makeFrom(Part.*).getName("x"));
+  Simulator.print(Interface.makeFrom(Creature.*).getHelp("idleen"));
+  var iface=Interface.makeFrom(someobject); var description="This object has "+iface.size+" properties, first property is "+iface.getId(0);
+]]></description>
+        <element name="name" type="string" flags="257"/>
+        <element name="size" type="integer" flags="257"/>
+        <element name="groups" type="integer" flags="257"/>
+        <element name="get" function="true" type="untyped" flags="256">
+            <arguments>
+                <argument name="index or id" type="untyped"/>
+            </arguments>
+        </element>
+        <element name="getId" function="true" type="string" flags="256">
+            <arguments>
+                <argument name="index or id" type="untyped"/>
+            </arguments>
+        </element>
+        <element name="getName" function="true" type="string" flags="256">
+            <arguments>
+                <argument name="index or id" type="untyped"/>
+            </arguments>
+        </element>
+        <element name="getGroup" function="true" type="integer" flags="256">
+            <arguments>
+                <argument name="index or id" type="untyped"/>
+            </arguments>
+        </element>
+        <element name="getGroupName" function="true" type="string" flags="256">
+            <arguments>
+                <argument name="index" type="integer"/>
+            </arguments>
+        </element>
+        <element name="getType" function="true" type="string" flags="256">
+            <arguments>
+                <argument name="index or id" type="untyped"/>
+            </arguments>
+        </element>
+        <element name="getMin" function="true" type="string" flags="256">
+            <arguments>
+                <argument name="index or id" type="untyped"/>
+            </arguments>
+        </element>
+        <element name="getMax" function="true" type="string" flags="256">
+            <arguments>
+                <argument name="index or id" type="untyped"/>
+            </arguments>
+        </element>
+        <element name="getDefault" function="true" type="string" flags="256">
+            <arguments>
+                <argument name="index or id" type="untyped"/>
+            </arguments>
+        </element>
+        <element name="getFlags" function="true" type="integer" flags="256">
+            <arguments>
+                <argument name="index or id" type="untyped"/>
+            </arguments>
+        </element>
+        <element name="getHelp" function="true" type="string" flags="256">
+            <arguments>
+                <argument name="index or id" type="untyped"/>
+            </arguments>
+        </element>
+        <element name="findId" function="true" type="integer" flags="256">
+            <arguments>
+                <argument name="name" type="string"/>
+            </arguments>
+        </element>
+        <element name="findGroupId" function="true" type="integer" flags="256">
+            <arguments>
+                <argument name="name" type="string"/>
+            </arguments>
+        </element>
+        <element name="findIdInGroup" function="true" type="integer" flags="256">
+            <arguments>
+                <argument name="name" type="string"/>
+                <argument name="group name or index" type="untyped"/>
+            </arguments>
+        </element>
+        <element name="makeFrom" function="true" type="Interface" flags="2">
+            <arguments>
+                <argument type="Object"/>
+            </arguments>
+        </element>
+        <element name="set" function="true" type="void" flags="256">
+            <arguments>
+                <argument name="index or id" type="untyped"/>
+                <argument name="value" type="untyped"/>
+            </arguments>
+        </element>
+        <element name="setDefault" function="true" type="void" flags="256">
+            <arguments>
+                <argument name="index or id" type="untyped"/>
+            </arguments>
+        </element>
+        <element name="setAllDefault" function="true" type="void" flags="256">
+            <arguments/>
+        </element>
+        <element name="invoke" function="true" type="void" flags="256">
+            <arguments>
+                <argument name="function name or index" type="untyped"/>
+                <argument name="arguments" type="Vector"/>
+            </arguments>
+        </element>
+    </type>
+    <type name="Joint" context="Global context">
+        <element name="p1" type="integer" min="-1" max="999999" default="-1" flags="1024"/>
+        <element name="p2" type="integer" min="-1" max="999999" default="-1" flags="1024"/>
+        <element name="rx" type="float"/>
+        <element name="ry" type="float" flags="1024"/>
+        <element name="rz" type="float" flags="1024"/>
+        <element name="dx" type="float" min="-2" max="2" default="0.0"/>
+        <element name="dy" type="float" min="-2" max="2" default="0.0" flags="1024"/>
+        <element name="dz" type="float" min="-2" max="2" default="0.0" flags="1024"/>
+        <element name="sh" type="integer" min="0" max="3" default="0"/>
+        <element name="hx" type="float"/>
+        <element name="hy" type="float" flags="1024"/>
+        <element name="hz" type="float" flags="1024"/>
+        <element name="hrx" type="float"/>
+        <element name="hry" type="float" flags="1024"/>
+        <element name="hrz" type="float" flags="1024"/>
+        <element name="hxn" type="float" min="-6.2832" max="0" default="-1.5708"/>
+        <element name="hxp" type="float" min="0" max="6.2832" default="1.5708" flags="1024"/>
+        <element name="hyn" type="float" min="-6.2832" max="0" default="-1.5708"/>
+        <element name="hyp" type="float" min="0" max="6.2832" default="1.5708" flags="1024"/>
+        <element name="stif" type="float" min="0" max="1" default="1.0"/>
+        <element name="rotstif" type="float" min="0" max="1" default="1.0"/>
+        <element name="stam" type="float" min="0" max="1" default="0.25"/>
+        <element name="i" type="string"/>
+        <element name="Vstyle" type="string" default="joint"/>
+        <element name="vr" type="float" min="0" max="1" default="1.0"/>
+        <element name="vg" type="float" min="0" max="1" default="1.0" flags="1024"/>
+        <element name="vb" type="float" min="0" max="1" default="1.0" flags="1024"/>
+    </type>
+    <type name="Loader" context="Global context">
+        <description>
+            <![CDATA[Support for loading files in the Framsticks format. Used in the experiment definition to retrieve experiment state (see OnExpLoad function in standard.expdef). Registered objects (addClass) are handled automaticaly. Loader can call user functions defined by setBreakLabel.]]></description>
+        <element name="addClass" function="true" type="void" flags="32">
+            <arguments>
+                <argument type="Object"/>
+            </arguments>
+        </element>
+        <element name="removeClass" function="true" type="void" flags="32">
+            <arguments>
+                <argument type="Object"/>
+            </arguments>
+        </element>
+        <element name="clearClasses" function="true" type="void" flags="32">
+            <arguments/>
+        </element>
+        <element name="go" function="true" type="integer" flags="32">
+            <arguments/>
+        </element>
+        <element name="run" function="true" type="integer" flags="32">
+            <arguments/>
+        </element>
+        <element name="status" type="integer" flags="1"/>
+        <element name="comment" type="string" flags="1"/>
+        <element name="setBreak" function="true" type="void" flags="32">
+            <arguments>
+                <argument name="break conditions" type="integer"/>
+            </arguments>
+        </element>
+        <element name="setBreakLabel" function="true" type="void" flags="32">
+            <arguments>
+                <argument name="break condition" type="integer"/>
+                <argument name="label" type="string"/>
+            </arguments>
+        </element>
+        <element name="abort" function="true" type="void" flags="32">
+            <arguments/>
+        </element>
+        <element name="currentObject" type="Object" flags="32"/>
+        <element name="objectName" type="string" flags="32"/>
+        <element name="loadObject" function="true" type="void" flags="32">
+            <arguments/>
+        </element>
+        <element name="skipObject" function="true" type="void" flags="32">
+            <arguments/>
+        </element>
+        <element name="firstComment" type="integer" min="0" max="1" flags="1"/>
+        <element name="BeforeObject" type="integer" flags="1"/>
+        <element name="AfterObject" type="integer" flags="1"/>
+        <element name="BeforeUnknown" type="integer" flags="1"/>
+        <element name="OnComment" type="integer" flags="1"/>
+        <element name="OnError" type="integer" flags="1"/>
+    </type>
+    <type name="Math" context="Global context">
+        <description><![CDATA[Mathematical functions library.]]></description>
+        <element name="pi" type="float" flags="1"/>
+        <element name="twopi" type="float" flags="1"/>
+        <element name="pi2" type="float" flags="1"/>
+        <element name="pi4" type="float" flags="1"/>
+        <element name="random" function="true" type="integer">
+            <description><![CDATA[0..num-1]]></description>
+            <arguments>
+                <argument name="num" type="integer"/>
+            </arguments>
+        </element>
+        <element name="rnd01" type="float" flags="1"/>
+        <element name="rndUni" function="true" type="float">
+            <description><![CDATA[[begin..end)]]></description>
+            <arguments>
+                <argument name="begin" type="float"/>
+                <argument name="end" type="float"/>
+            </arguments>
+        </element>
+        <element name="rndGaussStd" type="float" flags="1"/>
+        <element name="rndGauss" function="true" type="float">
+            <description><![CDATA[rndGaussStd is rndGauss(0,1)]]></description>
+            <arguments>
+                <argument name="mean" type="float"/>
+                <argument name="standard deviation" type="float"/>
+            </arguments>
+        </element>
+        <element name="rndCustom" function="true" type="float">
+            <description>
+                <![CDATA[the parameter describes the desired random distribution, being a sum of uniform distributions, eg. rndCustom([-10,-1, -1,1, 1,10]) defines 3 uniform distribution intervals [-1,10) [-1,1), [1,10)]]></description>
+            <arguments>
+                <argument type="Vector"/>
+            </arguments>
+        </element>
+        <element name="seed" type="integer">
+            <description><![CDATA[Random number generator seed.
+Note: Math.seed influences all further random activity in the simulator, not just the results of functions in this class.
+Note #2: When read, the value behaves just like a regular variable that stores the previously assigned value. It does NOT reflect the internal random generator seed that changes every time a random number has been generated.]]></description>
+        </element>
+        <element name="randomize" function="true">
+            <description><![CDATA[Set random seed for the random number generator.]]></description>
+        </element>
+        <element name="time" type="float" flags="1">
+            <description><![CDATA[Number of seconds since the Epoch (00:00:00 UTC/GMT, January 1, 1970)]]></description>
+        </element>
+        <element name="abs" function="true" type="float">
+            <arguments>
+                <argument type="float"/>
+            </arguments>
+        </element>
+        <element name="sign" function="true" type="integer">
+            <arguments>
+                <argument type="float"/>
+            </arguments>
+        </element>
+        <element name="sin" function="true" type="float">
+            <arguments>
+                <argument type="float"/>
+            </arguments>
+        </element>
+        <element name="cos" function="true" type="float">
+            <arguments>
+                <argument type="float"/>
+            </arguments>
+        </element>
+        <element name="tan" function="true" type="float">
+            <arguments>
+                <argument type="float"/>
+            </arguments>
+        </element>
+        <element name="asin" function="true" type="float">
+            <arguments>
+                <argument type="float"/>
+            </arguments>
+        </element>
+        <element name="acos" function="true" type="float">
+            <arguments>
+                <argument type="float"/>
+            </arguments>
+        </element>
+        <element name="atan" function="true" type="float">
+            <arguments>
+                <argument type="float"/>
+            </arguments>
+        </element>
+        <element name="atan2" function="true" type="float">
+            <arguments>
+                <argument name="y" type="float"/>
+                <argument name="x" type="float"/>
+            </arguments>
+        </element>
+        <element name="pow" function="true" type="float">
+            <arguments>
+                <argument name="a" type="float"/>
+                <argument name="b" type="float"/>
+            </arguments>
+        </element>
+        <element name="exp" function="true" type="float">
+            <arguments>
+                <argument type="float"/>
+            </arguments>
+        </element>
+        <element name="log" function="true" type="float">
+            <arguments>
+                <argument type="float"/>
+            </arguments>
+        </element>
+        <element name="sqrt" function="true" type="float">
+            <arguments>
+                <argument type="float"/>
+            </arguments>
+        </element>
+        <element name="sigmoid" function="true" type="float">
+            <arguments>
+                <argument type="float"/>
+            </arguments>
+        </element>
+        <element name="min" function="true" type="untyped">
+            <arguments>
+                <argument type="untyped"/>
+                <argument type="untyped"/>
+            </arguments>
+        </element>
+        <element name="max" function="true" type="untyped">
+            <arguments>
+                <argument type="untyped"/>
+                <argument type="untyped"/>
+            </arguments>
+        </element>
+    </type>
+    <type name="MechJoint" context="Global context">
+        <element name="rx" type="float"/>
+        <element name="ry" type="float"/>
+        <element name="rz" type="float"/>
+        <element name="dx" type="float"/>
+        <element name="dy" type="float"/>
+        <element name="dz" type="float"/>
+        <element name="stif" type="float"/>
+        <element name="rotstif" type="float"/>
+        <element name="part1" type="MechPart" flags="1"/>
+        <element name="part2" type="MechPart" flags="1"/>
+        <element name="stress" type="float" flags="1"/>
+        <element name="rotstress" type="float" flags="1"/>
+        <element name="joint" type="Joint" flags="1">
+            <description><![CDATA[corresponding Joint object]]></description>
+        </element>
+    </type>
+    <type name="MechPart" context="Global context">
+        <element name="x" type="float"/>
+        <element name="y" type="float"/>
+        <element name="z" type="float"/>
+        <element name="pos" type="XYZ" flags="1"/>
+        <element name="m" type="float"/>
+        <element name="s" type="float"/>
+        <element name="vol" type="float"/>
+        <element name="fr" type="float"/>
+        <element name="vx" type="float"/>
+        <element name="vy" type="float"/>
+        <element name="vz" type="float"/>
+        <element name="v" type="XYZ" flags="1"/>
+        <element name="orient" type="Orient" flags="1"/>
+        <element name="oxx" type="float"/>
+        <element name="oxy" type="float"/>
+        <element name="oxz" type="float"/>
+        <element name="oyx" type="float"/>
+        <element name="oyy" type="float"/>
+        <element name="oyz" type="float"/>
+        <element name="ozx" type="float"/>
+        <element name="ozy" type="float"/>
+        <element name="ozz" type="float"/>
+        <element name="applyForce" function="true" type="void">
+            <arguments>
+                <argument name="x" type="float"/>
+                <argument name="y" type="float"/>
+                <argument name="z" type="float"/>
+            </arguments>
+        </element>
+        <element name="part" type="Part" flags="1">
+            <description><![CDATA[corresponding Part object]]></description>
+        </element>
+    </type>
+    <type name="MessageCatcher" context="Global context">
+        <description><![CDATA[Capture error messages.]]></description>
+        <element name="new" function="true" type="MessageCatcher">
+            <arguments/>
+        </element>
+        <element name="close" function="true" type="void" flags="256">
+            <arguments/>
+        </element>
+        <element name="store" type="integer" min="0" max="2" default="0" flags="256"/>
+        <element name="error_count" type="integer" flags="257"/>
+        <element name="warning_count" type="integer" flags="257"/>
+        <element name="info_count" type="integer" flags="257"/>
+        <element name="stored_count" type="integer" flags="257"/>
+        <element name="messages" type="string" flags="257"/>
+        <element name="summary" type="string" flags="257"/>
+    </type>
+    <type name="Model" context="Global context">
+        <element name="se" type="float" flags="256"/>
+        <element name="Vstyle" type="string" flags="256"/>
+        <element name="geno" type="Geno" flags="257"/>
+        <element name="newFromString" function="true" type="Model">
+            <arguments>
+                <argument name="genotype" type="string"/>
+            </arguments>
+        </element>
+        <element name="newFromGeno" function="true" type="Model">
+            <arguments>
+                <argument type="Geno"/>
+            </arguments>
+        </element>
+        <element name="newWithCheckpoints" function="true" type="Model">
+            <description>
+                <![CDATA[Creates a Model with the "Checkpoints" option enabled. Genotype converters supporting Checkpoints provide a sequence of Models that reflects development stages of the creature (this sequence is used purely for debugging and visualization of phenotype growth/development). Checkpoint Models can be accessed using getCheckpoint(i) for i ranging from 0 to numcheckpoints-1. Models created without the Checkpoint option and Models coming from unsupported converters have numcheckpoints=0.]]></description>
+            <arguments>
+                <argument name="Geno object or string genotype" type="untyped"/>
+            </arguments>
+        </element>
+        <element name="numparts" type="integer" flags="259"/>
+        <element name="numjoints" type="integer" flags="259"/>
+        <element name="numneurons" type="integer" flags="259"/>
+        <element name="numconnections" type="integer" flags="259"/>
+        <element name="getPart" function="true" type="Part" flags="288">
+            <arguments>
+                <argument name="index" type="integer"/>
+            </arguments>
+        </element>
+        <element name="getJoint" function="true" type="Joint" flags="288">
+            <arguments>
+                <argument name="index" type="integer"/>
+            </arguments>
+        </element>
+        <element name="getNeuroDef" function="true" type="NeuroDef" flags="288">
+            <arguments>
+                <argument name="index" type="integer"/>
+            </arguments>
+        </element>
+        <element name="size_x" type="float" deprecated="true" flags="8449">
+            <description><![CDATA[(size_x,size_y,size_z) are dimensions of the axis-aligned bounding box of the creature, including imaginary Part sizes (Part.s, usually 1.0). A creature consisting of a single default part has the size of (2.0,2.0,2.0) - twice the Part.s value (like a sphere diameter is twice its radius).
+See also: Creature.moveAbs]]></description>
+        </element>
+        <element name="size_y" type="float" deprecated="true" flags="8449">
+            <description><![CDATA[See Model.size_x]]></description>
+        </element>
+        <element name="size_z" type="float" deprecated="true" flags="8449">
+            <description><![CDATA[See Model.size_x]]></description>
+        </element>
+        <element name="bboxSize" type="XYZ" flags="257"/>
+        <element name="numcheckpoints" type="integer" flags="259"/>
+        <element name="getCheckpoint" function="true" type="Model" flags="288">
+            <description><![CDATA[Checkpoint Model objects are only valid as long as the parent Model object exists.
+See also: Model.newWithCheckpoints()
+
+// incorrect usage - calling getCheckpoint() on a temporary object:
+var c=Model.newWithCheckpoints("XXX").getCheckpoint(1).genotype.geno;
+
+// correct usage - keeping the parent Model reference in 'm':
+var m=Model.newWithCheckpoints("XXX");
+var c=m.getCheckpoint(1).genotype.geno;
+]]></description>
+            <arguments>
+                <argument name="index" type="integer"/>
+            </arguments>
+        </element>
+        <element name="shape_type" type="integer" min="0" max="3" flags="259"/>
+        <element name="solid_model" type="Model" flags="259">
+            <description>
+                <![CDATA[Conversion of this Model to solid shapes. Note! Only available when this Model has shape_type==2 (Ball-and-stick).]]></description>
+        </element>
+    </type>
+    <type name="ModelGeometry" context="Global context">
+        <description><![CDATA[Approximately estimates sizes, volume, and area of a Model based on the geometry of its parts.
+Example usage:
+Simulator.print(ModelGeometry.forModel(Model.newFromString("//0\np:sh=1\n")).area());
+
+ModelGeometry.geom_density refers to the global simulator parameter (also available in GUI).
+To set geom_density for individual ModelGeometry objects:
+var mg=ModelGeometry.forModel(GenePools[0][0].getModel()); mg.geom_density=2; GenePools[0][0].data->area=mg.area();
+]]></description>
+        <element name="geom_density" type="float" min="0.01" max="100" default="1.0">
+            <description><![CDATA[Affects the geometry calculation precision]]></description>
+        </element>
+        <element name="forModel" function="true" type="ModelGeometry" flags="32">
+            <description>
+                <![CDATA[The returned ModelGeometry object can be used to calculate geometric properties (volume, area, sizes) of the associated model. The density is copied from the current global ModelGeometry.geom_density on object creation.]]></description>
+            <arguments>
+                <argument type="Model"/>
+            </arguments>
+        </element>
+        <element name="volume" function="true" type="float" flags="288">
+            <arguments/>
+        </element>
+        <element name="area" function="true" type="float" flags="288">
+            <arguments/>
+        </element>
+        <element name="sizesAndAxes" function="true" type="Vector" flags="288">
+            <description><![CDATA[The returned vector contains XYZ (sizes) and Orient (axes) objects.]]></description>
+            <arguments/>
+        </element>
+    </type>
+    <type name="ModelSymmetry" context="Global context">
+        <description>
+            <![CDATA[Calculates bilateral symmetry. Details are described in http://www.framsticks.com/bib/Jaskowski-and-Komosinski-2008]]></description>
+        <element name="calculateSymmetry" function="true" type="float" flags="32">
+            <description><![CDATA[Returns bilateral symmetry (0.0 .. 1.0) for a given Model using default precision parameters (symPosSteps,symAlphaSteps,symBetaSteps). Returns the symmetry plane, too (sets symResultA,B,C,D).
+Note: may take a long time for large creatures.]]></description>
+            <arguments>
+                <argument name="model" type="Model"/>
+            </arguments>
+        </element>
+        <element name="calculateSymmetry2" function="true" type="float" flags="32">
+            <description><![CDATA[Returns bilateral symmetry (0.0 .. 1.0) for a given Model using specified precision parameters. Returns the symmetry plane, too (sets symResultA,B,C,D).
+Note: may take a long time for large creatures.]]></description>
+            <arguments>
+                <argument name="model" type="Model"/>
+                <argument name="posSteps" type="integer"/>
+                <argument name="alphaSteps" type="integer"/>
+                <argument name="betaSteps" type="integer"/>
+            </arguments>
+        </element>
+        <element name="calculateSymmetryForPlane" function="true" type="float" flags="32">
+            <description>
+                <![CDATA[Returns bilateral symmetry (0.0 .. 1.0) for a given Model and given a specific plane defined by coefficients A, B, C, D.]]></description>
+            <arguments>
+                <argument name="model" type="Model"/>
+                <argument name="A" type="float"/>
+                <argument name="B" type="float"/>
+                <argument name="C" type="float"/>
+                <argument name="D" type="float"/>
+            </arguments>
+        </element>
+        <element name="symPosSteps" type="integer" min="2" max="50" default="10">
+            <description><![CDATA[Default number of samples per stick length]]></description>
+        </element>
+        <element name="symAlphaSteps" type="integer" min="2" max="50" default="20">
+            <description><![CDATA[Default number of samples per full angle (#1)]]></description>
+        </element>
+        <element name="symBetaSteps" type="integer" min="2" max="50" default="20">
+            <description><![CDATA[Default number of samples per full angle (#2)]]></description>
+        </element>
+        <element name="symResultA" type="float" flags="35"/>
+        <element name="symResultB" type="float" flags="35"/>
+        <element name="symResultC" type="float" flags="35"/>
+        <element name="symResultD" type="float" flags="35"/>
+    </type>
+    <type name="Neuro" context="Global context">
+        <description><![CDATA[Live Neuron object.]]></description>
+        <element name="getInputState" function="true" type="float">
+            <arguments>
+                <argument name="input" type="integer"/>
+            </arguments>
+        </element>
+        <element name="getInputWeight" function="true" type="float">
+            <arguments>
+                <argument name="input" type="integer"/>
+            </arguments>
+        </element>
+        <element name="getWeightedInputState" function="true" type="float">
+            <arguments>
+                <argument name="input" type="integer"/>
+            </arguments>
+        </element>
+        <element name="getInputSum" function="true" type="float">
+            <arguments>
+                <argument name="input" type="integer"/>
+            </arguments>
+        </element>
+        <element name="getWeightedInputSum" function="true" type="float">
+            <description>
+                <![CDATA[Uses any number of inputs starting with the specified input. getWeightedInputSum(0)=weightedInputSum]]></description>
+            <arguments>
+                <argument name="input" type="integer"/>
+            </arguments>
+        </element>
+        <element name="getInputCount" type="integer" flags="1"/>
+        <element name="inputSum" type="float" flags="1"/>
+        <element name="weightedInputSum" type="float" flags="1"/>
+        <element name="getInputChannelCount" function="true" type="integer">
+            <arguments>
+                <argument name="input" type="integer"/>
+            </arguments>
+        </element>
+        <element name="getInputStateChannel" function="true" type="float">
+            <arguments>
+                <argument name="input" type="integer"/>
+                <argument name="channel" type="integer"/>
+            </arguments>
+        </element>
+        <element name="getWeightedInputStateChannel" function="true" type="float">
+            <arguments>
+                <argument name="input" type="integer"/>
+                <argument name="channel" type="integer"/>
+            </arguments>
+        </element>
+        <element name="state" type="float">
+            <description><![CDATA[When read, returns the current neuron state.
+When written, sets the 'internal' neuron state that will become current in the next step.
+Typically you should use this field, and not currState.]]></description>
+        </element>
+        <element name="channelCount" type="integer"/>
+        <element name="getStateChannel" function="true" type="float">
+            <arguments>
+                <argument name="channel" type="integer"/>
+            </arguments>
+        </element>
+        <element name="setStateChannel" function="true" type="void">
+            <arguments>
+                <argument name="channel" type="integer"/>
+                <argument name="value" type="float"/>
+            </arguments>
+        </element>
+        <element name="hold" type="integer" min="0" max="1">
+            <description>
+                <![CDATA["Holding" means keeping the neuron state as is, blocking the regular neuron operation. This is useful when your script needs to inject some control signals into the NN. Without "holding", live neurons would be constantly overwriting your changes, and the rest of the NN could see inconsistent states, depending on the connections. Setting hold=1 ensures the neuron state will be only set by you, and not by the neuron. The enforced signal value can be set using Neuro.currState before or after setting hold=1. Set hold=0 to resume normal operation.]]></description>
+        </element>
+        <element name="currState" type="float">
+            <description><![CDATA[When read, it behaves just like the 'state' field.
+When written, changes the current neuron state immediately, which disturbs the regular synchronous NN operation.
+This feature should only be used while controlling the neuron 'from outside' (like a neuro probe) and not in the neuron definition. See also: Neuro.hold]]></description>
+        </element>
+        <element name="setCurrStateChannel" function="true" type="void">
+            <description><![CDATA[Analogous to "currState".]]></description>
+            <arguments>
+                <argument name="channel" type="integer"/>
+                <argument name="value" type="float"/>
+            </arguments>
+        </element>
+        <element name="position_x" type="float" flags="1"/>
+        <element name="position_y" type="float" flags="1"/>
+        <element name="position_z" type="float" flags="1"/>
+        <element name="relative_pos" type="XYZ" flags="1"/>
+        <element name="relative_orient" type="Orient" flags="1"/>
+        <element name="creature" type="Creature" flags="1"/>
+        <element name="mechpart" type="MechPart" flags="1">
+            <description><![CDATA[The MechPart object where this neuron is located]]></description>
+        </element>
+        <element name="mechjoint" type="MechJoint" flags="1">
+            <description><![CDATA[The MechJoint object where this neuron is located]]></description>
+        </element>
+        <element name="neuroproperties" type="NeuroProperties" flags="1">
+            <description><![CDATA[Neurons can have different fields depending on their class. Script neurons have their fields defined using the "property:" syntax. If you develop a custom neuron script you should use the NeuroProperties object for accessing your own neuron fields. The Neuro.neuroproperties property is meant for accessing the neuron fields from the outside script.
+Examples:
+var c=Populations.createFromString("X[N]");
+Simulator.print("standard neuron inertia="+c.getNeuro(0).neuroproperties.in);
+c=Populations.createFromString("X[Nn,e:0.1]");
+Simulator.print("noisy neuron error rate="+c.getNeuro(0).neuroproperties.e);
+
+The Interface object can be used to discover which fields are available for a certain neuron object:
+c=Populations.createFromString("X[N]");
+var iobj=Interface.makeFrom(c.getNeuro(0).neuroproperties);
+var i;
+for(i=0;i<iobj.size;i++)
+ Simulator.print(iobj.getId(i)+" ("+iobj.getName(i)+")");]]></description>
+        </element>
+        <element name="def" type="NeuroDef" flags="1"/>
+        <element name="classObject" type="NeuroClass" flags="1"/>
+        <element name="signals" type="NeuroSignals" flags="1"/>
+    </type>
+    <type name="NeuroClass" context="Global context">
+        <description>
+            <![CDATA[The static NeuroClass object refers to the class selected in the NeuroClassLibrary. Most, but not all, properties have direct counterparts in *.neuro files that define custom neuron classes.]]></description>
+        <element name="name" type="string">
+            <description><![CDATA[Used in genotypes]]></description>
+        </element>
+        <element name="longname" type="string">
+            <description><![CDATA[Used in hints]]></description>
+        </element>
+        <element name="description" type="string"/>
+        <element name="prefinputs" type="integer">
+            <description><![CDATA[-1 means "any number of inputs is OK"]]></description>
+        </element>
+        <element name="prefoutput" type="integer" min="0" max="1">
+            <description>
+                <![CDATA[Should be 1 if the neuron provides meaningful output value, 0 otherwise]]></description>
+        </element>
+        <element name="preflocation" type="integer" min="0" max="2"/>
+        <element name="shape_types" type="integer" min="0" max="3" default="3">
+            <description>
+                <![CDATA[Bit mask of supported (1<<Model::ShapeType) values, default 3=all shape types supported]]></description>
+        </element>
+        <element name="joint_shapes" type="integer" min="0" max="15" default="15">
+            <description>
+                <![CDATA[Bit mask of supported (1<<Joint::Shape) values, default 15=all joint shapes supported]]></description>
+        </element>
+        <element name="visualhints" type="integer">
+            <description><![CDATA[This is a bitfield. Compute the value by adding the following bits:
+1 = Invisible - don't draw neurons of this class
+2 = No label - don't draw classname label (below the neuron symbol) for this neuron class
+4 = First Part - draw the neuron at the first part when attached to a joint (default is in the middle)
+8 = Second Part - draw the neuron at the second part when attached to a joint (default is in the middle)
+16 = Effector - use muscle color when drawing this neuron
+32 = Sensor - use receptor color when drawing this neuron
+Compatiblity: visualhints is called "vhints" in *.neuro files.]]></description>
+        </element>
+        <element name="glyph" type="string">
+            <description><![CDATA[<html>The neuron icon for use in NN diagrams, encoded as a comma-separated sequence of integer numbers.<ul>
+<li>N = the total number of all numbers following this one
+<li>NS = the number of line sequences<br>
+<ul>repeated NS times:
+<li>NL = number of line segments (creating a polyline)
+<li><span style="background-color:#fcc;">X,Y</span> (repeated NL+1 times) - subsequent line segment coordinates, each line should fit in a 100x100 square<br>
+- neuron input connections will be drawn at X=25 (varying Y for multiple inputs, Y=50 for a single input)<br>
+- neuron output connection will be drawn at (X=75,Y=50)
+</ul></ul>
+<p>Example:
+<table border=1>
+<tr><th>16,</th><th>2,</th><th>3,</th><th><span style="background-color:#fcc;">25,50</span>, <span style="background-color:#fcc;">40,30</span>, <span style="background-color:#fcc;">60,30</span>, <span style="background-color:#fcc;">75,50</span>,</th><th>1,</th><th><span style="background-color:#fcc;">40,50</span>, <span style="background-color:#fcc;">60,50</span></th></tr>
+<tr><td>N = 16 numbers following this one</td><td>NS = 2 line sequences</td><td>NL = the first sequence has 3 segments</td><td>coordinates for 3 line segments = 4 endpoints = 8 numbers</td><td>NL = the second sequence has 1 segment</td><td>coordinates for 1 line segment</td></tr>
+</table>
+<p>See also: <a href="http://www.framsticks.com/files/dev/files/inkscape-to-icon.html">a script for creating *.neuro icon from SVG</a><br>
+Compatibility: this field is called "icon" in *.neuro files.]]></description>
+        </element>
+        <element name="properties" type="Interface" flags="1">
+            <description><![CDATA[Compatibility: not preset in *.neuro files.]]></description>
+        </element>
+        <element name="summary" type="string" flags="1">
+            <description><![CDATA[Textual summary of all features.
+Compatibility: not preset in *.neuro files.]]></description>
+        </element>
+    </type>
+    <type name="NeuroClassLibrary" context="Global context">
+        <description>
+            <![CDATA[Set of Neuron classes. You can access the selected class in the static NeuroClass object.]]></description>
+        <element name="count" type="integer" flags="1"/>
+        <element name="class" type="integer">
+            <description><![CDATA[0 ... count-1]]></description>
+        </element>
+        <element name="findClass" function="true" type="void">
+            <arguments>
+                <argument name="class name" type="string"/>
+            </arguments>
+        </element>
+        <element name="getClass" function="true" type="NeuroClass">
+            <arguments>
+                <argument name="class name" type="string"/>
+            </arguments>
+        </element>
+    </type>
+    <type name="NeuroDef" context="Global context">
+        <element name="p" type="integer" min="-1" max="999999" default="-1"/>
+        <element name="j" type="integer" min="-1" max="999999" default="-1"/>
+        <element name="d" type="string"/>
+        <element name="i" type="string"/>
+        <element name="Vstyle" type="string" default="neuro"/>
+        <element name="getInputCount" type="integer" flags="3"/>
+        <element name="getInputNeuroDef" function="true" type="NeuroDef">
+            <arguments>
+                <argument type="integer"/>
+            </arguments>
+        </element>
+        <element name="getInputNeuroIndex" function="true" type="integer">
+            <arguments>
+                <argument type="integer"/>
+            </arguments>
+        </element>
+        <element name="getInputWeight" function="true" type="float">
+            <arguments>
+                <argument type="integer"/>
+            </arguments>
+        </element>
+        <element name="classObject" type="NeuroClass" flags="3"/>
+    </type>
+    <type name="NeuronsSimEnabled" context="Global context">
+        <element name="ncl_N" type="integer" min="0" max="1">
+            <description><![CDATA[Standard neuron
+
+Characteristics:
+   supports any number of inputs
+   provides output value
+   does not require location in body
+
+
+Properties:
+   Inertia (in) float 0..1 (default 0.8)
+   Force (fo) float 0..999 (default 0.04)
+   Sigmoid (si) float -99999..99999 (default 2)
+   State (s) float -1..1 (default 0)]]></description>
+        </element>
+        <element name="ncl_Nu" type="integer" min="0" max="1">
+            <description><![CDATA[Works like standard neuron (N) but the output value is scaled to 0...+1 instead of -1...+1.
+Having 0 as one of the saturation states should help in "gate circuits", where input signal is passed through or blocked depending on the other singal.
+
+Characteristics:
+   supports any number of inputs
+   provides output value
+   does not require location in body
+
+
+Properties:
+   Inertia (in) float 0..1 (default 0.8)
+   Force (fo) float 0..999 (default 0.04)
+   Sigmoid (si) float -99999..99999 (default 2)
+   State (s) float -1..1 (default 0)]]></description>
+        </element>
+        <element name="ncl_G" type="integer" min="0" max="1">
+            <description><![CDATA[Tilt sensor.
+Signal is proportional to sin(angle) = most sensitive in horizontal orientation.
+0=the stick is horizontal
++1/-1=the stick is vertical
+
+Characteristics:
+   does not use inputs
+   provides output value
+   should be located on a Joint
+]]></description>
+        </element>
+        <element name="ncl_Gpart" type="integer" min="0" max="1">
+            <description><![CDATA[Tilt sensor. Signal is directly proportional to the tilt angle.
+0=the part X axis is horizontal
++1/-1=the axis is vertical
+
+Characteristics:
+   does not use inputs
+   provides output value
+   should be located on a Part
+
+
+Properties:
+   rotation.y (ry) float -6.282..6.282 (default 0)
+   rotation.z (rz) float -6.282..6.282 (default 0)]]></description>
+        </element>
+        <element name="ncl_T" type="integer" min="0" max="1">
+            <description><![CDATA[Touch and proximity sensor (Tcontact and Tproximity combined)
+-1=no contact
+0=just touching
+>0=pressing, value depends on the force applied (not implemented in ODE mode)
+
+Characteristics:
+   does not use inputs
+   provides output value
+   should be located on a Part
+
+
+Properties:
+   Range (r) float 0..1 (default 1)
+   rotation.y (ry) float -6.282..6.282 (default 0)
+   rotation.z (rz) float -6.282..6.282 (default 0)]]></description>
+        </element>
+        <element name="ncl_Tcontact" type="integer" min="0" max="1">
+            <description><![CDATA[Touch sensor.
+-1=no contact
+0=the Part is touching the obstacle
+>0=pressing, value depends on the force applied (not implemented in ODE mode)
+
+Characteristics:
+   does not use inputs
+   provides output value
+   should be located on a Part
+]]></description>
+        </element>
+        <element name="ncl_Tproximity" type="integer" min="0" max="1">
+            <description><![CDATA[Proximity sensor detecting obstacles along the X axis.
+-1=distance is "r" or more
+0=zero distance
+
+Characteristics:
+   does not use inputs
+   provides output value
+   should be located on a Part
+
+
+Properties:
+   Range (r) float 0..1 (default 1)
+   rotation.y (ry) float -6.282..6.282 (default 0)
+   rotation.z (rz) float -6.282..6.282 (default 0)]]></description>
+        </element>
+        <element name="ncl_S" type="integer" min="0" max="1">
+            <description><![CDATA[Smell sensor. Aggregated "smell of energy" experienced from all energy objects (creatures and food pieces).
+Close objects have bigger influence than the distant ones: for each energy source, its partial feeling is proportional to its energy/(distance^2)
+
+Characteristics:
+   does not use inputs
+   provides output value
+   should be located on a Part
+]]></description>
+        </element>
+        <element name="ncl_Constant" type="integer" min="0" max="1">
+            <description><![CDATA[Constant value
+
+Characteristics:
+   does not use inputs
+   provides output value
+   does not require location in body
+]]></description>
+        </element>
+        <element name="ncl_Bend_muscle" type="integer" min="0" max="1">
+            <description><![CDATA[Characteristics:
+   uses single input
+   does not provide output value
+   should be located on a Joint
+
+
+Properties:
+   power (p) float 0.01..1 (default 0.25)
+   bending range (r) float 0..1 (default 1)]]></description>
+        </element>
+        <element name="ncl_Rotation_muscle" type="integer" min="0" max="1">
+            <description><![CDATA[Characteristics:
+   uses single input
+   does not provide output value
+   should be located on a Joint
+
+
+Properties:
+   power (p) float 0.01..1 (default 1)]]></description>
+        </element>
+        <element name="ncl_M" type="integer" min="0" max="1">
+            <description><![CDATA[Characteristics:
+   uses single input
+   does not provide output value
+   should be located on a Joint
+
+
+Properties:
+   power (p) float 0.01..1 (default 1)
+   axis (a) integer 0..1 (default 0)]]></description>
+        </element>
+        <element name="ncl_D" type="integer" min="0" max="1">
+            <description><![CDATA[Calculate the difference between the current and previous input value. Multiple inputs are aggregated with respect to their weights
+
+Characteristics:
+   supports any number of inputs
+   provides output value
+   does not require location in body
+]]></description>
+        </element>
+        <element name="ncl_Fuzzy" type="integer" min="0" max="1">
+            <description><![CDATA[Refer to publications to learn more about this neuron.
+
+Characteristics:
+   supports any number of inputs
+   provides output value
+   does not require location in body
+
+
+Properties:
+   number of fuzzy sets (ns) integer
+   number of rules (nr) integer
+   fuzzy sets (fs) string (default "")
+   fuzzy rules (fr) string (default "")]]></description>
+        </element>
+        <element name="ncl_VEye" type="integer" min="0" max="1">
+            <description><![CDATA[Refer to publications to learn more about this neuron.
+
+Characteristics:
+   uses single input
+   provides output value
+   should be located on a Part
+
+
+Properties:
+   target.x (tx) float
+   target.y (ty) float
+   target.z (tz) float
+   target shape (ts) string (default "")
+   perspective (p) float 0.1..10 (default 1)
+   scale (s) float 0.1..100 (default 1)
+   show hidden lines (h) integer 0..1 (default 0)
+   output lines count (each line needs four channels) (o) integer 0..99 (default 0)
+   debug (d) integer 0..1 (default 0)]]></description>
+        </element>
+        <element name="ncl_VMotor" type="integer" min="0" max="1">
+            <description><![CDATA[Must be connected to the VEye and properly set up. Refer to publications to learn more about this neuron.
+
+Characteristics:
+   supports any number of inputs
+   provides output value
+   does not require location in body
+
+
+Properties:
+   number of basic features (noIF) integer
+   number of degrees of freedom (noDim) integer
+   parameters (params) string]]></description>
+        </element>
+        <element name="ncl_Sti" type="integer" min="0" max="1">
+            <description><![CDATA[Characteristics:
+   uses single input
+   does not provide output value
+   should be located on a Part
+]]></description>
+        </element>
+        <element name="ncl_LMu" type="integer" min="0" max="1">
+            <description><![CDATA[Characteristics:
+   uses single input
+   does not provide output value
+   should be located on a Joint
+
+
+Properties:
+   power (p) float 0.01..1 (default 1)]]></description>
+        </element>
+        <element name="ncl_Water" type="integer" min="0" max="1">
+            <description><![CDATA[Output signal:
+0=on or above water surface
+1=under water (deeper than 1)
+0..1=in the transient area just below water surface
+
+Characteristics:
+   does not use inputs
+   provides output value
+   should be located on a Part
+]]></description>
+        </element>
+        <element name="ncl_Energy" type="integer" min="0" max="1">
+            <description><![CDATA[The current energy level divided by the initial energy level.
+Usually falls from initial 1.0 down to 0.0 and then the creature dies. It can rise above 1.0 if enough food is ingested
+
+Characteristics:
+   does not use inputs
+   provides output value
+   does not require location in body
+]]></description>
+        </element>
+        <element name="ncl_Ch" type="integer" min="0" max="1">
+            <description><![CDATA[Combines all input signals into a single multichannel output; Note: ChSel and ChMux are the only neurons which support multiple channels. Other neurons discard everything except the first channel.
+
+Characteristics:
+   supports any number of inputs
+   provides output value
+   does not require location in body
+]]></description>
+        </element>
+        <element name="ncl_ChMux" type="integer" min="0" max="1">
+            <description><![CDATA[Outputs the selected channel from the second (multichannel) input. The first input is used as the selector value (-1=select first channel, .., 1=last channel)
+
+Characteristics:
+   uses 2 inputs
+   provides output value
+   does not require location in body
+]]></description>
+        </element>
+        <element name="ncl_ChSel" type="integer" min="0" max="1">
+            <description><![CDATA[Outputs a single channel (selected by the "ch" parameter) from multichannel input
+
+Characteristics:
+   uses single input
+   provides output value
+   does not require location in body
+
+
+Properties:
+   channel (ch) integer]]></description>
+        </element>
+        <element name="ncl_Rnd" type="integer" min="0" max="1">
+            <description><![CDATA[Generates random noise (subsequent random values in the range of -1..+1)
+
+Characteristics:
+   does not use inputs
+   provides output value
+   does not require location in body
+]]></description>
+        </element>
+        <element name="ncl_Sin" type="integer" min="0" max="1">
+            <description><![CDATA[Output frequency = f0+input
+
+Characteristics:
+   uses single input
+   provides output value
+   does not require location in body
+
+
+Properties:
+   base frequency (f0) float -1..1 (default 0.0628319)
+   time (t) float 0..6.28319 (default 0)]]></description>
+        </element>
+    </type>
+    <type name="NeuroSignals" context="Global context">
+        <description><![CDATA[Signals attached to a neuron.
+See also: Signal, WorldSignals, CreatureSignals.
+scripts/light.neuro and scripts/seelight.neuro are simple custom neuron examples demonstrating how to send/receive signals between creatures.]]></description>
+        <element name="add" function="true" type="Signal">
+            <arguments>
+                <argument name="channel" type="string"/>
+            </arguments>
+        </element>
+        <element name="receive" function="true" type="float">
+            <description><![CDATA[Receive the aggregated signal power in a given channel.]]></description>
+            <arguments>
+                <argument name="channel" type="string"/>
+            </arguments>
+        </element>
+        <element name="receiveSet" function="true" type="Vector">
+            <description>
+                <![CDATA[Get all signals in the specified range. Returns a read-only vector object containing Signal objects - individual signals can be accessed as result[0], .., result[result.size-1].]]></description>
+            <arguments>
+                <argument name="channel" type="string"/>
+                <argument name="max distance" type="float"/>
+            </arguments>
+        </element>
+        <element name="receiveFilter" function="true" type="float">
+            <description><![CDATA[Receive the aggregated signal power in a given channel.
+
+Additional filtering options:
+- Max distance only receives the neighbor signals (based on their physical location)
+- Flavor filtering: only signals having the flavor similar to the specified value will be received. The flavorfilter value is the difference of flavor that reduces the received signal to 0. The "flavor attenuation" is linear, i.e., signals differing by (filter/2) in flavor will be reduced to 50%.]]></description>
+            <arguments>
+                <argument name="channel" type="string"/>
+                <argument name="max distance" type="float"/>
+                <argument name="flavor" type="float"/>
+                <argument name="flavorfilter" type="float"/>
+            </arguments>
+        </element>
+        <element name="receiveSingle" function="true" type="Signal">
+            <description>
+                <![CDATA[Find the signal source that has the highest signal power (taking into account distance).]]></description>
+            <arguments>
+                <argument name="channel" type="string"/>
+                <argument name="max distance" type="float"/>
+            </arguments>
+        </element>
+        <element name="get" function="true" type="Signal">
+            <arguments>
+                <argument name="index" type="integer"/>
+            </arguments>
+        </element>
+        <element name="size" type="integer" flags="1"/>
+        <element name="clear" function="true" type="void">
+            <arguments/>
+        </element>
+    </type>
+    <type name="ODE" context="Global context">
+        <description><![CDATA[ODE Parameters.]]></description>
+        <element name="odeshape" type="integer" min="0" max="1"/>
+        <element name="odestep" type="float" min="0.001" max="1" default="0.05"/>
+        <element name="odemusclemin" type="float" min="0" max="100" default="0.0">
+            <description><![CDATA[i.e. "mmmmm" in f1]]></description>
+        </element>
+        <element name="odemusclemax" type="float" min="0" max="100" default="10.0">
+            <description><![CDATA[i.e. "MMMMM" if f1]]></description>
+        </element>
+        <element name="odemusclespeed" type="float" min="0" max="10" default="1.0">
+            <description><![CDATA[Muscle state cannot change faster than the supplied value]]></description>
+        </element>
+        <element name="odeairdrag" type="float" min="0" max="0.5" default="0.01">
+            <description>
+                <![CDATA[A drag force ("air drag") proportional to the velocity of mass centers of moving parts (ODE's "linear damping")]]></description>
+        </element>
+        <element name="oderotdrag" type="float" min="0" max="0.5" default="0.01">
+            <description><![CDATA[Drag momentum acting on rotating bodies (ODE's "angular damping")]]></description>
+        </element>
+        <element name="odewaterdrag" type="float" min="0.001" max="1" default="0.5"/>
+        <element name="odewaterbuoy" type="float" min="0" max="2" default="1.0"/>
+        <element name="odeseed" type="integer" min="0" max="2">
+            <description><![CDATA[Affects collisions.
+- 'Truly random' is closest to the standard ODE operation. Use Math.seed to influence randomness in ODE collisions.
+- 'Deterministic' automatically calculates random seed in each step based on the current simulation (world) state, which makes the simulation repeatable but more random than 'Fixed'.
+- 'Fixed' is completely deterministic and does not depend on Math.seed - the same seed value is set before each step. This might negatively affect ODE accuracy.
+]]></description>
+        </element>
+        <element name="odesepsticks" type="integer" min="0" max="1" default="0">
+            <description><![CDATA[Each stick gets a separate ODE body (like in MechaStick)]]></description>
+        </element>
+        <element name="odeworlderp" type="float" min="0" max="1" default="0.2">
+            <description><![CDATA[World ERP (error reduction parameter)]]></description>
+        </element>
+        <element name="odeworldcfm" type="float" min="0" max="1" default="1e-5">
+            <description><![CDATA[World CFM (constraint force mixing)]]></description>
+        </element>
+        <element name="odecolmumin" type="float" min="0" max="10" default="0.1">
+            <description><![CDATA[Mu coefficient for Parts with minimal friction (i.e. "fffff" in f1)]]></description>
+        </element>
+        <element name="odecolmumax" type="float" min="0" max="10" default="5.0">
+            <description><![CDATA[Mu coefficient for Parts with maximal friction (i.e. "FFFFF" in f1)]]></description>
+        </element>
+        <element name="odecolbounce" type="float" min="0" max="1" default="0.1"/>
+        <element name="odecolbouncevel" type="float" min="0" max="1" default="0.01"/>
+        <element name="odecolsoftcfm" type="float" min="0" max="1" default="0.0"/>
+        <element name="odecolsofterp" type="float" min="0" max="1" default="0.0"/>
+        <element name="odecol2mumin" type="float" min="0" max="10" default="0.1">
+            <description><![CDATA[Mu coefficient for Parts with minimal friction (i.e. "fffff" in f1)]]></description>
+        </element>
+        <element name="odecol2mumax" type="float" min="0" max="10" default="1.0">
+            <description><![CDATA[Mu coefficient for Parts with maximal friction (i.e. "FFFFF" in f1)]]></description>
+        </element>
+        <element name="odecol2bounce" type="float" min="0" max="1" default="0.1"/>
+        <element name="odecol2bouncevel" type="float" min="0" max="1" default="0.01"/>
+        <element name="odecol2softcfm" type="float" min="0" max="1" default="0.0"/>
+        <element name="odecol2softerp" type="float" min="0" max="1" default="0.0"/>
+        <element name="rayIntersection" function="true" type="float" flags="32">
+            <arguments>
+                <argument name="position x" type="float"/>
+                <argument name="position y" type="float"/>
+                <argument name="position z" type="float"/>
+                <argument name="direction x" type="float"/>
+                <argument name="direction y" type="float"/>
+                <argument name="direction z" type="float"/>
+                <argument name="max distance" type="float"/>
+            </arguments>
+        </element>
+    </type>
+    <type name="Orient" context="Global context">
+        <description><![CDATA[3D orientation, stored as 3x3 matrix.]]></description>
+        <element name="xx" type="float" flags="256"/>
+        <element name="xy" type="float" flags="256"/>
+        <element name="xz" type="float" flags="256"/>
+        <element name="yx" type="float" flags="256"/>
+        <element name="yy" type="float" flags="256"/>
+        <element name="yz" type="float" flags="256"/>
+        <element name="zx" type="float" flags="256"/>
+        <element name="zy" type="float" flags="256"/>
+        <element name="zz" type="float" flags="256"/>
+        <element name="x" type="XYZ" flags="257"/>
+        <element name="y" type="XYZ" flags="257"/>
+        <element name="z" type="XYZ" flags="257"/>
+        <element name="new" function="true" type="Orient">
+            <arguments/>
+        </element>
+        <element name="newFromVector" function="true" type="Orient">
+            <arguments>
+                <argument type="Vector"/>
+            </arguments>
+        </element>
+        <element name="toVector" type="Vector" flags="257">
+            <description><![CDATA[for serialization]]></description>
+        </element>
+        <element name="clone" function="true" type="Orient" flags="256">
+            <arguments/>
+        </element>
+        <element name="set" function="true" type="void" flags="256">
+            <arguments>
+                <argument type="Orient"/>
+            </arguments>
+        </element>
+        <element name="reset" function="true" type="void" flags="256">
+            <arguments/>
+        </element>
+        <element name="rotate3" function="true" type="void" flags="256">
+            <arguments>
+                <argument name="x" type="float"/>
+                <argument name="y" type="float"/>
+                <argument name="z" type="float"/>
+            </arguments>
+        </element>
+        <element name="rotate" function="true" type="void" flags="256">
+            <arguments>
+                <argument type="Orient"/>
+            </arguments>
+        </element>
+        <element name="revRotate" function="true" type="void" flags="256">
+            <arguments>
+                <argument type="Orient"/>
+            </arguments>
+        </element>
+        <element name="lookAt" function="true" type="void" flags="256">
+            <arguments>
+                <argument name="direction" type="XYZ"/>
+                <argument name="up" type="XYZ"/>
+            </arguments>
+        </element>
+        <element name="normalize" function="true" type="void" flags="256">
+            <arguments/>
+        </element>
+        <element name="between2" function="true" type="void" flags="256">
+            <description><![CDATA[The calling Orient receives the orientation interpolated from 2 input orientations.
+Example:
+var o1=Orient.new(), o2=Orient.new(), o3=Orient.new();
+o2.rotate3(0,Math.pi/2,0);
+o3.between2(o1,o2,0); // o3 equals o2
+o3.between2(o1,o2,1); // o3 equals o1
+o3.between2(o1,o2,0.5); // o3 is halfway between o1 and o2
+]]></description>
+            <arguments>
+                <argument type="Orient"/>
+                <argument type="Orient"/>
+                <argument name="amount" type="float"/>
+            </arguments>
+        </element>
+        <element name="betweenOV" function="true" type="void" flags="256">
+            <description><![CDATA[Like between2(), but the second Orient is composed of the supplied XYZ vector (X component) and Y Z vectors from the calling object.
+Example:
+var o=Orient.new();
+o.betweenOV(o,(0,1,0),1); //no change, o remains 100 010 001
+o.betweenOV(o,(0,1,0),0.9); //o is slightly rotated towards (0,1,0)
+o.betweenOV(o,(0,1,0),0); //o is completely transformed, o.x=(0,1,0)
+]]></description>
+            <arguments>
+                <argument type="Orient"/>
+                <argument type="XYZ"/>
+                <argument name="amount" type="float"/>
+            </arguments>
+        </element>
+        <element name="localToWorld" function="true" type="XYZ" flags="256">
+            <arguments>
+                <argument name="point" type="XYZ"/>
+                <argument name="center" type="XYZ"/>
+            </arguments>
+        </element>
+        <element name="worldToLocal" function="true" type="XYZ" flags="256">
+            <arguments>
+                <argument name="point" type="XYZ"/>
+                <argument name="center" type="XYZ"/>
+            </arguments>
+        </element>
+        <element name="angles" type="XYZ" flags="257"/>
+        <element name="toString" type="string" flags="257"/>
+    </type>
+    <type name="Part" context="Global context">
+        <element name="x" type="float" flags="1024"/>
+        <element name="y" type="float" flags="1024"/>
+        <element name="z" type="float" flags="1024"/>
+        <element name="sh" type="integer" min="0" max="3" default="0"/>
+        <element name="s" type="float" min="0.1" max="10" default="1.0"/>
+        <element name="sx" type="float" min="0.05" max="5" default="1.0"/>
+        <element name="sy" type="float" min="0.05" max="5" default="1.0"/>
+        <element name="sz" type="float" min="0.05" max="5" default="1.0"/>
+        <element name="h" type="float" min="0" max="1" default="0.0"/>
+        <element name="dn" type="float" min="0.2" max="5" default="1.0"/>
+        <element name="fr" type="float" min="0" max="4" default="0.4"/>
+        <element name="ing" type="float" min="0" max="1" default="0.25"/>
+        <element name="as" type="float" min="0" max="1" default="0.25"/>
+        <element name="rx" type="float"/>
+        <element name="ry" type="float" flags="1024"/>
+        <element name="rz" type="float" flags="1024"/>
+        <element name="i" type="string"/>
+        <element name="Vstyle" type="string" default="part"/>
+        <element name="vr" type="float" min="0" max="1" default="1.0"/>
+        <element name="vg" type="float" min="0" max="1" default="1.0" flags="1024"/>
+        <element name="vb" type="float" min="0" max="1" default="1.0" flags="1024"/>
+    </type>
+    <type name="Population" context="Global context">
+        <description><![CDATA[A set of Creature objects, sharing some high level simulation properties (performance calculation, NN simulation, collision detection, event handling). The groups usually have different roles in the experiment (Creatures groups and Food group in standard.expdef).
+You can iterate directly over Creatures in a Population using for(...in...) loops:
+	for(var c in Populations[0]) Simulator.print(c.name);]]></description>
+        <element name="index" type="integer" flags="35"/>
+        <element name="name" type="string"/>
+        <element name="size" type="integer" flags="3"/>
+        <element name="energy" type="integer" min="0" max="1" default="1">
+            <description><![CDATA[If turned off, creature's energy will be constant.]]></description>
+        </element>
+        <element name="death" type="integer" min="0" max="1" default="1">
+            <description><![CDATA[Do creatures die when no energy?]]></description>
+        </element>
+        <element name="nnsim" type="integer" min="0" max="2" default="1" deprecated="true" flags="8226">
+            <description><![CDATA[Replaced by initial_nn_active]]></description>
+        </element>
+        <element name="initial_nn_active" type="integer" min="0" max="2" default="1">
+            <description>
+                <![CDATA[Stabilization means no significant movement during a specified period of time.]]></description>
+        </element>
+        <element name="nn_paused" type="integer" min="0" max="1" default="0">
+            <description><![CDATA[Disables NN simulation for all creatures in the population]]></description>
+        </element>
+        <element name="perfperiod" type="integer" min="0" max="1000000" default="100">
+            <description>
+                <![CDATA[Defines how often onUpdate() events are called and how often the built-in performance counters (distance, speed, etc.) are calculated.]]></description>
+        </element>
+        <element name="stabilperiod" type="integer" min="0" max="1000000" default="100">
+            <description><![CDATA["Performance sampling period" for the stabilization phase.]]></description>
+        </element>
+        <element name="killnostable" type="integer" min="0" max="10000000" default="1000000">
+            <description>
+                <![CDATA[Creatures that fail to stabilize after the specified waiting period (e.g. because they are continuously rolling) will be killed. 0 disables this feature.]]></description>
+        </element>
+        <element name="stabledist" type="float" min="0" max="1" default="0.01">
+            <description>
+                <![CDATA[A creature is considered stabilized when its center of gravity stays within the specified distance after the "Sampling period while waiting" has elapsed.]]></description>
+        </element>
+        <element name="enableperf" type="integer" min="0" max="2" default="1" deprecated="true" flags="8226">
+            <description><![CDATA[Replaced by initial_perf_measuring]]></description>
+        </element>
+        <element name="initial_perf_measuring" type="integer" min="0" max="2" default="1">
+            <description>
+                <![CDATA[Stabilization means no significant movement during a specified period of time.]]></description>
+        </element>
+        <element name="colmask" type="integer" min="0" max="65535" default="0" deprecated="true" flags="8224">
+            <description>
+                <![CDATA[You should use selfmask and othermask instead of colmask (these masks are also much easier to understand than the old colmask field).]]></description>
+        </element>
+        <element name="selfmask" type="integer" min="0" max="2147483647" default="0" flags="32">
+            <description><![CDATA[Collisions between objects can be handled in two ways:
+ - standard 'mechanical' collision handler (simple 'rebound' effect)
+ - special script handler (On[GROUPNAME]Collision function)
+
+In the script handler function, use the Collision object to access the two colliding parts of two creatures.
+The first part in the Collision object (i.e. Collision.Creature1) always concerns the creature that belongs to [GROUPNAME].
+The handler is called once for each creature that collides with the creature from [GROUPNAME].
+
+Collision masks that you set determine which handler will be used (none and both are also possible). On each collision, selfmask and othermask of the colliding objects are logically ANDed.
+If the resulting non-zero value falls into 16 lower bits (0x0000ffff), the standard handler is enabled.
+If the resulting non-zero value falls into 16 higher bits (0xffff0000), the custom handler is enabled.
+
+Examples:
+
+1.With one group, all possible combinations of the collision handlers are as follows:
+	- ignore collisions (e.g. selfmask=othermask=0)
+	- use standard handling (e.g. selfmask=othermask=1)
+	- use custom handling (e.g. selfmask=othermask=0x10000)
+	- use standard and custom handling (e.g. selfmask=othermask=0x10001)
+
+2.Two groups yield more interesting cases. Let us consider the 'standard.expdef' setting:
+	Creatures: selfmask=0x10001, othermask=0x20001
+	Food: selfmask=0x20002, othermask=0x10002
+There are three possible scenarios:
+	- creature and creature: collision value = 0x10001 & 0x20001 = 1 -> Standard handling will be used (1 is one of the lower 16 bits)
+	- food and food: collision value = 0x20002 & 0x10002 = 2 -> As above.
+	- creature and food: collision value = (0x10001 & 0x10002) or (0x20002 & 0x20001) = 0x10000 or 0x20000 -> Custom handling will be used (the result falls into higher 16 bits).
+
+
+Instead of manually calculating mask values, you can use this interactive graphical helper: http://www.framsticks.com/files/apps/js/population-mask-helper/index.html]]></description>
+        </element>
+        <element name="othermask" type="integer" min="0" max="2147483647" default="0" flags="32">
+            <description><![CDATA[See selfmask.]]></description>
+        </element>
+        <element name="bodysim" type="integer" min="0" max="1" default="1" deprecated="true" flags="8226">
+            <description><![CDATA[Replaced by initial_physics_active]]></description>
+        </element>
+        <element name="initial_physics_active" type="integer" min="0" max="1" default="1">
+            <description>
+                <![CDATA[Enable/disable physical body simulation. This is the initial value of Creature.physics_active for all objects created in this group. For details, see the documentation of Creature.physics_active.]]></description>
+        </element>
+        <element name="selfcol" type="integer" min="0" max="1" default="0" deprecated="true" flags="8226">
+            <description><![CDATA[Replaced by initial_self_collisions]]></description>
+        </element>
+        <element name="initial_self_collisions" type="integer" min="0" max="1" default="0">
+            <description>
+                <![CDATA[Detect collisions within creature bodies (only applicable for the ODE simulation engine). This is the initial value of Creature.self_collisions for all objects created in this group. If enabled, creatures with self-colliding genotypes are not born, and others will have their sticks collide during lifespan.]]></description>
+        </element>
+        <element name="em_stat" type="float" min="0" max="1" default="0.0">
+            <description>
+                <![CDATA[Energy consumption of a muscle resisting an external force (whether performing or not performing any physical work). Framsticks muscles cannot be "turned off", but they can stop consuming "static" energy when the body part keeps itself in the requested position without stressing the muscle, e.g. when floating in the water or resting freely on the ground.]]></description>
+        </element>
+        <element name="em_dyn" type="float" min="0" max="1" default="0.0">
+            <description>
+                <![CDATA[Energy consumption of a muscle moving a stick, calculated from the actual work performed by the muscle. Muscles must move to consume this kind of energy.]]></description>
+        </element>
+        <element name="en_assim" type="float" min="0" max="1" default="0.0">
+            <description><![CDATA[Maximal energy gain produced by a vertical specialized stick.
+Horizontal specialized sticks get half of this value.]]></description>
+        </element>
+        <element name="createFromGenotype" function="true" type="Creature" deprecated="true" flags="8226">
+            <description><![CDATA[Uses the selected Genotype object.
+Deprecated. Use the more universal add() function.]]></description>
+            <arguments/>
+        </element>
+        <element name="createFromString" function="true" type="Creature" deprecated="true" flags="8226">
+            <description><![CDATA[Uses the supplied string argument.
+Deprecated. Use the more universal add() function.]]></description>
+            <arguments>
+                <argument name="genotype" type="string"/>
+            </arguments>
+        </element>
+        <element name="createFromGeno" function="true" type="Creature" deprecated="true" flags="8226">
+            <description><![CDATA[Uses the supplied Geno object.
+Deprecated. Use the more universal add() function.]]></description>
+            <arguments>
+                <argument type="Geno"/>
+            </arguments>
+        </element>
+        <element name="add" function="true" type="Creature" flags="34">
+            <description><![CDATA[Adding CreatureSnapshot object automatically copies the CreatureSnapshot fields into the Creature, including creature location (the center of the bounding box is preserved) and orientation.
+See also: CreatureSnapshot]]></description>
+            <arguments>
+                <argument name="Genotype object or Geno object or string genotype or CreatureSnapshot object"
+                          type="untyped"/>
+            </arguments>
+        </element>
+        <element name="findUID" function="true" type="integer" flags="34">
+            <arguments>
+                <argument name="uid" type="string"/>
+            </arguments>
+        </element>
+        <element name="get" function="true" type="Creature" flags="34">
+            <arguments>
+                <argument name="index" type="integer"/>
+            </arguments>
+        </element>
+        <element name="senseCreaturesProperty" function="true" type="float" flags="34">
+            <description><![CDATA[Arguments:
+ - x,y,z (sensor position)
+ - property (name, data[key] or Class:id). "data[key]" can be used to access Creature's data field (Dictionary) containing named items
+ - exclude (creature object)
+
+This function works like a smell sensor (but you can provide any property as the argument, not just "energy") for all creatures in this group except "exclude".
+The following is a sample function that reproduces the "S" sensor which smells creatures from all populations:
+	function smellEnergyAllPopulations(x, y, z, exclude)
+	{
+		var s=0;
+		for(var i=0; i<Populations.size; i++)
+			s += Populations[i].senseCreaturesProperty(x, y, z, "energy", exclude);
+		return s;
+	}]]></description>
+            <arguments>
+                <argument name="x" type="float"/>
+                <argument name="y" type="float"/>
+                <argument name="z" type="float"/>
+                <argument name="propertyname" type="string"/>
+                <argument name="exclude" type="Creature"/>
+            </arguments>
+        </element>
+        <element name="findCreatureAt" function="true" type="Creature" flags="34">
+            <description><![CDATA[Returns the first Creature object colliding with the line defined by the supplied starting point and the vector. For the purpose of this function, "collision" means "passing closer than 1.0 from any of the Creature's Parts".
+Note that a screen point corresponds to a 3D line going through the screen surface; if you want to identify the object under the mouse cursor, you can use this function because finding an object at a given screen coordinates can be a special case of finding the line-with-object collision.]]></description>
+            <arguments>
+                <argument name="point" type="Vector"/>
+                <argument name="vector" type="Vector"/>
+            </arguments>
+        </element>
+        <element name="delete" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Delete the creature (remove it without executing the onKill event). Removing creatures inside some event handlers (e.g. onCollision) might be unsafe.]]></description>
+            <arguments>
+                <argument name="Creature object or index" type="untyped"/>
+            </arguments>
+        </element>
+        <element name="kill" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Kill the creature (remove it and execute its onKill handler). Killing creatures inside some event handlers (e.g. onCollision) might be unsafe. The recommended and safe way of killing a creature is by setting its energy to 0.]]></description>
+            <arguments>
+                <argument name="Creature object or index" type="untyped"/>
+            </arguments>
+        </element>
+        <element name="clear" function="true" type="void" flags="34">
+            <description><![CDATA[Delete all creatures]]></description>
+            <arguments/>
+        </element>
+        <element name="iterator" type="Object" flags="291"/>
+        <element name="getStatsMin" function="true" type="float" flags="32">
+            <description>
+                <![CDATA[Retrieves data from stats.* object. Can only be used for fields covered by stats.* (subset of Creature fields).]]></description>
+            <arguments>
+                <argument name="field name" type="string"/>
+            </arguments>
+        </element>
+        <element name="getStatsAvg" function="true" type="float" flags="32">
+            <description>
+                <![CDATA[Retrieves data from stats.* object. Can only be used for fields covered by stats.* (subset of Creature fields).]]></description>
+            <arguments>
+                <argument name="field name" type="string"/>
+            </arguments>
+        </element>
+        <element name="getStatsMax" function="true" type="float" flags="32">
+            <description>
+                <![CDATA[Retrieves data from stats.* object. Can only be used for fields covered by stats.* (subset of Creature fields).]]></description>
+            <arguments>
+                <argument name="field name" type="string"/>
+            </arguments>
+        </element>
+        <element name="refreshGUI" function="true" type="void" flags="32">
+            <description><![CDATA[Notify list content changed]]></description>
+            <arguments/>
+        </element>
+    </type>
+    <type name="Populations" context="Global context">
+        <description><![CDATA[Manages all Creature objects in the experiment, organized in one or more groups.
+You can iterate directly over Population objects in the Populations collection using for(...in...) loops:
+	for(var pop in Populations) Simulator.print(pop.name);
+
+Before version 4.0rc4 some operations could only be performed on the "selected" creature (the one pointed to by group/creature fields in Populations). Currently, the more convenient and recommended way is to call Creatures's functions that operate directly on the passed objects.
+
+The old way:
+	Populations.group=0;
+	Populations.creature=0;
+	GenePools.getFromCreature();
+	GenePools.copyTo(0);
+
+Doing the same the new way:
+	Genotype.newFromCreature(Populations[0][0]).moveTo(GenePools[0]);
+
+See also: Creature, Population.]]></description>
+        <element name="group" type="integer" deprecated="true" flags="8226">
+            <description><![CDATA[Index of the currently selected group (Population).
+Deprecated. Pass creature object to functions needing it, instead of the old "first select, then call" approach.]]></description>
+        </element>
+        <element name="size" type="integer" flags="3"/>
+        <element name="creature" type="integer" deprecated="true" flags="8226">
+            <description>
+                <![CDATA[Deprecated. Pass creature object to functions needing it, instead of the old "first select, then call" approach.]]></description>
+        </element>
+        <element name="createFromGenotype" function="true" type="Creature" deprecated="true" flags="8226">
+            <description><![CDATA[Uses the selected Genotype object.]]></description>
+            <arguments/>
+        </element>
+        <element name="createFromString" function="true" type="Creature" deprecated="true" flags="8226">
+            <description><![CDATA[Uses the supplied string argument.]]></description>
+            <arguments>
+                <argument name="genotype" type="string"/>
+            </arguments>
+        </element>
+        <element name="killSelected" function="true" type="void" deprecated="true" flags="8226">
+            <description><![CDATA[Applies to the selected Creature.]]></description>
+            <arguments/>
+        </element>
+        <element name="deleteSelected" function="true" type="void" deprecated="true" flags="8226">
+            <description><![CDATA[Applies to the selected Creature.]]></description>
+            <arguments/>
+        </element>
+        <element name="addGroup" function="true" type="Population" flags="34">
+            <description><![CDATA[Adds a new population.]]></description>
+            <arguments>
+                <argument name="name" type="string"/>
+            </arguments>
+        </element>
+        <element name="deleteGroup" function="true" type="void" flags="34">
+            <description><![CDATA[Removes a population.]]></description>
+            <arguments>
+                <argument name="index" type="integer"/>
+            </arguments>
+        </element>
+        <element name="clear" function="true" type="void" flags="34">
+            <description><![CDATA[Removes all populations except the first one.]]></description>
+            <arguments/>
+        </element>
+        <element name="clearGroup" function="true" type="void" deprecated="true" flags="8226">
+            <description><![CDATA[Deprecated.
+Use Populations[pop_index].clear() instead of Populations.clearGroup(pop_index); ]]></description>
+            <arguments>
+                <argument name="index" type="integer"/>
+            </arguments>
+        </element>
+        <element name="creatBBCollisions" function="true" type="integer" deprecated="true" flags="8226">
+            <description><![CDATA[Checks approximate collisions for the selected creature.
+Returns the collision mask calculated as ( creature.selfmask & other_creatures.othermask ).
+Passing non-zero argument is equivalent to setting a temporary selfmask for the current creature.
+
+Deprecated. Use Creature.boundingBoxCollisions()]]></description>
+            <arguments>
+                <argument name="mask" type="integer"/>
+            </arguments>
+        </element>
+        <element name="get" function="true" type="Population" flags="34">
+            <arguments>
+                <argument name="index" type="integer"/>
+            </arguments>
+        </element>
+        <element name="findCreatureAt" function="true" type="Creature" flags="34">
+            <description><![CDATA[Returns the first Creature object colliding with the line defined by the supplied starting point and the vector. For the purpose of this function, "collision" means "passing closer than 1.0 from any of the Creature's Parts".
+Note that a screen point corresponds to a 3D line going through the screen surface; if you want to identify the object under the mouse cursor, you can use this function because finding an object at a given screen coordinates can be a special case of finding the line-with-object collision.]]></description>
+            <arguments>
+                <argument name="point" type="Vector"/>
+                <argument name="vector" type="Vector"/>
+            </arguments>
+        </element>
+        <element name="iterator" type="Object" flags="291"/>
+    </type>
+    <type name="POVExport" context="Global context">
+        <element name="povex_outdir" type="string" default=".">
+            <description><![CDATA[Directory name WITHOUT trailing '/' sign]]></description>
+        </element>
+        <element name="povex_outfiles" type="string" default="scene_%04d.pov">
+            <description><![CDATA[Frame number replaces %d (eg. 'scene%03d.pov')]]></description>
+        </element>
+        <element name="povex_skip" type="integer" min="0" max="100" default="0">
+            <description><![CDATA[A scene file is generated each (n+1) simulation steps
+(a small value means more frames and smooth animation)]]></description>
+        </element>
+        <element name="povex_startf" type="integer" min="0" max="1000000" default="0">
+            <description><![CDATA[Starting number]]></description>
+        </element>
+        <element name="povex_maxframes" type="integer" min="0" max="1000000" default="10000">
+            <description><![CDATA[How many frames are to be generated?]]></description>
+        </element>
+        <element name="povex_dust" type="integer" min="0" max="1" default="1"/>
+        <element name="povex_energy" type="integer" min="0" max="1" default="1"/>
+        <element name="povex_enable" function="true" flags="8"/>
+        <element name="povex_disable" function="true" flags="8"/>
+        <element name="povex_now" function="true" flags="8"/>
+        <element name="povex_currframe" type="integer" flags="18"/>
+        <element name="povex_enabled" type="integer" min="0" max="1" flags="18"/>
+        <element name="povex_lastfile" type="string" flags="18"/>
+    </type>
+    <type name="Ref" context="Global context">
+        <description><![CDATA[Reference objects. Useful for returning things from functions.
+
+Example:
+var x=111;
+square(&x);// '&' creates the Reference object
+Simulator.print(x);//x is now 12321
+
+function square(r)
+{r.value=r.value*r.value;}
+//square receives the Reference object and changes its 'value' field]]></description>
+        <element name="value" type="untyped" flags="256"/>
+        <element name="newO" function="true">
+            <description><![CDATA[(for internal use only) use &variablename to create Ref objects.]]></description>
+        </element>
+        <element name="copyFrom" function="true" type="void">
+            <description><![CDATA[make the reference point to the same target,]]></description>
+            <arguments>
+                <argument type="Ref"/>
+            </arguments>
+        </element>
+        <element name="toString" type="string" flags="257"/>
+    </type>
+    <type name="Signal" context="Global context">
+        <description><![CDATA[Signals broadcast information in a channel (being an abstract communication medium that could be imagined as sound, smell, vision or anything else). There are no sender-receiver associations, although the receiving party can filter out signals (two standard filtering methods are: physical neighborhood and one-dimensional attribute called flavor). Signals attached to neurons and creatures (created in Creature.signals and Neuro.signals) automatically follow the owner's location. Environmental signals (in World.signals) are stationary.
+
+Receiving:
+There are 2 kinds of data you can receive:
+1. aggregating functions (receive and receiveFilter) calculate the overall power of the received signal (based on the distance and the source power).
+2. receiveSet and receiveSingle fetch the individual Signal object(s) so it is possible to transmit something else than just a single number (by using Signal.value) and do more sophisticated processing.
+
+Creating: Use "add" in Creature.signals, Neuro.signals, or World.signals.]]></description>
+        <element name="value" type="untyped" flags="256">
+            <description>
+                <![CDATA[Signal value can be any type. On the receiver side it is only available by accessing the individual Signal objects, i.e. after calling receiveSet() or receiveSingle(). The aggregating functions receive() and receiveFilter() ignore this attribute.]]></description>
+        </element>
+        <element name="power" type="float" flags="256">
+            <description>
+                <![CDATA[Signal power affects the aggregated signal value returned from receive() and receiveFilter().]]></description>
+        </element>
+        <element name="flavor" type="float" flags="256">
+            <description>
+                <![CDATA[Signal flavor can be used to differentiate between signals in a single channel.]]></description>
+        </element>
+        <element name="channel" type="string" flags="257">
+            <description><![CDATA[Channel name, read-only.]]></description>
+        </element>
+        <element name="pos" type="XYZ" flags="257">
+            <description><![CDATA[Signal position, read-only.]]></description>
+        </element>
+        <element name="remove" function="true" flags="256">
+            <description><![CDATA[Deletes the signal.]]></description>
+        </element>
+    </type>
+    <type name="SignalView" context="Global context">
+        <description>
+            <![CDATA[This object can be used by an Experiment Definition or a Framsticks Theater show script to configure the preferred Signal visualization in the experiment. SignalView.mode and SignalView.label can also be adjusted in the Framsticks GUI (overriding the script-configured state).]]></description>
+        <element name="clear" function="true">
+            <description>
+                <![CDATA[Removes custom display settings that might have been defined by various scripts (expdef or show).]]></description>
+        </element>
+        <element name="mode" type="integer" min="0" max="2" default="2">
+            <description>
+                <![CDATA["Automatic" labels all signal sources in all channels and shows the intensity map of the first channel. This is sufficient for many simple setups, but as the number of signals and channels grows, the display becomes cluttered. In such cases, the experiment definition can define "Custom" signal visualization tailored for the particular experiment.]]></description>
+        </element>
+        <element name="labels" type="string">
+            <description><![CDATA[The label formula should return text to be displayed over the signal source, presumably by reading some values from the supplied Signal object. It is especially useful for more sophisticated signal usage scenarios, when Signal.value keeps a reference to an object (the default signal label only shows <XXX Object at xxxxx> in such cases).
+
+Examples: (switch to "Automatic" mode to see labels, then remove the label formula and compare the effect)
+
+return "x";
+return "val="+Signal.value;
+return "power="+Signal.power;]]></description>
+        </element>
+        <element name="addMap" function="true" type="void" flags="32">
+            <arguments>
+                <argument name="channel" type="string"/>
+                <argument name="color" type="integer"/>
+            </arguments>
+        </element>
+        <element name="addSignals" function="true" type="void" flags="32">
+            <arguments>
+                <argument name="channel" type="string"/>
+                <argument name="color" type="integer"/>
+                <argument name="angle_x" type="integer"/>
+                <argument name="angle_y" type="integer"/>
+                <argument name="angle_z" type="integer"/>
+            </arguments>
+        </element>
+        <element name="addSignalsFilter" function="true" type="void" flags="32">
+            <arguments>
+                <argument name="channel" type="string"/>
+                <argument name="color" type="integer"/>
+                <argument name="angle_x" type="integer"/>
+                <argument name="angle_y" type="integer"/>
+                <argument name="angle_z" type="integer"/>
+                <argument name="flavor" type="integer"/>
+                <argument name="filter" type="integer"/>
+            </arguments>
+        </element>
+    </type>
+    <type name="sim_params" context="Global context">
+        <description>
+            <![CDATA[This object groups all simulator parameters so they can be loaded or saved with a single call (see scripts/standard_loadsave.inc). For other purposes please use specific objects, like Simulator, World, Populations, etc.]]></description>
+        <element name="print" function="true" type="void" flags="32">
+            <description><![CDATA[One argument: message to be printed.]]></description>
+            <arguments>
+                <argument name="text" type="string"/>
+            </arguments>
+        </element>
+        <element name="message" function="true" type="void" flags="32">
+            <description><![CDATA[The second argument can be:
+ -1 = debugging message
+ 0 = information
+ 1 = warning
+ 2 = error
+ 3 = critical error]]></description>
+            <arguments>
+                <argument name="text" type="string"/>
+                <argument name="level" type="integer"/>
+            </arguments>
+        </element>
+        <element name="sleep" function="true" type="void" flags="32">
+            <description><![CDATA[Suspends the execution for a specified interval.]]></description>
+            <arguments>
+                <argument name="milliseconds" type="integer"/>
+            </arguments>
+        </element>
+        <element name="beep" function="true" type="void" flags="32">
+            <description><![CDATA[Plays the default system sound.]]></description>
+            <arguments/>
+        </element>
+        <element name="sound" function="true" type="void" flags="32">
+            <description><![CDATA[Generates a simple tone on the speaker]]></description>
+            <arguments>
+                <argument name="freqency in Hz" type="integer"/>
+                <argument name="length in milliseconds" type="integer"/>
+            </arguments>
+        </element>
+        <element name="eval" function="true" type="void" flags="32">
+            <description><![CDATA[The argument must be a complete statement, e.g. "return 2+2;" is valid, while "2+2" is not. The Error object is returned for invalid statements.
+Example:
+var statement="function fun(a) {return a*a;} return fun(Math.pi);";
+var result=Simulator.eval(statement);
+if (typeof result=="Error")
+   Simulator.print("Error:"+result.message);
+else
+   Simulator.print("Result:"+result);]]></description>
+            <arguments>
+                <argument name="script statement" type="string"/>
+            </arguments>
+        </element>
+        <element name="load" function="true" type="void" flags="32">
+            <description>
+                <![CDATA[Load experiment file (calls onExpLoad() in the current experiment definition). This function is intended to replace the simulator state; the old state is cleared by automatically calling "resetToDefaults()". Use "import" if you don't want to lose the old simulator state. Contents can also be loaded from string by using specifically formed filename: "string://string_contents_to_be_loaded".]]></description>
+            <arguments>
+                <argument name="filename" type="string"/>
+            </arguments>
+        </element>
+        <element name="import" function="true" type="void" flags="32">
+            <description><![CDATA[Import some data from file. Contents can also be imported from string by using specifically formed filename: "string://string_contents_to_be_imported".
+The second optional argument selects what section(s) will be imported:
+	1 - experiment (works just like load(), all other bits are ignored, and can reset the simulator state!)
+	2 - genotypes
+	4 - simulator parameters
+	8 - genepool settings
+	16 - population settings
+	32 - new groups will be created for imported genepools and populations
+	64 - allow switching to a different expdef while importing parameters (4)
+	256 - creatures
+
+The standard behavior (without the second argument) is to import genotypes, parameters, and genepool and population settings (2+4+8+16). Note that "64" is not included by default, because the expdef change resets all simulator parameters, which contradicts the usual meaning of "import" in Framsticks ("add data", as opposed to "load" meaning "replace data"). Moreover, using the "64" option in scripts can be dengerous, especially all expdef and show scripts should always declare the proper expdef name in their header rather than change the expdef directly. Without the "64" option, it is always safe to "import" any file in a script regardless of the current simulator state.]]></description>
+            <arguments>
+                <argument name="filename" type="string"/>
+                <argument name="options" type="integer"/>
+            </arguments>
+        </element>
+        <element name="import" function="true" type="void" flags="32">
+            <description>
+                <![CDATA[Equivalent to import(filename,2+4+8+16) - imports genotypes, parameters, genepool and population settings.]]></description>
+            <arguments>
+                <argument name="filename" type="string"/>
+            </arguments>
+        </element>
+        <element name="save" function="true" type="untyped" flags="32">
+            <description>
+                <![CDATA[Save experiment file (calls onExpSave() in the current experiment definition). Providing null filename makes save() return saved data as a text string instead of writing it to the file.]]></description>
+            <arguments>
+                <argument name="filename" type="string"/>
+            </arguments>
+        </element>
+        <element name="export" function="true" type="untyped" flags="32">
+            <description><![CDATA[Save some data to file. Arguments:
+- filename: can be null, which makes export() return saved data as a text string instead of writing it to the file.
+- options: composed of the following bit values:
+	1 - experiment (works just like save() and all other option bits are ignored)
+	2 - genotypes
+	4 - simulator parameters
+	8 - simulator stats
+	16 - genepool settings
+	32 - population settings
+	64 - do autosave
+	256 - creatures
+- selected genepool, -1 means all genepools
+- selected population, -1 means all populations]]></description>
+            <arguments>
+                <argument name="filename" type="string"/>
+                <argument name="options" type="integer"/>
+                <argument name="genepool" type="integer"/>
+                <argument name="population" type="integer"/>
+            </arguments>
+        </element>
+        <element name="start" function="true" type="void" flags="4096">
+            <description><![CDATA[Called by the user interface.]]></description>
+            <arguments/>
+        </element>
+        <element name="stop" function="true" type="void" flags="4096">
+            <description><![CDATA[The expdef script calls this function to stop simulation.]]></description>
+            <arguments/>
+        </element>
+        <element name="running" type="integer" min="0" max="1" flags="4130">
+            <description><![CDATA[Useful for synchronizing the user interface state.]]></description>
+        </element>
+        <element name="stop_on" type="integer" min="0" max="3" default="2">
+            <description>
+                <![CDATA[If the simulation is running and a message is emitted with at least the selected severity, the simulation will be stopped.]]></description>
+        </element>
+        <element name="step" function="true" type="void" flags="32">
+            <arguments/>
+        </element>
+        <element name="time" type="integer" deprecated="true" flags="8226">
+            <description>
+                <![CDATA[Simulator.time will be removed because of its misleading name, please use Simulator.stepNumber instead.]]></description>
+        </element>
+        <element name="last_genotype_num" type="integer" min="0" max="-1" default="0" flags="32">
+            <description><![CDATA[See: Genotype.num]]></description>
+        </element>
+        <element name="last_creature_num" type="integer" min="0" max="-1" default="0" flags="32">
+            <description><![CDATA[See: Creature.num]]></description>
+        </element>
+        <element name="stepNumber" type="integer" flags="34"/>
+        <element name="simspeed" type="integer" flags="4131">
+            <description><![CDATA[steps/second]]></description>
+        </element>
+        <element name="expdef" type="string">
+            <description><![CDATA[Choose the experiment framework
+(in Windows GUI, confirm by pressing 'Apply')
+
+Stop the simulation before selecting another experiment definition.
+It is a good practice to initialize the experiment before running the simulation.]]></description>
+        </element>
+        <element name="expdef_title" type="string" flags="3"/>
+        <element name="expdef_info" type="string" flags="3"/>
+        <element name="init" function="true" type="void">
+            <description><![CDATA[Prepares the experiment for running - usually performs initialization procedures such as resetting counters, states, gene pools, etc.
+These actions are defined in the onInit() function of this experiment definition.]]></description>
+            <arguments/>
+        </element>
+        <element name="loadexpdef" function="true" type="void">
+            <description>
+                <![CDATA[Resets the simulator to its default state, resets all parameters to default values and then loads this experiment definition.]]></description>
+            <arguments/>
+        </element>
+        <element name="usercode" type="string" min="1">
+            <description><![CDATA[You can override any function from the original experiment definition script. Use the same function names and provide alternative implementations.
+Example:
+
+function onBorn(cr)
+{
+  Simulator.print("A creature is born: "+cr.name);
+  super_onBorn(cr); //calls the original implementation
+}]]></description>
+        </element>
+        <element name="autosaveperiod" type="integer" min="0" max="100000">
+            <description><![CDATA[Save simulation state once every n-th event
+(events are defined by the script. For 'standard.expdef' it is after each death).
+Save EXPT file first to initialize name for autosave files.
+Slave simulators (in multithreaded experiments) ignore this setting and never create autosave files.]]></description>
+        </element>
+        <element name="overwrite" type="integer" min="0" max="1" default="0">
+            <description>
+                <![CDATA[Lets you choose what to do when a file is created with the same name as an already existing file: overwite the existing file or create its backup?]]></description>
+        </element>
+        <element name="filecomm" type="integer" min="0" max="1" default="1">
+            <description><![CDATA[Controls displaying comments encountered in opened files.]]></description>
+        </element>
+        <element name="checkpoint" function="true" type="void" flags="32">
+            <description><![CDATA[This function was previously called "autosave".]]></description>
+            <arguments/>
+        </element>
+        <element name="checkpointData" function="true" type="void" flags="32">
+            <description>
+                <![CDATA[In the distributed/paralellized scenario the data passed as argument can be received by the controlling entity (onSlaveCheckpoint in multithreaded master experiment, /simulator/expevent in distributed network simulator).]]></description>
+            <arguments>
+                <argument name="any_data" type="untyped"/>
+            </arguments>
+        </element>
+        <element name="lastCheckpoint" type="untyped" flags="35">
+            <description><![CDATA[Most recently reported by the experiment definition script.]]></description>
+        </element>
+        <element name="resetToDefaults" function="true" type="void">
+            <description>
+                <![CDATA[Clears groups and loads default values for simulator parameters, then calls onExpDefLoad() of the current experiment definition.]]></description>
+            <arguments/>
+        </element>
+        <element name="createrr" type="integer" min="0" max="2" default="1"/>
+        <element name="groupchk" type="integer" min="0" max="1" default="1">
+            <description>
+                <![CDATA[Warnings will be printed when invalid genotypes are added to a gene pool.]]></description>
+        </element>
+        <element name="creatwarnfail" type="integer" min="0" max="1">
+            <description>
+                <![CDATA[Creatures grown with warnings will not be simulated. This helps prevent the propagation of faulty genes, because genotypes that cause warnings when interpreted will not reproduce.]]></description>
+        </element>
+        <element name="vmdebug" type="integer" min="0" max="1"/>
+        <element name="vm_step_limit" type="integer" min="0" max="1000000000" default="0">
+            <description>
+                <![CDATA[Abort any script (expdef, fitness formula, user script) when it performs too many operations - which can take more or less time depending on your machine performance. This can protect against infinite loops or unbearably long runs of untested scripts that would otherwise force you to kill the whole application. Use Simulator.vm_..._warning if you only need information about what script takes too much time without aborting it.]]></description>
+        </element>
+        <element name="vm_step_warning" type="integer" min="0" max="1000000000" default="0">
+            <description>
+                <![CDATA[Display a warning when any script (expdef, fitness formula, user script) performs too many operations - which can take more or less time depending on your machine performance. Use Simulator.vm_..._limit to prevent the application from becoming unresponsive by aborting misbehaving scripts.]]></description>
+        </element>
+        <element name="vm_time_limit" type="float" min="0" max="1e+09" default="0.0">
+            <description>
+                <![CDATA[Abort any script (expdef, fitness formula, user script) when it takes too much time - measured in seconds. The actual amount of work depends on your machine performance. This can protect against infinite loops or unbearably long runs of untested scripts that would otherwise force you to kill the whole application. Use Simulator.vm_..._warning if you only need information about what script takes too much time without aborting it.]]></description>
+        </element>
+        <element name="vm_time_warning" type="float" min="0" max="1e+09" default="0.0">
+            <description>
+                <![CDATA[Display a warning when any script (expdef, fitness formula, user script) takes too much time - measured in seconds. The actual amount of work depends on your machine performance. Use Simulator.vm_..._limit to prevent the application from becoming unresponsive by aborting misbehaving scripts.]]></description>
+        </element>
+        <element name="new" function="true" type="Simulator" flags="32">
+            <arguments/>
+        </element>
+        <element name="slaves" type="SlaveSimulators" flags="35"/>
+        <element name="cpus" type="integer" flags="35"/>
+        <element name="world" type="World" flags="35"/>
+        <element name="populations" type="Populations" flags="35"/>
+        <element name="genepools" type="GenePools" flags="35"/>
+        <element name="expproperties" type="ExpProperties" flags="35"/>
+        <element name="expstate" type="ExpState" flags="35"/>
+        <element name="genman" type="GenMan" flags="35"/>
+        <element name="reloadNeurons" function="true" type="void" flags="32">
+            <arguments/>
+        </element>
+        <element name="userdata" type="untyped" flags="34"/>
+        <element name="identity" type="integer" flags="35">
+            <description><![CDATA[-1 for master simulator, 0...count-1 for slaves]]></description>
+        </element>
+        <element name="refreshGUI" function="true" type="void" flags="32">
+            <description><![CDATA[Notify that all populations and gene pools content changed.]]></description>
+            <arguments/>
+        </element>
+        <element name="version_string" type="string" flags="35">
+            <description><![CDATA[Current application version as a string (human-friendly).]]></description>
+        </element>
+        <element name="version_int" type="integer" flags="33">
+            <description><![CDATA[Current application version as an integer.]]></description>
+        </element>
+        <element name="_propertyClear" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Using most _property functions is restricted for internal purposes. Use "property:" or "state:" definitions in your script files to change object properties.]]></description>
+            <arguments/>
+        </element>
+        <element name="_propertyAdd" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Using most _property functions is restricted for internal purposes. Use "property:" or "state:" definitions in your script files to change object properties.]]></description>
+            <arguments>
+                <argument name="id" type="string"/>
+                <argument name="type description" type="string"/>
+                <argument name="name" type="string"/>
+                <argument name="flags" type="integer"/>
+                <argument name="help text" type="string"/>
+            </arguments>
+        </element>
+        <element name="_propertyRemove" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Using most _property functions is restricted for internal purposes. Use "property:" or "state:" definitions in your script files to change object properties.]]></description>
+            <arguments>
+                <argument name="index" type="integer"/>
+            </arguments>
+        </element>
+        <element name="_propertyChange" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Using most _property functions is restricted for internal purposes. Use "property:" or "state:" definitions in your script files to change object properties.]]></description>
+            <arguments>
+                <argument name="id" type="string"/>
+                <argument name="type description" type="string"/>
+                <argument name="name" type="string"/>
+                <argument name="flags" type="integer"/>
+                <argument name="help text" type="string"/>
+            </arguments>
+        </element>
+        <element name="_propertyAddGroup" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Using most _property functions is restricted for internal purposes. Use "property:" or "state:" definitions in your script files to change object properties.]]></description>
+            <arguments>
+                <argument name="name" type="string"/>
+            </arguments>
+        </element>
+        <element name="_propertyRemoveGroup" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Using most _property functions is restricted for internal purposes. Use "property:" or "state:" definitions in your script files to change object properties.]]></description>
+            <arguments>
+                <argument name="index" type="integer"/>
+            </arguments>
+        </element>
+        <element name="_propertyExists" function="true" type="integer" flags="34">
+            <arguments>
+                <argument name="name" type="string"/>
+            </arguments>
+        </element>
+        <element name="_property_changed_index" type="integer" flags="35"/>
+        <element name="_property_changed_id" type="string" flags="35"/>
+        <element name="wrldtyp" type="integer" min="0" max="2" default="0"/>
+        <element name="wrldsiz" type="float" min="10" max="10000" default="20.0">
+            <description><![CDATA[Side length of the world]]></description>
+        </element>
+        <element name="wrldmap" type="string">
+            <description><![CDATA[Description of the world (only applies to world types: "Blocks" or "Height field").
+To generate a random landscape, use:
+   r[scaling] <sizex> <sizey> [seed]
+To generate a custom landscape, provide height values:
+   m[scaling] <sizex> <sizey> digits...
+ or
+   M[scaling] <sizex> <sizey> numbers...
+
+"digits..." is a sequence of integer values 0,1,2,..,9. You may also use '-' and '|' characters for smooth slides between blocks.
+"numbers..." is a sequence of floating point values, so the "M" option provides more freedom.
+[scaling] is an optional linear scaling expression in the form of *FACTOR+OFFSET or *FACTOR-OFFSET, for example "r*0.1-2 5 5" creates a 5x5 random map with a 10% amplitude, shifted down by 2.
+
+See also the WorldMap object.]]></description>
+        </element>
+        <element name="wrldwat" type="float" min="-20" max="200" default="-1.0"/>
+        <element name="wrldbnd" type="integer" min="0" max="2" default="0">
+            <description>
+                <![CDATA[Teleporting a creature that is outside of the world area is attempted every 'performance sampling period' steps. Teleport succeeds only when the target location in the world is empty (there is no collision).]]></description>
+        </element>
+        <element name="wrldg" type="float" min="0" max="10" default="1.0">
+            <description><![CDATA[You can adjust gravity for your experiments.
+The "official" setting used to evaluate and compare creatures is 1.]]></description>
+        </element>
+        <element name="wrldchg" function="true" type="void" flags="32">
+            <arguments/>
+        </element>
+        <element name="simtype" type="integer" min="0" max="1" default="0">
+            <description><![CDATA[MechaStick is a fast and simple primary Framsticks simulation engine.
+ODE is Open Dynamics Engine by Russel Smith et al.
+
+NOTE: switching between simulation engines causes removal of all objects in the world (e.g. creatures).]]></description>
+        </element>
+        <element name="nnspeed" type="float" min="0" max="1000" default="1.0">
+            <description>
+                <![CDATA[Number of neural network simulation steps in each physics simulation step]]></description>
+        </element>
+        <element name="rndcollisions" type="integer" min="0" max="1" default="1">
+            <description>
+                <![CDATA[When enabled, custom collision handlers are invoked in random order. This can help remove unfair bias in some experiments - for example where the same collision order in each simulation step would cause some creatures colliding with food to consume energy while other colliding creatures would starve.]]></description>
+        </element>
+        <element name="signals" type="WorldSignals" flags="35"/>
+        <element name="odeshape" type="integer" min="0" max="1"/>
+        <element name="odestep" type="float" min="0.001" max="1" default="0.05"/>
+        <element name="odemusclemin" type="float" min="0" max="100" default="0.0">
+            <description><![CDATA[i.e. "mmmmm" in f1]]></description>
+        </element>
+        <element name="odemusclemax" type="float" min="0" max="100" default="10.0">
+            <description><![CDATA[i.e. "MMMMM" if f1]]></description>
+        </element>
+        <element name="odemusclespeed" type="float" min="0" max="10" default="1.0">
+            <description><![CDATA[Muscle state cannot change faster than the supplied value]]></description>
+        </element>
+        <element name="odeairdrag" type="float" min="0" max="0.5" default="0.01">
+            <description>
+                <![CDATA[A drag force ("air drag") proportional to the velocity of mass centers of moving parts (ODE's "linear damping")]]></description>
+        </element>
+        <element name="oderotdrag" type="float" min="0" max="0.5" default="0.01">
+            <description><![CDATA[Drag momentum acting on rotating bodies (ODE's "angular damping")]]></description>
+        </element>
+        <element name="odewaterdrag" type="float" min="0.001" max="1" default="0.5"/>
+        <element name="odewaterbuoy" type="float" min="0" max="2" default="1.0"/>
+        <element name="odeseed" type="integer" min="0" max="2">
+            <description><![CDATA[Affects collisions.
+- 'Truly random' is closest to the standard ODE operation. Use Math.seed to influence randomness in ODE collisions.
+- 'Deterministic' automatically calculates random seed in each step based on the current simulation (world) state, which makes the simulation repeatable but more random than 'Fixed'.
+- 'Fixed' is completely deterministic and does not depend on Math.seed - the same seed value is set before each step. This might negatively affect ODE accuracy.
+]]></description>
+        </element>
+        <element name="odesepsticks" type="integer" min="0" max="1" default="0">
+            <description><![CDATA[Each stick gets a separate ODE body (like in MechaStick)]]></description>
+        </element>
+        <element name="odeworlderp" type="float" min="0" max="1" default="0.2">
+            <description><![CDATA[World ERP (error reduction parameter)]]></description>
+        </element>
+        <element name="odeworldcfm" type="float" min="0" max="1" default="1e-5">
+            <description><![CDATA[World CFM (constraint force mixing)]]></description>
+        </element>
+        <element name="odecolmumin" type="float" min="0" max="10" default="0.1">
+            <description><![CDATA[Mu coefficient for Parts with minimal friction (i.e. "fffff" in f1)]]></description>
+        </element>
+        <element name="odecolmumax" type="float" min="0" max="10" default="5.0">
+            <description><![CDATA[Mu coefficient for Parts with maximal friction (i.e. "FFFFF" in f1)]]></description>
+        </element>
+        <element name="odecolbounce" type="float" min="0" max="1" default="0.1"/>
+        <element name="odecolbouncevel" type="float" min="0" max="1" default="0.01"/>
+        <element name="odecolsoftcfm" type="float" min="0" max="1" default="0.0"/>
+        <element name="odecolsofterp" type="float" min="0" max="1" default="0.0"/>
+        <element name="odecol2mumin" type="float" min="0" max="10" default="0.1">
+            <description><![CDATA[Mu coefficient for Parts with minimal friction (i.e. "fffff" in f1)]]></description>
+        </element>
+        <element name="odecol2mumax" type="float" min="0" max="10" default="1.0">
+            <description><![CDATA[Mu coefficient for Parts with maximal friction (i.e. "FFFFF" in f1)]]></description>
+        </element>
+        <element name="odecol2bounce" type="float" min="0" max="1" default="0.1"/>
+        <element name="odecol2bouncevel" type="float" min="0" max="1" default="0.01"/>
+        <element name="odecol2softcfm" type="float" min="0" max="1" default="0.0"/>
+        <element name="odecol2softerp" type="float" min="0" max="1" default="0.0"/>
+        <element name="rayIntersection" function="true" type="float" flags="32">
+            <arguments>
+                <argument name="position x" type="float"/>
+                <argument name="position y" type="float"/>
+                <argument name="position z" type="float"/>
+                <argument name="direction x" type="float"/>
+                <argument name="direction y" type="float"/>
+                <argument name="direction z" type="float"/>
+                <argument name="max distance" type="float"/>
+            </arguments>
+        </element>
+        <element name="gen_hist" type="integer" min="0" max="1" default="0" flags="2">
+            <description><![CDATA[Required for phylogenetic analysis]]></description>
+        </element>
+        <element name="gen_hilite" type="integer" min="0" max="1" default="1">
+            <description><![CDATA[Use colors for genes?
+(slows down viewing/editing of huge genotypes)]]></description>
+        </element>
+        <element name="gen_extmutinfo" type="integer" min="0" max="2" default="0">
+            <description>
+                <![CDATA[If active, information about employed mutation method will be stored in the 'info' field of each mutated genotype.]]></description>
+        </element>
+        <element name="operReport" function="true" type="void" flags="2">
+            <description><![CDATA[Show available genetic operators]]></description>
+            <arguments/>
+        </element>
+        <element name="toHTML" function="true" type="string" flags="2">
+            <description><![CDATA[returns genotype expressed as colored HTML]]></description>
+            <arguments>
+                <argument type="string"/>
+            </arguments>
+        </element>
+        <element name="toHTMLshort" function="true" type="string" flags="2">
+            <description><![CDATA[returns genotype (abbreviated if needed) in colored HTML format]]></description>
+            <arguments>
+                <argument type="string"/>
+            </arguments>
+        </element>
+        <element name="toLaTeX" function="true" type="string" flags="2">
+            <description><![CDATA[returns genotype in colored LaTeX format]]></description>
+            <arguments>
+                <argument type="string"/>
+            </arguments>
+        </element>
+        <element name="validate" function="true" type="Geno" flags="34">
+            <description><![CDATA[returns validated (if possible) Geno object from supplied Geno]]></description>
+            <arguments>
+                <argument type="Geno"/>
+            </arguments>
+        </element>
+        <element name="mutate" function="true" type="Geno" flags="34">
+            <description><![CDATA[returns mutated Geno object from supplied Geno]]></description>
+            <arguments>
+                <argument type="Geno"/>
+            </arguments>
+        </element>
+        <element name="crossOver" function="true" type="Geno" flags="34">
+            <description><![CDATA[returns crossed over genotype]]></description>
+            <arguments>
+                <argument type="Geno"/>
+                <argument type="Geno"/>
+            </arguments>
+        </element>
+        <element name="getSimplest" function="true" type="Geno" flags="34">
+            <description>
+                <![CDATA[returns the simplest genotype for a given encoding (format). "0" means f0, "4" means f4, etc.]]></description>
+            <arguments>
+                <argument name="format" type="string"/>
+            </arguments>
+        </element>
+        <element name="genoper_f0" type="integer" min="0" max="0" flags="65">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="genoper_f0s" type="integer" min="0" max="0" flags="65">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="genoper_f1" type="integer" min="0" max="0" flags="65">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="genoper_f2" type="integer" min="0" max="0" flags="65">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="genoper_f3" type="integer" min="0" max="0" flags="65">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="genoper_f4" type="integer" min="0" max="0" flags="65">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="genoper_f8" type="integer" min="0" max="0" flags="65">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="genoper_f9" type="integer" min="0" max="0" flags="65">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="genoper_fF" type="integer" min="0" max="0" flags="65">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="genoper_fn" type="integer" min="0" max="0" flags="65">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="genoper_fB" type="integer" min="0" max="0" flags="65">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="genoper_fH" type="integer" min="0" max="0" flags="65">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="genoper_fL" type="integer" min="0" max="0" flags="65">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="genoper_fS" type="integer" min="0" max="0" flags="65">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="neuadd_N" type="integer" min="0" max="1">
+            <description><![CDATA[Standard neuron
+
+Characteristics:
+   supports any number of inputs
+   provides output value
+   does not require location in body
+
+
+Properties:
+   Inertia (in) float 0..1 (default 0.8)
+   Force (fo) float 0..999 (default 0.04)
+   Sigmoid (si) float -99999..99999 (default 2)
+   State (s) float -1..1 (default 0)]]></description>
+        </element>
+        <element name="neuadd_Nu" type="integer" min="0" max="1">
+            <description><![CDATA[Works like standard neuron (N) but the output value is scaled to 0...+1 instead of -1...+1.
+Having 0 as one of the saturation states should help in "gate circuits", where input signal is passed through or blocked depending on the other singal.
+
+Characteristics:
+   supports any number of inputs
+   provides output value
+   does not require location in body
+
+
+Properties:
+   Inertia (in) float 0..1 (default 0.8)
+   Force (fo) float 0..999 (default 0.04)
+   Sigmoid (si) float -99999..99999 (default 2)
+   State (s) float -1..1 (default 0)]]></description>
+        </element>
+        <element name="neuadd_G" type="integer" min="0" max="1">
+            <description><![CDATA[Tilt sensor.
+Signal is proportional to sin(angle) = most sensitive in horizontal orientation.
+0=the stick is horizontal
++1/-1=the stick is vertical
+
+Characteristics:
+   does not use inputs
+   provides output value
+   should be located on a Joint
+]]></description>
+        </element>
+        <element name="neuadd_Gpart" type="integer" min="0" max="1">
+            <description><![CDATA[Tilt sensor. Signal is directly proportional to the tilt angle.
+0=the part X axis is horizontal
++1/-1=the axis is vertical
+
+Characteristics:
+   does not use inputs
+   provides output value
+   should be located on a Part
+
+
+Properties:
+   rotation.y (ry) float -6.282..6.282 (default 0)
+   rotation.z (rz) float -6.282..6.282 (default 0)]]></description>
+        </element>
+        <element name="neuadd_T" type="integer" min="0" max="1">
+            <description><![CDATA[Touch and proximity sensor (Tcontact and Tproximity combined)
+-1=no contact
+0=just touching
+>0=pressing, value depends on the force applied (not implemented in ODE mode)
+
+Characteristics:
+   does not use inputs
+   provides output value
+   should be located on a Part
+
+
+Properties:
+   Range (r) float 0..1 (default 1)
+   rotation.y (ry) float -6.282..6.282 (default 0)
+   rotation.z (rz) float -6.282..6.282 (default 0)]]></description>
+        </element>
+        <element name="neuadd_Tcontact" type="integer" min="0" max="1">
+            <description><![CDATA[Touch sensor.
+-1=no contact
+0=the Part is touching the obstacle
+>0=pressing, value depends on the force applied (not implemented in ODE mode)
+
+Characteristics:
+   does not use inputs
+   provides output value
+   should be located on a Part
+]]></description>
+        </element>
+        <element name="neuadd_Tproximity" type="integer" min="0" max="1">
+            <description><![CDATA[Proximity sensor detecting obstacles along the X axis.
+-1=distance is "r" or more
+0=zero distance
+
+Characteristics:
+   does not use inputs
+   provides output value
+   should be located on a Part
+
+
+Properties:
+   Range (r) float 0..1 (default 1)
+   rotation.y (ry) float -6.282..6.282 (default 0)
+   rotation.z (rz) float -6.282..6.282 (default 0)]]></description>
+        </element>
+        <element name="neuadd_S" type="integer" min="0" max="1">
+            <description><![CDATA[Smell sensor. Aggregated "smell of energy" experienced from all energy objects (creatures and food pieces).
+Close objects have bigger influence than the distant ones: for each energy source, its partial feeling is proportional to its energy/(distance^2)
+
+Characteristics:
+   does not use inputs
+   provides output value
+   should be located on a Part
+]]></description>
+        </element>
+        <element name="neuadd_Constant" type="integer" min="0" max="1">
+            <description><![CDATA[Constant value
+
+Characteristics:
+   does not use inputs
+   provides output value
+   does not require location in body
+]]></description>
+        </element>
+        <element name="neuadd_Bend_muscle" type="integer" min="0" max="1">
+            <description><![CDATA[Characteristics:
+   uses single input
+   does not provide output value
+   should be located on a Joint
+
+
+Properties:
+   power (p) float 0.01..1 (default 0.25)
+   bending range (r) float 0..1 (default 1)]]></description>
+        </element>
+        <element name="neuadd_Rotation_muscle" type="integer" min="0" max="1">
+            <description><![CDATA[Characteristics:
+   uses single input
+   does not provide output value
+   should be located on a Joint
+
+
+Properties:
+   power (p) float 0.01..1 (default 1)]]></description>
+        </element>
+        <element name="neuadd_M" type="integer" min="0" max="1">
+            <description><![CDATA[Characteristics:
+   uses single input
+   does not provide output value
+   should be located on a Joint
+
+
+Properties:
+   power (p) float 0.01..1 (default 1)
+   axis (a) integer 0..1 (default 0)]]></description>
+        </element>
+        <element name="neuadd_D" type="integer" min="0" max="1">
+            <description><![CDATA[Calculate the difference between the current and previous input value. Multiple inputs are aggregated with respect to their weights
+
+Characteristics:
+   supports any number of inputs
+   provides output value
+   does not require location in body
+]]></description>
+        </element>
+        <element name="neuadd_Fuzzy" type="integer" min="0" max="1">
+            <description><![CDATA[Refer to publications to learn more about this neuron.
+
+Characteristics:
+   supports any number of inputs
+   provides output value
+   does not require location in body
+
+
+Properties:
+   number of fuzzy sets (ns) integer
+   number of rules (nr) integer
+   fuzzy sets (fs) string (default "")
+   fuzzy rules (fr) string (default "")]]></description>
+        </element>
+        <element name="neuadd_VEye" type="integer" min="0" max="1">
+            <description><![CDATA[Refer to publications to learn more about this neuron.
+
+Characteristics:
+   uses single input
+   provides output value
+   should be located on a Part
+
+
+Properties:
+   target.x (tx) float
+   target.y (ty) float
+   target.z (tz) float
+   target shape (ts) string (default "")
+   perspective (p) float 0.1..10 (default 1)
+   scale (s) float 0.1..100 (default 1)
+   show hidden lines (h) integer 0..1 (default 0)
+   output lines count (each line needs four channels) (o) integer 0..99 (default 0)
+   debug (d) integer 0..1 (default 0)]]></description>
+        </element>
+        <element name="neuadd_VMotor" type="integer" min="0" max="1">
+            <description><![CDATA[Must be connected to the VEye and properly set up. Refer to publications to learn more about this neuron.
+
+Characteristics:
+   supports any number of inputs
+   provides output value
+   does not require location in body
+
+
+Properties:
+   number of basic features (noIF) integer
+   number of degrees of freedom (noDim) integer
+   parameters (params) string]]></description>
+        </element>
+        <element name="neuadd_Sti" type="integer" min="0" max="1">
+            <description><![CDATA[Characteristics:
+   uses single input
+   does not provide output value
+   should be located on a Part
+]]></description>
+        </element>
+        <element name="neuadd_LMu" type="integer" min="0" max="1">
+            <description><![CDATA[Characteristics:
+   uses single input
+   does not provide output value
+   should be located on a Joint
+
+
+Properties:
+   power (p) float 0.01..1 (default 1)]]></description>
+        </element>
+        <element name="neuadd_Water" type="integer" min="0" max="1">
+            <description><![CDATA[Output signal:
+0=on or above water surface
+1=under water (deeper than 1)
+0..1=in the transient area just below water surface
+
+Characteristics:
+   does not use inputs
+   provides output value
+   should be located on a Part
+]]></description>
+        </element>
+        <element name="neuadd_Energy" type="integer" min="0" max="1">
+            <description><![CDATA[The current energy level divided by the initial energy level.
+Usually falls from initial 1.0 down to 0.0 and then the creature dies. It can rise above 1.0 if enough food is ingested
+
+Characteristics:
+   does not use inputs
+   provides output value
+   does not require location in body
+]]></description>
+        </element>
+        <element name="neuadd_Ch" type="integer" min="0" max="1">
+            <description><![CDATA[Combines all input signals into a single multichannel output; Note: ChSel and ChMux are the only neurons which support multiple channels. Other neurons discard everything except the first channel.
+
+Characteristics:
+   supports any number of inputs
+   provides output value
+   does not require location in body
+]]></description>
+        </element>
+        <element name="neuadd_ChMux" type="integer" min="0" max="1">
+            <description><![CDATA[Outputs the selected channel from the second (multichannel) input. The first input is used as the selector value (-1=select first channel, .., 1=last channel)
+
+Characteristics:
+   uses 2 inputs
+   provides output value
+   does not require location in body
+]]></description>
+        </element>
+        <element name="neuadd_ChSel" type="integer" min="0" max="1">
+            <description><![CDATA[Outputs a single channel (selected by the "ch" parameter) from multichannel input
+
+Characteristics:
+   uses single input
+   provides output value
+   does not require location in body
+
+
+Properties:
+   channel (ch) integer]]></description>
+        </element>
+        <element name="neuadd_Rnd" type="integer" min="0" max="1">
+            <description><![CDATA[Generates random noise (subsequent random values in the range of -1..+1)
+
+Characteristics:
+   does not use inputs
+   provides output value
+   does not require location in body
+]]></description>
+        </element>
+        <element name="neuadd_Sin" type="integer" min="0" max="1">
+            <description><![CDATA[Output frequency = f0+input
+
+Characteristics:
+   uses single input
+   provides output value
+   does not require location in body
+
+
+Properties:
+   base frequency (f0) float -1..1 (default 0.0628319)
+   time (t) float 0..6.28319 (default 0)]]></description>
+        </element>
+        <element name="f0_nodel_tag" type="integer" min="0" max="1" default="1">
+            <description><![CDATA[You can tag elements using their 'i' field and the i="mi=d" tag.
+Mutations will not delete such elements.
+The i="mi=dm" combination is allowed.]]></description>
+        </element>
+        <element name="f0_nomod_tag" type="integer" min="0" max="1" default="1">
+            <description><![CDATA[You can tag elements using their 'i' field and the i="mi=m" tag.
+Mutations will not modify properties of such elements.
+The i="mi=md" combination is allowed.]]></description>
+        </element>
+        <element name="f0_p_new" type="float" min="0" max="100" default="5.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0_p_del" type="float" min="0" max="100" default="5.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0_p_swp" type="float" min="0" max="100" default="10.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0_p_pos" type="float" min="0" max="100" default="10.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0_p_den" type="float" min="0" max="100" default="0.0">
+            <description><![CDATA[Density only has an influence under water]]></description>
+        </element>
+        <element name="f0_p_frc" type="float" min="0" max="100" default="10.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0_p_ing" type="float" min="0" max="100" default="10.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0_p_asm" type="float" min="0" max="100" default="0.0">
+            <description>
+                <![CDATA[The interpretation and influence of this property must be implemented by the experiment definition]]></description>
+        </element>
+        <element name="f0_j_new" type="float" min="0" max="100" default="5.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0_j_del" type="float" min="0" max="100" default="5.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0_j_stm" type="float" min="0" max="100" default="0.0">
+            <description>
+                <![CDATA[The interpretation and influence of this property must be implemented by the experiment definition]]></description>
+        </element>
+        <element name="f0_j_stf" type="float" min="0" max="100" default="10.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0_j_rsf" type="float" min="0" max="100" default="10.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0_j_vred" type="float" min="0" max="100" default="0.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0_j_vgrn" type="float" min="0" max="100" default="0.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0_j_vblu" type="float" min="0" max="100" default="0.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0_n_new" type="float" min="0" max="100" default="5.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0_n_del" type="float" min="0" max="100" default="5.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0_n_prp" type="float" min="0" max="100" default="10.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0_c_new" type="float" min="0" max="100" default="5.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0_c_del" type="float" min="0" max="100" default="5.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0_c_wei" type="float" min="0" max="100" default="10.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0s_nodel_tag" type="integer" min="0" max="1" default="1">
+            <description><![CDATA[You can tag elements using their 'i' field and the i="mi=d" tag.
+Mutations will not delete such elements.
+The i="mi=dm" combination is allowed.]]></description>
+        </element>
+        <element name="f0s_nomod_tag" type="integer" min="0" max="1" default="1">
+            <description><![CDATA[You can tag elements using their 'i' field and the i="mi=m" tag.
+Mutations will not modify properties of such elements.
+The i="mi=md" combination is allowed.]]></description>
+        </element>
+        <element name="f0s_circle_section" type="integer" min="0" max="1" default="1">
+            <description><![CDATA[Ensure that ellipsoids and cylinders have circle cross-section]]></description>
+        </element>
+        <element name="f0s_use_elli" type="integer" min="0" max="1" default="1">
+            <description><![CDATA[Use ellipsoids in mutations]]></description>
+        </element>
+        <element name="f0s_use_cub" type="integer" min="0" max="1" default="1">
+            <description><![CDATA[Use cuboids in mutations]]></description>
+        </element>
+        <element name="f0s_use_cyl" type="integer" min="0" max="1" default="1">
+            <description><![CDATA[Use cylinders in mutations]]></description>
+        </element>
+        <element name="f0s_p_new" type="float" min="0" max="100" default="5.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0s_p_del" type="float" min="0" max="100" default="5.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0s_p_swp" type="float" min="0" max="100" default="10.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0s_p_pos" type="float" min="0" max="100" default="10.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0s_p_rot" type="float" min="0" max="100" default="10.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0s_p_scale" type="float" min="0" max="100" default="10.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0s_p_frc" type="float" min="0" max="100" default="10.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0s_p_ing" type="float" min="0" max="100" default="10.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0s_p_asm" type="float" min="0" max="100" default="0.0">
+            <description>
+                <![CDATA[The interpretation and influence of this property must be implemented by the experiment definition]]></description>
+        </element>
+        <element name="f0s_j_new" type="float" min="0" max="100" default="5.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0s_j_del" type="float" min="0" max="100" default="5.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0s_j_stm" type="float" min="0" max="100" default="0.0">
+            <description>
+                <![CDATA[The interpretation and influence of this property must be implemented by the experiment definition]]></description>
+        </element>
+        <element name="f0s_j_vred" type="float" min="0" max="100" default="0.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0s_j_vgrn" type="float" min="0" max="100" default="0.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0s_j_vblu" type="float" min="0" max="100" default="0.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0s_n_new" type="float" min="0" max="100" default="5.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0s_n_del" type="float" min="0" max="100" default="5.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0s_n_prp" type="float" min="0" max="100" default="10.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0s_c_new" type="float" min="0" max="100" default="5.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0s_c_del" type="float" min="0" max="100" default="5.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f0s_c_wei" type="float" min="0" max="100" default="10.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f1_xo_propor" type="integer" min="0" max="1" default="1">
+            <description><![CDATA[Cross over (exchange) corresponding segments of the two parent genotypes?
+
+f1 uses a two-point crossing over.
+If this option is turned on, cut points will be selected proportionally to neural genes.
+Thus, if both parents have the same number of neurons, then this will be preserved in their children.]]></description>
+        </element>
+        <element name="f1_smX" type="float" min="0" max="100" default="0.05"/>
+        <element name="f1_smJunct" type="float" min="0" max="100" default="0.02"/>
+        <element name="f1_smComma" type="float" min="0" max="100" default="0.02"/>
+        <element name="f1_smModif" type="float" min="0" max="100" default="0.1">
+            <description><![CDATA[Modifiers: LlRrCcQqFfMmIiEeWwAaSsDdGgBb]]></description>
+        </element>
+        <element name="f1_mut_exmod" type="string" max="30">
+            <description><![CDATA[Modifiers that will not be added nor deleted during mutation
+(all: LlRrCcQqFfMmIiEeWwAaSsDdGgBb)]]></description>
+        </element>
+        <element name="f1_nmNeu" type="float" min="0" max="100" default="0.05">
+            <description><![CDATA[Adds a (connected) neuron or removes a neuron]]></description>
+        </element>
+        <element name="f1_nmConn" type="float" min="0" max="100" default="0.1">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f1_nmProp" type="float" min="0" max="100" default="0.1">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f1_nmWei" type="float" min="0" max="100" default="1.0"/>
+        <element name="f1_nmVal" type="float" min="0" max="100" default="0.05"/>
+        <element name="f2_mutAddOper" type="float" min="0" max="1" default="0.4">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f2_mutJointElem" type="float" min="0" max="1" default="0.33">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f2_mutNeuroElem" type="float" min="0" max="1" default="0.33">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f2_mutConnElem" type="float" min="0" max="1" default="0.33">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f2_mutDelOper" type="float" min="0" max="1" default="0.1">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f2_mutHandleOper" type="float" min="0" max="1" default="0.3">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f2_mutPropOper" type="float" min="0" max="1" default="0.2">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f3_mutSubstitution" type="float" min="0" max="1" default="0.6">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f3_mutSubstPerChar" type="float" min="0" max="1" default="0.1">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f3_mutDelIns" type="float" min="0" max="1" default="0.1">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f3_mutDelInsPerChar" type="float" min="0" max="1" default="0.05">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f3_mutDelInsLength" type="integer" min="1" max="100" default="5">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f3_mutDuplication" type="float" min="0" max="1" default="0.05">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f3_mutTranslocation" type="float" min="0" max="1" default="0.15">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f3_xovGeneTransfer" type="float" min="0" max="1" default="0.8">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f3_xovCrossingOver" type="float" min="0" max="1" default="0.2">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="f4_mut_add" type="float" min="0" max="100" default="50.0">
+            <description><![CDATA[mutation: probability of adding a node]]></description>
+        </element>
+        <element name="f4_mut_add_div" type="float" min="0" max="100" default="20.0">
+            <description><![CDATA[add node mutation: probability of adding a division]]></description>
+        </element>
+        <element name="f4_mut_add_conn" type="float" min="0" max="100" default="15.0">
+            <description><![CDATA[add node mutation: probability of adding a neural connection]]></description>
+        </element>
+        <element name="f4_mut_add_neupar" type="float" min="0" max="100" default="5.0">
+            <description><![CDATA[add node mutation: probability of adding a neuron property/modifier]]></description>
+        </element>
+        <element name="f4_mut_add_rep" type="float" min="0" max="100" default="10.0">
+            <description><![CDATA[add node mutation: probability of adding a repetition]]></description>
+        </element>
+        <element name="f4_mut_add_simp" type="float" min="0" max="100" default="50.0">
+            <description><![CDATA[add node mutation: probability of adding a random, simple gene]]></description>
+        </element>
+        <element name="f4_mut_del" type="float" min="0" max="100" default="20.0">
+            <description><![CDATA[mutation: probability of deleting a node]]></description>
+        </element>
+        <element name="f4_mut_mod" type="float" min="0" max="100" default="30.0">
+            <description><![CDATA[mutation: probability of changing a node]]></description>
+        </element>
+        <element name="f4_mut_exmod" type="string" max="30">
+            <description><![CDATA[Modifiers that will not be added nor deleted during mutation
+(all: LlRrCcQqFfMmIiEeWwAaSsDdGgBb)]]></description>
+        </element>
+        <element name="f8_mut_chg_begin_arg" type="float" min="0" max="100" default="7.0">
+            <description><![CDATA[mutation: probability of changing a beginning argument]]></description>
+        </element>
+        <element name="f8_mut_chg_arg" type="float" min="0" max="100" default="7.0">
+            <description><![CDATA[mutation: probability of changing a production's argument]]></description>
+        </element>
+        <element name="f8_mut_del_comm" type="float" min="0" max="100" default="8.0">
+            <description><![CDATA[mutation: probability of deleting a command]]></description>
+        </element>
+        <element name="f8_mut_insert_comm" type="float" min="0" max="100" default="8.0">
+            <description><![CDATA[mutation: probability of inserting commands]]></description>
+        </element>
+        <element name="f8_mut_enc" type="float" min="0" max="100" default="8.0">
+            <description><![CDATA[mutation: probability of encapsulating commands]]></description>
+        </element>
+        <element name="f8_mut_chg_cond_sign" type="float" min="0" max="100" default="7.0">
+            <description><![CDATA[mutation: probability of changing a condition sign]]></description>
+        </element>
+        <element name="f8_mut_add_param" type="float" min="0" max="100" default="8.0">
+            <description><![CDATA[mutation: probability of adding a parameter to the production]]></description>
+        </element>
+        <element name="f8_mut_add_cond" type="float" min="0" max="100" default="8.0">
+            <description><![CDATA[mutation: probability of adding a condition to the subproduction]]></description>
+        </element>
+        <element name="f8_mut_add_subprod" type="float" min="0" max="100" default="8.0">
+            <description><![CDATA[mutation: probability of adding a subproduction]]></description>
+        </element>
+        <element name="f8_mut_chg_iter_number" type="float" min="0" max="100" default="7.0">
+            <description><![CDATA[mutation: probability of changing a number of iterations]]></description>
+        </element>
+        <element name="f8_mut_del_param" type="float" min="0" max="100" default="8.0">
+            <description><![CDATA[mutation: probability of deleting a parameter]]></description>
+        </element>
+        <element name="f8_mut_del_cond" type="float" min="0" max="100" default="8.0">
+            <description><![CDATA[mutation: probability of deleting a condition]]></description>
+        </element>
+        <element name="f8_mut_add_loop" type="float" min="0" max="100" default="0.0">
+            <description><![CDATA[mutation: probability of adding a loop]]></description>
+        </element>
+        <element name="f8_mut_del_loop" type="float" min="0" max="100" default="0.0">
+            <description><![CDATA[mutation: probability of deleting a loop]]></description>
+        </element>
+        <element name="f8_mut_del_prod" type="float" min="0" max="100" default="8.0">
+            <description><![CDATA[mutation: probability of deleting a production]]></description>
+        </element>
+        <element name="f9_mut" type="float" min="0" max="1" default="0.1">
+            <description>
+                <![CDATA[How many genes should be mutated during single mutation (1=all genes, 0.1=ten percent)]]></description>
+        </element>
+        <element name="fF_xover" type="float" min="0.5" max="1" default="0.5">
+            <description><![CDATA[0.5 => children are averaged parents.
+0.8 => children are only 20% different from parents.
+1.0 => each child is identical to one parent (no crossover).]]></description>
+        </element>
+        <element name="fn_xover" type="float" min="0.5" max="1" default="0.9">
+            <description><![CDATA[0.5 => children are averaged parents.
+0.8 => children are only 20% different from parents.
+1.0 => each child is identical to one parent (no crossover).]]></description>
+        </element>
+        <element name="fn_xover_random" type="integer" min="0" max="1" default="1">
+            <description>
+                <![CDATA[If active, the amount of linear mix is random in each crossover operation, so the "Fraction inherited in linear mix crossover" parameter is ignored.]]></description>
+        </element>
+        <element name="fn_mut_bound_low" type="string" default="[-10.0, -10.0]">
+            <description><![CDATA[A vector of lower bounds (one real value for each variable)]]></description>
+        </element>
+        <element name="fn_mut_bound_high" type="string" default="[10.0, 10.0]">
+            <description><![CDATA[A vector of higher bounds (one real value for each variable)]]></description>
+        </element>
+        <element name="fn_mut_stddev" type="string" default="[0.1, 0.1]">
+            <description><![CDATA[A vector of standard deviations (one real value for each variable)]]></description>
+        </element>
+        <element name="fn_mut_single_var" type="integer" min="0" max="1" default="0">
+            <description>
+                <![CDATA[If active, only a single randomly selected variable will be mutated in each mutation operation. Otherwise all variables will be mutated.]]></description>
+        </element>
+        <element name="fB_mut_substitution" type="float" min="0" max="1" default="0.6">
+            <description><![CDATA[Probability of mutation by changing single random letter in genotype]]></description>
+        </element>
+        <element name="fB_mut_insertion" type="float" min="0" max="1" default="0.095">
+            <description>
+                <![CDATA[Probability of mutation by inserting characters in random place of genotype]]></description>
+        </element>
+        <element name="fB_mut_nclassins" type="float" min="0" max="1" default="0.005">
+            <description>
+                <![CDATA[Probability of mutation by inserting neuron class definition in random place of genotype]]></description>
+        </element>
+        <element name="fB_mut_deletion" type="float" min="0" max="1" default="0.1">
+            <description><![CDATA[Probability of mutation by deleting random characters in genotype]]></description>
+        </element>
+        <element name="fB_mut_duplication" type="float" min="0" max="1" default="0.0">
+            <description>
+                <![CDATA[Probability of mutation by copying single *gene* of genotype and appending it to the beginning of this genotype]]></description>
+        </element>
+        <element name="fB_mut_translocation" type="float" min="0" max="1" default="0.15">
+            <description><![CDATA[Probability of mutation by replacing two substrings in genotype]]></description>
+        </element>
+        <element name="fB_cross_gene_transfer" type="float" min="0" max="1" default="0.0">
+            <description>
+                <![CDATA[Probability of crossing over by transferring single genes from both parents to beginning of each other]]></description>
+        </element>
+        <element name="fB_cross_crossover" type="float" min="0" max="1" default="1.0">
+            <description>
+                <![CDATA[Probability of crossing over by random distribution of genes from both parents to both children]]></description>
+        </element>
+        <element name="fH_mut_addition" type="float" min="0" max="1" default="0.3">
+            <description><![CDATA[Probability of adding new element to genotype]]></description>
+        </element>
+        <element name="fH_mut_add_joint" type="float" min="0" max="1" default="0.33">
+            <description><![CDATA[Probability of adding new stick handle]]></description>
+        </element>
+        <element name="fH_mut_add_neuron" type="float" min="0" max="1" default="0.33">
+            <description><![CDATA[Probability of adding new neuron handle]]></description>
+        </element>
+        <element name="fH_mut_add_connection" type="float" min="0" max="1" default="0.33">
+            <description><![CDATA[Probability of adding new connection handle]]></description>
+        </element>
+        <element name="fH_mut_deletion" type="float" min="0" max="1" default="0.1">
+            <description><![CDATA[Probability of removing element from genotype]]></description>
+        </element>
+        <element name="fH_mut_handle" type="float" min="0" max="1" default="0.3">
+            <description><![CDATA[Probability of changing values in vectors of handle]]></description>
+        </element>
+        <element name="fH_mut_property" type="float" min="0" max="1" default="0.3">
+            <description><![CDATA[Probability of changing properties of handles]]></description>
+        </element>
+        <element name="fL_maxdefinedwords" type="integer" min="0" max="100" default="10">
+            <description><![CDATA[Maximum number of words that can be defined in L-System]]></description>
+        </element>
+        <element name="fL_axm_mut_prob" type="float" min="0" max="1" default="0.2">
+            <description><![CDATA[Probability of performing mutation operations on axiom]]></description>
+        </element>
+        <element name="fL_rul_mut_prob" type="float" min="0" max="1" default="0.8">
+            <description>
+                <![CDATA[Probability of performing mutation operations on the successor of random rule]]></description>
+        </element>
+        <element name="fL_mut_addition" type="float" min="0" max="1" default="0.2">
+            <description>
+                <![CDATA[Probability of adding random existing word to the axiom or one of successors]]></description>
+        </element>
+        <element name="fL_mut_add_stick" type="float" min="0" max="1" default="0.2">
+            <description><![CDATA[Probability of adding stick]]></description>
+        </element>
+        <element name="fL_mut_add_neuro" type="float" min="0" max="1" default="0.2">
+            <description><![CDATA[Probability of adding neuron]]></description>
+        </element>
+        <element name="fL_mut_add_conn" type="float" min="0" max="1" default="0.2">
+            <description><![CDATA[Probability of adding connection]]></description>
+        </element>
+        <element name="fL_mut_add_rot" type="float" min="0" max="1" default="0.2">
+            <description><![CDATA[Probability of adding one of rotation words]]></description>
+        </element>
+        <element name="fL_mut_add_branch" type="float" min="0" max="1" default="0.2">
+            <description><![CDATA[Probability of adding branch with rotation and stick]]></description>
+        </element>
+        <element name="fL_mut_add_other" type="float" min="0" max="1" default="0.4">
+            <description><![CDATA[Probability of adding other word, defined in genotype]]></description>
+        </element>
+        <element name="fL_mut_worddefaddition" type="float" min="0" max="1" default="0.05">
+            <description><![CDATA[Probability of adding new word definition to the genotype]]></description>
+        </element>
+        <element name="fL_mut_ruleaddition" type="float" min="0" max="1" default="0.1">
+            <description><![CDATA[Probability of adding new rule definition for existing word]]></description>
+        </element>
+        <element name="fL_mut_rulecond" type="float" min="0" max="1" default="0.1">
+            <description><![CDATA[Probability of modifying random rule condition]]></description>
+        </element>
+        <element name="fL_mut_changeword" type="float" min="0" max="1" default="0.3">
+            <description>
+                <![CDATA[Probability of changing word name or formula of a random word from axiom or one of successors]]></description>
+        </element>
+        <element name="fL_mut_changeword_formula" type="float" min="0" max="1" default="0.7">
+            <description><![CDATA[Probability of changing formula in word]]></description>
+        </element>
+        <element name="fL_mut_changeword_name" type="float" min="0" max="1" default="0.3">
+            <description><![CDATA[Probability of changing name in word]]></description>
+        </element>
+        <element name="fL_mut_changeiter" type="float" min="0" max="1" default="0.3">
+            <description><![CDATA[Probability of changing number of iterations of L-Systems]]></description>
+        </element>
+        <element name="fL_mut_changeiter_step" type="float" min="0" max="1" default="1.0">
+            <description><![CDATA[Minimal step that should be used for changing iterations in L-Systems]]></description>
+        </element>
+        <element name="fL_mut_deletion" type="float" min="0" max="1" default="0.2">
+            <description>
+                <![CDATA[Probability of deleting random word from axiom or random successor (also deletes rule if there is only one word in successor)]]></description>
+        </element>
+        <element name="fS_mut_add_part" type="float" min="0" max="100" default="10.0">
+            <description><![CDATA[mutation: probability of adding a part]]></description>
+        </element>
+        <element name="fS_mut_rem_part" type="float" min="0" max="100" default="10.0">
+            <description><![CDATA[mutation: probability of deleting a part]]></description>
+        </element>
+        <element name="fS_mut_mod_part" type="float" min="0" max="100" default="10.0">
+            <description><![CDATA[mutation: probability of changing the part type]]></description>
+        </element>
+        <element name="fS_mut_change_joint" type="float" min="0" max="100" default="10.0">
+            <description><![CDATA[mutation: probability of changing a joint]]></description>
+        </element>
+        <element name="fS_mut_add_param" type="float" min="0" max="100" default="10.0">
+            <description><![CDATA[mutation: probability of adding a parameter]]></description>
+        </element>
+        <element name="fS_mut_rem_param" type="float" min="0" max="100" default="10.0">
+            <description><![CDATA[mutation: probability of removing a parameter]]></description>
+        </element>
+        <element name="fS_mut_mod_param" type="float" min="0" max="100" default="10.0">
+            <description><![CDATA[mutation: probability of modifying a parameter]]></description>
+        </element>
+        <element name="fS_mut_mod_mod" type="float" min="0" max="100" default="10.0">
+            <description><![CDATA[mutation: probability of modifying a modifier]]></description>
+        </element>
+        <element name="fS_mut_add_neuro" type="float" min="0" max="100" default="10.0">
+            <description><![CDATA[mutation: probability of adding a neuron]]></description>
+        </element>
+        <element name="fS_mut_rem_neuro" type="float" min="0" max="100" default="10.0">
+            <description><![CDATA[mutation: probability of removing a neuron]]></description>
+        </element>
+        <element name="fS_mut_mod_neuro_conn" type="float" min="0" max="100" default="10.0">
+            <description><![CDATA[mutation: probability of changing a neuron connection]]></description>
+        </element>
+        <element name="fS_mut_add_neuro_conn" type="float" min="0" max="100" default="10.0">
+            <description><![CDATA[mutation: probability of adding a neuron connection]]></description>
+        </element>
+        <element name="fS_mut_rem_neuro_conn" type="float" min="0" max="100" default="10.0">
+            <description><![CDATA[mutation: probability of removing a neuron connection]]></description>
+        </element>
+        <element name="fS_mut_mod_neuro_params" type="float" min="0" max="100" default="10.0">
+            <description><![CDATA[mutation: probability of changing a neuron param]]></description>
+        </element>
+        <element name="fS_circle_section" type="integer" min="0" max="1" default="1">
+            <description><![CDATA[Ensure that ellipsoids and cylinders have circle cross-section]]></description>
+        </element>
+        <element name="fS_use_elli" type="integer" min="0" max="1" default="1">
+            <description><![CDATA[Use ellipsoids in mutations]]></description>
+        </element>
+        <element name="fS_use_cub" type="integer" min="0" max="1" default="1">
+            <description><![CDATA[Use cuboids in mutations]]></description>
+        </element>
+        <element name="fS_use_cyl" type="integer" min="0" max="1" default="1">
+            <description><![CDATA[Use cylinders in mutations]]></description>
+        </element>
+        <element name="fS_mut_add_part_strong" type="integer" min="0" max="1" default="1">
+            <description><![CDATA[Add part mutation will produce more parametrized parts]]></description>
+        </element>
+        <element name="genkonw0" type="integer" min="0" max="1"/>
+        <element name="genkonw1" type="integer" min="0" max="1"/>
+        <element name="genkonw2" type="integer" min="0" max="1"/>
+        <element name="genkonw3" type="integer" min="0" max="1"/>
+        <element name="genkonw4" type="integer" min="0" max="1"/>
+        <element name="genkonw5" type="integer" min="0" max="1"/>
+        <element name="genkonw6" type="integer" min="0" max="1"/>
+        <element name="genkonw7" type="integer" min="0" max="1"/>
+        <element name="genkonw8" type="integer" min="0" max="1"/>
+        <element name="genkonw9" type="integer" min="0" max="1"/>
+        <element name="genkonw10" type="integer" min="0" max="1"/>
+        <element name="genkonw11" type="integer" min="0" max="1"/>
+        <element name="randinit" type="float" min="0" max="10" default="0.01">
+            <description>
+                <![CDATA[Allowed range for initializing all neuron states with uniform distribution random numbers and zero mean. Set to 0 for deterministic initialization.]]></description>
+        </element>
+        <element name="nnoise" type="float" min="0" max="1" default="0.0">
+            <description>
+                <![CDATA[Gaussian neural noise: a random value is added to each neural output in each simulation step. Set standard deviation here to add random noise, or 0 for deterministic simulation.]]></description>
+        </element>
+        <element name="touchrange" type="float" min="0" max="100" default="1.0"/>
+        <element name="bnoise_struct" type="float" min="0" max="10" default="0.0">
+            <description>
+                <![CDATA[When >0, body constructs of creatures (position of Parts) will be randomly disturbed when they are created.]]></description>
+        </element>
+        <element name="bnoise_vel" type="float" min="0" max="10" default="0.0">
+            <description>
+                <![CDATA[Random velocities will be applied to all body Parts (in MechaStick) or rigid segments (in ODE) of newly created creatures.]]></description>
+        </element>
+        <element name="ncl_N" type="integer" min="0" max="1">
+            <description><![CDATA[Standard neuron
+
+Characteristics:
+   supports any number of inputs
+   provides output value
+   does not require location in body
+
+
+Properties:
+   Inertia (in) float 0..1 (default 0.8)
+   Force (fo) float 0..999 (default 0.04)
+   Sigmoid (si) float -99999..99999 (default 2)
+   State (s) float -1..1 (default 0)]]></description>
+        </element>
+        <element name="ncl_Nu" type="integer" min="0" max="1">
+            <description><![CDATA[Works like standard neuron (N) but the output value is scaled to 0...+1 instead of -1...+1.
+Having 0 as one of the saturation states should help in "gate circuits", where input signal is passed through or blocked depending on the other singal.
+
+Characteristics:
+   supports any number of inputs
+   provides output value
+   does not require location in body
+
+
+Properties:
+   Inertia (in) float 0..1 (default 0.8)
+   Force (fo) float 0..999 (default 0.04)
+   Sigmoid (si) float -99999..99999 (default 2)
+   State (s) float -1..1 (default 0)]]></description>
+        </element>
+        <element name="ncl_G" type="integer" min="0" max="1">
+            <description><![CDATA[Tilt sensor.
+Signal is proportional to sin(angle) = most sensitive in horizontal orientation.
+0=the stick is horizontal
++1/-1=the stick is vertical
+
+Characteristics:
+   does not use inputs
+   provides output value
+   should be located on a Joint
+]]></description>
+        </element>
+        <element name="ncl_Gpart" type="integer" min="0" max="1">
+            <description><![CDATA[Tilt sensor. Signal is directly proportional to the tilt angle.
+0=the part X axis is horizontal
++1/-1=the axis is vertical
+
+Characteristics:
+   does not use inputs
+   provides output value
+   should be located on a Part
+
+
+Properties:
+   rotation.y (ry) float -6.282..6.282 (default 0)
+   rotation.z (rz) float -6.282..6.282 (default 0)]]></description>
+        </element>
+        <element name="ncl_T" type="integer" min="0" max="1">
+            <description><![CDATA[Touch and proximity sensor (Tcontact and Tproximity combined)
+-1=no contact
+0=just touching
+>0=pressing, value depends on the force applied (not implemented in ODE mode)
+
+Characteristics:
+   does not use inputs
+   provides output value
+   should be located on a Part
+
+
+Properties:
+   Range (r) float 0..1 (default 1)
+   rotation.y (ry) float -6.282..6.282 (default 0)
+   rotation.z (rz) float -6.282..6.282 (default 0)]]></description>
+        </element>
+        <element name="ncl_Tcontact" type="integer" min="0" max="1">
+            <description><![CDATA[Touch sensor.
+-1=no contact
+0=the Part is touching the obstacle
+>0=pressing, value depends on the force applied (not implemented in ODE mode)
+
+Characteristics:
+   does not use inputs
+   provides output value
+   should be located on a Part
+]]></description>
+        </element>
+        <element name="ncl_Tproximity" type="integer" min="0" max="1">
+            <description><![CDATA[Proximity sensor detecting obstacles along the X axis.
+-1=distance is "r" or more
+0=zero distance
+
+Characteristics:
+   does not use inputs
+   provides output value
+   should be located on a Part
+
+
+Properties:
+   Range (r) float 0..1 (default 1)
+   rotation.y (ry) float -6.282..6.282 (default 0)
+   rotation.z (rz) float -6.282..6.282 (default 0)]]></description>
+        </element>
+        <element name="ncl_S" type="integer" min="0" max="1">
+            <description><![CDATA[Smell sensor. Aggregated "smell of energy" experienced from all energy objects (creatures and food pieces).
+Close objects have bigger influence than the distant ones: for each energy source, its partial feeling is proportional to its energy/(distance^2)
+
+Characteristics:
+   does not use inputs
+   provides output value
+   should be located on a Part
+]]></description>
+        </element>
+        <element name="ncl_Constant" type="integer" min="0" max="1">
+            <description><![CDATA[Constant value
+
+Characteristics:
+   does not use inputs
+   provides output value
+   does not require location in body
+]]></description>
+        </element>
+        <element name="ncl_Bend_muscle" type="integer" min="0" max="1">
+            <description><![CDATA[Characteristics:
+   uses single input
+   does not provide output value
+   should be located on a Joint
+
+
+Properties:
+   power (p) float 0.01..1 (default 0.25)
+   bending range (r) float 0..1 (default 1)]]></description>
+        </element>
+        <element name="ncl_Rotation_muscle" type="integer" min="0" max="1">
+            <description><![CDATA[Characteristics:
+   uses single input
+   does not provide output value
+   should be located on a Joint
+
+
+Properties:
+   power (p) float 0.01..1 (default 1)]]></description>
+        </element>
+        <element name="ncl_M" type="integer" min="0" max="1">
+            <description><![CDATA[Characteristics:
+   uses single input
+   does not provide output value
+   should be located on a Joint
+
+
+Properties:
+   power (p) float 0.01..1 (default 1)
+   axis (a) integer 0..1 (default 0)]]></description>
+        </element>
+        <element name="ncl_D" type="integer" min="0" max="1">
+            <description><![CDATA[Calculate the difference between the current and previous input value. Multiple inputs are aggregated with respect to their weights
+
+Characteristics:
+   supports any number of inputs
+   provides output value
+   does not require location in body
+]]></description>
+        </element>
+        <element name="ncl_Fuzzy" type="integer" min="0" max="1">
+            <description><![CDATA[Refer to publications to learn more about this neuron.
+
+Characteristics:
+   supports any number of inputs
+   provides output value
+   does not require location in body
+
+
+Properties:
+   number of fuzzy sets (ns) integer
+   number of rules (nr) integer
+   fuzzy sets (fs) string (default "")
+   fuzzy rules (fr) string (default "")]]></description>
+        </element>
+        <element name="ncl_VEye" type="integer" min="0" max="1">
+            <description><![CDATA[Refer to publications to learn more about this neuron.
+
+Characteristics:
+   uses single input
+   provides output value
+   should be located on a Part
+
+
+Properties:
+   target.x (tx) float
+   target.y (ty) float
+   target.z (tz) float
+   target shape (ts) string (default "")
+   perspective (p) float 0.1..10 (default 1)
+   scale (s) float 0.1..100 (default 1)
+   show hidden lines (h) integer 0..1 (default 0)
+   output lines count (each line needs four channels) (o) integer 0..99 (default 0)
+   debug (d) integer 0..1 (default 0)]]></description>
+        </element>
+        <element name="ncl_VMotor" type="integer" min="0" max="1">
+            <description><![CDATA[Must be connected to the VEye and properly set up. Refer to publications to learn more about this neuron.
+
+Characteristics:
+   supports any number of inputs
+   provides output value
+   does not require location in body
+
+
+Properties:
+   number of basic features (noIF) integer
+   number of degrees of freedom (noDim) integer
+   parameters (params) string]]></description>
+        </element>
+        <element name="ncl_Sti" type="integer" min="0" max="1">
+            <description><![CDATA[Characteristics:
+   uses single input
+   does not provide output value
+   should be located on a Part
+]]></description>
+        </element>
+        <element name="ncl_LMu" type="integer" min="0" max="1">
+            <description><![CDATA[Characteristics:
+   uses single input
+   does not provide output value
+   should be located on a Joint
+
+
+Properties:
+   power (p) float 0.01..1 (default 1)]]></description>
+        </element>
+        <element name="ncl_Water" type="integer" min="0" max="1">
+            <description><![CDATA[Output signal:
+0=on or above water surface
+1=under water (deeper than 1)
+0..1=in the transient area just below water surface
+
+Characteristics:
+   does not use inputs
+   provides output value
+   should be located on a Part
+]]></description>
+        </element>
+        <element name="ncl_Energy" type="integer" min="0" max="1">
+            <description><![CDATA[The current energy level divided by the initial energy level.
+Usually falls from initial 1.0 down to 0.0 and then the creature dies. It can rise above 1.0 if enough food is ingested
+
+Characteristics:
+   does not use inputs
+   provides output value
+   does not require location in body
+]]></description>
+        </element>
+        <element name="ncl_Ch" type="integer" min="0" max="1">
+            <description><![CDATA[Combines all input signals into a single multichannel output; Note: ChSel and ChMux are the only neurons which support multiple channels. Other neurons discard everything except the first channel.
+
+Characteristics:
+   supports any number of inputs
+   provides output value
+   does not require location in body
+]]></description>
+        </element>
+        <element name="ncl_ChMux" type="integer" min="0" max="1">
+            <description><![CDATA[Outputs the selected channel from the second (multichannel) input. The first input is used as the selector value (-1=select first channel, .., 1=last channel)
+
+Characteristics:
+   uses 2 inputs
+   provides output value
+   does not require location in body
+]]></description>
+        </element>
+        <element name="ncl_ChSel" type="integer" min="0" max="1">
+            <description><![CDATA[Outputs a single channel (selected by the "ch" parameter) from multichannel input
+
+Characteristics:
+   uses single input
+   provides output value
+   does not require location in body
+
+
+Properties:
+   channel (ch) integer]]></description>
+        </element>
+        <element name="ncl_Rnd" type="integer" min="0" max="1">
+            <description><![CDATA[Generates random noise (subsequent random values in the range of -1..+1)
+
+Characteristics:
+   does not use inputs
+   provides output value
+   does not require location in body
+]]></description>
+        </element>
+        <element name="ncl_Sin" type="integer" min="0" max="1">
+            <description><![CDATA[Output frequency = f0+input
+
+Characteristics:
+   uses single input
+   provides output value
+   does not require location in body
+
+
+Properties:
+   base frequency (f0) float -1..1 (default 0.0628319)
+   time (t) float 0..6.28319 (default 0)]]></description>
+        </element>
+        <element name="type" type="integer" min="0" max="2" default="1">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="evaluateDistance" function="true" type="float" flags="34">
+            <description>
+                <![CDATA[Calculates dissimilarity between two models created from Geno objects.]]></description>
+            <arguments>
+                <argument type="Geno"/>
+                <argument type="Geno"/>
+            </arguments>
+        </element>
+        <element name="simil_greedy_parts" type="float" min="0" max="100" default="0.0">
+            <description>
+                <![CDATA[Differing number of parts is also handled by the 'part degree' similarity component.]]></description>
+        </element>
+        <element name="simil_greedy_partdeg" type="float" min="0" max="100" default="1.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="simil_greedy_neuro" type="float" min="0" max="100" default="0.1">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="simil_greedy_partgeom" type="float" min="0" max="100" default="0.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="simil_greedy_fixedZaxis" type="integer" min="0" max="1" default="0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="simil_greedy_weightedMDS" type="integer" min="0" max="1" default="0">
+            <description>
+                <![CDATA[If activated, weighted MDS with vertex (i.e., Part) degrees as weights is used for 3D alignment of body structure.]]></description>
+        </element>
+        <element name="simil_parts" type="float" min="0" max="100" default="0.0">
+            <description>
+                <![CDATA[Differing number of parts is also handled by the 'part degree' similarity component.]]></description>
+        </element>
+        <element name="simil_partdeg" type="float" min="0" max="100" default="1.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="simil_neuro" type="float" min="0" max="100" default="0.1">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="simil_partgeom" type="float" min="0" max="100" default="0.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="simil_fixedZaxis" type="integer" min="0" max="1" default="0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="simil_weightedMDS" type="integer" min="0" max="1" default="0">
+            <description>
+                <![CDATA[If activated, weighted MDS with vertex (i.e., Part) degrees as weights is used for 3D alignment of body structure.]]></description>
+        </element>
+        <element name="simil_density" type="float" min="1" max="100" default="10.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="simil_bin_num" type="integer" min="1" max="1000" default="128">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="simil_samples_num" type="integer" min="1" max="1048576" default="1048576">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="calculateSymmetry" function="true" type="float" flags="32">
+            <description><![CDATA[Returns bilateral symmetry (0.0 .. 1.0) for a given Model using default precision parameters (symPosSteps,symAlphaSteps,symBetaSteps). Returns the symmetry plane, too (sets symResultA,B,C,D).
+Note: may take a long time for large creatures.]]></description>
+            <arguments>
+                <argument name="model" type="Model"/>
+            </arguments>
+        </element>
+        <element name="calculateSymmetry2" function="true" type="float" flags="32">
+            <description><![CDATA[Returns bilateral symmetry (0.0 .. 1.0) for a given Model using specified precision parameters. Returns the symmetry plane, too (sets symResultA,B,C,D).
+Note: may take a long time for large creatures.]]></description>
+            <arguments>
+                <argument name="model" type="Model"/>
+                <argument name="posSteps" type="integer"/>
+                <argument name="alphaSteps" type="integer"/>
+                <argument name="betaSteps" type="integer"/>
+            </arguments>
+        </element>
+        <element name="calculateSymmetryForPlane" function="true" type="float" flags="32">
+            <description>
+                <![CDATA[Returns bilateral symmetry (0.0 .. 1.0) for a given Model and given a specific plane defined by coefficients A, B, C, D.]]></description>
+            <arguments>
+                <argument name="model" type="Model"/>
+                <argument name="A" type="float"/>
+                <argument name="B" type="float"/>
+                <argument name="C" type="float"/>
+                <argument name="D" type="float"/>
+            </arguments>
+        </element>
+        <element name="symPosSteps" type="integer" min="2" max="50" default="10">
+            <description><![CDATA[Default number of samples per stick length]]></description>
+        </element>
+        <element name="symAlphaSteps" type="integer" min="2" max="50" default="20">
+            <description><![CDATA[Default number of samples per full angle (#1)]]></description>
+        </element>
+        <element name="symBetaSteps" type="integer" min="2" max="50" default="20">
+            <description><![CDATA[Default number of samples per full angle (#2)]]></description>
+        </element>
+        <element name="symResultA" type="float" flags="35"/>
+        <element name="symResultB" type="float" flags="35"/>
+        <element name="symResultC" type="float" flags="35"/>
+        <element name="symResultD" type="float" flags="35"/>
+        <element name="geom_density" type="float" min="0.01" max="100" default="1.0">
+            <description><![CDATA[Affects the geometry calculation precision]]></description>
+        </element>
+        <element name="forModel" function="true" type="ModelGeometry" flags="32">
+            <description>
+                <![CDATA[The returned ModelGeometry object can be used to calculate geometric properties (volume, area, sizes) of the associated model. The density is copied from the current global ModelGeometry.geom_density on object creation.]]></description>
+            <arguments>
+                <argument type="Model"/>
+            </arguments>
+        </element>
+        <element name="volume" function="true" type="float" flags="288">
+            <arguments/>
+        </element>
+        <element name="area" function="true" type="float" flags="288">
+            <arguments/>
+        </element>
+        <element name="sizesAndAxes" function="true" type="Vector" flags="288">
+            <description><![CDATA[The returned vector contains XYZ (sizes) and Orient (axes) objects.]]></description>
+            <arguments/>
+        </element>
+        <element name="minjoint" type="float" min="0" max="100" default="0.0"/>
+        <element name="maxjoint" type="float" min="0" max="100" default="2.0"/>
+    </type>
+    <type name="SimilMeasure" context="Global context">
+        <description><![CDATA[Evaluates morphological dissimilarity. More information:
+http://www.framsticks.com/bib/Komosinski-et-al-2001
+http://www.framsticks.com/bib/Komosinski-and-Kubiak-2011
+http://www.framsticks.com/bib/Komosinski-2016
+https://doi.org/10.1007/978-3-030-16692-2_8]]></description>
+        <element name="type" type="integer" min="0" max="2" default="1">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="evaluateDistance" function="true" type="float" flags="34">
+            <description>
+                <![CDATA[Calculates dissimilarity between two models created from Geno objects.]]></description>
+            <arguments>
+                <argument type="Geno"/>
+                <argument type="Geno"/>
+            </arguments>
+        </element>
+    </type>
+    <type name="SimilMeasureDistribution" context="Global context">
+        <description><![CDATA[Evaluates morphological dissimilarity using distribution measure.]]></description>
+        <element name="simil_density" type="float" min="1" max="100" default="10.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="simil_bin_num" type="integer" min="1" max="1000" default="128">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="simil_samples_num" type="integer" min="1" max="1048576" default="1048576">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="evaluateDistance" function="true" type="float" flags="34">
+            <description>
+                <![CDATA[Calculates dissimilarity between two models created from Geno objects.]]></description>
+            <arguments>
+                <argument type="Geno"/>
+                <argument type="Geno"/>
+            </arguments>
+        </element>
+    </type>
+    <type name="SimilMeasureGreedy" context="Global context">
+        <description><![CDATA[Evaluates morphological dissimilarity using greedy measure. More information:
+http://www.framsticks.com/bib/Komosinski-et-al-2001
+http://www.framsticks.com/bib/Komosinski-and-Kubiak-2011
+http://www.framsticks.com/bib/Komosinski-2016
+https://doi.org/10.1007/978-3-030-16692-2_8]]></description>
+        <element name="simil_greedy_parts" type="float" min="0" max="100" default="0.0">
+            <description>
+                <![CDATA[Differing number of parts is also handled by the 'part degree' similarity component.]]></description>
+        </element>
+        <element name="simil_greedy_partdeg" type="float" min="0" max="100" default="1.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="simil_greedy_neuro" type="float" min="0" max="100" default="0.1">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="simil_greedy_partgeom" type="float" min="0" max="100" default="0.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="simil_greedy_fixedZaxis" type="integer" min="0" max="1" default="0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="simil_greedy_weightedMDS" type="integer" min="0" max="1" default="0">
+            <description>
+                <![CDATA[If activated, weighted MDS with vertex (i.e., Part) degrees as weights is used for 3D alignment of body structure.]]></description>
+        </element>
+        <element name="evaluateDistance" function="true" type="float" flags="34">
+            <description>
+                <![CDATA[Calculates dissimilarity between two models created from Geno objects.]]></description>
+            <arguments>
+                <argument type="Geno"/>
+                <argument type="Geno"/>
+            </arguments>
+        </element>
+    </type>
+    <type name="SimilMeasureHungarian" context="Global context">
+        <description><![CDATA[Evaluates morphological dissimilarity using hungarian measure. More information:
+http://www.framsticks.com/bib/Komosinski-et-al-2001
+http://www.framsticks.com/bib/Komosinski-and-Kubiak-2011
+http://www.framsticks.com/bib/Komosinski-2016
+https://doi.org/10.1007/978-3-030-16692-2_8]]></description>
+        <element name="simil_parts" type="float" min="0" max="100" default="0.0">
+            <description>
+                <![CDATA[Differing number of parts is also handled by the 'part degree' similarity component.]]></description>
+        </element>
+        <element name="simil_partdeg" type="float" min="0" max="100" default="1.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="simil_neuro" type="float" min="0" max="100" default="0.1">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="simil_partgeom" type="float" min="0" max="100" default="0.0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="simil_fixedZaxis" type="integer" min="0" max="1" default="0">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="simil_weightedMDS" type="integer" min="0" max="1" default="0">
+            <description>
+                <![CDATA[If activated, weighted MDS with vertex (i.e., Part) degrees as weights is used for 3D alignment of body structure.]]></description>
+        </element>
+        <element name="evaluateDistance" function="true" type="float" flags="34">
+            <description>
+                <![CDATA[Calculates dissimilarity between two models created from Geno objects.]]></description>
+            <arguments>
+                <argument type="Geno"/>
+                <argument type="Geno"/>
+            </arguments>
+        </element>
+    </type>
+    <type name="Simulator" context="Global context">
+        <description><![CDATA[The Framsticks simulator.]]></description>
+        <element name="print" function="true" type="void" flags="32">
+            <description><![CDATA[One argument: message to be printed.]]></description>
+            <arguments>
+                <argument name="text" type="string"/>
+            </arguments>
+        </element>
+        <element name="message" function="true" type="void" flags="32">
+            <description><![CDATA[The second argument can be:
+ -1 = debugging message
+ 0 = information
+ 1 = warning
+ 2 = error
+ 3 = critical error]]></description>
+            <arguments>
+                <argument name="text" type="string"/>
+                <argument name="level" type="integer"/>
+            </arguments>
+        </element>
+        <element name="sleep" function="true" type="void" flags="32">
+            <description><![CDATA[Suspends the execution for a specified interval.]]></description>
+            <arguments>
+                <argument name="milliseconds" type="integer"/>
+            </arguments>
+        </element>
+        <element name="beep" function="true" type="void" flags="32">
+            <description><![CDATA[Plays the default system sound.]]></description>
+            <arguments/>
+        </element>
+        <element name="sound" function="true" type="void" flags="32">
+            <description><![CDATA[Generates a simple tone on the speaker]]></description>
+            <arguments>
+                <argument name="freqency in Hz" type="integer"/>
+                <argument name="length in milliseconds" type="integer"/>
+            </arguments>
+        </element>
+        <element name="eval" function="true" type="void" flags="32">
+            <description><![CDATA[The argument must be a complete statement, e.g. "return 2+2;" is valid, while "2+2" is not. The Error object is returned for invalid statements.
+Example:
+var statement="function fun(a) {return a*a;} return fun(Math.pi);";
+var result=Simulator.eval(statement);
+if (typeof result=="Error")
+   Simulator.print("Error:"+result.message);
+else
+   Simulator.print("Result:"+result);]]></description>
+            <arguments>
+                <argument name="script statement" type="string"/>
+            </arguments>
+        </element>
+        <element name="load" function="true" type="void" flags="32">
+            <description>
+                <![CDATA[Load experiment file (calls onExpLoad() in the current experiment definition). This function is intended to replace the simulator state; the old state is cleared by automatically calling "resetToDefaults()". Use "import" if you don't want to lose the old simulator state. Contents can also be loaded from string by using specifically formed filename: "string://string_contents_to_be_loaded".]]></description>
+            <arguments>
+                <argument name="filename" type="string"/>
+            </arguments>
+        </element>
+        <element name="import" function="true" type="void" flags="32">
+            <description><![CDATA[Import some data from file. Contents can also be imported from string by using specifically formed filename: "string://string_contents_to_be_imported".
+The second optional argument selects what section(s) will be imported:
+	1 - experiment (works just like load(), all other bits are ignored, and can reset the simulator state!)
+	2 - genotypes
+	4 - simulator parameters
+	8 - genepool settings
+	16 - population settings
+	32 - new groups will be created for imported genepools and populations
+	64 - allow switching to a different expdef while importing parameters (4)
+	256 - creatures
+
+The standard behavior (without the second argument) is to import genotypes, parameters, and genepool and population settings (2+4+8+16). Note that "64" is not included by default, because the expdef change resets all simulator parameters, which contradicts the usual meaning of "import" in Framsticks ("add data", as opposed to "load" meaning "replace data"). Moreover, using the "64" option in scripts can be dengerous, especially all expdef and show scripts should always declare the proper expdef name in their header rather than change the expdef directly. Without the "64" option, it is always safe to "import" any file in a script regardless of the current simulator state.]]></description>
+            <arguments>
+                <argument name="filename" type="string"/>
+                <argument name="options" type="integer"/>
+            </arguments>
+        </element>
+        <element name="import" function="true" type="void" flags="32">
+            <description>
+                <![CDATA[Equivalent to import(filename,2+4+8+16) - imports genotypes, parameters, genepool and population settings.]]></description>
+            <arguments>
+                <argument name="filename" type="string"/>
+            </arguments>
+        </element>
+        <element name="save" function="true" type="untyped" flags="32">
+            <description>
+                <![CDATA[Save experiment file (calls onExpSave() in the current experiment definition). Providing null filename makes save() return saved data as a text string instead of writing it to the file.]]></description>
+            <arguments>
+                <argument name="filename" type="string"/>
+            </arguments>
+        </element>
+        <element name="export" function="true" type="untyped" flags="32">
+            <description><![CDATA[Save some data to file. Arguments:
+- filename: can be null, which makes export() return saved data as a text string instead of writing it to the file.
+- options: composed of the following bit values:
+	1 - experiment (works just like save() and all other option bits are ignored)
+	2 - genotypes
+	4 - simulator parameters
+	8 - simulator stats
+	16 - genepool settings
+	32 - population settings
+	64 - do autosave
+	256 - creatures
+- selected genepool, -1 means all genepools
+- selected population, -1 means all populations]]></description>
+            <arguments>
+                <argument name="filename" type="string"/>
+                <argument name="options" type="integer"/>
+                <argument name="genepool" type="integer"/>
+                <argument name="population" type="integer"/>
+            </arguments>
+        </element>
+        <element name="start" function="true" type="void" flags="4096">
+            <description><![CDATA[Called by the user interface.]]></description>
+            <arguments/>
+        </element>
+        <element name="stop" function="true" type="void" flags="4096">
+            <description><![CDATA[The expdef script calls this function to stop simulation.]]></description>
+            <arguments/>
+        </element>
+        <element name="running" type="integer" min="0" max="1" flags="4130">
+            <description><![CDATA[Useful for synchronizing the user interface state.]]></description>
+        </element>
+        <element name="stop_on" type="integer" min="0" max="3" default="2">
+            <description>
+                <![CDATA[If the simulation is running and a message is emitted with at least the selected severity, the simulation will be stopped.]]></description>
+        </element>
+        <element name="step" function="true" type="void" flags="32">
+            <arguments/>
+        </element>
+        <element name="time" type="integer" deprecated="true" flags="8226">
+            <description>
+                <![CDATA[Simulator.time will be removed because of its misleading name, please use Simulator.stepNumber instead.]]></description>
+        </element>
+        <element name="last_genotype_num" type="integer" min="0" max="-1" default="0" flags="32">
+            <description><![CDATA[See: Genotype.num]]></description>
+        </element>
+        <element name="last_creature_num" type="integer" min="0" max="-1" default="0" flags="32">
+            <description><![CDATA[See: Creature.num]]></description>
+        </element>
+        <element name="stepNumber" type="integer" flags="34"/>
+        <element name="simspeed" type="integer" flags="4131">
+            <description><![CDATA[steps/second]]></description>
+        </element>
+        <element name="expdef" type="string">
+            <description><![CDATA[Choose the experiment framework
+(in Windows GUI, confirm by pressing 'Apply')
+
+Stop the simulation before selecting another experiment definition.
+It is a good practice to initialize the experiment before running the simulation.]]></description>
+        </element>
+        <element name="expdef_title" type="string" flags="3"/>
+        <element name="expdef_info" type="string" flags="3"/>
+        <element name="init" function="true" type="void">
+            <description><![CDATA[Prepares the experiment for running - usually performs initialization procedures such as resetting counters, states, gene pools, etc.
+These actions are defined in the onInit() function of this experiment definition.]]></description>
+            <arguments/>
+        </element>
+        <element name="loadexpdef" function="true" type="void">
+            <description>
+                <![CDATA[Resets the simulator to its default state, resets all parameters to default values and then loads this experiment definition.]]></description>
+            <arguments/>
+        </element>
+        <element name="usercode" type="string" min="1">
+            <description><![CDATA[You can override any function from the original experiment definition script. Use the same function names and provide alternative implementations.
+Example:
+
+function onBorn(cr)
+{
+  Simulator.print("A creature is born: "+cr.name);
+  super_onBorn(cr); //calls the original implementation
+}]]></description>
+        </element>
+        <element name="autosaveperiod" type="integer" min="0" max="100000">
+            <description><![CDATA[Save simulation state once every n-th event
+(events are defined by the script. For 'standard.expdef' it is after each death).
+Save EXPT file first to initialize name for autosave files.
+Slave simulators (in multithreaded experiments) ignore this setting and never create autosave files.]]></description>
+        </element>
+        <element name="overwrite" type="integer" min="0" max="1" default="0">
+            <description>
+                <![CDATA[Lets you choose what to do when a file is created with the same name as an already existing file: overwite the existing file or create its backup?]]></description>
+        </element>
+        <element name="filecomm" type="integer" min="0" max="1" default="1">
+            <description><![CDATA[Controls displaying comments encountered in opened files.]]></description>
+        </element>
+        <element name="checkpoint" function="true" type="void" flags="32">
+            <description><![CDATA[This function was previously called "autosave".]]></description>
+            <arguments/>
+        </element>
+        <element name="checkpointData" function="true" type="void" flags="32">
+            <description>
+                <![CDATA[In the distributed/paralellized scenario the data passed as argument can be received by the controlling entity (onSlaveCheckpoint in multithreaded master experiment, /simulator/expevent in distributed network simulator).]]></description>
+            <arguments>
+                <argument name="any_data" type="untyped"/>
+            </arguments>
+        </element>
+        <element name="lastCheckpoint" type="untyped" flags="35">
+            <description><![CDATA[Most recently reported by the experiment definition script.]]></description>
+        </element>
+        <element name="resetToDefaults" function="true" type="void">
+            <description>
+                <![CDATA[Clears groups and loads default values for simulator parameters, then calls onExpDefLoad() of the current experiment definition.]]></description>
+            <arguments/>
+        </element>
+        <element name="createrr" type="integer" min="0" max="2" default="1"/>
+        <element name="groupchk" type="integer" min="0" max="1" default="1">
+            <description>
+                <![CDATA[Warnings will be printed when invalid genotypes are added to a gene pool.]]></description>
+        </element>
+        <element name="creatwarnfail" type="integer" min="0" max="1">
+            <description>
+                <![CDATA[Creatures grown with warnings will not be simulated. This helps prevent the propagation of faulty genes, because genotypes that cause warnings when interpreted will not reproduce.]]></description>
+        </element>
+        <element name="vmdebug" type="integer" min="0" max="1"/>
+        <element name="vm_step_limit" type="integer" min="0" max="1000000000" default="0">
+            <description>
+                <![CDATA[Abort any script (expdef, fitness formula, user script) when it performs too many operations - which can take more or less time depending on your machine performance. This can protect against infinite loops or unbearably long runs of untested scripts that would otherwise force you to kill the whole application. Use Simulator.vm_..._warning if you only need information about what script takes too much time without aborting it.]]></description>
+        </element>
+        <element name="vm_step_warning" type="integer" min="0" max="1000000000" default="0">
+            <description>
+                <![CDATA[Display a warning when any script (expdef, fitness formula, user script) performs too many operations - which can take more or less time depending on your machine performance. Use Simulator.vm_..._limit to prevent the application from becoming unresponsive by aborting misbehaving scripts.]]></description>
+        </element>
+        <element name="vm_time_limit" type="float" min="0" max="1e+09" default="0.0">
+            <description>
+                <![CDATA[Abort any script (expdef, fitness formula, user script) when it takes too much time - measured in seconds. The actual amount of work depends on your machine performance. This can protect against infinite loops or unbearably long runs of untested scripts that would otherwise force you to kill the whole application. Use Simulator.vm_..._warning if you only need information about what script takes too much time without aborting it.]]></description>
+        </element>
+        <element name="vm_time_warning" type="float" min="0" max="1e+09" default="0.0">
+            <description>
+                <![CDATA[Display a warning when any script (expdef, fitness formula, user script) takes too much time - measured in seconds. The actual amount of work depends on your machine performance. Use Simulator.vm_..._limit to prevent the application from becoming unresponsive by aborting misbehaving scripts.]]></description>
+        </element>
+        <element name="new" function="true" type="Simulator" flags="32">
+            <arguments/>
+        </element>
+        <element name="slaves" type="SlaveSimulators" flags="35"/>
+        <element name="cpus" type="integer" flags="35"/>
+        <element name="world" type="World" flags="35"/>
+        <element name="populations" type="Populations" flags="35"/>
+        <element name="genepools" type="GenePools" flags="35"/>
+        <element name="expproperties" type="ExpProperties" flags="35"/>
+        <element name="expstate" type="ExpState" flags="35"/>
+        <element name="genman" type="GenMan" flags="35"/>
+        <element name="reloadNeurons" function="true" type="void" flags="32">
+            <arguments/>
+        </element>
+        <element name="userdata" type="untyped" flags="34"/>
+        <element name="identity" type="integer" flags="35">
+            <description><![CDATA[-1 for master simulator, 0...count-1 for slaves]]></description>
+        </element>
+        <element name="refreshGUI" function="true" type="void" flags="32">
+            <description><![CDATA[Notify that all populations and gene pools content changed.]]></description>
+            <arguments/>
+        </element>
+        <element name="version_string" type="string" flags="35">
+            <description><![CDATA[Current application version as a string (human-friendly).]]></description>
+        </element>
+        <element name="version_int" type="integer" flags="33">
+            <description><![CDATA[Current application version as an integer.]]></description>
+        </element>
+    </type>
+    <type name="SlaveSimulators" context="Global context">
+        <description><![CDATA[This is a vector of slave Simulator objects. More details in:
+http://www.framsticks.com/bib/Komosinski-and-Ulatowski-2013r
+http://www.framsticks.com/bib/Komosinski-and-Ulatowski-2016]]></description>
+        <element name="size" type="integer" min="0" max="50">
+            <description>
+                <![CDATA[Changing this value will create/remove slave simulator objects as needed.]]></description>
+        </element>
+        <element name="get" function="true" type="Simulator">
+            <description><![CDATA[Access the slave simulator object (Simulator.slaves[index] works, too).
+Important: Do not operate on a simulator that is currently running, always stop() it first.]]></description>
+            <arguments>
+                <argument name="index" type="integer"/>
+            </arguments>
+        </element>
+        <element name="running" type="integer" flags="1">
+            <description>
+                <![CDATA[Note that if running>0 then the number of running simulations can be outdated in the very moment you read this field, because the expdef can stop itself anytime. If running==0, then it is guaranteed to stay 0 until someone calls start() on some of the slave simulator objects.]]></description>
+        </element>
+        <element name="create" function="true" type="Simulator">
+            <description>
+                <![CDATA[If you need to create AND store the reference to a newly created simulator object, then this function may be more readable than var s=Simulator.slaves[Simulator.slaves.size++];]]></description>
+            <arguments/>
+        </element>
+        <element name="remove" function="true" type="void">
+            <description>
+                <![CDATA[Also calls stop() if the simulator is running. Events assocated with the simulator being deleted are cancelled, so the expdef will not see the usual onSlaveStop.]]></description>
+            <arguments>
+                <argument name="slave index or slave Simulator object reference" type="untyped"/>
+            </arguments>
+        </element>
+        <element name="removeAll" function="true">
+            <description><![CDATA[Same as Simulator.slaves=0;]]></description>
+        </element>
+        <element name="startAll" function="true"/>
+        <element name="stopAll" function="true"/>
+        <element name="cancelEventsFromSlave" function="true" type="void">
+            <description>
+                <![CDATA[If the onSlaveStop() event is used to schedule work to a simulator, then you might want to cancel pending events when the experiment is aborted - otherwise it may be difficult to distinguish between self-stop events (called internally from the slave simulator to signal the job was completed) from abort-stop events (requested by the supervising simulator). Calling Simulator.slaves.stopAll(); Simulator.slaves.cancelAllEvents(); makes sure that no old events will be detected after that time point. Without cancelling, the old onSlaveStop() notification (the consequence of the abort-stop) might arrive after the next start() which may confuse the expdef code (slave events are asynchronous).]]></description>
+            <arguments>
+                <argument type="Simulator"/>
+            </arguments>
+        </element>
+        <element name="cancelAllEvents" function="true">
+            <description><![CDATA[see cancelEventsFromSlave()]]></description>
+        </element>
+        <element name="isolation" type="integer" min="0" max="1" default="1">
+            <description><![CDATA[Slave simulator access is filtered to exclude object references across simulator boundaries and ensure a safe multithreaded operation.
+1. Slave simulations objects can't be accessed from master while the slave simulator is running (except for Simulator.stop/start/running).
+2. Master simulator objects can't be passed to slave simulators
+3. Data objects (Vectors and Dictionaries) are passed by value rather than by reference (to make sure that no simulator contains a reference to another simulator's data).
+Setting isolation=0 disables these restrictions, which can lead to unpredictable results or crashes, but is sometimes useful for inspecting true object relationships.
+  Sample cases:
+Simulator.slaves[0].stop(); - always permitted
+Simulator.slaves[0].expdef="prime"; - permitted if the slave simulator is not running
+var vec=[1,2,3]; Simulator.slaves[0].user=vec; vec.clear(); - vec has changed, user field is still [1,2,3]
+var vec=[1,2,GenePools[0]]; Simulator.slaves[0].user=vec; - user field becomes [1,2,null] (because master's GenePool object can't be passed to the slave)
+var g=Simulator.slaves[0].genepools[0][0].genotype; - but the slave's GenePool can be accessed from master (if the slave is not running at the moment)]]></description>
+        </element>
+    </type>
+    <type name="stats" context="Global context">
+        <element name="gen_count" type="integer" flags="1">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="gen_mvalid" type="integer" flags="1">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="gen_mvalidated" type="integer" flags="1">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="gen_minvalid" type="integer" flags="1">
+            <description><![CDATA[couldn't be repaired]]></description>
+        </element>
+        <element name="gen_mfailed" type="integer" flags="1">
+            <description><![CDATA[couldn't be performed]]></description>
+        </element>
+        <element name="gen_xovalid" type="integer" flags="1">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="gen_xovalidated" type="integer" flags="1">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="gen_xoinvalid" type="integer" flags="1">
+            <description><![CDATA[couldn't be repaired]]></description>
+        </element>
+        <element name="gen_xofailed" type="integer" flags="1">
+            <description><![CDATA[couldn't be performed]]></description>
+        </element>
+        <element name="gen_mutimpr" type="float" flags="1">
+            <description><![CDATA[total cumulative mutation change]]></description>
+        </element>
+        <element name="gen_xoimpr" type="float" flags="1">
+            <description><![CDATA[total cumulative crossover change]]></description>
+        </element>
+        <element name="clrstats" function="true" type="void" flags="2">
+            <description><![CDATA[]]></description>
+            <arguments/>
+        </element>
+        <element name="_propertyClear" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Using most _property functions is restricted for internal purposes. Use "property:" or "state:" definitions in your script files to change object properties.]]></description>
+            <arguments/>
+        </element>
+        <element name="_propertyAdd" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Using most _property functions is restricted for internal purposes. Use "property:" or "state:" definitions in your script files to change object properties.]]></description>
+            <arguments>
+                <argument name="id" type="string"/>
+                <argument name="type description" type="string"/>
+                <argument name="name" type="string"/>
+                <argument name="flags" type="integer"/>
+                <argument name="help text" type="string"/>
+            </arguments>
+        </element>
+        <element name="_propertyRemove" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Using most _property functions is restricted for internal purposes. Use "property:" or "state:" definitions in your script files to change object properties.]]></description>
+            <arguments>
+                <argument name="index" type="integer"/>
+            </arguments>
+        </element>
+        <element name="_propertyChange" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Using most _property functions is restricted for internal purposes. Use "property:" or "state:" definitions in your script files to change object properties.]]></description>
+            <arguments>
+                <argument name="id" type="string"/>
+                <argument name="type description" type="string"/>
+                <argument name="name" type="string"/>
+                <argument name="flags" type="integer"/>
+                <argument name="help text" type="string"/>
+            </arguments>
+        </element>
+        <element name="_propertyAddGroup" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Using most _property functions is restricted for internal purposes. Use "property:" or "state:" definitions in your script files to change object properties.]]></description>
+            <arguments>
+                <argument name="name" type="string"/>
+            </arguments>
+        </element>
+        <element name="_propertyRemoveGroup" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Using most _property functions is restricted for internal purposes. Use "property:" or "state:" definitions in your script files to change object properties.]]></description>
+            <arguments>
+                <argument name="index" type="integer"/>
+            </arguments>
+        </element>
+        <element name="_propertyExists" function="true" type="integer" flags="34">
+            <arguments>
+                <argument name="name" type="string"/>
+            </arguments>
+        </element>
+        <element name="_property_changed_index" type="integer" flags="35"/>
+        <element name="_property_changed_id" type="string" flags="35"/>
+        <element name="st_count" type="integer" flags="1"/>
+        <element name="st_min_numparts" type="float" flags="65"/>
+        <element name="st_avg_numparts" type="float" flags="65"/>
+        <element name="st_max_numparts" type="float" flags="65"/>
+        <element name="st_min_numjoints" type="float" flags="65"/>
+        <element name="st_avg_numjoints" type="float" flags="65"/>
+        <element name="st_max_numjoints" type="float" flags="65"/>
+        <element name="st_min_numneurons" type="float" flags="65"/>
+        <element name="st_avg_numneurons" type="float" flags="65"/>
+        <element name="st_max_numneurons" type="float" flags="65"/>
+        <element name="st_min_numconnections" type="float" flags="65"/>
+        <element name="st_avg_numconnections" type="float" flags="65"/>
+        <element name="st_max_numconnections" type="float" flags="65"/>
+        <element name="st_min_num" type="float" flags="65"/>
+        <element name="st_avg_num" type="float" flags="65"/>
+        <element name="st_max_num" type="float" flags="65"/>
+        <element name="st_min_gnum" type="float" flags="65"/>
+        <element name="st_avg_gnum" type="float" flags="65"/>
+        <element name="st_max_gnum" type="float" flags="65"/>
+        <element name="st_min_instances" type="float" flags="65"/>
+        <element name="st_avg_instances" type="float" flags="65"/>
+        <element name="st_max_instances" type="float" flags="65"/>
+        <element name="st_min_lifespan" type="float" flags="65"/>
+        <element name="st_avg_lifespan" type="float" flags="65"/>
+        <element name="st_max_lifespan" type="float" flags="65"/>
+        <element name="st_min_velocity" type="float" flags="65"/>
+        <element name="st_avg_velocity" type="float" flags="65"/>
+        <element name="st_max_velocity" type="float" flags="65"/>
+        <element name="st_min_distance" type="float" flags="65"/>
+        <element name="st_avg_distance" type="float" flags="65"/>
+        <element name="st_max_distance" type="float" flags="65"/>
+        <element name="st_min_vertvel" type="float" flags="65"/>
+        <element name="st_avg_vertvel" type="float" flags="65"/>
+        <element name="st_max_vertvel" type="float" flags="65"/>
+        <element name="st_min_vertpos" type="float" flags="65"/>
+        <element name="st_avg_vertpos" type="float" flags="65"/>
+        <element name="st_max_vertpos" type="float" flags="65"/>
+        <element name="st_min_fit" type="float" flags="65"/>
+        <element name="st_avg_fit" type="float" flags="65"/>
+        <element name="st_max_fit" type="float" flags="65"/>
+        <element name="st_min_fit2" type="float" flags="65"/>
+        <element name="st_avg_fit2" type="float" flags="65"/>
+        <element name="st_max_fit2" type="float" flags="65"/>
+        <element name="st_min_c_velocity" type="float" flags="65"/>
+        <element name="st_avg_c_velocity" type="float" flags="65"/>
+        <element name="st_max_c_velocity" type="float" flags="65"/>
+        <element name="st_min_c_vertvelocity" type="float" flags="65"/>
+        <element name="st_avg_c_vertvelocity" type="float" flags="65"/>
+        <element name="st_max_c_vertvelocity" type="float" flags="65"/>
+        <element name="st_min_c_vertpos" type="float" flags="65"/>
+        <element name="st_avg_c_vertpos" type="float" flags="65"/>
+        <element name="st_max_c_vertpos" type="float" flags="65"/>
+        <element name="st_min_pos_x" type="float" flags="65"/>
+        <element name="st_avg_pos_x" type="float" flags="65"/>
+        <element name="st_max_pos_x" type="float" flags="65"/>
+        <element name="st_min_pos_y" type="float" flags="65"/>
+        <element name="st_avg_pos_y" type="float" flags="65"/>
+        <element name="st_max_pos_y" type="float" flags="65"/>
+        <element name="st_min_pos_z" type="float" flags="65"/>
+        <element name="st_avg_pos_z" type="float" flags="65"/>
+        <element name="st_max_pos_z" type="float" flags="65"/>
+        <element name="st_min_size_x" type="float" flags="65"/>
+        <element name="st_avg_size_x" type="float" flags="65"/>
+        <element name="st_max_size_x" type="float" flags="65"/>
+        <element name="st_min_size_y" type="float" flags="65"/>
+        <element name="st_avg_size_y" type="float" flags="65"/>
+        <element name="st_max_size_y" type="float" flags="65"/>
+        <element name="st_min_size_z" type="float" flags="65"/>
+        <element name="st_avg_size_z" type="float" flags="65"/>
+        <element name="st_max_size_z" type="float" flags="65"/>
+        <element name="st_min_center_x" type="float" flags="65"/>
+        <element name="st_avg_center_x" type="float" flags="65"/>
+        <element name="st_max_center_x" type="float" flags="65"/>
+        <element name="st_min_center_y" type="float" flags="65"/>
+        <element name="st_avg_center_y" type="float" flags="65"/>
+        <element name="st_max_center_y" type="float" flags="65"/>
+        <element name="st_min_center_z" type="float" flags="65"/>
+        <element name="st_avg_center_z" type="float" flags="65"/>
+        <element name="st_max_center_z" type="float" flags="65"/>
+    </type>
+    <type name="StopEvent" context="Global context">
+        <description><![CDATA[Used in onSlaveStop() which is called when a Slave Simulator is stopped.]]></description>
+        <element name="index" type="integer" flags="1"/>
+        <element name="slave" type="Simulator" flags="1"/>
+    </type>
+    <type name="String" context="Global context">
+        <description><![CDATA[String functions library.]]></description>
+        <element name="len" function="true" type="integer">
+            <description><![CDATA[String.len("abcdef") == 6]]></description>
+            <arguments>
+                <argument type="string"/>
+            </arguments>
+        </element>
+        <element name="replace" function="true" type="string">
+            <description><![CDATA[String.replace("abcdef","cd","X") == "abXef"]]></description>
+            <arguments>
+                <argument name="input_string" type="string"/>
+                <argument name="search" type="string"/>
+                <argument name="substitute" type="string"/>
+            </arguments>
+        </element>
+        <element name="split" function="true" type="Vector">
+            <description><![CDATA[return the vector of substrings, cut at separator positions.
+subsequent separators give empty words:
+split("word1---word2-word3","-") returns ["word1","","","word2","word3"]]]></description>
+            <arguments>
+                <argument name="text to split" type="string"/>
+                <argument name="word separator" type="string"/>
+            </arguments>
+        </element>
+        <element name="split2" function="true" type="Vector">
+            <description><![CDATA[return the vector of substrings, cut at separator positions.
+subsequent separators are treated as one:
+split2("word1---word2-word3","-") returns ["word1","word2","word3"]]]></description>
+            <arguments>
+                <argument name="text to split" type="string"/>
+                <argument name="word separator" type="string"/>
+            </arguments>
+        </element>
+        <element name="indexOf" function="true" type="integer">
+            <description><![CDATA[String.indexOf("abcdef","cd") == 2
+String.indexOf("abcdef","dc") == -1
+]]></description>
+            <arguments>
+                <argument type="string"/>
+                <argument name="substring" type="string"/>
+            </arguments>
+        </element>
+        <element name="indexOfStart" function="true" type="integer">
+            <description><![CDATA[String.indexOfStart("abcdef","cd",1) == 2
+String.indexOfStart("abcdef","cd",3) == -1
+]]></description>
+            <arguments>
+                <argument type="string"/>
+                <argument name="substring" type="string"/>
+                <argument name="start index" type="integer"/>
+            </arguments>
+        </element>
+        <element name="substr" function="true" type="string">
+            <description><![CDATA[String.substr("abcdef",3,2) == "de"]]></description>
+            <arguments>
+                <argument type="string"/>
+                <argument name="first character" type="integer"/>
+                <argument name="number of characters" type="integer"/>
+            </arguments>
+        </element>
+        <element name="substr" function="true" type="string">
+            <description><![CDATA[String.substr("abcdef",3) == "def"]]></description>
+            <arguments>
+                <argument type="string"/>
+                <argument name="first character" type="integer"/>
+            </arguments>
+        </element>
+        <element name="left" function="true" type="string">
+            <description><![CDATA[String.left("abcdef",3) == "abc"]]></description>
+            <arguments>
+                <argument type="string"/>
+                <argument name="number of characters" type="integer"/>
+            </arguments>
+        </element>
+        <element name="right" function="true" type="string">
+            <description><![CDATA[String.right("abcdef",3) == "def"]]></description>
+            <arguments>
+                <argument type="string"/>
+                <argument name="number of characters" type="integer"/>
+            </arguments>
+        </element>
+        <element name="trim" function="true" type="string">
+            <arguments>
+                <argument type="string"/>
+            </arguments>
+        </element>
+        <element name="startsWith" function="true" type="integer">
+            <arguments>
+                <argument name="string" type="string"/>
+                <argument name="substring" type="string"/>
+            </arguments>
+        </element>
+        <element name="endsWith" function="true" type="integer">
+            <arguments>
+                <argument name="string" type="string"/>
+                <argument name="substring" type="string"/>
+            </arguments>
+        </element>
+        <element name="format" function="true" type="string">
+            <description><![CDATA[Works like the standard C library "sprintf()". The '%' operator can be used as a shortcut, e.g. String.format("%x",123) is equivalent of "%x" % 123
+Character seqences beginning with % found in the format string are replaced by formatted values produced according to their corresponding format specifiers: %[-][+][0][width[.precision]]type
+ -: left adjust (default is right adjust)
+ +: place a sign (+ or -) before a number
+ 0: the value should be zero padded
+ width: minimum field width
+ precision: minimum number of decimal digits
+ type: d=decimal integer, x/X=hexadecimal integer, f/g=floating point number, e="scientific" style floating point, c=character of a given ascii code, t=time, %=special case, outputs the literal % character
+Multiple values can be formatted in one call, by passing a vector as the second argument:
+String.format("a=%03d b=%.2f c=%s",[a,b,c]) or "a=%03d b=%.2f c=%s" % [a,b,c]
+Alternatively, if no % characters are required in the output string, the chained call can be used:
+"a=%03d b=%.2f c=%s" % a % b % c
+The above expression works as expected, because, unlike the regular sprintf, the formatting function preserves % characters left after using all input arguments:
+ input:          "a=%03d b=%.2f c=%s" % a % b % c
+ actual meaning: (("a=%03d b=%.2f c=%s" % a) % b) % c
+ phase 1:        ("a=000 b=%.2f c=%s" % b) % c
+ phase 2:        "a=000 b=0.00 c=%s" % c
+ result:         "a=000 b=0.00 c=0"
+
+Examples:
+ String.format("|%07.2f|",Math.pi) == "|0003.14|"
+ String.format("|%04x|",255) == "|00ff|"
+ String.format("|%7s|","text") == "|   text|"
+ String.format("|%-7d|",12345) == "|12345  |"
+ String.format("%t",Math.time) == "Sun Apr 29 19:22:02 2007"
+ String.format("%T",Math.time) == "2007-05-29 19:22:02"
+ String.format("x=%d%%",100) == "100%"]]></description>
+            <arguments>
+                <argument name="format_string" type="string"/>
+                <argument name="value_or_vector" type="untyped"/>
+            </arguments>
+        </element>
+        <element name="parseInt" function="true" type="integer">
+            <description>
+                <![CDATA[If the supplied string is not an integer, returns 0 and posts an error message.]]></description>
+            <arguments>
+                <argument type="string"/>
+            </arguments>
+        </element>
+        <element name="parseFloat" function="true" type="float">
+            <description>
+                <![CDATA[If the supplied string is not a number, returns 0.0 and posts an error message.]]></description>
+            <arguments>
+                <argument type="string"/>
+            </arguments>
+        </element>
+        <element name="parseNumber" function="true" type="untyped">
+            <description><![CDATA[Returns an integer, a floating point, or null if the string cannot be parsed as a number.
+The 'typeof' operator can be used to distinguish between an integer and a floating point value:
+typeof(String.parseNumber("qwerty")) == "null"
+typeof(String.parseNumber("1234")) == "int"
+typeof(String.parseNumber("3.14")) == "float"]]></description>
+            <arguments>
+                <argument type="string"/>
+            </arguments>
+        </element>
+        <element name="code" function="true" type="integer">
+            <arguments>
+                <argument type="string"/>
+            </arguments>
+        </element>
+        <element name="char" function="true" type="string">
+            <arguments>
+                <argument type="integer"/>
+            </arguments>
+        </element>
+        <element name="toUpper" function="true" type="string">
+            <arguments>
+                <argument type="string"/>
+            </arguments>
+        </element>
+        <element name="toLower" function="true" type="string">
+            <arguments>
+                <argument type="string"/>
+            </arguments>
+        </element>
+        <element name="serialize" function="true" type="string">
+            <description><![CDATA[Converts to textual representation, preserving object hierarchy.]]></description>
+            <arguments>
+                <argument type="untyped"/>
+            </arguments>
+        </element>
+        <element name="deserialize" function="true" type="untyped">
+            <description><![CDATA[Extracts objects from textual representation. Error object is returned if deserialization fails.
+Example:
+var ret=String.deserialize(something);
+if (typeof(ret)=="Error") Simulator.print("something is wrong: "+ret.message);]]></description>
+            <arguments>
+                <argument type="string"/>
+            </arguments>
+        </element>
+        <element name="toJSON" function="true" type="string">
+            <description>
+                <![CDATA[Exports to JSON format, preserving object hierarchy (excluding recursion).]]></description>
+            <arguments>
+                <argument type="untyped"/>
+            </arguments>
+        </element>
+        <element name="hash" function="true" type="integer">
+            <arguments>
+                <argument type="string"/>
+            </arguments>
+        </element>
+        <element name="diff" function="true" type="Vector">
+            <description><![CDATA[Returns the vector of minimal differences between two strings. The vector contains either 2-element subvectors with differing substrings ["text-1","text-2"] or strings "same".
+
+For example, String.diff("thisisatest", "testing123testing") returns [t,[hi,e],s,[,t],i,[sa,ng123],test,[,ing]].
+
+Use this function for short strings, as it requires 4*length(string1)*length(string2) bytes of memory.]]></description>
+            <arguments>
+                <argument type="string"/>
+                <argument type="string"/>
+            </arguments>
+        </element>
+        <element name="SERIALIZATION_PREFIX" type="string" flags="1">
+            <description>
+                <![CDATA[String prefix used in the Framsticks file format to indicate object fields that contain serialized objects.]]></description>
+        </element>
+        <element name="ESC" type="string" flags="1"/>
+        <element name="NBSP" type="string" flags="1"/>
+    </type>
+    <type name="UserScripts" context="Global context">
+        <element name="_propertyClear" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Using most _property functions is restricted for internal purposes. Use "property:" or "state:" definitions in your script files to change object properties.]]></description>
+            <arguments/>
+        </element>
+        <element name="_propertyAdd" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Using most _property functions is restricted for internal purposes. Use "property:" or "state:" definitions in your script files to change object properties.]]></description>
+            <arguments>
+                <argument name="id" type="string"/>
+                <argument name="type description" type="string"/>
+                <argument name="name" type="string"/>
+                <argument name="flags" type="integer"/>
+                <argument name="help text" type="string"/>
+            </arguments>
+        </element>
+        <element name="_propertyRemove" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Using most _property functions is restricted for internal purposes. Use "property:" or "state:" definitions in your script files to change object properties.]]></description>
+            <arguments>
+                <argument name="index" type="integer"/>
+            </arguments>
+        </element>
+        <element name="_propertyChange" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Using most _property functions is restricted for internal purposes. Use "property:" or "state:" definitions in your script files to change object properties.]]></description>
+            <arguments>
+                <argument name="id" type="string"/>
+                <argument name="type description" type="string"/>
+                <argument name="name" type="string"/>
+                <argument name="flags" type="integer"/>
+                <argument name="help text" type="string"/>
+            </arguments>
+        </element>
+        <element name="_propertyAddGroup" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Using most _property functions is restricted for internal purposes. Use "property:" or "state:" definitions in your script files to change object properties.]]></description>
+            <arguments>
+                <argument name="name" type="string"/>
+            </arguments>
+        </element>
+        <element name="_propertyRemoveGroup" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Using most _property functions is restricted for internal purposes. Use "property:" or "state:" definitions in your script files to change object properties.]]></description>
+            <arguments>
+                <argument name="index" type="integer"/>
+            </arguments>
+        </element>
+        <element name="_propertyExists" function="true" type="integer" flags="34">
+            <arguments>
+                <argument name="name" type="string"/>
+            </arguments>
+        </element>
+        <element name="_property_changed_index" type="integer" flags="35"/>
+        <element name="_property_changed_id" type="string" flags="35"/>
+    </type>
+    <type name="Vector" context="Global context">
+        <description><![CDATA[Vector is a 1-dimensional array indexed by an integer value (starting from 0). Multidimensional arrays can be simulated by putting other Vector objects into a Vector.
+Examples:
+	var v1=Vector.new();
+	v1.add(123);
+	v1.add("string");
+A short way of doing the same (square brackets create a vector):
+	var v2=[123,"string"];
+Simulate a 2D array:
+	var v3=[[1,2,3],[4,5],[6]];
+You can iterate directly over values of a Vector using for(...in...) loops:
+	for(var element in v3) Simulator.print(element);]]></description>
+        <element name="clear" function="true" type="void" flags="256">
+            <arguments/>
+        </element>
+        <element name="size" type="integer" flags="257"/>
+        <element name="remove" function="true" type="void" flags="256">
+            <arguments>
+                <argument name="position" type="integer"/>
+            </arguments>
+        </element>
+        <element name="get" function="true" type="untyped" flags="256">
+            <description><![CDATA[object[position] can be always used instead of object.get(position)]]></description>
+            <arguments>
+                <argument name="position" type="integer"/>
+            </arguments>
+        </element>
+        <element name="set" function="true" type="void" flags="256">
+            <description>
+                <![CDATA[object[position]=value can be always used instead of object.set(position,value)]]></description>
+            <arguments>
+                <argument name="position" type="integer"/>
+                <argument name="value" type="untyped"/>
+            </arguments>
+        </element>
+        <element name="insert" function="true" type="void" flags="256">
+            <arguments>
+                <argument name="position" type="integer"/>
+                <argument name="value" type="untyped"/>
+            </arguments>
+        </element>
+        <element name="add" function="true" type="void" flags="256">
+            <arguments>
+                <argument name="value" type="untyped"/>
+            </arguments>
+        </element>
+        <element name="find" function="true" type="integer" flags="256">
+            <description><![CDATA[returns the element index or -1 if not found]]></description>
+            <arguments>
+                <argument name="value" type="untyped"/>
+            </arguments>
+        </element>
+        <element name="avg" type="untyped" flags="257"/>
+        <element name="stdev" type="untyped" flags="257">
+            <description>
+                <![CDATA[=sqrt(sum((element[i]-avg)^2)/(size-1)) which is estimated population std.dev. from sample std.dev.]]></description>
+        </element>
+        <element name="toString" type="string" flags="257"/>
+        <element name="new" function="true" type="Vector">
+            <arguments/>
+        </element>
+        <element name="sort" function="true" type="void" flags="256">
+            <description><![CDATA[comparator can be null, giving the "natural" sorting order (depending on element type), otherwise it must be a function reference obtained from the 'function' operator.
+
+Example:
+function compareLastDigit(a,b) {return (a%10)<(b%10);}
+var v=[16,23,35,42,54,61];
+v.sort(function compareLastDigit);]]></description>
+            <arguments>
+                <argument name="comparator" type="FunctionReference"/>
+            </arguments>
+        </element>
+        <element name="iterator" type="Object" flags="257"/>
+        <element name="clone" function="true" type="Vector" flags="256">
+            <description>
+                <![CDATA[The resulting clone is a shallow copy (contains the same object references as the original). A deep copy can be obtained through serialization: String.deserialize(String.serialize(object));]]></description>
+            <arguments/>
+        </element>
+    </type>
+    <type name="WireframeAppearance" context="Global context">
+        <description>
+            <![CDATA[This object defines appearance of the elements of creatures (applies to the 'wireframe' display mode). Default shape definitions make food's "p:" look like a sphere, and manipulator's "p:" look like a robot hand. The model's Vstyle property is the name of the shape. Developers of experiment definitions can introduce new Vstyle(s) for their expdef and provide appropriate shape definitions by calling WireframeAppearance.set(...) in the onExpDefLoad() function.]]></description>
+        <element name="set" function="true" type="void">
+            <description><![CDATA[Arguments:
+
+- "id" - can be
+  "1p_STYLENAME": affects a single-Part creature (without Joints)
+  "p_STYLENAME": affects all normal Parts
+  "j_STYLENAME": affects Joints
+     (STYLENAME corresponds to the Model.Vstyle value, and it can be empty).
+
+- "definition" is a genotype describing the object shape
+
+- "color" can be 0xRRGGBB or one of the special values: -3 = default creature color, -4 = default food color, -5 = default manipulator color
+
+Examples:
+WireframeAppearance.set("j_predator","X",0xff0000);//make all predators (i.e. creatures with Vstyle=predator) red
+WireframeAppearance.set("1p_food","...some...genotype...",-4);//change food appearance
+WireframeAppearance.set("p_","//0\np:0,0,0\np:-0.1,0,0\np:0.1,0,0\np:0,-0.1,0\np:0,0.1,0\np:0,0,-0.1\np:0,0,0.1\nj:0,1\nj:0,2\nj:0,3\nj:0,4\nj:0,5\nj:0,6\n",0);//make Parts' orientation axes visible]]></description>
+            <arguments>
+                <argument name="id" type="string"/>
+                <argument name="definition" type="string"/>
+                <argument name="color" type="integer"/>
+            </arguments>
+        </element>
+        <element name="clear" function="true" type="void">
+            <arguments/>
+        </element>
+    </type>
+    <type name="World" context="Global context">
+        <description><![CDATA[Environment properties.]]></description>
+        <element name="wrldtyp" type="integer" min="0" max="2" default="0"/>
+        <element name="wrldsiz" type="float" min="10" max="10000" default="20.0">
+            <description><![CDATA[Side length of the world]]></description>
+        </element>
+        <element name="wrldmap" type="string">
+            <description><![CDATA[Description of the world (only applies to world types: "Blocks" or "Height field").
+To generate a random landscape, use:
+   r[scaling] <sizex> <sizey> [seed]
+To generate a custom landscape, provide height values:
+   m[scaling] <sizex> <sizey> digits...
+ or
+   M[scaling] <sizex> <sizey> numbers...
+
+"digits..." is a sequence of integer values 0,1,2,..,9. You may also use '-' and '|' characters for smooth slides between blocks.
+"numbers..." is a sequence of floating point values, so the "M" option provides more freedom.
+[scaling] is an optional linear scaling expression in the form of *FACTOR+OFFSET or *FACTOR-OFFSET, for example "r*0.1-2 5 5" creates a 5x5 random map with a 10% amplitude, shifted down by 2.
+
+See also the WorldMap object.]]></description>
+        </element>
+        <element name="wrldwat" type="float" min="-20" max="200" default="-1.0"/>
+        <element name="wrldbnd" type="integer" min="0" max="2" default="0">
+            <description>
+                <![CDATA[Teleporting a creature that is outside of the world area is attempted every 'performance sampling period' steps. Teleport succeeds only when the target location in the world is empty (there is no collision).]]></description>
+        </element>
+        <element name="wrldg" type="float" min="0" max="10" default="1.0">
+            <description><![CDATA[You can adjust gravity for your experiments.
+The "official" setting used to evaluate and compare creatures is 1.]]></description>
+        </element>
+        <element name="wrldchg" function="true" type="void" flags="32">
+            <arguments/>
+        </element>
+        <element name="simtype" type="integer" min="0" max="1" default="0">
+            <description><![CDATA[MechaStick is a fast and simple primary Framsticks simulation engine.
+ODE is Open Dynamics Engine by Russel Smith et al.
+
+NOTE: switching between simulation engines causes removal of all objects in the world (e.g. creatures).]]></description>
+        </element>
+        <element name="nnspeed" type="float" min="0" max="1000" default="1.0">
+            <description>
+                <![CDATA[Number of neural network simulation steps in each physics simulation step]]></description>
+        </element>
+        <element name="rndcollisions" type="integer" min="0" max="1" default="1">
+            <description>
+                <![CDATA[When enabled, custom collision handlers are invoked in random order. This can help remove unfair bias in some experiments - for example where the same collision order in each simulation step would cause some creatures colliding with food to consume energy while other colliding creatures would starve.]]></description>
+        </element>
+        <element name="signals" type="WorldSignals" flags="35"/>
+    </type>
+    <type name="WorldMap" context="Global context">
+        <description><![CDATA[Environment details for "Blocks" and "Heightfield" world type. The most important concept is a "Map", which is the array of Map elements. Internally, Maps have more elements than could be deduced from the user-supplied World.wrldsiz, as additional rows of element are added to provide smooth transitions to the flat surroundings.
+
+Blocks: x/ysize=World.wrldsiz+4 rows of blocks (from which only 2+World.wrldsiz rows are placed within the world boundaries)
+
+Smooth: x/ysize=World.wrldsiz+2 rows of vertices (creating World.wrldsiz+1 rows of triangles, everything within the world boundaries)
+]]></description>
+        <element name="xsize" type="integer" flags="1"/>
+        <element name="ysize" type="integer" flags="1"/>
+        <element name="getHeight" function="true" type="float">
+            <description><![CDATA[Height at any 2d coordinate]]></description>
+            <arguments>
+                <argument name="x" type="float"/>
+                <argument name="y" type="float"/>
+            </arguments>
+        </element>
+        <element name="getMap" function="true" type="Object">
+            <description><![CDATA[retrieve map cell object]]></description>
+            <arguments>
+                <argument name="x" type="integer"/>
+                <argument name="y" type="integer"/>
+            </arguments>
+        </element>
+        <element name="intersect" function="true" type="Vector">
+            <description><![CDATA[Calculate the intersection point between the world surface and the ray projected from "3d point" towards the given direction. 3D points are actually 3-elements Vector objects. The resulting vector contains the additional fourth element - the intersection point distance. The function returns null if there is no intersection.
+
+See "standard_events.inc" file, which uses "intersect" for calculating the world coordinates corresponding to the user-clicked screen location.
+Bugs: This function does not currently handle the heightfield environment correctly (works as if it was flat)]]></description>
+            <arguments>
+                <argument name="3d point" type="Vector"/>
+                <argument name="3d direction" type="Vector"/>
+                <argument name="range" type="float"/>
+            </arguments>
+        </element>
+        <element name="intersect" function="true" type="Vector">
+            <description>
+                <![CDATA[Works like intersect(3d point,3d direction,range) for inifinite range, that is without limiting the intersection distance]]></description>
+            <arguments>
+                <argument name="3d point" type="Vector"/>
+                <argument name="3d direction" type="Vector"/>
+            </arguments>
+        </element>
+    </type>
+    <type name="WorldSignals" context="Global context">
+        <description><![CDATA[Use this object to create stationary signals (not associated with any moving object) and to receive signals from any location in the world. There are Creature-based and Neuro-based variants of this object that automatically operate from creature's or neuron's position.
+
+See also: Signal, CreatureSignals, NeuroSignals.]]></description>
+        <element name="add" function="true" type="Signal">
+            <arguments>
+                <argument name="position" type="XYZ"/>
+                <argument name="channel" type="string"/>
+            </arguments>
+        </element>
+        <element name="receive" function="true" type="float">
+            <description><![CDATA[Receive the aggregated signal power in a given channel.]]></description>
+            <arguments>
+                <argument name="position" type="XYZ"/>
+                <argument name="channel" type="string"/>
+            </arguments>
+        </element>
+        <element name="receiveSet" function="true" type="Vector">
+            <description>
+                <![CDATA[Get all signals in the specified range. Returns a read-only vector object containing Signal objects - individual signals can be accessed as result[0], .., result[result.size-1].]]></description>
+            <arguments>
+                <argument name="position" type="XYZ"/>
+                <argument name="channel" type="string"/>
+                <argument name="max distance" type="float"/>
+            </arguments>
+        </element>
+        <element name="receiveFilter" function="true" type="float">
+            <description><![CDATA[Receive the aggregated signal power in a given channel.
+
+Additional filtering options:
+- Max distance only receives the neighbor signals (based on their physical location)
+- Flavor filtering: only signals having the flavor similar to the specified value will be received. The flavorfilter value is the difference of flavor that reduces the received signal to 0. The "flavor attenuation" is linear, i.e., signals differing by (filter/2) in flavor will be reduced to 50%.]]></description>
+            <arguments>
+                <argument name="position" type="XYZ"/>
+                <argument name="channel" type="string"/>
+                <argument name="max distance" type="float"/>
+                <argument name="flavor" type="float"/>
+                <argument name="flavorfilter" type="float"/>
+            </arguments>
+        </element>
+        <element name="receiveSingle" function="true" type="Signal">
+            <description>
+                <![CDATA[Find the signal source that has the highest signal power (taking into account distance).]]></description>
+            <arguments>
+                <argument name="position" type="XYZ"/>
+                <argument name="channel" type="string"/>
+                <argument name="max distance" type="float"/>
+            </arguments>
+        </element>
+        <element name="get" function="true" type="Signal">
+            <arguments>
+                <argument name="index" type="integer"/>
+            </arguments>
+        </element>
+        <element name="size" type="integer" flags="1"/>
+        <element name="clear" function="true" type="void">
+            <arguments/>
+        </element>
+    </type>
+    <type name="XYZ" context="Global context">
+        <description><![CDATA[3D vector]]></description>
+        <element name="x" type="float" flags="256"/>
+        <element name="y" type="float" flags="256"/>
+        <element name="z" type="float" flags="256"/>
+        <element name="new" function="true" type="XYZ">
+            <description>
+                <![CDATA[3D vectors objects can be also created using the (x,y,z) notation, i.e. var v=(1,2,3) is the same as var v=XYZ.new(1,2,3);]]></description>
+            <arguments>
+                <argument name="x" type="float"/>
+                <argument name="y" type="float"/>
+                <argument name="z" type="float"/>
+            </arguments>
+        </element>
+        <element name="newFromVector" function="true" type="XYZ">
+            <description><![CDATA[used for deserialization]]></description>
+            <arguments>
+                <argument type="Vector"/>
+            </arguments>
+        </element>
+        <element name="clone" function="true" type="XYZ" flags="256">
+            <description><![CDATA[Note: copying object references does not create new objects. Use clone() if a new object is needed.
+
+Example:
+var o1=(1,2,3), o2=o1, o3=o1.clone();
+o1.y=9999;
+//o2 is now (1,9999,3) but o3 is still (1,2,3)]]></description>
+            <arguments/>
+        </element>
+        <element name="set" function="true" type="void" flags="256">
+            <arguments>
+                <argument type="XYZ"/>
+            </arguments>
+        </element>
+        <element name="set3" function="true" type="void" flags="256">
+            <arguments>
+                <argument name="x" type="float"/>
+                <argument name="y" type="float"/>
+                <argument name="z" type="float"/>
+            </arguments>
+        </element>
+        <element name="add" function="true" type="void" flags="256">
+            <description><![CDATA[Note: it does not return a new object, just modifies the existing one]]></description>
+            <arguments>
+                <argument type="XYZ"/>
+            </arguments>
+        </element>
+        <element name="sub" function="true" type="void" flags="256">
+            <description><![CDATA[Note: it does not return a new object, just modifies the existing one]]></description>
+            <arguments>
+                <argument type="XYZ"/>
+            </arguments>
+        </element>
+        <element name="scale" function="true" type="void" flags="256">
+            <arguments>
+                <argument type="float"/>
+            </arguments>
+        </element>
+        <element name="length" type="float" flags="257"/>
+        <element name="normalize" function="true" type="void" flags="256">
+            <description><![CDATA[scales the vector length to 1.0]]></description>
+            <arguments/>
+        </element>
+        <element name="toString" type="string" flags="257"/>
+        <element name="toVector" type="Vector" flags="257"/>
+        <element name="rotate" function="true" type="void" flags="256">
+            <arguments>
+                <argument type="Orient"/>
+            </arguments>
+        </element>
+        <element name="revRotate" function="true" type="void" flags="256">
+            <arguments>
+                <argument type="Orient"/>
+            </arguments>
+        </element>
+        <element name="get" function="true" type="float" flags="256">
+            <description>
+                <![CDATA[this function makes the XYZ objects "indexable" (so you can use [] for accessing subsequent fields, like in Vector)]]></description>
+            <arguments>
+                <argument name="index" type="integer"/>
+            </arguments>
+        </element>
+    </type>
+    <type name="ExpProperties" context="Experiment definition">
+        <element name="_propertyClear" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Using most _property functions is restricted for internal purposes. Use "property:" or "state:" definitions in your script files to change object properties.]]></description>
+            <arguments/>
+        </element>
+        <element name="_propertyAdd" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Using most _property functions is restricted for internal purposes. Use "property:" or "state:" definitions in your script files to change object properties.]]></description>
+            <arguments>
+                <argument name="id" type="string"/>
+                <argument name="type description" type="string"/>
+                <argument name="name" type="string"/>
+                <argument name="flags" type="integer"/>
+                <argument name="help text" type="string"/>
+            </arguments>
+        </element>
+        <element name="_propertyRemove" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Using most _property functions is restricted for internal purposes. Use "property:" or "state:" definitions in your script files to change object properties.]]></description>
+            <arguments>
+                <argument name="index" type="integer"/>
+            </arguments>
+        </element>
+        <element name="_propertyChange" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Using most _property functions is restricted for internal purposes. Use "property:" or "state:" definitions in your script files to change object properties.]]></description>
+            <arguments>
+                <argument name="id" type="string"/>
+                <argument name="type description" type="string"/>
+                <argument name="name" type="string"/>
+                <argument name="flags" type="integer"/>
+                <argument name="help text" type="string"/>
+            </arguments>
+        </element>
+        <element name="_propertyAddGroup" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Using most _property functions is restricted for internal purposes. Use "property:" or "state:" definitions in your script files to change object properties.]]></description>
+            <arguments>
+                <argument name="name" type="string"/>
+            </arguments>
+        </element>
+        <element name="_propertyRemoveGroup" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Using most _property functions is restricted for internal purposes. Use "property:" or "state:" definitions in your script files to change object properties.]]></description>
+            <arguments>
+                <argument name="index" type="integer"/>
+            </arguments>
+        </element>
+        <element name="_propertyExists" function="true" type="integer" flags="34">
+            <arguments>
+                <argument name="name" type="string"/>
+            </arguments>
+        </element>
+        <element name="_property_changed_index" type="integer" flags="35"/>
+        <element name="_property_changed_id" type="string" flags="35"/>
+    </type>
+    <type name="ExpState" context="Experiment definition">
+        <element name="_propertyClear" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Using most _property functions is restricted for internal purposes. Use "property:" or "state:" definitions in your script files to change object properties.]]></description>
+            <arguments/>
+        </element>
+        <element name="_propertyAdd" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Using most _property functions is restricted for internal purposes. Use "property:" or "state:" definitions in your script files to change object properties.]]></description>
+            <arguments>
+                <argument name="id" type="string"/>
+                <argument name="type description" type="string"/>
+                <argument name="name" type="string"/>
+                <argument name="flags" type="integer"/>
+                <argument name="help text" type="string"/>
+            </arguments>
+        </element>
+        <element name="_propertyRemove" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Using most _property functions is restricted for internal purposes. Use "property:" or "state:" definitions in your script files to change object properties.]]></description>
+            <arguments>
+                <argument name="index" type="integer"/>
+            </arguments>
+        </element>
+        <element name="_propertyChange" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Using most _property functions is restricted for internal purposes. Use "property:" or "state:" definitions in your script files to change object properties.]]></description>
+            <arguments>
+                <argument name="id" type="string"/>
+                <argument name="type description" type="string"/>
+                <argument name="name" type="string"/>
+                <argument name="flags" type="integer"/>
+                <argument name="help text" type="string"/>
+            </arguments>
+        </element>
+        <element name="_propertyAddGroup" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Using most _property functions is restricted for internal purposes. Use "property:" or "state:" definitions in your script files to change object properties.]]></description>
+            <arguments>
+                <argument name="name" type="string"/>
+            </arguments>
+        </element>
+        <element name="_propertyRemoveGroup" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Using most _property functions is restricted for internal purposes. Use "property:" or "state:" definitions in your script files to change object properties.]]></description>
+            <arguments>
+                <argument name="index" type="integer"/>
+            </arguments>
+        </element>
+        <element name="_propertyExists" function="true" type="integer" flags="34">
+            <arguments>
+                <argument name="name" type="string"/>
+            </arguments>
+        </element>
+        <element name="_property_changed_index" type="integer" flags="35"/>
+        <element name="_property_changed_id" type="string" flags="35"/>
+    </type>
+    <type name="n" context="Neuron definitions">
+        <element name="p" type="integer" min="-1" max="999999" default="-1"/>
+        <element name="j" type="integer" min="-1" max="999999" default="-1"/>
+        <element name="d" type="string"/>
+        <element name="i" type="string"/>
+        <element name="Vstyle" type="string" default="neuro"/>
+        <element name="getInputCount" type="integer" flags="3"/>
+        <element name="getInputNeuroDef" function="true" type="NeuroDef">
+            <arguments>
+                <argument type="integer"/>
+            </arguments>
+        </element>
+        <element name="getInputNeuroIndex" function="true" type="integer">
+            <arguments>
+                <argument type="integer"/>
+            </arguments>
+        </element>
+        <element name="getInputWeight" function="true" type="float">
+            <arguments>
+                <argument type="integer"/>
+            </arguments>
+        </element>
+        <element name="classObject" type="NeuroClass" flags="3"/>
+    </type>
+    <type name="Neuro" context="Neuron definitions">
+        <description><![CDATA[Live Neuron object.]]></description>
+        <element name="getInputState" function="true" type="float">
+            <arguments>
+                <argument name="input" type="integer"/>
+            </arguments>
+        </element>
+        <element name="getInputWeight" function="true" type="float">
+            <arguments>
+                <argument name="input" type="integer"/>
+            </arguments>
+        </element>
+        <element name="getWeightedInputState" function="true" type="float">
+            <arguments>
+                <argument name="input" type="integer"/>
+            </arguments>
+        </element>
+        <element name="getInputSum" function="true" type="float">
+            <arguments>
+                <argument name="input" type="integer"/>
+            </arguments>
+        </element>
+        <element name="getWeightedInputSum" function="true" type="float">
+            <description>
+                <![CDATA[Uses any number of inputs starting with the specified input. getWeightedInputSum(0)=weightedInputSum]]></description>
+            <arguments>
+                <argument name="input" type="integer"/>
+            </arguments>
+        </element>
+        <element name="getInputCount" type="integer" flags="1"/>
+        <element name="inputSum" type="float" flags="1"/>
+        <element name="weightedInputSum" type="float" flags="1"/>
+        <element name="getInputChannelCount" function="true" type="integer">
+            <arguments>
+                <argument name="input" type="integer"/>
+            </arguments>
+        </element>
+        <element name="getInputStateChannel" function="true" type="float">
+            <arguments>
+                <argument name="input" type="integer"/>
+                <argument name="channel" type="integer"/>
+            </arguments>
+        </element>
+        <element name="getWeightedInputStateChannel" function="true" type="float">
+            <arguments>
+                <argument name="input" type="integer"/>
+                <argument name="channel" type="integer"/>
+            </arguments>
+        </element>
+        <element name="state" type="float">
+            <description><![CDATA[When read, returns the current neuron state.
+When written, sets the 'internal' neuron state that will become current in the next step.
+Typically you should use this field, and not currState.]]></description>
+        </element>
+        <element name="channelCount" type="integer"/>
+        <element name="getStateChannel" function="true" type="float">
+            <arguments>
+                <argument name="channel" type="integer"/>
+            </arguments>
+        </element>
+        <element name="setStateChannel" function="true" type="void">
+            <arguments>
+                <argument name="channel" type="integer"/>
+                <argument name="value" type="float"/>
+            </arguments>
+        </element>
+        <element name="hold" type="integer" min="0" max="1">
+            <description>
+                <![CDATA["Holding" means keeping the neuron state as is, blocking the regular neuron operation. This is useful when your script needs to inject some control signals into the NN. Without "holding", live neurons would be constantly overwriting your changes, and the rest of the NN could see inconsistent states, depending on the connections. Setting hold=1 ensures the neuron state will be only set by you, and not by the neuron. The enforced signal value can be set using Neuro.currState before or after setting hold=1. Set hold=0 to resume normal operation.]]></description>
+        </element>
+        <element name="currState" type="float">
+            <description><![CDATA[When read, it behaves just like the 'state' field.
+When written, changes the current neuron state immediately, which disturbs the regular synchronous NN operation.
+This feature should only be used while controlling the neuron 'from outside' (like a neuro probe) and not in the neuron definition. See also: Neuro.hold]]></description>
+        </element>
+        <element name="setCurrStateChannel" function="true" type="void">
+            <description><![CDATA[Analogous to "currState".]]></description>
+            <arguments>
+                <argument name="channel" type="integer"/>
+                <argument name="value" type="float"/>
+            </arguments>
+        </element>
+        <element name="position_x" type="float" flags="1"/>
+        <element name="position_y" type="float" flags="1"/>
+        <element name="position_z" type="float" flags="1"/>
+        <element name="relative_pos" type="XYZ" flags="1"/>
+        <element name="relative_orient" type="Orient" flags="1"/>
+        <element name="creature" type="Creature" flags="1"/>
+        <element name="mechpart" type="MechPart" flags="1">
+            <description><![CDATA[The MechPart object where this neuron is located]]></description>
+        </element>
+        <element name="mechjoint" type="MechJoint" flags="1">
+            <description><![CDATA[The MechJoint object where this neuron is located]]></description>
+        </element>
+        <element name="neuroproperties" type="NeuroProperties" flags="1">
+            <description><![CDATA[Neurons can have different fields depending on their class. Script neurons have their fields defined using the "property:" syntax. If you develop a custom neuron script you should use the NeuroProperties object for accessing your own neuron fields. The Neuro.neuroproperties property is meant for accessing the neuron fields from the outside script.
+Examples:
+var c=Populations.createFromString("X[N]");
+Simulator.print("standard neuron inertia="+c.getNeuro(0).neuroproperties.in);
+c=Populations.createFromString("X[Nn,e:0.1]");
+Simulator.print("noisy neuron error rate="+c.getNeuro(0).neuroproperties.e);
+
+The Interface object can be used to discover which fields are available for a certain neuron object:
+c=Populations.createFromString("X[N]");
+var iobj=Interface.makeFrom(c.getNeuro(0).neuroproperties);
+var i;
+for(i=0;i<iobj.size;i++)
+ Simulator.print(iobj.getId(i)+" ("+iobj.getName(i)+")");]]></description>
+        </element>
+        <element name="def" type="NeuroDef" flags="1"/>
+        <element name="classObject" type="NeuroClass" flags="1"/>
+        <element name="signals" type="NeuroSignals" flags="1"/>
+    </type>
+    <type name="this" context="Fitness formula">
+        <description>
+            <![CDATA[A Genotype with the associated performance information. Adding genotypes to GenePool makes them accessible in Framsticks GUI and enables the use of GenePool selection methods. See also GenePools.]]></description>
+        <element name="name" type="string" max="40"/>
+        <element name="genotype" type="string">
+            <description><![CDATA[Genes as a string of characters.]]></description>
+        </element>
+        <element name="info_timestamp" type="float" min="0" max="-1" default="0.0"/>
+        <element name="info_author" type="string" max="100"/>
+        <element name="info_author_ispublic" type="integer" min="0" max="1" default="1"/>
+        <element name="info_email" type="string" max="100"/>
+        <element name="info_email_ispublic" type="integer" min="0" max="1" default="0"/>
+        <element name="info" type="string" min="1" max="1000">
+            <description><![CDATA[Short description of key features of this creature.]]></description>
+        </element>
+        <element name="info_origin" type="integer" min="0" max="4" default="0">
+            <description><![CDATA[Declaration of how this genotype originated.]]></description>
+        </element>
+        <element name="info_how_created" type="string" min="1" max="1000">
+            <description>
+                <![CDATA[Description of the process of designing and/or evolving this genotype.]]></description>
+        </element>
+        <element name="info_performance" type="string" min="1" max="1000">
+            <description>
+                <![CDATA[Description of why this genotype is special/interesting and how it performs.]]></description>
+        </element>
+        <element name="simi" type="float" flags="3">
+            <description><![CDATA[Average of (1+dissimilarity(thisgeno,othergeno)) calculated for all other Genotype instances. This property is meant as fitness multiplier, included in the fitness function when similarity speciation (ExpProperties.cr_simi) is enabled.
+Read about details of dissimilarity calculation and its applications:
+http://www.framsticks.com/bib/Komosinski-et-al-2001
+http://www.framsticks.com/bib/Komosinski-and-Kubiak-2011
+http://www.framsticks.com/bib/Komosinski-2016]]></description>
+        </element>
+        <element name="energ0" type="float" deprecated="true" flags="8227"/>
+        <element name="energy0" type="float" min="0" max="-1" default="0.0" flags="16"/>
+        <element name="strsiz" type="integer" deprecated="true" flags="8227"/>
+        <element name="strjoints" type="integer" deprecated="true" flags="8227"/>
+        <element name="nnsiz" type="integer" deprecated="true" flags="8227"/>
+        <element name="nncon" type="integer" deprecated="true" flags="8227"/>
+        <element name="numparts" type="integer" flags="16"/>
+        <element name="numjoints" type="integer" flags="16"/>
+        <element name="numneurons" type="integer" flags="16"/>
+        <element name="numconnections" type="integer" flags="16"/>
+        <element name="num" type="integer">
+            <description><![CDATA[Acts as a unique identifier, but less strict than "uid". Unlike "uid", "num" can be changed and therefore can be saved and restored, providing persistence and continuity beyond a single application run. "num" is only guaranteed to be unique if it is autogenerated and not changed by the user, otherwise it is user's responsibility to manage the proper values of "num". "Genotype.num" is generated on adding a Genotype object to a group, unless it already has a non-zero "num" (previously autogenerated or user-assigned). Autogenerated "num" is always equal to the largest previously used "num" + 1. The largest previously used value is stored in Simulator.last_genotype_num and can be changed as well (and is automatically saved and restored as a part of the Simulator state). Limitation: being a 32-bit integer, "num" overflows at about 2 billion counts.
+See also: uid]]></description>
+        </element>
+        <element name="gnum" type="integer"/>
+        <element name="popsiz" type="integer" deprecated="true" flags="8226">
+            <description><![CDATA[Please use 'instances' instead of 'popsiz'.]]></description>
+        </element>
+        <element name="instances" type="integer">
+            <description><![CDATA[Copies of this genotype]]></description>
+        </element>
+        <element name="lifespan" type="float">
+            <description><![CDATA[Average life span]]></description>
+        </element>
+        <element name="velocity" type="float">
+            <description><![CDATA[Average velocity]]></description>
+        </element>
+        <element name="distance" type="float"/>
+        <element name="vertvel" type="float"/>
+        <element name="vertpos" type="float"/>
+        <element name="fit" type="float" flags="3"/>
+        <element name="fit2" type="float" flags="3">
+            <description><![CDATA[Fitness shifted by (avg-n*stddev)]]></description>
+        </element>
+        <element name="f0genotype" type="string" flags="3">
+            <description><![CDATA[converted to f0 genotype]]></description>
+        </element>
+        <element name="convtrace1" type="string" flags="3"/>
+        <element name="data" type="Dictionary" flags="32768"/>
+        <element name="user1" type="untyped" deprecated="true" flags="8192"/>
+        <element name="user2" type="untyped" deprecated="true" flags="8192"/>
+        <element name="user3" type="untyped" deprecated="true" flags="8192"/>
+        <element name="mutate" function="true" type="void">
+            <arguments/>
+        </element>
+        <element name="isValid" type="integer" min="0" max="1" deprecated="true" flags="8227">
+            <description><![CDATA[Use 'is_valid' instead of 'isValid'.]]></description>
+        </element>
+        <element name="is_valid" type="integer" min="-1" max="1" default="-1" flags="32">
+            <description><![CDATA[0 = invalid genotype
+1 = valid genotype
+-1 = validity is not known. This is a transient state. The value of "is_valid" will never be -1 when read. It is safe to treat is_valid as boolean in statements like "if (g.is_valid) ...". Setting "is_valid=-1" will make it 0 or 1 again. This third state (-1) is only needed for loading Genotype objects from files where the "is_valid" field might not be present.]]></description>
+        </element>
+        <element name="getNormalized" function="true" type="float" flags="32">
+            <arguments>
+                <argument name="property name or index" type="untyped"/>
+            </arguments>
+        </element>
+        <element name="geno" type="Geno" flags="35">
+            <description><![CDATA[A Geno object for this Genotype]]></description>
+        </element>
+        <element name="uid" type="string" flags="1">
+            <description><![CDATA[Unique identifier that is generated on object creation. "uid" is only unique during a single application run. Subsequent runs generate the same sequence of uid values.
+See also: num]]></description>
+        </element>
+        <element name="getModel" function="true" type="Model" flags="32">
+            <arguments/>
+        </element>
+        <element name="splitInstances" function="true" type="void" flags="32">
+            <arguments/>
+        </element>
+        <element name="newFromString" function="true" type="Genotype" flags="32">
+            <arguments>
+                <argument name="genotype" type="string"/>
+            </arguments>
+        </element>
+        <element name="newFromGeno" function="true" type="Genotype" flags="32">
+            <arguments>
+                <argument type="Geno"/>
+            </arguments>
+        </element>
+        <element name="newFromCreature" function="true" type="Genotype" flags="32">
+            <arguments>
+                <argument type="Creature"/>
+            </arguments>
+        </element>
+        <element name="addPerformanceFromCreature" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Updates the Genotype's performance values merging them with the supplied Creture's performance. It assumes the Genotype.instances has a reasonable value and performs the proper weighting. Use your own function instead if these conditions are not met in your experiment.]]></description>
+            <arguments>
+                <argument type="Creature"/>
+            </arguments>
+        </element>
+        <element name="moveTo" function="true" type="void" flags="32">
+            <description><![CDATA[the genotype is removed from its current pool when pool=null]]></description>
+            <arguments>
+                <argument name="pool" type="GenePool"/>
+            </arguments>
+        </element>
+        <element name="clone" function="true" type="Genotype" flags="32">
+            <description>
+                <![CDATA[Returns a duplicated genotype, not attached to any gene pool. All genotype fields are copied including 'data' (for which Dictionary.clone() produces a shallow copy).]]></description>
+            <arguments/>
+        </element>
+        <element name="delete" function="true" type="void" flags="32">
+            <arguments/>
+        </element>
+        <element name="deleteOne" function="true" type="void" flags="32">
+            <description><![CDATA[]]></description>
+            <arguments/>
+        </element>
+        <element name="genepool" type="GenePool" flags="35">
+            <description><![CDATA[GenePool object or null when not in pool]]></description>
+        </element>
+        <element name="index" type="integer" flags="35">
+            <description><![CDATA[-1 when not in pool.
+Note that the index changes depending on the current genotype position in the pool. Use Genotype.uid if you need a permanent identifier that persists through the entire object lifetime.]]></description>
+        </element>
+        <element name="beforeLoad" function="true" type="void" flags="32">
+            <arguments/>
+        </element>
+        <element name="afterLoad" function="true" type="void" flags="32">
+            <arguments/>
+        </element>
+    </type>
+    <type name="Creature" context="Visual style definition">
+        <description><![CDATA[The object inside the simulated world, including its physical structure, neural network and performance data. Food pieces, obstacles and other movable objects can be implemented as Creatures even though the are not "alive".
+Before version 4.0rc4 the static Creature object was used in event handlers and in functions operating on the "selected" creature. This is now deprecated as all operations can be performed using the more convenient direct access (see GenePools). For event handlers, the creature object will be passed as argument, like this:
+function onDied(cr) {Simulator.print("Creature "+cr.name+" has died");}
+See also: Population.]]></description>
+        <element name="name" type="string" max="40"/>
+        <element name="genotype" type="string" flags="1"/>
+        <element name="info" type="string">
+            <description><![CDATA[Additional info or comments]]></description>
+        </element>
+        <element name="group" type="untyped" deprecated="true" flags="8227">
+            <description><![CDATA[Deprecated. Use population instead.]]></description>
+        </element>
+        <element name="population" type="Population" flags="35"/>
+        <element name="index" type="integer" flags="35">
+            <description>
+                <![CDATA[Note that the index changes depending on the current creature position in the population. Use Creature.uid if you need a permanent identifier that persists through the entire object lifetime.]]></description>
+        </element>
+        <element name="num" type="integer">
+            <description><![CDATA[Acts as a unique identifier, but less strict than "uid". Unlike "uid", "num" can be changed and therefore can be saved and restored, providing persistence and continuity beyond a single application run. "num" is only guaranteed to be unique if it is autogenerated and not changed by the user, otherwise it is user's responsibility to manage the proper values of "num". Autogenerated "num" is always equal to the largest previously used "num" + 1. The largest previously used value is stored in Simulator.last_creature_num and can be changed as well (and is automatically saved and restored as a part of the Simulator state). Limitation: being a 32-bit integer, "num" overflows at about 2 billion counts.
+See also: uid]]></description>
+        </element>
+        <element name="gnum" type="integer"/>
+        <element name="buildproblems" type="integer" flags="34"/>
+        <element name="energ0" type="float" deprecated="true" flags="8226"/>
+        <element name="energy0" type="float"/>
+        <element name="idleen" type="float">
+            <description>
+                <![CDATA[The amount of energy subtracted from the energy of this creature in each simulation step, as in: cr.energy-=cr.idleen;]]></description>
+        </element>
+        <element name="energy" type="float"/>
+        <element name="perf" type="integer" min="0" max="2" deprecated="true" flags="8226">
+            <description><![CDATA[Replaced by perf_measuring]]></description>
+        </element>
+        <element name="perf_measuring" type="integer" min="0" max="2">
+            <description>
+                <![CDATA[The initial value of this property is taken from Population.initial_perf_measuring]]></description>
+        </element>
+        <element name="nnenabled" type="integer" min="0" max="2" deprecated="true" flags="8226">
+            <description><![CDATA[Replaced by nn_active]]></description>
+        </element>
+        <element name="nn_active" type="integer" min="0" max="2">
+            <description><![CDATA[The initial value of this property is taken from Population.nn_active]]></description>
+        </element>
+        <element name="bodysim" type="integer" min="0" max="1" default="1" deprecated="true" flags="8226">
+            <description><![CDATA[Replaced by physics_active]]></description>
+        </element>
+        <element name="physics_active" type="integer" min="0" max="1" default="1">
+            <description><![CDATA[(Physical) body simulation can be disabled for individual objects which makes them immovable. Disabled objects can still participate in collisions depending on their collisions masks. The initial value of this property is taken from Population.initial_physics_active.
+
+Bugs: the standard collision handler does not work for disabled objects when ODE simulation is used. It means that these objects won't physically interact with other objects. The custom (scripting) handlers work as expected.]]></description>
+        </element>
+        <element name="selfcol" type="integer" min="0" max="1" deprecated="true" flags="8226">
+            <description><![CDATA[Replaced by self_collisions]]></description>
+        </element>
+        <element name="self_collisions" type="integer" min="0" max="1">
+            <description>
+                <![CDATA[Enable/disable detection of self-collisions (within a creature body). They can only occur when using the ODE simulation engine. If enabled, the creature will have its sticks collide during lifespan.  The initial value of this property is taken from Population.initial_self_collisions.]]></description>
+        </element>
+        <element name="selfcolstate" function="true" type="integer" deprecated="true" flags="8224">
+            <description><![CDATA[Replaced by selfCollisionsCount()]]></description>
+            <arguments/>
+        </element>
+        <element name="selfCollisionsCount" function="true" type="integer" flags="32">
+            <description><![CDATA[Returns the number of self-collisions detected in the creature.]]></description>
+            <arguments/>
+        </element>
+        <element name="lifespan" type="integer">
+            <description>
+                <![CDATA[While the creature's performance measurement is enabled, the creature's lifespan is incremented in "performance sampling period" intervals.]]></description>
+        </element>
+        <element name="steps_after_birth" type="integer">
+            <description><![CDATA["Birth" is the moment when the simulation of a creature starts.]]></description>
+        </element>
+        <element name="steps_in_lifespan" type="integer">
+            <description>
+                <![CDATA["Lifespan" is the period during simulation of a creature when its performance measurement is enabled.]]></description>
+        </element>
+        <element name="distance" type="float"/>
+        <element name="c_velocity" type="float"/>
+        <element name="c_vertvelocity" type="float"/>
+        <element name="c_vertpos" type="float"/>
+        <element name="velocity" type="float"/>
+        <element name="vertpos" type="float"/>
+        <element name="vertvel" type="float"/>
+        <element name="pos_x" type="float" deprecated="true" flags="8195">
+            <description>
+                <![CDATA[(pos_x,pos_y,pos_z) is the point of minimal coordinates ("bottom left corner") of the creature, including imaginary Part sizes (Part.s, usually 1.0). See also: Creature.moveAbs]]></description>
+        </element>
+        <element name="pos_y" type="float" deprecated="true" flags="8195">
+            <description><![CDATA[See Creature.pos_x]]></description>
+        </element>
+        <element name="pos_z" type="float" deprecated="true" flags="8195">
+            <description><![CDATA[See Creature.pos_x]]></description>
+        </element>
+        <element name="size_x" type="float" deprecated="true" flags="8195">
+            <description><![CDATA[(size_x,size_y,size_z) are dimensions of the axis-aligned bounding box of the creature, including the imaginary part sizes (Part.s, usually 1.0). A creature consisting of a single default Part has the size of (2.0,2.0,2.0) - twice the Part.s value (like a sphere diameter is twice its radius).
+See also: Creature.moveAbs]]></description>
+        </element>
+        <element name="size_y" type="float" deprecated="true" flags="8195">
+            <description><![CDATA[See Creature.size_x]]></description>
+        </element>
+        <element name="size_z" type="float" deprecated="true" flags="8195">
+            <description><![CDATA[See Creature.size_x]]></description>
+        </element>
+        <element name="center_x" type="float" deprecated="true" flags="8193">
+            <description><![CDATA[Center of gravity]]></description>
+        </element>
+        <element name="center_y" type="float" deprecated="true" flags="8193">
+            <description><![CDATA[Center of gravity]]></description>
+        </element>
+        <element name="center_z" type="float" deprecated="true" flags="8193">
+            <description><![CDATA[Center of gravity]]></description>
+        </element>
+        <element name="bboxLow" type="XYZ" flags="3"/>
+        <element name="bboxHigh" type="XYZ" flags="3"/>
+        <element name="bboxCenter" type="XYZ" flags="1"/>
+        <element name="bboxSize" type="XYZ" flags="3"/>
+        <element name="bboxGroundOffset" type="float" flags="3">
+            <description><![CDATA[Due to multiple modes of simulation and Part shapes, you need to add this value to the intended creature bottom elevation to get the 'z' coordinate of the bboxLow that places the creature exactly on the specific height level.
+Example:
+creature.locationSetBboxLow(10,10,0+creature.bboxGroundOffset); //bottom of the crearture will be at level 0 on a flat ground]]></description>
+        </element>
+        <element name="centerOfGravity" type="XYZ" flags="3">
+            <description><![CDATA[Only updated once every 'perfperiod' steps!]]></description>
+        </element>
+        <element name="numparts" type="integer" flags="3"/>
+        <element name="numjoints" type="integer" flags="3"/>
+        <element name="numneurons" type="integer" flags="3"/>
+        <element name="numconnections" type="integer" flags="3"/>
+        <element name="data" type="Dictionary" flags="32768"/>
+        <element name="user1" type="untyped" deprecated="true" flags="8192"/>
+        <element name="user2" type="untyped" deprecated="true" flags="8192"/>
+        <element name="user3" type="untyped" deprecated="true" flags="8192"/>
+        <element name="move" function="true" type="void" deprecated="true" flags="8224">
+            <description><![CDATA[Replaced by locationMoveBy().]]></description>
+            <arguments>
+                <argument name="dx" type="float"/>
+                <argument name="dy" type="float"/>
+                <argument name="dz" type="float"/>
+            </arguments>
+        </element>
+        <element name="locationMoveBy" function="true" type="void" flags="32">
+            <description><![CDATA[Shift the creature by a given vector (in world coordinates).]]></description>
+            <arguments>
+                <argument name="dx" type="float"/>
+                <argument name="dy" type="float"/>
+                <argument name="dz" type="float"/>
+            </arguments>
+        </element>
+        <element name="moveAbs" function="true" type="void" deprecated="true" flags="8224">
+            <description><![CDATA[Replaced by locationSetBboxLow().]]></description>
+            <arguments>
+                <argument name="x" type="float"/>
+                <argument name="y" type="float"/>
+                <argument name="z" type="float"/>
+            </arguments>
+        </element>
+        <element name="locationSetBboxLow" function="true" type="void" flags="32">
+            <description>
+                <![CDATA[Moves the creature as determined by the "low" corner (the one with the lower coordinate values) of the bounding box of a creature.]]></description>
+            <arguments>
+                <argument name="x" type="float"/>
+                <argument name="y" type="float"/>
+                <argument name="z" type="float"/>
+            </arguments>
+        </element>
+        <element name="locationSetBboxCenter" function="true" type="void" flags="32">
+            <description>
+                <![CDATA[Moves the creature as determined by the center of the bounding box of a creature.]]></description>
+            <arguments>
+                <argument name="x" type="float"/>
+                <argument name="y" type="float"/>
+                <argument name="z" type="float"/>
+            </arguments>
+        </element>
+        <element name="moveLocal" function="true" type="void" deprecated="true" flags="8224">
+            <description><![CDATA[Replaced by locationMoveLocalBy]]></description>
+            <arguments>
+                <argument name="dx" type="float"/>
+                <argument name="dy" type="float"/>
+                <argument name="dz" type="float"/>
+            </arguments>
+        </element>
+        <element name="locationMoveLocalBy" function="true" type="void" flags="32">
+            <description>
+                <![CDATA[Local coordinates are measured with respect to the position and orientation of the first Part.]]></description>
+            <arguments>
+                <argument name="dx" type="float"/>
+                <argument name="dy" type="float"/>
+                <argument name="dz" type="float"/>
+            </arguments>
+        </element>
+        <element name="localToWorld" function="true" type="XYZ" flags="32">
+            <description>
+                <![CDATA[Local coordinates are measured with respect to the position and orientation of the first Part.]]></description>
+            <arguments>
+                <argument name="x" type="float"/>
+                <argument name="y" type="float"/>
+                <argument name="z" type="float"/>
+            </arguments>
+        </element>
+        <element name="worldToLocal" function="true" type="XYZ" flags="32">
+            <description>
+                <![CDATA[Local coordinates are measured with respect to the position and orientation of the first Part.]]></description>
+            <arguments>
+                <argument name="x" type="float"/>
+                <argument name="y" type="float"/>
+                <argument name="z" type="float"/>
+            </arguments>
+        </element>
+        <element name="orient" type="Orient" flags="33">
+            <description>
+                <![CDATA[By convention, the orientation of the creature is equal to the orientation of its first Part.]]></description>
+        </element>
+        <element name="rotate" function="true" type="void" flags="32">
+            <description>
+                <![CDATA[Rotate the creature around X, Y and Z axes. Should only be used immediately after creating a new creature (before the first simulation step is performed for this creature), otherwise further simulation can be disturbed.]]></description>
+            <arguments>
+                <argument name="x" type="float"/>
+                <argument name="y" type="float"/>
+                <argument name="z" type="float"/>
+            </arguments>
+        </element>
+        <element name="rotateLocal" function="true" type="void" flags="32">
+            <description>
+                <![CDATA[Rotate the creature around (local) X, Y and Z axes. Should only be used immediately after creating a new creature (before the first simulation step is performed for this creature), otherwise further simulation can be disturbed.]]></description>
+            <arguments>
+                <argument name="x" type="float"/>
+                <argument name="y" type="float"/>
+                <argument name="z" type="float"/>
+            </arguments>
+        </element>
+        <element name="drive" type="XYZ" flags="34">
+            <description><![CDATA[Measured in global coordinates.]]></description>
+        </element>
+        <element name="driveLocal" type="XYZ" flags="34">
+            <description><![CDATA[Measured in local coordinates, that is, with respect to the current orientation of the creature.
+See also: Creature.orient]]></description>
+        </element>
+        <element name="localDrive" type="XYZ" deprecated="true" flags="8226">
+            <description><![CDATA[This field is now called driveLocal.]]></description>
+        </element>
+        <element name="getPart" function="true" type="Part" flags="32">
+            <arguments>
+                <argument name="index" type="integer"/>
+            </arguments>
+        </element>
+        <element name="getJoint" function="true" type="Joint" flags="32">
+            <arguments>
+                <argument name="index" type="integer"/>
+            </arguments>
+        </element>
+        <element name="getNeuroDef" function="true" type="NeuroDef" flags="32">
+            <arguments>
+                <argument name="index" type="integer"/>
+            </arguments>
+        </element>
+        <element name="getMechPart" function="true" type="MechPart" flags="32">
+            <arguments>
+                <argument name="index" type="integer"/>
+            </arguments>
+        </element>
+        <element name="getMechJoint" function="true" type="MechJoint" flags="32">
+            <arguments>
+                <argument name="index" type="integer"/>
+            </arguments>
+        </element>
+        <element name="getNeuro" function="true" type="Neuro" flags="32">
+            <arguments>
+                <argument name="index" type="integer"/>
+            </arguments>
+        </element>
+        <element name="outdated_neuro_classes" type="untyped" flags="35">
+            <description>
+                <![CDATA[Names of the neuron classes that have been modified after this creature was built]]></description>
+        </element>
+        <element name="selfmask" type="integer" min="0" max="2147483647" default="0" flags="32">
+            <description>
+                <![CDATA[Creature's selfmask is set according to the Creature's Population.selfmask. See Population.selfmask for detailed information about collision handling.]]></description>
+        </element>
+        <element name="othermask" type="integer" min="0" max="2147483647" default="0" flags="32">
+            <description>
+                <![CDATA[Creature's othermask is set according to the Creature's Population.othermask. See Population.selfmask for detailed information about collision handling.]]></description>
+        </element>
+        <element name="geno" type="Geno" flags="35">
+            <description><![CDATA[Source genotype for this creature]]></description>
+        </element>
+        <element name="model" type="Model" flags="35">
+            <description><![CDATA[Source Model for this creature]]></description>
+        </element>
+        <element name="liveModel" type="Model" flags="35">
+            <description>
+                <![CDATA[A Model object that is a copy of the current (temporary) geometry of this creature]]></description>
+        </element>
+        <element name="uid" type="string" flags="1">
+            <description><![CDATA[Unique identifier that is generated on object creation. "uid" is only unique during a single application run. Subsequent runs generate the same sequence of uid values.
+See also: num]]></description>
+        </element>
+        <element name="signals" type="CreatureSignals" flags="35"/>
+        <element name="boundingBoxCollisions" function="true" type="integer" flags="34">
+            <description><![CDATA[Checks approximate collisions for the selected creature.
+Returns the collision mask calculated as ( mask & colliding_creatures.othermask ). Usually called with mask=0, which has the special meaning of using the current creature.selmask instead of 0, so that it detects the same type of collisions as the current experiment configuration.
+Passing non-zero mask value uses it instead of creature.selfmask, allowing you to include or exclude other colliding populations, as if creature.selfmask were modified temporarily.]]></description>
+            <arguments>
+                <argument name="mask" type="integer"/>
+            </arguments>
+        </element>
+        <element name="checkCollisions" function="true" type="untyped" flags="34">
+            <description><![CDATA[Returns zero if the creature does not collide with other creatures.
+Arguments:
+- mask: if not zero, temporarily replaces creature.selfmask. For details see boundingBoxCollisions()
+- accuracy:
+ 0 = testing creature bounding boxes
+ 1 = testing creature elements]]></description>
+            <arguments>
+                <argument name="mask" type="integer"/>
+                <argument name="accuracy" type="integer"/>
+            </arguments>
+        </element>
+        <element name="transferEnergyTo" function="true" type="float" flags="32">
+            <description><![CDATA[Transfers at most the requested_amount_of_energy from this creature to the recipient. Returns the amount of energy actually transferred.
+The function will only transfer positive amounts and will not transfer more energy than this creature has, so the function is equivalent to:
+if (this.energy>0 && requested_amount_of_energy>0)
+{
+  var amount = Math.min(requested_amount_of_energy, this.energy);
+  recipient.energy += amount;
+  this.energy -= amount;
+}
+
+Calling this function from inside the collision handler to transfer energy between colliding parts automatically adds the relevant MechPart references, as if transferEnergyToPart was called, i.e.
+	Collision.Creature1.transferEnergyTo(Collision.Creature2, e);
+is equivalent to:
+	Collision.Creature1.transferEnergyToPart(Collision.Part1, Collision.Creature2, Collision.Part2, e);
+When this behavior is not intended, explicit nulls in transferEnergyToPart() can be used to avoid associating the energy transfer with the currently colliding parts, like this:
+	Collision.Creature1.transferEnergyToPart(null, Collision.Creature2, null, e);]]></description>
+            <arguments>
+                <argument name="recipient" type="Creature"/>
+                <argument name="requested_amount_of_energy" type="float"/>
+            </arguments>
+        </element>
+        <element name="transferEnergyToPart" function="true" type="float" flags="32">
+            <description><![CDATA[Transfer energy between specific parts of two creatures. Part arguments are only used for visualization and can be null, which would mean "the entire creature".
+See also: transferEnergyTo()]]></description>
+            <arguments>
+                <argument name="source part" type="MechPart"/>
+                <argument name="recipient creature" type="Creature"/>
+                <argument name="recipient part" type="MechPart"/>
+                <argument name="requested_amount_of_energy" type="float"/>
+            </arguments>
+        </element>
+    </type>
+    <type name="Element" context="Visual style definition">
+        <description><![CDATA[Information about current visual element: Part, Joint or Neuro. To be used in _build() or _update() functions.
+
+This is a link between a creature's element (part/joint/neuron) and the geometry object (Element.node).
+Calling Element.useXXX() functions connects the static object references (Creature, Model, Part, Joint, Neuro, MechPart, MechJoint) to the proper creature elements. All these objects are invalid before doing that! E.g. you have to call "Element.useCreature()" before referring to "Creature.energy" in your _build() and _update() functions.]]></description>
+        <element name="node" type="SSGNode"/>
+        <element name="shadow" type="float"/>
+        <element name="useMechPart" function="true"/>
+        <element name="useMechJoint" function="true"/>
+        <element name="useMechJointPart1" function="true"/>
+        <element name="useMechJointPart2" function="true"/>
+        <element name="usePart" function="true"/>
+        <element name="useJoint" function="true"/>
+        <element name="useJointPart1" function="true"/>
+        <element name="useJointPart2" function="true"/>
+        <element name="useNeuro" function="true"/>
+        <element name="useNeuroPart" function="true"/>
+        <element name="useNeuroJoint" function="true"/>
+        <element name="useModel" function="true"/>
+        <element name="useCreature" function="true"/>
+        <element name="refno" type="integer" flags="1"/>
+    </type>
+    <type name="GeomBuilder" context="Visual style definition">
+        <description><![CDATA[Scene graph access (build and manipulate the 3D object tree).]]></description>
+        <element name="code" type="string"/>
+        <element name="currentNode" type="SSGNode" flags="34"/>
+        <element name="rootNode" type="SSGNode" flags="34"/>
+        <element name="updatingNode" type="SSGNode" flags="34"/>
+        <element name="defaultStyle" type="string" flags="2"/>
+        <element name="matrix00" type="float" flags="34"/>
+        <element name="matrix01" type="float" flags="34"/>
+        <element name="matrix02" type="float" flags="34"/>
+        <element name="matrix03" type="float" flags="34"/>
+        <element name="matrix10" type="float" flags="34"/>
+        <element name="matrix11" type="float" flags="34"/>
+        <element name="matrix12" type="float" flags="34"/>
+        <element name="matrix13" type="float" flags="34"/>
+        <element name="matrix20" type="float" flags="34"/>
+        <element name="matrix21" type="float" flags="34"/>
+        <element name="matrix22" type="float" flags="34"/>
+        <element name="matrix23" type="float" flags="34"/>
+        <element name="matrix30" type="float" flags="34"/>
+        <element name="matrix31" type="float" flags="34"/>
+        <element name="matrix32" type="float" flags="34"/>
+        <element name="matrix33" type="float" flags="34"/>
+        <element name="addTransform" function="true" type="SSGNode" flags="32">
+            <description>
+                <![CDATA[create the transform node as a child of the parent node and make it the new current node.]]></description>
+            <arguments>
+                <argument name="parent node" type="SSGNode"/>
+            </arguments>
+        </element>
+        <element name="addBranch" function="true" type="SSGNode" flags="32">
+            <description>
+                <![CDATA[create the branch node as a child of the current node and make it the new current node]]></description>
+            <arguments/>
+        </element>
+        <element name="add" function="true" type="SSGNode" flags="32">
+            <description><![CDATA[add a child node to the current node]]></description>
+            <arguments>
+                <argument type="SSGNode"/>
+            </arguments>
+        </element>
+        <element name="matrixReset" function="true" type="void" flags="32">
+            <arguments/>
+        </element>
+        <element name="matrixMove" function="true" type="void" flags="32">
+            <arguments>
+                <argument name="x" type="float"/>
+                <argument name="y" type="float"/>
+                <argument name="z" type="float"/>
+            </arguments>
+        </element>
+        <element name="matrixPosition" function="true" type="void" flags="32">
+            <arguments>
+                <argument name="x" type="float"/>
+                <argument name="y" type="float"/>
+                <argument name="z" type="float"/>
+            </arguments>
+        </element>
+        <element name="matrixScale" function="true" type="void" flags="32">
+            <arguments>
+                <argument name="x" type="float"/>
+                <argument name="y" type="float"/>
+                <argument name="z" type="float"/>
+            </arguments>
+        </element>
+        <element name="matrixOrient" function="true" type="void" flags="32">
+            <arguments>
+                <argument name="x" type="float"/>
+                <argument name="y" type="float"/>
+                <argument name="z" type="float"/>
+            </arguments>
+        </element>
+        <element name="matrixRotate" function="true" type="void" flags="32">
+            <arguments>
+                <argument name="x" type="float"/>
+                <argument name="y" type="float"/>
+                <argument name="z" type="float"/>
+            </arguments>
+        </element>
+        <element name="matrixRotate1" function="true" type="void" flags="32">
+            <arguments>
+                <argument type="Orient"/>
+            </arguments>
+        </element>
+        <element name="matrixMove1" function="true" type="void" flags="32">
+            <description><![CDATA[MechPart.pos can be used here]]></description>
+            <arguments>
+                <argument type="XYZ"/>
+            </arguments>
+        </element>
+        <element name="matrixPosition1" function="true" type="void" flags="32">
+            <description><![CDATA[MechPart.pos can be used here]]></description>
+            <arguments>
+                <argument type="XYZ"/>
+            </arguments>
+        </element>
+        <element name="matrixOrient1" function="true" type="void" flags="32">
+            <description><![CDATA[MechPart.orient can be used here]]></description>
+            <arguments>
+                <argument type="Orient"/>
+            </arguments>
+        </element>
+        <element name="setMatrix" function="true" type="void" flags="32">
+            <description><![CDATA[copy current matrix into specified node]]></description>
+            <arguments>
+                <argument name="transform node" type="SSGNode"/>
+            </arguments>
+        </element>
+        <element name="getBranch" function="true" type="SSGNode" flags="32">
+            <arguments>
+                <argument name="branch node" type="SSGNode"/>
+                <argument name="branch index" type="integer"/>
+            </arguments>
+        </element>
+        <element name="dump" function="true" type="void" flags="32">
+            <arguments>
+                <argument name="node" type="SSGNode"/>
+                <argument name="level" type="integer"/>
+            </arguments>
+        </element>
+    </type>
+    <type name="GL" context="Visual style definition">
+        <description><![CDATA[OpenGL constants used in GeomBuilder and Material functions.]]></description>
+        <element name="POINTS" type="integer" flags="513"/>
+        <element name="LINES" type="integer" flags="513"/>
+        <element name="LINE_LOOP" type="integer" flags="513"/>
+        <element name="LINE_STRIP" type="integer" flags="513"/>
+        <element name="TRIANGLES" type="integer" flags="513"/>
+        <element name="TRIANGLE_STRIP" type="integer" flags="513"/>
+        <element name="TRIANGLE_FAN" type="integer" flags="513"/>
+        <element name="QUADS" type="integer" flags="513"/>
+        <element name="QUAD_STRIP" type="integer" flags="513"/>
+        <element name="TEXTURE_2D" type="integer" flags="513"/>
+        <element name="CULL_FACE" type="integer" flags="513"/>
+        <element name="COLOR_MATERIAL" type="integer" flags="513"/>
+        <element name="BLEND" type="integer" flags="513"/>
+        <element name="ALPHA_TEST" type="integer" flags="513"/>
+        <element name="LIGHTING" type="integer" flags="513"/>
+        <element name="AMBIENT" type="integer" flags="513"/>
+        <element name="DIFFUSE" type="integer" flags="513"/>
+        <element name="AMBIENT_AND_DIFFUSE" type="integer" flags="513"/>
+        <element name="SPECULAR" type="integer" flags="513"/>
+        <element name="EMISSION" type="integer" flags="513"/>
+    </type>
+    <type name="j" context="Visual style definition">
+        <element name="p1" type="integer" min="-1" max="999999" default="-1" flags="1024"/>
+        <element name="p2" type="integer" min="-1" max="999999" default="-1" flags="1024"/>
+        <element name="rx" type="float"/>
+        <element name="ry" type="float" flags="1024"/>
+        <element name="rz" type="float" flags="1024"/>
+        <element name="dx" type="float" min="-2" max="2" default="0.0"/>
+        <element name="dy" type="float" min="-2" max="2" default="0.0" flags="1024"/>
+        <element name="dz" type="float" min="-2" max="2" default="0.0" flags="1024"/>
+        <element name="sh" type="integer" min="0" max="3" default="0"/>
+        <element name="hx" type="float"/>
+        <element name="hy" type="float" flags="1024"/>
+        <element name="hz" type="float" flags="1024"/>
+        <element name="hrx" type="float"/>
+        <element name="hry" type="float" flags="1024"/>
+        <element name="hrz" type="float" flags="1024"/>
+        <element name="hxn" type="float" min="-6.2832" max="0" default="-1.5708"/>
+        <element name="hxp" type="float" min="0" max="6.2832" default="1.5708" flags="1024"/>
+        <element name="hyn" type="float" min="-6.2832" max="0" default="-1.5708"/>
+        <element name="hyp" type="float" min="0" max="6.2832" default="1.5708" flags="1024"/>
+        <element name="stif" type="float" min="0" max="1" default="1.0"/>
+        <element name="rotstif" type="float" min="0" max="1" default="1.0"/>
+        <element name="stam" type="float" min="0" max="1" default="0.25"/>
+        <element name="i" type="string"/>
+        <element name="Vstyle" type="string" default="joint"/>
+        <element name="vr" type="float" min="0" max="1" default="1.0"/>
+        <element name="vg" type="float" min="0" max="1" default="1.0" flags="1024"/>
+        <element name="vb" type="float" min="0" max="1" default="1.0" flags="1024"/>
+    </type>
+    <type name="Loader" context="Visual style definition">
+        <description><![CDATA[Loads 3d objects files.
+Visual styles placed in subdirectories (like "matrix") automatically access the parent directory if the file is not found in their subdirectory.]]></description>
+        <element name="loaded" type="SSGNode"/>
+        <element name="load" function="true"/>
+    </type>
+    <type name="m" context="Visual style definition">
+        <element name="se" type="float" flags="1024"/>
+        <element name="Vstyle" type="string"/>
+    </type>
+    <type name="Material" context="Visual style definition">
+        <description>
+            <![CDATA[Manipulate 3d objects surface properties (Material objects can be associated with geometry nodes).]]></description>
+        <element name="new" function="true"/>
+        <element name="diffuse" type="integer"/>
+        <element name="ambient" type="integer"/>
+        <element name="specular" type="integer"/>
+        <element name="emission" type="integer"/>
+        <element name="shininess" type="float"/>
+        <element name="colormat" type="integer"/>
+        <element name="translucent" type="integer"/>
+        <element name="setSmooth" function="true"/>
+        <element name="setFlat" function="true"/>
+        <element name="enable" function="true"/>
+        <element name="disable" function="true"/>
+        <element name="care" function="true"/>
+        <element name="dontcare" function="true"/>
+        <element name="texture" type="string"/>
+        <element name="object" type="Object" flags="1"/>
+    </type>
+    <type name="MechJoint" context="Visual style definition">
+        <description><![CDATA[Current joint properties during the simulation]]></description>
+        <element name="rx" type="float"/>
+        <element name="ry" type="float"/>
+        <element name="rz" type="float"/>
+        <element name="dx" type="float"/>
+        <element name="dy" type="float"/>
+        <element name="dz" type="float"/>
+        <element name="orient" type="Orient" flags="1"/>
+        <element name="absorient" type="Orient" flags="1"/>
+        <element name="calcorient" type="Orient" flags="1"/>
+        <element name="length" type="float" flags="1"/>
+        <element name="stif" type="float"/>
+        <element name="rotstif" type="float"/>
+        <element name="stress" type="float" flags="1"/>
+        <element name="rotstress" type="float" flags="1"/>
+    </type>
+    <type name="MechPart" context="Visual style definition">
+        <description><![CDATA[Current part properties during the simulation]]></description>
+        <element name="x" type="float"/>
+        <element name="y" type="float"/>
+        <element name="z" type="float"/>
+        <element name="pos" type="XYZ" flags="1"/>
+        <element name="orient" type="Orient" flags="1"/>
+        <element name="m" type="float"/>
+        <element name="s" type="float"/>
+        <element name="vol" type="float"/>
+        <element name="fr" type="float"/>
+    </type>
+    <type name="n" context="Visual style definition">
+        <element name="p" type="integer" min="-1" max="999999" default="-1"/>
+        <element name="j" type="integer" min="-1" max="999999" default="-1"/>
+        <element name="d" type="string"/>
+        <element name="i" type="string"/>
+        <element name="Vstyle" type="string" default="neuro"/>
+        <element name="getInputCount" type="integer" flags="3"/>
+        <element name="getInputNeuroDef" function="true" type="NeuroDef">
+            <arguments>
+                <argument type="integer"/>
+            </arguments>
+        </element>
+        <element name="getInputNeuroIndex" function="true" type="integer">
+            <arguments>
+                <argument type="integer"/>
+            </arguments>
+        </element>
+        <element name="getInputWeight" function="true" type="float">
+            <arguments>
+                <argument type="integer"/>
+            </arguments>
+        </element>
+        <element name="classObject" type="NeuroClass" flags="3"/>
+        <element name="class" type="string"/>
+        <element name="liveNeuro" type="Neuro" flags="1"/>
+        <element name="state" type="float"/>
+    </type>
+    <type name="p" context="Visual style definition">
+        <element name="x" type="float" flags="1024"/>
+        <element name="y" type="float" flags="1024"/>
+        <element name="z" type="float" flags="1024"/>
+        <element name="sh" type="integer" min="0" max="3" default="0"/>
+        <element name="s" type="float" min="0.1" max="10" default="1.0"/>
+        <element name="sx" type="float" min="0.05" max="5" default="1.0"/>
+        <element name="sy" type="float" min="0.05" max="5" default="1.0"/>
+        <element name="sz" type="float" min="0.05" max="5" default="1.0"/>
+        <element name="h" type="float" min="0" max="1" default="0.0"/>
+        <element name="dn" type="float" min="0.2" max="5" default="1.0"/>
+        <element name="fr" type="float" min="0" max="4" default="0.4"/>
+        <element name="ing" type="float" min="0" max="1" default="0.25"/>
+        <element name="as" type="float" min="0" max="1" default="0.25"/>
+        <element name="rx" type="float"/>
+        <element name="ry" type="float" flags="1024"/>
+        <element name="rz" type="float" flags="1024"/>
+        <element name="i" type="string"/>
+        <element name="Vstyle" type="string" default="part"/>
+        <element name="vr" type="float" min="0" max="1" default="1.0"/>
+        <element name="vg" type="float" min="0" max="1" default="1.0" flags="1024"/>
+        <element name="vb" type="float" min="0" max="1" default="1.0" flags="1024"/>
+    </type>
+    <type name="Scene" context="Visual style definition">
+        <description><![CDATA[Additional properties to be used in the current view]]></description>
+        <element name="backcolor" type="integer" min="0" max="16777215" default="16777215"/>
+        <element name="worldtexture" type="string"/>
+        <element name="dustcolor" type="integer" min="0" max="16777215" default="15126952"/>
+    </type>
+    <type name="VertexBuilder" context="Visual style definition">
+        <element name="new" function="true" type="void">
+            <arguments>
+                <argument name="type" type="integer"/>
+            </arguments>
+        </element>
+        <element name="newPolygon" function="true"/>
+        <element name="newTriangleFan" function="true"/>
+        <element name="newTriangles" function="true"/>
+        <element name="newTriangleStrip" function="true"/>
+        <element name="newQuads" function="true"/>
+        <element name="newQuadStrip" function="true"/>
+        <element name="newPoints" function="true"/>
+        <element name="newLines" function="true"/>
+        <element name="newLineLoop" function="true"/>
+        <element name="newLineStrip" function="true"/>
+        <element name="addVertex" function="true"/>
+        <element name="addNormal" function="true"/>
+        <element name="addNormal_1" function="true">
+            <description><![CDATA[use addNormal instead of this function]]></description>
+        </element>
+        <element name="addCalculatedNormal" function="true">
+            <description>
+                <![CDATA[calculate the normal vector from 3 coordinates. integer arguments are the vertices' indices. 0,1,2... = first, second, third vertex, -1,-2,-3,... = last, last-1, last-2 vertex]]></description>
+        </element>
+        <element name="addColor" function="true"/>
+        <element name="addTexCoord" function="true"/>
+        <element name="genTexCoordsXY" function="true"/>
+        <element name="genTexCoordsYZ" function="true"/>
+        <element name="genTexCoordsXZ" function="true"/>
+        <element name="genTexCoords" function="true"/>
+        <element name="node" type="SSGNode" flags="1">
+            <description><![CDATA[This field returns the geometry node for use in GeomBuilder. You have to set all relevant geometry properties before using this field. The usual sequence:
+1. newXXX - selects the geometry type (see your OpenGL manual for explanation)
+2. Set all properties (add vertices, normals, colors, texture coordinates, material). All unspecified properties are assumed to have default values.
+3. Use the resulting node ( GeomBuilder.add(VertexBuilder.node) )]]></description>
+        </element>
+        <element name="material" type="Object"/>
+        <element name="twosided" type="integer" min="0" max="1"/>
+    </type>
+    <type name="VisProperties" context="Visual style definition">
+        <element name="_propertyClear" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Using most _property functions is restricted for internal purposes. Use "property:" or "state:" definitions in your script files to change object properties.]]></description>
+            <arguments/>
+        </element>
+        <element name="_propertyAdd" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Using most _property functions is restricted for internal purposes. Use "property:" or "state:" definitions in your script files to change object properties.]]></description>
+            <arguments>
+                <argument name="id" type="string"/>
+                <argument name="type description" type="string"/>
+                <argument name="name" type="string"/>
+                <argument name="flags" type="integer"/>
+                <argument name="help text" type="string"/>
+            </arguments>
+        </element>
+        <element name="_propertyRemove" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Using most _property functions is restricted for internal purposes. Use "property:" or "state:" definitions in your script files to change object properties.]]></description>
+            <arguments>
+                <argument name="index" type="integer"/>
+            </arguments>
+        </element>
+        <element name="_propertyChange" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Using most _property functions is restricted for internal purposes. Use "property:" or "state:" definitions in your script files to change object properties.]]></description>
+            <arguments>
+                <argument name="id" type="string"/>
+                <argument name="type description" type="string"/>
+                <argument name="name" type="string"/>
+                <argument name="flags" type="integer"/>
+                <argument name="help text" type="string"/>
+            </arguments>
+        </element>
+        <element name="_propertyAddGroup" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Using most _property functions is restricted for internal purposes. Use "property:" or "state:" definitions in your script files to change object properties.]]></description>
+            <arguments>
+                <argument name="name" type="string"/>
+            </arguments>
+        </element>
+        <element name="_propertyRemoveGroup" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Using most _property functions is restricted for internal purposes. Use "property:" or "state:" definitions in your script files to change object properties.]]></description>
+            <arguments>
+                <argument name="index" type="integer"/>
+            </arguments>
+        </element>
+        <element name="_propertyExists" function="true" type="integer" flags="34">
+            <arguments>
+                <argument name="name" type="string"/>
+            </arguments>
+        </element>
+        <element name="_property_changed_index" type="integer" flags="35"/>
+        <element name="_property_changed_id" type="string" flags="35"/>
+        <element name="worldpan" type="integer" min="0" max="3" default="2" flags="192">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="worldbgcolor" type="integer" min="0" max="16777215" default="16764040" flags="192">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="hideworld" type="integer" min="0" max="1" default="0" flags="192">
+            <description><![CDATA[Can be useful for screenshots]]></description>
+        </element>
+        <element name="modelpan" type="integer" min="0" max="3" default="1" flags="192">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="bgcolor" type="integer" min="0" max="16777215" default="16764040" flags="192">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="bbox" type="integer" min="0" max="1" default="1" flags="192">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="joint_width" type="integer" min="10" max="150" default="100" flags="192">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="shadows" type="integer" min="0" max="1" default="1" flags="192">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="axes" type="integer" min="0" max="1" default="0" flags="192">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="haxes" type="integer" min="0" max="1" default="0" flags="192">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="shownames" type="integer" min="0" max="1" default="0" flags="192">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="symmetryplane" type="integer" min="0" max="1" default="0" flags="192">
+            <description><![CDATA[Displays a guess of the symmetry plane (may take a long time to compue for complex bodies).
+Use scripting and the ModelSymmetry class to compute symmetry accurately.
+Details of the symmetry estimation procedure are described in http://www.framsticks.com/bib/Jaskowski-and-Komosinski-2008]]></description>
+        </element>
+    </type>
+    <type name="VisualModel" context="Visual style definition">
+        <description><![CDATA[Visual representation of the Creature object.]]></description>
+        <element name="rootNode" type="SSGNode" flags="34"/>
+        <element name="partshadow" type="float" flags="34"/>
+        <element name="jointshadow" type="float" flags="34"/>
+        <element name="style" type="string" flags="34">
+            <description><![CDATA[visual style applied to this object]]></description>
+        </element>
+        <element name="args" type="string" flags="34">
+            <description><![CDATA[style parameters: Vstyle=name(args)]]></description>
+        </element>
+        <element name="getArg" function="true" type="string" flags="34">
+            <description><![CDATA[retrieve single style argument, as in:
+Vstyle=name(a=1,b=3)
+VisualModel.getArg("a") returns 1]]></description>
+            <arguments>
+                <argument name="name" type="string"/>
+            </arguments>
+        </element>
+        <element name="color" type="integer" min="0" max="16777215" default="16777215" flags="34">
+            <description><![CDATA[RGB format, 0xRRGGBB in hexadecimal]]></description>
+        </element>
+        <element name="brightness" type="float" min="0" max="2" default="1.0" flags="34"/>
+    </type>
+    <type name="VisualStyle" context="Visual style definition">
+        <element name="style" type="string" default="standard"/>
+        <element name="name" type="string" flags="19"/>
+        <element name="info" type="string" flags="19"/>
+        <element name="code" type="string" flags="16419"/>
+        <element name="streload" function="true" flags="2"/>
+        <element name="rebuild" function="true" flags="34"/>
+        <element name="tex" type="integer" min="0" max="2" default="1"/>
+        <element name="smooth" type="integer" min="0" max="1" default="1"/>
+        <element name="neurons" type="integer" min="0" max="1" default="1"/>
+        <element name="dust" type="integer" min="0" max="1" default="1"/>
+        <element name="energy" type="integer" min="0" max="1" default="1"/>
+        <element name="_propertyClear" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Using most _property functions is restricted for internal purposes. Use "property:" or "state:" definitions in your script files to change object properties.]]></description>
+            <arguments/>
+        </element>
+        <element name="_propertyAdd" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Using most _property functions is restricted for internal purposes. Use "property:" or "state:" definitions in your script files to change object properties.]]></description>
+            <arguments>
+                <argument name="id" type="string"/>
+                <argument name="type description" type="string"/>
+                <argument name="name" type="string"/>
+                <argument name="flags" type="integer"/>
+                <argument name="help text" type="string"/>
+            </arguments>
+        </element>
+        <element name="_propertyRemove" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Using most _property functions is restricted for internal purposes. Use "property:" or "state:" definitions in your script files to change object properties.]]></description>
+            <arguments>
+                <argument name="index" type="integer"/>
+            </arguments>
+        </element>
+        <element name="_propertyChange" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Using most _property functions is restricted for internal purposes. Use "property:" or "state:" definitions in your script files to change object properties.]]></description>
+            <arguments>
+                <argument name="id" type="string"/>
+                <argument name="type description" type="string"/>
+                <argument name="name" type="string"/>
+                <argument name="flags" type="integer"/>
+                <argument name="help text" type="string"/>
+            </arguments>
+        </element>
+        <element name="_propertyAddGroup" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Using most _property functions is restricted for internal purposes. Use "property:" or "state:" definitions in your script files to change object properties.]]></description>
+            <arguments>
+                <argument name="name" type="string"/>
+            </arguments>
+        </element>
+        <element name="_propertyRemoveGroup" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Using most _property functions is restricted for internal purposes. Use "property:" or "state:" definitions in your script files to change object properties.]]></description>
+            <arguments>
+                <argument name="index" type="integer"/>
+            </arguments>
+        </element>
+        <element name="_propertyExists" function="true" type="integer" flags="34">
+            <arguments>
+                <argument name="name" type="string"/>
+            </arguments>
+        </element>
+        <element name="_property_changed_index" type="integer" flags="35"/>
+        <element name="_property_changed_id" type="string" flags="35"/>
+        <element name="worldpan" type="integer" min="0" max="3" default="2" flags="192">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="worldbgcolor" type="integer" min="0" max="16777215" default="16764040" flags="192">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="hideworld" type="integer" min="0" max="1" default="0" flags="192">
+            <description><![CDATA[Can be useful for screenshots]]></description>
+        </element>
+        <element name="modelpan" type="integer" min="0" max="3" default="1" flags="192">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="bgcolor" type="integer" min="0" max="16777215" default="16764040" flags="192">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="bbox" type="integer" min="0" max="1" default="1" flags="192">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="joint_width" type="integer" min="10" max="150" default="100" flags="192">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="shadows" type="integer" min="0" max="1" default="1" flags="192">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="axes" type="integer" min="0" max="1" default="0" flags="192">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="haxes" type="integer" min="0" max="1" default="0" flags="192">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="shownames" type="integer" min="0" max="1" default="0" flags="192">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="symmetryplane" type="integer" min="0" max="1" default="0" flags="192">
+            <description><![CDATA[Displays a guess of the symmetry plane (may take a long time to compue for complex bodies).
+Use scripting and the ModelSymmetry class to compute symmetry accurately.
+Details of the symmetry estimation procedure are described in http://www.framsticks.com/bib/Jaskowski-and-Komosinski-2008]]></description>
+        </element>
+    </type>
+    <type name="World" context="Visual style definition">
+        <description><![CDATA[Environment properties.]]></description>
+        <element name="wrldtyp" type="integer" min="0" max="2" default="0"/>
+        <element name="wrldsiz" type="float" min="10" max="10000" default="20.0">
+            <description><![CDATA[Side length of the world]]></description>
+        </element>
+        <element name="wrldmap" type="string">
+            <description><![CDATA[Description of the world (only applies to world types: "Blocks" or "Height field").
+To generate a random landscape, use:
+   r[scaling] <sizex> <sizey> [seed]
+To generate a custom landscape, provide height values:
+   m[scaling] <sizex> <sizey> digits...
+ or
+   M[scaling] <sizex> <sizey> numbers...
+
+"digits..." is a sequence of integer values 0,1,2,..,9. You may also use '-' and '|' characters for smooth slides between blocks.
+"numbers..." is a sequence of floating point values, so the "M" option provides more freedom.
+[scaling] is an optional linear scaling expression in the form of *FACTOR+OFFSET or *FACTOR-OFFSET, for example "r*0.1-2 5 5" creates a 5x5 random map with a 10% amplitude, shifted down by 2.
+
+See also the WorldMap object.]]></description>
+        </element>
+        <element name="wrldwat" type="float" min="-20" max="200" default="-1.0"/>
+        <element name="wrldbnd" type="integer" min="0" max="2" default="0">
+            <description>
+                <![CDATA[Teleporting a creature that is outside of the world area is attempted every 'performance sampling period' steps. Teleport succeeds only when the target location in the world is empty (there is no collision).]]></description>
+        </element>
+        <element name="wrldg" type="float" min="0" max="10" default="1.0">
+            <description><![CDATA[You can adjust gravity for your experiments.
+The "official" setting used to evaluate and compare creatures is 1.]]></description>
+        </element>
+        <element name="wrldchg" function="true" type="void" flags="32">
+            <arguments/>
+        </element>
+        <element name="simtype" type="integer" min="0" max="1" default="0">
+            <description><![CDATA[MechaStick is a fast and simple primary Framsticks simulation engine.
+ODE is Open Dynamics Engine by Russel Smith et al.
+
+NOTE: switching between simulation engines causes removal of all objects in the world (e.g. creatures).]]></description>
+        </element>
+        <element name="nnspeed" type="float" min="0" max="1000" default="1.0">
+            <description>
+                <![CDATA[Number of neural network simulation steps in each physics simulation step]]></description>
+        </element>
+        <element name="rndcollisions" type="integer" min="0" max="1" default="1">
+            <description>
+                <![CDATA[When enabled, custom collision handlers are invoked in random order. This can help remove unfair bias in some experiments - for example where the same collision order in each simulation step would cause some creatures colliding with food to consume energy while other colliding creatures would starve.]]></description>
+        </element>
+        <element name="signals" type="WorldSignals" flags="35"/>
+    </type>
+    <type name="WorldMap" context="Visual style definition">
+        <description><![CDATA[Environment details for "Blocks" and "Heightfield" world type. The most important concept is a "Map", which is the array of Map elements. Internally, Maps have more elements than could be deduced from the user-supplied World.wrldsiz, as additional rows of element are added to provide smooth transitions to the flat surroundings.
+
+Blocks: x/ysize=World.wrldsiz+4 rows of blocks (from which only 2+World.wrldsiz rows are placed within the world boundaries)
+
+Smooth: x/ysize=World.wrldsiz+2 rows of vertices (creating World.wrldsiz+1 rows of triangles, everything within the world boundaries)
+]]></description>
+        <element name="xsize" type="integer" flags="1"/>
+        <element name="ysize" type="integer" flags="1"/>
+        <element name="getHeight" function="true" type="float">
+            <description><![CDATA[Height at any 2d coordinate]]></description>
+            <arguments>
+                <argument name="x" type="float"/>
+                <argument name="y" type="float"/>
+            </arguments>
+        </element>
+        <element name="getMap" function="true" type="Object">
+            <description><![CDATA[retrieve map cell object]]></description>
+            <arguments>
+                <argument name="x" type="integer"/>
+                <argument name="y" type="integer"/>
+            </arguments>
+        </element>
+        <element name="intersect" function="true" type="Vector">
+            <description><![CDATA[Calculate the intersection point between the world surface and the ray projected from "3d point" towards the given direction. 3D points are actually 3-elements Vector objects. The resulting vector contains the additional fourth element - the intersection point distance. The function returns null if there is no intersection.
+
+See "standard_events.inc" file, which uses "intersect" for calculating the world coordinates corresponding to the user-clicked screen location.
+Bugs: This function does not currently handle the heightfield environment correctly (works as if it was flat)]]></description>
+            <arguments>
+                <argument name="3d point" type="Vector"/>
+                <argument name="3d direction" type="Vector"/>
+                <argument name="range" type="float"/>
+            </arguments>
+        </element>
+        <element name="intersect" function="true" type="Vector">
+            <description>
+                <![CDATA[Works like intersect(3d point,3d direction,range) for inifinite range, that is without limiting the intersection distance]]></description>
+            <arguments>
+                <argument name="3d point" type="Vector"/>
+                <argument name="3d direction" type="Vector"/>
+            </arguments>
+        </element>
+    </type>
+    <type name="Signal" context="Signal label formula">
+        <element name="value" type="untyped" flags="1">
+            <description>
+                <![CDATA[Signal value can be any type. On the receiver side it is only available by accessing the individual Signal objects, i.e. after calling receiveSet() or receiveSingle(). The aggregating functions receive() and receiveFilter() ignore this attribute.]]></description>
+        </element>
+        <element name="power" type="float" flags="1">
+            <description>
+                <![CDATA[Signal power affects the aggregated signal value returned from receive() and receiveFilter().]]></description>
+        </element>
+        <element name="flavor" type="float" flags="1">
+            <description>
+                <![CDATA[Signal flavor can be used to differentiate between signals in a single channel.]]></description>
+        </element>
+        <element name="channel" type="string" flags="1">
+            <description><![CDATA[Channel name, read-only.]]></description>
+        </element>
+        <element name="pos" type="XYZ" flags="1">
+            <description><![CDATA[Signal position, read-only.]]></description>
+        </element>
+    </type>
+    <type name="ClassBrowser" context="Command line interface">
+        <description><![CDATA[Object reference, can be used to provide online hints.]]></description>
+        <element name="search" function="true" type="integer">
+            <description>
+                <![CDATA[Searches the class reference and returns the number of  hits (results). getXXX(item) function can be used to retrieve the results.]]></description>
+            <arguments>
+                <argument name="Text" type="string"/>
+            </arguments>
+        </element>
+        <element name="resultCount" type="integer" flags="1"/>
+        <element name="getType" function="true" type="integer">
+            <description><![CDATA[0 = Unknown
+1 = Context
+2 = Class
+3 = Member
+4 = Integer field
+5 = Float field
+6 = String field
+7 = Object field
+8 = Function]]></description>
+            <arguments>
+                <argument name="item" type="integer"/>
+            </arguments>
+        </element>
+        <element name="getTypeName" function="true" type="string">
+            <arguments>
+                <argument name="item" type="integer"/>
+            </arguments>
+        </element>
+        <element name="getLabel" function="true" type="string">
+            <description><![CDATA[Short texual label of the search result.]]></description>
+            <arguments>
+                <argument name="item" type="integer"/>
+            </arguments>
+        </element>
+        <element name="getText" function="true" type="string">
+            <description><![CDATA[Complete result text.]]></description>
+            <arguments>
+                <argument name="item" type="integer"/>
+            </arguments>
+        </element>
+    </type>
+    <type name="CLI" context="Command line interface">
+        <description><![CDATA[Commandline support functions.]]></description>
+        <element name="script" type="string"/>
+        <element name="execute" function="true" type="void">
+            <arguments>
+                <argument name="command" type="string"/>
+            </arguments>
+        </element>
+        <element name="cmdhandler" type="string"/>
+        <element name="quit" function="true"/>
+        <element name="print" function="true" type="void">
+            <arguments>
+                <argument name="text" type="string"/>
+            </arguments>
+        </element>
+        <element name="println" function="true" type="void">
+            <arguments>
+                <argument name="text" type="string"/>
+            </arguments>
+        </element>
+        <element name="quiet" type="integer" min="0" max="1">
+            <description><![CDATA[enabled by -Q]]></description>
+        </element>
+        <element name="addMacro" function="true" type="void">
+            <arguments>
+                <argument name="name" type="string"/>
+                <argument name="numargs" type="integer"/>
+                <argument name="definition" type="string"/>
+                <argument name="helptext" type="string"/>
+            </arguments>
+        </element>
+        <element name="removeMacro" function="true" type="void">
+            <description>
+                <![CDATA[(numargs==-2) means remove all macros matching the name, otherwise only one definition is removed]]></description>
+            <arguments>
+                <argument name="name" type="string"/>
+                <argument name="numargs" type="integer"/>
+            </arguments>
+        </element>
+        <element name="listMacros" function="true" type="void">
+            <arguments/>
+        </element>
+        <element name="stdin" type="Object" flags="3"/>
+        <element name="stdout" type="Object" flags="3"/>
+        <element name="msgtype" type="integer" min="0" max="1"/>
+    </type>
+    <type name="RowFormat" context="Command line interface">
+        <description><![CDATA[Used for creating simple listings of objects (in command line applications). There is only one shared RowFormat object. In order to use RowFormat you should first configure it, by adding column definitions (prepare or addColumn), i.e. defining column names and widths. Then, the "format" method can be invoked on a number of objects (of the same class) returning the formatted rows of the table.
+
+Example:
+RowFormat.clear();
+RowFormat.prepare(Genotype.*,"name/20,strsiz/5,nnsiz/5,fit/6");
+CLI.println(RowFormat.format(Genotype.*));]]></description>
+        <element name="prepare" function="true" type="void">
+            <description>
+                <![CDATA[Adds a number of columns, described as FIELD_NAME/WIDTH, columns are separated by "," (comma). Existing column definitions are not removed. Usually you will need to call "clear()" before "prepare".]]></description>
+            <arguments>
+                <argument type="Object"/>
+                <argument name="column descriptions" type="string"/>
+            </arguments>
+        </element>
+        <element name="format" function="true" type="string">
+            <description><![CDATA[Returns the formatted string taking data from the supplied object.]]></description>
+            <arguments>
+                <argument type="Object"/>
+            </arguments>
+        </element>
+        <element name="clear" function="true" type="void">
+            <description><![CDATA[Remove all existing column definitions.]]></description>
+            <arguments/>
+        </element>
+        <element name="addColumn" function="true" type="void">
+            <description><![CDATA[Low level call, adds a single column. "prepare" is better.]]></description>
+            <arguments>
+                <argument name="field index" type="integer"/>
+                <argument name="column width" type="integer"/>
+            </arguments>
+        </element>
+        <element name="fillchar" type="string">
+            <description><![CDATA[The characted used for padding the columns contents]]></description>
+        </element>
+        <element name="fieldsep" type="string">
+            <description><![CDATA[The character used for separating columns]]></description>
+        </element>
+        <element name="header" type="string" flags="1">
+            <description>
+                <![CDATA[Contains the field names with the same formatting applied (i.e. with fill and separators)]]></description>
+        </element>
+    </type>
+    <type name="CreatureCharts" context="Framsticks Theater">
+        <description><![CDATA[Manages charts for monitoring creatures performance.
+This class has no corresponding static object. If you want to use it, you have to create an object or get a reference to the existing object.]]></description>
+        <element name="selected" type="integer" flags="258"/>
+        <element name="addSelected" function="true" flags="256">
+            <description><![CDATA[Add the chart for currenly selected property]]></description>
+        </element>
+        <element name="add" function="true" flags="288">
+            <description><![CDATA[return the new Window object with chart as its client
+arguments: property to be tracked]]></description>
+        </element>
+        <element name="removeAll" function="true" flags="256"/>
+        <element name="resetAll" function="true" flags="256">
+            <description><![CDATA[Removes all data from the chart windows.]]></description>
+        </element>
+        <element name="createChart" function="true" flags="288">
+            <description><![CDATA[return the new chart object (can be client for Window)
+arguments: property to be tracked]]></description>
+        </element>
+        <element name="creature" type="untyped" flags="290"/>
+    </type>
+    <type name="CreatureSelection" context="Framsticks Theater">
+        <element name="count" type="integer" flags="1"/>
+        <element name="get" function="true" type="Creature">
+            <arguments>
+                <argument name="index" type="integer"/>
+            </arguments>
+        </element>
+        <element name="add" function="true" type="void">
+            <arguments>
+                <argument type="Creature"/>
+            </arguments>
+        </element>
+        <element name="remove" function="true" type="void">
+            <arguments>
+                <argument type="Creature"/>
+            </arguments>
+        </element>
+        <element name="clear" function="true" type="void">
+            <arguments/>
+        </element>
+    </type>
+    <type name="DynaChart" context="Framsticks Theater">
+        <description>
+            <![CDATA[Line chart (visual object). Can be used as the client object in the Window.]]></description>
+        <element name="new" function="true" type="DynaChart" flags="32">
+            <arguments/>
+        </element>
+        <element name="add" function="true" flags="288">
+            <description><![CDATA[add new value]]></description>
+        </element>
+        <element name="clear" function="true" type="void" flags="288">
+            <arguments/>
+        </element>
+        <element name="xscale" type="integer" min="1" max="20" flags="288"/>
+    </type>
+    <type name="DynaChart2D" context="Framsticks Theater">
+        <description>
+            <![CDATA[2D Line chart (visual object). Can be used as the client object in the Window.]]></description>
+        <element name="new" function="true" type="DynaChart2D" flags="32">
+            <arguments/>
+        </element>
+        <element name="add" function="true" type="void" flags="288">
+            <description><![CDATA[add (x,y) values for the next graph point]]></description>
+            <arguments>
+                <argument name="x coordinate" type="float"/>
+                <argument name="y coordinate" type="float"/>
+            </arguments>
+        </element>
+        <element name="clear" function="true" type="void" flags="288">
+            <arguments/>
+        </element>
+        <element name="memory" type="integer" min="1" max="1000" default="100" flags="288">
+            <description><![CDATA[maximum number of (x,y) pairs drawn in the graph.]]></description>
+        </element>
+    </type>
+    <type name="GLDisplay" context="Framsticks Theater">
+        <description><![CDATA[OpenGL display for the Framsticks Theater application.]]></description>
+        <element name="simsteps" type="integer" min="0" max="999999" default="0">
+            <description>
+                <![CDATA[0 = simulation is disabled. In most cases you should use desiredsimspeed as it ensures automatic throttle control.]]></description>
+        </element>
+        <element name="desiredsimspeed" type="float" min="0" max="999999" default="0.0">
+            <description><![CDATA[Desired simulation speed in steps/second. 0 = simulation is disabled.]]></description>
+        </element>
+        <element name="userspeed" type="float" min="0" max="100" default="1.0">
+            <description><![CDATA[User interface sets this property to adjust simulation speed.]]></description>
+        </element>
+        <element name="stop" function="true"/>
+        <element name="resume" function="true"/>
+        <element name="draw" function="true"/>
+        <element name="quit" function="true"/>
+        <element name="active" type="integer" min="0" max="1" flags="1"/>
+        <element name="banner" type="string"/>
+        <element name="minfps" type="integer" min="1" max="100" default="5"/>
+        <element name="maxfps" type="integer" min="1" max="100" default="30"/>
+        <element name="fps" type="float" flags="1">
+            <description><![CDATA[Frames Per Second (measured)]]></description>
+        </element>
+        <element name="fpsvisible" type="integer" min="0" max="1"/>
+        <element name="messagesVisible" type="integer" min="0" max="1"/>
+        <element name="clearMessages" function="true"/>
+        <element name="messagesWindow" type="Object" flags="1">
+            <description><![CDATA[get window object (class Window)]]></description>
+        </element>
+        <element name="size_x" type="integer" flags="1"/>
+        <element name="size_y" type="integer" flags="1"/>
+        <element name="createWindow" function="true" type="Window">
+            <description><![CDATA[create and return the new window object.]]></description>
+            <arguments>
+                <argument name="style" type="integer"/>
+                <argument name="title" type="string"/>
+                <argument name="client" type="Object"/>
+            </arguments>
+        </element>
+        <element name="deleteWindow" function="true" type="void">
+            <arguments>
+                <argument type="Window"/>
+            </arguments>
+        </element>
+        <element name="newCreatureCharts" function="true"/>
+        <element name="newSimStatsCharts" function="true"/>
+        <element name="user_interaction" type="integer" min="0" max="31" default="31">
+            <description><![CDATA[Bit field:
+1 - menu access
+2 - rotate camera
+4 - use manupulator
+8 - select creatures
+16 - change ShowManager options in menu (including switching shows)
+Bits 2-16 are not implemented in the old Framsticks Theater application.]]></description>
+        </element>
+        <element name="world_visibility" type="integer" min="0" max="31" default="31">
+            <description><![CDATA[Bit field:
+1 - background/panorama
+2 - environment
+4 - creatures
+8 - dust (particles)
+16 - energy transfers (particles)
+Not implemented in the old Framsticks Theater application.]]></description>
+        </element>
+        <element name="menu_visible" type="integer" min="0" max="1">
+            <description><![CDATA[Not implemented in the old Framsticks Theater application.]]></description>
+        </element>
+        <element name="menu_state" type="string">
+            <description><![CDATA[Not implemented in the old Framsticks Theater application.]]></description>
+        </element>
+        <element name="back_action" type="string">
+            <description><![CDATA[Not implemented in the old Framsticks Theater application.]]></description>
+        </element>
+        <element name="skybox" type="string">
+            <description><![CDATA[Traditionally, all visualization aspects belonged to the *.style file, which is not yet implemented in mobi version. But actually, changing some (or even all) aspects of the world directly in the show might be highly desirable in many "interactive" scripts. So this is the forerunner.
+Skybox name can be a list of 6 cube face textures (separated by slash), single name with _ placeholder (will be replaced by 1-6 for 6 cube faces) or a regular name (the same texture on all 6 faces).
+Not implemented in the old Framsticks Theater application.]]></description>
+        </element>
+        <element name="bgcolor" type="integer" min="0" max="16777215" default="16777215">
+            <description><![CDATA[Not implemented in the old Framsticks Theater application.]]></description>
+        </element>
+        <element name="dustcolor" type="integer" min="0" max="16777215" default="15126952">
+            <description><![CDATA[Not implemented in the old Framsticks Theater application.]]></description>
+        </element>
+        <element name="world3d" type="Obj3D" flags="1">
+            <description><![CDATA[Not implemented in the old Framsticks Theater application.]]></description>
+        </element>
+        <element name="project3D" function="true" type="XYZ">
+            <description><![CDATA[Returns 2D position of the 3D point in world or modelviewer coordinates, 'object' can be Obj3D or GUIElement/Model
+Not implemented in the old Framsticks Theater application.]]></description>
+            <arguments>
+                <argument name="object" type="untyped"/>
+                <argument name="point" type="XYZ"/>
+            </arguments>
+        </element>
+        <element name="mode" type="integer" min="0" max="2">
+            <description><![CDATA[Not implemented in the old Framsticks Theater application.]]></description>
+        </element>
+        <element name="supported_modes" type="integer" min="0" max="7" flags="1">
+            <description>
+                <![CDATA[Bitmask of supported display modes.Not implemented in the old Framsticks Theater application.]]></description>
+        </element>
+    </type>
+    <type name="GUI" context="Framsticks Theater">
+        <description><![CDATA[Manage GUI elements]]></description>
+        <element name="newLabel" function="true" type="GUIElement">
+            <arguments>
+                <argument name="name" type="string"/>
+                <argument name="text" type="string"/>
+            </arguments>
+        </element>
+        <element name="newButton" function="true" type="GUIElement">
+            <arguments>
+                <argument name="name" type="string"/>
+                <argument name="text" type="string"/>
+            </arguments>
+        </element>
+        <element name="newImage" function="true" type="GUIElement">
+            <arguments>
+                <argument name="name" type="string"/>
+                <argument name="filename" type="string"/>
+            </arguments>
+        </element>
+        <element name="newModel" function="true" type="GUIElement">
+            <arguments>
+                <argument name="name" type="string"/>
+                <argument name="genotype" type="string"/>
+            </arguments>
+        </element>
+        <element name="newTextview" function="true" type="GUIElement">
+            <arguments>
+                <argument name="name" type="string"/>
+                <argument name="text" type="string"/>
+            </arguments>
+        </element>
+        <element name="newList" function="true" type="GUIElement">
+            <arguments>
+                <argument name="name" type="string"/>
+            </arguments>
+        </element>
+        <element name="newDrawing" function="true" type="GUIElement">
+            <arguments>
+                <argument name="name" type="string"/>
+            </arguments>
+        </element>
+        <element name="newBubble" function="true" type="GUIElement">
+            <arguments>
+                <argument name="name" type="string"/>
+                <argument name="text" type="string"/>
+            </arguments>
+        </element>
+        <element name="newSlider" function="true" type="GUIElement">
+            <arguments>
+                <argument name="name" type="string"/>
+                <argument name="value" type="integer"/>
+                <argument name="min" type="integer"/>
+                <argument name="max" type="integer"/>
+            </arguments>
+        </element>
+        <element name="newGroup" function="true" type="GUIElement">
+            <arguments>
+                <argument name="name" type="string"/>
+            </arguments>
+        </element>
+        <element name="newTextField" function="true" type="GUIElement">
+            <arguments>
+                <argument name="name" type="string"/>
+                <argument name="text" type="string"/>
+            </arguments>
+        </element>
+        <element name="newScroll" function="true" type="GUIElement">
+            <arguments>
+                <argument name="name" type="string"/>
+            </arguments>
+        </element>
+        <element name="newSpinner" function="true" type="GUIElement">
+            <arguments>
+                <argument name="name" type="string"/>
+            </arguments>
+        </element>
+        <element name="newBlocker" function="true" type="GUIElement">
+            <arguments>
+                <argument name="name" type="string"/>
+            </arguments>
+        </element>
+        <element name="get" function="true" type="GUIElement">
+            <description><![CDATA[Returns null if there is no such element]]></description>
+            <arguments>
+                <argument name="name" type="string"/>
+            </arguments>
+        </element>
+        <element name="removeElement" function="true" type="void">
+            <arguments>
+                <argument name="object or name" type="untyped"/>
+            </arguments>
+        </element>
+        <element name="removeAll" function="true" type="void">
+            <arguments/>
+        </element>
+        <element name="fontHeight" function="true" type="void">
+            <arguments>
+                <argument name="font id" type="integer"/>
+            </arguments>
+        </element>
+        <element name="clipboard" type="string"/>
+        <element name="setTimeout" function="true" type="void">
+            <description>
+                <![CDATA[Events can be rescheduled by reusing identifiers. Cancel the event by setting its function to null.]]></description>
+            <arguments>
+                <argument name="identifier" type="string"/>
+                <argument name="timeout" type="float"/>
+                <argument name="function" type="FunctionReference"/>
+            </arguments>
+        </element>
+        <element name="messageBox" function="true" type="void">
+            <arguments>
+                <argument name="title" type="string"/>
+                <argument name="message" type="string"/>
+            </arguments>
+        </element>
+        <element name="messageBox4" function="true" type="void">
+            <arguments>
+                <argument name="title" type="string"/>
+                <argument name="message" type="string"/>
+                <argument name="buttons" type="Vector"/>
+                <argument name="function" type="FunctionReference"/>
+            </arguments>
+        </element>
+        <element name="playSound" function="true" type="void">
+            <arguments>
+                <argument name="name" type="string"/>
+            </arguments>
+        </element>
+        <element name="KEY_BACK" type="integer" flags="1"/>
+        <element name="KEY_MENU" type="integer" flags="1"/>
+        <element name="KEY_SEARCH" type="integer" flags="1"/>
+        <element name="KEY_LEFT" type="integer" flags="1"/>
+        <element name="KEY_RIGHT" type="integer" flags="1"/>
+        <element name="top_left" type="Element" flags="1"/>
+        <element name="top_center" type="Element" flags="1"/>
+        <element name="top_right" type="Element" flags="1"/>
+        <element name="bottom_left" type="Element" flags="1"/>
+        <element name="bottom_center" type="Element" flags="1"/>
+        <element name="bottom_right" type="Element" flags="1"/>
+        <element name="rect" type="Rectangle" flags="1">
+            <description>
+                <![CDATA[Available GUI area (excluding margins when applicable). List layout function receives its current list item area as GUI.rect]]></description>
+        </element>
+    </type>
+    <type name="GUIElement" context="Framsticks Theater">
+        <description><![CDATA[GUI element]]></description>
+        <element name="name" type="string"/>
+        <element name="text" type="string"/>
+        <element name="image" type="untyped"/>
+        <element name="tex_margin" type="float"/>
+        <element name="border_margin" type="float"/>
+        <element name="bgcolor" type="integer"/>
+        <element name="fgcolor" type="integer"/>
+        <element name="align" type="integer">
+            <description>
+                <![CDATA[labels: -1/0/1 means left/center/right, buttons and lists: 0/1 means horizontal/vertical]]></description>
+        </element>
+        <element name="valign" type="integer">
+            <description><![CDATA[-1/0/1 means top/center/bottom]]></description>
+        </element>
+        <element name="x" type="float"/>
+        <element name="y" type="float"/>
+        <element name="width" type="float"/>
+        <element name="height" type="float"/>
+        <element name="tooltip" type="string"/>
+        <element name="row_height" type="float"/>
+        <element name="addItem" function="true" type="integer">
+            <arguments>
+                <argument name="data" type="untyped"/>
+            </arguments>
+        </element>
+        <element name="insertItem" function="true" type="integer">
+            <arguments>
+                <argument name="position" type="integer"/>
+                <argument name="data" type="untyped"/>
+            </arguments>
+        </element>
+        <element name="getItem" function="true" type="untyped">
+            <arguments>
+                <argument name="index" type="integer"/>
+            </arguments>
+        </element>
+        <element name="setItem" function="true" type="void">
+            <arguments>
+                <argument name="index" type="integer"/>
+                <argument name="data" type="untyped"/>
+            </arguments>
+        </element>
+        <element name="getItemRect" function="true" type="Rect">
+            <description><![CDATA[Returns null if the requested item is scrolled out of view.]]></description>
+            <arguments>
+                <argument name="index" type="integer"/>
+            </arguments>
+        </element>
+        <element name="removeItem" function="true" type="void">
+            <arguments>
+                <argument name="index" type="integer"/>
+            </arguments>
+        </element>
+        <element name="removeAllItems" function="true" type="void">
+            <arguments/>
+        </element>
+        <element name="items" type="untyped">
+            <description><![CDATA[List items can be defined by a Vector object or callback function (returning item for index). Item can be any object. Built-in display function supports string and Vector items.
+Example:
+GUI->list.addItem("string item");
+GUI->list.addItem(["item text","picture"]);]]></description>
+        </element>
+        <element name="item_count" type="integer">
+            <description><![CDATA[Number of items is readonly for Vector lists (reflects the current Vector size). The number of items in the Callback list must be set explicitly. Setting the item_count must be the last stage of setting up a callback list because it triggers the refresh (and is the only list property that does so).
+Example:
+GUI->list.items=function listfun; GUI->list.item_count=1000;
+function listfun(i) {return "Item #"+i;}]]></description>
+        </element>
+        <element name="item_display" type="untyped">
+            <description><![CDATA[Called when the list item is constructed or updated. Use GUI.newXXX() to add the desired GUI elements for the item. List items are reused, check if the element already exists before adding.
+Example:
+function myDisplay(list_element,list_index)
+{
+if (!GUI->mylabel) GUI.newLabel("mylabel",);
+GUI->mylabel.text=list_element.getItem(list_index);
+}]]></description>
+        </element>
+        <element name="item_layout" type="untyped">
+            <description><![CDATA[Called when the list item is resized (this happens after item_display). Place your elements inside the area defined by GUI.rect
+Example:
+function myLayout(list_element,list_index)
+{
+GUI->mylabel.rect=GUI.rect;
+}]]></description>
+        </element>
+        <element name="rect" type="Rectangle"/>
+        <element name="absolute_rect" type="Rectangle"/>
+        <element name="setRect" function="true" type="void">
+            <arguments>
+                <argument name="x" type="float"/>
+                <argument name="y" type="float"/>
+                <argument name="width" type="float"/>
+                <argument name="height" type="float"/>
+            </arguments>
+        </element>
+        <element name="setPos" function="true" type="void">
+            <arguments>
+                <argument name="x" type="float"/>
+                <argument name="y" type="float"/>
+            </arguments>
+        </element>
+        <element name="transform" type="Transform"/>
+        <element name="setAutolayout" function="true" type="void">
+            <description><![CDATA[rel_* values refer to the parent element's dimensions]]></description>
+            <arguments>
+                <argument name="x" type="float"/>
+                <argument name="y" type="float"/>
+                <argument name="width" type="float"/>
+                <argument name="height" type="float"/>
+                <argument name="rel_x" type="float"/>
+                <argument name="rel_y" type="float"/>
+                <argument name="rel_width" type="float"/>
+                <argument type="float"/>
+            </arguments>
+        </element>
+        <element name="minimal_rect" type="Rectangle" flags="1"/>
+        <element name="font" type="integer" min="0" max="5"/>
+        <element name="selected" type="integer"/>
+        <element name="data" type="untyped"/>
+        <element name="mode" type="integer">
+            <description><![CDATA[Drawing: 0..6 = GL modes (GL_LINE_STRIP, GL_LINE_LOOP, GL_LINES, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, GL_TRIANGLES, GL_POINTS)
+Image: 0=Normal, 1=Border, 2=EmptyBorder, 3=HorizBorder, 4=VertBorder, 5=Tile
+Textview: 0=plain text, 1=HTML, 2=plain text displaying cursor even when readonly
+Model: (bitfield) 1=display grid, 2=display neural network]]></description>
+        </element>
+        <element name="enabled" type="integer">
+            <description><![CDATA[For most elements: 0=readonly, 1=interaction/editing enabled]]></description>
+        </element>
+        <element name="autorepeat" type="integer" min="0" max="1"/>
+        <element name="style" type="integer">
+            <description><![CDATA[Button: 0=regular, 1=borderless
+List: 0=regular, 1=invisible selection
+Textfield: 0=dark border, 1=bright border]]></description>
+        </element>
+        <element name="feedback" type="integer"/>
+        <element name="userdata" type="untyped"/>
+        <element name="visible" type="integer" min="0" max="1"/>
+        <element name="addTo" function="true" type="void">
+            <arguments>
+                <argument name="parent" type="GUIElement"/>
+            </arguments>
+        </element>
+        <element name="scrollIntoView" function="true" type="void">
+            <arguments>
+                <argument name="index" type="integer"/>
+            </arguments>
+        </element>
+        <element name="scroll_x" type="float"/>
+        <element name="scroll_y" type="float"/>
+        <element name="scroll_w" type="float"/>
+        <element name="scroll_h" type="float"/>
+        <element name="page_w" type="float"/>
+        <element name="page_h" type="float"/>
+        <element name="focus" type="integer" min="0" max="1"/>
+        <element name="edit" function="true" type="void">
+            <arguments>
+                <argument name="characters" type="string"/>
+            </arguments>
+        </element>
+        <element name="orient" type="Orient" flags="1"/>
+        <element name="min" type="float"/>
+        <element name="max" type="float"/>
+        <element name="animSetBegin" function="true" type="void">
+            <arguments/>
+        </element>
+        <element name="animSetEnd" function="true" type="void">
+            <arguments/>
+        </element>
+        <element name="startAnimation" function="true" type="void">
+            <arguments>
+                <argument name="duration" type="float"/>
+            </arguments>
+        </element>
+    </type>
+    <type name="ImageExport" context="Framsticks Theater">
+        <element name="imgex_outdir" type="string" default=".">
+            <description><![CDATA[Directory name WITHOUT trailing '/' sign]]></description>
+        </element>
+        <element name="imgex_outfiles" type="string" default="scene_%04d.jpg">
+            <description><![CDATA[Frame number replaces %d (eg. 'image%03d.jpg')]]></description>
+        </element>
+        <element name="imgex_format" type="integer" min="0" max="2"/>
+        <element name="imgex_compress" type="integer" min="0" max="100" default="15"/>
+        <element name="imgex_skip" type="integer">
+            <description><![CDATA[A scene file is generated each (n+1) simulation steps
+(a small value means more frames and smooth animation)]]></description>
+        </element>
+        <element name="imgex_startf" type="integer" min="0" max="1000000" default="0">
+            <description><![CDATA[Starting number]]></description>
+        </element>
+        <element name="imgex_maxframes" type="integer" min="0" max="1000000" default="10000">
+            <description><![CDATA[How many frames are to be generated?]]></description>
+        </element>
+        <element name="imgex_enable" function="true" flags="8"/>
+        <element name="imgex_disable" function="true" flags="8"/>
+        <element name="imgex_now" function="true" flags="8"/>
+        <element name="imgex_currframe" type="integer" flags="18"/>
+        <element name="imgex_enabled" type="integer" min="0" max="1" flags="18"/>
+        <element name="imgex_lastfile" type="string" flags="18"/>
+    </type>
+    <type name="Material" context="Framsticks Theater">
+        <description><![CDATA[Material object]]></description>
+        <element name="new" function="true" type="Material">
+            <arguments/>
+        </element>
+        <element name="clone" function="true" type="Material">
+            <arguments/>
+        </element>
+        <element name="color" type="string" flags="256"/>
+        <element name="lighting" type="integer" min="0" max="1" flags="256"/>
+        <element name="alphatest" type="float" min="0" max="1" flags="256"/>
+        <element name="shine" type="integer" flags="256"/>
+        <element name="texture" type="string" flags="256"/>
+        <element name="shader" type="Shader" flags="256"/>
+    </type>
+    <type name="Matrix" context="Framsticks Theater">
+        <description><![CDATA[4x4 Marix object]]></description>
+        <element name="new" function="true" type="Matrix">
+            <arguments/>
+        </element>
+        <element name="newRotation" function="true" type="Matrix">
+            <arguments>
+                <argument name="angles" type="XYZ"/>
+            </arguments>
+        </element>
+        <element name="newTranslation" function="true" type="Matrix">
+            <arguments>
+                <argument name="translation" type="XYZ"/>
+            </arguments>
+        </element>
+        <element name="newScale" function="true" type="Matrix">
+            <arguments>
+                <argument name="angles" type="XYZ"/>
+            </arguments>
+        </element>
+        <element name="add" function="true" type="Matrix" flags="256">
+            <arguments>
+                <argument name="another matrix" type="Matrix"/>
+            </arguments>
+        </element>
+        <element name="mul" function="true" type="Matrix" flags="256">
+            <arguments>
+                <argument name="another matrix" type="Matrix"/>
+            </arguments>
+        </element>
+        <element name="translate" function="true" type="Matrix" flags="256">
+            <arguments>
+                <argument name="translation" type="XYZ"/>
+            </arguments>
+        </element>
+        <element name="rotate" function="true" type="Matrix" flags="256">
+            <arguments>
+                <argument name="axis" type="XYZ"/>
+                <argument name="angle" type="float"/>
+            </arguments>
+        </element>
+        <element name="scale" function="true" type="Matrix" flags="256">
+            <arguments>
+                <argument name="scale" type="XYZ"/>
+            </arguments>
+        </element>
+    </type>
+    <type name="NeuroDiagram" context="Framsticks Theater">
+        <description><![CDATA[Can be used as the client object in the Window.]]></description>
+        <element name="new" function="true" flags="32"/>
+        <element name="showCreature" function="true" type="void" flags="288">
+            <arguments>
+                <argument type="Creature"/>
+            </arguments>
+        </element>
+        <element name="showModel" function="true" type="void" flags="288">
+            <arguments>
+                <argument type="Model"/>
+            </arguments>
+        </element>
+        <element name="hide" function="true" type="void" flags="288">
+            <arguments/>
+        </element>
+    </type>
+    <type name="Obj3D" context="Framsticks Theater">
+        <description><![CDATA[3D object]]></description>
+        <element name="newEmpty" function="true" type="Obj3D">
+            <arguments/>
+        </element>
+        <element name="newFromCreature" function="true" type="Obj3D">
+            <arguments>
+                <argument type="untyped"/>
+            </arguments>
+        </element>
+        <element name="newText" function="true" type="Obj3D">
+            <arguments>
+                <argument name="text" type="string"/>
+                <argument name="horizontal align" type="integer"/>
+                <argument name="vertical align" type="integer"/>
+                <argument name="transformation" type="Matrix"/>
+            </arguments>
+        </element>
+        <element name="newImage" function="true" type="Obj3D">
+            <arguments>
+                <argument name="image" type="string"/>
+                <argument name="width" type="float"/>
+                <argument name="height" type="float"/>
+                <argument name="horizontal align" type="float"/>
+                <argument name="vertical align" type="float"/>
+            </arguments>
+        </element>
+        <element name="newBillboard" function="true" type="Obj3D">
+            <arguments>
+                <argument name="payload" type="Obj3D"/>
+            </arguments>
+        </element>
+        <element name="clone" function="true" type="Obj3D">
+            <arguments/>
+        </element>
+        <element name="load" function="true" type="Obj3D">
+            <arguments>
+                <argument name="filename" type="string"/>
+            </arguments>
+        </element>
+        <element name="name" type="string" flags="256"/>
+        <element name="visible" type="integer" min="0" max="1" flags="256"/>
+        <element name="transparent" type="integer" min="0" max="1" flags="256"/>
+        <element name="material" type="Material" flags="256"/>
+        <element name="add" function="true" type="void" flags="256">
+            <arguments>
+                <argument name="child object" type="Obj3D"/>
+            </arguments>
+        </element>
+        <element name="get" function="true" type="Obj3D" flags="256">
+            <arguments>
+                <argument name="index" type="integer"/>
+            </arguments>
+        </element>
+        <element name="children" type="integer" flags="257"/>
+        <element name="parent" type="Obj3D" flags="257"/>
+        <element name="removeFromParent" function="true" type="void" flags="256">
+            <arguments/>
+        </element>
+        <element name="deleteChildren" function="true" type="void" flags="256">
+            <arguments/>
+        </element>
+        <element name="delete" function="true" type="void" flags="256">
+            <arguments/>
+        </element>
+        <element name="center" type="XYZ" flags="257"/>
+        <element name="size" type="float" flags="257"/>
+        <element name="transform" type="Matrix" flags="256"/>
+        <element name="position" type="XYZ" flags="256"/>
+        <element name="rotation" type="XYZ" flags="256"/>
+        <element name="scale" type="XYZ" flags="256"/>
+        <element name="setPositionAndRotation" function="true" type="void" flags="256">
+            <arguments>
+                <argument name="position" type="XYZ"/>
+                <argument name="rotation" type="XYZ"/>
+            </arguments>
+        </element>
+        <element name="transformMesh" function="true" type="void" flags="256">
+            <arguments>
+                <argument type="Matrix"/>
+            </arguments>
+        </element>
+    </type>
+    <type name="Rectangle" context="Framsticks Theater">
+        <description><![CDATA[GUI Rectangle]]></description>
+        <element name="x" type="float" flags="256"/>
+        <element name="y" type="float" flags="256"/>
+        <element name="width" type="float" flags="256"/>
+        <element name="height" type="float" flags="256"/>
+        <element name="newFromXYWH" function="true" type="Rectangle">
+            <arguments>
+                <argument name="x" type="float"/>
+                <argument name="y" type="float"/>
+                <argument name="width" type="float"/>
+                <argument name="height" type="float"/>
+            </arguments>
+        </element>
+        <element name="inset" function="true" type="Rectangle" flags="256">
+            <description><![CDATA[Negative inset value extends the rectangle]]></description>
+            <arguments>
+                <argument name="inset" type="float"/>
+            </arguments>
+        </element>
+        <element name="fitAspect" function="true" type="Rectangle" flags="256">
+            <arguments>
+                <argument name="aspect" type="float"/>
+            </arguments>
+        </element>
+    </type>
+    <type name="Shader" context="Framsticks Theater">
+        <description><![CDATA[Shader object]]></description>
+        <element name="new" function="true" type="Shader">
+            <arguments>
+                <argument name="flags" type="integer"/>
+            </arguments>
+        </element>
+        <element name="vertex" type="string" flags="256"/>
+        <element name="fragment" type="string" flags="256"/>
+    </type>
+    <type name="Sharing" context="Framsticks Theater">
+        <element name="service" type="integer" min="0" max="4"/>
+        <element name="message" type="string"/>
+        <element name="url" type="string"/>
+        <element name="attach_file" type="string"/>
+        <element name="addScreenshot" function="true" type="void">
+            <arguments/>
+        </element>
+        <element name="removeImage" function="true" type="void">
+            <arguments/>
+        </element>
+        <element name="supported" type="integer" min="0" max="1" flags="1"/>
+        <element name="select" function="true" type="void">
+            <arguments>
+                <argument name="prompt" type="string"/>
+                <argument name="function" type="Object"/>
+            </arguments>
+        </element>
+        <element name="execute" function="true" type="void">
+            <arguments/>
+        </element>
+        <element name="HTML" type="string" flags="1"/>
+        <element name="initiate" function="true" type="void">
+            <arguments>
+                <argument name="code" type="integer"/>
+            </arguments>
+        </element>
+        <element name="tip_units" type="integer" flags="1"/>
+        <element name="tip_value" type="integer" flags="1"/>
+    </type>
+    <type name="ShowManager" context="Framsticks Theater">
+        <element name="show" type="string"/>
+        <element name="name" type="string" flags="50"/>
+        <element name="info" type="string" flags="50"/>
+        <element name="dispinfo" type="integer" min="0" max="2" flags="2"/>
+        <element name="userspeed" type="integer" min="0" max="5" default="3" flags="2"/>
+        <element name="showlog" type="integer" min="0" max="1" flags="2"/>
+        <element name="code" type="string" flags="16418"/>
+        <element name="expdef" type="string" flags="34"/>
+        <element name="reload" function="true" flags="2"/>
+        <element name="dummy" function="true" flags="2">
+            <description><![CDATA[This is the empty item in the Theater's menu]]></description>
+        </element>
+        <element name="about" function="true" flags="34"/>
+        <element name="prev_show" type="string" flags="35"/>
+        <element name="switchmode" type="integer" min="0" max="3" flags="32"/>
+        <element name="switchtime" type="integer" min="0" max="9999" flags="32">
+            <description><![CDATA[time between switching (seconds)]]></description>
+        </element>
+        <element name="switchshows" type="string" flags="32">
+            <description>
+                <![CDATA[names of the shows participating in automatic switching (comma separated). Use * as a wildcard.]]></description>
+        </element>
+        <element name="includeshows" type="string" flags="32">
+            <description><![CDATA[names of shows included in the show menu. Use * as a wildcard.]]></description>
+        </element>
+        <element name="excludeshows" type="string" flags="32">
+            <description><![CDATA[names of shows excluded from the show menu. Use * as a wildcard.]]></description>
+        </element>
+        <element name="openfilename" type="string" flags="33">
+            <description><![CDATA[Filename to be opened in onAppOpenFile()]]></description>
+        </element>
+        <element name="_propertyClear" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Using most _property functions is restricted for internal purposes. Use "property:" or "state:" definitions in your script files to change object properties.]]></description>
+            <arguments/>
+        </element>
+        <element name="_propertyAdd" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Using most _property functions is restricted for internal purposes. Use "property:" or "state:" definitions in your script files to change object properties.]]></description>
+            <arguments>
+                <argument name="id" type="string"/>
+                <argument name="type description" type="string"/>
+                <argument name="name" type="string"/>
+                <argument name="flags" type="integer"/>
+                <argument name="help text" type="string"/>
+            </arguments>
+        </element>
+        <element name="_propertyRemove" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Using most _property functions is restricted for internal purposes. Use "property:" or "state:" definitions in your script files to change object properties.]]></description>
+            <arguments>
+                <argument name="index" type="integer"/>
+            </arguments>
+        </element>
+        <element name="_propertyChange" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Using most _property functions is restricted for internal purposes. Use "property:" or "state:" definitions in your script files to change object properties.]]></description>
+            <arguments>
+                <argument name="id" type="string"/>
+                <argument name="type description" type="string"/>
+                <argument name="name" type="string"/>
+                <argument name="flags" type="integer"/>
+                <argument name="help text" type="string"/>
+            </arguments>
+        </element>
+        <element name="_propertyAddGroup" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Using most _property functions is restricted for internal purposes. Use "property:" or "state:" definitions in your script files to change object properties.]]></description>
+            <arguments>
+                <argument name="name" type="string"/>
+            </arguments>
+        </element>
+        <element name="_propertyRemoveGroup" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Using most _property functions is restricted for internal purposes. Use "property:" or "state:" definitions in your script files to change object properties.]]></description>
+            <arguments>
+                <argument name="index" type="integer"/>
+            </arguments>
+        </element>
+        <element name="_propertyExists" function="true" type="integer" flags="34">
+            <arguments>
+                <argument name="name" type="string"/>
+            </arguments>
+        </element>
+        <element name="_property_changed_index" type="integer" flags="35"/>
+        <element name="_property_changed_id" type="string" flags="35"/>
+    </type>
+    <type name="ShowProperties" context="Framsticks Theater">
+        <element name="_propertyClear" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Using most _property functions is restricted for internal purposes. Use "property:" or "state:" definitions in your script files to change object properties.]]></description>
+            <arguments/>
+        </element>
+        <element name="_propertyAdd" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Using most _property functions is restricted for internal purposes. Use "property:" or "state:" definitions in your script files to change object properties.]]></description>
+            <arguments>
+                <argument name="id" type="string"/>
+                <argument name="type description" type="string"/>
+                <argument name="name" type="string"/>
+                <argument name="flags" type="integer"/>
+                <argument name="help text" type="string"/>
+            </arguments>
+        </element>
+        <element name="_propertyRemove" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Using most _property functions is restricted for internal purposes. Use "property:" or "state:" definitions in your script files to change object properties.]]></description>
+            <arguments>
+                <argument name="index" type="integer"/>
+            </arguments>
+        </element>
+        <element name="_propertyChange" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Using most _property functions is restricted for internal purposes. Use "property:" or "state:" definitions in your script files to change object properties.]]></description>
+            <arguments>
+                <argument name="id" type="string"/>
+                <argument name="type description" type="string"/>
+                <argument name="name" type="string"/>
+                <argument name="flags" type="integer"/>
+                <argument name="help text" type="string"/>
+            </arguments>
+        </element>
+        <element name="_propertyAddGroup" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Using most _property functions is restricted for internal purposes. Use "property:" or "state:" definitions in your script files to change object properties.]]></description>
+            <arguments>
+                <argument name="name" type="string"/>
+            </arguments>
+        </element>
+        <element name="_propertyRemoveGroup" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Using most _property functions is restricted for internal purposes. Use "property:" or "state:" definitions in your script files to change object properties.]]></description>
+            <arguments>
+                <argument name="index" type="integer"/>
+            </arguments>
+        </element>
+        <element name="_propertyExists" function="true" type="integer" flags="34">
+            <arguments>
+                <argument name="name" type="string"/>
+            </arguments>
+        </element>
+        <element name="_property_changed_index" type="integer" flags="35"/>
+        <element name="_property_changed_id" type="string" flags="35"/>
+    </type>
+    <type name="SimStatsCharts" context="Framsticks Theater">
+        <description><![CDATA[Manages charts for monitoring simulator statistics.
+This class has no corresponding static object. If you want to use it, you have to create an object or get a reference to the existing object.]]></description>
+        <element name="selected" type="integer" flags="258"/>
+        <element name="sscAddSelected" function="true" flags="256"/>
+        <element name="add" function="true" flags="288"/>
+        <element name="removeAll" function="true" flags="256"/>
+        <element name="resetAll" function="true" flags="256">
+            <description><![CDATA[Removes all data from the chart windows.]]></description>
+        </element>
+        <element name="createChart" function="true" flags="288"/>
+    </type>
+    <type name="TrackingCam" context="Framsticks Theater">
+        <description><![CDATA[Camera object with the automatic target tracking ability.]]></description>
+        <element name="cam_tracking" type="integer" min="0" max="3" default="1"/>
+        <element name="cam_trspeed" type="float" min="0.1" max="10" default="5.0"/>
+        <element name="cam_distrac" type="integer" min="0" max="1" default="0">
+            <description><![CDATA[Suspend automatic tracking when the camera is moved manually]]></description>
+        </element>
+        <element name="cam_restrac" type="integer" min="0" max="100" default="10">
+            <description><![CDATA[Restore automatic tracking after some period of time
+(0 to never restore automatic tracking)]]></description>
+        </element>
+        <element name="cam_restore" function="true" type="void">
+            <description><![CDATA[Update camera position and restore automatic tracking]]></description>
+            <arguments/>
+        </element>
+        <element name="cam_world" type="integer" min="0" max="1" default="1"/>
+        <element name="cam_change" type="integer" min="0" max="5" default="2"/>
+        <element name="cam_chspeed" type="float" min="0.1" max="10" default="1.0"/>
+        <element name="cam_zoom" type="float" min="0.2" max="3" default="0.8"/>
+        <element name="cam_dir" type="float" min="0" max="-1" default="30.0"/>
+        <element name="cam_h" type="float" min="-90" max="90" default="45.0">
+            <description><![CDATA[0=side view, 90=top view]]></description>
+        </element>
+        <element name="setTarget" function="true" type="void" flags="32">
+            <description><![CDATA[select a new target for the camera]]></description>
+            <arguments>
+                <argument name="location x" type="float"/>
+                <argument name="location y" type="float"/>
+                <argument name="location z" type="float"/>
+                <argument name="target size" type="float"/>
+            </arguments>
+        </element>
+        <element name="moveTarget" function="true" type="void" flags="32">
+            <description><![CDATA[notify about the target location/size change]]></description>
+            <arguments>
+                <argument name="location x" type="float"/>
+                <argument name="location y" type="float"/>
+                <argument name="location z" type="float"/>
+                <argument name="target size" type="float"/>
+            </arguments>
+        </element>
+        <element name="setViewDir" function="true" type="void" flags="32">
+            <description><![CDATA[heading: 0..360, height: -90..+90]]></description>
+            <arguments>
+                <argument name="heading angle" type="float"/>
+                <argument name="height angle" type="float"/>
+            </arguments>
+        </element>
+        <element name="setOrient" function="true" type="void" flags="32">
+            <arguments>
+                <argument type="Orient"/>
+            </arguments>
+        </element>
+        <element name="interacting" type="integer" min="0" max="2" flags="35"/>
+        <element name="tick" function="true" type="void" flags="32">
+            <description>
+                <![CDATA[Display-less command line scripts can use tick() to advance time between frames]]></description>
+            <arguments>
+                <argument name="time span" type="float"/>
+            </arguments>
+        </element>
+    </type>
+    <type name="VisualStyle" context="Framsticks Theater">
+        <element name="style" type="string" default="standard"/>
+        <element name="name" type="string" flags="19"/>
+        <element name="info" type="string" flags="19"/>
+        <element name="code" type="string" flags="16419"/>
+        <element name="streload" function="true" flags="2"/>
+        <element name="rebuild" function="true" flags="34"/>
+        <element name="tex" type="integer" min="0" max="2" default="1"/>
+        <element name="smooth" type="integer" min="0" max="1" default="1"/>
+        <element name="neurons" type="integer" min="0" max="1" default="1"/>
+        <element name="dust" type="integer" min="0" max="1" default="1"/>
+        <element name="energy" type="integer" min="0" max="1" default="1"/>
+        <element name="_propertyClear" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Using most _property functions is restricted for internal purposes. Use "property:" or "state:" definitions in your script files to change object properties.]]></description>
+            <arguments/>
+        </element>
+        <element name="_propertyAdd" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Using most _property functions is restricted for internal purposes. Use "property:" or "state:" definitions in your script files to change object properties.]]></description>
+            <arguments>
+                <argument name="id" type="string"/>
+                <argument name="type description" type="string"/>
+                <argument name="name" type="string"/>
+                <argument name="flags" type="integer"/>
+                <argument name="help text" type="string"/>
+            </arguments>
+        </element>
+        <element name="_propertyRemove" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Using most _property functions is restricted for internal purposes. Use "property:" or "state:" definitions in your script files to change object properties.]]></description>
+            <arguments>
+                <argument name="index" type="integer"/>
+            </arguments>
+        </element>
+        <element name="_propertyChange" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Using most _property functions is restricted for internal purposes. Use "property:" or "state:" definitions in your script files to change object properties.]]></description>
+            <arguments>
+                <argument name="id" type="string"/>
+                <argument name="type description" type="string"/>
+                <argument name="name" type="string"/>
+                <argument name="flags" type="integer"/>
+                <argument name="help text" type="string"/>
+            </arguments>
+        </element>
+        <element name="_propertyAddGroup" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Using most _property functions is restricted for internal purposes. Use "property:" or "state:" definitions in your script files to change object properties.]]></description>
+            <arguments>
+                <argument name="name" type="string"/>
+            </arguments>
+        </element>
+        <element name="_propertyRemoveGroup" function="true" type="void" flags="34">
+            <description>
+                <![CDATA[Using most _property functions is restricted for internal purposes. Use "property:" or "state:" definitions in your script files to change object properties.]]></description>
+            <arguments>
+                <argument name="index" type="integer"/>
+            </arguments>
+        </element>
+        <element name="_propertyExists" function="true" type="integer" flags="34">
+            <arguments>
+                <argument name="name" type="string"/>
+            </arguments>
+        </element>
+        <element name="_property_changed_index" type="integer" flags="35"/>
+        <element name="_property_changed_id" type="string" flags="35"/>
+        <element name="worldpan" type="integer" min="0" max="3" default="2" flags="192">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="worldbgcolor" type="integer" min="0" max="16777215" default="16764040" flags="192">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="hideworld" type="integer" min="0" max="1" default="0" flags="192">
+            <description><![CDATA[Can be useful for screenshots]]></description>
+        </element>
+        <element name="modelpan" type="integer" min="0" max="3" default="1" flags="192">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="bgcolor" type="integer" min="0" max="16777215" default="16764040" flags="192">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="bbox" type="integer" min="0" max="1" default="1" flags="192">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="joint_width" type="integer" min="10" max="150" default="100" flags="192">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="shadows" type="integer" min="0" max="1" default="1" flags="192">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="axes" type="integer" min="0" max="1" default="0" flags="192">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="haxes" type="integer" min="0" max="1" default="0" flags="192">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="shownames" type="integer" min="0" max="1" default="0" flags="192">
+            <description><![CDATA[]]></description>
+        </element>
+        <element name="symmetryplane" type="integer" min="0" max="1" default="0" flags="192">
+            <description><![CDATA[Displays a guess of the symmetry plane (may take a long time to compue for complex bodies).
+Use scripting and the ModelSymmetry class to compute symmetry accurately.
+Details of the symmetry estimation procedure are described in http://www.framsticks.com/bib/Jaskowski-and-Komosinski-2008]]></description>
+        </element>
+    </type>
+    <type name="Window" context="Framsticks Theater">
+        <description><![CDATA[Window object, used in the Framsticks Theater application.
+This class has no corresponding static object. If you want to use it, you have to create an object or get a reference to the existing object.
+ See also: GLDisplay]]></description>
+        <element name="style" type="integer" flags="256">
+            <description><![CDATA[bitfield:
+1 - border
+2 - title
+4 - Opaque background
+8 - Close button
+16 - resizable]]></description>
+        </element>
+        <element name="title" type="string" flags="256"/>
+        <element name="backcolor" type="integer" flags="256">
+            <description><![CDATA[format: 0xAABBGGRR (alpha,blue,green,red)]]></description>
+        </element>
+        <element name="pos_x" type="integer" flags="256"/>
+        <element name="pos_y" type="integer" flags="256"/>
+        <element name="size_x" type="integer" flags="256"/>
+        <element name="size_y" type="integer" flags="256"/>
+        <element name="client" type="Object" flags="256">
+            <description><![CDATA[what is displayed in the window]]></description>
+        </element>
+    </type>
+</framscript>
Index: /framspy/framsfiles/reader/__init__.py
===================================================================
--- /framspy/framsfiles/reader/__init__.py	(revision 1104)
+++ /framspy/framsfiles/reader/__init__.py	(revision 1104)
@@ -0,0 +1,3 @@
+from ._all import load, loads, parse_value
+
+__all__ = ["load", "loads"]
Index: /framspy/framsfiles/reader/_all.py
===================================================================
--- /framspy/framsfiles/reader/_all.py	(revision 1104)
+++ /framspy/framsfiles/reader/_all.py	(revision 1104)
@@ -0,0 +1,421 @@
+import os.path
+import re as _re
+import warnings
+
+from framsfiles._context import _create_specs_from_xml
+
+warnings.simplefilter('always', UserWarning)
+
+_INT_FLOAT_REGEX = r'([+|-]?(?:0|[1-9]\d*))(\.\d+)?([eE][-+]?\d+)?'
+_NATURAL_REGEX = r'(?:0|[1-9]\d*)'
+_HEX__NUMBER_REGEX = r'[+|-]?0[xX][\da-fA-F]*'
+_NUMBER_REGEX = '({}|{})'.format(_HEX__NUMBER_REGEX, _INT_FLOAT_REGEX)
+_TYLDA_REGEX = '(?<![\\\\])(~)'
+_QUOTE_REGEX = '(?<![\\\\])(")'
+_ESCAPED_QUOTE_REGEX = '\\\\"'
+_ESCAPED_TAB_REGEX = '\\\\t'
+_ESCAPED_NEWLINE_REGEX = '\\\\n'
+_ESCAPED_TYLDA_REGEX = '\\\\~'
+_FRAMSCRIPT_XML_PATH = os.path.join((os.path.dirname(__file__)), "framscript.xml")
+
+# Messages:
+_NO_FILE_EXTENSION_WARNING = "No file extension found. Setting default context."
+_UNSUPPORTED_EXTENSION_WARNING = "Unsupported file extension: '{}'. Setting default context."
+_UNSUPPORTED_CONTEXT_WARNING = "Unsupported context: '{}'. Setting default context."
+_UNEXPECTED_KEY_WARNING = "Unexpected key encountered: key: '{}', class: '{}', context: '{}' )"
+_NOT_A_NUMBER_ERROR = "Expression cannot be parsed to a number: {}"
+_MULTILINE_NOT_CLOSED_WARNING = "Multiline property for key: '{}' was not closed with '~'."
+_STRING_NOT_CLOSED_ERROR = "String expression not closed with '~'"
+_EMPTY_SERIALIZED_ERROR = "Empty value for '@Serialized' not allowed."
+_NO_OBJECT_ERROR = "No object defined for the current line."
+_XYZ_ERROR = "XYZ format should look like this: XYZ[ a,b,c], Got: '{}'"
+_REFERENCE_FORMAT_ERROR = "reference sign '^' should be followed by an integer. Got: {}"
+_COLON_EXPECTED_ERROR = "Colon ':' was expected. Got: {}"
+_MIN_VAL_EXCEEDED_ERROR = "Minimum value allowed: {}, got: {}"
+_MAX_VAL_EXCEEDED_ERROR = "Maximum value allowed: {}, got: {}"
+_NONEMPTY_CLASSNAME = "There should be no string after obejct's classname."
+
+
+_specs, _contexts = _create_specs_from_xml()
+
+
+def _create_generic_parser(dtype, min=None, max=None):
+    def parse(x):
+        x = dtype(x)
+        if min is not None:
+            if x < min:
+                raise ValueError(_MIN_VAL_EXCEEDED_ERROR.format(min, x))
+        if max is not None:
+            if x > max:
+                raise ValueError(_MAX_VAL_EXCEEDED_ERROR.format(max, x))
+        return x
+
+    return parse
+
+
+def _str_to_number(s):
+    assert isinstance(s, str)
+    s = s.strip()
+
+    try:
+        parsed_int = int(s, 0)
+        return parsed_int
+    except ValueError:
+        pass
+    try:
+        parsed_float = float(s)
+        return parsed_float
+
+    except ValueError:
+        pass
+    raise ValueError(_NOT_A_NUMBER_ERROR.format(s))
+
+
+def parse_value(value, classname=None, key=None, context=None, autoparse=True):
+    assert isinstance(value, str)
+    value = value.strip()
+    # TODO maybe check 'Global context' as well?
+    if (context, classname) in _specs:
+        spec = _specs[(context, classname)]
+        if key in spec:
+            parser = _create_generic_parser(**spec[key])
+            return parser(value)
+        else:
+            warnings.warn(_UNEXPECTED_KEY_WARNING.format(key, classname, context))
+
+    if value.startswith("@Serialized:"):
+        prop = value.split(":", 1)[1]
+        prop = deserialize(prop)
+        return prop
+    elif autoparse:
+        try:
+            parsed_number = _str_to_number(value)
+            return parsed_number
+        except ValueError:
+            pass
+    return value
+
+
+def _extract_string(exp):
+    exp = exp[1:]
+    str_end_match = _re.search(_QUOTE_REGEX, exp)
+    if str_end_match is None:
+        raise ValueError(_STRING_NOT_CLOSED_ERROR.format(exp))
+    str_end = str_end_match.span()[0]
+    s = exp[:str_end]
+    reminder = exp[str_end + 1:]
+    s = _re.sub(_ESCAPED_QUOTE_REGEX, '"', s)
+    s = _re.sub(_ESCAPED_TAB_REGEX, '\t', s)
+    s = _re.sub(_ESCAPED_NEWLINE_REGEX, '\n', s)
+    return s, reminder
+
+
+def _extract_number(exp):
+    match = _re.match(_NUMBER_REGEX, exp)
+    number_as_str = match.group()
+    reminder = exp[match.span()[1]:]
+    number = _str_to_number(number_as_str)
+    return number, reminder
+
+
+# TODO maybe do it nicer??
+def _extract_xyz(exp):
+    exp = exp.strip()
+    if not exp.startswith('XYZ['):
+        raise ValueError(_XYZ_ERROR.format(exp))
+    exp = exp[4:]
+    x, exp = _extract_number(exp)
+    x = float(x)
+    exp = exp.strip()
+    if exp[0] != ',':
+        raise ValueError(_XYZ_ERROR.format(exp))
+    exp = exp[1:]
+    y, exp = _extract_number(exp)
+    y = float(y)
+    exp = exp.strip()
+    if exp[0] != ',':
+        raise ValueError(_XYZ_ERROR.format(exp))
+    exp = exp[1:]
+    z, exp = _extract_number(exp)
+    z = float(z)
+    exp = exp.strip()
+    if exp[0] != ']':
+        raise ValueError(_XYZ_ERROR.format(exp))
+    return (x, y, z), exp[1:]
+
+
+def _extract_reference(exp):
+    exp = exp[1:].strip()
+    i_match = _re.match(_NATURAL_REGEX, exp)
+    if i_match is None:
+        raise ValueError(_REFERENCE_FORMAT_ERROR.format(exp))
+    else:
+        end_i = i_match.span()[1]
+        ref_index = int(exp[:end_i])
+        reminder = exp[end_i:]
+    return ref_index, reminder
+
+
+def _extract_custom_object(exp):
+    open_braces = 0
+    open_sbrackets = 0
+    open_pbrackets = 0
+    # TODO maybe do it smarter?
+    suffix_end_match = _re.search('<|\[|\{]', exp)
+    if suffix_end_match is None:
+        # TODO
+        raise ValueError()
+
+    suffix_end_i = suffix_end_match.span()[0]
+    i = 0
+    for i, c in enumerate(exp[suffix_end_i:], start=suffix_end_i):
+        if c == '<':
+            open_pbrackets += 1
+        elif c == '[':
+            open_sbrackets += 1
+        elif c == '{':
+            open_braces += 1
+        elif c == '>':
+            open_pbrackets -= 1
+        elif c == ']':
+            open_sbrackets -= 1
+        elif c == '}':
+            open_braces -= 1
+
+        if open_braces == 0 and open_sbrackets == 0 and open_pbrackets == 0:
+            break
+    if open_braces != 0 or open_sbrackets != 0 or open_pbrackets != 0:
+        # TODO
+        raise ValueError()
+    return exp[0:i + 1], exp[i + 1:]
+
+
+def deserialize(expression):
+    stripped_exp = expression.strip()
+    if stripped_exp == '':
+        raise ValueError(_EMPTY_SERIALIZED_ERROR)
+    # Just load with json ...
+
+    if stripped_exp == 'null':
+        return None
+
+    objects = []
+    references = []
+    main_object_determined = False
+    main_object = None
+    expect_dict_value = False
+    last_dict_key = None
+    exp = stripped_exp
+    opened_lists = 0
+    opened_dicts = 0
+
+    while len(exp) > 0:
+        current_object_is_reference = False
+        if main_object_determined and len(objects) == 0:
+            raise ValueError(_NO_OBJECT_ERROR)
+        if expect_dict_value:
+            if exp[0] == ':':
+                exp = exp[1:].strip()
+            else:
+                raise ValueError(_COLON_EXPECTED_ERROR.foramt(exp[0]))
+        # List continuation
+        # TODO support for XYZ tuples
+        if exp[0] == ",":
+            if not (isinstance(objects[-1], list) or (isinstance(objects[-1], dict) and not expect_dict_value)):
+                # TODO msg
+                raise ValueError()
+            else:
+                exp = exp[1:].strip()
+
+        if exp[0] == "]":
+            if not isinstance(objects[-1], list):
+                # TODO msg
+                raise ValueError()
+            else:
+                opened_lists -= 1
+                objects.pop()
+                exp = exp[1:].strip()
+                continue
+        elif exp[0] == "}":
+            opened_dicts -= 1
+            if not isinstance(objects[-1], dict):
+                # TODO msg
+                raise ValueError()
+            else:
+                objects.pop()
+                exp = exp[1:].strip()
+                continue
+        # List start
+        elif exp.startswith("null"):
+            current_object = None
+            exp = exp[4:]
+        elif exp.startswith("XYZ"):
+            current_object, exp = _extract_xyz(exp)
+        elif exp[0] == "[":
+            current_object = list()
+            opened_lists += 1
+            exp = exp[1:]
+        elif exp[0] == "{":
+            current_object = dict()
+            opened_dicts += 1
+            exp = exp[1:]
+        elif exp[0] == '"':
+            current_object, exp = _extract_string(exp)
+        elif _re.match(_NUMBER_REGEX, exp) is not None:
+            current_object, exp = _extract_number(exp)
+        elif exp[0] == '^':
+            i, exp = _extract_reference(exp)
+            if i >= len(references):
+                # TODO msg
+                raise ValueError()
+            current_object = references[i]
+            current_object_is_reference = True
+        else:
+            current_object, exp = _extract_custom_object(exp)
+
+        if len(objects) > 0:
+            if isinstance(objects[-1], list):
+                objects[-1].append(current_object)
+            elif isinstance(objects[-1], dict):
+                if expect_dict_value:
+                    objects[-1][last_dict_key] = current_object
+                    last_dict_key = None
+                    expect_dict_value = False
+                else:
+                    if not isinstance(current_object, str):
+                        # TODO msg
+                        raise ValueError()
+                    last_dict_key = current_object
+                    expect_dict_value = True
+
+        if isinstance(current_object, (list, dict, tuple)) and not current_object_is_reference:
+            objects.append(current_object)
+            references.append(current_object)
+        if not main_object_determined:
+            main_object_determined = True
+            main_object = current_object
+        exp = exp.strip()
+
+    if opened_lists != 0:
+        # TODO msg
+        raise ValueError()
+    if opened_dicts != 0:
+        # TODO msg
+        raise ValueError()
+    return main_object
+
+
+def loads(input_string, context=None, autocast=True):
+    """
+    Parses string in Framsticks' format to a list of dictionaries.
+    :param input_string: String to parse.
+    :param context: Context of parsing compliant with contexts found in 'framscript.xml' e.g. 'expdef file'.
+    :param autocast: If true numbers will be parsed automatically if possible.
+    If false every field will be treated as a string.
+    :return: A list of dictionaries representing Framsticks objects.
+    """
+    assert isinstance(input_string, str)
+    if context is not None and context not in _contexts:
+        warnings.warn(_UNSUPPORTED_CONTEXT_WARNING.format(context))
+
+    lines = input_string.split("\n")
+    multiline_value = None
+    multiline_key = None
+    current_object = None
+    objects = []
+    parsing_error = False
+    class_name = None
+    try:
+        for line_num, line in enumerate(lines):
+
+            if multiline_key is not None:
+                endmatch = _re.search(_TYLDA_REGEX, line)
+                if endmatch is not None:
+                    endi = endmatch.span()[0]
+                    value = line[0:endi]
+                    reminder = line[endi + 1:].strip()
+                    if reminder != "":
+                        # TODO msg
+                        raise ValueError()
+                else:
+                    value = line + "\n"
+
+                if _re.search(_TYLDA_REGEX, value) is not None:
+                    # TODO msg
+                    raise ValueError()
+                value = _re.sub(_ESCAPED_TYLDA_REGEX, '~', value)
+                multiline_value += value
+                if endmatch is not None:
+                    current_object[multiline_key] = multiline_value
+                    multiline_value = None
+                    multiline_key = None
+
+            # Ignores comment lines (if outside multiline prop)
+            elif line.startswith("#"):
+                continue
+            else:
+                line = line.strip()
+                if current_object is not None:
+                    if line == "":
+                        current_object = None
+                        continue
+                else:
+                    if ":" in line:
+                        class_name, suffix = line.split(":", 1)
+                        if suffix != "":
+                            raise ValueError(_NONEMPTY_CLASSNAME)
+                        current_object = {"_classname": class_name}
+                        objects.append(current_object)
+                        continue
+
+                if current_object is not None:
+                    key, value = line.split(":", 1)
+                    # TODO check if the key is supported for given class
+                    if key.strip() == "":
+                        # TODO msg
+                        raise ValueError()
+                    if value.strip() == "~":
+                        multiline_value = ""
+                        multiline_key = key
+                    else:
+                        value = parse_value(value, classname=class_name, key=key, context=context, autoparse=autocast)
+                        current_object[key] = value
+    except ValueError as ex:
+        parsing_error = True
+        error_msg = str(ex)
+
+    if multiline_key is not None:
+        current_object[multiline_key] = multiline_value
+        warnings.warn(_MULTILINE_NOT_CLOSED_WARNING.format(multiline_key))
+
+    if parsing_error:
+        error_msc = "Parsing error. Incorrect syntax in line {}:\n{}\n{}".format(line_num, error_msg, line)
+        raise ValueError(error_msc)
+
+    return objects
+
+
+def load(filename, context=None, autocast=True):
+    """
+    Parses the file with a given filename to a list of dictionaries.
+    :param filename: Name of the file to parse.
+    :param context: Context of parsing compliant with contexts found in 'framscript.xml' e.g. 'expdef file'.
+    If context is left emtpy it will be inferred from the file's extension/
+    :param autocast: If true numbers will be parsed automatically if possible.
+        If false every field will be treated as a string.
+        :return: A list of dictionaries representing Framsticks objects.
+    """
+    file = open(filename, encoding='UTF-8')
+    if context is None:
+        try:
+            _, extension = filename.split(".")
+            context = extension + " file"
+            if context not in _contexts:
+                context = None
+                warnings.warn(_UNSUPPORTED_EXTENSION_WARNING.format(extension))
+        except RuntimeError:
+            warnings.warn(_NO_FILE_EXTENSION_WARNING)
+            context = None
+    s = file.read()
+    file.close()
+    return loads(s, context=context, autocast=autocast)
Index: /framspy/framsfiles/tests/reader_tests.py
===================================================================
--- /framspy/framsfiles/tests/reader_tests.py	(revision 1104)
+++ /framspy/framsfiles/tests/reader_tests.py	(revision 1104)
@@ -0,0 +1,181 @@
+#!/usr/bin/env python3
+import unittest
+from parameterized import parameterized
+import os
+import json
+import re
+import glob
+
+from ..reader import loads, load, parse_value
+
+test_files_root = "test_files"
+input_files_root = os.path.join(os.path.dirname(os.path.abspath(__file__)), test_files_root, "inputs")
+output_files_root = os.path.join(os.path.dirname(os.path.abspath(__file__)), test_files_root, "outputs")
+input_files = glob.glob(os.path.join(input_files_root, '*', '*'))
+
+parse_value_testcases = [
+    ('1', 1),
+    ('0', 0),
+    ('a', 'a'),
+    # TODO tilde should also be escaped in single-line values (now it is only escaped in multi-line values)
+    ('generic string ~ with tylda', 'generic string ~ with tylda'),
+    ('123', 123),
+    ('0x123', 0x123),
+    ('0X123', 0x123),
+    ('+0X10', 16),
+    ('-0x125', -0x125),
+    ('-0xaa', -0xaa),
+    ('0xaa', 0xaa),
+    ('0xAA', 0xaa),
+    ('-12.3', -12.3),
+    ('12.3e+05', 12.3e+05),
+    ('@Serialized:null', None),
+    ('@Serialized: null', None),
+    ('@Serialized:"@Serialized:"', '@Serialized:'),
+    ('@Serialized:"\\""', '"'),
+    ('@Serialized:"\\t"', '\t'),
+    ('@Serialized:"\\n"', '\n'),
+    ('@Serialized:1', 1),
+    ('@Serialized:2.1', 2.1),
+    ('@Serialized:+2.1', 2.1),
+    ('@Serialized:-2.1', -2.1),
+    ('@Serialized: +0X10  ', 16),
+    ('@Serialized: 0X10  ', 16),
+    ('@Serialized: 0XAA  ', 0xaa),
+    ('@Serialized: 0Xaa  ', 0xaa),
+    ('@Serialized:[]', []),
+    ('@Serialized:[1,2,3]', [1, 2, 3]),
+    ('@Serialized: [ +0X10 ] ', [16]),
+    ('@Serialized:[ +0X10, null, "abc"] ', [16, None, "abc"]),
+    ('@Serialized:[[[]]]', [[[]]]),
+    ('@Serialized:{}', {}),
+    ('@Serialized:{"a":123 }', {"a": 123}),
+    ('@Serialized:{"a":123,"b":2 }', {"a": 123, "b": 2}),
+    ('@Serialized:{"a":123,"b":[1,2,3] }', {"a": 123, "b": [1, 2, 3]}),
+    ('@Serialized:XYZ[0,1,2]', (0, 1, 2)),
+    ('@Serialized:Population<0x85f53a8>', 'Population<0x85f53a8>'),
+    ('@Serialized:CrazyObject[{},{},[[]]]', 'CrazyObject[{},{},[[]]]'),
+    ('@Serialized:[co[{},{},[[]]],[]]', ['co[{},{},[[]]]', []]),
+    ('@Serialized:[co[{},{},[[]]],[1,2,3]]', ['co[{},{},[[]]]', [1, 2, 3]]),
+    ('@Serialized:[[1,2, 3],  co[{},{},[[]]]]', [[1, 2, 3], 'co[{},{},[[]]]']),
+    # TODO maybe raise if there is a space?
+    ('@Serialized:Population <0x85f53a8>', 'Population <0x85f53a8>'),
+
+]
+context_parse_value_testcases = [
+    ({'value': '1', 'classname': 'expdef', 'key': 'name', 'context': 'expdef file'}, '1'),
+    ({'value': '234.5', 'classname': 'Creature', 'key': 'energ0', 'context': 'Global Context'}, 234.5)
+]
+parse_value_exception_testcases = [
+    '@Serialized:   '
+]
+
+loads_testcases = [
+    ('class:\nmlprop:~\nbla bla bla\n~\n', [{"_classname": "class", "mlprop": "bla bla bla\n"}]),
+    ('class:\nmlprop:~\n\\~\n~\n', [{"_classname": "class", "mlprop": "~\n"}])
+]
+loads_exception_testcases = [
+    'class:\nmlprop:~\n\\~\n~\nasdasd',
+    'class:\nmlprop:~\n~\n~\n',
+]
+
+
+# TODO make more atomic tests, maybe
+class ReferenceTest(unittest.TestCase):
+    def test0(self):
+        str_in = '@Serialized:[^0] '
+        result = parse_value(str_in)
+        self.assertTrue(isinstance(result, list))
+        self.assertEqual(len(result), 1)
+        self.assertTrue(result is result[0])
+
+    def test1(self):
+        str_in = '@Serialized:[44,[^1]]'
+        result = parse_value(str_in)
+        self.assertTrue(isinstance(result, list))
+        self.assertEqual(len(result), 2)
+        self.assertEqual(result[0], 44)
+        self.assertTrue(result[1] is result[1][0])
+
+    def test2(self):
+        str_in = '@Serialized:[[100],["abc"],[300,^2]]'
+        result = parse_value(str_in)
+        self.assertTrue(isinstance(result, list))
+        self.assertEqual(len(result), 3)
+        self.assertEqual(result[0], [100])
+        self.assertEqual(result[1], ["abc"])
+        self.assertEqual(result[2][0], 300)
+        self.assertTrue(result[2][1] is result[1])
+
+    def test3(self):
+        str_in = '@Serialized:[[123,[]],["x",^0],^2]'
+        result = parse_value(str_in)
+        self.assertTrue(isinstance(result, list))
+        self.assertEqual(len(result), 3)
+        self.assertEqual(result[0], [123, []])
+        self.assertTrue(isinstance(result[1], list))
+        self.assertEqual(result[1][0], "x")
+        self.assertTrue(result[2] is result[0][1])
+        self.assertTrue(result[1][1] is result)
+
+    def test4(self):
+        str_in = '@Serialized:{"a":[33,44],"b":^1,"c":[33,44]}'
+        result = parse_value(str_in)
+        self.assertTrue(isinstance(result, dict))
+        self.assertEqual(len(result), 3)
+        self.assertListEqual(sorted(result.keys()), ["a", "b", "c"])
+
+        self.assertEqual(result["a"], [33, 44])
+        self.assertEqual(result["c"], [33, 44])
+
+        self.assertFalse(result["c"] is result["a"])
+        self.assertTrue(result["b"], result["a"])
+
+    def test5(self):
+        str_in = '@Serialized:[null, null, [1, 2], null, ^ 1]'
+        result = parse_value(str_in)
+        self.assertTrue(isinstance(result, list))
+        self.assertEqual(len(result), 5)
+        self.assertListEqual(result[0:4], [None, None, [1, 2], None])
+        self.assertTrue(result[2] is result[4])
+
+
+class ParseValueTest(unittest.TestCase):
+    @parameterized.expand(parse_value_testcases)
+    def test_correct_parsing(self, input_val, output):
+        self.assertEqual(output, parse_value(input_val))
+
+    @parameterized.expand(context_parse_value_testcases)
+    def test_correct_context_parsing(self, input_val, output):
+        self.assertEqual(output, parse_value(**input_val))
+
+    @parameterized.expand(parse_value_exception_testcases)
+    def test_parsing_exceptions(self, input_val):
+        self.assertRaises(ValueError, parse_value, input_val)
+
+
+class LoadsTest(unittest.TestCase):
+    @parameterized.expand(loads_testcases)
+    def test_correct_loads(self, input_val, output):
+        self.assertEqual(output, loads(input_val))
+
+    @parameterized.expand(loads_exception_testcases)
+    def test_load_exceptions(self, input_val):
+        self.assertRaises(ValueError, loads, input_val)
+
+
+class LoadTest(unittest.TestCase):
+    @parameterized.expand(input_files)
+    def test_correct_load(self, filename):
+        json_output_path = output_files_root + filename[len(input_files_root):] + ".json"
+        with self.subTest(i=filename):
+            result = load(filename)
+            with open(json_output_path, encoding='UTF-8') as json_file:
+                correct = json.load(json_file)
+                self.assertEqual(len(result), len(correct))
+                for r, c in zip(result, correct):
+                    self.assertDictEqual(r, c)
+
+
+if __name__ == '__main__':
+    unittest.main()
Index: /framspy/framsfiles/tests/run_tests.cmd
===================================================================
--- /framspy/framsfiles/tests/run_tests.cmd	(revision 1104)
+++ /framspy/framsfiles/tests/run_tests.cmd	(revision 1104)
@@ -0,0 +1,6 @@
+pushd ..\..
+echo "Testing framswriter..."
+python -m unittest framsfiles/tests/writer_tests.py
+echo "Testing framsreader..."
+python -m unittest framsfiles/tests/reader_tests.py
+popd
Index: /framspy/framsfiles/tests/run_tests.sh
===================================================================
--- /framspy/framsfiles/tests/run_tests.sh	(revision 1104)
+++ /framspy/framsfiles/tests/run_tests.sh	(revision 1104)
@@ -0,0 +1,6 @@
+#!/bin/bash
+test_dir=$(realpath $0 | xargs dirname)/../..
+echo "Testing framswriter..."
+cd $test_dir && python -m unittest framsfiles/tests/writer_tests.py
+echo "Testing framsreader..."
+cd $test_dir && python -m unittest framsfiles/tests/reader_tests.py
Index: /framspy/framsfiles/tests/writer_tests.py
===================================================================
--- /framspy/framsfiles/tests/writer_tests.py	(revision 1104)
+++ /framspy/framsfiles/tests/writer_tests.py	(revision 1104)
@@ -0,0 +1,91 @@
+#!/usr/bin/env python3
+import glob
+import json
+import os
+import unittest
+
+from parameterized import parameterized
+
+from ..reader import loads
+from ..writer import from_collection
+
+
+class SerializedTest(unittest.TestCase):
+    def test_keyword_serialization(self):
+        in_obj = [{'f': '@Serialized:'}]
+        expected = 'f:@Serialized:"@Serialized:"\n'
+        actual = from_collection(in_obj)
+        self.assertEqual(actual, expected)
+
+    def test_list_serialization(self):
+        in_obj = [{'f': [16, None, 'abc']}]
+        expected = 'f:@Serialized:[16,null,"abc"]\n'
+        actual = from_collection(in_obj)
+        self.assertEqual(actual, expected)
+
+    def test_object_serialization(self):
+        in_obj = [{'f': {'a': 123, 'b': [7, 8, 9]}}]
+        expected = 'f:@Serialized:{"a":123,"b":[7,8,9]}\n'
+        actual = from_collection(in_obj)
+        self.assertEqual(actual, expected)
+
+    def test_empty_nested_list_serialization(self):
+        in_obj = [{'f': [[[]]]}]
+        expected = 'f:@Serialized:[[[]]]\n'
+        actual = from_collection(in_obj)
+        self.assertEqual(actual, expected)
+
+    def test_list_with_newlines_serialization(self):
+        in_obj = [{'f': ['\n\n', '']}]
+        expected = 'f:@Serialized:["\n\n",""]\n'
+        actual = from_collection(in_obj)
+        self.assertEqual(actual, expected)
+
+
+class ClassnameTest(unittest.TestCase):
+    def test_classname_detection(self):
+        in_obj = [{'_classname': 'stats', 'a': 'b'}]
+        expected = 'stats:\na:b\n'
+        actual = from_collection(in_obj)
+        self.assertEqual(actual, expected)
+
+    def test_multiple_classname_detection(self):
+        in_obj = [{'_classname': 'stats', 'a': 'b'}, {'_classname': 'org', 'c': 'd'}]
+        expected = 'stats:\na:b\n\norg:\nc:d\n'
+        actual = from_collection(in_obj)
+        self.assertEqual(actual, expected)
+
+
+class MultilineTest(unittest.TestCase):
+    def test_tilde_wrap(self):
+        in_obj = [{'ml': 'this is\na field\nwith multiple lines'}]
+        expected = 'ml:~\nthis is\na field\nwith multiple lines~\n'
+        actual = from_collection(in_obj)
+        self.assertEqual(actual, expected)
+
+    def test_tilde_escape(self):
+        in_obj = [{'ml': 'this is\na field\nwith multiple lines\n~ is also here'}]
+        expected = 'ml:~\nthis is\na field\nwith multiple lines\n\\~ is also here~\n'
+        actual = from_collection(in_obj)
+        self.assertEqual(actual, expected)
+
+
+json_root = os.path.join(os.path.dirname(os.path.abspath(__file__)), "test_files", "outputs")
+input_files = glob.glob(os.path.join(json_root, '*', '*'))
+
+
+class WriterReaderTest(unittest.TestCase):
+    @parameterized.expand(input_files)
+    def test_write_then_read(self, filename):
+        with self.subTest(i=filename):
+            with open(filename, encoding='UTF-8') as file:
+                json_content = json.load(file)
+                after_write = from_collection(json_content)
+                after_read = loads(after_write)
+                self.assertEqual(len(json_content), len(after_read))
+                for i, o in zip(json_content, after_read):
+                    self.assertDictEqual(i, o)
+
+
+if __name__ == '__main__':
+    unittest.main()
Index: /framspy/framsfiles/writer/__init__.py
===================================================================
--- /framspy/framsfiles/writer/__init__.py	(revision 1104)
+++ /framspy/framsfiles/writer/__init__.py	(revision 1104)
@@ -0,0 +1,3 @@
+from ._loader import from_collection, from_file
+
+__all__ = ['from_collection', 'from_file']
Index: /framspy/framsfiles/writer/_loader.py
===================================================================
--- /framspy/framsfiles/writer/_loader.py	(revision 1104)
+++ /framspy/framsfiles/writer/_loader.py	(revision 1104)
@@ -0,0 +1,57 @@
+import json
+import warnings
+
+from framsfiles._context import _contexts
+from ._parser import _parse_object_list, _parse_object
+
+_NO_FILE_EXTENSION_WARNING = 'No file extension found. Setting default context.'
+_UNSUPPORTED_EXTENSION_WARNING = 'Unsupported file extension: \'{}\'. Setting default context.'
+_UNSUPPORTED_CONTEXT_WARNING = 'Unsupported context: "{}". Setting default context.'
+
+_INVALID_ROOT_ERROR = 'JSON root should be an object or a list, found: {}. Aborting.'
+
+
+def from_file(filename, context=None):
+    """
+    Converts the file with a given filename to Framsticks file format.
+    :param filename: Name of the file to parse.
+    :param context: Context of parsing compliant with contexts found in 'framscript.xml' e.g. 'expdef file'.
+    If context is left empty it will be inferred from the file's extension.
+    :return: String content of equivalent Framsticks file.
+    """
+    if context is None:
+        context = _get_context_from_filename(filename)
+    with open(filename, encoding='UTF-8') as file:
+        json_object = json.load(file)
+    return from_collection(json_object, context)
+
+
+def from_collection(target, context=None):
+    """
+    Converts a list or a dictionary to Framsticks file format.
+    :param target: Dictionary or list of dictionaries representing Framsticks objects.
+    :param context: Context of parsing compliant with contexts found in 'framscript.xml'
+    :return: String content of resulting Framsticks file.
+    """
+    if context is not None and context not in _contexts:
+        warnings.warn(_UNSUPPORTED_CONTEXT_WARNING.format(context))
+    if isinstance(target, list):
+        return _parse_object_list(target, context)
+    if isinstance(target, dict):
+        return _parse_object(target, context)
+    raise ValueError(_INVALID_ROOT_ERROR.format(type(target)))
+
+
+def _get_context_from_filename(filename):
+    filename_split = filename.split('.')
+    if len(filename_split) < 2:
+        warnings.warn(_NO_FILE_EXTENSION_WARNING)
+        return None
+
+    extension = filename_split[-2]
+    filename_context = extension + ' file'
+    if filename_context not in _contexts:
+        warnings.warn(_UNSUPPORTED_EXTENSION_WARNING.format(filename_context))
+        return None
+
+    return filename_context
Index: /framspy/framsfiles/writer/_parser.py
===================================================================
--- /framspy/framsfiles/writer/_parser.py	(revision 1104)
+++ /framspy/framsfiles/writer/_parser.py	(revision 1104)
@@ -0,0 +1,108 @@
+import warnings
+
+from framsfiles._context import _specs
+from ._serializer import _serialize_value
+
+_EXPECTED_OBJECT_WARNING = 'Encountered item of type {} in list of objects. Skipping.'
+_MISSING_CLASSNAME_WARNING = 'Object defined without classname. Resulting file might be invalid.'
+_INVALID_TYPE_WARINING = 'Field {} in class {} has type {}, {} expected.'
+_LOWER_LIMIT_WARINING = 'Value {} of field {} in class {} is less than {}.'
+_UPPER_LIMIT_WARINING = 'Value {} of field {} in class {} is more than {}.'
+
+_CAST_ERROR = 'Cannot cast {} to {}, aborting.'
+
+
+def _parse_object_list(object_list, context=None):
+    fram_objects = []
+    for obj in object_list:
+        if isinstance(obj, dict):
+            fram_objects.append(_parse_object(obj, context))
+        else:
+            warnings.warn(_EXPECTED_OBJECT_WARNING.format(type(obj)))
+    return '\n'.join(fram_objects)
+
+
+def _parse_object(obj, context=None):
+    line_list = []
+    spec = None
+    classname = obj.get('_classname')
+
+    if classname is None:
+        warnings.warn(_MISSING_CLASSNAME_WARNING)
+    else:
+        line_list = [classname + ':']
+        spec = _specs.get((context, classname))
+
+    for key, value in obj.items():
+        if not _is_classname(key):
+            if spec is not None:
+                _validate_field(key, value, classname, spec)
+            if isinstance(value, str):
+                if _is_multiline(value):
+                    value = _parse_multiline(value)
+                elif _contains_serialized_keyword(value) or _contains_tab(value):
+                    value = _serialize_value(value)
+            elif isinstance(value, (list, dict)):
+                value = _serialize_value(value)
+            line = _to_fram_field_string(key, value)
+            line_list.append(line)
+
+    return '\n'.join(line_list) + '\n'
+
+
+def _validate_field(key, value, classname, spec):
+    _validate_type(key, value, classname, spec)
+    _validate_min(key, value, classname, spec)
+    _validate_max(key, value, classname, spec)
+
+
+def _validate_type(key, value, classname, spec):
+    if not isinstance(value, spec['dtype']):
+        warnings.warn(_INVALID_TYPE_WARINING.format(key, classname, type(value), spec['type']))
+
+
+def _validate_min(key, value, classname, spec):
+    if 'min' in spec:
+        casted = spec['dtype'](value)
+        if casted < spec['min']:
+            warnings.warn(_LOWER_LIMIT_WARINING.format(value, key, classname, spec['min']))
+
+
+def _validate_max(key, value, classname, spec):
+    if 'max' in spec:
+        casted = spec['dtype'](value)
+        if casted > spec['max']:
+            warnings.warn(_UPPER_LIMIT_WARINING.format(value, key, classname, spec['max']))
+
+
+def _is_classname(key):
+    return key == '_classname'
+
+
+def _parse_multiline(value):
+    value = _escape_tildes(value)
+    return _tilde_wrap(value)
+
+
+def _escape_tildes(value):
+    return value.replace('~', '\\~')
+
+
+def _tilde_wrap(value):
+    return '~\n{}~'.format(value)
+
+
+def _to_fram_field_string(key, value):
+    return '{}:{}'.format(key, value)
+
+
+def _contains_serialized_keyword(value):
+    return '@Serialized:' in value
+
+
+def _contains_tab(value):
+    return '\t' in value
+
+
+def _is_multiline(value):
+    return '\n' in value
Index: /framspy/framsfiles/writer/_serializer.py
===================================================================
--- /framspy/framsfiles/writer/_serializer.py	(revision 1104)
+++ /framspy/framsfiles/writer/_serializer.py	(revision 1104)
@@ -0,0 +1,47 @@
+_SERIALIZED_STRING = '@Serialized:{}'
+_DOUBLE_QUOTED = '"{}"'
+_FIELD_STRING = '"{}":{}'
+_LIST_STRING = '[{}]'
+_OBJECT_STRING = '{{{}}}'
+
+
+def _serialize_value(value):
+    return _SERIALIZED_STRING.format(_serialize(value))
+
+
+def _serialize(target):
+    if isinstance(target, list):
+        return _serialize_list(target)
+    if isinstance(target, dict):
+        return _serialize_object(target)
+    if isinstance(target, str):
+        return _serialize_string(target)
+    if target is None:
+        return 'null'
+    return str(target)
+
+
+def _serialize_list(target):
+    serialized = [_serialize(el) for el in target]
+    return _to_list_string(serialized)
+
+
+def _serialize_object(target):
+    serialized = [_to_field_string(k, v) for k, v in target.items()]
+    return _to_object_string(serialized)
+
+
+def _serialize_string(target):
+    return _DOUBLE_QUOTED.format(target)
+
+
+def _to_field_string(key, value):
+    return _FIELD_STRING.format(key, _serialize(value))
+
+
+def _to_list_string(target):
+    return _LIST_STRING.format(','.join(target))
+
+
+def _to_object_string(target):
+    return _OBJECT_STRING.format(','.join(target))
