{
  "version": "3.0",
  "categories": [
{% for category_label, components in category_dict.items() %}
    {
      "id": "{{ category_label }}",
      "label": "{{ category_label }}",
      "node_types": [
{% set ns = namespace(first_match=true) %}
{% for component in components %}
  {% if not ns.first_match %},{% endif %}{% set ns.first_match = False %}
        {
          "op": "{{ component.op }}",
          "description": {{ component.description|tojson|safe }},
          "id": "{{ component.id }}",
          "image": "",
          "label": "{{ component.name }}",
          {% if component.runtime_type %}
          "runtime_type": "{{ component.runtime_type }}",
          {% endif %}
          "type": "execution_node",
          "inputs": [
            {
              "id": "inPort",
              "app_data": {
                "ui_data": {
                  "cardinality": {
                    "min": 0,
                    "max": -1
                  },
                  "label": "Input Port"
                }
              }
            }
          ],
          "outputs": [
            {
              "id": "outPort",
              "app_data": {
                "ui_data": {
                  "cardinality": {
                    "min": 0,
                    "max": -1
                  },
                  "label": "Output Port"
                }
              }
            }
          ],
          "parameters": {},
          "app_data": {
          {% if component.extensions %}
            "extensions": {{ component.extensions|tojson }},
            "parameter_refs": {{ component.parameter_refs|tojson }},
          {% endif %}
            "image": "",
            "ui_data": {
              "description": {{ component.description|tojson|safe }},
              "label": "{{ component.name }}",
              "image": "",
              "x_pos": 0,
              "y_pos": 0
            }
          }
        }{% endfor %}
      ]
    }{% if loop.index != category_dict|length %},{% endif %}{% endfor %}
  ]
}
