Date: Thu Apr 18 15:03:54 CEST 2002
User: Derick Rethans
Directory: srmdoc/user
Log Message:
[5.00]
- doc update
Modified files:
srmdoc/Makefile.in (version: 1.6)
srmdoc/global.ent (version: 1.4)
srmdoc/manual.xml (version: 1.13)
srmdoc/admin/compiling.xml (version: 1.5)
srmdoc/admin/installation.xml (version: 1.8)
srmdoc/dbxml/dbpoolx.mod (version: 1.3)
srmdoc/user/classes.xml (version: 1.8)
srmdoc/user/mod_standard.xml (version: 1.3)
Added files:
srmdoc/article.dsl (new version: 1.1)
srmdoc/articles/php-almanac-2002.xml (new version: 1.1)
srmdoc/docs/interview-derick.pdf (new version: 1.1)
srmdoc/docs/interview-srm.pdf (new version: 1.1)
srmdoc/figures/srm-protocol.png (new version: 1.1)
srmdoc/user/mod_sapi.xml (new version: 1.1)
[FILE: /srmdoc/article.dsl]
<!DOCTYPE style-sheet PUBLIC "-//James Clark//DTD DSSSL Style Sheet//EN" [
<!ENTITY docbook.dsl SYSTEM "/usr/share/sgml/docbook/dsssl-stylesheets-1.59//html/docbook.dsl" CDATA DSSSL>
<!ENTITY html-common.dsl SYSTEM "./html-common.dsl">
<!ENTITY common.dsl SYSTEM "common.dsl">
<!ENTITY version.dsl SYSTEM "./version.dsl">
]>
<!--
$Id: cvstemp,v 1.1 2002/04/18 13:03:49 derick Exp $
HTML-specific stylesheet customization for use by the online manual.
-->
<style-sheet>
<style-specification id="docbook-php-website" use="docbook">
<style-specification-body>
(declare-flow-object-class processing-instruction
"UNREGISTERED::James Clark//Flow Object Class::processing-instruction")
(define %html-ext% ".php")
(define %html-manifest% "PHPWEB.manifest")
(define %output-dir% "html/articles")
;; XXX hackish workaround. I'm not sure what side effects setting
;; the element number to 0 would have?
(define (generate-anchor #!optional (nd (current-node)))
(string-append "AEN" (number->string (or (all-element-number nd) 0))))
(define (phpweb-quote str)
(string-replace str "'" "\\'"))
(define (phpweb-header #!optional (nd (current-node)))
(php-code
(string-append
newline
"include('include/header.inc');" newline
"include('include/footer.inc');" newline
(phpweb-header-navigation nd) newline
"page_header ('SRM - Article', '');" newline
)))
(define (phpweb-footer #!optional (nd (current-node)))
(php-code
(string-append
; "manualFooter('" (phpweb-quote (phpweb-node-title nd)) "','" (phpweb-quote (html-base-filename nd)) "');" newline
"footer (''); " newline
)))
(define (phpweb-node-title #!optional (nd (current-node)) (title-elem "title"))
(let* ((preferred-title-node
(cond ((equal? (gi nd) "refentry")
(node-list-first
(select-elements
(children
(select-elements (children nd) "refnamediv"))
"refname")))
(else
(node-list-first
(select-elements (children nd) title-elem)))))
(title-node
(if (node-list-empty? preferred-title-node)
(select-elements (children nd) "title") ;; fallback
preferred-title-node)))
(data title-node)))
(define (phpweb-header-nav-array nd)
(let ((href (href-to nd))
(title (phpweb-quote (phpweb-node-title nd "titleabbrev"))))
(string-append
"array('" href "', '" title "')")))
(define (phpweb-node-list-map func ndl)
(let* ((node (node-list-first ndl))
(rest (node-list-rest ndl))
(item (func node)))
(if (node-list-empty? rest)
(list item)
(append (list item) (phpweb-node-list-map func rest)))))
(define (phpweb-header-navigation nd)
(let ((prev (prev-chunk-element nd))
(next (next-chunk-element nd))
(up (parent nd))
(home (sgml-root-element))
(toc-nodes (siblings (chunk-parent nd))))
(string-append
"$Navigation = array(" newline
" 'home' => " (phpweb-header-nav-array home) "," newline
" 'prev' => " (phpweb-header-nav-array prev) "," newline
" 'next' => " (phpweb-header-nav-array next) "," newline
" 'up' => " (phpweb-header-nav-array up) "," newline
" 'toc' => array(" newline
(join
(phpweb-node-list-map (lambda (nnl)
(string-append
" "
(phpweb-header-nav-array nnl)))
toc-nodes)
(string-append "," newline))
")); "
)))
(define (html-document title-sosofo body-sosofo)
(let ((doc-sosofo
(if (or (chunk?) (node-list=? (current-node) (sgml-root-element)))
(make sequence
(phpweb-header (current-node))
body-sosofo
(phpweb-footer (current-node)))
body-sosofo)))
(if (chunk?)
(make entity
system-id: (html-entity-file (html-file))
doc-sosofo)
doc-sosofo)))
(element programlisting
(make processing-instruction
data: (string-append "php highlight_string ('" (string-replace (data (current-node)) "'" "\\'") "'); ?"))
)
(define ($section-separator$)
(let* (;; There are several situations in which we don't want a
;; separator here:
;; 1. This document is being chunked:
(chunks (not nochunks))
;; 2. This node is the root element of the document:
(isroot (node-list=? (current-node) (sgml-root-element)))
;; 3. This node is the first section in the root element
;; and no other content (except the *info elements and
;; the title) precedes it. This means that the
;; titlepage-separator was the last thing we put out.
;; No one expects two separators in a row, or the Spanish
;; inquisition.
(s1ofrt (node-list=? (parent (current-node)) (sgml-root-element)))
(precnd (ipreced (current-node)))
(infond (info-element (parent (current-node))))
(isfirst (or (equal? (gi precnd) (normalize "title"))
(node-list=? precnd infond))))
(if (or chunks isroot isfirst)
(empty-sosofo)
(literal "")
)))
(element acronym
(make element gi: "ACRONYM"
attributes: (list
(list "TITLE" (normalize (attribute-string (normalize "title")))))
(process-children)))
(define ($section-body$)
(make element gi: "DIV"
attributes: (list (list "CLASS" (gi)))
($section-title$)
(process-children)
($section-separator$)))
(define
(article-titlepage-separator side)
(make empty-element
gi: "IMG"
attributes: (list
(list "BORDER" "0")
(list "SRC" "/images/black.gif")
(list "WIDTH" "100%")
(list "HEIGHT" "1")
)
)
)
(mode article-titlepage-recto-mode
(element revhistory
(make element gi: "DIV"
attributes: (list (list "CLASS" (gi)))
(make element gi: "TABLE"
attributes: (list
(list "WIDTH" ($table-width$))
(list "CELLSPACING" "0")
(list "BORDER" "0"))
(make sequence
(make element gi: "TR"
(make element gi: "TH"
attributes: '(("ALIGN" "LEFT")
("VALIGN" "TOP")
("COLSPAN" "3"))
(make element gi: "B"
(literal (gentext-element-name
(gi (current-node)))))))
(process-children)))))
(element (revhistory revision)
(let ((revnumber (select-elements (descendants (current-node))
(normalize "revnumber")))
(revdate (select-elements (descendants (current-node))
(normalize "date")))
(revauthor (select-elements (descendants (current-node))
(normalize "authorinitials")))
(revremark (select-elements (descendants (current-node))
(normalize "revremark"))))
(make sequence
(make element gi: "TR"
(make element gi: "TD"
attributes: (list
(list "ALIGN" "LEFT"))
(if (not (node-list-empty? revnumber))
(make sequence
(literal (gentext-element-name-space
(gi (current-node))))
(process-node-list revnumber))
(empty-sosofo)))
(make element gi: "TD"
attributes: (list
(list "ALIGN" "LEFT"))
(if (not (node-list-empty? revdate))
(process-node-list revdate)
(empty-sosofo)))
(make element gi: "TD"
attributes: (list
(list "ALIGN" "LEFT")
(list "WIDTH" "70%")
)
(if (not (node-list-empty? revremark))
(process-node-list revremark)
(empty-sosofo)))))))
)
&html-common.dsl;
&common.dsl;
&version.dsl;
</style-specification-body>
</style-specification>
<external-specification id="docbook" document="docbook.dsl">
</style-sheet>
<!--
Local Variables:
mode: scheme
End:
-->
[FILE: /srmdoc/Makefile.in]
--- srmdoc/Makefile.in:1.5 Sun Feb 10 18:21:40 2002 GMT
+++ srmdoc/Makefile.in Thu Apr 18 11:03:49 2002 GMT
@@ -8,10 +8,13 @@
HTML_STYLESHEET=html.dsl
PHPWEB_STYLESHEET=phpweb.dsl
+ARTICLE_STYLESHEET=article.dsl
HOWTO_STYLESHEET=howto.dsl
PRINT_STYLESHEET=print.dsl
QUICKREF_STYLESHEET=quickref.dsl
KDEVELOP_TOC_STYLESHEET=kdevelop_toc.dsl
+ARTICLES_HTML=html/articles/php-almanac-2002.php
+ARTICLES=articles/php-almanac-2002.xml
HTML_DEPS=$(HTML_STYLESHEET) common.dsl
PHPWEB_DEPS=$(PHPWEB_STYLESHEET) common.dsl
@@ -37,6 +40,7 @@
html/index.html: $(HTML_DEPS)
@test -d html || mkdir html
+ @test -d html/articles || mkdir html/articles
$(JADE) $(CATALOG) -d $(HTML_STYLESHEET) -V use-output-dir -t sgml $(srcdir)/phpdocxml.dcl manual.xml
html/index.php: $(PHPWEB_DEPS)
@@ -44,6 +48,18 @@
@test -d html/figures || mkdir html/figures
cp -R figures/*png html/figures/
-$(JADE) $(CATALOG) -d $(PHPWEB_STYLESHEET) -V use-output-dir -t sgml $(srcdir)/phpdocxml.dcl manual.xml
+
+articles: article
+
+article: $(ARTICLES)
+ @test -d html || mkdir html
+ @test -d html/articles || mkdir html/articles
+ @test -d html/figures || mkdir html/figures
+ cp -R figures/*png html/figures/
+ for i in $(ARTICLES); do \
+ $(JADE) $(CATALOG) -d $(ARTICLE_STYLESHEET) -V nochunks -V use-output-dir -t sgml $(srcdir)/phpdocxml.dcl $$i; \
+ mv html/articles/index.php `echo "html/$$i" | sed -e 's/\.xml/\.php/'`; \
+ done
# test all possible errors
test:
[FILE: /srmdoc/global.ent]
--- srmdoc/global.ent:1.3 Sun Nov 19 15:53:36 2000 GMT
+++ srmdoc/global.ent Thu Apr 18 11:03:49 2002 GMT
@@ -1,15 +1,16 @@
-<!--
- $Id: cvstemp,v 1.3 2000/11/19 16:53:36 james Exp $
- -->
+<!-- $Id: cvstemp,v 1.4 2002/04/18 13:03:49 derick Exp $ -->
-<!ENTITY email.james 'james@vulcan-logic.net'>
-<!ENTITY email.mathieu 'mathieu@vulcan-logic.net'>
-<!ENTITY email.derick 'derick@vulcan-logic.net'>
+<!ENTITY srm.small '<acronym title="SRM: Site Resource Manager">SRM</acronym>'>
+<!ENTITY srm.full 'SRM: Script Running Machine'>
+<!ENTITY php '<acronym title="PHP: PHP Hypertext Proprocessor">PHP</acronym>'>
+<!ENTITY http '<acronym title="HyperText Transfer Protocol">HTTP</acronym>'>
-<!ENTITY link.james '<ulink url="mailto:&email.james;">James Moore</ulink>'>
-<!ENTITY link.mathieu '<ulink url="mailto:&email.mathieu;">Mathieu Kooiman</ulink>'>
-<!ENTITY link.derick '<ulink url="mailto:&email.derick;">Derick Rethans</ulink>'>
+<!ENTITY banana '<acronym title="Bananas are remote objects living in the SRM daemon.">Banana</acronym>'>
+<!ENTITY bananas '<acronym title="Bananas are remote objects living in the SRM daemon.">Bananas</acronym>'>
-<!ENTITY url.vlsrm 'http://www.vl-srm.com'>
-<!ENTITY url.vulcan-logic 'http://www.vulcan-logic.net'>
\ No newline at end of file
+<!-- keep this comment at the end of the file
+vim600: syn=dtd fen fdm=syntax fdl=4 si
+vim: et tw=78 syn=sgml
+vi: ts=1 sw=1
+-->
[FILE: /srmdoc/manual.xml]
--- srmdoc/manual.xml:1.12 Tue Mar 05 20:31:22 2002 GMT
+++ srmdoc/manual.xml Thu Apr 18 11:03:49 2002 GMT
@@ -2,12 +2,17 @@
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
"./dbxml/docbookx.dtd" [
<!ENTITY % srmdoc.defs SYSTEM "./global.ent">
+
+ %srmdoc.defs;
+
<!ENTITY srmdoc.user-intro SYSTEM "./user/intro.xml">
<!ENTITY srmdoc.user-features SYSTEM "./user/features.xml">
<!ENTITY srmdoc.user-client SYSTEM "./user/client.xml">
<!ENTITY srmdoc.user-using-banana SYSTEM "./user/using-banana.xml">
<!ENTITY srmdoc.user-faq SYSTEM "./user/faq.xml">
<!ENTITY srmdoc.user-support SYSTEM "./user/support.xml">
+ <!ENTITY srmdoc.user-mod-standard SYSTEM "./user/mod_standard.xml">
+ <!ENTITY srmdoc.user-mod-sapi SYSTEM "./user/mod_sapi.xml">
<!ENTITY srmdoc.user-classes SYSTEM "./user/classes.xml">
<!ENTITY srmdoc.admin-intro SYSTEM "./admin/intro.xml">
@@ -20,7 +25,6 @@
<!ENTITY srmdoc.api-argument-handling SYSTEM "./api/argument-handling.xml">
<!ENTITY srmdoc.design-basic SYSTEM "./design/basic-design.xml">
- %srmdoc.defs;
]>
<book id="srm" lang="en">
<title>SRM Documentation</title>
@@ -33,6 +37,12 @@
&srmdoc.user-using-banana;
&srmdoc.user-faq;
&srmdoc.user-support;
+ </part>
+
+ <part id="srmdoc-reference">
+ <title>Function reference</title>
+ &srmdoc.user-mod-standard;
+ &srmdoc.user-mod-sapi;
&srmdoc.user-classes;
</part>
[FILE: /srmdoc/admin/compiling.xml]
--- srmdoc/admin/compiling.xml:1.4 Thu Mar 07 16:54:08 2002 GMT
+++ srmdoc/admin/compiling.xml Thu Apr 18 11:03:50 2002 GMT
@@ -240,8 +240,7 @@
specific options. At the moment the <link
linkend="user.module.http">http</link> module is experimental and is
not available in the release. A CVS version of SRM is required to
- test the http module. This makes it possible to authenticate a
- session with a password file.
+ test the http module.
</para>
</listitem>
</varlistentry>
@@ -257,8 +256,7 @@
stored as application level variables. At this moment, the <link
linkend="user.module.mhttp">mhttp</link> module is experimental and
is not available in the release. A CVS version of SRM is required to
- test the http module. This makes it possible to authenticate a
- session with a password file.
+ test the http module.
</para>
</listitem>
</varlistentry>
[FILE: /srmdoc/admin/installation.xml]
--- srmdoc/admin/installation.xml:1.7 Thu Mar 07 16:54:08 2002 GMT
+++ srmdoc/admin/installation.xml Thu Apr 18 11:03:50 2002 GMT
@@ -164,7 +164,7 @@
<section>
<title>SysV based UNIX</title>
<para>
- Why in the hell would you want to be running this style UNIX anyways?
+ This is not yet written.
</para>
</section>
[FILE: /srmdoc/articles/php-almanac-2002.xml]
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
"../dbxml/docbookx.dtd" [
<!ENTITY % srmdoc.defs SYSTEM "../global.ent">
%srmdoc.defs;
]>
<!-- $Revision: 1.85 $ -->
<article>
<articleinfo>
<author>
<firstname>Derick</firstname>
<surname>Rethans</surname>
</author>
<authorinitials>dr</authorinitials>
<title>SRM: Script Running Magic Overview</title>
<titleabbrev>SRM Overview</titleabbrev>
<revhistory>
<revision>
<revnumber>1.0</revnumber>
<date>21 Mar 2002</date>
<authorinitials>Derick Rethans</authorinitials>
<revremark>In progress</revremark>
</revision>
</revhistory>
</articleinfo>
<section id="intro">
<title>Introduction</title>
<para>
This article takes you on a tour to all functions that &srm.full; has to
offer. In this section a history of the project is outlined and after that
the different features are introduced.
</para>
<section id="intro.history">
<title>History</title>
<para>
&srm.small; was first conceived in the autumn of 2000. It is designed to
solve some of the problems often encountered with &php; and other web
scripting languages that result from the statelessness of the &http;
protocol. Among the first ideas where implementing a &php; script which
should run 'in a loop' and handle all events. The job of this &php; script
was managing persistent resources to databases and other resources.
</para>
</section>
</section>
<section id="overview">
<title>Overview</title>
<para>
&srm.small; has a few key features. These will be described shortly in this
section. After this, every feature will be discussed in more detail in it's
own section.
</para>
<section id="overview.session">
<title>&srm.small; as session handler</title>
<para>
The first feature of &srm.small; is a module that can be used as a session
handler in &php; It works just like the 'files', 'mm' or 'pgsql' session
handlers that are standard available, or the 'msession' session handler.
The advantage of using an advanced, daemon based, approach for handling
session data that session data can be used in clustered environments far
more easier. The 'msession' module was specially written for this, but
does not have the advantage that &srm.small; can offer; using session data
in <link linkend="overview.remote-objs">remote objects</link> just like it
would have been available to a normal script.
</para>
</section>
<section id="overview.applevel-vars">
<title>Application level variables</title>
<para>
Application level variables are variables stored in the &srm.small;
daemon, persistent across requests, scripts and even webservers. This
means that you can refer to this application data in in every script, from
everywhere. You can define namespaces for these application level
variables as you see fit, so that it is possible to clearly seperate
application level variables per application.
</para>
</section>
<section id="overview.remote-funcs">
<title>Calling remote functions in &srm.small;</title>
<para>
&srm.small; can also make use of remote functions. Remote functions are
called from a client side script, but executed in the &srm.small; daemon.
There are two types of remote functions:
<variablelist>
<varlistentry>
<term>Functions in SRM modules</term>
<listitem>
<para>
The remote function is defined in a module, written in C. For example
from the standard module: <function>get_function_list</function> or
<function>get_application_keys</function>. The module <acronym
title="Application Programming Interface">API</acronym> is quite easy
(easier than &php; modules), and it should therefore not be a problem
to add other modules. One of the included modules is the 'auth' module,
which makes it possible to authenticate users with <acronym
title="Pluggable Authentication Modules">PAM</acronym>, password files,
or for example a Challenge-Response protocol (this last one is
finished, but it should be merged into the auth module).
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>Functions in a PHP function library</term>
<listitem>
<para>
&php; function libraries are loaded at startup of the daemon. The &php;
scripts that are part of this library get compiled and executed.
Because the compiled scripts are not destroyed after that, it is
possible to call them from a client side &php; script again, without
having to parse/compile them.
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
</section>
<section id="overview.remote-objs">
<title>Remote objects</title>
<para>
Remote objects are &php; scripts, running permanently in the &srm.small;
Daemon. We call these remote objects SRMApps, or &bananas;. You can
instatiate them just like a normal object.
</para>
</section>
</section>
<section id="communication">
<title>Communication</title>
<para>
Because SRM is a stand-alone daemon accessible by a communications endpoint
(a TCP/IP port or a Unix domain socket) we needed to define some sort of
protocol to communicate with the daemon from clients. The first protocol is
the <link linkend="communication.standard">standard</link> protocol. This
protocol is the first supportest and oldest one.
</para>
<para>
While developing the <link linkend="communication.standard">standard</link>
protocol, we noticed that it had a great deal of similarities with an
<link linkend="communication.xmlrpc">XML-RPC based protocol</link>.
Although an XML based communication gives more overhead than the standard
protocol, we still decided to implement it to make easier access from a lot
of languages possible without having to write a lot of client interfaces to
&srm.small; for every different programming language out there.
</para>
<para>
The next two sections describe the different protocols that &srm.small;
supports.
</para>
<section id="communication.standard">
<title>Standard Protocol</title>
<para>
The standard protocol was the first implemented one. The protocol consists
of a handshake in which protocol options are determined. Options for the
protocal are the version of the protocol, whether <acronym
title="Secure Socket Layer">SSL</acronym> is used or not. Also the session
ID is generated in this stage. After this handshake data packets can be
send over the established communication channel. Packets are structures of
SRM values, the native datatype within &srm.small;. SRM values are quite
analogous to the zval type that Zend uses for internal variable
representatations.
</para>
<para>
<figure>
<title>Serialized data</title>
<graphic fileref="../figures/srm-protocol.png"/>
</figure>
</para>
<para>
To transmit a complex datastructure &srm.small;
serializes the structure into a bytestream. Above you find the data
portion of a function call to <function>srm_function_exists</function>
with as parameter <parameter>srm_module_list</parameter>.
This data packet is send after the header which contains the type of the
packet, the version and the session ID.
</para>
<para>
A pro for using this protocol is the very low overhead; a con is the
difficult integration into other languages such as Perl.
</para>
</section>
<section id="communication.xmlrpc">
<title>XML RPC Interface</title>
<para>
Because we also wanted to have an interface which is usable from almost
every programming language, we developed an XML-RPC based protocol too.
This protocol encapsulates both the header and data portion of a request
in an XML string. The XML string in the next example shows a XML-RPC call
to a function in &srm.small;. Because the session ID is very important, we
took the first parameter in the XML-RPC call for this.
</para>
<para>
<example>
<title>XML reprensentatation of a function call</title>
<para>
<programlisting role="php">
<![CDATA[<?xml version="1.0"?>
<methodCall>
<methodName>srm_module_info</methodName>
<params>
<param>
<value>--session-key--</value>
</param>
<param>
<value>auth</value>
</param>
</params>
</methodCall>]]>
</programlisting>
</para>
</example>
</para>
<para>
After the request has been succesfully executed, a response is returned.
This may look like this:
</para>
<para>
<example>
<title>XML reprensentatation of a result</title>
<para>
<programlisting role="php">
<![CDATA[<?xml version="1.0"?>
<methodResponse>
<params>
<param>
<array>
<data>
<value>--session-key--</value>
<value>
<array>
<data>
<value>standard</value>
<value>0.6.0</value>
<value>Vulcan Logic Group</value>
<value></value>
</data>
</array>
</value>
</data>
</array>
</param>
</params>
</methodResponse>]]>
</programlisting>
</para>
</example>
</para>
<para>
By using the XML-RPC interface, you can use &srm.small; as a Web Services
provider and use it from everywhere.
</para>
</section>
</section>
<section id="session">
<title>Session Management</title>
<para>
The need for sessions came from the statelesness of the HTTP protocol;
after every request to the webserver the server lost any link with the
user. By using sessions, this link could be maintained and scripts could
track variables belonging to a user. Often used session variables are
usernames or user ids. &php; 4 has an extension for supporting sessions.
Sessions are variables traced by the script, and stored serverside. A user
is identified with a session my means of a session ID, which is normally
stored in a cookie, or appended by every URL in the script. The variables
are stored on the server with the session ID as key. If you use the "files"
handler of the &php; 4 session module, you will notice lots of files in
your /tmp directory containing session data.
</para>
<para>
While the standard &php; 4 session handler using session files is adequate
for most applications, it also has some problems. One of those problems is
that file access isn't really fast on most systems. And if there is a high
load on the system, a lot of session files are generated. In order to speed
up things, &php; also has an "mm" session handler, which stores the session
data in shared memory. But as shared memory has the same problem as files
regarding availablity from one machine only (not counting NFS), it doesn't
really work for clustered webservers.
</para>
<section id="session.clustering">
<title>Clustering</title>
<para>
This problem was the first reason to build &srm.small;. With &srm.small;
it is possible to use a special session handler to &php;, the
"srm" session handler. With this handler all session data is not stored on
the webserver itself, but in the &srm.small; daemon. Because the daemon
can be accesed by TCP/IP, any webserver which serves the request can
access the same session data, and thus there is no problem if request A of
a session is handled by webserver 1, and request B by webserver 2.
</para>
<para>
Although this was the first reason to develop and build &srm.small;, it's
not the most interesting feature. In combination with the <link
linkend="bananas.remote-objs">Bananas</link> it's a very powerful way to
have persistent objects coupled with specific sessions. If you only need
to have session accesible from multiple webservers, you should also take a
look at <ulink url="http://MSESSION">msession</ulink> which specifially
addresses this issue, and is totally optimized for this single feature.
</para>
</section>
</section>
<section id="appvars">
<title>Application level variables</title>
<para>
In addition to the session handler for &php;, &srm.small; also has the
concept of application variables. This was also one of the first functions
for which &srm.small; was build. Application level variables are a lot like
session variables, there is one important difference though. While session
variables are per user session, application level variables are per
application. This means that they are accesible from every user session.
</para>
<section id="appvars.using">
<title>Using an application level variable</title>
<para>
As example we use an application level variable to dynamically change a
cache timeout value. Suppose we have a system in which generated pages are
cached to disk. Although these pages are cached, the data from which they
are generated changes quite a lot. To lower the load on the system, the
pages are cached, but in the most ideal way the use of the cache should be
as little as possible. Therefore the implementers wanted a way to change
the cache timeout value based on the load on the system.
</para>
<para>
Of course this can be done with a cronjob setting a value in a database,
or a cronjob writing an include file, but both options only highen the
load on the system or are not very practicle. Therefore the builders of
this application developed a solution in which the timeout value of the
cache is represented by an application level variable stored in the
&srm.small; daemon. This value is modified by a cronjob and read by the
scripts ir order to make a decision to either regenerate the page, or
load it from disk. In the listings below you'll find the (pseudo) code on
how to solve this with &srm.small;.
</para>
<para>
<example>
<title>Cronjob to set the application level variable</title>
<para>
<programlisting role="php">
<![CDATA[#!/usr/local/bin/php
<?php
$load = `uptime| sed 's/.*ge:\ //'| sed 's/,.*//'`;
$timeout = 60 / ($load + 0.01);
if ($timeout > 600) {
$timeout = 600;
}
$srm = new SRM ('/tmp/srm.socket', 7777);
$srm->globals['cache']['timeout'] = $timeout;
?>]]>
</programlisting>
</para>
</example>
</para>
<para>
<example>
<title>Using the application level variable from the script</title>
<para>
<programlisting role="php">
<![CDATA[<?php
$srm = new SRM ('/tmp/srm.socket', 7777);
$timeout = $srm->globals['cache']['timeout'];
if (get_cache_object_time('dyn_data') + $timeout > date()) {
/* Generate new page */
} else {
/* Use old page */
}
?>]]>
</programlisting>
</para>
</example>
</para>
</section>
<section id="appvars.namespaces">
<title>Namespaces</title>
<para>
To overcome problems with multiple applications having it's own
appliaction level variables &srm.small; supports namespaces. Every
application should use it's own keyword which identifies it's namespace.
&srm.small; does not enforce the use of namespaces, it's the task of the
programmer to make use of them. There is one special namespace, the
'global' namespace, this can be used to share variables between
applications. The example below shows how an namespace is used with
application level variables.
</para>
<para>
<example>
<title>Namespaces and Application Variables</title>
<programlisting role="php">
<![CDATA[
<?php
$srm = new SRM('/tmp/srm.socket');
/* Add 1 to the nr_of_users variable of the 'Counter' application */
$srm->Counter['nr_of_users'] += 1;
/* Set the timeout value for the FileCache application to twice the
* timeout of the global timeout value */
$srm->FileCache['cache']['timeout'] = $srm->globals['cache']['timeout'];
?>
]]>
</programlisting>
</example>
</para>
</section>
</section>
<section id="remote-funcs">
<title>Remote functions in SRM</title>
<para>
</para>
<section id="remote-funcs.module-provided">
<title>Module provided functions</title>
<para>
</para>
</section>
<section id="remote-funcs.library">
<title>Functionlibrary</title>
<para>
</para>
</section>
<section id="remote-funcs.cached">
<title>Cached functions (pre-compiled)</title>
<para>
</para>
</section>
</section>
<section id="bananas">
<title>&bananas;</title>
<section id="bananas.remote-objs">
<title>Remote objects</title>
<para>
</para>
</section>
<section id="bananas.adt">
<title>ADT</title>
<para>
</para>
</section>
<section id="bananas.timers">
<title>Timed events</title>
<para>
</para>
</section>
<section id="bananas.interaction">
<title>Interaction between &bananas;</title>
<para>
</para>
</section>
</section>
</article>
<!-- keep this comment at the end of the file
vim600: syn=xml fen fdm=syntax fdl=4 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->
[FILE: /srmdoc/dbxml/dbpoolx.mod]
--- srmdoc/dbxml/dbpoolx.mod:1.2 Mon Feb 04 19:59:40 2002 GMT
+++ srmdoc/dbxml/dbpoolx.mod Thu Apr 18 11:03:51 2002 GMT
@@ -7,7 +7,7 @@
Corporation, Norman Walsh and the Organization for the Advancement
of Structured Information Standards (OASIS).
- $Id: cvstemp,v 1.2 2002/02/04 20:59:40 derick Exp $
+ $Id: cvstemp,v 1.3 2002/04/18 13:03:51 derick Exp $
Permission to use, copy, modify and distribute the DocBook XML DTD
and its accompanying documentation for any purpose and without fee
@@ -6818,6 +6818,7 @@
<!ENTITY % acronym.attlist "INCLUDE">
<![%acronym.attlist;[
<!ATTLIST acronym
+ title CDATA #IMPLIED
%common.attrib;
%acronym.role.attrib;
%local.acronym.attrib;
[FILE: /srmdoc/docs/interview-derick.pdf]
%PDF-1.3
2 0 obj
<< /Length 1 0 R /Filter /FlateDecode >>
stream
xZێ6}Wm:@~K&&0ȋ[3[t=*J"#ð=>,YSEYZY:Yk7V3皅_/?x=do/Cٌz~?IEwV k_ᛷbiӺ'Otw4^~ӧ{i_НnڷùZpX-Uno?߽U{6oDčVUD{
{WU7g]-k<
(s1 iB6Iiqx9jqfUT{=OSNu) 8q.<+Tc傫6o~{e5.mPM0'B[䈻U-U8b5g:n5Ip)!ú*eymㄏ7߶KiYcmp*p닯V\zH0ORF4Lue5+#r&yǩ+Epgo`8O%*4*8g8װ`=s]ռuWvSE ͊qpxF'6)rnWdy۩3F$yos~#=Vqk3Ե"CMOە i|EJ;(iA6ꆩ4ϰvjS
b=0WezZ7'ܑJ?a݊dht:r<W^DdkT#S2`u!݅$YsM!U<(4l&RK2+=a}!! lkhQ.D+= EǁDP-Δ(FɆRP%P5&Z>r}tHU~ݧ$S{[('C4u`~w!Dotɣ8?#a{LcTsYbAC/80<ehP%#W@M\9oD=ONiKչ!sM`ZX93oS
P
uKi/O̠
*IaԢhJIA:Vu/)
6Ҫo+ZQ]UQ(@NƑ t$)l(4>S/lQqed!^O_~LK2q t$@l}YFq- IZ?60H3חVI**Qk~
tᕃ9^n'&.boQS?)I@0"+%]1`/n3Int
NўAqN+zCH(-qt@v8HbvtĭX2JC? I_m[|fD
^Qː<|+NZTVcl֘2R-?6e8Ke8hf4@9;
].$9d{8h#OSGxT1UE'PW354qBZBu $ic_F>Jz_ 0C{잩vP(B#B^cu`~}ܱߏǮ$q,+g!8L"3"Y.{Uթm5'-:|dKE,3=تet":pfREPKM.|0r&+z&C8XQ 'QC ޏ5WU\hIWUgTϊ~ߝ>u'b
Xͬb0Tl` 8e:_/ScN
q_D3VW(Xd+zn8bA=Lu=Dٟ"#XRkl)|KL,W'Sh#hQ'pI#$"S"1.DshOш ɩ$i|kف:
esOQqXk^LuMuE_zV;nH!4v!Qڶ=R #UDAH:ӟ0sqBA#\mg7kP/۲bݱa"zStL"m$4K5%Aӹ;<Y "H`ʏ31r8K@bXɾRCNL0r-(xbx']Hx:2_SJȥ}yYu)m;queLZ}Gc@Q:D@x{ "5;rq}T( E\N*#h39
:Ǟ FP^KHR/!1{|tvtacoO'#uhhnoojzԿ ~BIe]yOe+۸vS΅e$We
b*O핬t--4ÛKac}Z :+Pߴ"Cŋz^o<U@e3l72DOޒW1k?Ҟ^p2'[ѣ.Q mE5
-e3h)5lG
#x>-"H8Ļ(O*$!%j;N$-HgJtig\TX +\vn:'*Z]Dz ϩ<,x>p 0Ll""Jl/i;l=w tHZ̍ omg
ݛqx\OuFapigr?
/Mk2{9@s?/ۻ=g^q8KQn]x?scOЗR=vˊ=N_\ofpk yMʯy|/]PZ"pZj_6KlDD1"-=(%q;W
8iN%rζ>&9YyEAF4yLo rM鯅Jü`Ew7d
L1ҫw43\//KfFG)DlT#n)^zSfj(%3B*گZ?/* >Jn'UC
s%p5Z洗"ndGOw3|UDͮG0W/^EE_o23(
VK(LC'APX/2#L)|th)`&LO>
~X؝"^XF:;< v2d&W-j~$ҝW_"IK\Rd
s8j.4>=a<V]Ճ@:e)#\GRvwwK|+}JזsH]ClN S!"ˎp
u(W BB1fkj3_0 |k1 rMLp#,0)"[Q8\V2+÷"oM? YNN>{#·zUu:ɏ]k6EEߐA<>BBCB,ΩUm~1FAHA',L,ȑ,Q%*".ͥPM'/ ;z*A/{]G^gןP1oqPQ>ԿֿӐ
endstream
endobj
1 0 obj
3961
endobj
4 0 obj
<< /Type /Page /Parent 5 0 R /Resources 6 0 R /Contents 2 0 R /MediaBox
[ 0 0 612 792 ] >>
endobj
6 0 obj
<< /ProcSet [ /PDF /Text ] /Font << /F1.0 7 0 R /F2.0 8 0 R >> /ColorSpace
<< /Cs1 3 0 R >> >>
endobj
10 0 obj
<< /Length 9 0 R /Filter /FlateDecode >>
stream
x[ے6}W2MÄ/;cm̬uo8fC/j㺙dI=YmǾ>0z;m3m?F
|\l^@_㿲U0~1&X{fM[/W?F)HfM_"TV<.pFFli>+L#d\`0/a-3sx>&lY2nLV}\4&g~rfi]uSiI;li_0J62]kڌ0DPAz
Hŭc7>r˸Pmw6(Z>,8KnNX[o\ke+Hu ,Ulm8_Uampuޔ[,Z٨8j\k4ge~xJllo:l]A5&;?0
G
x|
6'DM~>ێXŹced_K7h |~1Fn!g7h#87OD0,/zá)ϰɰW0z[X-B̉XznC<SfjH2QDݱg#
qf<#eKyZXzZV'S$VYAC9pUs:NTgLR'U,/&T)X63{ /^·:đy4Lu RDJP4
7ݳ;v>l?Hb]
B8
;Ctgo1k
;O~D&Fs+Sxg|"TD=ܹFEvFK;53k\qk-u8Mޕh`K\" gTIZh rvrbL<j9t"h:5#93-\܁dS<AGZ8 j(`q~7F|3؏oI8.ڶU7%F{?5) eXڕ4cDDUqͅĀ$ךgkhBoR]#XY"bR] [C1Ifjǧy*DV},GBtq>Mf˜9dD2WʄNSyr:\~/C7wYfd
Ev_ټކ5y}ЪkF@f}WޯK<B-r[
Hy\+a=\Xց
}uȺ;4zNe{@S]ae5N&FTj@n'7ePf-\[Ǿ#|]7BXk ڗJ R;;{:*J><GñyU(~f|ho6"i+#Q;;/PvP
e[GBՒc7
tҮUҠc_,GhOaY;G6]Y@ B--jY2eρ.zjU1%s?shVJN^qoBV+
(emG<\ [vx=ђR-Y nn'kJ=P\{n#$/Ti?~`Sm|bee v:Qg#q
tJD1+KnN5NV'U뭎F
R69|c҈MI4" ޞFzu2ۘmJ4e2_ ͔Vv&[}r֮s-x"]"?D*o1ML;!mmiDpBkVs)b四C 0
} ]/ɠLhŗvsEkW?GvDm)0Nbgx+|;b%ɃLC`8R^-女 $.m.~EwTBr@v+76Y*uhRy{Ot4/aiOsuK&oVQ;-tl)yi(IDvk2u(F{ZZϥC^Ai#TC/k6m}('U{j2f3/Y^36æ!w?#SE4Vb }$R9_-^X kAgD8ȳhsT0ED1*A<S7-"ɒ9L(Jr${Jp@llYb:݅@yD^OxvM=T!֯g;_Mw?>7=MmGϧ~zUCWKz X!~7zλ?/u"5\sܶUl%7wDSu~j^Z`tV6k0*,֔7h x-:J >7ς+kp4`MJ{.|
NqM]Ciz
5=pL7Z\8 :5F23{%ˬGr$.ü:Pwh"1
%oU<jyN]ШϾeDƿ}(YӻMӮ#.-T
"7vDl+lԍDʩvվ晪
!e5J=#6jJNf%*pp!*A2_'Ч[FҚv{STzKU˽~wQ?!CC-b
̤eB!64љ
DPNwSz2h9FLۙ@+P5]}PҸĵ̘]iƟ@wC7;P@#e?o5[gπ
%[w:^7mjg
g5<>_Fnшhk1j#*^1M,f #zp"䨥"|*"?e?Սepfe lzg"|ULGcөuQsuˉ掾|{]fJ)|vUwAh=JOQ
f="ٌZwc;ۡ"c pnܾg@Pb|55$Wk5~R)dCLPyzL
nK[uUp,b-t!ϘP)ͫE_r3fmV8ȧ~)_c:/d
^2v_< JB<Jҽw\BRc)zZ휱K0
RC2f?'@>mB psADPcEB6· (
C\ոz\
6>?PĄy /RS-Tho]7]qֶ1EAÙo&O
mjVlh$"Ub>έa%Dmj1).O1sR|%YgJW.xOk#2Qi
PWyY
LМ1zLF լΡ2(UPFغr<N_R$Zj]?#d|\bHiָ{o2@(X%`vcu-9젅qFD?L On$@k0A7
< KJ0VXf}:4|S$H^ y.׳)2d+s+}>8s^>7Y
hHRE{F >8#(?QO Tx],NEEPô=O?Ո/9ן%W /A-R0{BYj(Ve2ۂBeyO4.j2qceoCA枣1˫cV~tcH!g$CR-*XKv=W2^+m|dwUQ-|W LPBoeHB#hl?i$KlHk2SJ:n7J-ֶ#RÎ8a',8VE靖M;Qq|kXƄ >]^/"$eb/VQmp['~hҽ݂:6ljG
̆<L /Wր1Ex>ֿԿ?Z
endstream
endobj
9 0 obj
4440
endobj
11 0 obj
<< /Type /Page /Parent 5 0 R /Resources 12 0 R /Contents 10 0 R /MediaBox
[ 0 0 612 792 ] >>
endobj
12 0 obj
<< /ProcSet [ /PDF /Text ] /Font << /F1.0 7 0 R /F2.0 8 0 R >> /ColorSpace
<< /Cs1 3 0 R >> >>
endobj
14 0 obj
<< /Length 13 0 R /Filter /FlateDecode >>
stream
x\˒F+k*BƠU8${&"gkM,A"$AY@=Jh&z!u*Q|J͗+6wFm9mmvM.?6aeS
,fwܼ;S6j#|<iNG7V7\mۧcڼ|=_
,o/SWrV
ݾ=}.o kLҺ=b91m)3[sеޫ']|-zL)]s!SEid-ӆ^n_JrMSKQplTKo뾿8sVᘪ\:ZM0DU~{L E~uB9avߖ7Gc-BMbCk=>5X8V&B
)\8)epjuI%QX0FHc&.c5@¢-qhҹ*@Jg6ր(Ғ5"yl/^pQV_D'pSǣݾ۽F$gi0NP规,ڹjǮU7 eNO+"foVA5)Wp+/jXS[3, FA.JHybc!FAcw^XbBC@8n2cw}V
ӕ
؏8<zb`fG1\(m xFU+'e5f#
;_7q<~@yj7esw?}ӻ.ap)~j}w>ЧU-rd A*OwH8 FI"f@pl_5"eC SBnוM}A,gU@?5uV<
+˜v~ [Acݩg}CV@ TÀ;R@f²p&ƪDиu|Ku3y% ~lkJ`K&ӵO؈`x @ȧK%/XR2ზztTyttpn
.IR/U,-AеQ+j`qqKRZ:I/2Xa8x0Koz\@3m;,K2ʛs17bl
n@ϰlL\5#9mSiiO<NZf)QH"2sdo2 5B]|c\ye%ԁ!JOnՂL
x4C>eo,h|j|=ltc
&ezͷb,{,BWmeSk4(w:#g
8w߆۸OӃ2]+!Y..[f % V"<)g^zV3;qkn,S9l
R?2~A_nw/S<)4xբXJCQBi]PeB
r@#fߍeEqO?b!ԥ,wDM/,َ7-n"4-%ص]'|h&`lڐωU'6aYeUUzaiB%>xwg?vкv4Sxv!i@HB3Qo@2aT۰ѶiPj4UUњPzZMmTB|I<ɤ19YAbLȧ7S!O@2JƲjK<
.%8cy\ѳR5ik)6CP1/ctjgMtjHBې&?TYirlFļ?q-df2u/sp)e ϋ~GGݡe8dF^XFYl$oA~|
o+f;{Z"<3ai@ȝ&Z37QdS!tdy:w7D^tKdc-
_ws*,]ag!adgC6-7V(AК 賄6{a@<,oj=m7/=L$,S]0]3`tUtK5UH=Ő`!gBRa5hWZuhPPK(NAq̫S흰^ $rFy\e(\I*aJNC)q8o;WI1$CiJ>ZFm9Ts@yE9l<YĜÈ!0ILQ5"rE8l&Aih}ھ"d!Xj0X#Y_ d[RΎ?(
KS;VW,sfBRf
3Z!<5@U߳$TkNY>v rmӛe;ti9Hcxm=4sZikGEsUz$aW5IRg{Y<
AXcd7cǠᢊj.5DZi!moİ2aZEq'ڤUqqPtl{eBeRvRLi0+*8ިŁL~ăaEױfV|xO*~$ǽN^Y
NX(y{]"PT/&Z)\Wx+EV.>fҲe-WGPf]pne(>eugm,>oh>?_,r^
BldܓHK^a4`D߬@=@m Bmbq<t%Mԃ+M HJc
Ro.mn28|zm_ly3ѼhΔ!C0Ljwn=1$Q|1p4ֻs;DVyw>/FBT"
Sd-: QEKkhqĶ٫v'rYixYtAi"t3}'"6Iu\Q"˗ E7Y#h8l$gpmLQ^Bp9l.22 *?LPb8ΈH#+N7qLvR1FT]jXiԔ:u*AUe=(o5sذ0)KBQ@dvT˱oL(H<Ib2mDtI&
+c\35ÄrFk636w9'mFWN*/X҂yN፡F6=*kuB$_= mݕB9pPa$
$"2 t\f["8]z+^ K䴟{bڄaCr8JtmriZCBaںZ36!S!`סϛ{@Pl>HO|W6Q~!Һ;"ۈ!.;qO +ZpkmHG`IC
OhTrA -Q)H$jbXeT'1LUĄOqlEt8sqGmKŜcP`2Nb!WP
>hӜĩtU84ns^4[Lb/7j9u`WI1z q.<>mBB&,ǯlǕWLeJ:v=PŔF[=dqMN]Ÿ]MT Ta/W
*ġH֥Buyf\EA"SEĮӀl\HyU#v(J6Vv2dr6Ј?; N&eؽtĈk\R]KxIg4SٮNI?zOo.~c%?+Gv<wYpOC4"DNy<%ؖ421y~`aTkQSt Fe15"}@G
&Yo`lB
vܘrA%KPta9AEJϙ78wD4S0g$KE/OHrjĿS?{HY;~N=T?䘛p_N#
ͯ_
endstream
endobj
13 0 obj
4967
endobj
15 0 obj
<< /Type /Page /Parent 5 0 R /Resources 16 0 R /Contents 14 0 R /MediaBox
[ 0 0 612 792 ] >>
endobj
16 0 obj
<< /ProcSet [ /PDF /Text ] /Font << /F1.0 7 0 R /F2.0 8 0 R >> /ColorSpace
<< /Cs1 3 0 R >> >>
endobj
18 0 obj
<< /Length 17 0 R /Filter /FlateDecode >>
stream
xZM6WaE|䒲M%qVvrHmIS7Fz}3sy}7_lf_
V]폢a5ի4?~uCuVЬa$~qTcF,^kL[8"f8C̘dq>΅E#ڸո_ Fe?(,qO;4N׳7VƦ_ݼ.mY&#/9cΨjC̱Fe~(MΫӹf$vԦO_qs#tա揯#Qepi"ql{FUpL#Ӻ< A#+ MF;ēC?>l Xt#D4xO(c/{G<y'⨱Fhg G aF#eD~3>
Ouk9BNI1@>[3 2wDFP1~<n7|2-qJFh쾛~c>c4B 3hѴiG=E
/[ۚt[/咖gL6-O}
7כŲh}8l58Sey]f3%xk;[n>/^]QAS5=K\xIzv[""OkQ͢V:[38@4܂VoRb״iWTRFڹPJ4.?P'`7/\4Ҹ%H֊Ӓ<[N2tt > µjI_F+P%m*Ȱ`k?%bAyt݆`|,_@'q29?f\uDgWYJdxpy!
sf[㯳^Իbn;|_3
&ԇ3~Pƻ`f1
:϶ȹ&}wC8XXke"@$"
!<ʮ8GH2@7/K]h&A rDx1d#M)SN 3E?Bmf*DcR_OeqmiDDY`mYlJX,~rqδ-ԓ\(d$
J62YZu1 8BS@\y/TDIuu\3ߒ/ 4h|
C~=Q{$]cNEV`P3@LW`T`<v8|Ov7:96$y0vaqhF^8tG7mPu,'+Ă"y4Lǽ6ԐY+'DWDqUݮCWn-(&ǹ{dO+ mtEc-7ggB$rŤs@ ,?K/J+ne͗h8Ze8/- ћQ>EIeWPc5atLJZÑIϓ<9<Kt)I@4 YY.9 He@*aJ=%` \R+V7BRS)Qbd&X= @@@d{|j#M脼-g-b FNarF.%NV0m8WejwDR4YGze
8(Vǻ2իx{"j#rb_lO}IEUe;"KWx6M
u
?^N&#AONxr"8j6BTu35A
pXә+¡N0r`hlv>?P.&SYgT$^Ps'tm4MSF(虱x;&9nJv`7e%[D20Z'ZעO C"L4a. {
@3ֵ 8T]$#qf4nt`E
nf9LLd0!cP?m/߬"wϥ:JJ×d'Z/.F{3^^qW9jħȌ3X6n~
]kB>Jh9_*|ZkADVy=
kC@-30esu904>zzE'qzjBA/w,Y2t{C?^/㱾5S""t~?$qKڿ@ܒ\c;n?2Ӝya1%y~
!k#4b,bDepvWr78ƷvVlPd:KB"uB0 o.?PN
qJDj)R-1Ҍ趙g%BI@Rr CPSI6MdóC%rߎDh3c#^̯#
~2Rz
hh7!i~u:3RL>F#K6
l&{!\\_o.) 3aDˌ
Kgɓ`kw_o9I.ױkɸ-V9ں9]佡im!%"yE|Du&Uu
Dw`,ļײy̌\˦,EB4 0,Ra=M$Z{4;U˃j8NY킚M8Hiau-Wv"V`qoF pՓt"qFcn)f9.3AHBY*Ntz%q*ì2c^6Ğ6A;|G̹с(l:jPq8rA?0Ζs]z1蝸K%1Rf$"'$NnCmh]PS/0"@uQiC;^A͗~icO6
endstream
endobj
17 0 obj
3396
endobj
19 0 obj
<< /Type /Page /Parent 5 0 R /Resources 20 0 R /Contents 18 0 R /MediaBox
[ 0 0 612 792 ] >>
endobj
20 0 obj
<< /ProcSet [ /PDF /Text ] /Font << /F2.0 8 0 R /F1.0 7 0 R >> /ColorSpace
<< /Cs1 3 0 R >> >>
endobj
22 0 obj
<< /Length 21 0 R /Filter /FlateDecode >>
stream
x[MFWfjC\&dɳ3l)]$ԍH`QUd%;%=d}d˗Y}mW;d}CSv|Ql_jEc't-?7ocß~O}Ӹ?qz3v~<ߺiC;ԧOyS}2"c)XHKc7u\Vf
Z/ۋi.ҬQ?a6UЊ7\ˈ(,hmyqxvrR`"i0oNF`/mB7Μqf7ll֞q_PUdmokTŽuzܵ3Ƶ5mt6+aaV)$@x}aCqtZgVNKX1睑oM}b^ƻ0X7!p0`Ю6zb+"族?~(
8&KC*89q<C9/id6a(B7&Pprv+-i,x5[l-] Q~ُSykW
/MLG[_JW{8~'6DTx<ZfEf:N@dFnĉa RHo=2ҵ);]6qV,Luq
Q}Wn;La
kx8'4:V4(
}N_nwq21sZ | D>y
vXg#8h"W43iz|UD}g"2i)oyz֡@Yn7gʉYV+ZڅwCX2ãۯoGc4Gcq<Ajqjڨ#a&¦iRUUATRp x6 rRE|80mN>M2ܼj?3_cX>_8҂iT H2$ DsiO.hkSL%Ԓmi)#%E WUĆc HsBfpF=ʟ4XR̢bI
;^h:dNq|처93U D.ZX|sP1ZMHle,h=+wڦaieqC<a*r˹Ƌ|QIJ Ayc8#S76VZ+)΄˄sǾ/u&_ khKh f,!cvbM]Ch#f^W9`+izwʸ7(C <B)BpB!KwA$t1Wa|n
m'$(Y<}#Y0V-dh&׃Ѻ`$g|]1*d{RT"Ɗke`,$rȆo(dBυpfUʌnCvY`^^G#PB37?tI ƶ
gf|n~(WCI"ϟ20 ٗ!HZFqQʞQճd=.
jhSZMT(;L6+`2$"$zlЖ}Akw]I,Hِojv_i\jT'!MIp^E~^eC^=g,N"jj 2b %Z҄>D8_#L~&JojtVdyax!<;_("Y8@z SDoFa'V
dXqЎ+X86X)/p$Ҷq0O#ca;DVXSWP~g6]αjAT8R+,/{?2vyP9<<<d!X*jg:/6E7ɹeV(ȕ.JwxȄ_6%ͩ81N3@Ql@tki>Xx9GhZb%.wԨa!(V幾(S
WfN7zTϗdx}w]J}՞6G^O^s'_fCeaju!q]T
[vކrgص.ynl×MWAnL7b_aoF_Jcgܣ[8W@(/ι٢.g;7*![VGMWĠ*3:~"E`M"Y{-d>xۣ0C? ]uC* Lu*Ҵ<j3WU+lP?mO6x$B2V܀;EL-`"s -M\iɒKpMع`p
Yw
U40+RVS1:9*!NP`˶4 X
;d9C3L !a;aX6
ؙP;
p1~mHrי[*52Gi0%K]RC? 6B3B1ʚz6fi>-jl@Bf{^,G}1צm B'ȴБwFU84(u{&ktcb+Ζ}w|$=1o\U«,\KGC%Tɵ:UbEV@ѪjgY@gPh1TW:
]&ȷ+`j6d{VU>;|kL⏠DPrj6AI[ 0+]ɀZ^lѤ5`'9g{.2Yqhg|/~kV\P@.a7>*Ù'JÇa?R5]^%DX;os$#sGPE
^_>}C(Up9JSCy<~'pz@k[EAc]1U_k
',!El2]$';,S;î;okW=grO!o?OTd㫈^㙥@67@ZaK--9%KU#yl6bZ7<努3kfל2kByԜXW9@AGY95cMw20dc8+⭛*04e'H?x,@s@.i:`
T-e
xބ|WyyyS>vc=Ϛط;vyݚ2&tP=ٗ\?8٠d;dux|8.m=ـ4$,%E W ۰&ZM0|a&,][i)g|O>gn[ڧFƶ{NkᨂU2eQe ^ O#"Hlg;e2JZ\
Ńّ/Q
P~rn^2 ,LQD&7D:Z_&+ǎOtfiwk!!1bHH:> 12 n7DכUDHDe>M+NsIL.>@+9>Ͽ=!(e#݅^8(=B.f_??K%\8L+b3pK|;DEզ+o&*k%YE_X"eF+Ypz2ڡGrJa"KyI'iB)ʐ:KzKǟ)/gR{[rMiwƬ2
Ǯ?<aO Pӗi*
endstream
endobj
21 0 obj
4491
endobj
23 0 obj
<< /Type /Page /Parent 5 0 R /Resources 24 0 R /Contents 22 0 R /MediaBox
[ 0 0 612 792 ] >>
endobj
24 0 obj
<< /ProcSet [ /PDF /Text ] /Font << /F1.0 7 0 R /F2.0 8 0 R >> /ColorSpace
<< /Cs1 3 0 R >> >>
endobj
26 0 obj
<< /Length 25 0 R /Filter /FlateDecode >>
stream
x[[6~ׯЛ;W+ɼ/gpp
L+:-Hv:{ HXU{s{JcE,f(Om˿Y3n?xuo?cO ~*%xE59W~XUXn4ʏ動db2V٠XwoB2+RF
4\SkD+9ۮ%_:Y)Nr<q>[Eno5-seE8ͯm\(S2.rR,菙X<w}yCDoa ЋE4^}[Uf
+>uIbNTKt taҖBT,`{jnMsTUptɵą>nZW*xnNTNOki[[<;w}ǦAK
\xDӞ~RiQIjYvL}e^xzM)dNLTS39P3I{eBvU2@U-u`7K']0̺TNs<m3uC?$=\t8<5f+(a+VuŦُCDP&%2 nfbB)]Am;
+TcRVW2|桽??=\s-p]%;7y}X
7zb
RAԴFʜVԂY/9y]SNkpg2`qb<m\<U-0Nak`Nq#Bغ]A`. *!}j+
UFZ(DǮ$!мp<p1+[PSrqQWM,p(r8w(oݫcyzj"$WRCe9@(v#4ikAݩWfJl.õXҹ,nsb?qf
cKthBИjMi]{.tP"+E/x g1]?O'Pc.PY9@Dyl!*>tvnNyRXoݴ#"
2l?@5{^uO=;AyId^ऌp(Y71hU ϯ<rqZ"<df,V=M)b_p%[Jsa
\L5
x@ʿ4ZbEwۧa vfԞ|X'+7ep(Ȼ@O D/ J`șȄyfquS$T͊uŦɉRTb8o%r%E`r|#>VЩm<1 zϧ[Z-np>p\*wz1ZD(/L5TQNd\jb@Xl1*k[]_˫Ms3W@sy$6sj8Za
G&WL3``W!QyrJwӴo, KT~<\eHf{)wrMrWk{m3OFض8w0ZUi~ kUĬ㾿1˅U~$x=|$X/]o|:cp2tLI"6"pUeX:G"^93*5
ȬACdAiqd:SUx0yPd̂DQD:uNJ$RDtyGDdaX[z+8VP""XY9lrِsmzt-H]CV6Q|Nd#5Ş~ۆʅ[$4?훍 )!T<rVǺ5=:1ϔOnSOVcC.>\)ifW(=u-ݷM\:c,E@8ewyAFZ@:CG9IrAs=>_^s/11o*WZV69?۽h`tcfƫF
~aA.˖uv/_y0~;Q3Rhs%T(oS#o
0zZAy#l
{+:pQ&WPAZ!YtnGºJY1- ۍNT:2Ԝ>379X@vYD9Cux$|f"HH3/$CII+G0.1?v"~p(olhze9<ȹh
؈ f$RjECAeޝUp'4Ѕ1VԻ |h 2H0f.qP5_)asH"aV1B|ϲvX÷n7m\B/"˰.Ƅr>f@
@f ;'<ˑ5Wӓ-
irpjo=1Hlw2i{`H/Sv[**JJ⸗57{Ioͩ$Өo^}xY#ߖ>:.2)xقs-_h,y{py,9 >gV96)NE$NW.b|MLG}F,lWl4PN@
[r 9X"`ɜOP+*XrdV2G5,DM9]?eS%'[E?^q7DG|P=F>bxE838*ԎFyI%e^[[-_$)Mjy
B:vM$$z(.1? uLT<Z+_]1W)? 8?<cue:@01NB Ծn+t9H9WZmm
5^: pZA!]7+QpuxLugN6Cq A
SYl#?$p.n
Yx#7Ԣwvfg߅|cwp\3*}RK?7mz"je#=;ԟ,^b0YJ9|;|N`Ed%.
fwD&؍|bǂs7?Y/0l[P8~d/o)Et>vlX7?cC0o{(x=}uv~.)H&Q I_ѫDЩ¬.慲dR23r>p_Ȱj?T2B%76DϛΗa40l|.W0Ö䄤aӮ46;LN"Wo
ҀN,H[߮ӓ+mV2BylM>#U?xx>oc~8eI"9{79E=<fG+h<[3BL=Y)h@ަ|.]ۏS3
endstream
endobj
25 0 obj
4334
endobj
27 0 obj
<< /Type /Page /Parent 5 0 R /Resources 28 0 R /Contents 26 0 R /MediaBox
[ 0 0 612 792 ] >>
endobj
28 0 obj
<< /ProcSet [ /PDF /Text ] /Font << /F1.0 7 0 R /F2.0 8 0 R >> /ColorSpace
<< /Cs1 3 0 R >> >>
endobj
30 0 obj
<< /Length 29 0 R /Filter /FlateDecode >>
stream
xZKFWfKyjS6_8gX"d/G78G
|2Ϋ]uZl˯EK>/0w$g?f3c]i'[[sS*'˻#p\(/EyPnzomu(_w4-6ܟ|?f.̊b>Ig涺-PFDTuOXsJ3V8upg>º6$ypL$o?RjyMBwn?E$Ofh8v8Zڶ{.v^A0TOs
\tYyW}fMm_}d(;6ǪXZr׆p2¾9}Cm/G( >7O_Sh'P.Y|=X1J͔aߴ #x[fufHpYPv/$t'IN+8(Ƃ]N%ca.DH{Z8 6q M=!r-Ћغ:29 $[+%r̳)r-I+Vx9+H|'Bh9lk
sX@e29қ -Uc+uu_XRG _839fW8CUIXkuGz̐V0lMKG{cu98
-'],l%("h(dDDpe1(_Ld6١+
]G䏌
a 2]ja4,3{V><4P!3G_E҃LwjKlJa&ۮ:n#
(%8TH&nx]\1q2?<l`J;%D2DR<砥jd4R=9B5̾sԮջz
M8Ls
j*{*ׄ*R$Რ0&L/Q&J͎#
M@- hi맜VP5bybPW\!|eH5z
*$uSxxHDPn7~Bqz3QA,qTMOŅC^GD
PC$ feiW.o@zH4cifÅ'N@/{_nRb>VH\
4 rl/B
4d
::Q\nS:,xQ{y>@rl#0BjU3:+2,9W55wYr湻
qe(PGbTmYHἽmcVqv|z\/-
C6{/9)٧"
h!-V%ULEJ(_rDH-f b(eyH&/
Qܕ5()OFt4JbUdX={xz3@r :NF d_PR*
bצlcNR&4%q("k|pfe)W_-oWy-%&QD(5mKƱ}&rFych;vlڇ^[ƓƃE@~$I?; +4R
˛xC71>;I3,33SȢ W͡3y<;?5!Q1Tׯ(ĔMƎR3vC]=^ZlVl +˲R>+\=}|2[*I}1ёHy1 #٤bW(m
ssKH@<*fqm;!8v4Vi%d"T t'at,S(*9!-993P+
e'#AO2cK}ƃ02u& ڀ3Wa)E:AǪ13Z`<L.eK
p~K`<*4D./hkg]H
@}FuXn3r
^.;eQ) 4]xmRJ<
0sӺkV&F$PJU%b R9'SM5rAanն*O,U=3ZaJN".lPiqN\)0?Z){2CTEhADXSvcO0@YZI3EqXBzS8Q*wh#S(~"c^d~!v;TP12CyXxK]7:fծ83?o(B{qH Z{e1ZQBzauj19皺ś=rƶ{8Lֺ\ݡV{\\)Яb
&n9pGfn%*<oReg`AlzK*lֿ./DÍvSwY(hoHHRNj[AС4g}¬l4ve:/RGJ77&J>AW{RdKdwܞOCY5>r!vqC5 (z73|M_>vݎ>%?~:4T\d7CmHV39qb"n@tޫ9J3Kw:.'ϸH3wz_hjʍ-sw$Z3n", |K~xڣVvG\Iar5V0wM2bn:b2?Bl*V7sxNڦN&h"BF5( m}G~/
R}:pT-)uHA_Hԍ:)
]`咚`6mFj
{9Zb3xQWK4zyn-z1y<D`}aUS0^bĉKT#&@tf}ruU"xiᙈ4\@Ob>ZE'{NN%kTfLdhu}:fQ`
:+?EXl_l],,$JHs
:^c\aq=
j98^nƺZ(WΓp|_:=m
endstream
endobj
29 0 obj
3579
endobj
31 0 obj
<< /Type /Page /Parent 32 0 R /Resources 33 0 R /Contents 30 0 R /MediaBox
[ 0 0 612 792 ] >>
endobj
33 0 obj
<< /ProcSet [ /PDF /Text ] /Font << /F1.0 7 0 R /F2.0 8 0 R >> /ColorSpace
<< /Cs1 3 0 R >> >>
endobj
35 0 obj
<< /Length 34 0 R /Filter /FlateDecode >>
stream
xYr8+ʆ~d3L3Uq=M6[%RMRqsޡ/EWEwXO=$U?ÑfC!5._A$⚡
#QtXCwN3SGWv2bB=
a,FDm7fm%Nc0aM$Y>Q
A]C 8zc5n\aai"KFHuuC%kvB*0$/*;jCXc|ms#Ba",JWoU:^-^Gg̡'Dp-%wM̙fdi/'J_o>~xX<PLV@+!#"(Da,WXOVa!D@ZE$MEs,CVhHS0 ^Spof.K$`|ΈMF!$P)-j%~qyv@nhtBBB̖Db:t9GX<cOR'(88sdaeI"B4$ܸ4z=[0&}v{]]@8Ou=Y?/uL1DSV*ǚX4|_ϐh|KАG;Vr"R}.48\T3j
SjL$
]Sy|02Ii
DMd)H2Wl$|-X71o:u>eh1W0Lhywԫ,a
LQW/k'%8(
'@W0JCQ8ߌiR, kOCJRnM('Dk?OYrXd>e4f}
d:
ȓBJiJ*[zA][Uh9*9Ԡ(!ء`FB4'ZmܐB
zqp_W/fuLDcd~dد0tj>)-
koCv_:EPdvB$pCtw>C J&a]ܔhI>SqLzh1,t~WXW~ϠG-ECV7YY!F~ȃAON$Zz:4u|4yDtho휶*9azpCUQ
-ل+7vOǾZ-#,4r럳NG'н7F1!9&*E)4# +TL342t@azݡ9pC(Hfp}ل߃Cn[Ti+d:Ֆe:m[^R@wO^n.&j:i`ߙY.0,|d:XVLp tr4/~ZZ\;KhۺnXaKƺs*N,67]T/bBA+UQ
arA[vYcDW)ozZ!Y6hKRK_1ZHfn^-T%u&;b3OW)Jv!}̨E'5,P?4=zX
AP;ج/ixLCSYTBx5t|hѰ*gTRM'7;88KK7մ0X0D8-w/m_{Nbʆ*$5$48kS3mrC/"汇0$CKT1JY {9>$|wX))v{)\ڨip^uqD>t-|F+Dn`Nȉt3WW///rwuWFa߅`酖@Ah :`?N֓/DbqSnm"U~*D5lQMcpm<ӳÄn@2իX~_~z.J@x`dGM1~b>z+u5c
@>Vo~8,! LϗrJUFd挏?0i?ӝv%\A~=?mD@Wn7O1|ܺ;HϷ8kG
endstream
endobj
34 0 obj
2317
endobj
36 0 obj
<< /Type /Page /Parent 32 0 R /Resources 37 0 R /Contents 35 0 R /MediaBox
[ 0 0 612 792 ] >>
endobj
37 0 obj
<< /ProcSet [ /PDF /Text ] /Font << /F1.0 7 0 R /F2.0 8 0 R >> /ColorSpace
<< /Cs1 3 0 R >> >>
endobj
39 0 obj
<< /Length 40 0 R /Length1 38 0 R /Filter /FlateDecode >>
stream
x} `U=^ToN!QDQZY]Q@
D\Ϲ՝tP{ェZn{|
0`EpާDccP{q)w_W0V yȓ0V81~q矑-)g0~@wՄ)yKVN< ^|L!55Ιf0VjƏjь=d5#]G}jι`z{^41/Pgg^^>{cU[{ZsNO?1<gy̹7d߹cϏT08ǫ2vM}tc)獟q1SΛ<ESb$;|a%oK6Qާ>4/>˼O}FOX#~jşOug+c&Dt)xr</݊eC2#X8Yp>\7|o|Q(zJqW;+Or2ZI&ݒ=='%/Hޙ\ GAς
(^###G%=c|(TŅ%(zȮx[!d9
zP8FA
ӱϷCosO+;PQn>GddR+|o><.碟CmڶRvy&9omm?%;]K[WZokui-n;aQog=I\QGM=f}4sM[ec[m`-na
|p6?w~WuM=[Mw]gfÏCQYy_^xr?]沧MSv%cKٽ.ଞolVwO[d3l6٫%2gl+{b76{j]&3Yv6;&l
;.d?is6].bl&p}Şߔ6``OJ7zA~5Ps01'mcP8@= GODZO:JG&{6;8G'VZ.?4ċb.$3ra\sѪjzW5p-\vv[;B `,a KVbأ1fX8#H[}4'_bq8s1Y4U1^-.Tq8CĔM *⤎c2̇@vXYE]sX%X.cR7`lVzbc%lv;c嬂U`vbF1l,lyIhg9-Phu^y&Yl+Y-UGAײGn`7O-`"l VvUw-G_\C?}M7f
/Wz7#f*A/r-"[uWTU*|p<B8ų찄[Z>+Ӗ9pX8&pLH0CF`
FE0R\zOK@>7tX
cXF"Wa=~P
Ez1~܄Q,GA1Y3dS-Ț`BFtoo L0q^Z!b -,KXn -aЊ@KpnβJd d =Kg+Cń,1[WJQ+UfZ\#
F1_,MA,bE,'qK-^\Ah+xLY xJ<-kZxN</։&,
F|+&.ߋ?NK ~n*Om
USYO|AC9\*
nr;<R%<<yx51{xQt=y/ٖ -|?ލ'ywދWyߟ䥼72~y^<G|̇Cȶ,_"- Et!h0<cgXqxixZxa4A3
_ct|wo?^ ]?`ѡ I
Wo_Mxކ ށw=x6`;|;S>/K2d %k,_g %GKd/6&6wfJ'V&7_śmx_| >!1-V~w=|_+}~Og?˟u7|_/W5:G[mow{}oGco'|?_/yS|?NM6t/w Dr{BBbBr}B.n؏0J,L(2}/s{elK4
e=afo
H8
/;X1>JP+L@[TtaemGp^nbbwvm:rwO"Jbdv#nhj"m_mvmaЪWcunbO`.Gߛ}fjߌ\o.gzV>mn}ڙJ_q2e\]l0=m[.ù&mix:[/dmm{4}han̷ }a
ۂ7h}rԵx| *߉gWH{
eik3G]PC}t`/Fa={<`3[{b}EJܿAe}.=K۷WqϢ}
{$w%?/7ωE#}e*GԘ;pLANqq[x4%,rtc+YrdVq[^vl~rpR£ƎkuB#Ƽ#
yC:jlr\s</ȎAmWN`d~#;aDc7=r/mm>!5J6FdW voT6BoiرNUV9&w&Jqܘ9~I Y?aDޮ[VZ6~^5e%9>d+93(0n0'5/PHx$qduګ1,-}Fm`.<15Kmիv߸qcO(bW2Q4]>܅7$iuܐkANՌC
1sڂa*i
x[83I?k~Dڢx7ll#H_H;rTDjdO,l.wh-Sǎ{]'/T15v etd̠#<5}4±Qރ;gRog$ɻ
JڌdgTJY"0Y=#Ͷ|y!C)LS?vu&G]?esOorFgL
&rihHf
O0CcGGw>Ĝ"a #gHst|r1h'6Bߧb#>Vߏ~'Ti mY9;\9~B's6Pa8ٿ\qkCUhTzj!y*AjI$
FuU#NQbѿ?eDeBESݗS;\N'SU[ bo| A#`#h9}]_]fgw(tHCgIvK9p{OzmOu 3dQy\uw,P5@nKKz`ؒCDzwPyY_Zq_={hheBο{Wp7w){)"z_ߊ;c9ed+ax}`7μdK/]]a6{f\cz(EJGWܧwDx֏\nU~75A>I]8gݨR,WJK /۲jj6e@Kj'9ኘFMϘq{|AWa~WtnR]NQ0#{
M
o#ofUv~9Hޯ>wRκnu?vuLl)S_s00St0+I^^b|?`?8s.✛]0qU8>#!jt1~<Src ]\?'uKƵN3]CyopҪ}>Pހg
q8
Q\/Pn2K"_O%=tܰj^s>1l5]k0g0ـTT7&7HNR.!U-kKU gW!%E
bΆ1cvkk9k
gzQL`FzVK`]7;)?<63#c(;nعs'ILE=6<'YaD$7(g/Ldsc ݛx_lZ}Հ*Gɟ%_o~pn{OfvvjػI8B}qz052sko1xDGx*3|HKyT\K~`<˧/zhEB+Kd)7]?[["xNQ=ٽ۽_ma(Ɇո#B%\8\(UMb6y:e{&\V
ҿa?O~!_Q A/w|(^a~wS98ƫ8D FH \&jC
!U
!q(-kތв.?m<[pȭoͨKj
2=_yQ[^$Vwξ^=cZ^hܥN{2V=@Z)ʪ;{0u98LXxn=>
.*l ũn|^r=4]CJ0?|Bs"9彴J\?/ȇaPI$7[B$ O@b@QMO_N>_E2tPAF
Ja
ݿ-xLp*{s
x!+q|B;mg6zTVrߎP?@t?? ʰɨF,&P_P7\58g`aTy#enҲ24Z˪ـr|UUCe8qYFRBeho~\\(}n5o$caǧC[b=c%h/P<Ӳ.S6#VOnmgCG7,%Y,a[ZbN]wx
p_߽M]TEY-KYie
]`b=n !
g~h(ZΒPb#b`XlDOTh*<5]etCiY'o*t:F/0T(rtfՀ&EYʂX$dJ\s;/ͯu'7\9Vm/p߆zYwOXvHƵ-hO5ԜhN3kMe:@:ə,IihQ5tN0Lp:čZc!ލj"x'>!NY2RTjB$(.O&IH~IWczV,hğ[z`w?V_N;Nh
V!C zE+6YXޱ(<ɡ. au jc;b^fs6ͮ9L`Pt@ɵvmwО{:laA8w#el0l=.1za؉D[66BnG^DB&(1;ٽDW)8L w"j?w'p),HΆނldad]37LƋGyV4߹;Z?KrtוyҍW>Gns:9-]5a+!
:yѷ1XmQ0Eđ~AdA/F
3\rF.#0ѡ%4E#zN<Pu.U!#yv0t)awu(CiT5Ft}IB*G8';(My
zdPV=uWoZbo|9x͛\v8i
%ѝPJo^1Pݣ&3}RQ.U;7?1ZA6M_83>M
j01ͪՖ8\݁VEU!vnPA]Ż".z2tR'_|z2lvSj܊|sQt&L̟LةCM`z`S@$L=_Q'0(4䆜e9a٫
&[ 3_W{T`9݄Fƒݽ٩4Er$+N$!we'P#fV<bs)2SEH!╊e"KL}E^YIHz0/4TMAYe!t(bPL&Su|.R0gTNqY&ZKᬫ5LDW*
SBQ ""ď~k~حni^/Cͮ3T"IM6p
.^My?48
T%)st5"ĂA#{^GE9_f""[3Ne*T$T3dp&K0'vV[(J zI,/ xM#)B$%O:}A|Ku/Vc/W2p'=liW<49R̮i{-ގTCM!L
a7&Pf11>t/ƅHnt+n0`H?M<GL(?c҂FjL_Ѩl|Caz,,#w;{T`5<q63O9е&q7wgCgFS$=)Lgj=]L8m=kw昩·`MgOԛ$auѽ"#"5E8eQ|9Lи<b/סV_ׅpf^ӧm>EnIb\x=Px
YQrX_3"
~HN5ط7>n8'IK
9.<u YyVfUu~~o;ob5n磾e|d,)^#imjOYRhIKw?LvTj?&JUtcDii5hVf$mΒ1vgkRCpba0a`Z<~>ҼMsBD7;춁@7<aǐ-윙=L2i^A
0fN̾H)Lf>r_*S7p;;qwB`g^zcFS`jФ7OKmR
.P uUc.ү}Ug ۆ S 1Lל4L5@.O+l@i+儗ac~oCܖ'Owkz1O|jB=iҵkj.OMoʄ:Ӛ0 s2,>5Ä&L!,(չ, &nQ}VT!¬z* D0cgI:c*IL(К&>O^7GUk8%8^ي.SZagȧ.oF]ԻZ)u;u$N&;KaOmQ0,;j Ųc6h*Ǡb@f\Ӎ825X/ /U!,di"N\#0\RuX@;l((TZ7%;<2t[Ǐ]1M!YoIW@b.-
Qูe[uOE?V*L~N
1tאGO
#ZP2Ulʇs5u6p6
42BZU/&b?b_=rk*emOWa<#L|MniQӐS+k5mb<<?cYd
{\p{vEp=Ž]잺~CQme8;[qV)h"GTh/kGFȋcdarɍ2A9ZM>+(/s0=|km'=OR7<w/_:<ҒIZ
5wU.#Lt
c([l8c3Ig)Rɼ)!I*/W-mw*mƭvmF#p7MłF !poq)!i <,6.>%HGa?TWClkiDMEt
G2m(e1Ϸ HmՏyoL͉p^fR"bӕLL*!<*aRhɴڷ.r]uj+
O=rkVb;Eqmо
K+rrA%
.,Q1k^k<+L
+]{Q&gw5Ϗ;
bD="zw0uE~vUDmfwHbE'}̪Y=(hkY2QTC7Qiw\p O/ٵg>?kk']nba.=iGrmFuyIjLWST2GY
K}&ѓq$-}#hŤ
DXyֿ+_]-YǷGS#llj@Rb^>`@EH
2udBDm>3h,襨^xHuHY(!JhDyG>K_
O/kvk;WZ_9|cjZ"lMjk**7e(OPT
5&(+E+[*ZnPz$^j&cwVn,p?7Exbu$$ho3uO°[OCVGY~-JwrB@0gkzTtKYm˧eï>4t6K@2[ZBj`࠵#D
|LFmfb"7&"%2ˑ*?ҠznϪ*=H=?2ꉌVhtr;u'kd冟f*E\<Rủ,cffjHKW
ڴ1Cp~k1媦_o%4#.uLTfQUUyuSV{[dfZ(pn1lֹ7Z?1c2EPYh(cJS)tVvaX)t*!f8n,xA.[oOZ[vJNh%=2UuM]|ENU
kC54xY)R9Z5:cVTs,P-[s'ʜK&P+'#w)fOd& $xr1]nZ"*sԾKЎK1iET9iT6;/K( ]d-
A}
^
EV+}0#=[[~0n%w;5sszޫK
=8JJfDV8H]GrF|p)6EC,
eSU P
@J,7֜ >9
Yhaʎ^QQC]Gna'\3l|ՠFeJ^
s3S7q)9I<Xxs(מ<XT_`K}ZEmǻܿ-`WGȳ&~blңVi ߉Y,0Es\s@Ŝ9̞s<;hϷuě^(S-IӴ^+Ī5w@wƥlXԢ
!^wʠK
YÂߌC+1yjCM'Uh@j02q@Bg%v
Dh)̀"/PscDu)CgL:Uq~NjOȡ;4˦{*ܼZvp~oCj?~՝F/>Q#&RLp>8pR`|@`EphP
FUBHC<\ERa㝔Ho$n2EQY8V@o~i#X_H㭅U0 U{;xJ
`<JR~eu|3~es;błpE-V_ְ`7iNvA+W/|/ޭhu(]P08Jڣ`
]$F$Mz(YBs#%ȇ¼(R;ت=V*-/f-n:$9xGhAeL}'9~g/܆~c].y]%wq0>bRA]&2WC{t(M**诗&հBVvlIJp< dQvoMi67SEnM5@*ܝ7"TU*oV3ٽLPn9;#nvvœ\MMd DdF.5LjLe:
JUAQdKέ6WW%DLPRYuTbPIfR5/û]Jv+<読OZ
Tf,ZܟղJ[181:"uUN\yBZe[
)4` 3rT
\sSl^.E1l#݆hOs⾖zf'IKQ-Jۭ6ty7-\Ҷm]swZ{O+iB!6qcgm,ߋ/;r?| F4:!
q_'^wjo!4Tua=1iZz2
1sD*<CULVygC~gk{j\4vᾶ*7a\:"M%#L
B i"(y 7huvpBH3pO6ю>Oiڗ@ҤϽP}v#6(](#of$ML!ӌL_l)_Ҥ&&$4!V^ȇKP3Hc#{*D+aIMaY*ge"+%l_A'/#WWҟ_Ȧᝓ1zxW^_
_ahM+!x^ңeyC)N,Nؚ<naf
5Sa~pr|/o-#Ӻ@
5y.9eoo
0.3W0-k͛= Or_w|K?&L;;'ګ~Iw Ģ^N:}ڞ9m#LZ흹]}GkPV9'Vab\gTà6
&fk}fhil3WҪfTߛPQ{tTe%L-%竈գ{5Aw4E6-h-?qD>aթja
YqxP{=|
Kܐ9WKEB:AlM,sz A:^ᵈ'>z{KY$|]<tm4NSj\L]p"`
R,ة4XzD%ټ_k/ =MPǮvOT8Vڇ֥0Wu&j;u^>6-MSݶ
Qlp?r?\7ee^摪Uި=*Y? =
~uomݍ#_%O'J`mJfϤίQTҸ5膢p۲ghZ\(0z^YoWr
7n
C6&MdLa`6[ZFLBTB=q.gEډAvv o,u'Bn,}]p;
Ng{U11OHTƙ*%(qhȵp @XHUj4as.+Tޟ&a8]۞t>1{j,PbH-YitO{*'Zr/TWD+ߴ6ӘSWUErMѿsYZv>=B9) TaEMOѴ}CcooO3BP'ާt{x1}͚k#ٟ(SNVPDCbYbcbGBz9#p94քe& Xgb1;L8fYL4ymSMVl@&*y=F4
{$ud"d{d˔pC`]C.]}}~R\s~nԕyug_qN-apwk'C&g;?uq>xoK*yÇɿGx~rC)\kJu:B,Wspo͵͉_9F3auT!4\8=*Tjr]WLuU<QgmkOrt:B]n<KM7EwNg`ˆi+ B#"!~MH7
1UVx4oYӜ!lTFe[Zu1PԬ5C(Ӎz4CP
OxB:]>YH( Ru):INt4&d_W3#B([jnPO͗SkRBvX(~$=܋ߦ0U_Q.1`[&E1L[Y
<ݶSϲ>ol52605TTiZZd!:q7jF랋&WO2-PPt2ixLkfq5Mb,~ѳ&ȿŐA*T<#P#IY*
=t!Q6axbEj(4Xd%
]z-hx4-2kotRЍ-l*%?r=fK
r8l|C?̢ɭ&Fe;)Y3rf9q{bꪉ$Q7
i]*A B1i4Yn8nh솉!& ~CZ&MBA"pk8]抍@*-#BBoQJZ4vT4s#Exnx 흠o25E^JC 1J!Iei7rn%
0Ö(8VlӐJ)qpoK.HFd$ jYit)mP$$
<ݏ3NxaG3$"GMO;"
soض'0Jk:zf;~ughY$
ÕFKϷ/M:I
O+>A%M JctA?.j,M)ׂTֆceF2e6niB)a4^W~*櫓N)nAMd C\džA.~):|(/
Kv"1L#$o븋g&
2- DTAązݗ&#tPD'!yM@վ&B@XL70$;#egw=%JҧPLHVtszvDc)$<I8hPmPFT24!|xldLE<eФst[
pRE=.6F1%j.&0S2y\2
U-l
T<#eY A[4,;f$
==~ ['ffdgm랋&Wу#GJGYh5CrɊ
9{֢䉆BOLů
P&1eD%
{N6A>u⥚)E7aG/z{X%>mQO~=AUԫ0kl`A#u/N勚
%d/KEMnؾ.Q.85H l2Q~wAH'2;zQ&^CBWd2}6~*1Ak^Q|rhA/Bp^`(K`Ƙ}'K ~<T= {bLWrrXl1%r8HAA&YC6-euy~!=Ӧ6"!)JL]rEp4Vd>=#
gD%NuKP(9/-O,hh-4N؇ N
:()>pX۫{ŀtL0qDI=n=ys9z4#vA~|,H>Z3KW|,~8h(MB Jxܒ"Y-a4 A90uo=/ "A7bffY6^gU#*(K`D:J4U%NbO·,3J3wL&cO'Y6\K'r~ʹ(lA/#>9vϒJA{FdVL
GD+D 7䔶 1vFc=
DöEDQB)HR]4ɺC>ϦtoB2dХYϏ72I3_#KĻ>-!Z<v#RL=$!;I\&Q[Fc1ҥp5dRRp?'8({.ҚNYI2@RIfWnvW.Y>߾t0k}t@
AP4(
uTT|(e!eDULpJJ\JW^q:D|zBS31Ƨ>^/A^AcJ%Κ"Ua1)AՁpt%M0lD,1+
#%C1w1lrb]&5kp/ô&'G A1td2f]^ Kʘ$i@~=@8RY^]q%e3T
H4(bIjevفJ,~S1,wū{v§ljHHT
=OP~BHA֨Мuq&}` Pl|l;D"4LQiQ!:8&WKJ=%\iYmJf5auW.
=
j$Aԝj
t1t?D1Rl[ZZ aW^hT S1n8TRZPlgaR2⠙v6wAˣфs^-m|(DE &Q{dW>":bVU$|#˳u& "MjX,%u :"/+5$:va"Fr.lYZ)b-FA(iJ:$&7DwJ6Q663(2&'[AGG"A2E\r4#CP$<QҚM(BF}h]
A#1EDtD*qʬA
LǡTҲf0 jwW.Y}a&@L*PJjRjAPբP)/BxFpRkA>z%h*aT`H7P6+OH8⓴E"
)̐2\+#"+DNN!?Ф83EUYtq<2Jttn"e Zľ$˄dP;nb)b8rj͇,;a&>'Dx_͑Cv}>>M`|:}JBHi0
MqDJ2^HYA8H[(<G[NddtH:
opD z;Sa@a(~I:<=
yQ-m>H
{dr
9
*v;ږ/7"^vf%u#O~I$T
Ǒf{q~f`4ڽ=RRAJW"!aMZ%
{(.@IJNe /5$`^0D/^~_ &BL^*Cβ%b,4gM]c5>v(qyNB]@d1*=~"OhmzBӝXCM"II(z,,bDcGOprj͏oA>:EHhkEl;T)~h/!E$$NHAA!o'.r~ 2#iJ~J EJңM8h9TDgQXDhI8h2C!Y|ҥFvx@G$Oآ yhF&'0"Nf?ݐ?G$ҝnA/3+az3~Ir4EEv8L%5њYbBBYC::A4Q =(-z,45M#]Pk4;Kuk:]mz-ދЫW^_И&hkQ#JBP.#%plػ:k
ȚNy(&cqJLv>nߕrdew\%]&SB= jq;va~BR_"ԝp}v^m9EC}'y-#Æ6b.ZܞC.=cPrȧ?"ۧSZPҶ8F G<M
`ATo@AvL[B=i>#E+B*;v0u:U-
DcodQ6Fc%7Z[Шߧa hF';Ns8!nuiCe-]Ցd"oi;R zu"
ˌAPHA&pkjU)G/&zXKBC4to
9v%zq:R39Cm1bfva
[z'1BzPУ[mt{WCA+_vfZgdus"ϔ@?/FöD6K˨QF
ћ^nVW`lr-VR?TAbtf>,~jAWdgIn77Bc&biÈA/Q <=P1|,JS2=p21\">@!v(#x';
'j50i=~OHQ-aM00r&4~v2I#-GU8O$5d(Lv0dCzG(tk_AU GBFaP-B(d1hҕ`%*Z"j%a <%d^:
/e0+q<Na:U*/5kXWxPS[.]֔a;>Z(ZZǕ;6\vܡ ="F2AGj'g_p8m3`)`[QmAnBقh?젻_
3N2V1@Q[#-A1s{]H7% Gsh,AqCWOKMB[c$qO,ńQ.ЌG*k*o vIN1g>,wbXamD`jv#7tTC` aOZ&iM;hdRvHP`
aY#1}B6 zyQz?E`$ӯq;g}zFr#m1m^ʽkN!ay1
:a_'yEv( 0b*
,hl-(2h־wXlGbШÊР%h]GP9ZɐHv0"+;H$A1TQ]Xu<UPȉ#GMa2X<Ab8NdpC?SMYdl
C^bWtMFَrE;H/Ы2Pu$X#`0Aξj m3c[z7;FԄ^'rO[
&!Tf-XyK9 gKN;aFS`6|%5{<(H}+@ Mv0Q;$~*3}(G &$=FAǛtAz!!Du b;\鋶{!zވA,a"!AbgbX4SIbӎa=2փD`tA-h:cD<DĴQ9*QD250hֲ
<`0
IA{rj#6o@t_ CR
=mNQ\;
TUYvvpjK׀xM*4KBC
DPODvPA, 1O(3H!=*T@pAvмH^$V]thv%X<'WZp&J
+LRK&:oᔛe; =M5[zv)1? %H]R˶=>7L HnaD%/]Q$bnMw:NTy|zS>feMlʚz+ёӏ!FFYv` I2 6aZE`8zc!>6@֕~i*
"GvIht8~h"bU(|cH_ U@X^?yUzFrѪ(xsVv2`ɨ`ZJIa=Į֝J@_
6vaA_<`JDQx$e/$d1!mtk_{mD_ T%QD
%`
cZJU Ю1b#\?NFH/tHm]n5#!maz
4ڨ&>߰a#FP[%RI/5$1GW^ #*O|h4@-RD#cD{ݢto
9],l;jhvEKJv^SPM5=Z@8Fj̠ xQIP@X&-H=1zx|
{@ e؝-2KZ \lVn]vI
SJ#WEHt0MozpA'=;syݰC +z$d
6+o;{ -^gAcTvFL&OFK#ԗ 1Pa^vT#;IPCikBx!I$`YcI}~PX"q'U'jz`Xa@Vb>+ZD^/(ن KhÚQ/2{0I'lr=Πsl`8'% $)hv<uk?^ZPO \(9Is0zP*d-BX7C8PH<Fg8%;7*'Nv0ˊt'i^4~##8 <UF#F䀪 VAvvHd`<Gp59GV?638R-i-$M ! }fxzBG7XF}Qa1e}$sWyn$5L HnUţQ&0rw::LKgimxp׃-Z[*bĜv0b'h;1g5cbphƈWI^o<'
[O$Ń@F!ǿ<j0PK/Q,`d2ǫA~4O(DxΚ*^ON) ׇmHԔ֣S~ `]h^3`?AXw[+%_WZ"!E쌣HL$aA
lcqd,D8An(]kn*兠*̯` s쩩Fbbº!
`IѰ~T]$Rtz5
ZdYBtަ\߈z0Tciѱ"jO*Jփ~ȑcP[$V*/5O)}ȀꄣCXl}U0VELʐ;ERXLWM)E;5_#CKFKp+AjXvA8F%Rh!!g_jjltۈ)իv^M3[y1(
TED̡YT7AҠ)&'GvpL>̣*m)_oǬlHك5k-VR`<x%ft4n>,=O\;}}/ +a^:6=}ޯ\V.mVQë[s~ule<<p^BGԁ' I0|π,Ki_e~q\~b_G{fbZc3/\{gp Q@3a*3Շʩ[gV!,XNPbb1 ۤn6iшzG9'ؕ;6a,މ-v2\Po
7ٮ/9e@,xaP2.`Ӏ:VٳaAC1wnـv<H%0{5MpY=t
17$P>AK˹իzC+O;;Kw5OzKַ"lqGyv@9PWX:{S-,LwXGE<w?qa)w~>⎲Q)֮.cp;Рד%8t=rk[zC|tBv,q#F1oKclea<P_|'c}4i!
o>_V?MLc`MlΡo݄p_u;>SW.0&+v*}_hSޯ=FA7"0lg۪O=y ?;A/f;<wq/fyi;j_&}ؠ6}c!3{gC=FQ