User blog:Rgetar/New program (ordinals up to Rathjen ordinal)

I modified my program I published in my previous blog post and created its new version Ordinal Explorer v3.0. I think that its countable limit is ordinal #1201 of Scorcher007's list of ordinals ('Rathjen ordinal'). (Countable limit in v2.0 was #691 or 'Small Rathjen ordinal').

Alphabet
The notation uses 3 symbols:
 * ]
 * M
 * M

(In 2.0 was "I" instead of "M").

Strings
There are 3 kinds of strings:
 * M
 * [X]α, where X and α are strings
 * [X]α, where X and α are strings

(Some examples of correspondence "string - ordinal": empty string is 0; "M" is least weakly Mahlo cardinal; "[]" is 1; "" is ω (least infinite ordinal), see Fundamental sequence algorythm section).

Base
For string [X]α base is α:
 * base([X]α) = α

For empty string and M base is empty string:
 * base =
 * base(M) =

Booster
For string [X]α booster is X:
 * booster([X]α) = X

For empty string and M booster is empty string:
 * booster =
 * booster(M) =

Countable limit
Countable limit of this notation ('Rathjen ordinal') is designated as "L".

Comparison
Note: this comparison algorythm is the same as in v2.0, but with "M" instead of "I".

Note: this comparison algorythm works only with standard forms (for non-standard form it would work improperly). Definition of standard form see in Standard forms section.

Comparison of two strings s1 and s2:

If strings are the same then
 * strings are equal

else if one of strings is empty string then
 * empty string is lesser

else if rightmost symbol of one and only one string is "M" then
 * string with rightmost symbol "M" is larger

else if rightmost symbol of both strings is "M" then
 * delete rightmost symbol ("M") from s1 and s2 and compare them (result of comparison of s1 and s2 is result of this comparison)

else if strings between rightmost "]" and corresponding "[" of s1 and s2 are not the same then
 * compare strings between rightmost "]" and corresponding "[" of s1 and s2 (result of comparison of s1 and s2 is result of this comparison)

else
 * delete all from rightmost "]" to corresponding "[" from s1 and s2 and compare them (result of comparison of s1 and s2 is result of this comparison).

Cofinality
Differences with v2.0 are bolded.

(I determine cofinality of 0 as 0, and cofinality of a successor as 1).

Note: there are 8 cases for cofinality and fundamental sequence algorythms, and these cases are designated with numbers.

Let
 * β = base(α)
 * X = booster(α)

Cofinality of α (cof(α)):

If α is empty string or M then                 (Cases 1, 2)
 * cof(α) = α

else if X is empty string then                 (Case 3)
 * cof(α) = []

else if cof(X) = M > β then                    (Case 4)
 * cof(α) = α

else if [] < cof(X) < α then                     (Case 6)
 * cof(α) = cof(X)

else                                                       (Cases 5, 7, 8)
 * cof(α) =

Fundamental sequence algorythm
Differences with v2.0 are bolded.

(I determine that 0 has no fundamental sequence, and fundamental sequence of a successor α + 1 has only one (0-th) element α).

Note: there are 8 cases for cofinality and fundamental sequence algorythms, and these cases are designated with numbers.

Let
 * β = base(α)
 * X = booster(α)
 * γ = base(X)
 * δ = base(cof(X))
 * Y = booster(cof(X))

n-th element of fundamental sequence of α (α[n]):

If α = L then                                                                                                 (Case of L)
 * α[n] = Zn, where Z0 = M, Zn + 1 = [Zn]M

else if α is empty string then                                                                       (Case 1)
 * α has no fundamental sequence

else if α = M then                                                                                        (Case 2)
 * α[n] = n

else if X is empty string then                                                                      (Case 3)
 * α[n] = β

else if cof(X) = M > β then                                                                         (Case 4)
 * α[n] = n

else if cof(X) = [] then                                                                                 (Case 5)
 * α[0] = β, α[n + 1] = [γ]α[n]    ([γ] and α[n], not n-th fs element of [γ]α)

else if cof(X) < α then                                                                                (Case 6)
 * α[n] = [X[n]]β

else if Y = M and δ ≤ α then                                                                      (Case 7)
 * α[0] = β, α[n + 1] = [X[α[n]]]β

else                                                                                                            (Case 8)
 * α[0] = β, α[n + 1] = [Zn]β, where Z0 = δ, Zn + 1 = [Y[Zn]]δ

