{
	"types": {
		"__pCar": [
			{
				"name": "__pLabel",
				"type": "string",
				"default": ""
			},
			{
				"name": "__pPivotIn",
				"type": "string",
				"default": ""
			},
			{
				"name": "__pPivotOut",
				"type": "string",
				"default": ""
			},
			{
				"name": "__pMatchSubtypes",
				"type": "boolean",
				"default": false
			},
			{
				"name": "name",
				"type": "code",
				"default": "\"[PYTHON]\"\n\"Example:\t result = True\"\n\"Example:\t result = getAttr()\"\n\n\"[JAVASCRIPT]\"\n\"Example:\t true\"\n\"Example:\t getAttr()\""
			},
			{
				"name": "position",
				"type": "code",
				"default": "\"[PYTHON]\"\n\"Example:\t result = True\"\n\"Example:\t result = getAttr()\"\n\n\"[JAVASCRIPT]\"\n\"Example:\t true\"\n\"Example:\t getAttr()\""
			}
		],
		"__pUnitTrack": [
			{
				"name": "__pLabel",
				"type": "string",
				"default": ""
			},
			{
				"name": "__pPivotIn",
				"type": "string",
				"default": ""
			},
			{
				"name": "__pPivotOut",
				"type": "string",
				"default": ""
			},
			{
				"name": "__pMatchSubtypes",
				"type": "boolean",
				"default": false
			},
			{
				"name": "position",
				"type": "code",
				"default": "\"[PYTHON]\"\n\"Example:\t result = True\"\n\"Example:\t result = getAttr()\"\n\n\"[JAVASCRIPT]\"\n\"Example:\t true\"\n\"Example:\t getAttr()\""
			}
		],
		"__pPositionable": [
			{
				"name": "__pLabel",
				"type": "string",
				"default": ""
			},
			{
				"name": "__pPivotIn",
				"type": "string",
				"default": ""
			},
			{
				"name": "__pPivotOut",
				"type": "string",
				"default": ""
			},
			{
				"name": "__pMatchSubtypes",
				"type": "boolean",
				"default": false
			},
			{
				"name": "position",
				"type": "code",
				"default": "\"[PYTHON]\"\n\"Example:\t result = True\"\n\"Example:\t result = getAttr()\"\n\n\"[JAVASCRIPT]\"\n\"Example:\t true\"\n\"Example:\t getAttr()\""
			}
		],
		"__pnext": [
			{
				"name": "__pLabel",
				"type": "string",
				"default": ""
			},
			{
				"name": "__pPivotIn",
				"type": "string",
				"default": ""
			},
			{
				"name": "__pPivotOut",
				"type": "string",
				"default": ""
			},
			{
				"name": "__pMatchSubtypes",
				"type": "boolean",
				"default": false
			}
		],
		"__ponTrack": [
			{
				"name": "__pLabel",
				"type": "string",
				"default": ""
			},
			{
				"name": "__pPivotIn",
				"type": "string",
				"default": ""
			},
			{
				"name": "__pPivotOut",
				"type": "string",
				"default": ""
			},
			{
				"name": "__pMatchSubtypes",
				"type": "boolean",
				"default": false
			}
		]
	},
	"constraints": [
		{
			"name": "noAbstractInstances",
			"event": "pre-create",
			"code": "/* comment next line to enable this constraint */\nthrow \"IgnoredConstraint\"\nfalse",
			"targetType": "Positionable"
		}
	],
	"actions": [
		{
			"name": "snapToTarget",
			"event": "post-connect",
			"code": "/* comment next line to enable this action */\nthrow \"IgnoredConstraint\"\n/*newline*/var neighborLinks = getNeighbors('>'),/*newline*/    neighborLink = neighborLinks[neighborLinks.length-1];/*newline*/if( neighborLink )/*newline*/{/*newline*/    if( getAttr('$type', neighborLink).match(/next/) )/*newline*/    {/*newline*/        var neighbor = getNeighbors('>','*',neighborLink)[0],/*newline*/            npos = getAttr('position',neighbor);/*newline*/        setAttr('position', [npos[0] - 75, npos[1]]);/*newline*/    }/*newline*/    else if( getAttr('$type', neighborLink).match(/onTrack/) )/*newline*/    {/*newline*/        var neighbor = getNeighbors('>','*',neighborLink)[0],/*newline*/            gpos = getAttr('position');/*newline*/        setAttr('position', [gpos[0] + 10, gpos[1] + 35], neighbor);/*newline*/    }/*newline*/    else/*newline*/    {/*newline*/        print('Invalid link');/*newline*/    }/*newline*/}",
			"targetType": "__pCar"
		},
		{
			"name": "snapToTarget",
			"event": "post-connect",
			"code": "/* comment next line to enable this action */\nthrow \"IgnoredConstraint\"\n/*newline*/var neighborLinks = getNeighbors('>'),/*newline*/    neighborLink = neighborLinks[neighborLinks.length-1];/*newline*/if( neighborLink )/*newline*/{/*newline*/    if( getAttr('$type', neighborLink).match(/next/) )/*newline*/    {/*newline*/        var neighbor = getNeighbors('>','*',neighborLink)[0],/*newline*/            npos = getAttr('position',neighbor);/*newline*/        setAttr('position', [npos[0] - 75, npos[1]]);/*newline*/    }/*newline*/    else if( getAttr('$type', neighborLink).match(/onTrack/) )/*newline*/    {/*newline*/        var neighbor = getNeighbors('>','*',neighborLink)[0],/*newline*/            gpos = getAttr('position');/*newline*/        setAttr('position', [gpos[0] + 10, gpos[1] + 35], neighbor);/*newline*/    }/*newline*/    else/*newline*/    {/*newline*/        print('Invalid link');/*newline*/    }/*newline*/}",
			"targetType": "__pUnitTrack"
		},
		{
			"name": "snapToTarget",
			"event": "post-connect",
			"code": "/* comment next line to enable this action */\nthrow \"IgnoredConstraint\"\n/*newline*/var neighborLinks = getNeighbors('>'),/*newline*/    neighborLink = neighborLinks[neighborLinks.length-1];/*newline*/if( neighborLink )/*newline*/{/*newline*/    if( getAttr('$type', neighborLink).match(/next/) )/*newline*/    {/*newline*/        var neighbor = getNeighbors('>','*',neighborLink)[0],/*newline*/            npos = getAttr('position',neighbor);/*newline*/        setAttr('position', [npos[0] - 75, npos[1]]);/*newline*/    }/*newline*/    else if( getAttr('$type', neighborLink).match(/onTrack/) )/*newline*/    {/*newline*/        var neighbor = getNeighbors('>','*',neighborLink)[0],/*newline*/            gpos = getAttr('position');/*newline*/        setAttr('position', [gpos[0] + 10, gpos[1] + 35], neighbor);/*newline*/    }/*newline*/    else/*newline*/    {/*newline*/        print('Invalid link');/*newline*/    }/*newline*/}",
			"targetType": "__pPositionable"
		},
		{
			"name": "distinctPLabels",
			"event": "post-create",
			"code": "if( getAttr(\"__pLabel\") == \"\" )\n{\n\tvar pLabels = getAllNodes().\n\t\t\t\t\t\t\tfilter( function(n) {return hasAttr(\"__pLabel\",n);} ).\n\t\t\t\t\t\t\t\tmap( function(n) {return getAttr(\"__pLabel\",n);} ),\n\t\t i\t\t\t= \"0\";\n\n\twhile( _utils.contains(pLabels,i) )\n\t\ti = String(parseInt(i)+1);\n\tsetAttr(\"__pLabel\",i);\n}",
			"targetType": "*"
		}
	],
	"cardinalities": {
		"__pCar": [
			{
				"dir": "in",
				"type": "__ponTrack",
				"min": 0,
				"max": "Infinity"
			}
		],
		"__pUnitTrack": [
			{
				"dir": "out",
				"type": "__pnext",
				"min": 0,
				"max": "Infinity"
			},
			{
				"dir": "in",
				"type": "__pnext",
				"min": 0,
				"max": "Infinity"
			},
			{
				"dir": "out",
				"type": "__ponTrack",
				"min": 0,
				"max": "Infinity"
			}
		],
		"__pPositionable": [],
		"__pnext": [
			{
				"dir": "in",
				"type": "__pUnitTrack",
				"min": 0,
				"max": "1"
			},
			{
				"dir": "out",
				"type": "__pUnitTrack",
				"min": 0,
				"max": "1"
			}
		],
		"__ponTrack": [
			{
				"dir": "in",
				"type": "__pUnitTrack",
				"min": 0,
				"max": "1"
			},
			{
				"dir": "out",
				"type": "__pCar",
				"min": 0,
				"max": "1"
			}
		]
	},
	"legalConnections": {
		"__pUnitTrack": {
			"__pUnitTrack": [
				"__pnext"
			],
			"__pCar": [
				"__ponTrack"
			]
		}
	},
	"connectorTypes": {
		"__pnext": "visual",
		"__ponTrack": "containment"
	},
	"types2parentTypes": {
		"__pCar": [
			"__pPositionable"
		],
		"__pUnitTrack": [
			"__pPositionable"
		],
		"__pPositionable": [],
		"__pnext": [],
		"__ponTrack": []
	}
}