uses crt,graph,dos;

var i,gd,gm,ex,ey,mx,my:integer;
    rat:integer; k,k1:char;  ki:array[1..9]of char;
    h,m,sa,ms,s1:word;page,cl:boolean{:=false};
   s:record
     x,y,z,a,b,c:real;
   end;

function r(g:real):real;
begin
r:=g*pi/180;
end;
function g(r:real):real;
begin
g:=r*180/pi;
end;

 procedure sppl(o:char;x,y:real;var ox,oy:real);
var u:real;
begin
case o of
'x':u:=r(s.a);
'y':u:=r(s.b);
'z':u:=r(s.c);end;
ox:=x*cos(u)-y*sin(u);
oy:=y*cos(u)+x*sin(u);
end;
  procedure transpose(x,y,z:real;var tx,ty,tz:real);
var cx,cy,cz:real;
begin
sppl('z',x,y,tx,ty);
sppl('y',z,tx,tz,tx);
sppl('x',ty,tz,ty,tz);
end;

Procedure LinP(c:char;x,y,z,l:integer);
var x1,x2,y1,y2,z1,z2:real;
begin
transpose(x,y,z,x1,y1,z1);
   case c of
'x','X':transpose(x+l,y,z,x2,y2,z2);
'y','Y':transpose(x,y+l,z,x2,y2,z2);
'z','Z':transpose(x,y,z+l,x2,y2,z2);
   end;
line(ex+round(x1),ey+round(y1),ex+round(x2),ey+round(y2));
end;

procedure SPlt;
begin
for i:=1 to 254 do SetRGBPalette(i,i div 5+random($ffffff)+$ff,random($aaaaaa),i div 2+random($ffffff)+$ffff);
end;

function hour:string;
var sh,sm,ss:string;
begin
str(h:0,sh);str(m:0,sm);str(sa:0,ss);
if length(sh)=1 then sh:='0'+sh;
if length(sm)=1 then sm:='0'+sm;
if length(ss)=1 then ss:='0'+ss;
hour:=sh+':'+sm+':'+ss;
end;

procedure ChangePage;
begin
  if Page then begin
    SetActivePage(0);
    SetVisualPage(1,true);
    Page:=false;
  end else begin
    SetActivePage(1);
    SetVisualPage(0,true);
    Page:=true;
  end;
  ClearPage;
   OutTextXY(mx div 2-textwidth(hour)div 2, 1, hour);
end;

begin
SetSVGAMode(640, 480, 8, LfbOrBanked);
  OutTextXY(270, 230, 'Please wait...');
  SPlt;
  SetRGBPalette(255, 63, 63, 63);
drawborder:=false;
mx:=getmaxx;my:=getmaxy;
ex:=mx div 2;ey:=my div 2;
rat:=56;s1:=0;
s.a:=0;s.b:=0; s.c:=90;
ki[1]:='1';ki[2]:='2';ki[3]:='3';ki[4]:='4';ki[5]:='5';
ki[6]:='6';ki[7]:='7';ki[8]:='8';ki[9]:='9';k1:='3';
randomize;
repeat
changepage;
delay(10);
linp('x',-3*rat,-rat,3*rat,2*rat);linp('x',-3*rat,rat,3*rat,2*rat);
linp('x',rat,-rat,3*rat,2*rat);linp('x',rat,rat,3*rat,2*rat);
linp('x',-rat,-3*rat,3*rat,2*rat);linp('x',-rat,3*rat,3*rat,2*rat);
linp('y',-rat,rat,3*rat,2*rat);linp('y',rat,rat,3*rat,2*rat);
linp('y',-3*rat,-rat,3*rat,2*rat);linp('y',3*rat,-rat,3*rat,2*rat);
linp('y',-rat,-3*rat,3*rat,2*rat);linp('y',rat,-3*rat,3*rat,2*rat);

linp('x',-3*rat,-rat,-3*rat,2*rat);linp('x',-3*rat,rat,-3*rat,2*rat);
linp('x',rat,-rat,-3*rat,2*rat);linp('x',rat,rat,-3*rat,2*rat);
linp('x',-rat,-3*rat,-3*rat,2*rat);linp('x',-rat,3*rat,-3*rat,2*rat);
linp('y',-rat,rat,-3*rat,2*rat);linp('y',rat,rat,-3*rat,2*rat);
linp('y',-3*rat,-rat,-3*rat,2*rat);linp('y',3*rat,-rat,-3*rat,2*rat);
linp('y',-rat,-3*rat,-3*rat,2*rat);linp('y',rat,-3*rat,-3*rat,2*rat);

