Just regenerating to get fresh version in place of very dated versions.
[privoxy.git] / doc / webserver / user-manual / filter-file.html
1 <HTML
2 ><HEAD
3 ><TITLE
4 >The Filter File</TITLE
5 ><META
6 NAME="GENERATOR"
7 CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+
8 "><LINK
9 REL="HOME"
10 TITLE="Privoxy 3.1.1 User Manual"
11 HREF="index.html"><LINK
12 REL="PREVIOUS"
13 TITLE="Actions Files"
14 HREF="actions-file.html"><LINK
15 REL="NEXT"
16 TITLE="Templates"
17 HREF="templates.html"><LINK
18 REL="STYLESHEET"
19 TYPE="text/css"
20 HREF="../p_doc.css"></HEAD
21 ><BODY
22 CLASS="SECT1"
23 BGCOLOR="#EEEEEE"
24 TEXT="#000000"
25 LINK="#0000FF"
26 VLINK="#840084"
27 ALINK="#0000FF"
28 ><DIV
29 CLASS="NAVHEADER"
30 ><TABLE
31 SUMMARY="Header navigation table"
32 WIDTH="100%"
33 BORDER="0"
34 CELLPADDING="0"
35 CELLSPACING="0"
36 ><TR
37 ><TH
38 COLSPAN="3"
39 ALIGN="center"
40 >Privoxy 3.1.1 User Manual</TH
41 ></TR
42 ><TR
43 ><TD
44 WIDTH="10%"
45 ALIGN="left"
46 VALIGN="bottom"
47 ><A
48 HREF="actions-file.html"
49 ACCESSKEY="P"
50 >Prev</A
51 ></TD
52 ><TD
53 WIDTH="80%"
54 ALIGN="center"
55 VALIGN="bottom"
56 ></TD
57 ><TD
58 WIDTH="10%"
59 ALIGN="right"
60 VALIGN="bottom"
61 ><A
62 HREF="templates.html"
63 ACCESSKEY="N"
64 >Next</A
65 ></TD
66 ></TR
67 ></TABLE
68 ><HR
69 ALIGN="LEFT"
70 WIDTH="100%"></DIV
71 ><DIV
72 CLASS="SECT1"
73 ><H1
74 CLASS="SECT1"
75 ><A
76 NAME="FILTER-FILE">9. The Filter File</H1
77 ><P
78 > All text substitutions that can be invoked through the
79  <TT
80 CLASS="LITERAL"
81 ><A
82 HREF="actions-file.html#FILTER"
83 >filter</A
84 ></TT
85 > action
86  must first be defined in the filter file, which is typically
87  called <TT
88 CLASS="FILENAME"
89 >default.filter</TT
90 > and which can be
91  selected through the <TT
92 CLASS="LITERAL"
93 > <A
94 HREF="config.html#FILTERFILE"
95 >filterfile</A
96 ></TT
97 > config
98  option.</P
99 ><P
100 > Typical reasons for doing such substitutions are to eliminate
101  common annoyances in HTML and JavaScript, such as pop-up windows,
102  exit consoles, crippled windows without navigation tools, the
103  infamous &#60;BLINK&#62; tag etc, to suppress images with certain
104  width and height attributes (standard banner sizes or web-bugs),
105  or just to have fun. The possibilities are endless.</P
106 ><P
107 > Filtering works on any text-based document type, including plain
108  text, HTML, JavaScript, CSS etc. (all <TT
109 CLASS="LITERAL"
110 >text/*</TT
111 >
112  MIME types). Substitutions are made at the source level, so if
113  you want to <SPAN
114 CLASS="QUOTE"
115 >"roll your own"</SPAN
116 > filters, you should be
117  familiar with HTML syntax.</P
118 ><P
119 > Just like the <A
120 HREF="actions-file.html"
121 >actions files</A
122 >, the
123  filter file is organized in sections, which are called <SPAN
124 CLASS="emphasis"
125 ><I
126 CLASS="EMPHASIS"
127 >filters</I
128 ></SPAN
129 >
130  here. Each filter consists of a heading line, that starts with the
131  <SPAN
132 CLASS="emphasis"
133 ><I
134 CLASS="EMPHASIS"
135 >keyword</I
136 ></SPAN
137 > <TT
138 CLASS="LITERAL"
139 >FILTER:</TT
140 >, followed by
141  the filter's <SPAN
142 CLASS="emphasis"
143 ><I
144 CLASS="EMPHASIS"
145 >name</I
146 ></SPAN
147 >, and a short (one line) 
148  <SPAN
149 CLASS="emphasis"
150 ><I
151 CLASS="EMPHASIS"
152 >description</I
153 ></SPAN
154 > of what it does. Below that line
155  come the <SPAN
156 CLASS="emphasis"
157 ><I
158 CLASS="EMPHASIS"
159 >jobs</I
160 ></SPAN
161 >, i.e. lines that define the actual
162  text substitutions. By convention, the name of a filter
163  should describe what the filter <SPAN
164 CLASS="emphasis"
165 ><I
166 CLASS="EMPHASIS"
167 >eliminates</I
168 ></SPAN
169 >. The
170  comment is used in the <A
171 HREF="http://config.privoxy.org/"
172 TARGET="_top"
173 >web-based
174  user interface</A
175 >.</P
176 ><P
177 > Once a filter called <TT
178 CLASS="REPLACEABLE"
179 ><I
180 >name</I
181 ></TT
182 > has been defined
183  in the filter file, it can be invoked by using an action of the form
184  +<TT
185 CLASS="LITERAL"
186 ><A
187 HREF="actions-file.html#FILTER"
188 >filter</A
189 >{<TT
190 CLASS="REPLACEABLE"
191 ><I
192 >name</I
193 ></TT
194 >}</TT
195 >
196  in any <A
197 HREF="actions-file.html"
198 >actions file</A
199 >.</P
200 ><P
201 > A filter header line for a filter called <SPAN
202 CLASS="QUOTE"
203 >"foo"</SPAN
204 > could look
205  like this:</P
206 ><P
207 > <TABLE
208 BORDER="0"
209 BGCOLOR="#E0E0E0"
210 WIDTH="100%"
211 ><TR
212 ><TD
213 ><PRE
214 CLASS="SCREEN"
215 >FILTER: foo Replace all "foo" with "bar"</PRE
216 ></TD
217 ></TR
218 ></TABLE
219 ></P
220 ><P
221 > Below that line, and up to the next header line, come the jobs that
222  define what text replacements the filter executes. They are specified
223  in a syntax that imitates <A
224 HREF="http://www.perl.org/"
225 TARGET="_top"
226 >Perl</A
227 >'s
228  <TT
229 CLASS="LITERAL"
230 >s///</TT
231 > operator. If you are familiar with Perl, you
232  will find this to be quite intuitive, and may want to look at the
233  <A
234 HREF="http://www.oesterhelt.org/pcrs/pcrs.3.html"
235 TARGET="_top"
236 >PCRS man page</A
237 >
238  for the subtle differences to Perl behaviour. Most notably, the non-standard
239  option letter <TT
240 CLASS="LITERAL"
241 >U</TT
242 > is supported, which turns the default
243  to ungreedy matching.</P
244 ><P
245 > If you are new to regular expressions, you might want to take a look at
246  the <A
247 HREF="appendix.html#REGEX"
248 >Appendix on regular expressions</A
249 >, and
250  see the <A
251 HREF="http://perldoc.com/perl5.6.1/pod/perl.html"
252 TARGET="_top"
253 >Perl
254  manual</A
255 > for
256  <A
257 HREF="http://perldoc.com/perl5.6.1/pod/perlop.html#s-PATTERN-REPLACEMENT-egimosx"
258 TARGET="_top"
259 >the 
260  <TT
261 CLASS="LITERAL"
262 >s///</TT
263 > operator's syntax</A
264 > and <A
265 HREF="http://perldoc.com/perl5.6.1/pod/perlre.html"
266 TARGET="_top"
267 >Perl-style regular
268  expressions</A
269 > in general.
270  The below examples might also help to get you started.</P
271 ><DIV
272 CLASS="SECT2"
273 ><H2
274 CLASS="SECT2"
275 ><A
276 NAME="AEN3018">9.1. Filter File Tutorial</H2
277 ><P
278 > Now, let's complete our <SPAN
279 CLASS="QUOTE"
280 >"foo"</SPAN
281 > filter. We have already defined
282  the heading, but the jobs are still missing. Since all it does is to replace
283  <SPAN
284 CLASS="QUOTE"
285 >"foo"</SPAN
286 > with <SPAN
287 CLASS="QUOTE"
288 >"bar"</SPAN
289 >, there is only one (trivial) job
290  needed:</P
291 ><P
292 > <TABLE
293 BORDER="0"
294 BGCOLOR="#E0E0E0"
295 WIDTH="100%"
296 ><TR
297 ><TD
298 ><PRE
299 CLASS="SCREEN"
300 >s/foo/bar/</PRE
301 ></TD
302 ></TR
303 ></TABLE
304 ></P
305 ><P
306 > But wait! Didn't the comment say that <SPAN
307 CLASS="emphasis"
308 ><I
309 CLASS="EMPHASIS"
310 >all</I
311 ></SPAN
312 > occurrences
313  of <SPAN
314 CLASS="QUOTE"
315 >"foo"</SPAN
316 > should be replaced? Our current job will only take
317  care of the first <SPAN
318 CLASS="QUOTE"
319 >"foo"</SPAN
320 > on each page. For global substitution,
321  we'll need to add the <TT
322 CLASS="LITERAL"
323 >g</TT
324 > option:</P
325 ><P
326 > <TABLE
327 BORDER="0"
328 BGCOLOR="#E0E0E0"
329 WIDTH="100%"
330 ><TR
331 ><TD
332 ><PRE
333 CLASS="SCREEN"
334 >s/foo/bar/g</PRE
335 ></TD
336 ></TR
337 ></TABLE
338 ></P
339 ><P
340 > Our complete filter now looks like this:</P
341 ><P
342 > <TABLE
343 BORDER="0"
344 BGCOLOR="#E0E0E0"
345 WIDTH="100%"
346 ><TR
347 ><TD
348 ><PRE
349 CLASS="SCREEN"
350 >FILTER: foo Replace all "foo" with "bar"
351 s/foo/bar/g</PRE
352 ></TD
353 ></TR
354 ></TABLE
355 ></P
356 ><P
357 > Let's look at some real filters for more interesting examples. Here you see
358  a filter that protects against some common annoyances that arise from JavaScript
359  abuse. Let's look at its jobs one after the other:</P
360 ><P
361 > <TABLE
362 BORDER="0"
363 BGCOLOR="#E0E0E0"
364 WIDTH="100%"
365 ><TR
366 ><TD
367 ><PRE
368 CLASS="SCREEN"
369 >FILTER: js-annoyances Get rid of particularly annoying JavaScript abuse
370
371 # Get rid of JavaScript referrer tracking. Test page: http://www.randomoddness.com/untitled.htm
372 #
373 s|(&#60;script.*)document\.referrer(.*&#60;/script&#62;)|$1"Not Your Business!"$2|Usg</PRE
374 ></TD
375 ></TR
376 ></TABLE
377 ></P
378 ><P
379 > Following the header line and a comment, you see the job. Note that it uses
380  <TT
381 CLASS="LITERAL"
382 >|</TT
383 > as the delimiter instead of <TT
384 CLASS="LITERAL"
385 >/</TT
386 >, because
387  the pattern contains a forward slash, which would otherwise have to be escaped
388  by a backslash (<TT
389 CLASS="LITERAL"
390 >\</TT
391 >).</P
392 ><P
393 > Now, let's examine the pattern: it starts with the text <TT
394 CLASS="LITERAL"
395 >&#60;script.*</TT
396 >
397  enclosed in parentheses. Since the dot matches any character, and <TT
398 CLASS="LITERAL"
399 >*</TT
400 >
401  means: <SPAN
402 CLASS="QUOTE"
403 >"Match an arbitrary number of the element left of myself"</SPAN
404 >, this
405  matches <SPAN
406 CLASS="QUOTE"
407 >"&#60;script"</SPAN
408 >, followed by <SPAN
409 CLASS="emphasis"
410 ><I
411 CLASS="EMPHASIS"
412 >any</I
413 ></SPAN
414 > text, i.e.
415  it matches the whole page, from the start of the first &#60;script&#62; tag.</P
416 ><P
417 > That's more than we want, but the pattern continues: <TT
418 CLASS="LITERAL"
419 >document\.referrer</TT
420 >
421  matches only the exact string <SPAN
422 CLASS="QUOTE"
423 >"document.referrer"</SPAN
424 >. The dot needed to
425  be <SPAN
426 CLASS="emphasis"
427 ><I
428 CLASS="EMPHASIS"
429 >escaped</I
430 ></SPAN
431 >, i.e. preceded by a backslash, to take away its
432  special meaning as a joker, and make it just a regular dot. So far, the meaning is:
433  Match from the start of the first &#60;script&#62; tag in a the page, up to, and including,
434  the text <SPAN
435 CLASS="QUOTE"
436 >"document.referrer"</SPAN
437 >, if <SPAN
438 CLASS="emphasis"
439 ><I
440 CLASS="EMPHASIS"
441 >both</I
442 ></SPAN
443 > are present
444  in the page (and appear in that order).</P
445 ><P
446 > But there's still more pattern to go. The next element, again enclosed in parentheses,
447  is <TT
448 CLASS="LITERAL"
449 >.*&#60;/script&#62;</TT
450 >. You already know what <TT
451 CLASS="LITERAL"
452 >.*</TT
453 >
454  means, so the whole pattern translates to: Match from the start of the first  &#60;script&#62;
455  tag in a page to the end of the last &#60;script&#62; tag, provided that the text
456  <SPAN
457 CLASS="QUOTE"
458 >"document.referrer"</SPAN
459 > appears somewhere in between.</P
460 ><P
461 > This is still not the whole story, since we have ignored the options and the parentheses:
462  The portions of the page matched by sub-patterns that are enclosed in parentheses, will be
463  remembered and be available through the variables <TT
464 CLASS="LITERAL"
465 >$1, $2, ...</TT
466 > in
467  the substitute. The <TT
468 CLASS="LITERAL"
469 >U</TT
470 > option switches to ungreedy matching, which means
471  that the first <TT
472 CLASS="LITERAL"
473 >.*</TT
474 > in the pattern will only <SPAN
475 CLASS="QUOTE"
476 >"eat up"</SPAN
477 > all
478  text in between <SPAN
479 CLASS="QUOTE"
480 >"&#60;script"</SPAN
481 > and the <SPAN
482 CLASS="emphasis"
483 ><I
484 CLASS="EMPHASIS"
485 >first</I
486 ></SPAN
487 > occurrence
488  of <SPAN
489 CLASS="QUOTE"
490 >"document.referrer"</SPAN
491 >, and that the second <TT
492 CLASS="LITERAL"
493 >.*</TT
494 > will
495  only span the text up to the <SPAN
496 CLASS="emphasis"
497 ><I
498 CLASS="EMPHASIS"
499 >first</I
500 ></SPAN
501 > <SPAN
502 CLASS="QUOTE"
503 >"&#60;/script&#62;"</SPAN
504 >
505  tag. Furthermore, the <TT
506 CLASS="LITERAL"
507 >s</TT
508 > option says that the match may span
509  multiple lines in the page, and the <TT
510 CLASS="LITERAL"
511 >g</TT
512 > option again means that the
513  substitution is global.</P
514 ><P
515 > So, to summarize, the pattern means: Match all scripts that contain the text
516  <SPAN
517 CLASS="QUOTE"
518 >"document.referrer"</SPAN
519 >. Remember the parts of the script from
520  (and including) the start tag up to (and excluding) the string
521  <SPAN
522 CLASS="QUOTE"
523 >"document.referrer"</SPAN
524 > as <TT
525 CLASS="LITERAL"
526 >$1</TT
527 >, and the part following
528  that string, up to and including the closing tag, as <TT
529 CLASS="LITERAL"
530 >$2</TT
531 >.</P
532 ><P
533 > Now the pattern is deciphered, but wasn't this about substituting things? So
534  lets look at the substitute: <TT
535 CLASS="LITERAL"
536 >$1"Not Your Business!"$2</TT
537 > is
538  easy to read: The text remembered as <TT
539 CLASS="LITERAL"
540 >$1</TT
541 >, followed by 
542  <TT
543 CLASS="LITERAL"
544 >"Not Your Business!"</TT
545 > (<SPAN
546 CLASS="emphasis"
547 ><I
548 CLASS="EMPHASIS"
549 >including</I
550 ></SPAN
551 >
552  the quotation marks!), followed by the text remembered as <TT
553 CLASS="LITERAL"
554 >$2</TT
555 >.
556  This produces an exact copy of the original string, with the middle part
557  (the <SPAN
558 CLASS="QUOTE"
559 >"document.referrer"</SPAN
560 >) replaced by <TT
561 CLASS="LITERAL"
562 >"Not Your
563  Business!"</TT
564 >.</P
565 ><P
566 > The whole job now reads: Replace <SPAN
567 CLASS="QUOTE"
568 >"document.referrer"</SPAN
569 > by
570  <TT
571 CLASS="LITERAL"
572 >"Not Your Business!"</TT
573 > wherever it appears inside a
574  &#60;script&#62; tag. Note that this job won't break JavaScript syntax,
575  since both the original and the replacement are syntactically valid
576  string objects. The script just won't have access to the referrer
577  information anymore.</P
578 ><P
579 > We'll show you two other jobs from the JavaScript taming department, but
580  this time only point out the constructs of special interest:</P
581 ><P
582 > <TABLE
583 BORDER="0"
584 BGCOLOR="#E0E0E0"
585 WIDTH="100%"
586 ><TR
587 ><TD
588 ><PRE
589 CLASS="SCREEN"
590 ># The status bar is for displaying link targets, not pointless blahblah
591 #
592 s/window\.status\s*=\s*(['"]).*?\1/dUmMy=1/ig</PRE
593 ></TD
594 ></TR
595 ></TABLE
596 ></P
597 ><P
598 > <TT
599 CLASS="LITERAL"
600 >\s</TT
601 > stands for whitespace characters (space, tab, newline,
602  carriage return, form feed), so that <TT
603 CLASS="LITERAL"
604 >\s*</TT
605 > means: <SPAN
606 CLASS="QUOTE"
607 >"zero
608  or more whitespace"</SPAN
609 >. The <TT
610 CLASS="LITERAL"
611 >?</TT
612 > in <TT
613 CLASS="LITERAL"
614 >.*?</TT
615 >
616  makes this matching of arbitrary text ungreedy. (Note that the <TT
617 CLASS="LITERAL"
618 >U</TT
619 >
620  option is not set). The <TT
621 CLASS="LITERAL"
622 >['"]</TT
623 > construct means: <SPAN
624 CLASS="QUOTE"
625 >"a single
626  <SPAN
627 CLASS="emphasis"
628 ><I
629 CLASS="EMPHASIS"
630 >or</I
631 ></SPAN
632 > a double quote"</SPAN
633 >. Finally, <TT
634 CLASS="LITERAL"
635 >\1</TT
636 > is
637  a backreference to the first parenthesis just like <TT
638 CLASS="LITERAL"
639 >$1</TT
640 > above,
641  with the difference that in the <SPAN
642 CLASS="emphasis"
643 ><I
644 CLASS="EMPHASIS"
645 >pattern</I
646 ></SPAN
647 >, a backslash indicates
648  a backreference, whereas in the <SPAN
649 CLASS="emphasis"
650 ><I
651 CLASS="EMPHASIS"
652 >substitute</I
653 ></SPAN
654 >, it's the dollar.</P
655 ><P
656 > So what does this job do? It replaces assignments of single- or double-quoted
657  strings to the <SPAN
658 CLASS="QUOTE"
659 >"window.status"</SPAN
660 > object with a dummy assignment
661  (using a variable name that is hopefully odd enough not to conflict with
662  real variables in scripts). Thus, it catches many cases where e.g. pointless
663  descriptions are displayed in the status bar instead of the link target when
664  you move your mouse over links.</P
665 ><P
666 > <TABLE
667 BORDER="0"
668 BGCOLOR="#E0E0E0"
669 WIDTH="100%"
670 ><TR
671 ><TD
672 ><PRE
673 CLASS="SCREEN"
674 ># Kill OnUnload popups. Yummy. Test: http://www.zdnet.com/zdsubs/yahoo/tree/yfs.html
675 #
676 s/(&#60;body [^&#62;]*)onunload(.*&#62;)/$1never$2/iU</PRE
677 ></TD
678 ></TR
679 ></TABLE
680 ></P
681 ><P
682 > Including the
683  <A
684 HREF="http://www.w3.org/TR/2000/REC-DOM-Level-2-Events-20001113/events.html#Events-eventgroupings-htmlevents"
685 TARGET="_top"
686 >OnUnload
687  event binding</A
688 > in the HTML DOM was a <SPAN
689 CLASS="emphasis"
690 ><I
691 CLASS="EMPHASIS"
692 >CRIME</I
693 ></SPAN
694 >.
695  When I close a browser window, I want it to close and die. Basta.
696  This job replaces the <SPAN
697 CLASS="QUOTE"
698 >"onunload"</SPAN
699 > attribute in
700  <SPAN
701 CLASS="QUOTE"
702 >"&#60;body&#62;"</SPAN
703 > tags with the dummy word <TT
704 CLASS="LITERAL"
705 >never</TT
706 >.
707  Note that the <TT
708 CLASS="LITERAL"
709 >i</TT
710 > option makes the pattern matching
711  case-insensitive. Also note that ungreedy matching alone doesn't always guarantee
712  a minimal match: In the first parenthesis, we had to use <TT
713 CLASS="LITERAL"
714 >[^&#62;]*</TT
715 >
716  instead of <TT
717 CLASS="LITERAL"
718 >.*</TT
719 > to prevent the match from exceeding the 
720  &#60;body&#62; tag if it doesn't contain <SPAN
721 CLASS="QUOTE"
722 >"OnUnload"</SPAN
723 >, but the page's
724  content does.</P
725 ><P
726 > The last example is from the fun department:</P
727 ><P
728 > <TABLE
729 BORDER="0"
730 BGCOLOR="#E0E0E0"
731 WIDTH="100%"
732 ><TR
733 ><TD
734 ><PRE
735 CLASS="SCREEN"
736 >FILTER: fun Fun text replacements
737
738 # Spice the daily news:
739 #
740 s/microsoft(?!\.com)/MicroSuck/ig</PRE
741 ></TD
742 ></TR
743 ></TABLE
744 ></P
745 ><P
746 > Note the <TT
747 CLASS="LITERAL"
748 >(?!\.com)</TT
749 > part (a so-called negative lookahead)
750  in the job's pattern, which means: Don't match, if the string 
751  <SPAN
752 CLASS="QUOTE"
753 >".com"</SPAN
754 > appears directly following <SPAN
755 CLASS="QUOTE"
756 >"microsoft"</SPAN
757 >
758  in the page. This prevents links to microsoft.com from being trashed, while
759  still replacing the word everywhere else.</P
760 ><P
761 > <TABLE
762 BORDER="0"
763 BGCOLOR="#E0E0E0"
764 WIDTH="100%"
765 ><TR
766 ><TD
767 ><PRE
768 CLASS="SCREEN"
769 ># Buzzword Bingo (example for extended regex syntax)
770 #
771 s* industry[ -]leading \
772 |  cutting[ -]edge \
773 |  customer[ -]focused \
774 |  market[ -]driven \
775 |  award[ -]winning # Comments are OK, too! \
776 |  high[ -]performance \
777 |  solutions[ -]based \
778 |  unmatched \
779 |  unparalleled \
780 |  unrivalled \
781 *&#60;font color="red"&#62;&#60;b&#62;BINGO!&#60;/b&#62;&#60;/font&#62; \
782 *igx</PRE
783 ></TD
784 ></TR
785 ></TABLE
786 ></P
787 ><P
788 > The <TT
789 CLASS="LITERAL"
790 >x</TT
791 > option in this job turns on extended syntax, and allows for
792  e.g. the liberal use of (non-interpreted!) whitespace for nicer formatting. </P
793 ><P
794 > You get the idea?</P
795 ></DIV
796 ></DIV
797 ><DIV
798 CLASS="NAVFOOTER"
799 ><HR
800 ALIGN="LEFT"
801 WIDTH="100%"><TABLE
802 SUMMARY="Footer navigation table"
803 WIDTH="100%"
804 BORDER="0"
805 CELLPADDING="0"
806 CELLSPACING="0"
807 ><TR
808 ><TD
809 WIDTH="33%"
810 ALIGN="left"
811 VALIGN="top"
812 ><A
813 HREF="actions-file.html"
814 ACCESSKEY="P"
815 >Prev</A
816 ></TD
817 ><TD
818 WIDTH="34%"
819 ALIGN="center"
820 VALIGN="top"
821 ><A
822 HREF="index.html"
823 ACCESSKEY="H"
824 >Home</A
825 ></TD
826 ><TD
827 WIDTH="33%"
828 ALIGN="right"
829 VALIGN="top"
830 ><A
831 HREF="templates.html"
832 ACCESSKEY="N"
833 >Next</A
834 ></TD
835 ></TR
836 ><TR
837 ><TD
838 WIDTH="33%"
839 ALIGN="left"
840 VALIGN="top"
841 >Actions Files</TD
842 ><TD
843 WIDTH="34%"
844 ALIGN="center"
845 VALIGN="top"
846 >&nbsp;</TD
847 ><TD
848 WIDTH="33%"
849 ALIGN="right"
850 VALIGN="top"
851 >Templates</TD
852 ></TR
853 ></TABLE
854 ></DIV
855 ></BODY
856 ></HTML
857 >