1<?xml version="1.0" encoding="UTF-8"?>
2<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3<html xmlns="http://www.w3.org/1999/xhtml" lang="tr" xml:lang="tr"><head><!--
4        XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
5              This file is generated from xml source: DO NOT EDIT
6        XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
7      -->
8<title>Devingen Paylaşımlı Nesne Desteği - Apache HTTP Sunucusu</title>
9<link href="/style/css/manual.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet" />
10<link href="/style/css/manual-loose-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size" />
11<link href="/style/css/manual-print.css" rel="stylesheet" media="print" type="text/css" /><link rel="stylesheet" type="text/css" href="/style/css/prettify.css" />
12<script src="/style/scripts/prettify.js" type="text/javascript">
13</script>
14
15<link href="/images/favicon.ico" rel="shortcut icon" /></head>
16<body id="manual-page"><div id="page-header">
17<p class="menu"><a href="/mod/">Modüller</a> | <a href="/mod/directives.html">Yönergeler</a> | <a href="http://wiki.apache.org/httpd/FAQ">SSS</a> | <a href="/glossary.html">Terimler</a> | <a href="/sitemap.html">Site Haritası</a></p>
18<p class="apache">Apache HTTP Sunucusu Sürüm 2.2</p>
19<img alt="" src="/images/feather.gif" /></div>
20<div class="up"><a href="./"><img title="&lt;-" alt="&lt;-" src="/images/left.gif" /></a></div>
21<div id="path">
22<a href="http://www.apache.org/">Apache</a> &gt; <a href="http://httpd.apache.org/">HTTP Sunucusu</a> &gt; <a href="http://httpd.apache.org/docs/">Belgeleme</a> &gt; <a href="./">Sürüm 2.2</a></div><div id="page-content"><div id="preamble"><h1>Devingen Paylaşımlı Nesne Desteği</h1>
23<div class="toplang">
24<p><span>Mevcut Diller: </span><a href="/en/dso.html" hreflang="en" rel="alternate" title="English">&nbsp;en&nbsp;</a> |
25<a href="/ja/dso.html" hreflang="ja" rel="alternate" title="Japanese">&nbsp;ja&nbsp;</a> |
26<a href="/ko/dso.html" hreflang="ko" rel="alternate" title="Korean">&nbsp;ko&nbsp;</a> |
27<a href="/tr/dso.html" title="Türkçe">&nbsp;tr&nbsp;</a></p>
28</div>
29
30    <p>Apache HTTP Sunucusu modüler bir program olup, yönetici sadece bir
31      grup modül seçerek sunucuya işlevsellik ekleyebilir. Modüller sunucunun
32      derlenmesi sırasında doğrudan <code class="program"><a href="/programs/httpd.html">httpd</a></code> programının
33      içinde derlenebileceği gibi Devingen Paylaşımlı Nesneler (DSO - Dynamic
34      Shared Object) halinde <code class="program"><a href="/programs/httpd.html">httpd</a></code> programından ayrı
35      olarak da derlenebilir. DSO modülleri sunucunun derlenmesi sırasında
36      derlenebileceği gibi ayrı olarak derlenip daha sonra Apache Eklenti
37      Aracı (Apache Extension Tool) <code class="program"><a href="/programs/apxs.html">apxs</a></code> programı
38      kullanılarak sunucuya eklenebilir.</p>
39
40    <p>Bu belgede DSO modüllerinin kullanımının yanında teorisine de
41      değinilecektir.</p>
42  </div>
43<div id="quickview"><ul id="toc"><li><img alt="" src="/images/down.gif" /> <a href="#implementation">Gerçeklenim</a></li>
44<li><img alt="" src="/images/down.gif" /> <a href="#usage">Kullanıcı Özeti</a></li>
45<li><img alt="" src="/images/down.gif" /> <a href="#background">Artalan Bilgisi</a></li>
46<li><img alt="" src="/images/down.gif" /> <a href="#advantages">Getiriler ve Götürüler</a></li>
47</ul><ul class="seealso"><li><a href="#comments_section">Yorum</a></li></ul></div>
48<div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div>
49<div class="section">
50<h2><a name="implementation" id="implementation">Gerçeklenim</a></h2>
51
52<table class="related"><tr><th>İlgili Modüller</th><th>İlgili Yönergeler</th></tr><tr><td><ul><li><code class="module"><a href="/mod/mod_so.html">mod_so</a></code></li></ul></td><td><ul><li><code class="directive"><a href="/mod/mod_so.html#loadmodule">LoadModule</a></code></li></ul></td></tr></table>
53
54    <p>Apache modüllerini yüklemek için DSO desteği, Apache çekirdeğine
55      durağan olarak ilintilenerek derlenmiş olan <code class="module"><a href="/mod/mod_so.html">mod_so</a></code>
56      adında bir modül tarafından sağlanır. <code class="module"><a href="/mod/core.html">core</a></code> modülünden
57      başka, bir DSO modülü olamayan tek modül <code class="module"><a href="/mod/mod_so.html">mod_so</a></code>
58      modülüdür. Hemen hemen tüm diğer Apache modülleri <a href="install.html">kurulum belgesinde</a> de açıklandığı gibi
59      <code class="program"><a href="/programs/configure.html">configure</a></code> betiğinin
60      <code>--enable-<em>modül</em>=shared</code> seçeneği her modül için ayrı
61      ayrı belirtilerek birer DSO modülü olarak derlenebilir. Derlenmiş
62      modüller <code>mod_filanca.so</code> biçeminde birer DSO ismi alırlar ve
63      her biri istenirse <code>httpd.conf</code> dosyasında
64      <code class="module"><a href="/mod/mod_so.html">mod_so</a></code> modülünün <code class="directive"><a href="/mod/mod_so.html#loadmodule">LoadModule</a></code> yönergesiyle belirtilerek sunucu başlatılırken
65      veya yeniden başlatılırken sunucuya yüklenebilir.</p>
66
67    <p>Apache modülleri için (özellikle üçüncü parti modüller için) DSO
68      dosyası üretimini kolaylaştırmak amacıyla <code class="program"><a href="/programs/apxs.html">apxs</a></code>
69      (<dfn>APache eXtenSion</dfn>) adında yeni bir destek programı
70      kullanılmaktadır. Bu program Apache modüllerini Apache kaynak ağacından
71      ayrı olarak derlemek için kullanılabilir. Fikir basittir: Apache
72      derlenirken DSO dosyalarını derlemek için platforma bağımlı
73      derleyici ve ilintileyici seçenekleri <code class="program"><a href="/programs/apxs.html">apxs</a></code>
74      programının içine konur ve Apache’nin <code>make install</code> ile
75      kurulumu sırasında Apache C başlık dosyaları da kurulur. Böylece
76      kullanıcı Apache dağıtımının kaynak ağacına ihtiyaç duymadan ve
77      platforma bağımlı derleyici ve ilintileyici seçeneklerini bilmek zorunda
78      kalmadan istediği Apache modülünü <code class="program"><a href="/programs/apxs.html">apxs</a></code> programını
79      kullanarak derleyebilir.</p>
80</div><div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div>
81<div class="section">
82<h2><a name="usage" id="usage">Kullanıcı Özeti</a></h2>
83
84    <p>Apache 2.x’in DSO özelliklerine bir giriş olarak burada kısaca bir
85      bilgi vermekle yetinilecektir:</p>
86
87    <ol>
88      <li>Kaynak dosyası <code>mod_filanca.c</code> dosyasında dağıtılan bir
89        <em>özgün</em> Apache modülünü <code>mod_filanca.so</code> isminde bir
90        DSO modülü olarak derlemek ve kurmak için şöyle yapılır:
91
92<div class="example"><p><code>
93  $ /configure --prefix=/kurulum/yeri --enable-filanca=shared<br />
94  $ make install
95</code></p></div>
96      </li>
97
98      <li>Kaynak dosyası <code>mod_filanca.c</code> dosyasında dağıtılan bir
99        <em>üçüncü parti</em> Apache modülünü <code>mod_filanca.so</code>
100        isminde bir DSO modülü olarak derlemek ve kurmak için şöyle yapılır:
101
102<div class="example"><p><code>
103$ /configure --add-module=<var>modül-türü</var>:/bir/kurulum/yeri/mod_filanca.c \<br />
104<span class="indent">
105  --enable-filanca=shared<br />
106</span>
107$ make install
108</code></p></div>
109      </li>
110
111      <li>Paylaşımlı modülleri <em>sonradan kurmak için</em> Apache şöyle
112        yapılandırılır:
113
114<div class="example"><p><code>
115$ /configure --enable-so<br />
116$ make install
117</code></p></div>
118      </li>
119
120      <li>Kaynak dosyası <code>mod_filanca.c</code> dosyasında dağıtılan bir
121        <em>üçüncü parti</em> Apache modülü <code>mod_filanca.so</code>
122        isminde bir DSO modülü olarak Apache kaynak ağacının dışında
123        <code class="program"><a href="/programs/apxs.html">apxs</a></code> kullanarak derlemek ve kurmak için şöyle
124        yapılır:
125
126<div class="example"><p><code>
127$ cd /bir/kurulum/yeri<br />
128$ apxs -c mod_filanca.c<br />
129$ apxs -i -a -n filanca mod_filanca.la
130</code></p></div>
131      </li>
132    </ol>
133
134    <p>Tüm durumlarda derlenen paylaşımlı modülü Apache’nin etkin kılabilmesi
135      için <code>httpd.conf</code> dosyasında o modül için bir <code class="directive"><a href="/mod/mod_so.html#loadmodule">LoadModule</a></code> yönergesi bulunmalıdır.</p>
136</div><div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div>
137<div class="section">
138<h2><a name="background" id="background">Artalan Bilgisi</a></h2>
139
140    <p>Günümüzün Unix türevlerinde var olan şık bir mekanizma sayesinde
141      çalıştırılabilir bir programın adres uzayına çalışma anında yüklenmek
142      veya ilintilenmek üzere <em>Devingen Paylaşımlı Nesneler</em> (DSO -
143      Dynamic Shared Object) adı verilen, özel bir biçem kullanarak kodlanmış
144      program parçaları oluşturulabilir.</p>
145
146    <p>Bu yükleme normalde iki yolla yapılabilir: Ya çalıştırılabilir
147      programın başlatılması sırasında yüklenen <code>ld.so</code> adlı bir
148      sistem programınının devingen olarak yüklenmesi ile ya da
149      çalıştırılabilir programın içinden Unix yükleyicisine programsal sistem
150      arayüzü sağlayan <code>dlopen()/dlsym()</code> sistem çağrılarının elle
151      yapılması suretiyle.</p>
152
153    <p>İlk yöntemde kullanılan DSO’lara genelde <em>paylaşımlı
154      kütüphaneler</em> veya <em>DSO kütüphaneleri</em> adı verilir ve
155      bunların dosyaları <code>libfilanca.so</code> veya
156      <code>libfilanca.so.1.2</code> biçiminde isimlendirilir. Belli bir
157      sistem dizininde (normalde <code>/usr/lib</code>) bulunurlar ve derleme
158      sırasında ilintileyici komutuna <code>-lfilanca</code> şeklinde
159      belirtilerek çalıştırılabilir programla ilintilenirler. Doğrudan
160      çalıştırılabilir koda eklenen bu kodlar Unix yükleyicisinin programın
161      başlatılması sırasında kütüphaneyi <code>/usr/lib</code> altında
162      <code>libfilanca.so</code> adıyla bulabilmesini sağlar. Kütüphanelerin
163      aranacağı yerler ya <code>-R</code> gibi bir ilintileyici seçeneği ile
164      koda eklenir ya da arama yolları <code>LD_LIBRARY_PATH</code> ortam
165      değişkeni aracılığıyla yapılandırılır. Böylece çalıştırılabilir
166      programda henüz çözümlenmemiş simgeler DSO içinde bulunarak
167      çözümlenebilir.</p>
168
169    <p>Çalıştırılabilir program içindeki simgelere normalde DSO içinden
170      atıfta bulunulmaz (genel kod kütüphanesinin başka programlarca da
171      kullanılması nedeniyle). Bu bakımdan DSO tarafında böyle bir çözümleme
172      yapılmaz. Çalıştırılabilir program da DSO’daki simgeleri kendisi
173      çözümlemeye uğraşmaz, bu işlemlerden tamamen Unix yükleyicisi
174      (<code>ld.so</code>) sorumludur. (Aslında, <code>ld.so</code>’yu
175      çağıracak kod, her çalıştırılabilir programın içine ilintilenmiş
176      (durağan değil) başlatma kodunun bir parçasıdır.) Programlar tarafından
177      ortaklaşa kullanılan kütüphanelerin devingen olarak yüklenmesinin sebebi
178      basittir: Kütüphane kodu <code>libc.so</code> gibi bir sistem
179      kütüphanesine bir kere kaydedilip disk alanından yer kazanılmış
180      olur.</p>
181
182    <p>İkinci yöntemde kullanılan DSO’lara yine <em>paylaşımlı
183      kütüphaneler</em> veya <em>DSO kütüphaneleri</em> adı verilir fakat
184      bunların dosyaları geçerli kabule göre <code>filanca.so</code> gibi
185      isimlendirilse de genelde keyfi olarak seçilen bir dosya uzantısı
186      kullanılarak isimlendirilirler. Bu dosyalar genellikle programa özel bir
187      dizinde dururlar ve bu dosyaları kullanacak olan çalıştırılabilir
188      programla aralarında özdevimli olarak bağ kurulmamıştır. Bunun yerine,
189      çalıştırılabilir program DSO’yu çalışma anında <code>dlopen()</code>
190      sayesinde kendi adres uzayına ekler. Çalıştırılabilir program için
191      DSO’daki simgeler bu sırada çözümlenmez. Özdevimli olarak devreye
192      giren Unix yükleyicisi, (varsa) artakalan simgeleri, çalıştırılabilir
193      ihraç edilen simge kümelerini (ve özellikle her yerde hazır ve nazır
194      <code>libc.so</code> içindeki tüm simgeleri) kullanarak çözümler. Bu
195      yolla DSO, çalıştırılabilir programın simge kümesi bilgilerini sanki
196      kendisine baştan durağan olarak ilintilenmiş gibi ulaşabilir.</p>
197
198    <p>Son olarak, DSO’nun programlama arayüzünün getirilerinden yararlanmak
199      amacıyla çalıştırılabilir program, daha sonra dağıtım tabloları vb.
200      yerlerde kullanmak üzere <code>dlsym()</code> üzerinden DSO’daki belli
201      simgeleri çözümlemek zorundadır. Başka bir deyişle: Çalıştırılabilir
202      program ihtiyaç duyduğu her simgeyi kullanmak için kendisi çözümleme
203      yapmak zorundadır. Böyle bir mekanizmanın getirisi, programın isteğe
204      bağlı parçalarının gerekli olana kadar yüklenmemesidir (böylece daha az
205      bellek alanı kullanılır). Gerektiği zaman programın işlevselliğini
206      arttırmak amacıyla bu parçalar devingen olarak programa
207      yüklenebilir.</p>
208
209    <p>DSO mekanizmasının bu basit gibi görünen işleyişinde zorluk içeren bir
210      adım şudur (başkaları da olabilir): Bir programın işlevselliğini
211      genişletmek için DSO kullanılırken (ikinci yöntem) çalıştırılabilir
212      programdan DSO için simgelerin çözümlenmesi.  Zorluğun sebebi,
213      "tersine çözümleme" yapılmasıdır; çalıştırılabilir programın simge
214      kümesindeki DSO simgeleri kütüphane tasarımına aykırı bir şekilde
215      çözümlenir ve bu uygulama tüm platformlarda hazır olarak
216      desteklenmediği gibi standartlaşmış da değildir. Geçer uygulamada
217      çalıştırılabilir programın evrensel simgeleri çoğunlukla yeniden dışa
218      verilmez ve bu bakımdan bir DSO içinde kullanılmaları uygun değildir.
219      Esas sorun, çalıştırılabilir bir programın işlevselliğini çalışma
220      anında genişletmek için DSO kullanımı sırasında ilintileyicinin tüm
221      evrensel simgeleri dışa vermesini zorlamanın bir yolunu bulmaktır.</p>
222
223    <p>Paylaşımlı kütüphane yaklaşımı bu bakımdan türünün tek örneğidir,
224      çünkü DSO mekanizması özellikle bunun için tasarlanmıştır, dolayısıyla
225      işletim sisteminin sağladığı hemen hemen tüm kütüphaneler için
226      kullanılabilir. Diğer taraftan, bir programın işlevselliğini
227      genişletmek için paylaşımlı nesne kullanımı çoğu program tarafından
228      kullanılan bir şey değildir.</p>
229
230    <p>1998 itibariyle, DSO nesneleriyle çalışma anında çalıştırılabilir
231      program işlevselliğini genişleten başlıca birkaç yazılım paketi vardır:
232      Perl 5 (XS mekanizması ve DynaLoader modülü üzerinden), Netscape
233      Sunucusu, vd. 1.3 sürümünden itibaren Apache de bu gruba katıldı. Çünkü
234      Apache, modül kavramını zaten program işlevselliğini genişletmek için
235      kullanıyordu ve temel işlevselliğine dış modülleri ilintilemek için
236      dahili olarak dağıtım listesine dayalı bir yaklaşım kullanmaktaydı.
237      Dolayısıyla Apache, modüllerini çalışma anında yüklemek için DSO
238      kullanmaya baştan yazgılıydı.</p>
239</div><div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div>
240<div class="section">
241<h2><a name="advantages" id="advantages">Getiriler ve Götürüler</a></h2>
242
243    <p>Yukarıda bahsedilen DSO’ya dayalı özelliklerin getirileri
244      şunlardır:</p>
245
246    <ul>
247      <li>Sunucu paketi çalışma anında daha esnektir çünkü, asıl sunucuyu
248        oluşturan parçalar derleme sırasında <code class="program"><a href="/programs/configure.html">configure</a></code>
249        seçenekleriyle birleştirilmek yerine <code>httpd.conf</code> içinde
250        <code class="directive"><a href="/mod/mod_so.html#loadmodule">LoadModule</a></code> yönergeleri
251        sayesinde çalışma anında birleştirilebilmektedir. Bu yolla, örneğin
252        tek bir Apache kurulumuyla birbirinden farklı yapılandırmalara sahip
253        çok sayıda sunucu çalıştırmak mümkündür. (standart veya SSL sürümü;
254        basitleştirilmiş veya güçlendirilmiş sürümü [mod_perl, PHP3],
255        vs.)</li>
256
257      <li>Sunucu paketi kurulumdan sonra bile üçüncü parti modüllerle kolayca
258        genişletilebilir. Bu özellikle, bir Apache temel paketinin yanında
259        PHP3, mod_perl, mod_fastcgi gibi ek paketler oluşturan paket
260        dağıtıcılarına büyük yarar sağlar.</li>
261
262      <li>Yeni Apache modülleri için daha kolay prototip geliştirilebilir:
263        Modül kaynak kodunu DSO/<code class="program"><a href="/programs/apxs.html">apxs</a></code> çifti sayesinde
264        Apache kaynak ağacının dışında derleyip modülün yeni bir sürümünü bir
265        <code>apxs -i</code> komutunun ardından <code>apachectl
266        restart</code> yaparak çalışan bir Apache sunucusunda denemek daha
267        kolay hale getirilmiştir.</li>
268    </ul>
269
270    <p>DSO kullanımının götürüleri ise şunlardır:</p>
271
272    <ul>
273      <li>Her platformda hazır olarak desteklenmeme: Tüm işletim sistemleri
274        bir programa devingen olarak kod yükleme becerisine sahip
275        olmadığından DSO mekanizması her platformda kullanılamaz.</li>
276
277      <li>İlk yüklemede %20 yavaşlama: Unix yükleyicisi simgeleri çözümlemek
278        zorunda olduğundan sunucu ilk başlatılırken yaklaşık %20 daha yavaş
279        faaliyete geçer.</li>
280
281      <li>Çalışma sırasında % 5 yavaşlama: Konumdan bağımsız kodun (PIC -
282        Position Independent Code) göreli adresleme için karmaşık oyunlara
283        girmesi ve bunun mutlak adresleme kadar hızlı olmaması nedeniyle
284        sunucu bazı platformlarda çalışma anında yaklaşık %5 daha yavaş
285        çalışabilir.</li>
286
287      <li>DSO'nun tüm modüller için uygun olmaması: DSO modülleri bazı
288        platformlarda diğer DSO temelli kütüphanelerle ilintilenemediğinden
289        (<code>ld -lfilanca</code>) DSO mekanizmasını tüm modül türleri için
290        kullanamazsınız (örneğin a.out temelli platformlar bu işlevselliği
291        ELF temelli platformlar kadar iyi sağlamaz). Başka bir deyişle, DSO
292        dosyaları olarak derlenmiş modüllerin kullanabileceği simgeler ya
293        Apache temel kodunda vardır ya Apache temel kodunun kullandığı C
294        kütüphanesinde (<code>libc</code>) ve diğer durağan ve devingen
295        kütüphanelerde vardır ya da konumdan bağımsız kodu içeren
296        durağan kütüphane arşivlerinde (<code>libfilanca.a</code>)
297        vardır. Diğer modülleri kullanmak için tek şansınız ya Apache
298        çekirdeğinin modüle bir atıf içermesini sağlamak ya da modül kodunu
299        <code>dlopen()</code> vasıtasıyla yüklemektir.</li>
300    </ul>
301
302</div></div>
303<div class="bottomlang">
304<p><span>Mevcut Diller: </span><a href="/en/dso.html" hreflang="en" rel="alternate" title="English">&nbsp;en&nbsp;</a> |
305<a href="/ja/dso.html" hreflang="ja" rel="alternate" title="Japanese">&nbsp;ja&nbsp;</a> |
306<a href="/ko/dso.html" hreflang="ko" rel="alternate" title="Korean">&nbsp;ko&nbsp;</a> |
307<a href="/tr/dso.html" title="Türkçe">&nbsp;tr&nbsp;</a></p>
308</div><div class="top"><a href="#page-header"><img src="/images/up.gif" alt="top" /></a></div><div class="section"><h2><a id="comments_section" name="comments_section">Yorum</a></h2><div class="warning"><strong>Notice:</strong><br />This is not a Q&amp;A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed again by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Freenode, or sent to our <a href="http://httpd.apache.org/lists.html">mailing lists</a>.</div>
309<script type="text/javascript"><!--//--><![CDATA[//><!--
310var comments_shortname = 'httpd';
311var comments_identifier = 'http://httpd.apache.org/docs/2.2/dso.html';
312(function(w, d) {
313    if (w.location.hostname.toLowerCase() == "httpd.apache.org") {
314        d.write('<div id="comments_thread"><\/div>');
315        var s = d.createElement('script');
316        s.type = 'text/javascript';
317        s.async = true;
318        s.src = 'https://comments.apache.org/show_comments.lua?site=' + comments_shortname + '&page=' + comments_identifier;
319        (d.getElementsByTagName('head')[0] || d.getElementsByTagName('body')[0]).appendChild(s);
320    }
321    else { 
322        d.write('<div id="comments_thread">Comments are disabled for this page at the moment.<\/div>');
323    }
324})(window, document);
325//--><!]]></script></div><div id="footer">
326<p class="apache">Copyright 2013 The Apache Software Foundation.<br /><a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a> altında lisanslıdır.</p>
327<p class="menu"><a href="/mod/">Modüller</a> | <a href="/mod/directives.html">Yönergeler</a> | <a href="http://wiki.apache.org/httpd/FAQ">SSS</a> | <a href="/glossary.html">Terimler</a> | <a href="/sitemap.html">Site Haritası</a></p></div><script type="text/javascript"><!--//--><![CDATA[//><!--
328if (typeof(prettyPrint) !== 'undefined') {
329    prettyPrint();
330}
331//--><!]]></script>
332</body></html>