KeyGrip for Quake v1.0.5b
By David 'crt' Wright
Assistance and Original Concept by Chris 'Drastic_Man' Sykes
__________________________________

     I    Introduction
    
     II   Menus

     III  Dialogs

     IV   Toolbars and Selections

     V    All about Quake demos

     VI   You're First Movie

     VII  Copyright, License, Distribution, and Disclaimer
     information
__________________________________

I. Introduction

Got a hot new patch that you want to show off? Have a Clan that
needs an introduction? Want to become the Steven Spielberg of the
Quake world? Welcome to KeyGrip 1.0.
KeyGrip 1.0 is the next generation non-linear editor for Quake
Movies and demos. By next generation we mean completely visual.
Now there is no more complicated text to decipher. Only pictures
to from which to pick and choose. The ability to make great
movies is just a click away.

__________________________________
                       
II. Menus and Buttons

THE FILE MENU

A. New (ctrl-n) - INOPERABLE IN CURRENT VERSION. You
must work from existing demos.

B. Open (ctrl-o) - Opens a demo in a new window. You may have
up to 26 demos open at a time.

C. Open Pak File - Opens a pak file in the pak file viewer. See
instructions for the pak file viewer below.

D. Close - Closes the current demo and its window. Be sure to save
first!

E. Save (ctrl-s) - Saves the demo under its current filename (shown
in title bar for that demo).

F. Save As  - Save the demo under a new filename. All future saves
will be under this name.

G. Preferences - Sets preferences. See description of preference
dialog below.

H. Exit - Exits the program. Be sure to save all work first!!

THE EDIT MENU

A. Undo (ctrl-z) - INOPERABLE IN CURRENT VERSION.

B. Cut (ctrl-x) - Cut the current selection to the clipboard.
Equivalent to a copy/delete.

C. Copy (ctrl-c) - Copy the current selection to the clipboard. 

D. Paste (ctrl-v) - Paste the current selection, the selection will be
inserted immediately before the current inflag. So if you have a
demo that looks like this: 0 16 [32 48] 64 80 where 32-48 are
highlighted, after pasting, your new demo will look like: 0 16 X X
X 32 48.

E. Paste on End (ctrl-e) - Paste the current selection on the end of
the demo, but before the disconnect block.

F. Delete (del) - Delete the current selection. You will be asked for
confirmation

G. Select All (ctrl-a) - Select the entire demo (0..last block)

H. Find (ctrl-f) - Find (or delete) a specific message in the demo.

THE INSERT MENU

A. Black Section - INOPERABLE IN CURRENT VERSION.

B. New Message - Insert a new message in the first selected block

C. Defaults - Reset certain parameters (fov, palette, weapon
visibility, etc). Inserted at first selected frame.

THE F/X MENU

A. Color Fade - Insert a color fade through the current selected
range (see below for more info)

B. Change Speed - Speed up or slow down the current selection by
a certain percent. You can have a constant change (speed is same
over entire interval) or a fade (speed starts out normal, and
gradually accelerates/decelerates to the final speed at the end of the
selection).

C. Reverse - Reverse the current selection. Unlike the KeyGrip 0.7
beta, this is a TRUE reverse. So if you have a selection like:  0 16
[32 48] 64 80 (note that the actual blocks selected are 32..63) after
the reverse you will have: 0 16 [63 47] 64 80

D. Zoom In/Out - Change the FOV over a certain range for a
zooming effect (see below for more info).

_____________________________________

     III  Dialogs

KeyGrip 1.0 has a ton of dialogs. The key to making great movies
and having neat effects is learning how to use them all.

MAIN DEMO WINDOW
This is the window that you edit the actual demo in. It has frames
for the screenshots (configurable in the preferences dialog).
The scroll bar on the bottom lets you slide through the entire
movie.
The numbers above the blocks are block numbers. Click on them,
and the time (for that block) will be displayed instead. Blocks that
say "-1.00s" have no time message.
On the left side is a button, depressed by default, with some arrows
and boxes. This is "snap to offset." With this down, you can only
scroll on offsets of your block gap (i.e. if your frames are
0..16..32..48, you cannot scroll to 1..17..33..49, only
16..32..48..64). With this off, you can scroll to any value.
The red up and down arrows allow you to view more/less sound
channels. Quake has 8 sound channels (1..8) and a "let Quake
pick" channel, 0. Lines on the sound channels represent sounds.
Different colors are different sounds. Sounds may overlap,
however the second sound on the same channel will cut off the first
sound. Left clicking a sound will play it, right clicking it will take
you to that message in the block tree.

