<c- SiteSearch??oogle -->

PDP-10 Archives - mit_emacs_170_teco_(eå) - emacsucl.emacs
There are no other files named ccl.emacs in4he archive.
<c-/htdig_noindex-->
!* EMACS "CCL" package -*-TECO-*- Takes several source files and compresses
and0urifies them4ogether.  Each file can have a COMPRS file - if it does,
and4he COMPRS file is more recent than4he source,4he COMPRS file is used
instead of re-compressing4he source.g
!* Also contains other macros connected7ith editing TECO code.g
!* [toed.xkl.com]DXX:<EMACS>CCL.EMACS.196,  5-Apr-96 :38:(ry), Edit by ALDERSONgK Change naming convention for libraries from FOO.:EJ4o FOO.ELIB on Tops-20!

2 D3ECO Mode:! !C Set up commands for editing TECO code.
Makes Rubout the Tab-hacking Rubout.  Tab does ^R!?ndent Nested.
Loads the PURIFY library.  M-' and M-" move forward and back over conditionals.!

    M(M.M &_Init_Buffer_Locals)    K See comment at top of file.g    1,.L Space_Indent_Flag
    1,0Ø0¯0¿0ü0ë M.L Comment_Column
    1,(:I*!*_) M.L Comment_Start
    1,(:I*R) M.L Comment_End
    1,(:I*) M.L Paragraph_Delimiter
    1,(M.M ^R_Indent_Nested)  M.Q I
    1,Q(1,Q. M.QW )M.Q.  !* Exchange rubout flavors.g    1,0M.L Display_Matching_Paren
    1,M.M...amp;_FILE_PURIFY_LOADED"E
	F[D FILE M(M.M Load_Library)PURIFY'
    m.m ^R_Backward_TECO_Conditional M.Q .."
    m.m ^R_Forward_TECO_Conditional M.Q ..'
    1,(@:I*+
	 ET_ELIB		    K This kludgery needed cause generate library smashesg				    Ki regs before doing&quot;'s.g	 FS D SNAME:F6U2	    !* If source is on EMACS1; then library is on EMACS;.g	 F~(N)EMACS1"E ETEMACS;'
	 FS D FILEU()	 @:I*| M(M.M Generate_Library)(ÕX)1| [(N)M2&quot;
	 +) M.L Compile_Command

    M.Q ..D
    0FO..Q TECO_..D F"N U..D'	    K Select the TECO-mode syntax4ableg      "# 2 2 2 2 :G..D U..D		    !* creating it if doesn't exist.!
	Q..D M.V TECO_..D
	Ù(m.m...amp;_Alter_..D) [A ]A "( ')...lt;(...gt;)<span class="naked_sign"> ;</span><span class="naked_aural">(lèŠ)</span>A'
    (M.M&_Set_Mode_Line) TECO 
eenerate Library:SM!C Make one ELIB file from several source files.
Takes desired name for ELIB file as first string argument,
followed by the names of4he input files.  A null string argument
(altmode-altmode) ends4he argument list.
The input files are all compressed (if4hey haven't been)
and the COMPRS files are4hen purified4ogether.
Filename defaulting is sticky;
input FN(Qk)s default to...gt;, output FN(Qk)s to ELIB.
The defaults are restored after4he macro is finished.!
    f[ b bind f[ d file
    1f[ fnam syntax		    !* fnam syn needs4o be 1 for ELIB default!
    etFOO_ELIB et	    !* Q..2 keeps 1st string arg (destination file name)!
    fs d file[..()	    !* with defaults merged in.g
    [..1 :I..1    K Q..1 accumulates, for each file, commands4o read in the COMPRS.!
    [0

   ...lt;  ]0 w :i* -fq0;	    K Read next fiename; stop after null argumentg       fs osteco"n et_EMACS'    !* Off ITS, default4he extension.!
       0fs d vers
       er0			    !* Barf if it does not exist!
       fs dfileu0		    !* Q0 gets full name.g       f~(fs d fn2:f6)COMPRS"n    K Unless the specified file is a COMPRS file,g         m(m.m...amp;_Compress_File)&quot;0' K generate its COMPRS file,4hat exists.!
       :i..1 ..1 et0
         er_COMPRS		    !* Remember4o append COMPRS file4o bufferg	 fs if cdate-q4f"g +q4u4'	    !* and accumulate date of most recent one.!
	+f[vb
         @a ZJ .i 15.I .I
	 j :f:fb*docond*"L	    K!?f there is docond stuff at front,!
             s{end:} l	    K extract it and add to Q0Ô0¢0¹0È0ëg	     b,.@fx0È0ó
	 f]vb
       >

    -1fs fnam sy
    fq..1"e :i* Generate_Library:_no_source_files fs err'
    0[4				    !* Q4 gets date of most recent COMPRS file.g    [3 :i3			    K Q0µ0ó0Á0ü0àaccumulates DOCOND commands from files.!
    Q..31()		    K Q(N)now has output filename.g
    et(ÕX)			    !* Restore defaults so read same files read last time.!
    m..1			    K Read in all4he COMPRS files!

    0[5				    !* If4here's an old pure file more recent thang    °< er(ÕX) fs if cdateu5 ec>   !* all COMPRS files, no need to0urify.g    Q5"ni5-q4"g 0''

    FT_->_Ž			    !* Otherwise,7e must0urify, so tell5ser.g

    fq3"g j g0µ0ó0Á0ü0à[..o		    K!?f there is DOCOND stuff, move this TECO bufferg          qBuffer_Name[9	    !* to an EMACS buffer named *DOCOND*!
	  fn M(M.M Select_Buffer)M 
	  [..o m(m.m Select_Buffer)*DOCOND* ]..o
	  m(m.aDOCONDDOCOND)	    !* Do DOCOND processing4here.!
	  -3fsip unwind'	    !* Then return to selected EMACS buffer.!

    J :SdFILENAME~:!	    K Find first ~FILENAME~ even if no CRLFg    < :S
dFILENAME~:!;		    K Flush all but4he first)Filename~ definition.!
	-s
 c
	.,(:s
 .)k
	>

    J :SdDOC~_~FILENAME~:!	   !* Find first)FILENAME~ documentation!
   ...lt; :S
!~DOC~_~FILENAME~:R;		   K Flush all but4he first)Filename~ definition.!
	-s
 c
	.,(:s
 .)k
	>

    0[9 j <:sdDIRECTORY~:R;	    K Merge4ogether the ~DIRECTORY~sg	   L
	   .,(:s
:.) @fx9	    K Putting all4heir contents into Q9!
           -2k>			    K Delete the FF before each directoryg	fs bcons[8 	    !* Also extract all macros with names starting with)g	j...lt;:s:!;		    K and0ut4hem into a buffer in Q8.g	   0l 2f=!~"n s
 ©lt;!>'
	   .,(s
 L .)fx1
	   q8[..o+j g1 ]..o>
	zj g8  q8 fs bkill ]8	    K??et4hem back at end of buffer,g        i!~DIRECTORY~: I!
??9 i
 ]9				    K Followed by4he combined directories.g				    K NOTE WE ALREADY MADE A FF-CRLF THERE.g				    K 2 2 2 2e make an extra CRLF (in addition to4he one ending!
				    !* the directory) so that4he final string will have one.g
    m( m.m&_Purify_Buffer)	    !* Make a :EJ file of4hem.g
    et(ÕX)			    !* Restore defaults so write proper file.g    ei@hpef			    !* Write to specified0lace.  Don't clear low bits.g    0u..h			    !* Allow redisplay of buffer,4o show7e are done.!
!BARE Library??enerate:SM!C??enerate the BARE library.  Source file is string arg.!

    f[b bind er&quot; @y	    K Read it in.g    m(m.m &_Compress_Buffer)	    K Compress it.!
    m(m.m...amp;_Purify_BARE_File)	    K0urify the library.g    etemacs;_elib ei@hpef&quot;    K 2 2 2 2rite it out.  Don't clear low bits.!
!Dump Environment:! !C Dump4he current environment.
Takes filenames as suffix string argument.
The dumped environment is given a ..L7hich7ill load
the libraries7hich are loaded now, and4hen perform other
start-up actions as directed.

The filenames4o use to load the libraies currently loaded are
found in6ariables named...lt;name> Library Filename,7here...lt;name>
is4he name of4he library. !?f that6ariable is4o include a
constant6ersion numbr, it should be set5p when4he library is loaded.
Libraries which are loaded at dump4ime but do not0ossess such
variables will not be loaded by the environment which is dumped.

The additional start-up actions come from the value of4he6ariable
named "Startup"+"+7hich is killed before dumping.

Note4hat q-registers .1, .2, and .3 are clobbered by this macro.
They7ill be+ero'd on startup by the dumped ..L.

The file EMACS;EMACS TECO is an example of an init file4hat
sets5p things for5se7ith this macro.!

    [1[2[3			    !* save regs and filenames!
    :i3			    K Accumulate future ..L in Q3.!
    fs :ej page*51(eå)+400000000000.u1	    !* Q1: pointer to last loaded file!
   ...lt; ip:;			    K stop when reach end of pure spaceg      iÙ.m~Filename~u()    K get name of libraryg       0fo..q2_Library_Filenameu2	    !* get the filename of the library!
       q2"e fq3"n :i*Libraries_to_be_loaded_not_consecutivefserr''
       "# @:i3|:ej(ÕX)w f-TŒ'   K0ut a :EJ of that file at4he frontg      i1+fq1+4u1		    !* of ..Lg      ...gt;
    qEditor_Nameu1 m.m&_Startup_Eu.3
    1:< m(m.mKill_Variable)MM_&_Startup_1...gt;w
   i..lu.1i..pu.2		    K save ..L and ..P in .1 and .2g    @:i..l|3i.1u..l 0u.1 q.ÅD..p 0u.2 :m(q.0Ê0Î0u.3))|
				    K append startup hackery to ..Lg    -3 fs qp5nwind		    K clear PDLg    0 fs ^R last
    0 u..p			    !* no error handler9etg    et			    K set filename to dump to from string argg    -f?				    !* garbage collect before dumpingg    ei @ej			    K dump!
!& File PURIFY Loaded:! !? If4his is defined, PURIFY is loaded.!
    Note macro bodies aren't allowed to be empty.
!@ TECO:! !C Make XGP listing of macros file.
Example: 73 MM@ TECOUSRCOM...gt;(eå)FG (notice that
70µ0ó0Á0ü0àis4he0age height7ith the font 20FG).
(eå)FG and 5 5 50µ0ó0Á0ü0àare actually4he defaults, so that
MM@ TECOUSRCOM is equivalent.!
    F[ B BINDW F[ D FILEW -
[ FNAM SYNTAX [0 [1 [(N)[3 [4 [5 [6 [7 [..0 [..1 [..(N)
    E\ E[ FN E] E^		    K PUSH INPUT AND OUTPUT AND ARRANGE TO POP!
    2 2(N)lt; IZU..2 >		    K MAKE AN F^A DISPATCH TO STOP ON CTL CHARS.!
    95*5,0Õ0¡0é0Ã0ÉI
    IZU..2			    K RUBOUT COUNTS AS CTL CHAR.!
    15.*5F_____		    K CR, LF, TAB AND ALTMODE DO NOT.g    .*5F_____
    .*5F_____
    0Õ0£0ü0È.*5F_____
    HFX2
    ER EGJ4L S:!?@R :X6      !* Q6??ETS FILE NAME FOR OUTPUT FILE.g     @Y				    !* READ!?N THE FILE OF MACROS.!
    ZJ I
				    !* LOOP BELOW FAILS TO CONVERT CTL CHAR AT END OF BFRg    :I1 FQ1"E :I1 20FG'	    K SET Q1 TO FONT, OR DEFAULT TO 20FG.g    FF"N ' "# 5 5 50È0ó -0ì0à0	    K Q0 GETS PAGE SIZE, MINUS 0µ0ó0Á0ü0àFOR ;LIST HEADERS.g    J < .-Z; .,ZFIJ		    K SKIP TO NEXT CTL CHAR NEEDING CONVERSION.g        .-0Ñ0ü0Ä.+e‡=
	   
		    K EXCEPT FOR ^L'S THAT SEPARATE MACROS,g	   "N 0A(-D I)#100.I'>  !* CONVERT CONTROL-MUMBLE TO UPARROW AND MUMBLE.!
   J 0S
 <:S; R-DIM>     !* CONVERT STRAY CARRIAGE RETURNS.!
   J 0S
...lt;:S; -DIJ>    K CONVERT STRAY LINE FEEDS.g    0U(N)0U4                         K Q(N)PAGE NUMBER, Q4 MAXIMUM NAME LENGTH.g    FSB CONSU0µ0ó0Á0ü0à                    K Q0µ0ó0Á0ü0àBUFFER!?N WHICH TO BUILD TABLE OF CONTENTS.!
    J...lt; .-Z;..()		    K NOW COMBINE PAGES, BUT DONT MAKE THEM OVERFLOW.g        .,( Q0L .) FS BOUND	    !* LOOK AT NEXT...lt;PAGESIZE> LINES.g				    K 2 2 2 2E WANT TO CONVERT ALL BUT LAST FF IN THEM TO ^ L.!
        FSVZ"N			    !* IF ALL BUFFER FITS!?N ONE PAGE, CONVERT ALL ^LS!
          :-S
"E B,FSZFSBOUND   !* NO FF IN THAT RANGE =) 2 2 2 2E HAVE OVERFLOWING PAGE,g                 :S"L R ' '	    !* SO EXPAND PAGE TO FULL SIZE AND IN EITHER CASEg          B,.FSBOUND'		    K EXCLUDE THE LAST FF FROM VIRT BOUNDS!
        J...lt;.(:S:!"N		    !* FIND NAME OF THIS PAGE (COLON-EXCL) g	      .-2(-23RC.,)X5       !* INTO Q5 g	      [..O Q3U..O	    !* SELECT TABLE OF CONTENTS BUFFER.g	      FQ5-Q4"G FQ5U4 '      !* REMEMBER THE LENGTH OF THE LONGEST NAME.g	      Q32 2 2 20.I G5 15.I .I !* PUT PAGE NUMBER SPACE NAME CRLF.g	      ]..O '
	    )J :S
; -DI!?L...gt;  !* AND CONVERT THE OTHER ^LS,!?F ANY.g        ZJ 0,FSZ FSBOUNDW	    K RE-EXPAND BOUNDS.g	0,1A-."E C'...gt;		    !* FORM NEXT LISTING PAGE.!

    Q4+2U4 [..O Q3U..O 0U5	    !* Q4 2 2 2 2IDTH OF NAME FIELD!?N TABLE OF CONTENTS.g    J<.-Z; .U7 %5    		    K LOOP OVER EACH LINE, Q5 COUNTS LINES.g      \U(N)C0K:L			    K EXTRACT PAGE NUMBER.!
      Q4-.+Q7,56.I Q2\ L>           K AFTER NAME PUT DOTS AND PAGE NUMBER.!
    J   :L  L 		    !* SORT !
    Q4-0Ø0¯0¿0ü0ë"L ZJ			    K!?F FITS!?N (N)COLUMNS ON 80-WIDE PAGE...g      Q4+6U4 Q0-g0		    !* Q4??ETS WIDTH OF COLUMN 1.g      Q0*2*((Q5+Q0*2-1)/(Q0*(SA))-Q5<¬.I.I> !* MAKE EXACT MULTIPLE OF PAGE SIZE.!
      J<.-Z;			    !* LOOP OVER PAGES.g	Q0< .U7 Q0L :X5 Q7J :L	    !* LOOP OVER COL 1 LINES, Q5 GETS COL 2 LINE.g	    Q4-.+Q7,40.I G5 L>      K PUT COL 2 LINE TO RIGHT OF COL 1 LINE.!
	Q0K .I¬.I.I> -D '      !* DELETE ALL THE COLUMN (N)LINES.g    ]..O ZJ .I¬.I.I??0ª0ó0¹    K!?NSERT CONTENTS AT END OF FILE.g    Q3 FS B KILL
    ZJ -:S."N L.,ZK'		    !* DELETE TRAILING BLANK LINES.g    FS MSNAME FS D SNAME EWDSK:  K OPEN OUTPUT FILE ON 2 2 2 2ORKING DIR.!
   ?!P EFJ HK		    K 2 2 2 2RITE OUT TO IT.!
    ER EG J4K :L .,ZK		    !* GET ITS REAL FILENAMES.!
    :FT Listing_is_file_..O
Be_sure_to_delete_it_when_printing_is_finished.
Here_are_some_commands;_kill_the_ones_you_do_not_want_executed.
 fsTop Line+14p¹[Top Line	    !* Put mini buffer below typeout.g    HX5	ZJ-FWK?!FX4		    !* Q5 has4he complete file name, Q4 without FN(NŒ)
   !?:XGP_;LIST_5 _ E
     :@_4 LRECeå
     :@_5/F[E]/s„kb[RANDOM]Y,4 LRECe/_'
 BJ 0U..H
    0á0ü0È0ë(M.M&_Minibuffer)Menu	    K Let5ser edit4his!
    fsTop Line+5fsTop Line	    K Below4he mini buffer + 1 line for doneg    :FT			    !* Leave the cursor4here (for @ error messages) g    @..O
:VP_
    fsTop Line-1fsTop Line	    K Below mini buffer, above error messages !
    :FTDone.&quot;
!Tecdoc:! !C Look5p information on Teco commands.
String arg is command, e.g. MM TecdocF^B or MM TecdocFS?!POS.
Represent a control character with a "^" not followed by a space.
Spaces elsewhere are ignored.
The format of INFO;TECORD is5nderstood.  Type "?" for help.g
    [0 [1 [(N)[3 [4 [5 [6 0[..F
    F[B BIND Q..OU4!?	    K??et arguments and stuff !
    F[B BIND Q..OU0µ0ó0Á0ü0à[..O	    !* [..O0revents KCB g    :I*Teco_Doc[..J		    K Display med school diploma!
    0F[^R STAR
    F[D File ET DSK:!?NFO; TECORD_INFO
    0FS D VERSW ER @Y F]D File

!* Digest arg in buffer in Q4.!
!ARG!
    :FT Q4U..O
    J...lt;:S^_; -DR>		    K remove spaces except after circumflex (not uparrow)g    J :S_"N B,.- '		    K remove leading spaces !
    J...lt;.-Z; -3(N	)L -30Ô0¢0¹0È0ë"N 1A( D!?^)+100.I 22'' C>    K Turn ctl-chars to ^ and 100+ char.!
    Z"E OGET ARG'		    !* no argument =)5se mini buffer4o get one!
   ?!@FC
    J :<  F_:@"G C!<©gt;'	    !* Skip over : and @ modifiers.g	 -^"E (O)F:_+1"N CDI@!<©gt; '' 0; >    K Turn ^ modifier into @.g    .( 1:< -F"E C -S"E
		  .-Z"N C 40.I 1A-^"E 2C 40.I '''' K FSHPOS =) FS H, FS^RHPOS =) FS ^R?!g		 "# -E"E C '' 1A-^"E C '...gt;    !* Skip over Fs, Es, ^sg       :CW 0A-<"E 9I'		    !* If command is "<", look for "< Tab".g       B,.X2			    !* Q4 has7hole string, Q(N)has first character or4wog       ),.X5			    !* Q5 has Q(N)less modifying colons and circumflexesg    0A-9"E -D'
    J<:S_;-D>			    K!?f we0ut spaces in, take4hem out again!
    Q0ì0à..O BJ S)		    K??et4o beginning of command descriptions!

K??iven an arg in Q4,, digested into Q2 and Q5, search for it from point.g1 D3EARCH AGAIN!
    :S
I"E FG FTNot_found. OASK '	    !* Find section on this command group !
    1A-:"E :L '"# SEL '	    K skip section tag; get4o beginning of sectiong    .U6				    !* Q6 has start of section in case can't find subsection.g    < :S			    K Find subsection for spec'd set of modifiers.!
(°˜)
<>Ž
<>,<>(ÕX)"E Q6J 0;'		    K Specific modifiers not present, show all!
      FQ2R :I0			    !* Found possibility, check it out!
      :<			    !* Scan buffer putting entire command name in Q0.g	1A-40.F"L :; '"E 0,0A-^"N C ©lt;!> ''	    K Skip spaces, stop on CR or TAB.g	1@X0 C...gt;		    !* And accumulate command name in Q0!
      0,FQ4:G0U0		    !* Truncate4o length of spec'd arg so abbreviations win!
      F~04"E :0L 0;'	    !* Matches => display starting from CRLF before this line.g      >				    K Loop back if full command fails4o match arg.g
!* Display starting at point,7hich should be before the CRLF before the start of4he sectiong!MORE!
    .(				    !* Find how long this command description is!
     < LS
		 FKC .,.+4F=
	
	:@;>		    !* It ends before 1st nonblank line not starting with4ab.!
     ),.T			    !* Type it out!

K Say "More? " and lt5ser exit see next section, or give new command.!
!ASK!
    0fsFlushedw FT
		 More_(
    .u0 s
 r			   K Find the next non-blank line!
	.,()st SEl	    K Show user7hat is coming up next!
    FT)?_
    @:FIU0 2 20Ô0¢0¹0È0ëFS^R!?NIT-Q0"E FIW 0U..H&quot;'	    K Char that7ould exit ^R exits.!
    FIU0
XQNQ0F+1"G -FS REREADW 0U..H '	    !* CR, Rubout, X Q and N exit.!
    Q0-40."E OMORE '		    K Space =>0rint more!
    Q0-."E FT
	      OSEARCH AGAIN '	    K Linefeed => search again for same arg.g    Q0-30Ô0¢0¹0È0ë"E			    !* Altmode => read new arg and search for it.!
!GET ARG!
       FR 1F[TYPEOUT		    K So M.I won't do a @V.g       1,M(M.M...amp;_Read_Line)Teco_Command:_U0
       F]TYPEOUT
       FQ0"G Q4U..O HKG0  O ARG'   K User gave5s an arg => search for it.!
       O ASK'			    K!?f user rubs out of...amp; Read Line, ask again.g    FT				    K?!ere if answer toiuestion not recognized.!
Responses_at_this_point_are:
X,_Q,_N_exit
Rubout__exit
Space___type_more
Line____search_again_for_same_arg
Altmode_read_another_arg_and_search
 OASK
7 D8R TQuote:! !^R Quote7ith ^] all altmodes and ^]'s in the region.!

    f[vb f[vz
    :,. f fs bound		    !* put virtual bounds around region4o hack.!
    j< :s;
       r i c>
    fs bound			    K return (for ^R) entire region scanned.!
!List TECO FS Flags:! !C List names of all TECO FS flags.g    f[B Bind
    :FE BJ  :LL		    !* Get and sort4he Flag Names g    J<
      fswidth_P<		    K Put4his many columns !
	  .-z; :LK!?___...gt;
      .,(-s_c).fk!?
    .-z;...gt;
    HT :FV 
7 D8R Forward TECO Conditional:! !^R Move past4he ' matching the following ".g    0[1 .[0ª0ü0à    .( :S

: FSZ-.F[VZ )J	    K Don't look past end of this macro.!
   ...lt; :S"'R*;
      0A-" "E %1' !'°F	    !* Count "'s and ''s.gTMSM  0A-' "E Q1-g1 Q1-1"L 0''
      0A-* "E SR' >		    K!?gnore insides of comments.g    Q3J FG 0
7 D8R Backward TECO Conditional:SM7 D8R Move back past4he " matching the preceding '.g    0[1 [2 .[3
    .( -:S

: .F[VB )J	    !* Don't look0ast start of4his macro.g    < -:S"'g;
      1A-" "E Q1-1U1 Q1-1"L 0'' !'!	    !* Count ''s and "'s.gTMSM  -' "E..1'
      1A-! "E .U(N)-SR	    !* On finding...lt;excl><cr>, look for the matching excl!
      	2A-*"N Q2J''	    !* And if it has a start after it, skip4he7hole4hingg      >
    Q0ß0ê0Ð0ü0ë FG 
7 D8R Save EMACS Patch:! !^R Add4his function4o EMACS;PATnnn...gt;.
EMACS;PATnnn > is loaded in by...amp; Load Essential Environment,
in the process of generating a new runnable EMACS or stand-alone
subsystem (INFO, etc).  The format of PATnnn is just like that
of a source file.g
    [0[m310ª0ü0à    < -:s

; ()F=
"E fkc 0;'> .u0		    K Find start of4his macro.g    :s

: L .u1			    !* Find end of this macro.!
   i..ou(N)f[d file f[b bind
    qEMACS_Version:\u3
    1:< er EMACS;PATG_> @y zj i
>				    K??et old0atch file.g    q0,qÇ()		    K Add4his macro to end.!
    -()f=
"n i
'				    !* Make sure it ends with a CRLF.g    eihpef			    K 2 2 2 2rite0atch file.g    

!* 
** Local Modes:
** Compile Command: M(M.M??enerate Library)EMACS;[PRFY] >EMACS±PURIFYEMACS±CCL
** End:
*!