Commit 806d9e47 authored by IOhannes zmölnig's avatar IOhannes zmölnig

New upstream version 0.14.1+darcs20180201

parent d2989d24
......@@ -178,3 +178,9 @@ v0.12: 2003/06/21
Port ia32 MMX assembly code to GCC extensions (MMX support on amd64)
Add V4L2 support to pdp_v4l (merge with pdp_v4l2)
Distill system/zl (Zwizwa Lib) from PDP and libprim/PF code.
0.14.1:
Port SCAF MMX code to x86_64 ABI
Revive pdp_opengl (3dp)
Bugfixes
# Makefile for pure data externals in lib creb.
# Needs Makefile.pdlibbuilder to work.
lib.name = creb
# all C and C++ files in subdirs are source files per class
class.sources = $(wildcard modules/*.c modules++/*.cc)
datafiles = \
$(wildcard doc/*-help.pd abs/*.pd) \
creb-meta.pd \
CHANGES.LOG \
COPYING \
README \
TODO
################################################################################
### pdlibbuilder ###############################################################
################################################################################
# Include Makefile.pdlibbuilder from this directory, or else from externals
# root directory in pd-extended configuration.
include $(firstword $(wildcard Makefile.pdlibbuilder ../Makefile.pdlibbuilder))
################################################################################
### creb extra targets #########################################################
################################################################################
# if creb still doesn't have a meta.pd file, create it on the fly
define meta
#N canvas 48 350 450 300 10;\
\n#X text 9 18 AUTHOR Tom Schouten <tom@zwizwa.be>;\
\n#X text 9 42 DESCRIPTION This is a collection of pd externals. My bag of tricks.;\
\n#X text 9 79 LICENSE GNU GPL 2;\
\n#X text 9 105 VERSION 0.9.2;
endef
all: creb-meta.pd
creb-meta.pd:
@echo "$(meta)" > creb-meta.pd
# install files with idiosyncratic source/destination paths
install-data: install-creb-extras
install-creb-extras: all
$(INSTALL_DIR) $(installpath)/manual && \
$(INSTALL_DATA) doc/reference.txt $(installpath)/manual
$(INSTALL_DIR) $(installpath)/examples && \
$(INSTALL_DATA) $(wildcard doc/examples/*.pd) $(installpath)/examples
#N canvas 0 33 718 865 10;
#N canvas 0 29 958 1049 10;
#X obj 83 95 pdp_v4l;
#X obj 83 35 inlet;
#X obj 91 182 outlet;
......
This diff is collapsed.
# This file was generated by Autom4te Sun Apr 29 21:48:16 UTC 2012.
# It contains the lists of macros which have been traced.
# It can be safely removed.
@request = (
bless( [
'0',
1,
[
'/usr/share/autoconf'
],
[
'/usr/share/autoconf/autoconf/autoconf.m4f',
'configure.ac'
],
{
'_LT_AC_TAGCONFIG' => 1,
'AM_PROG_F77_C_O' => 1,
'AC_INIT' => 1,
'm4_pattern_forbid' => 1,
'_AM_COND_IF' => 1,
'AC_CANONICAL_TARGET' => 1,
'AC_SUBST' => 1,
'AC_CONFIG_LIBOBJ_DIR' => 1,
'AC_FC_SRCEXT' => 1,
'AC_CANONICAL_HOST' => 1,
'AC_PROG_LIBTOOL' => 1,
'AM_INIT_AUTOMAKE' => 1,
'AM_PATH_GUILE' => 1,
'AC_CONFIG_SUBDIRS' => 1,
'AM_AUTOMAKE_VERSION' => 1,
'LT_CONFIG_LTDL_DIR' => 1,
'AC_REQUIRE_AUX_FILE' => 1,
'AC_CONFIG_LINKS' => 1,
'm4_sinclude' => 1,
'LT_SUPPORTED_TAG' => 1,
'AM_MAINTAINER_MODE' => 1,
'AM_NLS' => 1,
'AC_FC_PP_DEFINE' => 1,
'AM_GNU_GETTEXT_INTL_SUBDIR' => 1,
'AM_MAKEFILE_INCLUDE' => 1,
'_m4_warn' => 1,
'AM_PROG_CXX_C_O' => 1,
'_AM_COND_ENDIF' => 1,
'_AM_MAKEFILE_INCLUDE' => 1,
'AM_ENABLE_MULTILIB' => 1,
'AM_SILENT_RULES' => 1,
'AM_PROG_MOC' => 1,
'AC_CONFIG_FILES' => 1,
'include' => 1,
'LT_INIT' => 1,
'AM_PROG_AR' => 1,
'AM_GNU_GETTEXT' => 1,
'AC_LIBSOURCE' => 1,
'AM_PROG_FC_C_O' => 1,
'AC_CANONICAL_BUILD' => 1,
'AC_FC_FREEFORM' => 1,
'AH_OUTPUT' => 1,
'AC_FC_PP_SRCEXT' => 1,
'_AM_SUBST_NOTMAKE' => 1,
'AC_CONFIG_AUX_DIR' => 1,
'sinclude' => 1,
'AM_PROG_CC_C_O' => 1,
'm4_pattern_allow' => 1,
'AM_XGETTEXT_OPTION' => 1,
'AC_CANONICAL_SYSTEM' => 1,
'AM_CONDITIONAL' => 1,
'AC_CONFIG_HEADERS' => 1,
'AC_DEFINE_TRACE_LITERAL' => 1,
'AM_POT_TOOLS' => 1,
'm4_include' => 1,
'_AM_COND_ELSE' => 1,
'AC_SUBST_TRACE' => 1
}
], 'Autom4te::Request' )
);
This diff is collapsed.
File mode changed from 100755 to 100644
File mode changed from 100755 to 100644
This diff is collapsed.
......@@ -7,7 +7,7 @@ AC_HEADER_STDC
dnl TAG REPO WHEN RELEASE VERSION CHANGES !!!
dnl After changing version, do "make mrproper ; sh bootstrap"
PDP_VERSION=0.14.1
PDP_VERSION=0.14.2
AC_SUBST(PDP_VERSION)
......
libv4l-dev
libgsl0-dev
libz-dev
libpng12-dev
libx11-dev
libxv-dev
libquicktime-dev
libgl1-mesa-dev
libsdl1.2-dev
......@@ -943,3 +943,218 @@ x86_64, but at least it works.
- example05.pd : multiple window render contexts
- example06.pd : bug in scaf CA grid -> texture conversion ?
Entry: glxcontext
Date: Sat Dec 21 17:55:00 EST 2013
void zl_3Dcontext_glx_setup(void) {
...
glx_env.glx = zl_glx_new();
...
}
There's some confusion about context and drawables... Find out
exactly what the relation is between these. The bug is probably just
a misunderstanding of what is what.
glXMakeCurrent takes:
- Display
- GLXDrawable (window)
- GLXContext
When a 3dp window is closed and reopened, the drawable should change,
but the display and context should remain the same.
The problem seems to be that the drawable is gone. Maybe this is just
a flush problem?
Or, does the closing of the window also delete the context?
no
Something non-obvious is going on here. It doesn't look like the
swapbuffer call is the source of the problem, just a symptom.
X Error of failed request: BadMatch (invalid parameter attributes)
Major opcode of failed request: 154 (GLX)
Minor opcode of failed request: 11 (X_GLXSwapBuffers)
Serial number of failed request: 320
Current serial number in output stream: 321
I'm guessing this is just fallout from a dangling reference issue.
Entry: Cleanup
Date: Sun Dec 22 14:43:23 EST 2013
So I really want to clean up PDP to make it maintainable. What that
means in practice is to _remove_ stuff.
One of the complications is the procqueue. I wonder if it is actually
used for anything essential. It can probably be replaced with
abstract interpretation.
The problem here is time. This is not someting for an incremental
job. Or at least, the increments will be fairly large.
Entry: Debug GLX error
Date: Mon Dec 30 17:35:38 EST 2013
..
glXSwapBuffers(0x7fb9f0000950,0x1600003)
glXSwapBuffers(0x7fb9f0000950,0x1600003)
zl_3Dcontext_free(0x1d2baf0,(nil))
glXSwapBuffers(0x7fb9f0000950,0x160000a)
glXSwapBuffers(0x7fb9f0000950,0x160000a)
glXSwapBuffers(0x7fb9f0000950,0x160000a)
X Error of failed request: BadMatch (invalid parameter attributes)
Major opcode of failed request: 154 (GLX)
Minor opcode of failed request: 11 (X_GLXSwapBuffers)
Serial number of failed request: 592
Current serial number in output stream: 594
I'd like to really know what is going on here, i.e. go into the
graphics driver and see why it raises a BadMatch, which is not what
it's supposed to do. At least I find no valid reason.
Maybe mesa debug would help here?
Entry: Better errors on Acer Revo / Ubuntu
Date: Mon Jan 6 11:36:08 EST 2014
glXSwapBuffers(0xb35004e0,0x1800003)
glXSwapBuffers(0xb35004e0,0x1800003)
glXSwapBuffers(0xb35004e0,0x1800003)
glXSwapBuffers(0xb35004e0,0x1800003)
zl_3Dcontext_free(0x87364e8,(nil))
glXSwapBuffers(0xb35004e0,0x180000a)
glXSwapBuffers(0xb35004e0,0x180000a)
X Error of failed request: GLXBadDrawable
Major opcode of failed request: 153 (GLX)
Minor opcode of failed request: 11 (X_GLXSwapBuffers)
Serial number of failed request: 81
Current serial number in output stream: 82
Entry: Main 3D rendering objects
Date: Mon Jan 6 11:36:55 EST 2014
The problem is one of organization.
- X server connection
- GLX contex
- X window (drawable)
How to fix? Probably best to trace all gl calls. Is there a simple
way to do this without manual edit?
Entry: gdb
Date: Mon Jan 6 12:13:00 EST 2014
Is this just me getting old and confused, or did the buggy nature of
emacs / gdb just get worse over time?
I'm gessing the problem is that the process stdout/stderr is not
tagged with target-stream-output '@'.
Entry: zl updates
Date: Sat Aug 16 12:08:04 EDT 2014
Looks like this broke:
pdp_3d_windowcontext.c:133:5: warning: implicit declaration of function ‘pdp_packet_3Dcontext_event_out’ [-Wimplicit-function-declaration]
pdp_packet_3Dcontext_event_out(p, x->x_eventout);
Entry: __attribute__((unused))
Date: Sat Aug 16 12:08:16 EDT 2014
A useful warning, so added the attribute to all dummy variables.
Entry: cleanup
Date: Mon Jan 6 13:52:35 EST 2014
Is there a way to clean up PDP to make it easier to maintain?
What I want to do is to reduce everything to a libprim core, then port
it to the existing PDP api. I.e. I want to toss it all out.
This however is not realistic without a design of what PDP is supposed
to be. The trouble is feature creep.
Obtaining a design would require a review of each file to understand
how it actually works and where it is broken due to bad interactions.
Some elements of the API that are a bit crooked:
- planar processing (e.g. chanmask)
- autoconvert
- procqueue
- refcount mechanism
- dpd / 3dp "serial programming" idea
Practically, moving part by part to libprim or other libraries is
probably the best approach.
I don't have the time/energy/motivation to turn this into a large sprint.
The best I can do for now is incremental increases.
Entry: Picking up again
Date: Sat Oct 31 08:59:29 EDT 2015
For those who lost track: this got off the rails a little. PDP/PF
have been stepping-stone projects towards learning more about
designing programs, virtual machines, programming languages and
compilers. The idea has been to keep PDP and PF up with the
development in that area, which has largely been infeasbile due to the
large amount of design errors made in the process. Today, another
attempt to fix things.
Current state:
libprim: simple object system
zl: bindings to (linux) libraries
The idea was to build PF and possibly PDP on those two libraries, and
then use RAI to generate DSP code.
Entry: PF fixes
Date: Mon Nov 2 07:57:08 EST 2015
Spent this weekend propagating some changes in libprim/leaf to
libprim/pf:
- leaf_object has a built in rc count, which is used to create
composite (tree-structured) leaf objects.
- removed the RC wrapper used in PF, and renamed the LIN wrapper to
UNIQ.
It looks like the PF design is sound, however its implementation could
probably be made a little simpler.
......@@ -155,7 +155,7 @@ t_class *pdp_del_class;
void *pdp_del_new(t_floatarg forder, t_floatarg fdel)
void *pdp_del_new(t_floatarg forder, t_floatarg __attribute__((unused)) fdel)
{
int order = (int)forder;
int del;
......
......@@ -55,7 +55,7 @@ static void pdp_description_input_dpd(t_pdp_description *x, t_symbol *s, t_float
}
static void pdp_description_free(t_pdp_description *x)
static void pdp_description_free(t_pdp_description __attribute__((unused)) *x)
{
}
......@@ -64,7 +64,9 @@ t_class *pdp_description_class;
static void *pdp_description_new(t_symbol *s, int argc, t_atom *argv)
static void *pdp_description_new(t_symbol __attribute__((unused)) *s,
int __attribute__((unused)) argc,
t_atom __attribute__((unused)) *argv)
{
t_pdp_description *x = (t_pdp_description *)pd_new(pdp_description_class);
......
......@@ -79,7 +79,7 @@ static void pdp_inspect_input_0(t_pdp_inspect *x, t_symbol *s, t_floatarg f)
static void pdp_inspect_free(t_pdp_inspect *x)
static void pdp_inspect_free(t_pdp_inspect __attribute__((unused)) *x)
{
}
......
......@@ -97,7 +97,9 @@ static t_class *metro_class;
static void *metro_new(t_symbol *s, int argc, t_atom *argv)
static void *metro_new(t_symbol __attribute__((unused)) *s,
int __attribute__((unused)) argc,
__attribute__((unused)) t_atom *argv)
{
t_metro *x = (t_metro *)pd_new(metro_class);
x->x_outlet = outlet_new(&x->x_obj, &s_bang);
......
......@@ -87,7 +87,7 @@ static void pdp_route_route(t_pdp_route *x, t_floatarg f)
static void pdp_route_free(t_pdp_route *x)
static void pdp_route_free(t_pdp_route __attribute__((unused)) *x)
{
}
......
......@@ -125,7 +125,8 @@ t_class *pdp_trigger_class;
static void *pdp_trigger_new(t_symbol *s, int argc, t_atom *argv)
static void *pdp_trigger_new(t_symbol __attribute__((unused)) *s,
int argc, t_atom *argv)
{
t_pdp_trigger *x = (t_pdp_trigger *)pd_new(pdp_trigger_class);
t_atom defarg[2], *ap;
......
......@@ -115,7 +115,7 @@ static void _wait_until_done(t_pdp_udp_send *x)
}
static void _remove_packet_from_queue(t_pdp_udp_send *x)
static void _remove_packet_from_queue(t_pdp_udp_send __attribute__((unused)) *x)
{
}
......
......@@ -234,7 +234,7 @@ static void pdp_v4l_bang(t_pdp_v4l *x) {
/* Get raw image data */
unsigned char *newimage = NULL;
zl_v4l_next(&x->zl, &newimage);
zl_v4l_next(&x->zl, &newimage, 0);
if (NULL == newimage) return;
unsigned int fourcc;
......@@ -306,7 +306,8 @@ static void pdp_v4l_free(t_pdp_v4l *x) {
pdp_v4l_close(x);
}
static void pdp_v4l_norm(t_pdp_v4l *x, t_symbol *s) {
static void pdp_v4l_norm(t_pdp_v4l __attribute__((unused)) *x,
t_symbol __attribute__((unused)) *s) {
#ifdef HAVE_V4L1
unsigned int norm;
if (gensym("PAL") == s) norm = VIDEO_MODE_PAL;
......@@ -372,7 +373,7 @@ t_class *pdp_v4l_class;
void *pdp_v4l_new(t_symbol *vdef, t_symbol *format)
void *pdp_v4l_new(t_symbol __attribute__((unused)) *vdef, t_symbol *format)
{
t_pdp_v4l *x = (t_pdp_v4l *)pd_new(pdp_v4l_class);
......
......@@ -166,7 +166,7 @@ t_class *pdp_grey2array_class;
void *pdp_array2grey_new(t_symbol *s, t_symbol *r)
void *pdp_array2grey_new(t_symbol *s, t_symbol __attribute__((unused)) *r)
{
t_pdp_array *x = (t_pdp_array *)pd_new(pdp_array2grey_class);
pdp_array_array(x, s);
......
......@@ -105,7 +105,7 @@ t_class *pdp_chrot_class;
void *pdp_chrot_new(t_floatarg f)
void *pdp_chrot_new(t_floatarg __attribute__((unused)) f)
{
t_pdp_chrot *x = (t_pdp_chrot *)pd_new(pdp_chrot_class);
......
......@@ -42,7 +42,8 @@ typedef struct pdp_mat_vec_struct
#define GETDOUBLE(x) (double)GETFLOAT(x)
static void pdp_mat_vec_list_in(t_pdp_mat_vec *x, t_symbol *s, int argc, t_atom *argv)
static void pdp_mat_vec_list_in(t_pdp_mat_vec *x, t_symbol __attribute__((unused)) *s,
int argc, t_atom *argv)
{
int i;
int vp = -1;
......@@ -175,7 +176,7 @@ void *pdp_mat_vec_list2vec_new(t_symbol *type)
}
void *pdp_mat_vec_vec2list_new(t_symbol *type)
void *pdp_mat_vec_vec2list_new(t_symbol __attribute__((unused)) *type)
{
t_pdp_mat_vec *x = pdp_mat_vec_base_new();
x->x_out = outlet_new((t_object *)x, &s_anything);
......
#N canvas 426 142 799 779 10;
#N canvas 0 29 681 737 10;
#X floatatom 126 37 5 0 0 0 - - -;
#X obj 56 20 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
-1;
......@@ -113,7 +113,7 @@
#X obj 59 54 metro 20;
#X obj 238 207 * 0.05;
#X obj 9 570 spigot;
#X obj 76 546 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1
#X obj 76 546 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1
;
#X obj 612 122 + 1;
#X text 28 521 texture feedback;
......@@ -122,6 +122,7 @@
#X text 549 734 ---;
#X text 549 787 ---;
#X obj 59 176 3dp_mouserotate;
#X msg 188 47 close;
#X connect 0 0 108 1;
#X connect 1 0 108 0;
#X connect 2 0 108 0;
......@@ -255,3 +256,4 @@
#X connect 112 0 101 1;
#X connect 112 0 105 0;
#X connect 118 0 54 0;
#X connect 119 0 95 0;
set breakpoint pending on
break glXSwapBuffers
run
#N canvas 0 30 1438 868 10;
#X floatatom 126 37 5 0 0 0 - - -, f 5;
#X obj 56 20 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
-1;
#X msg 83 19 stop;
#X floatatom 360 431 5 0 0 0 - - -, f 5;
#X obj 59 103 3dp_push;
#X floatatom 672 189 5 0 0 0 - - -, f 5;
#X obj 546 244 3dp_view transx 3;
#X obj 546 270 3dp_light;
#X obj 612 97 f;
#X floatatom 641 98 5 0 0 0 - - -, f 5;
#X floatatom 669 370 5 0 0 0 - - -, f 5;
#X obj 182 491 arm 3;
#X obj 182 514 arm 3;
#X obj 182 537 arm 3;
#X obj 182 467 arm 3;
#X floatatom 360 455 5 0 0 0 - - -, f 5;
#X floatatom 359 478 5 0 0 0 - - -, f 5;
#X floatatom 358 501 5 0 0 0 - - -, f 5;
#X floatatom 358 524 5 0 0 0 - - -, f 5;
#X obj 182 584 arm 3;
#X obj 182 607 arm 3;
#X obj 182 630 arm 3;
#X obj 182 560 arm 3;
#X floatatom 358 548 5 0 0 0 - - -, f 5;
#X floatatom 358 571 5 0 0 0 - - -, f 5;
#X floatatom 358 594 5 0 0 0 - - -, f 5;
#X obj 59 224 3dp_view roty;
#X obj 284 449 * 1;
#X obj 284 589 * -1;
#X obj 182 653 arm 3;
#X floatatom 358 617 5 0 0 0 - - -, f 5;
#X obj 284 635 * -1.5;
#X obj 663 686 s roty;
#X floatatom 615 611 5 0 0 0 - - -, f 5;
#X floatatom 671 585 5 0 0 0 - - -, f 5;
#X obj 673 616 s scale;
#X floatatom 359 388 5 0 0 0 - - -, f 5;
#X obj 284 473 * -1.01;
#X obj 284 496 * 0.99;
#X obj 284 519 * -1.01;
#X obj 284 542 * 2.1;
#X obj 284 566 * -1.7;
#X obj 182 425 3dp_draw cube 1.4;
#X obj 182 809 3dp_draw cube 1.4;
#X msg 597 536 4;
#X obj 59 151 3dp_view transz -3;
#X obj 546 216 3dp_view roty 54;
#X obj 669 392 s cubesize;
#X msg 360 345 3.15;
#X msg 126 17 20;
#X obj 284 612 * 0.11;
#X floatatom 672 220 5 0 0 0 - - -, f 5;
#X msg 612 72 0;
#X obj 342 311 * 1;
#X obj 59 201 3dp_view rotx;
#X floatatom 164 187 5 0 0 0 - - -, f 5;
#X floatatom 358 641 5 0 0 0 - - -, f 5;
#X obj 182 700 arm 3;
#X obj 182 724 arm 3;
#X obj 182 748 arm 3;
#X obj 182 677 arm 3;
#X floatatom 359 664 5 0 0 0 - - -, f 5;
#X floatatom 359 688 5 0 0 0 - - -, f 5;
#X floatatom 360 712 5 0 0 0 - - -, f 5;
#X obj 284 706 * -1;
#X obj 182 771 arm 3;
#X floatatom 360 735 5 0 0 0 - - -, f 5;
#X obj 283 753 * -1.5;
#X obj 284 659 * 2.1;
#X obj 284 682 * -1.7;
#X obj 283 730 * 0.11;
#X obj 9 334 3dp_push;
#X obj 182 399 3dp_view transz;
#X floatatom 282 369 5 0 0 0 - - -, f 5;
#X obj 131 371 3dp_view transz;
#X obj 231 338 * -1;
#X msg 282 341 2;
#X obj 564 401 s drawtorus;
#X obj 564 374 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1
1;
#X obj 674 496 s torusr1;
#X floatatom 672 473 5 0 0 0 - - -, f 5;
#X floatatom 667 419 5 0 0 0 - - -, f 5;
#X obj 669 442 s torusr2;
#X msg 564 349 1;
#X obj 597 645 *;
#X obj 59 126 3dp_push;
#X obj 9 364 3dp_push;
#X obj 9 437 3dp_view rotx;
#X floatatom 96 416 5 0 0 0 - - -, f 5;
#X obj 9 471 3dp_draw sphere 30 40;
#X obj 9 593 3dp_snap;
#X obj 473 487 / 1000;
#X floatatom 473 461 5 0 0 0 - - -, f 5;
#X obj 430 8 loadbang;
#X obj 430 31 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1
-1;
#X obj 59 77 3dp_windowcontext;
#X obj 59 274 3dp_push;
#X obj 110 303 pdp_t p b;
#X obj 9 307 pdp_t p b;
#X msg 349 252 400;
#X msg 311 252 -400;
#X obj 342 287 +;
#X msg 473 434 3;
#X text 544 189 light source;
#X obj 59 248 3dp_view scale 0.4;
#X obj 640 157 s counter;
#X obj 245 169 r counter;
#X text 694 98 speed;
#X obj 59 54 metro 20;
#X obj 238 207 * 0.05;
#X obj 9 570 spigot;
#X obj 76 546 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1
;
#X obj 612 122 + 1;
#X text 28 521 texture feedback;
#X text 486 751 "no-bots in no-sphere";
#X text 459 768 a double dance of 13 segments;
#X text 549 734 ---;
#X text 549 787 ---;
#X obj 59 176 3dp_mouserotate;
#X msg 188 47 close;
#X obj 285 51 delay 5000;
#X connect 0 0 108 1;
#X connect 1 0 108 0;
#X connect 2 0 108 0;
#X connect 3 0 27 1;
#X connect 4 0 85 0;
#X connect 4 1 46 0;
#X connect 5 0 46 1;
#X connect 6 0 7 0;
#X connect 8 0 112 0;
#X connect 9 0 112 1;
#X connect 10 0 47 0;
#X connect 11 0 12 0;
#X connect 12 0 13 0;
#X connect 13 0 22 0;
#X connect 14 0 11 0;
#X connect 15 0 37 1;
#X connect 16 0 38 1;
#X connect 17 0 39 1;
#X connect 18 0 40 1;
#X connect 19 0 20 0;
#X connect 20 0 21 0;
#X connect 21 0 29 0;
#X connect 22 0 19 0;
#X connect 23 0 41 1;
#X connect 24 0 28 1;
#X connect 25 0 50 1;
#X connect 26 0 104 0;
#X connect 27 0 37 0;
#X connect 27 0 14 1;
#X connect 28 0 50 0;
#X connect 28 0 20 1;
#X connect 29 0 60 0;
#X connect 30 0 31 1;
#X connect 31 0 29 1;
#X connect 31 0 68 0;
#X connect 33 0 84 1;
#X connect 34 0 35 0;
#X connect 36 0 42 2;
#X connect 36 0 43 2;
#X connect 37 0 38 0;