BLOCK TREE
The Block Tree allows you to edit many parts of the demo, down
to the individual messages and message parameters.
Drag and drop is implemented between the right and left frames.
You can drag a range of blocks from the right frame with one demo
selected, onto another demo, to paste them at the end. Messages
work in a similar fashion.
The Up and Down arrows on the left skip to the previous/next
block in the demo.
The Up and Down BAR arrows on the left skip to the
previous/next demo in the block tree.
The eyeglasses show the selection from the current filmstrip in the
right pane of the window.
The progress bar is active when a large tree is being expanded.
When an individual message is selected, the right pane will change
to that message's parameters.
Parameters displayed as "unspecified" are sometimes listed for this
message type, but were not listed in the message block.
Parameters in RED were not listed in this block, but can be
deduced from this entity's spawn message. These spawn
parameters are displayed. You can change them from the default if
you like. To reset them back to the default, type a space.
***VERY IMPORTANT***
For changes to a message parameter to take effect, you MUST
click on another message/block. This is the only way it knows you
are finished editing and ready to save your changes.

For information on message types/parameters, see ALL ABOUT
DEMOS below.

PREFERENCES
Here you set all the options for KeyGrip. Some options may not
take effect until you open a new demo.
WinQuake path: Path to your winquake.exe executable. Should be
the same as your quake dir.
Default DEM dir: Directory for your current project (or id1 for
none). Demos will be loaded from this dir, and quake will be run -
game <this dir>. Should be a subdirectory of quake, and just the
directory name, not the entire path.
Additional WinQuake parameters: Set any additional preferences
or toggles you need here. You should leave the default ones there
unless you know what you are doing. The default ones are:
"-startwindowed  +_windowed_mouse 0 +vid_mode 0 +playdemo
keygrip"
Number of images: Number of screenshots to display on the
filmstrip at a time. 9 is the default and works good for 1024x768
resolution. Changing this option takes effect when opening a new
demo.
JPEG Quality: Set a higher quality for quicker compression, lower
quality for less disk space.
Gamma Correction: Automatically brightens images by a certain
amount.
Nearest Neighbor Preview: If the screenshot for a block is not
available, but one for an adjacent block is, it will be used instead.
A yellow line will appear of the screenshot to indicate this. The
tooltip for that screenshot will be the block number of the actual
screenshot being displayed.
Fast Preview: INOPERABLE IN CURRENT VERSION.
Show Sounds: Turn this off to disable sound editing (no lines
displayed, no functioning sound list). This also speeds up the
loading/editing of demos.
German Keyboard: If KeyGrip sends the string "plazdemo
tempkg1.dem" to WinQuake, instead of the correct "playdemo
tempkg1.dem" then you need to check this box.
Patch WinQuake: This will patch WinQuake 1.0 (internal ver 1.09)
to remove the "Wrote quake00.pcx" messages. Only works on this
version of WinQuake, and only needs to be run once.

FIND DIALOG
This is one of the most powerful features in KeyGrip 1.0. It allows
you to quickly and easily find (and delete) any message in the
demo.
You can set one or two text search strings in Text1 and Text2. You
can set the find type for AND/OR/NOT (not = has the first string,
but not the second).
You can restrict the search to a particular message type, or
messages with certain parameters. Note that if you search by
parameters, you must also specify a message type.
If you search by entity, only messages which have an entity field
(updateentity, sound, etc) with a particular entity will be displayed.
Search on Selected Range will cause KeyGrip to only search the
range selected in the current filmstrip.
You can either do a straight find, or a find/delete. See the delete
dialog below for more info.
Restart will set the current block back to 0.
Clear will get rid of all the search parameters and set the current
block back to 0.
Close will close the find dialog.

DELETE CONFIRMATION (in Find)
The message parameters are displayed, and you are given several
choices of what to do with the message. 
Hit "yes" to delete this message, and continue to the next. 
Hit "no" to leave this message, and continue to the next. 
Hit "delete all" to delete this message, and all others to the end of
the demo. If you skipped earlier messages, they will not be deleted.
"Cancel" closes the dialog at the current block.
Clicking the binoculars will go to the current block/message in the
block tree.