linp('z',3*rat,-rat,-3*rat,2*rat);linp('z',3*rat,rat,-3*rat,2*rat);
linp('z',3*rat,-rat,rat,2*rat);linp('z',3*rat,rat,rat,2*rat);
linp('z',3*rat,-3*rat,-rat,2*rat);linp('z',3*rat,3*rat,-rat,2*rat);
linp('y',3*rat,rat,-rat,2*rat);linp('y',3*rat,rat,rat,2*rat);
linp('y',3*rat,-3*rat,-rat,2*rat);linp('y',3*rat,-3*rat,rat,2*rat);

linp('z',-3*rat,-rat,-3*rat,2*rat);linp('z',-3*rat,rat,-3*rat,2*rat);
linp('z',-3*rat,-rat,rat,2*rat);linp('z',-3*rat,rat,rat,2*rat);
linp('z',-3*rat,-3*rat,-rat,2*rat);linp('z',-3*rat,3*rat,-rat,2*rat);
linp('y',-3*rat,rat,-rat,2*rat);linp('y',-3*rat,rat,rat,2*rat);
linp('y',-3*rat,-3*rat,-rat,2*rat);linp('y',-3*rat,-3*rat,rat,2*rat);

linp('x',-3*rat,3*rat,-rat,2*rat);linp('x',-3*rat,3*rat,rat,2*rat);
linp('x',rat,3*rat,-rat,2*rat);linp('x',rat,3*rat,rat,2*rat);
linp('z',-rat,3*rat,rat,2*rat);linp('z',rat,3*rat,rat,2*rat);
linp('z',-rat,3*rat,-3*rat,2*rat);linp('z',rat,3*rat,-3*rat,2*rat);

linp('x',-3*rat,-3*rat,-rat,2*rat);linp('x',-3*rat,-3*rat,rat,2*rat);
linp('x',rat,-3*rat,-rat,2*rat);linp('x',rat,-3*rat,rat,2*rat);
linp('z',-rat,-3*rat,rat,2*rat);linp('z',rat,-3*rat,rat,2*rat);
linp('z',-rat,-3*rat,-3*rat,2*rat);linp('z',rat,-3*rat,-3*rat,2*rat);

linp('x',rat,rat,rat,2*rat);linp('x',-rat,rat,rat,-2*rat);
linp('x',rat,-rat,rat,2*rat);linp('x',-rat,-rat,rat,-2*rat);
linp('x',rat,rat,-rat,2*rat);linp('x',-rat,rat,-rat,-2*rat);
linp('x',rat,-rat,-rat,2*rat);linp('x',-rat,-rat,-rat,-2*rat);

linp('y',rat,rat,rat,2*rat);linp('y',rat,-rat,rat,-2*rat);
linp('y',-rat,rat,rat,2*rat);linp('y',-rat,-rat,rat,-2*rat);
linp('y',rat,rat,-rat,2*rat);linp('y',rat,-rat,-rat,-2*rat);
linp('y',-rat,rat,-rat,2*rat);linp('y',-rat,-rat,-rat,-2*rat);

linp('z',rat,rat,rat,2*rat);linp('z',rat,rat,-rat,-2*rat);
linp('z',-rat,rat,rat,2*rat);linp('z',-rat,rat,-rat,-2*rat);
linp('z',rat,-rat,rat,2*rat);linp('z',rat,-rat,-rat,-2*rat);
linp('z',-rat,-rat,rat,2*rat);linp('z',-rat,-rat,-rat,-2*rat);
putpixel(ex,ey,6);
gettime(h,m,sa,ms);
if (sa=s1+5)or(sa>s1+5) then begin k1:=ki[random(9)+1];s1:=sa;SPlt;end;
if sa=0 then s1:=sa;
if cl then SPlt;
case k1 of
'8':s.b:=s.b+1;'2':s.b:=s.b-1;
'4':s.a:=s.a+1;'6':s.a:=s.a-1;
'7':begin s.b:=s.b+1;s.a:=s.a+1;end;
'9':begin s.b:=s.b+1;s.a:=s.a-1;end;
'3':begin s.b:=s.b-1;s.a:=s.a-1;end;
'1':begin s.b:=s.b-1;s.a:=s.a+1;end;
'5':begin k1:=ki[random(9)+1];cl:=not cl;end;
end;
s.c:=s.c+1;
if s.a>=360 then s.a:=s.a-360;
if s.b>=360 then s.b:=s.b-360;
if s.c>=360 then s.c:=s.c-360;
if keypressed then  begin
k:=readkey;
case k of
'+':rat:=rat+1;'-':rat:=rat-1;#27:halt(1);
#72:ey:=ey-1;#75:ex:=ex-1;#77:ex:=ex+1;#80:ey:=ey+1;
'5':SPlt;
's':readln;
'1'..'9':k1:=k;
end;end;
until   k=#27;
closegraph;
end.