pax_global_header00006660000000000000000000000064141703217150014513gustar00rootroot0000000000000052 comment=9cf7ad7fee6de6920a440b1e982eb4ecb2d039cb eliom-9.4.0/000077500000000000000000000000001417032171500126325ustar00rootroot00000000000000eliom-9.4.0/.github/000077500000000000000000000000001417032171500141725ustar00rootroot00000000000000eliom-9.4.0/.github/workflows/000077500000000000000000000000001417032171500162275ustar00rootroot00000000000000eliom-9.4.0/.github/workflows/workflow.yml000066400000000000000000000021351417032171500206250ustar00rootroot00000000000000name: Main workflow on: pull_request: push: schedule: # Prime the caches every Monday - cron: 0 1 * * MON jobs: build: strategy: fail-fast: false matrix: os: - macos-latest - ubuntu-latest ocaml-compiler: - 4.08.x - 4.09.x - 4.10.x - 4.11.x - 4.12.x - 4.13.x runs-on: ${{ matrix.os }} steps: - name: Checkout code uses: actions/checkout@v2 - name: Use OCaml ${{ matrix.ocaml-compiler }} uses: ocaml/setup-ocaml@v2 with: ocaml-compiler: ${{ matrix.ocaml-compiler }} opam-depext: false opam-pin: false - name: Re-export the proper PKG_CONFIG_PATH variable to the environment on macOS run: echo "PKG_CONFIG_PATH=$(brew --prefix openssl)/lib/pkgconfig:$PKG_CONFIG_PATH" >>"$GITHUB_ENV" if: ${{ matrix.os == 'macos-latest' }} - run: opam pin add eliom.dev . --no-action - run: opam depext eliom --yes - run: opam install . --deps-only - run: opam exec -- make all eliom-9.4.0/.gitignore000066400000000000000000000003441417032171500146230ustar00rootroot00000000000000*~ #* *# .#* _build eliom.install src/**/*.mllib src/**/*.mldylib src/**/*.odocl local/etc local/var/run local/var/lib local/var/log local/tmp local/var/www/distillery-* tests/distillery/distillery-* ocsigen.org-data _opam eliom-9.4.0/.jenkins.sh000066400000000000000000000015231417032171500147060ustar00rootroot00000000000000opam pin add js_of_ocaml --dev-repo --no-action for pkg in camlp4 compiler lwt ocamlbuild ppx tyxml; do opam pin add js_of_ocaml-$pkg \ https://github.com/ocsigen/js_of_ocaml.git \ --no-action done opam pin add --no-action eliom . opam install --deps-only eliom opam install --verbose eliom do_build_doc () { make wikidoc cp -Rf doc/manual-wiki/*.wiki ${MANUAL_SRC_DIR} mkdir -p ${API_DIR}/server ${API_DIR}/client ${API_DIR}/ocamlbuild ${API_DIR}/ppx cp -Rf _build/src/lib/server/api.wikidocdir/*.wiki ${API_DIR}/server/ cp -Rf _build/src/lib/client/api.wikidocdir/*.wiki ${API_DIR}/client/ cp -Rf _build/src/ocamlbuild/api.wikidocdir/*.wiki ${API_DIR}/ocamlbuild/ cp -Rf _build/src/ppx/api.wikidocdir/*.wiki ${API_DIR}/ppx/ cp -Rf doc/index.wiki ${API_DIR}/ } do_remove () { opam remove --verbose eliom } eliom-9.4.0/.merlin000066400000000000000000000002641417032171500141230ustar00rootroot00000000000000B _build/src/* S src/* PKG js_of_ocaml PKG lwt PKG calendar PKG ocsipersist PKG ocsigenserver PKG react PKG reactiveData PKG ipaddr FLG -w +A-4-6-7-9-27-32-33-34-37-40-42-44-48 eliom-9.4.0/.ocp-indent000066400000000000000000000000521417032171500146700ustar00rootroot00000000000000normal with=0 syntax=lwt mll max_indent=2 eliom-9.4.0/CHANGES000066400000000000000000001246301417032171500136330ustar00rootroot00000000000000===== 9.0 (2021-10-16) ===== * compatibility with ocsigenserver.5.0.0 (outsourced Ocsipersist) ===== 8.8 (2021-10-05) ===== * rework Eliom_client * more debugging info * restore functions to access uploaded file info ===== 8.6 (2021-07-26) ===== * improvements of history handling and DOM caching ===== 8.5 (2020-10-28) ==== * Compatibility with ocsigenserver 4.0 ===== 6.9 (2019-11-12) ===== * fix scrolling bug: scrolling to top happens before page change * Server functions: log function argument on uncaught exceptions * Compile Eliom libraries with the linkall option ===== 6.8 (2019-09-11) ===== * Use directly Pcre instead of relying on Netstring_pcre * Improved async exception handler * Remove camlp4 syntax * Adapt to OCaml 4.08 * PPX extension: use migrate-parse-tree ===== 6.7 (2018-02-08) ===== * Eliom_client.Page_status: function while_active; ?stop parameter * DOM caching: treat history as linear and keep only reachable pages in cache ===== 6.6 (2018-01-17) ===== * Add missing function Eliom_request_info.get_remote_port * Eliom_client.Page_status.oninactive * Some documentation on DOM caching * Eliom_wrap: fix compilation on 32-bit architectures ===== 6.5 (2018-12-18) ===== * Compatibility with tyxml.4.3.x and js_of_caml.3.3.x ===== 6.4 (2018-12-17) ===== * Compatibility with Lwt 4.x * New configuration option to set html content type * Comet: deactivate when window does not have the focus; deactivate polling when idle * eliom_request_info.in_request_handler * Client-side non-localized parameters * Provide a way to serve global data separately from the initial page ===== 6.3 (2018-02-08) ===== * Compatibility with OCaml 4.06, js_of_ocaml 3.0 and Lwt 3.0 * DOM caching (preview) * Various small fixes and improvements ===== 6.2 (2017-02-07) ===== * Implement Eliom_client.onchangepage * Fix URL-related bugs arising in mobile apps ===== 6.1 (2016-12-20) ===== * Remove redundant dependency on calendar * Permit client routing to "./" * -y parameter for eliom-distillery (do not ask) * Eliom_client: do not execute onload after OCaml services * Permit suffix params in Eliom_service.create_attached_post ===== 6.0 (2016-12-08) ===== * Improve Eliom_service and Eliom_registration APIs using GADTs * Implement client-side services, useful for mobile apps. This includes ** client-side service registration (Eliom_registration) ** client-side service routing (Eliom_client.change_page_uri) * Transition to PPX internally * Compatibility with ** OCaml 4.03.0 and 4.04.0 ** Js_of_ocaml 2.8.2 and newer ** TyXML 4.0 and newer * Various bugfixes and improvements ===== 5.0 (2016-01-28) ===== * Add Eliom_shared and server-side Eliom_content.{Html5,Svg}.R modules * Add PPX syntax extension * Clean-up form APIs, now available under Eliom_content.Html5.{D,F}.Form * Patches to significantly reduce the size of request data * Compatibility with TyXML 3.6, Js_of_ocaml 2.7, and reactiveData 0.2 * Various bugfixes and enhancements ===== 4.2 (2015-07-21) ===== * Add Manip.children, to get the html children of an element. * Simplify Html5 and Svg signatures using tyxml's signature functors. * Various logging improvements, in particular in Eliom_client. * Fix eliomdep's exit code when calling option "-sort". * Fix #168: call_ocaml_service always sends boolean true. * Makes server function return types covariant. * Restore compatibility with ocsigenserver 2.6 and lwt 2.4.7. * Various bugfixes and wiki updates. ===== 4.1 (2014-10-01) ===== * Compatibility with js_of_ocaml-2.5 and tyxml-3.3.0 * Improvements: ** Simplify typing of services ** Use GADT to encode service parameters (Eliom_parameter) Eliom need OCaml 4.00 at least. ** bugfixes for service parameters ** Various bugfixes and enhancement ===== 4.0 (2014-05) ===== * Main new features: ** Reactive DOM elements (thanks to a contribution by besport.com) ** PUT and DELETE services for RESTful Eliom Applications (Contribution by Domoco) ** EXPERIMENTAL: Mobile apps with Eliom. By making it possible to start the application from client-side. ** Documentation improvements * Improvements: ** Improvements in typing of services (Contribution by Jacques-Pascal Deplaix) ** Filtering data from Eliom buses ** "caml" in value or type names now replaced by "OCaml" everywhere ** New module {{{Eliom_registration.File_ct}}} to make easier to send files with their content type ** Now possible to define services in shared sections ** Adding function {{{Eliom_client.change_url}}} to change the URL without doing a request ** Adding function {{{Eliom_service.attach_coservice'}}} to attach a non-attached coservice to an URL ** Improving comet configurations: now possible to stay idle instead of being completely inactive ** Now using defaultprotocol option (from ocsigenserver) to compute URLs ** The default expiration date for cookies on client side is now 10 years ** Now possible to send files in {{{Eliom_client.call_ocaml_service}}} ** Various additions and bugfixes in {{{Manip}}}, {{{Eliom_request_info}}}, {{{Eliom_content.html5}}} (events) (contributions by besport.com) ** eliom-destillery renamed into eliom-distillery ** Templates for eliom-distillery ** New programs: eliomdoc and eliompp ** Ocamlbuild package ** Various bugfixes And many other things (see git commits) ===== 3.0.0 (2012-12-10) ===== * Language ** Generalized client values in server code ** Injections into client sections * Tools ** Added eliom-destillery for generating project scaffolds ** Support Eliom interface files (.eliomi) in eliomc, eliomdep ** eliomdep: Generate dependencies between eliom-modules ** eliomc: infer only with option -infer, drop option -noinfer ** eliomc: Basic support for -i on eliom-files ** eliom{c,dep,opt},js_of_eliom: -dump to output the intermediate code ** eliomc,js_of_eliom: always open Eliom_pervasives in eliom files * API ** Eliom_pervasives.server_function to easily access the from the client ** Get current state of a scope ** Module to access values of Eliom references in external states (Eliom_state.Ext) ** Scope names are now named scope hierarchies ** Iterate the scope hierarchy (group > session > client > request) ** Adding Eliom_parameter.(type_checker, neopt) ** Add functions to insert html5 in atom feeds ** Eliom_tools.{F,D}.html to ease creation of head-tag ** Eliom_tools.wrap_handler as an easy alernative to Eliom_registration.Customize ** Test for initial request of a client on the server * Changed server behaviour ** Eliom_state.discard_everything now also discards request state ** Don't send nodes as data when they are part of the document * Changed client behaviour ** Show progress cursor during navigation with change_page ** Improved error messages ** Fail on the client when a [server_function] or call_caml_service fails on the server * Bugfixes ** Allow % for injections directly after parentheses * Support dropped for ** Xhtml ** OCamlDuce ** Eliom_compatibility_2_1 * A myriade of bugfixes ===== 2.2.2 (2012-06-11) ===== * Fix (re-disable) generation of API doc for ocamlduce modules ===== 2.2.1 (2012-06-07) ===== Addendum to the great renaming * Eliom_cookies -> Eliom_cookie * Eliom_comet.Channels -> Eliom_comet.Channel ===== 2.2 (2012-06-02) ===== The great renaming: Make Eliom's API more coherent * Dropped Eliom_pervasives, split into ** Eliom_lib (extension of stdlib) ** Eliom_content (content creation) * Moved all Html5,Xhtml content function to Eliom_content.{Html5,Xhtml} ** {HTML5,SVG,XHTML}.M -> Eliom_content.{Html5,Svg,Xhtml}.F ** {HTML5,SVG,XHTML}.DOM -> Eliom_content.{Html5,Svg,Xhtml}.D ** Eliom_output.{Html5,Xhtml}: form functions to Eliom_content.{Html5,Xhtml} ** Eliom_client.Html5 -> Eliom_content.Html5.To_dom ** Eliom_dom -> Eliom_content.Html5.Manip ** HTML5.of_element -> Eliom_content.Html5.Of_dom.of_element * Removed default implementations in Eliom_content.{Html5,Svg,Xhtml} (was inclusion of DOM) * Rename Eliom_output to Eliom_registration * Rename Eliom_registration.Eliom_appl to Eliom_registration.App * Conform naming conventions for modules (singular, lower-case) ** XML -> Xml ** SVG -> Svg ** XML_types -> Xml_types ** XHTML_types -> Xhtml_types ** HTML5_types -> Html5_types ** Eliom_services -> Eliom_service ** Eliom_parameters -> Eliom_parameter ** Eliom_references -> Eliom_reference ** Eliom_extensions -> Eliom_extension * Approximating compatibility module for Eliom 2.1: Eliom_compatibility_2_1 ===== 2.1.1 (2012-03-20) ===== * Server: Add Eliom references of scope site * Server: Add an non-Lwt interface to volatile Eliom references * Client: Add an option to restrict usage of XHR. * Bugfixes: ** Client: More robust and portable history handling ** Client: More robust CSS preloading (change_page) ** Client: Better compatibility with Opera ===== 2.1.0 (2012-02-24) ===== * Page loading rewritten. ** We do not traverse the HTML tree anymore for retrieving links and putting events handlers, it use querySelectorAll instead. (with a fallback for older browsers) *** We do not send a sparse tree along the page anymore. *** It is faster and more resilient to ugly browser plugins ** Add css loading optimisations: It fetch the css included using @include with XHR before changing page and construct only one concatenated css. It avoids page blinking when the css change and is faster (browsers tend to render the page once per css). ** Unwrapping hand rewritten in js. ** And a lot of other optimisations. * Rework of unique nodes: ** Introduce new lightweight 'unique' node of scope request, a.k.a. DOM nodes: use it through HTML5.DOM.{div,...} or its alias HTML5.{div,...}. ** To create unique node of scope application, the function 'HTML5.M.unique ?copy' has been renamed 'HTML5.create_global_elt ?id' ** Abstract id for application node are created with "HTML.new_global_elt_id" ** Node representation now differs between the client and the server. They are unwrapped on the client to simplify the XML representation: "unique" node that have already a "Javascript DOM representation" only contains a reference to the DOM representation. * Server API Changes: ** Add Eliom_state.get_*_session_group_size to know the number of session in a session group ** Parameters of type any can't be suffixes (semantic problem) ** Add Eliom_comet.wait_timeout to notify when a client isn't active ** Allow services to setup "Cache-policy: max-age" with Text, CssText and Files modules. ** Eliom_state.discard and discard_data now accept scope request. * Client API Changes: ** add an Eliom_dom module provinding imperative function on unique HTML5.elt. (for instance {{{appendChild: ?before:'a elt -> 'b elt -> 'c elt -> unit}}}). ** HTML5.M.a_on{click,...} functions directly expect a function as parameter (XML.event_handler_of_function isn't required anymore). ** Eliom_comet: configuration option for time until timeout after the focus is lost ** Handling wrapping of int32 type. ** Onload event handlers on HTML elements are executed when they are converted to DOM (using Eliom_client.of_ functions). This allows them to be added to nodes not sent in the page. ** Calls to {{{Eliom_services.onload}}} are taken into account for services sending caml values. The handlers are executed when the call to {{{Eliom_client.caml_call_service}}} terminates. * Eliom syntax: ** Event handlers can now access the current event using the _ev variable inside {{ ... }} typed according to the attribute. ** Allow modules to be used inside client expr {{ ... }} and client_expr {{ ... }} to be used inside modules ** Add -ppopt option to eliomc * And a lot of bugfixes. ===== 2.0.2 (2001-11-30) ===== * Compatibility with js_of_ocaml-1.0.8 and tyxml-2.0.1 * API Changes: ** Eliom_output.Redirection: use 302 as default and introduce abstract nome for all the 30x HTTP code ** Eliom_output.Customize: remove unrequired Functor parameters. * Delayed URl computation: this allows relative links to be created outside of service handler. * Client: do not ignore "onload" events attached on Dom elements other than window. * Bugfixes: ** Client: do not execute change_page_uri when the middle button or any modifier key is pressed. ** Client: update correctly the location when changing page with forms. ** Server: displaying better dynlink error messages. ** Syntax extension: avoid infinite loop while parsing first-order module expression ** Eliom_parameters: fixing wrong parameter names for list of list ** Eliom_parameters: fixing bug causing stack overflow when lists parameter names were wrong ** Fixing bug with non-localized parameters and service not keeping non-attached params ** Eliom_comet: stateless channels can be registered multiple times (close #220) ===== 2.0.1 (2011-09-28) ===== * Bugfixes in eliom appl.: ** Preload css when changing page to avoid a disgraceful "flash" effect ** Use to preserve links in unique node when changing page ** Fragment in URL aren't ignored anymore ** Proper exception handling in eliomc, js_of_eliom, ... ** Display a correct URL after submitting a
===== 2.0 (2011-09-20) ===== * Bugfixes: ** Correct handling of HTTP redirections hidden by XHR ** Fix links from http to https on client application ===== 2.0-rc2 (2011-09-06) ===== * Feature: ** api history: when the api history is available, application URLs are more readable (no more {{{#!}}}) * Bugfixes: ** fix browser compatibility: it should work with Firefox (>= 3.0), Chrome (all recent version we tested), Safari 5, Opera (tested 11.51), Internet explorer (9, ie 8 almost work) ** in forms declared outside of the sp's scope, hrefs were incorrect: url calculation is now done for each request ** the function {{{Eliom_client.caml_call_service}}} was broken with some kind of services ** application cookies are now always sent ** fix incorrect sharing of type variables in the syntax extension (thanks to William Le Ferrand) ** 404 and 403 errors are not dropped by applications anymore (This fix is partial: when the page content is application content, this still does not work when an exception handler returns something else) ** Fix problems with url generation for non-attached coservices inside an application ** tail recursive marshalling and demarshalling: no more limit on the depth of data sent along the page ** Fix problems with redirection and action with `NoReload exiting the application ** Handle correctly 204 code in application (do nothing with change page, fail with caml_call_service) ** Fix escape character '>': problem with strings containing "]]>" ===== 2.0-rc1 (2011-07-15) ===== * Eliom_client.change_page type now correctly forbid to call it on non-eliom application services * Stateless implementation of comet channels * Scope and state names parameters of functions are now fused in one parameter (called scope) * Change the type of 'send' functions: forbid use of incompatible output with Eliom_output.Any together. * Change the format of page loaded by an application: all pages are sent in HTML5 format. (first answers were in HTML5 subsequent were marshalled caml tree) * XML representation is now shared by client and server: conversion to Dom nodes is made by Eliom_client.Html5.of_ functions * Remove the need for an application container: application pages are now classical HTML5 pages. * Add Eliom_pervasives.{HTML5/XML/SVG}.unique function to declare XML node handled "by reference" * Fix ocamldoc generation with Eliom_output * Eliom_appl are now stateless if no data is stored in session * Allow dynamic wrapping with values to be sent to client with caml services and comet channel * Add Eliom_react.S: server to client React signals * Add lazy site values: lazy evaluated one time per site * Option to compile without preemptive threads * And lots of simplifications and bug fixes ===== 1.91 (2011-04-08) ===== * Split the ocsigen package in three : tyxml, ocsigenserver and eliom * Rename into eliom * It's now possible to set a //priority// on services registered on the same path, to choose in which order Eliom will try them. * New implementation of internal application forms with formData when available * New build system for eliom application * No type restriction in value sent from the server to the client ===== 1.90 ===== * New module {{{Eliom_client}}} for client/server Eliom programs using js_of_ocaml. * Eliom client: calling a service from client side code. * Eliom: Services taking Caml values as parameters. * Eliom: services sending Caml values. * Eliom: new implementation of forms and links to be compatible with client side programs. * Eliom: sp parameter has been removed (now using Lwt's thread storage) * Eliom: {{{Eliom_predefmod}}} renamed {{{Eliom_output}}} * Eliom: New module {{{Eliom_output.Customize}}} to create your own register functions from another registration module * Eliom: Module {{{Eliom_sessions}}} replaced by {{{Eliom_state}}}, {{{Eliom_request_info}}} and {{{Eliom_config}}}. * Eliom: new implementation of user cookies. * Eliom: Client process cookies. Like usual browser cookies but for one client side process. * Eliom: Client process server side state data. Like session data but for one client side process. * Eliom: Client process session services. * Eliom: Session group data. Like session data but for all sessions in a session group. * Eliom: Session group services. * Eliom: session replaced by a more general concept of "server side state". States have a scope: client process, session or group of sessions. * Eliom: session tables and request cache now deprecated, replaced by //Eliom references// * Eliom client: Possible to call another service without stopping the client side program, with bookmark support and back button support. * New extension Comet to allow server -> client communication. * Eliom: client/server communication channels. * Eliom: client/server reactive programming using React. * Eliom client: syntax extension for separating client and server code. * Eliom: New module Eliom_output.Eliom_appl for registering pages that belong to the same Eliom application. * Eliom client: syntax extension and wrapping/unwrapping mechanism to access server side values in client side code. * Eliom client: Relinking the DOM on client side after loading a (portion of) page. This allows nodes created on server side to be directly used in client side code. * Eliom client: XHR redirections for Eliom applications. * Eliom: safe unmarshaling of caml values sent by client side programs * Xhtml: Xhtml5 support * Atom module and Pubsubhubbub * OpenID support * SVG module * Documentation: New tutorial * Documentation: New Eliom manual * //and many other things ...// ===== 1.3.4 ===== * Eliom: Now supporting list of lists in service parameters ===== 1.3.3 (2010-06-13) ===== * Eliom: Fix some typos in Eliom's tutorial stylesheet * Server: Fix usage of {{{accept_n}}} to avoid file descriptor leakage * XHTML: Adding missing elements and attributes in XHTML.M * Cleaning Ocsigen_cache * Eliom: Fixing actions with uploads ===== 1.3.2 (2010-04-30) ===== * Add dummy findlib packages ocsigen.xhtml*, that depend on ocsigen_xhtml*, for compatibility with previous versions. These packages might be removed in a future (major) release. * Port to Lwt 2.1.0 ===== 1.3.1 (2010-04-23) ===== * Split out ocsigen_xhtml findlib package * Configuration file: when no protocol is specified in {{{}}}, listen on IPv6 (if possible) and IPv4 (always) ===== 1.3.0 (2010-01-22) ===== * Server: Each request now has a polymorphic data table (called //request cache//), where you can store the data you want to keep during the whole page generation. * Eliom: actions now return {{{()}}}. Use the request cache to send information to fallbacks. * Eliom: CSRF-safe coservices * Eliom: the number of sessions without group by IP address is now limited * Eliom: efficient implementation of limitation of sessions by groups (or now IP) for large limits * Eliom: the number of anonymous coservices by session is now limited * Eliom: the number of anonymous coservices without session by IP address is now limited * Eliom: now possible to unregister services * Eliom: New (very) experimental module {{{Eliom_obrowser}}} to use Eliom with Obrowser * Eliom: Now possible to have constant parts in suffixes to allow URLS like {{{/param1/something/param2}}} * Eliom: services with optional suffixes * Eliom: form towards a service with suffix: it is now possible to choose whether you want the redirection towards the suffix form or not * Eliom: lists and sets in suffixes * Eliom: Now possible to create services sending custom HTTP header values or customizing the content-type * Eliom: New notion: "Non localized parameters". Can be sent to any service. * Eliom: changing the order of parameters for user type form widgets * Eliom: changing the order of parameters for user type form widgets * Eliom: Eliom_tools.menu and hierarchical_menu now compare the URL strings (was: compare the service) * Eliom: textarea now take a string (was pcdata) * Eliom: The type of the iterator for lists in parameters has changed * Eliom: New options in configuration file to set session timeouts * Server: now possible to give the config file name to reload server command * Server: now possible to do a "graceful shutdown" of the server using the "shutdown" server command * Server: now possible to add custom commands for the command pipe * Server: EXPERIMENTAL now possible to observe HTTP headers before sending the result * Xhtmlpp: the parsing now fails if a quotation for an Xhtml element contains superfluous elements. (This can cause the parsing of previously incorrect code to fail) * Staticmod/Eliom: attempting to access a file whose name contains a NULL character will result in a 403. * Server: HTTP headers containing newlines are now properly escaped. * Server: correct missing xmlns in Xhtml DTD * Server: now send last-modified and etag headers when returning a 403 * Server: Now accepting several requests at a time (as explained in "Accept()able strategies" by Tim Brecht & all) * Rewritemod: more rewriting possibilities (still very basic) * Eliom menus are now more robust when finding which item is active * Fixed handling of incorrectly-sized multipart requests. Thanks to Mauricio Fernandez for noticing the bug * Upload directory and maximum file size can now be configured on a per-site basis * Renamed the field of Ocsigen_http_frame.t * Javascript events support in Xhtml.M ; Thanks to john @ 5070.info for the patch ===== 1.2.2 (2009-10-17) ===== * Add react and lwt.unix to the list of built-in findlib packages ===== 1.2.1 (2009-09-26) ===== * Lwt 2.0 compatibility: ** Adapt to Lwt.t/Lwt.u splitting ** fix Makefile to deal with lwt.unix findlib package * Fix ocsipersist-dbm Makefile * Fix for pcre-ocaml 6.0.0 * Fix typo regarding --stubdir in configure script ===== 1.2.0 (2009-03-25) ===== * Native code version now compiled by default * Now possible to link extensions and Eliom modules statically, for example to use a native code server on platforms where native dynlink is not supported * Server: Partial requests implemented (Range HTTP header) * Build C stubs into a shared library so that bytecode executables may be not linked in custom mode; new {{{--stubdir}}} option in {{{configure}}} script * Eliom: non-attached services now called "named non-attached coservices" and created using {{{Eliom_services.new_coservice'}}} with the optional {{{name}}} parameter * Eliom: now possible to create named attached coservices using the optional {{{name}}} parameter * Eliom: now possible to write libraries for Eliom sites, loaded inside {{{}}}, but not generating any page * Eliom and server: EXPERIMENTAL now possible to make extensions that can use Eliom's data * XHTML.M's pretty printer: now possible to set the DOCTYPE manually * Eliom: now possible to set manually the DOCTYPE when registering an XHTML.M service * Redirectmod and Revproxy: now possible to do more complex rewriting * Accesscontrol: add support for {{{}}} and {{{}}} conditions * Config file: {{{aliases}}} attribute now called {{{hostfilter}}} * Revproxy and Redirectmod: now possible to filter on server, port and protocol * New extension extendconfiguration to allow dynamic changes in the configuration (mimetypes, charsets, followsymnlink, directory listing, ...) * Server: new module {{{LocalFiles}}} factoring the common parts for sending static files (with Eliom and staticmod for example), while checking that the files can safely be sent. * Now possible to use XHTML pretty printers without Ocsigen, using the {{{xhtmlpretty.cma}}} library * Add {{{Ocsigen_lib.register_exn_printer}}}, better error messages * Now possible to use the same configuration file in native code and in bytecode (.cmo/.cma filenames are internally translated to .cmxs) * Signature of Ocsigen_extensions.register_extension is now more complete and more lightweight * Userconf: the options set in the local .userconf file are kept in the enclosing {{{}}} tag * Server: possibility to ignore or to supply an alternative command-line * Ocsigen_http_client: timeout when the distant server does not exists * OCaml versions < 3.10 are not supported anymore * Extensions are now much more strict w.r.t. the syntax of configuration files * Staticmod: accessing a directory for which indexing is disallowed returns an error 404 (instead of a 403 previously) ===== 1.1.0 (2008-07-15) ===== * Lwt removed (now distributed separately) * {{{XHTML.M}}} pretty printer: fixing pretty printing of empty tags (for browser compatibility) * Eliom_duce: New pretty printer for XHTML fixing pretty printing of empty tags * Eliom: secure sessions, secure services, (absolute) https links/forms, and using secure cookies * Eliom: Adding special "void action", without any parameters * Eliom: {{{Eliom_predefmod.Redirections}}} now called {{{Eliom_predefmod.String_redirection}}}, and adding new module {{{Eliom_predefmod.Redirection}}} that use GET services without parameters as data type. * Eliom and XHTML.M: Small changes of types in interfaces * Eliom: New session ID generator * Eliom: Adding types {{{int32}}} and {{{int64}}} for parameters and forms * Eliom: Adding functions {{{lwt_get_form}}} and {{{lwt_post_form}}} for creating forms using cooperative functions * Eliom and Staticmod: now possible to give GET parameters to static pages * Eliom: Bugfix in Makefiles for native code version * Eliom forms: Adding missing types in interfaces * Eliom_tools: current page is now optional in menus * Userconf and Eliom: there was a bug when loading both Eliom and Userconf together * Reverse Proxy: Now sending content length when available * Web server: The default content-type is now {{{application/octet-stream}}} * Creating and installing a cma file for all Ocsigen libraries not installed elsewhere * Ocsipersist-dbm: fixing bug when removing data * Deflatemod: fixing memory leak * And small bugfixes in XHTML.M, Eliom, ... ===== 1.0.0 (2008-04-01) ===== * Config file: findlib integration * Eliom and Ocsigen: changing namespace convention for modules * Access control: simplification of config file syntax * Eliom: Allowing (module dependent) parameters for registration functions * New xhtml output without pretty printing * Web server: Bugfix in HTTP/1.0 with keep-alive * Reverse proxy: Bugfix GET parameters were wrong * Reverse proxy: Bugfix memory consumption when the connection was closed by client ===== 0.99.5 (2008-01-11) ===== * Revproxy: pipelining of requests * Access control: simplification, generalization of filters and syntax changes in config file * Eliom: EXPERIMENTAL session groups * Eliom: non-attached services * Eliomduce: new functor {{{SubXhtml}}} for creating registration modules * Eliomduce: new module Eliomducetools with same features as Eliomtools, but for Eliomduce * Web server: now possible to split the configuration file into several files using the {{{}}} option. * Web server: now possible to have {{{}}} option inside another {{{}}} in configuration files, and the the first one is optional * Web server: EXPERIMENTAL user configuration files, with restricted possibilities (for security reasons) * Web server: IPv6 support * Deflatemod: now possible to filter on file extensions * Eliom: new option to keep GET non-attached parameters or not when doing a POST form towards a non-attached coservice. * Eliom: bugfix path of session cookies * Eliom: bugfix POST non-attached coservices called from a page with non-attached GET parameters were not found. * Lwt: now catching exceptions raised after timeouts * Cgimod: bufixes in path handling * Web server: bugfix - some files were not closed ===== 0.99.4 (2007-11-21) ===== * Ocsigen: Changes in the extension mechanism. The extensions are not tried in the order in which they are loaded any more, but in the order in which the options are specified for each site in the configuration file. * New experimental extension: access control * A few small enhancements ** Eliom: internal cookie management rewritten (+ bugfix) ** Eliom: Small changes in function names ** Eliom: now retry all extensions after actions (not only Eliom) ** Eliom: cleaning {{{Eliommod}}} interface ** Ocsigen server: Internal changes in server (removing "send" functions, debug messages lazier) ** Lwt: Adding a few functions in {{{Lwt_chan}}} interface ** Staticmod: Allowing default error pages for HTTP errors to be customized ** Ocsipersist (dbm and sqlite): better handling of database errors ** XHTML: New pretty printer for xhtml using streams (up to 15% speedup on requests) ** XHTML: Allowing any value for {{{}}} rel attribute (for example {{{shortcut icon}}}). ===== 0.99.3 (2007-11-07) ===== * Ocsigen: New module Deflatemod to compress data before sending to the browser. * Ocsigen: EXPERIMENTAL - New module Revproxy (reverse proxy). * Eliom: New session mechanism, with the ability to name the sessions and thus have several sessions for the same site. * Eliom: Now possible to have one site with session inside a subdirectory of another one. * Lwt: New module {{{Lwt_timeout}}} to implement timeouts, new module {{{Lwt_chan}}}, new module {{{Lwt_mutex}}}, new function {{{Lwt_unix.abort}}} to make all threads waiting on a file descriptor abort with an exception. * Ocsigen: New implementation of lots of Web server internals. Better management of Ocsigen's streams, file descriptors, exceptions, timeouts ... * A lot of enhancements and bug fixes: ** Eliom: Single {{{}}} in forms, by Stéphane Dalmas * EXPERIMENTAL: The Web server is now extensible. It means that you can add modules (like Apache modules) for generating pages, filters of requests, extensions of config files. For now there are two modules, one for static pages, and one for dynamic pages. The only changes for users is that they need to dynlink staticmod.cmo and ocsigenmod.cma from the configuration file. The syntax of config file for modules and staticdir also changed. * It is now possible to specify the encoding of characters for each sub-site. * Now usable with Ocamlnet 2.2 or 1.1.2. * EXPERIMENTAL: If OCamlDuce is installed on your system, you can now use it to do the type-checking of your pages (see the documentation). Warning: This is broken with OCamlDuce 3.09.2 patch level 2. You need at least OCamlDuce 3.09.3 patch level 1. * Removing Ocsimore from the default distribution. That version of Ocsimore is not supported anymore. Ocsimore has been rewritten from scratch by Piero Furiesi. ===== 0.5.1 (2006-12-14) ===== * Bugfix Konqueror: Multipart forms with now work correctly with Konqueror * Bugfix Internet Explorer: getting around a bug of Internet Explorer while displaying page * Bugfix NetBSD: Makefile * Bugfix Debian for HPPA, Mips, Alpha: Makefile * Bugfix: preemptive.cmi was missing in the installation directory * Adding manpage (S. Mimram) * Adding logrotate configuration * Daemon mode: adding setsid and redirect stdout/stderr to /dev/null. Closing stdin. ===== 0.5.0 (2006-11-23) ===== * HTTP 1.1 improved (HEAD, ETag, keep-alive implemented, If-Modified-Since, ...) * HTTPS support * Pipelining of requests * Server can listen on several ports * Multiple servers: you can now define several servers in the config file. * Virtual hosts: filtering on hostnames/ports (with wildcards) * Asynchronous file upload with multipart support * Large file transfer improved. * MIME types are now parsed from a file * Changes in the syntax of config file * Accessors for server parameters. Use ({{{get_user_agent sp}}}) instead of {{{sp.user_agent}}}. * Page generation is now using {{{Lwt}}} cooperative threads, to make it possible the generation of several pages at the same time. Practically, add {{{Lwt.return}}} before the page you want to send, and use cooperative input/output functions. * Typing errors of parameters are now catchable. * {{{static_dir}}} is now a function * Most of global references have been removed. You now need to give sp as parameter to {{{register_for_session}}}, {{{static_dir}}}, {{{close_session}}}, etc. * Links and forms now take {{{server_params}}} instead of {{{current_url}}} ({{{sp}}} is shorter than {{{sp.current_url}}}) * EXPERIMENTAL: Use of preemptive threads for non cooperative libraries ({{{detach}}} function). * EXPERIMENTAL: The {{{Ocsigen}}} module now contains a functor {{{Make}}} to allows the use of several ways of generating XHTML. The default way (using {{{XHTML.M}}} or the syntax extension) can be used by doing {{{open Ocsigen.Xhtml}}}. There is also an untyped xhtml generation module called {{{Ocsigen.Text}}}. * EXPERIMENTAL: extension of forms. * Reorganisation of the code * Bugfixes in makefiles * Bugfix: escaping of strings in xhtml with syntax extension (thanks to David Mentre) ===== 0.4.0 (2006-06-06) ===== * Full reimplementation of the core using Generalized Algebraic Data Types, * {{{_int}}}, {{{_string}}}, etc. are now called {{{int}}}, {{{string}}}, etc. * The type {{{_http_params}}} is now called {{{server_params}}}, * Services functions now all take 3 parameters, one for server parameters, one for GET parameters, and one for POST parameters. Note that {{{**}}} is used to create **pairs** and not tuples. * The {{{a}}} and {{{post_form}}} functions now take a fix number of parameters, corresponding to GET parameters. * //URLs// are now called //services//, * //state URLs// are now called //auxiliary services//, * {{{register_post_url}}} does not exist anymore. use {{{register_service}}} instead (idem for all other {{{register_post_*}}} functions). * Changes for prefix URLs * Small changes for actions * EXPERIMENTAL: sums, bool and list types for services and forms * small bugfixes ===== 0.3.27 (2006-04-27) ===== * Change the way to get server parameters ===== 0.3.26 ===== * Load unsafe modules * Other small changes ===== 0.3.25-2 (2006-02-24) ===== * Small bugfix for 64 bits processors * bugfix for static files * {{{action_link}}} is now called {{{action_a}}} ===== 0.3.24 (2006-02-07) ===== * More documentation * Change types {{{internal_url}}} and {{{external_service}}} to use polymorphic variants ===== 0.3.23 (2006-02-07) ===== * Better handling of static files and "403 Forbidden" message eliom-9.4.0/COPYING000066400000000000000000000654371417032171500137040ustar00rootroot00000000000000This program is released under the LGPL version 2.1 (see the text below) with the additional exemption that compiling, linking, and/or using OpenSSL is allowed. As a special exception to the GNU Library General Public License, you may also link, statically or dynamically, a "work that uses the Library" with a publicly distributed version of the Library to produce an executable file containing portions of the Library, and distribute that executable file under terms of your choice, without any of the additional requirements listed in clause 6 of the GNU Library General Public License. By "a publicly distributed version of the Library", we mean either the unmodified Library, or a modified version of the Library that is distributed under the conditions defined in clause 3 of the GNU Library General Public License. This exception does not however invalidate any other reasons why the executable file might be covered by the GNU Library General Public License. GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! eliom-9.4.0/LICENSE000066400000000000000000000004131417032171500136350ustar00rootroot00000000000000The Ocsigen application core, and other portions of the official Ocsigen distribution not explicitly licensed otherwise, are licensed under the GNU LESSER GENERAL PUBLIC LICENSE with openssl linking exception -- see the 'COPYING' file in this directory for details. eliom-9.4.0/Makefile000066400000000000000000000053371417032171500143020ustar00rootroot00000000000000### Building BEST=$(if $(shell command -v ocamlopt 2> /dev/null),native,byte) BUILDER=_build/build/build.$(BEST) BUILD=ocaml pkg/build.ml .PHONY: all byte native builder all: $(BEST) byte: $(BUILDER) # strange, see https://sympa.inria.fr/sympa/arc/ocsigen/2016-01/msg00016.html $(BUILDER) src/lib/server/eliommod_sessiongroups.cmi $(BUILD) manpage=false native=false native-dynlink=false native: $(BUILDER) $(BUILD) manpage=false native=true native-dynlink=true $(BUILDER): $(wildcard build/*.ml) ocamlbuild -no-plugin -I src/ocamlbuild -no-links -use-ocamlfind build/build.$(BEST) 1> /dev/null builder: $(BUILDER) ### Doc .PHONY: doc wikidoc doc man alldoc DOCS_DIR=src/lib/client src/lib/server src/ocamlbuild src/ppx DOCS_HTML=$(addsuffix /api.docdir/index.html,$(DOCS_DIR)) DOCS_WIKI=$(addsuffix /api.wikidocdir/index.wiki,$(DOCS_DIR)) DOCS_MAN= src/lib/client/api.mandocdir/man.3oc \ src/lib/server/api.mandocdir/man.3os \ src/ocamlbuild/api.mandocdir/man.3o \ src/ppx/api.mandocdir/man.3o API_DIR=_build/doc/dev/api doc: $(BUILDER) $(BUILDER) $(DOCS_HTML) wikidoc: $(BUILDER) $(BUILDER) $(DOCS_WIKI) man: $(BUILDER) $(BUILDER) $(DOCS_MAN) alldoc: man wikidoc doc doccp: alldoc mkdir -p $(API_DIR)/server $(API_DIR)/client $(API_DIR)/ocamlbuild $(API_DIR)/ppx cp -Rf _build/src/lib/server/api.wikidocdir/*.wiki $(API_DIR)/server/ cp -Rf _build/src/lib/client/api.wikidocdir/*.wiki $(API_DIR)/client/ cp -Rf _build/src/ocamlbuild/api.wikidocdir/*.wiki $(API_DIR)/ocamlbuild/ cp -Rf _build/src/ppx/api.wikidocdir/*.wiki $(API_DIR)/ppx/ cp -Rf doc/index.wiki $(API_DIR)/ ### Testing ### .PHONY: run.local run.opt.local links run.local: tests.byte fifo tests/eliom.conf OCAMLPATH=tests/:$(OCAMLPATH) ocsigenserver -c tests/eliom.conf run.opt.local: tests.opt fifo tests/eliom.conf OCAMLPATH=tests/:$(OCAMLPATH) ocsigenserver.opt -c tests/eliom.conf tests.byte: links ${MAKE} -C tests byte tests.opt: links ${MAKE} -C tests opt links: -mkdir -p local/var/run -mkdir -p local/var/log -mkdir -p local/var/lib -mkdir -p local/tmp fifo: [ -p local/var/run/eliom_command ] || \ { mkfifo local/var/run/eliom_command; \ chmod 660 local/var/run/eliom_command; } ### Cleaning ### .PHONY: clean clean.local distclean clean: clean.local ocamlbuild -quiet -no-plugin -clean ${MAKE} -C tests clean clean.local: -rm -f eliom-*.tar.gz distclean: clean clean.local ${MAKE} -C tests distclean -find ./ -name "*\#*" | xargs rm -f ### Installation #### .PHONY: install uninstall reinstall install uninstall: eliom.install ifneq ($(PREFIX),) opam-installer --$@ --prefix $(PREFIX) eliom.install else @echo you must provide a prefix with : make PREFIX=myprefix $@ endif reinstall: ${MAKE} uninstall ${MAKE} install eliom-9.4.0/README.build000066400000000000000000000015011417032171500146050ustar00rootroot00000000000000== internal description of compilation/installation steps 1 - build custom ocamlbuild (build/build.native) this custom ocamlbuld uses src/ocamlbuild/ocamlbuild_eliom.ml to avoid duplication 2 - call `ocaml pkg/build.ml` (topkg) that will call the custom builder (from 1) to build request targets 3 - eliom.install is generated and can be used by opam-installer == How to update the build system - add new files => update pkg/filelist.ml client only files can be : src/lib/client/*.ml, src/lib/*.client.ml server only files can be : src/lib/server/*.ml, src/lib/*.server.ml common files can be : src/common/*.ml, src/*.eliom (with shared_section) - add packages requirement => update pkg/META (if needed) and src/_tags "package(new_package)" - change version update VERSION and pkg/META eliom-9.4.0/README.doc000066400000000000000000000004351417032171500142600ustar00rootroot00000000000000To update the API documentation: make doccp git checkout wikidoc rm -rf doc/dev/api cp -r _build/doc/dev/api doc/dev/api git add doc/dev/api git commit To update manual: Edit files in doc/dev/manual To create a new version: cp -a doc/dev doc/ Then commit and push on Github eliom-9.4.0/README.md000066400000000000000000000041661417032171500141200ustar00rootroot00000000000000# Eliom Eliom is a framework for building client/server Web and mobile applications in OCaml. It transforms OCaml into a multi-tier language, making it possible to implement both the server and client parts of a Web and mobile app as a single program. This simplifies a lot the communication between server and client. Applications can run on any Web browser or mobile device (iOS, Android), saving from the need to develop one version for each platform. Eliom has support for reactive pages (generated on server or client), advanced session mechanism, server to client communication, continuation based Web programming, etc. Eliom is part of the [Ocsigen project][ocsigen]. ## Installation Instructions We recommend that you use the [OPAM package manager][opam] to install Eliom. Once you [have installed OPAM][opaminst], all you have to do is type: opam install eliom If you want to compile manually, * run `make` to compile; * run `make PREFIX=${YOURPREFIX} install` (as root if necessary) to install; and * run `make PREFIX=${YOURPREFIX} uninstall` to uninstall everything. ## Testing locally * Install Eliom. * DEPRECATED Run `make run.local` or `make run.opt.local` in the Eliom source directory. * DEPRECATED Open in your browser. * DEPRECATED If the above does not work, look at the logs (see `local/var/log/` in the Eliom source directory) or run Eliom with either of the options `-v`, `-V` (verbose and debug mode, respectively). * DEPRECATED Sources for this example may be found in the directory `tests/miniwiki`. A complete tutorial is available online. For a testsuite, see . ## Authors * Vincent Balat * Jérôme Vouillon * Grégoire Henry * Pierre Chambart * Benedikt Becker * Boris Yakobowski * Hugo Heuzard * Raphaël Proust * Stéphane Glondu * Gabriel Kerneis * Denis Berthod * Jaap Boender * Simon Castellan * Mauricio Fernandez * Archibald Pontier * Simon Castellan * Jacques-Pascal Deplaix [ocsigen]: https://www.ocsigen.org/ [tutorial]: https://ocsigen.org/tuto/ [opam]: https://opam.ocaml.org/ [opaminst]: https://opam.ocaml.org/doc/Install.html eliom-9.4.0/VERSION000066400000000000000000000000061417032171500136760ustar00rootroot000000000000008.5.0 eliom-9.4.0/_tags000066400000000000000000000000571417032171500136540ustar00rootroot00000000000000"tests":-traverse "local":-traverse true:debug eliom-9.4.0/build/000077500000000000000000000000001417032171500137315ustar00rootroot00000000000000eliom-9.4.0/build/_tags000066400000000000000000000001051417032171500147450ustar00rootroot00000000000000<*.{ml,byte,native}>:package(unix,ocamlbuild,js_of_ocaml-ocamlbuild) eliom-9.4.0/build/build.ml000066400000000000000000000050761417032171500153720ustar00rootroot00000000000000open Ocamlbuild_plugin module Pack = Ocamlbuild_pack let best = if Sys.command "command -v ocamlopt > /dev/null" = 0 then "native" else "byte" module Conf = struct let server_dir = "server" let client_dir = "client" let type_dir = "type_dir" end module Intern = struct let with_eliom_ppx = Some begin function | `Client -> "src/ppx/ppx_eliom_client_ex." ^ best | `Server -> "src/ppx/ppx_eliom_server_ex." ^ best end let with_package = function | "eliom.ppx.type" -> "pkg_ppx_eliom_types" | "eliom.ppx.client" | "eliom.ppx.server" | "eliom.syntax.predef" | "eliom.client" | "eliom.server" -> (* do noting in this case *) "pkg_dummy" | _ -> assert false end module Eliom_plugin = Ocamlbuild_eliom.MakeIntern(Intern)(Conf) let _ = dispatch (fun x -> Eliom_plugin.dispatcher x; match x with | After_rules -> Doc.init (); let link source dest = rule (Printf.sprintf "%s -> %s" source dest) ~dep:source ~prod:dest (fun env _ -> Cmd (S [A"ln"; A"-f";P (env source); P (env dest)])) in (* add I pflag *) pflag [ "ocaml"; "compile"] "I" (fun x -> S[A"-I"; A x]); pflag [ "ocaml"; "infer_interface"] "I" (fun x -> S[A"-I"; A x]); pflag [ "ocaml"; "doc"] "I" (fun x -> S[A"-I"; A x]); (* add syntax extension *) let add_syntax name path = let bytes_dep = Findlib.(link_flags_byte [query "bytes"]) in (* hack : not dep when "compile" to avoid the extension syntax to be link with binaries *) (* the dep with ocamldep make sure the extension syntax is compiled before *) flag ["ocaml";"compile";"pkg_"^name] (S [A "-ppx" ;P (path ^ name ^ "_ex." ^ best) ]); flag_and_dep ["ocaml";"ocamldep";"pkg_"^name] (S [A "-ppx" ;P (path ^ name ^ "_ex." ^ best) ]); flag_and_dep ["ocaml";"infer_interface";"pkg_"^name] (S [A "-ppx" ;P (path ^ name ^ "_ex." ^ best) ]); flag_and_dep ["doc";"pkg_"^name] (S [A "-ppx" ;P (path ^ name ^ "_ex." ^ best) ]) in add_syntax "ppx_eliom_utils" "src/ppx/"; add_syntax "ppx_eliom_types" "src/ppx/"; (* link executable aliases *) let link_exec f t = link (Printf.sprintf "src/tools/%s.byte" f) (Printf.sprintf "src/tools/%s.byte" t); link (Printf.sprintf "src/tools/%s.native" f) (Printf.sprintf "src/tools/%s.native" t); in List.iter (link_exec "eliomc") [ "eliomopt";"eliomcp";"js_of_eliom"]; link_exec "distillery" "eliom-distillery"; | _ -> ()) let _ = Options.make_links:=false; Options.plugin := false; Options.use_ocamlfind := true; Ocamlbuild_unix_plugin.setup (); Ocamlbuild_pack.Main.main () eliom-9.4.0/build/doc.ml000066400000000000000000000037201417032171500150320ustar00rootroot00000000000000open Ocamlbuild_plugin module Pack = Ocamlbuild_pack (* Doc should move in its own ocamlbuild plugin *) (* Compile the wiki version of the Ocamldoc. Thanks to Till Varoquaux on usenet: http://www.digipedia.pl/usenet/thread/14273/231/ *) let ocamldoc_wiki tags deps docout docdir = let tags = tags -- "extension:html" in Ocamlbuild_pack.Ocaml_tools.ocamldoc_l_dir tags deps docout docdir let ocamldoc_man tags deps docout docdir = let tags = tags (* -- "extension:html" *) in Ocamlbuild_pack.Ocaml_tools.ocamldoc_l_dir tags deps docout docdir let init_wikidoc () = try let wikidoc_dir = let base = Ocamlbuild_pack.My_unix.run_and_read "ocamlfind query wikidoc" in String.sub base 0 (String.length base - 1) in Ocamlbuild_pack.Rule.rule "ocamldoc: document ocaml project odocl & *odoc -> wikidocdir" ~insert:`top ~prod:"%.wikidocdir/index.wiki" ~stamp:"%.wikidocdir/wiki.stamp" ~dep:"%.odocl" (Ocamlbuild_pack.Ocaml_tools.document_ocaml_project ~ocamldoc:ocamldoc_wiki "%.odocl" "%.wikidocdir/index.wiki" "%.wikidocdir"); flag ["wikidoc"] & S[A"-colorize-code";A"-i";A wikidoc_dir;A"-g";A"odoc_wiki.cma"]; pflag ["wikidoc"] "subproject" (fun sub -> S [A"-passopt";A "-subproject"; A sub]) with Failure e -> () (* Silently fail if the package wikidoc isn't available *) let init_mandoc () = Ocamlbuild_pack.Rule.rule "ocamldoc: document ocaml project odocl & *odoc -> mandocdir" ~insert:`top ~prod:"%.mandocdir/man.%(ext)" ~stamp:"%.mandocdir/man.%(ext).stamp" ~dep:"%.odocl" (Ocamlbuild_pack.Ocaml_tools.document_ocaml_project ~ocamldoc:ocamldoc_man "%.odocl" "%.mandocdir/man.%(ext)" "%.mandocdir"); pflag ["apiref"] "man_ext" (fun ext -> S[A"-man-mini";A "-man-section"; A ext; A"-man-suffix";A ext]) let init () = init_wikidoc (); init_mandoc (); (* ocamldoc intro *) pflag_and_dep ["doc"] "with_intro" (fun f -> S [A "-intro"; P f]); eliom-9.4.0/doc/000077500000000000000000000000001417032171500133775ustar00rootroot00000000000000eliom-9.4.0/doc/client.indexdoc000066400000000000000000000004761417032171500164030ustar00rootroot00000000000000{1 Client API} {!modules: Eliom_lib Eliom_client Eliom_client_value } {2 Content and form creation} {!modules: Eliom_content.Html Eliom_content.Svg Eliom_content.Xml } {2 Client/server communication} {!modules: Eliom_service Eliom_shared Eliom_cscache Eliom_bus Eliom_comet Eliom_react } {2 Index} {!indexlist} eliom-9.4.0/doc/index.wiki000066400000000000000000000006311417032171500153730ustar00rootroot00000000000000= Eliom -- API reference [[wiki:mindmap.pdf|A mindmap to get an overview on the most important modules of Eliom]] <<| in /var/www/data/site-ocsimore/eliom >> <> <> <> <> eliom-9.4.0/doc/ocamlbuild.indexdoc000066400000000000000000000000651417032171500172320ustar00rootroot00000000000000{1 Ocamlbuild plugin} {!modules: Ocamlbuild_eliom } eliom-9.4.0/doc/ppx.indexdoc000066400000000000000000000000471417032171500157260ustar00rootroot00000000000000{1 Ppx syntax} {!modules: Ppx_eliom } eliom-9.4.0/doc/server.indexdoc000066400000000000000000000012441417032171500164250ustar00rootroot00000000000000{1 Server API} {!modules: Eliom_lib Eliom_client Eliom_client_value Eliom_common Eliom_config Eliom_request_info Eliom_reference Eliom_state } {2 Content and form creation} {!modules: Eliom_content Eliom_content.Html Eliom_content.Svg Eliom_content.Xml Eliom_tools } {2 Service creation} {!modules: Eliom_service Eliom_parameter Eliom_registration Eliom_registration.Html Eliom_registration.Action Eliom_registration.Ocaml Eliom_registration.App Eliom_registration.File Eliom_registration.Any Eliom_registration.Redirection } {2 Client/server communication} {!modules: Eliom_shared Eliom_notif Eliom_cscache Eliom_bus Eliom_comet Eliom_react } {2 Index} {!indexlist} eliom-9.4.0/local/000077500000000000000000000000001417032171500137245ustar00rootroot00000000000000eliom-9.4.0/local/var/000077500000000000000000000000001417032171500145145ustar00rootroot00000000000000eliom-9.4.0/local/var/www/000077500000000000000000000000001417032171500153405ustar00rootroot00000000000000eliom-9.4.0/local/var/www/miniwiki/000077500000000000000000000000001417032171500171605ustar00rootroot00000000000000eliom-9.4.0/local/var/www/miniwiki/miniwiki.conf000066400000000000000000000021231417032171500216450ustar00rootroot00000000000000 9999 . janne janne utf-8 eliom-9.4.0/local/var/www/miniwiki/style.css000066400000000000000000000024521417032171500210350ustar00rootroot00000000000000body { font-family: Verdana,Geneva,Arial,Sans-serif; font-size: 12px; background-color : #FFFFFF } a { color : #2222FF; text-decoration : underline; } a:visited { color : #000080; } a:hover { color : #2222FF; text-decoration : none; } a.missing_page:visited { color : Red; } a.missing_page:link { color : Red; } a.missing_page:hover { color : Red; text-decoration : none; } .nwikilogo { color:#89d; font-weight:bold; font-size:2em; line-height:2em; } .error { color : Red; font-weight:bold; } #akmenu a { display: block; text-decoration: none; } /* Accesskey'd links -- first letter underlined */ a.ak { text-decoration: none; } a.ak:hover { color:#2222FF; text-decoration: underline;} a.ak:focus { color:#2222FF; text-decoration: underline;} a.ak:first-letter { color:#2222FF; text-decoration: underline; font-weight:bold; } code { color : #000070 } pre { color : #000070 } h4.entry { text-decoration: underline } h1 { text-align: left; color:#AF4040; } h1.left_aligned { text-align: left; } h4 { margin-bottom:0px; margin-top:0px; } h2 {color:#BF3030; } html, body { margin: 0; padding: 0; } #navbar { width: 120px; float: left; margin-left: -1px; margin-top: 10px; padding: 12px; } #content { padding: 10px; margin-left: 280px; } eliom-9.4.0/local/var/www/tests/000077500000000000000000000000001417032171500165025ustar00rootroot00000000000000eliom-9.4.0/local/var/www/tests/bulles-bleues.png000066400000000000000000004204321417032171500217600ustar00rootroot00000000000000PNG  IHDR<- pHYs\F\FCAtIME 795tEXtCommentCreated with The GIMPd%n IDATxv8/,oٹUvNk[.Eb?H@ nZlَ{-($3r9N׺5~gu6>\{.Vƃi=O4^ڿ=v13ƀ1tsc9gî}>>SJ \1\^qu>6uciq6xǎSs6OC5}! =fYr;6X GD!plAT42 F01ǩv1|gh_z6aA)5 o@3.3<5J;8^c ]Lkk R477T޾AE`usLmV&;vrJwȱl:>(I[kܯ;nx"C^H"=0C10DB鸓ê8(ZR$)56(Jtk1_;U۫Bp՚p߿\+JEΉ?q}p^mmx >;S( V{='Y_d8(U`b)KD׊M $>Ӥw}ޱe?js @(R* _M@à*fY4RN^eީV,ЙC살([_Z4! v?cmOWak߰VRI+8}@?]>%HaܣgݤHPQ_:C?oƚJέM!`a%XS|ʽo?>Vy8\,g7Tozw]X̳+'m I$s1 .KNVc/0Qn(JJ#Tj'"v ܞ_zSB,E ?A*od½8-R^lB*u^_u--vQ610xȫ+p;ׇǷ1u[:{}ƢC1P?d(%֛rceYGsKZυcm9 Zwêj1,v TE{oU^V īp{s%FS\7fvl8j\d=uLJL#%V?.P=7޺`x]$M/}=wѥx\% yKfĒ@hĴCMno.0KL9?\ K+Y)do$/ٲ#B\EPkWby!)}O,8_T9ϱ/!"X#ܴ|8]78]¿6t-DpC&xcNFNJREE%AA \o'X[먇W77в3_?y!E,W=D~yYrMjKay>;ӓ:\<] (K[R ^ >v%UCyl6rcʚ?/EJi#}1| RVY g,Z:)ono7cR- 94(5z}= Rb9_ǟS:bnm,ɾ@K"`DǻuE Nad1&c=.ݩ>k- Rj `]Θ]{Z3$i=IZk k'8FzR ˙{*cb^EҳY*\=c@s!Ƴ0(00g YR5 R" $.1ed к`a%|O1-{RO~(GX!H[x`S]/lpy\ @0FyB.uyJ^7wk縼b9s+~[뇶)L֧6ێt xImG[þjT9MOԨaj*2Z] >6ŷ,@+ߡDՂ8[r^Ϋ*N.URlQEpOS1JK<'~Jv7U3 "}n؟m48 C3ϯ(R2뿯B*Ǎ G5<AW]@2 n!%Yh =?$>$οDfm*=ͶlptzzGos\]){$]K֥ꐥ%TaMmTDC]~{ r/4T#&u=7=fM8 -[/G{}N F_uikQFm̂tʫcr>usE}U4RAvߏH9%q\[mA$tٲ8IJ]Şb𡷯1%$ذQ|pns$5H+$11?s^7iCT8%)JՆ^pݵдݥ,^c T"ԕ G}T8lƭC]ze 46ǘt+/ SӑPu|?%B)^tDlUՀˎQ^ YZAqZO瘔. m7)5l%%+k ҭ^vyyj }y$/AE,Kե橻T = gv'į96l]&M,K rXiİt!U+J< xI?m>xWP&t=OyR*DZ;{ r5½`Zj]%Eqw"m WŖ4!گU"8 ͡Mv]!1Pc#$Ocw EPwPc]-PnY&+ศFT vdJrk+75:֦*Ֆ$'2J7X; sDY0 aog.-+XЙ&pf;ȵCQ*l kskt+]zi"YRy??zA^ҳK*_e=8.z- 셕D3Ơmൾ |(HCΘه]{p7)A 5:imE\Qp41knہ!? Q~~iHA؇S~kl+\4+嗰km ќ.RngXR,).3\,g܌_^ >A=~)Y%\-@ʰEnuo?e2 qMkUG8g2|-LXJU }yRHtI@J~Kn/JQ xsq]pkL'_xT/!8́oQA/ٵ)$Y2L/~c1;s&Jf =qEw~Twu]6$c .j1Xu2ZGvKjkl׿DmkMr1ްޔHf~`؟H7wlŎB#pw&W\N ptGKzvt;_D1!-vPL[\Ar^XC{{LX&\_]s @O}M!,cF#;K7v(mB3 &VZ 3D:fY\9+f-ۮy\ܨ][T4H"y)xQRʸ&"{i;012ٛJÅ :epUlӱ)V+QGPn۪LmFy®@k~Y*(K"Xח \,gк*eqXd,w}1$ AFޜƊR*ܯXeh//edT4ZW@iNvUTaׂĠ@܎fhDw[6{烮v ֪٠JZKN*_o܍uu%W5 zlԂ%H{՞WbMk8cAƮuVAە7y!qu>,_]>Z)[CDy_BtwDNF"|>:oz|=0k}^EU=a՜A{P,m}F Јu=$%0|p, :k[.3ߍ69@cۇE,q\xI'![l}{nf$`w Hs2~SGRJ8K7 /PbHֳA7fic99EsP݋뫧ھeK"f\1^]|\cק\bsڈoFD㺀R˳ _>]NCa0z`4Xݱ =uᛝr~?6U)1֮C;.޹d h?,#9>[Vjlkc%k%n x\-}6 #9UlDA G7͡kn/4T]0>$L:>T'6ӄ}𺢩PaDZDVM1]m 1ЫiyxDno7v+,F"v]w iK "AQ4x ]wldUiCCoxC0clk͠t RZեI]ؾVU<vnnlgطXaXαJ*;TWצjR7v\ Oĵ]h%~lҥ}U^lˎY u򺮅@Eж1sz}Ul Ig[e*RA)jWbV7wIj.[,ֆF}kTlԝ*ׁ.M]зlu 8*H"צ(A_iQ$jS8I P~;! |^مQ vZ۔ -F#n@zmv² ;@"|@9--C]}@0D%42(u4K߮?o_VyU+T<ݰR-e)@ן_mbAxlgTtBI'}-p@.1*o? AL,;œ{ʐB/E*4 vM Lv2*=VuYص-]Էn(n R .I~1URS2,qZU:P TP}ܰ`,Db85GvT4 !䆭 Z+cvϯ\'j`Qvwכd-G|EFR@wEva!悔4YD^~Մu! jDڍ'ZJ!HMMu‡ ТR gt!]],g.E ET?ZR:7/.a1hDifl lFy:I[&m æTt.^^0p{ *1tRuY*v1 MUr \vj~*H]"tϡi fzٽzڀ*OQGw-JsӁoWJW֖]mk)yJ3;6;vƏKjyᯟfi .>l@i?onW>sPZ/׷??j'YQ, *D0e Ba ޘY+cրj mCBK: t%m_^O&X%=CD`c?|CHUSҸ֚-0 kvym5(dh|WI6r;&#ٕ(JUE{-HPV8XX-#/+!%{Pyvg<2ç,'ʸF"/*U Mv)YU^H>2/zֲ®RQyzթnLAg9`om*{KN{  H_B`[X lznlhGy} ^[E{"0R9𕵟~/ zIq$|9o+M2aGӗ&=E/DkY,ټ7T@p:Y\J>^?v֜1^"/.j RPV̏#˄.<l| b۹({2[EW@L?c /twb9,K ;v(o/0F-`6ue`w{ aY(膥8ć]kmp j!H.ؕJ7l ~5f,ؕR D:`ոMum)UyJ!tdUS_URlהy^\eMzYV% w];4ֻHp zLbcf6y l.6^IFT`*a=6ԡw;Vr,|Cn-@Ķ"~>v(r;vPm@w69t^mi#@uZ4!wЫsSmG&B΅-=&Rd!u3Am׶XcaL+xO1]ltS7RK IDATӉEYX{"xem2ă\9'qϢ]߯®ȱFF{xW+swʢK %CEZCi2uUuCX0ݵU&܍Cյk#-,._!B =b54']޼r Cnp , vЦTԏPŠ6cn/+!iExIe(fYT(KM)$|m)hT\,dːRc=*\;aƚ60l56*9zvTrdWeд1ʌ. %^iSHgkx\>NcUq8(=؎ }>C_3J:sne|}b5ZsSPpm fav,[@;"@t-aWJ=>am Z[TFKz1Zî 9v}hK>}Q]?¹ vM>,;.'`J"8T<Ɛ$Euk!HSFtZ|}k_L^RW8^ߢۘm]Gw9cRxHs핽s.pDhH R~C70OۘPcफ;v'k_o\&b9j>úu]L;I{ajVO*;C>CMJ \>9YޮiXEn?ob1;fL/usƧq]\o,"ore;)0vq:΁v( zXF[j{l M`XB[}mTз-nSm@޿nq6Oҝ/%8gp)qbSYZ!D ]n@4 wR*1p[znpTUªf!ض.bO42#%6l$!}'0Rg BSƇZhU @Ӣpsfbv3T=DjV (`EW;ϡ1I®}B)HCZ%Vno/>R{]%wUVhӰrX97[zk!Vac"Ň4t'n5sH9tD%p}Qc@ݮj S&bؕ P{U|`L8nNJ^H jU02nk!862Ic. ԭ I0lP>2`i$a- حs]ex'۲XiCKzfYM!wk2N2]XImO.+IfwLM@m Һ>=!vy$ݷUusÎm]*>JL.C k$Һo)Ue]HmChe`cY& 4mgi:)J(K]&Q5ҋ}"|l#GY%| ϹK)Ljmk+L|H Z̳R7Gu{Igstu< RId%ޢb =Fh* P#[WJ BA̘ڊJCʺZȵ+51[ص'%ic.pu"J4uI}lo.Pƀ uxVrnFckJ'@o"گEH\4zvހAijnMviB9}/oQ:g' h圹_/)It܂7jtwX.2,==g?k,f)֛ӂ $8whxΥԘV qSWǚhݬlC {/oh! 2m3@M&,Z;CQRtDj V]o^Jt-W l9/ NUfwZGKz_bqx=X#U|8VtsrU6= P}u~fY޻sw]߾߇rױu$?}kv:Ƃu^w H X]a2 æ޵Л7Z_D4?o6J#-Kzq(S6žԠzw?]ީ:cnMlEJyy;.ء&*CX'֍m]Vt7v\וMybQMSK F"*1M&RQy|=0.u 1BvuOsTU:-H/Uw9M`FDζ_zadX֑m~!Y|,bEz`a$K=%-iQ*g ֛NI~dGZŚmtF*c~h.]U]c)D*<%\(҆6 4߫'0 X[ xI/Zu T`+H>5umgZx> P0g)o?Zgu'NxSlc A&`ty;$)k?;kczjq=Pmg>4vng>+C%)nK \ʏ ޲Yv&k+p΢`[ Y*PE>6O3,PYm!'ޢs^ƐיL nS}HVIa%cI9^ }\,gv>kCg¥Ym~X_cAb?T`ZZ,ϲslXk@>FwGktGsEw9cg 1TwDꐪu%7x;0]) Mo$vs-jUb%y%]%)Az ZKf%7෦BtߖUl >kWu XNmL#ф,-8":@$ ƒWhޙyltmUo74H]|Fcq5ZkT`m`1q/&4^~z84|Ԯ<toU}>}sl. Cޘ8Kď_ y@TٔA,&uH_z R.4b Rj(cAҸkٍ kzv8ÆMcu[jGmtJ^VԘR^1VFl c)QIlAX.}y_A,A0{ V[Gڹ6Z$7%])2pͶXؙ|5g\vtd[?פM!qg YlBx| >vWrg+5utjmͨ({6OnpS-7c|yQ"+AF]ishc\} ]2யb8xNح;`= us,KꤖmcCp+ a zَm ƾ.?&JM<^D7w[||YU.<ΕF4ۯթd(+(oGkr*AF"M?mf1z|UU vq9r@9Oq@z L.WXrXP=TX+C8[Lv ba4Y"è. Qo vgY{]>eEҌ1f<64^9t&^36nl)ak,:mv&EJ^ߏno>ڷ1+ɲ+L>*^"@wklם'N"ۍ+Wޡs|K~ѡ&.%H)%l .]CU&~_?k!6i]WM!GU}ޗ)x!,b]">Tvߏ|}#adT~u%t},..u.Y*sWlDbmt^yB[RGyD̡ͣs^+Pz)!z#"]շ}vA_y n]+=XӽZFbxw=Y,JH}K^AևVbz G0%kcUi %nr$72U{{p=8A6.msc=d1>X˃?ߺ:Yڈj;rnqbT$.t @p7^k]?W=ʳVj; v* 7fӊ .Gim+ Uk8}m]l#*2L,AT҃*1΁Il8g.JJH}"rAY)_F[sZ~ x^қ vv#|o~$YWجg+m됃u W~l S_ Eޔ_[mO9bP8J)K"1 ߝc1KޔneǚצEyv*Q [ӏ_n{&MFlh%EƒjK}xYSdS% ZC \,gK $EF鉴Zcw^;ּ`.~47VAyS&W?~=}GuNX{?;DH!Z?kmdak>uu ?kD)ӟ3p/5 RQ3 ?_>]b9C~۶jC8hoW1GOz=>??8NݩcL?aϜ~ |Vwjו~D7EƋR_w'_JDzs6,ųPvv 9MshVv "% ǯ^?). et~2S6A(ճî}ə|Ǽ]} Fr9o]Zȗ._ WȾ.H#;SmP<%j(*Z@ /-Io^+~r}-;ోK-e~{bQ*ʐ<]S1Wѡw܎O$R}!]^qu> th/چ=9}'E &F)6}ȏVg>Pj6RV{߆◍,KY.]+$,K{Ο|!즩 Kd'j 3.33^=IT׽Vm &3!8҄c1K%8WFb [ݾR*.@t2\djXHh4vN;ffhtv,J.HGRE1()z?Uǜ. aT!ϪDC4nɃ:`kHF)/ zd``c`BH$i*ܭ1\_.](_غsFa,Ro.5Da.!8wie V:W" 1PlD"zL]R/+DsDSZ["%,ks&[(U' \w۩l6%x2B\,AYR"IxMVWؔ Eet`A$Dz;l$^a6_)_>6)?vmD&=?Vq}_u^V^:)$00PʸRdژWˈxI$D:u٬m^Ȇy!w퇀)k#R4@VgHSQmi *iB11sh]3TD"xIyꠍqvې .xHc.Ǚd$?wƀޗ`!H$^d:pƚŻīT(} 6n?40Gԋְ͵cb-4./755)K"H$ҋUWnߣj{kN15}\[mAEDs=~D"xI%[ve |/.(C=D™miM>ۧmC_8xnlXs RI$D" jSHmc&XR׷|>Ki-`ȤoO뿶U |5Q1Z%Vno/"l v/D"xI7) `#v.lϡi){f>pE $oGk;UҮDzGda' }8u_^D$Y Py.ir"He[Yk@xI$[Iď~ YHCIn'[%猁q,Hd E^t/D:2[DA"K?\ Ku^r}6VQJc4قr |zT$^D"H!>@TmBp^@7vʺ%bb%Re/D"Hg,K3 m Һю9ۮ|{mU|t?D"H$3\]ܫ1-Jd%*RJ#HgL"$^D"HOϑ$@^?8[X̼duu٪"#aRgqDK"H$ItƐlm ,"Y"b@pRj̲2+?oQ*$jm6ڸ[K:$^D"HOW8g.»%X.R|QO/Fp(m\ ,ЀBӺ`|AKrtH$D"Sg ]ζ_ֳ;KR/R3yyY&p6K$6aAGjp&xI$D"U96옊&̦ ~շuMm^x9gXD"H$ұaCpkn\JT|Xf6[aM~$^D"H*r+mjmP Rq]BpUJ*.H~hnjc*D%H$D"TiHBo%n+eeI B^Co}I$U6jDA"%H$TV9gWj PyQd+8u4xI$D"=8c.U^) VARj ExI$D"Y}%Yadvu}XӁ?ni* )|§H$D:VK,HL@]m 89/$Eww4XS̲ݯz.8xς%a߽yB(%2/D"HÅvAo } ˂YQ*@{n} ׭my8a~.ƃTN’y `SH LK"H$IoW6#A&2jc}DT)IEG9~y,MHPg@[=6{CX cu?QϳWsWF\N xI$D"=6ķT4I@^dOTϑo$'E;kZ[5WeWRz%i*E-OH$DzRic=>?G bdQࢺR9[]ŽX+@m'(^ۧc (ekHrR Fx\_^D"H,YųP'95u r7wkloI%?ZtQ\cXk _+PV쎀AXTy#qD"H$ҳiSHy,m5,*qj)qwو.g s,fhmK7enb{e% C0nvW`g Y,]\sD"HApD5nsYnkST5ԱJV-R\,ȼcKl6~mEx>~רr0S\s\,g$D"ARTPʀھjպmkKRyTnYE.ep6(i ~?c!"ƾaimKY*t*H$c(z\0D%tU_* 0K߮?obнcȜ776mtV4kr_oܶ300cBoKK"H$3꟟.aL,Kf|82 PJ PoWJqbЕJ7@ [huqRnc, `mpcC}]} _/D"HϤeսE E4(q]_TJM5o6_>]} \ nm!0mk!FSxT7S_uqxI$Dz.-2>,Mp~3-(mpXͺ޵6\JkvCl*6t([k;/3󽲡|c6 /D"Hϡ//ʳ;˪ r@mnQ*(Jh*e&h6I/[C&}Px8(vS_+^D"AUei±%Xͫz#1KDP73T Θ2QKwʢ^.N1-ǿ/D"HOy mM?Ji@me;tyf"Ż3y= 貞oXmR%ny|Id#%H$Ɂ71?w)qX I8Ri* EP4G,H` KYx,r MH fcK UqC5{k xI$Dz&}yp6OQ͒cZl200ޯ)un> `3<@ƅ++8_vPC^D"S|OWXDypkL&( 79g "R&Tb譅ޘ/O1 DhWs&Jk!VyIvC^|9l9&]|%%H$鹡[St`Kl;R*~raa&=62zH&ްKD"H6ĉ®1H]3. >e!w- AXkM^cmMՁsVAoioTpሧW6@KK"H$4v??wK5-V?|ϮG0&? RiW,_ ֦miHwGVlID"H$iγĕpC${D!Z"x[)흼 ͇^[b~k^kڰiᘀD"H$i$n 6 1MftW0eKdlqR7"̍ju3 ?M4SL%l2qH$D"u vPk# ky&bV M&|匁 B7I֫9V^3pӌH; Ekv>>%H$D"EdKI[>؍ysmֿO" U, f[׃'zu4- aWB7Z&lW}}qkSD"H$v1XeXXXյ0l8 vD{ڸ5P p뼻=ZMX k5Q[s|#5 ,ӵ߻ZQ$.+s lA7͵GFgPַk59)8JFɳB Zr ha][١>#Ij ǀ^H$D" ,C,^vЍ%?e6̠v:ז ~t7Ɛ$EGtcuy~JH$DzӺ\4ʏ[pWM]W,b[HoTjë5;O Wk7ٔYBo`^MNGxI$D"Y$TXobj uv`7M k!d5M 8l!XC׷ڮx$ߕګ4jQJǮy xI$D"Y PH[mKVpq hn #1 AW$5m# wIjPlqlJxb]i)b"%HG?kN 6ǯ#HC?\8Jr]\ Kop ~'!ص nۡW,r Km%v4Qޮy๒xI$Q7KE#}*cmzHG9~r힯(0D[gumF|9飯+8sk]:QM* g9Ve鄃x/o_)u0KD"v/JT(vEeNvA)c,Adp\ H wgU'u11PD{CP >TnPG*]YTQ^fpU|K{-HCQ4"$!غbwM!`a%XS|ʽo?"H%Vy;C <=pCDű l ^:Qͽ>i±)*` džQ^kc%i'q [S"&%HAmڲd;^=;=NAIM 3j%˃FKFP.|ABL>V JD/nk5PJdU*;?~d7### 2ԍƮn'm!T  qXӀ}YY @ٍB#eWn'R4䦚Ȩn }C!$nfdd<ѥg/4 REr ow—/a7##cPϖX7 L j m3WwSdߛiEim)!|#[$jeҨClmVx322>r #xʎR1r!$=8_CJzI,g F +f:Ğ'.#*`q_Tџy^o Rqc2/ IDATALx322U`q~#JJt3' Iy#)Fn6XWN+w-u܌W 0ѶۺuͶpkŬ ;=9 }SlK}R ثsxK"ybFVx322_>]BJѸԽb^$ ) 3Ec@dM䗫#Czmb[8;^2o/Nյ1/ظa>\8fi 73rH2c oO2TX\zhzŬe|$x ;g!~Q0/\eR$ԸAJ7J!pzRhf5 }i[HjUR KI%>v0%N^c#+жW]XR7jS 1ZL(pیH1$ˑ)yIFo8?[ϗ9,#Swnv=6FiQ E'0HCWaLklLC)| 9ތ vzU7-IH񱸝dTFZJS#ސis2[22^HݽCE1Azm$.0].4nG0BˍܖSZ",_7vfdd,"ps[cɣ HpWGa/kkȲT.I‡󢨺KSBaWʤ7# Zmp!K5}[hcJ_ԾyLA\M=!d7$K}R <7%Nl9-{x32^15eQr[@TRwqӭJwg?ro/rXr5O/WsV|/o/NP DK褱,6=2_NPMr_5fSߡl#^0OތW_?El - JoH}QGC8ZHzzq^5G-.YxaBdU]3 f)BF·PLW~ T9$|GMȺvO% mǛ oF+)߯"[Be+=7 V 芥7:#da06ʼnRcŽELz32^ UzjKH`C]c-$#^w&Jv"$zBu6#*1.7V&d›1[Lq[rᢈ;d'F^[Wh,w)HTaM59?[eқB@P's["=+jm,'W `RLjnkRz P3.$,$Iq&>CJW[Oe",ޮ|kS~ %DғeE5ik=C RŅhU@c66xsRӇ<-#cU>!ZDz2FuFk'YuĖN%#d3Ft5뛲37ĚM6xDplkC&Vm-HA cBHnU:R\*hQffo[c--c5-H&Am1/o֐®7'%1o/N` {@X?wUa H}דHc!E_UwXa#F˚ŚB%v^uw|Ȅ7#`]6~k/ƒD"%Koݿ/`Ԁ !0ywOL=Rx?/fF𦼽)l:'x22H NJSVH8)J ODp,c췵|'&@ė*W{ׄ&T_7$sDTzEtf›%F㺛&DZɁ7'2p[UGvUwXcFy@ٕ/ ĺզG~)alR[7E!7#텛v3 HUO+u2 {ݩaad$pW ^Ž+R5KZ#NJc2x nK9,&kJV՘Kd~. TBJ#ѴJ 4C}_7EyMщ62Lg?oFթ5')ܱ="ސPs/ZX>BoXWR]ݦ5rK]N߇'e!$޿;FjD9P'GDLx322 +Î 4uUBU)(!dwU)WkJ)@)!0(Dj Z#K4uڜqqF$uDd|vZ3X2\ \uWT HoxrkRV~yÚ ?o;ee8$ؾLx32^(|D ~tyT荱ޛk{*J Ȯb8-YZDPDWvx]grQHԵ[)&6Rz{a흭!06 ?^?UFǪ*-)XkԪ@X.2'ƥSc.%6xm]M:iBE!UJ .}O6 fs k3G[&/~/0ezϽF.z̓]0S6@Sw[iL=Zb9^c,Fc]RnU*lw5a8fk %.բU(XYBkX&S'e=;C٥hZ0[ixK)X&wRC/?^n`~"ꉊT@9ǽug0ILd+[gKl6JUތ'u )ĨK5A0BZ$nrU^hz(!=9&?/')#ޮuÆ%7속l]ml?O=F\鲹 oF DU;'r' rbP@O+)*hFm ^Ը'mGB);ּ;!Ho@e}AEj_5. /維e.o5M[^uE鵈OȄ7##ë={\ߍ T _`ok̻kaXw@ut ;ks 4EVy32( 9Y-AL96F`CX%Nj/Of 嗈.R(!ٵ8YQajiQMԦ],!L_H%31Q.9̯ObZ3xaJpH!TM*PxcjD8-wR9?4F { kD8{y326.0֎臵Z;@ut5oDzd~0եq/J) Z#ak%HЂ*tjRdlHpjr0U4ͻ"WOa*>alʔJ-*ssDHX(wolvuuU\ތ'UH6~\Ø2ʀ3=0_sLFy BA.?F~ڛt- +k;2τƈl6&q3tijwGHӚ1 c222IJg+mԍ^ dDvqc^LKY=!d]ɬ_9ky~uDM)]Kn,aB;pi}̇JF *R`s βe"!s9,4 SvݿR @7FRfO IN 7e<7"~ܠD{:kH!fR'VRQe lg,^T}ľ{/z46%d|12LlsPp |;E3xzE˱I5UȰ9&fd[jގb{ K V(!IܪT ۬ M2[HX5N#ƥį0 hZ=IlJ@%BBhm0?u(xM]Oo$ `?OжW?Sd7/=YFRcf oF+\`٘& ac`2P9IkFH䄏R I_Fjmտ>֐Nt %qꎣn4vG9)i⸪ BU*OF_WF~P˜ kvt9%<̛/?0A.orQX8uތ%t]5@}a8;v3f=T%N|ɿ;kAB5n&mOjץ'؉$N)m‹ˉp nz*#g2Ȉ+7J۪d^>-FveW kz_u (MX3ń55mːs*\vmJ%+# 6[˝=|d57n Z\Likq_7]MU]Cm3ÿ#eA$5Ěm v) `RmcD7uݘF& G kmz5Lx32^;egS#5yb!3`m J]򕑵~l28%fSwmЋ.ypK97 9^zlyc>Rmwf^M8?[o߿8JGawZ1 #{c!)^~{oqNVxc7lfM^H!\`vxR;SWÓLx322q^ T( 7f 2=)+ȼ4sDmoa8Fgddah[,eaBx;v,RXװ& Jv%ԍnq~.1f԰5 b01<^ ^zFS YkOg !E"S^*nJh8pLx32^­'( Ґ*Z  $Z, Jȡ7RuWg9Wz]t]P7QOhEbOHp[h3SZ{32o}sг)FvIDg{1O)SqݐgqNGK W_mqy>HZV㯣čscu_"X?Dh}334G؈g.*h˄7# czݥp)@@ ɯeHxz, )1T߰&ȅ*!P@dBqzƔ,+'ElVwWwM*C'd-NDDu)^=PG{B HL\%W侀zZc>9x! p:zwĺAڤ|c #{x322>=fW*O\4x{~Rws+) 1!ŏٮ L@I/Ak(#|Z7N95+#G˙:27( !S2-e]>-BS3_(Syp*>5n?; X~ܛaÑT"33FzPl!b8 Oj]'FNb䱈%dwq,;t]HwzR,$t2:O4P!(~.R ENPۈr TqXЦQ ƚ229~o(?ڟH[~/;ZO~Mx1 qX(VY^ޘGoN*|ph*[j HH-6iw](%ꊷ:D") l vBvDW%Ȅ7#û3ny*@Y(ʑܢ#X2*\#J:uGS=PW*/c %AR}snU*ܺ BcرP%[ ~cDn۾MD T=k4?`'۔w]ݢPXjްnL]'Vb@e;A$D&+e}p5 ™fdi{-p QT!1%&{,KQk?%F㺛&BU,0~,l>dTIw)jȮl'kJ$0*9z.%z5( {U(p1֏eQ$P,&Xdm,ތYyJ)p.XSHU_q/ IDATa_Zc61 a-kdqp1` z*>#.cu go\of7R]S2Ԩ]~l㎓@iE%4\g2dy?:I|Ww0D٩ tuIY! XGHV0(#y`UvۡP J u۝U)+uU)H)QHgI֢mak4DW\kEYNp .ƏMJTmI OC˗1d% 5deر)j1+UUvuH ;68zI])'Pu穧M)T^Ѩ 9ڢ(B"{f !cc[!)"IY5'jOd1qmΉ| d›L)GwUU8ot~]UzUd]ꔟBI_@)!)4ZB+gu(6m6zr/Dno6 NV6vFV"PdGly"7eŗOh.oyYm5!i DvUnBKCvRrzoHJl ] ]b/(58d.~|z (cΥI/E`Sdwn-N5=fLx32^z7(Y*הV*l {*pR9ŷdZPilXZA[SZBJW̥=gDMb:h!M; }s_ ş-K kX%p N.xflHnze%1!]u9;m,t@uͦFz&Y_jk84BI}jdhzˆX0e;cn*.|$ oF3zU?z,-kZ;Y9oYtֆ.ˆoSu\(tK1ͦw̩BuqvZam&bS Y/nUnX˘Ͷ6vlz_HzbNv"-;uw(rK'r&J6c:ͶAU*Eˉ,v󿛈orz }1v4u{Pj+ 5S}d Y#&"iݢlhgr0XXW3B͹p v)T.\Bnl| lҠ"[>Qs3#քR/C c{8?N!sb\Tތ'um\RWW[jљ~}ݓlwY oۮP;-PHɕb^ץKHm4^vi|pc-n6u!Pn|$Jodc.)U`"W?}8?>Skc8 Q⮯gJ!-k& sZ&k|^V7~)I4Mt66hA]cDn!"k\&v-$,4 J'0u qnݚ.F-mc;%9FvELLHwcD:ǦI!`~w] gL/mq|n #t0 ~愍.oDwn4Rͨ5iE}.| ;YJl}-Q3xբ^{MZ. vdhe.i"[A:;4c)X1u+mc2XĔe݌9k)92d THml݀5J)P .[.sW O44qkt6l,C OhI况jBtvI}y ΄7#X8?]7L-Ѷث]v _K Su)U1NtS#W5(n,dśmGdd>6l@*L߷Λ+Vz@dm vR}RnUx&Z¾rk>şL2_|33 a;s̈́@jŃ[!F~Lx323uq+έ"w ]\W+ha |S-6^][X̋IZ@(}5RR-ٔ!FQm]0݌a0ƺ/  #*pwl"o\.5Hs̩?(&8]%f zRzc#=1XXA$Lx32":etcWxmΨ֍Zt ^mٍtW.W;ÛZ[6mkDph+۷!̘'Z1T3n#Ƽn'`׃NeOu^e_)D.ro(y}"/Iyl{{ oFiv ͫRFJhc! 0 ŚjX'5]M:fmHyyRA nr[( ɤIRAp( ]6xGzu"$:"dgMN %{"?mkPI D4!w )cd›q&50BaS:;Nѥ p<>ۄZH@Ad\ֶۜʐx'sjQNE4g_yyF4ֆғ^~2]=ֲ(즎7Ѿy l|FGZz oFR :ufנ*v+S@ȾU"Z5dAaE7׈q Dv),v3;6:("J:k5u'OJkf Yl] .)496"pn sUN.bu*K!^'LzC>ތ' `>uD,h8 H)5oWu+UYv7k5%W˦yjUVAq0­N>Lℒ[lT uZ, YP :nRdB ;CMd$'v:dh^1"MigcFe› ok{\t o75 %{~ɺmM4XR,ժ@;-vp1#ct]X?tFtcgk]J 4i ="uȤeg;xup pKݶ5}QuyD!/sޕٞTc'.j<Y;n oFǷ ޿;[N*mh4^C)Ͷwg8;w*籊-B%2Ĕj^ ?2stOL"W]jWz4"է'~=6Fz0Y.;]1؞c1r{SrlBIȄ7# |(nf@ ۿ~ǯvz}ZZ4#UP*݌!$Scd705]Nzx?$5=#cudr&_۹'O6fd]1R`W"~Lc]181dzDqHuUtC9L1d`P8r2xcZ p]zL:)6boHcFCC >u:W$fd<>;_w|puU@ ͮI6hTROuUTfP uG4c }m91DžPGz=]ni(7  U>|餗NqΚ#se› P^_W&<ΐmUU@kڌ/'׷ѷ)S ! uVnlkip/D 0CcpI q jQn'M&~poN*ԍƆEnR/<JIHmFt %[0cnUlaȸwy,Z9Lq1o{팴54tqK|OuN3ӱ&e4._#2x.A ?- %bBb*>7΋\/2PcU݌C')H&;f^`HHcٍ0kdu.m;x-*n،93 oF32@U*lwm˔hsHoRԍ$2JR[HF_`a@0/mla W!E%vl+C>j'3ホf{]bWw?Ed)?z nd6`#ݩc7Ezj.kD$Z I/!]IwoRVR==vTM}nP8Rxe›BHOY ! dR  UY෿~mM~#22eT]Hoe:G}vc 9]Nʧ q,EzI]XXxwmpufdSSϗh[? =?[a*-u_?ɪf$ś[;:F0OF;/<\솄mrDH[dcR@sGyv7G.qs1cỞHm*l.ٝcas3xa߿t]◟.o|dؒD8bY*()p^ȱvۮ=##c5X lj0͘dVhmC8 . k 6f7= |CO  Hvz9Y#Bv{R=?&=S49P&/BO~ -vv+K'P]H 1]ϗ5mԐhƆ:k6[BIBULj~lXn:! `k4c,8E^>.WS!Al'.1h85NX$^Lx32^0WGP?;ΧgM&Uʼnd˺G7#c&>HZ`Ŷn{z$Tw|*OXcQ_C}kk! ߞzؖrH$D7xͼJ@$>Mq@UU2Bv>kS;SdWz!{5p -ѓm`o?6. Y6eCxLSXc9d78#d7v唆V#Dr^%/ōQH ;V\p~^"))jyؘ! J)AdvuѾyc߻JEXY)\G gdddd?K IDATd\pnMO4wEd/'FڽwWհ=;6kz7(דLLۥϑNw~q.a!I|$;7j,fiY:=.>fdddddݶ5H!zbrK߯wǫҠlΗ͌7L1KDP_.5u*&:F4?h TiF*)lv .5VU]\H5@wuLқ"$)bt,p[r{ =ɏ vu|%I^ U<%;CQHJRP|HX֢m NP]\[ +iDO7,!\|Wt>/IORߜ5t]F?~\B O>*KOZbɄtPU^xxs[bmR`cdq[?LJjsؤ&:V UPvW jXWJ:+4L`n+"oW7;\qyNe$kxq$?ZCR0֝\so{Yr')FI q>ù7Ѩ[# 9>[Eǻe%H]e򛑑qd|x 9H] Uײ\ 1X()дfOv+H/uUf.RS q5NV`Zk>%iֵ W[;  #yG9nw-N}w'() o8! ¿~ޱ7$cODD$f CɄwfӅ?8֏,bzG D8w1ݛ3(%q*Q 3#fdddJdَy$ Kjdkd$5H12UkF9HX!!E8V g*q.໦1V7mCx~;vIzLxg])WsFG_ɮDP,hSk[WVU7Yd⛑ ?^&5RUIK.Y8%[c!;;f~޲Zie+D'89L!ޑWrli9EH/0ABVQFFFK8R#~ cĢ« &() De!BX"9JI.p"#'1U,=±"Mf?<~7OΝXn^Wg0 mnsW7u*pvZ_{3錌g'rt\r#t~{//,p˭ q wF콼1 mG~]Hv#!,@i}-k|'2jӘCQ{6b}rCN"2eR ԍر*Ҥݥ&H'! [XۺŶn}OYH,RV1P!Ct`d,Ȉ~ׇPե1bBc.fǔ-%a}hz{ :Hpxi:76*.RFܕG͞ &w13rt%Tr#[RMvl)ԐFk!ҤB9KS' 8uk3)?ǘedddkmy]lq7L^PmBr:A γ3BI*/,Xcaɥ]'I-޿=6d=aJ5>TI~Մ, ]?ܺ MA㪯# 0r8ibJʲz{C{g˩Ne8ddddt/kyUu!b0;r֢(@R,0BӸ&s9S>?Rdv4-nͽ緛gnU?}<^qW/cX#MycjG$j OnhmmSq+DzxgmʎSW5ǵp#Ru3{+p $UFRyR]*ތWT2b!=%ڴ5FZ#tFmkĆ֍F U6jQt{XTXW_S6b':Djhm!5|'c{o_O8]ɓr|_+ ]x'ٵ5:Z.>Ug-z(o]̯+hŠH-n5L7:omcFFFS]'zBMk,b12"Jд1kFv ]45fmmNnZނn^\lG3!^qvBhNJ` heEj֩૲2kmb]n1a$7#;k+p~~ӈ4]>f~. #$ΰhN P"$h09J7Z" pfddJaI&1ԌFVTғ\ް4-ݦuJj:)uʪ<7W7oֽ\_Nµ˓i'խq6Rlճu/?]ZT Ja*]QKZ:|}7nmos̓ XÍR$n;WExI~ IplZm`hL.Yh@  !cEDufddZp ^͕{GJ%=࿚nZl*ok5mPکr+Ĕб$ 5Sunvxwyg+54KӴvϿ9Nץ)Nmu~5/=ݫ5֠m } T=k4yT$m>XEyy&&@파)һcd4 w*o>eSy( [a8+u=mUP/~7E $BdUdUtͮŪTPr82sɐcUtal=5w)t=2=D)Ecbw));_<]WnXL)|NϦ],UBG/؜=R5@ m iwWJቮ4{)~^Hy{SlH!WČKxgl[s[Uސ8{eXxaD%Wu{K߳Q7>6| *%Y2Ek,ZJ[q-*CuMd= <1R"ijle:x]^4uqMP*~r?UݐV]]?@yķ5X$Wp)}86E!7###XXOc*/s;e(do5f5lY(_;&BRأ[3;Qe!cك_sXK6n[jTc.],?U9S(De26 c>5J^N( lN@clfddx8ظ':nb^̣1UKWh!u!5X0ѝC=aJIDԅ.GYC[MnT~(ڶ[ ~z{M+Lb<"/aǦ\٭*%Ā*"L§b_ȿKg酒Oݙ;4F]E3ϊ^cdڠ~TnLzUaʅd7)Q-Av\Ӕ2TIdUUFE!qmzW Ex'vu78;|\Z(s%O=J5۾H%ZmzBt6c5!i DvUKnBKlڡNjBJ5 l \Člimv ΋>==###)[K0aNjSR:[{Fo')|ȳ]͛jS Cn߮x{q?vkʶ񣛵vc(2j=nHn7 [ܐJ f/A=g&g9ֆ73Ë$~'eg4k@ci<U|Ԍ4Ņ|m,t@ b$jG3H]/ su ^hҥub(&_&ʉ.'ub1wD5P Mw]wV/&Y^ciPOnL~$T N5}}_uC9=^ĐT@9-늛Swם=&Y;&J/  %]f۠*UVy322^%x&f@zyz)qGJ#E,fO Ӹ!e1FN2X-p.4R ()| H%5[ %#| >{'5dK.& T^| "9oU $sD_6ϾpMk065"Y= Z6xwkMx.z9Hc4-C| 'z CvfbH5?KKœPG ;b<!_7=һ4>]ӗu\YD46LG>@A:MuPɼF FUk?7'LgoW@@ _(ENd[mZTsjXSK=?v_ Zϼ'0~T-o4Wqu;k1Vkihh-Usy322^ ;72,o"\:;6֛/Lcy%;=+ w|'+}碤?ojd>3 O\>LjgƢbC;+5B4ǿ9)ҫxx ?a GQ7Ҵvga[FFFsGY*ﭝKzZHnEAyJ5#1KHz;N%޿;4XBJ 7^-"֏Bz>Rcׇp9P1WJM?M>~~6sbS؛3BRްqgry-##%!&,r5?D;Zk8ٽ ѝ"n Rji4vٽOx !//@OË+"BB _DR~CBr"cdtkM] ogvA]NLC7̶VT1(\i%\7?<&?o8?[K^݉L+M8^x C'/J!|@3ob7F{4\^ 놤&N_q7C#c5f[CFFK_o/Б2"Z3_m.k3)6ws֠`-󉫰E־V8?[zSNT2=M9WXB涾Ӌ̋5i, :Je #N20x6# Dw;:K:n<3222" Usf \揷Deٍ-w!a% Dۏ gxsRa[n\~Jzcֆ^ӨϞRW*;Vba6aSw(D!'[֠^Nz6Mءuo1g7[4/fksHH =NjFV=FvDķ`Mz{nh}ΰ Mzz)F_Xoths>8ZM(Ba Mk5Ʈزv_uG ʉ.MhRtp-KMn|*ގ6FC\OeMHvqa$Ԝ5Pr`!p-~uBIVȭ2c;| H5}_;U\& 'ݘ.FvV@W]8HLkmgkkF7$S ~p@K}NuxH*Śσ iQ.G^?%жE222^œlp M̹ݻxR#^ %2Cnl?M7}5CwS0 Rx9U$Rc-+ @hwP`_2[( eg;m~*'n g kNfgx] >xyuƼR4`[BRLj]!^﹜kŚxw'^'"|"'ɑIOw/6llͶ-tOM{jOQT>Pxc`Ry{,pb6&1:M}//|򺉉 Ro %+HG5FȍxwOuYwl"üȒ7E@>ٗ?{쮝mTr0C`o@ݥ$C;дA;5虊 {u}뱼5@R@ 3ݯ'WΏ)}ɻvx=f{̋ |֨*'ljA6ˋ9EȂ+L(Ko20$^k`tUwRڸ9WNrƪn|{DLj%tq/SkdX=/m=8iơG.nˋ9.gֵLyD.$+~Z *X&&!tPucɕޔ*`rN ^:X59v v!{O8uڴ5Vƭ @PC*ҧBrwdw ^›gfw vf"Hj.Mb709Yj;Hғ}Ղ,3Z*uOwxsܭzc۹~dm#82MMȏCccy7 'òò EnB[Y5[9X$jxFuVѬ轳3h%&+v"_v":hkPZ?s􎍭}&dDgyx߂ JuJuY2y"6ێo?6a:׷]ՊKr]exx3 $`Ɛ1Xx#ؚk/="ǻ-49W  pp,s%S_'2gZ)֞ɹ.꛵"7;%5I?VXɥtuٱ>{?52Q[HbEYDzN`vX1mMy[Rv8pK@ EYY̋ "m2v!/\s/`d}86Y`rE`f4LhںɭX߽y^<q![Gu~[;;ŃZ\% _O*)+/)X?"Ll*uGBtR de,ΈM<Ǭ6cHbn9 (+>h j]c\U ^DJs" }7Ĥ7&Φs{߻~.'A4&)R|3VLK@ a_z{uݙdlhOv֛y6@9|3,f9L/'d HY(OEly))1q%U5x[[<+~sIf~S;;sN y)X?<~oV=;4N%nj͉AUVZ~%=|2H|s%y  \<)C$?_^7,(H/]IbRٔ l8 b+-ٽ 3o?:7o.q|XU[vxAͳK.<*p`:hDbsCjjVuo K9xu7yӫF3iE~YL,yRa;cg=T|l@ "6Jp8j Ӝ/ `IO,?rn̶^VeOFh(KhCHoe-XT1M8ɏ~X qqEnpjUئm " sʊ4 cBxw\mz{,r]  cq[ 8|@4dcZA}Fօ!E&v@ üP[I8 Tf+Zeeū+ᑽ7SYek_mWE O%($*b北FtbڔV}EnPV T[糐Jؘ1dOVFzynK]ޏ+,9rwǚ"cvr;;w@!6Umרǔ~C*W+T_}>ݷ|RsJyi$hKɼ҆ `)WH*CUkAլ+eb`'iR)V/'-} Cbh.1N>|B4G!@D뎗7E.w 3d92IٍBŮVȠCkՀm[/=Dc_Ni׮fplBs>7!JxƠ?eXC~]ܴ[=4."貁ž@0Ni_"H>ʇUU5Ǥ5h$z<†@=Ż+@EYY EWC{?zT,:RxV g'@ޏYl vZ@yQLGmKR+]p}xhkp(FJ`w?FSĴgo}Mh1.2g*@l1+2ܼeqʺzDuy tPryX'zH/ț*a!@ 3/MZ/[kê1eYɐ_[mhdFcU֒ YB+T]<רj /^@ Y%~Y'>?|N*TKdOSBL|ܒ]сJ@ Jv߼>dwJ cGx;+}[/k>M*άL+๒\[[U*4~T l޳y<XcTTc^d(r:!@ %Di,WUܓxIAY^Qz)w1;"x`Epw!\j/Z.ykXD @ x\uYx]ȲgF % ojQ,j2v** 3u ^,Rxӫ#5!{7i"Ox?omlHn Bx㗎K+>mf/5MpfP+Qu/R;l"uGYY6,'D3ޥuxB O ()~DG Bxj/x5~I}U]eeEȖEUYYn; R=jnwȐF"ԉPȯ@ |-r̋  ee{;z!!Aк)Z;?>~ ];l{LVZ..__eb<{PHaյ÷L^TRa k/auYPm7<Ť@ <|9VeJV+0ya^lBO]Y(0BYYϟ eu4wI]ws5IK[+,XronZrR Nˋy$RS.Ww+w o/eE> ~#SADW+s5$xIDWk\RBc]K6 BK^+ V5ƢȸG»Xƪ/]8u*N->$hxaP/,+jr{֞ :Ę2 v3-l14s䙁wV·xHs\C+okݯ|b uRR*'^W}yd8@Z{q ),E3sQrNJ8S](%EZQG?LoƝUƅ_]SOCV6Ď\Av_/LP*Ss *xxs˲s]sxvu]_;'Yƪq(0exs%j@p".oVXjvr߼>Grz9wwBx +ԵLVU;'d ǨdLjVCr$ Rj/(!Avk v?(/Mii: &9kځھ^d_/,Y 2Y 7A4[*2Pye kuMS{TU}ŬpRp̩BjVtW+ daXk/fUM0O;ߚIro3 NQ$:F4龷7&v-Fn|bqK誺F,cRM]mUeK6?_GIdy,,9RX(l#o CUgDȰo9ZDZN]8Fӂ8 j u6cxH.n6wg^`>r]U. sN SZmoJF+̊ fmۉ~Y>Z#"Cݪ0Dv{!QȮsM8CcoI)&|`[fjvcod^ݯ&wDyC(gF6 0Z$<-IՀg3< v{{o: B0~ B@ 8)~iD{9j$Vѝ VZC56&.PcKkL[b.J@0o^aU5٫XXrgMQӦ!'h&y֐^ {ΐ9X=㏏_pR 1gagLoXZ/ @ 8!Hm!]f+'ـ7孭 ´ڶ, rءǃRj JΡ{!D | nyCtLC2Ӕ9xxXa 6%ɯv( aa1rEPTq7=w 9ma!ddw9m聞0e\u:;Eluݨ}pMԑM>R@plܼ _VC۟l U,V~3Eky7z/ܶ /z:H-2Q[7˛ Aê«E7-0Cv@ <Ȳ,PEaZX+9(`u{XƼo];~~s?:>*J $ =4T͹F䨭td  J LjűcK$RL} k&e5kMAӀu)/ c]ډ6~D̊ +AF+fe(µ"7:+ tGm=a]YvliyYbƬ`C0vL+)jPWno%L^@pT̋ *&);RǦ"odٮ$I&4S1vwW=OUb7rUA+_o?WN^"k| ٝ2,V͌Rh U`RV{XaMcuȌu6<.`w^~o/A GAފUmøYtἇA7F'C̤(xsvPS*~V?sK[t_?!} 5dW*@|k5 \Gw%zeZח }[ox1kwAirC.fEzTEF -ʭ8aW0b{ewm #"ei 7z盢ckA-wQuBŶ&!W+wӁmķW hxjX/Hͳhm1kÿ_Sng7Hl,Әؠ[Bs]6c5ݐLVJ65IaUՙ#jsŐ⵰s<|PBmy6NQ2>xIL^]ƒq m96B |C3j.O"=@۷rB ~Xks9/VڳU堕Bi6ܶk6 buY꺱34^ -8ӪmOD=Mwn:!HW 샛7)Vd)0r0}B;unSB?眇MzxB5lۄX@. ê rеD9F]dbs])\#RK on ;/ {0W7LQQx{ʌ)4Xm78F>< &z] Dt{:$}6SӉC#OzGYZ< Y޺6Hmuތ3!5nKt[uY5N̋`V)YG\I_MlhwBx2r/g{@جo, 7Db*F|% lLŭfUȉEwLo;(++ނb:* \uۦ2Jz6ak]CvUwru!`I+@nۙ|–6[]uۥ"]Ek~ciZg]X`yȕgl{Ueq6ϷpN׏×϶Ve(5P Pۍ:f Cy5inp Bel+lf ;OyQcۖ{ِ&\ݺvXk>Rn9ܷK[#ʉLN֮V 흪N-hW|W2,mP-je95mgy\`t, yfy.MbBQ 2,$Cs$X+\s\\\K"W ~D&9FsT6\3֝0kjU&43/r$ĖoB n^-yc4f⽠ܵ%.ρޗ1mSwn|{!J5]ťi.f gF]krwj -~~{u9w(r!@Cb8uϋl{쎯w+/d~/Y@ >"o`@oW6ɾd82[E&"NtPq[׮>!qVV 7o.B0?'uV6x噲7gRM 1.++q6C1Po*X%-۲]lDis5˦yv]I CI5D :XgIg8H=_jgA@ qMkx2=Ъ?N|5. no7LA?${wEvNp\+k=Vwz__lhԕCY<,+׼ Jʺhs}o.wh= s]+xVm}.|v&{o_bcz+vtxN'&{.YvC`o@ݥI!T^klm߻Gwo0FjyL"сįuPq=nT8?5ůh2_il"멿ґࣀY5źe Hk<1)+ Yҵ@]&/.:Ɍ,z1Z5mٖ:\_.d YQ'C;Bx^JMhSJ0CzIlnל"MSI.XՍoO6hc8}X ֏[&U|>CjGHNj "8[j Y u_Q~w/ondTeǺaGSڥ%>QdzkB)&up>R>n]|/߶Nk`º#1Va)cy߱1dnrB\M=J RRr u` [}cUR1q1 >}ϕ~_y]XYlP&n%)e~dtĸ% 6v=_>`]KZkBټGc4lVʂ 6/ /I^@3&(%8̖ $5Xeu 9=LMڱUX$oI&"A1muySkNc=0e3m/W En(r~y>g(ըUeѺ2kM҂[v>*:ۻ^SGuk3s幁 ΰZr<25O;O &wH+`)/کݘů onm]hQhzvLb~[Πgʏtj2k)t \ly%QǕ,"|_]Ͽךb[1 Ek9]~d79(k+W fFLl"P~ż-5~C"oǶ2/ dFƼPZ!u$BR{/@`}WC? ڶ-V_X+̸W(jpy1ߨy~<~H7Wrb{%Rd{Emw8?+r ;2փm(c z$ITM Uۈޮ 1ѥճy>r_{TOEi50Zb.Ĭ9V(C">^ ;& -d9$5&So11ݕƤp01Dh{ Mq,ӸkSgE$э.}LtcPcGH9RG/nKe%֡,&#gǡmVd3 )߳y^UvvUmO}suYJ\ɦ5=>}?Wg2;^@~]ѡw<DCrSDicb(^RRYiy޹>cq2Sޝq/ys,k+k$?CŇg>v)0/2,yۺvy~~{Q}:>Jo/_|KvI܇܎].g( >} ji_{ee;c^@3(DCHoLJRDN﹍=D!H1ᛢ kp(c?,Vm״)ᶑޱOg<%.@Qn]/6)Sε >13F ^~B];Y7hH)Wu/g2X's#ozy^@~5םmCQrc q#Cd:8yu#nUAbŸ^dMZᩤv踦 Sb;"3!nU֣j/]UPs!1֜۬˵D߳y\v~Y~c1:e u)Ԟ)/8hvl  y='ۘo>+E4N=rru1?J= yg1EY1-ئ)}N" I۔7Q!Ipa]4ctS$7 B@ ^c\WdPI!)H 'ZmVRi)Z,PoN-J^w M*"_5bWy*;VdI?W{nVK ?T|8;z|Q`>˞;YV#? @ u0eͤJ 6DŽZswgpx~1UK~ޛs׼=?+41*6Bt97HTyyFA ߱MVzA2Ѿxg\UM.MS]\'9[Y]DMp̣zw 0o2Umqq>ï//K+Smr + |2yyײ!#9kj5ąiTm!yhʌmO"SIb}nқRyy,_51cj%7uS}q> mtbi҂'jiǷ_R=VGp@[MqۄSS-z۰QVph!y}T!.S&֐byի9Vyr]u: yxQpuWPLqvwODmfo^GD /-<*/?ϨKxPv(`| !1ʮ㧌'@ F&"ܯ 4^d,to U` m:xE<(-7]4]7qr몳h6kVMvm -H::tPRp힋<̔__>`̈.oBvC^<*C0_^?Z#QxQuZߗ||D+ )e]w>ImJ?|M}Rv9n;Mt{D\PE\C}cĉ/?~t} _ }>.V WsQzѕF(]+(r21if &LC-}FMŘ7V7*zHL n}Rr(E9{ޘ)5v.`6K|wUzIٽ{X>.ǤH0_\ŨSCm]ϕ6GDSŅ?Z7 Ws>qtz&lέ1 k":J@ 8 >~+VbvQgh+w) Jco25i.Dgĕnk,=x4dߺKp"n;83rh=CǫXgrq><ehLk, (EH,bsiV(eh/E@ 8b'k2z;aKD:N8э'véD zӬ@uI1\7ᄧwƤHԆV.έ M-`L8FHL'7L_R[2 -RCKȈa^]:~RFmOAh24Lj 5:;/Ff4EA'9W^@pb|t7MRCD$/yWM7,n Oܘ]>) 5ſ)O')on1DPt'qJ1 V8"5F#@ kaӢxJ5ǷX*YR Cm{Sv(# o}&Z8a7,fhA+8 ~JTE^td,FU?r#!趚RzgEy Jz.E~bU7Ig@퍕0na}!uh v7}IIogY6ҋnm8\.('x8zi DvMKn bKCK,(KR`Caʻim V5uȢdppQh%U4y.Pz ï]"<0?i zza뼶nLh!J/^vyGR6>j '!*E¼$n(MӦ6PYZh+;%T^"7&<{biȌƗoEV}ʊEQSdw7ghmZ;>m^{BN\@u7 )tvWe23T < H=Z5=ݴ|"JfpUy

W9ˋz~N;I <*&I:ڨh~ּM*4g]٠^"0:3:tDw")<4N:TPp"zfs/v{ɮwkI]Jkݶ\ ee4B='6B++;/2j]ɟ|Qy!u/E|99nuc;Pnk!wM6 VDlkRZզ˶C~mftP-@c4lEw%C.|++KQj㵧sN c^@d/ܾDi 71kq9jMۭ*;xǤ:RRЏm ͪJZRB5q>1eY:|]R4P L ^@|ڍ ('??R#c;7|Kص;d%ʢj+?Ou$}6Z"D5Cyf4BI_CœBxc՗-"wyZ[?'B˨P-g# (N.&އOLYaK` "!t<墴1қeAo,u0*XmS1~>)]Rւ6DwR`1o;(meAo/zh\R&Pc^@,U_ En07Y reTXܽs4ٿq Y&w"Ħl &"ũtUo&VT'4=B5K6TQHZZk5~o -rA٥ZP_O84TC*VD8߷NZO-PG*tT|&JJ5F(ӑ ϒr `|rF,s7sx.+W\R7&5^OQX @޶B#Յgo&+5/&]=C}󂔣HNgrK)h\GӨ/𡤆]TxqH>tWMC8h尅F!j\WohZenL95ݢZ &mX %.4L"&ɡ:*Ns;-س=#"ހƻKI!"N% ڨ$9NmdWqQB)םRXP !uwxLLrFQu'*%YV9'fc&&OUX=+5)oКp,fSۄ@l6UQw&%#8MF],?dgo<41;%u2Oim3<݅0o#pv>/$+) y:M^b"ejrQ[Ao;I-d[>'R=}^4Kҏmk@5ęCd*oV]Dal¥YŴH+sbU8>&!sµPyzRdNC&}|T`-0/2̊״` YgƒKRi4lC H#Ņ 66XuMY m L3$ȶĶjU]& m?KgwJRױv$*:`m((S*5ǰS|÷_1/m*Vjۢߟ kPʐz{Dq<#Ļ)\i) @ x16rDO2>ޛtl5ǾJ +hBLPj'!ڈ򟹝}ziX1!o؞GuTQy; /@;rz2&2UYբȰ\U6EC>Nxx'tS^׾vR&^H]#]HjLr wzcBͽ߳ xm–w*&z٭Cۚ!F([R$oTAbXu\4uY8Ayﯪm }J=5 ’ZH!]1/;vj)T:?J|}{ꭝKż:dO11[Tǒi]cKJ} Pxd>c6B+=kQjO񠚴*ĩ*66OkpnkKS0y隿l%o'^Aŵb3_'MMg+VUxjo Z !1Gjc 0Z»[CLR~vA(ưIڤE.PT=F(.U'DEnZՔY#ȟK1?Yb\3=0rd٭x8 b?|L% )m{}KSz@wU|]o^jnP g?ihF]"[R}FII-!"QN+mfnHp+~ݸ`-&vDTvBT~<36{ҩ;}»¼Pֶ~'&.9ljrE^5yy* Qſ;kU,$Ċy{~.j<姄]C)7B+5n5RB/UxݱT߸PI {i_32 /R{Nbc[CϋH-$iSj{ؤv":Z›1",4`†u9rV8j*ѽ\]F,+iz/Efe 3gM|wmB]I5BivtqZ >v#!Y#3z1uToX=k>Aj/OfcRH#r]c1˒EFU 8x{x) JUWRƾQRw1b{,m CIlozqD`L>U;͹Z6`L3t}EHrU谈ai"7x+|{vvCpmP g $7iȷ^A՜krvLwwzLU[iL\Ȳ&DVg{iU% .'%%|yCa'eTP0a]k ~›Xr,գt;{j?Dzn3T4Ak2a`]m{7BI-ȟZ#!YUti5J/`ӹTRWhӝtX𻎼t 5skFF,SЍ bS5]ղL2s-r,ff,~Y~Y֡V A{u>Ǘo˦I_J\XPm5lb:85(M+|0 𑵁 i tJm9N>7\޶INM&)t[]:DvBTBn'?yj?%U˛ غiD.띺}Jh?L ؇VD9\#yC??f#!YBk8m%75ǤO22^ƈlP=NjE"#ξ}\z}*K^E<&J|˶pg15ĤRdv@FM/xw&RHٝrZ&ڮ, +PښVy?~o>j#ݨL=SxϏ攊1ҹMO#VT׸[ :]m,Y<`Аg k#nOэTDd>'q IDAT. ܦS"7*3،"k>S5Q:_Rj6(3ӱ\@FlcBFZaV63 H9E#NzW=q'fp#٢9c>F(Bxw'53^ݡsgɓ}k)" C87zˉpۍ'QVx[CcjQAm\@}$OO RJ YbAgZ~ryu:͊Z )59tګ@J5O)%'Hx4BٗvlPƻ'+񆥼Pmd{6B+vn0uZKN20W=Dɳ ;iy;=(E:ŏB(K쥃>"c 3U؊X2v N: yA,:[pY>0@0(.ob|ZSqPv4B}y:\z6؄|II#A`m틊Qa[Rg&g-2 "z`_WWʘڝ!Xm"-n[ɿkH)|^W<Mlp,쮊MX\]|dxgUp`PSA%P8cu# ]'2[:3Jypk/jU#;o U2|^Y\d?^k5B!KIa"+ __{ۻxnZ Swg DP16{6NZl _/ޘmZRG=U9*zzZ|{X볍)Ū 84XW9'E|u ^)x/ccP؞#cs>Z'lB sŬ̓7VZy[qq xדwŶvӶm"ʑKSU/k-c0V;cKzc9Fô36Luj3Uj{I[0Э^nSڜL#r}PWYK A) ^ule‰8_̅Z]؜]er IgEV?E`kLN[#C,}ƣ2J/A;CyE8􏡶z_5b+ 98cuǫP,(mP(mʛU6WC gezg1Io+3n&},o}ݧ Ex 8)7&EƺcBr v"Lxk~7,Z֑u ׊ 5ŢH(+ Zjx)}_7g>WusM Yݱ8k *[ ܲ5"6y81_o6n}]Wܮ(o{cmB^ N_NaV_AtVkS_mK5ՍD\$LQZu>mQݮ ߶4в\;$gOp4lv%vNo޺&B,Ƕ8E4lۗ񮢪B'o Iox<n}X!Zl\?fܱܷ Ex 86uhDlagXN][wjZvucKm"]cmbw݈Pl±ءXWDvLhc:/jaٵ}=[> |tbFXu1KέNKT:n=^ZhkڍPHuд\)_K's?hkmc9Kdiogx0򦨍 w_߱%2&Ԭ\KU0J#=F($xwğ_OsL#v"::0x^fq7Rܰ%6q]-&7y.tB#G0wbvޟ\Y*&ZAd_pQ]'X\Ħ,rp40ֶZ rs0bPgr.b{F(+.5#zPHymC0n:1帺n]R z^0~ ӯ/Bs֘oߖ84_7jеVgg3l*WuZRY/.zˮ;>\.}DTrX&uʚVU٫N,_HMJc|l^ - J 1H%Y달Ny]`^:0SzA@9siT򍜽c*;Q׺ '|/FHɑ&zvMJ&,XЗE3쮝廨ܛ- \P!ARΖ.6ڞ8NM 6vgDzeL춵W[)=b<jЭsl'r]|]Yxl+YvH4B&}}6B!!i"0׃,oC|7( sѩY6.At ;4X ?>.Vx}:) O;v}XT+.&pC}a M2!1ʒz:ʰ_M}X FYrr7)j7fk xa[uC(KLHn͇ (e4]3i6e2Q&Q(w6~K|(0%.(϶0ȋ8"J&Tw%]ؖښkX6ww]?͋v)Ici ϗڧwPq #zIOЮXOY"Ph' 䅮WbbןոA*ױ,/ ߶ O:#ubEu8]0mW"rhmD5;WECF#ؤKF#̰LkS-^K/ZɄCo~ N0MaU#ûaؿ(3ǖm[*bwWy]"C#5Ě`KX֨? "8@^.8b}rDBܙN^I@:ޱƾj#LTb(Ьа hǠ BDHڦi =mVq*1:bw}h[~xjPlr-ӗhBw2ٌuݤ2Wڼ*D(!Sb=n[#}}*Lq5D^ρdp2o gMu?wtR{ZVvXM'nBaQ!o y0uŎAh#A~qQ_> P~M^}Ei>2]DpU1 xs;j:AB5R džc dϲMvb]*zL Dsԏ:F(?~:)Aټh a`ZATNf"Tyw!:mrG>1Fu6% ;>` ͸5z`]B!᭵ Rrj)LDW7[x>E_,rym֧2/ [Dx W;%*b7Hu{O Vϟj3{Z14Ze8#KmcG|t kRp|@ Vs=VC7T?R+(6r|oV{|EQ v#zD1U㪁o%jTݻʵ" sln|_n#v}QBеc﷩he/qu)A,w&Vo16ABx v][=M[cWumQ[vP;ab0K0$/*>8[ ,rE P%ayi 1g} CbtyPe|ʬM+ĥ`DŨE*Q Pv t   8*c0c:/h9c{}9pƠA^h(mϫT Hq!$x 8i\ZlsIKκ-7ODLr0)2\yWC . Y<ϊVN [nB˧K|{Aᷫ`:/`M)v*=a%ͼc  lP;!"Ksk=l"MlHn.v&fEK Kqc ͼߺ]Un 'P6R߮G$F)_f~7h(9ǯeXhS* @?\{:OӼ>\ (K0&$煂iӺ[ ^ Evaoko5&twq l☱N C_ ey{_>^⟇i-viջLBi[|0B7Z[$p^eNc/i Y*1& 3  e0HKgL=/4EoV82z{%loRT+pޢ]o67U2}:-6Ҏx}=U]}/G"9@bBaΗrn *[[N<]w80A"9P\@y\;A|nx\8 ~M.Om&nN 9 ۦW{hKKX~n5[ŎuZ oP\C ֘7i>c8|Jk3W9 x7Jn KFY9q/,tKQ% q6k@۶B{_ℰ+*%jCg:G͋>^՚uwGYҨZkk٢s)9ƋJ?-0yαo&%3- M1T! IDAT_R 1gG%K׆Y!j"fӼs]j_.ED715];]_c~)Bp(e^~/ r1\~Lrhk1xth{RV,FhsQ'2(B~WHqVDyƀˈ].߾Vc6m﵍mWB^gf]aYT( E %t^@WHrXxVT֔U qJp@T"5଎iZiV`PcGd,R+l$KYqk?\c2o[mv)w)zۄ.Ep$ϸO*߰m:؍ʓ ]up?rXۗmdX sXXhmk+@?>Gj$]7u%f UPe"/<ҵCy^?d[ H*A{T@փmcmOMBk ,~v޿{0nth{K}q I"PX<=/j#\Mk ޫ&˽M ݜ5l^ږYy^]'c7R (ok/|[ƶ12ݒ{J-f[u\&YAp^ !pCT\uG G\h9NeqX)gum]Kxmr"AƖmd d-]։&tq!/\!`к]X ^[1Vv2iSTMI0^5YNURY:9x9.rwݱ*NX%K.7tlEIH쾈PkZ@"M}r[s _:Nę!JXxZ ~_&LkSZ@eK.j}'pLHAl0؇ CoeM!V49]q6ְN\a%KDDl۬}e ``x({b㠬ǯDܰIg R^,G3f@Ĺr1io1jqW Ϻgzm9P l a*vay (X%nVqAp 9 ,'yj /J˫TF ^[IY߅_Q<qB^ Κy&b"+;~Vwb:Z7m塻a![o?0~\FKpv…sB8ULi^ nc6wz=΋F TVL M.;k'LJ}E5vU`껯z]mm+&qt^`z{>ho/ ʻ8Mq߯Ryn+t3 6$x ̷ uEkZn#L}swyhﺂu]Aw떎vWA4H1YW= +Ksu]rx x#Q׌bKE/}r7#̭W6"Q*-?~RتU0wi'e#^ Kě-`e$|7tt>Mi,Pwn79EAkô Ϻ7Co]cm-ƯzrF 7)+7C mnr.wvhmѨTX)8K \c=85oXU,?_{vu$x x3@iQJuWM^l9аNڄfX|{lgzxyw^FZԓQ MDc1Ċ܄,Wy_A 7KmvݸX]_0rfG?CtUxW{1>N b_O]dYsNy?ȥ 7H^hd]oϷXttƜڞۧ/pCYuk[ؾإ.A~M0H%Y yYb \00b(8F 7ݯ |(K14]j;LiY?v7֚ٹ2P*qh1[(k ^8cn~ MCKag0(GQbob8; l\u&2Awwzp鴶5b%Pڐ+řK%3O` ZJCk "YN!py﬈mx "׿8}ť5ִkdžgw1ަ^[kcgA; ^ Vr}a< /4~\0 Z[J*@pA"?7z5b+d f"*x%[+M% O ϶ub X?>Ki.A ֖S)0H˪[w EsBihca6_?_M^p~M i">c[_azAϜٮjLvFԑ&<ÉL,+#U*%Ab\Fu' bQ0H$ލR_?c|mqse_6y95m8fb]o\npnlJ%AK0PRQroCܼ/3\S RD 0ּk֩=8cӨp˩w,;%4WIEmia}j6@L AG H@b8e0$Bi|x_c8H^ {sj׻FGd5:- H> H.iqJb   3ʒOW2E cQ`)c*aXiYXJ2X7/ܚ ˞}]%T9gʭa۷MnFf&1sE A 7SΠJs)9ƋisE=J 7.M؏"v5" k59ۅ]g?F A 5C){aK鬀X<&9 ++^mU]"K%D /t=6A+ẩ]7:f c,6H A 'Z~|U _ :Ͽ4uD:bEt]A ] KAtp`(-ƌ1x1 _[]Z`+R` dYX9g(6hcn_BwOwpWy+$|<0jsTz]x n{P4 A=Q﯆\$z-JlfX(|t]~͇ H9J䅆EcOVٮ\綠rC\ HAxǯ'v= x7J2FC m,&9~je6e_N?/u[*/aWbotWjRpHk\ \ HAl˗a ,8ŧ߆gJ[HiR~^JBqϱ깻(85T|F ^ UtH$p 1H2;[( sP?^?X$o>\@J^"ҏL#$.GOOpbly?%/AĮeI+XYe,jwB7e,ce`a+Q`틘;4F\PfB6Ħ\c6gu [_p%/AAo@k[٢s)9ƋJ?-0yαH0¾8o^Dwxw Wc, lC' Kq`Pʼ^Rc:+ 86Im-O\ 1mB /AYb1H%٢Pc:/+W^y. ]z֔L,߳*  KqO渾KyQt]X sXXhmk+2cr?/#KA Xp I"PX<=/EkZZ[:`R*A ^ c1`%( .U \)8U$Ez蕂;A 6AD|x"H!rJu.-rE /ADJ\^d/*s-,|Ow?Ew B 1kAFYhZ Hf.cdF] i"jakReÖUpIu*p9r]^^UKtڠy݉ \v0^[k˟m>Lq?F$b-n>\m+\醘 d讵Ek A*H4 _?6P@k (YG 8oFYߏ닋s]p%8gu;Bi|9NbA3V ]Y)e+ݹBī"wZw90Ɛ,i'?{}a< /4e;˥9]^4, gt&.J?^4lu) ʻ %P /JV~4{UA4gx%ǧKX J#T z; UH%Mw  )t9gu4(ia!ZT)ǹTTb-7b%Q  //!%/re 1涉\p7uKZ޷J.rEj'wϳҸk|pcJ+`FڠPM el-.Bq^} I)ZP eSxDo(0[ SIĹ]csi('hgaR&X^9@C.A0/_/ mFNrau^18wIq}9Ϫ;l^Գ K.8ֶ"=\{MF 3)]hK慥q,jBSzc%/uqIXQؕ7/ccK'D z Ls05v)!6i,9.Jŝ!I={z.QM-_mƆA ..4o1]@ DoR7 ӔKapKKp"ƌ':tmؒ Eʹa% *E ~A1 M.LK a ^9,a]׏b,5)p "6L)|+ XoBN9c5lڈ*<^Sւ? y r}a)xmI 6|XAı_ M&ʜ3Lq?OI@@ێ!ykFE_󣺡MSztRrj\ _ejai_5+pCLe(%?$cw~Qzu_5 'u!.T“%pyji*JS+T"N캿5_jc!$P34<{^(/g \ޗvxy=8c1j- ʻ .)]v~d7McKbw $U ʾ/)SB%r`PVU\w_o"^(4rh zcY\/ 2?NSx8IO/i9.HfƖx+\ S*s]JK*EU&~6bMzlQBAj $A)Zpەf.1ƻuʥb]{3)Zzm&ܲ%5/AD d AM a\4n@vM*6 aģtuƖA!"草T߆0ūrxµ߽}q: 87LNeadSSxgy@"KE8Y ޛ.R .ꜼH cm)'DEȢʱusbWBc[c}Ii("-˩(*yBc%{^ Άc0w?W╦-R./f;k,(g^ u~Bsy(4mQǩ꧳A4O_k_;gXClPgGq6)|BtJqpVF:`̶mS5* SK[Aeo ؜wk4/zCʽ^A 0Z5 ^ d |S3'5r_>ؑ)걕skcn.SubT(SOzWT1hQZ*s݈$O1 _XM8cwW %CXaߦqԂ77QZq[JB5^[@êE*mi ~kmqd_bW)S[5%\tM h/".MK`euKm5EJaWB X?bj }b5A L[<L·4_Ei PZ& Ŷ uẀ+c+\"8gunO7_6UN~8n-Ok3A j/Ao>CM h&п_@:Py=Ig gll^^7z)P'nÛKp\qXm۱%g ^ N2L߲*ňdi08| rxP9tcx֖D|udӥ/ ]F ~y0}U4sxFw >\A2wr*oYP1b"Y9mq}a< /4!8` -L5հwq~Dk]*FnlPGz7,nc@#rvٕsڏW:&'Kě>~a *<: \ owSxZanb OyTZ%A?0  @D^}D߭-߮G'"zcQޥIvuםRx׉&$:&'K2w)[T\# wMr2y^aaRϳϳ.-l9, ]C\tpr^Mn&װB27օ f9G-XHv#8$IqڂL *0%T_>]Ezxǯ'v=RpnPBs_F<,m >׿2 kH~JfΣEn8atw8k]$x LOUBX-EUl*81H  D@p4Q(C8k.wոymm}g֦\S ={N0cF%o mWn"If^0)#S.Jq *b)2DQhƢPc:/J*wEW-AÇ֝W/jb/` 石rUw'_+F揯#`(M ǵ3).NU^яחC 0uUkE 8P7i=~F5v _K[Ncc? '3D)bcA־ Hqc Ig 6f'X+&Lj'Rj+l%ĤFkLF}{W #}kLwZ(:ZKE 3MK~(̾Lߺ3AE1`%( .U,iSTݷyYZ_4U5 Tu?WmXwC*Ekk$x 8ybQ!S/P6J)!-zs*byȝRAʁX0L;YwRظ%cōQW` ;Ū$ڑ$K \~<¯ϾMIPu uoJ\^d/mM^1X%U[mEoPox}We"=/:&}..$x 8ibC#2w *_|(K/<2^100:\B?XE/Ewc{pKA3B%|.R"KemMzMIPG1$-ŝPݴHb{>;aHIT a19H ADʚ,M]0'S#/4DEW@tsMcTƼmBVs0? ^ FJE{7NT<ay)<gѕm/1qkc,ƣK M85x$mY{8cB p ̑{.Sx_u]L[w#jcj0'S8cӭ.N*U8X:\AA ^  .! >7|ڠiDx1Z&YڊJLMVo?"rnنCĩ2D)UwsqIiJ>MkjC4g7p.vIqVQ,YV_>km~UTĿ b|A %Dn?!2'SwB6D1q=bhkLOD`4 H%pvmޘbQ}N[ZMLnWnX]-;) LǺ^ :)w]]m^]\Dt]ʢm+H1&]0p iE 'KAg O_Hk!sR\*)/46H$xG}jw B˧KABU)9H.MZhй^B|ML_PJ&^"Ʉ·&uޮӦm0e0Lz4³;qr41.tc`0 PCYeNGE2v:]ȳ[ GGunkCkƕNB_VTqzq]$}?@%pk,>5Lx #ás3 s IDATtRB("B _ih2B3"Ḯcl1t )޿vH/1W /` ) R29 Z5:fٻ r 8߯g̈́`0v_r(<@UYjH@!% 4Ū-Z(w[Z>h 2p`G| `n1ՒRcʤZb>vf֠i,8hF & [B:֦:a -I}@c*OK ^x ^R(< b$P#3l,S0u[Kc9Sx)``0D~s(<;A;JI,;'< uCn-ncz} /`<1f0^x0&ĄY ;H@ܵ;B.Qb `0 /!Zw:] ^g=l.OeZv6"l2``0 d-E oἇYIfsBnUB@5qΛP̖32 .L@$frriR3cdLS*&:o->>\)JB/``0 c_8Ҙ k=_xZduWYuoN'Ke/Wm]vu/`0 8=1UhZ J%P) h7Uޟ?:3_NlxW6뼇nl & `0Ɵ} VJVl[4R5yx`'S4[\OʻEDmZo``0 c7V8;a2*0T 1[zh>ûԠ8? ֆ&fޅ~ ܴ8y G`0 ɸ.N*TѸqwgc||wcĨ $XI Z6x9k4m7Mtf"{:rw3+ `0zݪT'%1¤0֧˕QMpkG7w9 Ef&dgH. /`0 DPbB@)BK*Q15X Be7'Bgk,޿_;![ǣ;])(д VuLx `q]<]E;ɴ֡5b ]"IEhUcFU`iXZ\,Ye0e0 [2fZཇ.Y%&`A]f`_ۧUcj .ŀݳ@P8&Lx `P(%V) :4bhuE=ƄxfSئ49ŲeK^qҦ`0UѶmkj /[XCacՆ.mvCܑ{ORغXkR|{2LNx*\,qz^RGuԸ8&Lx׋n`0O!Q]m-PRb-V\$PQ%HVi-g"6EecǵZH)2 t2/R||< $rU=ZE٢dT&+~&Z%!!1Ld;ul;3e0^M'@nZ\.gn;=9ɫs"-lP ߟѶ{(%Ტ`;. & ƫd0;>^j+Y( AVR* =ń"UNT$[ɖh{ɨNj势@zudOMuCTen#&#،ś)Pq ejĄ >;hzI1RRYd0;uchjGZ+Co/pRqɴfp3[Q*"Ήob̮b-zD7o),,of|~L8Ηa k=~?a`Kn`=1?杂мKaNvB.5BkRjU ^JU$M4+B?8&wT{Iq1մ6ud&_1Bh\QH:Y!G]Ksʄ`0Y!"Hw2*uPyqX6m}8hȤz!Hw//ah8? ֆ&fs|ٺ7_(}1eU1{<)&>ſ-WFy0e0 LѴU@XJBRUh\b:)14BAI8,V%+Gy8TO*oNzE[xw*/Ī1:5$ɛI ac]˕\hX"|W:Z(ĨU:(cWn|w2  ~fiRtݣQPu[P-UE+ƄVH+Mp[Dq*/_훣`&,V-g "vY ٸτ`0%nfD@US)s*~R]BK(!6ȳW*/ަ+VIwTUF "Ȧu{͒j祔LjRuh|BI <{-n % 81d}by1 I[n7K[{}z,eR(K|W%Bt[N;ĶBg~=e{*QmkѶ@kus-w>ƋwHc^`x\O]ЄB$XƸD1xZo=2}#LgžD $ymS]|mv˛%NG)mlSQRZ@3& xH "y\iZ ѳI @PxK$([)l$4 vD:, @NJv-uXXD,޽9,tPAUwUZRg8d`0ۉ k+PRNXYD>[0[/ڴ],s7oL`Pݕ;97֡<53^She":&/YFuԸ8nD mk!2YFu!ZI(%bYxT1  @M @ٶVg*R#ew2u^%82Q~{QgH)\8Qt j/>s{.zJp]i|xw?fWxq&/(%6yj%S$ :!Xe0 Ɓ(Rn }Z( D2뜇1nAW&uu}]!=DL98Ksa~7YAu-\B^qer-kBSݼk& 8EkCaNDkC]DjzhIʛO6')OU}xZKn]iQ:fE1 XIoZo~~'ņW|!& 8 Pq6K*/)7XԲh0"Tf%)d'~8]OY=zl zmcKdT`TTZa1p7M9NiMJ?=Ř5 Ie#D؆`Y(4=K"}qr4Zw30RxGUh}v\h|ԼFې:6!>9% ¸.lL RN5 /`0^"[:%0۶hٜY|7Ƣ @P:IE#ْܴ_YdeH?sYxzPi ufp- ZyEE̳C7'Z#^`:|ߟ@)v^"{8%'G5ۥM -b,+\L !0[4q7'e.fb<-N&=.y+kM>pͬAӬ-B8h ֻ̈́`0/D0GuOz <6>إ@ K|Q]lqw^"M@]jL%yRim',Z٢Ų1 ll]40 1l6ngǣd'-$۷Jm 2"^%~BI{1JԕNj'U{[1S5D=wZ0/AqJ)͞Ä`0/o R`H/MLh:[-%k&[d"nMXEdy!EXL'p?_=31F(%̚zD($u-w(qAw5(_$FLx jA3Q˛ŝ8m"rRtjLV4Zbt@]nfoO&em__/i-c:ɣǘB1ceLP֩ N.ܵ+\+U /`0^=>}N*1[U޼9lѤɵOvi.h+ClDa@.<}oo*ۆ^xǴ8B1cҫ\ٌ:!ݦN|al& ``DMFeJ I 19͉.:wxqԥ q. Jn 5c\#8j 'b&~-E W;lXc>Vb::q3[>g`0§o)j\.;lBІ_SzCϾЙHj >@"RMkU:'_pU|/K t(dw9䇧q# m0 /`0ԕkTX„Q*NɵCDts,ڛaK%NNuK#>ҶfznM7,}L?8&wk77VlZo>f`0E^#iݠ vo%To?Q'K$5n^N}/MGue{L]q~ MyƊߥcZ|1{ ^`$.Χ( ټAUjL'vُ뫼DrUndP{Cv=uP3ƥB53%5YR$г -ۼmX5ZIԥ~PK/fb4r 9 ){_`0u\,V-.ohZq]`T%E΢ȴ䖅UP U.Z[s BI*W(~|FW* A3k }8LŤbo IDATL }+!(fLy/oRڸ.X?h4bl2 Mkq; !0[4-am2h d=RUh_QU@k~,~f X1aWÉmk!/U /*u\H ļkS!Mkqyx"Lx qP8BJj%FuҨVtBsNv":: pqPR5kOG?7]E HXŰw݁m7*3~ޗZy.0 O6dӺ}}eLx qPKF[- [IY J [ E^s6FmI)LǨwpiޯvBPyy֢6K-fb<.]5X@ b8j<.2 /N`tXB}E F]#r[dk}KC K$hR"6RzSn ,z^}oS]c|v}oҊO2 UB+Kjh+#^{unUl!u6F:(ʥLl wG"%.FBa\ ҈&Udc```0WoѴeA: %I/ݦz8'Tw@FuۺyzܒKnRzc!4plQA*oNz_B1 /`0/e:nin+J 6]w%rCZ$swb:CN;9+#˕8F=/`0Rww}rgOU_`mkwIb%sfniRwRy} U>}L & `l-|#kO`})C5S 569ÚI"^ޭ̊i`0/S81[4B١l(vd*?TR *]+'[' H| /`0 Zɍ!Fd`\vE*; E E{=67 /`0c"04 Glvݜ`zΔ;@3kmV)fqX ^^`0~h=] ydۢqqfɰsv=Ή|} w$m .Zc0 Ƌb6O=KBz^KIIa|I 6vH0A7#I615!K & `ILKͽ.k5.Ŗs;]?Ɔ9Gew7GZQb ^`0Tq5K)L~6"* " ꮔaB# x5fԜߴN䤸 yb\[, & `<޾9vl(y8tZyjMuАz@di{[{=5@9uާkۻo zo>Lx Bܩt:!Z{-z2+ՠPsmu a mVfi,Z^"9̻R[*l TɎRӶ2OFXBP P*঵/u.2.Uwi|z;56$:H׵M-ЮMT\ݥ*;C`<GB1e0= nV6iSd>q҄{ܪ15KQ]>>}/@-t"x4*F5KIZe7\L P{}D&{!g0L"f}?9_?ZI\+'¹~ U $FUX35G*a0g1:@Mc6Agm|:'U}[R(^S&{tZ"VE c7NkLFB&E TJ*ku@IOW^NF0a΄؍oSJ \yOF*6w)4DzX/We2{oSᴓ)HccZ&U\5mX$ ǢWɨyif€-cx,R+TB]t5Ūh@kBBCO4#J @& .Χ( <TrS{ҁd [*sdдM@]jL%72 V] IErқ= $5M nld56Ja՘w]l$< öDŹ V8;a2*0T ehI<|8W+EB`T0aj2Cxq)C٢T'![{9 yx6&ʜ*Y^,ɨD]i|8aq0 B/\9ݦB1mwT4R#$,lkQ٢ءۖ;L?_G.u3Λg6L%~cTѸqӣ 㑆u7/,j0=pR׺2e0z0[4mv^蒿+DGIe83͉nN%}5I>W0j%Mv ޮʀ<|6^:LF%VI} ?]Uv~,%ho9٭Jq]xR#Lj cxmZ`٨SBcZBy%u /Acnb6 Ԟ{V/RjlR@,XTzKhZ.ND9ƌ Rn:le CG TreHWUEknUc`BFTs;Bp߲ BR++% -14FƸ beP Jn҈jS槊v2z H&W0,Wk%.ȞM媯be h%f# CRDE$~yځλkq]Ł[4E>@I6ضWJ6Djg"@dxX + ]ʍX(:|bb2.1߭,+\c\)OW) تۇLkZ.yZa{xD8fquz<8R UNv`6olf1Z Uw"yJ(Hݜ֤D.MB&~%"ګ;ɸdx A:4Lj DERџ,H1ʅX'Bö yX&%.oiOvY%&P@vy,4jݧ?k>H#uɣCS| ɮsC$~+G?Wy7 h3UP v%8^0446x O}eThY )BOz_;*݃61֠tPh۰輍ƺ$ y}zyqx}LUЕpK^ƫR \,{H&dWOib.ZsΣ`}".LbB-m Us 7alq4*qq>e5/^Az;6`!>c~KHBKhB,$RP2ZnaZlGXD]j,cV7;CUjj-8؅,7@ZH%LE%*Gqj% _2e:[ yh ~X_%[ӤD?88s zIҶTolnZץoW4yP- bqŻ\^ј eҥ*2\WZԆPaêP^Bdz_ev%(Rx^4cִ6jQrFR+ū'|'h DŽ֡1zHf)L@4"zqvsTB̕fxKMa+E΢ȴXGd %T'"ym o֤2TJ&BŞ;UR|0^q+ֱ }oHjoߏ*\v=e7WnP.JcTkQJBDuqP4Ha὇VVP1+AUCCF]5Q. woд}"g'c4q1"UzƢV!G#dɨL)2^>^i-nc5D\]vǪ~^U+H8XM$Wɝ 'Z&U %y/_",z-wXCkRMFv=T#JIUH6zPifYXO27CEbGF).Χ)nmlBwBuBɎR Fu IAmڵ+X5:oW@@j93ni9WVwU\VtBL=vE!yhAq)ܴ6CJ!`1]w`}OC@ٴu'mj6|A)2x,WwI5)Ek*xx  :EW+Tq0Cۨ*YYD*$ڇ-ZVgaDސLH+UYq3[dQd`h dk }JJfy?p3e4ʰʺ o(* TPBlݪ J }uF@Jez^{iP PBt]*'T^zh8e0#>}ƿF֮Rq2̗-|nYG{¸.R}ɲc0XkrePWLzjɸt88;qzTa<Ұf"k˘:B"3&Njp}L8ͥj|2Li DvU%n- m3.\RZiJH+U5tru$?coXZLuor[qxhZ[Wmw!ӣ כt*U"E  F HKPkK:ȭ\7ض'KbA:֌olޤuҨ>E,$lTB훣W31w5OeUEĻ?F:@s\,;Hk]Z.] Lxdj.B~ng"3Ov#u.U:]#i{o9ۇ&뇒^%*/]r8tptdsd1&@OFf6/sv߸.g ]\@6 KLFFN uY";xT`hz NBD{ >Jc\w2 %eZR%:"[cr!"'G&<αJI@+^^Ƌ7pc2.B;UƳ"6WC: *`6i/OakU':_ \Rw#ȷ!l< ]=T qQTAJq;|W ԅ1G|LG66=2ajq=kjW+s5X5!/:}OCc+dqp uwGnLtىx_̦"+ 3ﮓ.m! L^'@)$hVy/¿X!K2A7S 5AezUyxX6ual*UwY"Rr mCc,t+Ms X,kZ١5օLQ\}K2KɻQ״jKav|QP_\ngGGUGj /۰0kCw,»و'ꮶ7`.Χpާ_{lZ }# IDAT&Hu\ŵh=ghV?7Zxs"y\^K78tj"DYhFIBZ+]y'S XnDjCV;Z6DX6fֿ2ڭ3:GWC iQ43-Z\ZyE$ I9mS)#.o8=?RgmUR;q1M~ >u*.3>E*MFzsE~wevݝU،qc0^xqq]`>cpS4XHxh[ A oRˌKXP ]" "ȶ-dsx|5=XbZ絇E 4M7h#̸PQlDA 9XE88H)uնv)4Xlȸ%@6p!XL,b0^ r'KMvEkX!GۆFl`(lh亊=+uh۰վjLH0<.-[Tˇ͗"6?yOނҤs~w٘o$!xGu1ґFqTxiRz8J󞻇UC;f>^|V9i;[ly@mJR~4_Evfk#d>'PlP"I_N7Hch,K!9e 5.aKiŰ0&tYl(\#E o._o@HkJY7]wEML_PJl4tlB^]%uDgԺ#(^ƫbc{cId.{p"ޯS) 'yv^Ll(rcmkw/t9vƾ0_U։ d^sH>HC%Z)V;0dcp /cR.K H$)ޤ{wn-r77OlgB훣n$!{F>|$Xive!d>PiA>H@| 'w4' Dp)Y#?"/|OseتJBK>kZ}5 xYLk|cke x;Hְ3Duذ%@A&0!Q͢54QYEy'לwANv4idg~܈89lNV:]&LEw' ^[5 MJJfy?z5&7Gpާ*>8Nmc 6EؐȮ1+i>)Jn*2o!SW:'6Z+@[߾9b//W!ԐB`j;;~Nmk%f>3w.^أ> \WԆ`m2қ=e7eZކ~^nVs3^-^hT䩟 #M~uL]NjT|5[4fCDŽҭ;͐uo8{,ɨD]i|8j/^ƫBsrEr{P@1Mc;bM nE *VpMt_jA̯&F9K}^`{Pt߶ϟ, yx(%lnZ[SKd^߅UcZ]͚I}Emj>g)>? (%տ1(^]ͤeOқch_NG3e4@y>t+[$$diC .y:DwjQ0V* T:#8׻oa_ND ,JIK{xR_*V񘪢|T &{0K-o{/G}6ol`Ϝw'۳>EN{<J&.p?c?oMD'1? \4%8]PPX% D{^y 9h۝^O!"瘌Jԍ9UnURH* z3NwuI6o5*&6K7\w6,!F^cAFcHo< .9)v <&5!1f/*=7w |xsvܖ1-Ŝj٭4ਪl #7 MZZD~ޮTǡTNuON#h5\L+cwfL,2 U76=h(m9\NR* ī&waGA|c@ŁXօ=SI(逎p_.r~)D?a4&ה#m6eV/j [dlpy>~t32 <B؈] py>r%i@=xB3 N%,,oEyho,]r֘&=y `h;z +$g/JLF93waѸK}JVRH.'KFwïJu DQ'\Ih6oI_WrR߉db, 7t;y%42on~ގrJi, `( u#_ٴ?~>РzN92î150N#`5 7 xou-:]u2.p{¸Q.g.JG6{zѪCVaOy=G3%~ ؍'T I &YSl/q>zD7S[V%!fVV*=&vΟpmA~{y>gk2boXI˒Fyr_b޹-s ,]$z D.^b:Y?xYƳI02HeBGJbYKY8v/$xCvC#!q7"Uhz>&(oc:/n$ZbQ=oW)}P{8&kJy௫aߎ ț^q\oTEvK]$k2`k)gb7"vl!PYs* `j'UЉ<Feqe#D nC%6RlxFyIǿ>]C ^2/ &)3㚛w/1b+1>o?t-kK9Vs+I=} Z+F-f 1O4&F,&CGuS[%vHwW.+J+vdA,uR m;XeH(kd[)Fڋϋ_Yd֎X(7/?~H >4foURAm*EJͲ.>oT]ZmtߍhnrՋhH㘨SZ8b+B>#MEz 1*Ѳl[/|`g B%K9xQR^Ng/mQ[13w?_zpnQJ׊vYްxIDq,vls|wʍ= lQ^Nb7Dz]gxNK v _E*=9t'e P3bOdJ{=FlLxyRћhg>Q]" /z 1wtWyX*=1| .# 8U>ȗE.Ls[{t?"xHVM8|?lE+ەмͷ%|kGwc.xZeg?\pznUcqѾ*¤϶c aq^/xc aq~;礡-oՏ;FeŪM9`v$uETwp;:: g:pٵwY] /kN[^UZnj:uUp( ;&~US|~Ųy]b \lMnmcn>yvӈo0wWsb܍jnhtZҘ),p9n[R^2^ Ơ>{0%; ^J*8Ho<$飽(=lA]zd}m`Q_͟ŋ]og>7.l=eVzaUCE> ?` -rFI!.w ]RD4z[ B=P}Nq48egg%+9h>oy%~k~ser%~]L@WϮJ }oS/N^evB 18 ~)Jӣ,2ͼeA"Cg6Cm)&0ju -"çw)1!!2Za\m׹Y( (mm .+\8WU_1U _Yn8?t玢D&Tm \]"v i=ݾ]ݮ*ž,l4m E(Yesq>Fe)JQ]p6.71Oc< U-X{ؼVė_nC !tCژ I}Wie@ݰEV_.#:D/ĭ$8E2#$xߒ/o^]~ P= 5cb7=a(EYY,:1~nL%ĬbҘMg*%N,V5o I!XH}~t!eaQY`C__m7 pΰxh6l?ѷP(co^ic\Cv8蒊-MuŸ0D IDATcٍTm>tHPf($xߖQ,,: '!Xfgzω_4QVKwv鲞eR;jQB̚.gGoN'4q~u<(rp68 xƀIs\4PRۈ.f,vcMlFnOi<7x1Mj7NUdwJC9-]lRlƽQXt,bm|AȽ/-颳|H*|g:DO^}+ C 1ɔ1қ9Y'N̗ V7rB03'~C/[/z13W7kWGZc*=]7=7=Q*2hcH{}=\LJ/AC LFZ\  "\ow:zFhpk-eWN1m}24!x~>Į2WwUE2y[`,6 *X-0nqޜAb/W .g#]t.1Ldl#x/vXqƲۚ^Jgi?c]g0D _7g[/G%^%K)-Ukl".]uGnSM/r)JI'ҽ ;&ԡ 1RQq "+-/e!PgYpΑq[W6pzdJZ־JYdPZ#v̜adTl37MR:܉@OP >mT:[C]+4F{Eo*0w-VCda+ o39Hwvvg,OYkc5Z$%lkZ.kIU^ƄK 1C<o.U;A(2֯kX[CUTeQp__YGǪ&3g (š:dCiP[29Ïsq>ݲXQtwƌGjf a @$zk\˒jTyϺVhnthY79c!5.qݡbkA-W/DW9"~Zo2Uڶ:B#fnknE^bv24!x.f#ݯZ Q_hB[>y F|Hc#q+aJC(έp䆅&;K%/Ya6vb8Ǹ5ֆu7W+;}bW*ݲ1ޖ KJio[^ī⯫0[7]*4nzw t*|h*A 1% ghB *KĉS[7j]Y2-zif=Nv^R۷k,Ұ鱁ݘ! ^DՍϛ>!ڙ6pOzsUMn{*6&$^4!& 1NVw b 08"j-X 蟵6p+Bڷϙbk×9Õ08b9kݴfj%ǿ՞вr_ ^U/םt@C>bm߮DHu|ʢc 1 %xrYl[` a0g  \1Zc !8Шc0ŧTۓRl  m \5mZ, u3s[؍- -_n!56*OpiB/j#˕lOutKȬ ގ](!9ti[Z|l T Xu 0L0[پ{a%5clI=9ζnnG5y"~b׷^]]~jRho֏njJxHCx?_iJwT*2dC*M6S 1#0$!8.*|Yo3%>/4uk"-Du,](*Uĭ1!ҫ4fM:g+r%z"4]8Xv <ϖ/Ɩ,sU5K=M% 'FwoOB̮c+*B 1/|ZPHS$ ~PQ: 4bAaX8U"ye΁-O4xpy<H4UV&Dz=jq:*v%#ە};MM!KުlD#ճJGQ]_n 2j&k+!fhb+eY,^S7 K2n#QJA:ܖfpUc#.xBY=fF6]vUϳuzӻcYX`Ţ%0Ev'L#z7m$ni~jgi\l_<%-uu> Son-\kLݗom-!fsb}iWX6ܠi@ͭHsGren&k/šVYulr^oE}saR-Mc+} v v͓E.XnH v\2/|"CU 'MgY0FD$r9Oⱶ#!o%/{|Yc:.!icHqHim?k^ Ȋmf]{`]V,v&XUvڕ$b?Fd9/A)|ӻ˰Ktz)2Ak d]ٚ3! 1 w-{7 Fe ^a>hOJ󭰥텰6Z4<>t _C4+eC;4^gl1TvՠO糮\"{T$x 2 _Fт:{ |+*OhϢjmxJ9nB qǶ6+=fɃ30۰xk=VϮbwht}}IR۬ Do\] u㯑u9EuMCv+!l]rm1Hݛ3@%2|TیVn~ܑe7eWBLB 1E$e2.pyV;y2As X'0ƴ˚i v0]cHm+*V|(&&-8㝐EfcsX58ϫj $x H7^zEoaڷ]  ێ=M̯3d򤄘K!˸-xq`a3pH `>iEt}[aKUDUl9MţV6]ziǁc(:ކ]̡IZ ^x&LC&ҝ 1;&OJyڄ⸬ eX5(rl$XO/v1vOf!E*'bca߇ V֮J( j/zb/%z}wf|wUk KqB] 1 /yx_^CKs4*,"D4Xx˥|ԎՏ;ZTc3/ZdW;e!ذ*u4 .3ϸ`_`.PYgTA'%Ĝ^B qd+&MTUAp 8o-ȵմH04J'xc2|lKb[{} i鿸+~8G֧~Z'cH_3,4هR{WPA'%ĜfB q<xs9{ᏍQhZ !x{̤m NFK=BlL;pT:$Iz hcv#vTE~&KqJwKBcE/%8!gB q<ҡ! ߪP2D]T8=}1*s,V 8glf>>On䌅Ϡe,8gpcU0@3tQ5ڠ3X[ân%81ЗћNC k>>ckW8=ԨJ'ཾ_vVdiKm?}7] v=da OoZ۸Fwg<Ů3 m⛈%8!%';χAf !lEV[k%,9"utj$qiޫw6[k 0*.g:7I[lEXo{:V-Nc j޳xt ])FU*;G K'LJS%ǥkW#p+QKlLp̦.G/j\.~~!x) NcHJݲSn;^Dluxg[}( w>Ft$T i"(o>70#8=bt_lq6v4OZCbx8 []:D0 n.f>8G#m Y `( eaj#+J3{| wzz<hm{d\Hj:e#L>>UB q\{uQw:)Q7 ̑gQo/fo&|YQ!DX\$>9Ķcե vٜ3q1ǘ&eDӓ+cmDo6fWvqn*}!Fqz(oot+6Yv:cL/!fup0/!K ĂXo;ۭ"&)brs7gV@ s=tR3 \*3||;?ƘN y!8ݵհJkU`UK2v*z\Usu<b c߾o^H;;}.Fw>nQ!K Ƅ>_உ+uGqqrȒC 1q/dw3YRYIr#\*&B kkJm/iZ(ԍªݺXZnmBw\˕ T &b=Kny>O)nVcaQ_™-w=/IA*_":nC0]݀1+B"Gq 2ø0ee.ldGx5RUJcl0_֐Jn$F:*/;VڴJuu&b/.1e9L|s1q[[/t"G_("DIA0ܶIb/!8.*|3^RX RHFqc¶nus,k"6lmN*kmLRMznT *%`$:!8-p?_ᯫ8X5}f7+}?K=z7iIs2' 轹J%oNՏ;,kBe>a_DlG"j,lkɩZ}:_4 - o5mF'm}5"tT}nbc&C)o/'J51/k,kclZZ*`Kͦ8c?c\xpPiSk]yY|oW!%~~/Aĩ'ɸ[: rW$%6Z*λ{z#%Ġ,24B(/1;0_6Pڠv^ V.٬nKK9k6mpy>67M%zn-Oo\ & RgqƐ%%&i&Gd`;| ݍ):' 1qo>GB q{bلS)[>Lpk7@i$[LJ;+0( _~܆>c_.6Dok1[^Yf3ۅ'D98g%<fYD%G<ߟ !zYt1w˓Ū.>, $xKØS0P &.W)'Ĥ[OE&P|ro,9 ',,w5A1n !pZQ]A3_6g Mmww4•稊 E.\uw;4wWYIDAT$x ~(!8&L!j'k%^>~ç3EG|RX/nO>N^ I8ѫ 1[ $M 1+1(!R&Ծ~'E%}`O4>R}^4ٶ ]\/#tIAPB .f&uaV>PNJ`!Qjؾf>&N֍ 5 jc Y, A!Cʟg0~E&PUK 5 bJruK/,}Է*!Tڶ_WVi \]/=HAPB /Ӊ=py>dc:)13hv:kX$>QKs\ƮL(vkHXQ+..A9C e2.=3 \*\2(mpP"D6Pz 5QƑV/}D6s x;7޷*hHN$KJ&XїJM 1Oȧw3s3[ I02HeBdXuZdžRyvB<^:i"d-U+r6pq>zDHAPzeE^Jk//^rƐCօ1`UK` BpǨ0*3+]$\@pGM#>%ĈJ䂡T0&Byxd$x ^)CxUQxm챠F#Ej(F:1gA.I C 1ĸ*p}(a],V njddC*jj ySyK,N"$ ^ %Fb?Ro4Lah 8y e ˺c %<I ,82ni{jjw1.jXT!IA+n,:%00Pʄ6!IA+Nj<6QQ?ؤ560@Ѻy3d_y՜Z"$ ^  0r4 s,`E/p3!p\7_ i%B% zQ;!Rm!GcPڀu:ɩ%B% "ٴrj};50ĩ%B% p?c\娛vM)iz1nq]_J/TN>훭!IAߟc!zY$n?}=9~q}|P`N*+v\],|u~Xu#\J{rj$x ho7W9\Nb)9g! _l(Gg9Ntj+^#6z훫I ΪVr*LIA|`1||7m6ЦQr[/g iD.HQ7 Z$.8c٩3<(2"x RjwKn!|? 4AA9( \\I,V~3,_/1g#UZ3*tRb:)q"ễHUJԍsAApYZ<,jԍ ݼ0[Tz3[&IZ,V6k2*D>O|O%;3,k"( HAql60A޹((rDm[Ķ?;ĭy#k1fi/vo'YEQcT֦YUg,V "!a&#rAA.e1[oB]w_X"JYgQ3)f~RT[r8C d4{s$BNcyqY/AAl餄˕l uB-UlZbd"q省#B8mep}1'v"A5q}E _B)j-}n}ᘉJ1xLj/AAE.n.}4K@"˓X]Ū8?p~V,G~Ne"òpqjmox}Q*2|x;ՏǕ;F"$cڿ3QaD^  NMzY͍E6ÆYm:oV`ߛ%&U4"q_" 8gXl<2C\>*\>χlsWW0A  \T_f*]'uuQ*El]KXG|cþ'=,j(1*9c| brq[}Fue^nEߪҊ/nO۸*p})ojpP#˨,AA'Hâ>Mđ4jtT:xu`nK;oMm}ޥ6x{9ya^["Ua\r exX4xX4q ݊~+ .rwopu`D)Fs(mHAqzb Vm^w|j -J!4B.zX3Ƃ59Dm,6lmc QٸdcTeea+3.|mc 4- 6慏 ȂxHd|@BÌ  ~aQC*Nfg׋,2ЕQv,XPu7[ @z3ۅ8<=l)5Vսn&g#yf#RjHm`گ ы %.f#|w*JFC  3(lb@nlmp,x[uSLWFAŠ_Ew=mWn#qoi+Gy,C]g9F9^HFi,Zv` _:3@(hmpc/AA//=6_R^q`[ަpn."f*/Vƶ dY|]~^/ |b:{Sz~˳ud_h[,{;T/e U9F ۥm*7*FA ~Ս ЊRZ>ZF"7{Fw1r-_ǵk>Dƴu8ǸQnq$x xv#ۢvllXlƢ-gkB*v}dm9< J䂣Ql-jr΀ yks`#zkI. Q/B}#׷'nT+O;XZ 륖J/@g, n9F%KAijÛ U37M\p?E$|oT.Y-+Nֵ BʔI^l\TeɨѶ,m `)5ǷB`Do.'% YM+G =,.k{CD7VTZ:3-_JdG!b٨lZmZzPY(".뽻^v6Zc|`1||7%KAa:)C4V| 6oop޲ȽE, jmjw hm6 Q`gպ<~}#lYhL'Q^mM11rw8Ntۮғ =%1[AAUb1 nlXQ]/r[{=>)2lmnZHsؿ]xbkH_C_tl0jcu4<~M*Z[":U ~]H`*$x 8: Y#U(;fǿvŒ;6b 65 \r̄ĭ8!+>cH/] ~N4Aq8c(rѪʞ ꅖrB8 `Pjem׻^Cۄ.FU-->ED~"\I\;u}z7?7g,\Ӑqc6)&UL"/WZVyEx 8 Ue=%|41]5Vd1-D!EKTQAEާՍBJ>.ţW?t^qE[G^mk0_6vcŸ/{&\9QaTfW& B̅F*||7% (>Jc ) ]7&1KI/gEo/.j}f%cT%u޲p1ȅB]Ҩޯ\c`{iHm }5w ='KAQ]/1M\.ڵt2)5Vm"E"^PRXf3Z+ǔ'bU |GUQo4Y6V/VAM0riާT>C,㘬rHq}CU-[~HAq8km Gpjc\,Zhnf+[W/zUݶ%w>#}"8.lH~JD,|W5 _x_.f&#[F`(E%4FHp}E96k(c0_4X3ưϧC  ]d]Q |圭&k[ ZehOs- -l7o[^{kv_o*v}imye3.Zuu`mR F] cFYHA"'s^ȱ6룼^e!j+ZƿywSԍq8]S!^uu5C$x xJzm/o(d.42h圅o\/ fDz 6.n"O#x \/gc𺺂sm;6FacvnkA  B4-CTk+1߹a殦ް->'Q?[%ʌ^vjt:VWW)s<^HcZp7s\-z$x 8%l*9]cL7x/8:4@mvEpS_C|n,zEwݮ_"Jl5B(,Z,|Kp΂ _T/AAORLX,vE-2d^ Eoko Q]/|hn,xnqTOb@)r}l&ާnܙ1'<϶is ^  ߞ6"SFvLVz|#aB8cԆݾic>oחjku߱ΐ~aLp_]yJ  ' ADOZ!>뽫qm^D} ,- cw.a;D"n> uaj~]~=C  q{tRbT渟NI qC#6 }Q[Xg_iog=AIkAA m F*-h۞/nPNu] l^(^>>$x E{ʲ8\qcuTMHmژж؋ꮨ =.8[ "4AqTK F;=~^w%%z'乸 F*^C5M H\J:h3tIENDB`eliom-9.4.0/local/var/www/tests/ocsigen5.png000066400000000000000000001327011417032171500207300ustar00rootroot00000000000000PNG  IHDR(zosRGBbKGD pHYs\F\FCAtIME  K_tEXtCommentCreated with The GIMPd%n IDATxydE>FܛWuW - ("~0 ( ?qcgugDDqFpd>Phh^-E7<'nF{fqy{Ʊc=6/W,ߟJ-l#Il QIH9mYa'0`ł& dM pa`?r<B@'"}ꫯ^rCʕ+ֆ&+:T'? .袺{W㦛nj@ kXbK%i@ˆ!Ob(1)}/T#B(HU9HN;[S ^mdUJiWY{ꌙpn=y_R=H_;NXo=y 8i_g<i' r`s3l@H ?߈L#PU+]f 00l}g ?lh@`lٲ_+GuZZZd8.NA>7nĒ%KnX6d:4I@^%F*aOaē( ^H#HIii2NU@T )fPֈMS'JT3GgxtԀ%_/-9qл3P{n)ڲ[]0(5w Ā'/1vkЭѠǫy7|WFWW^ v.VZ;S;N;15a ۵zfsaD#)CgB~D s&L X6hPe,1e .&xTʗK=Ļ+q1c>>Vkcq1m?9FݖTzTo "Y؋J]b@U3018!Сm;O> )Ű~{\Sr^X%R RF@­-Z|]/__:<H4?NԧQְ]s1.!RH"AB$.]k-T$Zʐy̽{̣=oBң4WsfD ̭F*X?q\ތakA]p{G5v +SO=WF[[یcw3կ~uZƾ hJ kXvCvҎIB U\(@%T1?RpM.ak :߬ԘsX96@n܄˘lEqS*8xx\QR+b0gdΉƖJWJni0?~i\uUfHR3å^Zq7oތ^z15a {N1 pR; !$M?WЍnj]/*2indԚOl1V7:]g8&G̈́aH=L(f@G~Mo?OVvttxsE&n">iꫯnLL kX&S4*ʔi1 :N] hBM<("j j*XDxpCl3Tw9rx^Zw<0`01]ȡ\rI&NOH:i9'|;wlP kX&3^0z6o 䝛:v;^xh0n9H&Gkl: hCF@l9l8\WݬGy5`sm<|W|d]>SԌniig9-cҶ kXf _畕Hi/<0R<D'm]rI2ˮOA/c9dmw+8WR)BsG/$J+&Θoɒ8[lg2(Q2{!&fs":e+mq<@C`a kXM@fcD Hi`F-{(BDJ:ueTͨ) -Rb/ 2̭ sMvՍ1+&1yfV;.⢸vеId2.k{fs[EwVm.ڏO 1F5сh"lٲ1[5a 𲂖jdHVf'(I=ĠTuur`I+*H/" TLܨ1-M-ѕ%IIeQ95 e y%`Qw`@Hbې="0bz d86#9!N:[~LtP@cjX6b"j:ܮw?"HXENpBV"].$߆^l<>څkRìw8C1:&ұqFp/^)a @DhJs7;8dYԊ6)aNǼt[v; 5} iB xNfR:T*cKfŏWlհ5ll #ΉTPh] &lJr&4^OGr@s:wX98xʾ&۞qg͹;+#~" [c".Æ,"F|gLJgS>IisIμ$8n@HuN>亏900TcjXVE޵UKԜ[Z2f3R\ԌxfxBo0ưm0D1itx +'ެ ,116|#TVgDnJ C94g D!)be:IlnWش3Ğ,ZcCaX)E!%o8m_1 yɫa kX 1uZ%@yXws=K yISDҼ H'g ƴV>֊#)o *B΍'hk>͠ۇ//iM!A͟T9;[gGqĴf͚i6D_\Œ%KSa3̓2LY~HL70sBdr6wnb!2d. C&$PAV5bQ V$oú% 6tΔgud IfÌt1vnazB Ehh&JYϛ7oZ}Y&2|t+W1#8YgU)ݰ%$8bϹQ} " {&n]H Rښu 0jIaż&0K椐v.ߧۆ#gp'Wv1 nxckv u c4mtKRЋ"inTeXiV~ x+$9_!II􎎎ib׮]ۘ6gND8qYg!F|Atuua͍ 63s㕗DWl'5`Hp/f{9FLư{nJ7Ja,N]Նf ߙwvM.:&(q ʯOlNfCUJERн&*&A]0\ɳ[[[}73Zxn?w!}gy (DFUɥ"kH3G;Wr0j 'F9 SJM9fD`^"vF,Mll`n`T  VNp(CI16"^ @56 |i(o|1ͤV ŵ|ab읓.U H!2}EYM(^[MZe@ա-F@߰^8փO=_s@ UJ⚕׺' zʀ9ac_ v@onn/q4lL<=Ӹh33Tb\o$P0BeH乆z8Ni?(|^Z^ Wsf4=0n'F@&*f{c-Ü [ݸJH}>DKƁk9;V| *D:V_#\|l Nm:7l"O 70~x7l/+av A"g^$f'=s_( UR:tEV͘%13erm?hNs4X,f[uˁLJF ݇ {ЍI)>f#/߰"E<8Ñf/^1887.^lvV3]"B!`n<P  &7w>}sB:vjqwњuI(w D8_r8R#] i#hsݻD7"y@>B$^z5]$ܰZ@ cs߀wt1m:J̖-[ָkְY_\MG0[ ;#/avzP4`D #˷MިnXfфu4MzVL h5kX#]l)iLAe*A}ؓ$ڛ0Ch;E0gОu1EW3 Rr;S1I]wӴfv2 Su_Ɓظ[ְ'Ҵ۩Jh\=A[!(mŪ`7cS늶f猡DŽ8 } VًZ%^7(v\)Eu8^_GamДrqށFo}zhii;AT*X6a3M;iRL6g>**k1Ԣ26%jͭp-jyzYՍ3&mY}N%8@SJ\^ /ڋ 6Xxow1U DeHٴ~: #j HhOJw~41pֆ܋bݻttt4BO k 5 +7Ўӊ<8i<,e]*5#޹uϒjL5렻Յ(DBA H˶7*T!JK u?PS/{^]4SXg6q}ДQ4GSqҋB@(2R TZ)? @!¼ۆ"ML1k=̙3-ܦb[nwߍ~۷oPJqdY,^'p=\,Z(-䱬Y=~aǎr<Q^ɜ#J!͢+V)}H{ݹMt?a4H]Вrg4q\KzC8$]+ 8pQ`nt>Ud6/cժUu;ow;p$'z_f͚߿d|97<~nm<p]z^W Z\_pnY g}{^{ڸq#y'^xI+po}봁{[",0$$ u#/JgO5! |y~<aqkCN(9L] )±ޓB :S"3dRL" +x/3鹇sY4xْko[^j:-Ve IDAT1^b $R۳.[\tꢭ#jF! $v# %F|a"#RS_ ƾL f-?38:u]o~{|zj_~cR)ܹsK/c=|x?J)s=馛O~;s1{}s9x6gys-P{\BF HjP?V<U(nͯq7/ht!*~JM&J4 2a6IÓ[uXߟEm.// %'_gxƅZ'Ox7EЖujlAW9mw1Eg#pHE ; v#x!![s΀t@.D(koܧC'{ !}wq.Ev;s袋dZ>c{yxW~zaرcnj_*#vZtuu."477#JA)1<<>lݺ7nDgg'/S;0r]W ]E?Z^߹|q+O݁M/>S?}t/93:Gکb@Ipsx~z1uoBah;wlQ ґlinks0gҤ7YL"nlVrZU0.mWqD@KckHcFz3-\9?JP:PO#č3kg'|n 0}>P7 l6ݛ$U]Xh#{g$>>Ҫ>>HJ@))H僅T9P !.UӛRJwS'Rt3+(6k7M];w۱Æ :nww7\ݭsa\0qWKp@!{^3ƐfgXs뭷ׯ:x+WN8dr" [,V}ˉ:bJ&g܏t}J5M*&ne~1oCqGM J+"l] )&vƒ߸ңh隮{Rhz7JF@Ƶ?^ף_a!6=u0Cӛ^U2wQ@a=M'd\:)caΗ:lrD-}?A$-td9P9͑G7֞wL' \pOOϘ`>G??aݺuXn֬Yx_~ىT*[C?3n_2nȋt?ϫzu]]]裏~7i վ3"B6K/׭>%1a/B!@I ='1R)F) \Q ][~Ϟ1}=hj@H",=T\gֳ|ơ̤^djݒ%(%AJفP W+in=?3|G7kݐ'I i^R1cFc<&6\TDJ<@.BH#s!r/B sQ@JH#']N؜UYIӟ:cG1--A) w/I/l~WT=v@0p衇{zz q&}]s߿G@ZtSOşߛHq/~sGmIڳ>?~GŻ1#J:Z1]RPho7!v?d7KS/r1kɪq(t.%UQPb!g\ZkpNCyl3iE{Krd#3A_)}JCc1w[:.>mx_}IFYfAĪxǥkqF*)7vgh8hov鶯ikVzA{EsA6:t{݂/P  e/cL7mBv !xcy=ώO8`4t60q!_%٪IIR N}ѧ_7^1ѳms__d[8,88G6ͱegRPw" o]QbCYXՄ[±_1挃t~S\?$ODcp" B[ 0@NJXz_bVvLF-f%?Suo"eWX" 'wcwYgxGd6"9眃UV/Kիw7JSN9et"Bkk+2LiwP(ݧ ->L83G$m۶m8ǜSu $)HY <s?ZʽPܹM3TVɔzHZ6e/Ð\Rq& i;f;eue})i k[elt%_Wz0l];qpx눂7]߈%t)0 ^ l|R87p(Rp)7?=kzMwnq1->r^TɕI9|r4$9^ݜ@.pM_pbz`ZY#e:0$Ǚ"ג0Std.~5uk>Ly7Xtiw6>mݺ_~9{ǶtR](3SZ4L_Z |]1VSRQÏ;*o|m}odt'#?0aw EZ]H޹ .Ts\Vdi_׏J[Q94 ("!HM2By\ q͝!?E)b/&<9 5t.z+z_8Qj~anGZ.)B bOzfuΤE @SʅrMi4j<ޏE Nvq΀JvΗj%U#SE/\(NDC=T1p饗cشi?LսgAuk֬-zeQ뺻oX>y7k7Nzl@'@{[H)W$KxS\Q1 )IIƺ}' B/_Q Js!>ƹLp.Pէӡx4O%W0-Ϲq 0pDv@K=&@'C 0 0#P"t%^ ynˠ5BJ.$>W2# 3풏1ݎ@eZY!#D%\SJ10PPʼ8&Zijo|W^yeMU'csLܑl d/"oߏ~x@`- IscY + Z\gl**l #6uf5<0조}R ZV`ub\['fZkN t򔉄hPBWm017ƴ0Mu7 pHR t/cA$/K*,Л@|\&\6/-Iڶ` q L*E HΠg oq+cJfUkx%DEy䑚m'br뮚<;L=|{c ˗/qq.S[6Փc-Jz:(f)OnGD L/rݷMh=Ʌ.eB6FzkgqwDJ%;--LK펵!M 6FS#Qc )!b #DHh%v,`URt l =+^gR iC!K`ɸ~\׵'HC34 .Lzl:H7"7 7w2" =(siu,$ -MN\+*L\.r4"LCtA K!p٧jOXwӡiaT~wX0'  ] u^\H d9a*$RtMsDUtV:c 6?ڎwxxf@vꩧbزeK]~g[nG vԴ_XD.i͵鹟ri<=d;IQ`\/<:J].%v7:|n34;c^)Y>Ö:!wnc^}8#z!j/ǯ\~_FOO֭[7$W}Ŋ5ȯJĘ\ / w'+ ڐ/\uf pm [5ꪤN݊NZڝNڐil0#l&ÐTץk=? MhM5B$e, \a`8@hKcd?d<:83KDz 8uɄf<[xG};v옖_6;nA>pxy+Xp!Tk[Z" c7d>B1PCJfKD:o&W=r+ʲu% RAeBvBG&טU7 bH[ ӑN9I!!" \SyG!e&qVcWJ°\XhM6q:]ڧm.^ٔm9@O{hRC9_was8.$p0P%7; _p "   Mn<b(bbMv v2Γ hgY7V*s)%,P zZsM{#ĹIx4XɼhjZ45{d\H!єv0= Z\DJ%]lj% ^aC}EP^BAA!_fs^r9o ,'?ɽ؅ojjX]s5 8X|"{Wj&-Kp%6mڄ[u]{Ν( Hh8H_|E_Q O/-[K`ظqק^ a}[zh=t! 2f0-RTuޙZ׵xts/׿rF{R} 0RjˑҽTK|R*OTUk^U \u[rȦ5@DR%5"X *QѷXYu]˗OY?|wx1Ҫۭtz衇peZ/qҥp 7```o֬Y>{۷o6ye]ۉ/ wUC} 5A_w{.M/$k BZ$t>=R HJxFM%M eC5`k*Y{u `|QNcuf/%Γl>Lk*&Ee =٩U>I"'cThU¡|0P+:L-Jir7ݨ:??=ܽnB}rJMyZ裏c=p8LT IDATZ{3Ѫ]*ݍ.uQ"WoGol8^ל27f,\u5??(S:N=cGW1[W]{.-*#ȿJRmIOLxV$UwnxJZIU͘$q}zg D0^a*H_T*堽%~dJg])/JpƐr92)t{hįߘw*tr۪2y{pM7᪫kX|'J;#*L\-܂}c3 LcxWHzkMKiN; ?<?>=^mו8YJ S D_}~oCk_ [nvXdkmǐnɸ4-LJdrර)k"-2M0A2m=ŜeA-]El>f@RN l詪ImqϦt U2lboDȤ9gvxĦ9d3v xhnrrV0A(`{LHcu2AV S5 1⮹<3;Fww7믇yuƽ޻ po} _~y܊r /oyJcvax'ws MFT-*&JRZ 2m?|-+N㮟?C>G!DA: m(!sA iEF)LukH/\h\cf -Ÿg\x{UMg1>OgΝ;---VyFنb" dd !Ʉe܍ @Kqބ;`@K{!s!r!G 1`Bu}(c(b8 +DCE/қ/:r DBs]MI %:TZVG%Io3A}j^};p&PGc0 Zcm "h2Gg++JVi>gM-?ϐPf7םۺjӓ5 BٖрG!F AM 4euḃcEhnJ!\_-E6o;QNze^)!/k0nkBw}7n~pI'aXp!8m}oߎ-[]w݅'xbZ&K/,䠉_җpmz gy&x]tY^a R/RO K~{_s77k>|?*y^\*DQ0޸P)96G.%f$f^Tjh9+:HO" 볅HZ2D6Bm;rh@8G< x'֒ iaN{4a0sەR=} R ,b [BJÄw*)O}~쵅 Cݍ&Ab^lذ/"|ߟrx0o޼6|r\wuַU~a̟?k׮Ŝ9sf~SNx[nEPsW_{bVn6W(U f ,f}6w9q–J3iHh6ώ~W~u98#Ԇ {^W/" }aXD!B/fnDKRt,:݋1'=-QNnf^s-!۵ =ןy?;7G^m81cAP}>PR9csrp1L. P<(<.I96;[99-3 HyM)4D!vcfxiY`,]AH'FoC1K,i5a)ޝ*u퇾uֺ L՚w^w[D?{oYU[_^Ћt(X1&(&$1E0Db7B`ڛWn;e~r9Wfޛ~>wޝSZ뻾%p6 ׯy睇w]ظq㬯OpWK.m#p +@r=.]tѬ'>⸦i:oG)Gbs$|4[YIeUҁO\HIV|m\bjjCoWq{L;5Fa~'`c,9E[^:#Sl?@}d wJ}h1- +|,"`ZTM0=ːŀܽYm` "q< I!iO1  ns``Bxf jT HҬ♳~V5!D0+Sۺ3j~xΰ|DQ -__qgA'$'WjI?cʕشin =\|󟟕_vڬ'p~-n)K=044؄*݈Ȩq/KCVMs:O8X*hs#cB3SYSKOG{5q߀U?|_]{vnǜ^:x1L/e(ƠI7^ (1 ċ< j-J$/:쯮F0l.XB* % 300 UuGgdz=c#u4Uwr0&ؾ=gAYK_&S܃֭Ʃomrז? = CMo<{챳Vy7"¥^k[9w[0Ok6l؀}VHZKO~rɏO9眍m۶u:X 6a5 _71:2AJ7ЅysSՁ 8ՔK8WTWbd! _iӼ~uǜJs%~/^}8F %cDdo]'2/@uhxX* q_݋1X|-Wb'GJ%g!g!̇g-R;9ATO02@5 8'3n,[cfJx%*T˥) /v.\ˬ{u1H)ub<@4wѝoѿc="$cg0tpӕ/[x9`Zd;k>GHةqS;7)NYepe?9gn٨:b2Q,hT0ԋ/_|1M?OشiO=T\r% Jmsr!;/\pAW\"U⡇e]Ѽ>MozӢen};yF^{&[b…fu#ڢ+rDuA?{%x9ip>\3L#0̱bB%kH2Euh>y'Az;V;}I? ~FAxEgDt]QQױ&NF/^fcʗl0X1@9vLu0ӉѬW̼0V P=tlڴ > nVtM[qwaif lp {?O);z+ǖ-[^.wy8餓Pv%?3lX~ < s g BS%HS$M&g8'tIu۫S+C2b2f&<L"`ӽ5 ދ{n嫦bܳGXsݢLkt'C`⾟7ycAbt͑h.OSr|'9L` c\+1xF$hPFfd}^ -w<c8h %AI@JB js} DoJ4D(,K` `X6>jR$N7A/9ȴP&8g(N>\XMwT׬Yq"y Ɓ I뭓M+hJJc"F2B]|E@ܱ|$?r۫"Wq_G\'Eoy*@A$_Ons#,*t_b5/ªeb/~\z &EmBֶ7?#!~_’mL} sY]P|+qW^?95(G#bVFh^+rխ1% Zj%4|VBj *k3I$Ejq4$2!j nFJĩݺsOMu0:0c:TBN0T!%] hϟu#301r zV&%rT8Py=o-n%es+ꢤUg72[e& ܎ 1Ͻǩ H)KS+E͢V]f"TVgoG4 +jC0Pt=yRZeZ ,]:ZV6uGb/i{D61coMI,0lzf q) =TP#& VfN(N02TL׭;I$(c JИN7X0njjDqJi L'Bus)0׹G#VmAŀ+<-~} \(lH(ȃ5"rն"2SCJ[iU[f!3(RvpIjiA[6{յ}!!pw#['&ZV+BCF5P G" 9Tֳ`u%uF &gFB- QV Fӈ LMuybϡ^5=AQT%3Aqmր<;}K>X򁜼NGz{/J@0z-Z@n.x/luYy?ڷy/X\ k!XXxBJ)f{棲,we8/k%%8 IDAT쪢lFt#CyjFFkX6T ` q"%FRz ӔPzzzR($~&)$܄[8?wDLy %$2AX6pP9)(erV[a;s$,DgRj8Vү=U!c[6Tdz2V-t/3(Vҽ땅3V2D; ۄDh.Kr[C :g;8sc@9z͊cz5ԏY>#k3Lb!p'#D^枙b:Ѹe2X#(|ʓ?"*|,#W!bgaU r}^2rкeKdx[oV2j@wPEk N^*EY|_eȽ.S,s˘7=oe>W$0v_Z+^)%b7/]K;yR^s $nǪʉQ! (X^F v⋐i|L=: Zi*L2J`LkB<sװ:*k/)2)95K*BQCsk=V ѹ쑀ct'63w1*P=aө@:].h,A][7J (m-*WmWؼ*>/\U6ښy2)2dfn{ޮw2>'oKx*/&vqۍe$Ѽraַ]zxVD9^ d83| B-wUCt{18(тJI*%i8C% )f1:Q$%jN9ƀg BhXTi^E{ds(7y$JYe|mkOPzj0`HS鄀 CB"I$95v(Ҽ"s+BkU4s%Dǐ]T N5Z]4חdQ83((Nq|w碆򬇟;LY^VHʥ̎Ge̺qӄ)\.vKe I{5ƚM\n.d 2)M]*[es;m[;r,  T GƼ4`Щ(HZLo)o<uq)#=D-: 1l ~ޚ^-!s=Po-CQC^C3%ʄ`Q4A ε[0A g I.Ki_lkhorO,wq`llCuG/D;Cŭk-;E"⁂ @8[[ouLԬ4[V_!ڑ2Ih@_emM &;˭ɢꠝʘ)6HSygn?/qy*3tJ`+bE&lb[˨й2w3}}*bDbWʟgBNJAwmxփOo@ڝ_þ wؑ-bx[~؆'`hKYYjE^dꇱwe}q1:҄$B'׺䶺׉YyBEBՙ:9Tv7T,pRȅڵ\pBKNPAΙN*YE%<(K-fVvJF'=LL_3HQA95|@F,*(?|;0=LI^nT$51d6'm(= sk dA<7V*iw'/1C# Tm}wIDԻHeMblsHD>og`l'5%z `F 2n`tF9D݉jFb$.J驙 s/B:O:w BH c1lX V Ca2z(!ڭt*0X8"PF A%DV+PRaZF i*t],pc4`u)s(#Te\!}B7lDzo YWT3kraD)3Ur_`6R,W4ARDZl ]/AsRԌ) }*Wgۤ\Rɍ}+oʉ m[#։I1(O,mU*tin"lYٹH(a/}̃?p\{꾱,?,"gcr0A+DN.:^#aZU0:&FGjG7J\S$I!RݦL􆥨TBqBX K$L1A#4)NUz + aÚ(EHS=έ9K""5SVD@Zj֬Gغ}nf R8~rC{Dz1$ZsE*vjzPul0F1?L}03$1XMk*"a*3 0 :1z؎IJMկl_[IsU@ƼH)(@F(9q'0{] G7Wr' H Y{%Q tHF&sr(gœ]-Rf2Q0A?C8HI ,S)b(k6|p^Gh.| Wi7_ GR#<<=헑v,RXv|&CuA`|qtt6"pd7qYbXMnjHkMZ gx>wDCry|ͼ*gތCrS鬏 VJ˦2'/;cz&T'ykdHWa{wq>^_Ƿ/k8g",1*jy1AzDsk\k*ddV?(gǒ6iJ<+Xw ihq~-_ qGex=8rRI}!r'%bsut:psmqT*0@3 N!7l 0V!MSD"cfd;&YHp= -v58Md8V0״8NjwR!A زv'B~ܺ.z#È4/L98FRCa-Tܳr0Wb!ŸpϽ 8 \)лoȗf:\FH#ߨ#yA3ɇ IGgu\0W* ))3@O6q)I{'i;0eD_/ٍ Y`wj5$'7⥲8gXR;*/qdayZ/^4 lޥp9!}"RrXta&#ahctY6enFR߹^v_+c06nQ—9"(]QK!Q9KQ8C7Ji"ؑ׻XI7NzfgHH#Y*$i%q턌$Dk_C!T 5YE=n @CP01ߝN33]DQ7 D{_C?N$h,ZNN 7),&BŨ7MTh V۴\*";GNȃj 6YEpnP){^(|UX&jr0"(b~52su>z&ZF.4,VS(bpкeK[┃ę iVi$CъKCL]P^2BN [9cPb8/ 7/l~ei* .^R摨rp03S+e&Je@m{^Utb&xmS};R/-L8r gg {rRV!__eR%˟s C~Pp7hPNO#V%D=$5Ghpif*H210E*acjCHV; q"DhHTd+;50Zv79*lZt"tj04*aƹ)qA^"1Pa@%q3Jcsp=Ҫ|0nfU.AW.5l_յFqy$I035ZZ4 qp Kg j,0=5y<9Ľ:^nd$'s\RPbI }?דEMg6eIyQ~R ʏ5K,do 3VIEfPx2Fz(.2>M~O)-2Y94f(O,2)c^}" y 2_A HS.Gr|eiΡBL0TR.UaiD=STCig$M$if6"7aCc`P$ˏSR DBE#ҁCRJ Q­̪a}!PjPo4@&[e~hMVB4MvrudYveKNfa""zvn ՚>&4Ԕp7̄A xLҥHI3}1H70⨇$3TNds+mmAZ0ƣ N')?kT,X1E&XV2dv-B`&V8(B8md2$\ XT=1n6ߝO(|D@+Uf-Z,V~ˀ29QEM)os- 8Nr S*Tg}a]EA>WS=IRPt_ׯQW-S:X;. z+顏)^lTOk \gdJ/4GO:xfer^y$OK< 5 1jg%QJ~T+ϥdԁ 0+EMSٖT]$iƻY0p-/ \)-c@oTuq$?OJZ]0DZEVARqBHq8%];BlܸI"p}B*a s*4q/z=}Q7%ޮ08=nBͺR݉T!lP!Z`al<$iR"zHؑ3}G ek4CG코Q|׼bY\ըB6W\rN3ۍb.P4Me<OV6g QY֝,gu6{'iP~ex( <4G2QO(EQ_[iو/ԮJӮTӬ-)0*vE.o8J E[eT#a~/`T Y@Wf,^ ځb.fF2=J=s稒bX;8TH8* :h4Cq$ף{&g°CZV;ƒnCGVuT$ BI $Q :̹ jv{]AbNGOeBO4kU 70>ĊeèWĩĎ%&A3p%Zn[. EHar g!jg~PdjB`~V [?-OaG^/ξ'ޙ: E C߼aBޠ[Q6)PQz7nF*7b) ހvG\8^$I eIbzۙJ4B'ڸC#55yrZe#ZPD*y3*5P[2B<.|^-$ٓ]}pyM!qq `x J4Q~=)ßQ[b)lϮ2FzW󒶩koڵZ 2 L;ʢ(獝7 %/X=jx 1 -&7!rbGƴ72T"183Aqj Cr)0犹vQ;Xrh).wLQ.'`FmVו3| DX lְllWQ0$@ԋ|G18nI2G/%40Eq]ʷp,t9*J Ïc(ECJ"sƌ>e=3{IdG,kED )QaVCjݏTA&,jG9UY&' *y-%c (&cp'0ܮu<77LB;/ȴmNks-I\N')/ўNB Bψ_4/tp`eН*dk?^2(+]hGkvj {VlbDpAxK lhkQ?FY[Cj9GUUo(-16\/ r]|\Ey࠵zjT(n7A%nƧjD2 '.8x]=?z44mU*^Ʉn6 pɍbq&kxўqR /g>)'EJL0DG6$g+afUݞ)|eSYZ^E8\m*ma`Hq_1zGФD3_XHz]1@< 3'R$NыS{ T^$HSmPd+rsԋA"1AXq_LI0 2Ƚ͑*4.lTkU)ܳUub*3/@wK3I|Je wiJ2;_6,fyfQ"JC.J xUb{4VƾqU'~r=Ho~S)oPf2Ğ)j ZDp}֎QGGlz'kYzɳpӎkK誥+ Sg< g~4Cqɇ7=$G,׶6:T W+~#I<qƓejkV/? j}a"Nw 觿g8/J#e'[굽r1Ԭs »??TBmз-ɨ_A%E6qcM^RIMR!JrNR*.(VE^EarG g_?覟܌h+Z&SL{NT B"N$gh#q)#Z4 ԃWR"+ibZ7nk}{4|`([s0x@xC̘BAe寯O<(Fb ,fg.KmuRwv)mԴN:?b6MLS /ڟId(wr" R ]tq^>Nqw_)09YrgU_k7_emZ~x4 ;=R +boՊoc7qٻ-:+Pt/J{^JK5qiKO7ӭ?qWnF7 ~ypgC{jrCf9ss˯tH$ӜH3=*: T`rN7B$BhGF%s\o] Dij'ZV⹤HʽfUXѣpuX9_:& E8+q},4ea9mN:$ UEԋ1Z]ԡdO +:k?DXDLf|m77y;9ԪY]Rte`ޥjQE*TzP\d."܎ظ,x;fA_T,P`> f(tO~apg>>ٚtc;&,}g]p³wk\x 8u'ͯ7^?- z{=r#t0l&m@X6wo^BA܎K^ Acb %]K"#iqsH^  q,PB5EwB(%,9+[uaGt@V:b>Hi]{YVcydm< AFecMC)Í*l ?F29:TPHYv Np()D c gx`ǘ+q]$ӴXx%BB5{Q"M]N{Id* (SwWeu SmlWi]wۑvL4'VIiyK[ Vd^. 1嶙>G+%K}[uY*ߕw^Oݏ:l-fzH="lzhnך v̧5sыO1/K8g:=\t ҧ^/ rz=}|WaxVTHu:\[@Fco.;8Ϳ^eayݛc`^|sp7/5z9]߅X|_R<!{M ~j|?Ec^<1.'A'8hcDxiG_F-Dㄣ7_^y ew!tE46Z)L|cpɟ]~a?0\_VHnFvy?W?K F>Uoly<s:Š˜_K v<0!d+ƛכqOb#Ynۄj5BkDŽǭ.^K~9ڝ/}c7>kYv?%Ωx'Ҵ/\ыk߀g?pLO0ӎ2RRfZ]c]xYVEk8!Ra[x֓y ,_37@űGq>g!C*.Kל(vc+۫zo&n;wO"|I*ЋSŏ}=V,4ЋZ&"lS7?BıpNz!"o|:tɓŘ|tfh:vzE=xHV'N= *L;FgE``j`Ys.? Aһog=N*d/*Y9_+s/OK{1GS]bJfft\zp+p1y%Qzw𹏼xS^jz|O>wD%}SJ!M>lk^D<}fp~"Rn #IXx\K<]PDjV!J)}z\p x)׿W !qe~N9Tbxjp%ǜx ڝu/; ?xԑKpO=Ǜ HC"g(qf$ێ'=Hg} '{Y|Oz!x  Rl&xQ꺛go|֮ŷ'IdP}$:S"EFJjgxWԓ[MLM:݋0x_WXr=8;V>9p57|O8C8<@,zE}/Ͼ&|i4w0Lq{ߎȥHDuOG☧瞌^lwLáIYx!Cx[i?_at906q>o%jc# \'O!‘C[Glbbw+nat YxmV}Fk?ypf3|Yv^^l>{՟z~tk\^j[ `YY`psAC!s0(#cN+Oh  q"G j u7‚ᣟ.X\GkQ*}:|?mmsfۛ/=7߾ alW\ED*``X|m\/:Wt"\O/õu R*~L`Vqӭ=o=o0<\_ίi] NZa͹{? &ŧb+i>ş@(ux[Gz\yݍxy'7߇]iKIH&z!{;+\$Fg96mB~):`nKPxƓL/~11^YĽ.V7Is(ChwSq5\6Z8Ro`1p1kPUVO^/w1<?'T 3|9Qx_͹<=wo8$eo~o~qGQ/Ku E9xƓǓGh4wtVѭZ#35[s~1nƲ&^W%x+7\$(MZ{ߎSO9|_.{?-<ܓp!i@ bau?.} [W)X` ӭo㢳7{'/ <qB)~Yl=Pal{7Mbdo7݃fj+ĭ7AB)ţiqЬx]=P֯.aW߽CC``F od ${AX|gQ/kVE~>Xŧ|Negb+-/hTJ:e ܎ˇp+q[dsk'_w9C8d-~mxsN܏ʀE<r/b.O=e#v\R8еݛ+[gbFKR q"06RQJ_)>ЃValݻm6Pz8^kpƓğxŎn߾V{>`Wv |^,cq 0@ vA~[vl"c.lzh/[*$8x-*^/%{汈?#wĉ[x£7Ww>[6FWxtɹ}i iCIUg~ hw;(ιCVh4f@`  L1!/#/v 8yĎc,H,1ap0A8b{֝޺ݭ'֪Vw>;5\|6ۧimɓJ\~g$i,9{*wbƆ4\;>sO?iV,^"J*"bUHMZ?]ayGBJH&5W/f՟ ϟ;5˶혺v47fkF4 Tk#t:aKC u?thIY<-xf|ֿ29zǧƛ炙2Dav xɤ́"6G?{Y2o*7~a ?+;ض7pL^޴ztdiU*J)5}8X I_DD_f)nR\[y{#x|bLypx1s=oo9ٶʀ,‘#5%2GW/2U71q|?AϙZGI˯be? ֌+ֽ]ע{]G4)9>Vssݫ)o˪ u}cYGpo:yOa.*;h̘vG;3BlC@;ET:59QM4R5[9)t]c[~yO`&UiZ$tJ֞qXO"46;^MR0}xa㛸D$9W8w&|GZ)99KSCm;DrWC"}ƶd뾵V,;_?րJz2 lHxJrSٽRȠ_oVN'7_;zKt2;wX{QĶd Vs,k^63H6dzr"svYd_z,7)?>{z!"&t_Q]b}~kTL<&b3?7չhlv;?sk~6rFGW9 O7飞Ҵ4eY#&gXXҎ!,:c Ƭi;c _} |ͦwqva%su"P#W5o׶]]s(,zPs k K.8|aR[ꮰmg;J)Z[-{\mm`뎃l޺/Rx)3OivGLg76呚d<ݝ$Q$ҙ0&q=^ܴ Ũ|wFѲӸ5,[4Q#:xdzg/˗I,7'W埚3 gI[/1^޴ m̀ S'6x6.O<;xT[(Z-lg74toT-}ӯh:œYwH&U:GӨe*H\x'w뷆-8_r{x71a=t"zb#fwycH8oD`7˗"J̔Ig3\9;nF{K. fs~S\0ѷ4!:W, N@#`~9ۚYF7fuՅA2:?wݷfst1A^~_| W= T n\^^o?SGnQkx`&7=GZ?qȤ+]8 y[!7]U/cbhyꕣv5{|n>Ϝ'DDU }{и:V,b|?'5H)x}4X|"S # [)É)݀WɣaB<_ڒs,;3Nb|(ԬMY-QF賟#~M \ NӸxwwږnXƳk`Ip7Dj9ݔ7_ӿ} :s01̝=s&tT֬߂U-c, sJ W]6G-0 .<_COlB7@^/$~* #\HRH àZ.*ĵ*A =b7 ΎQǩ`T>)S[ya{}J5{R6dj>N`՜c+MnJ"KaYNX_rt{5hG_uL29Ϛě\%euu6ɬ'U 19ZFGumٲڏCܐOxd־#%zAe46xׯ)T6ʕنQA>I4),F&CAczK)5 ӠuLV(3)+AoڵcI j |6{_w]kUs|&4س':fsS_>h3](Zl0P [[ihlZ!f{{"yv 2e,K@ %47f^<^+ҏqڌVye~pNo5R^ =J#UlFF2}. d<#97;GBQꈾ/*$xmo{ ä\uvxđLA02U&a a0RG~͇?6#w~{jG:nsa:7b-x~sԓNlJQ)`d-oޗȓ t tL O}w+}{RJT(ͭJKJZ: jBP-Pa)ܫD\XuxUL3-k#L; MjzO1Lj#FA%jQDxo^ _L S>B7T*$-'%YՇDNvBRO^$ J1LsPRӍmU tYZ?_.D^O ]. ŗ2-勷3N|b8#F1_:&ϊK$*mg;z=zi7ThL1 ۉڡ֛u}]DkA\ kԇF֚F*cTc#Q,QGT3~'n`&ARQ|6%Mp@cӛէP_ bB#F 6Tu.RiGR|X%udQ%1?.J^Ƕk85 ۲>1-vtO#4X*ihȲ7L\DZ*TA"߲1bĈc06dcVb!R$F2z](U8ڈĔ~ؔ B>Y΀:2auv>Ȟ{44P鷿z1b8.UD\:BࣄHR*tͭhRCH5=f$ >̈^y)&NMPfXjoaz1bpbPJ:6tijA[].–u{jէ1'qg{j5a =F1bXRT.i*eʅ°d.$`&uL@:RHbc1^ab˴;.ibff6l,@7̘cĈ#Ɖa"jU9{>[#}ײn$]$6e5T6,zz"H⿫h1bĈqVj\>bu =CU>F"tjfJ)LMt jKJuVwa?b1bĈ#$sL>8h01MH4qmspm\@(_6樖7SM#$H0ixr)mq]L( !q(hW:uS1bĈ#FhY0 DT:E"4t&|PZXM ܠ:wzi$3ry$L˜Y:;Ktwj6b S%!|* BN%56θLj#F\Rb&3i49F7$a[R=Ra=KmdT*R4<URB}\)uX3({"Vu` ye#F'24i M0Md*I!KkK !)Wm: py(3: :^z]W)ع}w8NCJk !=rySWm1bĈqB)Hn(R4D I8*MKc(Ul<eRYG74\ah־p=,?V肧a(/UvJ)t ,ۮ?(1bĈ#ƉGkꡭIt]44ITR'af7 "} !F6Ry6 B놩T&N3axf̚Jb2d֟tx=F1bæ1$Ԙ{lRX58/ȢqA}dԨ7pmM7д`q>.FjLd:mc5cDP$ITwB_JB{1b8 @ < 9 LrhpǼ-Dܜyow,ֆ뷓$0eeeO{zu8}}}*--5L.… ˖-v PJ}W^rX}KMZO8}aO4(a6[$q^qSߜo[ <@'O]q*--KKfggwvvvvv2ׇasرǏ{G!<Ϗ%WZʪ^=[5-NĘ1}{=Mӫ6I%f0?!-^1Bg-m7׷D~p4}rW("ŞĎnT5J8dbA8mb9XGb3GSul 7yS|<%H)C)BG]pᘍΜ9 CE1)))_MMͨwﮩioooooG777^?q8-'/ V{91rESo&G*ߑQhDZLdE71Z0g>|hTKʲls߾}^t:Y >/7/BSSnwGGGss;Ο?Դr1-b>(!չ~MȮzxc0QE"0<%z͘9'}L,i6R!̐|O8q[;R{egؼy+²앯XjՖ-[******Nڵk333-0 ò젠Ej`P.IG>2*0Ʋ4I54krSƩӊ"( KHZ~GWg1Xb ,Ȳ, ²lvvs=W[[;&GYxq4MKKs\ӦM{LQZɴ45Rj: m+ƴfsSfGbHpTJ(IXG6(AYsFb7NzwX&̜)9e?C,lcg[^HnCYMNlX{RI픒jv'yEB|ƴx{h"㏋h۷lb e,8 hhxg=pð'럊HDQ1E$=U/z}kVY`0pG)(3Ou"}'po>qC\ YE>mKXrLȚ)#&+zϓYP(XUlqd&F$I,J)bŊݻw<#/@ 0Y#.J"Q-,BTb(1EUc 58piC/r֡e#K file hiding service It works: This file hide a service with the same URL. eliom-9.4.0/local/var/www/tests/style.css000066400000000000000000000132541417032171500203610ustar00rootroot00000000000000body { background-color: #fefefe; color: black; padding : 0px; margin-top: 0px; margin-bottom: 0px; margin-left: 30px; margin-right: 30px; text-align: justify; font-family: Verdana, Arial,sans-serif; font-size:0.9em; } div.principal { padding : 0px; margin: 10px; } h1 { padding-top : 1.5em; padding-bottom : 1.5em; margin: 0px; text-align: center; } h2 { margin: 0em 0px 0.5em 0px; padding: 1em 0.5em 0.2em 0.5em; font-size: 200%; font-weight: 700; clear: both; text-align: center; } h3 { margin: 0em 0px 0.5em 0px; padding: 0.2em 0.5em 0.2em 0.5em; font-size: 100%; font-weight: 700; background-color: #3860aa; background-image: url("bulles-bleues.png"); background-position: bottom right; background-repeat: no-repeat; color: white; clear: both; text-align: center; } h4 { margin: 0em 0em 0.5em 0em; padding: 0.2em 0.5em 0.2em 0.5em; font-size: 100%; font-weight: 700; background-color: #3860aa; background-image: url("bulles-bleues.png"); background-position: bottom right; background-repeat: no-repeat; color: white; } h5 { margin: 0em 0em 0.5em 0em; padding: 0em; font-size: 100%; font-weight: 700; color: #3860aa; } a { color: #ff5555; font-weight: bold; } a:hover { color: #ff8888; } a:visited { color: #ff5555; } p { margin: 0em 0em 0.5em 0em; padding: 0px; } ul { list-style-type: circle; } em { color: #882222; } .emph { font-style: italic; font-weight: 700; font-size: 100%; } .clear { clear: both; visibility: hidden; } .importantwarning { font-weight: 700; background-image: url("bulles-rouges-fond.png"); background-position: bottom right; background-color: #9d1010; background-repeat: no-repeat; color: white; padding: 5px; margin: 10px 0px 10px 0px; } .importantwarning a { color: #ffff00; } .importantwarning a:visited { color: #ffff88; } .importantwarning h4 { color: #ffff00; } .importantwarning em { color: #ffcc88; } p.warning { font-weight: 700; color: #882222; } p.footer { clear: both; font-size: 70%; border-top: 1px solid #000000; margin: 0px 10px 0px 10px; padding: 5px 0px 0px 0px; } p.footer img { vertical-align: middle; } div.col2tiers { float:left; width: 65%; margin: 0px 0px 0px 0px; padding: 0px; } div.threecol1 { float:left; width: 48%; margin: 0px; padding: 0px; } div.threecol2 { float:right; width: 48%; margin: 0px; padding: 0px; } div.threecol3 { float:right; width: 32%; margin: 0px; padding: 0px; } div.onecol { padding: 1em 5px 1em 5px; margin-bottom: 1em; } div.twocol1 { float:left; width: 49%; margin: 0px 5px 15px 0px; } div.twocol2 { float:right; width: 49%; margin: 0px 0px 15px 5px; } div.menu { margin: 0px 0px 1em 0px; } ul.menu { color: #3860aa; text-align: right; padding: 0px 0px 0.2em 0px; margin: 0px; } ul.menuprincipal { border-bottom: 1px solid #000000; background-color: white; } .menu li { display: inline; border-right: solid 1px black; font-weight: bold; padding: 0px 5px; margin: 0px; } .menu li.last { border: none; } .sousmenu { font-size: 80%; } ul.sousmenu { margin: 2px 0px 0px 0px; } pre{ background-color: #d0d9eb; margin: 0.5em 0em 1em 0em; padding: 5px; overflow:auto; } Div.camel { background-image: url("caml-bleu140.jpg"); background-position: bottom right; background-repeat: no-repeat; background-color: #3860aa; margin-top: 2em; padding: 1em; padding-bottom: 100px; } .camel p { color: white; margin: 0em 0em 0.5em 0em; } .camel h4 { margin-top: 0em; padding: 0.5em; text-align: center; background-image: none; } .camel em { color: #ff5555; font-weight: bold; } div.news { background-position: bottom right; background-repeat: no-repeat; background-color: #d0d9eb; padding: 5px; margin: 0px 0px 5px 0px; } div#mainfeatures { background-position: bottom right; background-repeat: no-repeat; background-color: #d0d9eb; padding: 5px; margin: 0px 0px 5px 0px; } #mainfeatures ul { text-align: left; } .news h3 { margin-top: 0em; } #mainfeatures h3 { margin-top: 0em; } dl { margin: 0 0 0em 0em; } dd { margin: 0 0 0.5em 0.5em; } dt { margin: 0 0 0em 0em; font-weight: bold; } div.encadre { background-color: #3860aa; background-image: url("bulles-bleues-fond.png"); background-position: bottom right; background-repeat: no-repeat; color: white; padding: 0px 10px 1em 10px; margin-bottom: 1em; } div.sanstitre { padding-top: 1em; } .encadre h4 { margin: 1.5em 0em 0.5em 0em; padding: 0.2em 0em 0.2em 0em; background-color: transparent; background-image: none; } .encadre pre { margin: 0.5px 5px 1em 5px; color: black; } .encadre em { color: #ff9999; } .encadre pre em { color: #882222; } .encadre p { margin: 0px 0px 0.5em 0px; } .encadre th { color: #3860aa; background-color: #b8d0ff; padding: 0.5em; text-align: center; border: 2px solid #3860aa; } .encadre th a { color: #ff5555; } th.row { text-align: right; } th.col { width: 33%; } .encadre td { background-color: #6890da; border: 2px solid #3860aa; padding: 0.5em; } .encadre td a { color: #ff8888; } .encadre td.empty { background-color: #3860aa; } dl.blue { background-color: #6890da; border: 2px solid #3860aa; padding: 0.5em; } .hidden_widget { border: 1px solid #99ffaa; margin: 1em; } .hidden_widget .overlay { background-color: #aaa; } .test_title { } .test_description { font-size: small; } .monospace { font-family: monospace; } .test_logger { font-family: monospace; font-size: x-small; } .test_logger .logging_line { display: block; } .thebutton { background: gray; border: 1px solid black; padding: 1em; } eliom-9.4.0/local/var/www/tests/test_style1.css000066400000000000000000000000741417032171500214750ustar00rootroot00000000000000div.some_class { background-color: blue; color: black; }eliom-9.4.0/local/var/www/tests/test_style2.css000066400000000000000000000000741417032171500214760ustar00rootroot00000000000000div.some_class { background-color: black; color: blue; }eliom-9.4.0/opam000066400000000000000000000026701417032171500135160ustar00rootroot00000000000000opam-version: "2.0" name: "eliom" version: "9.4.0" maintainer: "dev@ocsigen.org" authors: "dev@ocsigen.org" synopsis: "Client/server Web framework" description: """ Eliom is a framework for implementing client/server Web applications. It introduces new concepts to simplify the implementation of common behaviors, and uses advanced static typing features of OCaml to check many properties of the Web application at compile-time. Eliom allows implementing the whole application as a single program that includes both the client and the server code. We use a syntax extension to distinguish between the two sides. The client-side code is compiled to JS using Ocsigen Js_of_ocaml. """ homepage: "http://ocsigen.org/eliom/" bug-reports: "https://github.com/ocsigen/eliom/issues/" license: "LGPL-2.1-only WITH OCaml-LGPL-linking-exception" dev-repo: "git+https://github.com/ocsigen/eliom.git" build: [make] depends: [ "ocaml" {>= "4.08.0"} "ocamlfind" "ppx_deriving" "ppxlib" {>= "0.15.0"} "js_of_ocaml-compiler" {>= "3.6.0"} "js_of_ocaml" {>= "3.6.0"} "js_of_ocaml-lwt" {>= "3.6.0"} "js_of_ocaml-ocamlbuild" {build} "js_of_ocaml-ppx" {>= "3.6.0"} "js_of_ocaml-ppx_deriving_json" {>= "3.6.0"} "js_of_ocaml-tyxml" {>= "3.6.0"} "lwt_log" "lwt_ppx" {>= "1.2.3"} "tyxml" {>= "4.4.0" & < "5.0.0"} "ocsigenserver" {>= "5.0.0" & < "6.0.0"} "ipaddr" {>= "2.1"} "reactiveData" {>= "0.2.1"} "base-bytes" "ocsipersist" {>= "1.0" & < "2.0"} ] eliom-9.4.0/pkg/000077500000000000000000000000001417032171500134135ustar00rootroot00000000000000eliom-9.4.0/pkg/META000066400000000000000000000073071417032171500140730ustar00rootroot00000000000000description = "Eliom: client-server Web and mobile applications" version = "6.3.0" package "server" ( description = "Eliom: server-side" version = "[distributed with Eliom]" directory = "server" requires = "ocsigenserver, ocsipersist, ppx_deriving.runtime, js_of_ocaml.deriving, react, reactiveData, tyxml, lwt_react, cryptokit, reactiveData" archive(byte) = "server.cma" archive(native) = "server.cmxa" package "monitor" ( directory = "monitor" description = "Eliom: monitoring" version = "[distributed with Eliom]" archive(byte) = "eliom_monitor.cma" archive(native) = "eliom_monitor.cmxa" package "start" ( description = "Eliom: monitoring" version = "[distributed with Eliom]" require = "eliom.server.monitor" archive(byte) = "eliom_monitor_main.cma" archive(native) = "eliom_monitor_main.cmxa" ) ) ) package "client" ( description = "Eliom: client-side" version = "[distributed with Eliom]" directory = "client" requires = "ocsigenserver.cookies, ocsigenserver.polytables, ocsigenserver.baselib.base, ppx_deriving.runtime, js_of_ocaml, js_of_ocaml.deriving, js_of_ocaml-tyxml, js_of_ocaml-lwt, js_of_ocaml-lwt.logger, lwt_react, react, reactiveData, tyxml.functor" archive(byte) = "client.cma eliom_client_main.cmo" jsoo_runtime = "eliom_client.js" linkopts(javascript) = "+eliom.client/eliom_client.js" ) package "syntax" ( package "predef" ( description = "Syntax extension: predefined commonly use syntaxes" version = "[distributed with Eliom]" requires(syntax, preprocessor) = "js_of_ocaml-camlp4,lwt_camlp4" requires(syntax, toploop) = "js_of_ocaml-camlp4,lwt_camlp4" archive(syntax, preprocessor) = "-ignore dummy" ) ) package "ppx" ( directory = "ppx" package "server" ( description = "Ppx syntax extension: server side" ppx(-ppx_driver,-custom_ppx) = "ppx_eliom_server" archive(ppx_driver,byte) = "ppx_eliom_server.cma" archive(ppx_driver,native) = "ppx_eliom_server.cmxa" plugin(ppx_driver,byte) = "ppx_eliom_server.cma" plugin(ppx_driver,native) = "ppx_eliom_server.cmxs" requires(ppx_driver) = "ppxlib" library_kind = "ppx_rewriter" ) package "client" ( description = "Ppx syntax extension: client side" ppx(-ppx_driver,-custom_ppx) = "ppx_eliom_client" archive(ppx_driver,byte) = "ppx_eliom_client.cma" archive(ppx_driver,native) = "ppx_eliom_client.cmxa" plugin(ppx_driver,byte) = "ppx_eliom_client.cma" plugin(ppx_driver,native) = "ppx_eliom_client.cmxs" requires(ppx_driver) = "ppxlib" library_kind = "ppx_rewriter" ) package "type" ( description = "Ppx syntax extension: type inference" ppx(-ppx_driver,-custom_ppx) = "ppx_eliom_types" archive(ppx_driver,byte) = "ppx_eliom_type.cma" archive(ppx_driver,native) = "ppx_eliom_type.cmxa" plugin(ppx_driver,byte) = "ppx_eliom_type.cma" plugin(ppx_driver,native) = "ppx_eliom_type.cmxs" requires(ppx_driver) = "ppxlib" library_kind = "ppx_rewriter" ) ) package "templates" ( directory = "templates" ) package "ocamlbuild" ( description = "Eliom ocamlbuild plugin (js_of_ocaml part included)" version = "[distributed with Eliom]" directory = "ocamlbuild" requires = "js_of_ocaml-ocamlbuild" archive(byte) = "ocamlbuild_eliom.cma" archive(byte, plugin) = "ocamlbuild_eliom.cma" archive(native) = "ocamlbuild_eliom.cmxa" archive(native, plugin) = "ocamlbuild_eliom.cmxs" ) eliom-9.4.0/pkg/build.ml000077500000000000000000000115071417032171500150530ustar00rootroot00000000000000#!/usr/bin/env ocaml #directory "pkg";; #use "topkg.ml";; #use "filelist.ml" (* DEBUG ONLY *) let nothing_should_be_rebuilt=false let except = function (* cmxs are regerated every time ( bug in ocamlbuild rule) *) | ".cmxs" when nothing_should_be_rebuilt -> false | _ -> true (* END *) let exts_syntax = List.filter except [".cmo";".cmx";".cma";".cmxa";".cmxs";".a"] let exts_modlib = List.filter except Exts.module_library let exts_lib = List.filter except Exts.library let _ = list_to_file "src/lib/client/client.mllib" client_mllib; list_to_file "src/lib/client/api.odocl" client_api; list_to_file "src/lib/server/server.mllib" server_mllib; list_to_file "src/lib/server/server.mldylib" server_mllib; list_to_file "src/lib/server/api.odocl" server_api; list_to_file "src/ocamlbuild/ocamlbuild.mllib" ocamlbuild_mllib; list_to_file "src/ocamlbuild/ocamlbuild.mldylib" ocamlbuild_mllib; list_to_file "src/ocamlbuild/api.odocl" ocamlbuild_api; list_to_file "src/ppx/ppx.mllib" ppx_mllib; list_to_file "src/ppx/ppx.mldylib" ppx_mllib; list_to_file "src/ppx/api.odocl" ppx_api; list_to_file "src/ppx/ppx.mllib" ppx_mllib; list_to_file "src/ppx/ppx.mldylib" ppx_mllib; list_to_file "src/ppx/api.odocl" ppx_api let spf = Printf.sprintf let nothing = if nothing_should_be_rebuilt then "-nothing-should-be-rebuilt" else "" let best = if Env.native then "native" else "byte" let builder = `Other ("_build/build/build." ^ best,"_build") let with_man3 = Env.bool "manpage" let () = Pkg.describe "eliom" ~builder ([ (* META *) Pkg.lib "pkg/META"; (* MANPAGE *) Pkg.man ~dst:"man1/eliomc.1" "pkg/man/eliomc.1"; Pkg.man ~dst:"man1/eliomcp.1" "pkg/man/eliomc.1"; Pkg.man ~dst:"man1/eliomopt.1" "pkg/man/eliomc.1"; Pkg.man ~dst:"man1/eliomdep.1" "pkg/man/eliomc.1"; Pkg.man ~dst:"man1/js_of_eliom.1" "pkg/man/eliomc.1"; Pkg.man ~dst:"man1/eliom-distillery.1" "pkg/man/eliom-distillery.1"; Pkg.man ~cond:with_man3 ~dst:"man3/%.3oc" ~target:"src/lib/client/api.mandocdir/man.3oc" "src/lib/client/api.mandocdir/%.3oc"; Pkg.man ~cond:with_man3 ~dst:"man3/%.3os" ~target:"src/lib/server/api.mandocdir/man.3os" "src/lib/server/api.mandocdir/%.3os"; Pkg.man ~cond:with_man3 ~dst:"man3/%.3o" ~target:"src/ocamlbuild/api.mandocdir/man.3o" "src/ocamlbuild/api.mandocdir/%.3o"; Pkg.man ~cond:with_man3 ~dst:"man3/%.3o" ~target:"src/ppx/api.mandocdir/man.3o" "src/ppx/api.mandocdir/%.3o"; (* TOOLS *) Pkg.bin ~auto:true "src/tools/eliomc"; Pkg.bin ~auto:true "src/tools/eliomcp"; Pkg.bin ~auto:true "src/tools/eliomdep"; Pkg.bin ~auto:true "src/tools/eliomopt"; Pkg.bin ~auto:true "src/tools/js_of_eliom"; Pkg.bin ~auto:true "src/tools/eliomdoc"; Pkg.bin ~auto:true "src/tools/eliompp"; Pkg.bin ~auto:true ~dst:"eliom-distillery" "src/tools/distillery"; Pkg.bin ~auto:true "src/ocamlbuild/eliombuild"; Pkg.lib ~exts:exts_modlib ~dst:"ocamlbuild/ocamlbuild_eliom" "src/ocamlbuild/ocamlbuild_eliom"; (* PPX *) Pkg.lib ~exts:Exts.module_library ~dst:"ppx/ppx_eliom" "src/ppx/ppx_eliom"; Pkg.lib ~exts:Exts.module_library ~dst:"ppx/ppx_eliom_client" "src/ppx/ppx_eliom_client"; Pkg.lib ~exts:Exts.module_library ~dst:"ppx/ppx_eliom_type" "src/ppx/ppx_eliom_type"; Pkg.lib ~exts:Exts.module_library ~dst:"ppx/ppx_eliom_server" "src/ppx/ppx_eliom_server"; Pkg.bin ~auto:true ~dst:"ppx_eliom_client" "src/ppx/ppx_eliom_client_ex" ; Pkg.bin ~auto:true ~dst:"ppx_eliom_server" "src/ppx/ppx_eliom_server_ex" ; Pkg.bin ~auto:true ~dst:"ppx_eliom_types" "src/ppx/ppx_eliom_types_ex" ] @ ( (* CLIENT LIBS *) Pkg.lib ~dst:"client/client" ~exts:[".cma"] "src/lib/client/client" :: Pkg.lib ~dst:"client/eliom_client_main.cmo" "src/lib/client/eliom_client_main.cmo" :: Pkg.lib ~dst:"client/eliom_client.js" "src/lib/client/eliom_client.js" :: Pkg.lib ~dst:"client/libeliom_stubs.a" "src/lib/client/libeliom_stubs.a" :: Pkg.stublibs "src/lib/client/dlleliom_stubs.so" :: List.map (fun x -> Pkg.lib ~dst:(spf "client/%s" x) (spf "src/lib/client/%s" x)) client_extra ) @ ( (* SERVER LIBS *) Pkg.lib ~dst:"server/monitor/eliom_monitor" ~exts:Exts.module_library "src/lib/server/monitor/eliom_monitor" :: Pkg.lib ~dst:"server/monitor/eliom_monitor_main" ~exts:Exts.module_library "src/lib/server/monitor/eliom_monitor_main" :: Pkg.lib ~dst:"server/server" ~exts:exts_lib "src/lib/server/server" :: List.map (fun x -> Pkg.lib ~dst:(spf "server/%s" x) (spf "src/lib/server/%s" x)) server_extra ) @ [ (* MISC *) Pkg.doc "README.md"; Pkg.doc "CHANGES"; Pkg.etc "pkg/etc/mime.types" ] @ ( List.flatten ( List.map (fun (name,files) -> List.map (fun file -> Pkg.lib ~dst:(spf "templates/%s/%s" name file) (spf "%s/%s/%s" templates_dir name file) ) files) templates_files ) )) eliom-9.4.0/pkg/distillery/000077500000000000000000000000001417032171500155775ustar00rootroot00000000000000eliom-9.4.0/pkg/distillery/basic.ppx/000077500000000000000000000000001417032171500174665ustar00rootroot00000000000000eliom-9.4.0/pkg/distillery/basic.ppx/.ocp-indent000066400000000000000000000000741417032171500215300ustar00rootroot00000000000000normal with=0 syntax=lwt mll max_indent=2 ppx_stritem_ext=0 eliom-9.4.0/pkg/distillery/basic.ppx/Makefile000066400000000000000000000223501417032171500211300ustar00rootroot00000000000000 ##---------------------------------------------------------------------- ## DISCLAIMER ## ## This file contains the rules to make an Eliom project. The project is ## configured through the variables in the file Makefile.options. ##---------------------------------------------------------------------- include Makefile.options ##---------------------------------------------------------------------- ## Internals ## Required binaries ELIOMC := eliomc -ppx ELIOMOPT := eliomopt -ppx JS_OF_ELIOM := js_of_eliom -ppx ELIOMDEP := eliomdep OCSIGENSERVER := ocsigenserver OCSIGENSERVER.OPT := ocsigenserver.opt ## Where to put intermediate object files. ## - ELIOM_{SERVER,CLIENT}_DIR must be distinct ## - ELIOM_CLIENT_DIR must not be the local dir. ## - ELIOM_SERVER_DIR could be ".", but you need to ## remove it from the "clean" rules... export ELIOM_SERVER_DIR := _server export ELIOM_CLIENT_DIR := _client export ELIOM_TYPE_DIR := _server DEPSDIR := _deps ifeq ($(DEBUG),yes) GENERATE_DEBUG ?= -g RUN_DEBUG ?= "-v" DEBUG_JS ?= -jsopt -pretty -jsopt -noinline -jsopt -debuginfo endif ##---------------------------------------------------------------------- ## General .PHONY: all byte opt all: byte opt byte opt:: $(TEST_PREFIX)$(ELIOMSTATICDIR)/${PROJECT_NAME}.js byte opt:: $(TEST_PREFIX)$(ETCDIR)/$(PROJECT_NAME).conf byte opt:: $(TEST_PREFIX)$(ETCDIR)/$(PROJECT_NAME)-test.conf byte:: $(TEST_PREFIX)$(LIBDIR)/${PROJECT_NAME}.cma opt:: $(TEST_PREFIX)$(LIBDIR)/${PROJECT_NAME}.cmxs DIST_DIRS = $(ETCDIR) $(DATADIR) $(LIBDIR) $(LOGDIR) $(STATICDIR) $(ELIOMSTATICDIR) $(shell dirname $(CMDPIPE)) ##---------------------------------------------------------------------- ## Testing DIST_FILES = $(ELIOMSTATICDIR)/$(PROJECT_NAME).js $(LIBDIR)/$(PROJECT_NAME).cma .PHONY: test.byte test.opt test.byte: $(addprefix $(TEST_PREFIX),$(ETCDIR)/$(PROJECT_NAME)-test.conf $(DIST_DIRS) $(DIST_FILES)) $(OCSIGENSERVER) $(RUN_DEBUG) -c $< test.opt: $(addprefix $(TEST_PREFIX),$(ETCDIR)/$(PROJECT_NAME)-test.conf $(DIST_DIRS) $(patsubst %.cma,%.cmxs, $(DIST_FILES))) $(OCSIGENSERVER.OPT) $(RUN_DEBUG) -c $< $(addprefix $(TEST_PREFIX), $(DIST_DIRS)): mkdir -p $@ ##---------------------------------------------------------------------- ## Installing & Running .PHONY: install install.byte install.byte install.opt install.static install.etc install.lib install.lib.byte install.lib.opt run.byte run.opt install: install.byte install.opt install.byte: install.lib.byte install.etc install.static | $(addprefix $(PREFIX),$(DATADIR) $(LOGDIR) $(shell dirname $(CMDPIPE))) install.opt: install.lib.opt install.etc install.static | $(addprefix $(PREFIX),$(DATADIR) $(LOGDIR) $(shell dirname $(CMDPIPE))) install.lib: install.lib.byte install.lib.opt install.lib.byte: $(TEST_PREFIX)$(LIBDIR)/$(PROJECT_NAME).cma | $(PREFIX)$(LIBDIR) install $< $(PREFIX)$(LIBDIR) install.lib.opt: $(TEST_PREFIX)$(LIBDIR)/$(PROJECT_NAME).cmxs | $(PREFIX)$(LIBDIR) install $< $(PREFIX)$(LIBDIR) install.static: $(TEST_PREFIX)$(ELIOMSTATICDIR)/$(PROJECT_NAME).js | $(PREFIX)$(STATICDIR) $(PREFIX)$(ELIOMSTATICDIR) cp -r $(LOCAL_STATIC)/* $(PREFIX)$(STATICDIR) [ -z $(WWWUSER) ] || chown -R $(WWWUSER) $(PREFIX)$(STATICDIR) install $(addprefix -o ,$(WWWUSER)) $< $(PREFIX)$(ELIOMSTATICDIR) install.etc: $(TEST_PREFIX)$(ETCDIR)/$(PROJECT_NAME).conf | $(PREFIX)$(ETCDIR) install $< $(PREFIX)$(ETCDIR)/$(PROJECT_NAME).conf .PHONY: print-install-files: @echo $(PREFIX)$(LIBDIR) @echo $(PREFIX)$(STATICDIR) @echo $(PREFIX)$(ELIOMSTATICDIR) @echo $(PREFIX)$(ETCDIR) $(addprefix $(PREFIX),$(ETCDIR) $(LIBDIR)): install -d $@ $(addprefix $(PREFIX),$(DATADIR) $(LOGDIR) $(STATICDIR) $(ELIOMSTATICDIR) $(shell dirname $(CMDPIPE))): install $(addprefix -o ,$(WWWUSER)) -d $@ run.byte: $(OCSIGENSERVER) $(RUN_DEBUG) -c ${PREFIX}${ETCDIR}/${PROJECT_NAME}.conf run.opt: $(OCSIGENSERVER.OPT) $(RUN_DEBUG) -c ${PREFIX}${ETCDIR}/${PROJECT_NAME}.conf ##---------------------------------------------------------------------- ## Aux # Use `eliomdep -sort' only in OCaml>4 ifeq ($(shell ocamlc -version|cut -c1),4) eliomdep=$(shell $(ELIOMDEP) $(1) -ppx -sort $(2) $(filter %.eliom %.ml,$(3)))) else eliomdep=$(3) endif objs=$(patsubst %.ml,$(1)/%.$(2),$(patsubst %.eliom,$(1)/%.$(2),$(filter %.eliom %.ml,$(3)))) depsort=$(call objs,$(1),$(2),$(call eliomdep,$(3),$(4),$(5))) ##---------------------------------------------------------------------- ## Config files FINDLIB_PACKAGES=$(patsubst %,\,$(SERVER_PACKAGES)) EDIT_WARNING=DON\'T EDIT THIS FILE! It is generated from $(PROJECT_NAME).conf.in, edit that one, or the variables in Makefile.options SED_ARGS := -e "/^ *%%%/d" SED_ARGS += -e "s|%%PROJECT_NAME%%|$(PROJECT_NAME)|g" SED_ARGS += -e "s|%%DATABASE_NAME%%|$(DATABASE_NAME)|g" SED_ARGS += -e "s|%%DATABASE_USER%%|$(DATABASE_USER)|g" SED_ARGS += -e "s|%%CMDPIPE%%|%%PREFIX%%$(CMDPIPE)|g" SED_ARGS += -e "s|%%LOGDIR%%|%%PREFIX%%$(LOGDIR)|g" SED_ARGS += -e "s|%%DATADIR%%|%%PREFIX%%$(DATADIR)|g" SED_ARGS += -e "s|%%PERSISTENT_DATA_BACKEND%%|$(PERSISTENT_DATA_BACKEND)|g" SED_ARGS += -e "s|%%LIBDIR%%|%%PREFIX%%$(LIBDIR)|g" SED_ARGS += -e "s|%%WARNING%%|$(EDIT_WARNING)|g" SED_ARGS += -e "s|%%PACKAGES%%|$(FINDLIB_PACKAGES)|g" SED_ARGS += -e "s|%%ELIOMSTATICDIR%%|%%PREFIX%%$(ELIOMSTATICDIR)|g" ifeq ($(DEBUG),yes) SED_ARGS += -e "s|%%DEBUGMODE%%|\|g" else SED_ARGS += -e "s|%%DEBUGMODE%%||g" endif LOCAL_SED_ARGS := -e "s|%%PORT%%|$(TEST_PORT)|g" LOCAL_SED_ARGS += -e "s|%%STATICDIR%%|$(LOCAL_STATIC)|g" LOCAL_SED_ARGS += -e "s|%%USERGROUP%%||g" GLOBAL_SED_ARGS := -e "s|%%PORT%%|$(PORT)|g" GLOBAL_SED_ARGS += -e "s|%%STATICDIR%%|%%PREFIX%%$(STATICDIR)|g" ifeq ($(WWWUSER)$(WWWGROUP),) GLOBAL_SED_ARGS += -e "s|%%USERGROUP%%||g" else GLOBAL_SED_ARGS += -e "s|%%USERGROUP%%|$(WWWUSER)$(WWWGROUP)|g" endif $(TEST_PREFIX)${ETCDIR}/${PROJECT_NAME}.conf: ${PROJECT_NAME}.conf.in Makefile.options | $(TEST_PREFIX)$(ETCDIR) sed $(SED_ARGS) $(GLOBAL_SED_ARGS) $< | sed -e "s|%%PREFIX%%|$(PREFIX)|g" > $@ $(TEST_PREFIX)${ETCDIR}/${PROJECT_NAME}-test.conf: ${PROJECT_NAME}.conf.in Makefile.options | $(TEST_PREFIX)$(ETCDIR) sed $(SED_ARGS) $(LOCAL_SED_ARGS) $< | sed -e "s|%%PREFIX%%|$(TEST_PREFIX)|g" > $@ ##---------------------------------------------------------------------- ## Server side compilation SERVER_INC := ${addprefix -package ,${SERVER_PACKAGES}} ${ELIOM_TYPE_DIR}/%.type_mli: %.eliom ${ELIOMC} -infer ${SERVER_INC} $< $(TEST_PREFIX)$(LIBDIR)/$(PROJECT_NAME).cma: $(call objs,$(ELIOM_SERVER_DIR),cmo,$(SERVER_FILES)) | $(TEST_PREFIX)$(LIBDIR) ${ELIOMC} -a -o $@ $(GENERATE_DEBUG) \ $(call depsort,$(ELIOM_SERVER_DIR),cmo,-server,$(SERVER_INC),$(SERVER_FILES)) $(TEST_PREFIX)$(LIBDIR)/$(PROJECT_NAME).cmxa: $(call objs,$(ELIOM_SERVER_DIR),cmx,$(SERVER_FILES)) | $(TEST_PREFIX)$(LIBDIR) ${ELIOMOPT} -a -o $@ $(GENERATE_DEBUG) \ $(call depsort,$(ELIOM_SERVER_DIR),cmx,-server,$(SERVER_INC),$(SERVER_FILES)) %.cmxs: %.cmxa $(ELIOMOPT) -shared -linkall -o $@ $(GENERATE_DEBUG) $< ${ELIOM_SERVER_DIR}/%.cmi: %.mli ${ELIOMC} -c ${SERVER_INC} $(GENERATE_DEBUG) $< ${ELIOM_SERVER_DIR}/%.cmi: %.eliomi ${ELIOMC} -c ${SERVER_INC} $(GENERATE_DEBUG) $< ${ELIOM_SERVER_DIR}/%.cmo: %.ml ${ELIOMC} -c ${SERVER_INC} $(GENERATE_DEBUG) $< ${ELIOM_SERVER_DIR}/%.cmo: %.eliom ${ELIOMC} -c ${SERVER_INC} $(GENERATE_DEBUG) $< ${ELIOM_SERVER_DIR}/%.cmx: %.ml ${ELIOMOPT} -c ${SERVER_INC} $(GENERATE_DEBUG) $< ${ELIOM_SERVER_DIR}/%.cmx: %.eliom ${ELIOMOPT} -c ${SERVER_INC} $(GENERATE_DEBUG) $< ##---------------------------------------------------------------------- ## Client side compilation CLIENT_LIBS := ${addprefix -package ,${CLIENT_PACKAGES}} CLIENT_INC := ${addprefix -package ,${CLIENT_PACKAGES}} CLIENT_OBJS := $(filter %.eliom %.ml, $(CLIENT_FILES)) CLIENT_OBJS := $(patsubst %.eliom,${ELIOM_CLIENT_DIR}/%.cmo, ${CLIENT_OBJS}) CLIENT_OBJS := $(patsubst %.ml,${ELIOM_CLIENT_DIR}/%.cmo, ${CLIENT_OBJS}) $(TEST_PREFIX)$(ELIOMSTATICDIR)/$(PROJECT_NAME).js: $(call objs,$(ELIOM_CLIENT_DIR),cmo,$(CLIENT_FILES)) | $(TEST_PREFIX)$(ELIOMSTATICDIR) ${JS_OF_ELIOM} -o $@ $(GENERATE_DEBUG) $(CLIENT_INC) $(DEBUG_JS) \ $(call depsort,$(ELIOM_CLIENT_DIR),cmo,-client,$(CLIENT_INC),$(CLIENT_FILES)) ${ELIOM_CLIENT_DIR}/%.cmi: %.mli ${JS_OF_ELIOM} -c ${CLIENT_INC} $(GENERATE_DEBUG) $< ${ELIOM_CLIENT_DIR}/%.cmo: %.eliom ${JS_OF_ELIOM} -c ${CLIENT_INC} $(GENERATE_DEBUG) $< ${ELIOM_CLIENT_DIR}/%.cmo: %.ml ${JS_OF_ELIOM} -c ${CLIENT_INC} $(GENERATE_DEBUG) $< ${ELIOM_CLIENT_DIR}/%.cmi: %.eliomi ${JS_OF_ELIOM} -c ${CLIENT_INC} $(GENERATE_DEBUG) $< ##---------------------------------------------------------------------- ## Dependencies include .depend .depend: $(patsubst %,$(DEPSDIR)/%.server,$(SERVER_FILES)) $(patsubst %,$(DEPSDIR)/%.client,$(CLIENT_FILES)) cat $^ > $@ $(DEPSDIR)/%.server: % | $(DEPSDIR) $(ELIOMDEP) -server -ppx $(SERVER_INC) $< > $@ $(DEPSDIR)/%.client: % | $(DEPSDIR) $(ELIOMDEP) -client -ppx $(CLIENT_INC) $< > $@ $(DEPSDIR): mkdir $@ ##---------------------------------------------------------------------- ## Clean up clean: -rm -f *.cm[ioax] *.cmxa *.cmxs *.o *.a *.annot -rm -f *.type_mli -rm -f ${PROJECT_NAME}.js -rm -rf ${ELIOM_CLIENT_DIR} ${ELIOM_SERVER_DIR} distclean: clean -rm -rf $(TEST_PREFIX) $(DEPSDIR) .depend eliom-9.4.0/pkg/distillery/basic.ppx/Makefile.options000066400000000000000000000041011417032171500226140ustar00rootroot00000000000000 #---------------------------------------------------------------------- # SETTINGS FOR THE ELIOM PROJECT %%%PROJECT_NAME%%% #---------------------------------------------------------------------- PROJECT_NAME := %%%PROJECT_NAME%%% # Source files for the server SERVER_FILES := $(wildcard *.eliomi *.eliom) # Source files for the client CLIENT_FILES := $(wildcard *.eliomi *.eliom) # OCamlfind packages for the server SERVER_PACKAGES := lwt_ppx js_of_ocaml-ppx_deriving_json # OCamlfind packages for the client CLIENT_PACKAGES := lwt_ppx js_of_ocaml-ppx js_of_ocaml-ppx_deriving_json # Directory with files to be statically served LOCAL_STATIC = static # The backend for persistent data. Can be dbm or sqlite. # Make sure you have the following packages installed # - *dbm* if you use dbm --> opam install dbm. # - *sqlite* if you use sqlite --> opam install sqlite3. PERSISTENT_DATA_BACKEND = %%%PROJECT_DB%%% # Debug application (yes/no): Debugging info in compilation, # JavaScript, ocsigenserver DEBUG := no # User to run server with (make run.*) WWWUSER := www-data WWWGROUP := www-data # Port for running the server (make run.*) PORT := 80 # Port for testing (make test.*) TEST_PORT := 8080 # Root of installation (must end with /) PREFIX := /usr/local/ # Local folder for make test.* (must end with /) # Do not add files manually in this directory. # It is just here to test your installation before installing in / TEST_PREFIX := local/ # The installation tree (relative to $(PREFIX) when # installing/running or $(TEST_PREFIX) when testing). # Configuration file $(PROJECT_NAME).conf ETCDIR := etc/${PROJECT_NAME} # Project's library $(PROJECT_NAME).cma (cmxs) LIBDIR := lib/${PROJECT_NAME} # Command pipe, eg. $ echo reload > $(INSTALL_PREFIX)$(CMDPIPE) CMDPIPE := var/run/${PROJECT_NAME}-cmd # Ocsigenserver's logging files LOGDIR := var/log/${PROJECT_NAME} # Ocsigenserver's persistent data files DATADIR := var/data/${PROJECT_NAME} # Copy of $(LOCAL_STATIC) STATICDIR := var/www/${PROJECT_NAME}/static # Project's JavaScript file ELIOMSTATICDIR := var/www/${PROJECT_NAME}/eliom eliom-9.4.0/pkg/distillery/basic.ppx/PROJECT_NAME.conf.in000066400000000000000000000021051417032171500226460ustar00rootroot00000000000000%%% This is the template for your configuration file. The %%VALUES%% below are %%% taken from the Makefile to generate the actual configuration files. %%% This comment will disappear. %%PORT%% %%% Only set for running, not for testing %%USERGROUP%% %%LOGDIR%% %%DATADIR%% utf-8 %%% Only set when debugging %%DEBUGMODE%% %%CMDPIPE%% %%% This will include the packages defined as SERVER_PACKAGES in your Makefile: %%PACKAGES%% eliom-9.4.0/pkg/distillery/basic.ppx/PROJECT_NAME.eliom000066400000000000000000000012451417032171500224250ustar00rootroot00000000000000[%%shared open Eliom_lib open Eliom_content open Html.D ] module %%%MODULE_NAME%%%_app = Eliom_registration.App ( struct let application_name = "%%%PROJECT_NAME%%%" let global_data_path = None end) let main_service = Eliom_service.create ~path:(Eliom_service.Path []) ~meth:(Eliom_service.Get Eliom_parameter.unit) () let () = %%%MODULE_NAME%%%_app.register ~service:main_service (fun () () -> Lwt.return (Eliom_tools.F.html ~title:"%%%PROJECT_NAME%%%" ~css:[["css";"%%%PROJECT_NAME%%%.css"]] Html.F.(body [ h1 [txt "Welcome from Eliom's distillery!"]; ]))) eliom-9.4.0/pkg/distillery/basic.ppx/README000066400000000000000000000051331417032171500203500ustar00rootroot00000000000000 Instructions ============ This project is (initially) generated by eliom-distillery as the basic project "%%%PROJECT_NAME%%%". Generally, you can compile it and run ocsigenserver on it by $ make test.byte (or test.opt) See below for other useful targets for make. Generated files --------------- The following files in this directory have been generated by eliom-distillery: - %%%PROJECT_NAME%%%.eliom This is your initial source file. %%%ifdef OCAML4%%% All Eliom files (*.eliom, *.eliomi) in this directory are automatically considered. To add a .ml/.mli file to your project, append it to the variable SERVER_FILES or CLIENT_FILES. %%%endif%%% %%%ifdef OCAML3%%% To add more source files (.ml,.mli,.eliom,.eliomi) to your project, add it to the variables SERVER_FILES and/or CLIENT_FILES. %%%endif%%% - static/ The content of this folder is statically served. Put your CSS or additional JavaScript files here! - Makefile.options Configure your project here! - %%%PROJECT_NAME%%%.conf.in This file is a template for the configuration file for ocsigenserver. You will rarely have to edit itself - it takes its variables from the Makefile.options. This way, the installation rules and the configuration files are synchronized with respect to the different folders. - Makefile This contains all rules necessary to build, test, and run your Eliom application. You better don't touch it ;) See below for the relevant targets. - local/ This directory is the target of the temporary installation of your application, to test locally before doing a system-wide installation in /. Do not put anything manually here. - README Not completely describable here. Makefile targets ---------------- Here's some help on how to work with this basic distillery project: - Test your application by compiling it and running ocsigenserver locally $ make test.byte (or test.opt) - Compile it only $ make all (or byte or opt) - Deploy your project on your system $ sudo make install (or install.byte or install.opt) - Run the server on the deployed project $ sudo make run.byte (or run.opt) If WWWUSER in the Makefile.options is you, you don't need the `sudo'. If Eliom isn't installed globally, however, you need to re-export some environment variables to make this work: $ sudo PATH=$PATH OCAMLPATH=$OCAMLPATH LD_LIBRARY_PATH=$LD_LIBRARY_PATH make run.byte/run.opt - If you need a findlib package in your project, add it to the variables SERVER_PACKAGES and/or CLIENT_PACKAGES. The configuration file will be automatically updated. eliom-9.4.0/pkg/distillery/basic.ppx/static!css!PROJECT_NAME.css000066400000000000000000000000431417032171500241260ustar00rootroot00000000000000* { font-family: sans-serif; } eliom-9.4.0/pkg/etc/000077500000000000000000000000001417032171500141665ustar00rootroot00000000000000eliom-9.4.0/pkg/etc/mime.types000066400000000000000000000352541417032171500162140ustar00rootroot00000000000000# This is a comment. I love comments. # This file controls what Internet media types are sent to the client for # given file extension(s). Sending the correct media type to the client # is important so they know how to handle the content of the file. # Extra types can either be added here or by using an AddType directive # in your config files. For more information about Internet media types, # please read RFC 2045, 2046, 2047, 2048, and 2077. The Internet media type # registry is at . # MIME type Extensions application/activemessage application/andrew-inset ez application/applefile application/atom+xml atom application/atomicmail application/batch-smtp application/beep+xml application/cals-1840 application/cnrp+xml application/commonground application/cpl+xml application/cybercash application/dca-rft application/dec-dx application/dvcs application/edi-consent application/edifact application/edi-x12 application/eshop application/font-tdpfr application/http application/hyperstudio application/iges application/index application/index.cmd application/index.obj application/index.response application/index.vnd application/iotp application/ipp application/isup application/mac-binhex40 hqx application/mac-compactpro cpt application/macwriteii application/marc application/mathematica application/mathml+xml mathml application/msword doc application/news-message-id application/news-transmission application/ocsp-request application/ocsp-response application/octet-stream bin dms lha lzh exe class so dll dmg application/oda oda application/ogg ogg application/parityfec application/pdf pdf application/pgp-encrypted application/pgp-keys application/pgp-signature application/pkcs10 application/pkcs7-mime application/pkcs7-signature application/pkix-cert application/pkix-crl application/pkixcmp application/postscript ai eps ps application/prs.alvestrand.titrax-sheet application/prs.cww application/prs.nprend application/prs.plucker application/qsig application/rdf+xml rdf application/reginfo+xml application/remote-printing application/riscos application/rtf application/sdp application/set-payment application/set-payment-initiation application/set-registration application/set-registration-initiation application/sgml application/sgml-open-catalog application/sieve application/slate application/smil smi smil application/srgs gram application/srgs+xml grxml application/timestamp-query application/timestamp-reply application/tve-trigger application/vemmi application/vnd.3gpp.pic-bw-large application/vnd.3gpp.pic-bw-small application/vnd.3gpp.pic-bw-var application/vnd.3gpp.sms application/vnd.3m.post-it-notes application/vnd.accpac.simply.aso application/vnd.accpac.simply.imp application/vnd.acucobol application/vnd.acucorp application/vnd.adobe.xfdf application/vnd.aether.imp application/vnd.amiga.ami application/vnd.anser-web-certificate-issue-initiation application/vnd.anser-web-funds-transfer-initiation application/vnd.audiograph application/vnd.blueice.multipass application/vnd.bmi application/vnd.businessobjects application/vnd.canon-cpdl application/vnd.canon-lips application/vnd.cinderella application/vnd.claymore application/vnd.commerce-battelle application/vnd.commonspace application/vnd.contact.cmsg application/vnd.cosmocaller application/vnd.criticaltools.wbs+xml application/vnd.ctc-posml application/vnd.cups-postscript application/vnd.cups-raster application/vnd.cups-raw application/vnd.curl application/vnd.cybank application/vnd.data-vision.rdz application/vnd.dna application/vnd.dpgraph application/vnd.dreamfactory application/vnd.dxr application/vnd.ecdis-update application/vnd.ecowin.chart application/vnd.ecowin.filerequest application/vnd.ecowin.fileupdate application/vnd.ecowin.series application/vnd.ecowin.seriesrequest application/vnd.ecowin.seriesupdate application/vnd.enliven application/vnd.epson.esf application/vnd.epson.msf application/vnd.epson.quickanime application/vnd.epson.salt application/vnd.epson.ssf application/vnd.ericsson.quickcall application/vnd.eudora.data application/vnd.fdf application/vnd.ffsns application/vnd.fints application/vnd.flographit application/vnd.framemaker application/vnd.fsc.weblaunch application/vnd.fujitsu.oasys application/vnd.fujitsu.oasys2 application/vnd.fujitsu.oasys3 application/vnd.fujitsu.oasysgp application/vnd.fujitsu.oasysprs application/vnd.fujixerox.ddd application/vnd.fujixerox.docuworks application/vnd.fujixerox.docuworks.binder application/vnd.fut-misnet application/vnd.grafeq application/vnd.groove-account application/vnd.groove-help application/vnd.groove-identity-message application/vnd.groove-injector application/vnd.groove-tool-message application/vnd.groove-tool-template application/vnd.groove-vcard application/vnd.hbci application/vnd.hhe.lesson-player application/vnd.hp-hpgl application/vnd.hp-hpid application/vnd.hp-hps application/vnd.hp-pcl application/vnd.hp-pclxl application/vnd.httphone application/vnd.hzn-3d-crossword application/vnd.ibm.afplinedata application/vnd.ibm.electronic-media application/vnd.ibm.minipay application/vnd.ibm.modcap application/vnd.ibm.rights-management application/vnd.ibm.secure-container application/vnd.informix-visionary application/vnd.intercon.formnet application/vnd.intertrust.digibox application/vnd.intertrust.nncp application/vnd.intu.qbo application/vnd.intu.qfx application/vnd.irepository.package+xml application/vnd.is-xpr application/vnd.japannet-directory-service application/vnd.japannet-jpnstore-wakeup application/vnd.japannet-payment-wakeup application/vnd.japannet-registration application/vnd.japannet-registration-wakeup application/vnd.japannet-setstore-wakeup application/vnd.japannet-verification application/vnd.japannet-verification-wakeup application/vnd.jisp application/vnd.kde.karbon application/vnd.kde.kchart application/vnd.kde.kformula application/vnd.kde.kivio application/vnd.kde.kontour application/vnd.kde.kpresenter application/vnd.kde.kspread application/vnd.kde.kword application/vnd.kenameaapp application/vnd.koan application/vnd.liberty-request+xml application/vnd.llamagraphics.life-balance.desktop application/vnd.llamagraphics.life-balance.exchange+xml application/vnd.lotus-1-2-3 application/vnd.lotus-approach application/vnd.lotus-freelance application/vnd.lotus-notes application/vnd.lotus-organizer application/vnd.lotus-screencam application/vnd.lotus-wordpro application/vnd.mcd application/vnd.mediastation.cdkey application/vnd.meridian-slingshot application/vnd.micrografx.flo application/vnd.micrografx.igx application/vnd.mif mif application/vnd.minisoft-hp3000-save application/vnd.mitsubishi.misty-guard.trustweb application/vnd.mobius.daf application/vnd.mobius.dis application/vnd.mobius.mbk application/vnd.mobius.mqy application/vnd.mobius.msl application/vnd.mobius.plc application/vnd.mobius.txf application/vnd.mophun.application application/vnd.mophun.certificate application/vnd.motorola.flexsuite application/vnd.motorola.flexsuite.adsi application/vnd.motorola.flexsuite.fis application/vnd.motorola.flexsuite.gotap application/vnd.motorola.flexsuite.kmr application/vnd.motorola.flexsuite.ttc application/vnd.motorola.flexsuite.wem application/vnd.mozilla.xul+xml xul application/vnd.ms-artgalry application/vnd.ms-asf application/vnd.ms-excel xls application/vnd.ms-lrm application/vnd.ms-powerpoint ppt application/vnd.ms-project application/vnd.ms-tnef application/vnd.ms-works application/vnd.ms-wpl application/vnd.mseq application/vnd.msign application/vnd.music-niff application/vnd.musician application/vnd.netfpx application/vnd.noblenet-directory application/vnd.noblenet-sealer application/vnd.noblenet-web application/vnd.novadigm.edm application/vnd.novadigm.edx application/vnd.novadigm.ext application/vnd.obn application/vnd.osa.netdeploy application/vnd.palm application/vnd.pg.format application/vnd.pg.osasli application/vnd.powerbuilder6 application/vnd.powerbuilder6-s application/vnd.powerbuilder7 application/vnd.powerbuilder7-s application/vnd.powerbuilder75 application/vnd.powerbuilder75-s application/vnd.previewsystems.box application/vnd.publishare-delta-tree application/vnd.pvi.ptid1 application/vnd.pwg-multiplexed application/vnd.pwg-xhtml-print+xml application/vnd.quark.quarkxpress application/vnd.rapid application/vnd.s3sms application/vnd.sealed.net application/vnd.seemail application/vnd.shana.informed.formdata application/vnd.shana.informed.formtemplate application/vnd.shana.informed.interchange application/vnd.shana.informed.package application/vnd.smaf application/vnd.sss-cod application/vnd.sss-dtf application/vnd.sss-ntf application/vnd.street-stream application/vnd.svd application/vnd.swiftview-ics application/vnd.triscape.mxs application/vnd.trueapp application/vnd.truedoc application/vnd.ufdl application/vnd.uplanet.alert application/vnd.uplanet.alert-wbxml application/vnd.uplanet.bearer-choice application/vnd.uplanet.bearer-choice-wbxml application/vnd.uplanet.cacheop application/vnd.uplanet.cacheop-wbxml application/vnd.uplanet.channel application/vnd.uplanet.channel-wbxml application/vnd.uplanet.list application/vnd.uplanet.list-wbxml application/vnd.uplanet.listcmd application/vnd.uplanet.listcmd-wbxml application/vnd.uplanet.signal application/vnd.vcx application/vnd.vectorworks application/vnd.vidsoft.vidconference application/vnd.visio application/vnd.visionary application/vnd.vividence.scriptfile application/vnd.vsf application/vnd.wap.sic application/vnd.wap.slc application/vnd.wap.wbxml wbxml application/vnd.wap.wmlc wmlc application/vnd.wap.wmlscriptc wmlsc application/vnd.webturbo application/vnd.wrq-hp3000-labelled application/vnd.wt.stf application/vnd.wv.csp+wbxml application/vnd.xara application/vnd.xfdl application/vnd.yamaha.hv-dic application/vnd.yamaha.hv-script application/vnd.yamaha.hv-voice application/vnd.yellowriver-custom-menu application/voicexml+xml vxml application/watcherinfo+xml application/whoispp-query application/whoispp-response application/wita application/wordperfect5.1 application/x-bcpio bcpio application/x-cdlink vcd application/x-chess-pgn pgn application/x-compress application/x-cpio cpio application/x-csh csh application/x-director dcr dir dxr application/x-dvi dvi application/x-futuresplash spl application/x-gtar gtar application/x-gzip application/x-hdf hdf application/x-javascript js application/x-koan skp skd skt skm application/x-latex latex application/x-netcdf nc cdf application/x-sh sh application/x-shar shar application/x-shockwave-flash swf application/x-stuffit sit application/x-sv4cpio sv4cpio application/x-sv4crc sv4crc application/x-tar tar application/x-tcl tcl application/x-tex tex application/x-texinfo texinfo texi application/x-troff t tr roff application/x-troff-man man application/x-troff-me me application/x-troff-ms ms application/x-ustar ustar application/x-wais-source src application/x400-bp application/xhtml+xml xhtml xht application/xslt+xml xslt application/xml xml xsl application/xml-dtd dtd application/xml-external-parsed-entity application/zip zip audio/32kadpcm audio/amr audio/amr-wb audio/basic au snd audio/cn audio/dat12 audio/dsr-es201108 audio/dvi4 audio/evrc audio/evrc0 audio/g722 audio/g.722.1 audio/g723 audio/g726-16 audio/g726-24 audio/g726-32 audio/g726-40 audio/g728 audio/g729 audio/g729D audio/g729E audio/gsm audio/gsm-efr audio/l8 audio/l16 audio/l20 audio/l24 audio/lpc audio/midi mid midi kar audio/mpa audio/mpa-robust audio/mp4a-latm audio/mpeg mpga mp2 mp3 audio/parityfec audio/pcma audio/pcmu audio/prs.sid audio/qcelp audio/red audio/smv audio/smv0 audio/telephone-event audio/tone audio/vdvi audio/vnd.3gpp.iufp audio/vnd.cisco.nse audio/vnd.cns.anp1 audio/vnd.cns.inf1 audio/vnd.digital-winds audio/vnd.everad.plj audio/vnd.lucent.voice audio/vnd.nortel.vbk audio/vnd.nuera.ecelp4800 audio/vnd.nuera.ecelp7470 audio/vnd.nuera.ecelp9600 audio/vnd.octel.sbc audio/vnd.qcelp audio/vnd.rhetorex.32kadpcm audio/vnd.vmx.cvsd audio/x-aiff aif aiff aifc audio/x-alaw-basic audio/x-mpegurl m3u audio/x-pn-realaudio ram ra audio/x-pn-realaudio-plugin application/vnd.rn-realmedia rm audio/x-wav wav chemical/x-pdb pdb chemical/x-xyz xyz image/bmp bmp image/cgm cgm image/g3fax image/gif gif image/ief ief image/jpeg jpeg jpg jpe image/naplps image/png png image/prs.btif image/prs.pti image/svg+xml svg image/t38 image/tiff tiff tif image/tiff-fx image/vnd.cns.inf2 image/vnd.djvu djvu djv image/vnd.dwg image/vnd.dxf image/vnd.fastbidsheet image/vnd.fpx image/vnd.fst image/vnd.fujixerox.edmics-mmr image/vnd.fujixerox.edmics-rlc image/vnd.globalgraphics.pgb image/vnd.mix image/vnd.ms-modi image/vnd.net-fpx image/vnd.svf image/vnd.wap.wbmp wbmp image/vnd.xiff image/x-cmu-raster ras image/x-icon ico image/x-portable-anymap pnm image/x-portable-bitmap pbm image/x-portable-graymap pgm image/x-portable-pixmap ppm image/x-rgb rgb image/x-xbitmap xbm image/x-xpixmap xpm image/x-xwindowdump xwd message/delivery-status message/disposition-notification message/external-body message/http message/news message/partial message/rfc822 message/s-http message/sip message/sipfrag model/iges igs iges model/mesh msh mesh silo model/vnd.dwf model/vnd.flatland.3dml model/vnd.gdl model/vnd.gs-gdl model/vnd.gtw model/vnd.mts model/vnd.parasolid.transmit.binary model/vnd.parasolid.transmit.text model/vnd.vtu model/vrml wrl vrml multipart/alternative multipart/appledouble multipart/byteranges multipart/digest multipart/encrypted multipart/form-data multipart/header-set multipart/mixed multipart/parallel multipart/related multipart/report multipart/signed multipart/voice-message text/calendar ics ifb text/css css text/directory text/enriched text/html html htm text/parityfec text/plain asc txt text/prs.lines.tag text/rfc822-headers text/richtext rtx text/rtf rtf text/sgml sgml sgm text/t140 text/tab-separated-values tsv text/uri-list text/vnd.abc text/vnd.curl text/vnd.dmclientscript text/vnd.fly text/vnd.fmi.flexstor text/vnd.in3d.3dml text/vnd.in3d.spot text/vnd.iptc.nitf text/vnd.iptc.newsml text/vnd.latex-z text/vnd.motorola.reflex text/vnd.ms-mediapackage text/vnd.net2phone.commcenter.command text/vnd.sun.j2me.app-descriptor text/vnd.wap.si text/vnd.wap.sl text/vnd.wap.wml wml text/vnd.wap.wmlscript wmls text/x-setext etx text/xml text/xml-external-parsed-entity video/bmpeg video/bt656 video/celb video/dv video/h261 video/h263 video/h263-1998 video/h263-2000 video/jpeg video/mp1s video/mp2p video/mp2t video/mp4v-es video/mpv video/mpeg mpeg mpg mpe video/nv video/parityfec video/pointer video/quicktime qt mov video/smpte292m video/vnd.fvt video/vnd.motorola.video video/vnd.motorola.videop video/vnd.mpegurl mxu m4u video/vnd.nokia.interleaved-multimedia video/vnd.objectvideo video/vnd.vivo video/x-msvideo avi video/x-sgi-movie movie x-conference/x-cooltalk ice eliom-9.4.0/pkg/filelist.ml000066400000000000000000000112741417032171500155650ustar00rootroot00000000000000type descr = { interface_only : string list; interface : string list; internal : string list; } let server = { interface_only = [ "eliom_content_sigs"; "eliom_form_sigs"; "eliom_parameter_sigs"; "eliom_registration_sigs"; "eliom_service_sigs"; "eliom_shared_sigs"; ]; interface = [ "eliom_bus"; "eliom_client_value"; "eliom_syntax"; "eliom_client"; "eliom_comet"; "eliom_common"; "eliom_config"; "eliom_content"; "eliom_extension"; "eliom_lib"; "eliom_mkreg"; "eliom_notif"; "eliom_parameter"; "eliom_react"; "eliom_shared"; "eliom_cscache"; "eliom_reference"; "eliom_registration"; "eliom_request_info"; "eliom_service"; "eliom_state"; "eliom_tools"; "eliom_types"; "eliom_uri"; "eliom_wrap"; ]; internal = [ "eliom_comet_base"; "eliom_common_base"; "eliom_runtime"; "eliom_content_"; "eliom_content_core"; "eliom_cookies_base"; "eliom_error_pages"; "eliom_form"; "eliom_lazy"; "eliom_lib_base"; "eliom_parameter_base"; "eliom_process"; "eliom_service_base"; "eliom_route"; "eliom_route_base"; "eliom_shared_content"; "eliom_types_base"; "eliom_client_main"; "eliommod"; "eliommod_cli"; "eliommod_cookies"; "eliommod_datasess"; "eliommod_gc"; "eliommod_pagegen"; "eliommod_parameters"; "eliommod_persess"; "eliommod_sersess"; "eliommod_sessadmin"; "eliommod_sessexpl"; "eliommod_sessiongroups"; "eliommod_timeouts"; ] } let client = { interface_only = [ "eliom_content_sigs"; "eliom_form_sigs"; "eliom_parameter_sigs"; "eliom_registration_sigs"; "eliom_service_sigs"; "eliom_shared_sigs"; ]; interface = [ "eliom_bus"; "eliom_client_value"; "eliom_client_core"; "eliom_client"; "eliom_comet"; "eliom_config"; "eliom_content"; "eliom_content_core"; "eliom_lazy"; "eliom_lib"; "eliom_parameter"; "eliom_react"; "eliom_shared"; "eliom_cscache"; "eliom_registration"; "eliom_service"; "eliom_tools"; "eliom_types"; "eliom_unwrap"; "eliom_uri"; ]; internal = [ "eliom_comet_base"; "eliom_common"; "eliom_common_base"; "eliom_runtime"; "eliom_content_"; "eliom_cookies_base"; "eliom_form"; "eliom_lib_base"; "eliom_parameter_base"; "eliom_process"; "eliom_request"; "eliom_request_info"; "eliom_service_base"; "eliom_route"; "eliom_route_base"; "eliom_shared_content"; "eliom_types_base"; "eliommod_cookies"; "eliommod_dom"; "eliommod_parameters"; ]; } let server_ext = { interface_only = []; interface = [ "atom_feed"; "eliom_atom"; "eliom_openid"; "eliom_s2s"]; internal = [] } let ocamlbuild = { interface_only = []; interface = [ "ocamlbuild_eliom" ]; internal = [] } let ppx = { interface_only = []; interface = [ "ppx_eliom" ; "ppx_eliom_client" ; "ppx_eliom_type" ; "ppx_eliom_server" ]; internal = [ "ppx_eliom_utils" ]; } let (-.-) name ext = name ^ "." ^ ext let exts el sl = List.flatten ( List.map (fun ext -> List.map (fun name -> name -.- ext) sl) el) let list_to_file filename list = let oc = open_out filename in List.iter (fun s -> output_string oc s; output_char oc '\n'; ) list; close_out oc;; let client_mllib = client.interface @ client.internal let client_extra = exts ["cmi"] (client.interface_only @ client.interface) let client_api = client.interface_only @ client.interface let server_mllib = server.interface @ server.internal let server_extra = exts ["cmi"] (server.interface_only @ server.interface) @ exts ["cmx"] (server.interface @ server.internal) let server_api = server.interface_only @ server.interface let server_ext_mllib = server_ext.interface @ server_ext.internal let server_ext_extra = exts ["cmi"] (server_ext.interface_only @ server_ext.interface) @ exts ["cmx"] (server_ext.interface @ server_ext.internal) let ocamlbuild_mllib = ocamlbuild.interface @ ocamlbuild.internal let ocamlbuild_extra = exts ["cmi"] (ocamlbuild.interface_only @ ocamlbuild.interface) @ exts ["cmx"] (ocamlbuild.interface @ ocamlbuild.internal) let ocamlbuild_api = ocamlbuild.interface_only @ ocamlbuild.interface let ppx_mllib = ppx.interface @ ppx.internal let ppx_extra = exts ["cmi"] ppx.interface @ exts ["cmx"] (ppx.interface @ ppx.internal) let ppx_api = ppx.interface let templates_dir = "pkg/distillery" let templates = Array.to_list (Sys.readdir templates_dir) let templates_files = List.map (fun name -> name, Array.to_list (Sys.readdir (templates_dir^"/"^name))) templates eliom-9.4.0/pkg/man/000077500000000000000000000000001417032171500141665ustar00rootroot00000000000000eliom-9.4.0/pkg/man/eliom-distillery.1000066400000000000000000000024011417032171500175340ustar00rootroot00000000000000.TH eliom-distillery 1 2012-12-17 .SH NAME eliom-distillery \- Scaffolding for your Eliom-projects. .SH SYNOPSIS .B eliom-distillery .BI \-dir .B eliom-distillery .BI \-name \ name [ .BI \-template \