COLOR FADE DIALOG
This dialog allows you to fade between two colors over a range of
blocks. Color is the color that will be faded to/from, opacity is the
clarity/transparency of the color (red 50% would be like a pink film
on the screen).
There are 3 "shortcut" buttons for color - clear, black, and red.
These automatically set the color and opacity for you. To set the
color manually, click the color box.
At the bottom, you have the choice of "one way" or "ping pong"
One way is a straight fade from one color to another. Ping pong
fades from one to another halfway through the range, then fades
back by the end. Use this to make a transition in the middle of the
demo for example.
The button with red/blue boxes is "switch start/end" and will
switch the start/end colors and opacities.

ZOOM DIALOG
The zoom dialog allows you to fade between two different FOV's
over a selected range of blocks. A preview window is provided to
give you an idea of how it will look.
You can do a straight fade over the entire range, or ping pong,
going from the first value, to the second, back to the first at the end
of the range. Use this in the middle of a demo for transition effects.


ZOOM IMAGE WINDOW
This allows you to see blowups of the thumbnail images.
The |< and >| buttons go to the first/last screenshot in the demo
(note that if you only took screenshots for 1-16, the last screenshot
will be 16, even though you may have 1000 blocks in the demo).
The << and >> arrows go one screenshot forward or back in the
demo. It skips all blocks without screenshots.
The Play button runs through the screenshots in order. The stop
button stops this.

ITEM CALCULATOR
Use this tool to determine values for the "items" parameter of the
Clientdata message. It is a fancy bitmapped field which is hard to
calculate by hand. You can input a value to determine the correct
items, or set the items to get a value (negative values are OK).

PAK FILE VIEWER
You can use the pak file viewer to open the contents of any Quake
PAK file. Currently the only functionality is that you can drag
sound files from it directly into a sound list to add them to that
demo's precache sound list.

INSERT MESSAGE DIALOG
Here you can select the type of message to insert and the message
parameters.
To insert a return in a text string, use \n.

INSERT DEFAULTS DIALOG
This allows you to insert a "stufftext" message at any point in the
demo to reset certain values. You can select manually, or hit "reset
all" to select them all.
You should not use insert defaults on blocks 0 or 1. If you try and
insert defaults on one of these blocks, KeyGrip will automatically
skip to 2.

SOUND LIST
The sound list shows the sounds precached in the current demo.
You must have sound editing turned on in preferences for this to
work.
Use the + button to add sounds from a \sound\ directory under your
current working directory. You can also drag sounds from a pak
file in your working directory onto the sound list.
Use the - button to remove a sound from the list. It will also be
removed from all places in the demo where it occurs. Other sounds
will be renumbered accordingly.
The PLAY button will play the sound. Note that this will not work
if you have WinQuake or another sound application open.
The Sound Properties button will give you info about the sound,
including length and file location.

ENTITY LIST
The entity list displays all the entities spawned in the demo, and
their entity numbers. In the future, it will have greatly enhanced
flexibility.

_____________________________________

III. Toolbars and Selections


1. The Toolbars

The First toolbar (looks like a standard windows toolbar) contains
quick links to the most important functions on the menu. It can be
dragged off the docking bar if you prefer.

The second toolbar contains the selection/blocking and viewing
tools. See below for information on how the selection tools work.
Each tool does the opposite of its function when the right mouse
button is used (e.g. zoom in would zoom out, mark in flag would
mark the out flag).

The large toolbar contains the buttons for previewing and updating
the filmstrip. The buttons are:

     Update All Thumbnails: This generates thumbnail
screenshots for all the frames at the current zoom level. After doing
this, you will be able to scroll the entire demo and see screenshots
for every block (except the disconnect block).

     Update Viewable: This generates thumbnail screenshots for
the viewable frames in the filmstrip (9 frames by default, but can
be changed in preferences). The first 3 blocks of the demo are
copied to a file, along with the range of blocks displayed in the
filmstrip, and it is run through Quake. Also, any block that has a
"setview" message in it will be included. This way view changes
are done correctly.

     Play Selection: This plays the currently selected range of
blocks in Quake. The first 3 blocks, and any setview blocks are
included as above.

     Preview Cut: One of the most useful new tools, this plays a
range of blocks AROUND your selection, giving you an idea of
what it will look like if you cut that section out. You are given a
choice of number of blocks to preview before/after the cut.

     Stop Updating: If for some reason Quake crashes or fails to
