\m i 100 \e 1 lif:{{x@&".lif"~/:((_ci@[!256;65+!26;+;32])@_ic$-4#)'x}@!x} load:{objects .:["#C"~2#*t:0:P,"/",x;load2 t;load1 t],,x::[#x;x;*F]} objects:{[r;u;o]U_::();R::r;U::u;O::o;D::vbox[U;R];stop[]} controls:{W::!B::N::S::G::L::0} load1:{d:(i:&"#P"~/:2#'x)_ x;A::{(1+(2#x)_in("#D";"#N"))_ x}'i[0]#x;vec[1++norm .+(. 2_*:)'d;(max"*"=1_)'d]} vec:{s:|/x+^:'y;(s;s _sv@[s _vs ,/(s _sv+x)+{&,/x,\:&s[1]-*|^x}'y;1;s[1]-])} max:{+x,'&:'(|/c)-c:#:'x} norm:{(x-&/x;y-&/y)} load2:{i:&~"#"=*:'x;A::2_'x _di i;s:xy x i 0;(|s;or[s;pat[s 1;(rle@|1_)'(&t="$")_ t:{(x?"!")#x}"$",,/x 1_ i]])} xy:{t:1_'(&x=",")_ x:",",x;t:t _dv'" ";{0$x@&x _lin"0123456789"}'t[t[;0]?/:"yx"]} rle:{&|,/{{(.|y)#x="o"}. 0 1_:[1=#x;x,"1";x]}'(&x _lin"ob")_ x:@[x;&~x _lin"ob0123456789";:;"o"]} pat:{,/y+0+\(-1+#y)#x} or:{(|x)_sv|@[x _vs y;0;x[0]-]} stop:{if[~@W;3::'W];controls[]} start:{check[];u:R _vs U;U::S _sv u+_.5*S-R;B::_ S%N;W::&B*B;D::vbox[U;S];worker'!#W;} check:{if[|/S= R"];if[(~N)|N>S;'"N must be > 0 and <= S"];if[S!N;'"N must evenly divide S"]} worker:{[i]."\\start /min cmd.exe /c k w ",($_p)," ",$i} connect:{[i]W[i]:_w;_w 3:(`connect;(N;out[U;S;B;N;i]));if[&/W;neighbors[W;B;N];run[]]} out:{[u;s;b;n;i]k:span[b;n;i];v:(s,s)_vs u;n _sv v[;&&/v interval'+k]-*k} span:{[b;n;i]n*0 1+\:(b,b)_vs i} interval:{(~x<*y)&x