Update Android build docs.
[luajit-2.0.git] / doc / install.html
blob98778d8f615da2a9e2e3e386870e80671cde6c70
1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
2 <html>
3 <head>
4 <title>Installation</title>
5 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
6 <meta name="Copyright" content="Copyright (C) 2005-2021">
7 <meta name="Language" content="en">
8 <link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">
9 <link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">
10 <style type="text/css">
11 table.compat {
12 line-height: 1.2;
13 font-size: 80%;
15 table.compat td {
16 border: 1px solid #bfcfff;
17 height: 2.5em;
19 table.compat tr.compathead td {
20 font-weight: bold;
21 border-bottom: 2px solid #bfcfff;
23 tr.compathead td.compatos {
24 vertical-align: top;
26 table.compat td.compatcpu {
27 width: 18%;
28 border-right: 2px solid #bfcfff;
30 td.compatos {
31 width: 21%;
32 vertical-align: middle;
34 td.compatno {
35 background-color: #d0d0d0;
37 </style>
38 </head>
39 <body>
40 <div id="site">
41 <a href="https://luajit.org"><span>Lua<span id="logo">JIT</span></span></a>
42 </div>
43 <div id="head">
44 <h1>Installation</h1>
45 </div>
46 <div id="nav">
47 <ul><li>
48 <a href="luajit.html">LuaJIT</a>
49 <ul><li>
50 <a href="https://luajit.org/download.html">Download <span class="ext">&raquo;</span></a>
51 </li><li>
52 <a class="current" href="install.html">Installation</a>
53 </li><li>
54 <a href="running.html">Running</a>
55 </li></ul>
56 </li><li>
57 <a href="extensions.html">Extensions</a>
58 <ul><li>
59 <a href="ext_ffi.html">FFI Library</a>
60 <ul><li>
61 <a href="ext_ffi_tutorial.html">FFI Tutorial</a>
62 </li><li>
63 <a href="ext_ffi_api.html">ffi.* API</a>
64 </li><li>
65 <a href="ext_ffi_semantics.html">FFI Semantics</a>
66 </li></ul>
67 </li><li>
68 <a href="ext_jit.html">jit.* Library</a>
69 </li><li>
70 <a href="ext_c_api.html">Lua/C API</a>
71 </li></ul>
72 </li><li>
73 <a href="status.html">Status</a>
74 </li><li>
75 <a href="faq.html">FAQ</a>
76 </li><li>
77 <a href="http://wiki.luajit.org/">Wiki <span class="ext">&raquo;</span></a>
78 </li><li>
79 <a href="https://luajit.org/list.html">Mailing List <span class="ext">&raquo;</span></a>
80 </li></ul>
81 </div>
82 <div id="main">
83 <p>
84 LuaJIT is only distributed as a source package. This page explains
85 how to build and install LuaJIT with different operating systems
86 and C&nbsp;compilers.
87 </p>
88 <p>
89 For the impatient (on POSIX systems):
90 </p>
91 <pre class="code">
92 make &amp;&amp; sudo make install
93 </pre>
94 <p>
95 LuaJIT currently builds out-of-the box on most systems.
96 Here's the compatibility matrix for the supported combinations of
97 operating systems, CPUs and compilers:
98 </p>
99 <table class="compat">
100 <tr class="compathead">
101 <td class="compatcpu">CPU / OS</td>
102 <td class="compatos"><a href="#posix">Linux</a> or<br><a href="#android">Android</a></td>
103 <td class="compatos"><a href="#posix">*BSD, Other</a></td>
104 <td class="compatos"><a href="#posix">macOS 10.4+</a> or<br><a href="#ios">iOS 3.0+</a></td>
105 <td class="compatos"><a href="#windows">Windows XP<br>or later</a></td>
106 </tr>
107 <tr class="odd separate">
108 <td class="compatcpu">x86 (32 bit)</td>
109 <td class="compatos">GCC 4.x+<br>GCC 3.4</td>
110 <td class="compatos">GCC 4.x+<br>GCC 3.4</td>
111 <td class="compatos">XCode 5.0+<br>Clang</td>
112 <td class="compatos">MSVC<br>MinGW, Cygwin</td>
113 </tr>
114 <tr class="even">
115 <td class="compatcpu">x64 (64 bit)</td>
116 <td class="compatos">GCC 4.x+</td>
117 <td class="compatos">ORBIS (<a href="#ps4">PS4</a>)</td>
118 <td class="compatos">XCode 5.0+<br>Clang</td>
119 <td class="compatos">MSVC</td>
120 </tr>
121 <tr class="odd">
122 <td class="compatcpu"><a href="#cross2">ARMv5+<br>ARM9E+</a></td>
123 <td class="compatos">GCC 4.2+</td>
124 <td class="compatos">GCC 4.2+<br>PSP2 (<a href="#psvita">PS VITA</a>)</td>
125 <td class="compatos">XCode 5.0+<br>Clang</td>
126 <td class="compatos compatno">&nbsp;</td>
127 </tr>
128 <tr class="even">
129 <td class="compatcpu"><a href="#cross2">PPC</a></td>
130 <td class="compatos">GCC 4.3+</td>
131 <td class="compatos">GCC 4.3+<br>GCC 4.1 (<a href="#ps3">PS3</a>)</td>
132 <td class="compatos compatno">&nbsp;</td>
133 <td class="compatos">XEDK (<a href="#xbox360">Xbox 360</a>)</td>
134 </tr>
135 <tr class="odd">
136 <td class="compatcpu"><a href="#cross2">PPC/e500v2</a></td>
137 <td class="compatos">GCC 4.3+</td>
138 <td class="compatos">GCC 4.3+</td>
139 <td class="compatos compatno">&nbsp;</td>
140 <td class="compatos compatno">&nbsp;</td>
141 </tr>
142 <tr class="even">
143 <td class="compatcpu"><a href="#cross2">MIPS</a></td>
144 <td class="compatos">GCC 4.3+</td>
145 <td class="compatos">GCC 4.3+</td>
146 <td class="compatos compatno">&nbsp;</td>
147 <td class="compatos compatno">&nbsp;</td>
148 </tr>
149 </table>
151 <h2>Configuring LuaJIT</h2>
153 The standard configuration should work fine for most installations.
154 Usually there is no need to tweak the settings. The following files
155 hold all user-configurable settings:
156 </p>
157 <ul>
158 <li><tt>src/luaconf.h</tt> sets some configuration variables.</li>
159 <li><tt>Makefile</tt> has settings for <b>installing</b> LuaJIT (POSIX
160 only).</li>
161 <li><tt>src/Makefile</tt> has settings for <b>compiling</b> LuaJIT
162 under POSIX, MinGW or Cygwin.</li>
163 <li><tt>src/msvcbuild.bat</tt> has settings for compiling LuaJIT with
164 MSVC (Visual Studio).</li>
165 </ul>
167 Please read the instructions given in these files, before changing
168 any settings.
169 </p>
171 <h2 id="posix">POSIX Systems (Linux, macOS, *BSD etc.)</h2>
172 <h3>Prerequisites</h3>
174 Depending on your distribution, you may need to install a package for
175 GCC, the development headers and/or a complete SDK. E.g. on a current
176 Debian/Ubuntu, install <tt>libc6-dev</tt> with the package manager.
177 </p>
179 The recommended way to fetch the latest version is to do a pull from
180 the git repository.
181 </p>
183 Alternatively download the latest source package of LuaJIT (pick the .tar.gz).
184 Move it to a directory of your choice, open a terminal window and change
185 to this directory. Now unpack the archive and change to the newly created
186 directory (replace XX.YY.ZZ with the version you downloaded):
187 </p>
188 <pre class="code">
189 tar zxf LuaJIT-XX.YY.ZZ.tar.gz
190 cd LuaJIT-XX.YY.ZZ
191 </pre>
192 <h3>Building LuaJIT</h3>
194 The supplied Makefiles try to auto-detect the settings needed for your
195 operating system and your compiler. They need to be run with GNU Make,
196 which is probably the default on your system, anyway. Simply run:
197 </p>
198 <pre class="code">
199 make
200 </pre>
202 This always builds a native x86, x64 or PPC binary, depending on the host OS
203 you're running this command on. Check the section on
204 <a href="#cross">cross-compilation</a> for more options.
205 </p>
207 By default, modules are only searched under the prefix <tt>/usr/local</tt>.
208 You can add an extra prefix to the search paths by appending the
209 <tt>PREFIX</tt> option, e.g.:
210 </p>
211 <pre class="code">
212 make PREFIX=/home/myself/lj2
213 </pre>
215 Note for macOS: you <b>must</b> set the <tt>MACOSX_DEPLOYMENT_TARGET</tt>
216 environment variable to a value supported by your toolchain:
217 </p>
218 <pre class="code">
219 MACOSX_DEPLOYMENT_TARGET=XX.YY make
220 </pre>
221 <h3>Installing LuaJIT</h3>
223 The top-level Makefile installs LuaJIT by default under
224 <tt>/usr/local</tt>, i.e. the executable ends up in
225 <tt>/usr/local/bin</tt> and so on. You need root privileges
226 to write to this path. So, assuming sudo is installed on your system,
227 run the following command and enter your sudo password:
228 </p>
229 <pre class="code">
230 sudo make install
231 </pre>
233 Otherwise specify the directory prefix as an absolute path, e.g.:
234 </p>
235 <pre class="code">
236 make install PREFIX=/home/myself/lj2
237 </pre>
239 Obviously the prefixes given during build and installation need to be the same.
240 </p>
242 <h2 id="windows">Windows Systems</h2>
243 <h3>Prerequisites</h3>
245 Either install one of the open source SDKs
246 (<a href="http://mingw.org/"><span class="ext">&raquo;</span>&nbsp;MinGW</a> or
247 <a href="https://www.cygwin.com/"><span class="ext">&raquo;</span>&nbsp;Cygwin</a>), which come with a modified
248 GCC plus the required development headers.
249 Or install Microsoft's Visual Studio (MSVC).
250 </p>
252 Next, pull from the git repository or download the source package and
253 unpack it using an archive manager (e.g. the Windows Explorer) to
254 a directory of your choice.
255 </p>
256 <h3>Building with MSVC</h3>
258 Open a "Visual Studio Command Prompt" (either x86 or x64), <tt>cd</tt> to the
259 directory where you've unpacked the sources and run these commands:
260 </p>
261 <pre class="code">
262 cd src
263 msvcbuild
264 </pre>
266 Check the <tt>msvcbuild.bat</tt> file for more options.
267 Then follow the installation instructions below.
268 </p>
269 <h3>Building with MinGW or Cygwin</h3>
271 Open a command prompt window and make sure the MinGW or Cygwin programs
272 are in your path. Then <tt>cd</tt> to the directory of the git repository
273 or where you've unpacked the sources. Then run this command for MinGW:
274 </p>
275 <pre class="code">
276 mingw32-make
277 </pre>
279 Or this command for Cygwin:
280 </p>
281 <pre class="code">
282 make
283 </pre>
285 Then follow the installation instructions below.
286 </p>
287 <h3>Installing LuaJIT</h3>
289 Copy <tt>luajit.exe</tt> and <tt>lua51.dll</tt> (built in the <tt>src</tt>
290 directory) to a newly created directory (any location is ok).
291 Add <tt>lua</tt> and <tt>lua\jit</tt> directories below it and copy
292 all Lua files from the <tt>src\jit</tt> directory of the distribution
293 to the latter directory.
294 </p>
296 There are no hardcoded
297 absolute path names &mdash; all modules are loaded relative to the
298 directory where <tt>luajit.exe</tt> is installed
299 (see <tt>src/luaconf.h</tt>).
300 </p>
302 <h2 id="cross">Cross-compiling LuaJIT</h2>
304 The GNU Makefile-based build system allows cross-compiling on any host
305 for any supported target, as long as both architectures have the same
306 pointer size. If you want to cross-compile to any 32 bit target on an
307 x64 OS, you need to install the multilib development package (e.g.
308 <tt>libc6-dev-i386</tt> on Debian/Ubuntu) and build a 32 bit host part
309 (<tt>HOST_CC="gcc -m32"</tt>).
310 </p>
312 You need to specify <tt>TARGET_SYS</tt> whenever the host OS and the
313 target OS differ, or you'll get assembler or linker errors. E.g. if
314 you're compiling on a Windows or macOS host for embedded Linux or Android,
315 you need to add <tt>TARGET_SYS=Linux</tt> to the examples below. For a
316 minimal target OS, you may need to disable the built-in allocator in
317 <tt>src/Makefile</tt> and use <tt>TARGET_SYS=Other</tt>. Don't forget to
318 specify the same <tt>TARGET_SYS</tt> for the install step, too.
319 </p>
321 The examples below only show some popular targets &mdash; please check
322 the comments in <tt>src/Makefile</tt> for more details.
323 </p>
324 <pre class="code">
325 # Cross-compile to a 32 bit binary on a multilib x64 OS
326 make CC="gcc -m32"
328 # Cross-compile on Debian/Ubuntu for Windows (mingw32 package)
329 make HOST_CC="gcc -m32" CROSS=i586-mingw32msvc- TARGET_SYS=Windows
330 </pre>
331 <p id="cross2">
332 The <tt>CROSS</tt> prefix allows specifying a standard GNU cross-compile
333 toolchain (Binutils, GCC and a matching libc). The prefix may vary
334 depending on the <tt>--target</tt> the toolchain was built for (note the
335 <tt>CROSS</tt> prefix has a trailing <tt>"-"</tt>). The examples below
336 use the canonical toolchain triplets for Linux.
337 </p>
339 Since there's often no easy way to detect CPU features at runtime, it's
340 important to compile with the proper CPU or architecture settings. You
341 can specify these when building the toolchain yourself. Or add
342 <tt>-mcpu=...</tt> or <tt>-march=...</tt> to <tt>TARGET_CFLAGS</tt>. For
343 ARM it's important to have the correct <tt>-mfloat-abi=...</tt> setting,
344 too. Otherwise LuaJIT may not run at the full performance of your target
345 CPU.
346 </p>
347 <pre class="code">
348 # ARM soft-float
349 make HOST_CC="gcc -m32" CROSS=arm-linux-gnueabi- \
350 TARGET_CFLAGS="-mfloat-abi=soft"
352 # ARM soft-float ABI with VFP (example for Cortex-A8)
353 make HOST_CC="gcc -m32" CROSS=arm-linux-gnueabi- \
354 TARGET_CFLAGS="-mcpu=cortex-a8 -mfloat-abi=softfp"
356 # ARM hard-float ABI with VFP (armhf, requires recent toolchain)
357 make HOST_CC="gcc -m32" CROSS=arm-linux-gnueabihf-
359 # PPC
360 make HOST_CC="gcc -m32" CROSS=powerpc-linux-gnu-
361 # PPC/e500v2 (fast interpreter only)
362 make HOST_CC="gcc -m32" CROSS=powerpc-e500v2-linux-gnuspe-
364 # MIPS big-endian
365 make HOST_CC="gcc -m32" CROSS=mips-linux-
366 # MIPS little-endian
367 make HOST_CC="gcc -m32" CROSS=mipsel-linux-
368 </pre>
370 You can cross-compile for <b id="android">Android</b> using the <a href="https://developer.android.com/ndk/"><span class="ext">&raquo;</span>&nbsp;Android NDK</a>.
371 Please adapt the environment variables to match the install locations and the
372 desired target platform. E.g. Android&nbsp;4.1 corresponds to ABI level&nbsp;16.
373 </p>
374 <pre class="code">
375 # Android/ARM, armeabi-v7a (ARMv7 VFP), Android 4.1+ (JB)
377 NDKDIR=/opt/android/ndk
378 NDKBIN=$NDKDIR/toolchains/llvm/prebuilt/linux-x86_64/bin
379 NDKCROSS=$NDKBIN/arm-linux-androideabi-
380 NDKCC=$NDKBIN/armv7a-linux-androideabi16-clang
381 make HOST_CC="gcc -m32" CROSS=$NDKCROSS \
382 STATIC_CC=$NDKCC DYNAMIC_CC="$NDKCC -fPIC" \
383 TARGET_LD=$NDKCC TARGET_AR=$NDKBIN/llvm-ar
384 TARGET_STRIP=$NDKBIN/llvm-strip
385 </pre>
387 Please use the LuaJIT 2.1 branch to compile for
388 <b id="ios">iOS</b> (iPhone/iPad).
389 </p>
391 <h3 id="consoles">Cross-compiling for consoles</h3>
393 Building LuaJIT for consoles requires both a supported host compiler
394 (x86 or x64) and a cross-compiler (to PPC or ARM) from the official
395 console SDK.
396 </p>
398 Due to restrictions on consoles, the JIT compiler is disabled and only
399 the fast interpreter is built. This is still faster than plain Lua,
400 but much slower than the JIT compiler. The FFI is disabled, too, since
401 it's not very useful in such an environment.
402 </p>
404 The following commands build a static library <tt>libluajit.a</tt>,
405 which can be linked against your game, just like the Lua library.
406 </p>
408 To cross-compile for <b id="ps3">PS3</b> from a Linux host (requires
409 32&nbsp;bit GCC, i.e. multilib Linux/x64) or a Windows host (requires
410 32&nbsp;bit MinGW), run this command:
411 </p>
412 <pre class="code">
413 make HOST_CC="gcc -m32" CROSS=ppu-lv2-
414 </pre>
416 To cross-compile for <b id="ps4">PS4</b> from a Windows host,
417 open a "Visual Studio .NET Command Prompt" (64&nbsp;bit host compiler),
418 <tt>cd</tt> to the directory where you've unpacked the sources and
419 run the following commands:
420 </p>
421 <pre class="code">
422 cd src
423 ps4build
424 </pre>
426 To cross-compile for <b id="psvita">PS Vita</b> from a Windows host,
427 open a "Visual Studio .NET Command Prompt" (32&nbsp;bit host compiler),
428 <tt>cd</tt> to the directory where you've unpacked the sources and
429 run the following commands:
430 </p>
431 <pre class="code">
432 cd src
433 psvitabuild
434 </pre>
436 To cross-compile for <b id="xbox360">Xbox 360</b> from a Windows host,
437 open a "Visual Studio .NET Command Prompt" (32&nbsp;bit host compiler),
438 <tt>cd</tt> to the directory where you've unpacked the sources and run
439 the following commands:
440 </p>
441 <pre class="code">
442 cd src
443 xedkbuild
444 </pre>
446 <h2 id="embed">Embedding LuaJIT</h2>
448 LuaJIT is API-compatible with Lua 5.1. If you've already embedded Lua
449 into your application, you probably don't need to do anything to switch
450 to LuaJIT, except link with a different library:
451 </p>
452 <ul>
453 <li>It's strongly suggested to build LuaJIT separately using the supplied
454 build system. Please do <em>not</em> attempt to integrate the individual
455 source files into your build tree. You'll most likely get the internal build
456 dependencies wrong or mess up the compiler flags. Treat LuaJIT like any
457 other external library and link your application with either the dynamic
458 or static library, depending on your needs.</li>
459 <li>If you want to load C modules compiled for plain Lua
460 with <tt>require()</tt>, you need to make sure the public symbols
461 (e.g. <tt>lua_pushnumber</tt>) are exported, too:
462 <ul><li>On POSIX systems you can either link to the shared library
463 or link the static library into your application. In the latter case
464 you'll need to export all public symbols from your main executable
465 (e.g. <tt>-Wl,-E</tt> on Linux) and add the external dependencies
466 (e.g. <tt>-lm -ldl</tt> on Linux).</li>
467 <li>Since Windows symbols are bound to a specific DLL name, you need to
468 link to the <tt>lua51.dll</tt> created by the LuaJIT build (do not rename
469 the DLL). You may link LuaJIT statically on Windows only if you don't
470 intend to load Lua/C modules at runtime.
471 </li></ul>
472 </li>
473 <li>
474 <i>Important: this relates to LuaJIT 2.0 only &mdash; use LuaJIT 2.1 to
475 avoid these complications.</i><br>
476 If you're building a 64 bit application on macOS which links directly or
477 indirectly against LuaJIT, you need to link your main executable
478 with these flags:
479 <pre class="code">
480 -pagezero_size 10000 -image_base 100000000
481 </pre>
482 </li>
483 </ul>
484 <p>Additional hints for initializing LuaJIT using the C API functions:</p>
485 <ul>
486 <li>Here's a
487 <a href="http://lua-users.org/wiki/SimpleLuaApiExample"><span class="ext">&raquo;</span>&nbsp;simple example</a>
488 for embedding Lua or LuaJIT into your application.</li>
489 <li>Make sure you use <tt>luaL_newstate</tt>. Avoid using
490 <tt>lua_newstate</tt>, since this uses the (slower) default memory
491 allocator from your system (no support for this on 64&nbsp;bit architectures).</li>
492 <li>Make sure you use <tt>luaL_openlibs</tt> and not the old Lua 5.0 style
493 of calling <tt>luaopen_base</tt> etc. directly.</li>
494 <li>To change or extend the list of standard libraries to load, copy
495 <tt>src/lib_init.c</tt> to your project and modify it accordingly.
496 Make sure the <tt>jit</tt> library is loaded or the JIT compiler
497 will not be activated.</li>
498 <li>The <tt>bit.*</tt> module for bitwise operations
499 is already built-in. There's no need to statically link
500 <a href="https://bitop.luajit.org/"><span class="ext">&raquo;</span>&nbsp;Lua BitOp</a> to your application.</li>
501 </ul>
503 <h2 id="distro">Hints for Distribution Maintainers</h2>
505 The LuaJIT build system has extra provisions for the needs of most
506 POSIX-based distributions. If you're a package maintainer for
507 a distribution, <em>please</em> make use of these features and
508 avoid patching, subverting, autotoolizing or messing up the build system
509 in unspeakable ways.
510 </p>
512 There should be absolutely no need to patch <tt>luaconf.h</tt> or any
513 of the Makefiles. And please do not hand-pick files for your packages &mdash;
514 simply use whatever <tt>make install</tt> creates. There's a reason
515 for all of the files <em>and</em> directories it creates.
516 </p>
518 The build system uses GNU make and auto-detects most settings based on
519 the host you're building it on. This should work fine for native builds,
520 even when sandboxed. You may need to pass some of the following flags to
521 <em>both</em> the <tt>make</tt> and the <tt>make install</tt> command lines
522 for a regular distribution build:
523 </p>
524 <ul>
525 <li><tt>PREFIX</tt> overrides the installation path and should usually
526 be set to <tt>/usr</tt>. Setting this also changes the module paths and
527 the paths needed to locate the shared library.</li>
528 <li><tt>DESTDIR</tt> is an absolute path which allows you to install
529 to a shadow tree instead of the root tree of the build system.</li>
530 <li><tt>MULTILIB</tt> sets the architecture-specific library path component
531 for multilib systems. The default is <tt>lib</tt>.</li>
532 <li>Have a look at the top-level <tt>Makefile</tt> and <tt>src/Makefile</tt>
533 for additional variables to tweak. The following variables <em>may</em> be
534 overridden, but it's <em>not</em> recommended, except for special needs
535 like cross-builds:
536 <tt>BUILDMODE, CC, HOST_CC, STATIC_CC, DYNAMIC_CC, CFLAGS, HOST_CFLAGS,
537 TARGET_CFLAGS, LDFLAGS, HOST_LDFLAGS, TARGET_LDFLAGS, TARGET_SHLDFLAGS,
538 TARGET_FLAGS, LIBS, HOST_LIBS, TARGET_LIBS, CROSS, HOST_SYS, TARGET_SYS
539 </tt></li>
540 </ul>
542 The build system has a special target for an amalgamated build, i.e.
543 <tt>make amalg</tt>. This compiles the LuaJIT core as one huge C file
544 and allows GCC to generate faster and shorter code. Alas, this requires
545 lots of memory during the build. This may be a problem for some users,
546 that's why it's not enabled by default. But it shouldn't be a problem for
547 most build farms. It's recommended that binary distributions use this
548 target for their LuaJIT builds.
549 </p>
551 The tl;dr version of the above:
552 </p>
553 <pre class="code">
554 make amalg PREFIX=/usr && \
555 make install PREFIX=/usr DESTDIR=/tmp/buildroot
556 </pre>
558 Finally, if you encounter any difficulties, please
559 <a href="contact.html">contact me</a> first, instead of releasing a broken
560 package onto unsuspecting users. Because they'll usually gonna complain
561 to me (the upstream) and not you (the package maintainer), anyway.
562 </p>
563 <br class="flush">
564 </div>
565 <div id="foot">
566 <hr class="hide">
567 Copyright &copy; 2005-2021
568 <span class="noprint">
569 &middot;
570 <a href="contact.html">Contact</a>
571 </span>
572 </div>
573 </body>
574 </html>