take enough screenshots while updating, you can use this button to
return to KeyGrip.

     Refresh Selection: This will take the range of blocks you
have selected in the Block Tree, and select the same blocks in the
filmstrip.

2. Selections
Accurate and simple selection is very important to a program like
this, so it is very essential to understand how to select blocks, and
what a selection means.

        A note that applies to ALL selections:
        The selection STARTS where you set the inflag, i.e. the block
        you click on, i.e. the first frame in color.
        The selection ENDS on the first block BEFORE start of the
gray boxes.
        What this means:
        If you have frames displayed like this:
        4  8  12  16  20  24  28  32  36
        And set the inflag on 12, you will see:
        X  X  12  16  20  24  28  32  36 (where X's represent gray
boxes/images)
        If you click on 24 to set the outflag, you will see:
        X  X  12  16  20  24  X  X  X
        But the actual blocks selected are 12 - 27.

        This is fundamental to the way the program works and is the
most logical way to select things. e.g. clicking on the last visible
block ALWAYS set the outflag on the LAST block, otherwise you
would have to zoom in all the way to select the final block as the
outflag. This affects how all functions are performed INCLUDING
REVERSE in this version. 
If you are unsure of which blocks are selected, hit the "Delete" key.
It will pop up a dialog showing which blocks are selected, and
asking if you would like to delete them. Unless you actually mean
to delete them, hit no.

        WHEN IN DOUBT, ZOOM IN ALL THE WAY BEFORE
SELECTING THINGS


First selection method:
     Use the arrow tool to select frames as you would multiple
files in Explorer.
Single clicking will select the from the current frame up to one
block before the next frame. The frame you click on will be
highlighted, all others will be gray. If you are zoomed in all the
way,  this will select 1 block. You can then shift-click (or right
click) on another block to select the outflag position.

Second selection method:
     There are 2 buttons labeled "IN" and "OUT. These are
called in and out flags. By clicking "In" and a frame you set the
beginning of your selection on the block you click.. Then by
clicking "OUT" and the ending frame you end your selection.


___________________________________

V.     Your first movie