Standard forms
"L" is standard form, and any generated by this algorythm element of fundamental sequence of a standard form is also standard form.

Decryption of strings
Here are some rules how to decrypt strings (these rules are not suitable for arbitrary strings - for arbitrary strings use fundamental sequence algorythm).

Empty string is 0, M is least weakly Mahlo cardinal.

For α = [X]β:

If least uncountable cardinal larger than X ≤ least uncountable cardinal larger than β then
 * [X]β = β + ωX

else
 * [M]β is least uncountable cardinal larger than β
 * [M2]β is least weakly inaccessible cardinal larger than β
 * [M3]β is least weakly 1-inaccessible cardinal larger than β
 * [M4]β is least weakly 2-inaccessible cardinal larger than β
 * [M5]β is least weakly 3-inaccessible cardinal larger than β
 * [M2]β is least weakly hyperinaccessible cardinal larger than β
 * (for other cases see fundamental sequence algorythm)
 * (for other cases see fundamental sequence algorythm)
 * (for other cases see fundamental sequence algorythm)

[X + 1]β is limit of
 * β
 * [X]β
 * [X][X]β
 * [X][X][X]β
 * [X][X][X][X]β
 * [X][X][X][X][X]β

Examples:
 * []β = β + 1
 * [][]β = β + 2
 * [][][]β = β + 3
 * [][][][][]β = β + 4
 * [][][][][][]β = β + 5
 * β = [1]β = β + ω
 * []β = [ω]β = β + ωω
 * [M] = Ω
 * [][M] = Ω + 1
 * [M][M] = [M]Ω = Ω2
 * [][M][M] = []Ω2 = Ω2 + 1
 * [[M]&#93;[M][M] = [Ω]Ω2 = Ω2 + Ω
 * [M][M][M] = [M]Ω2 = Ω3
 * []M = M + 1
 * [[]M] = [M + 1] = [M][M][M][M][M]... = Ωω
 * [M][[]M] = [M][M + 1] = Ωω + 1
 * [[M]&#93;[M] = [Ω]Ω = Ω2
 * [[M]&#93;[[M]&#93;[M] = [Ω][Ω]Ω = Ω3
 * [M[M]][M] = [Ω2]Ω = ωΩ2 = Ω2
 * [[M]&[M]][M] = [Ω2]Ω = ωΩ 2 = ΩΩ
 * [[[M[M]][M]][M]][M] = [ΩΩ]Ω = ωΩ Ω = ΩΩ Ω
 * [M]M = M2
 * [[M]M] = [M2] = I
 * [M][[M]M] = [M][M2] = ΩI + 1
 * [M][M]M = M3
 * [[M][M]M] = [M3] = least weakly 1-inaccessible cardinal
 * [[M]M]M = [M2]M = ωM2 = M2
 * [[[M]M]M] = [M2] = least weakly hyperinaccessible cardinal
 * [[[M]M]M]M = [M2]M = ωM 2 = MM
 * [[[[M]M]M]M]M = [MM]M = ωM M = MM M

Lists of ordinals
I decided to post lists of ordinals in a separate blog, since they are too large.

Source code
Source code of Ordinal Explorer v3.0.

For comparison see function compare, for cofinality see function cof, for fundamental sequence algorythm see function fs.

In function cof and function fs 8 cases are designated with numbers.

unit Ord;

interface

uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, StrUtils, Math, ScktComp;

type TForm1 = class(TForm) Button1: TButton; Label1: TLabel; Label2: TLabel; Label3: TLabel; ServerSocket1: TServerSocket; Label4: TLabel; Label5: TLabel; Label6: TLabel; Label7: TLabel; procedure Button1Click(Sender: TObject); procedure Serversocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket); procedure Form1Create(Sender: TObject); procedure Form1Destroy(Sender: TObject); end;

lis=array of record s{,i}: string; c,l: integer; end; rar=array[0..19] of string;

var Form1: TForm1; st,st1,bo,cout,qhost,fa,col: string; s: lis; f: textfile; b,bn,g: boolean; cn,cl,sl,br: integer; duq,uq,bro,brc: rar; implementation

{$R *.dfm}

// get position of last symbol p of string st (if l=true then first) function getls(st,p:string; l:boolean=false):integer; var e,np: integer; begin if length(st)=0 then result:=ifthen(l,1,0) else begin if l then e:=0 else e:=length(st)+1; np:=0; repeat if l then inc(e) else dec(e); if st[e]='[' then dec(np); if st[e]=']' then inc(np); until (not l and (e=1)) or (l and (e=length(st))) or ((st[e]=p) and (np=0)); if not l and (e=1) and (st[1]<>p) then e:=0 else if l and (e=length(st)) and (st[e]<>p) then e:=length(st)+1; result:=e; end; end;

// get base of string st (in new notation) function base(st:string):string; begin result:=copy(st,getls(st,']',true)+1,length(st)); end;

// get booster of string st (in new notation) function booster(st:string):string; begin result:=copy(st,2,getls(st,']',true)-2); end;

// get successor of ordinal st function suc(st:string):string; begin result:='[]'+st; end;

// get X from successor ordinal st = X + 1 function pred(st:string):string; begin result:=copy(st,3,length(st)); end;

// finite ordinal string st to number function fostn(st:string):integer; begin if st='' then result:=0 else result:=(length(st)+1) div 2; end;

// finite ordinal e from integer to computer format function cf(e:integer):string; begin result:=''; while e>0 do  begin dec(e); result:=suc(result); end; end;

// compare standard forms of ordinals st1, st2 (if st1st2 then 1) function compare(st1,st2:string):shortint; var q1,q2,l1,l2:integer; begin if st1=st2 then result:=0 else if st1='' then result:=-1 else if st2='' then result:=1 else if (rightstr(st1,1)=col) and (rightstr(st2,1)<>col) then result:=1 else if (rightstr(st2,1)=col) and (rightstr(st1,1)<>col) then result:=-1 else if rightstr(st1,1)=col then result:=compare(leftstr(st1,length(st1)-1),leftstr(st2,length(st2)-1)) else repeat l1:=length(st1); l2:=length(st2); q1:=getls(st1,'['); q2:=getls(st2,'['); delete(st1,l1,1); delete(st2,l2,1); result:=compare(copy(st1,q1+1,l1),copy(st2,q2+1,l2)); if result=0 then begin delete(st1,q1,l1); delete(st2,q2,l2); if st1='' then result:=-1 else if st2='' then result:=1; end; until result<>0; end;

// get cofinality of ordinal st function cof(st:string):string; var c:string; begin if (st='') or (st=col) then                              // 1, 2 result:=st else begin c:=cof(booster(st)); if c='' then                                          // 3 result:='[]' else if (c=col) and (compare(col,st)=1) then          // 4 result:=st else if (compare(c,'[]')=1) and (compare(st,c)=1) then // 6 result:=c else                                                  // 5, 7, 8 result:=''; end; end;

// get n-th element of fs of ordinal st function fs(st,n:string):string; var c,s,x,y,z:string; i:integer; begin if st='L' then                                           // L   begin z:=col; for i:=1 to fostn(n) do     z:='['+z+']'+col; result:=bro[br+2]+z+brc[br+2]; end else if st=col then                                      // 2 result:=n else begin x:=booster(st); c:=base(st); if x='' then                                          // 3 result:=c else begin s:=cof(x); if (s=col) and (compare(col,c)=1) then             // 4 result:=n else if s='[]' then                                // 5 begin x:=pred(x); for i:=1 to fostn(n) do           c:='['+x+']'+c; result:=c; end else if compare(st,s)=1 then                       // 6 result:='['+fs(x,n)+']'+c else begin y:=booster(s); z:=base(s); if (y=col) and (compare(z,st)<1) then           // 7 begin s:=c; for i:=1 to fostn(n) do              s:='['+fs(x,s)+']'+c; result:=s; end else begin                                        // 8 if n='' then result:=c else begin s:=z; for i:=2 to fostn(n) do                 s:='['+fs(y,s)+']'+z; result:='['+fs(x,s)+']'+c; end; end; end; end; end; end;

function convert(st:string;z:boolean=false):string; begin result:=st; end;

// small expansion of pair c > l function se(c,l:string; yn:integer; var n:string):string; var u:integer; begin n:=''; repeat result:=fs(c,n); n:=suc(n); until (l='-') or (compare(result,l)=1); for u:=3 to yn do  n:=suc(n); if yn>1 then result:=fs(c,n); end;

// levelup (q - number of levelups, yn - number of fs elements, inserted in last levelup) procedure levelup(q:integer; yn:integer=0); var e,i,y,u,j: integer; n,l,p,a,c: string; begin inc(yn); while q>0 do begin dec(q); if q>0 then j:=1 else j:=yn; e:=0; c:=s[e].s; i:=s[e].c; y:=0; form1.Label2.Caption:=inttostr(cn)+'                      '; form1.Label2.Refresh; repeat begin n:=''; if i=-1 then begin l:='-'; p:=''; end else begin l:=s[i].s;     p:=suc(l); end; if compare(c,p)=0 then begin e:=i; if e>-1 then begin c:=s[e].s;        i:=s[e].c;         if i=-1 then e:=i; end; dec(cn); form1.Label2.Caption:=inttostr(cn)+'                      '; form1.Label2.Refresh; end else begin a:=se(c,l,j,n); u:=0; while ulength(s) then setlength(s,length(s)*2); form1.Label1.Caption:=inttostr(sl); form1.Label1.Refresh; e:=y; s[e].c:=i; s[e].s:=a; s[e].l:=ifthen(u=j,cl,cl+1); if u<>j then begin n:=pred(n); a:=fs(c,n); end; end; c:=a; end; end; until e=-1; cn:=y; inc(cl); end; end;

function ruq(st:string;uq:rar):rar; var e,i:integer; begin st:=st+'='; result:=uq; while (st<>'=') and (st<>'') do  begin e:=system.ord(st[1])-48; delete(st,1,1); i:=pos('=',st); result[e]:=leftstr(st,i-1); delete(st,1,i); end; end;

function wuq(st:string):string; var e:integer; huq:rar; begin huq:=ruq(st,uq); result:=''; for e:=0 to length(uq)-1 do  if huq[e]<>duq[e] then begin if result<>'' then result:=result+'='; result:=result+chr(e+48)+huq[e]; end; end;

// get html link s, displaying string st function getrefs(s, st: string):string; begin result:=''+st+''; end;

procedure ads(st:string); begin if g then cout:=cout+st else writeln(f,st); end;

procedure starthtml; begin cout:=''; st:='  a {text-decoration: none; color: blue;} a:hover {text-decoration: underline;} a:visited {color: blue;} '; st:='sup {font-size: 0.83rem;}'+st; st:='sub {font-size: 0.83rem;}'+st; st:=' '+st; ads(st); end;

procedure endhtml; begin if g then begin st:=#13#10#13#10#13#10+' Formats:'; st:=st+' ['+getrefs(wuq('9'+ifthen(uq[9]=,'0',)),ifthen(uq[9]=,,'not ')+'computer format')+']'; st:=st+' ['+getrefs(wuq('8'+ifthen(uq[8]=,'0',)),ifthen(uq[8]='','without','with')+' &#949;, &#950;, &#951;, &#913;, &#914;, &#915;, &#916;, v, V, H')+']'; st:=st+' ['+getrefs(wuq(';'+ifthen(uq[11]=,'0',)),ifthen(uq[11]='','without','with')+' &#969;, &#937;')+']'; st:=st+' ['+getrefs(wuq(':'+ifthen(uq[10]=,'0',)),ifthen(uq[10]='','without','with')+' finite subscripts of &#966;')+']'; st:=st+' ['+getrefs(wuq('5'+ifthen(uq[5]=,'0',)),ifthen(uq[5]='','with','without')+' infinite multipliers')+'] '; ads(st); st:=#13#10#13#10#13#10#13#10#13#10#13#10#13#10#13#10#13#10#13#10#13#10#13#10#13#10#13#10#13#10#13#10#13#10#13#10#13#10#13#10#13#10#13#10; ads(st); st:=#13#10#13#10#13#10#13#10#13#10#13#10#13#10#13#10#13#10#13#10#13#10#13#10#13#10#13#10#13#10#13#10#13#10#13#10#13#10#13#10#13#10#13#10; ads(st); st:=#13#10#13#10+' ['+getrefs(wuq('3'+ifthen(uq[3]=,'0',)),ifthen(uq[3]='','hide','show')+' [expand]s')+']'; st:=st+' ['+getrefs(wuq('6'+ifthen(uq[6]=,'0',)),ifthen(uq[6]='','hide','show')+' ordinal links')+'] '; ads(st); end else begin ads(' '); st:='Total '+inttostr(sl)+' ordinals. ';  ads(st); end; ads(' '); end;

function ors(st:string;b:boolean=true):string; begin result:=convert(st,true); if g and b and (uq[6]='') then result:=getrefs(wuq('0'+st+'=1-=20=40=7'+duq[7]),result); end;

// create output list procedure createlist; var e,i,j:integer; st:string; begin cl:=0; if not g then begin st:='D:\Delphi\Ord4\1.htm'; assignfile(f,st); rewrite(f); end; starthtml; e:=0; i:=s[0].c; j:=-1; while i>-1 do  begin s[e].c:=j; j:=e; e:=i; i:=s[e].c;  end; i:=e; s[e].c:=j; if g and (uq[3]=) and (s[i].s<>) then begin st:=wuq('0'+s[i].s+'=1-=21'); st:=' ['+getrefs(st,'expand')+'] '; ads(st); end; while i>-1 do  begin st:=ors(s[i].s); if s[i].l>0 then st:=''+st+''; while s[i].l>cl do     begin st:=''+st; inc(cl); end; while s[i].l'+st; dec(cl); end; ads(st); e:=i; i:=s[i].c;  if g and (i>-1) and (leftstr(s[i].s,2)<>'[]') then begin if uq[3]='' then begin st:=wuq('0'+s[i].s+'=1'+s[e].s+'=21'); st:='<li style="list-style-type: none"> ['+getrefs(st,'expand')+'] </li></ul>'; end else st:=#13#10; ads(st); end else if g then begin st:=#13#10; ads(st); end; end; if g then begin ads(#13#10+' '+#13#10); st:=inttostr(sl)+' ordinal'+ifthen(sl=1,'','s')+' '; ads(st); st:=wuq('2'+inttostr(strtoint(uq[2])+1)); st:=#13#10+'['+getrefs(st,'expand all')+']'; if uq[2]<>'0' then st:=st+' ['+getrefs(wuq('20'),'collapse all')+']'; ads(st); end; endhtml; if not g then closefile(f); end;

// reset list of ordinals procedure resetlist; begin form1.Label1.Caption:='                                                    '; form1.Label1.Refresh; form1.Label2.Caption:='                                                    '; form1.Label2.Refresh; sl:=ifthen(uq[1]='-',1,2); setlength(s,sl); s[0].s:=uq[0];                        // ordinal s[0].c:=sl*2-3;                       // lesser element s[0].l:=0; if sl=2 then begin s[1].s:=uq[1]; s[1].c:=-1; s[1].l:=0; end; end;

// start procedure TForm1.Button1Click(Sender: TObject); begin cl:=1; g:=false; cn:=1; uq[0]:=bo; uq[1]:='-'; uq[9]:='*'; br:=0; resetlist; levelup(5); createlist; end;

// client request procedure TForm1.Serversocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket); var e,i:integer; cin,url:string; begin // cin - client request, cout - server response cin:=Socket.ReceiveText; e:=pos(' ',cin)+1; url:=copy(cin,e,posex(' ',cin,e)-e); delete(url,1,1); e:=pos('Host: ',cin)+6; qhost:=copy(cin,e,posex(#13#10,cin,e)-e);

if url='favicon.ico' then Socket.SendText(fa) else begin g:=true; cl:=1; cn:=1; uq:=ruq(url,duq);

if uq[4]='' then begin resetlist; for e:=1 to strtoint(uq[2]) do        levelup(1); createlist; end else begin starthtml; if (uq[3]=) and (uq[0]<>) then begin st:=wuq('0'+uq[0]+'=1-=21=4'); st:='<li style="list-style-type: none"> ['+getrefs(st,'expand')+'] </li></ul>'; ads(st); end; ads(+ors(uq[0],false)+); ads(#13#10#13#10#13#10#13#10+'Elements of fundamental sequence:'+#13#10#13#10); if uq[0]='' then i:=-1 else if leftstr(uq[0],2)='[]' then i:=0 else i:=strtoint(uq[7]); for e:=0 to i do        ads(inttostr(e)+'. '+ors(fs(uq[0],cf(e)))+#13#10#13#10); if uq[0]='' then ads((empty)+#13#10#13#10) else if leftstr(uq[0],2)<>'[]' then ads(' +getrefs(wuq('7'+inttostr(strtoint(uq[7])+1)),'(more) )+#13#10#13#10); endhtml; end;

Socket.SendText(cout); end; Socket.Close; form1.Label4.Caption:=''; form1.Label5.Caption:=''; form1.Label6.Caption:=''; form1.Label7.Caption:=''; form1.Label4.Refresh; form1.Label5.Refresh; form1.Label6.Refresh; form1.Label7.Refresh; end;

// open program procedure TForm1.Form1Create(Sender: TObject); var e:integer; begin bn:=true; bo:='L'; col:='M'; duq[0]:=bo;           // larger ordinal duq[1]:='-';          // lesser ordinal duq[2]:='0';          // number of expansion levels duq[3]:='';           // show / hide [expand]s duq[4]:='';           // mode (list / fs) duq[5]:='';           // without / with multipliers duq[6]:='';           // show / hide ordinal links duq[7]:='4';          // number of fs elements in fs mode duq[8]:='';           // with / without letters except phi, omega, Omega duq[9]:='1';          // human / computer format duq[10]:='';          // without / with subscripts of phi duq[11]:='';          // with / without omega, Omega

bro[0]:=''; brc[0]:=''; for e:=1 to 19 do  begin bro[e]:=bro[e-1]+'['; brc[e]:=brc[e-1]+']'; end;

fa:='#0#0#1#0#1#0#32#32#4#0#0#0#0#0$e8#2#0#0#22#0#0#0#40#0#0#0#32#0#0#0#64#0#0#0#1#0#4#0#0#0#0#0#0#2#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'; fa:=fa+'#0$80#0#0$80#0#0#0$80$80#0$80#0#0#0$80#0$80#0$80$80#0#0$80$80$80#0$c0$c0$c0#0#0#0$ff#0#0$ff#0#0#0$ff$ff#0$ff#0#0#0$ff#0$ff'; fa:=fa+'#0$ff$ff#0#0$ff$ff$ff#0$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff'; fa:=fa+'$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff'; fa:=fa+'$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff#0#0#0#0#0#0#0#0#0#0#0#0#0#0$ff$ff#0#0#0#0#0#0#0#0#0#0#0#0#0#0$ff$ff#0#0#0'; fa:=fa+'#0#0#0#0#0#0#0#0#0#0#0$ff$ff#0#0#0#0#0#0#0#0#0#0#0#0#0#0$ff$ff#0#0#0#0#0#0#0#0#0#0#0#0#0#0$ff$ff#0#0#0#0#0#0#0#0#0#0#0#0#0#0$ff$ff#0#0'; fa:=fa+'#0#0#0#0#0#0#0#0#0#0#0#0$ff$ff#0#0#0#0#0#0#0#0#0#0#0#0#0#0$ff$ff#0#0#0#0#0#0#0#0#0#0#0#0#0#0$ff$ff#0#0#0#0#0#0#0#0#0#0#0#0#0#0$ff$ff#0'; fa:=fa+'#0#0#0#0#0#0#0#0#0#0#0#0#0$ff$ff#0#0#0#0#0#0#0#0#0#0#0#0#0#0$ff$ff#0#0#0#0#0#0#0#0#0#0#0#0#0#0$ff$ff#0#0#0#0#0#0#0#0#0#0#0#0#0#0$ff$ff'; fa:=fa+'#0#0#0#0#0#0#0#0#0#0#0#0#0#0$ff$ff#0#0#0#0#0#0#0#0#0#0#0#0#0#0$ff$ff#0#0#0#0#0#0#0#0#0#0#0#0#0#0$ff$ff#0#0#0#0#0#0#0#0#0#0#0#0#0#0$ff$ff'; fa:=fa+'#0#0#0#0#0#0#0#0#0#0#0#0#0#0$ff$ff#0#0#0#0#0#0#0#0#0#0#0#0#0#0$ff$ff#0#0#0#0#0#0#0#0#0#0#0#0#0#0$ff$ff#0#0#0#0#0#0#0#0#0#0#0#0#0#0$ff$ff'; fa:=fa+'$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff'; fa:=fa+'$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff'; fa:=fa+'$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$fe#3$e0$7f$f8#1$80#31$f8#0'; fa:=fa+'$80#15$f0#0#0#7$e0$70#15#7$e0$f8#31#7$c0$f8#31$83$c0$fc#31$83$c1$fc#31$83$c1$fc#63$83$c1$fc#63$83$c1$fc#63$83$c1$fc'; fa:=fa+'#63$83$c1$fc#63$83$c0$ff$ff$83$e0$ff$ff$83$e0$ff$ff#7$e0$ff$ff#7$f0$7f$ff#7$f0$7f$fe#15$f8#63$fe#15$f8#63$fc#31$ff'; fa:=fa+'$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff$ff'; ServerSocket1.open; end;

// close program procedure TForm1.Form1Destroy(Sender: TObject); begin ServerSocket1.Close; end;

end.