rivet-2.2.4/0000755000175000017500000000000012630261051012134 5ustar manghimanghirivet-2.2.4/doc/0000755000175000017500000000000012630261150012701 5ustar manghimanghirivet-2.2.4/doc/examples.rvt0000644000175000017500000000704407723457735015310 0ustar manghimanghi Rivet examples
Rivet examples

These are some examples, rather limited ones, of what can be done with Rivet.

\n" for {set j 1} {$j <= 8} {incr j} { set num [ expr {$i * $j * 4 - 1} ] puts [ format "\n" $num $num $num ] } incr i puts "\n" } puts "

Hello world

<?
cookie "foo" "bar" # we have to put this before any 'puts' statements

puts "Hello world"
?>

Produces:


Conditionals:

<? if { 1 } { ?>

<h2> True </h2>

<? }  ?>

Produces:

True


Loops:

<? 
set x 0 
while { $x < 5 } { 
 puts "\$x = $x<br>"
 incr x
?>

LOOP<br>

<? }  ?>

Produces:

" incr x ?> LOOP


Variables (environmental as well as those passed to the script)


<? 
 hgetvars
if { [ array exists VARS ] } {
    puts "< ul>"
    foreach { vr } [ array names VARS ]  {
        puts "<li>(VARS) $vr = $VARS($vr)"
    }
    puts "</ul>"
}

if { [ array exists ENVS ] } {
    
    puts "<ul>"
    foreach { vr } [ array names ENVS ]  {
        puts "<li>(ENVS) $vr = $ENVS($vr)"
    }
    puts "</ul>"
}

if { [ array exists COOKIES ] } {
    
    puts "<ul>"
    foreach { vr } [ array names COOKIES ]  {
        puts "<li>(COOKIES) $vr = $COOKIES($vr)"
    }
    puts "</ul>"
}

?>

Produces:

" foreach { vr } [ array names VARS ] { puts "

  • (VARS) $vr = $VARS($vr)" } puts "" } if { [ array exists ENVS ] } { puts "
      " foreach { vr } [ array names ENVS ] { puts "
    • (ENVS) $vr = $ENVS($vr)" } puts "
    " } if { [ array exists COOKIES ] } { puts "
      " foreach { vr } [ array names COOKIES ] { puts "
    • (COOKIES) $vr = $COOKIES($vr)" } puts "
    " } ?>

  • Create a table on the fly

    
    <?
    set i 1
    puts "<table>\n"
    
    while { $i <= 8 } {
        puts "<tr>\n"
        for {set j 1} {$j <= 8} {incr j} {
    	set num [ expr $i * $j * 4 - 1]
    	puts [ format "<td bgcolor=%2x%2x%2x > $num $num $num </td>\n" $num $num $num ]
        }
        incr i
        puts "</tr>\n"
    }
    
    puts "</table>\n"
    ?>
    
    Produces:

    \n" while { $i <= 8 } { puts "

    $num $num $num
    \n" ?>


    In addition
    There are many, many other things you can do with Rivet. You can, if everything is compiled right, load tcl modules, like libpgtcl.so (the Postgresql interface), so that you can interact with a database!

    Return to the Rivet homepage

    rivet-2.2.4/doc/Rivetlogo_smaller.png0000644000175000017500000001565707672102547017134 0ustar manghimanghiPNG  IHDReE}bKGD pHYs  ~tIME!'3Ν+SRjʕ^z魷ۛy+9rw666"KdW^sT*YSk %tgYn]3n;sb.hc=[ǩf%~S@믿B5@gg;u z >sW\Q-GsF s:'&&>u :;;~qsJx٣a۷o:Oc#f9({-p։Dn\#","jxן{.1=52 QA3r|Ƀ2Xf3}?DWٙ/BSC `! gϦ1y;vj3.wSz䷾xխt`Fp%iYmݦԬ^H}}ןoLPL&x#;~}u/n?z "Py^w""s~,m-BvEB 3FbdNj4:yuƐifphO;vKŦ>.!rұ@=܋/XMgIu_kkmKs@b\w:XSH?O-.r֬SXJb@B3$Pʽ`āwu*, XA(P,>珗soÕbC6 M_]}ዣ'e~(ӎ@ 7t ; {;@R54lK/x|BMiŃR%+_uO^k] t^o=WUX,666V LH$H(Zv H#>;9)Ǐs:LT|n$SK!۵R7ysT4LS~F@)a2%62T8KtJѧx?.QD#;]y[nꮗO!0cܡo_VLv]7kT;E0 %#=[,N'S'.iLw)`X].Wp˯zE=?iO̔m5VSC_E r'z/F|$vg6Xmf Zi3m Kv@bm}.tl ˴]v&Be5g/xQӇ;@ ̼  4+ 8mmv &&|S2kֶ UXb hU_3"]~û-"lnc H ›7Iv.%X@@rJ@Pyr-Žc]qq eG{lβwmۗ= p]wj砄zXRǎN(Q]( 73gl TO`ɈlfkNu:e4N#C#GK`6P?_ШJ"onDco*m[}@d ݣl+wd*-oɓQG=F/H -c+mFtI%8X:g$xwR\=t[օE,@7px? =aYVՕopoo`|/<R/߯uZnmT&@`RYe˿r;=O>UfEXhW@`⭽*9'E|J-[R> IMZd !g[|6XtSSTC$nOOJ!Oh- ߵ;DI5qS  | B; MSOL䮕_/_]^5ђ#A dی)[\A{ŊgL{0yhVȖXkNGGa@2Fԩɣ&Q"ƍÉ]MI`!ߟ͸(eZbT .1U_\^|z$0{WH E9ҥĢ3TT \Yp]D#0,: M%ae[|7>/Ε핟 %>ˊmS&1y#1yE}}}`$ڍ"-'A9w뿠0+k t7U,$L$r6h . K$+Fɓ'27Y]%Y\oQV GFUˬUu2,^e751ߢϞIRgF[%xBB%wu2-P ) L<6ۈm[H.{0ud=^׭[\*P@m!M }dY5*"==Rd٣@Bo-I ܸ ϳh)dcG5q %s7-kܮ]{M,[ԅ.YX'k z8`-[!BL 5śQf?|%pfN9ww08om&^gڐzk֞?E<}:ys{ZV{\g0%u0F{Y' a+`0Xj/ZI$kW8Ϣ<|8ғq#D4@ oX86H n]HDDw8_cv~˭6Ylۢ ЎDee2QttPخ==B wnRZ u_f{|+㲡r-QY'~_o^E۽GPp4Yt>LOT vc7kp Pj#ڼ Ç;_,Lf 8>' c(@-\drhH$R ]sM H:t̞p1%voeX B~-W D F .J"Ϟv 4,_洷,L ,"x_|W ^UZ? UPP_st+@HEŠ (EYda:^@`n:GIZhp#(P_ԈcU竚wMC7$~pՇ#+V2e3HPʑX@f,VB`B qGkФrGAӅsx V`g.+=p8i/ݛGA`ȣ~--7$]+oD^u LZɩJZK:N7ewI$>xTyH^+_QS0LwT*Vs_=/@`^w> Kڦ>Z½2P uwsnS jzgǒN,/.Ӿ*A;*&p).ZwRHHj:{Tvj9O> djS7~î@B. 5gj)54\@E,!u&3=2) H3g'NLlQCږRogILr.I&"*52|D)*~ɱW~x{ǯk*ȳ4MRhYH(~Su}N[d;K9(<Ҷ"D4Ԫa㎟׭黔Hd|}eTIڳĜ)%2]t,80'.Ъ __x(RJi /DdKϹ_*q p7nT!"B˾{C?֔o"'Qv) >H`/nfȼDz  z%Pd}[ ޽W*!@ןCVI]OOⴷ{ǵM XYgٲl]&b-]޻O=9sI' 2}LhD=wZ}Y*nԥSFW8vxP[ZK;brTT%W,d0٣tPT(zt*e"8_kp(BE {7 H6BA@'Jўa4錧Tl&1T 8ǰ#>X HH7BUEk[WؕH*-HP֞,O$AsSDnGCÙmYsa4JeY~$@*2/BW ``pu$2ƚ'E?:48OY28Pc}H*=E(THp[oi}ooTW؍u(eZʲ꯾Ʃoq%ӯ kTc67)4[(\rI쭽.MH:=3O?]>u_gaV9Ik9G-4$UܰV cjȯeVʒ(@SCD|lQkuwz %KKtf}H_oV$0?6/!$:pOfCi`j1Ǫ /.(wRUrFW1+# *,+Bl(劥r/ęlnSz, >9'eP~\^ *C!)K!2E k+UW퉚E2݊LIf5W~{N(hf)sޯRq?K(-硜M@# 'UЕ"iIJAGLfDMT;#ԸIʕv[{ptی%|8O5\yO>7ҧNJ2Yd\M%'uʚ#`ym9 @XM_xB`鲢XO"uX3م"dAD!eKz+D7CE)Q ninwo)=z&=:*r+J> 6*Ż?] Tӄ旟a76ٕE/d [t[50>b8VvTR6=˶[Z얖Z:IeWQq~ CzLw':q2]Iu0. ,+ -BB.L atv62/A SdK8NfL`P$bҬ:3=UWXbL]:>>vB-F90dyTj@GSrL1(D'O3 1;в읏=w!j%@׶m B$ikmۖe\x2tTK_T"uK΍OY&n_e `FB!â$Cw/3|mcZkCuH{{ӧkiv͚5ZsssQ5*~9ȴ+s,KYb,L l2^/F @2[&gÂEo Resources - How to Get Help
    Mailing Lists The Rivet mailing list is the first place you should turn for help. If you haven't found the solution to your problem in the documentation or you have a question, idea, or comment about the Rivet code itself send email to rivet-dev@tcl.apache.org. To subscribe to the list, post email to rivet-dev-subscribe@tcl.apache.org. The mailing list archives are available at
    Newsgroup The newsgroup is a good place to ask about Tcl questions in general. Rivet developers also follow the newsgroup, but it's best to ask Rivet-specific questions on the Rivet list.
    Web Sites There are several web sites that cover Apache and Tcl extensively. is the home for the Apache Tcl project. Go there for the latest versions of our software (if you aren't reading these pages off of the site!). is the first place to go for questions about the Apache web server. is the canonical site for Tcl information. is the Tcl'ers Wiki, a free-form place to search for answers and ask for help.
    Bug Tracking System Apache Rivet uses the Apache Bug Tracking system at . Here, you can report problems, or check and see if existing issues are already known and being dealt with.
    IRC Occasionally, someone from the Rivet team is on IRC at irc.freenode.net, channel #tcl.
    Editing Rivet Template Files Rivet makes available code for two popular editors, emacs and vim to facilitate the editing of Rivet template files. The key concept is that the editor is aware of the <? and ?> tags and switches back and forth between Tcl and HTML modes as the cursor moves. These files, two-mode-mode.el and rvt.vim are available in the contrib/ directory.
    rivet-2.2.4/doc/xml/commands.xml0000644000175000017500000016477512626166473016071 0ustar manghimanghi
    Rivet Tcl Commands and Variables
    Starting with version 2.1.0 Rivet command set moved into the ::rivet namespace. In order to preserve out of the box compatibility with existing scripts, Rivet exports commands by default and makes them available for import into any namespace (global namespace included). Rivet's build system can be told not to export the command set by passing the switch --disable-rivet-commands-export to 'configure'. In the future we may change this option's default. Commands must be imported into another namespace with the command: namespace import -force ::rivet::* Whenever a new application is being developed and compatibility issues can be confined within specific files, it is recommended that commands be specified with their fully qualified names.
    <?= ... ?> Shorthand construct for single strings output <?= $string ?> Description This construct is a simplified form to print a single string wherever needed in a .rvt template. The contruct is equivalent to writing the following line of Tcl code puts -nonewline $string The string argument to the shorthand construct can be any Tcl command returning a value See Hello World or Variable Access abort_code Returns the code passed to abort_page earlier during the request processing ::rivet::abort_code Description Usage of this command is meaningful only in a script set as AbortScript or AfterEveryScript. abort_code returns the value of the optional parameter passed to abort_page earlier in the same request processing. abort_page Stops outputting data to web page, similar in purpose to PHP's die command. ::rivet::abort_page abort code -aborting Description This command flushes the output buffer and stops the Tcl script from sending any more data to the client. A normal Tcl script might use the exit command, but that cannot be used in Rivet without actually exiting the apache child process! abort_page triggers the execution of an optional AbortScript that has to be specified in the configuration. The value of the argument abort code can be retrieved with the abort_code command during the execution of AbortScript or AfterEveryScript, allowing the script to take appropriate actions in order to deal with the cause of the abort. The argument causes to return 1 when the current execution is the outcome of an abort condition. In other words this query is meaningful in code specified as AfterEveryScript to understand if an abort condition took place beforehand. apache_log_error log messages to the Apache error log ::rivet::apache_log_error priority message Description The apache_log_error command logs a message to the Apache error log, whose name and location have been set by the directive. Priority must be one of , , , , , , , or . apache_table access and manipulate Apache tables in the request structure. ::rivet::apache_table get set exists unset names array_get clear Description The apache_table command is for accessing and manipulating Apache tables in the request structure. The table name must be one of , , , , or . ::rivet::apache_table get tablename key When given the name of an Apache table and the name of a key , returns the value of the key in the table, or an empty string. ::rivet::apache_table set tablename key value ::rivet::apache_table set tablename list Stores the in the table under the key . For the list form, contains a list of zero or more pairs of key-value pairs to be set into the table . ::rivet::apache_table exists tablename key Returns 1 if the specified key, , exists in table , else 0. ::rivet::apache_table unset tablename key Removes the key-value pair referenced by from the table . ::rivet::apache_table names tablename Returns a list of all of the keys present in the table . ::rivet::apache_table array_get tablename Returns a list of key-value pairs from the table . ::rivet::apache_table clear tablename Clears the contents of the specified table. clock_to_rfc850_gmt create a rfc850 time from [clock seconds]. ::rivet::clock_to_rfc850_gmt seconds Description Convert an integer-seconds-since-1970 click value to RFC850 format, with the additional requirement that it be GMT only. cookie get, set and delete cookies. ::rivet::cookie set cookieName cookiValue -days expireInDays -hours expireInHours -minutes expireInMinutes -expires Wdy, DD-Mon-YYYY HH:MM:SS GMT -path uriPathCookieAppliesTo -secure 1/0 -HttpOnly 1/0 ::rivet::cookie get cookieName ::rivet::cookie delete cookieName ::rivet::cookie unset cookieName Description cookie gets, sets, unsets or deletes a cookie. When you get a cookie, the command returns the value of the cookie, or an empty string if no cookie exists. cookie delete will set the timeout value to -1 minutes - deleting the cookie in the browser. cookie unset will remove the defined cookie in the server (perhaps preparatory to checking/resetting the cookie). The command has a number of switches setting a cookie attributes debug A command to print strings, arrays and the values of variables as specified by the arguments. ::rivet::debug -subst<on|off> -separator<string> -option<value> -option<value> ... Description A command to make debugging more convenient print strings, arrays and the values of variables as specified by the arguments. Also allows the setting of an array called debug which will pick up options for all debug commands. env Loads a single "environmental variable" into a Tcl variable. ::rivet::env varName Description If it is only necessary to load one environmental variable, this command may be used to avoid the overhead of loading and storing the entire array. escape_sgml_chars escape special SGML characters in a string. ::rivet::escape_sgml_chars string Description Scans through each character in the specified string looking for any special (with respect to SGML, and hence HTML) characters from the specified string, and returns the result. For example, the right angle bracket is escaped to the corrected ampersand gt symbol. escape_shell_command escape shell metacharacters in a string. ::rivet::escape_shell_command string Description Scans through each character in the specified string looking for any shell metacharacters, such as asterisk, less than and greater than, parens, square brackets, curly brackets, angle brackets, dollar signs, backslashes, semicolons, ampersands, vertical bars, etc. For each metacharacter found, it is quoted in the result by prepending it with a backslash, returning the result. escape_string convert a string into escaped characters. ::rivet::escape_string string Description Scans through each character in the specified string looking for special characters, escaping them as needed, mapping special characters to a quoted hexadecimal equivalent, returning the result. This is useful for quoting strings that are going to be part of a URL. headers set and parse HTTP headers. ::rivet::headers get set redirect add type numeric Description The headers command is for setting and parsing HTTP headers. ::rivet::headers get headername value Read arbitrary header names and values from output HTTP headers ::rivet::headers set headername value Set arbitrary header names and values into output HTTP headers ::rivet::headers sent Test internal status of the module and returns 1 if the HTTP headers have been already sent ::rivet::headers redirect uri Redirect from the current page to a new URI. Must be done in the first block of TCL code. ::rivet::headers add headername value Add text to header headername. ::rivet::headers type content-type This command sets the Content-type header returned by the script, which is useful if you wish to send content other than HTML with Rivet - PNG or jpeg images, for example. ::rivet::headers numeric response code Set a numeric response code, such as 200, 404 or 500. html construct html tagged text. ::rivet::html string arg Description Print text with the added ability to pass HTML tags following the string. Example: ::rivet::html "Test" b i produces: <b><i>Test</i></b> http_accept Parse HTTP Accept header lines ::rivet::http_accept -zeroweight -default -list http_accept_line Description Command for parsing HTTP Accept header lines that tell the server about preferences and/or capabilities of the browser (e.g. content language,media type, etc.). The following script ::rivet::http_accept returns a dictionary value in which every content preference is matched to its precedence value load_headers set language_precedence [::rivet::http_accept $headers(Accept-Language)] foreach lan [dict keys $language_precedence] { puts "$lan -> [dict get $language_precedence $lan]" } when run from a browser where 5 languages were chosen would output en-us -> 1 en -> 0.8 it -> 0.6 de-de -> 0.4 fr-fr -> 0.2 The -list switch would suppress the precedence values and the accepted fields are returned listed with decreasing precedence order. puts [::rivet::http_accept -list $headers(Accept-Language)] text/html application/xhtml+xml application/xml */* import_keyvalue_pairs Import an argument list into the named array ::rivet::import_keyvalue_pairs arrayName argsList Description key-value pairs, like "-foo bar" are stored in the array arrayName. In that case, the value "bar" would be stored in the element "foo" If "--" appears or a key doesn't begin with "-", the rest of the arg list is stored in the special args element of the array. Example: ::rivet::import_keyvalue_pairs keyvalue_map [list -a1 v1 -a2 v2 -a3 v3 -- 1 2 3 4 5] parray keyvalue_map keyvalue_map(a1) = v1 keyvalue_map(a2) = v2 keyvalue_map(a3) = v3 keyvalue_map(args) = 1 2 3 4 5 include includes a file into the output stream without modification. ::rivet::include filename_name Description Include a file without parsing it for processing tags <? and ?>. This is the best way to include an HTML file or any other static content. incr0 increment a variable or set it to 1 if nonexistent. incr0 varname num Description Increment a variable by . If the variable doesn't exist, create it instead of returning an error. incr0 functionality is provided by the native incr in Tcl >= 8.5, therefore this command is deprecated and kept as an interpreter alias only for compatibility. As such incr0 wasn't moved to the ::rivet namespace and it will be removed in future versions of Rivet. inspect Introspection command for Rivet configuration ::rivet::inspect configuration_section configuration_parameter Description ::rivet::inspect provides introspection into the running configuration of Rivet. Rivet's debug command uses it in order to gain insight into the configuration, but it can be used in any script. ::rivet::inspect can be called in 5 different forms With no argument the command returns a dictionary with 3 keys: server, dir, user. Each key is associated to a subdictionary carrying the configuration as set for that request. In this form the command is meant to support compatibility with previous versions of mod_rivet where three global arrays were created to be internally used by command ::rivet::debug. With the -all argument a dictionary carrying the whole configuration for that specific request is returned. If a configuration parameter is not set it's given the string undefined. Returned configuration paramenters are "ServerInitScript", "GlobalInitScript", "ChildInitScript", "ChildExitScript", "BeforeScript", "AfterScript", "AfterEveryScript", "AbortScript", "ErrorScript", "UploadMaxSize", "UploadDirectory", "UploadFilesToVar", "SeparateVirtualInterps", "HonorHeaderOnlyRequests" With one of the Rivet configuration directives listed above as single argument ::rivet::inspect returns the current value in the configuration record. Passing the argument "script" ::rivet::inspect returns a path to the current script in a similar way core command [info script] does. The basic difference is that the core command returns a relative path with respect to the current working directory, whereas mod_rivet's command returns the full path. Passing the argument "server" ::rivet::inspect returns a dictionary with these fields taken from the server record descriptor hostname: The server hostname admin: The admin's contact information errorlog: The name of the error log server_path: Pathname for ServerPath lassign_array Assign a list of values to array variables ::rivet::lassign_array value_list array_name array_variables Description lassign_array is an utility command inspired by the same Tclx command and with a close resemblance with Tcl's lassign for assigning list elements to variables. lassign_array first argument is a list of values to be assigned to an array that must be given as second argument. The remaining arguments are the array's variable names which will store as values the elements of the list. Variables names don't matching values in the list are given an empty string. Unassigned list elements are returned as a list. ::rivet::lassign_array {1 2 3 4} assigned_array a b c d parray assigned_array assigned_array assigned_array(a) = 1 assigned_array(b) = 2 assigned_array(c) = 3 assigned_array(d) = 4 set rem [::rivet::lassign_array {1 2 3 4 5 6 7} assigned_array a b c d] puts $rem 5 6 7 lempty Returns 1 if <list> is empty or 0 if it has any elements. This command emulates the TclX lempty command. ::rivet::lempty list Description Returns 1 if <list> is empty or 0 if it has any elements. This command emulates the TclX lempty command. lmatch Look for elements in <list> that match <pattern> ::rivet::lmatch -exact -glob -regexp list pattern Description Look for elements in <list> that match <pattern>. This command is a decent replacement for TclX lmatch command when TclX is not available In the following example a regular expression is matched against each element in the input list and a list containing the matching elements is returned ::rivet::lmatch -regexp { aaxa bxxb ccxxxxcc } {.+[x]{2}.+} bxxb ccxxxxcc load_cookies get any cookie variables sent by the client. ::rivet::load_cookies array_name Description Load the array of cookie variables into the specified array name. Uses array by default. load_env get the request's environment variables. ::rivet::load_env array_name Description Load the array of environment variables into the specified array name. Uses array by default. As Rivet pages are run in the namespace, it isn't necessary to qualify the array name for most uses - it's ok to access it as . load_headers get client request's headers. ::rivet::load_headers array_name Description Load the headers that come from a client request into the provided array name, or use if no name is provided. load_response load form variables into an array. ::rivet::load_response arrayName Description Load any form variables passed to this page into an array. If load_response is called without arguments the array is created in the scope of the caller. If the variables var1,var2,var3... having values val1,val2,val3... are passed to the page, the resulting array will be a collection mapping var1,var2,var3... to their corresponding values. load_response was inspired by the same NeoWebScript procedure in the way it deals with multiple assignments: if a variable is assigned more than once the corresponding array element will be a list of the values for the variable. This can be useful in the case of forms with checkbox options that are given the same name. This condition is signalled by the presence of an auxiliary array variable. Example: if a group of checkboxes are associated to the variable then response(var1) will store the list of their values and the array will also have the extra variable which can be tested with the usual [info exists response()] Calling load_response several times for the same array results in adding more values to the array at every call. When needed it is left to the caller to empty the array between two subsequent calls. lremove remove from a list elements matching one or more patterns ::rivet::lremove -regexp | -glob | -exact list pattern pattern pattern Description lremove removes from list list the first occurrence of an element matching one of the patterns listed in the command line. By specifying the option every occurrence of one the patterns is removed Pattern matching can be , style or following regular expressions (). These options are globally valid across the whole pattern list (default is glob style matching) ::rivet::lremove -all -regexp {aa e111 bab aa} aa e111 bab e111 bab ::rivet::lremove -all -regexp {aa e111 bab aa} aa "e\\d+" bab makeurl construct url's based on hostname, port. ::rivet::makeurl filename Description Create a self referencing URL from a filename. makeurl can be used in three ways No argument is passed to the command (returns the current script URL) A relative style path is passed (returns the argument prepended with the current script's URL An absolute path is passed to the command: (returns the full URL to the resource) Example of absolute path: ::rivet::makeurl /tclp.gif returns http://[hostname]:[port]/tclp.gif. where hostname and port are the hostname and port of the server in question. The protocol prefix is inferred from the protocol in the URL referencing the script. no_body Prevents Rivet from sending any content. ::rivet::no_body Description This command is useful for situations where it is necessary to only return HTTP headers and no actual content. For instance, when returning a 304 redirect. parray Tcl's parray with html formatting. ::rivet::parray arrayName pattern Description An html version of the standard Tcl parray command. Displays the entire contents of an array in a sorted, nicely-formatted way. Mostly used for debugging purposes. parse parses a Rivet template file. ::rivet::parse filename Description Like the Tcl source command, but also parses for Rivet <? and ?> processing tags. Using this command, you can use one .rvt file from another. raw_post get the unmodified body of a POST request sent by the client. ::rivet::raw_post Description Returns the raw POST data from the request. If the request was not a POST or there is no data, then "" - an empty string - is returned. redirect Interrupt processing and divert to a new URL ::rivet::redirect URL permanent (default: 0) Description ::rivet::redirect diverts the browser to a new URL and marks the redirection as either permanent in the browser local cache or non permanent (default). Calling ::rivet::redirect causes the script execution to interrupt and control passes to AbortScript, if such script is set, by calling ::rivet::abort_page and passing as abort code a dictionary with 2 keys: error_code: string literal 'redirect' location: the URL the browser will be redirected to ::rivet::redirect drives the redirection by setting the 301 (permanent redirect) or 302 (non permanent redirect) HTTP status codes and attempts to discard the output the script might have already placed in the stdout channel buffer. Therefore the command can fail if A flush stdout was called before ::rivet::redirect thus causing the HTTP headers to be sent and preventing any possibility to manipulate them The channel buffer was filled causing Tcl to flush the channel The stdout channel, like any Tcl channels, can be manipulated and if needed its internal buffer streched. read_file Read the entire contents of a file and return it as a string. ::rivet::read_file file name Description This is a utility command which loads the entire content of a file and returns it as a result. unescape_string unescape escaped characters in a string. ::rivet::unescape_string string Description Scans through each character in the specified string looking for escaped character sequences (characters containing a percent sign and two hexadecimal characters, unescaping them back to their original character values, as needed, also mapping plus signs to spaces, and returning the result. This is useful for unquoting strings that have been quoted to be part of a URL. upload handle a file uploaded by a client. ::rivet::upload channel save data exists size type filename Description The upload command is for file upload manipulation. See the relevant Apache Directives to further configure the behavior of this Rivet feature. ::rivet::upload channel uploadname When given the name of a file upload , returns a Tcl channel that can be used to access the uploaded file. ::rivet::upload save uploadname filename Saves the in the file . ::rivet::upload data uploadname Returns data uploaded to the server. This is binary clean - in other words, it will work even with files like images, executables, compressed files, and so on. ::rivet::upload exists uploadname Returns true if an upload named uploadname exists. This can be used in scripts that are meant to be run by different forms that send over uploads that might need specific processing. ::rivet::upload size uploadname Returns the size of the file uploaded. ::rivet::upload type If the Content-type is set, it is returned, otherwise, an empty string. ::rivet::upload filename uploadname Returns the filename on the remote host that uploaded the file. ::rivet::upload tempname uploadname Returns the name of the temporary file on the local host that the file was uploaded into. ::rivet::upload names Returns the variable names, as a list, of all the files uploaded. See . var var_qs var_post get the value of a form variable. ::rivet::var get list exists number all ::rivet::var_qs get list exists number all ::rivet::var_post get list exists number all Description The var command retrieves information about GET or POST variables sent to the script via client request. It treats both GET and POST variables the same, regardless of their origin. Note that there are two additional forms of ::rivet::var: rivet::var_qs and ::rivet::var_post. These two restrict the retrieval of information to parameters arriving via the querystring (?foo=bar&bee=bop) or POSTing, respectively. ::rivet::var get varname default Returns the value of variable as a string (even if there are multiple values). If the variable doesn't exist as a GET or POST variable, the value is returned, otherwise "" - an empty string - is returned. ::rivet::var list varname Returns the value of variable as a list, one list element per reference. Radiobuttons or multiple selection listboxes are suited widgets which may return list data. If the result list is passed as a default value to the form package, one could also set index "__varname" to get it interpreted as a list. set response(countries) [::rivet::var list countries] set response(__countries) "" form form_request -defaults response form_request select countries -multiple 1 -values {USA Canada Mexico} form_request end ::rivet::var exists varname Returns 1 if exists, 0 if it doesn't. ::rivet::var number Returns the number of variables. ::rivet::var all Return a list of variable names and values. See . wrap Split a string on newlines. ::rivet::wrap string maxlen html Description For each line, wrap the line at a space character to be equal to or shorter than the maximum length value passed. If a third argument called "-html" is present, the string is put together with html <br> line breaks, otherwise it's broken with newlines. wrapline Split the line into multiple lines by splitting on space characters ::rivet::wrapline string maxlen html Description Given a line and a maximum length and option "-html" argument, split the line into multiple lines by splitting on space characters and making sure each line is less than maximum length. If the third argument, "-html", is present, return the result with the lines separated by html <br> line breaks, otherwise the lines are returned separated by newline characters. xml XML Fragments creation ::rivet::xml string tag descriptor tag descriptor ... Description Given a string and a variable number of tag descriptors return XML framgment made by nesting the tags with the same hierarchical order they are listed on the command line. The tag descriptors can be a one element list (the tag) or an odd-length list whose first argument is the tag namme and the remaining elements are interpreted as attribute name-attribute value pairs. ::rivet::xml can work as a replacement of ::rivet::html provided you take care of sending the string with command puts ::rivet::xml "a string" b u <== <b><u>a string</u></b> You can tell the tags which attributes they must have ::rivet::xml "a string" [list div class box id testbox] b i <== <div class="box" id="testbox"><b><i>a string</i></b></div> ::rivet::xml "text to be wrapped in XML" div [list a href "http://..../" title "info message"] <== <div><a href="http://..../" title="info message">text to be wrapped in XML</a></div>
    rivet-2.2.4/doc/xml/form.xml0000644000175000017500000006522712050546663015215 0ustar manghimanghi
    Form: An HTML Form Fields Generation Utility
    Introduction The form package is a utility for generating html forms. A form object command saves the programmer from typing the cumbersome html code of input elements, working out a solution for better standardization and readability of the code. form requires that only the minimum necessary to distinguish the element is typed, greatly simplyfing the development of forms. Options to the command are treated as a list of parameter-value pairs that become the defaults for the corresponding attributes of the form. A form object has specialized menthods to generate all of the standard input fields, i.e. text, password, hidden, generic button, submit or reset buttons and image. form creates select input fields, radiobutton and checkbox boolean options groups. Also new inputs introduced with HTML5 are supported: color, date, datetime, datetime-local, email, file, month, number, range, search, tel, time, url, week. Other input elements can be generated using the general purpose 'field' method.
    form a Tcl command object for creating HTML forms form form_name -option1 value_1 -option2 value_2 ... creates and returns a new Tcl command named . Options -method post|get The http method for sending the form data back to the server. Possible values are get or post -name form_name a name for the form being created: this value becomes the value of the attribute 'name' in the <form> tag. -defaults default_values an array of default values to be assigned to the fields of the form. Every name in the array is matched with an input field, when a given field gets added to the form it is initialized with the value of the corresponding variable in the array. This option works well in conjuction with the load_response command of Rivet when default values come from another form. -action URL The URL the data are being sent to. If no -action switch is specified the data are sent to the form's URL. Form Object Commands Form object commands follow the usual syntax of Tcl commands with a subcommand argument playing the role of a switch among various functionalities of the command. Form objects also need the name parameter which is to become the value of the 'name' attribute in an input field. This argument is the key that has to be used by the server-side script to retrieve the input field value. form_object subcommand name -option1 value1 -option2 value2 ... Options passed to a subcommand are copied into the tag as attribute="value" pairs. Some subcommands (e.g. form, radiobuttons and checkboxes) treat specific options in a way that fits the specific organization and function of these fields. Exceptions to this general syntax are the field and end subcommands. field is an abstract input field creation method and requires an additional parameter specifiyng the type of field to create. Every concrete input field generation command uses this subcommand internally to print the final html. Subcommands start name -method get | post -name form_name -defaults default_values -action URL args Print the <form> tag with all its attributes. This command must be called as first in the form generation process. The following is a sample of code creating a form named 'formname' whose data will be sent via the GET method. Initial form fields values will be obtained from array response form myform -defaults response -method get -name formname myform start myform text text_entry -size 20 myform select option_selected -values {opt1 opt2 opt3 opt4} myform submit submit -value Search myform end The code prints a form that sends a text entry content and the option value associated with a radiobutton. The URL of the server script is the same that created the form. Use the -url option to specify a different url. Options -method post|get The method to be used to encode the form data. Possible values are get or post -name form_name a name for the form being generated: this value becomes the value of the attribute 'name' in the <form> tag. -defaults default_values an array of default values to be assigned to the fields of the form. Every name in the array is matched with an input field, when a given field gets added to the form it is initialized with the value of the corresponding variable in the array. This option works well in conjuction with the load_response command of Rivet when default values come from another form. -action URL The URL the data will be sent to. If no -action switch is specified the data are sent to the form's URL. end Print the </form> closing tag. This command must be called last in the form generation process field name type args Print a field of the given type and name, including any default key-value pairs defined for this field type and optional key-value pairs included with the statement Options -opt1 val1 Option description radiobuttons name -values values -labels labels args the radiobutton creates a whole radiobutton group with the values and labels specified in the argument list. If no -labels switch is passed to the subcommand the values are printed as labels of the radiobutton. Options -values values_list List of values associated with the radiobuttons to be displayed -labels labels_list List of labels to be printed with every radiobutton. There must be a label for every radiobutton Example: form myform -defaults response -method get -name formname myform start myform text text_entry -size 20 myform radiobuttons fruit -values {big medium small} \ -labels {Watermelon Orange Strawberry} \ -class myradiobclass myform submit submit -value Search myform end will print the following HTML code. <input type="radio" name="fruit" class="myradiobclass" value="big" />Watermelon <input type="radio" name="fruit" class="myradiobclass" value="medium" />Orange <input type="radio" name="fruit" class="myradiobclass" value="small" />Strawberry if the response array has a variable for the name 'fruit' the corresponding radiobutton field is automatically checked. The options values and labels are used internally and don't get into the tag attributes. If a labels option is not given, labels are assigned using the values list. checkbox name -label label -value value args The checkbox subcommand emits a checkbox type input field with the name, label and value attributes set according to the parameters passed to the subcommand. Example: form myform -defaults response -method get -name formname -action <form_url> myform start myform checkbox options -value opt1 -label "Option 1" myform checkbox options -value opt2 -label "Option 2" myform checkbox options -value opt3 -label "Option 3" myform checkbox options -value opt4 -label "Option 4" myform submit save_tps -value "Send Options" myform end myform destroy Provided opt2 was in response array (in the list valued 'options' variable) that initialized the form, the output would look like this <form action="<form_url>" method="get" name="formname"> <input type="checkbox" name="options" id="autogen_1" label="Option 1" value="sopt1" /><label for="autogen_1">Option 1</label> <input type="checkbox" name="options" id="autogen_2" label="Option 2" value="sopt2" /><label for="autogen_2">Option 2</label> <input type="checkbox" name="options" id="autogen_3" label="Option 3" value="sopt3" /><label for="autogen_3">Option 3</label> <input type="checkbox" name="options" id="autogen_4" label="Option 4" value="sopt4" /><label for="autogen_4">Option 4</label> <input type="submit" name="submit" value="Send" /> </form> checkboxes name -labels labels_list -values values_list args The checkboxes is an extended form of the checkbox subcommand. checkboxes prints as many checkboxes as the number of elements in the labels_list argument Options -values values_list List of values associated with the checkboxes to be displayed -labels labels_list List of labels to be printed with every checkbox. There must be a label for every checkbox Example: form myform -defaults response -method post -action <form_url> myform start myform checkboxes options -values {opt1 opt2 opt3 opt4} -labels {"Option 1" "Option 2" "Option 3" "Option 4"} myform submit save_tps -value "Send Options" myform end myform destroy will print the following HTML code <form action="<form_url>" method="post"> <input type="checkbox" name="options" id="autogen_1" label="Option 1" value="opt1" /><label for="autogen_1">Option 1</label> <input type="checkbox" name="options" id="autogen_2" label="Option 2" value="opt2" /><label for="autogen_2">Option 2</label> <input type="checkbox" name="options" id="autogen_3" label="Option 3" value="opt3" /><label for="autogen_3">Option 3</label> <input type="checkbox" name="options" id="autogen_4" label="Option 4" value="opt4" /><label for="autogen_4">Option 4</label> <input type="submit" name="save_tps" value="Send Options" /> </form> password name args Same as text, but the input is obfuscated so as not to reveal the text being typed hidden name args hidden input element: typicall embedded in a form in order to pass status variables. submit name args emits the code for a classical HTML submit button. Example: the following code form myform -defaults response -method get -name feedsearch myform start myform submit submit -value Search Would emit a form like this <form...> <input type="submit" name="submit" value="Search" /> </form> button name args emits the code for a button field having name as name reset name args Classical HTML reset button that resets the input fields back to their initial values image name args Emits an image input field radio name args Emits a radiobutton input field color name args Emits an HTML 5 "color" form field date name args Emits an HTML 5 "date" form field datetime name args Emits an HTML 5 "datetime" form field datetime_local name args Emits an HTML 5 "datetime_local" form field email name args Emits an HTML 5 "email" form field file name args Emits an HTML 5 "file" form field month name args Emits an HTML 5 "month" form field number name args Emits an HTML 5 "number" form field range name args Emits an HTML 5 "range" form field search name args Emits an HTML 5 "search" form field tel name args Emits an HTML 5 "tel" form field time name args Emits an HTML 5 "time" form field url name args Emits an HTML 5 "url" form field week name args Emits an HTML 5 "week" form field
    rivet-2.2.4/doc/xml/request.xml0000644000175000017500000003076212533750442015734 0ustar manghimanghi
    Apache Child Processes Lifecycle and Request Processing Apache Child Process Lifecycle Apache Rivet delegates to the Multi-Processing Module (MPM) the task of managing the agents responding to network requests. An MPM is responsible for creating such agents during the start-up, and is in charge for terminating existing ones and recreating new agents when the workload is requiring it. Apache Rivet is currently supporting only the prefork MPM which creates full fledged child processes as independent agents responding to network requests. Efforts are under way to extend the support to the worker MPM, a hybrid model where forked child processes in turn create threads as real network agents. If we can achieve this the goal would open the possibility of supporting also the Windows© specific winnt MPM, where a single process creates and manages a large number of thread agents. Configuration parameters about this critical point can be read in the Apache documentation. There are 4 stages in the lifetime of an Apache webserver that are relevant to Rivet: Single Process Initialization Apaches starts up as a single process. During this stage Apache performs various preliminary tasks including reading and parsing the configuration. After the configuration has been read Rivet sets up some internal resources and if a Tcl script is set as argument of a ServerInitScript directive the script is executed. Variables, arrays or dictionaries created during the execution of this script will be preserved and later replicated in the child process intepreters, since the prefork MPM creates new child processes with a fork() system call (which involves only in memory copy of sections of a process address space). Thus ServerInitScript is a good place to do global initialization that doesn't involve creation of private data. Example of tasks that can be done in this context are importing namespace commands and loading packages providing code of general interest for every application to be served. Also IPC methods can be initialized in this stage. Child Process Initialization Right after the webserver has forked its child processes there is a chance to perform specific initialization of their Tcl interpreters. This is the stage where most likely you want to open I/O channels, database connections or any other resource that has to be private to an interpreter. When the option SeparateVirtualInterps is turned off child processes will have a single interpreter regardless the number of virtual hosts configured. The GlobalInitScript is the configuration script the child process will run once before getting ready to serve requests When SeparateVirtualInterps is turned on each configured virtual host will have its own slave interpreter which can will run the ChildInitScript directive as initialization script. The ChildInitScript has to be placed within a <VirtualHost...>...</VirtualHost ...> stanza to associate a script to a specific virtual host initialization. This scenario of interpreter separation is extremely useful to prevent resource conflicts when different virtual hosts are serving different web applications. GlobalInitScript has no effect to working interpreters when SeparateVirtualInterps is set. Request Processing and Content Generation After a child has been initialized it's ready to serve requests. A child process' lifetime is almost entirely spent in this phase, waiting for connections and responding to requests. At every request the URL goes through filter processing and, in case, rewritten (mod_rewrite, Alias directives, etc). Parameter values encoded in the request are made available to the environment and finally the script encoded in the URL is run. The developer can tell Rivet if optionally the execution has to be preceded by a BeforeScript and followed by an AfterScript. The real script mod_rivet will execute is the result of the concatenation of the BeforeScript, the script encoded in the URL and the AfterScript. Thus the whole ensemble of code that makes up a web application might be running within the same "before" and "after" scripts to which the programmer can devolve tasks common to every page of an application. Child Process Exit If no error condition forces the child process to a premature exit, his life is determined by the Apache configuration parameters. To reduce the effects of memory leaks in buggy applications the Apache webserver forces a child process to exit after a certain number of requests served. A child process gets replaced with a brand new one if the workload of webserver requires so. Before the process quits an exit handler can be run to do some housekeeping, just in case something the could have been left behind has to be cleaned up. Like the initialization scripts ChildExitScript too is a "one shot" script. The Tcl exit command forces an interpreter to quit, thus removing the ability of the process embedding it to run more Tcl scripts. The child process then is forced to exit and be replaced by a new one when the workload demands it. This operation implies the ChildExitScript be run before the interpreter is actually deleted. Apache Rivet Error and Exception Scripts Directives Rivet is highly configurable and each of the webserver lifecycle stages can be exploited to control a web application. Not only the orderly sequence of stages in a child lifecycle can be controlled with Tcl scripts, but also Tcl error or abnormal conditions taking place during the execution can be caught and handled with specific scripts. Tcl errors (conditions generated when a command exits with code TCL_ERROR) usually result in the printing of a backtrace of the code fragment relevant to the error. Rivet can set up scripts to trap these errors and run instead an ErrorScript to handle it and conceal details that usually have no interest for the end user and it may show lines of code that ought to remain private. The ErrorScript handler might create a polite error page where things can be explained in human readable form, thus enabling the end user to provide meaningful feedback information. In other cases an unmanageable conditions might take place in the data and this could demand an immediate interruption of the content generation. These abort conditions can be fired by the command, which in turn fires the execution of an AbortScript to handle the abnormal condition. Starting with Rivet 2.1.0 accepts a free form parameter that can be retrieved later with the command Tcl Namespaces in Rivet and the <command>::request</command> Namespace With the sole exception of .rvt templates, Rivet runs pure Tcl scripts at the global namespace. That means that every variable or procedure created in Tcl scripts resides by default in the "::" namespace (just like in traditional Tcl scripting) and they are persistent across different requests until explicitly unset or until the interpreter is deleted. You can create your own application namespaces to store data but it is important to remember that subsequent requests will in general be served by different child processes. Your application can rely on the fact that certain application data will be in the interpreter, but you shouldn't assume the state of a transaction spanning several pages can be stored in this way and be safely kept available to a specific client. Sessions exist for this purpose and Rivet ships its own session package with support for most of popular DBMS. Nonetheless storing data in the global namespace can be useful, even though scoping data in a namespace is recommended. I/O channels and database connections are examples of information usually specific to a process for which you don't want to pay the overhead of creating them at every request, probably causing a dramatic loss in the application performance. A special role in the interpreter is played by the ::request namespace. The ::request namespace is deleted and recreated at every request and Rivet templates (.rvt files) are executed within it. Unless you're fully qualifying variable names outside the ::request namespace, every variable and procedure created in .rvt files is by default placed in it and deleted before any other requests gets processed. It is therefore safe to create variables or object instances in template files and foresake about them: Rivet will take care of cleaning the namespace up and everything created inside the namespace will be destroyed.
    StageScriptNamespace
    Apache InitializationServerInitScript::
    Child InitializationGlobalInitScript::
    ChildInitScript::
    Request ProcessingBeforeScript::
    .rvt::request
    .tcl::
    AfterScript::
    AbortScript::
    AfterEveryScript::
    Child TerminationChildExitScript::
    Error HandlingErrorScript::
    rivet-2.2.4/doc/xml/calendar.xml0000644000175000017500000003130311752325411016001 0ustar manghimanghi
    Calendar Package
    Introduction The package is based on the Calendar class, a class capable of printing an ascii calendar table that closely resembles the output of the typical Unix cal command. The internal code is written entirely in Tcl, therefore doesn't rely on the existance of cal on the system. XmlCalendar inherits the basic methods and adds XML tagging to the table. XmlCalendar prints an XML calendar table whose header, weekdays banner and days rows tags are configurable. Also specific days or specific weeks can be given arbitrary attributes. Calendar core methods are based on the cal procedure written by Richard Suchenwirth and published on the Tcl Wiki The Calendar package uses Tcl dict command to manage markup information. Hence either Tcl8.5 or Tcl8.4 with package dict are required.
    Calendar Utility class the builds and prints a calendar table Calendar calendar_name Calendar object subcommands The main public command for a calendar object is emit that returns a calendar table calendar_obj emit calendar_obj emit month year calendar_obj emit month | year The method 'emit' if invoked without arguments returns an ASCII formatted calendar of the current month set cal [Calendar #auto] set current_month [$cal emit] puts $current_month Jun 2010 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 The method emit when invoked with a single argument takes it as an year number and prints the whole calendar of that year. When invoked with 2 arguments takes the first as a month, either expressed in its shortened form ('Jan','Feb',...) or as a number in the range 1-12. The second argument is a year number. XmlCalendar Prints XML formatted calendar tables XmlCalendar calendar_name -option1 option_list -option2 option_list ... An XmlCalendar object is created and returned. XmlCalendar objects print XML formatted calendar tables. The markup can be customized using the configuration options. Configuration options accept odd-length lists as values. An option_list has the following structure tag_name The first element of an option list is a tag name, the remaining terms are therefore an even-length sublist which is interpreted as a sequence of attribute-value pairs that will in turn become attributes of the tag. Methods cal_obj emit cal_obj emit month year cal_obj emit month | year The method 'emit' if invoked without arguments returns an XML calendar table of the current month Options -container tag_name Assigns an options list to the XML element that will hold the whole table. The default tag for the container is 'calendar', with no attributes. -header tag_name Assigns tag name and attributes to the XML header element (default: calheader) -body tag_name Assigns tag name and attributes to the XML body element of the table (default: calbody) -banner tag_name Assigns tag name and attributes to the XML banner element of the table (default: monthyear) The header of a calendar table is made of a banner, showing the Month and Year number, and of a weekdays bar. -foot tag_name Assigns tag name and attributes to the XML foot element of the table (default: calfoot). This option was added for completeness, but it's not implemented yet -banner_month tag_name Tag name and attributes for the XML element holding the month name (default:month) -banner_year tag_name Tag name and attributes for the XML element holding the month name (default: year) -weekdays tag_name Tag name and attributes for the XML element holding the weekday header (default: weekdays) -weekdays_cell tag_name Tag name and attributes for the XML element holding the each single weekday (default: wkdays) -days_row tag_name Tag name and attributes for the XML element holding the each row of the calendar table (default: week) -days_cell tag_name Tag name and attributes for the XML element representing a cell in the calendar table (default: day) -cell_function If set this option is the name of a procedure that gets called for every day of the month. The procedure must accept 4 argument representing day, month, year and weekday and must return an odd-length list interpreted in the same way as options lists. -current_day This option works as a simple method for pointing out a specific day of the month. If set with a day number that day will get the class attribute automatically set as "current" -current_weekday This option works as a simple method for pointing out a specific weekday of the month. If set with a weekday index (0: Sunday, 6: Saturday) the corresponding cell in the weekdays header will get the class attribute automatically set as "current_wkday" HtmlCalendar Concrete class derived from XmlCalendar HtmlCalendar calendar_name -option1 option_list -option2 option_list ... Concrete XmlCalendar class for printing html calendar tables. The markup of the class is xhtml compliant and prints a code fragment for inclusion in a webpage. The following is the class definition. ::itcl::class HtmlCalendar { inherit XmlCalendar constructor {args} {XmlCalendar::constructor $args} { $this configure -container table \ -header thead \ -body tbody \ -banner tr \ -banner_month {th colspan 3 style "text-align: right;"} \ -banner_year {th colspan 4 style "text-align: left;"} \ -weekdays tr \ -weekday_cell th \ -days_row tr \ -days_cell td } } A sample output from HtmlCalendar (with some styling)
    rivet-2.2.4/doc/xml/intro.xml0000644000175000017500000000457412453516022015374 0ustar manghimanghi
    Introduction to Apache Rivet Apache Rivet is a system for creating dynamic web content via a programming language integrated with Apache Web Server. It is designed to be fast, powerful and extensible, consume few system resources, be easy to learn, and to provide the user with a platform that can also be used for other programming tasks outside the web (GUI's, system administration tasks, text processing, database manipulation, XML, and so on). In order to meet these goals, we have chosen the Tcl programming language to combine with the Apache Web Server. In this manual, we aim to help get you started, and then writing productive code as quickly as possible, as well as giving you ideas on how to best take advantage of Rivet's architecture to create different styles of web site. This documentation is focused on the current version of Rivet, but still a work in progress, and, like everything else about Apache Rivet, it is Free Software. If you see something that needs improving, and have ideas or suggestions, don't hesitate to let us know. If you want to contribute directly, better yet! Acknowledgements Rivet 2.2 development took advantage from contributions from several users who provided whole new componenents, bug fixes and enhancements. Damon Courtney (Apache Tcl Team member, he originally wrote mod_rivet) contributed with the new ::rivet::redirect command. Harald Oehlmann (now member of the Apache Tcl Team) who wrote package RivetEntitites, command ::rivet::http_accept and filed several bug reports with relative patches Cyril Shtumf filed several important bugfixes Jeff Lawson who patched Rivet parser to add the shorthand syntax for string output and filed several bug reports
    rivet-2.2.4/doc/xml/upgrade.xml0000644000175000017500000000445112304211055015653 0ustar manghimanghi
    Upgrading from mod_dtcl or NeoWebScript Rivet is a break from the past, in that we, the authors, have attempted to take what we like best about our past efforts, and leave out or change things we no longer care for. Backwards compatibility was not a primary goal when creating Rivet, but we do provide this information which may be of use to those wishing to upgrade from mod_dtcl or NWS installations.
    mod_dtcl Rivet was originally based on the dtcl code, but it has changed (improved!) quite a bit. The concepts remain the same, but many of the commands have changed.
    NeoWebScript NWS was a server-side scripting environment based on the Apache HTTP server and Safe-Tcl and it's not maintained anymore. The biggest difference between Rivet and Neowebscript is that Neowebscript was designed for shared hosting while Rivet is more oriented toward a site that owns all of its content. In the words of Karl Lehenbauer, NWS author and Rivet Team member: Rivet, however, is considerably more efficient, powerful, and evolved, though it still can support multiple independent sites on a single machine through its separate virtual interpreters mechanism. By powerful, the difference is that the full power of Tcl is available to webpage authors, not the restricted version that NWS provides. For instance, you can read or write any file in the system that you have permission to, require any package, open sockets and pipes, etc. By efficient, the difference is that Tcl interpreters survive past the generation of a webpage and are reused again and again, reducing the overhead of generating a page. By evolved, all of our efforts have gone toward Rivet for many years and so, you know, Rivet does more out of the box than Neowebscript did.
    rivet-2.2.4/doc/xml/install.xml0000644000175000017500000002425412527467616015724 0ustar manghimanghi
    Apache Rivet Installation Rivet 2.2 runs with the Apache 2.2.x and 2.4.x HTTP web server. It is known to build and run on various Linux distributions (Debian & Ubuntu, Redhat, SuSE and CentOS), FreeBSD and OpenBSD. For some of these Unix-like operative systems binary packages are already available for download. Currently there is no way to run Apache Rivet 2.2 on Windows© because Rivet currently requires the prefork, which is supported only on Unix/Linux systems. Efforts are under way to extend the support to the worker and the winnt MPMs. Check our development mailing list for the latests updates about Rivet development If you need to compile Apache Rivet yourself this is the procedure to follow Install Tcl Installing Rivet is about endowing the Apache HTTP webserver with the ability of running scripts written with the Tcl programming language. Therefore the Tcl shell (tclsh), its runtime and development libraries (≥8.5.10) have to be installed. Building Rivet you will have to tell the scripts where the Tcl libraries are located via the option to configure (see below). Get Rivet Download the sources at . Get and Install Apache Sources Rivet needs some of the include (.h) files shipped with the webserver source code. The easiest way to get them is to download the Apache source. If can build Rivet either statically (compiled into the Apache web server instead of loaded dynamically) or dynamically (as a loadable shared library). We recommend that you build Rivet as a shared library, for maximum flexibility, meaning that you also build Apache to be able to load modules. Other than that, the default Apache install is fine. We will tell Rivet where it is located via the option to configure (see below). The source code for the Apache web server may be found by following the links here: . Uncompress Sources We will assume that you have Apache installed at this point. You must uncompress the Rivet sources in the directory where you wish to compile them. gunzip rivet-X.X.X.tar.gz tar -xvf rivet-X.X.X.tar.gz Building Rivet On Linux or Unix systems, Rivet uses the standard ./configure ; make ; make install sequence which installs to their target directories the Apache module, the binary libraries and the Tcl code There are several rivet specific options to configure that might be useful (or needed): --with-tcl This points to the directory where the tclConfig.sh file is located. --with-tclsh This points to the location of the tclsh executable. --with-apxs The location of the apxs program that provides information about the configuration and compilation options of Apache modules. --with-apache-include[=DIR] Locates the Apache include files on your computer, if they're not in standard directory. --enable-version-display=[yes|no] This option enables Rivet to display its version in the logfiles when Apache is started. The default is to keep Rivet version hidden. --with-rivet-target-dir=DIR This option tells the install script where Rivet's Tcl packages have to be copied. --with-upload-dir=DIR Configures Rivet's default upload directory --enable-head-requests By default HEAD requests don't go through the usual request processing which leads to script execution and therefore resource consumption and Rivet returns a standard hardcoded HTML header to save CPU time. --enable-head-requests changes this default (see also Rivet Directives) --disable-rivet-commands-export By default Rivet's commands are put on the export list of the ::rivet namespace. With this option you may prevent it thus forcing the programmer to fully qualify these commands --disable-import-rivet-commands Likewise commands in the Rivet's namespace when exported are then by default imported into the global namespace for compatibility with previous version of Rivet. (Enabling the import of Rivet's commands overrides the switch --disable-rivet-commands-export and forces the export from ::rivet). This switch overrides the default and prevents the import into the global namespace Example: configuring the build system to compile Rivet for an apache 2.x server, using tcl8.5 and specifying a custom name for the apxs program. ./configure --with-tcl=/usr/lib/tcl8.5/ --with-tclsh=/usr/bin/tclsh8.5 \ --with-apxs=/usr/bin/apxs2 --with-apache=/usr --with-apache-version=2 Run make At this point, you are ready to run make, which should run to completion without any errors (a warning or two is ok, generally). Install Now, you are ready to run the make install to install the resulting files. The install target actually fires the install-binaries and install-packages targets which in turn copy the binary modules and Tcl packages to their destination directories. This commands create a functional Rivet environment with its core language. Apache Configuration Files Rivet is relatively easy to configure - we start off by adding the module itself: LoadModule rivet_module /usr/lib/apache2/modules/mod_rivet.so This tells Apache to load the Rivet shared object, wherever it happens to reside on your file system. Now we have to tell Apache what kind of files are "Rivet" files and how to process them: AddType application/x-httpd-rivet .rvt AddType application/x-rivet-tcl .tcl These tell Apache to process files with the .rvt and .tcl extensions as Rivet files. The characters encoding can be changed using the header type command, but you can also change the default charset for the whole site: AddType 'application/x-httpd-rivet;charset=utf-8' rvt All the pages generated by Rivet on this site will be sent with a Content-Type:'text/html;charset=utf-8' header. You may also wish to use Rivet files as index files for directories. In that case, you would do the following: DirectoryIndex index.html index.htm index.shtml index.cgi index.tcl index.rvt For other directives that Rivet provides for Apache configuration, please see .
    rivet-2.2.4/doc/xml/internals.xml0000644000175000017500000002707612515752330016245 0ustar manghimanghi
    Rivet Internals This section easily falls out of date, as new code is added, old code is removed, and changes are made. The best place to look is the source code itself. If you are interested in the changes themselves, the Subversion revision control system (svn) can provide you with information about what has been happening with the code.
    Initialization When Apache is started, (or when child Apache processes are started if a threaded Tcl is used), Rivet_InitTclStuff is called, which creates a new interpreter, or one interpreter per virtual host, depending on the configuration. It also initializes various things, like the RivetChan channel system, creates the Rivet-specific Tcl commands, and executes Rivet's init.tcl. The caching system is also set up, and if there is a GlobalInitScript, it is run.
    RivetChan The RivetChan system was created in order to have an actual Tcl channel that we could redirect standard output to. This lets us use, for instance, the regular puts command in .rvt pages. It works by creating a channel that buffers output, and, at predetermined times, passes it on to Apache's IO system. Tcl's regular standard output is replaced with an instance of this channel type, so that, by default, output will go to the web page.
    The <command>global</command> Command Rivet aims to run standard Tcl code with as few surprises as possible. At times this involves some compromises - in this case regarding the global command. The problem is that the command will create truly global variables. If the user is just cut'n'pasting some Tcl code into Rivet, they most likely just want to be able to share the variable in question with other procs, and don't really care if the variable is actually persistant between pages. The solution we have created is to create a proc ::request::global that takes the place of the global command in Rivet templates. If you really need a true global variable, use either ::global or add the :: namespace qualifier to variables you wish to make global.
    Page Parsing, Execution and Caching When a Rivet page is requested, it is transformed into an ordinary Tcl script by parsing the file for the <? ?> processing instruction tags. Everything outside these tags becomes a large puts statement, and everything inside them remains Tcl code. Each .rvt file is evaluated in its own ::request namespace, so that it is not necessary to create and tear down interpreters after each page. By running in its own namespace, though, each page will not run afoul of local variables created by other scripts, because they will be deleted automatically when the namespace goes away after Apache finishes handling the request. One current problem with this system is that while variables are garbage collected, file handles are not, so that it is very important that Rivet script authors make sure to close all the files they open. After a script has been loaded and parsed into it's "pure Tcl" form, it is also cached, so that it may be used in the future without having to reload it (and re-parse it) from the disk. The number of scripts stored in memory is configurable. This feature can significantly improve performance.
    Extending Rivet by developing C procedures implementing new commands Rivet endows the Tcl interpreter with new commands serving as interface between the application layer and the Apache web server. Many of these commands are meaningful only when a HTTP request is under way and therefore a request_rec object allocated by the framework is existing and was passed to mod_rivet as argument of a callback. In case commands have to gain access to a valid request_rec object the C procedure must check if such a pointer exists and it's initialized with valid data. For this purpose the procedure handling requests (Rivet_SendContent) makes a copy of such pointer and keeps it in an internal structure. The copy is set to NULL just before returning to the framework, right after mod_rivet's has carried out its request processing. When the pointer copy is NULL the module is outside any request processing and this condition invalidates the execution of many of the Rivet commands. In case they are called (for example in a ChildInitScript, GlobalInitScript, ServerInitScript or ChildExitScript) they fail with a Tcl error you can handle with a catch command. For this purpose in the macro CHECK_REQUEST_REC was defined accepting two arguments: the copy to the request_rec pointer (stored in the rivet_interp_globals structure) and the command name. If the pointer is NULL the macro calls Tcl_NoRequestRec and returns TCL_ERROR causing the command to fail. These are the step to follow to implement a new C language command for mod_rivet Define the command and associated C language procedure in src/rivetcmds/rivetCore.c using the macro RIVET_OBJ_CMD("mycmd",Rivet_MyCmd) This macro ensures the command is defined as ::rivet::mycmd Add the code of Rivet_MyCmd to src/rivetcmd/rivetCore.c (in case the code resides in a different file also src/Makefile.am should be changed to tell the build system how to compile the code and link it into mod_rivet.so) If the code must gain access to globals->r put add the macro testing for the pointer TCL_CMD_HEADER( Rivet_MyCmd ) { rivet_interp_globals *globals = Tcl_GetAssocData( interp, "rivet", NULL ); .... CHECK_REQUEST_REC(globals->r,"::rivet::mycmd"); ... } Add a test for this command in . For instance ... check_fail no_body check_fail virtual_filename unkn check_fail my_cmd <arg1> <arg2> .... Where are optional arguments in case the command needs to check for globals->r in special cases. Then, if ::rivet::mycmd must fail also should modified as virtual_filename->1 mycmd->1 The value associated to the test must be in case the command doesn't need to test the globals->r pointer.
    Debugging Rivet and Apache If you are interested in hacking on Rivet, you're welcome to contribute! Invariably, when working with code, things go wrong, and it's necessary to do some debugging. In a server environment like Apache, it can be a bit more difficult to find the right way to do this. Here are some techniques to try. The first thing you should know is that Apache can be launched as a single process with the argument: httpd -X. On Linux, one of the first things to try is the system call tracer, strace. You don't even have to recompile Rivet or Apache for this to work. strace -o /tmp/outputfile -S 1000 httpd -X This command will run httpd in the system call tracer, which leaves its output (there is potentially a lot of it) in /tmp/outputfile. The option tells strace to only record the first 1000 bytes of a syscall. Some calls such as write can potentially be much longer than this, so you may want to increase this number. The results are a list of all the system calls made by the program. You want to look at the end, where the failure presumably occured, to see if you can find anything that looks like an error. If you're not sure what to make of the results, you can always ask on the Rivet development mailing list. If strace (or its equivalent on your operating system) doesn't answer your question, it may be time to debug Apache and Rivet. To do this, you will need to rebuild mod_rivet. First of all you have to configure the build by running the ./configure script with the option and after you have set the CFLAGS and LDFLAGS environment variables export CFLAGS="-g -O0" export LDFLAGS="-g" ./configure --enable-symbols ...... make make install Arguments to ./configure must fit your Apache HTTP web server installation. See the output produced by ./configure --help And check the installation page to have further information. Since it's easier to debug a single process, we'll still run Apache in single process mode with -X: @ashland [~] $ gdb /usr/sbin/apache.dbg GNU gdb 5.3-debian Copyright 2002 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions. There is absolutely no warranty for GDB. Type "show warranty" for details. This GDB was configured as "powerpc-linux"... (gdb) run -X Starting program: /usr/sbin/apache.dbg -X [New Thread 16384 (LWP 13598)] . . . When your apache session is up and running, you can request a web page with the browser, and see where things go wrong (if you are dealing with a crash, for instance).
    rivet-2.2.4/doc/xml/diodisplay.xml0000644000175000017500000007042611111502476016377 0ustar manghimanghi
    DIODisplay - Database Interface Objects Display Class DIODisplay Database Interface Objects Display Class DIODisplay objectName #auto -option option -option option ... Description DIODisplay is an HTML display class that uses a DIO object to do the database work and a form object to do the displaying. Options -DIO dioObject The DIO object to be used in conjunction with this display object. This is a required field. -cleanup 1 0 If cleanup is true, when the display object is shown, it will automatically destroy the DIO object, the form object and itself. Default is true. -confirmdelete 1 0 If confirmdelete is true, attempting to delete a record from the database first requires that the user confirm that they wish to delete it. If it is false, deletion occurs without prompting the user. Defaults to true. -errorhandler procName The name of a procedure to handle errors when they occur. During the processing of requests and pages, sometimes unexpected errors can occur. This procedure will handle any errors. It is called with a single argument, the error string. Use of the Tcl errorInfo and errorCode variables is also recommended though. If no errorhandler is specified, the handle_error method within the Display object will handle the error. -fields fieldList Specify a list of fields to be used in this object. The fields list is actually created by using the field command to add fields to the display, but this option can be useful to sometimes over-set the list of fields created. -form formObject A Rivet form object to use when displaying a form. If one is not specified, the display object will automatically create one when it is necessary. -functions functionList A list of functions to be displayed in the main menu. This is a list of functions the user is allowed to execute. -pagesize pageSize How many records to show per page on a search or list. Default is 25. -rowfields fieldList A list of fields to display in each row of a search or list. When a search or list is conducted and the resulting rows are displayed, this list will limit which fields are displayed. Default is all fields. -rowfunctions functionList A list of functions to display in each row of a search or list. -searchfields fieldList A list of fields to allow a user to search by. This list will appear in the main screen as a drop-down box of fields the user can search on. -title title The title of the display object. This will be output as the title of the HTML document. DIO Display Object Commands objectName cleanup value Return the current cleanup value. If is specified, it sets a new value for the cleanup option. objectName delete key Delete the specified from the database. The default action of this method is to call the DIO object's delete command. This method can be overridden. objectName destroy Destroy the diodisplay object. objectName DIO value Return the current DIO value. If is specified, it sets a new value for DIO. objectName errorhandler value Return the current errorhandler value. If is specified, it sets a new value for errorhandler. objectName fetch key arrayName Fetch the specified from the database and store it as an array in arrayName. The default of this method is to call the DIO object's fetch command. This method can be overridden. objectName field fieldName -arg arg Create a new field object and add it to the display. When a field is added to the display, a new object of the DIODisplayField class is created with its values. See [FIXME - LINK] DIO Display Fields for options and values. objectName fields value Return the current fields value. If is specified, it sets a new value for fields. objectName form value Return the current form value. If is specified, it sets a new value for form. objectName function functionName Add a new function to the list of possible functions. The display object will only execute methods and procs which are defined as functions by the object. This is to protect the program from executing a different procedure other than what is allowed. The function command adds a new function to the list of allowable functions. objectName functions value Return the current functions value. If is specified, it sets a new value for functions. See [FIXME - LINK DIO Display Functions] for a list of default functions. objectName pagesize value Return the current form pagesize. If is specified, it sets a new value for pagesize. objectName rowfields value Return the current form rowfields. If is specified, it sets a new value for rowfields. objectName rowfooter Output the footer of a list of rows to the web page. This method can be overridden. objectName rowfunctions value Return the current rowfunctions value. If is specified, it sets a new value for rowfunctions. objectName rowheader Output the header of a list of rows to the web page. By default, this is an HTML table with a top row listing the fields in the table. This method can be overridden. objectName searchfields value Return the current searchfields value. If is specified, it sets a new value for searchfields. objectName show Show the display object. This is the main method of the display class. It looks for a variable called mode to be passed in through a form response and uses that mode to execute the appropriate function. If mode is not given, the Main function is called. This function should be called for every page. objectName showform Display the form of the object. This method displays the form for this display object. It is used in the Add and Edit methods but can be called separately if needed. This method can be overridden if the default look of a form needs to be changed. By default, the form displayed is simply the fields in a table, in order. objectName showrow arrayName Display a single row of a resulting list or search. This method is used to display a single row while displaying the result of a list or search. is a fetched array of the record. This method can be overriden if the default look of a row needs to be changed. By default, each row is output as a table row with each field as a table data cell. objectName showview Display the view of the object. This method displays the view for this display object. It is used in the Details methods but can be called separately if needed. This method can be overridden if the default look of a view needs to be changed. By default, the view displayed is simply the fields in a table, in order. objectName store arrayName Store the specified in the database. The default of this method is to call the DIO object's store command. This method can be overridden. objectName text value Return the current text value. If is specified, it sets a new value for text. objectName title value Return the current title value. If is specified, it sets a new value for title. objectName type value Return the current type value. If is specified, it sets a new value for type. objectName value value Return the current value value. If is specified, it sets a new value for value. DIO Display Functions These functions are called from the show method when a form response variable called mode is set. If no mode has been set, the default mode is Main. The show method will handle the necessary switching of functions. The show method also handles checking to make sure the function given is a true function. If not, an error message is displayed. New functions can be added as methods or by use of the function command, and any of the default functions can be overridden with new methods to create an entirely new class. These are the default functions provided. Add Show a form that allows the user to add a new entry to the database. This function calls showform to display the form for adding the entry. Cancel The Cancel function does nothing but redirect back to the Main function. This is handy for forms which have a cancel button to point to. Delete If confirmdelete is true (the default), the Delete function will ask the user if they're sure they want to delete the record from the database. If confirmdelete is false, or if the user confirms they wish to delete, this function calls the DoDelete function to do the actual deletion of a record. Details Display the view of a single record from the database. This function calls the showview method to display a single record from the database. DoDelete This function actually deletes a record from the database. Once it has deleted the record, it redirects the user back to the Main function. Edit Show a form that allows the user to edit an existing entry to the database. This function calls showform to display the form for editing the entry and fills in the fields with the values retrieved from the database. List This function lists the entires contents of the database. Each record is output in a row using the showrow method. Main This function is the main function of the display object. If there is no mode, or once most commands complete, the user will be redirected to this function. The default Main function displays a list of functions the user can execute, a list of searchfields the user can search on, and a query field. This query field is used by all of the other functions to determine what the user is trying to find. In the case of a search, query specifies what string the user is looking for in the specified search field. In the case of delete, details or edit, the query specifies the database key to access. Save This function saves any data passed to using the store method. This is primarily used by the add and edit commands to store the results of the form the user has filled out. Search This function searches the database for any row whose searchBy field matches query. Once any number of records are found, Search displays the results in rows. DIO Display Fields Display fields are created with the field command of the DIODisplay object. Each field is created as a new DIODisplayField object or as a subclass of DIODisplayField. The standard form fields use the standard field class, while specialized field types use a class with different options but still supports all of the same commands and values a generic field does. displayObject field fieldname -option option These are the standard options supported by field types: -formargs arguments When a field is created, any argument which is not a standard option is assumed to be an argument passed to the form object when the field is shown in a form. These arguments are all appended to the formargs variable. You can use this option to override or add options after the initial creation of an object -readonly 1 0 If readonly is set to true, the field will not display a form entry when displaying in a form. -text text The text displayed next to the form or view field. By default, DIODisplay tries to figure out a pretty way to display the field name. This text will override that default and display whatever is specified. -type fieldType The type of field this is. This type is used when creating the field in the form object. can be any of the accepted form field types. See [FIXME - LINK DIO Field Types] for a list of types available. All other arguments, unless specified in an individual field type, are passed directly to the form object when the field is created. So, you can pass or to specify the length and maximum length of the field entry. Or, if type were textarea, you could define and to specify its row and column count. DIO Display Field Types The following is a list of recognized field types by DIODisplay. Some are standard HTML form fields, and others are DIODisplay fields which execute special actions and functions.
    rivet-2.2.4/doc/xml/entities.xml0000644000175000017500000000601411753766230016066 0ustar manghimanghi
    RivetEntities
    Introduction The RivetEntities package was kindly provided by Harald Oehlmann and is largely taken from a simple yet clever encoder/decoder of HTML entities starting from a utf-8 character string. The original code writted by Andy Goth is at http://wiki.tcl.tk/26403. Package entities extends the functionality in the original code combining it with Tcl's 'encoding' command to encode/decode from any supported encoding
    encode encode a string replacing every occurrence of characters for which an SGML entity exists ::rivet::encode string Description ::rivet::encode returns a copy of the input string after replacing every occurence of characters for which an SGML entity exists. By default the command assumes the string is encoded in UTF-8, other encodings are supported by passing the -encoding <encoding> argument. The list of available encodings is returned by command encoding names decode decode an SGML encoded string replacing every entity with the corresponding character ::rivet::decode string Description ::rivet::decode implements the inverse function of ::rivet::encode. The input string is scanned searching and replacing every SGML entity with its corresponding character. By default the command assumes the output string has to be encoded in UTF-8. Other encodings are supported by passing the -encoding <encoding> argument.
    rivet-2.2.4/doc/xml/packages.xml0000644000175000017500000000204111670231317016003 0ustar manghimanghi
    Rivet Tcl Packages In addition to the core Apache module, Rivet provides a number of Tcl packages that include potentially useful code. commserver is a package providing a server that can be used for IPC. Still experimental. Requires the comm package from tcllib. dio is a database abstraction layer. dtcl is a compatibility package for mod_dtcl applications. form - for creating forms. rivet - some additional, useful routines. tclrivet calendar - a package providing a simple configurable calendar generator
    rivet-2.2.4/doc/xml/examples.xml0000644000175000017500000003533012343717013016052 0ustar manghimanghi
    Examples and Usage Some examples of Rivet usage follow. Some prior Tcl knowledge is assumed. If you don't know much Tcl, don't worry, it's easy, and there are some good resources available on the web that will get you up to speed quickly. Go to the web sites section and have a look. Hello World As with any tool, it's always nice to see something work, so let's create a small "Hello World" page. Assuming you have Apache configured correctly, create a file called hello.rvt where Apache can find it, with the following content: &hello.rvt; If you then access it with your browser, you should see a blank page with the text "Hello World" (without the quotes) on it. The command puts is the good old Tcl command for terminal printing, which appends to the argument string the control characters needed to open a newline. When you don't have to run through complex elaboration and the output can be lumped in a single string (just like in the 'Hello World' example) you can draw on the popular shorthand syntax for string output that comes handy in many cases &hello1.rvt; which is translated into puts -nonewline "Hello World" Generate a Colorful Table In another simple example, we dynamically generate a table selecting a different background color for each cell. The font color is determined through a simple CSS rule embedded in a HTML <style> element. Create the file color-table.tcl and put the following code in it &color-table.tcl; If you read the code, you can see that this is pure Tcl. We could take the same code, run it outside of Rivet, and it would generate the same HTML The result should look something like this: Variable Access Here, we demonstrate how to access variables set by GET or POST operations. Given an HTML form like the following: &vars.html; We can use this Rivet script to get the variable values: &vars.rvt; The first statement checks to make sure that the boss variable has been passed to the script, and then does something with that information. If it's not present, an error is added to the list of errors. In the second block of code, the variable salary is fetched, with one more error check - because it's a number, it needs to be composed of digits. The boss variable isn't required to have been sent - we set it to "Mr. Burns" if it isn't among the information we received. The last bit of variable handing code is a bit trickier. Because skills is a listbox, and can potentially have multiple values, we opt to receive them as a list, so that at some point, we could iterate over them. The script then checks to make sure that errlist is empty and outputting a thankyou message. If errlist is not empty, the list of errors it contains is printed. File Upload The ::rivet::upload command endows Rivet with an interface to access files transferred over http as parts of a multipart form. The following HTML in one file, say, upload.html creates a form with a text input entry. By clicking the file chooser button the file browser shows up and the user selects the file to be uploaded (the file path will appear in the text input). In order to make sure you're uploading the whole file you must combine the action of the enctype and method attributes of the <form...> tag in the way shown in the example. Failure to do so would result in the client sending only the file's path, rather than the actual contents. &upload.html; In the script invoked by the form (upload.rvt) upload argument ... commands can be used to manipulate the various files uploaded. &upload.rvt; Don't forget that the apache server must have write access to the directory where files are being created. The Rivet Apache directives have a substantial impact on the upload process, you have to carefully read the docs in order to set the appropriate directives values that would match your requirements. It is also important to understand that some upload commands are effective only when used in a mutually exclusive way. Apache stores the data in temporary files which are read by the upload save upload namefilename or by the upload data upload name command. Subsequent calls to these 2 commands using the same upload name argument will return no data on the second call. Likewise upload channel upload name will return a Tcl file channel that you can use in regular Tcl scripts only if you haven't already read the data, for example with a call to the upload data upload name command. File Download In general setting up a data file for being sent over http is as easy as determining the file's URI and letting Apache's do all that is needed. If this approach fits your design all you have to do is to keep the downloadable files somewhere within Apache's DocumentRoot (or in any of the directories Apache has right to access). When a client sends a request for a file, Apache takes care of determining the filetype, sends appropriate headers to the client and then the file content. The client is responsible for deciding how to handle the data accordingly to the "content-type" headers and its internal design. For example when browsers give up trying to display a certain "content-type" they display a download dialog box asking for directions from the user. Rivet can help if you have more sofisticated needs. For instance you may be developing an application that uses webpages to collect input data. This information might be passed on to scripts or programs for processing. In this case a real file representing the data doesn't exist and the content is generated on demand by the server. In other circumstances you may need to dynamically inhibit the download of specific files and hide them away, Your scripts may expunge from the pages every link to these files (your pages are dynamic, aren't they?) and move them out of way, but it looks like a cumbersome solution. Putting Tcl and Rivet in charge of the whole download mechanism helps in building cleaner and safer approaches to the download problem. In this example a procedure checks for the existence of a parameter passed in by the browser. The parameter is the name (without extension) of a pdf file. Pdf files are stored in a directory whose path is in the pdf_repository variable. This code is reported as an example of how to control the protocol using the headers command. &download.tcl; Before the pdf is sent the procedure sets the Content-Type, Content-Disposition, Content-Description and Content-Length headers to inform the client about the file type, name and size. Notice that in order to set the Content-Type header Rivet uses a specialiezed form of the headers command. Headers must be sent before data gets sent down the output channel. Messing with this prescription causes an error to be raised (in fact the protocol itself is been violated) More information about the meaning of the mime headers in the http context can be found at XML Messages and Ajax The headers command is crucial for generating XML messages that have to be understood by JavaScript code used in Ajax applications. Ajax is a web programming technique that heavily relies on the abilty of a web browser to run in backround JavaScript functions. JavaScript functions can be run as callbacks of events generated by a user interaction but they can also react to other I/O events, for example network events. Modern browsers endow JavaScript with the ability to build http GET/POST requests to be sent to a remote webserver. Generally these requests refer to scripts (e.g. Tcl scripts run by Rivet) which inherit as variables the arguments encoded in the request. The output produced by these scripts is sent back to the browser where callbacks functions extract information and hand it down to functions that directly manipulate a page's DOM. Therefore through Ajax becomes possible to build web applications that are more responsive and flexible: instead of going through the cycle of request-generation-transfer-display of a whole page, Ajax scripts request from a webserver only the essential data to be displayed. Ajax emphasizes the requirement of separation between data and user interface, saves the server from sending over the same html code and graphics if only a fraction of a page has to be updated, allows the programmer to design flexible solutions for complex forms and makes possible to find new innovative approaches to simple problems (e.g. Google tips that show up as you type in a query). A downside of this approach is the large number of complexities, subtleties and incompatibilities that still exist in the way different versions of popular browsers handle the DOM elements of a page. JavaScript can handle the communication between client and server through an instance of a specialized object. For quite a long time 2 approaches existed, the non-IE world (Firefox,Safari,Opera...) used the XMLHttpRequest class to create this object, whereas IE (before IE7) used the ActiveXObject class. With the release of IE7 Microsoft introduced native support for XMLHttpRequest class objects thus enabling programmers with a unique method for the development of dynamic pages. By creating an instance of this class a POST or GET request can be sent to the server and the response is stored in a property ('returnedText') of the communication object. It's become widely customary to encode these responses in XML messages. You can invent your own message structure (either based on XML or anything else), but one has to be aware that if the http headers are properly set and the message returned to the client is a well formed XML fragment, also the property XMLResponse is assigned with a reference to an object that represents the DOM of the XML response. By means of the XML W3C DOM interface the programmer can easily manipulate the data embedded in the XML message. In this example a Rivet script initializes an array with the essential data regarding a few of the major composers of the european music. This array plays the role of a database. The script sends back to the client two types of responses: a catalog of the composers or a single record of a composer. &rivet_web_service.tcl; For sake of brevity the JavaScript and HTML will not listed here. They can be downloaded (along with the Tcl script) stored in the rivet-ajax.tar.gz archive. By simply opening this tar archive in a directory accessible by your apache server and pointing your browser to the rivetService.html page you should see a page with a drop-down list. Every time a different name is picked from the list a new query is sent and logged in the apache access.log file, even though the html is never reloaded. A Calendar Utility Rivet comes with a Calendar package that provides classes for printing calendar tables in various forms. The HtmlCalendar class prints a calendar table in a similar form the Unix program 'cal' does. Example: the following code package require Calendar proc ::cal_cell_attributes { day month year weekday } { if {$weekday == 3} { return [list class curr_wkday] } } set htmlc [HtmlCalendar #auto] set html_txt [$htmlc emit -container {table class calendar} -current_weekday 3 \ -cell_function cal_cell_attributes ] puts $html_txt with some CSS styling would print
    rivet-2.2.4/doc/xml/session.xml0000644000175000017500000003377712221020733015723 0ustar manghimanghi
    Session Package
    Introduction This is session management code. It provides an interface to allow you to generate and track a browser's visit as a "session", giving you a unique session ID and an interface for storing and retrieving data for that session on the server. This is an alpha/beta release -- documentation is not in final form, but everything you need should be in this file. Using sessions and their included ability to store and retrieve session-related data on the server, programmers can generate more secure and higher-performance websites. For example, hidden fields do not have to be included in forms (and the risk of them being manipulated by the user mitigated) since data that would be stored in hidden fields can now be stored in the session cache on the server. Forms are then faster since no hidden data is transmitted -- hidden fields must be sent twice, once in the form to the broswer and once in the response from it. Robust login systems, etc, can be built on top of this code.
    Requirements Currently has only been tested with Postgresql, MySql and Oracle. All DB interfacing is done through DIO, though, so it should be relatively easy to add support for other databases.
    Preparing To Use It Create the tables in your SQL server. With Postgres, do a psql www or whatever DB you connect as, then a backslash-i on session-create.sql (If you need to delete the tables, use session-drop.sql) The session code by default requires a DIO handle called DIO (the name of which can be overridden). We get it by doing a RivetServerConf ChildInitScript "package require DIO" RivetServerConf ChildInitScript "::DIO::handle Postgresql DIO -user www"
    Example Usage In your httpd.conf, add: RivetServerConf ChildInitScript "package require Session; Session SESSION" This tells Rivet you want to create a session object named SESSION in every child process Apache creates. You can configure the session at this point using numerous key-value pairs (which are defined later in this doc). Here's a quick example: RivetServerConf ChildInitScript "package require Session; Session SESSION \ -cookieLifetime 120 -debugMode 1" Turn debugging on to figure out what's going on -- it's really useful, if verbose. In your .rvt file, when you're generating the <HEAD> section: SESSION activate Activate handles everything for you with respect to creating new sessions, and for locating, validating, and updating existing sessions. Activate will either locate an existing session, or create a new one. Sessions will automatically be refreshed (their lifetimes extended) as additional requests are received during the session, all under the control of the key-value pairs controlling the session object.
    Using Sessions From Your Code The main methods your code will use are: SESSION id After doing a SESSION activate, this will return a 32-byte ASCII-encoded random hexadecimal string. Every time this browser comes to us with a request within the timeout period, this same string will be returned (assuming they have cookies enabled). SESSION is_new_session returns 1 if it's a new session or 0 if it has previously existed (i.e. it's a zero if this request represents a "return" or subsequent visit to a current session.) SESSION new_session_reason This will return why this request is the first request of a new session, either "no_cookie" saying the browser didn't give us a session cookie, "no_session" indicating we got a cookie but couldn't find it in our session table, or "timeout" where they had a cookie and we found the matching session but the session has timed out. SESSION store packageName key data Given the name of a package, a key, and some data. Stores the data in the rivet session cache table. SESSION fetch packageName key Given a package name and a key, return the data stored by the store method, or an empty string if none was set. (Status is set to the DIO error that occurred, it can be fetched using the status method.)
    Session Configuration Options The following key-value pairs can be specified when a session object (like SESSION above) is created: how many seconds the session will live for. 7200 == 2 hours sessionRefreshInterval If a request is processed for a browser that currently has a session and this long has elapsed since the session update time was last updated, update it. 900 == 15 minutes. so if at least 15 minutes has elapsed and we've gotten a new request for a page, update the session update time, extending the session lifetime (sessions that are in use keep getting extended). cookieName name of the cookie stored on the user's web browser default rivetSession dioObject The name of the DIO object we'll use to access the database (default DIO) gcProbability The probability that garbage collection will occur in percent. (default 1%, i.e. 1) gcMaxLifetime the number of seconds after which data will be seen as "garbage" and cleaned up -- defaults to 1 day (86400) refererCheck The substring you want to check each HTTP referer for. If the referer was sent by the browser and the substring is not found, the session will be deleted. (not coded yet) entropyFile The name of a file that random binary data can be read from. (/dev/urandom) Data will be used from this file to help generate a super-hard-to-guess session ID. entropyLength The number of bytes which will be read from the entropy file. If 0, the entropy file will not be read (default 0) scrambleCode Set the scramble code to something unique for the site or your app or whatever, to slightly increase the unguessability of session ids (default "some random string") cookieLifetime The lifetime of the cookie in minutes. 0 means until the browser is closed (I think). (default 0) cookiePath The webserver subpath that the session cookie applies to (defaults to /) cookieSecure Specifies whether the cookie should only be sent over secure connections, 0 = any, 1 = secure connections only (default 0) sessionTable The name of the table that session info will be stored in (default rivet_session) sessionCacheTable The name of the table that contains cached session data (default rivet_session_cache) debugMode Set debug mode to 1 to trace through and see the session object do its thing (default 0) debugFile The file handle that debugging messages will be written to (default stdout)
    Session Methods The following methods can be invoked to find out information about the current session, store and fetch server data identified with this session, etc: SESSION status Return the status of the last operation SESSION id Get the session ID of the current browser. Returns an empty string if there's no session (will not happen is SESSION activate has been issued.) SESSION new_session_reason Returns the reason why there wasn't a previous session, either "no_cookie" saying the browser didn't give us a session cookie, "no_session" indicating we got a cookie but couldn't find it in the session table, or "timeout" when we had a cookie and a session but the session had timed out. SESSION store packageName key data Given a package name, a key string, and a data string, store the data in the rivet session cache. SESSION fetch packageName key Given a package name and a key, return the data stored by the store method, or an empty string if none was set. Status is set to the DIO error that occurred, it can be fetched using the status method. SESSION delete Given a user ID and looking at their IP address we inherited from the environment (thanks, Apache), remove them from the session table. (the session table is how the server remembers stuff about sessions). If the session ID was not specified the current session is deleted. SESSION activate Find and validate the session ID if they have one. If they don't have one or it isn't valid (timed out, etc), create a session and drop a cookie on them.
    Getting Additional Randomness From The Entropy File RivetServerConf ChildInitScript "Session SESSION -entropyFile /dev/urandom \ -entropyLength 10 -debugMode 1" This options say we want to get randomness from an entropy file (random data pseudo-device) of /dev/urandom, to get ten bytes of random data from that entropy device, and to turn on debug mode, which will cause the SESSION object to output all manner of debugging information as it does stuff. This has been tested on FreeBSD and appears to work.
    rivet-2.2.4/doc/xml/dio.xml0000644000175000017500000006647412013014203015005 0ustar manghimanghi
    DIO - Database Interface Objects DIO Database Interface Objects ::DIO::handle interface objectName -option option -option option ... Description DIO is designed to be a generic, object-oriented interface to SQL databases. Its main goal is to be as generic as possible, but since not all SQL databases support the exact same syntaxes, keeping code generic between databases is left to the abilities of the programmer. DIO simply provides a way to keep the Tcl interface generic. - The name of the database interface. Currently supported interfaces are and . If is specified, DIO creates an object of that name. If there is no given, DIO will automatically generate a unique object ID Options -host hostname The hostname of the computer to connect to. If none is given, DIO assumes the local host. -port portNumber The port number to connect to on . -user username The username you wish to login to the server as. -pass password The password to login to the server with. -db database The name of the database to connect to. -table tableName The default table to use when using built-in commands for storing and fetching. -keyfield keyFieldname The default field to use as the primary key when using built-in commands for storing and fetching. -autokey 1 0 If this option is set to 1, DIO will attempt to determine an automatic key for when storing and fetching. In most databases, this requires that the also be specified. In the case of MySQL, where sequences do not exist, autokey must be used in conjunction with a table which has a field specified as AUTO. -sequence sequenceName If DIO is automatically generating keys, it will use this sequence as a means to gain a unique number for the stored key. DIO Object Commands objectName array request Execute as a SQL query and create an array from the first record found. The array is set with the fields of the table and the values of the record found. objectName autokey value boolean Return the current autokey value. If is specified, it sets a new value for the autokey option. objectName close Close the current database connection. This command is automatically called when the DIO object is destroyed. objectName count Return a count of the number of rows in the specified (or current) table. objectName db value Return the current database. If is specified, it sets a new value for the database. In most cases, the DIO object will automatically connect to the new database when this option is changed. objectName delete key -option option ... Delete a record from the database where the primary key matches . objectName destroy Destroy the DIO object. objectName errorinfo value contains the value of the last error, if any, to occur while executing a request. When a request fails for any reason, this variable is filled with the error message from the SQL interface package. objectName exec request Execute as an SQL query. When the exec command is called, the query is executed, and a DIO result object is returned. From there, the result object can be used to obtain information about the query status and records in a generic way. See Result Object Commands objectName fetch key arrayName -option option ... Fetch a record from the database where the primary key matches and store the result in an array called . objectName forall request arrayName body Execute an SQL select and iteratively fill the array named with elements named with the matching field names, and values containing the matching values, repeatedly executing the specified code for each row returned. objectName host value Return the current host value. If is specified, it sets a new value for the host. objectName insert table arrayName -option option ... Insert fields from into the specified in the database. objectName interface Return the database interface type, such as Postgresql or Mysql. objectName keyfield value Return the current keyfield. If is specified, it sets a new value for the keyfield. can contain multiple key fields as a Tcl list, if the table has multiple key fields. objectName keys pattern -option option ... Return a list of keys in the database. If is specified, only the keys matching will be returned. objectName lastkey Return the last key that was used from . If sequence has not been specified, this command returns an empty string. objectName list request Execute as a SQL query and return a list of the first column of each record found. objectName makekey arrayName keyfield Given an array containing key-value pairs and an optional list of key fields (we use the object's keyfield if none is specified), if we're doing auto keys, create and return a new key, otherwise if it's a single key, just return its value from the array, else if there are multiple keys, return all the keys' values from the array as a list. objectName nextkey Increment and return the next key to be used. If sequence has not been specified, this command returns an empty string. objectName open Open the connection to the current database. This command is automatically called from any command which accesses the database. objectName pass value Return the current pass value. If is specified, it sets a new value for the password. objectName port value Return the current port value. If is specified, it sets a new value for the port. objectName quote string Return the specified quoted in a way that makes it acceptable as a value in a SQL statement. objectName search -option option ... Search the current table, or the specified table if -table tableName is specified, for rows matching one or more fields as key-value pairs, and return a query result handle. See Result Object Commands For example, set res [DIO search -table people -firstname Bob] objectName sequence value Return the current sequence value. If is specified, it sets a new value for the sequence. objectName store arrayName -option option ... Store the contents of in the database, where the keys are the field names and the array's values are the corresponding values. Do an SQL insert if the corresponding row doesn't exist, or an update if it does. The table name must have been previously set or specified with -table, and the key field(s) must have been previously set or specified with -keyfield. Please note that the store method has significantly higher overhead than the update or insert methods, so if you know you are inserting a row rather than updating one, it is advisable to use the insert method and, likewise, if you know you are updating rather than inserting, to use the update method. objectName string request Execute as a SQL query and return a string containing the first record found. objectName table value Return the current table. If is specified, it sets a new value for the table. objectName update arrayName -option option ... Updates the row matching the contents of in the database. The matching row must already exist. The table can have already been set or can be specified with -table, and the key field(s) must either have been set or specified with -keyfield. objectName user value Return the current user value. If is specified, it sets a new value for the user. Result Object Commands resultObj autocache value Return the current autocache value. If is specified, it sets a new value for autocache. If autocache is true, the result object will automatically cache rows as you use them. This means that the first time you execute a forall command, each row is being cached in the result object itself and will no longer need to access the SQL result. Default is true. resultObj cache Cache the results of the current SQL result in the result object itself. This means that even if the database connection is closed and all the results of the DIO object are lost, this result object will still maintain a cached copy of its records. resultObj errorcode value Return the current errorcode value. If is specified, it sets a new value for errorcode. contains the current code from the SQL database which specifies the result of the query statement which created this object. This variable can be used to determine the success or failure of a query. resultObj errorinfo value Return the current errorinfo value. If is specified, it sets a new value for errorinfo. If an error occurred during the SQL query, DIO attempts to set the value of to the resulting error message. resultObj fields value Return the current fields value. If is specified, it sets a new value for fields. contains the list of fields used in this query. The fields are in order of the fields retrieved for each row. resultObj forall -type varName body Execute over each record in the result object. Types: -array Create as an array where the indexes are the names of the fields in the table and the values are the values of the current row. -keyvalue Set to a list containing key-value pairs of fields and values from the current row. (-field value -field value) -list Set to a list that contains the values of the current row. resultObj next -type varName Retrieve the next record in the result object. Types: -array Create as an array where the indexes are the names of the fields in the table and the values are the values of the current row. -keyvalue Set to a list containing key-value pairs of fields and values from the current row. (-field value -field value) -list Set to a list that contains the values of the current row. resultObj numrows value Return the current numrows value. If is specified, it sets a new value for numrows. is the number of rows in this result. resultObj resultid value Return the current resultid value. If is specified, it sets a new value for resultid. in most databases is the result pointer which was given us by the database. This variable is not generic and should not really be used, but it's there if you want it. resultObj rowid value Return the current rowid value. If is specified, it sets a new value for rowid. contains the number of the current result record in the result object. This variable should not really be accessed outside of the result object, but it's there if you want it.
    rivet-2.2.4/doc/xml/directives.xml0000644000175000017500000003764612453516022016410 0ustar manghimanghi
    Rivet Apache Directives
    Rivet directives are used within the Apache httpd server configuration to set up the environment where Rivet script will be run. Their precedence is as follows: RivetDirConf, RivetUserConf, RivetServerConf, meaning that DirConf will override UserConf, which will in turn override ServerConf. The directive ServerInitScript plays a special role since the script runs within the master interpreter, an interpreter created before the Apache parent process spawns the children that actually will serve the requests coming from the network. During this stage Apache is still running as a single process, so this is the right place for doing initializations or loading packages. Since this script will be running in a single process environment (from the Apache point of view) ServerInitScript is also the right place for doing anything needs to avoid resource concurrency among processes (e.g. the creation and initialization of an IPC system)
    RivetServerConf CacheSize ServerInitScript GlobalInitScript ChildInitScript ChildExitScript BeforeScript AfterScript ErrorScript AbortScript AfterEveryScript UploadDirectory UploadMaxSize UploadFilesToVar SeparateVirtualInterps SeparateChannels HonorHeaderOnlyRequests RivetServerConf specifies a global option that is valid for the whole server. If you have a virtual host, in some cases, the option specified in the virtualhost takes precedence over the 'global' version. CacheSize size Sets the size of the internal page cache, where is the number of byte-compiled pages to be cached for future use. Default is MaxRequestsPerChild / 5, or 50, if MaxRequestsPerChild is 0. This option is completely global, even when using separate, per-virtual host interpreters. ServerInitScript script Tcl script which is to run when the master interpreter is created. Namespaces, variables and packages loaded during this stage will be copied later on in the startup process, when child processes are created. This option is only available at the global level. GlobalInitScript script Tcl script run as part of a child process initialization. If the option is not used this is the right place where file handles, database connections or sockets can be opened. The argument is an actual Tcl script, so to run a file, you would do: RivetServerConf GlobalInitScript "source /var/www/foobar.tcl" This option is ignored in virtual hosts. ChildInitScript script Script to be evaluated when each Apache child process is initialized. This is the recommended place to load modules, create global variables, open connections to other facilities (such as databases) and so on. In virtual hosts, this script is run in addition to any global childinitscript. When SeparateVirtualInterp any ChildInitScript placed within a will be that Virtual Host specific ininitalization ChildExitScript script Script to be evaluated when each Apache child process exits. This is the logical place to clean up resources created in , if necessary. In virtual hosts, this script is run in addition to any global childexitscript. When SeparateVirtualInterp any ChildExitScript placed within a will be that Virtual Host specific exit handler BeforeScript script Script to be evaluated before each server parsed (.rvt) page. This can be used to create a standard header, for instance. It could also be used to load code that you need for every page, if you don't want to put it in a when you are first developing a web site. This code is evaluated at the global level, not inside the request namespace where pages are evaluated. In virtual hosts, this option takes precedence over the global setting. AfterScript script Script to be called after each server parsed (.rvt) page. In virtual hosts, this option takes precedence over the global setting. ErrorScript script When Rivet encounters an error in a script, it constructs an HTML page with some information about the error, and the script that was being evaluated. If an is specified, it is possible to create custom error pages. This may be useful if you want to make sure that users never view your source code. In virtual hosts, this option takes precedence over the global setting. AfterEveryScript script is a script that is to be run anyway before requests processing ends. This script is therefore run both when the content generation script completes successfully and when its execution is interrupted by . The code in this script can understand whether it's running after the page was interrupted by calling with the argument -aborting. The command will return 1 if an abort_page call took place earlier in the request processing. AbortScript script The execution of a can be interrupted by invoking . If an is defined for the page being generated, control is passed to it. is the right place where specific actions can be taken to catch resources left dangling by the sudden interruption. UploadDirectory directory Directory to place uploaded files. In virtual hosts, this option takes precedence over the global setting. UploadMaxSize size Maximum size for uploaded files. In virtual hosts, this option takes precedence over the global setting. UploadFilesToVar yesno This option controls whether it is possible to upload files to a Tcl variable. If you have a size limit, and don't have to deal with large files, this might be more convenient than sending the data to a file on disk. SeparateVirtualInterps yes no If on, Rivet will create a separate Tcl interpreter for each Apache virtual host. This is useful in an ISP type situation where it is desirable to separate clients into separate interpreters, so that they don't accidentally interfere with one another. This option is, by nature, only available at the global level. By enabling SeparateVirtualInterps you must rely only on ChildInitScript to initialize the interpreters. Don't expect the initialization done in ServerInitScript and GlobalInitScript to be handed down to the slave interpreters that are private to each configured virtual host. SeparateChannels yes no Internally mod_rivet creates a new Tcl channel (Rivet channel) which is configured as stdout and registered to each existing interpreter. There is no need of multiple channels in a single thread as each thread can serve only one request at a time. But if you are deploying mod_rivet in a complex environment running unrelated applications developed by different teams, it could be the case to have SeparateVirtualInterps set. If you want to enhance the environment separation you may also set SeparateChannels to force mod_rivet to create a channel per each Tcl interpreter thus enabling single application code to change the Rivet channel parameters without affecting other applications (even though changing the Tcl channel parameters is a rare necessity). Setting this options increases the system overheads as each Rivet channel needs to allocate its own control structures and internal buffers. This option is implemented in order to have fine grain control over mod_rivet. In nearly all practical cases you won't need to change Rivet Channel (stdout) settings for different applications by calling fconfigure stdout ..... This option is, by nature, only available at the global level and has effect only if also SeparateVirtualInterps is set HonorHeaderOnlyRequests yes no If a HEAD requests is issued by the client Rivet detects this case and sends back to the client a standard header response. If the real header has to be examined (e.g. for debugging) you can turn this options on. This option is, by nature, only available at the global level RivetDirConf BeforeScript AfterScript ErrorScript UploadDirectory These options are the same as for RivetServerConf, except that they are only valid for the directory where they are specified, and its subdirectories. It may be specified in Directory sections. RivetUserConf BeforeScript AfterScript ErrorScript UploadDirectory These options are the same as for RivetServerConf, except that they are only valid for the directory where they are specified, and its subdirectories.
    rivet-2.2.4/doc/Rivetlogo_large.jpg0000644000175000017500000027171207612062707016554 0ustar manghimanghiJFIF,,OExifMM*bj(1r2i,,Adobe Photoshop 7.02003:01:17 14:16:14۠(&!HHJFIFHH Adobe_CMAdobed            Q"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?T\>tWM!Vcq1{wF՚LX2g.\:,߬{_v.W coSKLon][m{H-sH5Mr?񵁕zN?hv;*{6zM_Aރ+u=[u>f[85ݖ]WnOߟҮ;Ff^5')Eս|>z?VoK2'We]%:T?ƷVW7gRX۝LjtUi5s75_>;n[^^ִKzcw?^bt?r]E?h/P,6k,w^Rng=(5:&1A#JPX+CcY})d\Kk2ѹ?E wts2ԕ^԰z?p.Y5S{"\뾓 FR\QR,b!#(Cjy?x}M'a%=>_(Z:vUx";Z%j-N)5$[?UXh#Vv=-mَcZq+Ǻ.ӓ~hX9!qد?Y>ba׷j3?vH}Y_SF;]ӲSk!s3fuzm¼1]m?Cw5Yi>Vo9 Vd=c/ۍ8xbl\rqw>jG`۳߱꩕ 2L!xIXjdèez?ZqWL`~EU omU;}טֱր`(ø%?e?JX?Vlkլs&ޛ-u?O^ԔwǮbNAfka۶g.kVlz:Ҫv5xAg,{{?"Q\lSMQel$:G,flbX:]Uf67s,-Ġ'  G5>_<"x\0G?+ZXp>Vb)[y[/q+ߏm^1$qś _m.{:J|ib_.eG%=|c"*_O: SGMݻ써CdXױ[-_{vX^0Oo?3}}N htoE{?. ;3@8[c~ؽs}_gGndoۿ6/,=7}m )N6-n~G{?Ѧs d x> HJ0(e(^_/;*c}Yky3߿ݿe+Kޕ+U}Cw}dVme7A[˩Gs3O{oM_M#:N\#8%b-noJä[E\Z\ϩSKs3-C=_]Tݻk[z_gL~Mα4@i_`oa!#vV>k&vx?k>]:8unX4j>*v_ؽG/r_z_ga űG! 1'Z]#یm}nc,}vՓ_K/P0F$Fnk&hȬ1 (}'|OLwL I!2H)$ $JL I)2H)$KbI$3Photoshop 3.08BIM%8BIM com.apple.print.PageFormat.PMHorizontalRes com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMHorizontalRes 7.200000000000000e+01 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2003-01-17T19:14:56Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMOrientation com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMOrientation 1 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2003-01-17T19:14:56Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMScaling com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMScaling 1.000000000000000e+00 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2003-01-17T19:14:56Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMVerticalRes com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMVerticalRes 7.200000000000000e+01 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2003-01-17T19:14:56Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMVerticalScaling com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMVerticalScaling 1.000000000000000e+00 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2003-01-17T19:14:56Z com.apple.print.ticket.stateFlag 0 com.apple.print.subTicket.paper_info_ticket com.apple.print.PageFormat.PMAdjustedPageRect com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMAdjustedPageRect 0.000000000000000e+00 0.000000000000000e+00 7.340000000000000e+02 5.760000000000000e+02 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2003-01-17T19:14:56Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMAdjustedPaperRect com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMAdjustedPaperRect -1.800000000000000e+01 -1.800000000000000e+01 7.740000000000000e+02 5.940000000000000e+02 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2003-01-17T19:14:56Z com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMPaperName com.apple.print.ticket.creator com.apple.print.pm.PostScript com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMPaperName na-letter com.apple.print.ticket.client com.apple.print.pm.PostScript com.apple.print.ticket.modDate 2000-07-28T22:57:04Z com.apple.print.ticket.stateFlag 1 com.apple.print.PaperInfo.PMUnadjustedPageRect com.apple.print.ticket.creator com.apple.print.pm.PostScript com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMUnadjustedPageRect 0.000000000000000e+00 0.000000000000000e+00 7.340000000000000e+02 5.760000000000000e+02 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2003-01-17T19:14:56Z com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMUnadjustedPaperRect com.apple.print.ticket.creator com.apple.print.pm.PostScript com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMUnadjustedPaperRect -1.800000000000000e+01 -1.800000000000000e+01 7.740000000000000e+02 5.940000000000000e+02 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2003-01-17T19:14:56Z com.apple.print.ticket.stateFlag 0 com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.privateLock com.apple.print.ticket.type com.apple.print.PaperInfoTicket com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.privateLock com.apple.print.ticket.type com.apple.print.PageFormatTicket 8BIMxHH@Rg(HH(dh 8BIM,,8BIM&?8BIM x8BIM8BIM 8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM@@8BIM8BIMI Untitled-1nullboundsObjcRct1Top longLeftlongBtomlongRghtlongslicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlongRghtlongurlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM8BIM8BIM =Qy!JFIFHH Adobe_CMAdobed            Q"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?T\>tWM!Vcq1{wF՚LX2g.\:,߬{_v.W coSKLon][m{H-sH5Mr?񵁕zN?hv;*{6zM_Aރ+u=[u>f[85ݖ]WnOߟҮ;Ff^5')Eս|>z?VoK2'We]%:T?ƷVW7gRX۝LjtUi5s75_>;n[^^ִKzcw?^bt?r]E?h/P,6k,w^Rng=(5:&1A#JPX+CcY})d\Kk2ѹ?E wts2ԕ^԰z?p.Y5S{"\뾓 FR\QR,b!#(Cjy?x}M'a%=>_(Z:vUx";Z%j-N)5$[?UXh#Vv=-mَcZq+Ǻ.ӓ~hX9!qد?Y>ba׷j3?vH}Y_SF;]ӲSk!s3fuzm¼1]m?Cw5Yi>Vo9 Vd=c/ۍ8xbl\rqw>jG`۳߱꩕ 2L!xIXjdèez?ZqWL`~EU omU;}טֱր`(ø%?e?JX?Vlkլs&ޛ-u?O^ԔwǮbNAfka۶g.kVlz:Ҫv5xAg,{{?"Q\lSMQel$:G,flbX:]Uf67s,-Ġ'  G5>_<"x\0G?+ZXp>Vb)[y[/q+ߏm^1$qś _m.{:J|ib_.eG%=|c"*_O: SGMݻ써CdXױ[-_{vX^0Oo?3}}N htoE{?. ;3@8[c~ؽs}_gGndoۿ6/,=7}m )N6-n~G{?Ѧs d x> HJ0(e(^_/;*c}Yky3߿ݿe+Kޕ+U}Cw}dVme7A[˩Gs3O{oM_M#:N\#8%b-noJä[E\Z\ϩSKs3-C=_]Tݻk[z_gL~Mα4@i_`oa!#vV>k&vx?k>]:8unX4j>*v_ؽG/r_z_ga űG! 1'Z]#یm}nc,}vՓ_K/P0F$Fnk&hȬ1 (}'|OLwL I!2H)$ $JL I)2H)$KbI$8BIM!UAdobe PhotoshopAdobe Photoshop 7.08BIMHhttp://ns.adobe.com/xap/1.0/ adobe:docid:photoshop:0fe2f280-2bb8-11d7-8a53-98037d05b8a1 Adobed@\    o!1AQ"aq2 #BR3$bC4% rS&cD5Ts6'E7F򃓣dU()8GHVe*9:IJWXYZftugvwhijxyzi!1AQa"q2#BR 3br$’Csc%4S5&DTdEU' ()*6789:FGHIJVWXYZefghijtuvwxyz ?ӞW{W{W{W{W{W{W{W{W{W{W{W{R_9|Ӝg.f7#6s>mðX\oh4qo7ȸej% ZZ_mISzŚD2fË77j 6%,1I'$IsŰ;k)YO$R9&Ca_eNCGI1>ZXH>aoX ewT+*6t'!6fW@[+6Ϛ}UuplO1hh9Bŏ=^WzWzWzWzWAVz楯$ L6z=^s=^s=^s=^s=^s=^s=^s=^s=^s=^s=^s=^s=^s=^s=^s=^s=^s=^s=^s=^s=^s=^s=^s=^s=^s=^s=^sӞW{W{W{W{W{W{W{W{W{W{WX޴}9z vf wt?[SmqjBPaD5Sd>*zYo(kG⋏c}7u{O4˵*Fc+N@_GvϫկO=^s=^s=^s=^s=^s=^s=^׏ooZ+Rycc> &GH|]n[[^z_S_h:}%'E=be?.5 羬3gbyYbVbxSJʼnRHMRW{W{W{W{W{W{W{W{W{W}%?GW=>u#6:ՙӎtX%b՛k(đL* VzWzWzWzWzWzWzWzWzWzWzWzWzWzWzWzWzWzWzWzWzWzWzWzWzWӞW{W{W{W{W{W{W{W{W{VY_Kr.RwW(iem\U_e% PW{W{W{W{W{W{W{W{W{W{U~ ޲j ~%z.$vMLMΪ`&V0|@ɻB ѩH9bKI4 z\{W{W{W{W{W{W{W{W{W{W{W{W{W{W{W{W{W{W{W{W{W{W{W{WӞW{W{WWM?F2[3?M*fpJ:* d_1;!%0w6فɭV  ٳ:ߦO󻌱۸պI*J\mLS=Q7_>V zKmy N9bnXe R8ʛmZ=E=e<tU-R-E5M;+$nTpG~HFq!E*Fnn^z^z^z^z^_zf܏6'Nq">P& I$rAPN .;m#sgp6p9տWy8y{{WNz^?L P|z-Z~4_99{Zi!0/ArsiB`_jWէOq 󓞯WOƟ+'=^V?&>WNz^?L P|z-Z~4_99{Zi!0/ArsiB`_jWէOq 󓞯WOƟ+'=^V?&>WNz^?L P|z-Z~4_99\wI CDU~"0`]Y^07p:  ĈHi rG"]J/z^z^z^z^z^z^z^z^z^z^z^z^z^z^z^z^z^z^z^z^z^z^z^z^z_ӞW{W{Wkw `c?d?W]2woZz^={C Ҟt?{/ rG%|quJj753{w հ֣{*6w-p1I

    ib2Xe2tjen:1HǯOr:nM@*.(_5eplݓ3 lʙĨ0C:I%xVD#W ?zNe.z^dV E'2=^Oޢ󋞯WէQ ̿Ww_@ip_Bs/qs z]/98{=Z.P\z?zNe.z^dV E'2=^Oޢ󋞯WէQ ̿Ww_@ip_Bs/qs z]/98{=Z.P\z?zNe.z^dV E'2=^Oޢ󋞯WէQ ̿Ww_}B*?M]T}:~Mglb.TG |F%yuXS{y}X&[{qipGh1 }$o2qƞAR z)vYr.[qh JT Iؠ z_4l(c38czũZTLGB9ozR s}>H][y3 HP0qH?wAw'8M'sDe\Rn ǰ5w'8M's쉝ʹЛv_8V=ÿ&_9i?dLfUϥ{۲±?m V^zj+yS1f)J)"o-mY*~6! ;ekJ{cdۡ6_ʭojN,(NԔM_%{W{W{V^/gL]7W3fesd!m6ްa$%j\ABn?/4_3W>On ǰ5w'8M's쉝ʹЛv_8V=ÿ&_9i?dLfUϥ{۲±?YG K>~GwNs_P0n ǰ5w'8M's쉝ʹЛv_8V=ÿ&_9i?dLfUϥ{۲±?{2I"g2}+&ݗakiQ?QrglCӿW~Vn ǰ5w'8M's쉝ʹЛv_8V=ÿ&_9i?dLfUϥ{۲±?{2I"g2}+&ݗakNpƚO;s^6p{^L2s4?=ș̫J ect8+墽WӞW{W{Wkw `c?d?W]2woZz^z^bނT_gIU/Ī>o7K9I4a$muDj$Hae 'aXߨ}/!z;U#[~7;*zkP LߡX<̻R9O$lyۣVY:\Rv.=b~~G{f t++kVtMYz^z^z^z_4>{9GA4b9_MPaX Ҙ)r"P/zAۃE㞯WO7@?/z-~)Q8mSME=^jo>-_9{[TSQnqWڧnusz^?p}[sۃE㞯WO7@?/z-~)Q8mSME=^jo>-_9{[TSQnqWڧnusz\~)K1 IXF]K9}$=fކ5u 0>L zt]:"PKCKB7 y{Wcz^VXF`x%+gLG;vsRǚ`EqbT/ o峛~Ooξw}D['-(3UdU{Wmg [iz껣o3h IHA?ϐwa{7W I!_LI[&Q? qyú=^s=^s=^w(˩ ᖢPts*^ Xj7- 1K;RiJ}ڿWѷkx7O:(4=a>{ Q'"Ϫ=^sҥ~3SKUOf^|*mð y"=Tkֱtr*qpVz -N [(uz^zD7Ftzo/,k|+ >?%d/0^+zWzWzWzWzWz7Xο_{X?2K6j&R~v6lkzWzWzWzWzWzWΉ}{WӞW{W{Wkw `c?d?W]2woZz^z^zK.u=t9t6d_{?3x2{mGNR?Ҷ+fMz=^s=^ٺ=k7_jM5ZJ?gW˗/_Vz^z^z^z^z^z[¬?_/v,%o5|\NOhl;Zdsk5z^z^z^z^z^z^ D>WӞW{W{Wkw `c?d?W]2woZz^z^z^Ֆ*yZ fxXܬ . V$ {WZ>R9{=iĜm 䑈b@ Of&2<ܔݟlJԯ8Ъ2F-oJ`NkH[ڟFkz^z^z_'/WTl5?VJ(UcsNzUWzWzWzWzWzWzWzWnσX}G~-*`:8,?7=^"**( rz^ժO*c迥^C3>7N\ɅNJN&۝ w<;xmnTSOwNogua?Ym䲃G3pzWz"QoK}OjMIS1y݇Ǎӊ,t.7bٓEi'D*v?n^mc^y#bڴEAW3޾I+zWzW8PizK.uVFhgΠ D^V O>E]{w;}hK{8Lum$G^5Ck* ٚY+*$RK+v?I<ҔI3 $B@:F=^sa +4? Z6xT$Ybu9C媡U߹͎,?/ۦ1P=W8K7t*RӁܥ-J&'=^s=^ٺ=k7_jM5ZJ?gW˗/_Vz^z^z^z^z^z[¬?_/v,%o5|\NOhl;Zdsk5z^z^z^z^z^z^ D>WӞW{W{Wkw `c?d?W]2woZz^z^z^zYajih':b"x UhJA o{~//.ᾓ}F!'ܗB:b;<`0ukɊRD=ud}v Kd 0?=#7׷;g3~ 0"64a<a@4W2zWzW ~1E?Pku_GM\&PzWzWzWzWzWzWzWz'>fDO(5{Wv]Hee6 AsբԱO= ,z,ЩU/؃٥ v:-l{iIkIy]go"ԑƆ"WzW^?J OV5*Em ׋e\<n{KGp%:!qvDKBI9W%{W:X.%q.Yt.I%`PI,i-A#i1I3 X[BTO@IWY M{L`;𜍅3 MPEO CK !H">7>w5o\qn5-kzWzof5^7X_jV@}*J-_.^`}XW{WmKpm庮̯jO(c1`tػS,͊dXFWuaۙv(ݛO;%Qaz됝YAyV KY /(R5GvbtIhc_ ̟*Z7e^SqE{Y^?o]_ʽ,C&?3'( Ek{YOƆ1M~9gfOQ{טu* cP/s ̟*1#Ue?4_?GU+^c8F̫O41Bh+?2ҏVpU(_`=αU:GW8N 0k1 $%XMWI( ܑwqJUW\^Ւn4 4*<][*hc3'( 3טu* cP/s ̟*1#Ue?4_?GU+^c8F̫O41Bh+?2ҏVpVk=&/VWO7O<Ϗt fhV6+>4j!T1szˍLQ+J2K;3ZpAPWz)zy]pAW*7o0Z[I0[mK ':bxPO^M\/uԌ3๗@zY*nQ5<2EVGsM;x`~ _1{( /`:ҾF c  b(f=^s=^>IΙ+"c9W:dLѕs&!j 'q )&A#이l8(ZT$)*A ңDruSSa}oN2)68u[$X?+Y ?l U=bWzW X?~5Wnшy{ _2QG=^s=^s=^s=^s=^s=^s=^s=^'pa*љy%Wر&' ~z_lz^z^ zu]:6,W'NIJP$pz=sX)VЋp:՛M*OC~[a}=@e|Hd)chr *lAPA?ȊJAZWzS·險y\O$b2I<,vo '4-6a {d>[Wj@:8OxT^{jy W{WkY gkOIziMPWu;?VYp𨨦7t{rі6ڵ?2+_]ߋ MN-u71Z^zVTt{UN (PZ<5T[]Vm>cծ$:?[`)e'믨O3UzWzW(nZMWZS~u֯dҧD Յ{W{W/7{MR?E|FCϿ>WrU ׹{W{W{W{W{W|=d‘''n?k등_srķE&W{V.a ʜ?i}Epտ!lɞ^z^z^ӞW{W{Wkw `c?d?W]2woZz^p?CXzgZ¡]W?nf\f,E],E" CecL$X]Y}fVaOxY+:k4Fѵ+O-?ĕqA7Oɺk%HA0pȪmɫzM9bQ le;swnb"8aoɻHퟁ<2Gq@xs=^s?< >JNDa:ǔ)L[-Vʟ0j)# N`Ee7xb);}F+{tW 6ԃ BTLHɹ, (|sOθulʸI)Үxvg m. T͝dYu㶗(-ԅJHP=`)IǨWzI?,+c"cmkV?|\zz^z^z^z^z^z^z^p1S+A)_y}9{W{W|^/\>c7,^[ˈa}$`vX~W4j &k̸41f§arueaWϢ\B_榜Q?.${+gnN:=^s=^(?T]Kg?JJFIʘQ)Wnٛ F6ԛ`F;w<^/u][1Sd9bGgh[+U.@֚=^sأ3~OP-E܇tU[w<$wSTo&.Ĭ;NR@\M6]f⺹BH S)(s=^s=^ٺ=k7_jM5ZJ?gW˗/_Vz^z_T ]8<T3^z^z^z^z^z^W{ Fy؞ Ѹl_NRET^z[]/*s+; KVgx '&zm{W{W{WӞW{W{Wkw `c?d?W]2woZz^p?CXzgZ¡]W+_&T}hz:^fu c W6QbY{Ob4Nݒ2HuFZ6 ]ܷ-0s.3s\^$`t!c<Ԩ @JTa׬gf\0 )3NKRb4nj (a./jxxǁ?{}}/T'B܅ I"%$ZKRu{W{V_O]=t52殔Q/={j2MJ|娪c]O15ئwF)8v ͝D5rCo@:@O uW'{W|`#&1ڙ#F?-m~zZ=^s=^s=^s=^s=^s=^s=^s꽯M&_|(DMs`6z^z^t:C '[2X"΋hz:yrYxk:+Rg }V1ɻreV\(HDpQ]s=^,JMgԧI$aIQBY27CPMJcr׷c|0K ofe[x h8z=^s=^?*zSƇ-t_x*SB@W[2n)OU-9gev "p]>)) 5Kk6zWtJKtՏZe2`/s +-UKvcIA?Deޮ924a*?%d/0^+zWzX#3/ xmڑ+7}y_px"fWzWzWzWzWzW 'W=o0y?qؿ_\ӛ%-&2WzՁu{ ?^TVv,?O+?֭Q+dNL=^s=^s=^ӞW{W{Wkw `c?d?W]2woZz^p?CXzgZ¡]W+_&zTwN8D-OU:QD9Pu^3Z$uTyIJܡYl~ݼSҟ^k}N9ݐxfr'RSQOIWRST+$ȌU! A_J)&AUzWz6-稬Ulb K©X+bX5@jGJ30*Qrn#ˬ67߷ -$dc{Hs9vHԅ{|ӻ]s=^z4P<,/u qcL*ޕ^{9"S}g*R}A|VXӲuugW{W{W'oSOY\zj)s|Y sovzHŀ ؃]y}I1[&vfRN>ZxKR}{W}7L .T)^Uf⑅qcSR1'na95qNՒi|XF ׵K-mP R[EaM{W{W[ jT oT[?\zs=^s`^t`7ɵjG诓_yQ=^s=^s=^s=^s=^s=^'U_R3]bߍ}rv+NnSx(p=^s#V,8ySYg\m?郞ZD;?oW933kzWzWzӞW{W{Wkw `c?d?W]2woZz^p?CXzgZ¡]W+_&z^աo(,^}Dazw.z]5m³q%Z ȳPN]6?fޥMkڲ^vܘOF-$ָz^z_A?N#?Btľs:_eŧ|0yX N/9s{Q2cӊ~cҾv;s f(uw:<υ_%{WͳOѦ<|S$,Q W{W{W{W{W{W{W{W{Vӿ\qO ].t;c(mؼfzzWzWzUf7g3e~SuY+,J0O";j*EY[{vIv˭Dx;s=^җSWާ;uvJMM<|Z|UήĀFVO _2 {<\/MŻ5:=^s=Ru0_GNHY'4g93V S[ $j,I$ V{}k'}Q.EM8-ĤI=Uj׍{WvʈUU$sբ@臦qb?KnZU!°zz)䍙ԒylgH+7=9fnpy-jPC (^z^zD7Ftzo/,k|+ >?%d/0^+zWzX#3/ xmڑ+7}y_px"fWzWzWzWzWzW 'W=o0y?qؿ_\ӛ%-&2WzՁu{ ?^TVv,?O+?֭Q+dNL=^s=^s=^ӞW{W{Wkw `c?d?W]2woZz^p?CXzgZ¡]W+_&z^LOI'HcAˆɊ!0k02ĢyWScnsJ@QuRB/ԑdx[+EbwWzWWo?Ez=Gb eLS_inV$tq[R>p'_%]w68GZ0(pJ$ޖ?Igń -k2LEs=^s=^s=^s=^s=^s=^s=^sW /d| سXA|#WW{W{W|@}+=3O:͈ WòU0bެ,.z>w'ag WR ie -OB=*yVoW{V.>1H$=?X_P!|V )!K`,mk\ܞdaڬg+05apYߙezw@y;W(+zcFu4c:Қy6g3U*UI#7_# }4tט4>'w[_HKHL(zV+5z^ո%[dtȹcy~KƳ>!\Ȏ1|z'\i}bOuA+pd]qWzWzW(nZMWZS~u֯dҧD Յ{W{W/7{MR?E|FCϿ>WrU ׹{W{W{W{W{W|=d‘''n?k등_srķE&W{V.a ʜ?i}Epտ!lɞ^z^z^ӞW{W{Wkw `c?d?W]2woZz^p?CXzgZ¡]W+_&z^zUt.~ް[S>aHeE\N\=U~'Á Mr O|+"w佥d3!+߲W,_/`}SW{W}!\*&󫲓fXۃXPHӯb-M$Bks3(r:S{c;`Yc3 wX9~XcZnrӆbVii粶,W]WzWzWzWzWzWzWzW/yl2{Wd J|j8swW{W{Wi Ru'W[C6fJ]P`U;ޠUk|q'Ђ?ߍvwga?mĩ #˻DǐuWziu12tuY 5kZR1 ~D5˯VssmtILZޏM\s8Mn~'c3a2 }:<> դ@XߘWڍ>x$5!**IRO_x┟U3e{W} 8*no6OF)ٛs?R| jDܒQsXw9*WC_9Y19p4P$O8@^J=^s=^s=^ٺ=k7_jM5ZJ?gW˗/_Vz^z_T ]8<T3^z^z^z^z^z^W{ Fy؞ Ѹl_NRET^z[]/*s+; KVgx '&zm{W{W{WӞW{W{Wkw `c?d?W]2woZz^p?CXzgZ¡]W+_&z^zL9/Qf쯙2&/z ̽ _M&>q me9wM\#mIPI|+AX6)aV X!|EyvC%"&rWzf*D.flbS0#IuwuXebojɈ䟝|Z]vw+'I[ r^s֨_ /W.hZT i=^G=^s=^s=^s=^s=^s=^s=^s=^" x1zJ:p{wjL4}_29oWzWzWz-gZ1%gEkEeSM}1?Dw8p [X>S"3X;їhxn@*AK~Zs^Wz;QrZ WA nLeT%@=`Q)+>ceY4::C־`uAlz^z^z^z^z^z^z^Q)Gx@~ fmNAչ7=^s=^s=^s!J?(#YQՃP MeH nj o͇r{NG|C*V}dz\ = tK>ZVf\|zs=^o=EnuߢZIuH9beUE,d2 #kI)0p".E^:M]jf2_[^H/}xAw.*<}KO~2"%.2(X+yTүs=^oLd_~v8c<ᖺ{"%)VRXIKcƙ= ##ݼ1&?,îz PZpQFE0UTX΀8\{W{W{Q QK_ OY+ =^s=^_VoL y;,_5}s=^s=^s=^s=^s=^sBzU#<O[Oh/'b?o)"w Ls=^?.`]^Ï9%C{=s6WzWzWӞW{W{Wkw `c?d?W]2woZz^p?CXzgZ¡]W+_&z^z^W{ Fy؞ Ѹl_NRET^z[]/*s+; KVgx '&zmk 3 ޮM٠|>S:aB=^g=^s=^s=^s=^s=^s=^s=^s=^#w/)&s.1i]Yؕh/Fն=^s=^s=^sꅉ8`2ᘬḍ)4bѕ<Oܸéq I1_$~}]J1E1>LsU%ผl nA9Y{;P=+r'Diil(GT8z^_'/JNsSg qǼ]!*O^uf{W{W{W[ jT oT[?\zs=^s`^t`7ɵjG诓_yQ=^s=^s=^s=^s=^s=^'U_R3]bߍ}rv+NnSx(p=^s#V,8ySYg\m?郞ZD;?oW933kzWzWzӞW{W{Wkw `c?d?W]2woZz^p?CXzgZ¡]W+_&z^z^a3ŚHz04md[|Ek1ꪀQVϡsZ/60f[e8𶑏^Uz^p?[ 8ט PR#IhA;xs.gNJ*L?r?֭IԿu~\kK<%o,`S*,Z49 oFy|k{W{W{W{W{W{W{W}b#k~ 4xg|!*)1nz[5=^s=^s=^s7+'O=Pa4XftpaHyLeY>aWiBOkO{?Y,(S'ZU? e{W}=}MN]%ާMfb2C)Lf\v>e6)x~f/dF₤E|X뜷;"rN}TڏWg*CHvd8df#Lڧpfm{{7owo7Ż=*Rk$guÙqͦJZ$Ϙ/9uۊ=^sұu_[&'+/flVLV`AG0upRgu9`?ݞq䀁uV<Ɋ{W{W{W[ jT oT[?\zs=^s`^t`7ɵjG诓_yQ=^s=^s=^s=^s=^s=^'U_R3]bߍ}rv+NnSx(p=^s#V,8ySYg\m?郞ZD;?oW933kzWzWzӞW{W{Wkw `c?d?W]2woZz^p?CXzgZ¡]W+_&z^zH .t=D6 g 3* 3mܒ82; Wf6qkPHȲvꪪf%I$bOrI<粔Ięi-%"G=^sd }=L z"]BM.isN{* }B<9=YzS?Wξ^wfg.!YCRW#?J|݈F^Gb}Sz^z^z^z^z^z^z^``߂l8i$/(հ?=^s=^s=^s=^?R,\.CNaY.$Tȫd* R{V5` _E/M?BT[n7[3ˉopPyMj2^z[Vzä:=%MY/*_,.|.gHFAnf+05eݎ9?Dma``yoSS?~r/OzS0*u71X'_Ou;i𿎀{ @O+%?u)ڇdP ֹx%s:ommac|Fûʔڵ`|f~?{?;Y$mm)K?%&J{W{W{W[ jT oT[?\zs=^s`^t`7ɵjG诓_yQ=^s=^s=^s=^s=^s=^'U_R3]bߍ}rv+NnSx(p=^s#V,8ySYg\m?郞ZD;?oW933kzWzWzӞW{W{Wkw `c?d?W]2woZz^p?CXzgZ¡]W+_&z^zUq:/iQWf<'JRVG8UC[eܱVOhهKq)/&Aw2=kI"=^sr|O0VQ>%0`FNzV[g`.jZR$)-V̭UD$ HIޔa! t lb!c,,aA21onCbE|ogw}ᝲy(5Ds7ãF\ۿI[He^z_z^z^z^z^z^z^z^z_dN]k^KK+V'ۈF~RzWUWzWzWzWZOTKNggR$f| s XMTnE%2;rזڅ V_w_mͱ#f?TZ'sUz^ղ/&?Տ\KL]S} k&%b}t_Pzrg>FhŠA5MݟnG3*д_՟dmW )bQ2>W* CP1ӹ$I7[gw V'Y)c;/ə+d:ݔ]c0*zWz߄Kܙ斢&a]YS+}|Dg3p,?-#xuy:3:M&aP ++zWzWzW(nZMWZS~u֯dҧD Յ{W{W/7{MR?E|FCϿ>WrU ׹{W{W{W{W{W|=d‘''n?k등_srķE&W{V.a ʜ?i}Epտ!lɞ^z^z^ӞW{W{Wkw `c?d?W]2woZz^p?CXzgZ¡]W+_&z^zZ¤@Łwӷ\.K8oW3]5;ٓ IJBGAOsk -0}gYvXm,8u(&u{WYWl7ޠcx^^|f%UryPlǃ`7rt;]G(׳6(cV仼f$+HLI EuF{*33g5{7em$$${#xz<ɘQF1|a3 }KT╱vFY)ڢovY?xkYT}¾wò_vܦi_ttF#_w>ᕸzd?%d/0^+zWzX#3/ xmڑ+7}y_px"fWzWzWzWzWzW 'W=o0y?qؿ_\ӛ%-&2WzՁu{ ?^TVv,?O+?֭Q+dNL=^s=^s=^ӞW{W{Wkw `c?d?W]2woZz^p?CXzgZ¡]W+_&z^z_4_d~?ge̝Ѹ'²42**jc"}G0ne?_P?E=|w:zBZMUz^չ% VU{hsT+U]}Ōc$4 ,7BR4=-v!(ZjaۼwTt|CC6Îۼ*{RKèk.0b%ߟ=^3Zp6*g/lSo=^s=^s=^s=^s=^s=^s=^s ycĻ9!t5 qz{W{W{W%sP3B#Yp\b9CDKRIE(*H)!ljJm[>( ]˯ػhZV4({|sfYŲVj̹7ScK8:Dut/K225 i![RH>fZ5rіJVԠO1sOQQGQ]$KUJQMSN̒G"0eee \ۛ"iZJT$;<^Wzccus58,f&l.e>2DQf-+WPU[;2~˳f]ʉ=@7_.z^z^z^zD7Ftzo/,k|+ >?%d/0^+zWzX#3/ xmڑ+7}y_px"fWzWzWzWzWzW 'W=o0y?qؿ_\ӛ%-&2WzՁu{ ?^TVv,?O+?֭Q+dNL=^s=^s=^ӞW{W{Wkw `c?d?W]2woZz^p?CXzgZ¡]W+_&z^Sǭ_D35' W/FrP3%V%K_L^er6?lpN,ZaSvAt]}vߛvF+R~v[==$mѬj|ºvs=^Qʙ>f.9#E2 D7MYb5)GMcŤEQP8Wӯѿ;<H9pF>(Ci:x UYe{Wl 5/W@c3'ק|±/vvHVu$S}VYae7Sɷ}ټX5Q>dW/?ӷn{j9RNήcOZRvj{W{Wg6 wת||2,i5l6#W=^s=^s=^s=^s=^s=^sGK-u]- z/#`yz^z^z^z^z^z^zBIhL]׸;~|zt Kƻ#(D Wg=^s=^s=^s=^sՃ9҃z}ָ)ZIz{q^TB jF tI*:Gn{*)L' u,,'Cu8u'i%cW{W{W},^o= 3_LRUiؽV-K#h.~Nh|s5{0FT G+{?v*P( >foĊ=^s=^s=^s=^ٺ=k7_jM5ZJ?gW˗/_Vz^z_T ]8<T3^z^z^z^z^z^W{ Fy؞ Ѹl_NRET^z[]/*s+; KVgx '&zm{W{W{WӞW{W{Wkw `c?d?W]2woZz^p?CXzgZ¡]W+_&U>\s>=/g|;:g<6A$+]Y tk@ح vRlmmvttm<+CDoke9Z A $hy[[YVU\|VWV4ұwGrYI7'8]a4@F=^s{ 0%ғꓭYxzf mNRs8^:,;#yròmp`?=M|XG@X֊(x`LCxJh#bLu͚=^s=^s~:e c]MU+7=^z^z^z^z^z^z^b `G4zBy1u$a=7h's=^s=^s=^s=^s_K_ tPҵV/ذ~% -{1jL(z>Ӕa  骽WzWzX]~7a.Lո/QT4@XvfS6RFIa:$O@IW=>/I_Ҭ,:gpNaBy6@: Z {v=+|7_p5YA=^s=^s=^s=^ٺ=k7_jM5ZJ?gW˗/_Vz^z_T ]8<T3^z^z^z^z^z^W{ Fy؞ Ѹl_NRET^z[]/*s+; KVgx '&zm{W{W{WӞW{W{Wkw `c?d?W]2woZz^oy#ϡeb.IeUUΘi$pC3k_ U|$ P)3/Aْ,YL; eԆZlEE_{֏9kih*R|RzO^N#H?w)c)+i^X#bv-WMb8'TTNY%IK3fbI&صIkͲ[m!(H 0`|=^z[I?db{,6+T%Ь fZr)S)$HE\2%{'ܬ^ܧcI:OPǔ ],pEÉ?ܐG4|GܩFwg9ޭ*BOB3SzWzWzWzW(nZMWZS~u֯dҧD Յ{W{W/7{MR?E|FCϿ>WrU ׹{W{W{W{W{W|=d‘''n?k등_srķE&W{V.a ʜ?i}Epտ!lɞ^z^z^ڋzyVޕ1%ޑ||w;åv>w%Ewv#)kCdz ܨ`=)ç\VYvϗn~ͦu* h'U1_:@Zz8* fx&̘:R yG7ƾ) r kCߖqԛΞku_Vc?ԑ {o8MO=:̃H&ƿqwWc׿wA$^h~?c_81kq ?iSzg *eiӌb:T"@'9ХY6NjJ*DPy흪4yUawO|BP.솻o 9tKbvUSzPD;t;-ʑko|+ zWzC5ƻYh|RIMIѻW^z^z^z^z^z^z^zV#aQc_߇ uW*UISWM.z\zWzWzWzWzWttcׯĆ*'>f SL7|fM_ǸKf 1LqmwOxqR  _O$ ^z^հ&K?O?Q(-E^E,K-ĝHSإ{a?k}WҔ:OR2Ҿz+zW"F.uY0ρXrLP==m$в2MO2[ fj/-ʉB$mu1}n7w:̘JV@T T%'+Uu=aNR?uKƏ8t2cO_J'SsTFNXcq#cݮ>A#[ocdfB?r OX tu_Rn1k~YRlk:y?{7{dRG5,65<ƽ2 #CߖqԛΞ{u_^c?ԑ @:ּs fcz,K 3-QMQ kG$ST2Ђ<ʒBQ4p6KY2!H H4 zWz\;o0' &k.3 ó/==<"(UBan( \Dq&TI-N$S$&?_gI応]U4n1k~YRlk:y?{7{dRG5,65<ƽ2 #CߖqԛΞ{u_^c?ԑ {o8MO=:̃H&ƿqwWc׿wA$^h~?c_81kq ?_:_ Uz^z^W{ Fy؞ Ѹl_NRET^z[]/*s+; KVgx '&zm{W{W{WӞVäzyl>W~EF| ;v!T*CiSeh bl;ʹ?fǩ_[|窻\?R<{bݒqqy$xQ5!z{W{W{W{W{W{W{W{T*6(%FhfA.aQe#ag:Ix~B#{fԜm.n:KI]s=^sϒǫnTSoywM[(*qjSjrUI a =R ?\Jmי`?u:{% > %{W{Väzl~:[{jw$FSPQIyvQ#0`3~rmڴ1O|a\R٬?|X+I@?ZWzWzWzWzWzWzWzWz|g׹{W{WO]絛)bz`.Fƾ;7)KI[MRe{Wo w`̬3Y.W[7+VȜ뙵z^z^z_ӞPgӿNWt+MF& W:B)swNq¥\Sb4n& &@k0 /ektx}Dc_Vv _LbRxH" <) WzWzWzWzWzWzWzW6=%蟨\<\v(ثW`1ͼ*h#o9^_|Bz$T]WfặCEj 'V1m_%^d±L?kLC )0sx秨K|UV HP2 |]8êii$v j/IzZ:믥ϡ%KXU3N+4zWzWzWzWzWzWzWz|g׹{W{WO]絛)bz`.Fƾ;7)KI[MRe{Wo w`̬3Y.W[7+VȜ뙵z^z^z_ӞWk :.껥WL>y3uQdxcc4Q Nf(5~vMڴ1NhꞪ_rIfs_97 OPtBAЫ_@z^z^z^z^z^z^z^z^"/Y? Gʦ*貕?O+*e $yrTM˒KܱW9-|b{Nm_.:{8lV9cM{Wń? o=ڒ9g^zZf=^s=^s=^s=^s=^s=^sُGBJ'h,ə[%W#WzWzWzWzWz1ҿc?kk=厪awMCSb3j=A;_7^>k:{?vjT&Y?{ă\Wοw_Hz^z_XI}+ۣI9/IԬY.gyم;s?7~,$z&E;_יf3"Վ*Z@zzWzW"2K9fyTff-4P'Su |=@ v[ͬ°VԞ z黷Ϸ5fT<҈ԟ1HZS8H?PpV{46X 9/|WzWzP}UH?wZ7~5د9O[Hj+zW|KXWNegasj^D\ͯs=^s=^sӞWp8HeU12#"jQI\¯Mo]2OR_5oam We翳yw˷?{r0u6pAqsټeH½[9kw:JL:)quc1̅lZ92gyx]g6%Tr")c+mM4 ƕ dv 'ZB&  kI.cw:Wz~}ÅSc=Վ`UmVo Y$Db`H"?FҼ* j@^my̬Y\*I!IPedF #qcoH_ 7,3k7̻W5oam We翳yw˷?{r0u6pAqsټeH½[9kw:'/GG$3zQ鬱J9b"vVV CbeaH¶7&FovêB_H{}^Gt+&CW2/pL2 ##Ya7Feyuݺnm$iFzDG|w9g8]\ޝkBI\2SEA@edfGR+ FyT"uz^y1[ .H,B5&DZuػP?ηeBߴ?׭_R?UrY|W|oDP!I͸D ,ve=^y{W{W{W{W{W{Wm+,هerJsn(٪qL9zzWzWzWzWzWC_NKQ2>f$ Ty*<]^g  Ȼi3 ] 1*ԧZX zԛ^x/Q^SN:@ lJ=Xw^?VX떁]:C7zGZ M}yU^z^z^z^z^Fl:;mSQha1V`jj7kvHǷڽrHȔ`zā"ZZs=^s`^t`7ɵjG诓_yQ=^s=^s=^s=^s=^s=^'U_R3]bߍ}rv+NnSx(p=^s#V,8ySYg\m?郞ZD;?oW933kzWzWzӞW{W{Wkw `c?d?W]2woZz^p?CXzgZ¡]W+_&z^z^B#_>"5(Ը0UW:b@ jߍ}f}:(܄IE+zW|KXWNegasj^D\ͯs_L =6iΘT[τ(D~z_;>z^z^z^z^z^z^z[!=rbUڏ!e7ENaB_WӞW{W{W{W{W{Wλ/Ҧs,j:SGuU"۵>~aS3s_3a*A_H˽3ѢeV:O$z!āHk:kzt͎]TaFI:[˴jZn6. 5%#I \[bNBPnG]n9̎-׹{W{W{W{Wo]x5FcE/R6ڬ{]Bk=8 vV8CMw)[Xy5,zm^V^(k9 z=^s=^{3*hkIh!S]%#+ns:w9ZHWoVR.s&˃Ѕ:UP {W{W{W{W{W{WO]絛)bz`.Fƾ;7)KI[MRe{Wo w`̬3Y.W[7+VȜ뙵z^z^z_ӞW{W{Wkw `c?d?W]2woZz^p?CXzgZ¡]W+_&z^z^C?}ragƘ0;|?uڿ_Y_N_2{Lz^վG% Xq2dQ\ovq["rgf׹ig h!|YwT(ؕYR}f|{W{W{W{W{W{Woy˨6*LC}MT&ss=^s=^s=^s=^s=^s_QұM}"saٗxNӲ?4 ֻQw7a[8$A]ge?by#PRЏmj7|W}7,lpazpky?;-h^ ܝT>!#\/adŨZS)PLtN8b 9;{=Ȋ?%֔BC" !D%I %>-rr*j:#֯Nh⮌¹3 ^GIHr|߼o@|b!(d%̎cҜ|ĊZÆz̗.*e?4t4GBoUg^ qY/>\)ӧйv8׿=rt{VfKϗ=ik.]%_up@_ՙl2k: hW{3'Gfds fNƽBoUg^ qY/>\)ӧйv8=^s=^sBzU#<O[Oh/'b?o)"w Ls=^?.`]^Ï9%C{=s6WzWzWӞW{W{Wkw `c?d?W]2woZz^p?CXzgZ¡]W+_&z^z^C?}ragƘ0;|?uڿ_Y_N_2{Lz^վG% Xq2dQ\ovq["rgf׹j+ 8/YBTp+ fWמW{W{W{W{W{W{W^>~ 9 c'Tv-RƁW{z^z^z^z^z^zZ“Yz9ouyzh1#QIV;irmOWC#{?!P' w[j&~z!s~++2^ U*h*jԀOr3sl?-[ O}OwWrOQB?R(pKP{W{W{W{W{W|Ou>>GH)W*QTOKVLE*a_iAΞY?"{ENe,v&}E [WTz^z^z^z^z^ D>WzWzP}UH?wZ7~5د9O[Hj+zW|KXWNegasj^D\ͯs=^s=^sӞW{W{Wkw `c?d?W]2woZz^p?CXzgZ¡]W+_&z^z^C?}ragƘ0;|?uڿ_Y_N_2{Lz^վG% Xq2dQ\ovq["rgf׹j %Ŀj;:yj G=^=^s=^s=^s=^s=^s=^s=^">q31mJai7>Vr>;ջ=^s=^s=^s=^s=^s=^OtWyae (_S~۪)#;p3nPc S6$'8%7-/Ge|U}B@zkQ~t[.vQI[aƤ@h[Μ UهSB]===<%--*-=55:GhUUT`nt q-EJ2N$nn^z^z^z^z^zZŽ}>w!u'Tfj/5nJej*Rx,Fsg]7v"+goZNf)Vns#^l ؗywQ֮V*s=^s=^s=^s=^s=^g:'_z^z^W{ Fy؞ Ѹl_NRET^z[]/*s+; KVgx '&zm{W{W{WӞW{W{Wkw `c?d?W]2woZz^p?CXzgZ¡]W+_&z^z^C?}ragƘ0;|?uڿ_Y_N_2{Lz^վG% Xq2dQ\ovq["rgf׹k !?Rʛ'N@ae_#VzWzWzWzWzWzWUzU:.\Ļ|эչk ajT(z>}eya&V[*֠Q(}OZp(]7KYfXI@x&A#k~N,5]R/awr_}n&QWckNW zWzWzWzWzWzW0ׂbg4`-a_顬COBrFJ2AmPJTI4/n-C8A JJT1qb+U]< _37K>#_.U6^VpB$,̒Ώ rޮt,UD;G+}Yhކ `D$Xb5?{/4Fx_( 4>nn¼Af$( "Rrѕ_wn~hp1S{W{W{W{W3=^s=^sBzU#<O[Oh/'b?o)"w Ls=^?.`]^Ï9%C{=s6WzWzWӞW{W{WQH:ZUZ > B(%Jh'fX@l诲{HWqTPMX-AC- &a =08{ ݺu) uŸI Y$$HIhH ׹T7MM ZH}] j'WW{W{W{W{W{W{W֯qC*Ya'!"Cѻs'W{W{W{W{W{Wi# Rޡ=1 Au(;l$+bKۻBt>40S*OoZONNRϴՔbzTKRzYF | 5 0L>oOV84>ûgckbJmm#n)J>dnM=^s=^s=^s=^s=^s=^s=^s=^_ʗ,7ٔ2wzRܼ0 o_{yO~S2OJc{CM?+~=%緞?*D=OJ7/翱Oʵ?{7?_҇tkO*} ؅d-t>!,S=LLF4pF!]QA6Qc[ $Qs\&3vԤ$)A$$)dI LI'#h3^z^z^ӞW{W{W{W{W{W{W{W{W{W{W{Uu~.rb߅ @4'|e׻Gj_TZ az zWzWzWzWzWzWzWzWzWzWzWzWzWzWzWzWzWzWzWzӞW{W{W{W{W{W{W{W{W{W{W{QRߗcވ`Wzc0Ϙvd;mWqWzWzWzWzWzWzW ͖t(Y,})YN9\G=^s=^s=^s=^s=^s=^s!秬_7Q˔ ̓AZuw\K)qdcJ WVon7'UT)$yV@},Y-6Jډ ̝<(e䜩2n,:,`iRS%,K#[viBv$=*3GoݹtZ5O҇Qm{W{W{W{W{W{W{W{W{W{W{W{W{W{W{W{W{W{W{W{Wӹ;W ǟvgoooy?'Z-v{8ηo}ެ&f>F3>YXu*)uU-8Ÿ Foh/^?_翷/ 7?ueN/{{ ׿'y FBmkg^<#^Flx{}zУCAZY׿O=׿Q{[,q'޿k(_ֽ-8o__5oh/^?_翷/ 7?ueN/{{ ׿'y FBmkg^<#^Flx{}zУCAZY׿O=׿Q{[,q'޿k(_ֽ-8o__5oh/^?_翷/ 7?ueN/{{ ׿'y FBmj3`/?Qgo?oO!O;!?-IѦퟐſ;QLh&~M_9+|z0LM*zo WҢ )Qiiݠ{z=^s=^s=^s=^s=^s=^'φMQ,])`Z\*)zÞU=0ߋ4L?o?ξ=[Z!xo_vl[w;:{&Qr]sݤ*t1rb[,q' F?oh/^?_翷/ 7?ueN/{{ ׿'y FBmkg^<#^Flx{}zУCAZY׿O=׿Q{[,q'޿k(_ֽ-8o__5oh/^?_翷/ 7?ueN/{{ ׿'y FBmkg^<#^Flx{}zУCAZY׿O=׿Q{[,q'޿k(_ֽ-8o__5oh/^?_翷/ 7?ueN/{{ ׿'y FBmkg^<#^Flx{}zУCAZY׿O=׿Q{[,q'޿k(_ֽ-8o__5oh/^?_翷/ 7?ueN/{{ ׿'y FBmkg^<#^Flx{}zУCAZY׿O=׿Q{[,q'޿k(_ֽ-8o__5oh/^?_翷/ 7?ueN/{{ ׿'y FBmkg^<#^Flx{}zУCAZY׿O=׿Q{[,q'޿k(_ֽ-8o__5oh/^?_翷/ 7?ueN/{{ ׿'y FBmkg^<#^Flx{}zУCAZY׿O=׿Q{[,q'޿k(_ֽ-8o__5oh/^?_翷/ 7?ueN/{{ -fS/<㽿 \'뎊'\w=<+ا'ѿ/ԗ[zܭq ' ɳa],r)pt,_.Sy&k8be@Gjins}߰L(>KHQ*D }pԓ!- ?j2UJ#m p{ i%{G^W+ȏod/y-{x,_4"?޸I 翰W~ҽ,_z&B7I^Wj2UJ#m p{ i%{G^W+ȏod/y-{x,_4"?޸I 翰W~ҽ,_z&B7I^Wj2UJ#m p{ i%{G^W+ȏod/y-{x,_4"?޸I 翰W~ҽ,_z&B7I^Wj2UJ#m p{ i%{G^W+ȏod/y-{x,_4"?޸I 翰W~ҽ,_z&B7I^Wj2UJ#m p{ i%{G^W+ȏod/y-{x,_4"?޸I 翰W~Ҭ,9A~KqnwQY K x fEH$L|>s=am!H R8{QE2fjd˙DR?R>&h .s FW"=^=^s=^s=^s=^s=^s=^s~5&^]J:{ J>9NIoVI]tFȽ7_~q7KjT{pI֡'F&")p6ɚHJ0jB}mPX$@3& Y6RLoW~+edGI2J½CW??үWko\?$_[O+? ^XJi^D }pԓ!am?h+5{c*{Y6RLo=edGI2J½CW??үWko\?$_[O+? ^XJi^D }pԓ!am?h+5{c*{Y6RLo=edGI2J½CW??үWko\?$_[O+? ^XJi^D }pԓ!am?h+5{c*{Y6RLo=edGI2J½CW??үWko\?$_[O+? ^XJi^D }pԓ!am?h+5{c*{Y6RLo=edGI2J½CW??үWko\?$_[O+? ^XJi^D }pԓ!am?h+5{c*{Y6RLo=edGI2J½CW??үWko\?$_[O+? ^XJi^D }pԓ!am?h+5{c*{Y6RLo=edGI2J½CW??үWko\?$_[O+? ^XJi^D }pԓ!am?h+5{c*{Y6RLo=edGI2J½CW??үWko\?$_[O+? ^XJi^D }pԓ!am?h+5{c*{Y6RLo=edGI2J½CW??үWko\?$_[O+? ^XJi^D }pԓ!am?h+5{c*{Y6RLo=edGI2J½CW??үWko\?$_[O+? ^XJi^D }pԓ!am?h+5{c*{Y6RLo=edGI2J½CW??үWko\?$_[O+? ^XJi^D }pԓ!am?h+5{c*{Y6RLo=edGI2J½CW??үWko\?$_[O+? ^XJi^D }pԓ!am?h+5{c*{Y6RLo=edGI2J½CW??үWko\?$_[O+? ^XJiB~U?烬?d?wnoݷoZJGLQo {3_ڽ46G ӞW{W{W{W{W{W{W{W{W{W{W{WLr*|AӞW \/#/BY/m\R{W{W{W{W{W{W._znJyg,|,VzC=^s=^s=^s=^s=^s=^s=^s=^s=^s=^s=^s=^s=^s=^s=^s=^s=^s=^s=^s=^s=^s=^s=^s=^s=^s=^s=^sӞW{W{W{W{W{W{W{W{W{W{W{Wc5/ n9c387t VUJI WR`iqGqL?q̿9WOоoFïG߃WΫ3k2_{{SB5{Z>2u[q{Y=+/2q̿9W^|Ѝ^wVger ̧k:}0e2u[q{Y=+/2q̿9W^|Ѝ^wVger ̧k:}0e2u[q{Y=+/2q̿9W^|Ѝ^wVger ̧k:}0e2u[q{Y=+/2q̿9W^|Ѝ^wVger ̧k:}0e2u[q{Y=+/2q̿9W^|Ѝ^wVger ̧k:}0e2u[q{Y=+/2q̿9W^|Ѝ^wVger ̧k:}0e2u[q{Y=+/2q̿9W^|Ѝ^wVger ̧k:}0e2u[q{Y=+/2q̿9W^|Ѝ^wVger ̧k:}0e2u[q{Y=+/2q̿9W^|Ѝ^wVger ̧k:}0e2u[q{Y=+/2q̿9W^|Ѝ^wVger ̧k:}0e2u[q{Y=+/2q̿9W^|Ѝ^wVger ̧k:}0e rivet-2.2.4/doc/asf_logo.gif0000644000175000017500000001615707352114733015204 0ustar manghimanghiGIF89ad~fff̙3olJff3OEfffOf3{7O33fffPPPf3333fN@EσYf/XTJϷTffffuf3ff3JmvdfffVPEOVNjE H̙f|~cv3fǰdlԮifIvt33gt|tA{F|{7-}L"Bjx̙OKVE휃0*PjOV]~ff33{M VJqYOCLVAMY UQPw{}Hm~_!tr lT=GQx|N\n{8QuNNNlUHiïNy/f3fQ̙!,d@H*\ȰÇ#JHŋ3jx1,HP8  =p(Pϟ@ JQ:(3ǧ a8 WhB+x FAK͛شB`ǀGfF!@ 5ᆄ+V(`f&<qbwRt@:uL@# Xz+1u@k̗q[W&tkA yB KE ``>CpA 7 W.t7CsjG(hB z6eh^k&U - }(\m]F% @4F +P"QY‘H^A4@W} X_A)P S h@Y lfolq9KkFm#*TxL-VWBf J(xhG{|dp\P (ܰ)74܀DCJRSYGk[by]w.Øk$E\* a&n} D`;=[CMvz7/y?}uwHD/}>͓~Y/ A BgoC@9P̠2,/Bp`FBUՂ%7&70` qXѡ3W1AW@PO/ӜB+xFʉKsVQGez ϤYm|~^ѱ!: <`Zo>06fE"D=I"E* YPpOM^D >AԻmkcB3JWB,3^~kw1 TMؖ -A*ʍ6q(BW(H! GGFdk6Ǔ bA4Ѐء m`9K0^Mk DC8)- hB~P-s!D ]\2Es!`R-,EЀnv@7@S@h %!OHjD@CKBCNpHJ) [ׄTs>Ǖ1{2JC14,c߳mHhd`Qz3:$tCYb:le؍ru臽vc5 .k^zasnZ?G$ժLݡ-qzC6wLj7]겖UucDz2~@s˳ۄδtil~X$򖱤-HZ!"3mo D  ǹQxvϋ1lJN0q#_[I.wL@!/N>2!C$uAo~dm%Pᄏҝ+%Hfz:>5Hb1%kvtwo ڈ#B3h$* h3ELarđ` 6a.vWA1w/X'cWmpyq6X/|!_~Krf $+A5(+lG0A~(3Gmh@M[Jkj@ ,4HQɷ [vF'v 1fK]wI8j޲ V}]a1`"[ 8]hypNOG ن-mxˁRSI'*"ljw0R DUoBv@Ӷp7O M^R4}SST!uHNdc0"Q77 syC1~ P4(@PbPvGzg^uujUgeWrLK/1y[Y\ȅB &g0}(4)NBE*g.7ef&O@UOX% <9|nՄ1:"% W${f%gF;؄R@@=4mcROYX&`osqM4S4-E&XԅdTsWdp^ap/!N]u)apraLOq pO׃B@A9d>*"w\r{Jh_c\{WxUWKqɂ2ypUO0 >BsS٤~ 'lq vtBTv`irPu)1"m&iqW8WdΤ,)ג4ْwWS'CȂ$\L;95G!w$I^a:@qDYQodfKpdVqb]c9K!C5Y?g_V7ҕ]1|LCu%A1sg+4\g9d 8NUW8VyhuK]SX闊4&:ݕ,AL0ty㚥YC!v5i6IRI|a'x3 hV)ǩoi]S^_CgǙLhz^v:i*sY^$LBhq7exguٕFJf`lE  WR&7RVeOS%dg]lW7#ha%#f!7b1v63q0<22&624{6$-6ZIʜ D1ee<ifeDӥAdp$n?Y7$1cd9Î`ZQ/y4֡SL?) = S2کjZD:ڪgcr w,20<=:G ` !%`2P2@ ^H8^J RJ1kii'0'B "ĆEtyTi"x%_m&ER;lwln)PF}LGL_V('RpԮ] gCj gCIv1{}ŒLa?aб?e7WsSr@KUBZ ៨ k6i3isQDA$xs*Ү7'4D)>" 4z:8ZI؄ֵ FF~`#pNkD葨v$RBG1,,}THwI+,}qKw[qsKWpą4DEP#.E5l \K2s48%uez߱iǛhZ3| 0IBV9t $4pD}l"x!1WM!;J3~Wn7«Gqa3\ķ9{$Q 4|rc̿Y3zk8,qCroW}dh!Xʎm]1pnD"TLJ,/2T{.1Z_tWe̼PE1kJ7J'˥|8slX"!HI,pTt$BOǑkrya a$ QMÒP Cmv*0b"tIL+E$Bln}B'GW1+pPpRP@R=ZȿwiH:iǒRMɼ[M{?E^0]vƢ,;@E0&,P.Ru҂ۄxNa"0QE`SKehA`&M0/ Z鎚hOQ`čHas9 qV8;WG50 {p.os6Ex=CMcM `&vTP5/v$)WOH8GpL!KPYPO`tO&0޼qCta#/tM.X,!crҝ& WXs, ?0),a/&U/P}G.0ْm0~ NH;NMWP90p4uku|%1 1ԥ41;FBACiwAQ 0zV^/}oO_ XDŽ5\N` <1GUsd)i`Iݞ 4aaN 1᳇EauXX8^VvrBmawVM^9UXcɄٿ {A 0$H0À D0a@BC hq-`Aɏ%0aCD1M9I0Č) š0L8re̚YQVtVK%{rNNxq@^OjsCy,)pEia<1eLK0ʕxTVވ8g݁beYUC+U\J1}}yuŹOca-S>91d;6춠I'FË:semW >h㋮ .!I;M+žZAAlSQ9 /$1b#>yͿ-22$fS*ro5c !'#z3# ؼHI6O=׌TjȐ,h.D. S5'4uB>&QҳG1QʱpTSOMU8m@肽-X}$_.ٲeXafmڎZj[pw\r5\tUL+ե6dX]z]{|YQ:]3j_7asABaD_ ~ч 1He4EJwҩ H^ $*hD<%iy%%3kRT^+)cׅ0@wX'x-jP^f 'Zfb{kۘ꫒xkk,lT֓k71,n N BA$bV:sQJ;h3߃#\ƫr*u7_w:-Ȼԍݛ_zǾw7׽+ f%}MUΊp?p܍6E0e- 榷H,H?و$ |AX@T1ZNL JYN3eKNJE|{^wCOZ q-_g:@!&QKdbD(FQS4^@;rivet-2.2.4/doc/Rivetlogo_small.jpg0000644000175000017500000006310307612062707016563 0ustar manghimanghiJFIFHH ^dbNJ[SGfo]۾tlo(ȭ=쾫=f{/UvNO$,.:}qiZXWT#,].`ۚ=ךlIwPWWz^h<+-~>VG( w}=%K̪ۗꮧ9!~(}n:> 5\Sq ƶv<wl?-C?RYYzOGv /`.sXZ\So_paшO4 hw1@"b%}Aė;b] {F"+s?W;F&9wm~=MIr?_f^m~ݳI$v>;q?{7_$g{~.UzNŻ\Eٷ޽3^.3T7Ծ4KT"%d.G(4?۫dcвd5۟S07=$e}OO&cU~UY+uF~ez<<&'db >(e⑁R?u⺿O?N_TkKv@^?U+OՀ&myTߴYKz~MXdYS[Ծ>kS14=~&5[?KJZoY%rW|b o_ޥy^e[+zb?WZY|_Wÿ/I%3$g{WtέgmlS?Sz2oX} Z}^Kjc /ݷnƿ\'Q<,N*ru-D,?,EL~_TzEޅ}:j.vYe[?6}t5)9r8+'yq/ %<; ?v͟RP|͟T:Cgns_ick]^,-gVb6~kXʁ6;>/:|5Ob }U<J6XKƪ veS>QĮ_όAou._O1NoӘ?k[\OٻoU:U/5P^͖4~[KSL_Yc`?xn?t.ySylRK]GQdeφkv͡}O_N"Ezk1HZLh$bI$r_ΣM*esZ?WDfhynVzyq?hBL6>_'܎mf: ^܄CL')\^Ps~>lM~Onw}%>OQQ}U/\ipw֌`՚F? Lվ_.{+ļXݬkConbY{|P?J>moW}[UbS?U_mc.aQ]l~6>[msza! tϫKK~Q1@F~!9but#YΛcջ/Ohbp,cgLڼ^~0/,t9 gJ#YΗ?uk7y'LM~[9x$xrc͏]wݎ[=SkGҗ~~wXבjkql7=ۙr'܎mf:_G>~MF󃜈W .=2Kہw:L7<~mI?x}Of]).Photoshop 3.08BIM%8BIM com.apple.print.PageFormat.PMHorizontalRes com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMHorizontalRes 7.200000000000000e+01 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2003-01-17T19:22:20Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMOrientation com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMOrientation 1 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2003-01-17T19:22:20Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMScaling com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMScaling 1.000000000000000e+00 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2003-01-17T19:22:20Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMVerticalRes com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMVerticalRes 7.200000000000000e+01 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2003-01-17T19:22:20Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMVerticalScaling com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMVerticalScaling 1.000000000000000e+00 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2003-01-17T19:22:20Z com.apple.print.ticket.stateFlag 0 com.apple.print.subTicket.paper_info_ticket com.apple.print.PageFormat.PMAdjustedPageRect com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMAdjustedPageRect 0.000000000000000e+00 0.000000000000000e+00 7.340000000000000e+02 5.760000000000000e+02 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2003-01-17T19:22:20Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMAdjustedPaperRect com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMAdjustedPaperRect -1.800000000000000e+01 -1.800000000000000e+01 7.740000000000000e+02 5.940000000000000e+02 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2003-01-17T19:22:20Z com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMPaperName com.apple.print.ticket.creator com.apple.print.pm.PostScript com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMPaperName na-letter com.apple.print.ticket.client com.apple.print.pm.PostScript com.apple.print.ticket.modDate 2000-07-28T22:57:04Z com.apple.print.ticket.stateFlag 1 com.apple.print.PaperInfo.PMUnadjustedPageRect com.apple.print.ticket.creator com.apple.print.pm.PostScript com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMUnadjustedPageRect 0.000000000000000e+00 0.000000000000000e+00 7.340000000000000e+02 5.760000000000000e+02 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2003-01-17T19:22:20Z com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMUnadjustedPaperRect com.apple.print.ticket.creator com.apple.print.pm.PostScript com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMUnadjustedPaperRect -1.800000000000000e+01 -1.800000000000000e+01 7.740000000000000e+02 5.940000000000000e+02 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2003-01-17T19:22:20Z com.apple.print.ticket.stateFlag 0 com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.privateLock com.apple.print.ticket.type com.apple.print.PaperInfoTicket com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.privateLock com.apple.print.ticket.type com.apple.print.PageFormatTicket 8BIMxHH@Rg(HH(dh 8BIMHH8BIM&?8BIM x8BIM8BIM 8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM@@8BIM8BIMI?d Untitled-2d?nullboundsObjcRct1Top longLeftlongBtomlong?RghtlongdslicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlong?RghtlongdurlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM8BIM8BIM *d?,I JFIFHH Adobe_CMAdobed            ?d"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?T^cvVEc 8yA9=0coZd i}[\#9^7w'A9S.MT6C{x/X>^dbNJ[SGfo]۾tlo(ȭ=쾫=f{/UvNO$,.:}qiZXWT#,].`ۚ=ךlIwPWWz^h<+-~>VG( w}=%K̪ۗꮧ9!~(}n:> 5\Sq ƶv<wl?-C?RYYzOGv /`.sXZ\So_paшO4 hw1@"b%}Aė;b] {F"+s?W;F&9wm~=MIr?_f^m~ݳI$v>;q?{7_$g{~.UzNŻ\Eٷ޽3^.3T7Ծ4KT"%d.G(4?۫dcвd5۟S07=$e}OO&cU~UY+uF~ez<<&'db >(e⑁R?u⺿O?N_TkKv@^?U+OՀ&myTߴYKz~MXdYS[Ծ>kS14=~&5[?KJZoY%rW|b o_ޥy^e[+zb?WZY|_Wÿ/I%3$g{WtέgmlS?Sz2oX} Z}^Kjc /ݷnƿ\'Q<,N*ru-D,?,EL~_TzEޅ}:j.vYe[?6}t5)9r8+'yq/ %<; ?v͟RP|͟T:Cgns_ick]^,-gVb6~kXʁ6;>/:|5Ob }U<J6XKƪ veS>QĮ_όAou._O1NoӘ?k[\OٻoU:U/5P^͖4~[KSL_Yc`?xn?t.ySylRK]GQdeφkv͡}O_N"Ezk1HZLh$bI$r_ΣM*esZ?WDfhynVzyq?hBL6>_'܎mf: ^܄CL')\^Ps~>lM~Onw}%>OQQ}U/\ipw֌`՚F? Lվ_.{+ļXݬkConbY{|P?J>moW}[UbS?U_mc.aQ]l~6>[msza! tϫKK~Q1@F~!9but#YΛcջ/Ohbp,cgLڼ^~0/,t9 gJ#YΗ?uk7y'LM~[9x$xrc͏]wݎ[=SkGҗ~~wXבjkql7=ۙr'܎mf:_G>~MF󃜈W .=2Kہw:L7<~mI?x}Of])8BIM!UAdobe PhotoshopAdobe Photoshop 7.08BIMHhttp://ns.adobe.com/xap/1.0/ adobe:docid:photoshop:155534c9-2bb9-11d7-8a53-98037d05b8a1 Adobed@?d     o!1AQ"aq2 #BR3$bC4% rS&cD5Ts6'E7F򃓣dU()8GHVe*9:IJWXYZftugvwhijxyzi!1AQa"q2#BR 3br$’Csc%4S5&DTdEU' ()*6789:FGHIJVWXYZefghijtuvwxyz ?ӞW^zMzQ>,G SE0׍+^UO7O:D1"s"ć=,g}ir_Jkj&l8nsC%=4UlzUoQ}|ᛨs@͙70R0t0KMpT#Wg~ڢql]D` !jhE'HdFaUIc&EE)%^{W{W{W?OLsFZ&Zȹ*(h '"S+SvO)&AXym9rTIS )?'%:,>nz8(NiDTՂrte8뺽ܴ֏ <>u~'%]/ ܬ4ʛ''$b6!CQ'Oɀ+2cX'YU+rl"h ;ppy:#n dW % q#o&^nQJС$p?FA_2 cys?Se=*tI3A&dېh?Wo?J}!Wia.>z3u?FhqέW5[貤?<l7nw) q`ۭMPI"vHPsKՋJcPBDI?~$9GY-ds4XcӴZJ)jĪ1 ӼΣ`Pf`u &ű<.f}3̱w:p3Ʊ铲,~w&qNh# :bLjaYzf8!c4e*rGmG}^~ʴ\]ln OQҏy/ @݉1ә{1  puf]eCg  qCc8%*! !`lHSޣ Ϲ*is \/2J@7=^$\=K f\YU"@y=ũ[J2*j=/6=7(k`XlP1[x71`lws:2=»WafrgC2TVE.6%t3|SSIp~ ײu?_-_Q}5/P|I٫{ K`X]2_\v߆ u6ٳib?;_'F^&m5xE48X?#~bgƻP,Sնݢi̢ݧZOO'9a_捻ƿʿ)U5%+a[;O_諧d_|Yl:, w(bT'3Aյ[̚]Y #~Gq^~u-o5ʮ~RHh %, /yGR~L刀5s(냴Ky}|/9tegZ3l S~)! OPDp.f\䩓ݍin2f3}|l"}s`Z '5nV2^Ƨ-}1ʻ=:@m-GOǩ*ܨCxmY#E"ynowN0='d2p[lşOf2oo$?߅`wX˿QrOMK6Zn"gXu|OevUrW~֍_:;7>59g_5 ݧ'O05'Y?Y>=jHoSZ~^QO׮cQ,KcpQ,i]bI\66Iamv)#{%ϭ+0I@gXWdپo>eYr p?PtgRx%#a"IOަzo׿X\vb"TF#ESˉMHd= 4Mqvt` %cJ@a@_ +ݝ.X*J[ږ *?L+Eƫ\lEpO-Ws"=ՠ~muJ.z_eoO\FS3 ^_U9£)F_Frƨ٩0 F`h8vh-'Ȃ>&STSx48!ΆKL^| -^n'Mq v= صPؤDG .;T` 2N:GOTyՑՏ]$-~Mf v4\,+˿Qr/M#.-|v3,A:T';=k_w%zh=Eì1{zs]e)OC\ ԲrG N[*t::K3FlZZj Z HiޖFG*v~9[\[*)*WA$ 6W]~R.˲l+sCi*J[R)PRd@$IQ5["/FY=%0Rj%c0 VQi1m\Z#ĻΒr"'Tz+_QUٛmuW!zKa4:DՓ]JWGWlԩAg^^#%F=Iaq֪ydTfd6evW4 >{II)H"v{7gtg77pP@KkKjC3D P j g*%M|;8fk)Mz>p?/dN MbVoW–:Vó4Jgl 2P(X2Y ?G"ڬ;ܠ9ŵd|t_7B|7v&?AKܕ{he:/G "ETٛf" tj6:vS‡MD@]ji_ iV?7MzW:A194l_ 3Ʃa$JC7xgم@*Q0HF'1;՚e_7qjq 4! RTX 04:vc@Rڏ^L,F3r+v*VдkS?/՚>fך_8Xtsa4tB ;mQ[ {?ݻܲmܸp8rߜ%U-IRV*ap I3k=Eì!{ύt/Y%+y>e pC^O*%nh973GQ*A SEN$*Enqlm?r< Pӳ|.+ 4-D !)q*Q8%~?ǪAW?RyF*ʌS?c8v/*;'Gmmۑe}%p5 Y`Q;jɞSB1 'f0`'޸$afљ=|6Rl ?}mom{pn>cꙑ16mC>8ǸݯN\k?o!?O9uwEJ\n\qWs8oËF_TѾS2ZovW?m҉z S89vyH>OF|xks6G{O?Kڜ,JҔ!*= pj?Thh8:3J)0KYN -E3O !mb_BGP+VuY3:䥒=5z՗=`zg ӈ uC l"!3؅<Ոخ LKMQ9ncoA]sgj\jI+LԒDf iՕ;kcUj,qN˗Bf/:GDP@.l9lvu6Rݻ"p\HWgso7w٥w@qit X b 跮t;Y{׶o3Rq\OY4X(OTyk) I6ד?gfikj(eR%ZOh}cgۨK:Vr dJd):Um?NX}TK#GF_QLr«j]30Ք%iiWzM{ٍ|өvVL}H}TnnvKeؾ^`֑4@xVѼuUUMտ[U4-OAK$.V%LeA{(k.Hݗ{iQwt/C}L!jkNUՏ{iR+zA]C^ZV3EZ)kOy` dB̍k2Nl-v_TrI#4J?L/ovwATd)rg >d>\PRv[߉ʚlCvS=4{o5'}*j=4n\_C/wWҽ?}qgq{S_wؿ½_ƬJo9MIb u}Oo+ۺo5'}+j=4/Go/C|#ͿU<&6nwnӛN=)ק_rivet-2.2.4/doc/README0000644000175000017500000000201712027025504013562 0ustar manghimanghi$Id: README 1388379 2012-09-21 08:54:28Z mxmanghi $ Graphic files that are to be displayed in the manual must be in the doc/images/ directory. Files in this directory are copied into the doc/html/images directory where they are referenced by the html pages. Files have to be added to svn manually. References to this files must be relative to the manual root and therefore they look like Code examples can be put in their native form in 'doc/examples'. Adding new examples to the documentation is a 4 step procedure now: 1) Compile and install Rivet 2) Create a new code example in the doc/examples directory. The file has to keep code in native form, i.e. capable to run when placed in your webspace. 3) Run 'make examples'. This procedure will collect the files in 'examples' and store them escaped into 'examples-sgml'. Thus files in this directory are fit for inclusion in XML/XHTML documentation 4) Update the manual to add the reference to the newly generated example. rivet-2.2.4/doc/Rivetlogo_small.png0000644000175000017500000001557707612062707016603 0ustar manghimanghiPNG  IHDRd?7bKGD pHYs  ~tIME 1W IDATx|{]U>羾eI%9e[O?HKHցPmN !L;iB uh MZZɐBuJiBpK%DZq9{_8zK59h^Q."$Ɉ0٭$>~?裏F;ve!${z &0P 0AWɓ{v_uRdr<]#Y9{1ɭW>hs2 H%j AhLt +  pBK(nDh R!,a:zzauq(^l:ǟyZ^;޴ăY6PwǵoAϐTAX)Αc?ޥ[_s=oݚH$# ܙP",[07<>0URڨ̳LVbJ'妽-}[ޚ0,QԖ {o?_s?}kn %Q?ucs%h1^£g|Z9?k\N>zGsV(0dygZ2$ @D%/w1 Z ,4 e`L?B+eĀi޻u(ZdKK~ezXoϤdNu^FKþWd( Q2:)auC0`]a UQ)n %PY_64 FKL0  H@"ujIDKuZ +\8?[$(p(+r!V:qb`^"ʃ*@Z20 $G$q1lFF ƥ+Xܳ 2&k@dU}B`p?Hv^6#Yruw@AZͷ_s $k?MkM yκ@]XXΏP $8#S5M@DWWls;8}ȩ>z3ht|^4C묘{x?'`o}OoN-{np[$I7dLk'ǟu[õP-P>]q兇.Ftd qY=?ի[A$5%atqn'7.Z+@Pt^+^Xaf4TWypHac$|qq#]`@@E@T﻾-h4*h¬pD).w0JEfs__ M"&[)Sr\etն@AC"=َo(!ZEC#s]]P Xꕪ@NcmoHiXĝaP:ıt[(X|plHf  <@%ʒ/7s8u}sj;[ꂻ!ȈQ`+- PM/?ł4 ػ@t[%^|ET#GB2>ww&gٱQλWS߰MW>^wPhjkN-‹nQX{xy &uv+b9oM'D `-I;y!#G@xlڔ˝C Vp'F9$YRԖh4 7Ѩ"QpdyH2`ছ(I'/P&(TڊΚ KbUUvÐZP d`|S~M_+o4RQ@sG$~|c10{/C"I:=:N bPI*+O`0u}(+@Ȱ3 w+p9sꝙmߟmm!`0_⾰(:|! p7'1s(Oaw#fLu@e:빊JU'??"ئ RAb:k~=_ B\' V= fz 3N L;6fFUh-И,_z#h{{wo|+=ޙ3D٬І-Afv._ _-9S#|y2s+i$A/ڟ|pxw ~0 =w^H+Bh+P| PYg)X7ZK҅i]gA2JH143 ytzΡYBAAB-$p/@'D@fϙNsĊoqw>$'ᖟq,԰-Va=~_:.A]޴ J.97,jY`w7jeu5ݼ֟b^UAoP8߱O08?^]\=.Y"$\$D)d޾ Ύ@G^ 0t̡Y,3/_-,4FCR#pأD+Y7%y9sZxlڰaìM  /z37 0P?X6_h#*Z3tEfi Qs LuOJxjZTCL֊{_oJ_ȹ28?pdjȂ_ZyLrC<#U?Sy ±ΚTŊ׸-Q1QY`RmDƆ`.?;?ia*4ĠAnwo:dزcjdu0fȀ,ҰI3+#?#~' %mذaE4Ͽ%(P7ZPp&do+fcX/`2A1X@h+Uǰ>J^(|XrlW\]o*11PxCǤV!e::-!_=it 3g:@wWnۺ޹N7 V_ﴝ"}5F&2{V%&HuNֺOURJ(w]w>Ur{>[p$V1ڍ c1"7G[K^jt.]a= )\ԟȈzaqtPJ8޴}&X}Q^Z,m.BqըײHdOHPmj}dmA;T|Y߳%BPWZdEV=/._Ny IK1xW=~i^wmA;2v RTX_ p}㎟z72e=f+uj3#_X C^RW{ԃ^-#0XG![-c7 :yA&3B n0b@u`1ulh+Ch_+Ÿ,i`C˨!AQp3]cJLZŤ!ZU!ZHA¨q^WwY8MrC]+ѮȀ`ݸ/ $v%}I @ uU,/& [D 44XJT `Kt &ZWYA[EXK"@BjxyֺS00wZ$k\4'0eAiQL0X{ijx<%),,0$3 R$3-mZ@VB^ `EXuW|)rwZI)| 6+H0ʽ~a.`, RC@ڼ9(_ޢulTJTy&8)Dp?}3ʓ W) Ta?e/2dN&}Bc)*8av>XV+I 0q^R\|Q8Z~旴[m:t{`t0/Po|Xș-(:W2J l-d}JId~kHm=<<X3ytyl᚝mgRQvvBAK\M0uw>~|!0h^L&bq@j-JATݻ3QaN'Rt'&R.+ʊP<=SUd-6=!I_j5+_ʜtDIPerK*E|;ߥeJQZtTCBjDjM#)+FX?X&&ը M+~ !I PusT[uȖShS`W>$y xԈ/-{VmywlZ)/J{" Ba6D*AUyݪ m(^"j}DPQJ)$#,* ^aN3SF]eu]s0C@-Y$g3"YgzJ"=$tRՂ(Tz"X0Txt% i՘&v wp]iIEJwMw_JwgSRu#8=-h~im)J+՘׾o~{ FYSiZD~_<ȡK HZ?Q?o Ѐ Ճ~ڴTt*hṈ襫{P@jibXM(Az-^{Kr,ib"P, ]࿛_PLD9>|ȑ~?esQ'\{nϾK$(j=1=(rz煂.prn&&@]r9_Ud]!S)%wVӡ5I9BPQ9)tgA=ϵXsfU8p`me!e"*s:9p;ɔj®ؽ{JrI Rʓtqn)33K I E\ln^%Ij^IENDB`rivet-2.2.4/doc/Makefile.in0000644000175000017500000004066712630261022014761 0ustar manghimanghi# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Makefile for Rivet documentation # Copyright 2004-2005 The Apache Software Foundation # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # $Id: Makefile.am 1497667 2013-06-28 07:27:21Z mxmanghi $ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = doc DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(srcdir)/convert_examples.tcl.in README ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ $(top_srcdir)/m4/ax_split_version.m4 \ $(top_srcdir)/acinclude.m4 $(top_srcdir)/tclconfig/tcl.m4 \ $(top_srcdir)/tclconfig/libtool.m4 \ $(top_srcdir)/m4/ax_prefix_config_h.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = convert_examples.tcl CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ APR_CPPFLAGS = @APR_CPPFLAGS@ APR_INCLUDES = @APR_INCLUDES@ APR_LDFLAGS = @APR_LDFLAGS@ APU_INCLUDES = @APU_INCLUDES@ APU_LDFLAGS = @APU_LDFLAGS@ APXS_CPPFLAGS = @APXS_CPPFLAGS@ APXS_CPPFLAGS_SHLIB = @APXS_CPPFLAGS_SHLIB@ APXS_INCLUDES = @APXS_INCLUDES@ APXS_LDFLAGS = @APXS_LDFLAGS@ APXS_LD_SHLIB = @APXS_LD_SHLIB@ APXS_LIBEXECDIR = @APXS_LIBEXECDIR@ APXS_LIBS = @APXS_LIBS@ APXS_PREFIX = @APXS_PREFIX@ APXS_SYSCONFDIR = @APXS_SYSCONFDIR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CELIB_DIR = @CELIB_DIR@ CFLAGS = @CFLAGS@ CFLAGS_DEBUG = @CFLAGS_DEBUG@ CFLAGS_DEFAULT = @CFLAGS_DEFAULT@ CFLAGS_OPTIMIZE = @CFLAGS_OPTIMIZE@ CFLAGS_WARNING = @CFLAGS_WARNING@ CLEANFILES = @CLEANFILES@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH = @CYGPATH@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LDFLAGS_DEFAULT = @LDFLAGS_DEFAULT@ LD_LIBRARY_PATH_VAR = @LD_LIBRARY_PATH_VAR@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIBTOOL_DEPS = @LIBTOOL_DEPS@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MAKE_LIB = @MAKE_LIB@ MAKE_SHARED_LIB = @MAKE_SHARED_LIB@ MAKE_STATIC_LIB = @MAKE_STATIC_LIB@ MAKE_STUB_LIB = @MAKE_STUB_LIB@ MANIFEST_TOOL = @MANIFEST_TOOL@ MATH_LIBS = @MATH_LIBS@ MAX_POST = @MAX_POST@ MKDIR_P = @MKDIR_P@ MOD_RIVET_INCLUDES = @MOD_RIVET_INCLUDES@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CFLAGS = @PKG_CFLAGS@ PKG_HEADERS = @PKG_HEADERS@ PKG_INCLUDES = @PKG_INCLUDES@ PKG_LIBS = @PKG_LIBS@ PKG_LIB_FILE = @PKG_LIB_FILE@ PKG_STUB_LIB_FILE = @PKG_STUB_LIB_FILE@ PKG_STUB_OBJECTS = @PKG_STUB_OBJECTS@ PKG_STUB_SOURCES = @PKG_STUB_SOURCES@ PKG_TCL_SOURCES = @PKG_TCL_SOURCES@ RANLIB = @RANLIB@ RANLIB_STUB = @RANLIB_STUB@ RIVET_BASE_INCLUDE = @RIVET_BASE_INCLUDE@ RIVET_TCL_TARGET = @RIVET_TCL_TARGET@ RIVET_UPLOAD_DIR = @RIVET_UPLOAD_DIR@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHARED_BUILD = @SHARED_BUILD@ SHELL = @SHELL@ SHLIB_CFLAGS = @SHLIB_CFLAGS@ SHLIB_LD = @SHLIB_LD@ SHLIB_LD_LIBS = @SHLIB_LD_LIBS@ STLIB_LD = @STLIB_LD@ STRIP = @STRIP@ TCLSH_PROG = @TCLSH_PROG@ TCL_BIN_DIR = @TCL_BIN_DIR@ TCL_DBGX = @TCL_DBGX@ TCL_DEFS = @TCL_DEFS@ TCL_EXTRA_CFLAGS = @TCL_EXTRA_CFLAGS@ TCL_INCLUDES = @TCL_INCLUDES@ TCL_LD_FLAGS = @TCL_LD_FLAGS@ TCL_LIBS = @TCL_LIBS@ TCL_LIB_FILE = @TCL_LIB_FILE@ TCL_LIB_FLAG = @TCL_LIB_FLAG@ TCL_LIB_SPEC = @TCL_LIB_SPEC@ TCL_PACKAGE_PATH = @TCL_PACKAGE_PATH@ TCL_PATCH_LEVEL = @TCL_PATCH_LEVEL@ TCL_SHLIB_LD_LIBS = @TCL_SHLIB_LD_LIBS@ TCL_SRC_DIR = @TCL_SRC_DIR@ TCL_STUB_LIB_FILE = @TCL_STUB_LIB_FILE@ TCL_STUB_LIB_FLAG = @TCL_STUB_LIB_FLAG@ TCL_STUB_LIB_SPEC = @TCL_STUB_LIB_SPEC@ TCL_THREADS = @TCL_THREADS@ TCL_VERSION = @TCL_VERSION@ VC_MANIFEST_EMBED_DLL = @VC_MANIFEST_EMBED_DLL@ VC_MANIFEST_EMBED_EXE = @VC_MANIFEST_EMBED_EXE@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ apache_include = @apache_include@ apache_request = @apache_request@ apache_version_dir = @apache_version_dir@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ rivet_channel = @rivet_channel@ rivet_core = @rivet_core@ rivet_core_cmds = @rivet_core_cmds@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ with_apr_config = @with_apr_config@ with_apu_config = @with_apu_config@ with_apxs = @with_apxs@ MANDIRS = html/ html/images PICTURES := $(wildcard images/*.png) EXAMPLES_SGML := $(wildcard examples-sgml/*.*) EXAMPLES := $(wildcard examples/*.*) all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign doc/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign doc/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): convert_examples.tcl: $(top_builddir)/config.status $(srcdir)/convert_examples.tcl.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ cscopelist-am ctags-am distclean distclean-generic \ distclean-libtool distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags-am uninstall uninstall-am .PHONY: clean # English, multiple files. html/index.html: rivet.xml rivet-chunk.xsl rivet.xsl xml/*.xml xsltproc --stringparam html.stylesheet rivet.css \ --stringparam html.ext ".html" \ --stringparam chunker.output.encoding UTF-8 \ --nonet -o html/ rivet-chunk.xsl rivet.xml # English, one big file. html/rivet.html: rivet.xml rivet-nochunk.xsl rivet.xsl xml/*.xml xsltproc --stringparam html.stylesheet rivet.css \ --stringparam html.ext ".html" \ --stringparam chunker.output.encoding UTF-8 \ --nonet -o html/rivet.html rivet-nochunk.xsl \ rivet.xml # This means these are not build automatically, but at least # people aren't forced to build them either. docs: picts html/rivet.css html/index.html docs-nochunk: picts html/rivet.css html/rivet.html html/rivet.css: mandirs rivet.css cp -v rivet.css html/ # target picts checks the directory tree exists, then lets target 'graphics' copy new # or updated files to the target tree. picts: mandirs graphics graphics: $(PICTURES) for gfile in $?; do \ cp -v $$gfile html/images/ ; \ done ; \ touch graphics examples: ( echo 'set source_examples { $(EXAMPLES) }; source ./convert_examples.tcl' | @TCLSH_PROG@ ; ) # target that builds the essential directory tree that will get the html and # graphic files of the manual mandirs: $(MANDIRS) $(MANDIRS): mkdir $@ # this target cleans everything up in the html directory distclean: -rm -fr html/*.html -rm -f graphics -rm Makefile .PHONY: examples # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: rivet-2.2.4/doc/Rivetlogo_medium.jpg0000644000175000017500000015706107612062707016742 0ustar manghimanghiJFIFHH]ExifMM*bj(1r2iHHAdobe Photoshop 7.02003:01:17 14:18:35(&/HHJFIFHH Adobe_CMAdobed            Q"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?T\˾~_-5>ݏ{JG J15leτqHG~'YX:oS~ҺYanX /u mNW`cAkF湮okԺL)Xhn6=1/^?}?zg)ϯ.Ν ,lWiu!~?UR|\}d">O#zCu?KduwI%:TƿY6 ~Lun^?~=k(kȡnh}v4\ {\>\汥MkA.q䓽z?1S73ץ?cEv^Wkrm];++,]JrLvGǿITScsr),/ls~Hpku>ҺH㋉/E.!Wbcg!.?ܣ+y%SLrp.k/s~}ῼmf&Nk*C~H9e#Fq#.(z.K {U A\>2vsWݵ[g{voC>u?vRXXWkZeWr.$WXkkwfߠ%j-N, I0U?Y#nn=#udl.~1^̼?WUj4.1uLrb'ck6՜s^=xg1}W7g+s3>u_>"C{xw.kft*_\Ǭ68UZ>/[?P3,Ewt j۷m?b2lo1\ǂ`gfX_gٗI+39y_ZEF׼}"Z뾮cpnukŝbϯ-wg{|6^ǭO [r ?'pgkUenÏneۿ[ʪ?W&ftQ5kk-Ꙙ6_@S?z۳ۊN5 rwl[zeۆIl#hpO}Mv'ՎSi1Yy Ϳ[j4ul3s*l]ƎhW-r?4v 5Ϝ2u'?:VuY1Dv[}Vus̏oܽ$MZ1&cx;_[Һ2),iw4E}^zG[6eSmTkC}vT6ϷX? ,8g=>Iz[sǕ娏8߿Ugv^?WUj3?|dO*ReDcjǭW [+ ig3iw{ꞷ?T/AC+-8_GV̧H~c)K\FxR,|R&rJw/*;ӵAXrV!{:+P~a]`CG/vIO}R}v Wuؖ;۽%C:X 2+2ڍU7)cnkOK7mRs=?{%Wv#YEn}nrL!|듖~z_ҽ}y֯ZiSs_,?EIXr_Qh^,sGy{[^C'J Ivz,7s?Aߝ33+ϢZÐ̃F},v~~kzMNXp{ ;n_^ߤ`acnwO6Wl.o]" 1rr1JF#"a84VCԜYe@1=o9[}S}OJk+v3Ƭ7H:o8;'ߏEWcm:[+_XǎP>9%=bx*<}VsJY0a#/}ejGߺ׵g-_?+?XĨVQ=,#^ּ[I6e{[q%>m51C:du/p}_XnP̑YHopjiF8冓f>F݃-kr,OWN̍gݽ8VO˳_և^3~Uwгi\dz'vgVe'S`~5[H>*=Cw{#~̾۽6}%?X0zw֋UM~^Ueϻݽi52<^r&0(Ϲ L8iulv8 Nvw6]V1mub~?p5ҷ'B}} ջ\U3w}~\~q佯rqNǯ' |,sGy{? >|desUuk'#vc =Z;XR8uC(h'O{zn`56pmrGJ[}[ޕQh'X]!cnr~P>(pps]ln-G/sj&?JΪYgXcL4`ok0BGx|HbɆ$pev|8ի?ؿF,]n?`SYż;~zƏ0;:~t2nw^g?}]gVs@ڞǐY7pkvMu_g䔏)ji[IKrc^XmvTC[E{?0n`5L,DO\Ǯds( 6+i=V=FX˛eC_ֿn`5/G/sj dd.Ϸyi7ft.fc}փIsͭ۽n`5/G/sjl0c1cc'NzORƷceu(J]?F?N#"?Had P8c ?'}'|OIWIF;UI tSa%]$IWI%6UIMtSa f?mmTRI/34Photoshop 3.08BIM%8BIM com.apple.print.PageFormat.PMHorizontalRes com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMHorizontalRes 7.200000000000000e+01 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2003-01-17T19:14:56Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMOrientation com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMOrientation 1 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2003-01-17T19:14:56Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMScaling com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMScaling 1.000000000000000e+00 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2003-01-17T19:14:56Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMVerticalRes com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMVerticalRes 7.200000000000000e+01 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2003-01-17T19:14:56Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMVerticalScaling com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMVerticalScaling 1.000000000000000e+00 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2003-01-17T19:14:56Z com.apple.print.ticket.stateFlag 0 com.apple.print.subTicket.paper_info_ticket com.apple.print.PageFormat.PMAdjustedPageRect com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMAdjustedPageRect 0.000000000000000e+00 0.000000000000000e+00 7.340000000000000e+02 5.760000000000000e+02 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2003-01-17T19:14:56Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMAdjustedPaperRect com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMAdjustedPaperRect -1.800000000000000e+01 -1.800000000000000e+01 7.740000000000000e+02 5.940000000000000e+02 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2003-01-17T19:14:56Z com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMPaperName com.apple.print.ticket.creator com.apple.print.pm.PostScript com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMPaperName na-letter com.apple.print.ticket.client com.apple.print.pm.PostScript com.apple.print.ticket.modDate 2000-07-28T22:57:04Z com.apple.print.ticket.stateFlag 1 com.apple.print.PaperInfo.PMUnadjustedPageRect com.apple.print.ticket.creator com.apple.print.pm.PostScript com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMUnadjustedPageRect 0.000000000000000e+00 0.000000000000000e+00 7.340000000000000e+02 5.760000000000000e+02 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2003-01-17T19:14:56Z com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMUnadjustedPaperRect com.apple.print.ticket.creator com.apple.print.pm.PostScript com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMUnadjustedPaperRect -1.800000000000000e+01 -1.800000000000000e+01 7.740000000000000e+02 5.940000000000000e+02 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2003-01-17T19:14:56Z com.apple.print.ticket.stateFlag 0 com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.privateLock com.apple.print.ticket.type com.apple.print.PaperInfoTicket com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.privateLock com.apple.print.ticket.type com.apple.print.PageFormatTicket 8BIMxHH@Rg(HH(dh 8BIMHH8BIM&?8BIM x8BIM8BIM 8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM@@8BIM8BIMSRivetlogo_largenullboundsObjcRct1Top longLeftlongBtomlongRghtlongslicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlongRghtlongurlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM8BIM8BIM KQy/JFIFHH Adobe_CMAdobed            Q"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?T\˾~_-5>ݏ{JG J15leτqHG~'YX:oS~ҺYanX /u mNW`cAkF湮okԺL)Xhn6=1/^?}?zg)ϯ.Ν ,lWiu!~?UR|\}d">O#zCu?KduwI%:TƿY6 ~Lun^?~=k(kȡnh}v4\ {\>\汥MkA.q䓽z?1S73ץ?cEv^Wkrm];++,]JrLvGǿITScsr),/ls~Hpku>ҺH㋉/E.!Wbcg!.?ܣ+y%SLrp.k/s~}ῼmf&Nk*C~H9e#Fq#.(z.K {U A\>2vsWݵ[g{voC>u?vRXXWkZeWr.$WXkkwfߠ%j-N, I0U?Y#nn=#udl.~1^̼?WUj4.1uLrb'ck6՜s^=xg1}W7g+s3>u_>"C{xw.kft*_\Ǭ68UZ>/[?P3,Ewt j۷m?b2lo1\ǂ`gfX_gٗI+39y_ZEF׼}"Z뾮cpnukŝbϯ-wg{|6^ǭO [r ?'pgkUenÏneۿ[ʪ?W&ftQ5kk-Ꙙ6_@S?z۳ۊN5 rwl[zeۆIl#hpO}Mv'ՎSi1Yy Ϳ[j4ul3s*l]ƎhW-r?4v 5Ϝ2u'?:VuY1Dv[}Vus̏oܽ$MZ1&cx;_[Һ2),iw4E}^zG[6eSmTkC}vT6ϷX? ,8g=>Iz[sǕ娏8߿Ugv^?WUj3?|dO*ReDcjǭW [+ ig3iw{ꞷ?T/AC+-8_GV̧H~c)K\FxR,|R&rJw/*;ӵAXrV!{:+P~a]`CG/vIO}R}v Wuؖ;۽%C:X 2+2ڍU7)cnkOK7mRs=?{%Wv#YEn}nrL!|듖~z_ҽ}y֯ZiSs_,?EIXr_Qh^,sGy{[^C'J Ivz,7s?Aߝ33+ϢZÐ̃F},v~~kzMNXp{ ;n_^ߤ`acnwO6Wl.o]" 1rr1JF#"a84VCԜYe@1=o9[}S}OJk+v3Ƭ7H:o8;'ߏEWcm:[+_XǎP>9%=bx*<}VsJY0a#/}ejGߺ׵g-_?+?XĨVQ=,#^ּ[I6e{[q%>m51C:du/p}_XnP̑YHopjiF8冓f>F݃-kr,OWN̍gݽ8VO˳_և^3~Uwгi\dz'vgVe'S`~5[H>*=Cw{#~̾۽6}%?X0zw֋UM~^Ueϻݽi52<^r&0(Ϲ L8iulv8 Nvw6]V1mub~?p5ҷ'B}} ջ\U3w}~\~q佯rqNǯ' |,sGy{? >|desUuk'#vc =Z;XR8uC(h'O{zn`56pmrGJ[}[ޕQh'X]!cnr~P>(pps]ln-G/sj&?JΪYgXcL4`ok0BGx|HbɆ$pev|8ի?ؿF,]n?`SYż;~zƏ0;:~t2nw^g?}]gVs@ڞǐY7pkvMu_g䔏)ji[IKrc^XmvTC[E{?0n`5L,DO\Ǯds( 6+i=V=FX˛eC_ֿn`5/G/sj dd.Ϸyi7ft.fc}փIsͭ۽n`5/G/sjl0c1cc'NzORƷceu(J]?F?N#"?Had P8c ?'}'|OIWIF;UI tSa%]$IWI%6UIMtSa f?mmTRI/8BIM!UAdobe PhotoshopAdobe Photoshop 7.08BIMHhttp://ns.adobe.com/xap/1.0/ adobe:docid:photoshop:0fe2f280-2bb8-11d7-8a53-98037d05b8a1 Adobed@2    o!1AQ"aq2 #BR3$bC4% rS&cD5Ts6'E7F򃓣dU()8GHVe*9:IJWXYZftugvwhijxyzi!1AQa"q2#BR 3br$’Csc%4S5&DTdEU' ()*6789:FGHIJVWXYZefghijtuvwxyz ?ӞW{W{W{W{W{W{UJ#ý@Xc_W`V9©]7Ӊc'[V~?d޼:[>zq'yLa,Z#KBHb9SCkcB: ٻ@cr DzDqJzFBZJfVUi/=ce &MgzCfltM[~3յYE]?3rt+xEn7ˈF `V]WHB.oIz<!bؖRKL6x̍pG=^;W{W{W{W{W{W{W{W{W{W{W{W{W{W{WӞW{W{W{W{W{WDU՘z3z?SU9> , zWxI-~Ub9%CuTSv̾W2f\Ŝg6f~5fS63s.cs,TU3,ij;$O=^^z^z^z^c'?R}3ZLTC7Q5^jLU! BGS IWN.ޚ?~L5'[: *c) 'eoE eEx굞z^z^z^z^z^z^z^z^z^z^z^z^z^z^ӞW{W{W{W{W{V?~a]Qtsz&^mVbpyeib!JeAͳs=^s=^s=^s=^s7~=m+T`$T0jᙃpJ$#ͥEúY=^_돣߈KGJbDztɈezMo[D)"G;W{W{W{W{W{W{W{W{W{W{W{W{W{WӞW{W{W{W{WCNO?o*^`SbYsqųdx;TCT"V3^:NS0͛:\g1 ZZOzԝU* 9h!U|ͪNҀNT@5`Pu o:u bC O{y+oZp|;$V#jӧuǦ5g_W9[WN ya~^Oo/m9^}:-_z`__=E{=H{Zp|;$V#o)~<]zƲBs6VOOqP~+tX0S%%?Y_wx";UKKJ ̑C]}[Xs ['JV4{1-Pu[ο0h=H{Zp|;$V#jӧuǦ5g_W9[WN ya~^Oo/m9^}:-_z`__=E{=H{Zp|;$V#jӧuǦ5g_W9[U,M}jg鯩r^ԡ5ZR5e7v1Cż䳻Y3;$\%!sہ#\ދԺ徉RA :K<ӞW{V_~[܆;sKu/yx.1N^ԱPJ3.G!猯:Y{5Jk&]7G5;+ $qMQJ04I[NY޲pB:8}^˽]Az\b2w_!H0,nvi/튆ٝӹ6"">בpR _n׳ˏ&muҧDKGk2;O++(e!ey;'ȊWPt s&z3,EK9w>;e0,5rHqOGf*>K['My?mq7?W?mq7?W?mq7?W?mq7?W?mq7?W?mq7?W?mq7?W?mq7?WL7T?[Nu6=*CPŇaFE`} S+9h>V@z)wÞ`j3roFbKQ%xqI">l;ܟ_m`OWDz!A' w'K܅{kHR M<)gT6*w)`Q’RD_ZODNt}WeNe,q^t(ţNM)> |vg& #E?*c@=^!u7nbN*"Y,d# 46f[}dRGV~\"Շ\**s+讝8@ rF|Azb-Xa {Wgf{-yQ @Zg#hg<6JC?M}~'ewVzWzW?F*?WO?hnuH|+:{W{W{W}#o5Otم3(ꯙ35ӞW{V_~[܆;sKu/yx.1N^z^յ_]4X]^Ό2L^l; 3s +"T“ivٜ=Dt[9-6fŻeOiqI6}#3\8"Wz ~g1Ap8dthbƾ|J;Ĺz^z^z^z^ :y\iy>c,cWB۞V\z[ҶO?W<.;`ߤpZCѮ=" /nPHx{?v MiQKWʍ|9t+zRө߆~F`enMG#}x 9Wjy"*8?DsW԰ޏ;MQs, cqD{k<~opd|]ؕ9I?ֱZys+`߅/J7/ $HkxnvivW,~Jx/6DUVlQS`!rrW{P?t\Oevq;*}ak;svW|nLPp LՐWia̙C+x:*i#bXЂ2ɯFZx=P'9+w2an˩Jm*$JTDF)M?zNf.=? J‹?ٛs+kU@ip_Bs7qs0+͹Wk* z]/98a_U~f\%M_y*Ϛ:\yc|KGRRU2{{I=dm} a@JH0`vmp7u ґ2B$M_woo? J³Tv͹Wk*=Z.P\w0/* 3nm ~tzt *wxd'hF .aZ\AI r sVKW 0TҰ I"`qj%)QӤ;gûd^ќs]) (baD&^6Ga>nmOq(?j=#ߧ/<]Y+E`'ڏ:@W55z[{Z޹}u1>!ծaWlӋ^0e&,Vw:C$ s̥2^\\P | Z_|/[iSkT5_&{W.2ndZU!#bGm7sHʾu?XͿ2F7W/:ZkȎ#[e[qzSMQt"-S-X5YIDf&>l;NAk?֋4)BTPGXWϭ{P?t\Oevq;*}ak;svW|n?5wB?i1Ĺ5O(X?^z^z^ա*@5(}UV?Lַ\+uv:wCQ?ZW+"js=^ӞW{V_~[܆;sKu/yx.1NBGFo\ .qnY0_}w鯩_KlЮh5\B51х>!A3y5P%%X23)#mɔh<#+32t诪~=Bf:[Yښ1M_Nv=*\ջ/7a0x(p#k>27q>&Tۀ H>I$p9SM yWTrXi:oRfܱDZSI(,oAtО,˳m_C͘Z XgU]zv(P"0#h;AE}L}6VHWR0 C.&SQ2'ާHG3ws&cgAG>{/] ⅏AFSU]ztj3F(qe<&J\zWzWzWzW QYoȵpk0zE5FsOs,V.cE1{vx?H?LOZ۹bl:_rN z]WSWX*|e\.CF^a߻g ᬏAWg҆&&"t,4AԿ+,8oG}Tzk6p̘'M0ڗ /bsKb^d`m{J E\>-s,KtHkkO =^7S$wU| 9Hv鯯}=j:cs2;" ^j~5_b3QWW.~WzWzWCT_J`c>ܿX~Uwj&k[C*O_;Ο M[y+ XB_Ef5|W{WӞW{V_~[܆;sKu/yx.1NBGFo\ .qnY0_}w鯮': _QCҞ5OpxĪ]cArApmqPM`o6:G푊~ifWSj #.!'dm"m2, 3B)de6 "а2 pշ%Ttm6zJؓ1{sDa±#5jYUܛ?a횏+}V% e8:Gemu_\_*s/G~7^Xf,[qsףW{W{W{W},vo?ki!QZ=^s'3Ҷ}Fzk,4i1 WPX֍ǰ&cno{I#)U/vէMuzCbAUyoQ`=3HU3.ںhG$~ﻜJ}Ǽ ¿} SG$+J32h%}O&uϸFfJ/>G%lg-)ñ `80bѿJ _#Ǐb90٣jvT}ey{VͰЄ6:=u}?ޕUbOǺ̱y[룥2'26W*=Wo^2pC*SEa]{P?t\Oevq;*}ak;svW|n?5wB?i1Ĺ5O(X?^z^z^ա*ϥ?K0o1bn_o*U55!]'ΝgO&A-ּkgEȯ3m+zWӞW{V_~[܆;sKu/yx.1NBGFo\ .qnY0_}w鯮': _z_8su/_@xZ<)2 Ryci( +E@,"0ӵ\X)P>zZ=^s=^s=^s=^[G <1T_'J6}{V_𧞕Z4%tpVKkxf`*f7L4nXF/AUO~nT|76:ڒWZ s+tb=".^zh+hyjS<8_V"n`g[=jB> }` )ܭ#PA}[SOI _W:IUe:JXy6kW_hwߗnҘML}~Ӳf"B_&Aw5WԽd)g8 C,2 ifc`O6 I'`NEON=T-lrv[ȳk; )ffodv?i%#Է˘f$uEJ@8Ҁuz@o=r?3喧HsO {_鯒9__]պ0{udvE,k?,f1(]`{W{W{V>,(}UV?Lַ|+Uv:wCQ?ZW+"js=^ӞW{V_~[܆;sKu/yx.1NBGFo\ .qnY0_}w鯮': _zZ£:%fnQ 1n6%P\+4)f>ũ!Qs7L.ŧ EmuOwVӘeJWߴkG~bwvWaUXPԘ,u5PM RAE1sn[R%*_\gHҮu y9/` pArI Dd,ͮ]Z?(_1Yn wO+dyJdAs !?P,jcWzWzWzWz랊s}zL/ }3x9-am=^1Wzs|X*/aYR~ȠYL96$P?G}~g%GBu|&~7佦<>O?b \A9W/wR'NWjU?Q2NXH9lYwHI_"]̬"y%jJ𦮦#(d z_VsSkq.,ӝok5R9k;+z_FOο\̎ȿךߍ|XEF?UKs=^s=^sWҟ%71O/j?ߕ]ItʮgN3u{ ^J}5_3Pv?dWs_6z^ӞW{V_~[܆;sKu/yx.1NBGFo\ .qnY0_}w鯮': _zUd3i~7KW)tÜ90ӇM# ->G[r'Dbʳ;UjQ M,5gWm{WŪ1@^qZ-QWeg S.GyۚVSlOm?O>-hY^?*(ւ?L~V!6/wz *-BUG=^s=^s=^s=^YUEوUĞz_{aMtX :k|6H=^ W&WsOy+O6+H7+bI*qpRB-nXK ؠGL nZ04GWnӪB쯰l7k0f(u XP{%P?}%C,,j Zhl=gvS{dlS&=_3;T`B_6*?QԿnSc`ٓxz\.v{/[i| g'Lƌ8HiJZ{Ε/ħ*晩.ely]YLnw UnþΒ JC]ً y.Hn=k]̾=^sC΁ ,<.?GWϳxl?M|a~NчfG383#/`_5)Qc0Eu|zWzWz7@ f F?SZWRf1]2Ӻz$?גM`(Y\cWͥ{WӞW{V_~[܆;sKu/yx.1NBGFo\ .qnY0_}w鯮': _zUÐ? Y2R/_b\F2_*0kz|2Ayz%d vIb~ovnPi DP=gG[[ضJ_ѿW{W{W{R 0gsnGWMRSG) O(zs=^s0*=J\etXh8rƻQ͔BWAal< |K{cL $@>FWԶ}5z,I:(3Gf}Eg?My? ?{v;30~MIistU$ˆz3oԌ SILoNCEs.`Veo<{aﳵ J} 9weΑ]{Ǵ69]Y[UT T:])j=/^!D a>H3[6,I#zV<Ȫ={W@Zg#hg<6JC?M}~'ewV Wt#cKZWIuz^z^zZ Sأ)-V[PW)3ZUzFtNodk_聆k_.s1ҽWzӞW{V_~[܆;sKu/yx.1NBGFo\ .qnY0_}w鯮': _zTx2Wi:7˭m2> +3N,+)uڽk"{ZGMfw~J_,1kp4?ފk1*+9 YUQrInxUT`W֋nF z5Y&eWY:ږ,l = 7>NkLXZԡ5.7UĿ,#;僩@LPgt{W{W{WޔpX'OMyvU=v "Tp'ss=^s=^O*W֗IK[i&'qJYM4bn6dۣbU~or/,|V$8ֵ|ku%˩zJ*L0u"dZ̹Ӫ-q)|]ֿI"kֱt2$s%*}5!#T謹V*)Ehٞ|e$éYW9ms;8<ugG%\ȈSvjEY g5rhȫ6jHFLyf-÷ |yݍw9*UR_9S{NudZ2^OX^z@o=r?3喧HsO {_鯒9__]պ0{udvE,k?,f1(]`{W{W{V>,(}UV?Lַ|+Uv:wCQ?ZW+"js=^ӞW{V_~[܆;sKu/yx.1NBGFo\ .qnY0_}w鯮': _zZ¥ ѯN>01,uk1Qe&)D?rY'es n@6ۃT|']k=Se>ZK)?8JzZSs븴r?^z鏣5UjUVd%,F Mk~%,Oo͆x p5 }FwgqsLĘSl,'u 5Dﯓw Wvl9gp|.`z_:z^z^z^zGg_,8z_qz^z^ի*[kkHi9VJr|! K l5Y2TGa?kG̲p}[KZAs+c_'/K~VZŢ;aGɸrT]5"3CL{Ⱨe^eV#oQFʚښʹLUnU3I1orIY"Im)X9pgO[S:쫑23(RNem5HO`gY}b<0&]J]eqUJNhbTy> SvRm6e!zWbNKWK[F -OoI9RaX A)9|y{W{W{WZX?çĢ>Yх\?y}y{W{UK8+nhN%p&1qjlBR,>?BmH Ok/~weejQ4z))oY_Nuz^8zfk~C 78e2(hq<^ IXbGcƙ=(ږ v Ęi_Yx iE:ĚD@3_!,EGk/7Ts=^7S$wU| 9Hv鯯}=j:cs2;" ^j~5_b3QWW.~WzWzWCT_J`c>ܿX~Uwj&k[C*O_;Ο M[y+ XB_Ef5|W{WӞW{V_~[܆;sKu/yx.1NBGFo\ .qnY0_}w鯮': _:__9GPf9H>45ѐc$JhwMi_pcx3zy1;9su20uR'j[J:S*KΖ;u#8̙x&Rʸ% Bʋ}EPX}&Ɓ˽g2{ʙWWzWzWzW?<#fƋScO*q~f]ı#AWWzWztJkš.es yBcdy$o9qi#";ɳ;}61a_*'bXmv F'Lx *Hz^z^z^~, 1r.S|pi{57O1z^z^MzV@}]t`i@j=HhV Ø+ᬑq_VK{ﳼQm*=*lwj?h-S{VΖ K:=5O˘Lꗷ8o{ WE!>?kǽ}MuuHkH@OQKkzWzPz~f-O U43_%!sua٫{L%X-yX?cQE]_$=^s=^s=^ P?~})YQrcUwyn WL?=tޣ:'_7nX5c? /cVE}9i^z_ӺOoA袳!/Y DY'9er[]H$>i^0BrXȸy 9aC*)0|Ș?+A=i(s-YR޺$iJu6v*5?qO~L_!ZϿ)+O^ɿ՟O6P{ ײogU߭OZ]>]7gcg/Yo7 *Wimęfy!5$#&ɾwr3del !kPڔˆUb؆axRh\ [ UF1TSJFd k(6 o.ۅ E&nᕴ,GH"S|ϹӪ92u:W.7VdcvYe$`wnqEJQNH7wr&K,4 xKO3bY/4e߃K>/s9EIQ5EQ9`=7G*20с=nq+ "FGEV8E*0Am)CĨ(|i+c;ٌSZ#aSH/p&LťҟvhqJVSr=s = m{t>t+2خAzoR:\*iWN"rlo*x{rAnYf+'hqo2CBu2[p L"F  =A*MOs`XOZy陾|{W{W{Wl ,%b ]@ߖj(7Mz_Yz^z^zZ•[IC(s]'YrFj*J.J a9]wYs8}D} V{ZÈ+ p{TV܈kz[f:VrojcgX/RT_-%. T|o̱JúTڵ`=h-YmmRʖJ+bLUͺ%?&궫}2W_D_LDž8(cw|^J02jnحVkq1bqSӽ#z[p\гhʣK$O $+F ?bY`L0O 43C6Mv`X ,A-s;%RAi 敏S?&篞e=­DqYiLOV_Dz9̴Uy{i+iޚd K#u ߍ=ڮx TA𧏥-~{,mmAI=A88UBr<zVInO 49?bj.eA&|FytY{  2~sk p@Rv&Ϸ7s3,N+u2V 07* ={&aVW?CgzZϿ)+O^ɿ՟O6P{ ײog^)ԏUcϹ_)͘^E:?7h靿G3.b}Pv7m;y-VɌR(z_QDtHI::C.#?coͻ$| uFe(_+LncevҽW Rt3tzC||7Θ;(WJ_2L+'+dUxum;'9Sߩ5 <&Z=^ B߇Kzo~],m>US EL_t;W_h~ӏRvOː!roR4qq'&5],s=^s=^s=^sWk+ Mrq'ZW+w 2?^ա*ϥ?K0o1bn_o*U55!]'ΝgO&A-ּkgEȯ3m+zWӞUK&߄H|0Zu' -1ajpͅ}ohRh@gGMesُZeslڔR¡qM*=53'(k/?9[VW3V,pzn:uR4gɗ plS5X+j e8p]lC}5fmi}/"6gi謥H/xlSY%+m`?ә":)N_LٜUEL?/IYhV:bI+~՞ԣ26v/\%)QӤ`TzisoYX}9 ̟.ZsO·g^TzkqӞ`V?d{Ӛe:Ļ>z)}i]2t8vzñ,\_ J z"x|cK qPFvPUjnw@"p'vYE`v#'6N%E )E8* (8Ȋ+^==Z5va:P+*9t'fk8?{Wڕa(uꂴVZ B3S:a Sp݃qZc(RlmQbw=o+.omk>HIQ e pjqKe:l K5$+O {AYi-$l=߻wp[*''iߎR*=^?Q>R2Qh Fë+鋂zY%.7RA)2fs Eۺ<*q-{C*cHWI)=FF1Z֏JM7z #'a_3'(ksO·gHΣ^s:ys^F\♮,>LAu b2bv&q5at~OMfwɛHu"{ԠkO1] ?'}uzJ\gԖ+ӬC:lO ˔x4ƪpeZ},M5odfz.TIQ8iԧ_\},RN%{ɍyecaX~5ZsO·g^TzkqӞ`V?d{Ӛe:_wP?>3'(kVp+ՒVT6zxz>} ̓61*|GY ,o]G{߃MݼJ& IdԻ7)z6{Ip|*LABcIu5zZ Sأ)-V[PW)3ZUzFtNodk_聆k_.s1ҽWzӞW{V_~[܆;sKu/yx.1NBGFo\ .qnY0_}w鯮': _zU⿆oYB'Ub@J*+Om>^;CF{ K]{OT? Oξbs~?nDKWXi{,{_|}PG?1QT\7kFeJ`Okj+7WzWzWzWw?DV }mf2?KtfQ;~tCWW{W{Q|gȺ{?Hd2u#%\Bw'&(a=HR/d;r-s`1pϒV U|6dJH FydWJU"jҎ -/lv~bc+a8.M#,?1ۦ0WPOV*}oo_~˳wBN6}Tkٯ=^s=^s :ч[XŠO,yHtsaseN"̑ғ>\w9՛yX5=9k!;+z_EO=m5Wih I.J*^٪)O@Mu)> Ms=^s=^sWҟ%71O/j?ߕ]ItʮgN3u{ ^J}5_3Pv?dWs_6z^ӞW{V_~[܆;sKu/yx.1NBGFo\ .qnY0_}w鯮': _zUٵhʋCYQ3$|:=^GfI%军׹?ǵkOW7D|Ko^XCcf`Qc=(&_{Te B >T_ z^z^z^z[0Q&zE BKRa=4bv[O&z^z^z_)\=+{H9PqY 64 ދO+PS绗_*zݥ+m+KK?:ժo6r4"ش>YLu@%,5UVn}^ *WZARzWzW E<5t&F::`~hDn) I1﨎}Z:;D18FJKMJt@#lkv'jG׿f}9fSpnH$z r+Ã7!Q͒J3馨U8KBX\dSz(Lz;z"&-M­/Na!iR$L$‚Asi {Q=RI#X&WJ_N?\j-Yd[S?s5$׿,pSsGN{cFD?\Z? G@+:G.A?IbY ejTw"(o8mۏk[ǃm! iLΩ@a*)s0MyHl<*TZ툁Wa2rWCT_J`c>ܿX~Uwj&k[C*O_;Ο M[y+ XB_Ef5|W{WӞW{V_~[܆;sKu/yx.1NBGFo\ .qnY0_}w鯮': _zUٵhʋCYQ3$|:=^GfI%军׹?ǵkOW7D|FC<=c ˎ\Ã-{VQ[+WzWzWzWav䏧?>f7|)55`=OW|Nz^z^z^1ي:o"ys,2YYքٍ\˅3>ù֮ JU}V2ݒeVMszU\zT{ҧ_:SM7;Chee,:7Ney(a׏=?k?_{ErL{rԧVA[I8W,zWzWz% 2Yp\]\Z, h#gL#4QtSlHkܿX~Uwj&k[C*O_;Ο M[y+ XB_Ef5|W{WӞW{UŠ:^+NKq76d2N^>)ᢎGXIBXr'+R$ƕctw$.ڵeVkHSJT]dc;$99y؜e\J gWo*^@ptĽu: [_[SbġwYUT p'ʃ1Mhʔ䒓xpW={QM^o/Vy >L0r,؅}T!WGkh < oe7m%J)0$ ~<,Դok!)HR:|?᳿N?{?U?;gUl;?翱9ʹ?;gUh=rgȞ}!d뗫roʽ:8fZ:>jz'Uxԫ#A<̝з[Y] TAk+7ĺ˗O)+I JVH)#i&)xd4PH}4m<T3_݅ 5|N )[)^R{W{W{W}"+ ֖b?^a*Ĩ23ziz^z^zZuªzW➑:Kj ҬvO"JL^o_:\>lCWk;2~3έ?H/l;?ONq2??h{8W᳿N?*SWh{8W᳿N?*SWh{8VI>b맧kQ'RVX(g"6o`O&Ʒ~>ʐ 1\׷WxZ1b\RZq !=ĐH@7\dsIO_ht7?ӶsUúqe̻bPEyEI{0>5s(Ȕ-oMze"Dž& *t8|`|-'/ 0Ĥ`}ͳk>[j*>K+{W{W{W{W{W{W{W{W{W{Wׯ?_YN͆FL4^Oki HEa~ypDꩃ$3xs FYm%Gl4Q6=RGF.{Oa^?yٻPl{e{z?IL+Go;7 Ծ{_c#йGi?{Z#fAk}='0Q6=R}􏲽Bj#ǿ_=W\4½-D~wK翵?> ƓW娏?vn|G^sޏ Gc/H+.{Oa^?yٻPl{e{z?IL(i 5Su>:C6+ԮWVbZ"JIQ:m}~ek}$DUEyr_ RXhcX [Q6z^z^z_TGfCW,&71Id#|W}k~~~Cv5EiUKLa)JWv!F(ϾAXIV&0?yٻPl{_c#7z?IL+Go;7 Ծ{_c#йGi?{Z#fAk}='0Q6=R}􏲽Bj#ǿ_=W\4‘=C#~ Su+:gۊ;lυbPbͬGOM[˟ldcAy}oSxd%.$(lZJJGc/?>#sޏ Gc/H+.{Oa^?yٻPl{e{z?IL+Go;7 Ծ{_c#йGi?{Z#fAk}='0Q6=R}􏲽Bj#ǿ_=W\4½-D~wK翵?> ƓW娏?vn|G^sޏ Gc/H+.{Oa^?yٻPl{e{z?IL+Go;7 Ծ{_c#йGi?{Z#fAk}='0Q6=R}􏲽Bj#ǿ_=W\4½-D~wK翵?> ƓW娏?vn|G^sޏ Gc/H+.{Oa^?yٻPl{e{z?IL+Go;7 Ծ{_c#йGi?{Z#fAk}='0#M㘶aJͲW50aT1GUZjVi"cQSO}l2;[kǎ3[6)c.yvʙzjB P*'ߌ&]Y|2K\=q:~49Vg=^s=^s=^sM0ÿ^U!掠X6VQn>W=^΃ztOJ~*Z|O3(LF9a!#E>load_response


    Name

    load_response — load form variables into an array.

    Synopsis

    ::rivet::load_response ?arrayName?

    Description

    Load any form variables passed to this page into an array. If load_response is called without arguments the array response is created in the scope of the caller. If the variables var1,var2,var3... having values val1,val2,val3... are passed to the page, the resulting array will be a collection mapping var1,var2,var3... to their corresponding values. load_response was inspired by the same NeoWebScript procedure in the way it deals with multiple assignments: if a variable is assigned more than once the corresponding array element will be a list of the values for the variable. This can be useful in the case of forms with checkbox options that are given the same name. This condition is signalled by the presence of an auxiliary array variable.

    Example: if a group of checkboxes are associated to the var1 variable then response(var1) will store the list of their values and the array will also have the extra variable response(__var1) which can be tested with the usual [info exists response(__var1)]

    Calling load_response several times for the same array results in adding more values to the array at every call. When needed it is left to the caller to empty the array between two subsequent calls.

    rivet-2.2.4/doc/html/parray.html0000644000175000017500000000553712630261111016040 0ustar manghimanghiparray

    Name

    parray — Tcl's parray with html formatting.

    Synopsis

    ::rivet::parray ?arrayName? ??pattern??

    Description

    An html version of the standard Tcl parray command. Displays the entire contents of an array in a sorted, nicely-formatted way. Mostly used for debugging purposes.

    rivet-2.2.4/doc/html/entities.html0000644000175000017500000000462512630261112016364 0ustar manghimanghiRivetEntities

    RivetEntities

    Introduction

    The RivetEntities package was kindly provided by Harald Oehlmann and is largely taken from a simple yet clever encoder/decoder of HTML entities starting from a utf-8 character string. The original code writted by Andy Goth is at http://wiki.tcl.tk/26403. Package entities extends the functionality in the original code combining it with Tcl's 'encoding' command to encode/decode from any supported encoding

    rivet-2.2.4/doc/html/upgrading.html0000644000175000017500000001010012630261112016501 0ustar manghimanghiUpgrading from mod_dtcl or NeoWebScript

    Upgrading from mod_dtcl or NeoWebScript

    Rivet is a break from the past, in that we, the authors, have attempted to take what we like best about our past efforts, and leave out or change things we no longer care for. Backwards compatibility was not a primary goal when creating Rivet, but we do provide this information which may be of use to those wishing to upgrade from mod_dtcl or NWS installations.

    mod_dtcl

    Rivet was originally based on the dtcl code, but it has changed (improved!) quite a bit. The concepts remain the same, but many of the commands have changed.

    NeoWebScript

    NWS was a server-side scripting environment based on the Apache HTTP server and Safe-Tcl and it's not maintained anymore.

    The biggest difference between Rivet and Neowebscript is that Neowebscript was designed for shared hosting while Rivet is more oriented toward a site that owns all of its content. In the words of Karl Lehenbauer, NWS author and Rivet Team member:

    Rivet, however, is considerably more efficient, powerful, and evolved, though it still can support multiple independent sites on a single machine through its separate virtual interpreters mechanism.

    • By powerful, the difference is that the full power of Tcl is available to webpage authors, not the restricted version that NWS provides. For instance, you can read or write any file in the system that you have permission to, require any package, open sockets and pipes, etc.
    • By efficient, the difference is that Tcl interpreters survive past the generation of a webpage and are reused again and again, reducing the overhead of generating a page.
    • By evolved, all of our efforts have gone toward Rivet for many years and so, you know, Rivet does more out of the box than Neowebscript did.

    rivet-2.2.4/doc/html/escape_string.html0000644000175000017500000000535712630261111017370 0ustar manghimanghiescape_string

    Name

    escape_string — convert a string into escaped characters.

    Synopsis

    ::rivet::escape_string ?string?

    Description

    Scans through each character in the specified string looking for special characters, escaping them as needed, mapping special characters to a quoted hexadecimal equivalent, returning the result.

    This is useful for quoting strings that are going to be part of a URL.

    rivet-2.2.4/doc/html/debug.html0000644000175000017500000000646112630261111015625 0ustar manghimanghidebug

    Name

    debug — A command to print strings, arrays and the values of variables as specified by the arguments.

    Synopsis

    ::rivet::debug -subst ?<on|off>? -separator ?<string>? -option ?<value>? -option ?<value>? ...

    Description

    A command to make debugging more convenient print strings, arrays and the values of variables as specified by the arguments.

    Also allows the setting of an array called debug which will pick up options for all debug commands.

    rivet-2.2.4/doc/html/redirect.html0000644000175000017500000001151712630261111016336 0ustar manghimanghiredirect

    Name

    redirect — Interrupt processing and divert to a new URL

    Synopsis

    ::rivet::redirect ?URL? ?permanent (default: 0)?

    Description

    ::rivet::redirect diverts the browser to a new URL and marks the redirection as either permanent in the browser local cache or non permanent (default). Calling ::rivet::redirect causes the script execution to interrupt and control passes to AbortScript, if such script is set, by calling ::rivet::abort_page and passing as abort code a dictionary with 2 keys:

    • error_code: string literal 'redirect'
    • location: the URL the browser will be redirected to

    ::rivet::redirect drives the redirection by setting the 301 (permanent redirect) or 302 (non permanent redirect) HTTP status codes and attempts to discard the output the script might have already placed in the stdout channel buffer. Therefore the command can fail if

    • A flush stdout was called before ::rivet::redirect thus causing the HTTP headers to be sent and preventing any possibility to manipulate them
    • The channel buffer was filled causing Tcl to flush the channel

    The stdout channel, like any Tcl channels, can be manipulated and if needed its internal buffer streched.

    rivet-2.2.4/doc/html/load_cookies.html0000644000175000017500000000477312630261111017176 0ustar manghimanghiload_cookies

    Name

    load_cookies — get any cookie variables sent by the client.

    Synopsis

    ::rivet::load_cookies ?array_name?

    Description

    Load the array of cookie variables into the specified array name. Uses array cookies by default.

    rivet-2.2.4/doc/html/xml_calendar.html0000644000175000017500000003275612630261112017177 0ustar manghimanghiXmlCalendar

    Name

    XmlCalendar — Prints XML formatted calendar tables

    Synopsis

    XmlCalendar calendar_name ?-option1 option_list? ?-option2 option_list? ?...?

    An XmlCalendar object is created and returned. XmlCalendar objects print XML formatted calendar tables. The markup can be customized using the configuration options.

    Configuration options accept odd-length lists as values. An option_list has the following structure

    tag_name attr11 val1 attr2 val2 ...

    The first element of an option list is a tag name, the remaining terms are therefore an even-length sublist which is interpreted as a sequence of attribute-value pairs that will in turn become attributes of the tag.

    Methods

    cal_obj emit -opt1 val1 -opt2 val2
    cal_obj emit ?month? ?year? -opt1 val1 -opt2 val2
    cal_obj emit ? month | year? -opt1 val1 -opt2 val2
    The method 'emit' if invoked without arguments returns an XML calendar table of the current month

    Options

    -container (tag_name attr11 val1 attr2 val2 ...)
    Assigns an options list to the XML element that will hold the whole table.
    The default tag for the container is 'calendar', with no attributes.
    -header (tag_name attr11 val1 attr2 val2 ...)
    Assigns tag name and attributes to the XML header element (default: calheader)
    -body (tag_name attr11 val1 attr2 val2 ...)
    Assigns tag name and attributes to the XML body element of the table (default: calbody)
    -banner (tag_name attr11 val1 attr2 val2 ...)
    Assigns tag name and attributes to the XML banner element of the table (default: monthyear)
    The header of a calendar table is made of a banner, showing the Month and Year number, and of a weekdays bar.
    -foot (tag_name attr11 val1 attr2 val2 ...)
    Assigns tag name and attributes to the XML foot element of the table (default: calfoot).
    [Note]Note
    This option was added for completeness, but it's not implemented yet
    -banner_month (tag_name attr11 val1 attr2 val2 ...)
    Tag name and attributes for the XML element holding the month name (default:month)
    -banner_year (tag_name attr11 val1 attr2 val2 ...)
    Tag name and attributes for the XML element holding the month name (default: year)
    -weekdays (tag_name attr11 val1 attr2 val2 ...)
    Tag name and attributes for the XML element holding the weekday header (default: weekdays)
    -weekdays_cell (tag_name attr11 val1 attr2 val2 ...)
    Tag name and attributes for the XML element holding the each single weekday (default: wkdays)
    -days_row (tag_name attr11 val1 attr2 val2 ...)
    Tag name and attributes for the XML element holding the each row of the calendar table (default: week)
    -days_cell (tag_name attr11 val1 attr2 val2 ...)
    Tag name and attributes for the XML element representing a cell in the calendar table (default: day)
    -cell_function proc
    If set this option is the name of a procedure that gets called for every day of the month. The procedure must accept 4 argument representing day, month, year and weekday and must return an odd-length list interpreted in the same way as options lists.
    -current_day day
    This option works as a simple method for pointing out a specific day of the month. If set with a day number that day will get the class attribute automatically set as "current"
    -current_weekday 0-6 | today
    This option works as a simple method for pointing out a specific weekday of the month. If set with a weekday index (0: Sunday, 6: Saturday) the corresponding cell in the weekdays header will get the class attribute automatically set as "current_wkday"
    rivet-2.2.4/doc/html/env.html0000644000175000017500000000511012630261111015315 0ustar manghimanghienv

    Name

    env — Loads a single "environmental variable" into a Tcl variable.

    Synopsis

    ::rivet::env ?varName?

    Description

    If it is only necessary to load one environmental variable, this command may be used to avoid the overhead of loading and storing the entire array.

    rivet-2.2.4/doc/html/commands.html0000644000175000017500000000604212630261111016333 0ustar manghimanghiRivet Tcl Commands and Variables

    Rivet Tcl Commands and Variables

    Starting with version 2.1.0 Rivet command set moved into the ::rivet namespace.

    In order to preserve out of the box compatibility with existing scripts, Rivet exports commands by default and makes them available for import into any namespace (global namespace included). Rivet's build system can be told not to export the command set by passing the switch --disable-rivet-commands-export to 'configure'. In the future we may change this option's default.

    Commands must be imported into another namespace with the command:

    namespace import -force ::rivet::*

    Whenever a new application is being developed and compatibility issues can be confined within specific files, it is recommended that commands be specified with their fully qualified names.

    rivet-2.2.4/doc/html/wrapline.html0000644000175000017500000000562012630261111016354 0ustar manghimanghiwrapline

    Name

    wrapline — Split the line into multiple lines by splitting on space characters

    Synopsis

    ::rivet::wrapline ?string? ?maxlen? html

    Description

    Given a line and a maximum length and option "-html" argument, split the line into multiple lines by splitting on space characters and making sure each line is less than maximum length.

    If the third argument, "-html", is present, return the result with the lines separated by html <br> line breaks, otherwise the lines are returned separated by newline characters.

    rivet-2.2.4/doc/html/installation.html0000644000175000017500000003313212630261111017233 0ustar manghimanghiApache Rivet Installation

    Apache Rivet Installation

    Rivet 2.2 runs with the Apache 2.2.x and 2.4.x HTTP web server. It is known to build and run on various Linux distributions (Debian & Ubuntu, Redhat, SuSE and CentOS), FreeBSD and OpenBSD. For some of these Unix-like operative systems binary packages are already available for download.

    Currently there is no way to run Apache Rivet 2.2 on Windows© because Rivet currently requires the prefork, which is supported only on Unix/Linux systems. Efforts are under way to extend the support to the worker and the winnt MPMs. Check our development mailing list for the latests updates about Rivet development

    If you need to compile Apache Rivet yourself this is the procedure to follow

    1. Install Tcl

      Installing Rivet is about endowing the Apache HTTP webserver with the ability of running scripts written with the Tcl programming language. Therefore the Tcl shell (tclsh), its runtime and development libraries (≥8.5.10) have to be installed. Building Rivet you will have to tell the scripts where the Tcl libraries are located via the --with-tcl option to configure (see below).

    2. Get Rivet

      Download the sources at http://tcl.apache.org/rivet/html/download.html.

    3. Get and Install Apache Sources

      Rivet needs some of the include (.h) files shipped with the webserver source code. The easiest way to get them is to download the Apache source. If can build Rivet either statically (compiled into the Apache web server instead of loaded dynamically) or dynamically (as a loadable shared library). We recommend that you build Rivet as a shared library, for maximum flexibility, meaning that you also build Apache to be able to load modules. Other than that, the default Apache install is fine. We will tell Rivet where it is located via the --with-apxs option to configure (see below).

      The source code for the Apache web server may be found by following the links here: http://httpd.apache.org/.

    4. Uncompress Sources

      We will assume that you have Apache installed at this point. You must uncompress the Rivet sources in the directory where you wish to compile them.

      gunzip rivet-X.X.X.tar.gz
      tar -xvf rivet-X.X.X.tar.gz

    5. Building Rivet

      1. On Linux or Unix systems, Rivet uses the standard ./configure ; make ; make install sequence which installs to their target directories the Apache module, the binary libraries and the Tcl code

        There are several rivet specific options to configure that might be useful (or needed):

        --with-tcl
        This points to the directory where the tclConfig.sh file is located.
        --with-tclsh
        This points to the location of the tclsh executable.
        --with-apxs
        The location of the apxs program that provides information about the configuration and compilation options of Apache modules.
        --with-apache-include[=DIR]
        Locates the Apache include files on your computer, if they're not in standard directory.
        --enable-version-display=[yes|no]
        This option enables Rivet to display its version in the logfiles when Apache is started. The default is to keep Rivet version hidden.
        --with-rivet-target-dir=DIR
        This option tells the install script where Rivet's Tcl packages have to be copied.
        --with-upload-dir=DIR
        Configures Rivet's default upload directory
        --enable-head-requests
        By default HEAD requests don't go through the usual request processing which leads to script execution and therefore resource consumption and Rivet returns a standard hardcoded HTML header to save CPU time. --enable-head-requests changes this default (see also Rivet Directives)
        --disable-rivet-commands-export
        By default Rivet's commands are put on the export list of the ::rivet namespace. With this option you may prevent it thus forcing the programmer to fully qualify these commands
        --disable-import-rivet-commands
        Likewise commands in the Rivet's namespace when exported are then by default imported into the global namespace for compatibility with previous version of Rivet. (Enabling the import of Rivet's commands overrides the switch --disable-rivet-commands-export and forces the export from ::rivet). This switch overrides the default and prevents the import into the global namespace

        Example: configuring the build system to compile Rivet for an apache 2.x server, using tcl8.5 and specifying a custom name for the apxs program.

        ./configure --with-tcl=/usr/lib/tcl8.5/ --with-tclsh=/usr/bin/tclsh8.5 \
        	    --with-apxs=/usr/bin/apxs2 --with-apache=/usr --with-apache-version=2
      2. Run make

        At this point, you are ready to run make, which should run to completion without any errors (a warning or two is ok, generally).

      3. Install

        Now, you are ready to run the

        make install

        to install the resulting files. The install target actually fires the install-binaries and install-packages targets which in turn copy the binary modules and Tcl packages to their destination directories. This commands create a functional Rivet environment with its core language.

    6. Apache Configuration Files

      Rivet is relatively easy to configure - we start off by adding the module itself:

      LoadModule rivet_module	/usr/lib/apache2/modules/mod_rivet.so

      This tells Apache to load the Rivet shared object, wherever it happens to reside on your file system. Now we have to tell Apache what kind of files are "Rivet" files and how to process them:

      AddType application/x-httpd-rivet .rvt
      AddType application/x-rivet-tcl .tcl

      These tell Apache to process files with the .rvt and .tcl extensions as Rivet files.

      The characters encoding can be changed using the header type command, but you can also change the default charset for the whole site:

      AddType 'application/x-httpd-rivet;charset=utf-8' rvt

      All the pages generated by Rivet on this site will be sent with a Content-Type:'text/html;charset=utf-8' header.

      You may also wish to use Rivet files as index files for directories. In that case, you would do the following:

      DirectoryIndex index.html index.htm index.shtml index.cgi index.tcl index.rvt

      For other directives that Rivet provides for Apache configuration, please see the section called “Rivet Apache Directives”.

    rivet-2.2.4/doc/html/session_package.html0000644000175000017500000005234012630261112017673 0ustar manghimanghiSession Package

    Session Package

    Introduction

    This is session management code. It provides an interface to allow you to generate and track a browser's visit as a "session", giving you a unique session ID and an interface for storing and retrieving data for that session on the server.

    This is an alpha/beta release -- documentation is not in final form, but everything you need should be in this file.

    Using sessions and their included ability to store and retrieve session-related data on the server, programmers can generate more secure and higher-performance websites. For example, hidden fields do not have to be included in forms (and the risk of them being manipulated by the user mitigated) since data that would be stored in hidden fields can now be stored in the session cache on the server. Forms are then faster since no hidden data is transmitted -- hidden fields must be sent twice, once in the form to the broswer and once in the response from it.

    Robust login systems, etc, can be built on top of this code.

    Requirements

    Currently has only been tested with Postgresql, MySql and Oracle. All DB interfacing is done through DIO, though, so it should be relatively easy to add support for other databases.

    Preparing To Use It

    Create the tables in your SQL server. With Postgres, do a psql www or whatever DB you connect as, then a backslash-i on session-create.sql

    (If you need to delete the tables, use session-drop.sql)

    The session code by default requires a DIO handle called DIO (the name of which can be overridden). We get it by doing a

    RivetServerConf ChildInitScript "package require DIO"
    RivetServerConf ChildInitScript "::DIO::handle Postgresql DIO -user www"

    Example Usage

    In your httpd.conf, add:

    RivetServerConf ChildInitScript "package require Session; Session SESSION"

    This tells Rivet you want to create a session object named SESSION in every child process Apache creates.

    You can configure the session at this point using numerous key-value pairs (which are defined later in this doc). Here's a quick example:

    RivetServerConf ChildInitScript "package require Session; Session SESSION \
      -cookieLifetime 120 -debugMode 1"

    Turn debugging on -debugMode 1 to figure out what's going on -- it's really useful, if verbose.

    In your .rvt file, when you're generating the <HEAD> section:

    SESSION activate

    Activate handles everything for you with respect to creating new sessions, and for locating, validating, and updating existing sessions. Activate will either locate an existing session, or create a new one. Sessions will automatically be refreshed (their lifetimes extended) as additional requests are received during the session, all under the control of the key-value pairs controlling the session object.

    Using Sessions From Your Code

    The main methods your code will use are:

    SESSION id
    After doing a SESSION activate, this will return a 32-byte ASCII-encoded random hexadecimal string. Every time this browser comes to us with a request within the timeout period, this same string will be returned (assuming they have cookies enabled).
    SESSION is_new_session
    returns 1 if it's a new session or 0 if it has previously existed (i.e. it's a zero if this request represents a "return" or subsequent visit to a current session.)
    SESSION new_session_reason
    This will return why this request is the first request of a new session, either "no_cookie" saying the browser didn't give us a session cookie, "no_session" indicating we got a cookie but couldn't find it in our session table, or "timeout" where they had a cookie and we found the matching session but the session has timed out.
    SESSION store ?packageName? ?key? ?data?
    Given the name of a package, a key, and some data. Stores the data in the rivet session cache table.
    SESSION fetch ?packageName? ?key?
    Given a package name and a key, return the data stored by the store method, or an empty string if none was set. (Status is set to the DIO error that occurred, it can be fetched using the status method.)

    Session Configuration Options

    The following key-value pairs can be specified when a session object (like SESSION above) is created:

    sessionLifetime
    how many seconds the session will live for. 7200 == 2 hours
    sessionRefreshInterval
    If a request is processed for a browser that currently has a session and this long has elapsed since the session update time was last updated, update it. 900 == 15 minutes. so if at least 15 minutes has elapsed and we've gotten a new request for a page, update the session update time, extending the session lifetime (sessions that are in use keep getting extended).
    cookieName
    name of the cookie stored on the user's web browser default rivetSession
    dioObject
    The name of the DIO object we'll use to access the database (default DIO)
    gcProbability
    The probability that garbage collection will occur in percent. (default 1%, i.e. 1)
    gcMaxLifetime
    the number of seconds after which data will be seen as "garbage" and cleaned up -- defaults to 1 day (86400)
    refererCheck
    The substring you want to check each HTTP referer for. If the referer was sent by the browser and the substring is not found, the session will be deleted. (not coded yet)
    entropyFile
    The name of a file that random binary data can be read from. (/dev/urandom) Data will be used from this file to help generate a super-hard-to-guess session ID.
    entropyLength
    The number of bytes which will be read from the entropy file. If 0, the entropy file will not be read (default 0)
    scrambleCode
    Set the scramble code to something unique for the site or your app or whatever, to slightly increase the unguessability of session ids (default "some random string")
    cookieLifetime
    The lifetime of the cookie in minutes. 0 means until the browser is closed (I think). (default 0)
    cookiePath
    The webserver subpath that the session cookie applies to (defaults to /)
    cookieSecure
    Specifies whether the cookie should only be sent over secure connections, 0 = any, 1 = secure connections only (default 0)
    sessionTable
    The name of the table that session info will be stored in (default rivet_session)
    sessionCacheTable
    The name of the table that contains cached session data (default rivet_session_cache)
    debugMode
    Set debug mode to 1 to trace through and see the session object do its thing (default 0)
    debugFile
    The file handle that debugging messages will be written to (default stdout)

    Session Methods

    The following methods can be invoked to find out information about the current session, store and fetch server data identified with this session, etc:

    SESSION status
    Return the status of the last operation
    SESSION id
    Get the session ID of the current browser. Returns an empty string if there's no session (will not happen is SESSION activate has been issued.)
    SESSION new_session_reason
    Returns the reason why there wasn't a previous session, either "no_cookie" saying the browser didn't give us a session cookie, "no_session" indicating we got a cookie but couldn't find it in the session table, or "timeout" when we had a cookie and a session but the session had timed out.
    SESSION store ?packageName? ?key? ?data?
    Given a package name, a key string, and a data string, store the data in the rivet session cache.
    SESSION fetch ?packageName? ?key?
    Given a package name and a key, return the data stored by the store method, or an empty string if none was set. Status is set to the DIO error that occurred, it can be fetched using the status method.
    SESSION delete
    Given a user ID and looking at their IP address we inherited from the environment (thanks, Apache), remove them from the session table. (the session table is how the server remembers stuff about sessions). If the session ID was not specified the current session is deleted.
    SESSION activate
    Find and validate the session ID if they have one. If they don't have one or it isn't valid (timed out, etc), create a session and drop a cookie on them.

    Getting Additional Randomness From The Entropy File

    RivetServerConf ChildInitScript "Session SESSION -entropyFile /dev/urandom \
      -entropyLength 10 -debugMode 1"

    This options say we want to get randomness from an entropy file (random data pseudo-device) of /dev/urandom, to get ten bytes of random data from that entropy device, and to turn on debug mode, which will cause the SESSION object to output all manner of debugging information as it does stuff. This has been tested on FreeBSD and appears to work.

    rivet-2.2.4/doc/html/incr0.html0000644000175000017500000000706512630261111015553 0ustar manghimanghiincr0

    Name

    incr0 — increment a variable or set it to 1 if nonexistent.

    Synopsis

    incr0 ?varname? ?num?

    Description

    Increment a variable varname by num. If the variable doesn't exist, create it instead of returning an error.

    [Note]Note
    incr0 functionality is provided by the native incr in Tcl >= 8.5, therefore this command is deprecated and kept as an interpreter alias only for compatibility. As such incr0 wasn't moved to the ::rivet namespace and it will be removed in future versions of Rivet.
    rivet-2.2.4/doc/html/load_env.html0000644000175000017500000000535312630261111016325 0ustar manghimanghiload_env

    Name

    load_env — get the request's environment variables.

    Synopsis

    ::rivet::load_env ?array_name?

    Description

    Load the array of environment variables into the specified array name. Uses array ::request::env by default.

    As Rivet pages are run in the ::request namespace, it isn't necessary to qualify the array name for most uses - it's ok to access it as env.

    rivet-2.2.4/doc/html/apache_table.html0000644000175000017500000002355612630261111017133 0ustar manghimanghiapache_table

    Name

    apache_table — access and manipulate Apache tables in the request structure.

    Synopsis

    ::rivet::apache_table (get | set | exists | unset | names | array_get | clear)

    Description

    The apache_table command is for accessing and manipulating Apache tables in the request structure.

    The table name must be one of notes, headers_in, headers_out, err_headers_out, or subprocess_env.

    ::rivet::apache_table get ?tablename? ?key?
    When given the name of an Apache table tablename and the name of a key tablename, returns the value of the key in the table, or an empty string.
    ::rivet::apache_table set ?tablename? ?key? ?value?
    ::rivet::apache_table set ?tablename? ?list?
    Stores the value in the table tablename under the key key.
    For the list form, list contains a list of zero or more pairs of key-value pairs to be set into the table tablename.
    ::rivet::apache_table exists ?tablename? ?key?
    Returns 1 if the specified key, key, exists in table tablename, else 0.
    ::rivet::apache_table unset ?tablename? ?key?
    Removes the key-value pair referenced by key from the table tablename.
    ::rivet::apache_table names ?tablename?
    Returns a list of all of the keys present in the table tablename.
    ::rivet::apache_table array_get ?tablename?
    Returns a list of key-value pairs from the table tablename.
    ::rivet::apache_table clear ?tablename?
    Clears the contents of the specified table.
    rivet-2.2.4/doc/html/raw_post.html0000644000175000017500000000464312630261111016375 0ustar manghimanghiraw_post

    Name

    raw_post — get the unmodified body of a POST request sent by the client.

    Synopsis

    ::rivet::raw_post

    Description

    Returns the raw POST data from the request. If the request was not a POST or there is no data, then "" - an empty string - is returned.

    rivet-2.2.4/doc/html/diodisplay_package.html0000644000175000017500000013636712630261111020364 0ustar manghimanghiDIODisplay

    Name

    DIODisplay — Database Interface Objects Display Class

    Synopsis

    DIODisplay (objectName | #auto) (-option | option | -option | option | ...)

    Description

    DIODisplay is an HTML display class that uses a DIO object to do the database work and a form object to do the displaying.

    Options

    -DIO dioObject
    The DIO object to be used in conjunction with this display object. This is a required field.
    -cleanup (1 | 0)
    If cleanup is true, when the display object is shown, it will automatically destroy the DIO object, the form object and itself. Default is true.
    -confirmdelete (1 | 0)
    If confirmdelete is true, attempting to delete a record from the database first requires that the user confirm that they wish to delete it. If it is false, deletion occurs without prompting the user. Defaults to true.
    -errorhandler procName
    The name of a procedure to handle errors when they occur. During the processing of requests and pages, sometimes unexpected errors can occur. This procedure will handle any errors. It is called with a single argument, the error string. Use of the Tcl errorInfo and errorCode variables is also recommended though.
    If no errorhandler is specified, the handle_error method within the Display object will handle the error.
    -fields fieldList
    Specify a list of fields to be used in this object. The fields list is actually created by using the field command to add fields to the display, but this option can be useful to sometimes over-set the list of fields created.
    -form formObject
    A Rivet form object to use when displaying a form. If one is not specified, the display object will automatically create one when it is necessary.
    -functions functionList
    A list of functions to be displayed in the main menu. This is a list of functions the user is allowed to execute.
    -pagesize pageSize
    How many records to show per page on a search or list. Default is 25.
    -rowfields fieldList
    A list of fields to display in each row of a search or list. When a search or list is conducted and the resulting rows are displayed, this list will limit which fields are displayed. Default is all fields.
    -rowfunctions functionList
    A list of functions to display in each row of a search or list.
    -searchfields fieldList
    A list of fields to allow a user to search by. This list will appear in the main screen as a drop-down box of fields the user can search on.
    -title title
    The title of the display object. This will be output as the title of the HTML document.

    DIO Display Object Commands

    objectName cleanup ?value?
    Return the current cleanup value. If value is specified, it sets a new value for the cleanup option.
    objectName delete key
    Delete the specified key from the database.
    The default action of this method is to call the DIO object's delete command. This method can be overridden.
    objectName destroy
    Destroy the diodisplay object.
    objectName DIO ?value?
    Return the current DIO value. If value is specified, it sets a new value for DIO.
    objectName errorhandler ?value?
    Return the current errorhandler value. If value is specified, it sets a new value for errorhandler.
    objectName fetch key arrayName
    Fetch the specified key from the database and store it as an array in arrayName.
    The default of this method is to call the DIO object's fetch command. This method can be overridden.
    objectName field fieldName (-arg | arg...)
    Create a new field object and add it to the display. When a field is added to the display, a new object of the DIODisplayField class is created with its values. See [FIXME - LINK] DIO Display Fields for options and values.
    objectName fields ?value?
    Return the current fields value. If value is specified, it sets a new value for fields.
    objectName form ?value?
    Return the current form value. If value is specified, it sets a new value for form.
    objectName function functionName
    Add a new function to the list of possible functions. The display object will only execute methods and procs which are defined as functions by the object. This is to protect the program from executing a different procedure other than what is allowed. The function command adds a new function to the list of allowable functions.
    objectName functions ?value?
    Return the current functions value. If value is specified, it sets a new value for functions. See [FIXME - LINK DIO Display Functions] for a list of default functions.
    objectName pagesize ?value?
    Return the current form pagesize. If value is specified, it sets a new value for pagesize.
    objectName rowfields ?value?
    Return the current form rowfields. If value is specified, it sets a new value for rowfields.
    objectName rowfooter
    Output the footer of a list of rows to the web page.
    This method can be overridden.
    objectName rowfunctions ?value?
    Return the current rowfunctions value. If value is specified, it sets a new value for rowfunctions.
    objectName rowheader
    Output the header of a list of rows to the web page. By default, this is an HTML table with a top row listing the fields in the table.
    This method can be overridden.
    objectName searchfields ?value?
    Return the current searchfields value. If value is specified, it sets a new value for searchfields.
    objectName show
    Show the display object.
    This is the main method of the display class. It looks for a variable called mode to be passed in through a form response and uses that mode to execute the appropriate function. If mode is not given, the Main function is called.
    This function should be called for every page.
    objectName showform
    Display the form of the object.
    This method displays the form for this display object. It is used in the Add and Edit methods but can be called separately if needed.
    This method can be overridden if the default look of a form needs to be changed. By default, the form displayed is simply the fields in a table, in order.
    objectName showrow arrayName
    Display a single row of a resulting list or search.
    This method is used to display a single row while displaying the result of a list or search. arrayName is a fetched array of the record.
    This method can be overriden if the default look of a row needs to be changed. By default, each row is output as a table row with each field as a table data cell.
    objectName showview
    Display the view of the object.
    This method displays the view for this display object. It is used in the Details methods but can be called separately if needed.
    This method can be overridden if the default look of a view needs to be changed. By default, the view displayed is simply the fields in a table, in order.
    objectName store arrayName
    Store the specified arrayName in the database.
    The default of this method is to call the DIO object's store command. This method can be overridden.
    objectName text ?value?
    Return the current text value. If value is specified, it sets a new value for text.
    objectName title ?value?
    Return the current title value. If value is specified, it sets a new value for title.
    objectName type ?value?
    Return the current type value. If value is specified, it sets a new value for type.
    objectName value ?value?
    Return the current value value. If value is specified, it sets a new value for value.

    DIO Display Functions

    These functions are called from the show method when a form response variable called mode is set. If no mode has been set, the default mode is Main. The show method will handle the necessary switching of functions. The show method also handles checking to make sure the function given is a true function. If not, an error message is displayed. New functions can be added as methods or by use of the function command, and any of the default functions can be overridden with new methods to create an entirely new class. These are the default functions provided.

    Add
    Show a form that allows the user to add a new entry to the database. This function calls showform to display the form for adding the entry.
    Cancel
    The Cancel function does nothing but redirect back to the Main function. This is handy for forms which have a cancel button to point to.
    Delete
    If confirmdelete is true (the default), the Delete function will ask the user if they're sure they want to delete the record from the database. If confirmdelete is false, or if the user confirms they wish to delete, this function calls the DoDelete function to do the actual deletion of a record.
    Details
    Display the view of a single record from the database. This function calls the showview method to display a single record from the database.
    DoDelete
    This function actually deletes a record from the database. Once it has deleted the record, it redirects the user back to the Main function.
    Edit
    Show a form that allows the user to edit an existing entry to the database. This function calls showform to display the form for editing the entry and fills in the fields with the values retrieved from the database.
    List
    This function lists the entires contents of the database. Each record is output in a row using the showrow method.
    Main
    This function is the main function of the display object. If there is no mode, or once most commands complete, the user will be redirected to this function. The default Main function displays a list of functions the user can execute, a list of searchfields the user can search on, and a query field. This query field is used by all of the other functions to determine what the user is trying to find.
    In the case of a search, query specifies what string the user is looking for in the specified search field. In the case of delete, details or edit, the query specifies the database key to access.
    Save
    This function saves any data passed to using the store method. This is primarily used by the add and edit commands to store the results of the form the user has filled out.
    Search
    This function searches the database for any row whose searchBy field matches query. Once any number of records are found, Search displays the results in rows.

    DIO Display Fields

    Display fields are created with the field command of the DIODisplay object. Each field is created as a new DIODisplayField object or as a subclass of DIODisplayField. The standard form fields use the standard field class, while specialized field types use a class with different options but still supports all of the same commands and values a generic field does.

    displayObject field fieldname (-option | option...)

    These are the standard options supported by field types:

    -formargs arguments
    When a field is created, any argument which is not a standard option is assumed to be an argument passed to the form object when the field is shown in a form. These arguments are all appended to the formargs variable. You can use this option to override or add options after the initial creation of an object
    -readonly (1 | 0)
    If readonly is set to true, the field will not display a form entry when displaying in a form.
    -text text
    The text displayed next to the form or view field. By default, DIODisplay tries to figure out a pretty way to display the field name. This text will override that default and display whatever is specified.
    -type fieldType
    The type of field this is. This type is used when creating the field in the form object. fieldType can be any of the accepted form field types. See [FIXME - LINK DIO Field Types] for a list of types available.

    All other arguments, unless specified in an individual field type, are passed directly to the form object when the field is created. So, you can pass -size or -maxsize to specify the length and maximum length of the field entry. Or, if type were textarea, you could define -rows and -cols to specify its row and column count.

    DIO Display Field Types

    The following is a list of recognized field types by DIODisplay. Some are standard HTML form fields, and others are DIODisplay fields which execute special actions and functions.

    rivet-2.2.4/doc/html/xml.html0000644000175000017500000001044112630261111015330 0ustar manghimanghixml

    Name

    xml — XML Fragments creation

    Synopsis

    ::rivet::xml ?string? ?tag descriptor? ?tag descriptor? ?...?

    Description

    Given a string and a variable number of tag descriptors return XML framgment made by nesting the tags with the same hierarchical order they are listed on the command line. The tag descriptors can be a one element list (the tag) or an odd-length list whose first argument is the tag namme and the remaining elements are interpreted as attribute name-attribute value pairs.

    ::rivet::xml can work as a replacement of ::rivet::html provided you take care of sending the string with command puts

    ::rivet::xml "a string" b u
    <== <b><u>a string</u></b>

    You can tell the tags which attributes they must have

    ::rivet::xml "a string" [list div class box id testbox] b i
    <== <div class="box" id="testbox"><b><i>a string</i></b></div>
    ::rivet::xml "text to be wrapped in XML" div [list a href "http://..../" title "info message"] 
    <== <div><a href="http://..../" title="info message">text to be wrapped in XML</a></div>
    rivet-2.2.4/doc/html/lempty.html0000644000175000017500000000505412630261111016046 0ustar manghimanghilempty

    Name

    lempty — Returns 1 if <list> is empty or 0 if it has any elements. This command emulates the TclX lempty command.

    Synopsis

    ::rivet::lempty list

    Description

    Returns 1 if <list> is empty or 0 if it has any elements. This command emulates the TclX lempty command.

    rivet-2.2.4/doc/html/var.html0000644000175000017500000002174312630261111015327 0ustar manghimanghivar

    Name

    var, var_qs, var_post — get the value of a form variable.

    Synopsis

    ::rivet::var (get | list | exists | number | all)
    ::rivet::var_qs (get | list | exists | number | all)
    ::rivet::var_post (get | list | exists | number | all)

    Description

    The var command retrieves information about GET or POST variables sent to the script via client request. It treats both GET and POST variables the same, regardless of their origin. Note that there are two additional forms of ::rivet::var: rivet::var_qs and ::rivet::var_post. These two restrict the retrieval of information to parameters arriving via the querystring (?foo=bar&bee=bop) or POSTing, respectively.

    ::rivet::var get ?varname? ??default??
    Returns the value of variable varname as a string (even if there are multiple values). If the variable doesn't exist as a GET or POST variable, the ?default? value is returned, otherwise "" - an empty string - is returned.
    ::rivet::var list ?varname?
    Returns the value of variable varname as a list, one list element per reference. Radiobuttons or multiple selection listboxes are suited widgets which may return list data.
    If the result list is passed as a default value to the form package, one could also set index "__varname" to get it interpreted as a list.
    set response(countries) [::rivet::var list countries]
    set response(__countries) ""
    form form_request -defaults response
    form_request select countries -multiple 1 -values {USA Canada Mexico}
    form_request end
    ::rivet::var exists ?varname?
    Returns 1 if varname exists, 0 if it doesn't.
    ::rivet::var number
    Returns the number of variables.
    ::rivet::var all
    Return a list of variable names and values.

    See Example 3, “Variable Access”.

    rivet-2.2.4/doc/html/images/0000755000175000017500000000000012630261111015107 5ustar manghimanghirivet-2.2.4/doc/html/images/prev.png0000644000175000017500000000152112630261110016567 0ustar manghimanghiPNG  IHDR ꂣAbKGD pHYs  tIMEYtEXtCommentCreated with GIMPWIDATHǽr`&' 44h ӖP}WY|uttt<|Wl/Ryo}Xae+v\_\C^`-Ul,މX`^E&3rp7]H U8GfÄJ-tMA5r"ZPJ/ *R8M4<#e`!cTJNVzQOS$ > F:Z_7v(E%Pϔvw+yx[@.3E$Bu:IRNky Vdq LȪ<6 :2]U"ؑ %$'{܊,qY={g*o6=9^o 5 -gn46]%,!aup?+Bf`Bєԧpa |x'60b;'Ç+l8 YgnԳ#8ET??>M*(Pgpdz"H4CWrn0zyp};>"_ 3 +vο>u9h(cADq>|!>s9 `xƈ"KE45H՝?|Iq`Dy+k2+uOa6dIENDB`rivet-2.2.4/doc/html/images/toc-blank.png0000644000175000017500000000047612630261110017475 0ustar manghimanghiPNG  IHDR kd0PLTEO&IbKGDHIDATxc?|` h BhCtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com!*tEXtSignaturef7e388dabd4ef0097714b5643fdd3cfbb tEXtPage15x9+0+07vIENDB`rivet-2.2.4/doc/html/images/disk.png0000644000175000017500000000055112630261110016547 0ustar manghimanghiPNG  IHDR [jgAMA asRGB cHRMz&u0`:pQ<PLTE{{{ W[[hU\tRNS@fbKGDH pHYsHHFk>2IDATcRRR``Pv5P @*4DrqqqRnii J="%tEXtdate:create2012-10-01T18:29:36+02:00f%tEXtdate:modify2004-02-19T05:48:44+01:00"IENDB`rivet-2.2.4/doc/html/images/scrollup.png0000644000175000017500000000054112630261110017457 0ustar manghimanghiPNG  IHDR _w(gAMA asRGB cHRMz&u0`:pQ<PLTE5us0tRNS@fbKGDH pHYsHHFk>0IDATc```d! l$Ag"\@Ɔ B (hi6P%tEXtdate:create2012-10-01T18:29:07+02:00j%tEXtdate:modify2004-02-19T05:50:42+01:00%:,IENDB`rivet-2.2.4/doc/html/images/note.png0000644000175000017500000000075212630261110016565 0ustar manghimanghiPNG  IHDRb$bKGD#2IDATxe!0 E}K C tAQCACQA+g4mɌoK. qc  D="s %dǜH1y%M8fK wֵ>i6g-NpYtL#ߟ ab;U#2V} ԣrVx]zTT1O H4]o zΧg"ӒNHlUu߯9a)s{;s4^>}Zkk>{ |H]̰Wp/[!ɰW(iva~@`ƅ=nR,n*jسrhXN5X=a 0`@ۀ 0` u aiRD>7nb3KfevEK9f,h[z~U! `Ƌ~ NbYaݤ5;9_gᑅ ;ܦX3?yfu<~ ~55W^,)"/<M~TWܽ:I/DF]Y6:)Ur߁4v~ig I n(sw/.ӗxx3hqL %=H.{\ysGMKMyeLsu|^))qI-kgeGMCu~K ~tnu#tloF0cnjYYA|.{;q? LfՁZ+9:PuP_bN|Yt o2#抄Џ VZU%#.< 4=so:))Y-8~,B:Cg'XY#[ c)TbVcK>[a߽MS.C;o9*y}-oDv"UK2y2P-K X!0-2!Q,oMD4)8leW4^OP46Qgo&? lMew/⯅Iߧqp/ج *IZ&EhZ6:\یS%CZǁggHy1c}Y1yI1Peʄp#-m/k㑆pI`"/ r\du*5Fp07?XC_D{K{Z*ç.f ʋd  R-HBWֽXò3w< u.f:xm<Ӫ+Տq`/3y9yyX'YV ? *_/s?O==`u7κepKi=:G&jzܡN^dЋ)pS ݻu]st]r2sn槙~ Oͯ>yj!~Z떟5ΘcYvi&y%4Q6;Ⱥ͎HiE58o™KOiGӫq#[I h]#9dmB6yR EO}:0~|T**&ʏ#.P0GGPSM࿭msA?Iό^Q2Js#?Q;AvAtxi]ħ'o?ShLcW@6ޢR>Bc(C2:im j-Ql[Ơд KHdJ茞cǥ Vh|o8|f"F坪_mЇ%boOB9&ߠP Cr%gWb$U nμZz+[M(7c~+WZMo!bӛ:3;l12ښ_1r1Zk6?Ň=J"~|XKaF{Ԏ8^y51bՋ_aJ&0esx;A`$nAWm\1K1&!%y#.Ɉ*TFU0'£;8?4u:⡥f7}ϻXAm0>k eNS^e':]k5譇kR`= n߶ yN@ oqN2W=o$ hҜC b軑[Xri 8ixduZ'f}mMw}=t\ B]qY3^úz4@-o :j۹6T%X3I"*ΛpDW ahM'N2gڋJ192a<8}M%(& mdUJAڴHDJI:1*_3c&eRq"y UG.HEV3i9=_g+Iv4,%9á>(6uJ8)qF /M9?7.uK:~.IJ:d/~'-y ;i!F'%jOi㇣ d(}4Sr‘2y2xJ.|l ␨?Lk5cEwW3huyTTJ~19tLfᗆcf;Q:&<~OڑykX>FN6q =hnl5>kZ9$4Fzj>iNFKyK"rq,_!'=GrkS֥U,Jgצ6㎀Dgno -':'iZZbA>Q=,llo) B !~LN-i_ɟEL9iz@X9lC;4ACP?Q@%zSn$}`ASdW`;aMLmh|h@ |4I _P8d-2l녢yp4s~n+4;:)E$-'{ h5tnn`,~;:+u wZ] vA^_au#20i? Taܸay~[^UoAlisxH~/h]<↮>39W?|Wѳ%lc\!xkHywH7)L8PBjd&L  I8&x\ѽ dX<~\j ~:ͭy-:/)?ĵ~VzO f8*5B j.>9ҲISP~RoD^ý A8{yQI2DN@F~ WO=v71kk;V!Lh[WF'#k8hR`TC -~nIX z pAdܑ(O#:CF%JNPBP[yFN3=7Ep?FwIbAgGańI@) {Eg&gc$vܚLM5>s.lf83I I,cjdxm_*뿖KJ& w&Rb7Ь@[ m0?o?gÜ-:ׅbo>DkΟjX:6{*Β)ټ0IyBopKuLؿ|.Y/kyؿj`B@Ȼ6q5k Dww/ECyn:^ol_Õhz/WZӹdА="YD"@UA8lR hT;D=.jhأ.rƳ)$%LJoO=_a mj 1DIy,L &Pew5!I݌?IJgs:_5~G<-~4 QA^n/Ց @S0FP-[0rG噒aNa⬁{Jol dYA=y?[P peJٮHTj$_anB*eϪ}>Wr1Qk7ɖ^+6)%4b}#zfO6oh╟~(Z4fis-@ M}Mi\\>{GC1]Ҡj~[^I.z> -,.mz皵Yypġ|\y̛x`wJi=,흜vx^2Lω 㲧b ?-srwUx54W硕 l "A~do̪p~/gS3uM 9f/ -0xVUH4w_xY'"5M[41v/M @p}̀T~1gpYN=h$A?WؿFy92$&5 qT?,/2'Z`<+O=IeT ts vc#C̄%`h3vޙU{9Kb(넎( 9tw:۪4A C;LnZ;Q?``;\Ic= 5(aQ4&mLqYvjħ8h\|l7hE0'ܡm̞͎=4qV^]FSt=㲙xĈl\ 0"D%v6VYR㥒Ȓ@HC10V|O<9^;Z$P[R׆xСhFXi52YV}´|y`2 m IrgfվBrZp]Spu+G0[=q2]<1gQ^W֥T &ɓ`WPT M 2")l$}F҉4svpOl,Ӱ-&n3ỹuBq.i~Oxs' . U rTbD_Ib$@$p(P%+NGOb0 ~S~y3@@pl${ [P@k5ՠw*u.H82O%9oy+N^c[BS8iL?_JWÕr٬3BF 71 iaF}JPssfSgpdGn25Rq_6jYpIZ4y$t)j~m=~~+V ,=bx^fTF:gmZ~h=>_@QȍZzbka)w~ьj61h:vhҫX]sOxv lGļ}8_ n1n/\j̳avx[ϧA0bٜœ%N*d)c0,(őe j s<[\bCY>%˦\j&D# l8ƣ'g^݇⇸sCܹ qܵl\m/-G$T5O GUGv5u48TJ\ˀOՊ?@&Y[Uxևtn 'O])_8vaH%v!N_l @C MBeBC}\ ; +Qu.P^45ZZ|P$=w4>ˤt ;myKӫRJ|-bp>'sBɡˋ!5v/z3Kr1 HjNYW^z4s𐟑S TJ&J^k৒"!^ygFAdaFG~O]cg'3( ~Wuʖ=ߟ9)*S發[/4ff3E;'?sm::Vl8[^h.gͤ~7%;w[ b{-u.ῆMdLv2y;x}|tO?[5!p' !\VWM/6G\hOYhV$vSdqi1ևZTޠ!&euAӒ/m?dNBIKmdNT. QTO5Q~B{ʯ Kx~d6dق{j3A:ESW >}[E${nk$\#u5vF4z -G u)qZƤ~;ſT*=ħvη'ٻMxHfO?[bt {=B <oΤd 5rJVJ/g Sx9% (ؿęl~A!l6lp/H~0 ^|5ÿ) ϙd8;)T;HB?3 x1`wr_nN8T͸g{}@e{ 0tM@M+ { 7.4ظpX\<Űg?`bpSPÞC2wa~TX0P 0` 0` 0`  0`BHi1` 0`ad 0` ?j{Ų-˗Je[Z$-- [Z,6nqrqK`ee-.[\ GoqYa/02 0`  0`0AzxY2/qVO!s`^N_no+ʋ$m kn~Q3w nnɫwXE])fM_ͅ}:).%qgGh0iyg%H۲vѿkzaN™s" a y.-O'[lE'ٰ5;9Efؕ0wF,hD'~d w|w3zi/<-~dW<$kygXZx)K%p2xu+R$1i\eq9SW mq IDATݍgAӗs=c|04;&s JM?KyM_>~ҟyYY xuȝi&!JXYMьcnX\y:{))H`#Hu.KZ2b9*OJv~ڱ--^CvR le-eBu//󧊓x69RVIRň Bqȑ=:dA&:%Q YNcҩ|>@yXૃk?ԩx"zPv&{{lGm8ycލdun ;7*C`¦{4.IlaYS 7L_Py.ҹgrWǟUع83%sJl }W-W1}Nă\uBJm es~gvvE\-Vfϓ ӎY6jhRH_Ѻ}T8hofTZmIsdǸֽ;=^X`ɮ1{g:s|~\wcӇxyYGqd r%??Y/ <#_/%} kea6!콷F'#ѿJ'3CvFmXMT{& c `mv,$y#h5>ɾ-A |zJ1z{?(?iT6m%~6>[;5cʂ{LlC*Shl}NEŪt[IsNou?= ը=[$s~/ɰChջU\OieE3$WTbE +O`rllQacĸ׿7ly;%Nxl_Aşj}@PAaC-Lȕz ]bt713>8o^,v$U>OWjYokt3~^ieDz1r⡖>Ut`8z^ǯ彣f[R6v}y3k")tbM]ތz}> VkLwG+yz.GgOm ;ΈBU~SPohr9,3ֺuR zP_8O:]K~ ftRk^e'~:]kɣ2sFfhZt2X} "JVY_mhkSItZ/ԶavNW=7z`?5rىw#aqsYbQP-iSKj3ic#Hrq]247dbw\^Է-Zu]>fRɞ:Da7P k딚D-JfwIr^S3a_ | QrF:#gFJidGWaj!(10N+i(V$h`f&M9^qbգQ$<fDʐ:G"AfI3(tW8jfpN^Ξ:\cEoJQU TG2V.1$&TngW FΰH.HO"==}=|W~%w3Jlm 0&f2:'oFVBs]SoetA"!~ZecE2JFq#UxE<@DuH?=XsVPi5/:K>x;| |^+v.\˧!ˈSY6C$|1?QUjOBVEADn51^+GȘrh eY%$Κ:g1"4u28gMP| ި'R)8 .[$Rj; Myń5cƤ&KCSOtTQ- a N΀ЃYqx&]Gjf\ ra:MqjQ0!݊0OSK4M%G+]fLY&е^SVH+ka>eJ2CX";Bֶ {i9PFήQ`FǾ( gؒt[YOtB\KF̬85K,GԿ{/̹o셆dB:$%m2ݖrl+~q pm/T%' b wW^*unl?)ՃFC'}F+g$)2[I 3f~G{ $%I&OoQ HuHX$/TZڋUO5$KL'|ǔh X]{*-gr}4z/E_5ٲI5qy`˛TE|cK{ۂQ6' C_oǢFKs)[-wKBg:)$ǪBH$,"';O߽k YCڎq>^ Rn!F+$(|X["rėLa A HII_kg*1&BvSC9 ,D^ !B G;?%ղ2 s;Ln9(f&9i["7Dsq"m#=:!)Z;8$6ؠyC۹Na(Y((k$¯?%pJ.o|[`Xyl7*uWJv ޭ1,Ιٞ$B{H+}k-|K;#hftvb?F'OMհcI@) Zd!SXG6˄1A;koM&&fJ ve}[>cuU j$I$,H Yk{r/_û(9o^=WLy_Bۀ_s/X19Ń[x_"OI)ټ0q\.mc럠<ͷ}/\'r_kxbD]wp\* O +? |9S,G/_x Svx-oH$Ox1 bBՔƢk*+@(YOA3icڏ2iԇ.Aֺ/* hTM%kp[X3A0՛h2rDIn 秒=?;)Q>ثzs`SA8l䞥ҴއcA̸EwTXjv3I^0)OaW_l?*K%1~JAc[ٵ+VV{%y8&176^e׳j(,7L;Drۗޕ҆OҺ<טX/OTCJ+xf.V@:Ӹܹ8?{'C1;sx&7S$9MFsi֑u_{"$=Xjŏ`= ,1$Ժ[X8 t&aky'Ygμ;F:\RWKB=,o  xq9: lBCHk#Tl2׆lc#ԕ .w9N\^&9M}=<nj)ń)VHYpֻ@y Kܦ l {):5o"N3jxeS``ݧj̀S9e=|0DcnNmͳz6;V̖?zX\3iT@:OPS(M~ ȋ,L%@ɳP ;xWp0of}e)70sl7Ϥ1fy$֭k4,Y6S?TXH:#J‰Ě2,3/n>N}ӄ5^_t6#pN`!'Kتd(Kts,o.ymc`PCZ# DgW,\p =z:N6NfߞgO<08D%<<(6ˎ'Lo|gvE>֕Է_(m~=#LՈwFn"Mx>/ƣ$Ppp5:fV3@;z/eL8cGvz cypȺEXnmB^O0 ]mZtxWҝfkl|FA5=1Ⱦ :IGM}[y=j : v nAά@e_~ۘ>WOW@49{{K%1aF"k7jIKV`cM-!-J' TNb΂&$9CJy/PrZ>8=:AY؉S=h4nV sm.hOB̸KnffjS"Z_M!r:xTiY@s|~JZ05Z^s{c0Y}C8L)3'p+kC¬VU/_k\wX>6hz#?O ,,Y83yaIQ6ļXX<{ 'X4*t g\̭fTAhI -\^KU/? 7;Yŝax[!aʥGx6gœg3>=9N*+eXyу$%Na1 )9.?iCu4g"r5Sdze4>Klec}PH?қ6+UZ6 }?ps`U@[i91kاX)iIg+{6Eo 9WP>LH8r@aתQ~Te";A{̾F H]bgG ;UYD|;5=X#_r^PA#H>~&fŏ2n$.|HmfϤWZ;ҥI|x92v$~¾F j ŇB:_$PNy]՛dp‰6:kD:'*y/n߭kqqFrʍroiYxy|;JJ㥋jHJq[67cWPƕ^˶_Gg͞}gelJYWcs-g| _gJ?ڶ$V8-|-VNHaTO}'T~ yK*i'bX )}iQzyEc#xO1I`]_1$%|g{%_Aj7{`ttƝ==GɣXS 1),Y){ }*cci;l]ds|IKn\eg>e'q,1bp'/#oc!v=쐅IכڂÞ֞P?T69NIrG-^|[NvW~q%KFLl[ř! :|U^x'@]{og,Ԕ ZIs'?G,Tp?gĞbt + <^Y?;h"Ϸ={4HE5w3X(E+SzY?kqX)+Y`BҷZX0S&Dw{c@^L ]ܰW([\LY̰W(^B,\ya~ƛV k]Vܴqa~ʅ)=+ eC {-+ܩ=a 0`@ۀ 0`#6` 0`W)#8 0` 7 0`1Ƨv([ySe+ {%-- [Z--[Zkd/XeqK`E-.[\V EoqYi/02 0`  0`|L2뼉n[#Nןq<>մu?ه׽>6n~¶t.D\e5OF]xR7wz򺩟bgڼ\7BW'9Ձo6.Z:L sb'?e^`\]hq%|>;[zw߿d)[V]-m s:g͜yYz-Duo ;O͆uI,2ƋNK0r9 }HuYS'eᖅ I;]30]ꍴp2n\gqT;KhAwQF% ӰQĈɎhA-ѣ%3d;( WTLg4k׽>CB,cj9N_IkySQ~-ԯθ/$LsvgZQ`V6 \.^O” ,4@t&O|q\8|EEx$IS1ܡ~?ۋzw,Y .`M(& $/$70$&&3 0զ\n˶$[jV/sǽdst->}[{^{^{u?Yv*:8~TUA%4 9^O6NLd- bw^w[:!R}a6(*5o{&ྠf`ѝRO7Z`zfN{tS8VzT7O`n_yVk EȺ_ 8WjW-٬zb +mgHԉz|fY OVxh"{n5 ʳ4񋧏lѳ8|>Gybg*e977wϙ Qsh?2$ zy#O407^hƿ>6G7UN}bB=ҡ >]pbPEc ް] '׭ZXF->˿`Y^v7g`ʞϪ7иm؃ķ>:ٮHdMZwԚ:TkD02f5 hmQCM  a ߿+,_JEاLbϝ:cyRLѣZzQDgNIE5&sRqA"lJZ_S4'cG%K1X\zEr::f0{|F8렀IhwQr\b_{ht֎M+ч>A1?%,V.cC3>䏕^\wCBM*^VԽ=D/"Bar2 I$B`ҒlQqt1S?Jǭ?ԓi"V-2.e ?f(%$Y" ]ItԐ3Ӓ)*T\ܕD%gBBMrP_AkFS5G5(Pp/Tr}q$h jGyq2!+]J1d#BieVdؠ-BYWD[ihpuk̚]/U9Z] wh*ȴw/ ]!6ĶĭO: N@$G/QKoQ]mPoͰKf*/[z۩gJdǷ*P?ZMn{d1G[󾰆,3hTE/^q5'q~[i#=ϺzOV-|m RER _PL*b4f?3?MCg ?ʳ`}QIWϾnLB gw;:@r!X2)Q Rϟ֎1%c':+-2P%N,opWD@viZY֓4s9ôWM((%UJ!MсJ/jdv;i%1=wGWdYK FD AOq:Z5n|)b9j4wۢWDCQĖK: c㧸d|' xx=1?Eس1ϭb:t" OT|.j  (npnL]:?hq ?~ɣVQzOGPh JϚ/گQ$,@RnN^-i&,>+?V?ߩ0}BбUdi1 evu1AeKi{Hl{ Tf­Xgh_OB߻WQGlv$m dՀN-9sƲ[Mn ob.GТA'Ydzd'l ԘHԦlq~>5`5jAci!OB^(zwΚǬ ;_aaТɈ; FTC{-dH6L kN"2bEyyuЎaư^{Yf2 2#oaWvE€f=zܸ\*ijb[#ԡB Jnƹ18G F|8PU<*xd1O8u-߷az8/epNn餢\`7S#Wr? Zn*p,mv?@z"}sOkk-S U#mN kG+=2 NPR W?(M t+pO^lphRYR0r%x/IȌK?1u *ȹg?iFLa@Pd|jp*~kY_J 7CGW[_bx=/2dTh@,D pjc 4wPU$"\e'[uz9L8{J`L./F*hD@b s%.lq( F߹N9gZp!%{.3:?AU† e0i@Wpg('u ŀ&mD;8*?Z/5m'f>ES?a:?4&x#[d1MB\8)qW:i2eJPX*]lc+?P֦ACZ E>>E@H&NTЃ*稗lc2, S#©k&Y x=s }4jɵw\Y J*S&/D֯U )*h#xS72+'}_\sTfς xaO/@4%|;SGA2ušZXb3kC<с@k޹ZJ&`Jx~|0 lbhAƬ ~-C%lf^z.(AǸ)>Kݾb7x|[~hЇ^ F`b0JC/G}2^F mhbL̿9Pt6h:{/FM\$fSUgTTqO1ꚉԟo!y>]':4X&yca^==X>lj#xuQs}Q`z)Oϲ 2E[ Umh{7rW k_)"_0"v`gj݊GydO#IHuoXUh#y~+xj`7 \$NF|:Ԙ#Ѥ `W": T'FzyS2(9a0 /<~ܯYSbd+2%GFC$QT*^psp!)Y@Hȴhj22tUG/TU7ˤ-GT-i ^Tmmrϭ~0+@5jd2_ w,P%RIII*טAv<>H#ڂ>3!toCXR|I[0؀}5#=y]&1{2[`$#srM(\.Yӹ#_f/*XXC_dʶoz9ـ`&>bB}O̍ PlHbHuM7F>8htVL/P}mgNd"4hhcK9_Nu!j$dN"%c.KB]~a8ϳf9o`BḥYX )W~~%~zw::|RdVoA\35YwvD Ni m!cS\Hd-/r_-.'M& ,,hBc(jS]!1=vm=!W;:h0S4*mlTZ9.%0cի=ɡv饼^OaJTAmh2W\3~[ zFϔh ɕ/t)z͡| GQnzĽjb/,LHȲTգpuB -S~@%qj<ڨ*ps@q"ܥ^v ]5K]$P%GCLdu%:dJj% +`e;"g[C&pݤ7 HyT̻6B";$)I(Gc/8. ɳ.V\+b#i씱$QNf'=MNZ0Uyxv9yCMߞWZ_>ދ EGd{pK:I7חeZLz>>g~ 5Ԇm|&5*&{: @wnd})Ф4輪ƞ}Z S$hHaְa4w-mN9vYq+-" ]{4$] hLd Խqf@?nrOڱ7+xr&7`^_|_)f~`QŽVFߕ}oJTem 3]_:*VWQot(1PHϕO-Y_ˎ~]/}b[ZUz$jAb^xyGAlw$\"āsЊ^>LyH {8^W?zr}ޑ5|':YA-Jfb "1' d),\@-/h?#1:Rz'FpfYޯh=6Xۢ"N1r^=O'v{~4n Lr)1?:s8Áҋ9+"-'P%]U&^+"R rUЋq9*'DhWxݞ=,\HP0I`O$RTMLTS?j{mbBĕZ),xɸmO>),_2AW9Xbr>ܶ A NsrQ`u>b\qGqGqw#8#8#hGqGqVGqGqGxD;8#8#8 މhXW?-ey.)-gS?eEc q,SD\R|WIH?RSy!q3@syNj(m~RZ&㎛xQZ#؃uh15wA'ʠ_h$<:坵IOpF\3u\ DCmg]j ydKCRx7H]/}6l^9슼dOޛf`NػL>i H(Jg<[yy5m/_9l(;s!s/_Vg%_>pR>3xi9t:Å& R|o]oT?~U;)oT1h]Y Pmc3%4\ޏ|,BT \ >ItpxCm-c\ ^o~اMq__ĝa`jk+okc}bJOLhpgh%'bϫ9ydbe VQni>ڻO`9 >ɞZh4.lMMU,\ ҧJ_Xs`5?k48U%-ژ^?NqW;ʠ*6 7ƉBvv(\MtC?}:O8\򀛲7]Kgwַ^419!U‘7[`zNeNoG%e󄠽CHP}Q/J  w-S @T)s.5t\7Վ^Z_^bV-_=55yJ *gSeZeH(?Oq]_F'8n4z:gv*;V]AdS-<{6G5V?4=n5h_ʚP{Kx[v>`!;MxN{xiidFjl]GnXOy"l^S wӃ={xam-W-9Ia~wcu,rP:;VZGV?R8J^,ʸ r%3 $RB(By: Fd'_=PZ8phɴJaDڴ;vԇOL,أU E_Yy_tRwdD_ fTK/+0Ja_MΜT;{˃M&3LKA}#zFyliE`dor^P}vESKE4B%urԇ<ZLQU~^? Gia/}t0+:9A]hx+R2 |._bbLN_~}FF1$Ny,j=9 ]f'r%AڧƢ;rI5~ւ1 H ^mf GZ+%c҉h"G]H~)B/:n O.깙- Qpb ùŲO֯%".7sЙȨ#Pڭ F=if. ?XE:I@2CF-FkjfLS{tO0QdEOf'*5D%f*$y P1mQ9]29kd3Z#t[EQ.N0c$cL-5r\+^s*)EuN".MILO9:d$-b1,e͞*47G97&Uh4`d:=p8dHhVOgzmpA~W $sL_ ^ij>S|gy6x&t.q:dMwDkP_42eAe>"QMn{0e1Y[χ}Ao_և%cMO"Oi$$A@+)=]]Knţ\ije:IE慈ϛ_'PZTU*@3Ǡn4J$h0^toQNcDӾ$w1W0zIzjm: b"n}tjE! ɞ9QÂS% :Zg48* h˻>u):P*~mt4.y\Ěom 4郟!)Y]>v 8ye &zۏW0"qQLhŁS%pVN)*Y":ӋD@vx1u#` 8=6q`y{/'?"U]1ǭb: bl'*je~ ŘӐ!{u2LlSy7Ge"#o1XS+"rgvi=% + [R8Vf]:?06e'jen#wM ;NүuedZDp*AðI`XӈttwdC<of4V zUШMq6>vv,ypA[" .tQ`o3|T@]SߝOy>eE׷-&)|05WK(;O%vd=/7/sTiF0=E"mgm^2l|#əL wMcm'GO7t6r cdX˖5'? "Ɉ; FTCߡ?o.3EEN;ߺ@i@( gփv3+2W@}  - dcčݥIUե7O᪤l0)ecPW Ϗ2?D@j0 N=ЉˎC KxfcG?a[+P&1{Naz=fw8:pGN?F4EEs0|[_s2dvr Lٟ7/|)I IT-&0"Opck?~cR22b^1$JBDE_-qa?æZ ᳸ ^<3&:RmL)V(ĉ WFCz2<AĔ"m y3,=QǸQlobËټ5@}O4O_0T&vv[YZЉ='DX{- '*Ѓ*r?UZ QLnPۋ_ayndII&A!,b.먗#:g R-u 0taq!b[V33xswr7JaQ+^[-gR}ȎL~Z w,ְLV og N[fSfHO&)ţl;~Q G _ka}[~m(':okm2W֭-8zc^TybS:| xw6Z^@V<|!U!k%+Y2mwQ&1˞]WA4#sղmK-ۂFuch<hҙ?AǧjC!b0i𻼱GDc/e\f^,sldh49{G Md?~ށT WD$+?eHKQ@҉(#24SQQ)5Ê?F^> ^ 5@aɓG?̧gٺ2KO:dc̭6Ƅ#HeZn?WB{{S5돘vO&ي3'_O$U8*SMK#~v(Z`ϮJ_D&}¤^ y!۾}?>%۩&Z Y>~EmL'MOJԑnRpJt೫FǑfhۣ15QZ7T29KF} ;7(LY1t.1˄<,6d1QbGm g[exiH\6*x+~*xm8_wN34z# '_9C>w: eKx^N6 X9oF/Y`AiT^FϴC'ڒHfv;m|pGѴ12} Y|}>Bn zs46.qL ,nláޒIs t˗ٿ#6G/z}kĎ,sn]J ? &@mw/mw6xCzA%3w ILi3P0mCY07!{03jF_9G4 evN'csandr7Nu!j3r sEys,f.['0&8}*3oMwR'u^yIW~nA{g8. a_[[á[(̑BhZb$Kp!WT{ЩDg *Dn+XHeL@uXLr zݜEݔH,6q%II⡗mdUZE9Y!?5uDz3k MjG'G̘:>vvtsLh.UdAy(Z8Pgt)6yAu{<`{Jˤ_c"Az5ǩ2 W+1VNL{H2{K`b1FWU~&Q׊pzyoW(k^b"-\ 2Df]'](ex_Mz ^8_p9ω54w)>=ħސ̐ Ip#ČɖϽ}jI; lIa9$j@ieNtglr/$y*q\Q1QP,pTYE]~1*8 ʓ4a#_W~_bYQ򁝦FZޯ2TRzrsַSӪ\͆\{sF]koqn^h/}Sqa/ ptu6_ui 9Q!]s%%)Rk 1fw[U6EXI:- c  ei\?E/zL3E@bÉGI_?ʽ#k:xN Z]5Hj3a-h&!Q&#O7J37}[GDHc~ȽG`ǿ9,iUI QeZpƞg3Qnd^k?:J} NDy"z?o觼oY}Vkѻ&,{7]M]\Xbu\_++W[RXq} V?rʸ>V\"A+V -sr:`q}V,&;:1AWAqGqGq8#8#8;qGqGqƯGqGq`#ю#8#8#av?mۂ`օgiVgi eqy2ePd(˪xAP,.,.Y\CY\ų 8#8#8;qGqGq@wዲkD 99"^CTQ۳cKŒs?aC@y!0:8kgF?jm42UiS-џ)<DZ,V~TDr^ ej0u~>IYxԫk_w} -9Aֽx{#$¯/;4m^v|>@_+|1{G LC 땖"Iƣ3PYˋ'=/_F5:<.c _!ـSS0fO溛f`&S4}i H(߿}!y[zxiںokcW7SԟcӆR3rXcبYɛ/Dn)?a^s$0E.t,1bJ?]SǺ7qΟʃSzQ}){ON`lrG oQԀ[&irK'~AE7CYW7⸾_~^Mv{3}ιw˲e7Wd\ n  d7aCqCl˸*dIdZ{+Y6e3<̜g3S+RHeή.ҮL|gL2 zv>|23Y6MC{ݞ3N^~,']ўMn^J~S"vb?q>EfgkKC) r_'"2e9A01qkd܎v\kϴ&mf.Wd*%v=SFfWG'V<3K%Z~4 yj%1vW)bSS qx+mˀĭO`ȖC<ŋbK㉟eYAުo<#)!B`+_^rpNDvo]nk|o:/na]M_q䨳7I2Q^< "¨z 3Y:p lҜmbhK5 W+e56^^ ?)8J2b[yٞ.8uXfڷ(N7Ff!@g}&?h(oGk&V>%2ĨwG'7c[}>Az.uLk'_9p;8v7"BgΥ%ɢva)ދ>FSdx:9HcJ@lb /g[ ǮPzsiV+1 '0"T z ivw3wC`|o.9㓤jŎ?A\FJ GD ^>>kEś?_Oc~:}5":aŦDtRH*4HzO>%| 6^˔Qᨺh535;^V|#J쬓9!5mf s?8_(.0`#&%|Z$ .I$f$]NYu4̴l҂ Ӏ"к7xp)"XYE$)Q }|N)2j^U[3+ YCew?F!k}-KRv눯C/hF*Nҥ)$ P:G lFPz^o$wh iq N> Z·Ҙ1Q]kIPzu<]_IY&3t` *&H":'n9!<|r|q0@V3:n%HbWoρw(e!-Ë3["/ Q$z#j8=d:4i@>z!܈X;VGe'EOOv8R/27qy'&pO")+ nJqO &QO]ӛ?qzGw@s"%x;VgGsamjvvLdXp* $$`0J- IXCrxp`%"KAj@Ы>-N T ~03YSw2Ef2ftz " ˸j[8yjho6]^%Q^e7ZXxx8&쑤cGS0j2zkqP~8)cMz:E:"Ο c)>4 dČ6F3~'O|2uX2A0e=,Y9"&Bo cI)ZƬǂ&]_̀jHO>@Eޮ73'}~61oHyyyQɊٝ{6_Ξ3SMpeF@±u\ ras1KmH]YyMd*JQq'wUvToXJIwmC\0(1}cզ3fUnj?| cBKsn/f}?Ŗ+2C)! fe{9߉Ҙ^T@#g }gL.bvN8bJd ?w}ȓRmg~>m캠$"]yf ;v*wC AF-4*h20oD&-]+1?lV㎡;-ΥoGC#!ʷ"69 0 fZ^YIIba>O~Ab>-~i(Ȥ2g.;g-o>>Gop`OgWUh ]|e{#XOSB-;x]BA1hy}Ewy}GEO 1sl`i 30^KǮIb̂|[ucj9N{\%IN2& Q~i4""D oKd+h`cob[ O]Gx[LO$X~k)x 4_TyY_tGzm 2aCX 4D*s\3#Z6 'D $vmIPAQGm['O %`3uy1Dw Sbb["/( %}<⚕;Yo'S׍vx oRlxѶ66 dcrད- 5Z]`Ev6&FݰQ-*2, }d S<ȶwQ%Q4c|2AUJԖi'FEk1=6ۮ\hro8kPxd$.Eʉ*-[" H:GF} ȸBkv|L'l̼H`FZ0|Jzub\dK -̻¼qxd`qğ+Md-#$crϡQ$TkyChv#n6cis\NS12`42{D7Q-WKDRm,sNuHKl?׍E3aLk@JNeaNkt͠Ȩ!=@KyCnq\2ty?OZS;r@gelr'uA̧!릹|ޙ,[6ewN`M$}Z:(vUp)ҙ(vΜ8$+7jFG #,5q& ߐMcjz.6M?e;8ep~n=>|1QHLnkgGEsCbϫm| TigϠg {BA 1h)gZ'g#Q[gi-S7SO4H'ypYpt,:fS`5<񠕂\;QvV?ȅȸ<]-u!EJq>?7љURTl:˦] 48J. ۫x<+!Q^,& Ӄ_,1Oߵ_DT[m+ܞCИ8F`[9iك؊ǰdHd_"l1'i= eh[8Wh^+,b*YK -f#iaJJm6CPύQ+؛"Z%*Uv^}KeBsI ?kއFfB6=]$<Ș.[1z{(7Wߺ0d|k PzfoINǧŚW8-Zq`yekT{Ł5k ˗RVZ.XR`O?sO XR=˗"jekߣs &PB *TPBuUPB *TPm*TPB *BPu *TPB  5B *TPBupׄ#jH;)>EcV^q`U䔖)-qae䔖SZOGNqY2 X9ezˀ`y5).eS\ ENq)UOqm*TPB *TG[ *TPB|tƈ,"LKwYm{du-zDLʲ$#{  ߤ_WF-Ja􉤦)X̚Λt~; ~@)_2\ۿFv(V5/bs.|r=@A${Aj@Ԑ#r >D '$-o+Mr6+ UY}lCà. E.ZJd~_3a'b.tE%TLɒǧ8h$kT pM{G|ךIOp5JqMGDmT;+iŌՇoo 9/Ѿ2=$Ngq+c)vN-HI 2qrL5w7Ht\:s՞1o5v_g?E8?$1yL׷#<:Ir{8-yPqeCTdqSSy ؋dmMED xBOL]<ɜzg/>;nW+scgI=j42mQ]tn- }2syd.>{'{+RHQVӾdիfDwfsWS w\.:-"! J'^NgٹZ:C/~FHk%$]Q;&oR$~L* ѠLgf/%޿Wh 6~DW\n'zuv}EZX;/=ӆC\n7 "i6] v7*6ww/'䨃nR %c|?|aJG~5|NJܑNeo k_^RfHXڋXLd @QJbh'Wx]h 7üODěf@ix+6[y{9,t_®6HYgʋG>A<~67 !f3ՓU]͞VnuY_NZDQi}l)/e6N|Jyކ"Z{dKJeC_.lk4"g,{>Ξ3̴ (Z^Y}s@kM-NIDQV7p~r?lgϿT{Eܛ)|_־z33Y:p^͜a<#9x|6ϣ JL{  -^vVH̹SףGͷrŞ: '7fv/_vP xz8'<$҈:&R Jeo׆gT}uvhsJǴ%ΈyȟB(֜Dg}&*>h6:H9ck8}%RD"=.ҳT:~l%XC_F vo/?H>!@΄,Gr{5z&lQ둿!x9k|:OTO3TqL/Q$R-~/H$3dB7h/-Q.N GeG#eu&FN윉+ |Aנoҧo1G =`}W4άȬ\iqiZ4O|`HȗǐbN%WPna\LHr閘+= t C'#4Sܠ79˺TO@Fح G{Auv6N+ULn'F G.GM[.ٛÔ!xČqcfw(Ko|ך}0fŽ(jdgQgbcvx|ü^+v]=9La6qmGlo̱1BR2z¢%{a}t&|A'b:.P\џ+WS-J<4Hz/f{hjcsH_9;^|}h2uU]<3=N~1h`d謫U!a苾BUm(?u3W>vIKzZev5tVTi9:,>g=dm2#E huL{," Ry",ff˔dLKLkU+d,HbX|_$uJ`4uX3W &=A,.cη`i _G#Rs+_E)z^v6SvA/hw&4_Z Fz!i3i ؂]4&F3"h$?U[_-/.}N{X EC(vA Ύ\5AZNTwt3(AGo, =i wUG> A܂[Ig>Q!W9Oё;"] jBw= 6#(u#=UQM.t vRE&20hssbmw@rt#Fl8ϥ+אh{ZNҘZӯoL2}p+V]g3EuNr)b/La223ppq]3_3cz2nY"xUpڥa^M˕h?!I5dt>og.&ƶ)Er'yA?[ީb, iPM"/ R$BG,jvDZFD+d#<.ڂ8Г CAĚ,QĠh.(KL IDAT=v~_!Fڝ7XǛɭuzdh0_8]FH56h Va{D0H$@VpU9y΅͟Ӭ5X FMoqeaigss.%۸LWHrs9)X-XIA1$k]swӧ+8XB3h_x fk8t͕uKʴ t(!\ ;׮iR?Gu8nC pek"XueM☤&3:g4w{.KRwށ4|-EbGY[OqN`¢iWlST &# 8h*`@;C NY2lLZ8ʅdly՛OLLA< GqD'`23eXsD|M 1/e }1IE./%r\ŠcnQm::7[NKߪ 6̂1Q|j\^i.jG4lu;;=v.5뜖 V#"Pܵ_d0B+17 ir{s6l]PK;k4&R( ~I9J(:;J Hg0d9z{F>xĮF,W.)8Y%2S=Rjc 0!_9$Ӵ8Gk*VWO{׻> Jaqv(;8u2,wz> /Dƨ)LI" K,`Vu0S\mƯ@Q&DM;z}J#` G.Y(1 Hh>11mp׺ɞ8i@2nv &NKԃҢ%;n/ihoW, RR7gqĉW@K/*\Z$wPnΔ^w>Z7Xx*'Dk >/hY0R30GE'08%9᭵Dg7~ӤX2Ϧ6qAID#GF[(rRuz0G?nd[r"y> p (eJ/.*_,Di`]Q3K1wI( 5T}e%{3X|}x[~;$c1fi:&;ΥrWC%HmS`#0?~vA&yuuT:Ő;a[>=>ei8ɍՋ'tΦ ݵ9 c+U=ӽ>6UA?tLK\ (Si 'H-Z7 )of(ߺ'aCo?)pd!|㋹)9ztB`7WQGAVK_wU9G Κ qp3ς-1uV›xewSL-NMWR$!Q #W};_?Ykav~&5\2Q>ӓg!.yHbou,`:x*kKY Xl/ .SA+eˆ!y(3i: 6xVDr,~e+n\"EO2hm !4dC5+}w&\ R(8(Ƕ;ʰo'S1/8S( 6@mn.,/ 6#`11}R/( A7F)5פn;{ ;6D"pexqmŧ0c׷E~[%w|_L|păb0u_В=3z]M~Ñn!+yk (lKSD*taIh&pCZly2=Dưa>wg"O|V3ntW>oQ_ f`f®s%qJ,Kg&8i I1IL3çbqF(*3fGL.JuЙuB4T95fZ 2yt bʾ*-S["F'iDwX lm { t ̙6.oB,?; A[A|o~j|rl"pS#.Qh a7v 0dF6(v)g[{zO4[~ wF}om3uUm!@`/ۻ'id&D6KfvK0@pu~z~&]TS>/ʌt 6_ CK3:!@ ]yw|]:>Ø/RyN2tF%kKL0k±莂͎m!o6_ s~d5ȌUhdT#?^lK9r[$=ȦI19i9ml绦14z bXbϖ!Nmsz},>sTlAk0.d$9-e8X.,&d6pkๅG"\5qCCOǷ7y3uǍlF6u[B4oQtMe/PDpO5>.Ξ:Nr^È ]>EYܔo %@mlq[A܍),qLJ [7<_{[mIPYNEcG>k-|ޙ˲˝nɝ6^:(v﫠w픞6$ ga/c{ljH1i,8vcUN ,Oo{볽dNTƿL"eӑȩh:#I©pJˢ+ڟvQ`baX9;89,Cv8(9/2ulj|Lyrmor0E\z0B6*g3wQ!_4sK*C[-`*=.'cdٻ:{s_5N_Y_j>6i WY3'~tw5P"Zz?et~YRW׽F~%\Krv5Cwk-!җqWp~ y +~18i ̟VU&nI]< ߓ~Fͫ/V)EJ6Ek‘okJ' mUVm'XFWXfUOZ.\R`V9X+T{X)l]\`U@e=j*TPB *TG[ *TPB VB *TP+EQPB *TP1P#*TPB *T\PCq`Ue~)-Oą#TOiJ=e@09cX")WP^?EnVud^]~O4Rc <7p?%ʤ E¹ v G^$>[K]%;ؾŞRE.|-%~gKKf}d?Y{Y=ֿwȸZ׃p*l*Æu`MH=G^zei_Y|tB$|\Y>%dSljRHB4:O 6 :ټ(94!2M&z~?ˑ:?ܟOj{qԞw>c>ό5Fo//oY/ #7>:߫X"67ơcTlbZӻ^ L.・#8`iob>M$٫/˷.V<&:*S^s~g L.?YQ 5iO0żhD4ߒQR<ŧ+t힒zb2 ~:!Yˣkq_)@R.{()iyn"D\=w}>hbGVd62EI箒-se$SM̜d7[~\x& iOӷxLR*3\b| `-ĒY2rJ4Qݨh<'|#ռO/,1c\62f2( !gęg*8֨ ly9^rGk`ҏ4oCb"K;:|>4%;ٴd5dQy4"-t_d,J&2J^КRb/-69T)K-~y{g#Ld 9oqٙwi Dvoe.75iߛȋ[8YֿW(|kZlB!}OM*,h<\.;E<`>;]HB?5)?Erx:/L;+[6~AqԴ <>^J{۞s1{˃T J]{~fq}ңΊ̲8V\dvߣJ΁c[Q#˾{#NY5C"rȅePZ.0vmxfG>K}:W.JL/Nl /Ƚnv2!wiD{O vFA'~_é}4%lIc@=JdTS椬J%% dӋ54zfg3F+μ|-yܴ84X|vт"  -!H pP8Wf+R/Br/D'#`)-B$'0(EIOFLNZI=3xl$G@kuT>6E')ӅOtIN?8i.ژQ4!2N&G$V'x Q v[cFDc&\<݂?'YT4ATrB3G"s4KF^A/z8Z-23?!f{|1;fq^iY]/1zl*DS*2<I˳3HJˡ fbV{[.7…)ĉz C!ܡ7kMrG{gQ2S-: Ǖhර Yp_uXS0W2=k'^vZYd`pD]XeA'ި_X|qGEQPp;- )Dk L"IAQ(_c!9@HqqKz/ʠoථZ Ev%x@ NzQ TjC+ $TեyfFy~)zvj/(bZeJ:m;-c$|~1&R.\^ vyOKrN5D,8眳}WZb*-ے;nĦBK ɅĹ$'$$BB fpH-YV+m=Zͫݕ,J>оs;sfygΌ1 Yq Mux𩀪Y>4$2S V=FAQ{KS|8}f/H@M 4m8z_~+8k=!7цvNy88iyU uF [>_9φYtYň?J63bDI6Uq?̭*V7H֎tr?=,t<=lB/|8eŶKWUbII?j #9&MMQe1sY7N>@B.oY6 věg#/8ͮzy+fۦIBgu#Iܟ!It[Ul b C|ܐ!m/y4֤-fYU)/'KHb`m'EQ(to%Y8!^Tw϶RՅ/x6ذƧ ':u^C|>L_^AMORrH)Z/ęXt;hGCƜ9d3F œ|ʅ78.3j[[is'-?8%SujrcgLZf ۫.q-_$U=әS^>cc'(/ WnnĸVHiL+\F(o>`M̌_Cy:wRYӽT-WSQm%oQ"QyBl;:Ĕ, a7z>n#g7s%i>mObԘ̷04}'emL+M\?p G?#\$} * }ob7W͛Hf8" L#rHSed 8ZcaYqSܼ{yӈ;tnOݚG\ihr1.n_ɤ?fDÍ`NKQ^6tt08okZtR%zbv YdkgmRpu4**Xv5RĎ)zXWb#FLϹzK;h23MlT;rbO=3N&vnQ2Ug`PA z#* 'YFMU]w2>[9dsA +qU&[y\}D[>|mK5Srȯ;OESlݔDvmdV_OO[=U)<=PĂ:{ɗY]R2 tISѧtTUq\O'@5@}7UbElxqV= mbL:~J<0dz /1PJ{!-D'ض$Y357?h*tzF4VSd0.cw8ǖ>!2;$-~Eܕ)]Z?T(ٺρsDs" 6_)yn/Sj~i`L Vx1xh%VۃXdGs#Qbg)$F%WymGth޴^`7L.q U$ݢ.G$g XNᮥ~vHݛaH7.0X +ZteZZUVxFDܥ9/Oǘ{s(8y7P-FL~d,HZaiK7.D]wB ӻ."A0KÎZ('tr84j?`dE˒@ž.btrs4ޏ e`E.#8Zw?jW'c %]1w4CҧQ\ǙMqAGÉ,Sn >]qQ-}n3s98w0<*b}Gͦ|YW?iGnaw+ Bx}A F#A9~@ q3,v%ch@YVDan\3/kBeTNm>=Θϗs-pR0a@~**Z)US|8d$Ds 9w}kjcόXN:/tj'ަr~A5HC^ݨ"Zx](GP.=ğȟZZx{}l@71#'3X$wADΊe!G[ LXDM\Q@9f}QW"<(lG0 SYp@3.I.NE{)ĊYiIWSɼm̸YC@"?bgj{>?'l^F 's4zqIݘMulrPqv}%#%;ˈI)Lo0}:#&; S'R8^ήg̤-Gz($ĥ7Fa_̌c2OHdLF {—?Zh>n#skdnNrT|ռתcRNZĭ ɛt_}sWsߜe̱Jd?gͣ@/9X~@ԟ`3Gܤ!U]GC*jgrCùqN pN6|5\ߪ\ڋo`#R,}jC%"徉LgC/Tڻ>k<тS3+&k-,ϸ k:&\JY=Gn2H`D @.s>2{94Fv 5ਹӥ?\;ٴދbG¸A>:xBp%Mu%ز,CJg3lJŃl>#ڪWi+WV (|27,_+SOv2V:TL"nϽQO0udCfGԇu>wTt+~ _"ϐ_qvnĨ\-)1'hL~64Y_{u:8_]Adel{;3 lhh_U%3)6Ar j]{GpqBуmS0$pm(_qX=MIJxs8t`'s%::jU'hOC@?EJb(]oQXx7 Fw)*\2ycLfdv9^?DL/$ uT9dZO2(X$6-3jeY$k&sE@gh͘Jn ~G/v_lV;{b̙ܾ~?Hڼ+׎*jS;ۧ]8֩8Tp߼t$f7X$Nbt367)]=[j.u8LI˲cxk鿔'rǍZ-?NYBӁ2!/^EYX3N$mQ1_mR,b'qHF >XbwV1<`#b#uwhv,֯~M`k_k!PuyUb)-SZb)-kքNqyM;eD:t).GS\FBTiBth 4hРA A 4hРAÿ]cr^/q+gY7?g [^`I"W !SzCyJ0* 9"Ipe,1D[Ht#W?a;']o *^@|:T?fn;MM;,Hiϖ?k}H=&f𵩘E;l}.[%/j 80󵼹Q{ǵNBq ooe&Jd~.W:0J"}/zDida󳚹zcWm]=7mVϘ;>kJ/ؠcW":7qhk&ơ 81Hivc/1'?ז5g *ٙT첌'\ñmLDe2~D,Wr$*I( J:Uz9j3?~:㲙@Lyr|ŖS$sڻs˩|@SW!Z~ 0XM·}G?&(8;t>2EmS~3e3)}@D/ӿ}?a^E/_P6`kB#0eRHr^.W15CWJ$S=g*発u*> Af71`V /ws oISxx oug[e] aoU|ϥW_K |=&?]Aq!w v[NqA r)ZƙTڗ |P]ʼpK% |fʊ0YzI?*O^*.W,T=3lFI ]h 5}EJe $X!7U$=o0}'KԨ|"^\HSg/n;I"­T"cH#͔7Gjs45X~@`+kW4Txx:RA/''r)tiLSLc׿o+8v^>0/|2o_RP{^t_71ۣI| e>8y6s>wSxe6Et̑}fngos(.=GCdę2~ݨ,?́ZBcz jqe[Z:{;V?ƈ-xlp]/S)~ty\5i#4Hq̦op.^+l~[l9?@*Y1;Eax !@cC/-GNӶ7d5" SU69yXgŮِp+غss Q@ Svq UZjNO)ʇ˱*U(z/gfWc )wK-/Jm_ u*C|a2n\JUh%sU@⩌V.lu>D>QU9CS[N Q :S:"=sdy%m>?stk/>{9fI w(tNrgRT)lNgtI6hsY~g.Wg}q.W>J > >~!wRF C p!]mU:"J2iw@džo4)sI?-!> ~V UeU2'pS]g'LJ;h'"hR^v[?65u%G ypU`P"{T k˩hЬh`J7P۽TQx{V;D} 6 zП~H q$N \k @g$V mo:z"Ծj`O(q5Դ)aI/j̜S5t}T WFȲ M<fUE(>AOFFzcQiAC%qF?R18N%80{ \dGDC>oCϯ{r E}ϟ8LO ~dtIbBr.)&haEB[Z2S>/]HJěEښ+Idf7x~+fss'=#\\SRϿ 8Y,Hxg@Z1 DeL(o u7* t# `I,*aaa / IDATux^sጢGL3F&L(kwL>|ttRa`O0Lʟ4Q٬^V~_kj )V m$ G:Iu_*7 '<+#2GcU*Ç 8*"DL:KfbLvƤ'0_큞bɞQ:*"vǯ8\褵*qh~s s2<d K`!]vG0e]28 @Ѝ{g'`0վ6~~~qϸ'ն q |ZOs:@.,G:@N} $0ȶO&Iηt9oUɋU`Yh-xʸBO$W5<{[/X2H4ʳ5$]6 G<6`ۇlvz+fsm(3[I:Te\Aqe4]Lxy |>Q?sL`mEaCP h xQ`oUV. qqA]>̞!xcΗn],Q<[t54ؽƒt$1>:=9_y˝ؾ+b̯k60vzCrL=!{tA?rvA;k<=3ϷSQa Jʳz f&0fFPiyÁ+MvUvLRߕ#?)g7[<8)SuêHa#cҾ_*6JMΙ".z&?* Hid@QPOa@2z@].D=:OGv,0ZvG?EoqWʜ,6l1d ,lmgYH1em+%/${

    3ܴ,~dKgux W9[9dc RA!7[ G {}=mGѥyW(z +u4oul?Y7{OdI,w'kِİJCOGɀ4tz^كkܧ޻-mX ٧m|}W='(3Vq6dmK#z8VgywD{v\SqWR@4yH!.;FZڈr1sTP?#Q#Ovڶ8g޴,,˼y.zlVƛ%+\vC z`0n~W2pV˙>Ν#{?gBɳIv^s]-tB "=ܵv*SUTCPT:wD)hmܭ26-D2UJxC ,ͿhtXqVUJnU)Zm>YSRҗ |}%{-Q|lߨ"X̓,V'4Fı^`(H^,p r*MgMlz#ByJ -l^)6&oEO<}>PEě(Rq" iA$4;`0ٙL~|~NʄQ!DaQ7Ǫ/XO4{G!F^J搣*@^;cr3ҙ͹2IK+z 8uf3xNYC?I}T%9AaeI&/Ӻ+'Ig,ɡMHJ!+|wVH6WơNՙ )a8QS8^@cGi sڨt+,ˎCt нi\cdu-N_5[Xn_g& @τIW<2gˬ+y6(e!{f6LO Nɟɬ-8Kym(r5Ʀc8ῨdgDܪ0OO5#U)3HS?T3X3тiod@ 8xcl9ct~bTon-ew(j*;kK*DXԫ[䷫.2aL~j"3 18#ںbaQ`~[72KGJ#ܧU _KuTnZ I+{l>'lT1f L;G| \g+kFΡ`dŃ:!N3O Q?-~~ V`_2@A/M(~̉z֊IŐ.n \= hX\[3^ɹ[RX:'hOʶ1wdB'=Ⰵ+~EE&{l[ 0h~<ӆZQ¼81Oڊ[n3?rѹo{_MfcqgZ8Qտƪ@ƌ;g XnaNNRG[jUѧHxVɱc!k ABre6$ m/VQvs%t'.pО.7'P<*=8{$#_Qa1^=IZ9\ٺ(ө*Y LJ.IoC)'WjOUx Bfc/OWR?A,U uBn7{_*ajx2Agk(( QRX*_8d{I w&]q?Z~1o(t}hzϞ8bDؕ^.,6S' 08OМ2't[,ɓ9%rn3?mΩ{^|<{\2Y4ݐsp`#)F ׉v5)H $pǚ?wFQLrјʵk|eic4yG5NC%<8K')a\U{ѿwtUiӎhkL_C`͎k_9Xj`ǚ5{?F8vfku4{֭:֯95hРA 4hР94hРA 4h 4hРA BPUm  4hРA # -A 4hРAÇv,Xv>CW X:y픖&tJk)-#աS\vhNq92":ťJ;eD:ťC;eD:֠A 4hРAs5hРA 4h@;s\cv^{UfC^'x=ՏYؿ9&>MgH1˖?,3>Le -*?XHػʢGesnY]ѷh 㶔"L3UL|)h]koQ/L^V0@p'#O_Uwk <cT^kJzCWOVcH WxSqO1ɮ+} <k>,Y꼵=o3b* x8A 3$z¹6}Hp#ɱh/{N趗%rS[M#Oc?_^~V3S6(x*ڶ쿿 "l.}[N@SG6-d1I?v9F}21I+̱RUڟoj2td|54$٭n{ U_LML%H/;~-R*&YF lf_D2IQ)KJjJ (ҦJȝ*R`=5vP>!#@UӴ^xGs@bJ rg[Q|$$w&S@Oy 0.Q^E%Gz-|!1/#WrWH6'%rOiy"O'}׎_d>C;WB#0{ROusR=<7E:]X2$wG(L~?ٹKxxtb> m>kpʇ/Ԕ]3.lt#]%I R?m.k,!A;{mo*n0 1"M'#NZzO.{sؽQGюŵ7`dqf`W]8q60Y-IePb_oMr9XoA?]z6Ol9ҷ$|ޤrէc#kU$^m[No2V@՗kAHQY]{ SS`Ul9DZV]ʀ@3T 3*Kނi4!̫L\|~ lom#= "cכI|Wd=_2P e@CnU$=s6)~56>}T=cv覛X.ˣ^L\X`+~PCtQs{9--}>)P].$m&x|sH+AʿNɉz<Ϛ&o3!1WwtRG_O0 &;.e8##-!@,S014tS W K 4LSEf=% Gm+П|/Af4]n'CCCԺ .2*}+~m!G6pRYrUƎs,pLq飭sp{n`_/)G< #jk [2P؝ThbþS~!{˂):2 1ɣ c?IgWG<*GEJ$/w~UE(_Ϟż8F]4ի~R\c/ЩIh`J7gK);!ə9'q;/@b(᤭@ⵖ2IՂM{5\"}P}x:%'n ק#O M̓/\`jEQR6D]!+,lilFɢh$tQ)Ȟ>;v_ַZ|-RY?wsPnN4vE&Q?}![fR ukMHc;1cy(:(R(_xOɝɐϵN67&u/᱉(4=x~B4s&Sk0ElbGWh\s 9}> *wϪ8$@2.6o-i.7s ‡ ^zqge@E)%4qL Ӗt-DW+?ҦELS|td\%zxx~w^yFU]{w43bɖd!w168 ) (/Bca^$$@HVq\&[d[Œ%MaȞ`ޛ7ki{ϱ|c㡫*jMXg4:b TTK>2ݸKX.U1 ^u*~c$=na{bda$#‡OL9ˆ;u菀c8`/صepʽP/(Aa&;BV=(ۙ?QF_Bb1  ҥf)2~dFQgBO KN("2c%cՓOMtajs zd3*Ћrx}#%0H:><>'&=QS4?0X) xiMA;K +9ޮNdʖq=DێeٻBݐh EcEBFoH}s01faRANqk5 84Tт"k~"lV4܍L^bF zy#FP8aC?##7p~a"~B {aZv.0(Lņ݅GL(&X.~dH13WU>JfSd\.z}],c1 ̆>=OAW vK6[NζLfQix Lr0RY`+^o vXHDnp#%^\d"Htn㌚ aMQ? KKŞI\Zh^Dpq^ % 5ţ)LQbϐ^Mud+N5b)ϡeÜ1qpb'Tэ%Nyxa;i5 ̚ˍ摍L2 7yf#L4&8\aW;+}0#pyi/Gpd3m(3t.lۓP|ݎIDATHeOvAA{1Ș*ES8VёL|OnA02E:LEȤ'SC::1/) :6G`]l!jᄨ*f`V *Q졳-NyI75&/miV^u "4".K@(<>}c+JFBB.,#0h\*2-Tu_2ژT­e%ox& =|?ֱmnoUsÄCJ8&V /P::noI$d?}DpE z~ISoK&B{qE=ݮ[6aLr-ֳL SvR7z|!3Au f$];{꿳Ԧ4G^f>㳧s`/s5ownӿG( P F!?n> ΏxN> HuJ9t}iDnߢ >_̿(pÛq_EY׾'UK 3o(rO5vab ٹ\$ZJ|0&/8{ ;/V6SoU[ 4}:#%[o<9Пao?B2/o^`qϑPaڷ˃xc|0:=Jjtƌrx¤x@RǞ I_{ݤ+p ,i\h3PzI.lU@r>?kU:0ȉ|.tG5ʧtml_4UK>fw\3j-hM8Ya^OM;/{)_?ܦӱGE̱7`a񏪴/Qjfo FO#bp=L^*c}2S1asO4@eqȋӕޞ &yNa~!Nz7lU?(ByCJTP,#2xDЗ+!@Q%?gʕ2WCa?'Q4'!OE8IAɕ 8=[GV᫸,0IX $r1wgZȩYV.@)>?"_͸̭ Z|Sz3<-$̚#$= ,}5_ý^.?O*j,P$_و7!2!OtrۻxCj{YXZGw:K\]_瞶KR^yٸ6mYq?==<<%JM"!Sf3v"Ϻ}3M=8ehSѸJvf3ilLSfd".muyO)xתI6Q(Si$DMTeЭ !Ԅf4R{9imHOg;`%Q]#XFϋqXЗ Dem  JGB$"-ѯE߸7?:|` џ9|`$uBvHHV@yWG)B[f5p6ȑH,-FR0Mqsp8 (9qg % زR4f~)jš!>WX $I)EdžWtwAuJ̘FEJ@+02Q5L$Ÿ u|mڵ?+t6 0ueUzjx3lvɞ~|ue$"=Ezyk(ɓ0*2lKxEQa|JLu_*"z 9֙2'}ᥫo^oGoG=5ZRqBUBEnyFtNqG\gڙO (U<0ԩ'[J0c`9$*1Qy1-U/iEbr3Uq}hf>ܞ T 0jbb)fLsf$ABJ㎭(1Sݬ3r(zw{GctxVc e/IPx}uע@B9fPW5.5c@gUdt{fo^C)^z 疮slsjs rX(^łcLh?&Fi{EZTqbk?KlëmeEգ6V깨ZhL@W;u\RÁ|RFcZ9i <-aYE~'^Gy&v믫GY7ࣶ&bul{UZh/z,as6#5|UNgWVVg5Z;ahh+uyQ=KקGYgree^WÿT@wOIq?@?-ߝu![efL"/8y' XϣT~hEFo_l=|ºq{u 5Ğ$g .gΜPN tgx;f@F)»覛F~F?>`(!YnYx7TՁv\ gQC5'S#L/^YO| )դs2(D_X gCDL9]i.K3L̻CY8knB*^iIGP '||&3 +ut?ӗ"@wtn60wV}:J _6q9^Fݦ`CYtqCGCg${59~{2sA~69N)B"T?JJ6nQ4I`3ܴ!0 wwXjBŢ%OVhyle+M`uv,Ò)tx?kz7Rڣz 'ߟY{jhX^JTVj(?;g*[ӱ2u'?="ul9:>;dVu>E RVy X-9ݹ7rߡCtsk{F^װ0+deq^h;F_ȍTr?I\.S gXe^3.a#E/ pkv9eBU{|QWr{4-Eg^&>cu=qwk7Ҏ7̜%yxKTdA/r;^X6T[_ιdf%=]ގ>:܄ ̛/E|^/E0,7e' ZttyorYLzU̜,?n}➏ ,c}"g^Y`3T}G^Y`iGX9w[^˷.Xums0wcSy{NZ*sP|yޞ)o<#<#<;yGyGyw#<#<+osIENDB`rivet-2.2.4/doc/html/images/qbullet-note.png0000644000175000017500000000054112630261110020227 0ustar manghimanghiPNG  IHDR [jgAMA asRGB cHRMz&u0`:pQ<PLTELzTTT8αtRNS@fbKGDH pHYsHHFk>-IDATc!% S@2i0Vr6d`PR4u``5(%tEXtdate:create2012-10-01T18:28:46+02:00^%tEXtdate:modify2004-02-19T05:50:41+01:00f IENDB`rivet-2.2.4/doc/html/images/home.png0000644000175000017500000001270412630261110016550 0ustar manghimanghiPNG  IHDRd?m`bKGD pHYs  ~tIME*!@0\tEXtCommentCreated with GIMPW,IDATx{]W}?u+Yz_ݫ7u' O'!$`4ctqIqMIH&'i<ʤ(48< cK˲d!eْ㜳>>}JQs9{}Z}:tȾpcǎ\-[p7k.n*3,Ǿ}lk9 =qkﰇz.;^ eϖ/_>mcj5?l/r;D{?nf{<nwtR2Q}MOًضm۔;3&҉KҥKѣ/XP?|}QDY=|u׾6}&),3gp}he/7 t$`R]0\Z|&f AJHIK_ ֭geh8%a6iFʔAOH+)g>c ti8>p-z;Ysꫦj¶׾/(1FsԒ6% bdjQ{#  PR$SOr?}3$Ko}]}풦)p4\*Q)J-IM*jxp$i!>{o~ 8DnlZ}~s _}wI =uY{Y5yg7,ԉEpx`t,XXcٻ~cY:s} M>79Đ\I "`3c-[eZ@),xNwpsj+?,~;6-|l gss \mی/4;h!AtX85cojq&vg7BeKmpx.<;3raP7?jɩ3}{;z4AeeC r CY_`>>/_oHW7!h!"ƲY3z"#q#n->iE"9ꌦӿ[&v\1U+i`wwODɁ?Wt MgV"cĴfL %Sݲ#AsIB!sGDy_O"{eIR3 gTكf~!9PR8I7/}GEqPޠn)D+̇2A|l ,œH}49tV.EmCD5>Q`\X\!Yw=j!缇 #p[}RY{۪obN u#@&xih<}ԚǏRٺ H%jF4(K:Z镯7a04;e* Y#ԉ`P2Ox}>$NPs9 +wT|-T -qVUTĻ)%:Ap0W \D@SϫؙI!Sq-d>|)$$lRDՃAAM)xɬQU.zؙð{i{eFr|Gl9ܻ\h̉tT^"m;"D _@sV"M* ~;_2߂Paͽ_'3l%gb+*EzTvS۰μ;I~)a?S\uˉVc^DĚB1Í :N o`ʋFK]<*7Ozvvb9)zY7hK,X@B2cn\"ruǏ`I1wy~Æ$\* Fǧ9W]u\rd?r !X/r32t,)B3Gyj- ez#wI> GjZ$1*'>B;Jk 8p[pZ.41aJ&=7SYꕲ1 '%dDҽ7P#|. Jڵ׏q" \4);ϰΒ䔜qc[R!@,,Y%;#-_Oy9߿ƹRLsA. 248rAd8j$F:$4#P,VyrH TᝫG3`6*j¼tj\3;S2YCbb)$*|gOp"xq 4k_l+@(d΍ύhDHTHqs"suk2W6Aŭu?i_#j7SKEx2^D9)Fu~*=57XYϯXEM?OtJB:G/YDժ 09/ ]۶_~[7>oO' T{4$łR陜&H-?b3*M+;t:^W{o=7͞~IJ._zë\OR s -P3\D݌ c@޿1ynV*('J. i=质,z!ZQ+i\ t!bdlWD&N*+>Os;zB.r=^;|0rycfo7/fFhG5b@H9a,H &>I11|mL$X&Q#RS%f99\0U,C\[z$Hy R6`Vz<6[-by,VkKcmd'-!sMbaS3 CAަJ/SbW< ߁Rh~j?g0qF@!eH,0܆x0&p ^J5y=J % P<*ğ{j #7^L~!=&Ṳ; &rgߊFmͩP; ot6BJqC Xdui]}OL4+|) -CtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com!*tEXtSignatureee9d877396ce267aeb0179d35f81b2ac3'tEXtPage25x24+0+0 IENDB`rivet-2.2.4/doc/html/images/up.png0000644000175000017500000000143612630261111016245 0ustar manghimanghiPNG  IHDR VόbKGD pHYs  tIME+#`1tEXtCommentCreated with GIMPWIDATHǽ[n@;6l.C6&1NKn!K-+ŵ팄v?`.=x P;U"Fp`L[xP{*,fj#s…+4 e7Z薎>S: dIsrbRt" xF@J!FL?NhU@Ⱦ Xg/dϫ ޅG`@xN-pq\ݝr9ͼsFg3d$Y?Rx1XD'lZ.qķ1,jhB-4=@9a4[ԫkە90evG;\ tADZ/lP4b% )eR{lоxa@5TiqM #7q;J;gR(rK27K9howh6y]<5L@R%H.90 *xƁ-5˶~L4nD8Cx~?ep! xܧdg_ K6Ɖ}>{5k6f_fOg}cu`l%Y=;ͽIENDB`rivet-2.2.4/doc/html/images/caution.png0000644000175000017500000000234212630261110017257 0ustar manghimanghiPNG  IHDRשPLTE!!11BBZZcckkss{{sss{s{cZcc19B191_\bKGDHIDATxuێ@ b̮IcAP`bxsBEU_Oh<`'1wp Wȝt:%su&w,Hȯf 59v:\^ F;`HJ'871ZJ+b2B8Q$wRK v)nRpt}VbTzDv@=rPduvz{Nl;a*CtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com!*tEXtSignaturec70387830aa4ecd5a4a32a852283b3d6PtEXtPage24x24+0+0r[ 1IENDB`rivet-2.2.4/doc/html/images/calendar.png0000644000175000017500000002321512630261110017370 0ustar manghimanghiPNG  IHDR]&sRGB pHYs+tIME bk IDATx]yX~9m紧Me+d+b0.a,Ac(dM% K*YCkTTHEiվSgQڜ}'wz=>8  E P,3:bmB`fff4FD@@DD@DD@@DDPCܺ^ `p앻 seIoދ|UW1s5?i;tqä:6QNfu)m`Vg&=q&pDs4߳;qWwX֨ Od]W&S]ٙ%ZX+Ƿ𵀺wU͖:9޹p#qFs+m*^\>}"sש@O 8Vr 댹| 3=ٟ ~#id1ݮ%PWޒصw >y|#%;L${'G2&o;ix]9q.<"+deH-jYb.@bXۀ ;lvB[@DшHIEv'?MFkKZVVbe%Qd*%ҋv<@~Bgcѡx?ΏxƩO޲ԃ W6PHUYh,kh]zQ% `DID6̤/ _Xi mFS UӁO_iͩK{@) ~ ?Cd_Rd5fGuzy?m)9VDyF>{/h.O~~h) WT޹Rykua~ztrNٳ zQy{;'F>ԖLʢ6mH>Ѷ,MXBR=t Di6E_$_&a#(9v'gRte6@k/p%ܸx`ff]*ã!n~p h5/^{8zdF_hƈ=.:'w :zfi}vtQ痢k2aO0=kۇo^@.ދw qd)oW 8Q5MsUO*;{.jݼJOÒ>S/_c$΃bm1D #]~D$+-vTNQO~9UAJiL0(M-2%߅?SgW&HocE^pR 7r&ɬ)K }^#WyqH NhcRf_mɣ+(CCxFfdn>rMQEtV&adZl9@osiVtGDFezhL!K3pv+dI $ά~trˎgNU䍀|qyqF-ˍ%\;{b*Y`¤ZjECݗFR1 i5Ɖ5SôcZfyrw^ձ@\~ +6.>{<ޔ~oE, *pզjwEsQT)˗f}hIdUsn[5R_MpU 4 w-r tV4G{EoM7%gw٬(xiF1hOo9[w᛬"@we,`Uf/2}x j9,OKf!̒pN|{n(lB m8O /K\Z/,iF /u-8Uo(Lh)9sbNES4tc? ܶt( I'O'ax͒o8I0@]j0'uv>].Hm)Nc˯nrT써%ιt< rz%kRO53{= ϳ+nߌ}5{nЗ؈c[G:N2`>pY;EvjpMf7>Gso*TS ? P2fl jBlVwIPϑ4[S3@K)=M.@R[Д< pzlvc7;W ӄsX Cך|>TW3T=r2$@ݐo%ffcVr *1E~Z:?gqc"9%wߟ7z l{_ȗ&Pd&,jYa$6P )\%*ЂɅ4Քj* i'[ZQ$@ep54͈cG6[P!.@Lȩ>/Vվڻw+ZI Rjc,yˮ,b@'Lkp dW;h~z Le ]'$ @m2V.rK@FIF89vW%4G)(LJ)ԉ $ Rf⯢ҋ$u-Z$b2j5: {|X($D9wV0sCip2e ĩ _=\2uĆw~9U4:è+}*T %EhK.4R ހ,Fufٽ(:BaҖYг_Eg & +(vJ*͠|Lztw|/+86HYI8t=Yϙ 驏.wY3E[[7ٸ<76˒Gaip9RW a!&Q~wMn3ؤ~Ku?DYoSf7 =D ^g "Uƛ$;8Y%J ""p=g˵E#7~طߋ/U4M-yh4(p?ǻ>uBUŚ8gb G[pBǩqmDDDDDDDDDDDD^ P{Qd`Xq!FX(7P2cM-gH5~H*/k`"Y}QV7~i@Q2~+LqmfG=42MѶyˮyT^}(R*Hiid-BDF񝽷8~q1VOTCѺ욗=.W>MZm.0f sevC!Y=lҨW*07Vu:ӅmFr k^$mN'qn+(DSwM535nL1_B\WkfkfˌUg+4+P|.H:xP Mmr::M/xi3x4?>q*(\^R4BӸURkreF ƈ%N|Ʉ"zLhV;k=E9wrn:$ >Vb!s+dcآ VD ot^5[e.K5W+y_;}j[RTǿI`aEܒiMʝKȒdh5=YaW]:3i!ns4$I 8&|,#%Ǻ:KK+8v|u." Qx闎2pqD`L_̺7s1=fR jeʣ+[|!N{/#}%*x8<˥c,7:W6o K5Wt~&Bf64/%t#0V4 ~"%Ao U Cr<;U:Gi<1 *"|3$*P3'34g5..?P2Kdv_9%2}E0Uk1$roTj8boT^BYsO1c'+ht6Vy[žB7FĉCy4{fR_9JI:pÝίjbj2|`<1ȞgLf};\[BQ\;KꙌ7NO18OG{OC/yv5 ,,6@g1~u8[4?(@NlFՖ*; mX0v1Fݐ|L@Tb (zSy9\ҲBo9#Vur_`jv&'4MɘHK|1d{y-Uڈ&e._⇻?M,'#RL5iaCa1Nu<YjՖ]GaV oOkv]B2 5VT ;vVA7&1?vۮI-J gel~arqH[F^CV~3@fߠ+iH M8ӢOk9)SgH#}zS,*FCYv[;KckqRe$O[0?&Vz"zy Y 3dt_f <*9kI_ "6_5h42=UkDXÄHIbR6M5DM4-=`uU_V2gFk+@MKGJ<IHyOCL5#z1oXWS:At(o޼y3(m Jh}}XD"uZnm!+A0 ٰ+xIGWd11D׵qe,Q8i RzP2f,s~_{ʑ".)FQxig9ʀ~8Rz46$%+w$8NZEtǮz{/Eƚ"Us0Ȟ*)̬D g2&*@p p80GW\ejk/BJRz5Yo/I۽ʴ g+j-L"xUs@෦-T;MxY:BD%c3bbjmqjSޔ(h-K ^LDF̓g:Zt=2 cҋjiLQ_;Ӵġt7 i 6&/ik+-qFRh#ՈJIrB8gOvUq׷:&+%6< {_Po>y©zmXXe.z KMɯcH>~ƢNL8@%Z{6YgQoNl 2/9)ڏh? 2": "" "" ""*o Boso=AcDDDDD|Ȼ%z|\ _8(|,:MW4gPG3Yoi+NP jPl*eIo~;`Եv{XWnz,\o3KW]urZ[uAvœSUK(It޿MFϺSMI`^q]6p{W. ܯu()ЬYms]GzmV8aIGql}QUKkT8;aG; ^ g?)oy_f{7O_+Mj#blp&ݛ<%]~`*) T,A rE)RpWd >DvU?y0OMak\=Q/ "(ɮ?upˆA-1T8SA #|\f)bvW7 ^Mk{^f{|G]ce{tJ\߅Ͱ1B;ֺ-Qߌ~}A3mbYH|p&oA,{:H^0  ձ"ܝ*6-Q֟4g461լ5TvdD,y|g™rawG *=j pͮSz}/Uf->"~zw(PLVۃow|tL3m%Xѱḅ1+Dq0o9)/j{^f{p&=g˵v@X grxXwWd=2&m"KfkKއ;30M[s1/h>IIDATC^&o gr7z`j[-A g-Z-T-GoMpE1ϮW1$4jS1\AU'Fu@DD@DD@@DDU@)4@eD@7(#" "" ""1"OryV:6\rD_k%o_ }0+'ΰg X hȃK5 }-_Z61񽻣oN>;R3c.zF^ڷSYcc5/{\/6R'V% |b\ow(+owS`۬v<Cir@i>h[ìx4 (m0^ UlliZ9z`j>?Oܪ< Q?98y֡Zr̆]mJ!kl~ب/^p_~dpusS\f'yI9ڧylZSQkyv1ud[& @RQw_LLQg1_B\W<XM UыYf(V\gݕkDINo sqPG`q B\#vNUlh7%:y~2@}4 l6 R&X4HL+}ϵ`(t̮ƙE9wrn:$ >Vb!CpGFDP\Q #;400 N0G_O}Qh9f $IKo >Y,dbjCl.-&.llpUչ"&McµH9)xYUNj `А Y>^7 c}-)(0TYin]DJE0xs5qʼI)a%\@q0ҫy\ ]" -B5c0 3.bp3rC F놺 ֹ+K/o(ϏzZrObV:tvyVm/寯&o0m$'JD|@FrRDDDDDD^$B3 };:"|0_ uYOIENDB`rivet-2.2.4/doc/html/images/warning.png0000644000175000017500000000233112630261111017261 0ustar manghimanghiPNG  IHDRשPLTE!)1BJRZks{{{RRZZ{{99JJ11))))))!!p;bKGDHIDATxm}o0M5%%m szP^UDKnk[;һ?0n!qCtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com!*tEXtSignaturec42b7d2d564aab588891979703f02b45OߓtEXtPage24x24+0+0r[ 1IENDB`rivet-2.2.4/doc/html/images/draft.png0000644000175000017500000004205612630261110016723 0ustar manghimanghiPNG  IHDRKZJgAMA a IDATxv۸asV8 BLhp7v8<[ w`9*i$4`-B ! xb^8x5oTGa0 s;&!b;07kBC}b$xkeY?|os$x cx? /󇄎 {w:Rqpt5Ih'xH1' 桕R4EAB;[ ?Hhŏ1}ZBNBHQvC4)rB29턶n}|CCkׯzA= 4ew i}dx4! ZHNWUŸC4b/_a~9B[4l/C4l,+4l)rϟ? 4`3&+m-c 8z%*i@55 WO#xyy9NB7?6ϳ3cNhLkظwNH1&i֮.yB e=9i4M8mrv/ .@b,5ẻVwͬ [ xm=oD% k v R"e2ʽV}Bv=%~n4M0\.OǽKkm{_ބ4Dd桿 8Z9ɧGHhT4{C% μ$ʤ k4!OT,;NB rzAHCyiʲ,NӂZikòvV41} 7}JyeѳIބ4<蛄zӾgiBcB rzi:InL녙~~~.K܅JrWB+iO}%BH$ 3?UNpEz2?,fNnXk]%kg~J~ZK=q ibߛyq|ArBkyݗۉ#1' _Ьvmۮy*[OSIH]Vބ4|ޑZMrnxޣ$eQI w*~o*i{Oθ Rb44Њ.uYTiI_;[IptЩJph:szs {SI8.j#u=M% H44#b=촞p8>OQcN>4! (Hh4! XE4UU" igMӐ{T.r8$u7! eFI??MHHQӄ44;}NLl AvNr.}CӮ$t⬧ iIS 0 iS +Ŗӄ4DND~1)`nEGF% `Hh8ɸ7! `HhxCNvWOFM]bO1U4 i;&9MH ӄ4`O1l.XN?uB>/7" 'ZQI ]p2iB+B@Hhʜ*! B$49sVJ @\H5qaqvuY'"D^Cm[2!אr<6j޻@H^(;4M֕! ;O }N1%oEQ$! /5t4^oy^UUUUί kxI] kPCCi>jh l,zzve8l,iNXNpdrCI>Ӟv,QtkTvF,4-)7Ri546AHث09::! `O@BIرe~iHh(`iqoWHh܎JY? n&qx5]"i2<&ڜ&J4 \*Ih`pnmOXuҴiQIHֆ4 'i)dP8Ih8Ĝ4􅜟󜄆+T!غi8BQy_^^i8AH804\ڭm[Ƙ_~eY%<*iø7pD4vn5rqoĉJqc.˒zq"ڒ{#B wވ40H9(@\q}BN#6Iy}},K9P)4|f~Zko=B$ygYVU1>2D.UU繜 uӈ! lVJYkEQy^UQ ! lBf}A=mnIO\ 9 fNh6ƔeYEe06V&5km4YIaMZ@Nc4 0Ȫ-9+1pFx4^H]ueEQ( kiFHAu]d5cn вjš2WiCHLOITSX;AN# Ba^ XReiY~Qʲmim\nFX8'Cx ! ?niaij^зl ~`~ ooo}?|.Zoa-cw2r"}ߟ1MTUKw] eY>???<8>|^sI=:"y◗5t:ep5,!MF<2i|BCW*RN| D6p/̩_.%w}Ж ._{,\54+*i`38,w&M4ϳXKsߺ,ˤ2:~42HY /diIS׵?U|Ǹ7 / wÕׇ0 r:( 9b+{9CVm+qoWGлC% lm.J)kP0RU/M?Id2i|_Q&$^u~LY]}\duuGa.ޖ-#kss:Haؒ fY2eqs>)y9i/B/7v\}Y[Zske75~QIbuu<[zE% kו;eZQL/b,˺i^-g2ĆeuefY_zW\Z*Q9:YU|c,x¶i j0qW>YKڐ^Xk*7&v)a|Vi vooo]׭Hi}$tQ߷6m4@6,M=;i[%!?69Lؒ F\݃WBN0"9[vG|e ޘ׿_k}:qC#J+Y$@1MӬÚwބPR:+䈎(Xup|ݼWOhHw,G꺮JEvEeMӐP4{uXZ맧`FRCOi.ZNHhB؇y7^u4Mߎ%>KpuCX>Hm:Z(W jmBvc?\IXIӄ&CRX')5{"FT D J,dۉ 4'8_u:8W7&ߑC$e w>NBSUrYsIy F Ry˪ye m$4GH{bq}E0ӫߑC$1KgmHhv/UNo/wxRXB(FԲglGDvZ+GnqZ7_j5mB/Aļ=$J|/ҟ_qW'KetߓEUUOOOө,[އe_n?YF:Y!ӏE#YT-U80 ZIiMI-O>FBe,VJɦfHh܋Jثmjyzz7I[,v,M0PId-BT{wx7ZήUUI}aOi`e)˲;Km+ʷf^6տ#_ WZN1t})VE 6?`ߜ:uݏӮMӐ^W@ve~L~Hh`I#"Z;ϳA$[k-7Z~SwA~X%ҁ.~DHcKKO$t(%9 u5gyJ]EHS}󼪪wNBb4!Nx,zZJjJ8///+w϶u]4A6yXZbpyaMdeZk<ш/&QI#NBk[2x{zǗ?ڲ,1$4B!H+} IDAT)gWUroleOOOr5! $۶dLZ7M|___y}! neOz\&On{'Xk-ےDBk\X`CZ9XW grʯʲl[AbI/^ dOx4ܓ}߯_RWU^N֣cڶm{Gz˧iJ/?1UU$4??pF^__o;/&:^1_x~Ϝ|>;y~}anZeYYeYfY˘Ll;Udw ]j^z_ 1{RC;OOtrʲӠ4r0r䆓K:~DH?xSt:UUUsG7H1d~&W#GH|Z_~eiwG^I74دb4ׯ_n_ZuݮZ+/%_i(a[w>Na 菤vR:}c_J>Ӏo4܏rp]ۮYʲiL68yOd8n|>:5tMlA%v]LN.u\8u!}hkh <#YD++!士m -IM8-/j.(<0b!9Oh+#eY:ajSJMӔD+)4gB L'ڊ8[N])EH?sJeYd`VN\mYk˲trҀ'>UIb_qX;HfsuoD++:HW\'믣 SxO 'J)cL{Vǜm @ABbᔢ*'kpn7OX<^8g 4v ';y1 dkmBv56}2 ]>gq#u]hTeۦQ8Ԟb7r2-f&dY䳋r0 8ק-磆|OWiN)pyu)9ŧ1feNf&)ZّɥdKPtzHZms5<0 Cu@҉!o&bYm[.r+a:Ȁ|A۶m:` -e3R}1( WEc-FʏЏY?~òI۠}O7𰔟ȩ:$+^q-Y00 I$ckmoѢ,KWcfsGy褁QoZWUu( WiX3 <&GsJH5iZ3!mͲ,h0Ƹ:rAo1?@B1MW# #gapr)P@'^celM%W}azGΙ3z^IkuʾnccwZm!Ůicqu?;"3? @1 (O=b{LEa(i|>; &4M0,u km4+{:z_v aGB]Gk&_cpzdQTχFuyElB;Y##Nni첫Oi^Ek4,vrc@9٘b|JEʮ->N:KFe$܈'іڶu:T4־RCZ+.u\ \~q9r#e)> t]v=5kr䟉<_c㑔<ҒZ+gr?Y/j1Ŷ,`wOx ! yyoc$,˲,`VJ}/,9돟$3[)@~1j[ίw;tx؃#WXZ;r߫|tUU5M#ߗeQE~$R巌'ǜ?5nq:RFHo)LNDnZ)U8-ijDKGr|!=G>X-㸮kלNoyB+ny]cO R1Y ޞmz=x qo e`|c?*/Slӷ;TBtwPz<5cRd a7Iΰ10 {r3YFŗs/g2(cEHG9MBozT\)u]dE"ٲH!c8wI,EtJOX˒ǻ]0\ BzӌrGNe܅2އ4 fFAx72Xk0 LBGNvA!`$7IhY<ϳ ^G-[Rt/+jh` $9[!Q2jD냗%654!?^nIbUJxdm9Rb&In q }u{iߣܲ+u]\JmّIJ):i!c{?/_B*޲,<@E$s< )܃s}oNK,˪zm0 {A !yw]z`M.RHw$2-[@lYON\f^^>@o>\`&jۂ&H 崵r(О,TȾ^ߵ"E%izf.NB1#SmNБ%]| bFH'n>2:N׭ga$4-B:}iz"܋;4/pYQ󙄎$?*VOkHB8&*VO;GB8,B@[$4##e_9MB88Bp$4GNÊ9Ihqř$4,C-IhFHݒrwBB;f$뺖7ABGl  oHhIh ! ??MB7rPNo2,}1&sB%Zi71Z,c1J)1F#'ظ4M:ܓqgcLu4 _U˯G]-\Eey/ն/m,*GX%8ھiZf)oRUei[aeiek$8JNoEQcZFɽnk)m CYyWUaxuYmO@i {{{KcH@VZ8 C4A7if8}솱8e GRaƽӉqo㐖sXӆ֧)zim>=0wv7Miǰn+Ƙii~D!=MS۶;3u4z{Qi^^^PsUUeYn}/J\?-eL[k1,3?@"}œHx++qIږI7<,G0 oooZbXV-kS-_ȟ9V7joez=.˲TeYJdYfonQe<8>hHtuu 0 Ȝ=H`|\<BZݵFf9LZe5)7**ߓm}_9xʓЛXa|&r>?&@=͸7} *RV{xezЛ.Z|1rq<^!Б,|l>M|'*JY<n6B1? Iu/Ga}lA8g[Et:i}10 yA&z:׷6MmAw D4Fg{QEYiʲdVxxcHhW꺞贜aby&l{yNO4M1&Ao:eAZ-'R8=b8SsK" ž4HN8!CMGd~QnI䯗Jk-oyv<4bi&,3s454iӓeYQny.bZݐb!w]iGx44M>˲TQr{`]?}dőLodYFB .E91( Wnr5/@NSUo^bkؓ>,Noǎz`_=7 vZ,7;?8;a #!놝\JL;._plJ|d)לz:Czz2}%X|7/7 繓B,yDkm[ n=$iZyd-={8SO-scꖐVө+ɑ4Mn}4G0Io<K Q?өיboN1&˲EvgipHr:=ڢ(VNK*,Ů&#er:1ZkcNn  iźeY npNeDN^_ЪiHƽAJphCNJ-LiX%|!T,e iEN1|g![29g뻻i"wZ+ \%XVG[+Ka-/!؏lֿ$48+ ipcH+]Ӡ׼Nf !#k3B\Ҋ W^7\ *TN'8w BZ#\.qDVEL޽ʸw\}Y(9͸iy$ޑYJ.9f{ǣZ-g{ߛy@;][|{ߛƘ_ťސ$7Gk]%!q}C!-hq|JNhTQv"Ry WH+r:q۶]cLUU(V8^.'b1'ƐVO|IR*ZxZkmuN6뚖1'ސVZ,SRF??aiʳ4EQuROҊvm[W eY]l ^ 90 08Y-icҊ^g]utka6|s~պsuihҊ~ۄ.˒0vҊr9Ϯzz#IDAT. "o6RUUS7ːV weY^CZN$4l"VaBkhB6NHN1yQ/[I*!s({\4 J-rzm&VpuM iuz&5t:4CZ =r+b?.epV"i,^CZn6XNK說؝~H+9--rwB rVI䴿h$8>29qi}dkh"tJZ촞&j9MBa.ծr#;֜秗'ޘ `XIiOO*!"iF݋ƽCW"z,ii<Üj~Z"|&RCw4004_YYk|לw^k$4$לv8}dnBgiCH$& IiREH!œ& a}iFH-& y#6i~І9MBAҏ$Ih8Bz9MBk,Ih8Bځ9]eUU$4 `9,FTOpXKs##st9i:+s(BڟsBڣr,iipƜ&!$4#B:orZ:!Χ9$:-bFH.Ih7Ж&m?`uIENDB`rivet-2.2.4/doc/html/images/table.png0000644000175000017500000000643012630261110016706 0ustar manghimanghiPNG  IHDR,4b IDATxAkcGZ ) 9yo^Pc`m-8Q=İeN1ķ ğA{~^,͸~`ZרI袺^rue Ey(, u:BFE!΢QgQ|>V_/LTRSϤRSs5(dY2O>ZpTc%7P #FW : 1JYPM<y_JdTF5`ցa8ǻ Uէ(A2U "ŨFWXQG)E<"S@Q@QB w2G,;,Kn(AQ{EΣwT'I_~D.xsA6N "+~JQxG 2s2E ruuZ)J@U ʡ(a#$|PW VÓ5wBQfMd R Msxtg(9U黡nHxPgQȨ(dRN!E!SR\Ʒ'Tog~RS}}ȢQgQHjnUV\Ml] 6ތPœ-7P ЕWvj~&N@R$k_lbkt%I 8i%U jD)ElCЕI{ ln*S}"iBQfL+[Ng(E !,Uܬ_X%+e6.)E 0[ZMP 0; Q)B$}YԤm<6NH28Wv`M8a)A|_(A>sud+J!"># I"%sU䕢a RYcז;C(AvLֺWRDJ9}7CE!΢J9FLJeƷޱk~[HM_环/JME!΢8yԼI;-آ+a$kҾ}xn@@m ,>o7>i[N-CT֤}x:@NJ6X!+bKSb}|(33tLTp,"Oҷ|!'M4Yrk68 3HI;uIŮy5ּOQزylE&M"y&|r2sԼbRWoϹG ^Ci![>#'m;C(Yk$"w\6[f|K wCǃ:BFE!r , ԣ󧌯jU3vJ>MjRS?)WF:B&w{W;1t,o;@U¼qR p<;K~,mw*; Y&.~7X/Y><ڽN/?Ӱd9 2%̺I%iG&Bl po'\C.eܣ:Q3mSÀA"p@2dr=7RY̾\vTZ°4}s R_(^ + &ސ-aYQ}HfֽMrF80oOW gɩIyCꭳ%:BFE!r , ԣg_2dj|y+5x'5ղE!΢ɞ0YF2P-7PI =9'9ιxCYF5`TC hJ 7A9i'd* vo,o{bsǰr نjO])E+NT{`y۹[,3Xo}_4J(,&_$* ?xb`ŏ಑ TerN2 ĺ IF2dVnS7\F\H&Xv>IFʗ229 W.3UA;qv !+e 9# 0>#PVKfw΂Z0Yk%&-wBQ&Xvns/1MqJz8!E ΢QgQhBF#B&y /$PLaȢQgQdOp@e4@U ArRmm` T` L!,:0c TkR vJ.'&XVn 6dcE@E% p vo <|%W4L!J/8g(nwd=b wN7 XV#[kpIDAT-0-X*x.ނhe2y a3OTM i$ilZ;(WX+1fnώR'&/v~g o$%tEXtdate:create2012-10-01T18:27:32+02:00Qrz%tEXtdate:modify2012-10-01T18:27:32+02:00 IENDB`rivet-2.2.4/doc/html/images/next.png0000644000175000017500000000160112630261110016570 0ustar manghimanghiPNG  IHDR ꂣAbKGD pHYs  tIME'dtEXtCommentCreated with GIMPWIDATHǽ]SqƟ2! N0c\u te2}B LZھ&bFas<¿(Oݛb,9D8ƻ avϸ? M&X؛]wQ33yO#8QJJ&sff@{bBRִ~.B5?(==&@ /胺Pʔh_t`;`4,K \ڭ==&ʓ̅a勂Z%f )bkX/ feKq3 LL <"=y0G_E-^"BF5_Rfq$AafaXL8=I}Ä0"ORdqS&jԨ5l"M#̅}E^̳i.*iC~ ǘEURC33N04r uh9)C5{: rrJ&i8mo8-8"QTQFoQ)BN_/yF@qUR˗ "䤌tYJNDЛ:ʙ2IZS}@h-%HI n}@0Iz~gHND0tl頢7w-~,R#ZIW|VB0x-Q'_. #F\JJAv'kixU_I/U!*_aIENDB`rivet-2.2.4/doc/html/images/toc-minus.png0000644000175000017500000000040312630261111017530 0ustar manghimanghiPNG  IHDR )bKGD#2IDATxch`g  I׏j?}-pZECtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com!*tEXtSignatureecf413ef47524404f90c44d8c7d12a2e݈ tEXtPage15x9+0+07vIENDB`rivet-2.2.4/doc/html/images/word.png0000644000175000017500000000061112630261111016566 0ustar manghimanghiPNG  IHDRf0gAMA asRGB cHRMz&u0`:pQ<PLTEBBB[ϕtRNS@fbKGD- pHYsHHFk>XIDAT% **,PxD6QPr0"T:&Ss'zN:i^;EjjN /y%tEXtdate:create2012-10-01T18:30:10+02:00k%tEXtdate:modify2004-02-19T05:50:53+01:00OS1IENDB`rivet-2.2.4/doc/html/images/blank.png0000644000175000017500000000056612630261110016712 0ustar manghimanghiPNG  IHDRL\gAMA a-IDATxA 0MF4 z;3'kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` `fHfIENDB`rivet-2.2.4/doc/html/images/important.png0000644000175000017500000000132212630261110017627 0ustar manghimanghiPNG  IHDRשPLTE)))999BB1ZZ)ccBBBRRRkkBccRssRccckkk{{{9!9Z{c{JRZck{!19)11!ZRsckBc{bKGDCg bIDATxm S0 3E1KPTF'ǮQ]_iKB&F(6rc/Ѵ\Nh* 2p=:Jv?6| @}`^>s PvBɨ@d6"o;g`Ps+s%ǯ%@S{4ܾU-s"1ч?j<`g eZ* +æ2_Yv*lv~g Z[sY[Ða; =/oJĘ!fclRmRCtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com!*tEXtSignaturec3ecc1fc5135d1e959695e569d213122riIENDB`rivet-2.2.4/doc/html/images/acrobat.png0000644000175000017500000000060712630261110017232 0ustar manghimanghiPNG  IHDR [jgAMA asRGB cHRMz&u0`:pQ<PLTEyEWLAtRNS@fbKGDH pHYsHHFk>PIDAT DZ @[& `MHr#KJ20D70Fk eZ;7g\څD:[? ln{%tEXtdate:create2012-10-01T18:40:16+02:00퀀.%tEXtdate:modify2012-10-01T18:40:16+02:008IENDB`rivet-2.2.4/doc/html/images/toc-plus.png0000644000175000017500000000041012630261111017356 0ustar manghimanghiPNG  IHDR )bKGD#2#IDATxch`#@C"ԣj?RJld:4CtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com!*tEXtSignatureab17802e1ddae3211b1ce6bc3b08aec7{( tEXtPage15x9+0+07vIENDB`rivet-2.2.4/doc/html/http_accept.html0000644000175000017500000001030012630261111017020 0ustar manghimanghihttp_accept


    Name

    http_accept — Parse HTTP Accept header lines

    Synopsis

    ::rivet::http_accept ?-zeroweight? ?-default? ?-list? http_accept_line

    Description

    Command for parsing HTTP Accept header lines that tell the server about preferences and/or capabilities of the browser (e.g. content language,media type, etc.). The following script

    ::rivet::http_accept returns a dictionary value in which every content preference is matched to its precedence value

    load_headers
    set language_precedence [::rivet::http_accept $headers(Accept-Language)]
    foreach lan [dict keys $language_precedence] {
                    puts "$lan -> [dict get $language_precedence $lan]"
    }

    when run from a browser where 5 languages were chosen would output

    en-us -> 1
    en -> 0.8
    it -> 0.6
    de-de -> 0.4
    fr-fr -> 0.2

    The -list switch would suppress the precedence values and the accepted fields are returned listed with decreasing precedence order.

     puts [::rivet::http_accept -list $headers(Accept-Language)]
    text/html application/xhtml+xml application/xml */*
                

    rivet-2.2.4/doc/html/form_package.html0000644000175000017500000012253112630261112017153 0ustar manghimanghiform

    Name

    form — a Tcl command object for creating HTML forms

    Synopsis

    form form_name ?-option1 value_1? ?-option2 value_2? ?...?

    creates and returns a new Tcl command named form_name.

    Options

    -method ?post|get?
    The http method for sending the form data back to the server. Possible values are get or post
    -name ?form_name?
    a name for the form being created: this value becomes the value of the attribute 'name' in the <form> tag.
    -defaults ?default_values?
    an array of default values to be assigned to the fields of the form. Every name in the array is matched with an input field, when a given field gets added to the form it is initialized with the value of the corresponding variable in the array. This option works well in conjuction with the load_response command of Rivet when default values come from another form.
    -action ?URL?
    The URL the data are being sent to. If no ?-action? switch is specified the data are sent to the form's URL.

    Form Object Commands

    Form object commands follow the usual syntax of Tcl commands with a ?subcommand? argument playing the role of a switch among various functionalities of the command. Form objects also need the ?name? parameter which is to become the value of the 'name' attribute in an input field. This argument is the key that has to be used by the server-side script to retrieve the input field value.

    form_object subcommand ?name? ?-option1 value1? ?-option2 value2? ?...?

    Options passed to a subcommand are copied into the tag as attribute="value" pairs. Some subcommands (e.g. form, radiobuttons and checkboxes) treat specific options in a way that fits the specific organization and function of these fields.

    Exceptions to this general syntax are the field and end subcommands. field is an abstract input field creation method and requires an additional parameter specifiyng the type of field to create. Every concrete input field generation command uses this subcommand internally to print the final html.

    Subcommands

    start ?name? ?-method get | post? ?-name form_name? ?-defaults default_values? ?-action URL? ?args?
    Print the <form> tag with all its attributes. This command must be called as first in the form generation process. The following is a sample of code creating a form named 'formname' whose data will be sent via the GET method. Initial form fields values will be obtained from array response
    form myform -defaults response -method get -name formname
    myform start
    myform text	  text_entry -size 20
    myform select option_selected -values {opt1 opt2 opt3 opt4}
    myform submit submit -value Search
    myform end
    The code prints a form that sends a text entry content and the option value associated with a radiobutton. The URL of the server script is the same that created the form. Use the ?-url? option to specify a different url.
    Options
    -method ?post|get?
    The method to be used to encode the form data. Possible values are get or post
    -name ?form_name?
    a name for the form being generated: this value becomes the value of the attribute 'name' in the <form> tag.
    -defaults ?default_values?
    an array of default values to be assigned to the fields of the form. Every name in the array is matched with an input field, when a given field gets added to the form it is initialized with the value of the corresponding variable in the array. This option works well in conjuction with the load_response command of Rivet when default values come from another form.
    -action ?URL?
    The URL the data will be sent to. If no ?-action? switch is specified the data are sent to the form's URL.
    end
    Print the </form> closing tag. This command must be called last in the form generation process
    field ?name? ?type? ?args?
    Print a field of the given ?type? and ?name?, including any default key-value pairs defined for this field type and optional key-value pairs included with the statement
    Options
    -opt1 ?val1?
    Option description
    radiobuttons ?name? ?-values values? ?-labels labels? ?args?
    the radiobutton creates a whole radiobutton group with the values and labels specified in the argument list. If no ?-labels? switch is passed to the subcommand the values are printed as labels of the radiobutton.
    Options
    -values ?values_list?
    List of values associated with the radiobuttons to be displayed
    -labels ?labels_list?
    List of labels to be printed with every radiobutton. There must be a label for every radiobutton
    Example:
    form myform -defaults response -method get -name formname
    myform start
    myform text text_entry -size 20
    myform radiobuttons fruit -values {big medium small} \
                  -labels {Watermelon Orange Strawberry} \
                  -class myradiobclass
    myform submit submit -value Search
    myform end
    will print the following HTML code.
    <input type="radio" name="fruit" class="myradiobclass" value="big" />Watermelon
    <input type="radio" name="fruit" class="myradiobclass" value="medium" />Orange
    <input type="radio" name="fruit" class="myradiobclass" value="small" />Strawberry
    
    if the response array has a variable for the name 'fruit' the corresponding radiobutton field is automatically checked. The options ?values? and ?labels? are used internally and don't get into the tag attributes. If a ?labels? option is not given, labels are assigned using the ?values? list.
    checkbox ?name? ?-label label? ?-value value? ?args?
    The checkbox subcommand emits a checkbox type input field with the name, label and value attributes set according to the parameters passed to the subcommand.
    Example:
    form myform -defaults response -method get -name formname -action <form_url>
    myform start
    myform checkbox options -value opt1 -label "Option 1"
    myform checkbox options -value opt2 -label "Option 2"
    myform checkbox options -value opt3 -label "Option 3"
    myform checkbox options -value opt4 -label "Option 4"
    myform submit save_tps -value "Send Options"
    myform end
    myform destroy
    Provided opt2 was in response array (in the list valued 'options' variable) that initialized the form, the output would look like this
    <form  action="<form_url>" method="get" name="formname">
    <input type="checkbox" name="options"  id="autogen_1" label="Option 1" value="sopt1" /><label for="autogen_1">Option 1</label>
    <input type="checkbox" name="options"  id="autogen_2" label="Option 2" value="sopt2" /><label for="autogen_2">Option 2</label>
    <input type="checkbox" name="options"  id="autogen_3" label="Option 3" value="sopt3" /><label for="autogen_3">Option 3</label>
    <input type="checkbox" name="options"  id="autogen_4" label="Option 4" value="sopt4" /><label for="autogen_4">Option 4</label>
    <input type="submit" name="submit"  value="Send" />
    </form>
    checkboxes ?name? ?-labels labels_list? ?-values values_list? ?args?
    The checkboxes is an extended form of the checkbox subcommand. checkboxes prints as many checkboxes as the number of elements in the ?labels_list? argument
    Options
    -values ?values_list?
    List of values associated with the checkboxes to be displayed
    -labels ?labels_list?
    List of labels to be printed with every checkbox. There must be a label for every checkbox
    Example:
    form myform -defaults response -method post -action <form_url>
    myform start
    myform checkboxes options -values {opt1 opt2 opt3 opt4} -labels {"Option 1" "Option 2" "Option 3" "Option 4"}
    myform submit save_tps -value "Send Options"
    myform end
    myform destroy
    will print the following HTML code
    <form  action="<form_url>" method="post">
    <input type="checkbox" name="options"  id="autogen_1" label="Option 1" value="opt1" /><label for="autogen_1">Option 1</label>
    <input type="checkbox" name="options"  id="autogen_2" label="Option 2" value="opt2" /><label for="autogen_2">Option 2</label>
    <input type="checkbox" name="options"  id="autogen_3" label="Option 3" value="opt3" /><label for="autogen_3">Option 3</label>
    <input type="checkbox" name="options"  id="autogen_4" label="Option 4" value="opt4" /><label for="autogen_4">Option 4</label>
    <input type="submit" name="save_tps"  value="Send Options" />
    </form>
    password ?name? ?args?
    Same as text, but the input is obfuscated so as not to reveal the text being typed
    hidden ?name? ?args?
    hidden input element: typicall embedded in a form in order to pass status variables.
    submit ?name? ?args?
    emits the code for a classical HTML submit button. Example: the following code
    	form myform -defaults response -method get -name feedsearch
    	myform start
    	myform submit submit -value Search
    Would emit a form like this
    	<form...>
    	<input type="submit" name="submit" value="Search" /> 
    	</form>
    button ?name? ?args?
    emits the code for a button field having ?name? as name
    reset ?name? ?args?
    Classical HTML reset button that resets the input fields back to their initial values
    image ?name? ?args?
    Emits an image input field
    radio ?name? ?args?
    Emits a radiobutton input field
    color ?name? ?args?
    Emits an HTML 5 "color" form field
    date ?name? ?args?
    Emits an HTML 5 "date" form field
    datetime ?name? ?args?
    Emits an HTML 5 "datetime" form field
    datetime_local ?name? ?args?
    Emits an HTML 5 "datetime_local" form field
    email ?name? ?args?
    Emits an HTML 5 "email" form field
    file ?name? ?args?
    Emits an HTML 5 "file" form field
    month ?name? ?args?
    Emits an HTML 5 "month" form field
    number ?name? ?args?
    Emits an HTML 5 "number" form field
    range ?name? ?args?
    Emits an HTML 5 "range" form field
    search ?name? ?args?
    Emits an HTML 5 "search" form field
    tel ?name? ?args?
    Emits an HTML 5 "tel" form field
    time ?name? ?args?
    Emits an HTML 5 "time" form field
    url ?name? ?args?
    Emits an HTML 5 "url" form field
    week ?name? ?args?
    Emits an HTML 5 "week" form field
    rivet-2.2.4/doc/html/unescape_string.html0000644000175000017500000000545512630261111017732 0ustar manghimanghiunescape_string

    Name

    unescape_string — unescape escaped characters in a string.

    Synopsis

    ::rivet::unescape_string ?string?

    Description

    Scans through each character in the specified string looking for escaped character sequences (characters containing a percent sign and two hexadecimal characters, unescaping them back to their original character values, as needed, also mapping plus signs to spaces, and returning the result.

    This is useful for unquoting strings that have been quoted to be part of a URL.

    rivet-2.2.4/doc/html/html.html0000644000175000017500000000536212630261111015502 0ustar manghimanghihtml

    Name

    html — construct html tagged text.

    Synopsis

    ::rivet::html ?string? ?arg...?

    Description

    Print text with the added ability to pass HTML tags following the string. Example:

    ::rivet::html "Test" b i

    produces: <b><i>Test</i></b>

    rivet-2.2.4/doc/html/calendar.html0000644000175000017500000001123512630261112016304 0ustar manghimanghiCalendar

    Name

    Calendar — Utility class the builds and prints a calendar table

    Synopsis

    Calendar calendar_name

    Calendar object subcommands

    The main public command for a calendar object is emit that returns a calendar table

    The method emit when invoked with a single argument takes it as an year number and prints the whole calendar of that year. When invoked with 2 arguments takes the first as a month, either expressed in its shortened form ('Jan','Feb',...) or as a number in the range 1-12. The second argument is a year number.

    calendar_obj emit
    calendar_obj emit ?month? ?year?
    calendar_obj emit ?month | year?
    The method 'emit' if invoked without arguments returns an ASCII formatted calendar of the current month
    set cal [Calendar #auto]
    set current_month [$cal emit]
    puts $current_month
          Jun 2010
      Su Mo Tu We Th Fr Sa
            1  2  3  4  5
      6  7  8  9 10 11 12
     13 14 15 16 17 18 19
     20 21 22 23 24 25 26
     27 28 29 30
    rivet-2.2.4/doc/html/inspect.html0000644000175000017500000001404012630261111016174 0ustar manghimanghiinspect

    Name

    inspect — Introspection command for Rivet configuration

    Synopsis

    ::rivet::inspect ?configuration_section? ?configuration_parameter?

    Description

    ::rivet::inspect provides introspection into the running configuration of Rivet. Rivet's debug command uses it in order to gain insight into the configuration, but it can be used in any script.

    ::rivet::inspect can be called in 5 different forms

    • With no argument the command returns a dictionary with 3 keys: server, dir, user. Each key is associated to a subdictionary carrying the configuration as set for that request. In this form the command is meant to support compatibility with previous versions of mod_rivet where three global arrays were created to be internally used by command ::rivet::debug.
    • With the ?-all? argument a dictionary carrying the whole configuration for that specific request is returned. If a configuration parameter is not set it's given the string undefined. Returned configuration paramenters are
          "ServerInitScript",
          "GlobalInitScript",
          "ChildInitScript",
          "ChildExitScript",
          "BeforeScript",
          "AfterScript",
          "AfterEveryScript",
          "AbortScript",
          "ErrorScript",
          "UploadMaxSize",
          "UploadDirectory",
          "UploadFilesToVar",
          "SeparateVirtualInterps",
          "HonorHeaderOnlyRequests"
    • With one of the Rivet configuration directives listed above as single argument ::rivet::inspect returns the current value in the configuration record.
    • Passing the argument "script" ::rivet::inspect returns a path to the current script in a similar way core command [info script] does. The basic difference is that the core command returns a relative path with respect to the current working directory, whereas mod_rivet's command returns the full path.
    • Passing the argument "server" ::rivet::inspect returns a dictionary with these fields taken from the server record descriptor
      • hostname: The server hostname
      • admin: The admin's contact information
      • errorlog: The name of the error log
      • server_path: Pathname for ServerPath
    rivet-2.2.4/doc/html/decode.html0000644000175000017500000000635612630261112015766 0ustar manghimanghidecode

    Name

    decode — decode an SGML encoded string replacing every entity with the corresponding character

    Synopsis

    ::rivet::decode string ?-encoding <encoding>?

    Description

    ::rivet::decode implements the inverse function of ::rivet::encode. The input string is scanned searching and replacing every SGML entity with its corresponding character. By default the command assumes the output string has to be encoded in UTF-8. Other encodings are supported by passing the -encoding <encoding> argument.

    rivet-2.2.4/doc/html/diodisplay.html0000644000175000017500000000355112630261112016676 0ustar manghimanghiDIODisplay - Database Interface Objects Display Class

    DIODisplay - Database Interface Objects Display Class

    rivet-2.2.4/doc/html/wrap.html0000644000175000017500000000535412630261111015510 0ustar manghimanghiwrap

    Name

    wrap — Split a string on newlines.

    Synopsis

    ::rivet::wrap ?string? ?maxlen? html

    Description

    For each line, wrap the line at a space character to be equal to or shorter than the maximum length value passed.

    If a third argument called "-html" is present, the string is put together with html <br> line breaks, otherwise it's broken with newlines.

    rivet-2.2.4/doc/html/help.html0000644000175000017500000001351612630261112015467 0ustar manghimanghiResources - How to Get Help

    Resources - How to Get Help

    Mailing Lists

    The Rivet mailing list is the first place you should turn for help. If you haven't found the solution to your problem in the documentation or you have a question, idea, or comment about the Rivet code itself send email to . To subscribe to the list, post email to .

    The mailing list archives are available at http://mail-archives.apache.org/mod_mbox/tcl-rivet-dev/

    Newsgroup

    The news:comp.lang.tcl newsgroup is a good place to ask about Tcl questions in general. Rivet developers also follow the newsgroup, but it's best to ask Rivet-specific questions on the Rivet list.

    Web Sites

    There are several web sites that cover Apache and Tcl extensively.

    Bug Tracking System

    Apache Rivet uses the Apache Bug Tracking system at http://issues.apache.org/bugzilla/. Here, you can report problems, or check and see if existing issues are already known and being dealt with.

    IRC

    Occasionally, someone from the Rivet team is on IRC at irc.freenode.net, channel #tcl.

    Editing Rivet Template Files

    Rivet makes available code for two popular editors, emacs and vim to facilitate the editing of Rivet template files. The key concept is that the editor is aware of the <? and ?> tags and switches back and forth between Tcl and HTML modes as the cursor moves. These files, two-mode-mode.el and rvt.vim are available in the contrib/ directory.

    rivet-2.2.4/doc/html/lmatch.html0000644000175000017500000000625712630261111016012 0ustar manghimanghilmatch

    Name

    lmatch — Look for elements in <list> that match <pattern>

    Synopsis

    ::rivet::lmatch (-exact | -glob | -regexp) list pattern

    Description

    Look for elements in <list> that match <pattern>. This command is a decent replacement for TclX lmatch command when TclX is not available

    In the following example a regular expression is matched against each element in the input list and a list containing the matching elements is returned

    ::rivet::lmatch -regexp { aaxa bxxb ccxxxxcc } {.+[x]{2}.+}
    bxxb ccxxxxcc

    rivet-2.2.4/doc/html/index.html0000644000175000017500000004424412630261112015650 0ustar manghimanghiApache Rivet

    Apache Rivet

    The Rivet Team

    The Apache Software Foundation


                
            


    Table of Contents

    Introduction to Apache Rivet
    Apache Rivet Installation
    Apache Child Processes Lifecycle and Request Processing
    Rivet Apache Directives
    Rivet Tcl Commands and Variables
    <?= ... ?> — Shorthand construct for single strings output
    abort_code — Returns the code passed to abort_page earlier during the request processing
    abort_page — Stops outputting data to web page, similar in purpose to PHP's die command.
    apache_log_error — log messages to the Apache error log
    apache_table — access and manipulate Apache tables in the request structure.
    clock_to_rfc850_gmt — create a rfc850 time from [clock seconds].
    cookie — get, set and delete cookies.
    debug — A command to print strings, arrays and the values of variables as specified by the arguments.
    env — Loads a single "environmental variable" into a Tcl variable.
    escape_sgml_chars — escape special SGML characters in a string.
    escape_shell_command — escape shell metacharacters in a string.
    escape_string — convert a string into escaped characters.
    headers — set and parse HTTP headers.
    html — construct html tagged text.
    http_accept — Parse HTTP Accept header lines
    import_keyvalue_pairs — Import an argument list into the named array
    include — includes a file into the output stream without modification.
    incr0 — increment a variable or set it to 1 if nonexistent.
    inspect — Introspection command for Rivet configuration
    lassign_array — Assign a list of values to array variables
    lempty — Returns 1 if <list> is empty or 0 if it has any elements. This command emulates the TclX lempty command.
    lmatch — Look for elements in <list> that match <pattern>
    load_cookies — get any cookie variables sent by the client.
    load_env — get the request's environment variables.
    load_headers — get client request's headers.
    load_response — load form variables into an array.
    lremove — remove from a list elements matching one or more patterns
    makeurl — construct url's based on hostname, port.
    no_body — Prevents Rivet from sending any content.
    parray — Tcl's parray with html formatting.
    parse — parses a Rivet template file.
    raw_post — get the unmodified body of a POST request sent by the client.
    redirect — Interrupt processing and divert to a new URL
    read_file — Read the entire contents of a file and return it as a string.
    unescape_string — unescape escaped characters in a string.
    upload — handle a file uploaded by a client.
    var — get the value of a form variable.
    wrap — Split a string on newlines.
    wrapline — Split the line into multiple lines by splitting on space characters
    xml — XML Fragments creation
    Examples and Usage
    Rivet Tcl Packages
    DIO - Database Interface Objects
    DIO — Database Interface Objects
    DIODisplay - Database Interface Objects Display Class
    DIODisplay — Database Interface Objects Display Class
    Session Package
    Introduction
    Requirements
    Preparing To Use It
    Example Usage
    Using Sessions From Your Code
    Session Configuration Options
    Session Methods
    Getting Additional Randomness From The Entropy File
    Form: An HTML Form Fields Generation Utility
    Introduction
    form — a Tcl command object for creating HTML forms
    Calendar Package
    Introduction
    Calendar — Utility class the builds and prints a calendar table
    XmlCalendar — Prints XML formatted calendar tables
    HtmlCalendar — Concrete class derived from XmlCalendar
    RivetEntities
    Introduction
    encode — encode a string replacing every occurrence of characters for which an SGML entity exists
    decode — decode an SGML encoded string replacing every entity with the corresponding character
    Resources - How to Get Help
    Mailing Lists
    Newsgroup
    Web Sites
    Bug Tracking System
    IRC
    Editing Rivet Template Files
    Rivet Internals
    Initialization
    RivetChan
    The global Command
    Page Parsing, Execution and Caching
    Extending Rivet by developing C procedures implementing new commands
    Debugging Rivet and Apache
    Upgrading from mod_dtcl or NeoWebScript
    mod_dtcl
    NeoWebScript

    Document revision: $Revision: 1650305 $, last modified 2015-12-04 10:52:09+01:00$ by $Author: mxmanghi $.


    Introduction to Apache Rivet

    Apache Rivet is a system for creating dynamic web content via a programming language integrated with Apache Web Server. It is designed to be fast, powerful and extensible, consume few system resources, be easy to learn, and to provide the user with a platform that can also be used for other programming tasks outside the web (GUI's, system administration tasks, text processing, database manipulation, XML, and so on). In order to meet these goals, we have chosen the Tcl programming language to combine with the Apache Web Server.

    In this manual, we aim to help get you started, and then writing productive code as quickly as possible, as well as giving you ideas on how to best take advantage of Rivet's architecture to create different styles of web site.

    This documentation is focused on the current version of Rivet, but still a work in progress, and, like everything else about Apache Rivet, it is Free Software. If you see something that needs improving, and have ideas or suggestions, don't hesitate to let us know. If you want to contribute directly, better yet!

    Acknowledgements

    Rivet 2.2 development took advantage from contributions from several users who provided whole new componenents, bug fixes and enhancements.

    • Damon Courtney (Apache Tcl Team member, he originally wrote mod_rivet) contributed with the new ::rivet::redirect command.
    • Harald Oehlmann (now member of the Apache Tcl Team) who wrote package RivetEntitites, command ::rivet::http_accept and filed several bug reports with relative patches
    • Cyril Shtumf filed several important bugfixes
    • Jeff Lawson who patched Rivet parser to add the shorthand syntax for string output and filed several bug reports
    rivet-2.2.4/doc/html/no_body.html0000644000175000017500000000467112630261111016171 0ustar manghimanghino_body

    Name

    no_body — Prevents Rivet from sending any content.

    Synopsis

    ::rivet::no_body

    Description

    This command is useful for situations where it is necessary to only return HTTP headers and no actual content. For instance, when returning a 304 redirect.

    rivet-2.2.4/doc/html/headers.html0000644000175000017500000002006312630261111016144 0ustar manghimanghiheaders

    Name

    headers — set and parse HTTP headers.

    Synopsis

    ::rivet::headers (get | set | redirect | add | type | numeric)

    Description

    The headers command is for setting and parsing HTTP headers.

    ::rivet::headers get ?headername? ?value?
    Read arbitrary header names and values from output HTTP headers
    ::rivet::headers set ?headername? ?value?
    Set arbitrary header names and values into output HTTP headers
    ::rivet::headers sent
    Test internal status of the module and returns 1 if the HTTP headers have been already sent
    ::rivet::headers redirect ?uri?
    Redirect from the current page to a new URI. Must be done in the first block of TCL code.
    ::rivet::headers add ?headername? ?value?
    Add text to header headername.
    ::rivet::headers type ?content-type?
    This command sets the Content-type header returned by the script, which is useful if you wish to send content other than HTML with Rivet - PNG or jpeg images, for example.
    ::rivet::headers numeric ?response code?
    Set a numeric response code, such as 200, 404 or 500.
    rivet-2.2.4/doc/html/clock_to_rfc.html0000644000175000017500000000510612630261111017161 0ustar manghimanghiclock_to_rfc850_gmt

    Name

    clock_to_rfc850_gmt — create a rfc850 time from [clock seconds].

    Synopsis

    ::rivet::clock_to_rfc850_gmt ?seconds?

    Description

    Convert an integer-seconds-since-1970 click value to RFC850 format, with the additional requirement that it be GMT only.

    rivet-2.2.4/doc/html/makeurl.html0000644000175000017500000000664212630261111016200 0ustar manghimanghimakeurl

    Name

    makeurl — construct url's based on hostname, port.

    Synopsis

    ::rivet::makeurl ?filename?

    Description

    Create a self referencing URL from a filename. makeurl can be used in three ways

    • No argument is passed to the command (returns the current script URL)
    • A relative style path is passed (returns the argument prepended with the current script's URL
    • An absolute path is passed to the command: (returns the full URL to the resource)

    Example of absolute path:

    ::rivet::makeurl /tclp.gif

    returns http://[hostname]:[port]/tclp.gif. where hostname and port are the hostname and port of the server in question. The protocol prefix is inferred from the protocol in the URL referencing the script.

    rivet-2.2.4/doc/html/abort_code.html0000644000175000017500000000552612630261111016641 0ustar manghimanghiabort_code

    Name

    abort_code — Returns the code passed to abort_page earlier during the request processing

    Synopsis

    ::rivet::abort_code

    Description

    Usage of this command is meaningful only in a script set as AbortScript or AfterEveryScript. abort_code returns the value of the optional parameter passed to abort_page earlier in the same request processing.

    rivet-2.2.4/doc/html/request.html0000644000175000017500000004134312630261111016225 0ustar manghimanghiApache Child Processes Lifecycle and Request Processing

    Apache Child Processes Lifecycle and Request Processing

    Apache Child Process Lifecycle

    Apache Rivet delegates to the Multi-Processing Module (MPM) the task of managing the agents responding to network requests. An MPM is responsible for creating such agents during the start-up, and is in charge for terminating existing ones and recreating new agents when the workload is requiring it.

    Apache Rivet is currently supporting only the prefork MPM which creates full fledged child processes as independent agents responding to network requests. Efforts are under way to extend the support to the worker MPM, a hybrid model where forked child processes in turn create threads as real network agents. If we can achieve this the goal would open the possibility of supporting also the Windows© specific winnt MPM, where a single process creates and manages a large number of thread agents.

    Configuration parameters about this critical point can be read in the Apache documentation.

    There are 4 stages in the lifetime of an Apache webserver that are relevant to Rivet:

    1. Single Process Initialization

      Apaches starts up as a single process. During this stage Apache performs various preliminary tasks including reading and parsing the configuration. After the configuration has been read Rivet sets up some internal resources and if a Tcl script is set as argument of a ServerInitScript directive the script is executed. Variables, arrays or dictionaries created during the execution of this script will be preserved and later replicated in the child process intepreters, since the prefork MPM creates new child processes with a fork() system call (which involves only in memory copy of sections of a process address space). Thus ServerInitScript is a good place to do global initialization that doesn't involve creation of private data. Example of tasks that can be done in this context are importing namespace commands and loading packages providing code of general interest for every application to be served. Also IPC methods can be initialized in this stage.
    2. Child Process Initialization

      Right after the webserver has forked its child processes there is a chance to perform specific initialization of their Tcl interpreters. This is the stage where most likely you want to open I/O channels, database connections or any other resource that has to be private to an interpreter. When the option SeparateVirtualInterps is turned off child processes will have a single interpreter regardless the number of virtual hosts configured. The GlobalInitScript is the configuration script the child process will run once before getting ready to serve requests
      When SeparateVirtualInterps is turned on each configured virtual host will have its own slave interpreter which can will run the ChildInitScript directive as initialization script. The ChildInitScript has to be placed within a <VirtualHost...>...</VirtualHost ...> stanza to associate a script to a specific virtual host initialization. This scenario of interpreter separation is extremely useful to prevent resource conflicts when different virtual hosts are serving different web applications.
      [Note]Note
      GlobalInitScript has no effect to working interpreters when SeparateVirtualInterps is set.
    3. Request Processing and Content Generation

      After a child has been initialized it's ready to serve requests. A child process' lifetime is almost entirely spent in this phase, waiting for connections and responding to requests. At every request the URL goes through filter processing and, in case, rewritten (mod_rewrite, Alias directives, etc). Parameter values encoded in the request are made available to the environment and finally the script encoded in the URL is run. The developer can tell Rivet if optionally the execution has to be preceded by a BeforeScript and followed by an AfterScript. The real script mod_rivet will execute is the result of the concatenation of the BeforeScript, the script encoded in the URL and the AfterScript. Thus the whole ensemble of code that makes up a web application might be running within the same "before" and "after" scripts to which the programmer can devolve tasks common to every page of an application.
    4. Child Process Exit

      If no error condition forces the child process to a premature exit, his life is determined by the Apache configuration parameters. To reduce the effects of memory leaks in buggy applications the Apache webserver forces a child process to exit after a certain number of requests served. A child process gets replaced with a brand new one if the workload of webserver requires so. Before the process quits an exit handler can be run to do some housekeeping, just in case something the could have been left behind has to be cleaned up. Like the initialization scripts ChildExitScript too is a "one shot" script.
      The Tcl exit command forces an interpreter to quit, thus removing the ability of the process embedding it to run more Tcl scripts. The child process then is forced to exit and be replaced by a new one when the workload demands it. This operation implies the ChildExitScript be run before the interpreter is actually deleted.

    Apache Rivet Error and Exception Scripts Directives

    Rivet is highly configurable and each of the webserver lifecycle stages can be exploited to control a web application. Not only the orderly sequence of stages in a child lifecycle can be controlled with Tcl scripts, but also Tcl error or abnormal conditions taking place during the execution can be caught and handled with specific scripts.

    Tcl errors (conditions generated when a command exits with code TCL_ERROR) usually result in the printing of a backtrace of the code fragment relevant to the error. Rivet can set up scripts to trap these errors and run instead an ErrorScript to handle it and conceal details that usually have no interest for the end user and it may show lines of code that ought to remain private. The ErrorScript handler might create a polite error page where things can be explained in human readable form, thus enabling the end user to provide meaningful feedback information.

    In other cases an unmanageable conditions might take place in the data and this could demand an immediate interruption of the content generation. These abort conditions can be fired by the abort_page command, which in turn fires the execution of an AbortScript to handle the abnormal condition. Starting with Rivet 2.1.0 abort_page accepts a free form parameter that can be retrieved later with the command abort_code

    Tcl Namespaces in Rivet and the ::request Namespace

    With the sole exception of .rvt templates, Rivet runs pure Tcl scripts at the global namespace. That means that every variable or procedure created in Tcl scripts resides by default in the "::" namespace (just like in traditional Tcl scripting) and they are persistent across different requests until explicitly unset or until the interpreter is deleted. You can create your own application namespaces to store data but it is important to remember that subsequent requests will in general be served by different child processes. Your application can rely on the fact that certain application data will be in the interpreter, but you shouldn't assume the state of a transaction spanning several pages can be stored in this way and be safely kept available to a specific client. Sessions exist for this purpose and Rivet ships its own session package with support for most of popular DBMS. Nonetheless storing data in the global namespace can be useful, even though scoping data in a namespace is recommended. I/O channels and database connections are examples of information usually specific to a process for which you don't want to pay the overhead of creating them at every request, probably causing a dramatic loss in the application performance.

    A special role in the interpreter is played by the ::request namespace. The ::request namespace is deleted and recreated at every request and Rivet templates (.rvt files) are executed within it.

    Unless you're fully qualifying variable names outside the ::request namespace, every variable and procedure created in .rvt files is by default placed in it and deleted before any other requests gets processed. It is therefore safe to create variables or object instances in template files and foresake about them: Rivet will take care of cleaning the namespace up and everything created inside the namespace will be destroyed.

    StageScriptNamespace
    Apache InitializationServerInitScript::
    Child InitializationGlobalInitScript::
    ChildInitScript::
    Request ProcessingBeforeScript::
    .rvt::request
    .tcl::
    AfterScript::
    AbortScript::
    AfterEveryScript::
    Child TerminationChildExitScript::
    Error HandlingErrorScript::
    rivet-2.2.4/doc/html/read_file.html0000644000175000017500000000501412630261111016442 0ustar manghimanghiread_file

    Name

    read_file — Read the entire contents of a file and return it as a string.

    Synopsis

    ::rivet::read_file ?file name?

    Description

    This is a utility command which loads the entire content of a file and returns it as a result.

    rivet-2.2.4/doc/html/upload.html0000644000175000017500000002310212630261111016012 0ustar manghimanghiupload

    Name

    upload — handle a file uploaded by a client.

    Synopsis

    ::rivet::upload (channel | save | data | exists | size | type | filename)

    Description

    The upload command is for file upload manipulation. See the relevant Apache Directives to further configure the behavior of this Rivet feature.

    ::rivet::upload channel ?uploadname?
    When given the name of a file upload uploadname, returns a Tcl channel that can be used to access the uploaded file.
    ::rivet::upload save ?uploadname? ?filename?
    Saves the uploadname in the file filename.
    ::rivet::upload data ?uploadname?
    Returns data uploaded to the server. This is binary clean - in other words, it will work even with files like images, executables, compressed files, and so on.
    ::rivet::upload exists ?uploadname?
    Returns true if an upload named ?uploadname? exists. This can be used in scripts that are meant to be run by different forms that send over uploads that might need specific processing.
    ::rivet::upload size ?uploadname?
    Returns the size of the file uploaded.
    ::rivet::upload type
    If the Content-type is set, it is returned, otherwise, an empty string.
    ::rivet::upload filename ?uploadname?
    Returns the filename on the remote host that uploaded the file.
    ::rivet::upload tempname ?uploadname?
    Returns the name of the temporary file on the local host that the file was uploaded into.
    ::rivet::upload names
    Returns the variable names, as a list, of all the files uploaded.

    See Example 4, “File Upload”.

    rivet-2.2.4/doc/html/include.html0000644000175000017500000000515212630261111016156 0ustar manghimanghiinclude

    Name

    include — includes a file into the output stream without modification.

    Synopsis

    ::rivet::include ?filename_name?

    Description

    Include a file without parsing it for processing tags <? and ?>. This is the best way to include an HTML file or any other static content.

    rivet-2.2.4/doc/html/internals.html0000644000175000017500000003667112630261112016545 0ustar manghimanghiRivet Internals

    Rivet Internals

    This section easily falls out of date, as new code is added, old code is removed, and changes are made. The best place to look is the source code itself. If you are interested in the changes themselves, the Subversion revision control system (svn) can provide you with information about what has been happening with the code.

    Initialization

    When Apache is started, (or when child Apache processes are started if a threaded Tcl is used), Rivet_InitTclStuff is called, which creates a new interpreter, or one interpreter per virtual host, depending on the configuration. It also initializes various things, like the RivetChan channel system, creates the Rivet-specific Tcl commands, and executes Rivet's init.tcl. The caching system is also set up, and if there is a GlobalInitScript, it is run.

    RivetChan

    The RivetChan system was created in order to have an actual Tcl channel that we could redirect standard output to. This lets us use, for instance, the regular puts command in .rvt pages. It works by creating a channel that buffers output, and, at predetermined times, passes it on to Apache's IO system. Tcl's regular standard output is replaced with an instance of this channel type, so that, by default, output will go to the web page.

    The global Command

    Rivet aims to run standard Tcl code with as few surprises as possible. At times this involves some compromises - in this case regarding the global command. The problem is that the command will create truly global variables. If the user is just cut'n'pasting some Tcl code into Rivet, they most likely just want to be able to share the variable in question with other procs, and don't really care if the variable is actually persistant between pages. The solution we have created is to create a proc ::request::global that takes the place of the global command in Rivet templates. If you really need a true global variable, use either ::global or add the :: namespace qualifier to variables you wish to make global.

    Page Parsing, Execution and Caching

    When a Rivet page is requested, it is transformed into an ordinary Tcl script by parsing the file for the <? ?> processing instruction tags. Everything outside these tags becomes a large puts statement, and everything inside them remains Tcl code.

    Each .rvt file is evaluated in its own ::request namespace, so that it is not necessary to create and tear down interpreters after each page. By running in its own namespace, though, each page will not run afoul of local variables created by other scripts, because they will be deleted automatically when the namespace goes away after Apache finishes handling the request.

    [Note]Note
    One current problem with this system is that while variables are garbage collected, file handles are not, so that it is very important that Rivet script authors make sure to close all the files they open.

    After a script has been loaded and parsed into it's "pure Tcl" form, it is also cached, so that it may be used in the future without having to reload it (and re-parse it) from the disk. The number of scripts stored in memory is configurable. This feature can significantly improve performance.

    Extending Rivet by developing C procedures implementing new commands

    Rivet endows the Tcl interpreter with new commands serving as interface between the application layer and the Apache web server. Many of these commands are meaningful only when a HTTP request is under way and therefore a request_rec object allocated by the framework is existing and was passed to mod_rivet as argument of a callback. In case commands have to gain access to a valid request_rec object the C procedure must check if such a pointer exists and it's initialized with valid data. For this purpose the procedure handling requests (Rivet_SendContent) makes a copy of such pointer and keeps it in an internal structure. The copy is set to NULL just before returning to the framework, right after mod_rivet's has carried out its request processing. When the pointer copy is NULL the module is outside any request processing and this condition invalidates the execution of many of the Rivet commands. In case they are called (for example in a ChildInitScript, GlobalInitScript, ServerInitScript or ChildExitScript) they fail with a Tcl error you can handle with a catch command.

    For this purpose in src/rivet.h the macro CHECK_REQUEST_REC was defined accepting two arguments: the copy to the request_rec pointer (stored in the rivet_interp_globals structure) and the command name. If the pointer is NULL the macro calls Tcl_NoRequestRec and returns TCL_ERROR causing the command to fail. These are the step to follow to implement a new C language command for mod_rivet

    • Define the command and associated C language procedure in src/rivetcmds/rivetCore.c using the macro RIVET_OBJ_CMD
      RIVET_OBJ_CMD("mycmd",Rivet_MyCmd)
      This macro ensures the command is defined as ::rivet::mycmd
    • Add the code of Rivet_MyCmd to src/rivetcmd/rivetCore.c (in case the code resides in a different file also src/Makefile.am should be changed to tell the build system how to compile the code and link it into mod_rivet.so)
    • If the code must gain access to globals->r put add the macro testing for the pointer
      TCL_CMD_HEADER( Rivet_MyCmd )
      {
          rivet_interp_globals *globals = Tcl_GetAssocData( interp, "rivet", NULL );
          ....
          CHECK_REQUEST_REC(globals->r,"::rivet::mycmd");
          ...   
      }
    • Add a test for this command in tests/checkfails.tcl. For instance
      ...
      check_fail no_body
      check_fail virtual_filename unkn
      check_fail my_cmd <arg1> <arg2>
      ....
      Where <arg1> <arg2> are optional arguments in case the command needs to check for globals->r in special cases. Then, if ::rivet::mycmd must fail also tests/failtest.tcl should modified as
      virtual_filename->1
      mycmd->1
      The value associated to the test must be 0 in case the command doesn't need to test the globals->r pointer.

    Debugging Rivet and Apache

    If you are interested in hacking on Rivet, you're welcome to contribute! Invariably, when working with code, things go wrong, and it's necessary to do some debugging. In a server environment like Apache, it can be a bit more difficult to find the right way to do this. Here are some techniques to try.

    The first thing you should know is that Apache can be launched as a single process with the -X argument:

    httpd -X
    .

    On Linux, one of the first things to try is the system call tracer, strace. You don't even have to recompile Rivet or Apache for this to work.

    strace -o /tmp/outputfile -S 1000 httpd -X

    This command will run httpd in the system call tracer, which leaves its output (there is potentially a lot of it) in /tmp/outputfile. The -S option tells strace to only record the first 1000 bytes of a syscall. Some calls such as write can potentially be much longer than this, so you may want to increase this number. The results are a list of all the system calls made by the program. You want to look at the end, where the failure presumably occured, to see if you can find anything that looks like an error. If you're not sure what to make of the results, you can always ask on the Rivet development mailing list.

    If strace (or its equivalent on your operating system) doesn't answer your question, it may be time to debug Apache and Rivet. To do this, you will need to rebuild mod_rivet. First of all you have to configure the build by running the ./configure script with the -enable-symbols option and after you have set the CFLAGS and LDFLAGS environment variables

    export CFLAGS="-g -O0"
    export LDFLAGS="-g"
    ./configure --enable-symbols ......
    make
    make install

    Arguments to ./configure must fit your Apache HTTP web server installation. See the output produced by

    ./configure --help

    And check the the section called “Apache Rivet Installation” page to have further information. Since it's easier to debug a single process, we'll still run Apache in single process mode with -X:

    @ashland [~] $ gdb /usr/sbin/apache.dbg
    GNU gdb 5.3-debian
    Copyright 2002 Free Software Foundation, Inc.
    GDB is free software, covered by the GNU General Public License, and you are
    welcome to change it and/or distribute copies of it under certain conditions.
    Type "show copying" to see the conditions.
    There is absolutely no warranty for GDB.  Type "show warranty" for details.
    This GDB was configured as "powerpc-linux"...
    (gdb) run -X
    Starting program: /usr/sbin/apache.dbg -X
    [New Thread 16384 (LWP 13598)]
    .
    .
    .
          

    When your apache session is up and running, you can request a web page with the browser, and see where things go wrong (if you are dealing with a crash, for instance).

    rivet-2.2.4/doc/html/form.html0000644000175000017500000000676512630261112015512 0ustar manghimanghiForm: An HTML Form Fields Generation Utility

    Form: An HTML Form Fields Generation Utility

    Introduction

    The form package is a utility for generating html forms. A form object command saves the programmer from typing the cumbersome html code of input elements, working out a solution for better standardization and readability of the code. form requires that only the minimum necessary to distinguish the element is typed, greatly simplyfing the development of forms. Options to the command are treated as a list of parameter-value pairs that become the defaults for the corresponding attributes of the form.

    A form object has specialized menthods to generate all of the standard input fields, i.e. text, password, hidden, generic button, submit or reset buttons and image. form creates select input fields, radiobutton and checkbox boolean options groups. Also new inputs introduced with HTML5 are supported: color, date, datetime, datetime-local, email, file, month, number, range, search, tel, time, url, week.

    Other input elements can be generated using the general purpose 'field' method.

    rivet-2.2.4/doc/html/lassign_array.html0000644000175000017500000000731612630261111017375 0ustar manghimanghilassign_array

    Name

    lassign_array — Assign a list of values to array variables

    Synopsis

    ::rivet::lassign_array ?value_list? ?array_name? ?array_variables?

    Description

    lassign_array is an utility command inspired by the same Tclx command and with a close resemblance with Tcl's lassign for assigning list elements to variables. lassign_array first argument is a list of values to be assigned to an array that must be given as second argument. The remaining arguments are the array's variable names which will store as values the elements of the list. Variables names don't matching values in the list are given an empty string. Unassigned list elements are returned as a list.

    ::rivet::lassign_array {1 2 3 4} assigned_array a b c d
    parray assigned_array
    assigned_array
    assigned_array(a) = 1
    assigned_array(b) = 2
    assigned_array(c) = 3
    assigned_array(d) = 4
    
    set rem [::rivet::lassign_array {1 2 3 4 5 6 7} assigned_array a b c d]
    puts $rem
    5 6 7
    rivet-2.2.4/doc/html/encode.html0000644000175000017500000000617012630261112015772 0ustar manghimanghiencode

    Name

    encode — encode a string replacing every occurrence of characters for which an SGML entity exists

    Synopsis

    ::rivet::encode string ?-encoding <encoding>?

    Description

    ::rivet::encode returns a copy of the input string after replacing every occurence of characters for which an SGML entity exists. By default the command assumes the string is encoded in UTF-8, other encodings are supported by passing the -encoding <encoding> argument. The list of available encodings is returned by command

    encoding names
    rivet-2.2.4/doc/html/lremove.html0000644000175000017500000000657512630261111016216 0ustar manghimanghilremove

    Name

    lremove — remove from a list elements matching one or more patterns

    Synopsis

    ::rivet::lremove (-regexp | -glob | -exact) list pattern ?pattern? ?pattern?

    Description

    lremove removes from list ?list? the first occurrence of an element matching one of the patterns listed in the command line. By specifying the -all option every occurrence of one the patterns is removed

    Pattern matching can be -exact,-glob style or following regular expressions (-regexp). These options are globally valid across the whole pattern list (default is glob style matching)

    ::rivet::lremove -all -regexp {aa e111 bab aa} aa e111 bab
    e111 bab
    ::rivet::lremove -all -regexp {aa e111 bab aa} aa "e\\d+"
    bab
    rivet-2.2.4/doc/html/html_calendar.html0000644000175000017500000000743712630261112017341 0ustar manghimanghiHtmlCalendar

    Name

    HtmlCalendar — Concrete class derived from XmlCalendar

    Synopsis

    HtmlCalendar calendar_name ?-option1 option_list? ?-option2 option_list? ?...?

    Concrete XmlCalendar class for printing html calendar tables. The markup of the class is xhtml compliant and prints a code fragment for inclusion in a webpage. The following is the class definition.

    ::itcl::class HtmlCalendar {
        inherit XmlCalendar
        
        constructor {args} {XmlCalendar::constructor $args} {
        $this configure -container    table \
                        -header       thead \
                        -body         tbody \
                        -banner       tr    \
                        -banner_month {th colspan 3 style "text-align: right;"} \
                        -banner_year  {th colspan 4 style "text-align: left;"}  \
                        -weekdays     tr    \
                        -weekday_cell th    \
                        -days_row     tr    \
                        -days_cell    td 
        }
    }

    A sample output from HtmlCalendar (with some styling)

    rivet-2.2.4/doc/html/abort_page.html0000644000175000017500000001017612630261111016640 0ustar manghimanghiabort_page

    Name

    abort_page — Stops outputting data to web page, similar in purpose to PHP's die command.

    Synopsis

    ::rivet::abort_page (abort code | -aborting)

    Description

    This command flushes the output buffer and stops the Tcl script from sending any more data to the client. A normal Tcl script might use the exit command, but that cannot be used in Rivet without actually exiting the apache child process! abort_page triggers the execution of an optional AbortScript that has to be specified in the configuration. The value of the argument ?abort code? can be retrieved with the abort_code command during the execution of AbortScript or AfterEveryScript, allowing the script to take appropriate actions in order to deal with the cause of the abort.

    The argument -aborting causes abort_page to return 1 when the current execution is the outcome of an abort condition. In other words this query is meaningful in code specified as AfterEveryScript to understand if an abort condition took place beforehand.

    rivet-2.2.4/doc/html/tcl_packages.html0000644000175000017500000000572212630261111017156 0ustar manghimanghiRivet Tcl Packages

    Rivet Tcl Packages

    In addition to the core Apache module, Rivet provides a number of Tcl packages that include potentially useful code.

    • commserver is a package providing a server that can be used for IPC. Still experimental. Requires the comm package from tcllib.
    • dio is a database abstraction layer.
    • dtcl is a compatibility package for mod_dtcl applications.
    • form - for creating forms.
    • rivet - some additional, useful routines.
    • tclrivet
    • calendar - a package providing a simple configurable calendar generator
    rivet-2.2.4/doc/html/directives.html0000644000175000017500000006472712630261111016711 0ustar manghimanghiRivet Apache Directives

    Rivet Apache Directives

    Rivet directives are used within the Apache httpd server configuration to set up the environment where Rivet script will be run. Their precedence is as follows: RivetDirConf, RivetUserConf, RivetServerConf, meaning that DirConf will override UserConf, which will in turn override ServerConf.

    The directive ServerInitScript plays a special role since the script runs within the master interpreter, an interpreter created before the Apache parent process spawns the children that actually will serve the requests coming from the network. During this stage Apache is still running as a single process, so this is the right place for doing initializations or loading packages. Since this script will be running in a single process environment (from the Apache point of view) ServerInitScript is also the right place for doing anything needs to avoid resource concurrency among processes (e.g. the creation and initialization of an IPC system)

    RivetServerConf (CacheSize | ServerInitScript | GlobalInitScript | ChildInitScript | ChildExitScript | BeforeScript | AfterScript | ErrorScript | AbortScript | AfterEveryScript | UploadDirectory | UploadMaxSize | UploadFilesToVar | SeparateVirtualInterps | SeparateChannels | HonorHeaderOnlyRequests)
    RivetServerConf specifies a global option that is valid for the whole server. If you have a virtual host, in some cases, the option specified in the virtualhost takes precedence over the 'global' version.
    CacheSize ?size?
    Sets the size of the internal page cache, where size is the number of byte-compiled pages to be cached for future use. Default is MaxRequestsPerChild / 5, or 50, if MaxRequestsPerChild is 0.
    This option is completely global, even when using separate, per-virtual host interpreters.
    ServerInitScript ?script?
    Tcl script which is to run when the master interpreter is created. Namespaces, variables and packages loaded during this stage will be copied later on in the startup process, when child processes are created.
    This option is only available at the global level.
    GlobalInitScript ?script?
    Tcl script run as part of a child process initialization. If the option SeparateVirtualInterp is not used this is the right place where file handles, database connections or sockets can be opened. The argument script is an actual Tcl script, so to run a file, you would do:
    RivetServerConf GlobalInitScript "source /var/www/foobar.tcl"
    This option is ignored in virtual hosts.
    ChildInitScript ?script?
    Script to be evaluated when each Apache child process is initialized. This is the recommended place to load modules, create global variables, open connections to other facilities (such as databases) and so on.
    In virtual hosts, this script is run in addition to any global childinitscript. When SeparateVirtualInterp any ChildInitScript placed within a <VirtualHost ...>....</VirtualHost> will be that Virtual Host specific ininitalization
    ChildExitScript ?script?
    Script to be evaluated when each Apache child process exits. This is the logical place to clean up resources created in ChildInitScript, if necessary.
    In virtual hosts, this script is run in addition to any global childexitscript. When SeparateVirtualInterp any ChildExitScript placed within a <VirtualHost ...>....</VirtualHost> will be that Virtual Host specific exit handler
    BeforeScript ?script?
    Script to be evaluated before each server parsed (.rvt) page. This can be used to create a standard header, for instance. It could also be used to load code that you need for every page, if you don't want to put it in a GlobalInitScript ChildInitScript when you are first developing a web site.
    [Note]Note
    This code is evaluated at the global level, not inside the request namespace where pages are evaluated.
    In virtual hosts, this option takes precedence over the global setting.
    AfterScript ?script?
    Script to be called after each server parsed (.rvt) page.
    In virtual hosts, this option takes precedence over the global setting.
    ErrorScript ?script?
    When Rivet encounters an error in a script, it constructs an HTML page with some information about the error, and the script that was being evaluated. If an ErrorScript is specified, it is possible to create custom error pages. This may be useful if you want to make sure that users never view your source code.
    In virtual hosts, this option takes precedence over the global setting.
    AfterEveryScript ?script?
    AfterEveryScript is a script that is to be run anyway before requests processing ends. This script is therefore run both when the content generation script completes successfully and when its execution is interrupted by abort_page. The code in this script can understand whether it's running after the page was interrupted by calling abort_page with the argument ?-aborting?. The command will return 1 if an abort_page call took place earlier in the request processing.
    AbortScript ?script?
    The execution of a can be interrupted by invoking abort_page. If an AbortScript is defined for the page being generated, control is passed to it. AbortScript is the right place where specific actions can be taken to catch resources left dangling by the sudden interruption.
    UploadDirectory ?directory?
    Directory to place uploaded files.
    In virtual hosts, this option takes precedence over the global setting.
    UploadMaxSize ?size?
    Maximum size for uploaded files.
    In virtual hosts, this option takes precedence over the global setting.
    UploadFilesToVar (yes | no)
    This option controls whether it is possible to upload files to a Tcl variable. If you have a size limit, and don't have to deal with large files, this might be more convenient than sending the data to a file on disk.
    SeparateVirtualInterps (yes | no)
    If on, Rivet will create a separate Tcl interpreter for each Apache virtual host. This is useful in an ISP type situation where it is desirable to separate clients into separate interpreters, so that they don't accidentally interfere with one another.
    [Note]Note
    This option is, by nature, only available at the global level. By enabling SeparateVirtualInterps you must rely only on ChildInitScript to initialize the interpreters. Don't expect the initialization done in ServerInitScript and GlobalInitScript to be handed down to the slave interpreters that are private to each configured virtual host.
    SeparateChannels (yes | no)
    Internally mod_rivet creates a new Tcl channel (Rivet channel) which is configured as stdout and registered to each existing interpreter. There is no need of multiple channels in a single thread as each thread can serve only one request at a time. But if you are deploying mod_rivet in a complex environment running unrelated applications developed by different teams, it could be the case to have SeparateVirtualInterps set. If you want to enhance the environment separation you may also set SeparateChannels to force mod_rivet to create a channel per each Tcl interpreter thus enabling single application code to change the Rivet channel parameters without affecting other applications (even though changing the Tcl channel parameters is a rare necessity). Setting this options increases the system overheads as each Rivet channel needs to allocate its own control structures and internal buffers.
    [Note]Note
    This option is implemented in order to have fine grain control over mod_rivet. In nearly all practical cases you won't need to change Rivet Channel (stdout) settings for different applications by calling fconfigure stdout ..... This option is, by nature, only available at the global level and has effect only if also SeparateVirtualInterps is set
    HonorHeaderOnlyRequests (yes | no)
    If a HEAD requests is issued by the client Rivet detects this case and sends back to the client a standard header response. If the real header has to be examined (e.g. for debugging) you can turn this options on.
    This option is, by nature, only available at the global level
    RivetDirConf (BeforeScript | AfterScript | ErrorScript | UploadDirectory)
    These options are the same as for RivetServerConf, except that they are only valid for the directory where they are specified, and its subdirectories. It may be specified in Directory sections.
    RivetUserConf (BeforeScript | AfterScript | ErrorScript | UploadDirectory)
    These options are the same as for RivetServerConf, except that they are only valid for the directory where they are specified, and its subdirectories.
    rivet-2.2.4/doc/html/shorthand.html0000644000175000017500000000623112630261111016524 0ustar manghimanghi<?= ... ?>

    Name

    <?= ... ?> — Shorthand construct for single strings output

    Synopsis

    <?= $string ?>

    Description

    This construct is a simplified form to print a single string wherever needed in a ?.rvt? template. The contruct is equivalent to writing the following line of Tcl code

    puts -nonewline $string

    The ?string? argument to the shorthand construct can be any Tcl command returning a value

    See Example 1, “Hello World” or Example 3, “Variable Access”

    rivet-2.2.4/doc/html/parse.html0000644000175000017500000000513512630261111015646 0ustar manghimanghiparse

    Name

    parse — parses a Rivet template file.

    Synopsis

    ::rivet::parse ?filename?

    Description

    Like the Tcl source command, but also parses for Rivet <? and ?> processing tags. Using this command, you can use one .rvt file from another.

    rivet-2.2.4/doc/html/dio_package.html0000644000175000017500000013700512630261111016764 0ustar manghimanghiDIO

    Name

    DIO — Database Interface Objects

    Synopsis

    ::DIO::handle interface ?objectName? (-option | option | -option | option | ...)

    Description

    DIO is designed to be a generic, object-oriented interface to SQL databases. Its main goal is to be as generic as possible, but since not all SQL databases support the exact same syntaxes, keeping code generic between databases is left to the abilities of the programmer. DIO simply provides a way to keep the Tcl interface generic.

    interface - The name of the database interface. Currently supported interfaces are Postgresql and Mysql.

    If objectName is specified, DIO creates an object of that name. If there is no objectName given, DIO will automatically generate a unique object ID

    Options

    -host ?hostname?
    The hostname of the computer to connect to. If none is given, DIO assumes the local host.
    -port ?portNumber?
    The port number to connect to on hostname.
    -user ?username?
    The username you wish to login to the server as.
    -pass ?password?
    The password to login to the server with.
    -db ?database?
    The name of the database to connect to.
    -table ?tableName?
    The default table to use when using built-in commands for storing and fetching.
    -keyfield ?keyFieldname?
    The default field to use as the primary key when using built-in commands for storing and fetching.
    -autokey (1 | 0)
    If this option is set to 1, DIO will attempt to determine an automatic key for keyField when storing and fetching. In most databases, this requires that the sequence also be specified. In the case of MySQL, where sequences do not exist, autokey must be used in conjunction with a table which has a field specified as AUTO.
    -sequence ?sequenceName?
    If DIO is automatically generating keys, it will use this sequence as a means to gain a unique number for the stored key.

    DIO Object Commands

    objectName ?array? ?request?
    Execute request as a SQL query and create an array from the first record found. The array is set with the fields of the table and the values of the record found.
    objectName ?autokey? (value | boolean)
    Return the current autokey value. If value is specified, it sets a new value for the autokey option.
    objectName ?close?
    Close the current database connection. This command is automatically called when the DIO object is destroyed.
    objectName ?count?
    Return a count of the number of rows in the specified (or current) table.
    objectName ?db? ?value?
    Return the current database. If value is specified, it sets a new value for the database. In most cases, the DIO object will automatically connect to the new database when this option is changed.
    objectName ?delete? ?key? (-option | option | ...)
    Delete a record from the database where the primary key matches key.
    objectName ?destroy?
    Destroy the DIO object.
    objectName ?errorinfo? ?value?
    errorinfo contains the value of the last error, if any, to occur while executing a request. When a request fails for any reason, this variable is filled with the error message from the SQL interface package.
    objectName ?exec? ?request?
    Execute request as an SQL query. When the exec command is called, the query is executed, and a DIO result object is returned. From there, the result object can be used to obtain information about the query status and records in a generic way. See Result Object Commands
    objectName ?fetch? ?key? ?arrayName? (-option | option | ...)
    Fetch a record from the database where the primary key matches key and store the result in an array called arrayName.
    objectName ?forall? ?request? ?arrayName? ?body?
    Execute an SQL select request and iteratively fill the array named arrayName with elements named with the matching field names, and values containing the matching values, repeatedly executing the specified code body for each row returned.
    objectName ?host? ?value?
    Return the current host value. If value is specified, it sets a new value for the host.
    objectName ?insert? ?table? ?arrayName? (-option | option | ...)
    Insert fields from arrayName into the specified table in the database.
    objectName ?interface?
    Return the database interface type, such as Postgresql or Mysql.
    objectName ?keyfield? ?value?
    Return the current keyfield. If value is specified, it sets a new value for the keyfield. Value can contain multiple key fields as a Tcl list, if the table has multiple key fields.
    objectName ?keys? ?pattern? (-option | option | ...)
    Return a list of keys in the database. If pattern is specified, only the keys matching will be returned.
    objectName ?lastkey?
    Return the last key that was used from sequence. If sequence has not been specified, this command returns an empty string.
    objectName ?list? ?request?
    Execute request as a SQL query and return a list of the first column of each record found.
    objectName ?makekey? ?arrayName? ?keyfield?
    Given an array containing key-value pairs and an optional list of key fields (we use the object's keyfield if none is specified), if we're doing auto keys, create and return a new key, otherwise if it's a single key, just return its value from the array, else if there are multiple keys, return all the keys' values from the array as a list.
    objectName ?nextkey?
    Increment sequence and return the next key to be used. If sequence has not been specified, this command returns an empty string.
    objectName ?open?
    Open the connection to the current database. This command is automatically called from any command which accesses the database.
    objectName ?pass? ?value?
    Return the current pass value. If value is specified, it sets a new value for the password.
    objectName ?port? ?value?
    Return the current port value. If value is specified, it sets a new value for the port.
    objectName ?quote? ?string?
    Return the specified string quoted in a way that makes it acceptable as a value in a SQL statement.
    objectName ?search? (-option | option | ...)
    Search the current table, or the specified table if -table tableName is specified, for rows matching one or more fields as key-value pairs, and return a query result handle. See Result Object Commands
    For example,
    set res [DIO search -table people -firstname Bob]
    objectName ?sequence? ?value?
    Return the current sequence value. If value is specified, it sets a new value for the sequence.
    objectName ?store? ?arrayName? (-option | option | ...)
    Store the contents of arrayName in the database, where the keys are the field names and the array's values are the corresponding values. Do an SQL insert if the corresponding row doesn't exist, or an update if it does.
    The table name must have been previously set or specified with ?-table?, and the key field(s) must have been previously set or specified with ?-keyfield?.
    Please note that the store method has significantly higher overhead than the update or insert methods, so if you know you are inserting a row rather than updating one, it is advisable to use the insert method and, likewise, if you know you are updating rather than inserting, to use the update method.
    objectName ?string? ?request?
    Execute request as a SQL query and return a string containing the first record found.
    objectName ?table? ?value?
    Return the current table. If value is specified, it sets a new value for the table.
    objectName ?update? ?arrayName? (-option | option | ...)
    Updates the row matching the contents of arrayName in the database. The matching row must already exist. The table can have already been set or can be specified with ?-table?, and the key field(s) must either have been set or specified with ?-keyfield?.
    objectName ?user? ?value?
    Return the current user value. If value is specified, it sets a new value for the user.

    Result Object Commands

    resultObj ?autocache? ?value?
    Return the current autocache value. If value is specified, it sets a new value for autocache.
    If autocache is true, the result object will automatically cache rows as you use them. This means that the first time you execute a forall command, each row is being cached in the result object itself and will no longer need to access the SQL result. Default is true.
    resultObj ?cache?
    Cache the results of the current SQL result in the result object itself. This means that even if the database connection is closed and all the results of the DIO object are lost, this result object will still maintain a cached copy of its records.
    resultObj ?errorcode? ?value?
    Return the current errorcode value. If value is specified, it sets a new value for errorcode.
    errorcode contains the current code from the SQL database which specifies the result of the query statement which created this object. This variable can be used to determine the success or failure of a query.
    resultObj ?errorinfo? ?value?
    Return the current errorinfo value. If value is specified, it sets a new value for errorinfo.
    If an error occurred during the SQL query, DIO attempts to set the value of errorinfo to the resulting error message.
    resultObj ?fields? ?value?
    Return the current fields value. If value is specified, it sets a new value for fields.
    fields contains the list of fields used in this query. The fields are in order of the fields retrieved for each row.
    resultObj ?forall? ?-type? ?varName? ?body?
    Execute body over each record in the result object.
    Types:
    -array
    Create varName as an array where the indexes are the names of the fields in the table and the values are the values of the current row.
    -keyvalue
    Set varName to a list containing key-value pairs of fields and values from the current row. (-field value -field value)
    -list
    Set varName to a list that contains the values of the current row.
    resultObj ?next? ?-type? ?varName?
    Retrieve the next record in the result object.
    Types:
    -array
    Create varName as an array where the indexes are the names of the fields in the table and the values are the values of the current row.
    -keyvalue
    Set varName to a list containing key-value pairs of fields and values from the current row. (-field value -field value)
    -list
    Set varName to a list that contains the values of the current row.
    resultObj ?numrows? ?value?
    Return the current numrows value. If value is specified, it sets a new value for numrows.
    numrows is the number of rows in this result.
    resultObj ?resultid? ?value?
    Return the current resultid value. If value is specified, it sets a new value for resultid.
    resultid in most databases is the result pointer which was given us by the database. This variable is not generic and should not really be used, but it's there if you want it.
    resultObj ?rowid? ?value?
    Return the current rowid value. If value is specified, it sets a new value for rowid.
    rowid contains the number of the current result record in the result object. This variable should not really be accessed outside of the result object, but it's there if you want it.
    rivet-2.2.4/doc/html/escape_sgml_chars.html0000644000175000017500000000532512630261111020177 0ustar manghimanghiescape_sgml_chars

    Name

    escape_sgml_chars — escape special SGML characters in a string.

    Synopsis

    ::rivet::escape_sgml_chars ?string?

    Description

    Scans through each character in the specified string looking for any special (with respect to SGML, and hence HTML) characters from the specified string, and returns the result. For example, the right angle bracket is escaped to the corrected ampersand gt symbol.

    rivet-2.2.4/doc/html/examples.html0000644000175000017500000006664012630261111016362 0ustar manghimanghiExamples and Usage

    Examples and Usage

    Some examples of Rivet usage follow. Some prior Tcl knowledge is assumed. If you don't know much Tcl, don't worry, it's easy, and there are some good resources available on the web that will get you up to speed quickly. Go to the web sites section and have a look.

    Example 1. Hello World

    As with any tool, it's always nice to see something work, so let's create a small "Hello World" page.

    Assuming you have Apache configured correctly, create a file called hello.rvt where Apache can find it, with the following content:

    <?
    puts "Hello World"
    ?>
    
    

    If you then access it with your browser, you should see a blank page with the text "Hello World" (without the quotes) on it. The command puts is the good old Tcl command for terminal printing, which appends to the argument string the control characters needed to open a newline. When you don't have to run through complex elaboration and the output can be lumped in a single string (just like in the 'Hello World' example) you can draw on the popular shorthand syntax for string output that comes handy in many cases

    <?= "Hello World" ?>
    

    which is translated into

    puts -nonewline "Hello World"


    Example 2. Generate a Colorful Table

    In another simple example, we dynamically generate a table selecting a different background color for each cell. The font color is determined through a simple CSS rule embedded in a HTML <style> element. Create the file color-table.tcl and put the following code in it

    puts "<html><head>"
    puts "<style>\n  td { font-size: 12px; }\n  td.bright { color: #eee; }\n  td.dark { color: #222; }\n</style>"
    puts "</head><body>"
    puts "<table>"
    
    # we create a 8x8 table selecting a different background for each cell
    
    for {set i 0} { $i < 9 } {incr i} {
        puts "<tr>"
        for {set j 0} {$j < 9} {incr j} {
    
            set r [expr int(255 * ($i + $j) / 16)] 
            set g [expr int(255 * (8 - $i + $j) / 16)]
            set b [expr int(255 * ($i + 8 - $j) / 16)]
    
    # determining the background luminosity (YIQ space of NTSC) and choosing
    # the foreground color accordingly in order maintain maximum contrast
    
            if { [expr ($r*0.29894)+($g*0.58704)+($b*0.11402)] > 128} {
                set cssclass "dark"
            } else {
                set cssclass "bright"
            }
    
            puts [format "<td bgcolor=\"%02x%02x%02x\" class=\"%s\">$r $g $b</td>" $r $g $b $cssclass]
        }
        puts "</tr>"
    }
    puts "</table>"
    puts "</body></html>"
    

    If you read the code, you can see that this is pure Tcl. We could take the same code, run it outside of Rivet, and it would generate the same HTML

    The result should look something like this:


    Example 3. Variable Access

    Here, we demonstrate how to access variables set by GET or POST operations.

    Given an HTML form like the following:

    <form action="vars.rvt">
      <table>
        <tbody>
          <tr>
            <td><b>Title:</b></td>
            <td><input name="title" /></td>
          </tr>
          <tr>
            <td><b>Salary:</b></td>
            <td><input name="salary" /></td>
          </tr>
          <tr>
            <td><b>Boss:</b></td>
            <td><input name="boss" /></td></tr>
          <tr>
            <td><b>Skills:</b></td>
            <td>
              <select name="skills" multiple="multiple">
                <option>C</option>
                <option>Java</option>
                <option>Tcl</option>
                <option>Perl</option>
              </select>
            </td>
          </tr>
          <tr>
            <td><input type="submit" /></td>
          </tr>
        </tbody>
      </table>
    </form>
    
    

    We can use this Rivet script to get the variable values:

    <?
    set errlist {}
    if { [::rivet::var exists title] } {
        set title [::rivet::var get title]
    } else {
        set errlist "You need to enter a title"
    }
    
    if { [::rivet::var exists salary] } {
        set salary [::rivet::var get salary]
        if { ! [string is digit $salary] } {
            lappend errlist "Salary must be a number"
        }
    } else {
        lappend errlist "You need to enter a salary"
    }
    
    if { [::rivet::var exists boss] } {
        set boss [::rivet::var get boss]
    } else {
        set boss "Mr. Burns"
    }
    
    if { [::rivet::var exists skills] } {
        set skills [::rivet::var list skills]
    } else {
        lappend errlist "You need to enter some skills"
    }
    
    if { [llength $errlist] != 0 } {
        foreach err $errlist {
            puts "<b> $err </b>"
        }
    } else {
        puts "Thanks for the information!"
        ?>
        <table>
          <tbody>
            <tr>
              <td><b>Title:</b></td>
              <td><?= $title ?></td>
            </tr>
            <tr>
              <td><b>Boss:</b></td>
              <td><?= $boss ?></td>
            </tr>
            <tr>
              <td><b>Salary:</b></td>
              <td><?= $salary ?></td>
            </tr>
            <tr>
              <td><b>Skills:</b></td>
              <td><?= $skills ?></td>
            </tr>
          </tbody>
        </table>
        <?
    }
    ?>
    
    

    The first statement checks to make sure that the boss variable has been passed to the script, and then does something with that information. If it's not present, an error is added to the list of errors.

    In the second block of code, the variable salary is fetched, with one more error check - because it's a number, it needs to be composed of digits.

    The boss variable isn't required to have been sent - we set it to "Mr. Burns" if it isn't among the information we received.

    The last bit of variable handing code is a bit trickier. Because skills is a listbox, and can potentially have multiple values, we opt to receive them as a list, so that at some point, we could iterate over them.

    The script then checks to make sure that errlist is empty and outputting a thankyou message. If errlist is not empty, the list of errors it contains is printed.


    Example 4. File Upload

    The ::rivet::upload command endows Rivet with an interface to access files transferred over http as parts of a multipart form. The following HTML in one file, say, upload.html creates a form with a text input entry. By clicking the file chooser button the file browser shows up and the user selects the file to be uploaded (the file path will appear in the text input). In order to make sure you're uploading the whole file you must combine the action of the enctype and method attributes of the <form...> tag in the way shown in the example. Failure to do so would result in the client sending only the file's path, rather than the actual contents.

    <form action="foo.rvt" enctype="multipart/form-data" method="post">
    <input type="file" name="MyUpload"></input>
    <input type="submit" value="Send File"></input>
    </form>
    
    

    In the script invoked by the form (upload.rvt) upload ?argument ...? commands can be used to manipulate the various files uploaded.

    <?
    ::rivet::upload save MyUpload /tmp/uploadfiles/file1
    puts "Saved file [::rivet::upload filename MyUpload] \
    	([::rivet::upload size MyUpload] bytes) to server"
    ?>
    
    

    Don't forget that the apache server must have write access to the directory where files are being created. The Rivet Apache directives have a substantial impact on the upload process, you have to carefully read the docs in order to set the appropriate directives values that would match your requirements.

    It is also important to understand that some upload commands are effective only when used in a mutually exclusive way. Apache stores the data in temporary files which are read by the upload save ?upload name? ?filename? or by the upload data ?upload name? command. Subsequent calls to these 2 commands using the same ?upload name? argument will return no data on the second call. Likewise upload channel ?upload name? will return a Tcl file channel that you can use in regular Tcl scripts only if you haven't already read the data, for example with a call to the upload data ?upload name? command.


    Example 5. File Download

    In general setting up a data file for being sent over http is as easy as determining the file's URI and letting Apache's do all that is needed. If this approach fits your design all you have to do is to keep the downloadable files somewhere within Apache's DocumentRoot (or in any of the directories Apache has right to access).

    When a client sends a request for a file, Apache takes care of determining the filetype, sends appropriate headers to the client and then the file content. The client is responsible for deciding how to handle the data accordingly to the "content-type" headers and its internal design. For example when browsers give up trying to display a certain "content-type" they display a download dialog box asking for directions from the user.

    Rivet can help if you have more sofisticated needs. For instance you may be developing an application that uses webpages to collect input data. This information might be passed on to scripts or programs for processing. In this case a real file representing the data doesn't exist and the content is generated on demand by the server. In other circumstances you may need to dynamically inhibit the download of specific files and hide them away, Your scripts may expunge from the pages every link to these files (your pages are dynamic, aren't they?) and move them out of way, but it looks like a cumbersome solution.

    Putting Tcl and Rivet in charge of the whole download mechanism helps in building cleaner and safer approaches to the download problem.

    In this example a procedure checks for the existence of a parameter passed in by the browser. The parameter is the name (without extension) of a pdf file. Pdf files are stored in a directory whose path is in the pdf_repository variable.

    This code is reported as an example of how to control the protocol using the headers command.

    # Code example for the transmission of a pdf file. 
    
    if {[::rivet::var exists pdfname]} {
        set pdfname [::rivet::var get pdfname]
    
    # let's build the full path to the pdf file. The 'pdf_repository'
    # directory must be readable by the apache children
    
        set pdf_full_path [file join $pdf_repository ${pdfname}.pdf]
        if {[file exists $pdf_full_path]} {
    
    # Before the file is sent we inform the client about the file type and
    # file name. The client can be proposed a filename different from the
    # original one. In this case, this is the point where a new file name
    # must be generated.
    
            ::rivet::headers type                       "application/pdf"
            ::rivet::headers add Content-Disposition    "attachment; filename=${pdfname}.pdf"
            ::rivet::headers add Content-Description    "PDF Document"
    
    # The pdf is read and stored in a Tcl variable. The file handle is
    # configured for a binary read: we are just shipping raw data to a
    # client. The following 4 lines of code can be replaced by any code
    # that is able to retrieve the data to be sent from any data source
    # (e.g. database, external program, other Tcl code)
    
            set paper       [open $pdf_full_path r]
            fconfigure      $paper -translation binary
            set pdf         [read $paper]
            close $paper
    
    # Now we got the data: let's tell the client how many bytes we are
    # about to send (useful for the download progress bar of a dialog box)
    
            ::rivet::headers add Content-Length  [string length $pdf]
    
    # Let's send the actual file content
    
            puts $pdf
        } else {
            source pdf_not_found_error.rvt
        }
    } else {
        source parameter_not_defined_error.rvt
    }
    
    

    Before the pdf is sent the procedure sets the Content-Type, Content-Disposition, Content-Description and Content-Length headers to inform the client about the file type, name and size. Notice that in order to set the Content-Type header Rivet uses a specialiezed form of the headers command. Headers must be sent before data gets sent down the output channel. Messing with this prescription causes an error to be raised (in fact the protocol itself is been violated)

    More information about the meaning of the mime headers in the http context can be found at http://www.w3.org/Protocols/rfc2616/rfc2616.html


    Example 6. XML Messages and Ajax

    The headers command is crucial for generating XML messages that have to be understood by JavaScript code used in Ajax applications.

    Ajax is a web programming technique that heavily relies on the abilty of a web browser to run in backround JavaScript functions. JavaScript functions can be run as callbacks of events generated by a user interaction but they can also react to other I/O events, for example network events. Modern browsers endow JavaScript with the ability to build http GET/POST requests to be sent to a remote webserver. Generally these requests refer to scripts (e.g. Tcl scripts run by Rivet) which inherit as variables the arguments encoded in the request. The output produced by these scripts is sent back to the browser where callbacks functions extract information and hand it down to functions that directly manipulate a page's DOM. Therefore through Ajax becomes possible to build web applications that are more responsive and flexible: instead of going through the cycle of request-generation-transfer-display of a whole page, Ajax scripts request from a webserver only the essential data to be displayed. Ajax emphasizes the requirement of separation between data and user interface, saves the server from sending over the same html code and graphics if only a fraction of a page has to be updated, allows the programmer to design flexible solutions for complex forms and makes possible to find new innovative approaches to simple problems (e.g. Google tips that show up as you type in a query). A downside of this approach is the large number of complexities, subtleties and incompatibilities that still exist in the way different versions of popular browsers handle the DOM elements of a page.

    JavaScript can handle the communication between client and server through an instance of a specialized object. For quite a long time 2 approaches existed, the non-IE world (Firefox,Safari,Opera...) used the XMLHttpRequest class to create this object, whereas IE (before IE7) used the ActiveXObject class. With the release of IE7 Microsoft introduced native support for XMLHttpRequest class objects thus enabling programmers with a unique method for the development of dynamic pages.

    By creating an instance of this class a POST or GET request can be sent to the server and the response is stored in a property ('returnedText') of the communication object. It's become widely customary to encode these responses in XML messages. You can invent your own message structure (either based on XML or anything else), but one has to be aware that if the http headers are properly set and the message returned to the client is a well formed XML fragment, also the property XMLResponse is assigned with a reference to an object that represents the DOM of the XML response. By means of the XML W3C DOM interface the programmer can easily manipulate the data embedded in the XML message.

    In this example a Rivet script initializes an array with the essential data regarding a few of the major composers of the european music. This array plays the role of a database. The script sends back to the client two types of responses: a catalog of the composers or a single record of a composer.

    #
    # Ajax query servelet: a pseudo database is built into the dictionary 'composers' with the
    # purpose of emulating the role of a real data source. 
    # The script answers with  2 types of responses: a catalog of the record ids and a database 
    # entry matching a given rec_id. The script obviously misses the error handling and the
    # likes. Just an example to see rivet sending xml data to a browser. The full Tcl, JavaScript
    # and HTML code are available from http://people.apache.org/~mxmanghi/rivet-ajax.tar.gz
    
    # This example requires Tcl8.5 or Tcl8.4 with package 'dict' 
    # (http://pascal.scheffers.net/software/tclDict-8.5.2.tar.gz)
    # 
    
    # A pseudo database. rec_id matches a record in the db
    
    set composers [dict create  \
                    1 {first_name Claudio middle_name "" last_name Monteverdi   \
                        lifespan 1567-1643 era Renaissance/Baroque}             \
                    2 {first_name Johann middle_name Sebastian last_name Bach   \
                        lifespan 1685-1750 era Baroque }                        \
                    3 {first_name Ludwig middle_name "" last_name "van Beethoven" \
                        lifespan 1770-1827 era Classical/Romantic}              \
                    4 {first_name Wolfgang middle_name Amadeus last_name Mozart \
                        lifespan 1756-1791 era Classical }                      \
                    5 {first_name Robert middle_name "" last_name Schumann      \
                        lifespan 1810-1856 era Romantic} ]
    
    # we use the 'load' argument in order to determine the type of query
    #
    # load=catalog:         we have to return a list of the names in the database
    # load=composer&amp;res_id=<id>: the script is supposed to return the record
    #               having <id> as record id
    
    if {[::rivet::var exists load]} {
    
    # the xml declaration is common to every message (error messages included)
    
        set xml "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n"
        switch [::rivet::var get load] {
            catalog {
                append xml "<catalog>\n"
                foreach nm [dict keys $composers] {
                    set first_name  [dict get $composers $nm first_name]
                    set middle_name [dict get $composers $nm middle_name]
                    set last_name   [dict get $composers $nm last_name]
                    append xml "    <composer key=\"$nm\">$first_name "
                    if {[string length [string trim $middle_name]] > 0} {
                        append xml "$middle_name "
                    }
                    append xml "$last_name</composer>\n"
                }
                append xml "</catalog>\n"
            }
            composer {
                append xml "<composer>\n"
                if {[::rivet::var exists rec_id]} {
                    set rec_id [::rivet::var get rec_id]
                    if {[dict exists $composers $rec_id]} {
                        foreach {k v} [dict get $composers $rec_id] {
                            append xml "<$k>$v</$k>\n"
                        }
                    }
                }
                append xml "</composer>\n"
            }
        }
    
    # we have to tell the client this is an XML message. Failing to do so
    # would result in an XMLResponse property set to null
    
        ::rivet::headers type "text/xml"
        ::rivet::headers add Content-Length [string length $xml]
        puts $xml
    }
    
    
    

    For sake of brevity the JavaScript and HTML will not listed here. They can be downloaded (along with the Tcl script) stored in the rivet-ajax.tar.gz archive. By simply opening this tar archive in a directory accessible by your apache server and pointing your browser to the rivetService.html page you should see a page with a drop-down list. Every time a different name is picked from the list a new query is sent and logged in the apache access.log file, even though the html is never reloaded.


    Example 7. A Calendar Utility

    Rivet comes with a Calendar package that provides classes for printing calendar tables in various forms.

    The HtmlCalendar class prints a calendar table in a similar form the Unix program 'cal' does. Example: the following code

    package require Calendar
    
    proc ::cal_cell_attributes { day month year weekday } {
        if {$weekday == 3} {
            return [list class curr_wkday]
        }
    }
    
    set htmlc [HtmlCalendar #auto]
    set html_txt [$htmlc emit -container {table class calendar} -current_weekday 3 \
                              -cell_function cal_cell_attributes ]
    puts $html_txt
    

    with some CSS styling would print


    rivet-2.2.4/doc/html/rivet.css0000644000175000017500000001541512630261111015513 0ustar manghimanghiBODY { font-family: verdana; } DIV.ABSTRACT { border: solid 2px; padding-left: 10pt; padding-right: 10pt; } PRE.SCREEN { font-family:monospace; white-space: pre; width: 100%; background-color: #ffffcc; border:solid; color: #000000; border-color: #009999; border-left: solid #009999 2px; border-right: solid #009999 2px; border-top: solid #009999 2px; border-bottom: solid #009999 2px; padding-left: 15pt; } PRE.PROGRAMLISTING { font-family: monospace; white-space: pre; width: 95%; background-color: #eeffee; border: solid; color: #000000; border-color: #009999; border-left: solid #009999 1px; border-right: solid #009999 1px; border-top: solid #009999 1px; border-bottom: solid #009999 1px; font-size: normal; padding-top: 1em; padding-left: 1em; padding-bottom: 1em; } H1 { color: #ffffff; border: solid 3px #a0a0d0; background-color: #606090; font-variant: small-caps; width: 100%; } H1.TITLE { color: #ffffff; border: solid 3px #a0a0d0; background-color: #606090; font-variant: small-caps; width: 100%; } .TITLE a { color: #ffffff; text-decoration: none; } .TITLE a:active { color: #ffffff; text-decoration: none; } .TITLE a:visited { color: #ffffff; text-decoration: none; } H2 { COLOR: #ffffff ; font-style: italic; BACKGROUND-color: #a0d0a0; BORDER: solid 3px #609060; PADDING: 5px } TABLE.IMPORTANT { font-style:italic; border: solid 2px #ff0000; width: 70%; margin-left: 15%; } TABLE.CAUTION { font-style:italic; border: ridge 2px #ffff00; width: 70%; margin-left: 15%; } TABLE.NOTE { font-style:italic; border: solid 1px #000000; width: 70%; margin-left: 15%; } TABLE.TIP { font-style:italic; border: solid 1px #000000; width: 70%; margin-left: 15%; } TABLE.WARNING { font-style:italic; font-weight: bold; border: ridge 4px #ff0000; width: 70%; margin-left: 15%; } DIV.VARIABLELIST { font-family: sans-serif; font-style: normal; font-weight: normal; padding-left: 20px; font-size: small; } .VARLISTENTRY { font-weight: bold; margin-top: 10px; COLOR: #ffffff ; BACKGROUND-color: #a0a0d0; BORDER: solid 1px #606090; PADDING: 1px } /* * See http://diveintoaccessibility.org/day_26_using_relative_font_sizes.html * for an explanation of the following few commands. * They are really too complicated to explain here in all depth. ;-) */ P { font-size: 12px; } /*/*/A{} BODY P { /* font-size: x-small; */ voice-family: "\"}\""; voice-family: inherit; font-size: normal; } HTML>BODY P { font-size: normal; } /* */ /* Add an external-link icon to absolute links */ a[href^="http:"] { background: url(images/remote.png) right center no-repeat; padding-right: 12px; } a[href^="http:"]:hover { background: url(images/remote.png) right center no-repeat; } /* Add a note icon to footnote links */ a[href^="#FTN"] { background: url(images/qbullet-note.png) right center no-repeat; padding-right: 12px; } a[href^="#FTN"]:hover { background: url(images/qbullet-note.png) right center no-repeat; } /* ...and a back icon to the backlinks in the footnotes themselves */ a[name^="FTN"] { background: url(images/scrollup.png) right center no-repeat; padding-right: 12px; } a[name^="FTN"]:hover { background: url(images/scrollup.png) right center no-repeat; } /* Add a download icon to .gz links */ a[href$=".gz"],a[href$=".tar"],a[href$=".zip"] { background: url(images/disk.png) right center no-repeat; padding-right: 12px; } /* Add an Acrobat Reader icon to PDF links */ a[href$=".pdf"] { background: url(images/acrobat.png) right center no-repeat; padding-right: 12px; } a[href$=".pdf"]:hover { background: url(images/acrobat.png) right center no-repeat; } /* Add a Word icon to RTF links */ a[href$=".rtf"] { background: url(images/word.png) right center no-repeat; padding-right: 12px; } /* ...but not to absolute links in this domain... */ a[href^="http://www.karakas-online.de"] { background: transparent; padding-right: 0px; } a[href^="http://www.karakas-online.de"]:hover { background: transparent; } /* ...or to the translation links on each page */ DIV.translatelink > a[href^="http:"] { background: transparent; padding-right: 0px; } DIV.translatelink > a[href^="http:"]:hover { background: transparent; } /* ...or to any images */ DIV.imagelink a[href^="http:"] { background: transparent; padding-right: 0px; } DIV.imagelink a[href^="http:"]:hover { background: transparent; } P.C2 { COLOR: #ffffff ; BACKGROUND-color: #a0a0d0; BORDER: solid 1px #606090; PADDING: 1px } DIV.NAVFOOTER { color: #000000; background-color: #DFFFDF; padding: 5px; margin-top: 10px; width: 100%; border: thin solid #a0a0d0; } DIV.NUKEFOOTER { color: #000000; background-color: #B0E0E6; padding: 5px; margin-top: 10px; width: 100%; border: thin solid #a0a0d0; } DIV.NAVHEADER { color: #000000; background-color: #DFFFDF; padding: 5px; margin-bottom: 10px; width: 100%; border: thin solid #a0a0d0; } DIV.SECT1,DIV.SECT2,DIV.SECT3 { margin-left: 20px; } DIV.EXAMPLE,DIV.TOC { border: thin dotted #70AAE5; padding-left: 10px; padding-right: 10px; color: #000000; background-color: #E8FFE8; } DIV.EXAMPLE { border: thin dotted #22AA22; background-color: #EEE; } DIV.TOC { margin-left: 20px; margin-right: 20px; width: 95%; } UL { /* list-style: url("images/tux-bullet.png") disc; */ } .namespaces { border: 1px solid black; } .namespaces td { padding: 0.2em 1em; /* font-weight: bold; */ } .namespaces thead { background-color: #aaf; } .namespaces tr.init { background-color: #e88; } .namespaces tr.childinit { background-color: #eee; } .namespaces tr.processing { background-color: #e88; } .namespaces tr.childexit { background-color: #eee; } .note td { font-size: small; } li.listitem { font-size: small; } rivet-2.2.4/doc/html/apache_log_error.html0000644000175000017500000000544612630261111020034 0ustar manghimanghiapache_log_error

    Name

    apache_log_error — log messages to the Apache error log

    Synopsis

    ::rivet::apache_log_error ?priority? ?message?

    Description

    The apache_log_error command logs a message to the Apache error log, whose name and location have been set by the ErrorLog directive.

    Priority must be one of debug, info, notice, warning, err, crit, alert, or emerg.

    rivet-2.2.4/doc/html/calendar_package.html0000644000175000017500000000705412630261112017763 0ustar manghimanghiCalendar Package

    Calendar Package

    Introduction

    The package is based on the Calendar class, a class capable of printing an ascii calendar table that closely resembles the output of the typical Unix cal command. The internal code is written entirely in Tcl, therefore doesn't rely on the existance of cal on the system. XmlCalendar inherits the basic methods and adds XML tagging to the table. XmlCalendar prints an XML calendar table whose header, weekdays banner and days rows tags are configurable. Also specific days or specific weeks can be given arbitrary attributes.

    Calendar core methods are based on the cal procedure written by Richard Suchenwirth and published on the Tcl Wiki

    [Note]Note
    The Calendar package uses Tcl dict command to manage markup information. Hence either Tcl8.5 or Tcl8.4 with package dict are required.
    rivet-2.2.4/doc/html/import_keyvalue_pairs.html0000644000175000017500000000625312630261111021153 0ustar manghimanghiimport_keyvalue_pairs

    Name

    import_keyvalue_pairs — Import an argument list into the named array

    Synopsis

    ::rivet::import_keyvalue_pairs ?arrayName? ?argsList?

    Description

    key-value pairs, like "-foo bar" are stored in the array ?arrayName?. In that case, the value "bar" would be stored in the element "foo"

    If "--" appears or a key doesn't begin with "-", the rest of the arg list is stored in the special args element of the array.

    Example:

    ::rivet::import_keyvalue_pairs keyvalue_map [list -a1 v1 -a2 v2 -a3 v3 -- 1 2 3 4 5]
    parray keyvalue_map
    
    keyvalue_map(a1)   = v1
    keyvalue_map(a2)   = v2
    keyvalue_map(a3)   = v3
    keyvalue_map(args) = 1 2 3 4 5

    rivet-2.2.4/doc/html/load_headers.html0000644000175000017500000000505412630261111017146 0ustar manghimanghiload_headers

    Name

    load_headers — get client request's headers.

    Synopsis

    ::rivet::load_headers ?array_name?

    Description

    Load the headers that come from a client request into the provided array name, or use headers if no name is provided.

    rivet-2.2.4/doc/html/dio.html0000644000175000017500000000344112630261111015305 0ustar manghimanghiDIO - Database Interface Objects

    DIO - Database Interface Objects

    rivet-2.2.4/doc/html/cookie.html0000644000175000017500000001305412630261111016004 0ustar manghimanghicookie

    Name

    cookie — get, set and delete cookies.

    Synopsis

    ::rivet::cookie ?set? ?cookieName? ??cookiValue?? ?-days expireInDays? ?-hours expireInHours? ?-minutes expireInMinutes? ?-expires Wdy, DD-Mon-YYYY HH:MM:SS GMT? ?-path uriPathCookieAppliesTo? ?-secure 1/0? ?-HttpOnly 1/0?
    ::rivet::cookie ?get? ?cookieName?
    ::rivet::cookie ?delete? ?cookieName?
    ::rivet::cookie ?unset? ?cookieName?

    Description

    cookie gets, sets, unsets or deletes a cookie. When you get a cookie, the command returns the value of the cookie, or an empty string if no cookie exists.

    cookie delete will set the timeout value to -1 minutes - deleting the cookie in the browser.

    cookie unset will remove the defined cookie in the server (perhaps preparatory to checking/resetting the cookie).

    The command has a number of switches setting a cookie attributes

    rivet-2.2.4/doc/html/escape_shell_command.html0000644000175000017500000000563112630261111020662 0ustar manghimanghiescape_shell_command

    Name

    escape_shell_command — escape shell metacharacters in a string.

    Synopsis

    ::rivet::escape_shell_command ?string?

    Description

    Scans through each character in the specified string looking for any shell metacharacters, such as asterisk, less than and greater than, parens, square brackets, curly brackets, angle brackets, dollar signs, backslashes, semicolons, ampersands, vertical bars, etc.

    For each metacharacter found, it is quoted in the result by prepending it with a backslash, returning the result.

    rivet-2.2.4/doc/images/0000755000175000017500000000000012630261004014144 5ustar manghimanghirivet-2.2.4/doc/images/prev.png0000644000175000017500000000152112343445264015642 0ustar manghimanghiPNG  IHDR ꂣAbKGD pHYs  tIMEYtEXtCommentCreated with GIMPWIDATHǽr`&' 44h ӖP}WY|uttt<|Wl/Ryo}Xae+v\_\C^`-Ul,މX`^E&3rp7]H U8GfÄJ-tMA5r"ZPJ/ *R8M4<#e`!cTJNVzQOS$ > F:Z_7v(E%Pϔvw+yx[@.3E$Bu:IRNky Vdq LȪ<6 :2]U"ؑ %$'{܊,qY={g*o6=9^o 5 -gn46]%,!aup?+Bf`Bєԧpa |x'60b;'Ç+l8 YgnԳ#8ET??>M*(Pgpdz"H4CWrn0zyp};>"_ 3 +vο>u9h(cADq>|!>s9 `xƈ"KE45H՝?|Iq`Dy+k2+uOa6dIENDB`rivet-2.2.4/doc/images/toc-blank.png0000644000175000017500000000047611436722370016546 0ustar manghimanghiPNG  IHDR kd0PLTEO&IbKGDHIDATxc?|` h BhCtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com!*tEXtSignaturef7e388dabd4ef0097714b5643fdd3cfbb tEXtPage15x9+0+07vIENDB`rivet-2.2.4/doc/images/disk.png0000644000175000017500000000055112032344336015613 0ustar manghimanghiPNG  IHDR [jgAMA asRGB cHRMz&u0`:pQ<PLTE{{{ W[[hU\tRNS@fbKGDH pHYsHHFk>2IDATcRRR``Pv5P @*4DrqqqRnii J="%tEXtdate:create2012-10-01T18:29:36+02:00f%tEXtdate:modify2004-02-19T05:48:44+01:00"IENDB`rivet-2.2.4/doc/images/scrollup.png0000644000175000017500000000054112032344336016523 0ustar manghimanghiPNG  IHDR _w(gAMA asRGB cHRMz&u0`:pQ<PLTE5us0tRNS@fbKGDH pHYsHHFk>0IDATc```d! l$Ag"\@Ɔ B (hi6P%tEXtdate:create2012-10-01T18:29:07+02:00j%tEXtdate:modify2004-02-19T05:50:42+01:00%:,IENDB`rivet-2.2.4/doc/images/note.png0000644000175000017500000000075211436722370015636 0ustar manghimanghiPNG  IHDRb$bKGD#2IDATxe!0 E}K C tAQCACQA+g4mɌoK. qc  D="s %dǜH1y%M8fK wֵ>i6g-NpYtL#ߟ ab;U#2V} ԣrVx]zTT1O H4]o zΧg"ӒNHlUu߯9a)s{;s4^>}Zkk>{ |H]̰Wp/[!ɰW(iva~@`ƅ=nR,n*jسrhXN5X=a 0`@ۀ 0` u aiRD>7nb3KfevEK9f,h[z~U! `Ƌ~ NbYaݤ5;9_gᑅ ;ܦX3?yfu<~ ~55W^,)"/<M~TWܽ:I/DF]Y6:)Ur߁4v~ig I n(sw/.ӗxx3hqL %=H.{\ysGMKMyeLsu|^))qI-kgeGMCu~K ~tnu#tloF0cnjYYA|.{;q? LfՁZ+9:PuP_bN|Yt o2#抄Џ VZU%#.< 4=so:))Y-8~,B:Cg'XY#[ c)TbVcK>[a߽MS.C;o9*y}-oDv"UK2y2P-K X!0-2!Q,oMD4)8leW4^OP46Qgo&? lMew/⯅Iߧqp/ج *IZ&EhZ6:\یS%CZǁggHy1c}Y1yI1Peʄp#-m/k㑆pI`"/ r\du*5Fp07?XC_D{K{Z*ç.f ʋd  R-HBWֽXò3w< u.f:xm<Ӫ+Տq`/3y9yyX'YV ? *_/s?O==`u7κepKi=:G&jzܡN^dЋ)pS ݻu]st]r2sn槙~ Oͯ>yj!~Z떟5ΘcYvi&y%4Q6;Ⱥ͎HiE58o™KOiGӫq#[I h]#9dmB6yR EO}:0~|T**&ʏ#.P0GGPSM࿭msA?Iό^Q2Js#?Q;AvAtxi]ħ'o?ShLcW@6ޢR>Bc(C2:im j-Ql[Ơд KHdJ茞cǥ Vh|o8|f"F坪_mЇ%boOB9&ߠP Cr%gWb$U nμZz+[M(7c~+WZMo!bӛ:3;l12ښ_1r1Zk6?Ň=J"~|XKaF{Ԏ8^y51bՋ_aJ&0esx;A`$nAWm\1K1&!%y#.Ɉ*TFU0'£;8?4u:⡥f7}ϻXAm0>k eNS^e':]k5譇kR`= n߶ yN@ oqN2W=o$ hҜC b軑[Xri 8ixduZ'f}mMw}=t\ B]qY3^úz4@-o :j۹6T%X3I"*ΛpDW ahM'N2gڋJ192a<8}M%(& mdUJAڴHDJI:1*_3c&eRq"y UG.HEV3i9=_g+Iv4,%9á>(6uJ8)qF /M9?7.uK:~.IJ:d/~'-y ;i!F'%jOi㇣ d(}4Sr‘2y2xJ.|l ␨?Lk5cEwW3huyTTJ~19tLfᗆcf;Q:&<~OڑykX>FN6q =hnl5>kZ9$4Fzj>iNFKyK"rq,_!'=GrkS֥U,Jgצ6㎀Dgno -':'iZZbA>Q=,llo) B !~LN-i_ɟEL9iz@X9lC;4ACP?Q@%zSn$}`ASdW`;aMLmh|h@ |4I _P8d-2l녢yp4s~n+4;:)E$-'{ h5tnn`,~;:+u wZ] vA^_au#20i? Taܸay~[^UoAlisxH~/h]<↮>39W?|Wѳ%lc\!xkHywH7)L8PBjd&L  I8&x\ѽ dX<~\j ~:ͭy-:/)?ĵ~VzO f8*5B j.>9ҲISP~RoD^ý A8{yQI2DN@F~ WO=v71kk;V!Lh[WF'#k8hR`TC -~nIX z pAdܑ(O#:CF%JNPBP[yFN3=7Ep?FwIbAgGańI@) {Eg&gc$vܚLM5>s.lf83I I,cjdxm_*뿖KJ& w&Rb7Ь@[ m0?o?gÜ-:ׅbo>DkΟjX:6{*Β)ټ0IyBopKuLؿ|.Y/kyؿj`B@Ȼ6q5k Dww/ECyn:^ol_Õhz/WZӹdА="YD"@UA8lR hT;D=.jhأ.rƳ)$%LJoO=_a mj 1DIy,L &Pew5!I݌?IJgs:_5~G<-~4 QA^n/Ց @S0FP-[0rG噒aNa⬁{Jol dYA=y?[P peJٮHTj$_anB*eϪ}>Wr1Qk7ɖ^+6)%4b}#zfO6oh╟~(Z4fis-@ M}Mi\\>{GC1]Ҡj~[^I.z> -,.mz皵Yypġ|\y̛x`wJi=,흜vx^2Lω 㲧b ?-srwUx54W硕 l "A~do̪p~/gS3uM 9f/ -0xVUH4w_xY'"5M[41v/M @p}̀T~1gpYN=h$A?WؿFy92$&5 qT?,/2'Z`<+O=IeT ts vc#C̄%`h3vޙU{9Kb(넎( 9tw:۪4A C;LnZ;Q?``;\Ic= 5(aQ4&mLqYvjħ8h\|l7hE0'ܡm̞͎=4qV^]FSt=㲙xĈl\ 0"D%v6VYR㥒Ȓ@HC10V|O<9^;Z$P[R׆xСhFXi52YV}´|y`2 m IrgfվBrZp]Spu+G0[=q2]<1gQ^W֥T &ɓ`WPT M 2")l$}F҉4svpOl,Ӱ-&n3ỹuBq.i~Oxs' . U rTbD_Ib$@$p(P%+NGOb0 ~S~y3@@pl${ [P@k5ՠw*u.H82O%9oy+N^c[BS8iL?_JWÕr٬3BF 71 iaF}JPssfSgpdGn25Rq_6jYpIZ4y$t)j~m=~~+V ,=bx^fTF:gmZ~h=>_@QȍZzbka)w~ьj61h:vhҫX]sOxv lGļ}8_ n1n/\j̳avx[ϧA0bٜœ%N*d)c0,(őe j s<[\bCY>%˦\j&D# l8ƣ'g^݇⇸sCܹ qܵl\m/-G$T5O GUGv5u48TJ\ˀOՊ?@&Y[Uxևtn 'O])_8vaH%v!N_l @C MBeBC}\ ; +Qu.P^45ZZ|P$=w4>ˤt ;myKӫRJ|-bp>'sBɡˋ!5v/z3Kr1 HjNYW^z4s𐟑S TJ&J^k৒"!^ygFAdaFG~O]cg'3( ~Wuʖ=ߟ9)*S發[/4ff3E;'?sm::Vl8[^h.gͤ~7%;w[ b{-u.ῆMdLv2y;x}|tO?[5!p' !\VWM/6G\hOYhV$vSdqi1ևZTޠ!&euAӒ/m?dNBIKmdNT. QTO5Q~B{ʯ Kx~d6dق{j3A:ESW >}[E${nk$\#u5vF4z -G u)qZƤ~;ſT*=ħvη'ٻMxHfO?[bt {=B <oΤd 5rJVJ/g Sx9% (ؿęl~A!l6lp/H~0 ^|5ÿ) ϙd8;)T;HB?3 x1`wr_nN8T͸g{}@e{ 0tM@M+ { 7.4ظpX\<Űg?`bpSPÞC2wa~TX0P 0` 0` 0`  0`BHi1` 0`ad 0` ?j{Ų-˗Je[Z$-- [Z,6nqrqK`ee-.[\ GoqYa/02 0`  0`0AzxY2/qVO!s`^N_no+ʋ$m kn~Q3w nnɫwXE])fM_ͅ}:).%qgGh0iyg%H۲vѿkzaN™s" a y.-O'[lE'ٰ5;9Efؕ0wF,hD'~d w|w3zi/<-~dW<$kygXZx)K%p2xu+R$1i\eq9SW mq IDATݍgAӗs=c|04;&s JM?KyM_>~ҟyYY xuȝi&!JXYMьcnX\y:{))H`#Hu.KZ2b9*OJv~ڱ--^CvR le-eBu//󧊓x69RVIRň Bqȑ=:dA&:%Q YNcҩ|>@yXૃk?ԩx"zPv&{{lGm8ycލdun ;7*C`¦{4.IlaYS 7L_Py.ҹgrWǟUع83%sJl }W-W1}Nă\uBJm es~gvvE\-Vfϓ ӎY6jhRH_Ѻ}T8hofTZmIsdǸֽ;=^X`ɮ1{g:s|~\wcӇxyYGqd r%??Y/ <#_/%} kea6!콷F'#ѿJ'3CvFmXMT{& c `mv,$y#h5>ɾ-A |zJ1z{?(?iT6m%~6>[;5cʂ{LlC*Shl}NEŪt[IsNou?= ը=[$s~/ɰChջU\OieE3$WTbE +O`rllQacĸ׿7ly;%Nxl_Aşj}@PAaC-Lȕz ]bt713>8o^,v$U>OWjYokt3~^ieDz1r⡖>Ut`8z^ǯ彣f[R6v}y3k")tbM]ތz}> VkLwG+yz.GgOm ;ΈBU~SPohr9,3ֺuR zP_8O:]K~ ftRk^e'~:]kɣ2sFfhZt2X} "JVY_mhkSItZ/ԶavNW=7z`?5rىw#aqsYbQP-iSKj3ic#Hrq]247dbw\^Է-Zu]>fRɞ:Da7P k딚D-JfwIr^S3a_ | QrF:#gFJidGWaj!(10N+i(V$h`f&M9^qbգQ$<fDʐ:G"AfI3(tW8jfpN^Ξ:\cEoJQU TG2V.1$&TngW FΰH.HO"==}=|W~%w3Jlm 0&f2:'oFVBs]SoetA"!~ZecE2JFq#UxE<@DuH?=XsVPi5/:K>x;| |^+v.\˧!ˈSY6C$|1?QUjOBVEADn51^+GȘrh eY%$Κ:g1"4u28gMP| ި'R)8 .[$Rj; Myń5cƤ&KCSOtTQ- a N΀ЃYqx&]Gjf\ ra:MqjQ0!݊0OSK4M%G+]fLY&е^SVH+ka>eJ2CX";Bֶ {i9PFήQ`FǾ( gؒt[YOtB\KF̬85K,GԿ{/̹o셆dB:$%m2ݖrl+~q pm/T%' b wW^*unl?)ՃFC'}F+g$)2[I 3f~G{ $%I&OoQ HuHX$/TZڋUO5$KL'|ǔh X]{*-gr}4z/E_5ٲI5qy`˛TE|cK{ۂQ6' C_oǢFKs)[-wKBg:)$ǪBH$,"';O߽k YCڎq>^ Rn!F+$(|X["rėLa A HII_kg*1&BvSC9 ,D^ !B G;?%ղ2 s;Ln9(f&9i["7Dsq"m#=:!)Z;8$6ؠyC۹Na(Y((k$¯?%pJ.o|[`Xyl7*uWJv ޭ1,Ιٞ$B{H+}k-|K;#hftvb?F'OMհcI@) Zd!SXG6˄1A;koM&&fJ ve}[>cuU j$I$,H Yk{r/_û(9o^=WLy_Bۀ_s/X19Ń[x_"OI)ټ0q\.mc럠<ͷ}/\'r_kxbD]wp\* O +? |9S,G/_x Svx-oH$Ox1 bBՔƢk*+@(YOA3icڏ2iԇ.Aֺ/* hTM%kp[X3A0՛h2rDIn 秒=?;)Q>ثzs`SA8l䞥ҴއcA̸EwTXjv3I^0)OaW_l?*K%1~JAc[ٵ+VV{%y8&176^e׳j(,7L;Drۗޕ҆OҺ<טX/OTCJ+xf.V@:Ӹܹ8?{'C1;sx&7S$9MFsi֑u_{"$=Xjŏ`= ,1$Ժ[X8 t&aky'Ygμ;F:\RWKB=,o  xq9: lBCHk#Tl2׆lc#ԕ .w9N\^&9M}=<nj)ń)VHYpֻ@y Kܦ l {):5o"N3jxeS``ݧj̀S9e=|0DcnNmͳz6;V̖?zX\3iT@:OPS(M~ ȋ,L%@ɳP ;xWp0of}e)70sl7Ϥ1fy$֭k4,Y6S?TXH:#J‰Ě2,3/n>N}ӄ5^_t6#pN`!'Kتd(Kts,o.ymc`PCZ# DgW,\p =z:N6NfߞgO<08D%<<(6ˎ'Lo|gvE>֕Է_(m~=#LՈwFn"Mx>/ƣ$Ppp5:fV3@;z/eL8cGvz cypȺEXnmB^O0 ]mZtxWҝfkl|FA5=1Ⱦ :IGM}[y=j : v nAά@e_~ۘ>WOW@49{{K%1aF"k7jIKV`cM-!-J' TNb΂&$9CJy/PrZ>8=:AY؉S=h4nV sm.hOB̸KnffjS"Z_M!r:xTiY@s|~JZ05Z^s{c0Y}C8L)3'p+kC¬VU/_k\wX>6hz#?O ,,Y83yaIQ6ļXX<{ 'X4*t g\̭fTAhI -\^KU/? 7;Yŝax[!aʥGx6gœg3>=9N*+eXyу$%Na1 )9.?iCu4g"r5Sdze4>Klec}PH?қ6+UZ6 }?ps`U@[i91kاX)iIg+{6Eo 9WP>LH8r@aתQ~Te";A{̾F H]bgG ;UYD|;5=X#_r^PA#H>~&fŏ2n$.|HmfϤWZ;ҥI|x92v$~¾F j ŇB:_$PNy]՛dp‰6:kD:'*y/n߭kqqFrʍroiYxy|;JJ㥋jHJq[67cWPƕ^˶_Gg͞}gelJYWcs-g| _gJ?ڶ$V8-|-VNHaTO}'T~ yK*i'bX )}iQzyEc#xO1I`]_1$%|g{%_Aj7{`ttƝ==GɣXS 1),Y){ }*cci;l]ds|IKn\eg>e'q,1bp'/#oc!v=쐅IכڂÞ֞P?T69NIrG-^|[NvW~q%KFLl[ř! :|U^x'@]{og,Ԕ ZIs'?G,Tp?gĞbt + <^Y?;h"Ϸ={4HE5w3X(E+SzY?kqX)+Y`BҷZX0S&Dw{c@^L ]ܰW([\LY̰W(^B,\ya~ƛV k]Vܴqa~ʅ)=+ eC {-+ܩ=a 0`@ۀ 0`#6` 0`W)#8 0` 7 0`1Ƨv([ySe+ {%-- [Z--[Zkd/XeqK`E-.[\V EoqYi/02 0`  0`|L2뼉n[#Nןq<>մu?ه׽>6n~¶t.D\e5OF]xR7wz򺩟bgڼ\7BW'9Ձo6.Z:L sb'?e^`\]hq%|>;[zw߿d)[V]-m s:g͜yYz-Duo ;O͆uI,2ƋNK0r9 }HuYS'eᖅ I;]30]ꍴp2n\gqT;KhAwQF% ӰQĈɎhA-ѣ%3d;( WTLg4k׽>CB,cj9N_IkySQ~-ԯθ/$LsvgZQ`V6 \.^O” ,4@t&O|q\8|EEx$IS1ܡ~?ۋzw,Y .`M(& $/$70$&&3 0զ\n˶$[jV/sǽdst->}[{^{^{u?Yv*:8~TUA%4 9^O6NLd- bw^w[:!R}a6(*5o{&ྠf`ѝRO7Z`zfN{tS8VzT7O`n_yVk EȺ_ 8WjW-٬zb +mgHԉz|fY OVxh"{n5 ʳ4񋧏lѳ8|>Gybg*e977wϙ Qsh?2$ zy#O407^hƿ>6G7UN}bB=ҡ >]pbPEc ް] '׭ZXF->˿`Y^v7g`ʞϪ7иm؃ķ>:ٮHdMZwԚ:TkD02f5 hmQCM  a ߿+,_JEاLbϝ:cyRLѣZzQDgNIE5&sRqA"lJZ_S4'cG%K1X\zEr::f0{|F8렀IhwQr\b_{ht֎M+ч>A1?%,V.cC3>䏕^\wCBM*^VԽ=D/"Bar2 I$B`ҒlQqt1S?Jǭ?ԓi"V-2.e ?f(%$Y" ]ItԐ3Ӓ)*T\ܕD%gBBMrP_AkFS5G5(Pp/Tr}q$h jGyq2!+]J1d#BieVdؠ-BYWD[ihpuk̚]/U9Z] wh*ȴw/ ]!6ĶĭO: N@$G/QKoQ]mPoͰKf*/[z۩gJdǷ*P?ZMn{d1G[󾰆,3hTE/^q5'q~[i#=ϺzOV-|m RER _PL*b4f?3?MCg ?ʳ`}QIWϾnLB gw;:@r!X2)Q Rϟ֎1%c':+-2P%N,opWD@viZY֓4s9ôWM((%UJ!MсJ/jdv;i%1=wGWdYK FD AOq:Z5n|)b9j4wۢWDCQĖK: c㧸d|' xx=1?Eس1ϭb:t" OT|.j  (npnL]:?hq ?~ɣVQzOGPh JϚ/گQ$,@RnN^-i&,>+?V?ߩ0}BбUdi1 evu1AeKi{Hl{ Tf­Xgh_OB߻WQGlv$m dՀN-9sƲ[Mn ob.GТA'Ydzd'l ԘHԦlq~>5`5jAci!OB^(zwΚǬ ;_aaТɈ; FTC{-dH6L kN"2bEyyuЎaư^{Yf2 2#oaWvE€f=zܸ\*ijb[#ԡB Jnƹ18G F|8PU<*xd1O8u-߷az8/epNn餢\`7S#Wr? Zn*p,mv?@z"}sOkk-S U#mN kG+=2 NPR W?(M t+pO^lphRYR0r%x/IȌK?1u *ȹg?iFLa@Pd|jp*~kY_J 7CGW[_bx=/2dTh@,D pjc 4wPU$"\e'[uz9L8{J`L./F*hD@b s%.lq( F߹N9gZp!%{.3:?AU† e0i@Wpg('u ŀ&mD;8*?Z/5m'f>ES?a:?4&x#[d1MB\8)qW:i2eJPX*]lc+?P֦ACZ E>>E@H&NTЃ*稗lc2, S#©k&Y x=s }4jɵw\Y J*S&/D֯U )*h#xS72+'}_\sTfς xaO/@4%|;SGA2ušZXb3kC<с@k޹ZJ&`Jx~|0 lbhAƬ ~-C%lf^z.(AǸ)>Kݾb7x|[~hЇ^ F`b0JC/G}2^F mhbL̿9Pt6h:{/FM\$fSUgTTqO1ꚉԟo!y>]':4X&yca^==X>lj#xuQs}Q`z)Oϲ 2E[ Umh{7rW k_)"_0"v`gj݊GydO#IHuoXUh#y~+xj`7 \$NF|:Ԙ#Ѥ `W": T'FzyS2(9a0 /<~ܯYSbd+2%GFC$QT*^psp!)Y@Hȴhj22tUG/TU7ˤ-GT-i ^Tmmrϭ~0+@5jd2_ w,P%RIII*טAv<>H#ڂ>3!toCXR|I[0؀}5#=y]&1{2[`$#srM(\.Yӹ#_f/*XXC_dʶoz9ـ`&>bB}O̍ PlHbHuM7F>8htVL/P}mgNd"4hhcK9_Nu!j$dN"%c.KB]~a8ϳf9o`BḥYX )W~~%~zw::|RdVoA\35YwvD Ni m!cS\Hd-/r_-.'M& ,,hBc(jS]!1=vm=!W;:h0S4*mlTZ9.%0cի=ɡv饼^OaJTAmh2W\3~[ zFϔh ɕ/t)z͡| GQnzĽjb/,LHȲTգpuB -S~@%qj<ڨ*ps@q"ܥ^v ]5K]$P%GCLdu%:dJj% +`e;"g[C&pݤ7 HyT̻6B";$)I(Gc/8. ɳ.V\+b#i씱$QNf'=MNZ0Uyxv9yCMߞWZ_>ދ EGd{pK:I7חeZLz>>g~ 5Ԇm|&5*&{: @wnd})Ф4輪ƞ}Z S$hHaְa4w-mN9vYq+-" ]{4$] hLd Խqf@?nrOڱ7+xr&7`^_|_)f~`QŽVFߕ}oJTem 3]_:*VWQot(1PHϕO-Y_ˎ~]/}b[ZUz$jAb^xyGAlw$\"āsЊ^>LyH {8^W?zr}ޑ5|':YA-Jfb "1' d),\@-/h?#1:Rz'FpfYޯh=6Xۢ"N1r^=O'v{~4n Lr)1?:s8Áҋ9+"-'P%]U&^+"R rUЋq9*'DhWxݞ=,\HP0I`O$RTMLTS?j{mbBĕZ),xɸmO>),_2AW9Xbr>ܶ A NsrQ`u>b\qGqGqw#8#8#hGqGqVGqGqGxD;8#8#8 މhXW?-ey.)-gS?eEc q,SD\R|WIH?RSy!q3@syNj(m~RZ&㎛xQZ#؃uh15wA'ʠ_h$<:坵IOpF\3u\ DCmg]j ydKCRx7H]/}6l^9슼dOޛf`NػL>i H(Jg<[yy5m/_9l(;s!s/_Vg%_>pR>3xi9t:Å& R|o]oT?~U;)oT1h]Y Pmc3%4\ޏ|,BT \ >ItpxCm-c\ ^o~اMq__ĝa`jk+okc}bJOLhpgh%'bϫ9ydbe VQni>ڻO`9 >ɞZh4.lMMU,\ ҧJ_Xs`5?k48U%-ژ^?NqW;ʠ*6 7ƉBvv(\MtC?}:O8\򀛲7]Kgwַ^419!U‘7[`zNeNoG%e󄠽CHP}Q/J  w-S @T)s.5t\7Վ^Z_^bV-_=55yJ *gSeZeH(?Oq]_F'8n4z:gv*;V]AdS-<{6G5V?4=n5h_ʚP{Kx[v>`!;MxN{xiidFjl]GnXOy"l^S wӃ={xam-W-9Ia~wcu,rP:;VZGV?R8J^,ʸ r%3 $RB(By: Fd'_=PZ8phɴJaDڴ;vԇOL,أU E_Yy_tRwdD_ fTK/+0Ja_MΜT;{˃M&3LKA}#zFyliE`dor^P}vESKE4B%urԇ<ZLQU~^? Gia/}t0+:9A]hx+R2 |._bbLN_~}FF1$Ny,j=9 ]f'r%AڧƢ;rI5~ւ1 H ^mf GZ+%c҉h"G]H~)B/:n O.깙- Qpb ùŲO֯%".7sЙȨ#Pڭ F=if. ?XE:I@2CF-FkjfLS{tO0QdEOf'*5D%f*$y P1mQ9]29kd3Z#t[EQ.N0c$cL-5r\+^s*)EuN".MILO9:d$-b1,e͞*47G97&Uh4`d:=p8dHhVOgzmpA~W $sL_ ^ij>S|gy6x&t.q:dMwDkP_42eAe>"QMn{0e1Y[χ}Ao_և%cMO"Oi$$A@+)=]]Knţ\ije:IE慈ϛ_'PZTU*@3Ǡn4J$h0^toQNcDӾ$w1W0zIzjm: b"n}tjE! ɞ9QÂS% :Zg48* h˻>u):P*~mt4.y\Ěom 4郟!)Y]>v 8ye &zۏW0"qQLhŁS%pVN)*Y":ӋD@vx1u#` 8=6q`y{/'?"U]1ǭb: bl'*je~ ŘӐ!{u2LlSy7Ge"#o1XS+"rgvi=% + [R8Vf]:?06e'jen#wM ;NүuedZDp*AðI`XӈttwdC<of4V zUШMq6>vv,ypA[" .tQ`o3|T@]SߝOy>eE׷-&)|05WK(;O%vd=/7/sTiF0=E"mgm^2l|#əL wMcm'GO7t6r cdX˖5'? "Ɉ; FTCߡ?o.3EEN;ߺ@i@( gփv3+2W@}  - dcčݥIUե7O᪤l0)ecPW Ϗ2?D@j0 N=ЉˎC KxfcG?a[+P&1{Naz=fw8:pGN?F4EEs0|[_s2dvr Lٟ7/|)I IT-&0"Opck?~cR22b^1$JBDE_-qa?æZ ᳸ ^<3&:RmL)V(ĉ WFCz2<AĔ"m y3,=QǸQlobËټ5@}O4O_0T&vv[YZЉ='DX{- '*Ѓ*r?UZ QLnPۋ_ayndII&A!,b.먗#:g R-u 0taq!b[V33xswr7JaQ+^[-gR}ȎL~Z w,ְLV og N[fSfHO&)ţl;~Q G _ka}[~m(':okm2W֭-8zc^TybS:| xw6Z^@V<|!U!k%+Y2mwQ&1˞]WA4#sղmK-ۂFuch<hҙ?AǧjC!b0i𻼱GDc/e\f^,sldh49{G Md?~ށT WD$+?eHKQ@҉(#24SQQ)5Ê?F^> ^ 5@aɓG?̧gٺ2KO:dc̭6Ƅ#HeZn?WB{{S5돘vO&ي3'_O$U8*SMK#~v(Z`ϮJ_D&}¤^ y!۾}?>%۩&Z Y>~EmL'MOJԑnRpJt೫FǑfhۣ15QZ7T29KF} ;7(LY1t.1˄<,6d1QbGm g[exiH\6*x+~*xm8_wN34z# '_9C>w: eKx^N6 X9oF/Y`AiT^FϴC'ڒHfv;m|pGѴ12} Y|}>Bn zs46.qL ,nláޒIs t˗ٿ#6G/z}kĎ,sn]J ? &@mw/mw6xCzA%3w ILi3P0mCY07!{03jF_9G4 evN'csandr7Nu!j3r sEys,f.['0&8}*3oMwR'u^yIW~nA{g8. a_[[á[(̑BhZb$Kp!WT{ЩDg *Dn+XHeL@uXLr zݜEݔH,6q%II⡗mdUZE9Y!?5uDz3k MjG'G̘:>vvtsLh.UdAy(Z8Pgt)6yAu{<`{Jˤ_c"Az5ǩ2 W+1VNL{H2{K`b1FWU~&Q׊pzyoW(k^b"-\ 2Df]'](ex_Mz ^8_p9ω54w)>=ħސ̐ Ip#ČɖϽ}jI; lIa9$j@ieNtglr/$y*q\Q1QP,pTYE]~1*8 ʓ4a#_W~_bYQ򁝦FZޯ2TRzrsַSӪ\͆\{sF]koqn^h/}Sqa/ ptu6_ui 9Q!]s%%)Rk 1fw[U6EXI:- c  ei\?E/zL3E@bÉGI_?ʽ#k:xN Z]5Hj3a-h&!Q&#O7J37}[GDHc~ȽG`ǿ9,iUI QeZpƞg3Qnd^k?:J} NDy"z?o觼oY}Vkѻ&,{7]M]\Xbu\_++W[RXq} V?rʸ>V\"A+V -sr:`q}V,&;:1AWAqGqGq8#8#8;qGqGqƯGqGq`#ю#8#8#av?mۂ`օgiVgi eqy2ePd(˪xAP,.,.Y\CY\ų 8#8#8;qGqGq@wዲkD 99"^CTQ۳cKŒs?aC@y!0:8kgF?jm42UiS-џ)<DZ,V~TDr^ ej0u~>IYxԫk_w} -9Aֽx{#$¯/;4m^v|>@_+|1{G LC 땖"Iƣ3PYˋ'=/_F5:<.c _!ـSS0fO溛f`&S4}i H(߿}!y[zxiںokcW7SԟcӆR3rXcبYɛ/Dn)?a^s$0E.t,1bJ?]SǺ7qΟʃSzQ}){ON`lrG oQԀ[&irK'~AE7CYW7⸾_~^Mv{3}ιw˲e7Wd\ n  d7aCqCl˸*dIdZ{+Y6e3<̜g3S+RHeή.ҮL|gL2 zv>|23Y6MC{ݞ3N^~,']ўMn^J~S"vb?q>EfgkKC) r_'"2e9A01qkd܎v\kϴ&mf.Wd*%v=SFfWG'V<3K%Z~4 yj%1vW)bSS qx+mˀĭO`ȖC<ŋbK㉟eYAުo<#)!B`+_^rpNDvo]nk|o:/na]M_q䨳7I2Q^< "¨z 3Y:p lҜmbhK5 W+e56^^ ?)8J2b[yٞ.8uXfڷ(N7Ff!@g}&?h(oGk&V>%2ĨwG'7c[}>Az.uLk'_9p;8v7"BgΥ%ɢva)ދ>FSdx:9HcJ@lb /g[ ǮPzsiV+1 '0"T z ivw3wC`|o.9㓤jŎ?A\FJ GD ^>>kEś?_Oc~:}5":aŦDtRH*4HzO>%| 6^˔Qᨺh535;^V|#J쬓9!5mf s?8_(.0`#&%|Z$ .I$f$]NYu4̴l҂ Ӏ"к7xp)"XYE$)Q }|N)2j^U[3+ YCew?F!k}-KRv눯C/hF*Nҥ)$ P:G lFPz^o$wh iq N> Z·Ҙ1Q]kIPzu<]_IY&3t` *&H":'n9!<|r|q0@V3:n%HbWoρw(e!-Ë3["/ Q$z#j8=d:4i@>z!܈X;VGe'EOOv8R/27qy'&pO")+ nJqO &QO]ӛ?qzGw@s"%x;VgGsamjvvLdXp* $$`0J- IXCrxp`%"KAj@Ы>-N T ~03YSw2Ef2ftz " ˸j[8yjho6]^%Q^e7ZXxx8&쑤cGS0j2zkqP~8)cMz:E:"Ο c)>4 dČ6F3~'O|2uX2A0e=,Y9"&Bo cI)ZƬǂ&]_̀jHO>@Eޮ73'}~61oHyyyQɊٝ{6_Ξ3SMpeF@±u\ ras1KmH]YyMd*JQq'wUvToXJIwmC\0(1}cզ3fUnj?| cBKsn/f}?Ŗ+2C)! fe{9߉Ҙ^T@#g }gL.bvN8bJd ?w}ȓRmg~>m캠$"]yf ;v*wC AF-4*h20oD&-]+1?lV㎡;-ΥoGC#!ʷ"69 0 fZ^YIIba>O~Ab>-~i(Ȥ2g.;g-o>>Gop`OgWUh ]|e{#XOSB-;x]BA1hy}Ewy}GEO 1sl`i 30^KǮIb̂|[ucj9N{\%IN2& Q~i4""D oKd+h`cob[ O]Gx[LO$X~k)x 4_TyY_tGzm 2aCX 4D*s\3#Z6 'D $vmIPAQGm['O %`3uy1Dw Sbb["/( %}<⚕;Yo'S׍vx oRlxѶ66 dcrད- 5Z]`Ev6&FݰQ-*2, }d S<ȶwQ%Q4c|2AUJԖi'FEk1=6ۮ\hro8kPxd$.Eʉ*-[" H:GF} ȸBkv|L'l̼H`FZ0|Jzub\dK -̻¼qxd`qğ+Md-#$crϡQ$TkyChv#n6cis\NS12`42{D7Q-WKDRm,sNuHKl?׍E3aLk@JNeaNkt͠Ȩ!=@KyCnq\2ty?OZS;r@gelr'uA̧!릹|ޙ,[6ewN`M$}Z:(vUp)ҙ(vΜ8$+7jFG #,5q& ߐMcjz.6M?e;8ep~n=>|1QHLnkgGEsCbϫm| TigϠg {BA 1h)gZ'g#Q[gi-S7SO4H'ypYpt,:fS`5<񠕂\;QvV?ȅȸ<]-u!EJq>?7љURTl:˦] 48J. ۫x<+!Q^,& Ӄ_,1Oߵ_DT[m+ܞCИ8F`[9iك؊ǰdHd_"l1'i= eh[8Wh^+,b*YK -f#iaJJm6CPύQ+؛"Z%*Uv^}KeBsI ?kއFfB6=]$<Ș.[1z{(7Wߺ0d|k PzfoINǧŚW8-Zq`yekT{Ł5k ˗RVZ.XR`O?sO XR=˗"jekߣs &PB *TPBuUPB *TPm*TPB *BPu *TPB  5B *TPBupׄ#jH;)>EcV^q`U䔖)-qae䔖SZOGNqY2 X9ezˀ`y5).eS\ ENq)UOqm*TPB *TG[ *TPB|tƈ,"LKwYm{du-zDLʲ$#{  ߤ_WF-Ja􉤦)X̚Λt~; ~@)_2\ۿFv(V5/bs.|r=@A${Aj@Ԑ#r >D '$-o+Mr6+ UY}lCà. E.ZJd~_3a'b.tE%TLɒǧ8h$kT pM{G|ךIOp5JqMGDmT;+iŌՇoo 9/Ѿ2=$Ngq+c)vN-HI 2qrL5w7Ht\:s՞1o5v_g?E8?$1yL׷#<:Ir{8-yPqeCTdqSSy ؋dmMED xBOL]<ɜzg/>;nW+scgI=j42mQ]tn- }2syd.>{'{+RHQVӾdիfDwfsWS w\.:-"! J'^NgٹZ:C/~FHk%$]Q;&oR$~L* ѠLgf/%޿Wh 6~DW\n'zuv}EZX;/=ӆC\n7 "i6] v7*6ww/'䨃nR %c|?|aJG~5|NJܑNeo k_^RfHXڋXLd @QJbh'Wx]h 7üODěf@ix+6[y{9,t_®6HYgʋG>A<~67 !f3ՓU]͞VnuY_NZDQi}l)/e6N|Jyކ"Z{dKJeC_.lk4"g,{>Ξ3̴ (Z^Y}s@kM-NIDQV7p~r?lgϿT{Eܛ)|_־z33Y:p^͜a<#9x|6ϣ JL{  -^vVH̹SףGͷrŞ: '7fv/_vP xz8'<$҈:&R Jeo׆gT}uvhsJǴ%ΈyȟB(֜Dg}&*>h6:H9ck8}%RD"=.ҳT:~l%XC_F vo/?H>!@΄,Gr{5z&lQ둿!x9k|:OTO3TqL/Q$R-~/H$3dB7h/-Q.N GeG#eu&FN윉+ |Aנoҧo1G =`}W4άȬ\iqiZ4O|`HȗǐbN%WPna\LHr閘+= t C'#4Sܠ79˺TO@Fح G{Auv6N+ULn'F G.GM[.ٛÔ!xČqcfw(Ko|ך}0fŽ(jdgQgbcvx|ü^+v]=9La6qmGlo̱1BR2z¢%{a}t&|A'b:.P\џ+WS-J<4Hz/f{hjcsH_9;^|}h2uU]<3=N~1h`d謫U!a苾BUm(?u3W>vIKzZev5tVTi9:,>g=dm2#E huL{," Ry",ff˔dLKLkU+d,HbX|_$uJ`4uX3W &=A,.cη`i _G#Rs+_E)z^v6SvA/hw&4_Z Fz!i3i ؂]4&F3"h$?U[_-/.}N{X EC(vA Ύ\5AZNTwt3(AGo, =i wUG> A܂[Ig>Q!W9Oё;"] jBw= 6#(u#=UQM.t vRE&20hssbmw@rt#Fl8ϥ+אh{ZNҘZӯoL2}p+V]g3EuNr)b/La223ppq]3_3cz2nY"xUpڥa^M˕h?!I5dt>og.&ƶ)Er'yA?[ީb, iPM"/ R$BG,jvDZFD+d#<.ڂ8Г CAĚ,QĠh.(KL IDAT=v~_!Fڝ7XǛɭuzdh0_8]FH56h Va{D0H$@VpU9y΅͟Ӭ5X FMoqeaigss.%۸LWHrs9)X-XIA1$k]swӧ+8XB3h_x fk8t͕uKʴ t(!\ ;׮iR?Gu8nC pek"XueM☤&3:g4w{.KRwށ4|-EbGY[OqN`¢iWlST &# 8h*`@;C NY2lLZ8ʅdly՛OLLA< GqD'`23eXsD|M 1/e }1IE./%r\ŠcnQm::7[NKߪ 6̂1Q|j\^i.jG4lu;;=v.5뜖 V#"Pܵ_d0B+17 ir{s6l]PK;k4&R( ~I9J(:;J Hg0d9z{F>xĮF,W.)8Y%2S=Rjc 0!_9$Ӵ8Gk*VWO{׻> Jaqv(;8u2,wz> /Dƨ)LI" K,`Vu0S\mƯ@Q&DM;z}J#` G.Y(1 Hh>11mp׺ɞ8i@2nv &NKԃҢ%;n/ihoW, RR7gqĉW@K/*\Z$wPnΔ^w>Z7Xx*'Dk >/hY0R30GE'08%9᭵Dg7~ӤX2Ϧ6qAID#GF[(rRuz0G?nd[r"y> p (eJ/.*_,Di`]Q3K1wI( 5T}e%{3X|}x[~;$c1fi:&;ΥrWC%HmS`#0?~vA&yuuT:Ő;a[>=>ei8ɍՋ'tΦ ݵ9 c+U=ӽ>6UA?tLK\ (Si 'H-Z7 )of(ߺ'aCo?)pd!|㋹)9ztB`7WQGAVK_wU9G Κ qp3ς-1uV›xewSL-NMWR$!Q #W};_?Ykav~&5\2Q>ӓg!.yHbou,`:x*kKY Xl/ .SA+eˆ!y(3i: 6xVDr,~e+n\"EO2hm !4dC5+}w&\ R(8(Ƕ;ʰo'S1/8S( 6@mn.,/ 6#`11}R/( A7F)5פn;{ ;6D"pexqmŧ0c׷E~[%w|_L|păb0u_В=3z]M~Ñn!+yk (lKSD*taIh&pCZly2=Dưa>wg"O|V3ntW>oQ_ f`f®s%qJ,Kg&8i I1IL3çbqF(*3fGL.JuЙuB4T95fZ 2yt bʾ*-S["F'iDwX lm { t ̙6.oB,?; A[A|o~j|rl"pS#.Qh a7v 0dF6(v)g[{zO4[~ wF}om3uUm!@`/ۻ'id&D6KfvK0@pu~z~&]TS>/ʌt 6_ CK3:!@ ]yw|]:>Ø/RyN2tF%kKL0k±莂͎m!o6_ s~d5ȌUhdT#?^lK9r[$=ȦI19i9ml绦14z bXbϖ!Nmsz},>sTlAk0.d$9-e8X.,&d6pkๅG"\5qCCOǷ7y3uǍlF6u[B4oQtMe/PDpO5>.Ξ:Nr^È ]>EYܔo %@mlq[A܍),qLJ [7<_{[mIPYNEcG>k-|ޙ˲˝nɝ6^:(v﫠w픞6$ ga/c{ljH1i,8vcUN ,Oo{볽dNTƿL"eӑȩh:#I©pJˢ+ڟvQ`baX9;89,Cv8(9/2ulj|Lyrmor0E\z0B6*g3wQ!_4sK*C[-`*=.'cdٻ:{s_5N_Y_j>6i WY3'~tw5P"Zz?et~YRW׽F~%\Krv5Cwk-!җqWp~ y +~18i ̟VU&nI]< ߓ~Fͫ/V)EJ6Ek‘okJ' mUVm'XFWXfUOZ.\R`V9X+T{X)l]\`U@e=j*TPB *TG[ *TPB VB *TP+EQPB *TP1P#*TPB *T\PCq`Ue~)-Oą#TOiJ=e@09cX")WP^?EnVud^]~O4Rc <7p?%ʤ E¹ v G^$>[K]%;ؾŞRE.|-%~gKKf}d?Y{Y=ֿwȸZ׃p*l*Æu`MH=G^zei_Y|tB$|\Y>%dSljRHB4:O 6 :ټ(94!2M&z~?ˑ:?ܟOj{qԞw>c>ό5Fo//oY/ #7>:߫X"67ơcTlbZӻ^ L.・#8`iob>M$٫/˷.V<&:*S^s~g L.?YQ 5iO0żhD4ߒQR<ŧ+t힒zb2 ~:!Yˣkq_)@R.{()iyn"D\=w}>hbGVd62EI箒-se$SM̜d7[~\x& iOӷxLR*3\b| `-ĒY2rJ4Qݨh<'|#ռO/,1c\62f2( !gęg*8֨ ly9^rGk`ҏ4oCb"K;:|>4%;ٴd5dQy4"-t_d,J&2J^КRb/-69T)K-~y{g#Ld 9oqٙwi Dvoe.75iߛȋ[8YֿW(|kZlB!}OM*,h<\.;E<`>;]HB?5)?Erx:/L;+[6~AqԴ <>^J{۞s1{˃T J]{~fq}ңΊ̲8V\dvߣJ΁c[Q#˾{#NY5C"rȅePZ.0vmxfG>K}:W.JL/Nl /Ƚnv2!wiD{O vFA'~_é}4%lIc@=JdTS椬J%% dӋ54zfg3F+μ|-yܴ84X|vт"  -!H pP8Wf+R/Br/D'#`)-B$'0(EIOFLNZI=3xl$G@kuT>6E')ӅOtIN?8i.ژQ4!2N&G$V'x Q v[cFDc&\<݂?'YT4ATrB3G"s4KF^A/z8Z-23?!f{|1;fq^iY]/1zl*DS*2<I˳3HJˡ fbV{[.7…)ĉz C!ܡ7kMrG{gQ2S-: Ǖhර Yp_uXS0W2=k'^vZYd`pD]XeA'ި_X|qGEQPp;- )Dk L"IAQ(_c!9@HqqKz/ʠoථZ Ev%x@ NzQ TjC+ $TեyfFy~)zvj/(bZeJ:m;-c$|~1&R.\^ vyOKrN5D,8眳}WZb*-ے;nĦBK ɅĹ$'$$BB fpH-YV+m=Zͫݕ,J>оs;sfygΌ1 Yq Mux𩀪Y>4$2S V=FAQ{KS|8}f/H@M 4m8z_~+8k=!7цvNy88iyU uF [>_9φYtYň?J63bDI6Uq?̭*V7H֎tr?=,t<=lB/|8eŶKWUbII?j #9&MMQe1sY7N>@B.oY6 věg#/8ͮzy+fۦIBgu#Iܟ!It[Ul b C|ܐ!m/y4֤-fYU)/'KHb`m'EQ(to%Y8!^Tw϶RՅ/x6ذƧ ':u^C|>L_^AMORrH)Z/ęXt;hGCƜ9d3F œ|ʅ78.3j[[is'-?8%SujrcgLZf ۫.q-_$U=әS^>cc'(/ WnnĸVHiL+\F(o>`M̌_Cy:wRYӽT-WSQm%oQ"QyBl;:Ĕ, a7z>n#g7s%i>mObԘ̷04}'emL+M\?p G?#\$} * }ob7W͛Hf8" L#rHSed 8ZcaYqSܼ{yӈ;tnOݚG\ihr1.n_ɤ?fDÍ`NKQ^6tt08okZtR%zbv YdkgmRpu4**Xv5RĎ)zXWb#FLϹzK;h23MlT;rbO=3N&vnQ2Ug`PA z#* 'YFMU]w2>[9dsA +qU&[y\}D[>|mK5Srȯ;OESlݔDvmdV_OO[=U)<=PĂ:{ɗY]R2 tISѧtTUq\O'@5@}7UbElxqV= mbL:~J<0dz /1PJ{!-D'ض$Y357?h*tzF4VSd0.cw8ǖ>!2;$-~Eܕ)]Z?T(ٺρsDs" 6_)yn/Sj~i`L Vx1xh%VۃXdGs#Qbg)$F%WymGth޴^`7L.q U$ݢ.G$g XNᮥ~vHݛaH7.0X +ZteZZUVxFDܥ9/Oǘ{s(8y7P-FL~d,HZaiK7.D]wB ӻ."A0KÎZ('tr84j?`dE˒@ž.btrs4ޏ e`E.#8Zw?jW'c %]1w4CҧQ\ǙMqAGÉ,Sn >]qQ-}n3s98w0<*b}Gͦ|YW?iGnaw+ Bx}A F#A9~@ q3,v%ch@YVDan\3/kBeTNm>=Θϗs-pR0a@~**Z)US|8d$Ds 9w}kjcόXN:/tj'ަr~A5HC^ݨ"Zx](GP.=ğȟZZx{}l@71#'3X$wADΊe!G[ LXDM\Q@9f}QW"<(lG0 SYp@3.I.NE{)ĊYiIWSɼm̸YC@"?bgj{>?'l^F 's4zqIݘMulrPqv}%#%;ˈI)Lo0}:#&; S'R8^ήg̤-Gz($ĥ7Fa_̌c2OHdLF {—?Zh>n#skdnNrT|ռתcRNZĭ ɛt_}sWsߜe̱Jd?gͣ@/9X~@ԟ`3Gܤ!U]GC*jgrCùqN pN6|5\ߪ\ڋo`#R,}jC%"徉LgC/Tڻ>k<тS3+&k-,ϸ k:&\JY=Gn2H`D @.s>2{94Fv 5ਹӥ?\;ٴދbG¸A>:xBp%Mu%ز,CJg3lJŃl>#ڪWi+WV (|27,_+SOv2V:TL"nϽQO0udCfGԇu>wTt+~ _"ϐ_qvnĨ\-)1'hL~64Y_{u:8_]Adel{;3 lhh_U%3)6Ar j]{GpqBуmS0$pm(_qX=MIJxs8t`'s%::jU'hOC@?EJb(]oQXx7 Fw)*\2ycLfdv9^?DL/$ uT9dZO2(X$6-3jeY$k&sE@gh͘Jn ~G/v_lV;{b̙ܾ~?Hڼ+׎*jS;ۧ]8֩8Tp߼t$f7X$Nbt367)]=[j.u8LI˲cxk鿔'rǍZ-?NYBӁ2!/^EYX3N$mQ1_mR,b'qHF >XbwV1<`#b#uwhv,֯~M`k_k!PuyUb)-SZb)-kքNqyM;eD:t).GS\FBTiBth 4hРA A 4hРAÿ]cr^/q+gY7?g [^`I"W !SzCyJ0* 9"Ipe,1D[Ht#W?a;']o *^@|:T?fn;MM;,Hiϖ?k}H=&f𵩘E;l}.[%/j 80󵼹Q{ǵNBq ooe&Jd~.W:0J"}/zDida󳚹zcWm]=7mVϘ;>kJ/ؠcW":7qhk&ơ 81Hivc/1'?ז5g *ٙT첌'\ñmLDe2~D,Wr$*I( J:Uz9j3?~:㲙@Lyr|ŖS$sڻs˩|@SW!Z~ 0XM·}G?&(8;t>2EmS~3e3)}@D/ӿ}?a^E/_P6`kB#0eRHr^.W15CWJ$S=g*発u*> Af71`V /ws oISxx oug[e] aoU|ϥW_K |=&?]Aq!w v[NqA r)ZƙTڗ |P]ʼpK% |fʊ0YzI?*O^*.W,T=3lFI ]h 5}EJe $X!7U$=o0}'KԨ|"^\HSg/n;I"­T"cH#͔7Gjs45X~@`+kW4Txx:RA/''r)tiLSLc׿o+8v^>0/|2o_RP{^t_71ۣI| e>8y6s>wSxe6Et̑}fngos(.=GCdę2~ݨ,?́ZBcz jqe[Z:{;V?ƈ-xlp]/S)~ty\5i#4Hq̦op.^+l~[l9?@*Y1;Eax !@cC/-GNӶ7d5" SU69yXgŮِp+غss Q@ Svq UZjNO)ʇ˱*U(z/gfWc )wK-/Jm_ u*C|a2n\JUh%sU@⩌V.lu>D>QU9CS[N Q :S:"=sdy%m>?stk/>{9fI w(tNrgRT)lNgtI6hsY~g.Wg}q.W>J > >~!wRF C p!]mU:"J2iw@džo4)sI?-!> ~V UeU2'pS]g'LJ;h'"hR^v[?65u%G ypU`P"{T k˩hЬh`J7P۽TQx{V;D} 6 zП~H q$N \k @g$V mo:z"Ծj`O(q5Դ)aI/j̜S5t}T WFȲ M<fUE(>AOFFzcQiAC%qF?R18N%80{ \dGDC>oCϯ{r E}ϟ8LO ~dtIbBr.)&haEB[Z2S>/]HJěEښ+Idf7x~+fss'=#\\SRϿ 8Y,Hxg@Z1 DeL(o u7* t# `I,*aaa / IDATux^sጢGL3F&L(kwL>|ttRa`O0Lʟ4Q٬^V~_kj )V m$ G:Iu_*7 '<+#2GcU*Ç 8*"DL:KfbLvƤ'0_큞bɞQ:*"vǯ8\褵*qh~s s2<d K`!]vG0e]28 @Ѝ{g'`0վ6~~~qϸ'ն q |ZOs:@.,G:@N} $0ȶO&Iηt9oUɋU`Yh-xʸBO$W5<{[/X2H4ʳ5$]6 G<6`ۇlvz+fsm(3[I:Te\Aqe4]Lxy |>Q?sL`mEaCP h xQ`oUV. qqA]>̞!xcΗn],Q<[t54ؽƒt$1>:=9_y˝ؾ+b̯k60vzCrL=!{tA?rvA;k<=3ϷSQa Jʳz f&0fFPiyÁ+MvUvLRߕ#?)g7[<8)SuêHa#cҾ_*6JMΙ".z&?* Hid@QPOa@2z@].D=:OGv,0ZvG?EoqWʜ,6l1d ,lmgYH1em+%/${

    3ܴ,~dKgux W9[9dc RA!7[ G {}=mGѥyW(z +u4oul?Y7{OdI,w'kِİJCOGɀ4tz^كkܧ޻-mX ٧m|}W='(3Vq6dmK#z8VgywD{v\SqWR@4yH!.;FZڈr1sTP?#Q#Ovڶ8g޴,,˼y.zlVƛ%+\vC z`0n~W2pV˙>Ν#{?gBɳIv^s]-tB "=ܵv*SUTCPT:wD)hmܭ26-D2UJxC ,ͿhtXqVUJnU)Zm>YSRҗ |}%{-Q|lߨ"X̓,V'4Fı^`(H^,p r*MgMlz#ByJ -l^)6&oEO<}>PEě(Rq" iA$4;`0ٙL~|~NʄQ!DaQ7Ǫ/XO4{G!F^J搣*@^;cr3ҙ͹2IK+z 8uf3xNYC?I}T%9AaeI&/Ӻ+'Ig,ɡMHJ!+|wVH6WơNՙ )a8QS8^@cGi sڨt+,ˎCt нi\cdu-N_5[Xn_g& @τIW<2gˬ+y6(e!{f6LO Nɟɬ-8Kym(r5Ʀc8ῨdgDܪ0OO5#U)3HS?T3X3тiod@ 8xcl9ct~bTon-ew(j*;kK*DXԫ[䷫.2aL~j"3 18#ںbaQ`~[72KGJ#ܧU _KuTnZ I+{l>'lT1f L;G| \g+kFΡ`dŃ:!N3O Q?-~~ V`_2@A/M(~̉z֊IŐ.n \= hX\[3^ɹ[RX:'hOʶ1wdB'=Ⰵ+~EE&{l[ 0h~<ӆZQ¼81Oڊ[n3?rѹo{_MfcqgZ8Qտƪ@ƌ;g XnaNNRG[jUѧHxVɱc!k ABre6$ m/VQvs%t'.pО.7'P<*=8{$#_Qa1^=IZ9\ٺ(ө*Y LJ.IoC)'WjOUx Bfc/OWR?A,U uBn7{_*ajx2Agk(( QRX*_8d{I w&]q?Z~1o(t}hzϞ8bDؕ^.,6S' 08OМ2't[,ɓ9%rn3?mΩ{^|<{\2Y4ݐsp`#)F ׉v5)H $pǚ?wFQLrјʵk|eic4yG5NC%<8K')a\U{ѿwtUiӎhkL_C`͎k_9Xj`ǚ5{?F8vfku4{֭:֯95hРA 4hР94hРA 4h 4hРA BPUm  4hРA # -A 4hРAÇv,Xv>CW X:y픖&tJk)-#աS\vhNq92":ťJ;eD:ťC;eD:֠A 4hРAs5hРA 4h@;s\cv^{UfC^'x=ՏYؿ9&>MgH1˖?,3>Le -*?XHػʢGesnY]ѷh 㶔"L3UL|)h]koQ/L^V0@p'#O_Uwk <cT^kJzCWOVcH WxSqO1ɮ+} <k>,Y꼵=o3b* x8A 3$z¹6}Hp#ɱh/{N趗%rS[M#Oc?_^~V3S6(x*ڶ쿿 "l.}[N@SG6-d1I?v9F}21I+̱RUڟoj2td|54$٭n{ U_LML%H/;~-R*&YF lf_D2IQ)KJjJ (ҦJȝ*R`=5vP>!#@UӴ^xGs@bJ rg[Q|$$w&S@Oy 0.Q^E%Gz-|!1/#WrWH6'%rOiy"O'}׎_d>C;WB#0{ROusR=<7E:]X2$wG(L~?ٹKxxtb> m>kpʇ/Ԕ]3.lt#]%I R?m.k,!A;{mo*n0 1"M'#NZzO.{sؽQGюŵ7`dqf`W]8q60Y-IePb_oMr9XoA?]z6Ol9ҷ$|ޤrէc#kU$^m[No2V@՗kAHQY]{ SS`Ul9DZV]ʀ@3T 3*Kނi4!̫L\|~ lom#= "cכI|Wd=_2P e@CnU$=s6)~56>}T=cv覛X.ˣ^L\X`+~PCtQs{9--}>)P].$m&x|sH+AʿNɉz<Ϛ&o3!1WwtRG_O0 &;.e8##-!@,S014tS W K 4LSEf=% Gm+П|/Af4]n'CCCԺ .2*}+~m!G6pRYrUƎs,pLq飭sp{n`_/)G< #jk [2P؝ThbþS~!{˂):2 1ɣ c?IgWG<*GEJ$/w~UE(_Ϟż8F]4ի~R\c/ЩIh`J7gK);!ə9'q;/@b(᤭@ⵖ2IՂM{5\"}P}x:%'n ק#O M̓/\`jEQR6D]!+,lilFɢh$tQ)Ȟ>;v_ַZ|-RY?wsPnN4vE&Q?}![fR ukMHc;1cy(:(R(_xOɝɐϵN67&u/᱉(4=x~B4s&Sk0ElbGWh\s 9}> *wϪ8$@2.6o-i.7s ‡ ^zqge@E)%4qL Ӗt-DW+?ҦELS|td\%zxx~w^yFU]{w43bɖd!w168 ) (/Bca^$$@HVq\&[d[Œ%MaȞ`ޛ7ki{ϱ|c㡫*jMXg4:b TTK>2ݸKX.U1 ^u*~c$=na{bda$#‡OL9ˆ;u菀c8`/صepʽP/(Aa&;BV=(ۙ?QF_Bb1  ҥf)2~dFQgBO KN("2c%cՓOMtajs zd3*Ћrx}#%0H:><>'&=QS4?0X) xiMA;K +9ޮNdʖq=DێeٻBݐh EcEBFoH}s01faRANqk5 84Tт"k~"lV4܍L^bF zy#FP8aC?##7p~a"~B {aZv.0(Lņ݅GL(&X.~dH13WU>JfSd\.z}],c1 ̆>=OAW vK6[NζLfQix Lr0RY`+^o vXHDnp#%^\d"Htn㌚ aMQ? KKŞI\Zh^Dpq^ % 5ţ)LQbϐ^Mud+N5b)ϡeÜ1qpb'Tэ%Nyxa;i5 ̚ˍ摍L2 7yf#L4&8\aW;+}0#pyi/Gpd3m(3t.lۓP|ݎIDATHeOvAA{1Ș*ES8VёL|OnA02E:LEȤ'SC::1/) :6G`]l!jᄨ*f`V *Q졳-NyI75&/miV^u "4".K@(<>}c+JFBB.,#0h\*2-Tu_2ژT­e%ox& =|?ֱmnoUsÄCJ8&V /P::noI$d?}DpE z~ISoK&B{qE=ݮ[6aLr-ֳL SvR7z|!3Au f$];{꿳Ԧ4G^f>㳧s`/s5ownӿG( P F!?n> ΏxN> HuJ9t}iDnߢ >_̿(pÛq_EY׾'UK 3o(rO5vab ٹ\$ZJ|0&/8{ ;/V6SoU[ 4}:#%[o<9Пao?B2/o^`qϑPaڷ˃xc|0:=Jjtƌrx¤x@RǞ I_{ݤ+p ,i\h3PzI.lU@r>?kU:0ȉ|.tG5ʧtml_4UK>fw\3j-hM8Ya^OM;/{)_?ܦӱGE̱7`a񏪴/Qjfo FO#bp=L^*c}2S1asO4@eqȋӕޞ &yNa~!Nz7lU?(ByCJTP,#2xDЗ+!@Q%?gʕ2WCa?'Q4'!OE8IAɕ 8=[GV᫸,0IX $r1wgZȩYV.@)>?"_͸̭ Z|Sz3<-$̚#$= ,}5_ý^.?O*j,P$_و7!2!OtrۻxCj{YXZGw:K\]_瞶KR^yٸ6mYq?==<<%JM"!Sf3v"Ϻ}3M=8ehSѸJvf3ilLSfd".muyO)xתI6Q(Si$DMTeЭ !Ԅf4R{9imHOg;`%Q]#XFϋqXЗ Dem  JGB$"-ѯE߸7?:|` џ9|`$uBvHHV@yWG)B[f5p6ȑH,-FR0Mqsp8 (9qg % زR4f~)jš!>WX $I)EdžWtwAuJ̘FEJ@+02Q5L$Ÿ u|mڵ?+t6 0ueUzjx3lvɞ~|ue$"=Ezyk(ɓ0*2lKxEQa|JLu_*"z 9֙2'}ᥫo^oGoG=5ZRqBUBEnyFtNqG\gڙO (U<0ԩ'[J0c`9$*1Qy1-U/iEbr3Uq}hf>ܞ T 0jbb)fLsf$ABJ㎭(1Sݬ3r(zw{GctxVc e/IPx}uע@B9fPW5.5c@gUdt{fo^C)^z 疮slsjs rX(^łcLh?&Fi{EZTqbk?KlëmeEգ6V깨ZhL@W;u\RÁ|RFcZ9i <-aYE~'^Gy&v믫GY7ࣶ&bul{UZh/z,as6#5|UNgWVVg5Z;ahh+uyQ=KקGYgree^WÿT@wOIq?@?-ߝu![efL"/8y' XϣT~hEFo_l=|ºq{u 5Ğ$g .gΜPN tgx;f@F)»覛F~F?>`(!YnYx7TՁv\ gQC5'S#L/^YO| )դs2(D_X gCDL9]i.K3L̻CY8knB*^iIGP '||&3 +ut?ӗ"@wtn60wV}:J _6q9^Fݦ`CYtqCGCg${59~{2sA~69N)B"T?JJ6nQ4I`3ܴ!0 wwXjBŢ%OVhyle+M`uv,Ò)tx?kz7Rڣz 'ߟY{jhX^JTVj(?;g*[ӱ2u'?="ul9:>;dVu>E RVy X-9ݹ7rߡCtsk{F^װ0+deq^h;F_ȍTr?I\.S gXe^3.a#E/ pkv9eBU{|QWr{4-Eg^&>cu=qwk7Ҏ7̜%yxKTdA/r;^X6T[_ιdf%=]ގ>:܄ ̛/E|^/E0,7e' ZttyorYLzU̜,?n}➏ ,c}"g^Y`3T}G^Y`iGX9w[^˷.Xums0wcSy{NZ*sP|yޞ)o<#<#<;yGyGyw#<#<+osIENDB`rivet-2.2.4/doc/images/qbullet-note.png0000644000175000017500000000054112032344336017273 0ustar manghimanghiPNG  IHDR [jgAMA asRGB cHRMz&u0`:pQ<PLTELzTTT8αtRNS@fbKGDH pHYsHHFk>-IDATc!% S@2i0Vr6d`PR4u``5(%tEXtdate:create2012-10-01T18:28:46+02:00^%tEXtdate:modify2004-02-19T05:50:41+01:00f IENDB`rivet-2.2.4/doc/images/home.png0000644000175000017500000001270412343445264015623 0ustar manghimanghiPNG  IHDRd?m`bKGD pHYs  ~tIME*!@0\tEXtCommentCreated with GIMPW,IDATx{]W}?u+Yz_ݫ7u' O'!$`4ctqIqMIH&'i<ʤ(48< cK˲d!eْ㜳>>}JQs9{}Z}:tȾpcǎ\-[p7k.n*3,Ǿ}lk9 =qkﰇz.;^ eϖ/_>mcj5?l/r;D{?nf{<nwtR2Q}MOًضm۔;3&҉KҥKѣ/XP?|}QDY=|u׾6}&),3gp}he/7 t$`R]0\Z|&f AJHIK_ ֭geh8%a6iFʔAOH+)g>c ti8>p-z;Ysꫦj¶׾/(1FsԒ6% bdjQ{#  PR$SOr?}3$Ko}]}풦)p4\*Q)J-IM*jxp$i!>{o~ 8DnlZ}~s _}wI =uY{Y5yg7,ԉEpx`t,XXcٻ~cY:s} M>79Đ\I "`3c-[eZ@),xNwpsj+?,~;6-|l gss \mی/4;h!AtX85cojq&vg7BeKmpx.<;3raP7?jɩ3}{;z4AeeC r CY_`>>/_oHW7!h!"ƲY3z"#q#n->iE"9ꌦӿ[&v\1U+i`wwODɁ?Wt MgV"cĴfL %Sݲ#AsIB!sGDy_O"{eIR3 gTكf~!9PR8I7/}GEqPޠn)D+̇2A|l ,œH}49tV.EmCD5>Q`\X\!Yw=j!缇 #p[}RY{۪obN u#@&xih<}ԚǏRٺ H%jF4(K:Z镯7a04;e* Y#ԉ`P2Ox}>$NPs9 +wT|-T -qVUTĻ)%:Ap0W \D@SϫؙI!Sq-d>|)$$lRDՃAAM)xɬQU.zؙð{i{eFr|Gl9ܻ\h̉tT^"m;"D _@sV"M* ~;_2߂Paͽ_'3l%gb+*EzTvS۰μ;I~)a?S\uˉVc^DĚB1Í :N o`ʋFK]<*7Ozvvb9)zY7hK,X@B2cn\"ruǏ`I1wy~Æ$\* Fǧ9W]u\rd?r !X/r32t,)B3Gyj- ez#wI> GjZ$1*'>B;Jk 8p[pZ.41aJ&=7SYꕲ1 '%dDҽ7P#|. Jڵ׏q" \4);ϰΒ䔜qc[R!@,,Y%;#-_Oy9߿ƹRLsA. 248rAd8j$F:$4#P,VyrH TᝫG3`6*j¼tj\3;S2YCbb)$*|gOp"xq 4k_l+@(d΍ύhDHTHqs"suk2W6Aŭu?i_#j7SKEx2^D9)Fu~*=57XYϯXEM?OtJB:G/YDժ 09/ ]۶_~[7>oO' T{4$łR陜&H-?b3*M+;t:^W{o=7͞~IJ._zë\OR s -P3\D݌ c@޿1ynV*('J. i=质,z!ZQ+i\ t!bdlWD&N*+>Os;zB.r=^;|0rycfo7/fFhG5b@H9a,H &>I11|mL$X&Q#RS%f99\0U,C\[z$Hy R6`Vz<6[-by,VkKcmd'-!sMbaS3 CAަJ/SbW< ߁Rh~j?g0qF@!eH,0܆x0&p ^J5y=J % P<*ğ{j #7^L~!=&Ṳ; &rgߊFmͩP; ot6BJqC Xdui]}OL4+|) -CtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com!*tEXtSignatureee9d877396ce267aeb0179d35f81b2ac3'tEXtPage25x24+0+0 IENDB`rivet-2.2.4/doc/images/up.png0000644000175000017500000000143612343445264015317 0ustar manghimanghiPNG  IHDR VόbKGD pHYs  tIME+#`1tEXtCommentCreated with GIMPWIDATHǽ[n@;6l.C6&1NKn!K-+ŵ팄v?`.=x P;U"Fp`L[xP{*,fj#s…+4 e7Z薎>S: dIsrbRt" xF@J!FL?NhU@Ⱦ Xg/dϫ ޅG`@xN-pq\ݝr9ͼsFg3d$Y?Rx1XD'lZ.qķ1,jhB-4=@9a4[ԫkە90evG;\ tADZ/lP4b% )eR{lоxa@5TiqM #7q;J;gR(rK27K9howh6y]<5L@R%H.90 *xƁ-5˶~L4nD8Cx~?ep! xܧdg_ K6Ɖ}>{5k6f_fOg}cu`l%Y=;ͽIENDB`rivet-2.2.4/doc/images/caution.png0000644000175000017500000000234211436722370016330 0ustar manghimanghiPNG  IHDRשPLTE!!11BBZZcckkss{{sss{s{cZcc19B191_\bKGDHIDATxuێ@ b̮IcAP`bxsBEU_Oh<`'1wp Wȝt:%su&w,Hȯf 59v:\^ F;`HJ'871ZJ+b2B8Q$wRK v)nRpt}VbTzDv@=rPduvz{Nl;a*CtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com!*tEXtSignaturec70387830aa4ecd5a4a32a852283b3d6PtEXtPage24x24+0+0r[ 1IENDB`rivet-2.2.4/doc/images/calendar.png0000644000175000017500000002321511436722370016441 0ustar manghimanghiPNG  IHDR]&sRGB pHYs+tIME bk IDATx]yX~9m紧Me+d+b0.a,Ac(dM% K*YCkTTHEiվSgQڜ}'wz=>8  E P,3:bmB`fff4FD@@DD@DD@@DDPCܺ^ `p앻 seIoދ|UW1s5?i;tqä:6QNfu)m`Vg&=q&pDs4߳;qWwX֨ Od]W&S]ٙ%ZX+Ƿ𵀺wU͖:9޹p#qFs+m*^\>}"sש@O 8Vr 댹| 3=ٟ ~#id1ݮ%PWޒصw >y|#%;L${'G2&o;ix]9q.<"+deH-jYb.@bXۀ ;lvB[@DшHIEv'?MFkKZVVbe%Qd*%ҋv<@~Bgcѡx?ΏxƩO޲ԃ W6PHUYh,kh]zQ% `DID6̤/ _Xi mFS UӁO_iͩK{@) ~ ?Cd_Rd5fGuzy?m)9VDyF>{/h.O~~h) WT޹Rykua~ztrNٳ zQy{;'F>ԖLʢ6mH>Ѷ,MXBR=t Di6E_$_&a#(9v'gRte6@k/p%ܸx`ff]*ã!n~p h5/^{8zdF_hƈ=.:'w :zfi}vtQ痢k2aO0=kۇo^@.ދw qd)oW 8Q5MsUO*;{.jݼJOÒ>S/_c$΃bm1D #]~D$+-vTNQO~9UAJiL0(M-2%߅?SgW&HocE^pR 7r&ɬ)K }^#WyqH NhcRf_mɣ+(CCxFfdn>rMQEtV&adZl9@osiVtGDFezhL!K3pv+dI $ά~trˎgNU䍀|qyqF-ˍ%\;{b*Y`¤ZjECݗFR1 i5Ɖ5SôcZfyrw^ձ@\~ +6.>{<ޔ~oE, *pզjwEsQT)˗f}hIdUsn[5R_MpU 4 w-r tV4G{EoM7%gw٬(xiF1hOo9[w᛬"@we,`Uf/2}x j9,OKf!̒pN|{n(lB m8O /K\Z/,iF /u-8Uo(Lh)9sbNES4tc? ܶt( I'O'ax͒o8I0@]j0'uv>].Hm)Nc˯nrT써%ιt< rz%kRO53{= ϳ+nߌ}5{nЗ؈c[G:N2`>pY;EvjpMf7>Gso*TS ? P2fl jBlVwIPϑ4[S3@K)=M.@R[Д< pzlvc7;W ӄsX Cך|>TW3T=r2$@ݐo%ffcVr *1E~Z:?gqc"9%wߟ7z l{_ȗ&Pd&,jYa$6P )\%*ЂɅ4Քj* i'[ZQ$@ep54͈cG6[P!.@Lȩ>/Vվڻw+ZI Rjc,yˮ,b@'Lkp dW;h~z Le ]'$ @m2V.rK@FIF89vW%4G)(LJ)ԉ $ Rf⯢ҋ$u-Z$b2j5: {|X($D9wV0sCip2e ĩ _=\2uĆw~9U4:è+}*T %EhK.4R ހ,Fufٽ(:BaҖYг_Eg & +(vJ*͠|Lztw|/+86HYI8t=Yϙ 驏.wY3E[[7ٸ<76˒Gaip9RW a!&Q~wMn3ؤ~Ku?DYoSf7 =D ^g "Uƛ$;8Y%J ""p=g˵E#7~طߋ/U4M-yh4(p?ǻ>uBUŚ8gb G[pBǩqmDDDDDDDDDDDD^ P{Qd`Xq!FX(7P2cM-gH5~H*/k`"Y}QV7~i@Q2~+LqmfG=42MѶyˮyT^}(R*Hiid-BDF񝽷8~q1VOTCѺ욗=.W>MZm.0f sevC!Y=lҨW*07Vu:ӅmFr k^$mN'qn+(DSwM535nL1_B\WkfkfˌUg+4+P|.H:xP Mmr::M/xi3x4?>q*(\^R4BӸURkreF ƈ%N|Ʉ"zLhV;k=E9wrn:$ >Vb!s+dcآ VD ot^5[e.K5W+y_;}j[RTǿI`aEܒiMʝKȒdh5=YaW]:3i!ns4$I 8&|,#%Ǻ:KK+8v|u." Qx闎2pqD`L_̺7s1=fR jeʣ+[|!N{/#}%*x8<˥c,7:W6o K5Wt~&Bf64/%t#0V4 ~"%Ao U Cr<;U:Gi<1 *"|3$*P3'34g5..?P2Kdv_9%2}E0Uk1$roTj8boT^BYsO1c'+ht6Vy[žB7FĉCy4{fR_9JI:pÝίjbj2|`<1ȞgLf};\[BQ\;KꙌ7NO18OG{OC/yv5 ,,6@g1~u8[4?(@NlFՖ*; mX0v1Fݐ|L@Tb (zSy9\ҲBo9#Vur_`jv&'4MɘHK|1d{y-Uڈ&e._⇻?M,'#RL5iaCa1Nu<YjՖ]GaV oOkv]B2 5VT ;vVA7&1?vۮI-J gel~arqH[F^CV~3@fߠ+iH M8ӢOk9)SgH#}zS,*FCYv[;KckqRe$O[0?&Vz"zy Y 3dt_f <*9kI_ "6_5h42=UkDXÄHIbR6M5DM4-=`uU_V2gFk+@MKGJ<IHyOCL5#z1oXWS:At(o޼y3(m Jh}}XD"uZnm!+A0 ٰ+xIGWd11D׵qe,Q8i RzP2f,s~_{ʑ".)FQxig9ʀ~8Rz46$%+w$8NZEtǮz{/Eƚ"Us0Ȟ*)̬D g2&*@p p80GW\ejk/BJRz5Yo/I۽ʴ g+j-L"xUs@෦-T;MxY:BD%c3bbjmqjSޔ(h-K ^LDF̓g:Zt=2 cҋjiLQ_;Ӵġt7 i 6&/ik+-qFRh#ՈJIrB8gOvUq׷:&+%6< {_Po>y©zmXXe.z KMɯcH>~ƢNL8@%Z{6YgQoNl 2/9)ڏh? 2": "" "" ""*o Boso=AcDDDDD|Ȼ%z|\ _8(|,:MW4gPG3Yoi+NP jPl*eIo~;`Եv{XWnz,\o3KW]urZ[uAvœSUK(It޿MFϺSMI`^q]6p{W. ܯu()ЬYms]GzmV8aIGql}QUKkT8;aG; ^ g?)oy_f{7O_+Mj#blp&ݛ<%]~`*) T,A rE)RpWd >DvU?y0OMak\=Q/ "(ɮ?upˆA-1T8SA #|\f)bvW7 ^Mk{^f{|G]ce{tJ\߅Ͱ1B;ֺ-Qߌ~}A3mbYH|p&oA,{:H^0  ձ"ܝ*6-Q֟4g461լ5TvdD,y|g™rawG *=j pͮSz}/Uf->"~zw(PLVۃow|tL3m%Xѱḅ1+Dq0o9)/j{^f{p&=g˵v@X grxXwWd=2&m"KfkKއ;30M[s1/h>IIDATC^&o gr7z`j[-A g-Z-T-GoMpE1ϮW1$4jS1\AU'Fu@DD@DD@@DDU@)4@eD@7(#" "" ""1"OryV:6\rD_k%o_ }0+'ΰg X hȃK5 }-_Z61񽻣oN>;R3c.zF^ڷSYcc5/{\/6R'V% |b\ow(+owS`۬v<Cir@i>h[ìx4 (m0^ UlliZ9z`j>?Oܪ< Q?98y֡Zr̆]mJ!kl~ب/^p_~dpusS\f'yI9ڧylZSQkyv1ud[& @RQw_LLQg1_B\W<XM UыYf(V\gݕkDINo sqPG`q B\#vNUlh7%:y~2@}4 l6 R&X4HL+}ϵ`(t̮ƙE9wrn:$ >Vb!CpGFDP\Q #;400 N0G_O}Qh9f $IKo >Y,dbjCl.-&.llpUչ"&McµH9)xYUNj `А Y>^7 c}-)(0TYin]DJE0xs5qʼI)a%\@q0ҫy\ ]" -B5c0 3.bp3rC F놺 ֹ+K/o(ϏzZrObV:tvyVm/寯&o0m$'JD|@FrRDDDDDD^$B3 };:"|0_ uYOIENDB`rivet-2.2.4/doc/images/warning.png0000644000175000017500000000233111436722370016331 0ustar manghimanghiPNG  IHDRשPLTE!)1BJRZks{{{RRZZ{{99JJ11))))))!!p;bKGDHIDATxm}o0M5%%m szP^UDKnk[;һ?0n!qCtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com!*tEXtSignaturec42b7d2d564aab588891979703f02b45OߓtEXtPage24x24+0+0r[ 1IENDB`rivet-2.2.4/doc/images/draft.png0000644000175000017500000004205611436722370015774 0ustar manghimanghiPNG  IHDRKZJgAMA a IDATxv۸asV8 BLhp7v8<[ w`9*i$4`-B ! xb^8x5oTGa0 s;&!b;07kBC}b$xkeY?|os$x cx? /󇄎 {w:Rqpt5Ih'xH1' 桕R4EAB;[ ?Hhŏ1}ZBNBHQvC4)rB29턶n}|CCkׯzA= 4ew i}dx4! ZHNWUŸC4b/_a~9B[4l/C4l,+4l)rϟ? 4`3&+m-c 8z%*i@55 WO#xyy9NB7?6ϳ3cNhLkظwNH1&i֮.yB e=9i4M8mrv/ .@b,5ẻVwͬ [ xm=oD% k v R"e2ʽV}Bv=%~n4M0\.OǽKkm{_ބ4Dd桿 8Z9ɧGHhT4{C% μ$ʤ k4!OT,;NB rzAHCyiʲ,NӂZikòvV41} 7}JyeѳIބ4<蛄zӾgiBcB rzi:InL녙~~~.K܅JrWB+iO}%BH$ 3?UNpEz2?,fNnXk]%kg~J~ZK=q ibߛyq|ArBkyݗۉ#1' _Ьvmۮy*[OSIH]Vބ4|ޑZMrnxޣ$eQI w*~o*i{Oθ Rb44Њ.uYTiI_;[IptЩJph:szs {SI8.j#u=M% H44#b=촞p8>OQcN>4! (Hh4! XE4UU" igMӐ{T.r8$u7! eFI??MHHQӄ44;}NLl AvNr.}CӮ$t⬧ iIS 0 iS +Ŗӄ4DND~1)`nEGF% `Hh8ɸ7! `HhxCNvWOFM]bO1U4 i;&9MH ӄ4`O1l.XN?uB>/7" 'ZQI ]p2iB+B@Hhʜ*! B$49sVJ @\H5qaqvuY'"D^Cm[2!אr<6j޻@H^(;4M֕! ;O }N1%oEQ$! /5t4^oy^UUUUί kxI] kPCCi>jh l,zzve8l,iNXNpdrCI>Ӟv,QtkTvF,4-)7Ri546AHث09::! `O@BIرe~iHh(`iqoWHh܎JY? n&qx5]"i2<&ڜ&J4 \*Ih`pnmOXuҴiQIHֆ4 'i)dP8Ih8Ĝ4􅜟󜄆+T!غi8BQy_^^i8AH804\ڭm[Ƙ_~eY%<*iø7pD4vn5rqoĉJqc.˒zq"ڒ{#B wވ40H9(@\q}BN#6Iy}},K9P)4|f~Zko=B$ygYVU1>2D.UU繜 uӈ! lVJYkEQy^UQ ! lBf}A=mnIO\ 9 fNh6ƔeYEe06V&5km4YIaMZ@Nc4 0Ȫ-9+1pFx4^H]ueEQ( kiFHAu]d5cn вjš2WiCHLOITSX;AN# Ba^ XReiY~Qʲmim\nFX8'Cx ! ?niaij^зl ~`~ ooo}?|.Zoa-cw2r"}ߟ1MTUKw] eY>???<8>|^sI=:"y◗5t:ep5,!MF<2i|BCW*RN| D6p/̩_.%w}Ж ._{,\54+*i`38,w&M4ϳXKsߺ,ˤ2:~42HY /diIS׵?U|Ǹ7 / wÕׇ0 r:( 9b+{9CVm+qoWGлC% lm.J)kP0RU/M?Id2i|_Q&$^u~LY]}\duuGa.ޖ-#kss:Haؒ fY2eqs>)y9i/B/7v\}Y[Zske75~QIbuu<[zE% kו;eZQL/b,˺i^-g2ĆeuefY_zW\Z*Q9:YU|c,x¶i j0qW>YKڐ^Xk*7&v)a|Vi vooo]׭Hi}$tQ߷6m4@6,M=;i[%!?69Lؒ F\݃WBN0"9[vG|e ޘ׿_k}:qC#J+Y$@1MӬÚwބPR:+䈎(Xup|ݼWOhHw,G꺮JEvEeMӐP4{uXZ맧`FRCOi.ZNHhB؇y7^u4Mߎ%>KpuCX>Hm:Z(W jmBvc?\IXIӄ&CRX')5{"FT D J,dۉ 4'8_u:8W7&ߑC$e w>NBSUrYsIy F Ry˪ye m$4GH{bq}E0ӫߑC$1KgmHhv/UNo/wxRXB(FԲglGDvZ+GnqZ7_j5mB/Aļ=$J|/ҟ_qW'KetߓEUUOOOө,[އe_n?YF:Y!ӏE#YT-U80 ZIiMI-O>FBe,VJɦfHh܋Jثmjyzz7I[,v,M0PId-BT{wx7ZήUUI}aOi`e)˲;Km+ʷf^6տ#_ WZN1t})VE 6?`ߜ:uݏӮMӐ^W@ve~L~Hh`I#"Z;ϳA$[k-7Z~SwA~X%ҁ.~DHcKKO$t(%9 u5gyJ]EHS}󼪪wNBb4!Nx,zZJjJ8///+w϶u]4A6yXZbpyaMdeZk<ш/&QI#NBk[2x{zǗ?ڲ,1$4B!H+} IDAT)gWUroleOOOr5! $۶dLZ7M|___y}! neOz\&On{'Xk-ےDBk\X`CZ9XW grʯʲl[AbI/^ dOx4ܓ}߯_RWU^N֣cڶm{Gz˧iJ/?1UU$4??pF^__o;/&:^1_x~Ϝ|>;y~}anZeYYeYfY˘Ll;Udw ]j^z_ 1{RC;OOtrʲӠ4r0r䆓K:~DH?xSt:UUUsG7H1d~&W#GH|Z_~eiwG^I74دb4ׯ_n_ZuݮZ+/%_i(a[w>Na 菤vR:}c_J>Ӏo4܏rp]ۮYʲiL68yOd8n|>:5tMlA%v]LN.u\8u!}hkh <#YD++!士m -IM8-/j.(<0b!9Oh+#eY:ajSJMӔD+)4gB L'ڊ8[N])EH?sJeYd`VN\mYk˲trҀ'>UIb_qX;HfsuoD++:HW\'믣 SxO 'J)cL{Vǜm @ABbᔢ*'kpn7OX<^8g 4v ';y1 dkmBv56}2 ]>gq#u]hTeۦQ8Ԟb7r2-f&dY䳋r0 8ק-磆|OWiN)pyu)9ŧ1feNf&)ZّɥdKPtzHZms5<0 Cu@҉!o&bYm[.r+a:Ȁ|A۶m:` -e3R}1( WEc-FʏЏY?~òI۠}O7𰔟ȩ:$+^q-Y00 I$ckmoѢ,KWcfsGy褁QoZWUu( WiX3 <&GsJH5iZ3!mͲ,h0Ƹ:rAo1?@B1MW# #gapr)P@'^celM%W}azGΙ3z^IkuʾnccwZm!Ůicqu?;"3? @1 (O=b{LEa(i|>; &4M0,u km4+{:z_v aGB]Gk&_cpzdQTχFuyElB;Y##Nni첫Oi^Ek4,vrc@9٘b|JEʮ->N:KFe$܈'іڶu:T4־RCZ+.u\ \~q9r#e)> t]v=5kr䟉<_c㑔<ҒZ+gr?Y/j1Ŷ,`wOx ! yyoc$,˲,`VJ}/,9돟$3[)@~1j[ίw;tx؃#WXZ;r߫|tUU5M#ߗeQE~$R巌'ǜ?5nq:RFHo)LNDnZ)U8-ijDKGr|!=G>X-㸮kלNoyB+ny]cO R1Y ޞmz=x qo e`|c?*/Slӷ;TBtwPz<5cRd a7Iΰ10 {r3YFŗs/g2(cEHG9MBozT\)u]dE"ٲH!c8wI,EtJOX˒ǻ]0\ BzӌrGNe܅2އ4 fFAx72Xk0 LBGNvA!`$7IhY<ϳ ^G-[Rt/+jh` $9[!Q2jD냗%654!?^nIbUJxdm9Rb&In q }u{iߣܲ+u]\JmّIJ):i!c{?/_B*޲,<@E$s< )܃s}oNK,˪zm0 {A !yw]z`M.RHw$2-[@lYON\f^^>@o>\`&jۂ&H 崵r(О,TȾ^ߵ"E%izf.NB1#SmNБ%]| bFH'n>2:N׭ga$4-B:}iz"܋;4/pYQ󙄎$?*VOkHB8&*VO;GB8,B@[$4##e_9MB88Bp$4GNÊ9Ihqř$4,C-IhFHݒrwBB;f$뺖7ABGl  oHhIh ! ??MB7rPNo2,}1&sB%Zi71Z,c1J)1F#'ظ4M:ܓqgcLu4 _U˯G]-\Eey/ն/m,*GX%8ھiZf)oRUei[aeiek$8JNoEQcZFɽnk)m CYyWUaxuYmO@i {{{KcH@VZ8 C4A7if8}솱8e GRaƽӉqo㐖sXӆ֧)zim>=0wv7Miǰn+Ƙii~D!=MS۶;3u4z{Qi^^^PsUUeYn}/J\?-eL[k1,3?@"}œHx++qIږI7<,G0 oooZbXV-kS-_ȟ9V7joez=.˲TeYJdYfonQe<8>hHtuu 0 Ȝ=H`|\<BZݵFf9LZe5)7**ߓm}_9xʓЛXa|&r>?&@=͸7} *RV{xezЛ.Z|1rq<^!Б,|l>M|'*JY<n6B1? Iu/Ga}lA8g[Et:i}10 yA&z:׷6MmAw D4Fg{QEYiʲdVxxcHhW꺞贜aby&l{yNO4M1&Ao:eAZ-'R8=b8SsK" ž4HN8!CMGd~QnI䯗Jk-oyv<4bi&,3s454iӓeYQny.bZݐb!w]iGx44M>˲TQr{`]?}dőLodYFB .E91( Wnr5/@NSUo^bkؓ>,Noǎz`_=7 vZ,7;?8;a #!놝\JL;._plJ|d)לz:Czz2}%X|7/7 繓B,yDkm[ n=$iZyd-={8SO-scꖐVө+ɑ4Mn}4G0Io<K Q?өיboN1&˲EvgipHr:=ڢ(VNK*,Ů&#er:1ZkcNn  iźeY npNeDN^_ЪiHƽAJphCNJ-LiX%|!T,e iEN1|g![29g뻻i"wZ+ \%XVG[+Ka-/!؏lֿ$48+ ipcH+]Ӡ׼Nf !#k3B\Ҋ W^7\ *TN'8w BZ#\.qDVEL޽ʸw\}Y(9͸iy$ޑYJ.9f{ǣZ-g{ߛy@;][|{ߛƘ_ťސ$7Gk]%!q}C!-hq|JNhTQv"Ry WH+r:q۶]cLUU(V8^.'b1'ƐVO|IR*ZxZkmuN6뚖1'ސVZ,SRF??aiʳ4EQuROҊvm[W eY]l ^ 90 08Y-icҊ^g]utka6|s~պsuihҊ~ۄ.˒0vҊr9Ϯzz#IDAT. "o6RUUS7ːV weY^CZN$4l"VaBkhB6NHN1yQ/[I*!s({\4 J-rzm&VpuM iuz&5t:4CZ =r+b?.epV"i,^CZn6XNK說؝~H+9--rwB rVI䴿h$8>29qi}dkh"tJZ촞&j9MBa.ծr#;֜秗'ޘ `XIiOO*!"iF݋ƽCW"z,ii<Üj~Z"|&RCw4004_YYk|לw^k$4$לv8}dnBgiCH$& IiREH!œ& a}iFH-& y#6i~І9MBAҏ$Ih8Bz9MBk,Ih8Bځ9]eUU$4 `9,FTOpXKs##st9i:+s(BڟsBڣr,iipƜ&!$4#B:orZ:!Χ9$:-bFH.Ih7Ж&m?`uIENDB`rivet-2.2.4/doc/images/table.png0000644000175000017500000000643011436722370015757 0ustar manghimanghiPNG  IHDR,4b IDATxAkcGZ ) 9yo^Pc`m-8Q=İeN1ķ ğA{~^,͸~`ZרI袺^rue Ey(, u:BFE!΢QgQ|>V_/LTRSϤRSs5(dY2O>ZpTc%7P #FW : 1JYPM<y_JdTF5`ցa8ǻ Uէ(A2U "ŨFWXQG)E<"S@Q@QB w2G,;,Kn(AQ{EΣwT'I_~D.xsA6N "+~JQxG 2s2E ruuZ)J@U ʡ(a#$|PW VÓ5wBQfMd R Msxtg(9U黡nHxPgQȨ(dRN!E!SR\Ʒ'Tog~RS}}ȢQgQHjnUV\Ml] 6ތPœ-7P ЕWvj~&N@R$k_lbkt%I 8i%U jD)ElCЕI{ ln*S}"iBQfL+[Ng(E !,Uܬ_X%+e6.)E 0[ZMP 0; Q)B$}YԤm<6NH28Wv`M8a)A|_(A>sud+J!"># I"%sU䕢a RYcז;C(AvLֺWRDJ9}7CE!΢J9FLJeƷޱk~[HM_环/JME!΢8yԼI;-آ+a$kҾ}xn@@m ,>o7>i[N-CT֤}x:@NJ6X!+bKSb}|(33tLTp,"Oҷ|!'M4Yrk68 3HI;uIŮy5ּOQزylE&M"y&|r2sԼbRWoϹG ^Ci![>#'m;C(Yk$"w\6[f|K wCǃ:BFE!r , ԣ󧌯jU3vJ>MjRS?)WF:B&w{W;1t,o;@U¼qR p<;K~,mw*; Y&.~7X/Y><ڽN/?Ӱd9 2%̺I%iG&Bl po'\C.eܣ:Q3mSÀA"p@2dr=7RY̾\vTZ°4}s R_(^ + &ސ-aYQ}HfֽMrF80oOW gɩIyCꭳ%:BFE!r , ԣg_2dj|y+5x'5ղE!΢ɞ0YF2P-7PI =9'9ιxCYF5`TC hJ 7A9i'd* vo,o{bsǰr نjO])E+NT{`y۹[,3Xo}_4J(,&_$* ?xb`ŏ಑ TerN2 ĺ IF2dVnS7\F\H&Xv>IFʗ229 W.3UA;qv !+e 9# 0>#PVKfw΂Z0Yk%&-wBQ&Xvns/1MqJz8!E ΢QgQhBF#B&y /$PLaȢQgQdOp@e4@U ArRmm` T` L!,:0c TkR vJ.'&XVn 6dcE@E% p vo <|%W4L!J/8g(nwd=b wN7 XV#[kpIDAT-0-X*x.ނhe2y a3OTM i$ilZ;(WX+1fnώR'&/v~g o$%tEXtdate:create2012-10-01T18:27:32+02:00Qrz%tEXtdate:modify2012-10-01T18:27:32+02:00 IENDB`rivet-2.2.4/doc/images/next.png0000644000175000017500000000160112343445264015643 0ustar manghimanghiPNG  IHDR ꂣAbKGD pHYs  tIME'dtEXtCommentCreated with GIMPWIDATHǽ]SqƟ2! N0c\u te2}B LZھ&bFas<¿(Oݛb,9D8ƻ avϸ? M&X؛]wQ33yO#8QJJ&sff@{bBRִ~.B5?(==&@ /胺Pʔh_t`;`4,K \ڭ==&ʓ̅a勂Z%f )bkX/ feKq3 LL <"=y0G_E-^"BF5_Rfq$AafaXL8=I}Ä0"ORdqS&jԨ5l"M#̅}E^̳i.*iC~ ǘEURC33N04r uh9)C5{: rrJ&i8mo8-8"QTQFoQ)BN_/yF@qUR˗ "䤌tYJNDЛ:ʙ2IZS}@h-%HI n}@0Iz~gHND0tl頢7w-~,R#ZIW|VB0x-Q'_. #F\JJAv'kixU_I/U!*_aIENDB`rivet-2.2.4/doc/images/toc-minus.png0000644000175000017500000000040311436722370016600 0ustar manghimanghiPNG  IHDR )bKGD#2IDATxch`g  I׏j?}-pZECtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com!*tEXtSignatureecf413ef47524404f90c44d8c7d12a2e݈ tEXtPage15x9+0+07vIENDB`rivet-2.2.4/doc/images/word.png0000644000175000017500000000061112032344336015631 0ustar manghimanghiPNG  IHDRf0gAMA asRGB cHRMz&u0`:pQ<PLTEBBB[ϕtRNS@fbKGD- pHYsHHFk>XIDAT% **,PxD6QPr0"T:&Ss'zN:i^;EjjN /y%tEXtdate:create2012-10-01T18:30:10+02:00k%tEXtdate:modify2004-02-19T05:50:53+01:00OS1IENDB`rivet-2.2.4/doc/images/blank.png0000644000175000017500000000056611436722370015763 0ustar manghimanghiPNG  IHDRL\gAMA a-IDATxA 0MF4 z;3'kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` `fHfIENDB`rivet-2.2.4/doc/images/important.png0000644000175000017500000000132211436722370016700 0ustar manghimanghiPNG  IHDRשPLTE)))999BB1ZZ)ccBBBRRRkkBccRssRccckkk{{{9!9Z{c{JRZck{!19)11!ZRsckBc{bKGDCg bIDATxm S0 3E1KPTF'ǮQ]_iKB&F(6rc/Ѵ\Nh* 2p=:Jv?6| @}`^>s PvBɨ@d6"o;g`Ps+s%ǯ%@S{4ܾU-s"1ч?j<`g eZ* +æ2_Yv*lv~g Z[sY[Ða; =/oJĘ!fclRmRCtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com!*tEXtSignaturec3ecc1fc5135d1e959695e569d213122riIENDB`rivet-2.2.4/doc/images/acrobat.png0000644000175000017500000000060712032344336016276 0ustar manghimanghiPNG  IHDR [jgAMA asRGB cHRMz&u0`:pQ<PLTEyEWLAtRNS@fbKGDH pHYsHHFk>PIDAT DZ @[& `MHr#KJ20D70Fk eZ;7g\څD:[? ln{%tEXtdate:create2012-10-01T18:40:16+02:00퀀.%tEXtdate:modify2012-10-01T18:40:16+02:008IENDB`rivet-2.2.4/doc/images/toc-plus.png0000644000175000017500000000041011436722370016426 0ustar manghimanghiPNG  IHDR )bKGD#2#IDATxch`#@C"ԣj?RJld:4CtEXtSoftware@(#)ImageMagick 4.2.8 99/08/01 cristy@mystic.es.dupont.com!*tEXtSignatureab17802e1ddae3211b1ce6bc3b08aec7{( tEXtPage15x9+0+07vIENDB`rivet-2.2.4/doc/rivet.xml0000644000175000017500000001031212453516022014555 0ustar manghimanghi ]>

    Apache Rivet 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 Apache Software Foundation The Rivet Team The Apache Software Foundation
    rivet-dev@tcl.apache.org
    Document revision: $Revision: 1650305 $, last modified $ by $Author: mxmanghi $. &intro.xml; &install.xml; &request.xml; &directives.xml; &commands.xml; &examples.xml; &packages.xml; &dio.xml; &diodisplay.xml; &session.xml; &form.xml; &calendar.xml; &entities.xml; &help.xml; &internals.xml; &upgrade.xml;
    rivet-2.2.4/doc/example.tcl0000644000175000017500000000174207416050616015055 0ustar manghimanghi# we have complete access to the interpreter here, so it is best to # run per-page code in a namespace, just like we do with .rvt pages. proc getcode { filename } { set fl [ open $filename r ] set sourcecode [ read $fl ] close $fl regsub -all "&" "$sourcecode" "\\&" sourcecode regsub -all "<" "$sourcecode" "\\<" sourcecode regsub -all ">" "$sourcecode" "\\>" sourcecode return $sourcecode } if { ! [ info exists header ] } { set header { .tcl example } } if { ! [ info exists footer ] } { set footer { } } namespace eval request { hgetvars puts $header puts {

    This is an example of a .tcl file being processed in Rivet

    Here is the source code:


        }
        puts [ getcode $ENVS(SCRIPT_FILENAME) ]
        puts {
    	

    } puts $footer }rivet-2.2.4/doc/examples/0000755000175000017500000000000012630261004014515 5ustar manghimanghirivet-2.2.4/doc/examples/table.rvt0000644000175000017500000000046011545343461016355 0ustar manghimanghi\n" for {set i 1} { $i <= 8 } {incr i} { puts "\n" for {set j 1} {$j <= 8} {incr j} { set num [ expr $i * $j * 4 - 1] puts [ format " $num $num $num \n" \ $num $num $num ] } puts "\n" } puts "\n" ?> rivet-2.2.4/doc/examples/upload.rvt0000644000175000017500000000024611670231317016547 0ustar manghimanghi rivet-2.2.4/doc/examples/hello.rvt0000644000175000017500000000003111545343461016363 0ustar manghimanghi rivet-2.2.4/doc/examples/download.tcl0000644000175000017500000000321411670231317017037 0ustar manghimanghi# Code example for the transmission of a pdf file. if {[::rivet::var exists pdfname]} { set pdfname [::rivet::var get pdfname] # let's build the full path to the pdf file. The 'pdf_repository' # directory must be readable by the apache children set pdf_full_path [file join $pdf_repository ${pdfname}.pdf] if {[file exists $pdf_full_path]} { # Before the file is sent we inform the client about the file type and # file name. The client can be proposed a filename different from the # original one. In this case, this is the point where a new file name # must be generated. ::rivet::headers type "application/pdf" ::rivet::headers add Content-Disposition "attachment; filename=${pdfname}.pdf" ::rivet::headers add Content-Description "PDF Document" # The pdf is read and stored in a Tcl variable. The file handle is # configured for a binary read: we are just shipping raw data to a # client. The following 4 lines of code can be replaced by any code # that is able to retrieve the data to be sent from any data source # (e.g. database, external program, other Tcl code) set paper [open $pdf_full_path r] fconfigure $paper -translation binary set pdf [read $paper] close $paper # Now we got the data: let's tell the client how many bytes we are # about to send (useful for the download progress bar of a dialog box) ::rivet::headers add Content-Length [string length $pdf] # Let's send the actual file content puts $pdf } else { source pdf_not_found_error.rvt } } else { source parameter_not_defined_error.rvt } rivet-2.2.4/doc/examples/vars.html0000644000175000017500000000130111562073576016373 0ustar manghimanghi
    Title:
    Salary:
    Boss:
    Skills:
    rivet-2.2.4/doc/examples/rivet_web_service.tcl0000644000175000017500000000631411670231317020742 0ustar manghimanghi# # Ajax query servelet: a pseudo database is built into the dictionary 'composers' with the # purpose of emulating the role of a real data source. # The script answers with 2 types of responses: a catalog of the record ids and a database # entry matching a given rec_id. The script obviously misses the error handling and the # likes. Just an example to see rivet sending xml data to a browser. The full Tcl, JavaScript # and HTML code are available from http://people.apache.org/~mxmanghi/rivet-ajax.tar.gz # This example requires Tcl8.5 or Tcl8.4 with package 'dict' # (http://pascal.scheffers.net/software/tclDict-8.5.2.tar.gz) # # A pseudo database. rec_id matches a record in the db set composers [dict create \ 1 {first_name Claudio middle_name "" last_name Monteverdi \ lifespan 1567-1643 era Renaissance/Baroque} \ 2 {first_name Johann middle_name Sebastian last_name Bach \ lifespan 1685-1750 era Baroque } \ 3 {first_name Ludwig middle_name "" last_name "van Beethoven" \ lifespan 1770-1827 era Classical/Romantic} \ 4 {first_name Wolfgang middle_name Amadeus last_name Mozart \ lifespan 1756-1791 era Classical } \ 5 {first_name Robert middle_name "" last_name Schumann \ lifespan 1810-1856 era Romantic} ] # we use the 'load' argument in order to determine the type of query # # load=catalog: we have to return a list of the names in the database # load=composer&res_id=: the script is supposed to return the record # having as record id if {[::rivet::var exists load]} { # the xml declaration is common to every message (error messages included) set xml "\n" switch [::rivet::var get load] { catalog { append xml "\n" foreach nm [dict keys $composers] { set first_name [dict get $composers $nm first_name] set middle_name [dict get $composers $nm middle_name] set last_name [dict get $composers $nm last_name] append xml " $first_name " if {[string length [string trim $middle_name]] > 0} { append xml "$middle_name " } append xml "$last_name\n" } append xml "\n" } composer { append xml "\n" if {[::rivet::var exists rec_id]} { set rec_id [::rivet::var get rec_id] if {[dict exists $composers $rec_id]} { foreach {k v} [dict get $composers $rec_id] { append xml "<$k>$v\n" } } } append xml "\n" } } # we have to tell the client this is an XML message. Failing to do so # would result in an XMLResponse property set to null ::rivet::headers type "text/xml" ::rivet::headers add Content-Length [string length $xml] puts $xml } rivet-2.2.4/doc/examples/upload.html0000644000175000017500000000025011545343461016700 0ustar manghimanghi
    rivet-2.2.4/doc/examples/color-table.tcl0000644000175000017500000000166512343717013017443 0ustar manghimanghiputs "" puts "" puts "" puts "" # we create a 8x8 table selecting a different background for each cell for {set i 0} { $i < 9 } {incr i} { puts "" for {set j 0} {$j < 9} {incr j} { set r [expr int(255 * ($i + $j) / 16)] set g [expr int(255 * (8 - $i + $j) / 16)] set b [expr int(255 * ($i + 8 - $j) / 16)] # determining the background luminosity (YIQ space of NTSC) and choosing # the foreground color accordingly in order maintain maximum contrast if { [expr ($r*0.29894)+($g*0.58704)+($b*0.11402)] > 128} { set cssclass "dark" } else { set cssclass "bright" } puts [format "" $r $g $b $cssclass] } puts "" } puts "
    $r $g $b
    " puts "" rivet-2.2.4/doc/examples/vars.rvt0000644000175000017500000000231711754433456016252 0ustar manghimanghi $err " } } else { puts "Thanks for the information!" ?>
    Title:
    Boss:
    Salary:
    Skills:
    rivet-2.2.4/doc/examples/hello1.rvt0000644000175000017500000000002511754433456016455 0ustar manghimanghi rivet-2.2.4/doc/rivet.xsl0000644000175000017500000002564012343445264014604 0ustar manghimanghi article toc,title,example ? ? ( ) ( ) ...

    	    
    	      
    	    
    	  
    	    
    	  
    rivet-2.2.4/doc/rivet-nochunk.xsl0000644000175000017500000000301410703462475016237 0ustar manghimanghi rivet-2.2.4/doc/style.css0000644000175000017500000000131507416122405014560 0ustar manghimanghibody { font-family: Arial, sans-serif; font-style: normal; color: #000000; background-color: #FFFFFF; font-size: smaller; } A:link { color: #cc3300 } A:visited { color : #003399; } A:hover { color : #000000 ; background-color : #aaaaaa } h1 { font-size: xx-large; font-family: Arial, sans-serif; color: #000000; } h2 { font-size: larger; font-family: Arial, sans-serif; } h3 { font-family: Arial, sans-serif; } b { font-weight: bold; } td { font-family: Arial, sans-serif; color: #000000; padding: 0.25em; } code { font-size: larger; color: #006600; } div.box { border-width: medium; padding: 0.25em; background-color: #dddddd; } li { }rivet-2.2.4/doc/README.hpux0000644000175000017500000000162307416122405014553 0ustar manghimanghi A bit of information from Craig Huckabee (huck@nosc.mil) regarding building Rivet on HPUX: I had to tweak the makefile to get everything to build (adding some include and library paths and -DEAPI) Apparently that rivet_module [this is from an error he was getting - davidw] came from one of the steps described in the Apache documentation for installing a DSO. I rebuilt and redid the steps and now it appears to work OK. My next test will be using some of the tcl extensions and seeing how well they work. I also have to track down and beat out a linker problem with Tcl itself. I had to add -lm to your makefile to include the math libraries when linking against my Tcl build which is wrong. Somewhere along the way, while building Tcl, that library isn't being linked in correctly (at least that's what I think). Just one of the joys of building on HP-UX I guess. rivet-2.2.4/doc/convert_examples.tcl.in0000644000175000017500000000271212037355623017404 0ustar manghimanghi# convert_examples.tcl -- # # # reads the examples dir, checks if a file has been already converted # in and compares their mtimes. If the file in # is more recent the target dir is recreated. # The script uses Rivet's escape_sgml_chars to convert examples code # into text suitable to be inclued and displayed in XML/XHTML # documentation # NOTICE: This script requires Rivet, its scripts and # libraries to be in the auto_path. # usage: # # tclsh ./convert_examples # # $Id: convert_examples.tcl.in 1399019 2012-10-16 22:11:31Z mxmanghi $ # lappend auto_path @RIVET_TCL_TARGET@ lappend auto_path [file join @RIVET_TCL_TARGET@ rivet-tcl] package require rivetlib set source_dir examples set target_dir examples-sgml if {![info exists source_examples]} { set source_examples [glob [file join $source_dir *.*]] puts "escaping $source_examples to SGML compatible form" } foreach example $source_examples { set exam_name [file tail $example] set example_sgml [file join $target_dir $exam_name] set example_sgml_exists [file exists $example_sgml] if {!$example_sgml_exists || \ ([file mtime $example] > [file mtime $example_sgml])} { puts "$example needs rebuild" set example_text [string trim [::rivet::read_file $example]] set example_sgml_fid [open $example_sgml w+] puts $example_sgml_fid [::rivet::escape_sgml_chars $example_text] close $example_sgml_fid } } rivet-2.2.4/doc/examples-sgml/0000755000175000017500000000000012630261004015455 5ustar manghimanghirivet-2.2.4/doc/examples-sgml/table.rvt0000644000175000017500000000063511545343461017321 0ustar manghimanghi<? puts "<table>\n" for {set i 1} { $i <= 8 } {incr i} { puts "<tr>\n" for {set j 1} {$j <= 8} {incr j} { set num [ expr $i * $j * 4 - 1] puts [ format "<td bgcolor=\"%02x%02x%02x\" > $num $num $num </td>\n" \ $num $num $num ] } puts "</tr>\n" } puts "</table>\n" ?> rivet-2.2.4/doc/examples-sgml/upload.rvt0000644000175000017500000000026711670231317017512 0ustar manghimanghi<? ::rivet::upload save MyUpload /tmp/uploadfiles/file1 puts "Saved file [::rivet::upload filename MyUpload] \ ([::rivet::upload size MyUpload] bytes) to server" ?> rivet-2.2.4/doc/examples-sgml/hello.rvt0000644000175000017500000000005211545343461017326 0ustar manghimanghi<? puts "Hello World" ?> rivet-2.2.4/doc/examples-sgml/download.tcl0000644000175000017500000000327711670231317020010 0ustar manghimanghi# Code example for the transmission of a pdf file. if {[::rivet::var exists pdfname]} { set pdfname [::rivet::var get pdfname] # let's build the full path to the pdf file. The 'pdf_repository' # directory must be readable by the apache children set pdf_full_path [file join $pdf_repository ${pdfname}.pdf] if {[file exists $pdf_full_path]} { # Before the file is sent we inform the client about the file type and # file name. The client can be proposed a filename different from the # original one. In this case, this is the point where a new file name # must be generated. ::rivet::headers type "application/pdf" ::rivet::headers add Content-Disposition "attachment; filename=${pdfname}.pdf" ::rivet::headers add Content-Description "PDF Document" # The pdf is read and stored in a Tcl variable. The file handle is # configured for a binary read: we are just shipping raw data to a # client. The following 4 lines of code can be replaced by any code # that is able to retrieve the data to be sent from any data source # (e.g. database, external program, other Tcl code) set paper [open $pdf_full_path r] fconfigure $paper -translation binary set pdf [read $paper] close $paper # Now we got the data: let's tell the client how many bytes we are # about to send (useful for the download progress bar of a dialog box) ::rivet::headers add Content-Length [string length $pdf] # Let's send the actual file content puts $pdf } else { source pdf_not_found_error.rvt } } else { source parameter_not_defined_error.rvt } rivet-2.2.4/doc/examples-sgml/vars.html0000644000175000017500000000213011562073576017334 0ustar manghimanghi<form action="vars.rvt"> <table> <tbody> <tr> <td><b>Title:</b></td> <td><input name="title" /></td> </tr> <tr> <td><b>Salary:</b></td> <td><input name="salary" /></td> </tr> <tr> <td><b>Boss:</b></td> <td><input name="boss" /></td></tr> <tr> <td><b>Skills:</b></td> <td> <select name="skills" multiple="multiple"> <option>C</option> <option>Java</option> <option>Tcl</option> <option>Perl</option> </select> </td> </tr> <tr> <td><input type="submit" /></td> </tr> </tbody> </table> </form> rivet-2.2.4/doc/examples-sgml/rivet_web_service.tcl0000644000175000017500000000673011670231317021704 0ustar manghimanghi# # Ajax query servelet: a pseudo database is built into the dictionary 'composers' with the # purpose of emulating the role of a real data source. # The script answers with 2 types of responses: a catalog of the record ids and a database # entry matching a given rec_id. The script obviously misses the error handling and the # likes. Just an example to see rivet sending xml data to a browser. The full Tcl, JavaScript # and HTML code are available from http://people.apache.org/~mxmanghi/rivet-ajax.tar.gz # This example requires Tcl8.5 or Tcl8.4 with package 'dict' # (http://pascal.scheffers.net/software/tclDict-8.5.2.tar.gz) # # A pseudo database. rec_id matches a record in the db set composers [dict create \ 1 {first_name Claudio middle_name "" last_name Monteverdi \ lifespan 1567-1643 era Renaissance/Baroque} \ 2 {first_name Johann middle_name Sebastian last_name Bach \ lifespan 1685-1750 era Baroque } \ 3 {first_name Ludwig middle_name "" last_name "van Beethoven" \ lifespan 1770-1827 era Classical/Romantic} \ 4 {first_name Wolfgang middle_name Amadeus last_name Mozart \ lifespan 1756-1791 era Classical } \ 5 {first_name Robert middle_name "" last_name Schumann \ lifespan 1810-1856 era Romantic} ] # we use the 'load' argument in order to determine the type of query # # load=catalog: we have to return a list of the names in the database # load=composer&amp;res_id=<id>: the script is supposed to return the record # having <id> as record id if {[::rivet::var exists load]} { # the xml declaration is common to every message (error messages included) set xml "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n" switch [::rivet::var get load] { catalog { append xml "<catalog>\n" foreach nm [dict keys $composers] { set first_name [dict get $composers $nm first_name] set middle_name [dict get $composers $nm middle_name] set last_name [dict get $composers $nm last_name] append xml " <composer key=\"$nm\">$first_name " if {[string length [string trim $middle_name]] > 0} { append xml "$middle_name " } append xml "$last_name</composer>\n" } append xml "</catalog>\n" } composer { append xml "<composer>\n" if {[::rivet::var exists rec_id]} { set rec_id [::rivet::var get rec_id] if {[dict exists $composers $rec_id]} { foreach {k v} [dict get $composers $rec_id] { append xml "<$k>$v</$k>\n" } } } append xml "</composer>\n" } } # we have to tell the client this is an XML message. Failing to do so # would result in an XMLResponse property set to null ::rivet::headers type "text/xml" ::rivet::headers add Content-Length [string length $xml] puts $xml } rivet-2.2.4/doc/examples-sgml/upload.html0000644000175000017500000000042311545343461017642 0ustar manghimanghi<form action="foo.rvt" enctype="multipart/form-data" method="post"> <input type="file" name="MyUpload"></input> <input type="submit" value="Send File"></input> </form> rivet-2.2.4/doc/examples-sgml/color-table.tcl0000644000175000017500000000222412343717013020373 0ustar manghimanghiputs "<html><head>" puts "<style>\n td { font-size: 12px; }\n td.bright { color: #eee; }\n td.dark { color: #222; }\n</style>" puts "</head><body>" puts "<table>" # we create a 8x8 table selecting a different background for each cell for {set i 0} { $i < 9 } {incr i} { puts "<tr>" for {set j 0} {$j < 9} {incr j} { set r [expr int(255 * ($i + $j) / 16)] set g [expr int(255 * (8 - $i + $j) / 16)] set b [expr int(255 * ($i + 8 - $j) / 16)] # determining the background luminosity (YIQ space of NTSC) and choosing # the foreground color accordingly in order maintain maximum contrast if { [expr ($r*0.29894)+($g*0.58704)+($b*0.11402)] > 128} { set cssclass "dark" } else { set cssclass "bright" } puts [format "<td bgcolor=\"%02x%02x%02x\" class=\"%s\">$r $g $b</td>" $r $g $b $cssclass] } puts "</tr>" } puts "</table>" puts "</body></html>" rivet-2.2.4/doc/examples-sgml/vars.rvt0000644000175000017500000000303611754433456017211 0ustar manghimanghi<? set errlist {} if { [::rivet::var exists title] } { set title [::rivet::var get title] } else { set errlist "You need to enter a title" } if { [::rivet::var exists salary] } { set salary [::rivet::var get salary] if { ! [string is digit $salary] } { lappend errlist "Salary must be a number" } } else { lappend errlist "You need to enter a salary" } if { [::rivet::var exists boss] } { set boss [::rivet::var get boss] } else { set boss "Mr. Burns" } if { [::rivet::var exists skills] } { set skills [::rivet::var list skills] } else { lappend errlist "You need to enter some skills" } if { [llength $errlist] != 0 } { foreach err $errlist { puts "<b> $err </b>" } } else { puts "Thanks for the information!" ?> <table> <tbody> <tr> <td><b>Title:</b></td> <td><?= $title ?></td> </tr> <tr> <td><b>Boss:</b></td> <td><?= $boss ?></td> </tr> <tr> <td><b>Salary:</b></td> <td><?= $salary ?></td> </tr> <tr> <td><b>Skills:</b></td> <td><?= $skills ?></td> </tr> </tbody> </table> <? } ?> rivet-2.2.4/doc/examples-sgml/hello1.rvt0000644000175000017500000000004512037355623017411 0ustar manghimanghi<?= "Hello World" ?> rivet-2.2.4/doc/rivet.css0000644000175000017500000001541512533750442014563 0ustar manghimanghiBODY { font-family: verdana; } DIV.ABSTRACT { border: solid 2px; padding-left: 10pt; padding-right: 10pt; } PRE.SCREEN { font-family:monospace; white-space: pre; width: 100%; background-color: #ffffcc; border:solid; color: #000000; border-color: #009999; border-left: solid #009999 2px; border-right: solid #009999 2px; border-top: solid #009999 2px; border-bottom: solid #009999 2px; padding-left: 15pt; } PRE.PROGRAMLISTING { font-family: monospace; white-space: pre; width: 95%; background-color: #eeffee; border: solid; color: #000000; border-color: #009999; border-left: solid #009999 1px; border-right: solid #009999 1px; border-top: solid #009999 1px; border-bottom: solid #009999 1px; font-size: normal; padding-top: 1em; padding-left: 1em; padding-bottom: 1em; } H1 { color: #ffffff; border: solid 3px #a0a0d0; background-color: #606090; font-variant: small-caps; width: 100%; } H1.TITLE { color: #ffffff; border: solid 3px #a0a0d0; background-color: #606090; font-variant: small-caps; width: 100%; } .TITLE a { color: #ffffff; text-decoration: none; } .TITLE a:active { color: #ffffff; text-decoration: none; } .TITLE a:visited { color: #ffffff; text-decoration: none; } H2 { COLOR: #ffffff ; font-style: italic; BACKGROUND-color: #a0d0a0; BORDER: solid 3px #609060; PADDING: 5px } TABLE.IMPORTANT { font-style:italic; border: solid 2px #ff0000; width: 70%; margin-left: 15%; } TABLE.CAUTION { font-style:italic; border: ridge 2px #ffff00; width: 70%; margin-left: 15%; } TABLE.NOTE { font-style:italic; border: solid 1px #000000; width: 70%; margin-left: 15%; } TABLE.TIP { font-style:italic; border: solid 1px #000000; width: 70%; margin-left: 15%; } TABLE.WARNING { font-style:italic; font-weight: bold; border: ridge 4px #ff0000; width: 70%; margin-left: 15%; } DIV.VARIABLELIST { font-family: sans-serif; font-style: normal; font-weight: normal; padding-left: 20px; font-size: small; } .VARLISTENTRY { font-weight: bold; margin-top: 10px; COLOR: #ffffff ; BACKGROUND-color: #a0a0d0; BORDER: solid 1px #606090; PADDING: 1px } /* * See http://diveintoaccessibility.org/day_26_using_relative_font_sizes.html * for an explanation of the following few commands. * They are really too complicated to explain here in all depth. ;-) */ P { font-size: 12px; } /*/*/A{} BODY P { /* font-size: x-small; */ voice-family: "\"}\""; voice-family: inherit; font-size: normal; } HTML>BODY P { font-size: normal; } /* */ /* Add an external-link icon to absolute links */ a[href^="http:"] { background: url(images/remote.png) right center no-repeat; padding-right: 12px; } a[href^="http:"]:hover { background: url(images/remote.png) right center no-repeat; } /* Add a note icon to footnote links */ a[href^="#FTN"] { background: url(images/qbullet-note.png) right center no-repeat; padding-right: 12px; } a[href^="#FTN"]:hover { background: url(images/qbullet-note.png) right center no-repeat; } /* ...and a back icon to the backlinks in the footnotes themselves */ a[name^="FTN"] { background: url(images/scrollup.png) right center no-repeat; padding-right: 12px; } a[name^="FTN"]:hover { background: url(images/scrollup.png) right center no-repeat; } /* Add a download icon to .gz links */ a[href$=".gz"],a[href$=".tar"],a[href$=".zip"] { background: url(images/disk.png) right center no-repeat; padding-right: 12px; } /* Add an Acrobat Reader icon to PDF links */ a[href$=".pdf"] { background: url(images/acrobat.png) right center no-repeat; padding-right: 12px; } a[href$=".pdf"]:hover { background: url(images/acrobat.png) right center no-repeat; } /* Add a Word icon to RTF links */ a[href$=".rtf"] { background: url(images/word.png) right center no-repeat; padding-right: 12px; } /* ...but not to absolute links in this domain... */ a[href^="http://www.karakas-online.de"] { background: transparent; padding-right: 0px; } a[href^="http://www.karakas-online.de"]:hover { background: transparent; } /* ...or to the translation links on each page */ DIV.translatelink > a[href^="http:"] { background: transparent; padding-right: 0px; } DIV.translatelink > a[href^="http:"]:hover { background: transparent; } /* ...or to any images */ DIV.imagelink a[href^="http:"] { background: transparent; padding-right: 0px; } DIV.imagelink a[href^="http:"]:hover { background: transparent; } P.C2 { COLOR: #ffffff ; BACKGROUND-color: #a0a0d0; BORDER: solid 1px #606090; PADDING: 1px } DIV.NAVFOOTER { color: #000000; background-color: #DFFFDF; padding: 5px; margin-top: 10px; width: 100%; border: thin solid #a0a0d0; } DIV.NUKEFOOTER { color: #000000; background-color: #B0E0E6; padding: 5px; margin-top: 10px; width: 100%; border: thin solid #a0a0d0; } DIV.NAVHEADER { color: #000000; background-color: #DFFFDF; padding: 5px; margin-bottom: 10px; width: 100%; border: thin solid #a0a0d0; } DIV.SECT1,DIV.SECT2,DIV.SECT3 { margin-left: 20px; } DIV.EXAMPLE,DIV.TOC { border: thin dotted #70AAE5; padding-left: 10px; padding-right: 10px; color: #000000; background-color: #E8FFE8; } DIV.EXAMPLE { border: thin dotted #22AA22; background-color: #EEE; } DIV.TOC { margin-left: 20px; margin-right: 20px; width: 95%; } UL { /* list-style: url("images/tux-bullet.png") disc; */ } .namespaces { border: 1px solid black; } .namespaces td { padding: 0.2em 1em; /* font-weight: bold; */ } .namespaces thead { background-color: #aaf; } .namespaces tr.init { background-color: #e88; } .namespaces tr.childinit { background-color: #eee; } .namespaces tr.processing { background-color: #e88; } .namespaces tr.childexit { background-color: #eee; } .note td { font-size: small; } li.listitem { font-size: small; } rivet-2.2.4/rivet/0000755000175000017500000000000012630261004013263 5ustar manghimanghirivet-2.2.4/rivet/pkgIndex.tcl0000644000175000017500000000436612220135122015545 0ustar manghimanghi# Tcl package index file, version 1.1 # This file is generated by the "pkg_mkIndex" command # and sourced either when an application starts up or # by a "package unknown" script. It invokes the # "package ifneeded" command to set up package-related # information so that packages will be loaded automatically # in response to "package require" commands. When this # script is sourced, the variable $dir must contain the # full path name of this file's directory. package ifneeded Calendar 1.1 [list source [file join $dir packages/calendar/calendar.tcl]] package ifneeded DIO 1.0 [list source [file join $dir packages/dio/dio.tcl]] package ifneeded DIODisplay 1.0 [list source [file join $dir packages/dio/diodisplay.tcl]] package ifneeded Dtcl 1.0 [list source [file join $dir packages/dtcl/dtcl.tcl]] package ifneeded RivetEntities 1.0 [list source [file join $dir packages/entities/entities.tcl]] package ifneeded RivetTcl 2.1 [list source [file join $dir init.tcl]] package ifneeded Session 1.0 [list source [file join $dir packages/session/session-class.tcl]] package ifneeded commserver 0.1 [list source [file join $dir packages/commserver/commserver.tcl]] package ifneeded dio_Mysql 0.2 [list source [file join $dir packages/dio/dio_Mysql.tcl]] package ifneeded dio_Oracle 0.1 [list source [file join $dir packages/dio/dio_Oracle.tcl]] package ifneeded dio_Postgresql 0.1 [list source [file join $dir packages/dio/dio_Postgresql.tcl]] package ifneeded dio_Sqlite 0.1 [list source [file join $dir packages/dio/dio_Sqlite.tcl]] package ifneeded form 1.0 [list source [file join $dir packages/form/form.tcl]] package ifneeded form 2.0 [list source [file join $dir packages/form/form2.tcl]] package ifneeded ncgi 1.0 [list source [file join $dir packages/rivet_ncgi/rivet_ncgi.tcl]] package ifneeded rivetlib 1.2 [list load [file join $dir librivetlib.so]] package ifneeded rivetparser 0.2 [list load [file join $dir librivetparser.so]]\n[list source [file join $dir packages/tclrivet/tclrivet.tcl]] package ifneeded simpledb 0.1 [list source [file join $dir packages/simpledb/simpledb.tcl]] package ifneeded tclrivet 0.1 [list source [file join $dir packages/tclrivet/tclrivet.tcl]] package ifneeded tclrivetparser 0.1 [list source [file join $dir packages/tclrivet/tclrivetparser.tcl]] rivet-2.2.4/rivet/packages/0000755000175000017500000000000012630261004015041 5ustar manghimanghirivet-2.2.4/rivet/packages/simpledb/0000755000175000017500000000000012630261004016640 5ustar manghimanghirivet-2.2.4/rivet/packages/simpledb/pkgIndex.tcl0000644000175000017500000000103407736027420021130 0ustar manghimanghi# Tcl package index file, version 1.1 # This file is generated by the "pkg_mkIndex" command # and sourced either when an application starts up or # by a "package unknown" script. It invokes the # "package ifneeded" command to set up package-related # information so that packages will be loaded automatically # in response to "package require" commands. When this # script is sourced, the variable $dir must contain the # full path name of this file's directory. package ifneeded simpledb 0.1 [list source [file join $dir simpledb.tcl]] rivet-2.2.4/rivet/packages/simpledb/simpledb.tcl0000644000175000017500000001614211727706131021162 0ustar manghimanghi# simpledb.tcl -- provides a simple tcl database. # Copyright 2003-2004 The Apache Software Foundation # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # $Id: simpledb.tcl 1300262 2012-03-13 18:05:13Z mxmanghi $ package provide simpledb 0.1 namespace eval ::simpledb { set oid 0 } # simpledb::createtable -- # # Creates a table and its associated columns. # # Arguments: # table - name of the table. # args - column names. # # Side Effects: # Creates internal namespace and arrays. # # Results: # None. proc simpledb::createtable { table args } { namespace eval $table {} array set ${table}::cols {} # Currently active oids. array set ${table}::goodoids {} foreach col $args { # Each key gets its own namespace. namespace eval ${table}::${col} {} # In that namespace we have an array that maps oids->data. array set ${table}::${col}::data {} # And an array that maps data->oids. array set ${table}::${col}::values {} set ${table}::cols($col) 1 } } # simpledb::deltable -- # # Delete table. # # Arguments: # table - table to delete. # # Side Effects: # Deletes table namespace. # # Results: # None. proc simpledb::deltable { table } { namespace delete $table } # simpledb::tables -- # # Return a list of all tables. # # Arguments: # None. # # Side Effects: # None. # # Results: # A list of all tables that exist in the database. proc simpledb::tables {} { set res {} foreach ns [namespace children [namespace current]] { lappend res [namespace tail $ns] } return $res } # simpledb::createitem -- # # Create an item in the table. # # Arguments: # table - table name. # properties - a list of keys and their corresponding values. # Keys must correspond to those listed in 'createtable'. # # Side Effects: # Creates a new table item. # # Results: # None. proc simpledb::createitem { table properties } { variable oid incr oid set ${table}::goodoids($oid) 1 foreach {col data} $properties { set ${table}::${col}::data($oid) $data lappend ${table}::${col}::values($data) $oid } return $oid } # simpledb::getitem -- # # Fetches an item from the database based on its oid. # # Arguments: # table - table name. # oid - identity of the item to fetch. # # Side Effects: # None. # # Results: # Returns information as a list suitable to pass to 'array set'. proc simpledb::getitem { table oid } { foreach col [array names ${table}::cols] { lappend res $col [set ${table}::${col}::data($oid)] } return $res } # simpledb::setitem -- # # Set the values of given keys. # # Arguments: # table - table name. # oid - item's unique id. # properties - list of keys and values. # # Side Effects: # The old value of the item is lost. # # Results: # None. proc simpledb::setitem { table oid properties } { upvar $properties props foreach {col data} $properties { if { [info exists ${table}::${col}::data($oid)] } { set oldval [set ${table}::${col}::data($oid)] set item [lsearch [set ${table}::${col}::values($oldval)] $oid] if { $item >= 0 } { set ${table}::${col}::values($oldval) \ [lreplace ${table}::${col}::values($oldval) $item $item] } if { [llength [set ${table}::${col}::values($oldval)]] == 0 } { unset ${table}::${col}::values($oldval) } } set ${table}::${col}::data($oid) $data lappend ${table}::${col}::values($data) $oid } return $oid } # simpledb::delitem -- # # Delete an item from the database. This is slow because of the # lsearch. # # Arguments: # table - table name. # oid - object's unique id. # # Side Effects: # Deletes item from the database. # # Results: # None. proc simpledb::delitem { table oid properties } { upvar $properties props foreach col [array names ${table}::cols] { unset ${table}::${col}::data($oid) set item [lsearch ${table}::${col}::values($props($col)) $oid] set ${table}::${col}::values($props($col)) \ [lreplace ${table}::${col}::values($props($col)) $item $item] } unset ${table}::goodoids($oid) return $oid } # simpledb::finditems -- # # Find items that match the given "properties" - a list of keys # and the sought values. Glob patterns are accepted as # 'values'. # # Arguments: # table - table name. # propertymatch - list of keys and values to search on. # # Side Effects: # None. # # Results: # A list of the id's of matching item. proc simpledb::finditems { table propertymatch } { array set res {} foreach {col value} $propertymatch { foreach {value oids} [array get ${table}::${col}::values $value] { foreach oid $oids { if { [info exists res($oid)] } { incr res($oid) } else { set res($oid) 1 } } } } set retlist {} foreach {oid num} [array get res] { if { $res($oid) == [llength $propertymatch] / 2 } { lappend retlist $oid } } return $retlist } # simpledb::items -- # # Fetch all the items from a particular table. # # Arguments: # table. # # Side Effects: # None. # # Results: # A list of lists, with the sublists being key/value lists of # column names and their value for the oid in question. proc simpledb::items {table} { set reslist {} set collist [array names ${table}::cols] foreach oid [array names ${table}::goodoids] { set oidlist {} foreach col $collist { if { [info exists ${table}::${col}::data($oid)] } { lappend oidlist $col [set ${table}::${col}::data($oid)] } } lappend reslist $oidlist } return $reslist } # simpledb::synctostorage -- # # Writes the database to a file. The storage format, for the # moment is Tcl code, which isn't space efficient, but is easy # to reload. # # Arguments: # savefile - file to save database in. # # Side Effects: # None. # # Results: # None. proc simpledb::synctostorage {savefile} { set fl [open $savefile w] foreach ns [namespace children] { # Let's store the goodoids array. set collist [array names ${ns}::cols] puts $fl "namespace eval $ns \{" puts $fl " array set cols \{ [array get ${ns}::cols] \}" puts $fl " array set goodoids \{ [array get ${ns}::goodoids] \}" foreach col $collist { puts $fl " namespace eval ${col} \{" puts $fl " array set data [list [array get ${ns}::${col}::data]]" puts $fl " array set values [list [array get ${ns}::${col}::values]]" puts $fl " \}" } puts $fl "\}" } close $fl } # simpledb::syncfromstorage -- # # Reloads database from file. # # Arguments: # savefile - file to read. # # Side Effects: # Creates database. # # Results: # None. proc simpledb::syncfromstorage {savefile} { source $savefile } rivet-2.2.4/rivet/packages/simpledb/simpledb.test0000644000175000017500000000374410001516447021354 0ustar manghimanghi# Test suite for the tcltest test suite. set auto_path [linsert $auto_path 0 [file dirname [info script]]] package require tcltest package require simpledb proc maketables {} { simpledb::createtable computer gfx cpu mem hd price simpledb::createtable graphicscard name manufacturer mem } proc arraysort {lst} { set sortlist {} set reslist {} foreach {key val} $lst { lappend sortlist [list $key $val] } set sortlist [lsort -index 0 $sortlist] foreach {keyval} $sortlist { lappend reslist [lindex $keyval 0] [lindex $keyval 1] } return $reslist } proc deltables {} { simpledb::deltable computer simpledb::deltable graphicscard } proc populatetables {} { set lt1 [simpledb::createitem computer { gfx ATI cpu "Motorola PPC" mem 256 hd 10 price 1000 }] set lt2 [simpledb::createitem computer { gfx Permedia cpu "PII" mem 256 hd 10 price 1200 }] set lt3 [simpledb::createitem computer { gfx Matrox cpu "Pentium" mem 128 hd 5 price 5000 }] } tcltest::test createtables-1.1 {Create two tables} { set res {} maketables set res [simpledb::tables] deltables set res } {graphicscard computer} tcltest::test deltables-1.1 {Make sure tables are gone} { set res {} maketables deltables simpledb::tables } {} tcltest::test populatetables-1.1 {Make tables, populate them} { set res {} maketables populatetables } {3} # foreach arr [simpledb::items computer] { # lappend arrlist [arraysort $arr] # } # puts [lsort -index 9 $arrlist] # simpledb::setitem computer $lt3 { # price 2000 # } # simpledb::setitem computer $lt3 { # price 3000 # } # puts "getitem computer lt1: [simpledb::getitem computer $lt1]" # puts "finditems: [simpledb::finditems computer { # gfx Permedia # cpu PII # }]" # foreach item [simpledb::finditems computer { # gfx * # }] { # puts [simpledb::getitem computer $item] # } # simpledb::synctostorage session.tcl tcltest::cleanupTestsrivet-2.2.4/rivet/packages/rivet_ncgi/0000755000175000017500000000000012630261004017172 5ustar manghimanghirivet-2.2.4/rivet/packages/rivet_ncgi/rivet_ncgi.tcl0000644000175000017500000000377510112463443022047 0ustar manghimanghi# rivet_ncgi.tcl -- Rivet ncgi compatibility layer # $Id: rivet_ncgi.tcl 265411 2004-08-23 21:52:35Z davidw $ package provide ncgi 1.0 package require fileutil package require http namespace eval ncgi { } # ::ncgi::parse -- # # Mostly a no-op for Rivet, although it loads up the ::env # variable. # # Arguments: # None. # # Side Effects: # Modifies ::env environment to include stuff from the request. # # Results: # None. proc ::ncgi::parse {} { load_env ::env } # ::ncgi::value -- # # Returns the value of a 'cgi' variable. # # Arguments: # key - variable name. # default - default value should it not exist. # # Side Effects: # None. # # Results: # The value of the specified variable, or {} if it is empty. proc ::ncgi::value {key {default {}}} { if { [var exists $key] } { return [var get $key] } else { return $default } } # ::ncgi::encode -- # # HTML encode a string. # # Arguments: # string - text to encode. # # Side Effects: # None. # # Results: # Encoded string. proc ::ncgi::encode {string} { return [http::formatQuery $string] } # ::ncgi::importFile -- # # See the ncgi documentation. proc ::ncgi::importFile {cmd var {filename {}}} { switch -exact -- $cmd { -server { if { $filename == {} } { set filename [::fileutil::tempfile ncgi] } upload save $var $filename return $filename } -client { return [upload filename $var] } -type { return [upload type] } -data { return [upload data $var] } default { error "Unknown subcommand to ncgi::import_file: $cmd" } } } # ::ncgi::empty -- # # Returns 1 if the CGI variable in question is not set, 0 if it # is set. # # Arguments: # name - variable name. # # Side Effects: # None. # # Results: # 1 or 0. proc ::ncgi::empty {name} { expr {! [var exists $name]} } # ::ncgi::::redirect -- # # Generate a redirect. # # Arguments: # uri - new URL to go to. # # Side Effects: # Must be done before puts statements. # # Results: # None. proc ::ncgi::::redirect {uri} { headers redirect $uri }rivet-2.2.4/rivet/packages/calendar/0000755000175000017500000000000012630261004016612 5ustar manghimanghirivet-2.2.4/rivet/packages/calendar/calendar.tcl0000644000175000017500000004110512221020733021066 0ustar manghimanghi# # Copyright 2000-2005 The Apache Software Foundation # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # # # # $Id: calendar.tcl 916 2010-07-03 00:37:44Z massimo.manghi $ # package provide Calendar 1.1 package require Itcl # Calendar: base class to create a calendar table. # # Calendar prints an ascii calendar following the output form of a Unix # 'cal' command. Even though it can be used as a concrete class it was # designed to have methods and mechanisms abstract enough to be easly # customized and specialized through derivation of other classes (see XmlCalendar) # # The output of Calendar (method 'emit') # # # Jun 2010 | header | banner # Su Mo Tu We Th Fr Sa | | weekdays # 1 2 3 4 5 | table # 6 7 8 9 10 11 12 | # 13 14 15 16 17 18 19 | # 20 21 22 23 24 25 26 # 27 28 29 30 # # ::itcl::class Calendar { public common month_names public common day_names private variable month_year_processed {} # language to be used: key to be used in 'month_names' # and in case in other databases public variable language en private method numberOfDays { month year } private method cal { month year } protected method weekdays { } protected method banner { mth yr } protected method header { mth yr } protected method first_week { mth yr wkday } protected method formatDayCell { day } protected method openRow { wkn } protected method closeRow { } protected method table { mth yr } protected method startOutput { } protected method closeOutput { } public method cal_processed {} { return $month_year_processed } public method emit { args } constructor {args} { set month_names(en) { Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec } set month_names(it) { Gen Feb Mar Apr Mag Giu Lug Ago Set Ott Nov Dic } set day_names(en) { Su Mo Tu We Th Fr Sa } set day_names(it) { Do Lu Ma Me Gi Ve Sa } } } # numberOfDays : private method that returns the number of days in # the current month. # ::itcl::body Calendar::numberOfDays {month year} { if {$month == 12} { set month 1; incr year } return [clock format [clock scan "[incr month]/1/$year 1 day ago"] -format %d] } ::itcl::body Calendar::banner {month_idx yr} { set month_name [lindex $month_names($language) $month_idx] return " $month_name $yr\n" } ::itcl::body Calendar::weekdays {} { return "$day_names($language)\n" } # header # returns the header of the calendar table. The header is made of a banner (e.g. "Jul 2010") # and a list of the weekdays (Su Mo ... Sa) # # Arguments: month index (0: jan, 11: dec). # year number. # # Returned value: text of the cal table header. # ::itcl::body Calendar::header {mth_idx yr} { return "[$this banner $mth_idx $yr][$this weekdays]" } # first_week: cal tables are organized in columns corresponding to weekdays (from Sunday to Saturday). # first_week returns as many blank cells as the number of weekdays starting from Sun up to the first day of the # month. # ::itcl::body Calendar::first_week {month_idx year weekday} { return [string repeat " " $weekday] } ::itcl::body Calendar::formatDayCell { day } { return [format %3d $day] } ::itcl::body Calendar::openRow { wkn } { return "" } ::itcl::body Calendar::closeRow { } { return "\n" } # table : ::itcl::body Calendar::table {month_idx year} { set wk 0 set tbl [$this openRow $wk] set month [lindex $month_names(en) $month_idx] set weekday [clock format [clock scan "1 $month $year"] -format %w] append tbl [$this first_week $month_idx $year $weekday] scan [clock format [clock scan "1 $month $year"] -format %m] %d decm set maxd [numberOfDays $decm $year] for {set d 1} {$d <= $maxd} {incr d} { if {$weekday == 0} { incr wk append tbl [$this openRow $wk] } append tbl [formatDayCell $d] if {[incr weekday] > 6} {append tbl [$this closeRow]; set weekday 0} } return $tbl } # abstract base methods for starting and closing the output buffer. ::itcl::body Calendar::startOutput {} { return "" } ::itcl::body Calendar::closeOutput {} { return "" } # cal : cal does the real heavy lifting of building the # calendar table. cal is designed to be the most abstract possible: # - the output buffer is initialized by startOutput (this class does nothing) # - the output buffer is filled with the header: in the classical Unix cal # command output this corresponds to the 2 lines showing the year, the month and # the weekdays # - the output buffer is appended filled with the actual table of days of the month # - the output is closed. This class does basically nothing ::itcl::body Calendar::cal {month_idx year} { set month_year_processed [list $month_idx $year] set res [$this startOutput] append res [$this header $month_idx $year] append res [$this table $month_idx $year] append res [$this closeOutput] return $res } # emit args: # # emit returns the text of the calendar. If one argument is passed # to this method its value is taken as a year number and the whole # calendar for that year is printed, thus cycling this same method # for each month of the year and concatenating the output in a single # buffer. If 2 arguments are passed emit interprets them as month # and year. can be specified both in number (1-12) or # abbreviated name (Jan,Feb,....,Dec). A minimal support for other # languages exists. If no arguments are passed to 'emit' the current # month calendar is displayed. # ::itcl::body Calendar::emit { args } { set argsnumber [llength $args] # if we have just one argument therefore it be an year and we proceed to # generate a whole year calendar, otherwise we have to examine possible # options and values if {$argsnumber > 1} { if {$argsnumber%2 == 0} { set primo_chr [string range [lindex $args 0] 0 0] if {$primo_chr == "-"} { # we proceed to eval import_arguments $args set numeric_parameters {} eval $this configure $args } else { # arguments number is even. If the first switch is not an option (-opt) # we assume we are passing 2 parameters to the methods, while the # remaining list are actually an -opt val pairs list # we assume the rest of the args are in the form -opt1 val1 -opt2 val2 ... # we proceed to eval import_arguments [lrange $args 2 end] set numeric_parameters [lrange $args 0 1] eval $this configure [lrange $args 2 end] } } else { # we assume the rest of the args are in the form -opt1 val1 -opt2 val2 ... # and then we eval import_arguments [lrange $args 1 end] set numeric_parameters [lrange $args 0 0] eval $this configure [lrange $args 1 end] } } else { set numeric_parameters $args } set argsnumber [llength $numeric_parameters] switch $argsnumber { 1 { # if only one argument is passed to this procedure then we treat it as either as a # year (therefore must be a number) or a month name of the current year if {[regexp {^[0-9]+$} $numeric_parameters]} { set res {} set year $numeric_parameters for {set m 0} {$m < 12} {incr m} { append res [cal $m $year]\n\n } return [string trimright $res] } set month_idx [lsearch $month_names($language) $numeric_parameters] if {$month_idx >= 0} { set year [clock format [clock sec] -format %Y] return [cal $month_idx $year] } else { return "" } } 2 { # two args: the first is the month, the second the year. set month [lindex $numeric_parameters 0] set year [lindex $numeric_parameters 1] if {[regexp {^\d{1,2}$} $month mat] && ($month > 0) && ($month <= 12)} { return [cal [incr month -1] $year] } elseif { [lsearch $month_names($language) $month] >= 0} { return [cal [lsearch $month_names($language) $month] $year] } } 0 - default { # no arguments, we take today as reference scan [clock format [clock seconds] -format %m] "%d" month set year [format "%d" [clock format [clock sec] -format %Y]] return [cal [incr month -1] $year] } } } # XmlCalendar: XmlCalendar inherits the table structure of Calendar and # adds XML markup to a calendar table. The design is driven by the layout # of a calendar table. This is probably a rather naive approach. # A better implementation would require separate data and layout classes, # but it's only a calendar table anyway ::itcl::class XmlCalendar { inherit Calendar private method validateWeekday { wkd } # dictionary of table generation parameters (tag , attributes). key for the dictionary can be # # - container: # - header # - weekdays # - days_row # - days_cell # # for every key a 'tag' and 'attr' key is defined. attr is a even-length list storing # attribute-value pairs public variable parameters # we are emitting (x)html code that has to be encapsulated # in this root element. If the value is a list the first element is # the tag name and the rest is treated as a list of ," return $open_tag } ::itcl::body XmlCalendar::mkCloseTag {tag} { return "" } # The Xml header is made of a banner (i.e Month Year) and # a bar showing the weekdays with their markup. # ::itcl::body XmlCalendar::header {mth_idx yr} { set header_tag [getParameters header tag] set header_att [getParameters header attr] return "[mkOpenTag $header_tag $header_att][Calendar::header $mth_idx $yr][mkCloseTag $header_tag]\n" } ::itcl::body XmlCalendar::weekdays { } { set rowtag [getParameters wkdays_bar tag] set xml [mkOpenTag $rowtag] set tagname [getParameters wkday_cell tag] set wdn 0 foreach dn $day_names($language) { if {$wdn == $current_weekday} { append xml "[mkOpenTag $tagname {class current_wkday}]$dn[mkCloseTag $tagname]" } else { append xml "[mkOpenTag $tagname]$dn[mkCloseTag $tagname]" } incr wdn } append xml [mkCloseTag $rowtag] return $xml } ::itcl::body XmlCalendar::banner {month_idx yr} { set month_name [lindex $month_names($language) $month_idx] set header_tag [getParameters banner tag] set month_open_tag [mkOpenTag [getParameters banner_month tag] [getParameters banner_month attr]] set year_open_tag [mkOpenTag [getParameters banner_year tag] [getParameters banner_year attr]] set banner_html [mkOpenTag $header_tag] append banner_html "${month_open_tag}${month_name}[mkCloseTag [getParameters banner_month tag]]" append banner_html "${year_open_tag}$yr[mkCloseTag [getParameters banner_year tag]]" append banner_html [mkCloseTag $header_tag] return $banner_html } ::itcl::body XmlCalendar::formatDayCell { day } { set tagname [getParameters days_cell tag] set tagattr [getParameters days_cell attr] array set attributes $tagattr if {$day == $current_day} { set attributes(class) current } if {$cell_function != "" && $day != ""} { set month_year [$this cal_processed] set month [lindex $month_names(en) [lindex $month_year 0]] set year [lindex $month_year 1] set wkday [clock format [clock scan "$month $day $year"] -format %w] array set attributes [eval $cell_function $day $month_year $wkday] } set tagattr [array get attributes] return "[mkOpenTag $tagname $tagattr]$day[mkCloseTag $tagname]" } ::itcl::body XmlCalendar::first_week { mth yr wkday } { set emptyCell [formatDayCell ""] return [string repeat $emptyCell $wkday] } ::itcl::body XmlCalendar::table {month_idx year} { set body_tag [getParameters body tag] set body_att [getParameters body attr] return "[mkOpenTag $body_tag $body_att][Calendar::table $month_idx $year][mkCloseTag $body_tag]\n" } ::itcl::body XmlCalendar::openRow { wkn } { set tagname [getParameters days_row tag] set attributes [concat class week_${wkn} [getParameters days_row attr]] return [mkOpenTag $tagname $attributes] } ::itcl::body XmlCalendar::closeRow {} { set tagname [getParameters days_row tag] return "[mkCloseTag $tagname]\n" } # HtmlCalendar: concrete class for generating Html formatted cal output. # # ::itcl::class HtmlCalendar { inherit XmlCalendar constructor {args} {XmlCalendar::constructor $args} { $this configure -container table \ -header thead \ -body tbody \ -banner tr \ -banner_month {th colspan 3 style "text-align: right;"} \ -banner_year {th colspan 4 style "text-align: left;"} \ -weekdays tr \ -weekday_cell th \ -days_row tr \ -days_cell td } } rivet-2.2.4/rivet/packages/form/0000755000175000017500000000000012630261004016004 5ustar manghimanghirivet-2.2.4/rivet/packages/form/pkgIndex.tcl0000644000175000017500000000010207450201071020254 0ustar manghimanghipackage ifneeded form 1.0 [list source [file join $dir form.tcl]] rivet-2.2.4/rivet/packages/form/form2.tcl0000644000175000017500000004132012202203537017537 0ustar manghimanghi# form.tcl -- generate forms automatically. # Copyright 2002-2004 The Apache Software Foundation # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. package require Itcl package provide form 2.0 # # Rivet form class # ::itcl::class form { constructor {args} { # set the form method to be a post and the action to be # a refetching of the current page set arguments(method) post set arguments(action) [::rivet::env DOCUMENT_URI] # use $this for the type for form-global stuff like form arguments import_data form $this arguments $args if {[info exists arguments(defaults)]} { # make the public variable contain the name of the array # we are sucking default values out of set defaults $arguments(defaults) upvar 1 $arguments(defaults) callerDefaults array set DefaultValues [array get callerDefaults] unset arguments(defaults) } else { array set DefaultValues {} } } destructor { } method destroy {} { ::itcl::delete object $this } # # import_data -- given a field type, field name, name of an array, and a # list of key-value pairs, prepend any default key-value pairs, # then store the resulting key-value pairs in the named array # protected method import_data {type name arrayName list} { upvar 1 $arrayName data # # If there are elements in the defaultArgs array for the # specified type, combine them with the list of key-value # pairs, putting the DefaultArgs values first so the # key-value pairs from list can possibly override them. # if {[info exists DefaultArgs($type)]} { set list [concat $DefaultArgs($type) $list] } # # if we don't have an even number of key-value pairs, # that just ain't right # if {[llength $list] % 2} { return -code error "Unmatched key-value pairs" } # # for each key-value pair in the list, strip the first # dash character from the key part and map it to lower # case, then use that as the key for the passed-in # array and store the corresonding value in there # # we also prep and return the list of key-value pairs, normalized # with the lowercase thing # set return "" foreach {var val} $list { set var [string range [string tolower $var] 1 end] if {$var == "prefix"} { set prefix $val continue } set data($var) $val if {($var == "values") || ($var == "labels")} { continue } lappend return -$var $val } return $return } # # argstring - given an array name, construct a string of the # style key1="data1" key2="data2" etc for each key value pair in the # array # protected method argstring {arrayName} { upvar 1 $arrayName data set string "" foreach arg [lsort [array names data]] { append string " $arg=\"$data($arg)\"" } return $string } # # default_value ?-list? ?--? name ?value? # # If value is not given, returns a default value # for that name if one exists, else an empty list. # # if a name and a value are given, the default value is set to that # name (and the new default value is returned). # # The default value is a list if "-list" is given. method default_value {args} { # Command line if {[lindex $args 0] eq "-list"} { set isList 1 set args [lrange $args 1 end] } if {[lindex $args 0] eq "--"} { set args [lrange $args 1 end] } switch -exact -- [llength $args] { 1 { # Return default value lassign $args name if {default_exists $name]} { if {[info exists isList]} { return [default_list_get $name] } else { return [default_value_get $name] } } else { return } } 2 { # Set default value lassign $args name value set DefaultValues($name) $value if {[info exists isList]} { set DefaultValues(__$name) 1 } else { unset -nocomplain DefaultValues(__$name) } } default { error "wrong argument count" } } } # # default_exists - return true, if a default value exists protected method default_exists {name} { return [info exists DefaultValues($name)] } # # default_list_get - get the default value as a list # return with error if there is no default value protected method default_list_get {name} { if {[info exists DefaultValues(__$name)]} { return $DefaultValues($name) } else { return [list $DefaultValues($name)] } } # # default_value_get - get the default value as a value # return with error if there is no default value protected method default_value_get {name} { if {[info exists DefaultValues(__$name)]} { return [lindex $DefaultValues($name) 0] } else { return $DefaultValues($name) } } # # default_value_exists - return true, if the given value exists in the # default list protected method default_value_exists {name value} { if { ! [info exists DefaultValues($name)] } { return 0 } if {[info exists DefaultValues(__$name)]} { return [expr {$value in $DefaultValues($name)}] } return [expr {$value eq $DefaultValues($name)}] } # # default_args - given a type and a variable number of arguments, # if there are no arguments other than the type, return the # element of that name from the DefaultArgs array, if that element # exists, else return an empty list. # # if a name and a value are given, sets the DefaultArgs to the variable # list of arguments. # method default_args {type args} { # if only one argument was specified if {[lempty $args]} { if {![info exists DefaultArgs($type)]} { return } return $DefaultArgs($type) } # make sure we have an even number of key-value pairs if {[llength $args] % 2} { return -code error "Unmatched key-value pairs" } # set the DefaultArgs for the specified type return [set DefaultArgs($type) $args] } # # start - generate the
    with all of its arguments # method start {{args ""}} { if {![lempty $args]} { # replicated in constructor import_data form $this arguments $args } html "" } # # end - generate the
    # method end {} { html "" } # # field - emit a field of the given field type and name, including # any default key-value pairs defined for this field type and # optional key-value pairs included with the statement # method field {type name args} { # import any default key-value pairs, then any specified in this # field declaration import_data $type $name data $args switch -- $type { "radio" - "checkbox" { # if there's a label then prepare to output it. if {[info exists data(label)]} { set label "" $data(label) "" } # if there is a default value for this field # and it matches the value we have for it, make # the field show up as selected (checked) # Alternatively, select a checkbox, if it has no value but a # default value with arbitrary value. if { [info exists data(value)] && [default_value_exists $name $data(value)] || ![info exists data(value)] && $type eq "checkbox" && [info exists DefaultValues($name)] } { set data(checked) "checked" } } } # For non multi-choice widgets: set default value if there is no value # given if { ! [info exists data(value)] && [default_exists $name] && $type ni {"select" "radio" "checkbox"} } { set data(value) [default_value_get $name] } # generate the field definition set string "" if {[info exists label]} { append string $label } # ...and emit it html $string } # # text -- emit an HTML "text" field # method text {name args} { field text $name {*}$args } # # password -- emit an HTML "password" field # method password {name args} { field password $name {*}$args } # # hidden -- emit an HTML "hidden" field # method hidden {name args} { field hidden $name {*}$args } # # submit -- emit an HTML "submit" field # method submit {name args} { field submit $name {*}$args } # # button -- emit an HTML "button" field # method button {name args} { field button $name {*}$args } # # reset -- emit an HTML "reset" button # method reset {name args} { field reset $name {*}$args } # # image -- emit an HTML image field # method image {name args} { field image $name {*}$args } # # checkbox -- emit an HTML "checkbox" form field # method checkbox {name args} { field checkbox $name {*}$args } # # radio -- emit an HTML "radiobutton" form field # method radio {name args} { field radio $name {*}$args } # # color -- emit an HTML 5 "color" form field # method color {name args} { field color $name {*}$args } # # date -- emit an HTML 5 "date" form field # method date {name args} { field date $name {*}$args } # # datetime -- emit an HTML 5 "datetime" form field # method datetime {name args} { field datetime $name {*}$args } # # datetime_local -- emit an HTML 5 "datetime-local" form field # method datetime_local {name args} { field datetime-local $name {*}$args } # # email -- emit an HTML 5 "email" form field # method email {name args} { field email $name {*}$args } # # file -- emit an HTML 5 "file" form field # method file {name args} { field email $name {*}$args } # # month -- emit an HTML 5 "month" form field # method month {name args} { field month $name {*}$args } # # number -- emit an HTML 5 "number" form field # method number {name args} { field number $name {*}$args } # # range -- emit an HTML 5 "range" form field # method range {name args} { field range $name {*}$args } # # search -- emit an HTML 5 "search" form field # method search {name args} { field search $name {*}$args } # # tel -- emit an HTML 5 "tel" form field # method tel {name args} { field tel $name {*}$args } # # time -- emit an HTML 5 "time" form field # method time {name args} { field time $name {*}$args } # # url -- emit an HTML 5 "url" form field # method url {name args} { field url $name {*}$args } # # week -- emit an HTML 5 "week" form field # method week {name args} { field week $name {*}$args } # # radiobuttons -- # method radiobuttons {name args} { set data(values) [list] set data(labels) [list] set list [import_data radiobuttons $name data $args] if {[lempty $data(labels)]} { set data(labels) $data(values) } foreach label $data(labels) value $data(values) { radio $name {*}$list -label $label -value $value } } # # checkboxes -- # method checkboxes {name args} { set data(values) [list] set data(labels) [list] set list [import_data checkboxes $name data $args] if {[lempty $data(labels)]} { set data(labels) $data(values) } foreach label $data(labels) value $data(values) { checkbox $name {*}$list -label $label -value $value } } # # select -- generate a selector # # part of the key value pairs can include -values with a list, # and -labels with a list and it'll populate the