Anyone who has been demo editing for a while has probably run
across the infamous QuakeLab:Multimedia movie tutorial. I have
recorded the demo as listed in the QL:MM tutorial (minus the
markwav and cut stuff). Here is how to edit it in KeyGrip.

     1.   Start KeyGrip
     2.   Using the File-Open dialog, open "qlmm.dem"
     3.   Use the "Zoom Out" tool on the small toolbar and click on
     the first block until the frames are numbered 0..16..32...
     (depending on the number of images on your filmstrip, you
     may not have to do this).
     4.   Hit the "Update All Thumbnails" button on the big toolbar
     to generate screenshots for all the frames. Quake will run
     the demo, and KeyGrip will come back and convert the
     images.
     5.   Now, we want to get some smooth cuts between a couple
     different viewing angles of the grunt. Use the Zoom Image
     tool, and click on a frame around 240.
     6.   Use the << and >> arrows to scroll forward and backwards.
     You will see the view approach the grunt, and then shift
     left. Find the frame that is just _before_ the view shifts to
     the left of the grunt (I used 320).
     7.   Using the arrow tool, click on this frame (the rest of the
     frames will turn grayscale).
     8.   Now, continue scrolling the magnified image window until
     the view stabilizes on the left of the grunt (around frame
     368).
     9.   Now, block 368 is ok, so we want to delete everything up to
     that. Again using the arrow tool, either right click or shift
     click on the previous frame - 352. The actual selection will
     be 320-367.
     10.  You should now have frames 320-352 highlighted, and the
     rest grayed out.
     11.  This is the section you are going to delete. To make sure it
     creates a smooth transition, use the "Preview Cut" button
     on the big toolbar. The defaults of 100 blocks before/after
     are fine.
     12.  If it looks ok, go ahead and delete that section (Edit -
     Delete, or the DEL key). After deleting, KeyGrip shifts the
     other blocks over and recalculates the block numbers. It
     also re-times the demo to prevent there from being big gaps
     in time.
     13.  Now Click the Zoom Image tool around block 320. Scroll
     forward until you see the view start shifting to the right
     (just after frame 368). Continue scrolling until the view
     stabilizes (around frame 448). 
     14.  The position is good at 368, and again at 448, so we want to
     delete everything in between (368 - 447)
     15.  Block off the section (368 - 432) as above and delete.
     16.  Finally, use the Zoom Image tool again, and locate the
     block just before the view changes again. (It changes at
     448, so you want 432). Select to 464 (just three
     screenshots) and delete.
     17.  Ok! The cutting process is now done! Hit ctrl-A to select
     the entire demo, then use "Play Selection" to watch it.
     18.  You may want to save the demo at this time.
     19.  Now lets add some effects and clean it up a bit.
     20.  First, lets get rid of that "notarget" message at beginning.
     Do an edit - find. In the first text box, type "notarget"
     Select "Delete" under Find Type. Click the Find First
     button.
     21.  KeyGrip should find the print message at block 70 and ask
     if you want to delete it. Hit "yes". KeyGrip will search for
     more occurrences and stop when it doesn't find any.
     22.  Close the find dialog.
     23.  If you ever go to block 70 in the Block Tree, you will note
     that there is a "nop" instruction there. Quake does not allow
     empty blocks, so if you delete all the messages in a block
     (and there was only one in this one) KeyGrip will insert a
     nop instruction to keep Quake from crashing.
     24.  Now we should clean of some things so that the demo
     appears the same on everyone's system.
     25.  Select the first block, and do an Insert - Defaults.
     26.  In the defaults dialog, select: Fast Console Speed, Reset
     FOV, Crosshair Off, Weapon Model ON, and type in "120"
     for viewsize, then select that one too. Hit OK to insert these
     defaults. (The stufftext message with these defaults will
     actually be inserted in block 2, not block 0).
     27.  Now for the fun part - Lets insert some sounds.
     28.  You need to make 4 WAV files for the conversation
     between you and the Grunt. You can use Sound Recorder or
     another wav program to record them. They should be 16bit,
     11khz.
     29.  Record these lines:
     Grunt (growling): "Who the hell are you?"
     You: "I'm (your name)." 
                                        Grunt: "I'm Biff."            
     You: "No, you're dead."
     30.  Save them as something obvious and place them in a
     subdirectory called "sound" under your \quake\id1 directory
     (e.g. c:\quake\id1\sound\*.wav)
     31.  Back in KeyGrip, open up the sound list (View - Soundlist).
     32.  Using the + Button, individually add the 4 sounds you
     created. They should appear at the bottom of the list.
     33.  Drop down 5 channels of the sound track using the red
     down arrows on the demo window (hit it several times).
     34.  We want to insert the first one right when the view gets up
     close to the grunt (block 288).
     35.  Drag the first wav (who the..) from the sound list onto the
     screenshot for block 288.
     36.  A new line should appear on channel 5 under block 288.
     37.  We want the second one to start as soon as that one is
     finished, so drag the next one (I'm..) from the list onto
     block 336.
     38.  Drop the 3rd one on block 368, and the 4th on 416.
     39.  The death is the MOST important part of this whole film,
     so lets slow it down a little.
     40.  Select blocks 416-528
     41.  Do an F/X - Change Speed, 50%, OK
     42.  Select All and Play Selection to see your great movie..
     43.  Finally, let's add a fade-in at the beginning.
     44.  Select blocks 0 - 64 and go to F/X - Fade.
     45.  We want to fade from black -> clear, so in the top half of
     the fade dialog, select the small black box. In the bottom
     half, select the clear box (has the \\\ lines in it).
     46.  Hit OK to apply the fade.
     47.  Use play selection or update viewable to see the effect.
     48.  Congratulations, you have made your first movie!  

___________________________________
     
     VI   All About Quake Demos

This section is intended to give a quick overview of how Quake
demos work and what you need to know to edit them. For full info,
check out the official DEM specs at:
http://www.physik.uni-leipzig.de/~girlich/games/
I have included the latest version in this ZIP for your convenience. 

The basic format of a demo file is BLOCKS of MESSAGES.
Blocks are simply groups of messages sent to the client at a
particular time. Most blocks are time stamped with the "TIME"
message. Blocks are sent in order. However if the time of a block
is earlier than the time of a previous block, that block is skipped
(since supposedly it has already happened).

Blocks contain one or more messages (they MUST contain at least
one).
For descriptions of all the message types, see the dem specs.
The majority of the messages are "clientdata" or "updateentity"
messages.
"Clientdata" messages describe the state of the client (that's you,
the viewer/player) at that block. Information includes
health/armor/weapons/ammo etc.
"Updateentity" messages set various parameters for entities in the
game. Entities are objects in the game, they can be players,
monsters, items, weapons, or just about any other thing.
Updateentity messages change the position/rotation/skin/model for
the entity.

Other important messages:
"Print" prints a message at the console, like those "You got 10
shells" messages.
"Centerprint" prints a message in the center of the screen for
several seconds.
"Sound" plays a sound. The sound must be precached in the sound
list.
"Stufftext" sends a command to the console. The command is
executed just as if you had pulled down the console and typed it at
that instant.
"Setview" changes the entity that the camera views from.

KeyGrip lists all numbers just as they appear in the demo, which
means they may not always be intuitive. Here are the conversions
between KeyGrip numbers and LMPC numbers:

KG Angle  / 256.0 * 360.0 = LMPC Angle (degrees)
-Quake stores 256 possible angles, LMPC displays angles in
degrees

KG Coordinate * 0.125 = LMPC Coordinate (quake units)
-Quake stores coordinates as internally as integers, however using
the edicts command (or map utilities, etc) the number is shown in
"quake units."

KG Particle Velocity * 0.0625 = LMPC Particle Velocity (???)

KG Sound number = LMPC Sound number - 1
All KeyGrip numbering is 0 based, including the sound list.


___________________________________
     
     VII  Copyright, License, Distribution, and Disclaimer
     information

COPYRIGHT
The Program ("KeyGrip") is owned by David Wright ("the
Owner") and is protected by the United States copyright laws and
international treaty provisions. The Owner retains all rights not
expressly granted. None of the components of the Program
(including the documentation) may be copied, removed or altered,
in whole or part, for any unauthorized use.

LICENSE
The owner grants you non-exclusive license to:
* Use KeyGrip free of charge, for an unlimited time, for non-
commercial projects. "Non-Commercial" is any project in which
there is no net income received from the sale or license of any
media produced or edited by the Program.
* Distribute free of charge or license any media produced or edited
by the program, so long as it does not violate other parts of this
agreement or infringe on another company or individual's rights.
* Retain full ownership of all media produced or edited by the
Program

You may not:
* Remove or alter any of the copyright notices from any
components of the Program.
* Sub license, rent or lease all or part of the Program.
* Use the Program with the intent to violate any licensing
agreements or contracts.
* Modify, adapt, translate, create derivative works, decompile,
disassemble, or otherwise reverse engineer or attempt to reverse
engineer or derive source code from all or any portion of the
Program or anything incorporated therein or permit or encourage
any third party to do so.
* Receive profits in cash, coin, or negotiable goods for any media
produced or edited by the Program.

For commercial use, the program is licensed on a unlimited use,
per-seat basis. Please contact the Owner at the address listed in the
readme.txt file for commercial licensing information.
Commercial users will be provided with priority support and will
have the opportunity to purchase a customized version with
additional features for their project.

DISTRIBUTION
You may freely distribute the Program in its original form,
including all documentation and copyright information, by any
online means. You may not charge, receive donation for, or
otherwise profit from the distribution of this product.
You may NOT distribute this program on ANY media (floppy disk,
cdrom, tape, or other magnetic storage device) except for personal
use.
Commercial distribution, for free or for profit, must be arranged
through the Owner first.

DISCLAIMER
          BECAUSE THE PROGRAM IS LICENSED FREE OF
     CHARGE, THERE IS NO WARRANTY  FOR THE
     PROGRAM, TO THE EXTENT PERMITTED BY
     APPLICABLE LAW.  EXCEPT WHEN OTHERWISE
     STATED IN WRITING THE COPYRIGHT HOLDERS
     AND/OR OTHER PARTIES PROVIDE THE PROGRAM
     "AS IS" WITHOUT WARRANTY OF ANY KIND,
     EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT
     NOT LIMITED TO, THE IMPLIED WARRANTIES OF 
     MERCHANTABILITY AND FITNESS FOR A
     PARTICULAR PURPOSE.  THE ENTIRE RISK AS  TO
     THE QUALITY AND PERFORMANCE OF THE
     PROGRAM IS WITH YOU.  SHOULD THE  PROGRAM
     PROVE DEFECTIVE, YOU ASSUME THE COST OF
     ALL NECESSARY SERVICING,  REPAIR OR
     CORRECTION.
