Path: utzoo!mnetor!uunet!seismo!sundc!pitstop!sun!decwrl!labrea!agate!ucbvax!CORY.BERKELEY.EDU!dillon From: dillon@CORY.BERKELEY.EDU (Matt Dillon) Newsgroups: comp.sys.amiga Subject: Practical task switch and software interrupt switching speed Message-ID: <8803260858.AA24628@cory.Berkeley.EDU> Date: 26 Mar 88 08:58:30 GMT Sender: daemon@ucbvax.BERKELEY.EDU Lines: 529 Here are some timing tests on the relative speed of message passing and software interrupt overhead. The code is included. (It's too small to bother the moderators). -Matt #! /bin/sh # This is a shell archive, meaning: # 1. Remove everything above the #! /bin/sh line. # 2. Save the resulting text in a file. # 3. Execute the file with /bin/sh (not csh) to create: # README # softint.c # softint.uue # taskswitch.c # taskswitch.uue # This archive created: Sat Mar 26 00:56:19 1988 export PATH; PATH=/bin:/usr/bin:$PATH echo shar: "extracting 'README'" '(1455 characters)' if test -f 'README' then echo shar: "will not over-write existing file 'README'" else cat << \!Funky!Stuff! > 'README' This is too small to post to the moderators. It should interest those of you who are interested in practical message passing speeds between two processes and practical software interrupt handler speeds. TEST 1: Given two tasks running at priority 0 (the priority doesn't really effect the results) with no other applications running, how fast can these two tasks bandy a message back and forth? Each cycle is defined by: A-(msg)->B, B-(msg)->A results: 1000 cycles / second TEST 2: Given a task running at priority 1 (again, the priority could just as well be 0), with no other applications running, how fast can this task bandy a message to a software interrupt handler (e.g. the port type is SOFTINT and the handler replies the message): Each cycle is defined by: A-(msg)->SoftHndlr, SoftHndlr-(msg)->A results: 1736 cycles / second TEST Conditions: The test programs are written in C. They use standard calls for everything. NOTE: The software interrupt handler is also written in C, and thus has a bit more overhead than one would normally associate with a software interrupt. However, the task-switch tester has no more overhead than equivalent assembly. All code is placed in public domain. The numbers indicated are on a standard A1000 with expansion memory (which doesn't really matter all that much), with no other applications running during the test. The code was compiled under Aztec C. -Matt !Funky!Stuff! fi # end of overwriting check echo shar: "extracting 'softint.c'" '(2220 characters)' if test -f 'softint.c' then echo shar: "will not over-write existing file 'softint.c'" else cat << \!Funky!Stuff! > 'softint.c' /* * softint [#iterations] * * Matthew Dillon * * 1000 switches/sec. (taskswitch) * 1736 softints/sec. (softint) */ typedef struct MsgPort PORT; typedef struct Task TASK; typedef struct Message MSG; typedef struct Interrupt INTR; extern TASK *CreateTask(); extern TASK *FindTask(); extern PORT *CreatePort(); extern PORT *CreateSoftPort(); extern MSG *GetMsg(); extern void *AllocMem(); extern void subtask(); extern void softhandler(); int Enable_Abort; int Iterations; PORT *Port; TASK *Task; MSG Msg; main(ac,av) char *av[]; { TASK *task; MSG *msg; if (ac == 1) { puts("softint #iterations"); exit(1); } Iterations = atoi(av[1]); Task = FindTask(NULL); Enable_Abort = 0; Port = CreateSoftPort(softhandler); puts("go"); if (task = CreateTask("switchrate.slave", 1, subtask, 2048)) Wait(SIGBREAKF_CTRL_D); puts("stop"); DeleteSoftPort(Port); puts("done"); } PORT * CreateSoftPort(handler) void (*handler)(); { register PORT *port = AllocMem(sizeof(PORT), MEMF_PUBLIC|MEMF_CLEAR); register INTR *intr = AllocMem(sizeof(INTR), MEMF_PUBLIC|MEMF_CLEAR); intr->is_Node.ln_Pri = 0; intr->is_Node.ln_Type = NT_INTERRUPT; intr->is_Data = NULL; intr->is_Code = handler; port->mp_Flags = PA_SOFTINT; port->mp_SigTask = (TASK *)intr; port->mp_Node.ln_Type = NT_MSGPORT; NewList(&port->mp_MsgList); return(port); } DeleteSoftPort(port) PORT *port; { FreeMem(port->mp_SigTask, sizeof(INTR)); FreeMem(port, sizeof(PORT)); } /* * Software interrupt handler. Called with * D0/D1/A0/A1/A5/A6 scratch as far as we are concerned. */ void softhandler() { MSG *msg; #asm movem.l D2/D3,-(sp) #endasm geta4(); if (msg = GetMsg(Port)) { if (!--Iterations) msg->mn_Length = 1; ReplyMsg(msg); } #asm movem.l (sp)+,D2/D3 #endasm } void subtask() { geta4(); Msg.mn_ReplyPort = CreatePort(NULL,0); Msg.mn_Length = 0; while (Msg.mn_Length == 0) { PutMsg(Port, &Msg); WaitPort(Msg.mn_ReplyPort); GetMsg(Msg.mn_ReplyPort); } DeletePort(Msg.mn_ReplyPort); Forbid(); Signal(Task, SIGBREAKF_CTRL_D); RemTask(NULL); /* No Permit */ } !Funky!Stuff! fi # end of overwriting check echo shar: "extracting 'softint.uue'" '(6886 characters)' if test -f 'softint.uue' then echo shar: "will not over-write existing file 'softint.uue'" else cat << \!Funky!Stuff! > 'softint.uue' begin 644 softint M```#\P`````````#``````````(```10````D@````$```/I```$4$[Z`G1. M5?_X#*T````!``AF%$AZ`)9.N@8L6$](>``!3KH,,%A/(&T`#"\H``1.N@'B M6$\I0((F0J=.NA``6$\I0((N0JR"(DAZ`1Y.N@".6$\I0((J2'H`9DZZ!>A8 M3TAX"`!(>@%`2'@``4AZ`%-.N@[H3^\`$"M`__QG"DAX(`!.NA!Z6$](>@!( M3KH%MEA/+RR"*DZZ`*A83TAZ`#E.N@6B6$].74YU`!Z M``P2`"!F!%**8/8,$@`M9@12BGH!#!(`,&TF#!(`.6X@($I2BA`02(!(P"($ MXX'0@20$YX+0@B@`F+P````P8-1*A6<&(`1$@&`"(`1,WP0P3EU.=6%P0^R! MWD7L@=ZUR68.,CP`&FL(=``BPE')__PI3X'B+'@`!"E.@>9(YX"`""X`!`$I M9Q!+^@`(3J[_XF`&0J?S7TYS0_H`($ZN_F@I0('J9@PN/``#@`=.KO^48`1. MN@`:4$].=61OYF%$*G2'D``0``3KH+&E!/+FR!XDYU(&R![D)H``0@ M;('N,7P``0`0(FR![C-\``$`"B!L@>(@+('BD*@`!%"`*4"!\B!L@?(@O$U! M3EA"ITZZ#-Y83R1`2JH`K&XA0``&9Q9(>`/M2'H`+$ZZ"@Y03R!L@>XA0``, M+RR!^B\L@?Y.NOOJ4$]"ITZZ"#!83R1?3EU.=2H`3E4``$CG##`D;0`0(&T` M""`H`*SE@"@`($0@*``0Y8`F0!`32(!(P-"M``Q4@"E`@@)"IR\L@@).N@KD M4$\I0((&9@A,WPPP3EU.=1`32(!(P"\`($M2B"\(+RR"!DZZ`5I/[P`,2'H! M4!`32(!(P-"L@@8O`$ZZ`8Y03R\M``PO"B\L@@9.N@%:3^\`#$*L@?XF;((& M)$L0$TB`2,`J`+"\````(&<@NKP````)9QBZO`````QG$+J\````#6<(NKP` M```*9@12BV#,#!,`(&T``(P,$P`B9C)2BR!+4HL0$$B`2,`J`&<@($I2BA"% MNKP````B9A`,$P`B9@12BV`&0BK__V`"8-)@1"!+4HL0$$B`2,`J`&@`F;((&8!H@!>6`(&R!^B&+"``O"TZZ`7!83U*`U\!2A;JL M@?YMX"`%Y8`@;('Z0K`(`&``_HX@`$SO`P``!"`((B\`#&`"$-E7R?_\9P92 M06`"0AA1R?_\3G4P/'__8`0P+P`.(&\`!$H89OQ32")O``A30!#95\C__&<" M0A`@+P`$3G4@;P`$(`@B;P`($-EF_$YU3E4``"\*)&T`"$H29R0@2E**$!!( M@$C`+P!.N@#H6$^PO/____]F"'#_)%].74YU8-A(>``*3KH`S%A/8.Q.50`` M2.<.,"1M``A"ITAZ`(Y.N@H$4$\I0((R9@A,WPQP3EU.=2!M``PB:``D+RD` M!$ZZ"GY83R@`9U)(>@!M($0O*``V3KH*4%!/)D!*@&@`X3KH'$E!/)4``H"\$3KH* M'%A/+RR",DZZ!SA83T*L@C)@@&EC;VXN;&EB0!724Y$3U<`*@`@;P`$ M(`A*&&;\D<`@"%.`3G5.50``2&R`&"\M``A.N@`(4$].74YU3E4``"\$*"T` M""\M``PO!$ZZ`#103[B\````"F8F(&T`#!`H``Q(@$C`"```!V<42'C__R\M M``Q.N@#^4$\H'TY=3G5@^$Y5```O"B1M``P@4K'J``1E&B`M``C`O````/\O M`"\*3KH`T%!/)%].74YU(%)2DA`M``L0@$B`2,#`O````/]@Y$Y5```O"D'L M@`(D2"!*U?P````6+PAA$%A/0>R!NK7(9>HD7TY=3G5.50``2.<(("1M``AX M`"`*9@IP_TS?!!!.74YU2BH`#&=4""H``@`,9PQ(>/__+PIA5E!/*``0*@`- M2(!(P"\`3KH%"%A/B(`(*@`!``QG"B\J``A.N@(\6$\(*@`%``QG%"\J`!). MN@+86$\O*@`23KH"(%A/0I)"J@`$0JH`"$(J``P@!&",3E7__DCG""`D;0`( M0?K_0BE(@@H(*@`$``QG"G#_3-\$$$Y=3G4(*@`"``QG,B@2F*H`""\$+RH` M"!`J``U(@$C`+P!.N@*63^\`#+"$9Q`(Z@`$``Q"DD*J``1P_V"^#*W_____ M``QF$`BJ``(`#$*20JH`!'``8*1*J@`(9@@O"DZZ`*183PQJ``$`$&8P&VT` M#___2'@``4AM__\0*@`-2(!(P"\`3KH",D_O``RPO`````%FF"`M``Q@`/]@ M)*H`"#`J`!!(P-"J``@E0``$".H``@`,(%)2DA`M``\0@$B`2,#`O````/]@ M`/\P3E4``"\*0>R``B1(2BH`#&<8U?P````60>R!NK7(90AP`"1?3EU.=6#B M0I)"J@`$0JH`""`*8.I.5?_\+PHD;0`(2'@$`$ZZ`,)83RM`__QF\``$` M$"`*T+P````.)4``""1?3EU.=35\!```$`CJ``$`#"5M__P`"!`J``U(@$C` M+P!.N@#>6$]*@&<&`"H`@``,8,Q.50``2.<`,"1L@=Y@%"92("H`!%"`+P`O M"DZZ!B)03R1+(`IFZ$*L@=Y,WPP`3EU.=4Y5```O"D'Z_\8I2((.0J<@+0`( M4(`O`$ZZ!.)03R1`2H!F"'``)%].74YU)*R!WB5M``@`!"E*@=X@"E"`8.9. M50``+RT`"&&V6$].74YU3E4``$CG`#"7RR1L@=Y@#B!M``A1B+'*9Q(F2B12 M(`IF[G#_3-\,`$Y=3G4@"V<$)I)@!"E2@=X@*@`$4(`O`"\*3KH%>%!/<`!@ MV$Y5```O"G(&("T`"$ZZ`K0D0-7L@>Y*K0`(;1(P+(&Z2,`B+0`(LH!L!$J2 M9A`I?`````*"$G#_)%].74YU<@8@+0`(3KH"?"!L@>XO,`@`3KH"R%A/2H!G M!'`!8`)P`?E4``"\M``A.N@*26$]*@&8.3KH"G"E`@A)P_TY=3G5P`&#X M3E4``$CG#"`H+0`(3KH`=G(&(`1.N@(F)$#5[('N2H1M#C`L@;I(P+B`;`1* MDF82*7P````"@A)P_TS?!#!.74YU,"H`!,!\``-F#"E\````!8(2@`>3KH!["\`3KH![D_O``Q(>``!3KH`#%A/3EU.=5Y#"@!. M50``2JR""F<&(&R""DZ0+RT`"$ZZ``A83TY=3G5.5?_\+P0K;0`(__Q*K('N M9RQX`&`*+P1.N@#.6$]2A#`L@;I(P+B`;>PP+(&ZP?P`!B\`+RR![DZZ`[)0 M3TJL@@YG!B!L@@Y.D$JL@A9G"B\L@A9.N@&,6$]*K((:9PHO+((:3KH!?%A/ M2JR"'F<*+RR"'DZZ`6Q83RQX``0(+@`$`2EG%"\-2_H`"DZN_^(J7V`&0J?S M7TYS2JR!]F8J2JR"!FY*A&T.,"R!NDC`N(!L!$J29A(I?`````*"$G#_ M3-\$<$Y=3G4P*@`$P'R``&8(+Q).N@`N6$]"DG``8.!(YW``-`'$P"8!2$/& MP$A#0D/4@TA`P,%(0$)`T(),WP`.3G4B+P`$+&R!ZD[N_]PB+P`$+&R!ZD[N M_X(B+P`$+&R!ZD[N_[@L;('J3N[_RBQL@>I.[O]\(B\`!"QL@>I.[O\H3.\` M!@`$+&R!ZD[N_^(L;('J3N[_Q$SO``X`!"QL@>I.[O_02.9.KO^43-\@@$YU3OH``B)O``0L;('F3N[^8DY5``!(YP@@2'C__TZZ`-!8 M3R@`L+S_____9@IP`$S?!!!.74YU2'D``0`!2'@`(DZZ`+A03R1`2H!F#"\$ M3KH!SEA/<`!@UB5M``@`"A5M``\`"15\``0`"$(J``X51``/0J=.N@%X6$\E M0``02JT`"&<*+PI.N@!:6$]@"DAJ`!1.N@&F6$\@"F"23E4``"\*)&T`"$JJ M``IG""\*3KH!NEA/%7P`_P`()7S_____`!1P`!`J``\O`$ZZ`5)83TAX`"(O M"DZZ`3)03R1?3EU.=2)O``0L;('F3N[^GB`O``0L;('F3N[^MD[Z``),[P`# M``0L;('F3N[_.DY5_^!(YP`P("T`%%:`P+S____\*T``%$'M_^!#[(&\<`<@ MV5'(__PK;0`4__Q(;?_@3KH`HEA/)D!*@&8*<`!,WPP`3EU.=21K`!`E:P`8 M`#H@*@`ZT*T`%"5``#XE0``V%7P``0`(%6T`#P`))6T`"``*2&H`2DZZ`+18 M3R\+2&H`2DZZ`"I03T*G+RT`$"\*3KH`*D_O``P@"F"B3E4``"\M``A.N@#" M6$].74YU3.\#```$+&R!YD[N_Q!(YP`P3.\.```,+&R!YDZN_N9,WPP`3G4@ M;P`$+&R!YD[N_R).^@`"(F\`!"QL@>9.[O[:3OH``BQL@>9.[O]\3OH``B)O M``0@+P`(+&R!YD[N_RX@+P`$+&R!YD[N_K!.^@`"(&\`!"QL@>9.[OZ,(&\` M!""(6)!"J``$(4@`"$YU+&R!YB)O``0@+P`(3N[]V$SO`P``!"QL@>9.[OZ2 M(F\`!"QL@>9.[OZ8(F\`!"QL@>9.[O[@3OH``B)O``0L;('F3N[^ADSO``,` M!"QL@>9.[O[.(F\`!"`O``@L;('F3N[^O"`O``0L;('F3N[^PD[Z``(@;P`$ M+&R!YD[N_H!,[P,```0L;((R3N[_H"!O``0L;((R3N[_IB!O``0L;((R3N[_ ML@```^P````!`````0```NH````````#\@```^H```!W```````````````` M`0`````!``````````````````````$!`````0`````````````````````! M`@````$````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M````````````````````````````````%`````````````````````(``0`! >````7``!``````````````/R```#ZP````$```/R ` end !Funky!Stuff! fi # end of overwriting check echo shar: "extracting 'taskswitch.c'" '(1265 characters)' if test -f 'taskswitch.c' then echo shar: "will not over-write existing file 'taskswitch.c'" else cat << \!Funky!Stuff! > 'taskswitch.c' /* * taskswitch [#iterations] * * Matthew Dillon * * 1000 switches/sec. (taskswitch) rough figures * 1736 softints/sec. (softint) */ typedef struct MsgPort PORT; typedef struct Task TASK; typedef struct Message MSG; extern TASK *CreateTask(); extern PORT *CreatePort(); extern MSG *GetMsg(); extern void subtask(); int Enable_Abort; PORT *Port; MSG Msg; main(ac,av) char *av[]; { int i, n; TASK *task; MSG *msg; if (ac == 1) { puts("taskswitch #iterations"); exit(1); } n = atoi(av[1]); Enable_Abort = 0; if (Port = CreatePort(NULL,0)) { if (task = CreateTask("taskswitch.slave", 0, subtask, 2048)) { puts("go"); for (i = 0; i < n; ++i) { WaitPort(Port); ReplyMsg(GetMsg(Port)); } puts("stop"); WaitPort(Port); msg = GetMsg(Port); msg->mn_Length = 1; ReplyMsg(msg); WaitPort(Port); } DeletePort(Port); } puts("done"); } void subtask() { geta4(); Msg.mn_ReplyPort = CreatePort(NULL,0); Msg.mn_Length = 0; while (Msg.mn_Length == 0) { PutMsg(Port, &Msg); WaitPort(Msg.mn_ReplyPort); GetMsg(Msg.mn_ReplyPort); } DeletePort(Msg.mn_ReplyPort); Forbid(); PutMsg(Port, &Msg); RemTask(NULL); /* No Permit */ } !Funky!Stuff! fi # end of overwriting check echo shar: "extracting 'taskswitch.uue'" '(6691 characters)' if test -f 'taskswitch.uue' then echo shar: "will not over-write existing file 'taskswitch.uue'" else cat << \!Funky!Stuff! > 'taskswitch.uue' begin 644 taskswitch M```#\P`````````#``````````(```0L````D`````$```/I```$+$[Z`@!. M5?_P#*T````!``AF%$AZ`.A.N@6X6$](>``!3KH+O%A/(&T`#"\H``1.N@%N M6$\K0/_X0JR"(D*G0J=.N@VH4$\I0((F9P``HDAX"`!(>@#>0J=(>@"Y3KH. MB$_O`!`K0/_T9WI(>@"X3KH%8%A/0JW__&`@+RR")DZZ#_I83R\L@B9.N@]Z M6$\O`$ZZ#\I83U*M__P@+?_\L*W_^&W62'H`@4ZZ!2983R\L@B9.N@_&6$\O M+((F3KH/1EA/*T#_\"!M__`Q?``!`!(O+?_P3KH/AEA/+RR")DZZ#YI83R\L M@B9.N@V,6$](>@`\3KH$W%A/3EU.=71A@`,$@`@9@12BF#V#!(`+68$4HIZ`0P2`#!M M)@P2`#EN("!*4HH0$$B`2,`B!..!T($D!.>"T((H`)B\````,*H5G!B`$ M1(!@`B`$3-\$,$Y=3G5A<$/L@=Y%[('>M`@`@N``0!*6<02_H`"$ZN_^)@!D*G\U].0!)^0``?_Y. M=4Y5```O"DAY``$``#`L@;K!_``&+P!.N@Q$4$\I0('N9A1"ITAY``$``$ZZ M"QI03RYL@>).=2!L@>Y":``$(&R![C%\``$`$")L@>XS?``!``H@;('B("R! MXI"H``10@"E`@?(@;('R(+Q-04Y80J=.N@S>6$\D0$JJ`*QG,"\M``PO+0`( M+PI.N@"T3^\`#"E\`````8(B(&R![@!H@```!"!L@>X`:(````I@1$AJ`%Q. MN@U.6$](:@!<3KH,SEA/*4"!]B!L@?9*J``D9Q`@;('V(F@`)"\13KH*$EA/ M+RR!]B\*3KH"JE!/*6R!]H'Z3KH*$B!L@>X@@$ZZ"C(@;('N(4``!F<62'@# M[4AZ`"Q.N@H.4$\@;('N(4``#"\L@?HO+('^3KK\7E!/0J=.N@@P6$\D7TY= M3G4J`$Y5``!(YPPP)&T`$"!M``@@*`"LY8`H`"!$("@`$.6`)D`0$TB`2,#0 MK0`,5(`I0(("0J`@!>6`(&R!^D*P"`!@`/Z.(`!,[P,` M``0@""(O``Q@`A#95\G__&<&4D%@`D(84@".3KH*!%!/*4""*F8( M3-\,<$Y=3G4@;0`,(F@`)"\I``1.N@IB6$\H`&=22'H`;2!$+R@`-DZZ"C10 M3R9`2H!G-$AX`^TO"TZZ!S903RP`9R0@!N6`*@`@125H``@`I"5&`)Q(>`/M M2'H`.$ZZ!Q)03R5``*`O!$ZZ"@!83R\L@BI.N@``@"F8*8!0F4B`J``10@"\`+PI.N@8B4$\D2R`*9NA"K('>3-\,`$Y=3G5. M50``+PI!^O_&*4B"#D*G("T`"%"`+P!.N@3B4$\D0$J`9@AP`"1?3EU.=22L M@=XE;0`(``0I2H'>(`I0@&#F3E4``"\M``AAMEA/3EU.=4Y5``!(YP`PE\LD M;('>8`X@;0`(48BQRF<2)DHD4B`*9NYP_TS?#`!.74YU(`MG!":28`0I4H'> M("H`!%"`+P`O"DZZ!7A03W``8-A.50``+PIR!B`M``A.N@*T)$#5[('N2JT` M"&T2,"R!NDC`(BT`"+*`;`1*DF80*7P````"@A)P_R1?3EU.=7(&("T`"$ZZ M`GP@;('N+S`(`$ZZ`LA83TJ`9P1P`6`"<`!@UDY5```O+0`(3KH"DEA/2H!F M#DZZ`IPI0((2R![DJ$;0XP+(&Z2,"X@&P$2I)F$BE\`````H(2!``0J=.N@3>4$\K0/_\"```#&<22JR" M(F8(("W__$Y=3G5.N@`&<`!@]$Y5``!(>``$2'H`'DZZ`>PO`$ZZ`>Y/[P`, M2'@``4ZZ``Q83TY=3G5>0PH`3E4``$JL@@IG!B!L@@I.D"\M``A.N@`(6$]. M74YU3E7__"\$*VT`"/_\2JR![F`!@"B\$3KH`SEA/4H0P+(&Z2,"X@&WL M,"R!NL'\``8O`"\L@>Y.N@.R4$]*K((.9P8@;((.3I!*K((69PHO+((63KH! MC%A/2JR"&F<*+RR"&DZZ`7Q83TJL@AYG"B\L@AY.N@%L6$\L>``$""X`!`$I M9Q0O#4OZ``I.KO_B*E]@!D*G\U].).=2@?3EU.=4Y5``!(YPX@*"T`"'(&(`1.N@!$)$#5[('N2H1M#C`L@;I( MP+B`;`1*DF82*7P````"@A)P_TS?!'!.74YU,"H`!,!\@`!F""\23KH`+EA/ M0I)P`&#@2.=P`#0!Q,`F`4A#QL!(0T)#U(-(0,#!2$!"0-""3-\`#DYU(B\` M!"QL@>I.[O_<(B\`!"QL@>I.[O^"(B\`!"QL@>I.[O^X+&R!ZD[N_\HL;('J M3N[_?"(O``0L;('J3N[_*$SO``8`!"QL@>I.[O_B+&R!ZD[N_\1,[P`.``0L M;('J3N[_T$CG`01,[R"```PL;('F3J[_E$S?((!.=4[Z``(B;P`$+&R!YD[N M_F).50``2.<(($AX__].N@#06$\H`+"\_____V8*<`!,WP003EU.=4AY``$` M`4AX`").N@"X4$\D0$J`9@PO!$ZZ`%A/)4``$$JM``AG"B\*3KH`6EA/8`I(:@`43KH! MIEA/(`I@DDY5```O"B1M``A*J@`*9P@O"DZZ`;I83Q5\`/\`""5\_____P`4 M<``0*@`/+P!.N@%26$](>``B+PI.N@$R4$\D7TY=3G4B;P`$+&R!YD[N_IX@ M+P`$+&R!YD[N_K9.^@`"3.\``P`$+&R!YD[N_SI.5?_@2.<`,"`M`!16@,"\ M_____"M``!1![?_@0^R!O'`'(-E1R/_\*VT`%/_\2&W_X$ZZ`*)83R9`2H!F M"G``3-\,`$Y=3G4D:P`0)6L`&``Z("H`.M"M`!0E0``^)4``-A5\``$`"!5M M``\`"25M``@`"DAJ`$I.N@"T6$\O"TAJ`$I.N@`J4$]"IR\M`!`O"DZZ`"I/ M[P`,(`I@HDY5```O+0`(3KH`PEA/3EU.=4SO`P``!"QL@>9.[O\02.<`,$SO M#@``#"QL@>9.KO[F3-\,`$YU(&\`!"QL@>9.[O\B3OH``B)O``0L;('F3N[^ MVD[Z``(L;('F3N[_?$[Z``(B;P`$("\`""QL@>9.[O\N("\`!"QL@>9.[OZP M3OH``B!O``0L;('F3N[^C"!O``0@B%B00J@`!"%(``A.=2QL@>8B;P`$("\` M"$[N_=A,[P,```0L;('F3N[^DB)O``0L;('F3N[^F")O``0L;('F3N[^X$[Z M``(B;P`$+&R!YD[N_H9,[P`#``0L;('F3N[^SD[Z``(@;P`$+&R!YD[N_H!, M[P,```0L;((J3N[_H"!O``0L;((J3N[_IB!O``0L;((J3N[_L@```^P````! M`````0```G8````````#\@```^H```!W`````````````````0`````!```` M``````````````````$!`````0`````````````````````!`@````$````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M````````````````````%`````````````````````(``0`!````7``!```` 5``````````/R```#ZP````$```/R ` end !Funky!Stuff! fi # end of overwriting check exit 0 # End of shell archive