commit b9d4592b71d28537ff192833f550b453cf17100d Author: Gitea Actions Date: Wed Jun 18 13:33:35 2025 +0000 Deploy site diff --git a/2019/06/12/launching-merlin6-docs.html b/2019/06/12/launching-merlin6-docs.html new file mode 100644 index 0000000..63fd0af --- /dev/null +++ b/2019/06/12/launching-merlin6-docs.html @@ -0,0 +1,367 @@ + + + + + + + + +Merlin 6 documentation available | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + +
+ + + + + + +
+ + + + +
+
+ +
+

Merlin 6 documentation available

+ + + +
+ +
+ + +
More pages will be coming soon.
+ + +

Merlin 6 docs are now available at https://hpce.pages.psi.ch/merlin6!

+ +

More complete documentation will be coming shortly.

+ +
+ + + +
+ + + + +
+ +
+
+ +
+
+ + +
+ +
+ +
+ +
+ + + + diff --git a/2024/08/07/merlin7-preprod-docs.html b/2024/08/07/merlin7-preprod-docs.html new file mode 100644 index 0000000..e7a9ee0 --- /dev/null +++ b/2024/08/07/merlin7-preprod-docs.html @@ -0,0 +1,370 @@ + + + + + + + + +Merlin7 in preproduction | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + +
+ + + + + + +
+ + + + +
+
+ +
+

Merlin7 in preproduction

+ + + +
+ +
+ + +
More pages will be coming soon.
+ + +

The Merlin7 cluster is officially in preproduction. This phase will be tested by a few users +and slowly we will contact other users to be part of it. Keep in mind that access is restricted.

+ +

Merlin7 documentation is now available https://hpce.pages.psi.ch/merlin7/slurm-configuration.html.

+ +

More complete documentation will be coming shortly.

+ +
+ + + +
+ + + + +
+ +
+
+ +
+
+ + +
+ +
+ +
+ +
+ + + + diff --git a/404.html b/404.html new file mode 100644 index 0000000..8e2b7a8 --- /dev/null +++ b/404.html @@ -0,0 +1,376 @@ + + + + + + + + +Page Not Found | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + +
+ + + + + + +
+ + + + +
+
+

Page Not Found

+
+ + + +
+ + + + + + + + +
+ + + + + + +

Sorry, but the page you were trying to view does not exist. Try searching for it or looking at the URL to see if it looks correct.

+ + +
+ +
+ + + + +
+ +
+ +
+
+ +
+
+ + +
+ +
+ +
+ +
+ + + + diff --git a/CSCS/index.html b/CSCS/index.html new file mode 100644 index 0000000..5c6f664 --- /dev/null +++ b/CSCS/index.html @@ -0,0 +1,426 @@ + + + + + + + + +PSI HPC@CSCS | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + +
+ + + + + + +
+ + + + +
+
+

PSI HPC@CSCS

+
+ + + +
+ + + + + + + + +
+ + + + + + +

PSI HPC@CSCS

+ +

PSI has a long standing collaboration with CSCS for offering high end +HPC resources to PSI projects. PSI had co-invested in CSCS’ initial +Cray XT3 supercomputer Horizon in 2005 and we continue to procure a share on the +CSCS flagship systems.

+ +

The share is mainly intended for projects that cannot profit from applying for regular +CSCS user lab allocation schemes.. +We can also help PSI groups to procure additional resources based on the PSI +conditions - please contact us in such a case.

+ +

Capacity of PSI resources at CSCS

+ +

For 2024 PSI we have a share of 400’000 NH (Node Hours) on Piz Daint, and 65 TB of storage.

+ +

CSCS plans to decommission Piz Daint during 2024. All allocations +will be converted to allocations on the new user lab on the CSCS Alps +infrastructure. Users will be informed about the migration process.

+ +

How to request a PSI project

+ +

A survey is sent out to subscribed users once per year, usually in the third quarter. It serves for collecting the CSCS resources requests for the upcoming year.

+ +

Users registered in the PSI HPC@CSCS mailing list psi-hpc-at-cscs@lists.psi.ch will +be contacted to take part in the yearly survey. Please subscribe to the list if you are interested.

+ +

Users need to specify in the survey the total resources they intend to +use next year and also how this is to be split over the 4 quarters +(e.g. 25%, 25%, 25%, 25%), since CSCS allocates recources on a +quarterly basis. We provide the possibility to adapt the distribution +over the course of the active year or shift unused resources to other +projects (contact us on the mailing list).

+ +

By default allocated nodes are on the CPU partition of PizDaint (36 cores per node). +However, allocations to the GPU partition are also possible (1 x NVIDIA P100 and 12 cores per +node).

+ +

CSCS Systems reference information

+ + + +

Contact information

+ + + + +
+ +
+ + + + +
+ +
+ +
+
+ +
+
+ + +
+ +
+ +
+ +
+ + + + diff --git a/CSCS/transfer-data.html b/CSCS/transfer-data.html new file mode 100644 index 0000000..044a89b --- /dev/null +++ b/CSCS/transfer-data.html @@ -0,0 +1,405 @@ + + + + + + + + +Transferring Data betweem PSI and CSCS | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + +
+ + + + + + +
+ + + + +
+
+

Transferring Data betweem PSI and CSCS

+
+ + + +
+ + +
This Document shows the procedure for transferring data between CSCS and PSI
+ + + + + + + +
+ + + + + + +

Transferring Data

+ +

This document shows how to transfer data between PSI and CSCS by using a Linux workstation.

+ +

Preparing SSH configuration

+ +

If the directory .ssh does not exist in your home directory, create it with 0700 permissions:

+ +
mkdir ~/.ssh
+chmod 0700 ~/.ssh
+
+ +

Then, if it does not exist, create a new file .ssh/config, otherwise add the following lines +to the already existing file, by replacing $cscs_accountname by your CSCS username:

+ +
Host daint.cscs.ch
+  Compression yes
+  ProxyJump ela.cscs.ch
+Host *.cscs.ch
+  User $cscs_accountname
+
+ +

Advanced SSH configuration

+ +

There are many different SSH settings available which would allow advanced configurations. +Users may have some configurations already present, therefore would need to adapt it accordingly.

+ +

Transferring files

+ +

Once the above configuration is set, then try to rsync from Merlin to CSCS, on any direction:

+ +
# CSCS -> PSI
+rsync -azv daint.cscs.ch:<source_path> <destination_path>
+
+# PSI  -> CSCS
+rsync -azv <source_path> daint.cscs.ch:<destination_path>
+
+ + + +
+ +
+ + + + +
+ +
+ +
+
+ +
+
+ + +
+ +
+ +
+ +
+ + + + diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..05da615 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,24 @@ +FROM alpine:3.13 + +WORKDIR /tmp +COPY Gemfile /tmp/ +COPY Gemfile.lock /tmp/ + +RUN apk list -I && apk --no-cache add \ + libatomic readline readline-dev libxml2 libxml2-dev \ + ncurses-terminfo-base ncurses-terminfo \ + libxslt libxslt-dev zlib-dev zlib \ + ruby ruby-dev yaml yaml-dev \ + libffi-dev build-base git nodejs \ + && gem env \ + && gem install etc --no-document \ + && gem install bundler -v 2.4.22 --no-document \ + && pwd \ + && ls -l \ + && bundle install + +VOLUME /src +EXPOSE 4001 + +WORKDIR /src +CMD ["jekyll", "serve", "--livereload", "-H", "0.0.0.0"] diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..c4e9e6b --- /dev/null +++ b/Gemfile @@ -0,0 +1,23 @@ +source "https://rubygems.org" + +# to publish on github page +# gem 'github-pages', group: :jekyll_plugins +gem 'github-pages', "~> 215" + +# to publish without github page +# gem "jekyll-redirect-from", group: :jekyll_plugins +gem "jekyll-redirect-from", "~> 0.16.0" +gem "json", "~> 2.2" +gem "webrick", "~> 1.7.0" +gem "etc", "~> 1.2.0" +gem "bigdecimal", "~> 1.4" +gem 'eventmachine', "~> 1.2.7" +gem 'faraday', "~> 1.4.3" +gem 'addressable', "~> 2.7.0" +gem 'faraday-net_http_persistent', "~> 1.1.0" +gem 'ruby2_keywords', "~> 0.0.4" +gem 'rubyzip', "~> 2.3.0" +# +gem 'ffi', "~> 1.15.3" +gem 'http_parser.rb', "~> 0.6.0" # requires mkdir in /usr/bin/mkdir +gem "jekyll", "~> 3.9.0" diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 0000000..5e5a27a --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,292 @@ +GEM + remote: https://rubygems.org/ + specs: + activesupport (6.0.6.1) + concurrent-ruby (~> 1.0, >= 1.0.2) + i18n (>= 0.7, < 2) + minitest (~> 5.1) + tzinfo (~> 1.1) + zeitwerk (~> 2.2, >= 2.2.2) + addressable (2.7.0) + public_suffix (>= 2.0.2, < 5.0) + bigdecimal (1.4.4) + coffee-script (2.4.1) + coffee-script-source + execjs + coffee-script-source (1.11.1) + colorator (1.1.0) + commonmarker (0.17.13) + ruby-enum (~> 0.5) + concurrent-ruby (1.2.3) + dnsruby (1.70.0) + simpleidn (~> 0.2.1) + em-websocket (0.5.3) + eventmachine (>= 0.12.9) + http_parser.rb (~> 0) + etc (1.2.0) + ethon (0.16.0) + ffi (>= 1.15.0) + eventmachine (1.2.7) + execjs (2.9.1) + faraday (1.4.3) + faraday-em_http (~> 1.0) + faraday-em_synchrony (~> 1.0) + faraday-excon (~> 1.1) + faraday-net_http (~> 1.0) + faraday-net_http_persistent (~> 1.1) + multipart-post (>= 1.2, < 3) + ruby2_keywords (>= 0.0.4) + faraday-em_http (1.0.0) + faraday-em_synchrony (1.0.0) + faraday-excon (1.1.0) + faraday-net_http (1.0.1) + faraday-net_http_persistent (1.1.0) + ffi (1.15.5) + forwardable-extended (2.6.0) + gemoji (3.0.1) + github-pages (215) + github-pages-health-check (= 1.17.2) + jekyll (= 3.9.0) + jekyll-avatar (= 0.7.0) + jekyll-coffeescript (= 1.1.1) + jekyll-commonmark-ghpages (= 0.1.6) + jekyll-default-layout (= 0.1.4) + jekyll-feed (= 0.15.1) + jekyll-gist (= 1.5.0) + jekyll-github-metadata (= 2.13.0) + jekyll-mentions (= 1.6.0) + jekyll-optional-front-matter (= 0.3.2) + jekyll-paginate (= 1.1.0) + jekyll-readme-index (= 0.3.0) + jekyll-redirect-from (= 0.16.0) + jekyll-relative-links (= 0.6.1) + jekyll-remote-theme (= 0.4.3) + jekyll-sass-converter (= 1.5.2) + jekyll-seo-tag (= 2.7.1) + jekyll-sitemap (= 1.4.0) + jekyll-swiss (= 1.0.0) + jekyll-theme-architect (= 0.1.1) + jekyll-theme-cayman (= 0.1.1) + jekyll-theme-dinky (= 0.1.1) + jekyll-theme-hacker (= 0.1.2) + jekyll-theme-leap-day (= 0.1.1) + jekyll-theme-merlot (= 0.1.1) + jekyll-theme-midnight (= 0.1.1) + jekyll-theme-minimal (= 0.1.1) + jekyll-theme-modernist (= 0.1.1) + jekyll-theme-primer (= 0.5.4) + jekyll-theme-slate (= 0.1.1) + jekyll-theme-tactile (= 0.1.1) + jekyll-theme-time-machine (= 0.1.1) + jekyll-titles-from-headings (= 0.5.3) + jemoji (= 0.12.0) + kramdown (= 2.3.1) + kramdown-parser-gfm (= 1.1.0) + liquid (= 4.0.3) + mercenary (~> 0.3) + minima (= 2.5.1) + nokogiri (>= 1.10.4, < 2.0) + rouge (= 3.26.0) + terminal-table (~> 1.4) + github-pages-health-check (1.17.2) + addressable (~> 2.3) + dnsruby (~> 1.60) + octokit (~> 4.0) + public_suffix (>= 2.0.2, < 5.0) + typhoeus (~> 1.3) + html-pipeline (2.14.3) + activesupport (>= 2) + nokogiri (>= 1.4) + http_parser.rb (0.6.0) + i18n (0.9.5) + concurrent-ruby (~> 1.0) + jekyll (3.9.0) + addressable (~> 2.4) + colorator (~> 1.0) + em-websocket (~> 0.5) + i18n (~> 0.7) + jekyll-sass-converter (~> 1.0) + jekyll-watch (~> 2.0) + kramdown (>= 1.17, < 3) + liquid (~> 4.0) + mercenary (~> 0.3.3) + pathutil (~> 0.9) + rouge (>= 1.7, < 4) + safe_yaml (~> 1.0) + jekyll-avatar (0.7.0) + jekyll (>= 3.0, < 5.0) + jekyll-coffeescript (1.1.1) + coffee-script (~> 2.2) + coffee-script-source (~> 1.11.1) + jekyll-commonmark (1.3.1) + commonmarker (~> 0.14) + jekyll (>= 3.7, < 5.0) + jekyll-commonmark-ghpages (0.1.6) + commonmarker (~> 0.17.6) + jekyll-commonmark (~> 1.2) + rouge (>= 2.0, < 4.0) + jekyll-default-layout (0.1.4) + jekyll (~> 3.0) + jekyll-feed (0.15.1) + jekyll (>= 3.7, < 5.0) + jekyll-gist (1.5.0) + octokit (~> 4.2) + jekyll-github-metadata (2.13.0) + jekyll (>= 3.4, < 5.0) + octokit (~> 4.0, != 4.4.0) + jekyll-mentions (1.6.0) + html-pipeline (~> 2.3) + jekyll (>= 3.7, < 5.0) + jekyll-optional-front-matter (0.3.2) + jekyll (>= 3.0, < 5.0) + jekyll-paginate (1.1.0) + jekyll-readme-index (0.3.0) + jekyll (>= 3.0, < 5.0) + jekyll-redirect-from (0.16.0) + jekyll (>= 3.3, < 5.0) + jekyll-relative-links (0.6.1) + jekyll (>= 3.3, < 5.0) + jekyll-remote-theme (0.4.3) + addressable (~> 2.0) + jekyll (>= 3.5, < 5.0) + jekyll-sass-converter (>= 1.0, <= 3.0.0, != 2.0.0) + rubyzip (>= 1.3.0, < 3.0) + jekyll-sass-converter (1.5.2) + sass (~> 3.4) + jekyll-seo-tag (2.7.1) + jekyll (>= 3.8, < 5.0) + jekyll-sitemap (1.4.0) + jekyll (>= 3.7, < 5.0) + jekyll-swiss (1.0.0) + jekyll-theme-architect (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-theme-cayman (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-theme-dinky (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-theme-hacker (0.1.2) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-leap-day (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-theme-merlot (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-theme-midnight (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-theme-minimal (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-theme-modernist (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-theme-primer (0.5.4) + jekyll (> 3.5, < 5.0) + jekyll-github-metadata (~> 2.9) + jekyll-seo-tag (~> 2.0) + jekyll-theme-slate (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-theme-tactile (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-theme-time-machine (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-titles-from-headings (0.5.3) + jekyll (>= 3.3, < 5.0) + jekyll-watch (2.2.1) + listen (~> 3.0) + jemoji (0.12.0) + gemoji (~> 3.0) + html-pipeline (~> 2.2) + jekyll (>= 3.0, < 5.0) + json (2.7.1) + kramdown (2.3.1) + rexml + kramdown-parser-gfm (1.1.0) + kramdown (~> 2.0) + liquid (4.0.3) + listen (3.8.0) + rb-fsevent (~> 0.10, >= 0.10.3) + rb-inotify (~> 0.9, >= 0.9.10) + mercenary (0.3.6) + mini_portile2 (2.8.5) + minima (2.5.1) + jekyll (>= 3.5, < 5.0) + jekyll-feed (~> 0.9) + jekyll-seo-tag (~> 2.1) + minitest (5.21.2) + multipart-post (2.3.0) + nokogiri (1.15.5) + mini_portile2 (~> 2.8.2) + racc (~> 1.4) + octokit (4.25.1) + faraday (>= 1, < 3) + sawyer (~> 0.9) + pathutil (0.16.2) + forwardable-extended (~> 2.6) + public_suffix (4.0.7) + racc (1.7.3) + rb-fsevent (0.11.2) + rb-inotify (0.10.1) + ffi (~> 1.0) + rexml (3.2.6) + rouge (3.26.0) + ruby-enum (0.9.0) + i18n + ruby2_keywords (0.0.5) + rubyzip (2.3.2) + safe_yaml (1.0.5) + sass (3.7.4) + sass-listen (~> 4.0.0) + sass-listen (4.0.0) + rb-fsevent (~> 0.9, >= 0.9.4) + rb-inotify (~> 0.9, >= 0.9.7) + sawyer (0.9.2) + addressable (>= 2.3.5) + faraday (>= 0.17.3, < 3) + simpleidn (0.2.1) + unf (~> 0.1.4) + terminal-table (1.8.0) + unicode-display_width (~> 1.1, >= 1.1.1) + thread_safe (0.3.6) + typhoeus (1.4.1) + ethon (>= 0.9.0) + tzinfo (1.2.11) + thread_safe (~> 0.1) + unf (0.1.4) + unf_ext + unf_ext (0.0.9.1) + unicode-display_width (1.8.0) + webrick (1.7.0) + zeitwerk (2.6.12) + +PLATFORMS + ruby + x86_64-linux + +DEPENDENCIES + addressable (~> 2.7.0) + bigdecimal (~> 1.4) + etc (~> 1.2.0) + eventmachine (~> 1.2.7) + faraday (~> 1.4.3) + faraday-net_http_persistent (~> 1.1.0) + ffi (~> 1.15.3) + github-pages (~> 215) + http_parser.rb (~> 0.6.0) + jekyll (~> 3.9.0) + jekyll-redirect-from (~> 0.16.0) + json (~> 2.2) + ruby2_keywords (~> 0.0.4) + rubyzip (~> 2.3.0) + webrick (~> 1.7.0) + +BUNDLED WITH + 2.3.26 diff --git a/apple-touch-icon.png b/apple-touch-icon.png new file mode 100644 index 0000000..b30a589 Binary files /dev/null and b/apple-touch-icon.png differ diff --git a/createtag b/createtag new file mode 100644 index 0000000..4766b6e --- /dev/null +++ b/createtag @@ -0,0 +1,54 @@ +#!/bin/sh + +# Using a 'cat' here document, create a file for jekyll +# website containing what's required for tag pages. + +# Pass in tag name(s) +# ./createtag linux bsd + +CMDLINEPARAM=1 # Takes at least one param. +TAGDIR="pages/tags" + +if [ $# -ge $CMDLINEPARAM ] +then + tags=$@ +else + echo "Atleast ${CMDLINEPARAM} tag name is required." + exit 1 +fi + +if [ -d "${TAGDIR}" ]; then + + echo "Creating tag(s) for ${tags}" + + for tag in ${tags}; do + echo "Title for $tag:" + read title + # Cannot indent here string. +cat <"${TAGDIR}/tag_${tag}.md" +--- +title: "${title}" +tagName: ${tag} +search: exclude +permalink: tag_${tag}.html +sidebar: mydoc_sidebar +hide_sidebar: true +folder: tags +--- + +{% include taglogic.html %} + +{% include links.html %} +EOF + +echo " - ${tag}" >> _data/tags.yml + + done + +else + echo "Directory ${TAGDIR} doesn't exist or you are not in the top-level directory." + echo "Please run again from the root directory of your project." + exit 1 +fi + +exit diff --git a/css/bootstrap.min.css b/css/bootstrap.min.css new file mode 100644 index 0000000..5b96335 --- /dev/null +++ b/css/bootstrap.min.css @@ -0,0 +1,6 @@ +/*! + * Bootstrap v3.4.1 (https://getbootstrap.com/) + * Copyright 2011-2019 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;-moz-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:"Glyphicons Halflings";src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format("embedded-opentype"),url(../fonts/glyphicons-halflings-regular.woff2) format("woff2"),url(../fonts/glyphicons-halflings-regular.woff) format("woff"),url(../fonts/glyphicons-halflings-regular.ttf) format("truetype"),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format("svg")}.glyphicon{position:relative;top:1px;display:inline-block;font-family:"Glyphicons Halflings";font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:"\2014 \00A0"}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:""}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:"\00A0 \2014"}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.row-no-gutters{margin-right:0;margin-left:0}.row-no-gutters [class*=col-]{padding-right:0;padding-left:0}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:none;-moz-appearance:none;appearance:none}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s,-webkit-box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=datetime-local].form-control,input[type=month].form-control,input[type=time].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],.input-group-sm input[type=time],input[type=date].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm,input[type=time].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],.input-group-lg input[type=time],input[type=date].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg,input[type=time].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;margin-bottom:0;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;padding:6px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);opacity:.65;-webkit-box-shadow:none;box-shadow:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;background-image:none;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;background-image:none;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;background-image:none;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;background-image:none;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;background-image:none;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;background-image:none;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-right:15px;margin-top:8px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-right:-15px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);margin-top:8px;margin-bottom:8px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0%;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out,-o-transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5);outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.42857143;line-break:auto;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;font-size:12px;filter:alpha(opacity=0);opacity:0}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.42857143;line-break:auto;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;font-size:14px;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover>.arrow{border-width:11px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out,-o-transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);left:0}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);left:0}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);left:0}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:rgba(0,0,0,0);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;outline:0;filter:alpha(opacity=90);opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:"\2039"}.carousel-control .icon-next:before{content:"\203a"}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} +/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/css/boxshadowproperties.css b/css/boxshadowproperties.css new file mode 100644 index 0000000..0f2e1e6 --- /dev/null +++ b/css/boxshadowproperties.css @@ -0,0 +1,24 @@ +/* box-shadow fonts return errors with prince, so extracting here to put in web output only */ + +#search-demo-container ul#results-container { + box-shadow: 2px 3px 2px #dedede; +} + + +hr.shaded { + box-shadow: inset 0 6px 6px -6px rgba(0,0,0,0.5); +} + +.videoThumbs img { + box-shadow: 2px 2px 1px #f0f0f0; +} + +.box { + box-shadow: 2px 2px 4px #dedede; +} + +@media (max-width: 1200px) { + .navbar-collapse { + box-shadow: inset 0 1px 0 rgba(255,255,255,0.1); + } +} diff --git a/css/customstyles.css b/css/customstyles.css new file mode 100644 index 0000000..1b4e34b --- /dev/null +++ b/css/customstyles.css @@ -0,0 +1,1217 @@ +body { + font-size:15px; +} + +/* HPCE Custom CSS styles - BEGIN */ +pre.terminal { + background-color: black; + color: white; + font-size: 75%; + font-family: Consolas,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,Courier New, monospace; + width: 100%; + display: inline-block; +} +details { + border: 1px solid #347DBE; + border-radius: 4px; + padding: .5em .5em 0; + color: #347DBE +} + +summary { + font-weight: bold; + margin: -.5em -.5em 0; + padding: .5em; +} + +details[open] { + padding: .5em; +} + +details[open] summary { + border-bottom: 1px solid #347DBE; + margin-bottom: .5em; +} +/* HPCE Custom CSS styles - END */ + +.bs-callout { + padding: 20px; + margin: 20px 0; + border: 1px solid #eee; + border-left-width: 5px; + border-radius: 3px; +} +.bs-callout h4 { + margin-top: 0; + margin-bottom: 5px; +} +.bs-callout p:last-child { + margin-bottom: 0; +} +.bs-callout code { + border-radius: 3px; +} +.bs-callout+.bs-callout { + margin-top: -5px; +} +.bs-callout-default { + border-left-color: #777; +} +.bs-callout-default h4 { + color: #777; +} +.bs-callout-primary { + border-left-color: #428bca; +} +.bs-callout-primary h4 { + color: #428bca; +} +.bs-callout-success { + border-left-color: #5cb85c; +} +.bs-callout-success h4 { + color: #5cb85c; +} +.bs-callout-danger { + border-left-color: #d9534f; +} +.bs-callout-danger h4 { + color: #d9534f; +} +.bs-callout-warning { + border-left-color: #f0ad4e; +} +.bs-callout-warning h4 { + color: #f0ad4e; +} +.bs-callout-warning .text-warning { + color: #f0ad4e; +} +.bs-callout-info { + border-left-color: #5bc0de; +} +.bs-callout-info h4 { + color: #5bc0de; +} + + +.gi-2x{font-size: 2em;} +.gi-3x{font-size: 3em;} +.gi-4x{font-size: 4em;} +.gi-5x{font-size: 5em;} + + + + + +.breadcrumb > .active {color: #777 !important;} + +/* make room for the nav bar */ +h1[id], +h2[id], +h3[id], +h4[id], +h5[id], +h6[id], +dt[id]{ +padding-top: 60px; +margin-top: -40px +} + +.post-content img { + margin-top: 12px; + margin-bottom: 3px; + max-width: 100%; + max-height: 100%; +} + +.post-content ol li, .post-content ul li { + margin: 10px 0px; +} + +.pageSummary { + font-size:13px; + display:block; + margin-bottom:15px; + padding-left:20px; +} + +.post-summary { + margin-bottom:12px; +} + +.bs-example{ + margin: 20px; +} + +.breadcrumb li { + color: gray; +} + +table { + background-color: transparent; +} +caption { + padding-top: 8px; + padding-bottom: 8px; + color: #777; + text-align: left; +} +th { + text-align: left; +} +table { + max-width: 90%; + margin-bottom: 20px; + border: 1px solid #dedede; +} + +table > thead > tr > th, +table > tbody > tr > th, +table > tfoot > tr > th, +table > thead > tr > td, +table > tbody > tr > td, +table > tfoot > tr > td { + padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border-top: 1px solid #ddd; +} +table > thead > tr > th { + vertical-align: bottom; + border-bottom: 2px solid #ddd; + text-transform: none; + background-color: #777; + color: white; + text-align: left; +} +table > caption + thead > tr:first-child > th, +table > colgroup + thead > tr:first-child > th, +table > thead:first-child > tr:first-child > th, +table > caption + thead > tr:first-child > td, +table > colgroup + thead > tr:first-child > td, +table > thead:first-child > tr:first-child > td { + border-top: 0; +} + +table > tbody > tr:nth-of-type(odd) { + background-color: #f9f9f9; +} + +table col[class*="col-"] { + position: static; + display: table-column; + float: none; +} +table td[class*="col-"], +table th[class*="col-"] { + position: static; + display: table-cell; + float: none; +} + +table tr td { + hyphens: auto; +} + + +p.external a { + text-align:right; + font-size:12px; + color: #0088cc; + display:inline; +} + +#definition-box-container div a.active { + font-weight: bold; +} +p.post-meta {font-size: 80%; color: #777;} + +.entry-date{font-size:14px;font-size:0.875rem;line-height:1.71429;margin-bottom:0;text-transform:uppercase;} + +/* search area */ +#search-demo-container ul#results-container { + list-style: none; + font-size: 12px; + background-color: white; + position: absolute; + top: 40px; /* if you change anything about the nav, you'll prob. need to reset the top and left values here.*/ + left: 20px; + z-index: -1; + width:223px; + border-left: 1px solid #dedede; +} + + +ul#results-container a { + background-color: transparent; +} + +ul#results-container a:hover { + color: black; +} + + +#search-demo-container a:hover { + color: black; +} +#search-input { + padding: .5em; + margin-left:20px; + width:20em; + font-size: 0.8em; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + margin-top:10px; +} +/* end search */ + +.filter-options { + margin-bottom: 20px; +} +.filter-options button { + margin: 3px; +} + +div#toc ul li { + margin: 8px 0px 8px 22px; + font-size: 90%; + list-style: square; +} +div#toc ul { + background-color: whitesmoke; + padding: 5px; + border-radius: 5px; + max-width: 300px; + color: gray; +} + +div#toc ul li ul { + padding-left:8px; + +} + +div#toc ul li ul li::before { + content: "– "; +} + +div#toc >ul::before { + content: "Table of Contents"; + font-weight: 500; + color: #555; + text-align:center; + margin-left:auto; + margin-right:auto; + width:70px; + padding-top:20px; + padding-bottom:20px; + padding-left:10px; +} + +li.dropdownActive a { + font-weight: bold; +} + + +.post-content a.fa-rss { + color: orange; +} + + +.navbar-inverse .navbar-nav > li > a { + background-color: transparent; + margin-top:10px; +} + +.post-content .rssfeedLink { + color: #248EC2; +} + +footer { + font-size: smaller; +} + +/* FAQ page */ +#accordion .panel-heading { + font-size: 12px; +} + +a.accordion-toggle, a.accordion-collapsed { + font-size: 14px; + text-decoration: none; +} + +/* navgoco sidebar styles (customized) */ +.nav, .nav ul, .nav li { + list-style: none; +} + +.nav ul { + padding: 0; + /*margin: 0 0 0 18px;*/ + margin:0px; +} + +.nav { + /* padding: 4px;*/ + padding:0px; + margin: 0px; +} + +.nav > li { + margin: 1px 0; +} + +.nav > li li { + margin: 2px 0; +} + +.nav a { + color: #333; + display: block; + outline: none; + /*-webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px;*/ + text-decoration: none; +} + +.nav li > a > span { + float: right; + font-size: 19px; + font-weight: bolder; +} + + +.nav li > a > span:after { + content: '\25be'; +} +.nav li.active > a > span:after { + content: '\25b4'; +} + +.nav a:hover, .nav li.active > a { + background-color: #8D8D8D; + color: #f5f5f5; +} + +.nav > li.active > a { +background-color: #347DBE; +} + +.nav li a { + font-size: 12px; + line-height: 18px; + padding: 2px 10px; + background-color: #f1f1f1; +} + +.nav > li > a { + font-size: 14px; + line-height: 20px; + padding: 4px 10px; +} + +ul#mysidebar { + border-radius:0px; +} + +.nav ul li ul li a { + padding-left:40px; +} + +.nav li.thirdlevel > a { + color: #248EC2; + font-weight:bold; + padding-left:20px; + background-color: whitesmoke !important; +} + + +.nav ul li a { + background-color: #FAFAFA; +} + +.nav li a { + padding-right:10px; +} + +.nav li a:hover { + background-color: #8D8D8D; +} + +.nav ul li a { + border-top:1px solid whitesmoke; + padding-left:10px; +} +/* end sidebar */ + +.navbar-inverse .navbar-nav > .active > a, .navbar-inverse .navbar-nav > .active > a:hover, .navbar-inverse .navbar-nav > .active > a:focus { + border-radius:5px; +} + +.navbar-inverse .navbar-nav>.open>a, .navbar-inverse .navbar-nav>.open>a:focus, .navbar-inverse .navbar-nav>.open>a:hover { + border-radius: 5px; +} + +span.projectTitle { + font-family: Helvetica; + font-weight: bold; +} + +.footer { + text-align: right; +} + +.footerMeta { + background-color: whitesmoke; + padding: 10px; + max-width: 250px; + border-radius: 5px; + margin-top: 50px; + font-style:italic; + font-size:12px; +} + +img.screenshotSmall { + max-width: 300px; +} + + +dl dt p { + margin-left:20px; +} + + +dl dd { + margin-top:10px; + margin-bottom:10px; +} + +dl.dl-horizontal dd { + padding-top: 20px; +} + +figcaption { + + padding-bottom:12px; + padding-top:6px; + max-width: 90%; + margin-bottom:20px; + font-style: italic; + color: gray; + +} + +.testing { + color: orange; +} + +.preference { + color: red; +} + + +table.dataTable thead { + background-color: #444; +} +table td { + hyphens: auto; +} + +section table tr.success { + background-color: #dff0d8 !important; +} + +table tr.info { + background-color: #d9edf7 !important; +} + +section table tr.warning, table tr.testing, table tr.testing > td.sorting_1 { + background-color: #fcf8e3 !important; +} +section table tr.danger, table tr.preference, table tr.preference > td.sorting_1 { + background-color: #f2dede !important; +} + +.orange { + color: orange; +} + +table.profile thead tr th { + background-color: #248ec2; +} + +table.request thead tr th { + background-color: #ED1951; +} + +.audienceLabel { + margin: 10px; + float: right; + border:1px solid #dedede; + padding:7px; +} + +.prefaceAudienceLabel { + color: gray; + text-align: center; + margin:5px; +} +span.myLabel { + padding-left:10px; + padding-right:10px; +} + +button.cursorNorm { + cursor: default; +} + +a.dropdown-toggle, .navbar-inverse .navbar-nav > li > a { + margin-left: 10px; +} + +hr.faded { + border: 0; + height: 1px; + background-image: -webkit-linear-gradient(left, rgba(0,0,0,0), rgba(0,0,0,0.75), rgba(0,0,0,0)); + background-image: -moz-linear-gradient(left, rgba(0,0,0,0), rgba(0,0,0,0.75), rgba(0,0,0,0)); + background-image: -ms-linear-gradient(left, rgba(0,0,0,0), rgba(0,0,0,0.75), rgba(0,0,0,0)); + background-image: -o-linear-gradient(left, rgba(0,0,0,0), rgba(0,0,0,0.75), rgba(0,0,0,0)); +} + +hr.shaded { + height: 12px; + border: 0; + margin-top: 70px; + background: white; + width: 100%; + margin-bottom: 10px; +} + +.fa-6x{font-size:900%;} +.fa-7x{font-size:1100%;} +.fa-8x{font-size:1300%;} +.fa-9x{font-size:1500%;} +.fa-10x{font-size:1700%;} + +i.border { + padding: 10px 20px; + background-color: whitesmoke; +} + +a[data-toggle] { + color: #248EC2; +} + +.summary { + font-size:120%; + color: #808080; + margin:20px 0px 20px 0px; + border-left: 5px solid #ED1951; + padding-left: 10px; + +} + +.summary:before { + content: "Summary: "; + font-weight: bold; +} + + +a.fa.fa-envelope-o.mailto { + font-weight: 600; +} + +h3 {color: #ED1951; font-weight:normal; font-size:130%;} +h4 {color: #808080; font-weight:normal; font-size:120%; font-style:italic;} + +.alert, .callout { + overflow: hidden; +} + +.nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus { + background-color: #248ec2; + color: white; +} + +ol li ol li {list-style-type: lower-alpha;} +ol li ul li {list-style-type: disc;} + +li img {clear:both; } + +div#toc ul li ul li { + list-style-type: none; + margin: 5px 0px 0px 0px; +} + +.tab-content { + padding: 15px; + background-color: #FAFAFA; +} + +span.tagTitle {font-weight: 500;} + +li.activeSeries { + font-weight: bold; +} + +.seriesContext .dropdown-menu li.active { + font-weight: bold; + margin-left: 43px; + font-size:18px; +} + +.alert-warning { + color: #444; +} + +div.alert code, h2 code { + background-color: transparent !important; +} +/* without this, the links in these notes aren't visible.*/ +.alert a { + text-decoration: underline; +} + +div.tags {padding: 10px 5px;} + +.tabLabel { + font-weight: normal; +} + +hr { + background: #999; + margin: 30px 0px; + width: 90%; + margin-left: auto; + margin-right: auto; +} + +button.cursorNorm { + cursor: pointer; +} + +h2 { + font-size:24px; + line-height:29px; +} +span.otherProgrammingLanguages { + font-style: normal; +} + +a[data-toggle="tooltip"] { + color: #649345; + font-style: italic; + cursor: default; +} + +.seriesNext, .seriesContext { + margin-top: 15px; + margin-bottom: 15px; +} + +.seriescontext ol li { + list-style-type: upper-roman; +} + +ol.series li { + list-style-type: decimal; + margin-left: 40px; + padding-left: 0px; +} + +.siteTagline { + font-size: 200%; + font-weight: bold; + color: silver; + font-family: monospace; + text-align: center; + line-height: 10px; + margin: 20px 0px; + display: block; +} + +.versionTagline { + text-align: center; + margin-bottom: 20px; + font-family: courier; + color: silver; + color: #444; + display:block; +} + +/* not sure if using this ...*/ +.navbar-inverse .navbar-collapse, .navbar-inverse .navbar-form { + border-color: #248ec2 !important; +} + +#mysidebar .nav ul { + background-color: #FAFAFA; +} +.nav ul.series li { + list-style: decimal; + font-size:12px; +} + +.nav ul.series li a:hover { + background-color: gray; +} +.nav ul.series { + padding-left: 30px; +} + +.nav ul.series { + background-color: #FAFAFA; +} + +/* +a.dropdown-toggle.otherProgLangs { + color: #f7e68f !important; +} +*/ + +span.muted {color: #666;} + +table code {background-color: transparent;} + +.highlight .err { + color: #a61717; + background-color: transparent !important; +} + +table p { + margin-top: 12px; + margin-bottom: 12px; +} + +pre, table code { + white-space: pre-wrap; /* css-3 */ + white-space: -moz-pre-wrap; /* Mozilla, since 1999 */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + word-wrap: break-word; /* Internet Explorer 5.5+ */ +} + +pre { + margin: 25px 0px; +} + +#json-box-container pre { + margin: 0px; +} + +.video-js { + margin: 30px 0px; +} + +video { + display: block; + margin: 30px 0px; + border: 1px solid #c0c0c0; +} + + +p.required, p.dataType {display: block; color: #c0c0c0; font-size: 80%; margin-left:4px;} + +dd {margin-left:20px;} + +.post-content img.inline { + margin:0px; + margin-bottom:6px; +} +.panel-heading { + font-weight: bold; +} + +.note code, .alert code, .warning code, div#toc code, h2 code, h3 code, h4 code { + color: inherit; + padding: 0px; +} + +.alert { + margin-bottom:10px; + margin-top:10px; +} + +a.accordion-toggle { + font-style: normal; +} + +span.red { + color: red; + font-family: Monaco, Menlo, Consolas, "Courier New", monospace; +} + +h3.codeExplanation { + font-size:18px; + font-style:normal; + color: black; + line-height: 24px; +} + +span.soft { + color: #c0c0c0; +} + +.githubEditButton { + margin-bottom:7px; +} + +.endpoint { + padding: 15px; + background-color: #f0f0f0; + font-family: courier; + font-size: 110%; + margin: 20px 0px; + color: #444; +} + +.parameter { + font-family: courier; + color: red !important; +} + +.formBoundary { + border: 1px solid gray; + padding: 15px; + margin: 15px 0px; + background-color: whitesmoke; +} + +@media (max-width: 767px) { + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { + color: #444; + } +} + +@media (max-width: 990px) { + #mysidebar { + position: relative; + } +} + +@media (min-width: 1000px) { + + ul#mysidebar { + width: 225px; + } +} + +@media (max-width: 900px) { + + ul#mysidebar { + max-width: 100%; + } +} + +.col-md-9 img { + max-width: 100%; + max-height: 100%; +} + + +.col-md-9 img { + max-width: 100%; + max-height: 100%; +} + +.videoThumbs img { + float: left; + margin:15px 15px 15px 0px; + border: 1px solid #dedede; +} + +@media only screen and (min-width: 900px), only screen and (min-device-width: 900px) { + .col-md-9 img { + max-width: 700px; + max-height: 700px; + } +} + +*:hover > .anchorjs-link { + transition: color .25s linear; + text-decoration: none; +} + +.kbCaption { + color: white; + background-color: #444; + padding:10px; +} + +/* this part adds an icon after external links, using FontAwesome*/ +a[href^="http://"]:after, a[href^="https://"]:after { + content: "\f08e"; + font-family: FontAwesome; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: none; + padding-left: 3px; +} + +/* Strip the outbound icon when this class is present */ +a[href].noCrossRef::after, +a.no_icon:after + { + content:"" !important; + padding-left: 0; +} + +.btn-default { + margin-bottom: 10px; +} + +/* algolia search */ + +.search { + text-align: left; +} +.search input { + font-size: 20px; + width: 300px; +} +.results { + margin: auto; + text-align: left; +} +.results ul { + list-style-type: none; + padding: 0; +} + +/* algolia */ + +div.results { + position: absolute; + background-color: white; + width: 100%; +} + +.post-meta { + font-size: 14px; + color: #828282; +} + +.post-link { + font-size: 22px; +} + +.post-list p { + margin: 10px 0px; +} + +time { + margin-right: 10px; +} + +p.post-meta time { + margin-right: 0px; +} + +span.label.label-default { + background-color: gray; +} + +span.label.label-primary { + background-color: #f0ad4e; +} +.col-lg-12 .nav li a {background-color: white} + + +.nav li.active > a.subfoldersTitle { + background-color: whitesmoke; + font-weight: bold; + color: black; + } + +a code { + color: #248EC2; +} + +code + a > code { + margin-left: -7px; +} + +table th code { + color: white; +} + +ol li ul li ol li { + list-style: decimal; +} + +ol li ul li ol li ul li{ + list-style: disc; +} + +.post-content table th { + vertical-align: top; +} + +table thead th code.highlighter-rouge { + background-color: transparent; +} + + +.box { + padding: 10px; + border: 1px solid #888; + width: 100px; + height: 80px; + background-color: #f5f5f5; + font-family: Arial; + font-size: 12px; + hyphens: auto; + float: left; + font-size: 12px; +} + +.box:hover { + background-color: #f0f0f0; +} + +#userMap { + overflow-x: auto; + overflow-y: auto; + padding: 20px; + min-width: 770px; +} + +#userMap .active { + background-color: #d6f5d6; + border:1px solid #555; + font-weight: bold; +} + +h2.userMapTitle { + font-family: Arial; +} + +#userMap a:hover { + text-decoration: none; + } + +div.arrow { + max-width: 50px; + margin-left: 15px; + margin-right: 15px; + font-size: 20px; +} + +div.content { + max-width: 110px +} + +#userMap div.arrow, #userMap div.content { + float: left; +} + +.clearfix { + clear: both; +} + + +#userMap div.arrow { + position: relative; + top: 30px; +} + +.box1 { + margin-left:0px; +} + +button.btn.btn-default.btn-lg.modalButton1 { + margin-left: -20px; +} + +div.box.box1 { + margin-left: -20px; +} + +#userMap .btn-lg { + width: 100px; + height: 80px; + +} + +#userMap .complexArrow { + font-size: 22px; + margin: 0px 10px; +} + + +#userMap .btn-lg .active { + background-color: #d6f5d6; +} + +#userMap .btn-lg { + white-space: pre-wrap; /* css-3 */ + white-space: -moz-pre-wrap; /* Mozilla, since 1999 */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + word-wrap: break-word; /* Internet Explorer 5.5+ */ + font-size: 14px; + } + +/* + * Let's target IE to respect aspect ratios and sizes for img tags containing SVG files + * + * [1] IE9 + * [2] IE10+ + */ +/* 1 */ +.ie9 img[src$=".svg"] { + width: 100%; +} +/* 2 */ +@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { + img[src$=".svg"] { + width: 100%; + } +} + +h4.panel-title { + padding-top: 0px; + margin-top: 0px; +} + +/*set navbar breakpoint so that it converts to hamburger earlier */ + +@media (max-width: 1200px) { + .navbar-header { + float: none; + } + .navbar-left,.navbar-right { + float: none !important; + } + .navbar-toggle { + display: block; + } + .navbar-collapse { + border-top: 1px solid transparent; + } + .navbar-fixed-top { + top: 0; + border-width: 0 0 1px; + } + .navbar-collapse.collapse { + display: none!important; + } + .navbar-nav { + float: none!important; + margin-top: 7.5px; + } + .navbar-nav>li { + float: none; + } + .navbar-nav>li>a { + padding-top: 10px; + padding-bottom: 10px; + } + .collapse.in{ + display:block !important; + } +} diff --git a/css/font-awesome.min.css b/css/font-awesome.min.css new file mode 100644 index 0000000..0e0645d --- /dev/null +++ b/css/font-awesome.min.css @@ -0,0 +1,4 @@ +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:'FontAwesome';src:url('fonts/fontawesome-webfont.eot?v=4.7.0');src:url('fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),url('fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'),url('fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),url('fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} diff --git a/css/fonts/FontAwesome.otf b/css/fonts/FontAwesome.otf new file mode 100644 index 0000000..401ec0f Binary files /dev/null and b/css/fonts/FontAwesome.otf differ diff --git a/css/fonts/fontawesome-webfont.eot b/css/fonts/fontawesome-webfont.eot new file mode 100644 index 0000000..e9f60ca Binary files /dev/null and b/css/fonts/fontawesome-webfont.eot differ diff --git a/css/fonts/fontawesome-webfont.svg b/css/fonts/fontawesome-webfont.svg new file mode 100644 index 0000000..855c845 --- /dev/null +++ b/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/css/fonts/fontawesome-webfont.ttf b/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000..35acda2 Binary files /dev/null and b/css/fonts/fontawesome-webfont.ttf differ diff --git a/css/fonts/fontawesome-webfont.woff b/css/fonts/fontawesome-webfont.woff new file mode 100644 index 0000000..400014a Binary files /dev/null and b/css/fonts/fontawesome-webfont.woff differ diff --git a/css/fonts/fontawesome-webfont.woff2 b/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 0000000..4d13fc6 Binary files /dev/null and b/css/fonts/fontawesome-webfont.woff2 differ diff --git a/css/modern-business.css b/css/modern-business.css new file mode 100755 index 0000000..b0323c5 --- /dev/null +++ b/css/modern-business.css @@ -0,0 +1,89 @@ +/*! + * Start Bootstrap - Modern Business HTML Template (http://startbootstrap.com) + * Code licensed under the Apache License v2.0. + * For details, see http://www.apache.org/licenses/LICENSE-2.0. + */ + +/* Global Styles */ + +html, +body { + height: 100%; +} + +.img-portfolio { + margin-bottom: 30px; +} + +.img-hover:hover { + opacity: 0.8; +} + +/* Home Page Carousel */ + +header.carousel { + height: 50%; +} + +header.carousel .item, +header.carousel .item.active, +header.carousel .carousel-inner { + height: 100%; +} + +header.carousel .fill { + width: 100%; + height: 100%; + background-position: center; + background-size: cover; +} + +/* 404 Page Styles */ + +.error-404 { + font-size: 100px; +} + +/* Pricing Page Styles */ + +.price { + display: block; + font-size: 50px; + line-height: 50px; +} + +.price sup { + top: -20px; + left: 2px; + font-size: 20px; +} + +.period { + display: block; + font-style: italic; +} + +/* Footer Styles */ + +footer { + margin: 50px 0; +} + +/* Responsive Styles */ + +@media(max-width:991px) { + .client-img, + .img-related { + margin-bottom: 30px; + } +} + +@media(max-width:767px) { + .img-portfolio { + margin-bottom: 15px; + } + + header.carousel .carousel { + height: 70%; + } +} diff --git a/css/printstyles.css b/css/printstyles.css new file mode 100644 index 0000000..64d0f63 --- /dev/null +++ b/css/printstyles.css @@ -0,0 +1,159 @@ + +/*body.print .container {max-width: 650px;}*/ + +body { + font-size:14px; +} +.nav ul li a {border-top:0px; background-color:transparent; color: #808080; } +#navig a[href] {color: #595959 !important;} +table .table {max-width:650px;} + +#navig li.sectionHead {font-weight: bold; font-size: 18px; color: #595959 !important; } +#navig li {font-weight: normal; } + +#navig a[href]::after { content: leader(".") target-counter(attr(href), page); } + +a[href]::after { + content: " (page " target-counter(attr(href), page) ")" +} + +a[href^="http:"]::after, a[href^="https:"]::after { + content: ""; +} + +a[href] { + color: blue !important; +} +a[href*="mailto"]::after, a[data-toggle="tooltip"]::after, a[href].noCrossRef::after { + content: ""; +} + + +@page { + margin: 60pt 90pt 60pt 90pt; + font-family: sans-serif; + font-style:none; + color: gray; + +} + +.printTitle { + line-height:30pt; + font-size:27pt; + font-weight: bold; + letter-spacing: -.5px; + margin-bottom:25px; +} + +.printSubtitle { + font-size: 19pt; + color: #cccccc !important; + font-family: "Grotesque MT Light"; + line-height: 22pt; + letter-spacing: -.5px; + margin-bottom:20px; +} +.printTitleArea hr { + color: #999999 !important; + height: 2px; + width: 100%; +} + +.printTitleImage { + max-width:300px; + margin-bottom:200px; +} + + +.printTitleImage { + max-width: 250px; +} + +#navig { + /*page-break-before: always;*/ +} + +.copyrightBoilerplate { + page-break-before:always; + font-size:14px; +} + +.lastGeneratedDate { + font-style: italic; + font-size:14px; + color: gray; +} + +.alert a { + text-decoration: none !important; +} + + +body.title { page: title } + +@page title { + @top-left { + content: " "; + } + @top-right { + content: " " + } + @bottom-right { + content: " "; + } + @bottom-left { + content: " "; + } +} + +body.frontmatter { page: frontmatter } +body.frontmatter {counter-reset: page 1} + + +@page frontmatter { + @top-left { + content: prince-script(guideName); + } + @top-right { + content: prince-script(datestamp); + } + @bottom-right { + content: counter(page, lower-roman); + } + @bottom-left { + content: "youremail@domain.com"; } +} + +body.first_page {counter-reset: page 1} + +h1 { string-set: doctitle content() } + +@page { + @top-left { + content: string(doctitle); + font-size: 11px; + font-style: italic; + } + @top-right { + content: prince-script(datestamp); + font-size: 11px; + } + + @bottom-right { + content: "Page " counter(page); + font-size: 11px; + } + @bottom-left { + content: prince-script(guideName); + font-size: 11px; + } +} +.alert { + background-color: #fafafa !important; + border-color: #dedede !important; + color: black; +} + +pre { + background-color: #fafafa; +} diff --git a/css/syntax.css b/css/syntax.css new file mode 100644 index 0000000..1e651cf --- /dev/null +++ b/css/syntax.css @@ -0,0 +1,60 @@ +.highlight { background: #ffffff; } +.highlight .c { color: #999988; font-style: italic } /* Comment */ +.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */ +.highlight .k { font-weight: bold } /* Keyword */ +.highlight .o { font-weight: bold } /* Operator */ +.highlight .cm { color: #999988; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #999999; font-weight: bold } /* Comment.Preproc */ +.highlight .c1 { color: #999988; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #999999; font-weight: bold; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */ +.highlight .gd .x { color: #000000; background-color: #ffaaaa } /* Generic.Deleted.Specific */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .gr { color: #aa0000 } /* Generic.Error */ +.highlight .gh { color: #999999 } /* Generic.Heading */ +.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */ +.highlight .gi .x { color: #000000; background-color: #aaffaa } /* Generic.Inserted.Specific */ +.highlight .go { color: #888888 } /* Generic.Output */ +.highlight .gp { color: #555555 } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #aaaaaa } /* Generic.Subheading */ +.highlight .gt { color: #aa0000 } /* Generic.Traceback */ +.highlight .kc { font-weight: bold } /* Keyword.Constant */ +.highlight .kd { font-weight: bold } /* Keyword.Declaration */ +.highlight .kp { font-weight: bold } /* Keyword.Pseudo */ +.highlight .kr { font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #445588; font-weight: bold } /* Keyword.Type */ +.highlight .m { color: #009999 } /* Literal.Number */ +.highlight .s { color: #d14 } /* Literal.String */ +.highlight .na { color: #008080 } /* Name.Attribute */ +.highlight .nb { color: #0086B3 } /* Name.Builtin */ +.highlight .nc { color: #445588; font-weight: bold } /* Name.Class */ +.highlight .no { color: #008080 } /* Name.Constant */ +.highlight .ni { color: #800080 } /* Name.Entity */ +.highlight .ne { color: #990000; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #990000; font-weight: bold } /* Name.Function */ +.highlight .nn { color: #555555 } /* Name.Namespace */ +.highlight .nt { color: #000080 } /* Name.Tag */ +.highlight .nv { color: #008080 } /* Name.Variable */ +.highlight .ow { font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mf { color: #009999 } /* Literal.Number.Float */ +.highlight .mh { color: #009999 } /* Literal.Number.Hex */ +.highlight .mi { color: #009999 } /* Literal.Number.Integer */ +.highlight .mo { color: #009999 } /* Literal.Number.Oct */ +.highlight .sb { color: #d14 } /* Literal.String.Backtick */ +.highlight .sc { color: #d14 } /* Literal.String.Char */ +.highlight .sd { color: #d14 } /* Literal.String.Doc */ +.highlight .s2 { color: #d14 } /* Literal.String.Double */ +.highlight .se { color: #d14 } /* Literal.String.Escape */ +.highlight .sh { color: #d14 } /* Literal.String.Heredoc */ +.highlight .si { color: #d14 } /* Literal.String.Interpol */ +.highlight .sx { color: #d14 } /* Literal.String.Other */ +.highlight .sr { color: #009926 } /* Literal.String.Regex */ +.highlight .s1 { color: #d14 } /* Literal.String.Single */ +.highlight .ss { color: #990073 } /* Literal.String.Symbol */ +.highlight .bp { color: #999999 } /* Name.Builtin.Pseudo */ +.highlight .vc { color: #008080 } /* Name.Variable.Class */ +.highlight .vg { color: #008080 } /* Name.Variable.Global */ +.highlight .vi { color: #008080 } /* Name.Variable.Instance */ +.highlight .il { color: #009999 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/css/theme-blue.css b/css/theme-blue.css new file mode 100644 index 0000000..db84521 --- /dev/null +++ b/css/theme-blue.css @@ -0,0 +1,121 @@ +.summary { + color: #808080; + border-left: 5px solid #ED1951; + font-size:16px; +} + + +h3 {color: #ED1951; } +h4 {color: #808080; } + +.nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus { + background-color: #248ec2; + color: white; +} + +.nav > li.active > a { + background-color: #347DBE; +} + +.nav > li > a:hover { + background-color: #248ec2; +} + +div.navbar-collapse .dropdown-menu > li > a:hover { + background-color: #347DBE; +} + +.nav li.thirdlevel > a { + background-color: #FAFAFA !important; + color: #248EC2; + font-weight: bold; +} + +a[data-toggle="tooltip"] { + color: #649345; + font-style: italic; + cursor: default; +} + +.navbar-inverse { + background-color: #347DBE; + border-color: #015CAE; +} +.navbar-inverse .navbar-nav>li>a, .navbar-inverse .navbar-brand { + color: white; +} + +.navbar-inverse .navbar-nav>li>a:hover, a.fa.fa-home.fa-lg.navbar-brand:hover { + color: #f0f0f0; +} + +a.navbar-brand:hover { + color: #f0f0f0; +} + +.navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .open > a:hover, .navbar-inverse .navbar-nav > .open > a:focus { + color: #015CAE; +} + +.navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .open > a:hover, .navbar-inverse .navbar-nav > .open > a:focus { + background-color: #015CAE; + color: #ffffff; +} + +.navbar-inverse .navbar-collapse, .navbar-inverse .navbar-form { + border-color: #248ec2 !important; +} + +.btn-primary { + color: #ffffff; + background-color: #347DBE; + border-color: #347DBE; +} + +.navbar-inverse .navbar-nav > .active > a, .navbar-inverse .navbar-nav > .active > a:hover, .navbar-inverse .navbar-nav > .active > a:focus { + background-color: #347DBE; +} + +.btn-primary:hover, +.btn-primary:focus, +.btn-primary:active, +.btn-primary.active, +.open .dropdown-toggle.btn-primary { + background-color: #248ec2; + border-color: #347DBE; +} + +.printTitle { + color: #015CAE !important; +} + +body.print h1 {color: #015CAE !important; font-size:28px !important;} +body.print h2 {color: #595959 !important; font-size:20px !important;} +body.print h3 {color: #E50E51 !important; font-size:14px !important;} +body.print h4 {color: #679DCE !important; font-size:14px; font-style: italic !important;} + +.anchorjs-link:hover { + color: #216f9b; +} + +div.sidebarTitle { + color: #015CAE; +} + +li.sidebarTitle { + margin-top:20px; + font-weight:normal; + font-size:130%; + color: #ED1951; + margin-bottom:10px; + margin-left: 5px; + +} + +.navbar-inverse .navbar-toggle:focus, .navbar-inverse .navbar-toggle:hover { + background-color: #015CAE; +} + +.navbar-inverse .navbar-toggle { + border-color: #015CAE; +} diff --git a/css/theme-green.css b/css/theme-green.css new file mode 100644 index 0000000..4991586 --- /dev/null +++ b/css/theme-green.css @@ -0,0 +1,110 @@ +.summary { + color: #808080; + border-left: 5px solid #E50E51; + font-size:16px; +} + + +h3 {color: #E50E51; } +h4 {color: #808080; } + +.nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus { + background-color: #248ec2; + color: white; +} + +.nav > li.active > a { + background-color: #72ac4a; +} + +.nav > li > a:hover { + background-color: #72ac4a; +} + +div.navbar-collapse .dropdown-menu > li > a:hover { + background-color: #72ac4a; +} + +.navbar-inverse .navbar-nav>li>a, .navbar-inverse .navbar-brand { + color: white; +} + +.navbar-inverse .navbar-nav>li>a:hover, a.fa.fa-home.fa-lg.navbar-brand:hover { + color: #f0f0f0; +} + +.nav li.thirdlevel > a { + background-color: #FAFAFA !important; + color: #72ac4a; + font-weight: bold; +} + +a[data-toggle="tooltip"] { + color: #649345; + font-style: italic; + cursor: default; +} + +.navbar-inverse { + background-color: #72ac4a; + border-color: #5b893c; +} + +.navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .open > a:hover, .navbar-inverse .navbar-nav > .open > a:focus { + color: #5b893c; +} + +.navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .open > a:hover, .navbar-inverse .navbar-nav > .open > a:focus { + background-color: #5b893c; + color: #ffffff; +} + +/* not sure if using this ...*/ +.navbar-inverse .navbar-collapse, .navbar-inverse .navbar-form { + border-color: #72ac4a !important; +} + +.btn-primary { + color: #ffffff; + background-color: #5b893c; + border-color: #5b893c; +} + +.btn-primary:hover, +.btn-primary:focus, +.btn-primary:active, +.btn-primary.active, +.open .dropdown-toggle.btn-primary { + background-color: #72ac4a; + border-color: #5b893c; +} + +.printTitle { + color: #5b893c !important; +} + +body.print h1 {color: #5b893c !important; font-size:28px;} +body.print h2 {color: #595959 !important; font-size:24px;} +body.print h3 {color: #E50E51 !important; font-size:14px;} +body.print h4 {color: #679DCE !important; font-size:14px; font-style: italic;} + +.anchorjs-link:hover { + color: #4f7233; +} + +div.sidebarTitle { + color: #E50E51; +} + +li.sidebarTitle { + margin-top:20px; + font-weight:normal; + font-size:130%; + color: #ED1951; + margin-bottom:10px; + margin-left: 5px; +} + +.navbar-inverse .navbar-toggle:focus, .navbar-inverse .navbar-toggle:hover { + background-color: #E50E51; +} diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..ef68f0d --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,10 @@ +services: + server: + build: + context: . + dockerfile: Dockerfile + image: userdoc/latest + ports: + - "4001:4001" + volumes: + - ".:/src" diff --git a/favicon-16x16.png b/favicon-16x16.png new file mode 100644 index 0000000..31c82aa Binary files /dev/null and b/favicon-16x16.png differ diff --git a/favicon-32x32.png b/favicon-32x32.png new file mode 100644 index 0000000..d77d1b9 Binary files /dev/null and b/favicon-32x32.png differ diff --git a/favicon.ico b/favicon.ico new file mode 100644 index 0000000..107a8fe Binary files /dev/null and b/favicon.ico differ diff --git a/feed.xml b/feed.xml new file mode 100644 index 0000000..006d9a2 --- /dev/null +++ b/feed.xml @@ -0,0 +1,50 @@ + + + + + Merlin is the HPC cluster at Paul Scherrer Institute in Switzerland. + https://hpce.pages.psi.ch/ + + Wed, 18 Jun 2025 13:33:33 +0000 + Wed, 18 Jun 2025 13:33:33 +0000 + Jekyll v3.9.0 + + + Merlin7 in preproduction + <p>The Merlin7 cluster is officially in preproduction. This phase will be tested by a few users +and slowly we will contact other users to be part of it. Keep in mind that access is restricted.</p> + +<p>Merlin7 documentation is now available https://hpce.pages.psi.ch/merlin7/slurm-configuration.html.</p> + +<p>More complete documentation will be coming shortly.</p> + + Wed, 07 Aug 2024 00:00:00 +0000 + https://hpce.pages.psi.ch/2024/08/07/merlin7-preprod-docs.html + https://hpce.pages.psi.ch/2024/08/07/merlin7-preprod-docs.html + + news + + getting_started + + + + + + Merlin 6 documentation available + <p>Merlin 6 docs are now available at https://hpce.pages.psi.ch/merlin6!</p> + +<p>More complete documentation will be coming shortly.</p> + + Wed, 12 Jun 2019 00:00:00 +0000 + https://hpce.pages.psi.ch/2019/06/12/launching-merlin6-docs.html + https://hpce.pages.psi.ch/2019/06/12/launching-merlin6-docs.html + + news + + getting_started + + + + + + diff --git a/fonts/glyphicons-halflings-regular.eot b/fonts/glyphicons-halflings-regular.eot new file mode 100644 index 0000000..b93a495 Binary files /dev/null and b/fonts/glyphicons-halflings-regular.eot differ diff --git a/fonts/glyphicons-halflings-regular.svg b/fonts/glyphicons-halflings-regular.svg new file mode 100644 index 0000000..94fb549 --- /dev/null +++ b/fonts/glyphicons-halflings-regular.svg @@ -0,0 +1,288 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/fonts/glyphicons-halflings-regular.ttf b/fonts/glyphicons-halflings-regular.ttf new file mode 100644 index 0000000..1413fc6 Binary files /dev/null and b/fonts/glyphicons-halflings-regular.ttf differ diff --git a/fonts/glyphicons-halflings-regular.woff b/fonts/glyphicons-halflings-regular.woff new file mode 100644 index 0000000..9e61285 Binary files /dev/null and b/fonts/glyphicons-halflings-regular.woff differ diff --git a/fonts/glyphicons-halflings-regular.woff2 b/fonts/glyphicons-halflings-regular.woff2 new file mode 100644 index 0000000..64539b5 Binary files /dev/null and b/fonts/glyphicons-halflings-regular.woff2 differ diff --git a/gmerlin6/cluster-introduction.html b/gmerlin6/cluster-introduction.html new file mode 100644 index 0000000..455fffa --- /dev/null +++ b/gmerlin6/cluster-introduction.html @@ -0,0 +1,807 @@ + + + + + + + + +Introduction | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + +
+ + + + + + +
+ + + + +
+
+

Introduction

+
+ + + +
+ + + + + + + + +
+ + + + + + +

About Merlin6 GPU cluster

+ +

Introduction

+ +

Merlin6 is a the official PSI Local HPC cluster for development and +mission-critical applications that has been built in 2019. It replaces +the Merlin5 cluster.

+ +

Merlin6 is designed to be extensible, so is technically possible to add +more compute nodes and cluster storage without significant increase of +the costs of the manpower and the operations.

+ +

Merlin6 is mostly based on CPU resources, but also contains a small amount +of GPU-based resources which are mostly used by the BIO experiments.

+ +

Slurm ‘gmerlin6’

+ +

THe GPU nodes have a dedicated Slurm cluster, called gmerli6.

+ +

This cluster contains the same shared storage resources (/data/user, /data/project, /shared-scracth, /afs, /psi/home) +which are present in the other Merlin Slurm clusters (merlin5,merlin6). The Slurm gmerlin6 cluster is maintainted +independently to ease access for the users and keep independent user accounting.

+ +

Merlin6 Architecture

+ +

Merlin6 Cluster Architecture Diagram

+ +

The following image shows the Merlin6 cluster architecture diagram:

+ +

Merlin6 Architecture Diagram

+ +

Merlin5 + Merlin6 Slurm Cluster Architecture Design

+ +

The following image shows the Slurm architecture design for the Merlin5 & Merlin6 clusters:

+ +

Merlin6 Slurm Architecture Design

+ + +
+ +
+ + + + +
+ +
+ +
+
+ +
+
+ + +
+ +
+ +
+ +
+ + + + diff --git a/gmerlin6/hardware-and-software.html b/gmerlin6/hardware-and-software.html new file mode 100644 index 0000000..8a1cf3d --- /dev/null +++ b/gmerlin6/hardware-and-software.html @@ -0,0 +1,913 @@ + + + + + + + + +Hardware And Software Description | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + +
+ + + + + + +
+ + + + +
+
+

Hardware And Software Description

+
+ + + +
+ + + + + + + + +
+ + + + + + +

Hardware

+ +

GPU Computing Nodes

+ +

The GPU Merlin6 cluster was initially built from recycled workstations from different groups in the BIO division. +From then, little by little it was updated with new nodes from sporadic investments from the same division, and it was never possible a central big investment. +Hence, due to this, the Merlin6 GPU computing cluster has a non homogeneus solution, consisting on a big variety of hardware types and components.

+ +

On 2018, for the common good, BIO decided to open the cluster to the Merlin users and make it widely accessible for the PSI scientists.

+ +

The below table summarizes the hardware setup for the Merlin6 GPU computing nodes:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Merlin6 GPU Computing Nodes
NodeProcessorSocketsCoresThreadsScratchMemoryGPUsGPU Model
merlin-g-001Intel Core i7-5960X11621.8TB128GB2GTX1080
merlin-g-00[2-5]Intel Xeon E5-264022011.8TB128GB4GTX1080
merlin-g-006Intel Xeon E5-26402201800GB128GB4GTX1080Ti
merlin-g-00[7-9]Intel Xeon E5-264022013.5TB128GB4GTX1080Ti
merlin-g-01[0-3]Intel Xeon Silver 4210R22011.7TB128GB4RTX2080Ti
merlin-g-014Intel Xeon Gold 6240R24812.9TB384GB8RTX2080Ti
merlin-g-015Intel(R) Xeon Gold 5318S24812.9TB384GB8RTX A5000
+ +

Login Nodes

+ +

The login nodes are part of the Merlin6 HPC cluster, +and are used to compile and to submit jobs to the different Merlin Slurm clusters (merlin5,merlin6,gmerlin6,etc.). +Please refer to the Merlin6 Hardware Documentation for further information.

+ +

Storage

+ +

The storage is part of the Merlin6 HPC cluster, +and is mounted in all the Slurm clusters (merlin5,merlin6,gmerlin6,etc.). +Please refer to the Merlin6 Hardware Documentation for further information.

+ +

Network

+ +

The Merlin6 cluster connectivity is based on the Infiniband FDR and EDR technologies. +This allows fast access with very low latencies to the data as well as running extremely efficient MPI-based jobs. +To check the network speed (56Gbps for FDR, 100Gbps for EDR) of the different machines, it can be checked by running on each node the following command:

+ +
ibstat | grep Rate
+
+ +

Software

+ +

In the Merlin6 GPU computing nodes, we try to keep software stack coherency with the main cluster Merlin6.

+ +

Due to this, the Merlin6 GPU nodes run:

+ + + +
+ +
+ + + + +
+ +
+ +
+
+ +
+
+ + +
+ +
+ +
+ +
+ + + + diff --git a/gmerlin6/slurm-configuration.html b/gmerlin6/slurm-configuration.html new file mode 100644 index 0000000..6f72c37 --- /dev/null +++ b/gmerlin6/slurm-configuration.html @@ -0,0 +1,1276 @@ + + + + + + + + +Slurm cluster 'gmerlin6' | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + +
+ + + + + + +
+ + + + +
+
+

Slurm cluster 'gmerlin6'

+
+ + + +
+ + +
This document describes a summary of the Slurm 'configuration.
+ + + + + + + +
+ + + + + + +

This documentation shows basic Slurm configuration and options needed to run jobs in the GPU cluster.

+ +

Merlin6 GPU nodes definition

+ +

The table below shows a summary of the hardware setup for the different GPU nodes

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NodesDef.#CPUsMax.#CPUs#ThreadsDef.Mem/CPUMax.Mem/CPUMax.Mem/NodeMax.SwapGPU TypeDef.#GPUsMax.#GPUs
merlin-g-[001]1 core8 cores1512010240010240010000geforce_gtx_108012
merlin-g-[002-005]1 core20 cores1512010240010240010000geforce_gtx_108014
merlin-g-[006-009]1 core20 cores1512010240010240010000geforce_gtx_1080_ti14
merlin-g-[010-013]1 core20 cores1512010240010240010000geforce_rtx_2080_ti14
merlin-g-0141 core48 cores1512036044836044810000geforce_rtx_2080_ti18
merlin-g-0151 core48 cores1512036044836044810000A500018
merlin-g-1001 core128 cores2390099840099840010000A10018
+ + + +

Running jobs in the ‘gmerlin6’ cluster

+ +

In this chapter we will cover basic settings that users need to specify in order to run jobs in the GPU cluster.

+ +

Merlin6 GPU cluster

+ +

To run jobs in the gmerlin6 cluster users must specify the cluster name in Slurm:

+ +
#SBATCH --cluster=gmerlin6
+
+ +

Merlin6 GPU partitions

+ +

Users might need to specify the Slurm partition. If no partition is specified, it will default to gpu:

+ +
#SBATCH --partition=<partition_name>  # Possible <partition_name> values: gpu, gpu-short, gwendolen
+
+ +

The table below resumes shows all possible partitions available to users:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
GPU PartitionDefault TimeMax TimePriorityJobFactor*PriorityTier**
gpu1 day1 week11
gpu-short2 hours2 hours1000500
gwendolen30 minutes2 hours10001000
gwendolen-long***30 minutes8 hours11
+ +

*The PriorityJobFactor value will be added to the job priority (PARTITION column in sprio -l ). In other words, jobs sent to higher priority +partitions will usually run first (however, other factors such like job age or mainly fair share might affect to that decision). For the GPU +partitions, Slurm will also attempt first to allocate jobs on partitions with higher priority over partitions with lesser priority.

+ +

**Jobs submitted to a partition with a higher PriorityTier value will be dispatched before pending jobs in partition with lower PriorityTier value +and, if possible, they will preempt running jobs from partitions with lower PriorityTier values.

+ +

***gwnedolen-long is a special partition which is enabled during non-working hours only. As of Nov 2023, the current policy is to disable this partition from Mon to Fri, from 1am to 5pm. However, jobs can be submitted anytime, but can only be scheduled outside this time range.

+ +

Merlin6 GPU Accounts

+ +

Users need to ensure that the public merlin account is specified. No specifying account options would default to this account. +This is mostly needed by users which have multiple Slurm accounts, which may define by mistake a different account.

+ +
#SBATCH --account=merlin  # Possible values: merlin, gwendolen
+
+

Not all the accounts can be used on all partitions. This is resumed in the table below:

+ + + + + + + + + + + + + + + + + + +
Slurm AccountSlurm Partitions
merlingpu,gpu-short
gwendolengwendolen,gwendolen-long
+ +

By default, all users belong to the merlin Slurm accounts, and jobs are submitted to the gpu partition when no partition is defined.

+ +

Users only need to specify the gwendolen account when using the gwendolen or gwendolen-long partitions, otherwise specifying account is not needed (it will always default to merlin).

+ +

The ‘gwendolen’ account

+ +

For running jobs in the gwendolen/gwendolen-long partitions, users must specify the gwendolen account. +The merlin account is not allowed to use the Gwendolen partitions.

+ +

Gwendolen is restricted to a set of users belonging to the unx-gwendolen Unix group. If you belong to a project allowed to use Gwendolen, or you are a user which would like to have access to it, please request access to the unx-gwendolen Unix group through PSI Service Now: the request will be redirected to the responsible of the project (Andreas Adelmann).

+ +

Slurm GPU specific options

+ +

Some options are available when using GPUs. These are detailed here.

+ +

Number of GPUs and type

+ +

When using the GPU cluster, users must specify the number of GPUs they need to use:

+ +
#SBATCH --gpus=[<type>:]<number>
+
+ +

The GPU type is optional: if left empty, it will try allocating any type of GPU. +The different [<type>:] values and <number> of GPUs depends on the node. +This is detailed in the below table.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NodesGPU Type#GPUs
merlin-g-[001]geforce_gtx_10802
merlin-g-[002-005]geforce_gtx_10804
merlin-g-[006-009]geforce_gtx_1080_ti4
merlin-g-[010-013]geforce_rtx_2080_ti4
merlin-g-014geforce_rtx_2080_ti8
merlin-g-015A50008
merlin-g-100A1008
+ +

Constraint / Features

+ +

Instead of specifying the GPU type, sometimes users would need to specify the GPU by the amount of memory available in the GPU card itself. +This has been defined in Slurm with Features, which is a tag which defines the GPU memory for the different GPU cards. +Users can specify which GPU memory size needs to be used with the --constraint option. In that case, notice that in many cases + there is not need to specify [<type>:] in the --gpus option.

+ +
#SBATCH --contraint=<Feature>    # Possible values: gpumem_8gb, gpumem_11gb, gpumem_24gb, gpumem_40gb
+
+ +

The table below shows the available Features and which GPU card models and GPU nodes they belong to:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Merlin6 GPU Computing Nodes
NodesGPU TypeFeature
merlin-g-[001-005]geforce_gtx_1080gpumem_8gb
merlin-g-[006-009]geforce_gtx_1080_tigpumem_11gb
merlin-g-[010-014]geforce_rtx_2080_ti
merlin-g-015A5000gpumem_24gb
merlin-g-100A100gpumem_40gb
+ +

Other GPU options

+ +

Alternative Slurm options for GPU based jobs are available. Please refer to the man pages +for each Slurm command for further information about it (man salloc, man sbatch, man srun). +Below are listed the most common settings:

+ +
#SBATCH --hint=[no]multithread
+#SBATCH --ntasks=\<ntasks\>
+#SBATCH --ntasks-per-gpu=\<ntasks\>
+#SBATCH --mem-per-gpu=\<size[units]\>
+#SBATCH --cpus-per-gpu=\<ncpus\>
+#SBATCH --gpus-per-node=[\<type\>:]\<number\>
+#SBATCH --gpus-per-socket=[\<type\>:]\<number\>
+#SBATCH --gpus-per-task=[\<type\>:]\<number\>
+#SBATCH --gpu-bind=[verbose,]\<type\>
+
+ +

Please, notice that when defining [<type>:] once, then all other options must use it too!

+ +

Dealing with Hyper-Threading

+ +

The gmerlin6 cluster contains the partitions gwendolen and gwendolen-long, which have a node with Hyper-Threading enabled. +In that case, one should always specify whether to use Hyper-Threading or not. If not defined, Slurm will +generally use it (exceptions apply). For this machine, generally HT is recommended.

+ +
#SBATCH --hint=multithread            # Use extra threads with in-core multi-threading.
+#SBATCH --hint=nomultithread          # Don't use extra threads with in-core multi-threading.
+
+ +

User and job limits

+ +

The GPU cluster contains some basic user and job limits to ensure that a single user can not overabuse the resources and a fair usage of the cluster. +The limits are described below.

+ +

Per job limits

+ +

These are limits applying to a single job. In other words, there is a maximum of resources a single job can use. +Limits are defined using QoS, and this is usually set at the partition level. Limits are described in the table below with the format: SlurmQoS(limits) +(possible SlurmQoS values can be listed with the command sacctmgr show qos):

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PartitionSlurm AccountMon-Sun 0h-24h
gpumerlingpu_week(gres/gpu=8)
gpu-shortmerlingpu_week(gres/gpu=8)
gwendolengwendolenNo limits
gwendolen-longgwendolenNo limits, active from 9pm to 5:30am
+ +
    +
  • +

    With the limits in the public gpu and gpu-short partitions, a single job using the merlin acccount +(default account) can not use more than 40 CPUs, more than 8 GPUs or more than 200GB. +Any job exceeding such limits will stay in the queue with the message QOSMax[Cpu|GRES|Mem]PerJob. +As there are no more existing QoS during the week temporary overriding job limits (this happens for +instance in the CPU daily partition), the job needs to be cancelled, and the requested resources +must be adapted according to the above resource limits.

    +
  • +
  • +

    The gwendolen and gwendolen-long partitions are two special partitions for a NVIDIA DGX A100 machine. +Only users belonging to the unx-gwendolen Unix group can run in these partitions. No limits are applied (machine resources can be completely used).

    +
  • +
  • +

    The gwendolen-long partition is available 24h. However,

    +
      +
    • from 5:30am to 9pm the partition is down (jobs can be submitted, but can not run until the partition is set to active).
    • +
    • from 9pm to 5:30am jobs are allowed to run (partition is set to active).
    • +
    +
  • +
+ +

Per user limits for GPU partitions

+ +

These limits apply exclusively to users. In other words, there is a maximum of resources a single user can use. +Limits are defined using QoS, and this is usually set at the partition level. Limits are described in the table below with the format: SlurmQoS(limits) +(possible SlurmQoS values can be listed with the command sacctmgr show qos):

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PartitionSlurm AccountMon-Sun 0h-24h
gpumerlingpu_week(gres/gpu=16)
gpu-shortmerlingpu_week(gres/gpu=16)
gwendolengwendolenNo limits
gwendolen-longgwendolenNo limits, active from 9pm to 5:30am
+ +
    +
  • +

    With the limits in the public gpu and gpu-short partitions, a single user can not use more than 80 CPUs, more than 16 GPUs or more than 400GB. +Jobs sent by any user already exceeding such limits will stay in the queue with the message QOSMax[Cpu|GRES|Mem]PerUser. +In that case, job can wait in the queue until some of the running resources are freed.

    +
  • +
  • +

    Notice that user limits are wider than job limits. In that way, a user can run up to two 8 GPUs based jobs, or up to four 4 GPUs based jobs, etc. +Please try to avoid occupying all GPUs of the same type for several hours or multiple days, otherwise it would block other users needing the same +type of GPU.

    +
  • +
+ +

Advanced Slurm configuration

+ +

Clusters at PSI use the Slurm Workload Manager as the batch system technology for managing and scheduling jobs. +Slurm has been installed in a multi-clustered configuration, allowing to integrate multiple clusters in the same batch system.

+ +

For understanding the Slurm configuration setup in the cluster, sometimes may be useful to check the following files:

+ +
    +
  • /etc/slurm/slurm.conf - can be found in the login nodes and computing nodes.
  • +
  • /etc/slurm/gres.conf - can be found in the GPU nodes, is also propgated to login nodes and computing nodes for user read access.
  • +
  • /etc/slurm/cgroup.conf - can be found in the computing nodes, is also propagated to login nodes for user read access.
  • +
+ +

The previous configuration files which can be found in the login nodes, correspond exclusively to the merlin6 cluster configuration files. +Configuration files for the old merlin5 cluster or for the gmerlin6 cluster must be checked directly on any of the merlin5 or gmerlin6 computing nodes (in example, by login in to one of the nodes while a job or an active allocation is running).

+ + +
+ +
+ + + + +
+ +
+ +
+
+ +
+
+ + +
+ +
+ +
+ +
+ + + + diff --git a/images/ANSYS/HFSS/01_Select_Scheduler_Menu.png b/images/ANSYS/HFSS/01_Select_Scheduler_Menu.png new file mode 100644 index 0000000..2264d75 Binary files /dev/null and b/images/ANSYS/HFSS/01_Select_Scheduler_Menu.png differ diff --git a/images/ANSYS/HFSS/02_Select_Scheduler_RSM_Remote.png b/images/ANSYS/HFSS/02_Select_Scheduler_RSM_Remote.png new file mode 100644 index 0000000..5e4db05 Binary files /dev/null and b/images/ANSYS/HFSS/02_Select_Scheduler_RSM_Remote.png differ diff --git a/images/ANSYS/HFSS/03_Select_Scheduler_Slurm.png b/images/ANSYS/HFSS/03_Select_Scheduler_Slurm.png new file mode 100644 index 0000000..a0c7ce8 Binary files /dev/null and b/images/ANSYS/HFSS/03_Select_Scheduler_Slurm.png differ diff --git a/images/ANSYS/HFSS/04_Submit_Job_Menu.png b/images/ANSYS/HFSS/04_Submit_Job_Menu.png new file mode 100644 index 0000000..7cea7d3 Binary files /dev/null and b/images/ANSYS/HFSS/04_Submit_Job_Menu.png differ diff --git a/images/ANSYS/HFSS/05_Submit_Job_Product_Path.png b/images/ANSYS/HFSS/05_Submit_Job_Product_Path.png new file mode 100644 index 0000000..7f2d9bc Binary files /dev/null and b/images/ANSYS/HFSS/05_Submit_Job_Product_Path.png differ diff --git a/images/ANSYS/cfx5launcher.png b/images/ANSYS/cfx5launcher.png new file mode 100644 index 0000000..60af47b Binary files /dev/null and b/images/ANSYS/cfx5launcher.png differ diff --git a/images/ANSYS/merlin7/HFSS/01_Select_Scheduler_Menu.png b/images/ANSYS/merlin7/HFSS/01_Select_Scheduler_Menu.png new file mode 100644 index 0000000..2264d75 Binary files /dev/null and b/images/ANSYS/merlin7/HFSS/01_Select_Scheduler_Menu.png differ diff --git a/images/ANSYS/merlin7/HFSS/02_Select_Scheduler_RSM_Remote.png b/images/ANSYS/merlin7/HFSS/02_Select_Scheduler_RSM_Remote.png new file mode 100644 index 0000000..5e4db05 Binary files /dev/null and b/images/ANSYS/merlin7/HFSS/02_Select_Scheduler_RSM_Remote.png differ diff --git a/images/ANSYS/merlin7/HFSS/03_Select_Scheduler_Slurm.png b/images/ANSYS/merlin7/HFSS/03_Select_Scheduler_Slurm.png new file mode 100644 index 0000000..a0c7ce8 Binary files /dev/null and b/images/ANSYS/merlin7/HFSS/03_Select_Scheduler_Slurm.png differ diff --git a/images/ANSYS/merlin7/HFSS/04_Submit_Job_Menu.png b/images/ANSYS/merlin7/HFSS/04_Submit_Job_Menu.png new file mode 100644 index 0000000..7cea7d3 Binary files /dev/null and b/images/ANSYS/merlin7/HFSS/04_Submit_Job_Menu.png differ diff --git a/images/ANSYS/merlin7/HFSS/05_Submit_Job_Product_Path.png b/images/ANSYS/merlin7/HFSS/05_Submit_Job_Product_Path.png new file mode 100644 index 0000000..7f2d9bc Binary files /dev/null and b/images/ANSYS/merlin7/HFSS/05_Submit_Job_Product_Path.png differ diff --git a/images/ANSYS/merlin7/cfx5launcher.png b/images/ANSYS/merlin7/cfx5launcher.png new file mode 100644 index 0000000..60af47b Binary files /dev/null and b/images/ANSYS/merlin7/cfx5launcher.png differ diff --git a/images/ANSYS/merlin7/merlin7/cfx5launcher.png b/images/ANSYS/merlin7/merlin7/cfx5launcher.png new file mode 100644 index 0000000..60af47b Binary files /dev/null and b/images/ANSYS/merlin7/merlin7/cfx5launcher.png differ diff --git a/images/ANSYS/merlin7/rsm-1-add_hpc_resource.png b/images/ANSYS/merlin7/rsm-1-add_hpc_resource.png new file mode 100644 index 0000000..91a5d1e Binary files /dev/null and b/images/ANSYS/merlin7/rsm-1-add_hpc_resource.png differ diff --git a/images/ANSYS/merlin7/rsm-2-add_cluster.png b/images/ANSYS/merlin7/rsm-2-add_cluster.png new file mode 100644 index 0000000..67611d6 Binary files /dev/null and b/images/ANSYS/merlin7/rsm-2-add_cluster.png differ diff --git a/images/ANSYS/merlin7/rsm-3-add_scratch_info.png b/images/ANSYS/merlin7/rsm-3-add_scratch_info.png new file mode 100644 index 0000000..487dad3 Binary files /dev/null and b/images/ANSYS/merlin7/rsm-3-add_scratch_info.png differ diff --git a/images/ANSYS/merlin7/rsm-4-get_slurm_queues.png b/images/ANSYS/merlin7/rsm-4-get_slurm_queues.png new file mode 100644 index 0000000..8b6a0b9 Binary files /dev/null and b/images/ANSYS/merlin7/rsm-4-get_slurm_queues.png differ diff --git a/images/ANSYS/merlin7/rsm-5-authenticating.png b/images/ANSYS/merlin7/rsm-5-authenticating.png new file mode 100644 index 0000000..2ff7ef8 Binary files /dev/null and b/images/ANSYS/merlin7/rsm-5-authenticating.png differ diff --git a/images/ANSYS/merlin7/rsm-6-selected-partitions.png b/images/ANSYS/merlin7/rsm-6-selected-partitions.png new file mode 100644 index 0000000..aa50651 Binary files /dev/null and b/images/ANSYS/merlin7/rsm-6-selected-partitions.png differ diff --git a/images/ANSYS/rsm-1-add_hpc_resource.png b/images/ANSYS/rsm-1-add_hpc_resource.png new file mode 100644 index 0000000..91a5d1e Binary files /dev/null and b/images/ANSYS/rsm-1-add_hpc_resource.png differ diff --git a/images/ANSYS/rsm-2-add_cluster.png b/images/ANSYS/rsm-2-add_cluster.png new file mode 100644 index 0000000..4bdfd8b Binary files /dev/null and b/images/ANSYS/rsm-2-add_cluster.png differ diff --git a/images/ANSYS/rsm-3-add_scratch_info.png b/images/ANSYS/rsm-3-add_scratch_info.png new file mode 100644 index 0000000..932deee Binary files /dev/null and b/images/ANSYS/rsm-3-add_scratch_info.png differ diff --git a/images/ANSYS/rsm-4-get_slurm_queues.png b/images/ANSYS/rsm-4-get_slurm_queues.png new file mode 100644 index 0000000..e9c241b Binary files /dev/null and b/images/ANSYS/rsm-4-get_slurm_queues.png differ diff --git a/images/ANSYS/rsm-5-authenticating.png b/images/ANSYS/rsm-5-authenticating.png new file mode 100644 index 0000000..2ff7ef8 Binary files /dev/null and b/images/ANSYS/rsm-5-authenticating.png differ diff --git a/images/ANSYS/rsm-6-selected-partitions.png b/images/ANSYS/rsm-6-selected-partitions.png new file mode 100644 index 0000000..4840cb9 Binary files /dev/null and b/images/ANSYS/rsm-6-selected-partitions.png differ diff --git a/images/Access/01-request-merlin5-membership.png b/images/Access/01-request-merlin5-membership.png new file mode 100644 index 0000000..37edbeb Binary files /dev/null and b/images/Access/01-request-merlin5-membership.png differ diff --git a/images/Access/01-request-merlin6-membership.png b/images/Access/01-request-merlin6-membership.png new file mode 100644 index 0000000..32d3782 Binary files /dev/null and b/images/Access/01-request-merlin6-membership.png differ diff --git a/images/Access/01-request-merlin7-membership.png b/images/Access/01-request-merlin7-membership.png new file mode 100644 index 0000000..4ab5cbe Binary files /dev/null and b/images/Access/01-request-merlin7-membership.png differ diff --git a/images/Access/01-request-unx-group-membership.png b/images/Access/01-request-unx-group-membership.png new file mode 100644 index 0000000..cf53e1a Binary files /dev/null and b/images/Access/01-request-unx-group-membership.png differ diff --git a/images/NoMachine/screen_nx1.png b/images/NoMachine/screen_nx1.png new file mode 100644 index 0000000..17b3aec Binary files /dev/null and b/images/NoMachine/screen_nx1.png differ diff --git a/images/NoMachine/screen_nx10.png b/images/NoMachine/screen_nx10.png new file mode 100644 index 0000000..969fa4b Binary files /dev/null and b/images/NoMachine/screen_nx10.png differ diff --git a/images/NoMachine/screen_nx2.png b/images/NoMachine/screen_nx2.png new file mode 100644 index 0000000..c287e56 Binary files /dev/null and b/images/NoMachine/screen_nx2.png differ diff --git a/images/NoMachine/screen_nx3.png b/images/NoMachine/screen_nx3.png new file mode 100644 index 0000000..bffe4ee Binary files /dev/null and b/images/NoMachine/screen_nx3.png differ diff --git a/images/NoMachine/screen_nx4.png b/images/NoMachine/screen_nx4.png new file mode 100644 index 0000000..c968aff Binary files /dev/null and b/images/NoMachine/screen_nx4.png differ diff --git a/images/NoMachine/screen_nx5.png b/images/NoMachine/screen_nx5.png new file mode 100644 index 0000000..aa7cde1 Binary files /dev/null and b/images/NoMachine/screen_nx5.png differ diff --git a/images/NoMachine/screen_nx6.png b/images/NoMachine/screen_nx6.png new file mode 100644 index 0000000..d99208d Binary files /dev/null and b/images/NoMachine/screen_nx6.png differ diff --git a/images/NoMachine/screen_nx7.png b/images/NoMachine/screen_nx7.png new file mode 100644 index 0000000..2e3172a Binary files /dev/null and b/images/NoMachine/screen_nx7.png differ diff --git a/images/NoMachine/screen_nx8.png b/images/NoMachine/screen_nx8.png new file mode 100644 index 0000000..9fe7558 Binary files /dev/null and b/images/NoMachine/screen_nx8.png differ diff --git a/images/NoMachine/screen_nx9.png b/images/NoMachine/screen_nx9.png new file mode 100644 index 0000000..101f0a3 Binary files /dev/null and b/images/NoMachine/screen_nx9.png differ diff --git a/images/NoMachine/screen_nx_address.png b/images/NoMachine/screen_nx_address.png new file mode 100644 index 0000000..7d37db2 Binary files /dev/null and b/images/NoMachine/screen_nx_address.png differ diff --git a/images/NoMachine/screen_nx_auth.png b/images/NoMachine/screen_nx_auth.png new file mode 100644 index 0000000..d10f0df Binary files /dev/null and b/images/NoMachine/screen_nx_auth.png differ diff --git a/images/NoMachine/screen_nx_configuration.png b/images/NoMachine/screen_nx_configuration.png new file mode 100644 index 0000000..065ca44 Binary files /dev/null and b/images/NoMachine/screen_nx_configuration.png differ diff --git a/images/NoMachine/screen_nx_single_session.png b/images/NoMachine/screen_nx_single_session.png new file mode 100644 index 0000000..113d204 Binary files /dev/null and b/images/NoMachine/screen_nx_single_session.png differ diff --git a/images/PuTTY/Putty_Disable_Kerberos_GSSAPI.png b/images/PuTTY/Putty_Disable_Kerberos_GSSAPI.png new file mode 100644 index 0000000..267400a Binary files /dev/null and b/images/PuTTY/Putty_Disable_Kerberos_GSSAPI.png differ diff --git a/images/PuTTY/Putty_Mouse_XTerm.png b/images/PuTTY/Putty_Mouse_XTerm.png new file mode 100644 index 0000000..d6bcf8d Binary files /dev/null and b/images/PuTTY/Putty_Mouse_XTerm.png differ diff --git a/images/PuTTY/Putty_Session.png b/images/PuTTY/Putty_Session.png new file mode 100644 index 0000000..8f609af Binary files /dev/null and b/images/PuTTY/Putty_Session.png differ diff --git a/images/PuTTY/Putty_X11_Forwarding.png b/images/PuTTY/Putty_X11_Forwarding.png new file mode 100644 index 0000000..89addf9 Binary files /dev/null and b/images/PuTTY/Putty_X11_Forwarding.png differ diff --git a/images/Slurm/scom.gif b/images/Slurm/scom.gif new file mode 100644 index 0000000..8325e26 Binary files /dev/null and b/images/Slurm/scom.gif differ diff --git a/images/Slurm/sview.png b/images/Slurm/sview.png new file mode 100644 index 0000000..d6081c7 Binary files /dev/null and b/images/Slurm/sview.png differ diff --git a/images/WIP/WIP1.jpeg b/images/WIP/WIP1.jpeg new file mode 100644 index 0000000..d464774 Binary files /dev/null and b/images/WIP/WIP1.jpeg differ diff --git a/images/WIP/WIP1.webp b/images/WIP/WIP1.webp new file mode 100644 index 0000000..7717a32 Binary files /dev/null and b/images/WIP/WIP1.webp differ diff --git a/images/favicon.ico b/images/favicon.ico new file mode 100644 index 0000000..0d505be Binary files /dev/null and b/images/favicon.ico differ diff --git a/images/hpce_logo.png b/images/hpce_logo.png new file mode 100644 index 0000000..2d6a9d2 Binary files /dev/null and b/images/hpce_logo.png differ diff --git a/images/jupyter-launch-classic.png b/images/jupyter-launch-classic.png new file mode 100644 index 0000000..2c4f401 Binary files /dev/null and b/images/jupyter-launch-classic.png differ diff --git a/images/jupyter-nbextensions.png b/images/jupyter-nbextensions.png new file mode 100644 index 0000000..31be093 Binary files /dev/null and b/images/jupyter-nbextensions.png differ diff --git a/images/jupytext_menu.png b/images/jupytext_menu.png new file mode 100644 index 0000000..cb35dba Binary files /dev/null and b/images/jupytext_menu.png differ diff --git a/images/merlin-slurm-architecture.png b/images/merlin-slurm-architecture.png new file mode 100644 index 0000000..38e44a8 Binary files /dev/null and b/images/merlin-slurm-architecture.png differ diff --git a/images/merlinschema3.png b/images/merlinschema3.png new file mode 100644 index 0000000..e09d89d Binary files /dev/null and b/images/merlinschema3.png differ diff --git a/images/psi-logo.png b/images/psi-logo.png new file mode 100644 index 0000000..c60da45 Binary files /dev/null and b/images/psi-logo.png differ diff --git a/images/rmount/mount.png b/images/rmount/mount.png new file mode 100644 index 0000000..27cea95 Binary files /dev/null and b/images/rmount/mount.png differ diff --git a/images/rmount/select-mount.png b/images/rmount/select-mount.png new file mode 100644 index 0000000..59d90b9 Binary files /dev/null and b/images/rmount/select-mount.png differ diff --git a/images/rmount/thunar_mount.png b/images/rmount/thunar_mount.png new file mode 100644 index 0000000..a970961 Binary files /dev/null and b/images/rmount/thunar_mount.png differ diff --git a/images/scicat_token.png b/images/scicat_token.png new file mode 100644 index 0000000..77f75c1 Binary files /dev/null and b/images/scicat_token.png differ diff --git a/index.html b/index.html new file mode 100644 index 0000000..c726e5c --- /dev/null +++ b/index.html @@ -0,0 +1,362 @@ + + + + + + + + + | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + +
+ + + + + + +
+ + + + +
+
+

+
+ + + +
+ + + + + + + + +

High Performance Computing and Emerging Technologies

+ +

The HPCE group is part of the PSI Center for Scientific Computing, Theory and Data +at Paul Scherrer Institute. It provides a range of HPC services for PSI scientists and also +engages in research activities on technologies (data analysis and machine learning technologies) used on these systems.

+ +

Available documentation

+ +

+

+ + +
+ +
+ + + + +
+ +
+ +
+
+ +
+
+ + +
+ +
+ +
+ +
+ + + + diff --git a/js/anchor.min.js b/js/anchor.min.js new file mode 100644 index 0000000..e302d89 --- /dev/null +++ b/js/anchor.min.js @@ -0,0 +1,9 @@ +// @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt Expat +// +// AnchorJS - v4.2.0 - 2019-01-01 +// https://github.com/bryanbraun/anchorjs +// Copyright (c) 2019 Bryan Braun; Licensed MIT +// +// @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt Expat +!function(A,e){"use strict";"function"==typeof define&&define.amd?define([],e):"object"==typeof module&&module.exports?module.exports=e():(A.AnchorJS=e(),A.anchors=new A.AnchorJS)}(this,function(){"use strict";return function(A){function f(A){A.icon=A.hasOwnProperty("icon")?A.icon:"",A.visible=A.hasOwnProperty("visible")?A.visible:"hover",A.placement=A.hasOwnProperty("placement")?A.placement:"right",A.ariaLabel=A.hasOwnProperty("ariaLabel")?A.ariaLabel:"Anchor",A.class=A.hasOwnProperty("class")?A.class:"",A.base=A.hasOwnProperty("base")?A.base:"",A.truncate=A.hasOwnProperty("truncate")?Math.floor(A.truncate):64,A.titleText=A.hasOwnProperty("titleText")?A.titleText:""}function p(A){var e;if("string"==typeof A||A instanceof String)e=[].slice.call(document.querySelectorAll(A));else{if(!(Array.isArray(A)||A instanceof NodeList))throw new Error("The selector provided to AnchorJS was invalid.");e=[].slice.call(A)}return e}this.options=A||{},this.elements=[],f(this.options),this.isTouchDevice=function(){return!!("ontouchstart"in window||window.DocumentTouch&&document instanceof DocumentTouch)},this.add=function(A){var e,t,i,n,o,s,a,r,c,h,l,u,d=[];if(f(this.options),"touch"===(l=this.options.visible)&&(l=this.isTouchDevice()?"always":"hover"),A||(A="h2, h3, h4, h5, h6"),0===(e=p(A)).length)return this;for(function(){if(null===document.head.querySelector("style.anchorjs")){var A,e=document.createElement("style");e.className="anchorjs",e.appendChild(document.createTextNode("")),void 0===(A=document.head.querySelector('[rel="stylesheet"], style'))?document.head.appendChild(e):document.head.insertBefore(e,A),e.sheet.insertRule(" .anchorjs-link { opacity: 0; text-decoration: none; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; }",e.sheet.cssRules.length),e.sheet.insertRule(" *:hover > .anchorjs-link, .anchorjs-link:focus { opacity: 1; }",e.sheet.cssRules.length),e.sheet.insertRule(" [data-anchorjs-icon]::after { content: attr(data-anchorjs-icon); }",e.sheet.cssRules.length),e.sheet.insertRule(' @font-face { font-family: "anchorjs-icons"; src: url(data:n/a;base64,AAEAAAALAIAAAwAwT1MvMg8yG2cAAAE4AAAAYGNtYXDp3gC3AAABpAAAAExnYXNwAAAAEAAAA9wAAAAIZ2x5ZlQCcfwAAAH4AAABCGhlYWQHFvHyAAAAvAAAADZoaGVhBnACFwAAAPQAAAAkaG10eASAADEAAAGYAAAADGxvY2EACACEAAAB8AAAAAhtYXhwAAYAVwAAARgAAAAgbmFtZQGOH9cAAAMAAAAAunBvc3QAAwAAAAADvAAAACAAAQAAAAEAAHzE2p9fDzz1AAkEAAAAAADRecUWAAAAANQA6R8AAAAAAoACwAAAAAgAAgAAAAAAAAABAAADwP/AAAACgAAA/9MCrQABAAAAAAAAAAAAAAAAAAAAAwABAAAAAwBVAAIAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAMCQAGQAAUAAAKZAswAAACPApkCzAAAAesAMwEJAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAQAAg//0DwP/AAEADwABAAAAAAQAAAAAAAAAAAAAAIAAAAAAAAAIAAAACgAAxAAAAAwAAAAMAAAAcAAEAAwAAABwAAwABAAAAHAAEADAAAAAIAAgAAgAAACDpy//9//8AAAAg6cv//f///+EWNwADAAEAAAAAAAAAAAAAAAAACACEAAEAAAAAAAAAAAAAAAAxAAACAAQARAKAAsAAKwBUAAABIiYnJjQ3NzY2MzIWFxYUBwcGIicmNDc3NjQnJiYjIgYHBwYUFxYUBwYGIwciJicmNDc3NjIXFhQHBwYUFxYWMzI2Nzc2NCcmNDc2MhcWFAcHBgYjARQGDAUtLXoWOR8fORYtLTgKGwoKCjgaGg0gEhIgDXoaGgkJBQwHdR85Fi0tOAobCgoKOBoaDSASEiANehoaCQkKGwotLXoWOR8BMwUFLYEuehYXFxYugC44CQkKGwo4GkoaDQ0NDXoaShoKGwoFBe8XFi6ALjgJCQobCjgaShoNDQ0NehpKGgobCgoKLYEuehYXAAAADACWAAEAAAAAAAEACAAAAAEAAAAAAAIAAwAIAAEAAAAAAAMACAAAAAEAAAAAAAQACAAAAAEAAAAAAAUAAQALAAEAAAAAAAYACAAAAAMAAQQJAAEAEAAMAAMAAQQJAAIABgAcAAMAAQQJAAMAEAAMAAMAAQQJAAQAEAAMAAMAAQQJAAUAAgAiAAMAAQQJAAYAEAAMYW5jaG9yanM0MDBAAGEAbgBjAGgAbwByAGoAcwA0ADAAMABAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAH//wAP) format("truetype"); }',e.sheet.cssRules.length)}}(),t=document.querySelectorAll("[id]"),i=[].map.call(t,function(A){return A.id}),o=0;o\]\.\/\(\)\*\\\n\t\b\v]/g,"-").replace(/-{2,}/g,"-").substring(0,this.options.truncate).replace(/^-+|-+$/gm,"").toLowerCase()},this.hasAnchorJSLink=function(A){var e=A.firstChild&&-1<(" "+A.firstChild.className+" ").indexOf(" anchorjs-link "),t=A.lastChild&&-1<(" "+A.lastChild.className+" ").indexOf(" anchorjs-link ");return e||t||!1}}}); +// @license-end \ No newline at end of file diff --git a/js/bootstrap.min.js b/js/bootstrap.min.js new file mode 100644 index 0000000..eb0a8b4 --- /dev/null +++ b/js/bootstrap.min.js @@ -0,0 +1,6 @@ +/*! + * Bootstrap v3.4.1 (https://getbootstrap.com/) + * Copyright 2011-2019 Twitter, Inc. + * Licensed under the MIT license + */ +if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");!function(t){"use strict";var e=jQuery.fn.jquery.split(" ")[0].split(".");if(e[0]<2&&e[1]<9||1==e[0]&&9==e[1]&&e[2]<1||3this.$items.length-1||t<0))return this.sliding?this.$element.one("slid.bs.carousel",function(){e.to(t)}):i==t?this.pause().cycle():this.slide(idocument.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&t?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!t?this.scrollbarWidth:""})},s.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},s.prototype.checkScrollbar=function(){var t=window.innerWidth;if(!t){var e=document.documentElement.getBoundingClientRect();t=e.right-Math.abs(e.left)}this.bodyIsOverflowing=document.body.clientWidth
',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0},sanitize:!0,sanitizeFn:null,whiteList:t},m.prototype.init=function(t,e,i){if(this.enabled=!0,this.type=t,this.$element=g(e),this.options=this.getOptions(i),this.$viewport=this.options.viewport&&g(document).find(g.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var o=this.options.trigger.split(" "),n=o.length;n--;){var s=o[n];if("click"==s)this.$element.on("click."+this.type,this.options.selector,g.proxy(this.toggle,this));else if("manual"!=s){var a="hover"==s?"mouseenter":"focusin",r="hover"==s?"mouseleave":"focusout";this.$element.on(a+"."+this.type,this.options.selector,g.proxy(this.enter,this)),this.$element.on(r+"."+this.type,this.options.selector,g.proxy(this.leave,this))}}this.options.selector?this._options=g.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},m.prototype.getDefaults=function(){return m.DEFAULTS},m.prototype.getOptions=function(t){var e=this.$element.data();for(var i in e)e.hasOwnProperty(i)&&-1!==g.inArray(i,o)&&delete e[i];return(t=g.extend({},this.getDefaults(),e,t)).delay&&"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),t.sanitize&&(t.template=n(t.template,t.whiteList,t.sanitizeFn)),t},m.prototype.getDelegateOptions=function(){var i={},o=this.getDefaults();return this._options&&g.each(this._options,function(t,e){o[t]!=e&&(i[t]=e)}),i},m.prototype.enter=function(t){var e=t instanceof this.constructor?t:g(t.currentTarget).data("bs."+this.type);if(e||(e=new this.constructor(t.currentTarget,this.getDelegateOptions()),g(t.currentTarget).data("bs."+this.type,e)),t instanceof g.Event&&(e.inState["focusin"==t.type?"focus":"hover"]=!0),e.tip().hasClass("in")||"in"==e.hoverState)e.hoverState="in";else{if(clearTimeout(e.timeout),e.hoverState="in",!e.options.delay||!e.options.delay.show)return e.show();e.timeout=setTimeout(function(){"in"==e.hoverState&&e.show()},e.options.delay.show)}},m.prototype.isInStateTrue=function(){for(var t in this.inState)if(this.inState[t])return!0;return!1},m.prototype.leave=function(t){var e=t instanceof this.constructor?t:g(t.currentTarget).data("bs."+this.type);if(e||(e=new this.constructor(t.currentTarget,this.getDelegateOptions()),g(t.currentTarget).data("bs."+this.type,e)),t instanceof g.Event&&(e.inState["focusout"==t.type?"focus":"hover"]=!1),!e.isInStateTrue()){if(clearTimeout(e.timeout),e.hoverState="out",!e.options.delay||!e.options.delay.hide)return e.hide();e.timeout=setTimeout(function(){"out"==e.hoverState&&e.hide()},e.options.delay.hide)}},m.prototype.show=function(){var t=g.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(t);var e=g.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(t.isDefaultPrevented()||!e)return;var i=this,o=this.tip(),n=this.getUID(this.type);this.setContent(),o.attr("id",n),this.$element.attr("aria-describedby",n),this.options.animation&&o.addClass("fade");var s="function"==typeof this.options.placement?this.options.placement.call(this,o[0],this.$element[0]):this.options.placement,a=/\s?auto?\s?/i,r=a.test(s);r&&(s=s.replace(a,"")||"top"),o.detach().css({top:0,left:0,display:"block"}).addClass(s).data("bs."+this.type,this),this.options.container?o.appendTo(g(document).find(this.options.container)):o.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var l=this.getPosition(),h=o[0].offsetWidth,d=o[0].offsetHeight;if(r){var p=s,c=this.getPosition(this.$viewport);s="bottom"==s&&l.bottom+d>c.bottom?"top":"top"==s&&l.top-dc.width?"left":"left"==s&&l.left-ha.top+a.height&&(n.top=a.top+a.height-l)}else{var h=e.left-s,d=e.left+s+i;ha.right&&(n.left=a.left+a.width-d)}return n},m.prototype.getTitle=function(){var t=this.$element,e=this.options;return t.attr("data-original-title")||("function"==typeof e.title?e.title.call(t[0]):e.title)},m.prototype.getUID=function(t){for(;t+=~~(1e6*Math.random()),document.getElementById(t););return t},m.prototype.tip=function(){if(!this.$tip&&(this.$tip=g(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},m.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},m.prototype.enable=function(){this.enabled=!0},m.prototype.disable=function(){this.enabled=!1},m.prototype.toggleEnabled=function(){this.enabled=!this.enabled},m.prototype.toggle=function(t){var e=this;t&&((e=g(t.currentTarget).data("bs."+this.type))||(e=new this.constructor(t.currentTarget,this.getDelegateOptions()),g(t.currentTarget).data("bs."+this.type,e))),t?(e.inState.click=!e.inState.click,e.isInStateTrue()?e.enter(e):e.leave(e)):e.tip().hasClass("in")?e.leave(e):e.enter(e)},m.prototype.destroy=function(){var t=this;clearTimeout(this.timeout),this.hide(function(){t.$element.off("."+t.type).removeData("bs."+t.type),t.$tip&&t.$tip.detach(),t.$tip=null,t.$arrow=null,t.$viewport=null,t.$element=null})},m.prototype.sanitizeHtml=function(t){return n(t,this.options.whiteList,this.options.sanitizeFn)};var e=g.fn.tooltip;g.fn.tooltip=function i(o){return this.each(function(){var t=g(this),e=t.data("bs.tooltip"),i="object"==typeof o&&o;!e&&/destroy|hide/.test(o)||(e||t.data("bs.tooltip",e=new m(this,i)),"string"==typeof o&&e[o]())})},g.fn.tooltip.Constructor=m,g.fn.tooltip.noConflict=function(){return g.fn.tooltip=e,this}}(jQuery),function(n){"use strict";var s=function(t,e){this.init("popover",t,e)};if(!n.fn.tooltip)throw new Error("Popover requires tooltip.js");s.VERSION="3.4.1",s.DEFAULTS=n.extend({},n.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:''}),((s.prototype=n.extend({},n.fn.tooltip.Constructor.prototype)).constructor=s).prototype.getDefaults=function(){return s.DEFAULTS},s.prototype.setContent=function(){var t=this.tip(),e=this.getTitle(),i=this.getContent();if(this.options.html){var o=typeof i;this.options.sanitize&&(e=this.sanitizeHtml(e),"string"===o&&(i=this.sanitizeHtml(i))),t.find(".popover-title").html(e),t.find(".popover-content").children().detach().end()["string"===o?"html":"append"](i)}else t.find(".popover-title").text(e),t.find(".popover-content").children().detach().end().text(i);t.removeClass("fade top bottom left right in"),t.find(".popover-title").html()||t.find(".popover-title").hide()},s.prototype.hasContent=function(){return this.getTitle()||this.getContent()},s.prototype.getContent=function(){var t=this.$element,e=this.options;return t.attr("data-content")||("function"==typeof e.content?e.content.call(t[0]):e.content)},s.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var t=n.fn.popover;n.fn.popover=function e(o){return this.each(function(){var t=n(this),e=t.data("bs.popover"),i="object"==typeof o&&o;!e&&/destroy|hide/.test(o)||(e||t.data("bs.popover",e=new s(this,i)),"string"==typeof o&&e[o]())})},n.fn.popover.Constructor=s,n.fn.popover.noConflict=function(){return n.fn.popover=t,this}}(jQuery),function(s){"use strict";function n(t,e){this.$body=s(document.body),this.$scrollElement=s(t).is(document.body)?s(window):s(t),this.options=s.extend({},n.DEFAULTS,e),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",s.proxy(this.process,this)),this.refresh(),this.process()}function e(o){return this.each(function(){var t=s(this),e=t.data("bs.scrollspy"),i="object"==typeof o&&o;e||t.data("bs.scrollspy",e=new n(this,i)),"string"==typeof o&&e[o]()})}n.VERSION="3.4.1",n.DEFAULTS={offset:10},n.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},n.prototype.refresh=function(){var t=this,o="offset",n=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),s.isWindow(this.$scrollElement[0])||(o="position",n=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var t=s(this),e=t.data("target")||t.attr("href"),i=/^#./.test(e)&&s(e);return i&&i.length&&i.is(":visible")&&[[i[o]().top+n,e]]||null}).sort(function(t,e){return t[0]-e[0]}).each(function(){t.offsets.push(this[0]),t.targets.push(this[1])})},n.prototype.process=function(){var t,e=this.$scrollElement.scrollTop()+this.options.offset,i=this.getScrollHeight(),o=this.options.offset+i-this.$scrollElement.height(),n=this.offsets,s=this.targets,a=this.activeTarget;if(this.scrollHeight!=i&&this.refresh(),o<=e)return a!=(t=s[s.length-1])&&this.activate(t);if(a&&e=n[t]&&(n[t+1]===undefined||e .active"),n=i&&r.support.transition&&(o.length&&o.hasClass("fade")||!!e.find("> .fade").length);function s(){o.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),t.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),n?(t[0].offsetWidth,t.addClass("in")):t.removeClass("fade"),t.parent(".dropdown-menu").length&&t.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),i&&i()}o.length&&n?o.one("bsTransitionEnd",s).emulateTransitionEnd(a.TRANSITION_DURATION):s(),o.removeClass("in")};var t=r.fn.tab;r.fn.tab=e,r.fn.tab.Constructor=a,r.fn.tab.noConflict=function(){return r.fn.tab=t,this};var i=function(t){t.preventDefault(),e.call(r(this),"show")};r(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',i).on("click.bs.tab.data-api",'[data-toggle="pill"]',i)}(jQuery),function(l){"use strict";var h=function(t,e){this.options=l.extend({},h.DEFAULTS,e);var i=this.options.target===h.DEFAULTS.target?l(this.options.target):l(document).find(this.options.target);this.$target=i.on("scroll.bs.affix.data-api",l.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",l.proxy(this.checkPositionWithEventLoop,this)),this.$element=l(t),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};function i(o){return this.each(function(){var t=l(this),e=t.data("bs.affix"),i="object"==typeof o&&o;e||t.data("bs.affix",e=new h(this,i)),"string"==typeof o&&e[o]()})}h.VERSION="3.4.1",h.RESET="affix affix-top affix-bottom",h.DEFAULTS={offset:0,target:window},h.prototype.getState=function(t,e,i,o){var n=this.$target.scrollTop(),s=this.$element.offset(),a=this.$target.height();if(null!=i&&"top"==this.affixed)return n 800) { + $( "#mysidebar" ).attr("class", "nav affix"); + } + // activate tooltips. although this is a bootstrap js function, it must be activated this way in your theme. + $('[data-toggle="tooltip"]').tooltip({ + placement : 'top' + }); + + /** + * AnchorJS + */ + anchors.add('h2,h3,h4,h5'); + +}); + +// needed for nav tabs on pages. See Formatting > Nav tabs for more details. +// script from http://stackoverflow.com/questions/10523433/how-do-i-keep-the-current-tab-active-with-twitter-bootstrap-after-a-page-reload +$(function() { + var json, tabsState; + $('a[data-toggle="pill"], a[data-toggle="tab"]').on('shown.bs.tab', function(e) { + var href, json, parentId, tabsState; + + tabsState = localStorage.getItem("tabs-state"); + json = JSON.parse(tabsState || "{}"); + parentId = $(e.target).parents("ul.nav.nav-pills, ul.nav.nav-tabs").attr("id"); + href = $(e.target).attr('href'); + json[parentId] = href; + + return localStorage.setItem("tabs-state", JSON.stringify(json)); + }); + + tabsState = localStorage.getItem("tabs-state"); + json = JSON.parse(tabsState || "{}"); + + $.each(json, function(containerId, href) { + return $("#" + containerId + " a[href=" + href + "]").tab('show'); + }); + + $("ul.nav.nav-pills, ul.nav.nav-tabs").each(function() { + var $this = $(this); + if (!json[$this.attr("id")]) { + return $this.find("a[data-toggle=tab]:first, a[data-toggle=pill]:first").tab("show"); + } + }); +}); diff --git a/js/html5shiv.js b/js/html5shiv.js new file mode 100644 index 0000000..448cebd --- /dev/null +++ b/js/html5shiv.js @@ -0,0 +1,8 @@ +/* + HTML5 Shiv v3.7.0 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +(function(l,f){function m(){var a=e.elements;return"string"==typeof a?a.split(" "):a}function i(a){var b=n[a[o]];b||(b={},h++,a[o]=h,n[h]=b);return b}function p(a,b,c){b||(b=f);if(g)return b.createElement(a);c||(c=i(b));b=c.cache[a]?c.cache[a].cloneNode():r.test(a)?(c.cache[a]=c.createElem(a)).cloneNode():c.createElem(a);return b.canHaveChildren&&!s.test(a)?c.frag.appendChild(b):b}function t(a,b){if(!b.cache)b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag(); +a.createElement=function(c){return!e.shivMethods?b.createElem(c):p(c,a,b)};a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+m().join().replace(/[\w\-]+/g,function(a){b.createElem(a);b.frag.createElement(a);return'c("'+a+'")'})+");return n}")(e,b.frag)}function q(a){a||(a=f);var b=i(a);if(e.shivCSS&&!j&&!b.hasCSS){var c,d=a;c=d.createElement("p");d=d.getElementsByTagName("head")[0]||d.documentElement;c.innerHTML="x"; +c=d.insertBefore(c.lastChild,d.firstChild);b.hasCSS=!!c}g||t(a,b);return a}var k=l.html5||{},s=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,r=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,j,o="_html5shiv",h=0,n={},g;(function(){try{var a=f.createElement("a");a.innerHTML="";j="hidden"in a;var b;if(!(b=1==a.childNodes.length)){f.createElement("a");var c=f.createDocumentFragment();b="undefined"==typeof c.cloneNode|| +"undefined"==typeof c.createDocumentFragment||"undefined"==typeof c.createElement}g=b}catch(d){g=j=!0}})();var e={elements:k.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output progress section summary template time video",version:"3.7.0",shivCSS:!1!==k.shivCSS,supportsUnknownElements:g,shivMethods:!1!==k.shivMethods,type:"default",shivDocument:q,createElement:p,createDocumentFragment:function(a,b){a||(a=f); +if(g)return a.createDocumentFragment();for(var b=b||i(a),c=b.frag.cloneNode(),d=0,e=m(),h=e.length;d=0}var self=this;self.matches=function(string,crit){return"string"!=typeof string?!1:(string=string.trim(),doMatch(string,crit))}}module.exports=new LiteralSearchStrategy},{}],4:[function(require,module){module.exports=function(){function findMatches(store,crit,strategy){for(var data=store.get(),i=0;i{title}',noResultsText:"No results found",limit:10,fuzzy:!1};self.init=function(_opt){validateOptions(_opt),assignOptions(_opt),isJSON(opt.dataSource)?initWithJSON(opt.dataSource):initWithURL(opt.dataSource)}}var Searcher=require("./Searcher"),Templater=require("./Templater"),Store=require("./Store"),JSONLoader=require("./JSONLoader"),searcher=new Searcher,templater=new Templater,store=new Store,jsonLoader=new JSONLoader;window.SimpleJekyllSearch=new SimpleJekyllSearch}(window,document)},{"./JSONLoader":1,"./Searcher":4,"./Store":5,"./Templater":6}]},{},[7]); diff --git a/js/jquery.ba-throttle-debounce.min.js b/js/jquery.ba-throttle-debounce.min.js new file mode 100644 index 0000000..0720550 --- /dev/null +++ b/js/jquery.ba-throttle-debounce.min.js @@ -0,0 +1,9 @@ +/* + * jQuery throttle / debounce - v1.1 - 3/7/2010 + * http://benalman.com/projects/jquery-throttle-debounce-plugin/ + * + * Copyright (c) 2010 "Cowboy" Ben Alman + * Dual licensed under the MIT and GPL licenses. + * http://benalman.com/about/license/ + */ +(function(b,c){var $=b.jQuery||b.Cowboy||(b.Cowboy={}),a;$.throttle=a=function(e,f,j,i){var h,d=0;if(typeof f!=="boolean"){i=j;j=f;f=c}function g(){var o=this,m=+new Date()-d,n=arguments;function l(){d=+new Date();j.apply(o,n)}function k(){h=c}if(i&&!h){l()}h&&clearTimeout(h);if(i===c&&m>e){l()}else{if(f!==true){h=setTimeout(i?k:l,i===c?e-m:e)}}}if($.guid){g.guid=j.guid=j.guid||$.guid++}return g};$.debounce=function(d,e,f){return f===c?a(d,e,false):a(d,f,e!==false)}})(this); \ No newline at end of file diff --git a/js/jquery.cookie.min.js b/js/jquery.cookie.min.js new file mode 100644 index 0000000..c0f19d8 --- /dev/null +++ b/js/jquery.cookie.min.js @@ -0,0 +1,2 @@ +/*! jquery.cookie v1.4.1 | MIT */ +!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):"object"==typeof exports?a(require("jquery")):a(jQuery)}(function(a){function b(a){return h.raw?a:encodeURIComponent(a)}function c(a){return h.raw?a:decodeURIComponent(a)}function d(a){return b(h.json?JSON.stringify(a):String(a))}function e(a){0===a.indexOf('"')&&(a=a.slice(1,-1).replace(/\\"/g,'"').replace(/\\\\/g,"\\"));try{return a=decodeURIComponent(a.replace(g," ")),h.json?JSON.parse(a):a}catch(b){}}function f(b,c){var d=h.raw?b:e(b);return a.isFunction(c)?c(d):d}var g=/\+/g,h=a.cookie=function(e,g,i){if(void 0!==g&&!a.isFunction(g)){if(i=a.extend({},h.defaults,i),"number"==typeof i.expires){var j=i.expires,k=i.expires=new Date;k.setTime(+k+864e5*j)}return document.cookie=[b(e),"=",d(g),i.expires?"; expires="+i.expires.toUTCString():"",i.path?"; path="+i.path:"",i.domain?"; domain="+i.domain:"",i.secure?"; secure":""].join("")}for(var l=e?void 0:{},m=document.cookie?document.cookie.split("; "):[],n=0,o=m.length;o>n;n++){var p=m[n].split("="),q=c(p.shift()),r=p.join("=");if(e&&e===q){l=f(r,g);break}e||void 0===(r=f(r))||(l[q]=r)}return l};h.defaults={},a.removeCookie=function(b,c){return void 0===a.cookie(b)?!1:(a.cookie(b,"",a.extend({},c,{expires:-1})),!a.cookie(b))}}); \ No newline at end of file diff --git a/js/jquery.min.js b/js/jquery.min.js new file mode 100644 index 0000000..a1c07fd --- /dev/null +++ b/js/jquery.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.4.1 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(m.childNodes),m.childNodes),t[m.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&((e?e.ownerDocument||e:m)!==C&&T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[k]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=k,!C.getElementsByName||!C.getElementsByName(k).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",$)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e===C||e.ownerDocument===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===C?-1:t===C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){A(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
",2===Vt.childNodes.length),k.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,k.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===k.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.fn[t]=function(e){return _(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return _(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){k.fn[n]=function(e,t){return 0").prepend(b.options.caretHtml),d=b.$el.find("li > a");b._trigger(c,!1),b._trigger(d,!0),b.$el.find("li:has(ul) > a").prepend(c)},_trigger:function(b,c){var d=this;b.on("click",function(b){b.stopPropagation();var e=c?a(this).next():a(this).parent().next(),f=!1;if(c){var g=a(this).attr("href");f=void 0===g||""===g||"#"===g}if(e=e.length>0?e:!1,d.options.onClickBefore.call(this,b,e),!c||e&&f)b.preventDefault(),d._toggle(e,e.is(":hidden")),d._save();else if(d.options.accordion){var h=d.state=d._parents(a(this));d.$el.find("ul").filter(":visible").each(function(){var b=a(this),c=b.attr("data-index");h.hasOwnProperty(c)||d._toggle(b,!1)}),d._save()}d.options.onClickAfter.call(this,b,e)})},_toggle:function(b,c){var d=this,e=b.attr("data-index"),f=b.parent();if(d.options.onToggleBefore.call(this,b,c),c){if(f.addClass(d.options.openClass),b.slideDown(d.options.slide),d.state[e]=1,d.options.accordion){var g=d.state=d._parents(b);g[e]=d.state[e]=1,d.$el.find("ul").filter(":visible").each(function(){var b=a(this),c=b.attr("data-index");g.hasOwnProperty(c)||d._toggle(b,!1)})}}else f.removeClass(d.options.openClass),b.slideUp(d.options.slide),d.state[e]=0;d.options.onToggleAfter.call(this,b,c)},_parents:function(b,c){var d={},e=b.parent(),f=e.parents("ul");return f.each(function(){var b=a(this),e=b.attr("data-index");return e?void(d[e]=c?b:1):!1}),d},_save:function(){if(this.options.save){var b={};for(var d in this.state)1===this.state[d]&&(b[d]=1);c[this.uuid]=this.state=b,a.cookie(this.options.cookie.name,JSON.stringify(c),this.options.cookie)}},_load:function(){if(this.options.save){if(null===c){var b=a.cookie(this.options.cookie.name);c=b?JSON.parse(b):{}}this.state=c.hasOwnProperty(this.uuid)?c[this.uuid]:{}}},toggle:function(b){var c=this,d=arguments.length;if(1>=d)c.$el.find("ul").each(function(){var d=a(this);c._toggle(d,b)});else{var e,f={},g=Array.prototype.slice.call(arguments,1);d--;for(var h=0;d>h;h++){e=g[h];var i=c.$el.find('ul[data-index="'+e+'"]').first();if(i&&(f[e]=i,b)){var j=c._parents(i,!0);for(var k in j)f.hasOwnProperty(k)||(f[k]=j[k])}}for(e in f)c._toggle(f[e],b)}c._save()},destroy:function(){a.removeData(this.$el),this.$el.find("li:has(ul) > a").unbind("click"),this.$el.find("li:has(ul) > a > span").unbind("click")}},a.fn.navgoco=function(c){if("string"==typeof c&&"_"!==c.charAt(0)&&"init"!==c)var d=!0,e=Array.prototype.slice.call(arguments,1);else c=a.extend({},a.fn.navgoco.defaults,c||{}),a.cookie||(c.save=!1);return this.each(function(f){var g=a(this),h=g.data("navgoco");h||(h=new b(this,d?a.fn.navgoco.defaults:c,f),g.data("navgoco",h)),d&&h[c].apply(h,e)})};var c=null;a.fn.navgoco.defaults={caretHtml:"",accordion:!1,openClass:"open",save:!0,cookie:{name:"navgoco",expires:!1,path:"/"},slide:{duration:400,easing:"swing"},onClickBefore:a.noop,onClickAfter:a.noop,onToggleBefore:a.noop,onToggleAfter:a.noop}}(jQuery); \ No newline at end of file diff --git a/js/jquery.shuffle.min.js b/js/jquery.shuffle.min.js new file mode 100644 index 0000000..d103127 --- /dev/null +++ b/js/jquery.shuffle.min.js @@ -0,0 +1,1588 @@ +/*! + * Shuffle.js by @Vestride + * Categorize, sort, and filter a responsive grid of items. + * Dependencies: jQuery 1.9+, Modernizr 2.6.2+ + * @license MIT license + * @version 3.0.0 + */ + +/* Modernizr 2.6.2 (Custom Build) | MIT & BSD + * Build: http://modernizr.com/download/#-csstransforms-csstransforms3d-csstransitions-cssclasses-prefixed-teststyles-testprop-testallprops-prefixes-domprefixes + */ +window.Modernizr=function(a,b,c){function z(a){j.cssText=a}function A(a,b){return z(m.join(a+";")+(b||""))}function B(a,b){return typeof a===b}function C(a,b){return!!~(""+a).indexOf(b)}function D(a,b){for(var d in a){var e=a[d];if(!C(e,"-")&&j[e]!==c)return b=="pfx"?e:!0}return!1}function E(a,b,d){for(var e in a){var f=b[a[e]];if(f!==c)return d===!1?a[e]:B(f,"function")?f.bind(d||b):f}return!1}function F(a,b,c){var d=a.charAt(0).toUpperCase()+a.slice(1),e=(a+" "+o.join(d+" ")+d).split(" ");return B(b,"string")||B(b,"undefined")?D(e,b):(e=(a+" "+p.join(d+" ")+d).split(" "),E(e,b,c))}var d="2.6.2",e={},f=!0,g=b.documentElement,h="modernizr",i=b.createElement(h),j=i.style,k,l={}.toString,m=" -webkit- -moz- -o- -ms- ".split(" "),n="Webkit Moz O ms",o=n.split(" "),p=n.toLowerCase().split(" "),q={},r={},s={},t=[],u=t.slice,v,w=function(a,c,d,e){var f,i,j,k,l=b.createElement("div"),m=b.body,n=m||b.createElement("body");if(parseInt(d,10))while(d--)j=b.createElement("div"),j.id=e?e[d]:h+(d+1),l.appendChild(j);return f=["­",'"].join(""),l.id=h,(m?l:n).innerHTML+=f,n.appendChild(l),m||(n.style.background="",n.style.overflow="hidden",k=g.style.overflow,g.style.overflow="hidden",g.appendChild(n)),i=c(l,a),m?l.parentNode.removeChild(l):(n.parentNode.removeChild(n),g.style.overflow=k),!!i},x={}.hasOwnProperty,y;!B(x,"undefined")&&!B(x.call,"undefined")?y=function(a,b){return x.call(a,b)}:y=function(a,b){return b in a&&B(a.constructor.prototype[b],"undefined")},Function.prototype.bind||(Function.prototype.bind=function(b){var c=this;if(typeof c!="function")throw new TypeError;var d=u.call(arguments,1),e=function(){if(this instanceof e){var a=function(){};a.prototype=c.prototype;var f=new a,g=c.apply(f,d.concat(u.call(arguments)));return Object(g)===g?g:f}return c.apply(b,d.concat(u.call(arguments)))};return e}),q.csstransforms=function(){return!!F("transform")},q.csstransforms3d=function(){var a=!!F("perspective");return a&&"webkitPerspective"in g.style&&w("@media (transform-3d),(-webkit-transform-3d){#modernizr{left:9px;position:absolute;height:3px;}}",function(b,c){a=b.offsetLeft===9&&b.offsetHeight===3}),a},q.csstransitions=function(){return F("transition")};for(var G in q)y(q,G)&&(v=G.toLowerCase(),e[v]=q[G](),t.push((e[v]?"":"no-")+v));return e.addTest=function(a,b){if(typeof a=="object")for(var d in a)y(a,d)&&e.addTest(d,a[d]);else{a=a.toLowerCase();if(e[a]!==c)return e;b=typeof b=="function"?b():b,typeof f!="undefined"&&f&&(g.className+=" "+(b?"":"no-")+a),e[a]=b}return e},z(""),i=k=null,e._version=d,e._prefixes=m,e._domPrefixes=p,e._cssomPrefixes=o,e.testProp=function(a){return D([a])},e.testAllProps=F,e.testStyles=w,e.prefixed=function(a,b,c){return b?F(a,b,c):F(a,"pfx")},g.className=g.className.replace(/(^|\s)no-js(\s|$)/,"$1$2")+(f?" js "+t.join(" "):""),e}(this,this.document); + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['jquery', 'modernizr'], factory); + } else { + window.Shuffle = factory(window.jQuery, window.Modernizr); + } +})(function($, Modernizr, undefined) { + +'use strict'; + + +// Validate Modernizr exists. +// Shuffle requires `csstransitions`, `csstransforms`, `csstransforms3d`, +// and `prefixed` to exist on the Modernizr object. +if (typeof Modernizr !== 'object') { + throw new Error('Shuffle.js requires Modernizr.\n' + + 'http://vestride.github.io/Shuffle/#dependencies'); +} + + +/** + * Returns css prefixed properties like `-webkit-transition` or `box-sizing` + * from `transition` or `boxSizing`, respectively. + * @param {(string|boolean)} prop Property to be prefixed. + * @return {string} The prefixed css property. + */ +function dashify( prop ) { + if (!prop) { + return ''; + } + + // Replace upper case with dash-lowercase, + // then fix ms- prefixes because they're not capitalized. + return prop.replace(/([A-Z])/g, function( str, m1 ) { + return '-' + m1.toLowerCase(); + }).replace(/^ms-/,'-ms-'); +} + +// Constant, prefixed variables. +var TRANSITION = Modernizr.prefixed('transition'); +var TRANSITION_DELAY = Modernizr.prefixed('transitionDelay'); +var TRANSITION_DURATION = Modernizr.prefixed('transitionDuration'); + +// Note(glen): Stock Android 4.1.x browser will fail here because it wrongly +// says it supports non-prefixed transitions. +// https://github.com/Modernizr/Modernizr/issues/897 +var TRANSITIONEND = { + 'WebkitTransition' : 'webkitTransitionEnd', + 'transition' : 'transitionend' +}[ TRANSITION ]; + +var TRANSFORM = Modernizr.prefixed('transform'); +var CSS_TRANSFORM = dashify(TRANSFORM); + +// Constants +var CAN_TRANSITION_TRANSFORMS = Modernizr.csstransforms && Modernizr.csstransitions; +var HAS_TRANSFORMS_3D = Modernizr.csstransforms3d; +var SHUFFLE = 'shuffle'; +var COLUMN_THRESHOLD = 0.3; + +// Configurable. You can change these constants to fit your application. +// The default scale and concealed scale, however, have to be different values. +var ALL_ITEMS = 'all'; +var FILTER_ATTRIBUTE_KEY = 'groups'; +var DEFAULT_SCALE = 1; +var CONCEALED_SCALE = 0.001; + + +// Underscore's throttle function. +function throttle(func, wait, options) { + var context, args, result; + var timeout = null; + var previous = 0; + options = options || {}; + var later = function() { + previous = options.leading === false ? 0 : $.now(); + timeout = null; + result = func.apply(context, args); + context = args = null; + }; + return function() { + var now = $.now(); + if (!previous && options.leading === false) { + previous = now; + } + var remaining = wait - (now - previous); + context = this; + args = arguments; + if (remaining <= 0 || remaining > wait) { + clearTimeout(timeout); + timeout = null; + previous = now; + result = func.apply(context, args); + context = args = null; + } else if (!timeout && options.trailing !== false) { + timeout = setTimeout(later, remaining); + } + return result; + }; +} + +function each(obj, iterator, context) { + for (var i = 0, length = obj.length; i < length; i++) { + if (iterator.call(context, obj[i], i, obj) === {}) { + return; + } + } +} + +function defer(fn, context, wait) { + return setTimeout( $.proxy( fn, context ), wait ); +} + +function arrayMax( array ) { + return Math.max.apply( Math, array ); +} + +function arrayMin( array ) { + return Math.min.apply( Math, array ); +} + + +/** + * Always returns a numeric value, given a value. + * @param {*} value Possibly numeric value. + * @return {number} `value` or zero if `value` isn't numeric. + * @private + */ +function getNumber(value) { + return $.isNumeric(value) ? value : 0; +} + + +/** + * Represents a coordinate pair. + * @param {number} [x=0] X. + * @param {number} [y=0] Y. + */ +var Point = function(x, y) { + this.x = getNumber( x ); + this.y = getNumber( y ); +}; + + +/** + * Whether two points are equal. + * @param {Point} a Point A. + * @param {Point} b Point B. + * @return {boolean} + */ +Point.equals = function(a, b) { + return a.x === b.x && a.y === b.y; +}; + + +// Used for unique instance variables +var id = 0; +var $window = $( window ); + + +/** + * Categorize, sort, and filter a responsive grid of items. + * + * @param {Element} element An element which is the parent container for the grid items. + * @param {Object} [options=Shuffle.options] Options object. + * @constructor + */ +var Shuffle = function( element, options ) { + options = options || {}; + $.extend( this, Shuffle.options, options, Shuffle.settings ); + + this.$el = $(element); + this.element = element; + this.unique = 'shuffle_' + id++; + + this._fire( Shuffle.EventType.LOADING ); + this._init(); + + // Dispatch the done event asynchronously so that people can bind to it after + // Shuffle has been initialized. + defer(function() { + this.initialized = true; + this._fire( Shuffle.EventType.DONE ); + }, this, 16); +}; + + +/** + * Events the container element emits with the .shuffle namespace. + * For example, "done.shuffle". + * @enum {string} + */ +Shuffle.EventType = { + LOADING: 'loading', + DONE: 'done', + LAYOUT: 'layout', + REMOVED: 'removed' +}; + + +/** @enum {string} */ +Shuffle.ClassName = { + BASE: SHUFFLE, + SHUFFLE_ITEM: 'shuffle-item', + FILTERED: 'filtered', + CONCEALED: 'concealed' +}; + + +// Overrideable options +Shuffle.options = { + group: ALL_ITEMS, // Initial filter group. + speed: 250, // Transition/animation speed (milliseconds). + easing: 'ease-out', // CSS easing function to use. + itemSelector: '', // e.g. '.picture-item'. + sizer: null, // Sizer element. Use an element to determine the size of columns and gutters. + gutterWidth: 0, // A static number or function that tells the plugin how wide the gutters between columns are (in pixels). + columnWidth: 0, // A static number or function that returns a number which tells the plugin how wide the columns are (in pixels). + delimeter: null, // If your group is not json, and is comma delimeted, you could set delimeter to ','. + buffer: 0, // Useful for percentage based heights when they might not always be exactly the same (in pixels). + initialSort: null, // Shuffle can be initialized with a sort object. It is the same object given to the sort method. + throttle: throttle, // By default, shuffle will throttle resize events. This can be changed or removed. + throttleTime: 300, // How often shuffle can be called on resize (in milliseconds). + sequentialFadeDelay: 150, // Delay between each item that fades in when adding items. + supported: CAN_TRANSITION_TRANSFORMS // Whether to use transforms or absolute positioning. +}; + + +// Not overrideable +Shuffle.settings = { + useSizer: false, + itemCss : { // default CSS for each item + position: 'absolute', + top: 0, + left: 0, + visibility: 'visible' + }, + revealAppendedDelay: 300, + lastSort: {}, + lastFilter: ALL_ITEMS, + enabled: true, + destroyed: false, + initialized: false, + _animations: [], + styleQueue: [] +}; + + +// Expose for testing. +Shuffle.Point = Point; + + +/** + * Static methods. + */ + +/** + * If the browser has 3d transforms available, build a string with those, + * otherwise use 2d transforms. + * @param {Point} point X and Y positions. + * @param {number} scale Scale amount. + * @return {string} A normalized string which can be used with the transform style. + * @private + */ +Shuffle._getItemTransformString = function(point, scale) { + if ( HAS_TRANSFORMS_3D ) { + return 'translate3d(' + point.x + 'px, ' + point.y + 'px, 0) scale3d(' + scale + ', ' + scale + ', 1)'; + } else { + return 'translate(' + point.x + 'px, ' + point.y + 'px) scale(' + scale + ')'; + } +}; + + +/** + * Retrieve the computed style for an element, parsed as a float. This should + * not be used for width or height values because jQuery mangles them and they + * are not precise enough. + * @param {Element} element Element to get style for. + * @param {string} style Style property. + * @return {number} The parsed computed value or zero if that fails because IE + * will return 'auto' when the element doesn't have margins instead of + * the computed style. + * @private + */ +Shuffle._getNumberStyle = function( element, style ) { + return Shuffle._getFloat( $( element ).css( style ) ); +}; + + +/** + * Parse a string as an integer. + * @param {string} value String integer. + * @return {number} The string as an integer or zero. + * @private + */ +Shuffle._getInt = function(value) { + return getNumber( parseInt( value, 10 ) ); +}; + +/** + * Parse a string as an float. + * @param {string} value String float. + * @return {number} The string as an float or zero. + * @private + */ +Shuffle._getFloat = function(value) { + return getNumber( parseFloat( value ) ); +}; + + +/** + * Returns the outer width of an element, optionally including its margins. + * The `offsetWidth` property must be used because having a scale transform + * on the element affects the bounding box. Sadly, Firefox doesn't return an + * integer value for offsetWidth (yet). + * @param {Element} element The element. + * @param {boolean} [includeMargins] Whether to include margins. Default is false. + * @return {number} The width. + */ +Shuffle._getOuterWidth = function( element, includeMargins ) { + var width = element.offsetWidth; + + // Use jQuery here because it uses getComputedStyle internally and is + // cross-browser. Using the style property of the element will only work + // if there are inline styles. + if ( includeMargins ) { + var marginLeft = Shuffle._getNumberStyle( element, 'marginLeft'); + var marginRight = Shuffle._getNumberStyle( element, 'marginRight'); + width += marginLeft + marginRight; + } + + return width; +}; + + +/** + * Returns the outer height of an element, optionally including its margins. + * @param {Element} element The element. + * @param {boolean} [includeMargins] Whether to include margins. Default is false. + * @return {number} The height. + */ +Shuffle._getOuterHeight = function( element, includeMargins ) { + var height = element.offsetHeight; + + if ( includeMargins ) { + var marginTop = Shuffle._getNumberStyle( element, 'marginTop'); + var marginBottom = Shuffle._getNumberStyle( element, 'marginBottom'); + height += marginTop + marginBottom; + } + + return height; +}; + + +/** + * Change a property or execute a function which will not have a transition + * @param {Element} element DOM element that won't be transitioned + * @param {Function} callback A function which will be called while transition + * is set to 0ms. + * @param {Object} [context] Optional context for the callback function. + * @private + */ +Shuffle._skipTransition = function( element, callback, context ) { + var duration = element.style[ TRANSITION_DURATION ]; + + // Set the duration to zero so it happens immediately + element.style[ TRANSITION_DURATION ] = '0ms'; // ms needed for firefox! + + callback.call( context ); + + // Force reflow + var reflow = element.offsetWidth; + // Avoid jshint warnings: unused variables and expressions. + reflow = null; + + // Put the duration back + element.style[ TRANSITION_DURATION ] = duration; +}; + + +/** + * Instance methods. + */ + +Shuffle.prototype._init = function() { + this.$items = this._getItems(); + + this.sizer = this._getElementOption( this.sizer ); + + if ( this.sizer ) { + this.useSizer = true; + } + + // Add class and invalidate styles + this.$el.addClass( Shuffle.ClassName.BASE ); + + // Set initial css for each item + this._initItems(); + + // Bind resize events + // http://stackoverflow.com/questions/1852751/window-resize-event-firing-in-internet-explorer + $window.on('resize.' + SHUFFLE + '.' + this.unique, this._getResizeFunction()); + + // Get container css all in one request. Causes reflow + var containerCSS = this.$el.css(['position', 'overflow']); + var containerWidth = Shuffle._getOuterWidth( this.element ); + + // Add styles to the container if it doesn't have them. + this._validateStyles( containerCSS ); + + // We already got the container's width above, no need to cause another reflow getting it again... + // Calculate the number of columns there will be + this._setColumns( containerWidth ); + + // Kick off! + this.shuffle( this.group, this.initialSort ); + + // The shuffle items haven't had transitions set on them yet + // so the user doesn't see the first layout. Set them now that the first layout is done. + if ( this.supported ) { + defer(function() { + this._setTransitions(); + this.element.style[ TRANSITION ] = 'height ' + this.speed + 'ms ' + this.easing; + }, this); + } +}; + + +/** + * Returns a throttled and proxied function for the resize handler. + * @return {Function} + * @private + */ +Shuffle.prototype._getResizeFunction = function() { + var resizeFunction = $.proxy( this._onResize, this ); + return this.throttle ? + this.throttle( resizeFunction, this.throttleTime ) : + resizeFunction; +}; + + +/** + * Retrieve an element from an option. + * @param {string|jQuery|Element} option The option to check. + * @return {?Element} The plain element or null. + * @private + */ +Shuffle.prototype._getElementOption = function( option ) { + // If column width is a string, treat is as a selector and search for the + // sizer element within the outermost container + if ( typeof option === 'string' ) { + return this.$el.find( option )[0] || null; + + // Check for an element + } else if ( option && option.nodeType && option.nodeType === 1 ) { + return option; + + // Check for jQuery object + } else if ( option && option.jquery ) { + return option[0]; + } + + return null; +}; + + +/** + * Ensures the shuffle container has the css styles it needs applied to it. + * @param {Object} styles Key value pairs for position and overflow. + * @private + */ +Shuffle.prototype._validateStyles = function(styles) { + // Position cannot be static. + if ( styles.position === 'static' ) { + this.element.style.position = 'relative'; + } + + // Overflow has to be hidden + if ( styles.overflow !== 'hidden' ) { + this.element.style.overflow = 'hidden'; + } +}; + + +/** + * Filter the elements by a category. + * @param {string} [category] Category to filter by. If it's given, the last + * category will be used to filter the items. + * @param {ArrayLike} [$collection] Optionally filter a collection. Defaults to + * all the items. + * @return {jQuery} Filtered items. + * @private + */ +Shuffle.prototype._filter = function( category, $collection ) { + category = category || this.lastFilter; + $collection = $collection || this.$items; + + var set = this._getFilteredSets( category, $collection ); + + // Individually add/remove concealed/filtered classes + this._toggleFilterClasses( set.filtered, set.concealed ); + + // Save the last filter in case elements are appended. + this.lastFilter = category; + + // This is saved mainly because providing a filter function (like searching) + // will overwrite the `lastFilter` property every time its called. + if ( typeof category === 'string' ) { + this.group = category; + } + + return set.filtered; +}; + + +/** + * Returns an object containing the filtered and concealed elements. + * @param {string|Function} category Category or function to filter by. + * @param {ArrayLike.} $items A collection of items to filter. + * @return {!{filtered: jQuery, concealed: jQuery}} + * @private + */ +Shuffle.prototype._getFilteredSets = function( category, $items ) { + var $filtered = $(); + var $concealed = $(); + + // category === 'all', add filtered class to everything + if ( category === ALL_ITEMS ) { + $filtered = $items; + + // Loop through each item and use provided function to determine + // whether to hide it or not. + } else { + each($items, function( el ) { + var $item = $(el); + if ( this._doesPassFilter( category, $item ) ) { + $filtered = $filtered.add( $item ); + } else { + $concealed = $concealed.add( $item ); + } + }, this); + } + + return { + filtered: $filtered, + concealed: $concealed + }; +}; + + +/** + * Test an item to see if it passes a category. + * @param {string|Function} category Category or function to filter by. + * @param {jQuery} $item A single item, wrapped with jQuery. + * @return {boolean} Whether it passes the category/filter. + * @private + */ +Shuffle.prototype._doesPassFilter = function( category, $item ) { + if ( $.isFunction( category ) ) { + return category.call( $item[0], $item, this ); + + // Check each element's data-groups attribute against the given category. + } else { + var groups = $item.data( FILTER_ATTRIBUTE_KEY ); + var keys = this.delimeter && !$.isArray( groups ) ? + groups.split( this.delimeter ) : + groups; + return $.inArray(category, keys) > -1; + } +}; + + +/** + * Toggles the filtered and concealed class names. + * @param {jQuery} $filtered Filtered set. + * @param {jQuery} $concealed Concealed set. + * @private + */ +Shuffle.prototype._toggleFilterClasses = function( $filtered, $concealed ) { + $filtered + .removeClass( Shuffle.ClassName.CONCEALED ) + .addClass( Shuffle.ClassName.FILTERED ); + $concealed + .removeClass( Shuffle.ClassName.FILTERED ) + .addClass( Shuffle.ClassName.CONCEALED ); +}; + + +/** + * Set the initial css for each item + * @param {jQuery} [$items] Optionally specifiy at set to initialize + */ +Shuffle.prototype._initItems = function( $items ) { + $items = $items || this.$items; + $items.addClass([ + Shuffle.ClassName.SHUFFLE_ITEM, + Shuffle.ClassName.FILTERED + ].join(' ')); + $items.css( this.itemCss ).data('point', new Point()).data('scale', DEFAULT_SCALE); +}; + + +/** + * Updates the filtered item count. + * @private + */ +Shuffle.prototype._updateItemCount = function() { + this.visibleItems = this._getFilteredItems().length; +}; + + +/** + * Sets css transform transition on a an element. + * @param {Element} element Element to set transition on. + * @private + */ +Shuffle.prototype._setTransition = function( element ) { + element.style[ TRANSITION ] = CSS_TRANSFORM + ' ' + this.speed + 'ms ' + + this.easing + ', opacity ' + this.speed + 'ms ' + this.easing; +}; + + +/** + * Sets css transform transition on a group of elements. + * @param {ArrayLike.} $items Elements to set transitions on. + * @private + */ +Shuffle.prototype._setTransitions = function( $items ) { + $items = $items || this.$items; + each($items, function( el ) { + this._setTransition( el ); + }, this); +}; + + +/** + * Sets a transition delay on a collection of elements, making each delay + * greater than the last. + * @param {ArrayLike.} $collection Array to iterate over. + */ +Shuffle.prototype._setSequentialDelay = function( $collection ) { + if ( !this.supported ) { + return; + } + + // $collection can be an array of dom elements or jquery object + each($collection, function( el, i ) { + // This works because the transition-property: transform, opacity; + el.style[ TRANSITION_DELAY ] = '0ms,' + ((i + 1) * this.sequentialFadeDelay) + 'ms'; + }, this); +}; + + +Shuffle.prototype._getItems = function() { + return this.$el.children( this.itemSelector ); +}; + + +Shuffle.prototype._getFilteredItems = function() { + return this.$items.filter('.' + Shuffle.ClassName.FILTERED); +}; + + +Shuffle.prototype._getConcealedItems = function() { + return this.$items.filter('.' + Shuffle.ClassName.CONCEALED); +}; + + +/** + * Returns the column size, based on column width and sizer options. + * @param {number} containerWidth Size of the parent container. + * @param {number} gutterSize Size of the gutters. + * @return {number} + * @private + */ +Shuffle.prototype._getColumnSize = function( containerWidth, gutterSize ) { + var size; + + // If the columnWidth property is a function, then the grid is fluid + if ( $.isFunction( this.columnWidth ) ) { + size = this.columnWidth(containerWidth); + + // columnWidth option isn't a function, are they using a sizing element? + } else if ( this.useSizer ) { + size = Shuffle._getOuterWidth(this.sizer); + + // if not, how about the explicitly set option? + } else if ( this.columnWidth ) { + size = this.columnWidth; + + // or use the size of the first item + } else if ( this.$items.length > 0 ) { + size = Shuffle._getOuterWidth(this.$items[0], true); + + // if there's no items, use size of container + } else { + size = containerWidth; + } + + // Don't let them set a column width of zero. + if ( size === 0 ) { + size = containerWidth; + } + + return size + gutterSize; +}; + + +/** + * Returns the gutter size, based on gutter width and sizer options. + * @param {number} containerWidth Size of the parent container. + * @return {number} + * @private + */ +Shuffle.prototype._getGutterSize = function( containerWidth ) { + var size; + if ( $.isFunction( this.gutterWidth ) ) { + size = this.gutterWidth(containerWidth); + } else if ( this.useSizer ) { + size = Shuffle._getNumberStyle(this.sizer, 'marginLeft'); + } else { + size = this.gutterWidth; + } + + return size; +}; + + +/** + * Calculate the number of columns to be used. Gets css if using sizer element. + * @param {number} [theContainerWidth] Optionally specify a container width if it's already available. + */ +Shuffle.prototype._setColumns = function( theContainerWidth ) { + var containerWidth = theContainerWidth || Shuffle._getOuterWidth( this.element ); + var gutter = this._getGutterSize( containerWidth ); + var columnWidth = this._getColumnSize( containerWidth, gutter ); + var calculatedColumns = (containerWidth + gutter) / columnWidth; + + // Widths given from getComputedStyle are not precise enough... + if ( Math.abs(Math.round(calculatedColumns) - calculatedColumns) < COLUMN_THRESHOLD ) { + // e.g. calculatedColumns = 11.998876 + calculatedColumns = Math.round( calculatedColumns ); + } + + this.cols = Math.max( Math.floor(calculatedColumns), 1 ); + this.containerWidth = containerWidth; + this.colWidth = columnWidth; +}; + +/** + * Adjust the height of the grid + */ +Shuffle.prototype._setContainerSize = function() { + this.$el.css( 'height', this._getContainerSize() ); +}; + + +/** + * Based on the column heights, it returns the biggest one. + * @return {number} + * @private + */ +Shuffle.prototype._getContainerSize = function() { + return arrayMax( this.positions ); +}; + + +/** + * Fire events with .shuffle namespace + */ +Shuffle.prototype._fire = function( name, args ) { + this.$el.trigger( name + '.' + SHUFFLE, args && args.length ? args : [ this ] ); +}; + + +/** + * Zeros out the y columns array, which is used to determine item placement. + * @private + */ +Shuffle.prototype._resetCols = function() { + var i = this.cols; + this.positions = []; + while (i--) { + this.positions.push( 0 ); + } +}; + + +/** + * Loops through each item that should be shown and calculates the x, y position. + * @param {Array.} items Array of items that will be shown/layed out in order in their array. + * Because jQuery collection are always ordered in DOM order, we can't pass a jq collection. + * @param {boolean} [isOnlyPosition=false] If true this will position the items with zero opacity. + */ +Shuffle.prototype._layout = function( items, isOnlyPosition ) { + each(items, function( item ) { + this._layoutItem( item, !!isOnlyPosition ); + }, this); + + // `_layout` always happens after `_shrink`, so it's safe to process the style + // queue here with styles from the shrink method. + this._processStyleQueue(); + + // Adjust the height of the container. + this._setContainerSize(); +}; + + +/** + * Calculates the position of the item and pushes it onto the style queue. + * @param {Element} item Element which is being positioned. + * @param {boolean} isOnlyPosition Whether to position the item, but with zero + * opacity so that it can fade in later. + * @private + */ +Shuffle.prototype._layoutItem = function( item, isOnlyPosition ) { + var $item = $(item); + var itemData = $item.data(); + var currPos = itemData.point; + var currScale = itemData.scale; + var itemSize = { + width: Shuffle._getOuterWidth( item, true ), + height: Shuffle._getOuterHeight( item, true ) + }; + var pos = this._getItemPosition( itemSize ); + + // If the item will not change its position, do not add it to the render + // queue. Transitions don't fire when setting a property to the same value. + if ( Point.equals(currPos, pos) && currScale === DEFAULT_SCALE ) { + return; + } + + // Save data for shrink + itemData.point = pos; + itemData.scale = DEFAULT_SCALE; + + this.styleQueue.push({ + $item: $item, + point: pos, + scale: DEFAULT_SCALE, + opacity: isOnlyPosition ? 0 : 1, + skipTransition: isOnlyPosition, + callfront: function() { + if ( !isOnlyPosition ) { + $item.css( 'visibility', 'visible' ); + } + }, + callback: function() { + if ( isOnlyPosition ) { + $item.css( 'visibility', 'hidden' ); + } + } + }); +}; + + +/** + * Determine the location of the next item, based on its size. + * @param {{width: number, height: number}} itemSize Object with width and height. + * @return {Point} + * @private + */ +Shuffle.prototype._getItemPosition = function( itemSize ) { + var columnSpan = this._getColumnSpan( itemSize.width, this.colWidth, this.cols ); + + var setY = this._getColumnSet( columnSpan, this.cols ); + + // Finds the index of the smallest number in the set. + var shortColumnIndex = this._getShortColumn( setY, this.buffer ); + + // Position the item + var point = new Point( + Math.round( this.colWidth * shortColumnIndex ), + Math.round( setY[shortColumnIndex] )); + + // Update the columns array with the new values for each column. + // e.g. before the update the columns could be [250, 0, 0, 0] for an item + // which spans 2 columns. After it would be [250, itemHeight, itemHeight, 0]. + var setHeight = setY[shortColumnIndex] + itemSize.height; + var setSpan = this.cols + 1 - setY.length; + for ( var i = 0; i < setSpan; i++ ) { + this.positions[ shortColumnIndex + i ] = setHeight; + } + + return point; +}; + + +/** + * Determine the number of columns an items spans. + * @param {number} itemWidth Width of the item. + * @param {number} columnWidth Width of the column (includes gutter). + * @param {number} columns Total number of columns + * @return {number} + * @private + */ +Shuffle.prototype._getColumnSpan = function( itemWidth, columnWidth, columns ) { + var columnSpan = itemWidth / columnWidth; + + // If the difference between the rounded column span number and the + // calculated column span number is really small, round the number to + // make it fit. + if ( Math.abs(Math.round( columnSpan ) - columnSpan ) < COLUMN_THRESHOLD ) { + // e.g. columnSpan = 4.0089945390298745 + columnSpan = Math.round( columnSpan ); + } + + // Ensure the column span is not more than the amount of columns in the whole layout. + return Math.min( Math.ceil( columnSpan ), columns ); +}; + + +/** + * Retrieves the column set to use for placement. + * @param {number} columnSpan The number of columns this current item spans. + * @param {number} columns The total columns in the grid. + * @return {Array.} An array of numbers represeting the column set. + * @private + */ +Shuffle.prototype._getColumnSet = function( columnSpan, columns ) { + // The item spans only one column. + if ( columnSpan === 1 ) { + return this.positions; + + // The item spans more than one column, figure out how many different + // places it could fit horizontally. + // The group count is the number of places within the positions this block + // could fit, ignoring the current positions of items. + // Imagine a 2 column brick as the second item in a 4 column grid with + // 10px height each. Find the places it would fit: + // [10, 0, 0, 0] + // | | | + // * * * + // + // Then take the places which fit and get the bigger of the two: + // max([10, 0]), max([0, 0]), max([0, 0]) = [10, 0, 0] + // + // Next, find the first smallest number (the short column). + // [10, 0, 0] + // | + // * + // + // And that's where it should be placed! + } else { + var groupCount = columns + 1 - columnSpan; + var groupY = []; + + // For how many possible positions for this item there are. + for ( var i = 0; i < groupCount; i++ ) { + // Find the bigger value for each place it could fit. + groupY[i] = arrayMax( this.positions.slice( i, i + columnSpan ) ); + } + + return groupY; + } +}; + + +/** + * Find index of short column, the first from the left where this item will go. + * + * @param {Array.} positions The array to search for the smallest number. + * @param {number} buffer Optional buffer which is very useful when the height + * is a percentage of the width. + * @return {number} Index of the short column. + * @private + */ +Shuffle.prototype._getShortColumn = function( positions, buffer ) { + var minPosition = arrayMin( positions ); + for (var i = 0, len = positions.length; i < len; i++) { + if ( positions[i] >= minPosition - buffer && positions[i] <= minPosition + buffer ) { + return i; + } + } + return 0; +}; + + +/** + * Hides the elements that don't match our filter. + * @param {jQuery} $collection jQuery collection to shrink. + * @private + */ +Shuffle.prototype._shrink = function( $collection ) { + var $concealed = $collection || this._getConcealedItems(); + + each($concealed, function( item ) { + var $item = $(item); + var itemData = $item.data(); + + // Continuing would add a transitionend event listener to the element, but + // that listener would not execute because the transform and opacity would + // stay the same. + if ( itemData.scale === CONCEALED_SCALE ) { + return; + } + + itemData.scale = CONCEALED_SCALE; + + this.styleQueue.push({ + $item: $item, + point: itemData.point, + scale : CONCEALED_SCALE, + opacity: 0, + callback: function() { + $item.css( 'visibility', 'hidden' ); + } + }); + }, this); +}; + + +/** + * Resize handler. + * @private + */ +Shuffle.prototype._onResize = function() { + // If shuffle is disabled, destroyed, don't do anything + if ( !this.enabled || this.destroyed || this.isTransitioning ) { + return; + } + + // Will need to check height in the future if it's layed out horizontaly + var containerWidth = Shuffle._getOuterWidth( this.element ); + + // containerWidth hasn't changed, don't do anything + if ( containerWidth === this.containerWidth ) { + return; + } + + this.update(); +}; + + +/** + * Returns styles for either jQuery animate or transition. + * @param {Object} opts Transition options. + * @return {!Object} Transforms for transitions, left/top for animate. + * @private + */ +Shuffle.prototype._getStylesForTransition = function( opts ) { + var styles = { + opacity: opts.opacity + }; + + if ( this.supported ) { + styles[ TRANSFORM ] = Shuffle._getItemTransformString( opts.point, opts.scale ); + } else { + styles.left = opts.point.x; + styles.top = opts.point.y; + } + + return styles; +}; + + +/** + * Transitions an item in the grid + * + * @param {Object} opts options. + * @param {jQuery} opts.$item jQuery object representing the current item. + * @param {Point} opts.point A point object with the x and y coordinates. + * @param {number} opts.scale Amount to scale the item. + * @param {number} opts.opacity Opacity of the item. + * @param {Function} opts.callback Complete function for the animation. + * @param {Function} opts.callfront Function to call before transitioning. + * @private + */ +Shuffle.prototype._transition = function( opts ) { + var styles = this._getStylesForTransition( opts ); + this._startItemAnimation( opts.$item, styles, opts.callfront || $.noop, opts.callback || $.noop ); +}; + + +Shuffle.prototype._startItemAnimation = function( $item, styles, callfront, callback ) { + // Transition end handler removes its listener. + function handleTransitionEnd( evt ) { + // Make sure this event handler has not bubbled up from a child. + if ( evt.target === evt.currentTarget ) { + $( evt.target ).off( TRANSITIONEND, handleTransitionEnd ); + callback(); + } + } + + callfront(); + + // Transitions are not set until shuffle has loaded to avoid the initial transition. + if ( !this.initialized ) { + $item.css( styles ); + callback(); + return; + } + + // Use CSS Transforms if we have them + if ( this.supported ) { + $item.css( styles ); + $item.on( TRANSITIONEND, handleTransitionEnd ); + + // Use jQuery to animate left/top + } else { + // Save the deferred object which jQuery returns. + var anim = $item.stop( true ).animate( styles, this.speed, 'swing', callback ); + // Push the animation to the list of pending animations. + this._animations.push( anim.promise() ); + } +}; + + +/** + * Execute the styles gathered in the style queue. This applies styles to elements, + * triggering transitions. + * @param {boolean} noLayout Whether to trigger a layout event. + * @private + */ +Shuffle.prototype._processStyleQueue = function( noLayout ) { + var $transitions = $(); + + // Iterate over the queue and keep track of ones that use transitions. + each(this.styleQueue, function( transitionObj ) { + if ( transitionObj.skipTransition ) { + this._styleImmediately( transitionObj ); + } else { + $transitions = $transitions.add( transitionObj.$item ); + this._transition( transitionObj ); + } + }, this); + + + if ( $transitions.length > 0 && this.initialized ) { + // Set flag that shuffle is currently in motion. + this.isTransitioning = true; + + if ( this.supported ) { + this._whenCollectionDone( $transitions, TRANSITIONEND, this._movementFinished ); + + // The _transition function appends a promise to the animations array. + // When they're all complete, do things. + } else { + this._whenAnimationsDone( this._movementFinished ); + } + + // A call to layout happened, but none of the newly filtered items will + // change position. Asynchronously fire the callback here. + } else if ( !noLayout ) { + defer( this._layoutEnd, this ); + } + + // Remove everything in the style queue + this.styleQueue.length = 0; +}; + + +/** + * Apply styles without a transition. + * @param {Object} opts Transitions options object. + * @private + */ +Shuffle.prototype._styleImmediately = function( opts ) { + Shuffle._skipTransition(opts.$item[0], function() { + opts.$item.css( this._getStylesForTransition( opts ) ); + }, this); +}; + +Shuffle.prototype._movementFinished = function() { + this.isTransitioning = false; + this._layoutEnd(); +}; + +Shuffle.prototype._layoutEnd = function() { + this._fire( Shuffle.EventType.LAYOUT ); +}; + +Shuffle.prototype._addItems = function( $newItems, addToEnd, isSequential ) { + // Add classes and set initial positions. + this._initItems( $newItems ); + + // Add transition to each item. + this._setTransitions( $newItems ); + + // Update the list of + this.$items = this._getItems(); + + // Shrink all items (without transitions). + this._shrink( $newItems ); + each(this.styleQueue, function( transitionObj ) { + transitionObj.skipTransition = true; + }); + + // Apply shrink positions, but do not cause a layout event. + this._processStyleQueue( true ); + + if ( addToEnd ) { + this._addItemsToEnd( $newItems, isSequential ); + } else { + this.shuffle( this.lastFilter ); + } +}; + + +Shuffle.prototype._addItemsToEnd = function( $newItems, isSequential ) { + // Get ones that passed the current filter + var $passed = this._filter( null, $newItems ); + var passed = $passed.get(); + + // How many filtered elements? + this._updateItemCount(); + + this._layout( passed, true ); + + if ( isSequential && this.supported ) { + this._setSequentialDelay( passed ); + } + + this._revealAppended( passed ); +}; + + +/** + * Triggers appended elements to fade in. + * @param {ArrayLike.} $newFilteredItems Collection of elements. + * @private + */ +Shuffle.prototype._revealAppended = function( newFilteredItems ) { + defer(function() { + each(newFilteredItems, function( el ) { + var $item = $( el ); + this._transition({ + $item: $item, + opacity: 1, + point: $item.data('point'), + scale: DEFAULT_SCALE + }); + }, this); + + this._whenCollectionDone($(newFilteredItems), TRANSITIONEND, function() { + $(newFilteredItems).css( TRANSITION_DELAY, '0ms' ); + this._movementFinished(); + }); + }, this, this.revealAppendedDelay); +}; + + +/** + * Execute a function when an event has been triggered for every item in a collection. + * @param {jQuery} $collection Collection of elements. + * @param {string} eventName Event to listen for. + * @param {Function} callback Callback to execute when they're done. + * @private + */ +Shuffle.prototype._whenCollectionDone = function( $collection, eventName, callback ) { + var done = 0; + var items = $collection.length; + var self = this; + + function handleEventName( evt ) { + if ( evt.target === evt.currentTarget ) { + $( evt.target ).off( eventName, handleEventName ); + done++; + + // Execute callback if all items have emitted the correct event. + if ( done === items ) { + callback.call( self ); + } + } + } + + // Bind the event to all items. + $collection.on( eventName, handleEventName ); +}; + + +/** + * Execute a callback after jQuery `animate` for a collection has finished. + * @param {Function} callback Callback to execute when they're done. + * @private + */ +Shuffle.prototype._whenAnimationsDone = function( callback ) { + $.when.apply( null, this._animations ).always( $.proxy( function() { + this._animations.length = 0; + callback.call( this ); + }, this )); +}; + + +/** + * Public Methods + */ + +/** + * The magic. This is what makes the plugin 'shuffle' + * @param {string|Function} [category] Category to filter by. Can be a function + * @param {Object} [sortObj] A sort object which can sort the filtered set + */ +Shuffle.prototype.shuffle = function( category, sortObj ) { + if ( !this.enabled || this.isTransitioning ) { + return; + } + + if ( !category ) { + category = ALL_ITEMS; + } + + this._filter( category ); + + // How many filtered elements? + this._updateItemCount(); + + // Shrink each concealed item + this._shrink(); + + // Update transforms on .filtered elements so they will animate to their new positions + this.sort( sortObj ); +}; + + +/** + * Gets the .filtered elements, sorts them, and passes them to layout. + * @param {Object} opts the options object for the sorted plugin + */ +Shuffle.prototype.sort = function( opts ) { + if ( this.enabled && !this.isTransitioning ) { + this._resetCols(); + + var sortOptions = opts || this.lastSort; + var items = this._getFilteredItems().sorted( sortOptions ); + + this._layout( items ); + + this.lastSort = sortOptions; + } +}; + + +/** + * Reposition everything. + * @param {boolean} isOnlyLayout If true, column and gutter widths won't be + * recalculated. + */ +Shuffle.prototype.update = function( isOnlyLayout ) { + if ( this.enabled && !this.isTransitioning ) { + + if ( !isOnlyLayout ) { + // Get updated colCount + this._setColumns(); + } + + // Layout items + this.sort(); + } +}; + + +/** + * Use this instead of `update()` if you don't need the columns and gutters updated + * Maybe an image inside `shuffle` loaded (and now has a height), which means calculations + * could be off. + */ +Shuffle.prototype.layout = function() { + this.update( true ); +}; + + +/** + * New items have been appended to shuffle. Fade them in sequentially + * @param {jQuery} $newItems jQuery collection of new items + * @param {boolean} [addToEnd=false] If true, new items will be added to the end / bottom + * of the items. If not true, items will be mixed in with the current sort order. + * @param {boolean} [isSequential=true] If false, new items won't sequentially fade in + */ +Shuffle.prototype.appended = function( $newItems, addToEnd, isSequential ) { + this._addItems( $newItems, addToEnd === true, isSequential !== false ); +}; + + +/** + * Disables shuffle from updating dimensions and layout on resize + */ +Shuffle.prototype.disable = function() { + this.enabled = false; +}; + + +/** + * Enables shuffle again + * @param {boolean} [isUpdateLayout=true] if undefined, shuffle will update columns and gutters + */ +Shuffle.prototype.enable = function( isUpdateLayout ) { + this.enabled = true; + if ( isUpdateLayout !== false ) { + this.update(); + } +}; + + +/** + * Remove 1 or more shuffle items + * @param {jQuery} $collection A jQuery object containing one or more element in shuffle + * @return {Shuffle} The shuffle object + */ +Shuffle.prototype.remove = function( $collection ) { + + // If this isn't a jquery object, exit + if ( !$collection.length || !$collection.jquery ) { + return; + } + + function handleRemoved() { + // Remove the collection in the callback + $collection.remove(); + + // Update things now that elements have been removed. + this.$items = this._getItems(); + this._updateItemCount(); + + this._fire( Shuffle.EventType.REMOVED, [ $collection, this ] ); + + // Let it get garbage collected + $collection = null; + } + + // Hide collection first. + this._toggleFilterClasses( $(), $collection ); + this._shrink( $collection ); + + this.sort(); + + this.$el.one( Shuffle.EventType.LAYOUT + '.' + SHUFFLE, $.proxy( handleRemoved, this ) ); +}; + + +/** + * Destroys shuffle, removes events, styles, and classes + */ +Shuffle.prototype.destroy = function() { + // If there is more than one shuffle instance on the page, + // removing the resize handler from the window would remove them + // all. This is why a unique value is needed. + $window.off('.' + this.unique); + + // Reset container styles + this.$el + .removeClass( SHUFFLE ) + .removeAttr('style') + .removeData( SHUFFLE ); + + // Reset individual item styles + this.$items + .removeAttr('style') + .removeData('point') + .removeData('scale') + .removeClass([ + Shuffle.ClassName.CONCEALED, + Shuffle.ClassName.FILTERED, + Shuffle.ClassName.SHUFFLE_ITEM + ].join(' ')); + + // Null DOM references + this.$items = null; + this.$el = null; + this.sizer = null; + this.element = null; + + // Set a flag so if a debounced resize has been triggered, + // it can first check if it is actually destroyed and not doing anything + this.destroyed = true; +}; + + +// Plugin definition +$.fn.shuffle = function( opts ) { + var args = Array.prototype.slice.call( arguments, 1 ); + return this.each(function() { + var $this = $( this ); + var shuffle = $this.data( SHUFFLE ); + + // If we don't have a stored shuffle, make a new one and save it + if ( !shuffle ) { + shuffle = new Shuffle( this, opts ); + $this.data( SHUFFLE, shuffle ); + } else if ( typeof opts === 'string' && shuffle[ opts ] ) { + shuffle[ opts ].apply( shuffle, args ); + } + }); +}; + + +// http://stackoverflow.com/a/962890/373422 +function randomize( array ) { + var tmp, current; + var top = array.length; + + if ( !top ) { + return array; + } + + while ( --top ) { + current = Math.floor( Math.random() * (top + 1) ); + tmp = array[ current ]; + array[ current ] = array[ top ]; + array[ top ] = tmp; + } + + return array; +} + + +// You can return `undefined` from the `by` function to revert to DOM order +// This plugin does NOT return a jQuery object. It returns a plain array because +// jQuery sorts everything in DOM order. +$.fn.sorted = function(options) { + var opts = $.extend({}, $.fn.sorted.defaults, options); + var arr = this.get(); + var revert = false; + + if ( !arr.length ) { + return []; + } + + if ( opts.randomize ) { + return randomize( arr ); + } + + // Sort the elements by the opts.by function. + // If we don't have opts.by, default to DOM order + if ( $.isFunction( opts.by ) ) { + arr.sort(function(a, b) { + + // Exit early if we already know we want to revert + if ( revert ) { + return 0; + } + + var valA = opts.by($(a)); + var valB = opts.by($(b)); + + // If both values are undefined, use the DOM order + if ( valA === undefined && valB === undefined ) { + revert = true; + return 0; + } + + if ( valA < valB || valA === 'sortFirst' || valB === 'sortLast' ) { + return -1; + } + + if ( valA > valB || valA === 'sortLast' || valB === 'sortFirst' ) { + return 1; + } + + return 0; + }); + } + + // Revert to the original array if necessary + if ( revert ) { + return this.get(); + } + + if ( opts.reverse ) { + arr.reverse(); + } + + return arr; +}; + + +$.fn.sorted.defaults = { + reverse: false, // Use array.reverse() to reverse the results + by: null, // Sorting function + randomize: false // If true, this will skip the sorting and return a randomized order in the array +}; + +return Shuffle; + +}); \ No newline at end of file diff --git a/js/respond.min.js b/js/respond.min.js new file mode 100644 index 0000000..80a7b69 --- /dev/null +++ b/js/respond.min.js @@ -0,0 +1,5 @@ +/*! Respond.js v1.4.2: min/max-width media query polyfill * Copyright 2013 Scott Jehl + * Licensed under https://github.com/scottjehl/Respond/blob/master/LICENSE-MIT + * */ + +!function(a){"use strict";a.matchMedia=a.matchMedia||function(a){var b,c=a.documentElement,d=c.firstElementChild||c.firstChild,e=a.createElement("body"),f=a.createElement("div");return f.id="mq-test-1",f.style.cssText="position:absolute;top:-100em",e.style.background="none",e.appendChild(f),function(a){return f.innerHTML='­',c.insertBefore(e,d),b=42===f.offsetWidth,c.removeChild(e),{matches:b,media:a}}}(a.document)}(this),function(a){"use strict";function b(){u(!0)}var c={};a.respond=c,c.update=function(){};var d=[],e=function(){var b=!1;try{b=new a.XMLHttpRequest}catch(c){b=new a.ActiveXObject("Microsoft.XMLHTTP")}return function(){return b}}(),f=function(a,b){var c=e();c&&(c.open("GET",a,!0),c.onreadystatechange=function(){4!==c.readyState||200!==c.status&&304!==c.status||b(c.responseText)},4!==c.readyState&&c.send(null))};if(c.ajax=f,c.queue=d,c.regex={media:/@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi,keyframes:/@(?:\-(?:o|moz|webkit)\-)?keyframes[^\{]+\{(?:[^\{\}]*\{[^\}\{]*\})+[^\}]*\}/gi,urls:/(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,findStyles:/@media *([^\{]+)\{([\S\s]+?)$/,only:/(only\s+)?([a-zA-Z]+)\s?/,minw:/\([\s]*min\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/,maxw:/\([\s]*max\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/},c.mediaQueriesSupported=a.matchMedia&&null!==a.matchMedia("only all")&&a.matchMedia("only all").matches,!c.mediaQueriesSupported){var g,h,i,j=a.document,k=j.documentElement,l=[],m=[],n=[],o={},p=30,q=j.getElementsByTagName("head")[0]||k,r=j.getElementsByTagName("base")[0],s=q.getElementsByTagName("link"),t=function(){var a,b=j.createElement("div"),c=j.body,d=k.style.fontSize,e=c&&c.style.fontSize,f=!1;return b.style.cssText="position:absolute;font-size:1em;width:1em",c||(c=f=j.createElement("body"),c.style.background="none"),k.style.fontSize="100%",c.style.fontSize="100%",c.appendChild(b),f&&k.insertBefore(c,k.firstChild),a=b.offsetWidth,f?k.removeChild(c):c.removeChild(b),k.style.fontSize=d,e&&(c.style.fontSize=e),a=i=parseFloat(a)},u=function(b){var c="clientWidth",d=k[c],e="CSS1Compat"===j.compatMode&&d||j.body[c]||d,f={},o=s[s.length-1],r=(new Date).getTime();if(b&&g&&p>r-g)return a.clearTimeout(h),h=a.setTimeout(u,p),void 0;g=r;for(var v in l)if(l.hasOwnProperty(v)){var w=l[v],x=w.minw,y=w.maxw,z=null===x,A=null===y,B="em";x&&(x=parseFloat(x)*(x.indexOf(B)>-1?i||t():1)),y&&(y=parseFloat(y)*(y.indexOf(B)>-1?i||t():1)),w.hasquery&&(z&&A||!(z||e>=x)||!(A||y>=e))||(f[w.media]||(f[w.media]=[]),f[w.media].push(m[w.rules]))}for(var C in n)n.hasOwnProperty(C)&&n[C]&&n[C].parentNode===q&&q.removeChild(n[C]);n.length=0;for(var D in f)if(f.hasOwnProperty(D)){var E=j.createElement("style"),F=f[D].join("\n");E.type="text/css",E.media=D,q.insertBefore(E,o.nextSibling),E.styleSheet?E.styleSheet.cssText=F:E.appendChild(j.createTextNode(F)),n.push(E)}},v=function(a,b,d){var e=a.replace(c.regex.keyframes,"").match(c.regex.media),f=e&&e.length||0;b=b.substring(0,b.lastIndexOf("/"));var g=function(a){return a.replace(c.regex.urls,"$1"+b+"$2$3")},h=!f&&d;b.length&&(b+="/"),h&&(f=1);for(var i=0;f>i;i++){var j,k,n,o;h?(j=d,m.push(g(a))):(j=e[i].match(c.regex.findStyles)&&RegExp.$1,m.push(RegExp.$2&&g(RegExp.$2))),n=j.split(","),o=n.length;for(var p=0;o>p;p++)k=n[p],l.push({media:k.split("(")[0].match(c.regex.only)&&RegExp.$2||"all",rules:m.length-1,hasquery:k.indexOf("(")>-1,minw:k.match(c.regex.minw)&&parseFloat(RegExp.$1)+(RegExp.$2||""),maxw:k.match(c.regex.maxw)&&parseFloat(RegExp.$1)+(RegExp.$2||"")})}u()},w=function(){if(d.length){var b=d.shift();f(b.href,function(c){v(c,b.href,b.media),o[b.href]=!0,a.setTimeout(function(){w()},0)})}},x=function(){for(var b=0;b"; + headers.on('click', function() { + if (!settings.noBackToTopLinks) { + window.location.hash = this.id; + } + }) + .addClass('clickable-header') + .each(function(_, header) { + this_level = get_level(header); + if (!settings.noBackToTopLinks && this_level === highest_level) { + $(header).addClass('top-level-header').after(return_to_top); + } + if (this_level === level) // same level as before; same indenting + html += "
  • " + header.innerHTML + ""; + else if (this_level <= level){ // higher level than before; end parent ol + for(i = this_level; i < level; i++) { + html += "
  • " + } + html += "
  • " + header.innerHTML + ""; + } + else if (this_level > level) { // lower level than before; expand the previous to contain a ol + for(i = this_level; i > level; i--) { + html += "<"+settings.listType+">
  • " + } + html += "" + header.innerHTML + ""; + } + level = this_level; // update for the next one + }); + html += ""; + if (!settings.noBackToTopLinks) { + $(document).on('click', '.back-to-top', function() { + $(window).scrollTop(0); + window.location.hash = ''; + }); + } + + render[settings.showEffect](); + }; +})(jQuery); \ No newline at end of file diff --git a/licenses/LICENSE b/licenses/LICENSE new file mode 100644 index 0000000..e04b3d0 --- /dev/null +++ b/licenses/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 Tom Johnson + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/licenses/LICENSE-BSD-NAVGOCO.txt b/licenses/LICENSE-BSD-NAVGOCO.txt new file mode 100644 index 0000000..7fdefc3 --- /dev/null +++ b/licenses/LICENSE-BSD-NAVGOCO.txt @@ -0,0 +1,27 @@ +/* This license pertains to the Navgoco jQuery component used for the sidebar. */ + +Copyright (c) 2013, Christodoulos Tsoulloftas, http://www.komposta.net +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of the nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/merlin5/cluster-introduction.html b/merlin5/cluster-introduction.html new file mode 100644 index 0000000..0771083 --- /dev/null +++ b/merlin5/cluster-introduction.html @@ -0,0 +1,805 @@ + + + + + + + + +Cluster 'merlin5' | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Cluster 'merlin5'

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    Slurm ‘merlin5’ cluster

    + +

    Merlin5 was the old official PSI Local HPC cluster for development and +mission-critical applications which was built in 2016-2017. It was an +extension of the Merlin4 cluster and built from existing hardware due +to a lack of central investment on Local HPC Resources. Merlin5 was +then replaced by the Merlin6 cluster in 2019, +with an important central investment of ~1,5M CHF. Merlin5 was mostly +based on CPU resources, but also contained a small amount of GPU-based +resources which were mostly used by the BIO experiments.

    + +

    Merlin5 has been kept as a Local HPC Slurm cluster, +called merlin5. In that way, the old CPU computing nodes are still available as extra computation resources, +and as an extension of the official production merlin6 Slurm cluster.

    + +

    The old Merlin5 login nodes, GPU nodes and storage were fully migrated to the Merlin6 +cluster, which becomes the main Local HPC Cluster. Hence, Merlin6 +contains the storage which is mounted on the different Merlin HPC Slurm Clusters (merlin5, merlin6, gmerlin6).

    + +

    Submitting jobs to ‘merlin5’

    + +

    To submit jobs to the merlin5 Slurm cluster, it must be done from the Merlin6 login nodes by using +the option --clusters=merlin5 on any of the Slurm commands (sbatch, salloc, srun, etc. commands).

    + +

    The Merlin Architecture

    + +

    Multi Non-Federated Cluster Architecture Design: The Merlin cluster

    + +

    The following image shows the Slurm architecture design for Merlin cluster. +It contains a multi non-federated cluster setup, with a central Slurm database +and multiple independent clusters (merlin5, merlin6, gmerlin6):

    + +

    Merlin6 Slurm Architecture Design

    + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin5/hardware-and-software.html b/merlin5/hardware-and-software.html new file mode 100644 index 0000000..7bf1971 --- /dev/null +++ b/merlin5/hardware-and-software.html @@ -0,0 +1,865 @@ + + + + + + + + +Hardware And Software Description | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Hardware And Software Description

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    Hardware

    + +

    Computing Nodes

    + +

    Merlin5 is built from recycled nodes, and hardware will be decomissioned as soon as it fails (due to expired warranty and age of the cluster).

    +
      +
    • Merlin5 is based on the HPE c7000 Enclosure solution, with 16 x HPE ProLiant BL460c Gen8 nodes per chassis.
    • +
    • Connectivity is based on Infiniband ConnectX-3 QDR-40Gbps +
        +
      • 16 internal ports for intra chassis communication
      • +
      • 2 connected external ports for inter chassis communication and storage access.
      • +
      +
    • +
    + +

    The below table summarizes the hardware setup for the Merlin5 computing nodes:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Merlin5 CPU Computing Nodes
    ChassisNodeProcessorSocketsCoresThreadsScratchMemory
    #0merlin-c-[18-30]Intel Xeon E5-2670216150GB64GB
    merlin-c-[31,32]128GB
    #1merlin-c-[33-45]Intel Xeon E5-2670216150GB64GB
    merlin-c-[46,47]128GB
    + +

    Login Nodes

    + +

    The login nodes are part of the Merlin6 HPC cluster, +and are used to compile and to submit jobs to the different Merlin Slurm clusters (merlin5,merlin6,gmerlin6,etc.). +Please refer to the Merlin6 Hardware Documentation for further information.

    + +

    Storage

    + +

    The storage is part of the Merlin6 HPC cluster, +and is mounted in all the Slurm clusters (merlin5,merlin6,gmerlin6,etc.). +Please refer to the Merlin6 Hardware Documentation for further information.

    + +

    Network

    + +

    Merlin5 cluster connectivity is based on the Infiniband QDR technology. +This allows fast access with very low latencies to the data as well as running extremely efficient MPI-based jobs. +However, this is an old version of Infiniband which requires older drivers and software can not take advantage of the latest features.

    + +

    Software

    + +

    In Merlin5, we try to keep software stack coherency with the main cluster Merlin6.

    + +

    Due to this, Merlin5 runs:

    + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin5/slurm-configuration.html b/merlin5/slurm-configuration.html new file mode 100644 index 0000000..43e3284 --- /dev/null +++ b/merlin5/slurm-configuration.html @@ -0,0 +1,985 @@ + + + + + + + + +Slurm Configuration | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Slurm Configuration

    +
    + + + +
    + + +
    This document describes a summary of the Merlin5 Slurm configuration.
    + + + + + + + +
    + + + + + + +

    This documentation shows basic Slurm configuration and options needed to run jobs in the Merlin5 cluster.

    + +

    The Merlin5 cluster is an old cluster with old hardware which is maintained in a best effort for increasing the CPU power of the Merlin cluster.

    + +

    Merlin5 CPU nodes definition

    + +

    The following table show default and maximum resources that can be used per node:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NodesDef.#CPUsMax.#CPUs#ThreadsMax.Mem/NodeMax.Swap
    merlin-c-[18-30]1 core16 cores16000010000
    merlin-c-[31-32]1 core16 cores112400010000
    merlin-c-[33-45]1 core16 cores16000010000
    merlin-c-[46-47]1 core16 cores112400010000
    + +

    There is one main difference between the Merlin5 and Merlin6 clusters: Merlin5 is keeping an old configuration which does not +consider the memory as a consumable resource. Hence, users can oversubscribe memory. This might trigger some side-effects, but +this legacy configuration has been kept to ensure that old jobs can keep running in the same way they did a few years ago. +If you know that this might be a problem for you, please, always use Merlin6 instead.

    + +

    Running jobs in the ‘merlin5’ cluster

    + +

    In this chapter we will cover basic settings that users need to specify in order to run jobs in the Merlin5 CPU cluster.

    + +

    Merlin5 CPU cluster

    + +

    To run jobs in the merlin5 cluster users must specify the cluster name in Slurm:

    + +
    #SBATCH --cluster=merlin5
    +
    + +

    Merlin5 CPU partitions

    + +

    Users might need to specify the Slurm partition. If no partition is specified, it will default to merlin:

    + +
    #SBATCH --partition=<partition_name> # Possible <partition_name> values: merlin, merlin-long:
    +
    + +

    The table below resumes shows all possible partitions available to users:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    CPU PartitionDefault TimeMax TimeMax NodesPriorityJobFactor*PriorityTier**
    merlin5 days1 weekAll nodes5001
    merlin-long5 days21 days411
    + +

    *The PriorityJobFactor value will be added to the job priority (PARTITION column in sprio -l ). In other words, jobs sent to higher priority +partitions will usually run first (however, other factors such like job age or mainly fair share might affect to that decision). For the GPU +partitions, Slurm will also attempt first to allocate jobs on partitions with higher priority over partitions with lesser priority.

    + +

    **Jobs submitted to a partition with a higher PriorityTier value will be dispatched before pending jobs in partition with lower PriorityTier value +and, if possible, they will preempt running jobs from partitions with lower PriorityTier values.

    + +

    The merlin-long partition is limited to 4 nodes, as it might contain jobs running for up to 21 days.

    + +

    Merlin5 CPU Accounts

    + +

    Users need to ensure that the public merlin account is specified. No specifying account options would default to this account. +This is mostly needed by users which have multiple Slurm accounts, which may define by mistake a different account.

    + +
    #SBATCH --account=merlin  # Possible values: merlin
    +
    + +

    Slurm CPU specific options

    + +

    Some options are available when using CPUs. These are detailed here.

    + +

    Alternative Slurm options for CPU based jobs are available. Please refer to the man pages +for each Slurm command for further information about it (man salloc, man sbatch, man srun). +Below are listed the most common settings:

    + +
    #SBATCH --ntasks=<ntasks>
    +#SBATCH --ntasks-per-core=<ntasks>
    +#SBATCH --ntasks-per-socket=<ntasks>
    +#SBATCH --ntasks-per-node=<ntasks>
    +#SBATCH --mem=<size[units]>
    +#SBATCH --mem-per-cpu=<size[units]>
    +#SBATCH --cpus-per-task=<ncpus>
    +#SBATCH --cpu-bind=[{quiet,verbose},]<type>  # only for 'srun' command
    +
    + +

    Notice that in Merlin5 no hyper-threading is available (while in Merlin6 it is). +Hence, in Merlin5 there is not need to specify --hint hyper-threading related options.

    + +

    User and job limits

    + +

    In the CPU cluster we provide some limits which basically apply to jobs and users. The idea behind this is to ensure a fair usage of the resources and to +avoid overabuse of the resources from a single user or job. However, applying limits might affect the overall usage efficiency of the cluster (in example, +pending jobs from a single user while having many idle nodes due to low overall activity is something that can be seen when user limits are applied). +In the same way, these limits can be also used to improve the efficiency of the cluster (in example, without any job size limits, a job requesting all +resources from the batch system would drain the entire cluster for fitting the job, which is undesirable).

    + +

    Hence, there is a need of setting up wise limits and to ensure that there is a fair usage of the resources, by trying to optimize the overall efficiency +of the cluster while allowing jobs of different nature and sizes (it is, single core based vs parallel jobs of different sizes) to run.

    + +

    In the merlin5 cluster, as not many users are running on it, these limits are wider than the ones set in the merlin6 and gmerlin6 clusters.

    + +

    Per job limits

    + +

    These are limits which apply to a single job. In other words, there is a maximum of resources a single job can use. These limits are described in the table below, +with the format SlurmQoS(limits) (SlurmQoS can be listed from the sacctmgr show qos command):

    + + + + + + + + + + + + + + + + + + + + + +
    PartitionMon-Sun 0h-24hOther limits
    merlinmerlin5(cpu=384)None
    merlin-longmerlin5(cpu=384)Max. 4 nodes
    + +

    By default, by QoS limits, a job can not use more than 384 cores (max CPU per job). +However, for the merlin-long, this is even more restricted: there is an extra limit of 4 dedicated nodes for this partion. This is defined +at the partition level, and will overwrite any QoS limit as long as this is more restrictive.

    + +

    Per user limits for CPU partitions

    + +

    No user limits apply by QoS. For the merlin partition, a single user could fill the whole batch system with jobs (however, the restriction is at the job size, as explained above). For the merlin-limit partition, the 4 node limitation still applies.

    + +

    Advanced Slurm configuration

    + +

    Clusters at PSI use the Slurm Workload Manager as the batch system technology for managing and scheduling jobs. +Slurm has been installed in a multi-clustered configuration, allowing to integrate multiple clusters in the same batch system.

    + +

    For understanding the Slurm configuration setup in the cluster, sometimes may be useful to check the following files:

    + +
      +
    • /etc/slurm/slurm.conf - can be found in the login nodes and computing nodes.
    • +
    • /etc/slurm/gres.conf - can be found in the GPU nodes, is also propgated to login nodes and computing nodes for user read access.
    • +
    • /etc/slurm/cgroup.conf - can be found in the computing nodes, is also propagated to login nodes for user read access.
    • +
    + +

    The previous configuration files which can be found in the login nodes, correspond exclusively to the merlin6 cluster configuration files. +Configuration files for the old merlin5 cluster or for the gmerlin6 cluster must be checked directly on any of the merlin5 or gmerlin6 computing nodes (in example, by login in to one of the nodes while a job or an active allocation is running).

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin6.html b/merlin6.html new file mode 100644 index 0000000..4b2ef60 --- /dev/null +++ b/merlin6.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

    Redirecting…

    + Click here if you are not redirected. + diff --git a/merlin6/ansys-cfx.html b/merlin6/ansys-cfx.html new file mode 100644 index 0000000..24161d8 --- /dev/null +++ b/merlin6/ansys-cfx.html @@ -0,0 +1,903 @@ + + + + + + + + +ANSYS / CFX | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    ANSYS / CFX

    +
    + + + +
    + + +
    This document describes how to run ANSYS/CFX in the Merlin6 cluster
    + + + + + + + +
    + + + + + + +

    This document describes the different ways for running ANSYS/CFX

    + +

    ANSYS/CFX

    + +

    Is always recommended to check which parameters are available in CFX and adapt the below examples according to your needs. +For that, run cfx5solve -help for getting a list of options.

    + +

    Running CFX jobs

    + +

    PModules

    + +

    Is strongly recommended the use of the latest ANSYS software available in PModules.

    + +
    module use unstable
    +module load Pmodules/1.1.6
    +module use overlay_merlin
    +module load ANSYS/2022R1
    +
    + +

    Interactive: RSM from remote PSI Workstations

    + +

    Is possible to run CFX through RSM from remote PSI (Linux or Windows) Workstation having a local installation of ANSYS CFX and RSM client. +For that, please refer to the [ANSYS RSM](/merlin6/ansys-rsm.html) in the Merlin documentation for further information of how to setup a RSM client for submitting jobs to Merlin.

    + +

    Non-interactive: sbatch

    + +

    Running jobs with sbatch is always the recommended method. This makes the use of the resources more efficient. Notice that for +running non interactive Mechanical APDL jobs one must specify the -batch option.

    + +

    Serial example

    + +

    This example shows a very basic serial job.

    + +
    #!/bin/bash
    +#SBATCH --job-name=CFX       # Job Name
    +#SBATCH --partition=hourly   # Using 'daily' will grant higher priority than 'general'
    +#SBATCH --time=0-01:00:00    # Time needed for running the job. Must match with 'partition' limits.
    +#SBATCH --cpus-per-task=1    # Double if hyperthreading enabled
    +#SBATCH --ntasks-per-core=1  # Double if hyperthreading enabled
    +#SBATCH --hint=nomultithread # Disable Hyperthreading
    +#SBATCH --error=slurm-%j.err # Define your error file
    +
    +module use unstable
    +module load ANSYS/2020R1-1
    +
    +# [Optional:BEGIN] Specify your license server if this is not 'lic-ansys.psi.ch'
    +LICENSE_SERVER=<your_license_server>
    +export ANSYSLMD_LICENSE_FILE=1055@$LICENSE_SERVER
    +export ANSYSLI_SERVERS=2325@$LICENSE_SERVER
    +# [Optional:END]
    +
    +SOLVER_FILE=/data/user/caubet_m/CFX5/mysolver.in
    +cfx5solve -batch -def "$JOURNAL_FILE" 
    +
    + +

    One can enable hypertheading by defining --hint=multithread, --cpus-per-task=2 and --ntasks-per-core=2. +However, this is in general not recommended, unless one can ensure that can be beneficial.

    + +

    MPI-based example

    + +

    An example for running CFX using a Slurm batch script is the following:

    + +
    #!/bin/bash
    +#SBATCH --job-name=CFX       # Job Name
    +#SBATCH --partition=hourly   # Using 'daily' will grant higher priority than 'general'
    +#SBATCH --time=0-01:00:00    # Time needed for running the job. Must match with 'partition' limits.
    +#SBATCH --nodes=1            # Number of nodes
    +#SBATCH --ntasks=44          # Number of tasks
    +#SBATCH --cpus-per-task=1    # Double if hyperthreading enabled
    +#SBATCH --ntasks-per-core=1  # Double if hyperthreading enabled
    +#SBATCH --hint=nomultithread # Disable Hyperthreading
    +#SBATCH --error=slurm-%j.err # Define a file for standard error messages
    +##SBATCH --exclusive         # Uncomment if you want exclusive usage of the nodes
    +
    +module use unstable
    +module load ANSYS/2020R1-1
    +
    +# [Optional:BEGIN] Specify your license server if this is not 'lic-ansys.psi.ch'
    +LICENSE_SERVER=<your_license_server>
    +export ANSYSLMD_LICENSE_FILE=1055@$LICENSE_SERVER
    +export ANSYSLI_SERVERS=2325@$LICENSE_SERVER
    +# [Optional:END]
    +
    +export HOSTLIST=$(scontrol show hostname | tr '\n' ',' | sed 's/,$//g')
    +
    +JOURNAL_FILE=myjournal.in
    +
    +# INTELMPI=no  for IBM MPI
    +# INTELMPI=yes for INTEL MPI
    +INTELMPI=no
    +
    +if [ "$INTELMPI" == "yes" ]
    +then
    +  export I_MPI_DEBUG=4
    +  export I_MPI_PIN_CELL=core
    +  
    +  # Simple example: cfx5solve -batch -def "$JOURNAL_FILE" -par-dist "$HOSTLIST" \ 
    +  #                           -part $SLURM_NTASKS \ 
    +  #                           -start-method 'Intel MPI Distributed Parallel'
    +  cfx5solve -batch -part-large -double -verbose -def "$JOURNAL_FILE" -par-dist "$HOSTLIST" \ 
    +            -part $SLURM_NTASKS -par-local -start-method 'Intel MPI Distributed Parallel'
    +else
    +  # Simple example: cfx5solve -batch -def "$JOURNAL_FILE" -par-dist "$HOSTLIST" \ 
    +  #                           -part $SLURM_NTASKS \ 
    +  #                           -start-method 'IBM MPI Distributed Parallel'
    +  cfx5solve -batch -part-large -double -verbose -def "$JOURNAL_FILE" -par-dist "$HOSTLIST" \ 
    +            -part $SLURM_NTASKS -par-local -start-method 'IBM MPI Distributed Parallel'
    +fi
    +
    + +

    In the above example, one can increase the number of nodes and/or ntasks if needed and combine it +with --exclusive whenever needed. In general, no hypertheading is recommended for MPI based jobs. +Also, one can combine it with --exclusive when necessary. Finally, one can change the MPI technology in -start-method +(check CFX documentation for possible values).

    + +

    CFX5 Launcher: CFD-Pre/Post, Solve Manager, TurboGrid

    + +

    Some users might need to visualize or change some parameters when running calculations with the CFX Solver. For running +TurboGrid, CFX-Pre, CFX-Solver Manager or CFD-Post one should run it with the cfx5 launcher binary:

    + +
    cfx5
    +
    + +

    CFX5 Launcher Example

    + +

    Then, from the launcher, one can open the proper application (i.e. CFX-Solver Manager for visualizing and modifying an +existing job run)

    + +

    For running CFX5 Launcher, is required a proper SSH + X11 Forwarding access (ssh -XY) or preferrible NoMachine. +If ssh does not work for you, please use NoMachine instead (which is the supported X based access, and simpler).

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin6/ansys-fluent.html b/merlin6/ansys-fluent.html new file mode 100644 index 0000000..b1c0e95 --- /dev/null +++ b/merlin6/ansys-fluent.html @@ -0,0 +1,924 @@ + + + + + + + + +ANSYS / Fluent | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    ANSYS / Fluent

    +
    + + + +
    + + +
    This document describes how to run ANSYS/Fluent in the Merlin6 cluster
    + + + + + + + +
    + + + + + + +

    This document describes the different ways for running ANSYS/Fluent

    + +

    ANSYS/Fluent

    + +

    Is always recommended to check which parameters are available in Fluent and adapt the below example according to your needs. +For that, run fluent -help for getting a list of options. However, as when running Fluent one must specify one of the +following flags:

    +
      +
    • 2d: This is a 2D solver with single point precision.
    • +
    • 3d: This is a 3D solver with single point precision.
    • +
    • 2dpp: This is a 2D solver with double point precision.
    • +
    • 3dpp: This is a 3D solver with double point precision.
    • +
    + +

    Running Fluent jobs

    + +

    PModules

    + +

    Is strongly recommended the use of the latest ANSYS software available in PModules.

    + +
    module use unstable
    +module load Pmodules/1.1.6
    +module use overlay_merlin
    +module load ANSYS/2022R1
    +
    + +

    Interactive: RSM from remote PSI Workstations

    + +

    Is possible to run Fluent through RSM from remote PSI (Linux or Windows) Workstation having a local installation of ANSYS Fluent and RSM client. +For that, please refer to the [ANSYS RSM](/merlin6/ansys-rsm.html) in the Merlin documentation for further information of how to setup a RSM client for submitting jobs to Merlin.

    + +

    Non-interactive: sbatch

    + +

    Running jobs with sbatch is always the recommended method. This makes the use of the resources more efficient. +For running it as a job, one needs to run in no graphical mode (-g option).

    + +

    Serial example

    + +

    This example shows a very basic serial job.

    + +
    #!/bin/bash
    +#SBATCH --job-name=Fluent    # Job Name
    +#SBATCH --partition=hourly   # Using 'daily' will grant higher priority than 'general'
    +#SBATCH --time=0-01:00:00    # Time needed for running the job. Must match with 'partition' limits.
    +#SBATCH --cpus-per-task=1    # Double if hyperthreading enabled
    +#SBATCH --hint=nomultithread # Disable Hyperthreading
    +#SBATCH --error=slurm-%j.err # Define your error file
    +
    +module use unstable
    +module load ANSYS/2020R1-1
    +
    +# [Optional:BEGIN] Specify your license server if this is not 'lic-ansys.psi.ch'
    +LICENSE_SERVER=<your_license_server>
    +export ANSYSLMD_LICENSE_FILE=1055@$LICENSE_SERVER
    +export ANSYSLI_SERVERS=2325@$LICENSE_SERVER
    +# [Optional:END]
    +
    +JOURNAL_FILE=/data/user/caubet_m/Fluent/myjournal.in
    +fluent 3ddp -g -i ${JOURNAL_FILE}
    +
    + +

    One can enable hypertheading by defining --hint=multithread, --cpus-per-task=2 and --ntasks-per-core=2. +However, this is in general not recommended, unless one can ensure that can be beneficial.

    + +

    MPI-based example

    + +

    An example for running Fluent using a Slurm batch script is the following:

    + +
    #!/bin/bash
    +#SBATCH --job-name=Fluent    # Job Name
    +#SBATCH --partition=hourly   # Using 'daily' will grant higher priority than 'general'
    +#SBATCH --time=0-01:00:00    # Time needed for running the job. Must match with 'partition' limits.
    +#SBATCH --nodes=1            # Number of nodes
    +#SBATCH --ntasks=44          # Number of tasks
    +#SBATCH --cpus-per-task=1    # Double if hyperthreading enabled
    +#SBATCH --ntasks-per-core=1  # Run one task per core
    +#SBATCH --hint=nomultithread # Disable Hyperthreading
    +#SBATCH --error=slurm-%j.err # Define a file for standard error messages
    +##SBATCH --exclusive         # Uncomment if you want exclusive usage of the nodes
    +
    +module use unstable
    +module load ANSYS/2020R1-1
    +
    +# [Optional:BEGIN] Specify your license server if this is not 'lic-ansys.psi.ch'
    +LICENSE_SERVER=<your_license_server>
    +export ANSYSLMD_LICENSE_FILE=1055@$LICENSE_SERVER
    +export ANSYSLI_SERVERS=2325@$LICENSE_SERVER
    +# [Optional:END]
    +
    +JOURNAL_FILE=/data/user/caubet_m/Fluent/myjournal.in
    +fluent 3ddp -g -t ${SLURM_NTASKS} -i ${JOURNAL_FILE}
    +
    + +

    In the above example, one can increase the number of nodes and/or ntasks if needed. One can remove +--nodes for running on multiple nodes, but may lead to communication overhead. In general, no +hyperthreading is recommended for MPI based jobs. Also, one can combine it with --exclusive when necessary.

    + +

    Interactive: salloc

    + +

    Running Fluent interactively is strongly not recommended and one should whenever possible use sbatch. +However, sometimes interactive runs are needed. For jobs requiring only few CPUs (in example, 2 CPUs) and for a short period of time, one can use the login nodes. +Otherwise, one must use the Slurm batch system using allocations:

    +
      +
    • For short jobs requiring more CPUs, one can use the Merlin shortest partitions (hourly).
    • +
    • For longer jobs, one can use longer partitions, however, interactive access is not always possible (depending on the usage of the cluster).
    • +
    + +

    Please refer to the documentation Running Interactive Jobs for firther information about different ways for running interactive +jobs in the Merlin6 cluster.

    + +

    Requirements

    + +

    SSH Keys

    + +

    Running Fluent interactively requires the use of SSH Keys. This is the way of communication between the GUI and the different nodes. For doing that, one must have +a passphrase protected SSH Key. If the user does not have SSH Keys yet (simply run ls $HOME/.ssh/ to check whether id_rsa files exist or not). For +deploying SSH Keys for running Fluent interactively, one should follow this documentation: Configuring SSH Keys

    + +

    List of hosts

    + +

    For running Fluent using Slurm computing nodes, one needs to get the list of the reserved nodes. For getting that list, once you have the allocation, one can run +the following command:

    + +
    scontrol show hostname
    +
    + +

    This list must be included in the settings as the list of hosts where to run Fluent. Alternatively, one can give that list as parameter (-cnf option) when running fluent, +as follows:

    + +
    +[Running Fluent with 'salloc' example] +
    +(base) [caubet_m@merlin-l-001 caubet_m]$ salloc --nodes=2 --ntasks=88 --hint=nomultithread --time=0-01:00:00 --partition=test $SHELL
    +salloc: Pending job allocation 135030174
    +salloc: job 135030174 queued and waiting for resources
    +salloc: job 135030174 has been allocated resources
    +salloc: Granted job allocation 135030174
    +
    +(base) [caubet_m@merlin-l-001 caubet_m]$ module use unstable
    +(
    +base) [caubet_m@merlin-l-001 caubet_m]$ module load ANSYS/2020R1-1
    +module load: unstable module has been loaded -- ANSYS/2020R1-1
    +
    +(base) [caubet_m@merlin-l-001 caubet_m]$ fluent 3ddp -t$SLURM_NPROCS -cnf=$(scontrol show hostname | tr '\n' ',')
    +
    +(base) [caubet_m@merlin-l-001 caubet_m]$ exit
    +exit
    +salloc: Relinquishing job allocation 135030174
    +salloc: Job allocation 135030174 has been revoked.
    +
    +
    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin6/ansys-hfss.html b/merlin6/ansys-hfss.html new file mode 100644 index 0000000..3102362 --- /dev/null +++ b/merlin6/ansys-hfss.html @@ -0,0 +1,898 @@ + + + + + + + + +ANSYS HFSS / ElectroMagnetics | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    ANSYS HFSS / ElectroMagnetics

    +
    + + + +
    + + +
    This document describes how to run ANSYS HFSS (ElectroMagnetics) in the Merlin6 cluster
    + + + + + + + +
    + + + + + + +

    This document describes the different ways for running ANSYS HFSS (ElectroMagnetics)

    + +

    ANSYS HFSS (ElectroMagnetics)

    + +

    This recipe is intended to show how to run ANSYS HFSS (ElectroMagnetics) in Slurm. +Having in mind that in general, running ANSYS HFSS means running ANSYS Electronics Desktop.

    + +

    Running HFSS / Electromagnetics jobs

    + +

    PModules

    + +

    Is necessary to run at least ANSYS software ANSYS/2022R1, which is available in PModules:

    + +
    module use unstable
    +module load Pmodules/1.1.6
    +module use overlay_merlin
    +module load ANSYS/2022R1
    +
    + +

    Remote job submission: HFSS RSM and SLURM

    + +

    Running jobs through Remote RSM or Slurm is the recommended way for running ANSYS HFSS.

    +
      +
    • HFSS RSM can be used from ANSYS HFSS installations running on Windows workstations at PSI (as long as are in the internal PSI network).
    • +
    • Slurm can be used when submitting directly from a Merlin login node (i.e. sbatch command or interactively from ANSYS Electronics Desktop)
    • +
    + +

    HFSS RSM (from remote workstations)

    + +

    Running jobs through Remote RSM is the way for running ANSYS HFSS when submitting from an ANSYS HFSS installation on a PSI Windows workstation. +A HFSS RSM service is running on each Merlin login node, and the listening port depends on the ANSYS EM version. Current support ANSYS EM RSM +release and associated listening ports are the following:

    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ANSYS versionLogin nodesListening port
    2022R1merlin-l-001 merlin-l-001 merlin-l-00132958
    2022R2merlin-l-001 merlin-l-001 merlin-l-00132959
    2023R2merlin-l-001 merlin-l-001 merlin-l-00132960
    + +

    Notice that by default ANSYS EM is listening on port 32958, this is the default for ANSYS/2022R1 only.

    +
      +
    • Workstations connecting to the Merlin ANSYS EM service must ensure that Electronics Desktop is connecting to the proper port.
    • +
    • In the same way, the ANSYS Workstation version must be the same as the version running on Merlin.
    • +
    + +

    Notice that HFSS RSM is not the same RSM provided for other ANSYS products. Therefore, the configuration is different from ANSYS RSM.

    + +

    To setup HFSS RSM for using it with the Merlin cluster, it must be done from the following ANSYS Electronics Desktop menu:

    + +
      +
    1. [Tools]->[Job Management]->[Select Scheduler]. +Select_Scheduler
    2. +
    3. In the new [Select scheduler] window, setup the following settings and Refresh: +RSM_Remote_Scheduler +
        +
      • Select Scheduler: Remote RSM.
      • +
      • Server: Add a Merlin login node.
      • +
      • User name: Add your Merlin username.
      • +
      • Password: Add you Merlin username password.
      • +
      + +

      Once refreshed, the Scheduler info box must provide Slurm information of the server (see above picture). If the box contains that information, then you can save changes (OK button).

      +
    4. +
    5. [Tools]->[Job Management]->[Submit Job…].
    6. +
    + +

    Submit_Job

    + +
      +
    1. In the new [Submite Job] window, you must specify the location of the ANSYS Electronics Desktop binary. +Product_Path +
        +
      • In example, for ANSYS/2022R1, the location is /data/software/pmodules/Tools/ANSYS/2021R1/v211/AnsysEM21.1/Linux64/ansysedt.exe:.
      • +
      +
    2. +
    + +

    HFSS Slurm (from login node only)

    + +

    Running jobs through Slurm from ANSYS Electronics Desktop is the way for running ANSYS HFSS when submitting from an ANSYS HFSS installation in a Merlin login node. ANSYS Electronics Desktop usually needs to be run from the Merlin NoMachine service, which currently runs on:

    +
      +
    • merlin-l-001.psi.ch
    • +
    • merlin-l-002.psi.ch
    • +
    + +

    Since the Slurm client is present in the login node (where ANSYS Electronics Desktop is running), the application will be able to detect and to submit directly to Slurm. Therefore, we only have to configure ANSYS Electronics Desktop to submit to Slurm. This can set as follows:

    + +
      +
    1. [Tools]->[Job Management]->[Select Scheduler]. +Select_Scheduler
    2. +
    3. In the new [Select scheduler] window, setup the following settings and Refresh: +RSM_Remote_Scheduler +
        +
      • Select Scheduler: Slurm.
      • +
      • Server: must point to localhost.
      • +
      • User name: must be empty.
      • +
      • Password: must be empty. + The Server, User name and Password boxes can’t be modified, but if value do not match with the above settings, they should be changed by selecting another Scheduler which allows editig these boxes (i.e. RSM Remote).
      • +
      + +

      Once refreshed, the Scheduler info box must provide Slurm information of the server (see above picture). If the box contains that information, then you can save changes (OK button).

      +
    4. +
    + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin6/ansys-mapdl.html b/merlin6/ansys-mapdl.html new file mode 100644 index 0000000..28579d9 --- /dev/null +++ b/merlin6/ansys-mapdl.html @@ -0,0 +1,921 @@ + + + + + + + + +ANSYS / MAPDL | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    ANSYS / MAPDL

    +
    + + + +
    + + +
    This document describes how to run ANSYS/Mechanical APDL in the Merlin6 cluster
    + + + + + + + +
    + + + + + + +

    This document describes the different ways for running ANSYS/Mechanical APDL

    + +

    ANSYS/Mechanical APDL

    + +

    Is always recommended to check which parameters are available in Mechanical APDL and adapt the below examples according to your needs. +For that, please refer to the official Mechanical APDL documentation.

    + +

    Running Mechanical APDL jobs

    + +

    PModules

    + +

    Is strongly recommended the use of the latest ANSYS software available in PModules.

    + +
    module use unstable
    +module load Pmodules/1.1.6
    +module use overlay_merlin
    +module load ANSYS/2022R1
    +
    + +

    Interactive: RSM from remote PSI Workstations

    + +

    Is possible to run Mechanical through RSM from remote PSI (Linux or Windows) Workstation having a local installation of ANSYS Mechanical and RSM client. +For that, please refer to the [ANSYS RSM](/merlin6/ansys-rsm.html) in the Merlin documentation for further information of how to setup a RSM client for submitting jobs to Merlin.

    + +

    Non-interactive: sbatch

    + +

    Running jobs with sbatch is always the recommended method. This makes the use of the resources more efficient. Notice that for +running non interactive Mechanical APDL jobs one must specify the -b option.

    + +

    Serial example

    + +

    This example shows a very basic serial job.

    + +
    #!/bin/bash
    +#SBATCH --job-name=MAPDL     # Job Name
    +#SBATCH --partition=hourly   # Using 'daily' will grant higher priority than 'general'
    +#SBATCH --time=0-01:00:00    # Time needed for running the job. Must match with 'partition' limits.
    +#SBATCH --cpus-per-task=1    # Double if hyperthreading enabled
    +#SBATCH --ntasks-per-core=1  # Double if hyperthreading enabled
    +#SBATCH --hint=nomultithread # Disable Hyperthreading
    +#SBATCH --error=slurm-%j.err # Define your error file
    +
    +module use unstable
    +module load ANSYS/2020R1-1
    +
    +# [Optional:BEGIN] Specify your license server if this is not 'lic-ansys.psi.ch'
    +LICENSE_SERVER=<your_license_server>
    +export ANSYSLMD_LICENSE_FILE=1055@$LICENSE_SERVER
    +export ANSYSLI_SERVERS=2325@$LICENSE_SERVER
    +# [Optional:END]
    +
    +SOLVER_FILE=/data/user/caubet_m/MAPDL/mysolver.in
    +mapdl -b -i "$SOLVER_FILE"
    +
    + +

    One can enable hypertheading by defining --hint=multithread, --cpus-per-task=2 and --ntasks-per-core=2. +However, this is in general not recommended, unless one can ensure that can be beneficial.

    + +

    SMP-based example

    + +

    This example shows how to running Mechanical APDL in Shared-Memory Parallelism mode. It limits the use +to 1 single node, but by using many cores. In the example below, we use a node by using all his cores +and the whole memory.

    + +
    #!/bin/bash
    +#SBATCH --job-name=MAPDL     # Job Name
    +#SBATCH --partition=hourly   # Using 'daily' will grant higher priority than 'general'
    +#SBATCH --time=0-01:00:00    # Time needed for running the job. Must match with 'partition' limits.
    +#SBATCH --nodes=1            # Number of nodes
    +#SBATCH --ntasks=1           # Number of tasks
    +#SBATCH --cpus-per-task=44   # Double if hyperthreading enabled
    +#SBATCH --hint=nomultithread # Disable Hyperthreading
    +#SBATCH --error=slurm-%j.err # Define a file for standard error messages
    +#SBATCH --exclusive          # Uncomment if you want exclusive usage of the nodes
    +
    +module use unstable
    +module load ANSYS/2020R1-1
    +
    +# [Optional:BEGIN] Specify your license server if this is not 'lic-ansys.psi.ch'
    +LICENSE_SERVER=<your_license_server>
    +export ANSYSLMD_LICENSE_FILE=1055@$LICENSE_SERVER
    +export ANSYSLI_SERVERS=2325@$LICENSE_SERVER
    +# [Optional:END]
    +
    +SOLVER_FILE=/data/user/caubet_m/MAPDL/mysolver.in
    +mapdl -b -np ${SLURM_CPUS_PER_TASK} -i "$SOLVER_FILE"
    +
    + +

    In the above example, one can reduce the number of cpus per task. Here usually --exclusive +is recommended if one needs to use the whole memory.

    + +

    For SMP runs, one might try the hyperthreading mode by doubling the proper settings +(--cpus-per-task), in some cases it might be beneficial.

    + +

    Please notice that --ntasks-per-core=1 is not defined here, this is because we want to run 1 +task on many cores! As an alternative, one can explore --ntasks-per-socket or --ntasks-per-node +for fine grained configurations.

    + +

    MPI-based example

    + +

    This example enables Distributed ANSYS for running Mechanical APDL using a Slurm batch script.

    + +
    #!/bin/bash
    +#SBATCH --job-name=MAPDL     # Job Name
    +#SBATCH --partition=hourly   # Using 'daily' will grant higher priority than 'general'
    +#SBATCH --time=0-01:00:00    # Time needed for running the job. Must match with 'partition' limits.
    +#SBATCH --nodes=1            # Number of nodes
    +#SBATCH --ntasks=44          # Number of tasks
    +#SBATCH --cpus-per-task=1    # Double if hyperthreading enabled
    +#SBATCH --ntasks-per-core=1  # Run one task per core
    +#SBATCH --hint=nomultithread # Disable Hyperthreading
    +#SBATCH --error=slurm-%j.err # Define a file for standard error messages
    +##SBATCH --exclusive         # Uncomment if you want exclusive usage of the nodes
    +
    +module use unstable
    +module load ANSYS/2020R1-1
    +
    +# [Optional:BEGIN] Specify your license server if this is not 'lic-ansys.psi.ch'
    +LICENSE_SERVER=<your_license_server>
    +export ANSYSLMD_LICENSE_FILE=1055@$LICENSE_SERVER
    +export ANSYSLI_SERVERS=2325@$LICENSE_SERVER
    +# [Optional:END]
    +
    +SOLVER_FILE=input.dat
    +
    +# INTELMPI=no  for IBM MPI
    +# INTELMPI=yes for INTEL MPI
    +INTELMPI=no
    +
    +if [ "$INTELMPI" == "yes" ]
    +then
    +  # When using -mpi=intelmpi, KMP Affinity must be disabled
    +  export KMP_AFFINITY=disabled
    +
    +  # INTELMPI is not aware about distribution of tasks. 
    +  #   - We need to define tasks distribution.
    +  HOSTLIST=$(srun hostname | sort | uniq -c | awk '{print $2 ":" $1}' | tr '\n' ':' | sed 's/:$/\n/g')
    +  mapdl -b -dis -mpi intelmpi -machines $HOSTLIST -np ${SLURM_NTASKS} -i "$SOLVER_FILE"
    +else
    +  # IBMMPI (default) will be aware of the distribution of tasks. 
    +  #   - In principle, no need to force tasks distribution
    +  mapdl -b -dis -mpi ibmmpi -np ${SLURM_NTASKS} -i "$SOLVER_FILE"
    +fi
    +
    + +

    In the above example, one can increase the number of nodes and/or ntasks if needed and combine it +with --exclusive when necessary. In general, no hypertheading is recommended for MPI based jobs. +Also, one can combine it with --exclusive when necessary.

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin6/ansys-rsm.html b/merlin6/ansys-rsm.html new file mode 100644 index 0000000..84c04ed --- /dev/null +++ b/merlin6/ansys-rsm.html @@ -0,0 +1,889 @@ + + + + + + + + +ANSYS RSM (Remote Resolve Manager) | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    ANSYS RSM (Remote Resolve Manager)

    +
    + + + +
    + + +
    This document describes how to use the ANSYS Remote Resolve Manager service in the Merlin6 cluster
    + + + + + + + +
    + + + + + + +

    ANSYS Remote Resolve Manager

    + +

    ANSYS Remote Solve Manager (RSM) is used by ANSYS Workbench to submit computational jobs to HPC clusters directly from Workbench on your desktop. +Therefore, PSI workstations with direct access to Merlin can submit jobs by using RSM.

    + +

    Users are responsible for requesting possible necessary network access and debugging any possible connectivity problem with the cluster. +In example, in case that the workstation is behind a firewall, users would need to request a firewall rule to enable access to Merlin.

    + + + +

    The Merlin6 RSM service

    + +

    A RSM service is running on each login node. This service will listen a specific port and will process any request using RSM (in example, from ANSYS users workstations). +The following login nodes are configured with such services:

    +
      +
    • merlin-l-01.psi.ch
    • +
    • merlin-l-001.psi.ch
    • +
    • merlin-l-002.psi.ch
    • +
    + +

    Each ANSYS release installed in /data/software/pmodules/ANSYS should have its own RSM service running (the listening port is the default one set by that ANSYS release). With the following command users can check which ANSYS releases have an RSM instance running:

    + +
    systemctl | grep pli-ansys-rsm-v[0-9][0-9][0-9].service
    +
    + +
    +[Example] Listing RSM service running on merlin-l-001.psi.ch +
    +(base) ❄ [caubet_m@merlin-l-001:/data/user/caubet_m]# systemctl | grep pli-ansys-rsm-v[0-9][0-9][0-9].service
    +  pli-ansys-rsm-v195.service                         loaded active     exited    PSI ANSYS RSM v195
    +  pli-ansys-rsm-v202.service                         loaded active     exited    PSI ANSYS RSM v202
    +  pli-ansys-rsm-v211.service                         loaded active     exited    PSI ANSYS RSM v211
    +  pli-ansys-rsm-v212.service                         loaded active     exited    PSI ANSYS RSM v212
    +  pli-ansys-rsm-v221.service                         loaded active     exited    PSI ANSYS RSM v221
    +
    +
    + +

    Configuring RSM client on Windows workstations

    + +

    Users can setup ANSYS RSM in their workstations to connect to the Merlin6 cluster. +The different steps and settings required to make it work are that following:

    + +
      +
    1. Open the RSM Configuration service in Windows for the ANSYS release you want to configure.
    2. +
    3. Right-click the HPC Resources icon followed by Add HPC Resource… +Adding a new HPC Resource
    4. +
    5. In the HPC Resource tab, fill up the corresponding fields as follows: +HPC Resource +
        +
      • “Name”: Add here the preffered name for the cluster. In example: Merlin6 cluster - merlin-l-001
      • +
      • “HPC Type”: Select SLURM
      • +
      • “Submit host”: Add one of the login nodes. In example merlin-l-001.
      • +
      • “Slurm Job submission arguments (optional)”: Add any required Slurm options for running your jobs. +
          +
        • In general, --hint=nomultithread should be at least present.
        • +
        +
      • +
      • Check “Use SSH protocol for inter and intra-node communication (Linux only)”
      • +
      • Select “Able to directly submit and monitor HPC jobs”.
      • +
      • “Apply” changes.
      • +
      +
    6. +
    7. In the “File Management” tab, fill up the corresponding fields as follows: +File Management +
        +
      • Select “RSM internal file transfer mechanism” and add /shared-scratch as the “Staging directory path on Cluster”
      • +
      • Select “Scratch directory local to the execution node(s)” and add /scratch as the HPC scratch directory.
      • +
      • Never check the option “Keep job files in the staging directory when job is complete” if the previous +option “Scratch directory local to the execution node(s)” was set.
      • +
      • “Apply” changes.
      • +
      +
    8. +
    9. In the “Queues” tab, use the left button to auto-discover partitions +Queues +
        +
      • If no authentication method was configured before, an authentication window will appear. Use your +PSI account to authenticate. Notice that the PSICH\ prefix must not be added. +Authenticating
      • +
      • From the partition list, select the ones you want to typically use. +
          +
        • In general, standard Merlin users must use hourly, daily and general only.
        • +
        • Other partitions are reserved for allowed users only.
        • +
        +
      • +
      • “Apply” changes. +Select partitions
      • +
      +
    10. +
    11. [Optional] You can perform a test by submitting a test job on each partition by clicking on the Submit button +for each selected partition.
    12. +
    + + + +

    Using RSM in ANSYS

    + +

    Using the RSM service in ANSYS is slightly different depending on the ANSYS software being used. +Please follow the official ANSYS documentation for details about how to use it for that specific software.

    + +

    Alternativaly, please refer to some the examples showed in the following chapters (ANSYS specific software).

    + +

    Using RSM in ANSYS Fluent

    + +

    For further information for using RSM with Fluent, please visit the ANSYS RSM section.

    + +

    Using RSM in ANSYS CFX

    + +

    For further information for using RSM with CFX, please visit the ANSYS RSM section.

    + +

    Using RSM in ANSYS MAPDL

    + +

    For further information for using RSM with MAPDL, please visit the ANSYS RSM section.

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin6/ansys.html b/merlin6/ansys.html new file mode 100644 index 0000000..302720e --- /dev/null +++ b/merlin6/ansys.html @@ -0,0 +1,852 @@ + + + + + + + + +ANSYS | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    ANSYS

    +
    + + + +
    + + +
    This document describes how to load and use ANSYS in the Merlin6 cluster
    + + + + + + + +
    + + + + + + +

    This document describes generic information of how to load and run ANSYS software in the Merlin cluster

    + +

    ANSYS software in Pmodules

    + +

    The ANSYS software can be loaded through PModules.

    + +

    The default ANSYS versions are loaded from the central PModules repository. +However, there are some known problems that can pop up when using some specific ANSYS packages in advanced mode. +Due to this, and also to improve the interactive experience of the user, ANSYS has been also installed in the +Merlin high performance storage and we have made it available from Pmodules.

    + +

    Loading Merlin6 ANSYS

    + +

    For loading the Merlin6 ANSYS software, one needs to run Pmodules v1.1.4 or newer, and then use a specific repository +(called overlay_merlin) which is only available from the Merlin cluster:

    + +
    module load Pmodules/1.1.6
    +module use overlay_merlin
    +
    + +

    Once overlay_merlin is invoked, it will disable central ANSYS installations with the same version, which will be replaced +by the local ones in Merlin. Releases from the central Pmodules repository which have not a local installation will remain +visible. For each ANSYS release, one can identify where it is installed by searching ANSYS in PModules with the --verbose +option. This will show the location of the different ANSYS releases as follows:

    +
      +
    • For ANSYS releases installed in the central repositories, the path starts with /opt/psi
    • +
    • For ANSYS releases installed in the Merlin6 repository (and/or overwritting the central ones), the path starts with /data/software/pmodules
    • +
    + +
    +[Example] Loading ANSYS from the Merlin6 PModules repository +
    +(base) ❄ [caubet_m@merlin-l-001:/data/user/caubet_m]# module load Pmodules/1.1.6
    +module load: unstable module has been loaded -- Pmodules/1.1.6
    +
    +(base) ❄ [caubet_m@merlin-l-001:/data/user/caubet_m]# module use merlin_overlay
    +
    +(base) ❄ [caubet_m@merlin-l-001:/data/user/caubet_m]# module search ANSYS --verbose
    +
    +Module         Rel.stage  Group        Dependencies/Modulefile
    +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    +ANSYS/2019R3   stable     Tools        dependencies: 
    +                                       modulefile:   /data/software/pmodules/Tools/modulefiles/ANSYS/2019R3
    +ANSYS/2020R1   stable     Tools        dependencies: 
    +                                       modulefile:   /opt/psi/Tools/modulefiles/ANSYS/2020R1
    +ANSYS/2020R1-1 stable     Tools        dependencies: 
    +                                       modulefile:   /opt/psi/Tools/modulefiles/ANSYS/2020R1-1
    +ANSYS/2020R2   stable     Tools        dependencies: 
    +                                       modulefile:   /data/software/pmodules/Tools/modulefiles/ANSYS/2020R2
    +ANSYS/2021R1   stable     Tools        dependencies: 
    +                                       modulefile:   /data/software/pmodules/Tools/modulefiles/ANSYS/2021R1
    +ANSYS/2021R2   stable     Tools        dependencies: 
    +                                       modulefile:   /data/software/pmodules/Tools/modulefiles/ANSYS/2021R2
    +
    +
    + + + +

    ANSYS Documentation by product

    + +

    ANSYS RSM

    + +

    ANSYS Remote Solve Manager (RSM) is used by ANSYS Workbench to submit computational jobs to HPC clusters directly from Workbench on your desktop. +Therefore, PSI workstations with direct access to Merlin can submit jobs by using RSM.

    + +

    For further information, please visit the ANSYS RSM section.

    + +

    ANSYS Fluent

    + +

    For further information, please visit the ANSYS RSM section.

    + +

    ANSYS CFX

    + +

    For further information, please visit the ANSYS RSM section.

    + +

    ANSYS MAPDL

    + +

    For further information, please visit the ANSYS RSM section.

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin6/archive.html b/merlin6/archive.html new file mode 100644 index 0000000..fa16933 --- /dev/null +++ b/merlin6/archive.html @@ -0,0 +1,1161 @@ + + + + + + + + +Archive & PSI Data Catalog | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Archive & PSI Data Catalog

    +
    + + + +
    + + +
    This document describes how to use the PSI Data Catalog for archiving Merlin6 data.
    + + + + + + + +
    + + + + + + +

    PSI Data Catalog as a PSI Central Service

    + +

    PSI provides access to the Data Catalog for long-term data storage and retrieval. Data is +stored on the PetaByte Archive at the Swiss National Supercomputing Centre (CSCS).

    + +

    The Data Catalog and Archive is suitable for:

    + +
      +
    • Raw data generated by PSI instruments
    • +
    • Derived data produced by processing some inputs
    • +
    • Data required to reproduce PSI research and publications
    • +
    + +

    The Data Catalog is part of PSI’s effort to conform to the FAIR principles for data management. +In accordance with this policy, data will be publicly released under CC-BY-SA 4.0 after an +embargo period expires.

    + +

    The Merlin cluster is connected to the Data Catalog. Hence, users archive data stored in the +Merlin storage under the /data directories (currentlyi, /data/user and /data/project). +Archiving from other directories is also possible, however the process is much slower as data +can not be directly retrieved by the PSI archive central servers (central mode), and needs to +be indirectly copied to these (decentral mode).

    + +

    Archiving can be done from any node accessible by the users (usually from the login nodes).

    + + + +

    Procedure

    + +

    Overview

    + +

    Below are the main steps for using the Data Catalog.

    + +
      +
    • Ingest the dataset into the Data Catalog. This makes the data known to the Data Catalog system at PSI: +
        +
      • Prepare a metadata file describing the dataset
      • +
      • Run datasetIngestor script
      • +
      • If necessary, the script will copy the data to the PSI archive servers +
          +
        • Usually this is necessary when archiving from directories other than /data/user or +/data/project. It would be also necessary when the Merlin export server (merlin-archive.psi.ch) +is down for any reason.
        • +
        +
      • +
      +
    • +
    • Archive the dataset: +
        +
      • Visit https://discovery.psi.ch
      • +
      • Click Archive for the dataset
      • +
      • The system will now copy the data to the PetaByte Archive at CSCS
      • +
      +
    • +
    • Retrieve data from the catalog: +
        +
      • Find the dataset on https://discovery.psi.ch and click Retrieve
      • +
      • Wait for the data to be copied to the PSI retrieval system
      • +
      • Run datasetRetriever script
      • +
      +
    • +
    + +

    Since large data sets may take a lot of time to transfer, some steps are designed to happen in the +background. The discovery website can be used to track the progress of each step.

    + +

    Account Registration

    + +

    Two types of account permit access to the Data Catalog. If your data was collected at a beamline, you may +have been assigned a p-group (e.g. p12345) for the experiment. Other users are assigned a-group +(e.g. a-12345).

    + +

    Groups are usually assigned to a PI, and then individual user accounts are added to the group. This must be done +under user request through PSI Service Now. For existing a-groups and p-groups, you can follow the standard +central procedures. Alternatively, if you do not know how to do that, follow the Merlin6 +Requesting extra Unix groups procedure, or open +a PSI Service Now ticket.

    + +

    Documentation

    + +

    Accessing the Data Catalog is done through the SciCat software. +Documentation is here: ingestManual.

    + +

    Loading datacatalog tools

    + +

    The latest datacatalog software is maintained in the PSI module system. To access it from the Merlin systems, run the following command:

    + +
    module load datacatalog
    +
    + +

    It can be done from any host in the Merlin cluster accessible by users. Usually, login nodes will be the nodes used for archiving.

    + +

    Finding your token

    + +

    As of 2022-04-14 a secure token is required to interact with the data catalog. This is a long random string that replaces the previous user/password authentication (allowing access for non-PSI use cases). This string should be treated like a password and not shared.

    + +
      +
    1. Go to discovery.psi.ch
    2. +
    3. Click ‘Sign in’ in the top right corner. Click the ‘Login with PSI account’ and log in on the PSI login1. page.
    4. +
    5. You should be redirected to your user settings and see a ‘User Information’ section. If not, click on1. your username in the top right and choose ‘Settings’ from the menu.
    6. +
    7. Look for the field ‘Catamel Token’. This should be a 64-character string. Click the icon to copy the1. token.
    8. +
    + +

    SciCat website

    + +

    You will need to save this token for later steps. To avoid including it in all the commands, I suggest saving it to an environmental variable (Linux):

    + +
    $  SCICAT_TOKEN=RqYMZcqpqMJqluplbNYXLeSyJISLXfnkwlfBKuvTSdnlpKkU
    +
    + +

    (Hint: prefix this line with a space to avoid saving the token to your bash history.)

    + +

    Tokens expire after 2 weeks and will need to be fetched from the website again.

    + +

    Ingestion

    + +

    The first step to ingesting your data into the catalog is to prepare a file describing what data you have. This is called +metadata.json, and can be created with a text editor (e.g. vim). It can in principle be saved anywhere, +but keeping it with your archived data is recommended. For more information about the format, see the ‘Bio metadata’ +section below. An example follows:

    + +
    {
    +    "principalInvestigator": "albrecht.gessler@psi.ch",
    +    "creationLocation": "/PSI/EMF/JEOL2200FS",
    +    "dataFormat": "TIFF+LZW Image Stack",
    +    "sourceFolder": "/gpfs/group/LBR/pXXX/myimages",
    +    "owner": "Wilhelm Tell",
    +    "ownerEmail": "wilhelm.tell@psi.ch",
    +    "type": "raw",
    +    "description": "EM micrographs of amygdalin",
    +    "ownerGroup": "a-12345",
    +    "scientificMetadata": {
    +        "description": "EM micrographs of amygdalin",
    +        "sample": {
    +            "name": "Amygdalin beta-glucosidase 1",
    +            "uniprot": "P29259",
    +            "species": "Apple"
    +        },
    +        "dataCollection": {
    +            "date": "2018-08-01"
    +        },
    +        "microscopeParameters": {
    +            "pixel size": {
    +                "v": 0.885,
    +                "u": "A"
    +            },
    +            "voltage": {
    +                "v": 200,
    +                "u": "kV"
    +            },
    +            "dosePerFrame": {
    +                "v": 1.277,
    +                "u": "e/A2"
    +            }
    +        }
    +    }
    +}
    +
    + +

    It is recommended to use the ScicatEditor for creating metadata files. This is a browser-based tool specifically for ingesting PSI data. Using the tool avoids syntax errors and provides templates for common data sets and options. The finished JSON file can then be downloaded to merlin or copied into a text editor.

    + +

    Another option is to use the SciCat graphical interface from NoMachine. This provides a graphical interface for selecting data to archive. This is particularly useful for data associated with a DUO experiment and p-group. Type SciCat to get started after loading the datacatalog`` module. The GUI also replaces the the command-line ingestion described below.

    + +

    The following steps can be run from wherever you saved your metadata.json. First, perform a “dry-run” which will check the metadata for errors:

    + +
    datasetIngestor --token $SCICAT_TOKEN metadata.json
    +
    + +

    It will ask for your PSI credentials and then print some info about the data to be ingested. If there are no errors, proceed to the real ingestion:

    + +
    datasetIngestor --token $SCICAT_TOKEN --ingest --autoarchive metadata.json
    +
    + +

    You will be asked whether you want to copy the data to the central system:

    + +
      +
    • If you are on the Merlin cluster and you are archiving data from /data/user or /data/project, answer ‘no’ since the data catalog can +directly read the data.
    • +
    • If you are on a directory other than /data/user and ``/data/project, or you are on a desktop computer, answer ‘yes’. Copying large datasets +to the PSI archive system may take quite a while (minutes to hours).
    • +
    + +

    If there are no errors, your data has been accepted into the data catalog! From now on, no changes should be made to the ingested data. +This is important, since the next step is for the system to copy all the data to the CSCS Petabyte archive. Writing to tape is slow, so +this process may take several days, and it will fail if any modifications are detected.

    + +

    If using the --autoarchive option as suggested above, your dataset should now be in the queue. Check the data catalog: +https://discovery.psi.ch. Your job should have status ‘WorkInProgress’. You will receive an email when the ingestion +is complete.

    + +

    If you didn’t use --autoarchive, you need to manually move the dataset into the archive queue. From discovery.psi.ch, navigate to the ‘Archive’ +tab. You should see the newly ingested dataset. Check the dataset and click Archive. You should see the status change from datasetCreated to +scheduleArchiveJob. This indicates that the data is in the process of being transferred to CSCS.

    + +

    After a few days the dataset’s status will change to datasetOnAchive indicating the data is stored. At this point it is safe to delete the data.

    + +

    Useful commands

    + +

    Running the datasetIngestor in dry mode (without --ingest) finds most errors. However, it is sometimes convenient to find potential errors +yourself with simple unix commands.

    + +

    Find problematic filenames

    + +
    find . -iregex '.*/[^/]*[^a-zA-Z0-9_ ./-][^/]*'=
    +
    + +

    Find broken links

    + +
    find -L . -type l
    +
    + +

    Find outside links

    + +
    find . -type l -exec bash -c 'realpath --relative-base "`pwd`" "$0" 2>/dev/null |egrep "^[./]" |sed "s|^|$0 ->|" ' '{}' ';'
    +
    + +

    Delete certain files (use with caution)

    + +
    # Empty directories
    +find . -type d -empty -delete
    +# Backup files
    +find . -name '*~' -delete
    +find . -name '*#autosave#' -delete
    +
    + +

    Troubleshooting & Known Bugs

    + +
      +
    • +

      The following message can be safely ignored:

      + +
       key_cert_check_authority: invalid certificate
      + Certificate invalid: name is not a listed principal
      +
      +

      It indicates that no kerberos token was provided for authentication. You can avoid the warning by first running kinit (PSI linux systems).

      +
    • +
    • +

      For decentral ingestion cases, the copy step is indicated by a message Running [/usr/bin/rsync -e ssh -avxz .... It is expected that this +step will take a long time and may appear to have hung. You can check what files have been successfully transfered using rsync:

      + +
       rsync --list-only user_n@pb-archive.psi.ch:archive/UID/PATH/
      +
      + +

      where UID is the dataset ID (12345678-1234-1234-1234-123456789012) and PATH is the absolute path to your data. Note that rsync creates directories first and that the transfer order is not alphabetical in some cases, but it should be possible to see whether any data has transferred.

      +
    • +
    • +

      There is currently a limit on the number of files per dataset (technically, the limit is from the total length of all file paths). It is recommended to break up datasets into 300’000 files or less.

      +
        +
      • +

        If it is not possible or desirable to split data between multiple datasets, an alternate work-around is to package files into a tarball. For datasets which are already compressed, omit the -z option for a considerable speedup:

        + +
        tar -f [output].tar [srcdir]
        +
        + +

        Uncompressed data can be compressed on the cluster using the following command:

        + +
        sbatch /data/software/Slurm/Utilities/Parallel_TarGz.batch -s [srcdir] -t [output].tar -n
        +
        + +

        Run /data/software/Slurm/Utilities/Parallel_TarGz.batch -h for more details and options.

        +
      • +
      +
    • +
    + +

    Sample ingestion output (datasetIngestor 1.1.11)

    +
    +[Show Example]: Sample ingestion output (datasetIngestor 1.1.11) +
    +/data/project/bio/myproject/archive $ datasetIngestor -copy -autoarchive -allowexistingsource -ingest metadata.json
    +2019/11/06 11:04:43 Latest version: 1.1.11
    +
    +
    +2019/11/06 11:04:43 Your version of this program is up-to-date
    +2019/11/06 11:04:43 You are about to add a dataset to the === production === data catalog environment...
    +2019/11/06 11:04:43 Your username:
    +user_n
    +2019/11/06 11:04:48 Your password:
    +2019/11/06 11:04:52 User authenticated: XXX
    +2019/11/06 11:04:52 User is member in following a or p groups: XXX
    +2019/11/06 11:04:52 OwnerGroup information a-XXX verified successfully.
    +2019/11/06 11:04:52 contactEmail field added: XXX
    +2019/11/06 11:04:52 Scanning files in dataset /data/project/bio/myproject/archive
    +2019/11/06 11:04:52 No explicit filelistingPath defined - full folder /data/project/bio/myproject/archive is used.
    +2019/11/06 11:04:52 Source Folder: /data/project/bio/myproject/archive at /data/project/bio/myproject/archive
    +2019/11/06 11:04:57 The dataset contains 100000 files with a total size of 50000000000 bytes.
    +2019/11/06 11:04:57 creationTime field added: 2019-07-29 18:47:08 +0200 CEST
    +2019/11/06 11:04:57 endTime field added: 2019-11-06 10:52:17.256033 +0100 CET
    +2019/11/06 11:04:57 license field added: CC BY-SA 4.0
    +2019/11/06 11:04:57 isPublished field added: false
    +2019/11/06 11:04:57 classification field added: IN=medium,AV=low,CO=low
    +2019/11/06 11:04:57 Updated metadata object:
    +{
    +    "accessGroups": [
    +        "XXX"
    +    ],
    +    "classification": "IN=medium,AV=low,CO=low",
    +    "contactEmail": "XXX",
    +    "creationLocation": "XXX",
    +    "creationTime": "2019-07-29T18:47:08+02:00",
    +    "dataFormat": "XXX",
    +    "description": "XXX",
    +    "endTime": "2019-11-06T10:52:17.256033+01:00",
    +    "isPublished": false,
    +    "license": "CC BY-SA 4.0",
    +    "owner": "XXX",
    +    "ownerEmail": "XXX",
    +    "ownerGroup": "a-XXX",
    +    "principalInvestigator": "XXX",
    +    "scientificMetadata": {
    +...
    +    },
    +    "sourceFolder": "/data/project/bio/myproject/archive",
    +    "type": "raw"
    +}
    +2019/11/06 11:04:57 Running [/usr/bin/ssh -l user_n pb-archive.psi.ch test -d /data/project/bio/myproject/archive].
    +key_cert_check_authority: invalid certificate
    +Certificate invalid: name is not a listed principal
    +user_n@pb-archive.psi.ch's password:
    +2019/11/06 11:05:04 The source folder /data/project/bio/myproject/archive is not centrally available (decentral use case).
    +The data must first be copied to a rsync cache server.
    +
    +
    +2019/11/06 11:05:04 Do you want to continue (Y/n)?
    +Y
    +2019/11/06 11:05:09 Created dataset with id 12.345.67890/12345678-1234-1234-1234-123456789012
    +2019/11/06 11:05:09 The dataset contains 108057 files.
    +2019/11/06 11:05:10 Created file block 0 from file 0 to 1000 with total size of 413229990 bytes
    +2019/11/06 11:05:10 Created file block 1 from file 1000 to 2000 with total size of 416024000 bytes
    +2019/11/06 11:05:10 Created file block 2 from file 2000 to 3000 with total size of 416024000 bytes
    +2019/11/06 11:05:10 Created file block 3 from file 3000 to 4000 with total size of 416024000 bytes
    +...
    +2019/11/06 11:05:26 Created file block 105 from file 105000 to 106000 with total size of 416024000 bytes
    +2019/11/06 11:05:27 Created file block 106 from file 106000 to 107000 with total size of 416024000 bytes
    +2019/11/06 11:05:27 Created file block 107 from file 107000 to 108000 with total size of 850195143 bytes
    +2019/11/06 11:05:27 Created file block 108 from file 108000 to 108057 with total size of 151904903 bytes
    +2019/11/06 11:05:27 short dataset id: 0a9fe316-c9e7-4cc5-8856-e1346dd31e31
    +2019/11/06 11:05:27 Running [/usr/bin/rsync -e ssh -avxz /data/project/bio/myproject/archive/ user_n@pb-archive.psi.ch:archive
    +/0a9fe316-c9e7-4cc5-8856-e1346dd31e31/data/project/bio/myproject/archive].
    +key_cert_check_authority: invalid certificate
    +Certificate invalid: name is not a listed principal
    +user_n@pb-archive.psi.ch's password:
    +Permission denied, please try again.
    +user_n@pb-archive.psi.ch's password:
    +/usr/libexec/test_acl.sh: line 30: /tmp/tmpacl.txt: Permission denied
    +/usr/libexec/test_acl.sh: line 30: /tmp/tmpacl.txt: Permission denied
    +/usr/libexec/test_acl.sh: line 30: /tmp/tmpacl.txt: Permission denied
    +/usr/libexec/test_acl.sh: line 30: /tmp/tmpacl.txt: Permission denied
    +/usr/libexec/test_acl.sh: line 30: /tmp/tmpacl.txt: Permission denied
    +...
    +2019/11/06 12:05:08 Successfully updated {"pid":"12.345.67890/12345678-1234-1234-1234-123456789012",...}
    +2019/11/06 12:05:08 Submitting Archive Job for the ingested datasets.
    +2019/11/06 12:05:08 Job response Status: okay
    +2019/11/06 12:05:08 A confirmation email will be sent to XXX
    +12.345.67890/12345678-1234-1234-1234-123456789012
    +
    +
    + +

    Publishing

    + +

    After datasets are are ingested they can be assigned a public DOI. This can be included in publications and will make the datasets on http://doi.psi.ch.

    + +

    For instructions on this, please read the ‘Publish’ section in the ingest manual.

    + +

    Retrieving data

    + +

    Retrieving data from the archive is also initiated through the Data Catalog. Please read the ‘Retrieve’ section in the ingest manual.

    + +

    Further Information

    + + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin6/cluster-introduction.html b/merlin6/cluster-introduction.html new file mode 100644 index 0000000..4603389 --- /dev/null +++ b/merlin6/cluster-introduction.html @@ -0,0 +1,792 @@ + + + + + + + + +Introduction | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Introduction

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    Slurm clusters

    + +
      +
    • The new Slurm CPU cluster is called merlin6.
    • +
    • The new Slurm GPU cluster is called gmerlin6
    • +
    • The old Slurm merlin cluster is still active and best effort support is provided. +The cluster, was renamed as merlin5.
    • +
    + +

    From July 2019, merlin6 becomes the default Slurm cluster and any job submitted from the login node will be submitted to that cluster if not .

    +
      +
    • Users can keep submitting to the old merlin5 computing nodes by using the option --cluster=merlin5.
    • +
    • Users submitting to the gmerlin6 GPU cluster need to specify the option --cluster=gmerlin6.
    • +
    + +

    Slurm ‘merlin6’

    + +

    CPU nodes are configured in a Slurm cluster, called merlin6, and +this is the default Slurm cluster. Hence, by default, if no Slurm cluster is +specified (with the --cluster option), this will be the cluster to which the jobs +will be sent.

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin6/code-of-conduct.html b/merlin6/code-of-conduct.html new file mode 100644 index 0000000..f012c81 --- /dev/null +++ b/merlin6/code-of-conduct.html @@ -0,0 +1,838 @@ + + + + + + + + +Code Of Conduct | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Code Of Conduct

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    The Basic principle

    + +

    The basic principle is courtesy and consideration for other users.

    + +
      +
    • Merlin6 is a system shared by many users, therefore you are kindly requested to apply common courtesy in using its resources. Please follow our guidelines which aim at providing and maintaining an efficient compute environment for all our users.
    • +
    • Basic shell programming skills are an essential requirement in a Linux/UNIX HPC cluster environment; a proficiency in shell programming is greatly beneficial.
    • +
    + +

    Interactive nodes

    + +
      +
    • The interactive nodes (also known as login nodes) are for development and quick testing: +
        +
      • It is strictly forbidden to run production jobs on the login nodes. All production jobs must be submitted to the batch system.
      • +
      • It is forbidden to run long processes occupying big parts of a login node’s resources.
      • +
      • According to the previous rules, misbehaving running processes will have to be killed. +in order to keep the system responsive for other users.
      • +
      +
    • +
    + +

    Batch system

    + +
      +
    • Make sure that no broken or run-away processes are left when your job is done. Keep the process space clean on all nodes.
    • +
    • During the runtime of a job, it is mandatory to use the /scratch and /shared-scratch partitions for temporary data: +
        +
      • It is forbidden to use the /data/user, /data/project or /psi/home/ for that purpose.
      • +
      • Always remove files you do not need any more (e.g. core dumps, temporary files) as early as possible. Keep the disk space clean on all nodes.
      • +
      • Prefer /scratch over /shared-scratch and use the latter only when you require the temporary files to be visible from multiple nodes.
      • +
      +
    • +
    • Read the description in Merlin6 directory structure for learning about the correct usage of each partition type.
    • +
    + +

    User and project data

    + +
      +
    • Users are responsible for backing up their own data. Is recommended to backup the data on third party independent systems (i.e. LTS, Archive, AFS, SwitchDrive, Windows Shares, etc.). +
        +
      • /psi/home, as this contains a small amount of data, is the only directory where we can provide daily snapshots for one week. This can be found in the following directory /psi/home/.snapshot/
      • +
      +
    • +
    • When a user leaves PSI, she or her supervisor/team are responsible to backup and move the data out from the cluster: every few months, the storage space will be recycled for those old users who do not have an existing and valid PSI account.
    • +
    + + + +

    System Administrator Rights

    + +
      +
    • The system administrator has the right to temporarily block the access to Merlin6 for an account violating the Code of Conduct in order to maintain the efficiency and stability of the system. +
        +
      • Repetitive violations by the same user will be escalated to the user’s supervisor.
      • +
      +
    • +
    • The system administrator has the right to delete files in the scratch directories +
        +
      • after a job, if the job failed to clean up its files.
      • +
      • during the job in order to prevent a job from destabilizing a node or multiple nodes.
      • +
      +
    • +
    • The system administrator has the right to kill any misbehaving running processes.
    • +
    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin6/connect-from-linux.html b/merlin6/connect-from-linux.html new file mode 100644 index 0000000..247a718 --- /dev/null +++ b/merlin6/connect-from-linux.html @@ -0,0 +1,815 @@ + + + + + + + + +Connecting from a Linux Client | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Connecting from a Linux Client

    +
    + + + +
    + + +
    This document describes a recommended setup for a Linux client.
    + + + + + + + +
    + + + + + + +

    SSH without X11 Forwarding

    + +

    This is the standard method. Official X11 support is provided through NoMachine. +For normal SSH sessions, use your SSH client as follows:

    + +
    ssh $username@merlin-l-01.psi.ch
    +ssh $username@merlin-l-001.psi.ch
    +ssh $username@merlin-l-002.psi.ch
    +
    + +

    SSH with X11 Forwarding

    + +

    Official X11 Forwarding support is through NoMachine. Please follow the document +{Job Submission -> Interactive Jobs} and +{Accessing Merlin -> NoMachine} for more details. However, +we provide a small recipe for enabling X11 Forwarding in Linux.

    + +
      +
    • +

      For enabling client X11 forwarding, add the following to the start of ~/.ssh/config +to implicitly add -X to all ssh connections:

      + +
       ForwardAgent yes
      + ForwardX11Trusted yes
      +
      +
    • +
    • +

      Alternatively, you can add the option -Y to the ssh command. In example:

      + +
       ssh -X $username@merlin-l-01.psi.ch
      + ssh -X $username@merlin-l-001.psi.ch
      + ssh -X $username@merlin-l-002.psi.ch
      +
      +
    • +
    • +

      For testing that X11 forwarding works, just run xclock. A X11 based clock should +popup in your client session:

      + +
       xclock
      +
      +
    • +
    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin6/connect-from-macos.html b/merlin6/connect-from-macos.html new file mode 100644 index 0000000..ebe0e77 --- /dev/null +++ b/merlin6/connect-from-macos.html @@ -0,0 +1,826 @@ + + + + + + + + +Connecting from a MacOS Client | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Connecting from a MacOS Client

    +
    + + + +
    + + +
    This document describes a recommended setup for a MacOS client.
    + + + + + + + +
    + + + + + + +

    SSH without X11 Forwarding

    + +

    This is the standard method. Official X11 support is provided through NoMachine. +For normal SSH sessions, use your SSH client as follows:

    + +
    ssh $username@merlin-l-01.psi.ch
    +ssh $username@merlin-l-001.psi.ch
    +ssh $username@merlin-l-002.psi.ch
    +
    + +

    SSH with X11 Forwarding

    + +

    Requirements

    + +

    For running SSH with X11 Forwarding in MacOS, one needs to have a X server running in MacOS. +The official X Server for MacOS is XQuartz. Please ensure +you have it running before starting a SSH connection with X11 forwarding.

    + +

    SSH with X11 Forwarding in MacOS

    + +

    Official X11 support is through NoMachine. Please follow the document +{Job Submission -> Interactive Jobs} and +{Accessing Merlin -> NoMachine} for more details. However, +we provide a small recipe for enabling X11 Forwarding in MacOS.

    + +
      +
    • +

      Ensure that XQuartz is installed and running in your MacOS.

      +
    • +
    • +

      For enabling client X11 forwarding, add the following to the start of ~/.ssh/config +to implicitly add -X to all ssh connections:

      + +
       ForwardAgent yes
      + ForwardX11Trusted yes
      +
      +
    • +
    • +

      Alternatively, you can add the option -Y to the ssh command. In example:

      + +
       ssh -X $username@merlin-l-01.psi.ch
      + ssh -X $username@merlin-l-001.psi.ch
      + ssh -X $username@merlin-l-002.psi.ch
      +
      +
    • +
    • +

      For testing that X11 forwarding works, just run xclock. A X11 based clock should +popup in your client session.

      + +
       xclock
      +
      +
    • +
    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin6/connect-from-windows.html b/merlin6/connect-from-windows.html new file mode 100644 index 0000000..82848f7 --- /dev/null +++ b/merlin6/connect-from-windows.html @@ -0,0 +1,823 @@ + + + + + + + + +Connecting from a Windows Client | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Connecting from a Windows Client

    +
    + + + +
    + + +
    This document describes a recommended setup for a Windows client.
    + + + + + + + +
    + + + + + + +

    SSH with PuTTY without X11 Forwarding

    + +

    PuTTY is one of the most common tools for SSH.

    + +

    Check, if the following software packages are installed on the Windows workstation by +inspecting the Start menu (hint: use the Search box to save time):

    + + +

    If they are missing, you can install them using the Software Kiosk icon on the Desktop.

    + +
      +
    1. +

      Start PuTTY

      +
    2. +
    3. +

      [Optional] Enable xterm to have similar mouse behavour as in Linux:

      + +

      Enable 'xterm'

      +
    4. +
    5. +

      Create session to a Merlin login node and Open:

      + +

      Create Merlin Session

      +
    6. +
    + +

    SSH with PuTTY with X11 Forwarding

    + +

    Official X11 Forwarding support is through NoMachine. Please follow the document +{Job Submission -> Interactive Jobs} and +{Accessing Merlin -> NoMachine} for more details. However, +we provide a small recipe for enabling X11 Forwarding in Windows.

    + +

    Check, if the Xming is installed on the Windows workstation by inspecting the +Start menu (hint: use the Search box to save time). If missing, you can install it by +using the Software Kiosk icon (should be located on the Desktop).

    + +
      +
    1. +

      Ensure that a X server (Xming) is running. Otherwise, start it.

      +
    2. +
    3. +

      Enable X11 Forwarding in your SSH client. In example, for Putty:

      + +

      Enable X11 Forwarding in Putty

      +
    4. +
    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin6/contact.html b/merlin6/contact.html new file mode 100644 index 0000000..f998b39 --- /dev/null +++ b/merlin6/contact.html @@ -0,0 +1,818 @@ + + + + + + + + +Contact | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Contact

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    Support

    + +

    Basic contact information can be also found when logging into the Merlin Login Nodes through the Message of the Day.

    + +

    Support can be asked through:

    + + +

    PSI Service Now

    + +

    PSI Service Now: is the official tool for opening incident requests.

    +
      +
    • PSI HelpDesk will redirect the incident to the corresponding department, or
    • +
    • you can always assign it directly by checking the box I know which service is affected and providing the service name Local HPC Resources (e.g. Merlin) [CF] (just type in Local and you should get the valid completions).
    • +
    + +

    Contact Merlin6 Administrators

    + +

    E-Mail merlin-admins@lists.psi.ch

    +
      +
    • This is the official way to contact Merlin6 Administrators for discussions which do not fit well into the incident category. +Do not hesitate to contact us for such cases.
    • +
    + +
    + +

    Get updated through the Merlin User list!

    + +

    Is strictly recommended that users subscribe to the Merlin Users mailing list: merlin-users@lists.psi.ch

    + +

    This mailing list is the official channel used by Merlin6 administrators to inform users about downtimes, +interventions or problems. Users can be subscribed in two ways:

    + +
      +
    • (Preferred way) Self-registration through Sympa
    • +
    • If you need to subscribe many people (e.g. your whole group) by sending a request to the admin list merlin-admins@lists.psi.ch +and providing a list of email addresses.
    • +
    + +
    + +

    The Merlin Cluster Team

    + +

    The PSI Merlin clusters are managed by the High Performance Computing and Emerging technologies Group, which + is part of the Science IT Infrastructure, and Services department (AWI) in PSI’s Center for Scientific Computing, Theory and Data (SCD).

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin6/data-directories.html b/merlin6/data-directories.html new file mode 100644 index 0000000..d8f0d73 --- /dev/null +++ b/merlin6/data-directories.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

    Redirecting…

    + Click here if you are not redirected. + diff --git a/merlin6/downtimes.html b/merlin6/downtimes.html new file mode 100644 index 0000000..a217890 --- /dev/null +++ b/merlin6/downtimes.html @@ -0,0 +1,883 @@ + + + + + + + + +Downtimes | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Downtimes

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    On the first Monday of each month the Merlin6 cluster might be subject to interruption due to maintenance. +Users will be informed with at least one week in advance when a downtime is scheduled for the next month.

    + +

    Downtimes will be informed to users through the merlin-users@lists.psi.ch mail list. Also, a detailed description +for the nexts scheduled interventions will be available in Next Scheduled Downtimes).

    + +
    + +

    Scheduled Downtime Draining Policy

    + +

    Scheduled downtimes mostly affecting the storage and Slurm configurantions may require draining the nodes. +When this is required, users will be informed accordingly. Two different types of draining are possible:

    + +
      +
    • soft drain: new jobs may be queued on the partition, but queued jobs may not be allocated nodes and run from the partition. +Jobs already running on the partition continue to run. This will be the default drain method.
    • +
    • hard drain: no new jobs may be queued on the partition (job submission requests will be denied with an error message), +but jobs already queued on the partition may be allocated to nodes and run.
    • +
    + +

    Unless explicitly specified, the default draining policy for each partition will be the following:

    + +
      +
    • The daily and general partitions will be soft drained 12h before the downtime.
    • +
    • The hourly partition will be soft drained 1 hour before the downtime.
    • +
    • The gpu and gpu-short partitions will be soft drained 1 hour before the downtime.
    • +
    + +

    Finally, remaining running jobs will be killed by default when the downtime starts. In some specific rare cases jobs will be +just paused and resumed back when the downtime finished.

    + +

    Draining Policy Summary

    + +

    The following table contains a summary of the draining policies during a Schedule Downtime:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PartitionDrain PolicyDefault Drain TypeDefault Job Policy
    general12h before the SDsoft drainKill running jobs when SD starts
    daily12h before the SDsoft drainKill running jobs when SD starts
    hourly1h before the SDsoft drainKill running jobs when SD starts
    gpu1h before the SDsoft drainKill running jobs when SD starts
    gpu-short1h before the SDsoft drainKill running jobs when SD starts
    gfa-asa1h before the SDsoft drainKill running jobs when SD starts
    + +
    + +

    Next Scheduled Downtimes

    + +

    The table below shows a description for the next Scheduled Downtime:

    + + + + + + + + + + + + + + + + + + +
    FromToServiceDescription
    05.09.2020 8am05.09.2020 6pm
    + +
      +
    • Note: An e-mail will be sent when the services are fully available.
    • +
    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin6/faq.html b/merlin6/faq.html new file mode 100644 index 0000000..cc04612 --- /dev/null +++ b/merlin6/faq.html @@ -0,0 +1,834 @@ + + + + + + + + +FAQ | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    FAQ

    +
    + + + +
    + + + + + + + + +
    + + + + + + + + + + +
    + +

    How do I register for Merlin?

    + +

    See Requesting Merlin Access.

    + +

    How do I get information about downtimes and updates?

    + +

    See Get updated through the Merlin User list!

    + +

    How can I request access to a Merlin project directory?

    + +

    Merlin projects are placed in the /data/project directory. Access to each project is controlled by Unix group membership. +If you require access to an existing project, please request group membership as described in Requesting Unix Group Membership.

    + +

    Your project leader or project colleagues will know what Unix group you should belong to. Otherwise, you can check what Unix group is allowed to access that project directory (simply run ls -ltrhd for the project directory).

    + +

    Can I install software myself?

    + +

    Most software can be installed in user directories without any special permissions. We recommend using /data/user/$USER/bin for software since home directories are fairly small. For software that will be used by multiple groups/users you can also request the admins install it as a module.

    + +

    How to install depends a bit on the software itself. There are three common installation procedures:

    + +
      +
    1. binary distributions. These are easy; just put them in a directory (eg /data/user/$USER/bin) and add that to your PATH.
    2. +
    3. source compilation using make/cmake/autoconfig/etc. Usually the compilation scripts accept a --prefix=/data/user/$USER directory for where to install it. Then they place files under <prefix>/bin, <prefix>/lib, etc. The exact syntax should be documented in the installation instructions.
    4. +
    5. conda environment. This is now becoming standard for python-based software, including lots of the AI tools. First follow the initial setup instructions to configure conda to use /data/user instead of your home directory. Then you can create environments like:
    6. +
    + +
    module load anaconda/2019.07
    +# if they provide environment.yml
    +conda env create -f environment.yml
    +
    +# or to create manually
    +conda create --name myenv python==3.9 ...
    +
    +conda activate myenv
    +
    + +

    Something doesn’t work

    + +

    Check the list of known problems to see if a solution is known. +If not, please contact the admins.

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin6/gothic.html b/merlin6/gothic.html new file mode 100644 index 0000000..d7beb05 --- /dev/null +++ b/merlin6/gothic.html @@ -0,0 +1,990 @@ + + + + + + + + +GOTHIC | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    GOTHIC

    +
    + + + +
    + + +
    This document describes how to run Gothic in the Merlin cluster
    + + + + + + + +
    + + + + + + +

    This document describes generic information of how to run Gothic in the +Merlin cluster

    + +

    Gothic installation

    + +

    Gothic is locally installed in Merlin in the following directory:

    +
    /data/project/general/software/gothic
    +
    + +

    Multiple versions are available. As of August 22, 2022, the latest +installed version is Gothic 8.3 QA.

    + +

    Future releases will be placed in the PSI Modules system, therefore, +loading it through PModules will be possible at some point. However, in the +meantime one has to use the existing installations present in +/data/project/general/software/gothic.

    + +

    Running Gothic

    + +

    General requirements

    + +

    When running Gothic in interactive or batch mode, one has to consider +the following requirements:

    + +
      +
    • Use always one node only: Gothic runs a single instance. +Therefore, it can not run on multiple nodes. Adding option --nodes=1-1 +or -N 1-1 is strongly recommended: this will prevent Slurm to allocate +multiple nodes if the Slurm allocation definition is ambiguous.
    • +
    • Use one task only: Gothic spawns one main process, which then will +spawn multiple threads depending on the number of available cores. +Therefore, one has to specify 1 task (--ntasks=1 or -n 1).
    • +
    • Use multiple CPUs: since Gothic will spawn multiple threads, then +multiple CPUs can be used. Adding --cpus-per-task=<num_cpus> +or -c <num_cpus> is in general recommended. +Notice that <num_cpus> must never exceed the maximum number of CPUS +in a compute node (usually 88).
    • +
    • Use multithread: Gothic is an OpenMP based software, therefore, +running in hyper-threading mode is strongly recommended. Use the option +--hint=multithread for enforcing hyper-threading.
    • +
    • [Optional] Memory setup: The default memory per CPU (4000MB) +is usually enough for running Gothic. If you require more memory, you +can always set the --mem=<mem_in_MB> option. This is in general +not necessary.
    • +
    + +

    Interactive

    + +

    Is not allowed to run CPU intensive interactive jobs in the +login nodes. Only applications capable to limit the number of cores are +allowed to run for longer time. Also, running in the login nodes is not +efficient, since resources are shared with other processes and users.

    + +

    Is possible to submit interactive jobs to the cluster by allocating a +full compute node, or even by allocating a few cores only. This will grant +dedicated CPUs and resources and in general it will not affect other users.

    + +

    For interactive jobs, is strongly recommended to use the hourly partition, +which usually has a good availability of nodes.

    + +

    For longer runs, one should use the daily (or general) partition. +However, getting interactive access to nodes on these partitions is +sometimes more difficult if the cluster is pretty full.

    + +

    To submit an interactive job, consider the following requirements:

    +
      +
    • X11 forwarding must be enabled: Gothic spawns an interactive +window which requires X11 forwarding when using it remotely, therefore +using the Slurm option --x11 is necessary.
    • +
    • Ensure that the scratch area is accessible: For running Gothic, +one has to define a scratch area with the GTHTMP environment variable. +There are two options: +
        +
      1. Use local scratch: Each compute node has its own /scratch area. +This area is independent to any other node, therefore not visible by other nodes. +Using the top directory /scratch for interactive jobs is the simplest way, +and it can be defined before or after the allocation creation, as follows: +
        # Example 1: Define GTHTMP before the allocation
        +export GTHTMP=/scratch
        +salloc ...
        +      
        +# Example 2: Define GTHTMP after the allocation
        +salloc ...
        +export GTHTMP=/scratch
        +
        +

        Notice that if you want to create a custom sub-directory (i.e. +/scratch/$USER, one has to create the sub-directory on every new +allocation! In example:

        +
        # Example 1: 
        +export GTHTMP=/scratch/$USER
        +salloc ...
        +mkdir -p $GTHTMP
        +
        +# Example 2:
        +salloc ...
        +export GTHTMP=/scratch/$USER
        +mkdir -p $GTHTMP
        +
        +

        Creating sub-directories makes the process more complex, therefore +using just /scratch is simpler and recommended.

        +
      2. +
      3. Shared scratch: Using shared scratch allows to have a +directory visible from all compute nodes and login nodes. Therefore, +one can use /shared-scratch to achieve the same as in 1., but +creating a sub-directory needs to be done just once.
      4. +
      + +

      Please, consider that /scratch usually provides better performance and, +in addition, will offload the main storage. Therefore, using local scratch +is strongly recommended. Use the shared scratch only when strongly necessary.

      +
    • +
    • Use the hourly partition: Using the hourly partition is +recommended for running interactive jobs (latency is in general +lower). However, daily and general are also available if you expect +longer runs, but in these cases you should expect longer waiting times.
    • +
    + +

    These requirements are in addition to the requirements previously described +in the General requirements +section.

    + +

    Interactive allocations: examples

    +
      +
    • Requesting a full node, +
      salloc --partition=hourly  -N 1 -n 1 -c 88 --hint=multithread --x11 --exclusive --mem=0 
      +
      +
    • +
    • Requesting 22 CPUs from a node, with default memory per CPU (4000MB/CPU): +
      num_cpus=22
      +salloc --partition=hourly -N 1 -n 1 -c $num_cpus --hint=multithread --x11
      +
      +
    • +
    + +

    Batch job

    + +

    The Slurm cluster is mainly used by non interactive batch jobs: Users +submit a job, which goes into a queue, and waits until Slurm can assign +resources to it. In general, the longer the job, the longer the waiting time, +unless there are enough free resources to inmediately start running it.

    + +

    Running Gothic in a Slurm batch script is pretty simple. One has to mainly +consider the requirements described in the General requirements +section, and:

    +
      +
    • Use local scratch for running batch jobs. In general, defining +GTHTMP in a batch script is simpler than on an allocation. If you plan +to run multiple jobs in the same node, you can even create a second sub-directory +level based on the Slurm Job ID: +
       mkdir -p /scratch/$USER/$SLURM_JOB_ID
      + export GTHTMP=/scratch/$USER/$SLURM_JOB_ID
      + ... # Run Gothic here
      + rm -rf /scratch/$USER/$SLURM_JOB_ID
      +
      +

      Temporary data generated by the job in GTHTMP must be removed at the end of +the job, as showed above.

      +
    • +
    + +

    Batch script: examples

    + +
      +
    • Requesting a full node: +
       #!/bin/bash -l
      + #SBATCH --job-name=Gothic
      + #SBATCH --time=3-00:00:00
      + #SBATCH --partition=general
      + #SBATCH --nodes=1
      + #SBATCH --ntasks=1
      + #SBATCH --cpus-per-task=88
      + #SBATCH --hint=multithread
      + #SBATCH --exclusive
      + #SBATCH --mem=0
      + #SBATCH --clusters=merlin6
      +   
      + INPUT_FILE='MY_INPUT.SIN'
      +   
      + mkdir -p /scratch/$USER/$SLURM_JOB_ID
      + export GTHTMP=/scratch/$USER/$SLURM_JOB_ID
      +   
      + /data/project/general/software/gothic/gothic8.3qa/bin/gothic_s.sh $INPUT_FILE -m -np $SLURM_CPUS_PER_TASK
      + gth_exit_code=$?
      +
      + # Clean up data in /scratch   
      + rm -rf /scratch/$USER/$SLURM_JOB_ID
      +
      + # Return exit code from GOTHIC
      + exit $gth_exit_code
      +
      +
    • +
    • Requesting 22 CPUs from a node, with default memory per CPU (4000MB/CPU): +
       #!/bin/bash -l
      + #SBATCH --job-name=Gothic
      + #SBATCH --time=3-00:00:00
      + #SBATCH --partition=general
      + #SBATCH --nodes=1
      + #SBATCH --ntasks=1
      + #SBATCH --cpus-per-task=22
      + #SBATCH --hint=multithread
      + #SBATCH --clusters=merlin6
      +   
      + INPUT_FILE='MY_INPUT.SIN'
      +   
      + mkdir -p /scratch/$USER/$SLURM_JOB_ID
      + export GTHTMP=/scratch/$USER/$SLURM_JOB_ID
      +   
      + /data/project/general/software/gothic/gothic8.3qa/bin/gothic_s.sh $INPUT_FILE -m -np $SLURM_CPUS_PER_TASK
      + gth_exit_code=$?
      +
      + # Clean up data in /scratch   
      + rm -rf /scratch/$USER/$SLURM_JOB_ID
      +
      + # Return exit code from GOTHIC
      + exit $gth_exit_code
      +
      +
    • +
    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin6/hardware-and-software.html b/merlin6/hardware-and-software.html new file mode 100644 index 0000000..a1a19d2 --- /dev/null +++ b/merlin6/hardware-and-software.html @@ -0,0 +1,950 @@ + + + + + + + + +Hardware And Software Description | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Hardware And Software Description

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    Hardware

    + +

    Computing Nodes

    + +

    The new Merlin6 cluster contains a solution based on four HPE Apollo k6000 Chassis

    +
      +
    • Three of them contain 24 x HP Apollo XL230K Gen10 blades.
    • +
    • A fourth chassis was purchased on 2021 with HP Apollo XL230K Gen10 blades dedicated to few experiments. Blades have slighly different components depending on specific project requirements.
    • +
    + +

    The connectivity for the Merlin6 cluster is based on ConnectX-5 EDR-100Gbps, and each chassis contains:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Merlin6 CPU Computing Nodes
    ChassisNodeProcessorSocketsCoresThreadsScratchMemory
    #0merlin-c-0[01-24]Intel Xeon Gold 615224421.2TB384GB
    #1merlin-c-1[01-24]Intel Xeon Gold 615224421.2TB384GB
    #2merlin-c-2[01-24]Intel Xeon Gold 615224421.2TB384GB
    #3merlin-c-3[01-12]Intel Xeon Gold 6240R24821.2TB768GB
    merlin-c-3[03-18]1
    merlin-c-3[19-24]2384GB
    +

    Each blade contains a NVMe disk, where up to 300TB are dedicated to the O.S., and ~1.2TB are reserved for local /scratch.

    + +

    Login Nodes

    + +

    One old login node (merlin-l-01.psi.ch) is inherit from the previous Merlin5 cluster. Its mainly use is for running some BIO services (cryosparc) and for submitting jobs. +Two new login nodes (merlin-l-001.psi.ch,merlin-l-002.psi.ch) with similar configuration to the Merlin6 computing nodes are available for the users. The mainly use +is for compiling software and submitting jobs.

    + +

    The connectivity is based on ConnectX-5 EDR-100Gbps for the new login nodes, and ConnectIB FDR-56Gbps for the old one.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Merlin6 CPU Computing Nodes
    HardwareNodeProcessorSocketsCoresThreadsScratchMemory
    Oldmerlin-l-01Intel Xeon E5-2697AV42162100GB512GB
    Newmerlin-l-00[1,2]Intel Xeon Gold 615224421.8TB384GB
    + +

    Storage

    + +

    The storage node is based on the Lenovo Distributed Storage Solution for IBM Spectrum Scale.

    +
      +
    • 2 x Lenovo DSS G240 systems, each one composed by 2 IO Nodes ThinkSystem SR650 mounting 4 x Lenovo Storage D3284 High Density Expansion enclosures.
    • +
    • Each IO node has a connectivity of 400Gbps (4 x EDR 100Gbps ports, 2 of them are ConnectX-5 and 2 are ConnectX-4).
    • +
    + +

    The storage solution is connected to the HPC clusters through 2 x Mellanox SB7800 InfiniBand 1U Switches for high availability and load balancing.

    + +

    Network

    + +

    Merlin6 cluster connectivity is based on the Infiniband technology. This allows fast access with very low latencies to the data as well as running +extremely efficient MPI-based jobs:

    +
      +
    • Connectivity amongst different computing nodes on different chassis ensures up to 1200Gbps of aggregated bandwidth.
    • +
    • Inter connectivity (communication amongst computing nodes in the same chassis) ensures up to 2400Gbps of aggregated bandwidth.
    • +
    • Communication to the storage ensures up to 800Gbps of aggregated bandwidth.
    • +
    + +

    Merlin6 cluster currently contains 5 Infiniband Managed switches and 3 Infiniband Unmanaged switches (one per HP Apollo chassis):

    +
      +
    • 1 x MSX6710 (FDR) for connecting old GPU nodes, old login nodes and MeG cluster to the Merlin6 cluster (and storage). No High Availability mode possible.
    • +
    • 2 x MSB7800 (EDR) for connecting Login Nodes, Storage and other nodes in High Availability mode.
    • +
    • 3 x HP EDR Unmanaged switches, each one embedded to each HP Apollo k6000 chassis solution.
    • +
    • 2 x MSB7700 (EDR) are the top switches, interconnecting the Apollo unmanaged switches and the managed switches (MSX6710, MSB7800).
    • +
    + +

    Software

    + +

    In Merlin6, we try to keep the latest software stack release to get the latest features and improvements. Due to this, Merlin6 runs:

    + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin6/impi.html b/merlin6/impi.html new file mode 100644 index 0000000..0eeb660 --- /dev/null +++ b/merlin6/impi.html @@ -0,0 +1,806 @@ + + + + + + + + +Intel MPI Support | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Intel MPI Support

    +
    + + + +
    + + +
    This document describes how to use Intel MPI in the Merlin6 cluster
    + + + + + + + +
    + + + + + + +

    Introduction

    + +

    This document describes which set of Intel MPI versions in PModules are supported in the Merlin6 cluster.

    + +

    srun

    + +

    We strongly recommend the use of ‘srun’ over ‘mpirun’ or ‘mpiexec’. Using ‘srun’ would properly +bind tasks in to cores and less customization is needed, while ‘mpirun’ and ‘mpiexec’ might need more advanced +configuration and should be only used by advanced users. Please, always adapt your scripts for using ‘srun’ +before opening a support ticket. Also, please contact us on any problem when using a module.

    + + + +

    When running with srun, one should tell Intel MPI to use the PMI libraries provided by Slurm. For PMI-1:

    + +
    export I_MPI_PMI_LIBRARY=/usr/lib64/libpmi.so
    +
    +srun ./app
    +
    + +

    Alternatively, one can use PMI-2, but then one needs to specify it as follows:

    + +
    export I_MPI_PMI_LIBRARY=/usr/lib64/libpmi2.so
    +export I_MPI_PMI2=yes
    +
    +srun ./app
    +
    + +

    For more information, please read Slurm Intel MPI Guide

    + +

    Note: Please note that PMI2 might not work properly in some Intel MPI versions. If so, you can either fallback +to PMI-1 or to contact the Merlin administrators.

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin6/index.html b/merlin6/index.html new file mode 100644 index 0000000..4b2ef60 --- /dev/null +++ b/merlin6/index.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

    Redirecting…

    + Click here if you are not redirected. + diff --git a/merlin6/interactive-jobs.html b/merlin6/interactive-jobs.html new file mode 100644 index 0000000..7a6bdf4 --- /dev/null +++ b/merlin6/interactive-jobs.html @@ -0,0 +1,997 @@ + + + + + + + + +Running Interactive Jobs | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Running Interactive Jobs

    +
    + + + +
    + + +
    This document describes how to run interactive jobs as well as X based software.
    + + + + + + + +
    + + + + + + +

    Running interactive jobs

    + +

    There are two different ways for running interactive jobs in Slurm. This is possible by using +the salloc and srun commands:

    + +
      +
    • salloc: to obtain a Slurm job allocation (a set of nodes), execute command(s), and then release the allocation when the command is finished.
    • +
    • srun: is used for running parallel tasks.
    • +
    + +

    srun

    + +

    Is run is used to run parallel jobs in the batch system. It can be used within a batch script +(which can be run with sbatch), or within a job allocation (which can be run with salloc). +Also, it can be used as a direct command (in example, from the login nodes).

    + +

    When used inside a batch script or during a job allocation, srun is constricted to the +amount of resources allocated by the sbatch/salloc commands. In sbatch, usually +these resources are defined inside the batch script with the format #SBATCH <option>=<value>. +In other words, if you define in your batch script or allocation 88 tasks (and 1 thread / core) +and 2 nodes, srun is constricted to these amount of resources (you can use less, but never +exceed those limits).

    + +

    When used from the login node, usually is used to run a specific command or software in an +interactive way. srun is a blocking process (it will block bash prompt until the srun +command finishes, unless you run it in background with &). This can be very useful to run +interactive software which pops up a Window and then submits jobs or run sub-tasks in the +background (in example, Relion, cisTEM, etc.)

    + +

    Refer to man srun for exploring all possible options for that command.

    + +
    +[Show 'srun' example]: Running 'hostname' command on 3 nodes, using 2 cores (1 task/core) per node +
    +(base) [caubet_m@merlin-l-001 ~]$ srun --clusters=merlin6 --ntasks=6 --ntasks-per-node=2 --nodes=3 hostname
    +srun: job 135088230 queued and waiting for resources
    +srun: job 135088230 has been allocated resources
    +merlin-c-102.psi.ch
    +merlin-c-102.psi.ch
    +merlin-c-101.psi.ch
    +merlin-c-101.psi.ch
    +merlin-c-103.psi.ch
    +merlin-c-103.psi.ch
    +
    +
    + +

    salloc

    + +

    salloc is used to obtain a Slurm job allocation (a set of nodes). Once job is allocated, +users are able to execute interactive command(s). Once finished (exit or Ctrl+D), +the allocation is released. salloc is a blocking command, it is, command will be blocked +until the requested resources are allocated.

    + +

    When running salloc, once the resources are allocated, by default the user will get +a new shell on one of the allocated resources (if a user has requested few nodes, it will +prompt a new shell on the first allocated node). However, this behaviour can be changed by adding +a shell ($SHELL) at the end of the salloc command. In example:

    + +
    # Typical 'salloc' call
    +#   - Same as running:
    +#    'salloc --clusters=merlin6 -N 2 -n 2 srun -n1 -N1 --mem-per-cpu=0 --gres=gpu:0 --pty --preserve-env --mpi=none $SHELL' 
    +salloc --clusters=merlin6 -N 2 -n 2
    +
    +# Custom 'salloc' call
    +#   - $SHELL will open a local shell on the login node from where ``salloc`` is running
    +salloc --clusters=merlin6 -N 2 -n 2 $SHELL
    +
    + +
    +[Show 'salloc' example]: Allocating 2 cores (1 task/core) in 2 nodes (1 core/node) - Default +
    +(base) [caubet_m@merlin-l-001 ~]$ salloc --clusters=merlin6 --ntasks=2 --nodes=2
    +salloc: Pending job allocation 135171306
    +salloc: job 135171306 queued and waiting for resources
    +salloc: job 135171306 has been allocated resources
    +salloc: Granted job allocation 135171306
    +
    +(base) [caubet_m@merlin-c-213 ~]$ srun hostname
    +merlin-c-213.psi.ch
    +merlin-c-214.psi.ch
    +
    +(base) [caubet_m@merlin-c-213 ~]$ exit
    +exit
    +salloc: Relinquishing job allocation 135171306
    +
    +(base) [caubet_m@merlin-l-001 ~]$ salloc --clusters=merlin6 -N 2 -n 2 srun -n1 -N1 --mem-per-cpu=0 --gres=gpu:0 --pty --preserve-env --mpi=none $SHELL
    +salloc: Pending job allocation 135171342
    +salloc: job 135171342 queued and waiting for resources
    +salloc: job 135171342 has been allocated resources
    +salloc: Granted job allocation 135171342
    +
    +(base) [caubet_m@merlin-c-021 ~]$ srun hostname
    +merlin-c-021.psi.ch
    +merlin-c-022.psi.ch
    +
    +(base) [caubet_m@merlin-c-021 ~]$ exit
    +exit
    +salloc: Relinquishing job allocation 135171342
    +
    +
    + +
    +[Show 'salloc' example]: Allocating 2 cores (1 task/core) in 2 nodes (1 core/node) - $SHELL +
    +(base) [caubet_m@merlin-export-01 ~]$ salloc --clusters=merlin6 --ntasks=2 --nodes=2 $SHELL
    +salloc: Pending job allocation 135171308
    +salloc: job 135171308 queued and waiting for resources
    +salloc: job 135171308 has been allocated resources
    +salloc: Granted job allocation 135171308
    +
    +(base) [caubet_m@merlin-export-01 ~]$ srun hostname
    +merlin-c-218.psi.ch
    +merlin-c-117.psi.ch
    +
    +(base) [caubet_m@merlin-export-01 ~]$ exit
    +exit
    +salloc: Relinquishing job allocation 135171308
    +
    +
    + +

    Running interactive jobs with X11 support

    + +

    Requirements

    + +

    Graphical access

    + +

    NoMachine is the official supported service for graphical +access in the Merlin cluster. This service is running on the login nodes. Check the +document {Accessing Merlin -> NoMachine} for details about +how to connect to the NoMachine service in the Merlin cluster.

    + +

    For other non officially supported graphical access (X11 forwarding):

    + + + +

    ‘srun’ with x11 support

    + +

    Merlin5 and Merlin6 clusters allow running any windows based applications. For that, you need to +add the option --x11 to the srun command. In example:

    + +
    srun --clusters=merlin6 --x11 xclock
    +
    + +

    will popup a X11 based clock.

    + +

    In the same manner, you can create a bash shell with x11 support. For doing that, you need +to add the option --pty to the srun --x11 command. Once resource is allocated, from +there you can interactively run X11 and non-X11 based commands.

    + +
    srun --clusters=merlin6 --x11 --pty bash
    +
    + +
    +[Show 'srun' with X11 support examples] +
    +(base) [caubet_m@merlin-l-001 ~]$ srun --clusters=merlin6 --x11 xclock
    +srun: job 135095591 queued and waiting for resources
    +srun: job 135095591 has been allocated resources
    +
    +(base) [caubet_m@merlin-l-001 ~]$ 
    +
    +(base) [caubet_m@merlin-l-001 ~]$ srun --clusters=merlin6 --x11 --pty bash
    +srun: job 135095592 queued and waiting for resources
    +srun: job 135095592 has been allocated resources
    +
    +(base) [caubet_m@merlin-c-205 ~]$ xclock
    +
    +(base) [caubet_m@merlin-c-205 ~]$ echo "This was an example"
    +This was an example
    +
    +(base) [caubet_m@merlin-c-205 ~]$ exit
    +exit
    +
    +
    + +

    ‘salloc’ with x11 support

    + +

    Merlin5 and Merlin6 clusters allow running any windows based applications. For that, you need to +add the option --x11 to the salloc command. In example:

    + +
    salloc --clusters=merlin6 --x11 xclock
    +
    + +

    will popup a X11 based clock.

    + +

    In the same manner, you can create a bash shell with x11 support. For doing that, you need +to add to run just salloc --clusters=merlin6 --x11. Once resource is allocated, from +there you can interactively run X11 and non-X11 based commands.

    + +
    salloc --clusters=merlin6 --x11
    +
    + +
    +[Show 'salloc' with X11 support examples] +
    +(base) [caubet_m@merlin-l-001 ~]$ salloc --clusters=merlin6 --x11 xclock
    +salloc: Pending job allocation 135171355
    +salloc: job 135171355 queued and waiting for resources
    +salloc: job 135171355 has been allocated resources
    +salloc: Granted job allocation 135171355
    +salloc: Relinquishing job allocation 135171355
    +
    +(base) [caubet_m@merlin-l-001 ~]$ salloc --clusters=merlin6 --x11 
    +salloc: Pending job allocation 135171349
    +salloc: job 135171349 queued and waiting for resources
    +salloc: job 135171349 has been allocated resources
    +salloc: Granted job allocation 135171349
    +salloc: Waiting for resource configuration
    +salloc: Nodes merlin-c-117 are ready for job
    +
    +(base) [caubet_m@merlin-c-117 ~]$ xclock
    +
    +(base) [caubet_m@merlin-c-117 ~]$ echo "This was an example"
    +This was an example
    +
    +(base) [caubet_m@merlin-c-117 ~]$ exit
    +exit
    +salloc: Relinquishing job allocation 135171349
    +
    +
    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin6/interactive.html b/merlin6/interactive.html new file mode 100644 index 0000000..d3672da --- /dev/null +++ b/merlin6/interactive.html @@ -0,0 +1,872 @@ + + + + + + + + +Accessing Interactive Nodes | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Accessing Interactive Nodes

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    SSH Access

    + +

    For interactive command shell access, use an SSH client. We recommend to activate SSH’s X11 forwarding to allow you to use graphical +applications (e.g. a text editor, but for more performant graphical access, refer to the sections below). X applications are supported +in the login nodes and X11 forwarding can be used for those users who have properly configured X11 support in their desktops, however:

    + +
      +
    • Merlin6 administrators do not offer support for user desktop configuration (Windows, MacOS, Linux). +
        +
      • Hence, Merlin6 administrators do not offer official support for X11 client setup.
      • +
      • Nevertheless, a generic guide for X11 client setup (Linux, Windows and MacOS) is provided below.
      • +
      +
    • +
    • PSI desktop configuration issues must be addressed through PSI Service Now as an Incident Request. +
        +
      • Ticket will be redirected to the corresponding Desktop support group (Windows, Linux).
      • +
      +
    • +
    + +

    Accessing from a Linux client

    + +

    Refer to {How To Use Merlin -> Accessing from Linux Clients} for Linux SSH client and X11 configuration.

    + +

    Accessing from a Windows client

    + +

    Refer to {How To Use Merlin -> Accessing from Windows Clients} for Windows SSH client and X11 configuration.

    + +

    Accessing from a MacOS client

    + +

    Refer to {How To Use Merlin -> Accessing from MacOS Clients} for MacOS SSH client and X11 configuration.

    + +

    NoMachine Remote Desktop Access

    + +

    X applications are supported in the login nodes and can run efficiently through a NoMachine client. This is the officially supported way to run more demanding X applications on Merlin6.

    +
      +
    • For PSI Windows workstations, this can be installed from the Software Kiosk as ‘NX Client’. If you have difficulties installing, please request support through PSI Service Now as an Incident Request.
    • +
    • For other workstations The client software can be downloaded from the Nomachine Website.
    • +
    + +

    Configuring NoMachine

    + +

    Refer to {How To Use Merlin -> Remote Desktop Access} for further instructions of how to configure the NoMachine client and how to access it from PSI and from outside PSI.

    + +

    Login nodes hardware description

    + +

    The Merlin6 login nodes are the official machines for accessing the recources of Merlin6. +From these machines, users can submit jobs to the Slurm batch system as well as visualize or compile their software.

    + +

    The Merlin6 login nodes are the following:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    HostnameSSHNoMachine#cores#ThreadsCPUMemoryScratchScratch Mountpoint
    merlin-l-001.psi.chyesyes2 x 222Intel Xeon Gold 6152384GB1.8TB NVMe/scratch
    merlin-l-002.psi.chyesyes2 x 222Intel Xeon Gold 6142384GB1.8TB NVMe/scratch
    merlin-l-01.psi.chyes-2 x 162Intel Xeon E5-2697Av4512GB100GB SAS/scratch
    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin6/introduction.html b/merlin6/introduction.html new file mode 100644 index 0000000..f9e5c5e --- /dev/null +++ b/merlin6/introduction.html @@ -0,0 +1,837 @@ + + + + + + + + +Introduction | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Introduction

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    The Merlin local HPC cluster

    + +

    Historically, the local HPC clusters at PSI were named Merlin. Over the years, +multiple generations of Merlin have been deployed.

    + +

    At present, the Merlin local HPC cluster contains two generations of it:

    +
      +
    • the old Merlin5 cluster (merlin5 Slurm cluster), and
    • +
    • the newest generation Merlin6, which is divided in two Slurm clusters: +
        +
      • merlin6 as the Slurm CPU cluster
      • +
      • gmerlin6 as the Slurm GPU cluster.
      • +
      +
    • +
    + +

    Access to the different Slurm clusters is possible from the Merlin login nodes, +which can be accessed through the SSH protocol or the NoMachine (NX) service.

    + +

    The following image shows the Slurm architecture design for the Merlin5 & Merlin6 (CPU & GPU) clusters:

    + +

    Merlin6 Slurm Architecture Design

    + +

    Merlin6

    + +

    Merlin6 is a the official PSI Local HPC cluster for development and +mission-critical applications that has been built in 2019. It replaces +the Merlin5 cluster.

    + +

    Merlin6 is designed to be extensible, so is technically possible to add +more compute nodes and cluster storage without significant increase of +the costs of the manpower and the operations.

    + +

    Merlin6 contains all the main services needed for running cluster, including +login nodes, storage, computing nodes and other subservices, +connected to the central PSI IT infrastructure.

    + +

    CPU and GPU Slurm clusters

    + +

    The Merlin6 computing nodes are mostly based on CPU resources. However, +it also contains a small amount of GPU-based resources, which are mostly used +by the BIO Division and by Deep Leaning project.

    + +

    These computational resources are split into two different Slurm clusters:

    +
      +
    • The Merlin6 CPU nodes are in a dedicated Slurm cluster called merlin6. +
        +
      • This is the default Slurm cluster configured in the login nodes: any job submitted without the option --cluster will be submited to this cluster.
      • +
      +
    • +
    • The Merlin6 GPU resources are in a dedicated Slurm cluster called gmerlin6. +
        +
      • Users submitting to the gmerlin6 GPU cluster need to specify the option --cluster=gmerlin6.
      • +
      +
    • +
    + +

    Merlin5

    + +

    The old Slurm CPU merlin cluster is still active and is maintained in a best effort basis.

    + +

    Merlin5 only contains computing nodes resources in a dedicated Slurm cluster.

    +
      +
    • The Merlin5 CPU cluster is called merlin5.
    • +
    + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin6/jupyter-examples.html b/merlin6/jupyter-examples.html new file mode 100644 index 0000000..663a7fc --- /dev/null +++ b/merlin6/jupyter-examples.html @@ -0,0 +1,793 @@ + + + + + + + + +Jupyter examples on merlin6 | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Jupyter examples on merlin6

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    These examples demonstrate the use of certain python libraries and modules in the merlin6 environment. They are provided to get you started fast. You can check out a repository of the examples from

    + +

    https://git.psi.ch/lsm-hpce/merlin6-jupyterhub-examples

    + +

    A number of standard data sets for the tutorials of the libraries are hosted on merlin6 centrally under /data/project/general/public, so you do not need to store them in your user space.

    + +

    Dask

    + +

    Dask is a flexible library for parallel computing in Python. It provides the abstraction of a dask dataframe that can reside on multiple machines and can be manipulated by an API designed to be as close as possible to pandas. The example shows how to start up dask workers on merlin6 through slurm.

    + + + +

    Plotly

    +

    Plotly is an interactive open source plotting library

    + + + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin6/jupyter-extensions.html b/merlin6/jupyter-extensions.html new file mode 100644 index 0000000..c250abe --- /dev/null +++ b/merlin6/jupyter-extensions.html @@ -0,0 +1,795 @@ + + + + + + + + +Jupyter Extensions | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Jupyter Extensions

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    Using nbextensions for adding features to your notebook

    + +

    There exist a number of useful contributed but unofficial +extensions +that add useful features to your notebooks.

    + +

    From the classic Notebook UI you can access the available extensions in a separate tab as displayed in the screenshot, below. You may have to unselect the disable configuration for nbextensions without explicit copatibility. The extensions we tested still worked fine with this jupyterhub version of 1.0.0.

    + +
    Launch Classic Notebook
    + +

    Extensions for working with large notebooks

    + +

    Especially the following extensions make working with larger notebooks easier

    +
      +
    • Table of Contents: Displays a TOC on the left and you can also configure it +to add and update a TOC at the head of the document.
    • +
    • Collapsible Headings: allows you to fold all the cells below a heading
    • +
    + +

    It may also be interesting for you to explore the Jupytext server extension.

    + +

    Variable Inspector

    + +

    The variable inspector extension provides a constantly updated window in which you can see the value and type of your notebook’s variables.

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin6/jupyterhub-trouble.html b/merlin6/jupyterhub-trouble.html new file mode 100644 index 0000000..aed11f7 --- /dev/null +++ b/merlin6/jupyterhub-trouble.html @@ -0,0 +1,823 @@ + + + + + + + + +Jupyterhub Troubleshooting | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Jupyterhub Troubleshooting

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    In case of problems or requests, please either submit a PSI Service Now incident containing “Merlin Jupyterhub” as part of the subject, or contact us by mail through merlin-admins@lists.psi.ch.

    + +

    General steps for troubleshooting

    + +

    Investigate the Slurm output file

    +

    Your jupyterhub session runs as a normal batch job on the cluster, and each launch will create a slurm output file in your HOME directory named like jupyterhub_batchspawner_{$JOBID}.log, where the $JOBID part is the slurm job ID of your job. After a failed launch, investigate the contents of that file. An error message will usually be found towards the end of the file, often including a python backtrace.

    + +

    Investigate python environment interferences

    +

    Jupyterhub just runs a jupyter notebook executable as your user inside the batch job. A frequent source of errors consists of a user’s local python environment definitions getting mixed up with the environment that jupyter needs to launch.

    + +
      +
    • setting PYTHONPATH inside of the ~/.bash_profile or any other startup script
    • +
    • having installed packages to your local user area (e.g. using pip install --user <some-package>). Such installation will interfere with the environment offered by the module system on our cluster (based on anaconda). You can list such packages by executing + pip list user. They are usually located in ~/.local/lib/pythonX.Y/....
    • +
    + +

    You can investigate the launching of a notebook interactively, by logging in to Merlin6 and running a jupyter command in the correct environment.

    + +
      module use unstable
    +  module load anaconda/2019.07
    +  conda activate jupyterhub-1.0.0_py36
    +  jupyter --paths
    +
    + +

    Known Problems and workarounds

    +

    Spawner times out

    +

    If the cluster is very full, it may be difficult to launch a session. We always reserve some slots for interactive Jupyterhub use, but it may be that these slots have been taken or that the resources you requested are currently not available.

    + +

    Inside of a Merlin6 terminal shell, you can run the standard commands like sinfo and squeue to get an overview of how full the cluster is.

    + +

    Your user environment is not among the kernels offered for choice

    +

    Refer to our documentation about using your own custom made +environments with jupyterhub.

    + +

    Cannot save notebook - xsrf argument missing

    +

    You cannot save your notebook anymore and you get this error:

    + +
     **'_xsrf' argument missing from POST**
    +
    + +

    This issue occurs very seldomly. There exists the following workaround:

    + +

    Go to the jupyterhub file browsing window and just open another +notebook using the same kernel in another browser window. The issue +should then go away. For more information refer to this github +thread

    + + + + + + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin6/jupyterhub.html b/merlin6/jupyterhub.html new file mode 100644 index 0000000..cec1187 --- /dev/null +++ b/merlin6/jupyterhub.html @@ -0,0 +1,862 @@ + + + + + + + + +Jupyterhub on Merlin | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Jupyterhub on Merlin

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    Jupyterhub provides jupyter notebooks that are launched on +cluster nodes of merlin and can be accessed through a web portal.

    + +

    Accessing Jupyterhub and launching a session

    + +

    The service is available inside of PSI (or through a VPN connection) at

    + +

    https://merlin-jupyter.psi.ch:8000

    + +
      +
    1. Login: You will be presented with a Login web page for +authenticating with your PSI account.
    2. +
    3. Spawn job: The Spawner Options page allows you to +specify the properties (Slurm partition, running time,…) of +the batch jobs that will be running your jupyter notebook. Once +you click on the Spawn button, your job will be sent to the +Slurm batch system. If the cluster is not currently overloaded +and the resources you requested are available, your job will +usually start within 30 seconds.
    4. +
    + +

    Jupyter software environments - running different kernels

    + +

    Your notebooks can run within different software environments which are offered by a number of available Jupyter kernels.

    + +

    E.g. in this test installation we provide two environments targeted at data science

    +
      +
    • tensorflow-1.13.1_py37: contains Tensorflow, Keras, scikit-learn, Pandas, numpy, dask, and dependencies. Stable
    • +
    • talos_py36: also contains the Talos package. This +environment is experimental and subject to updates and changes.
    • +
    + +

    When you create a new notebook you will be asked to specify which kernel you want to use. It is also possible to switch the kernel of a running notebook, but you will lose the state of the current kernel, so you will have to recalculate the notebook cells with this new kernel.

    + +

    These environments are also available for standard work in a shell session. You can activate an environment in a normal merlin terminal session by using the module (q.v. using Pmodules) command to load anaconda python, and from there using the conda command to switch to the desired environment

    + +
    module use unstable
    +module load anaconda/2019.07
    +conda activate tensorflow-1.13.1_py36
    +
    + +

    When the anaconda module has been loaded, you can list the available environments by executing

    + +
    conda info -e
    +
    + +

    You can get more info on the use of the conda package management tool at its official https://conda.io/projects/conda/en/latest/commands.html.

    + +

    Using your own custom made environments with jupyterhub

    +

    Python environments can take up a lot of space due to the many dependencies that will be installed. You should always install your extra environments to the data area belonging to your account, e.g. /data/user/${YOUR-USERNAME}/conda-envs

    + +

    In order for jupyterhub (and jupyter in general) to recognize the provided environment as a valid kernel, make sure that you include the nb_conda_kernels package in your environment. This package provides the necessary activation and the dependencies.

    + +

    Example:

    +
    conda create -c conda-forge -p /data/user/${USER}/conda-envs/my-test-env python=3.7 nb_conda_kernels
    +
    + +

    After this, your new kernel will be visible as my-test-env inside of your jupyterhub session.

    + +

    Requesting additional resources

    + +

    The Spawner Options page covers the most common options. These are used to +create a submission script for the jupyterhub job and submit it to the slurm +queue. Additional customization can be implemented using the ‘Optional user +defined line to be added to the batch launcher script’ option. This line is +added to the submission script at the end of other #SBATCH lines. Parameters can +be passed to SLURM by starting the line with #SBATCH, like in Running Slurm +Scripts. Some ideas:

    + +

    Request additional memory

    + +
    #SBATCH --mem=100G
    +
    + +

    Request multiple GPUs (gpu partition only)

    + +
    #SBATCH --gpus=2
    +
    + +

    Log additional information

    + +
    hostname; date; echo $USER
    +
    + +

    Output is found in ~/jupyterhub_batchspawner_<jobid>.log.

    + +

    Contact

    +

    In case of problems or requests, please either submit a PSI Service +Now incident containing “Merlin +Jupyterhub” as part of the subject, or contact us by mail through +merlin-admins@lists.psi.ch.

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin6/jupyterlab.html b/merlin6/jupyterlab.html new file mode 100644 index 0000000..5ff128e --- /dev/null +++ b/merlin6/jupyterlab.html @@ -0,0 +1,789 @@ + + + + + + + + +Jupyterlab User interface | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Jupyterlab User interface

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    Testing out Jupyterlab

    +

    Jupyterlab is a new interface to interact with your Jupyter notebooks. However, it is in very active development and undergoing constant changes. You can read about its features on the official website.

    + +

    You can test it out on our server by using the following kind of URL, where $YOUR-USER must be replaced by your PSI username. You must already have an active session on the jupyterhub.

    + +

    https://merlin-jupyter.psi.ch:8000/user/$YOUR-USER/lab

    + +

    Switching to the Classic Notebook user interface

    + +

    You can switch to the classical notebook UI by using the “Launch Classic Notebook” command from the left sidebar of JupyterLab.

    + +
    Launch Classic Notebook
    + +

    Jupyterlab does not support the older nbextensions

    + +

    These regrettably are not yet supported from within the JupyterLab UI, +but you can activate them through the Classic Notebook interface (see +above)

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin6/jupytext.html b/merlin6/jupytext.html new file mode 100644 index 0000000..7a1f258 --- /dev/null +++ b/merlin6/jupytext.html @@ -0,0 +1,800 @@ + + + + + + + + +Jupytext - efficient editing | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Jupytext - efficient editing

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    Jupytext is a Jupyter serverextension that allows creating a text file from a notebook that can be kept in sync with it with the aim of using more efficient editors or IDEs on it. The file can be created in a number of formats, e.g. markdown, *.py (light Script), and others. Jupytext will keep the both the notebook and this paired file in sync: If you save the paired file, changes will be carried over into the notebook, and vice versa. This pairing will persist also in new sessions of your notebook until you explicitely remove it again.

    + +

    The paired file contains only the cell contents and not the output. Therefore it also is much better suited for revision control, since the differences between versions are limited to the cells and these file formats yield more meaningful text differences than the default notebook storage format.

    + +

    Creating a paired file in python format for efficient refactoring

    + +

    From your notebook, go to the file menu and navigate to the jupytext submenu. Select the light script pairing option. This will create a *.py file version with the same basename as your notebook file.

    + +
    Jupytext menu
    + +

    You can edit that file separately in your favourite python editor. The markdown text parts will be conserved in the file in the form of python comments.

    + +

    When you save the file and do a browser page reload of your jupyter notebook, you will see all the changes carried over into your jupyter notebook.

    + +

    Creating a paired file in mardown format for efficient text authoring

    + +

    If you want to efficiently work on the descriptive text base of your notebook, just pair it using the Pair notebook with Markdown menu item and edit the generated *.md file with your favourite Markdown editor.

    + +

    Disable autosaving when working on the paired file

    + +

    Your notebooks usually auto save every 2 min (default). Turn this feature off when working with the paired file. Otherwise Jupyter will continue to save the state while you are editing the paired file, and the changes will be synced to the disk version of the paired file. You can disable the autosave by unchecking the Autosave notebook menu item in the Juytext menu (see above image).

    + +

    Further information

    + +

    Please refer to

    + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin6/kerberos.html b/merlin6/kerberos.html new file mode 100644 index 0000000..ea18d49 --- /dev/null +++ b/merlin6/kerberos.html @@ -0,0 +1,959 @@ + + + + + + + + +Kerberos and AFS authentication | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Kerberos and AFS authentication

    +
    + + + +
    + + +
    This document describes how to use Kerberos.
    + + + + + + + +
    + + + + + + +

    Projects and users have their own areas in the central PSI AFS service. In order +to access to these areas, valid Kerberos and AFS tickets must be granted.

    + +

    These tickets are automatically granted when accessing through SSH with +username and password. Alternatively, one can get a granting ticket with the kinit (Kerberos) +and aklog (AFS ticket, which needs to be run after kinit) commands.

    + +

    Due to PSI security policies, the maximum lifetime of the ticket is 7 days, and the default +time is 10 hours. It means than one needs to constantly renew (krenew command) the existing +granting tickets, and their validity can not be extended longer than 7 days. At this point, +one needs to obtain new granting tickets.

    + +

    Obtaining granting tickets with username and password

    + +

    As already described above, the most common use case is to obtain Kerberos and AFS granting tickets +by introducing username and password:

    +
      +
    • When login to Merlin through SSH protocol, if this is done with username + password authentication, +tickets for Kerberos and AFS will be automatically obtained.
    • +
    • When login to Merlin through NoMachine, no Kerberos and AFS are granted. Therefore, users need to +run kinit (to obtain a granting Kerberos ticket) followed by aklog (to obtain a granting AFS ticket). +See further details below.
    • +
    + +

    To manually obtain granting tickets, one has to:

    +
      +
    1. To obtain a granting Kerberos ticket, one needs to run kinit $USER and enter the PSI password. +
      kinit $USER@D.PSI.CH
      +
      +
    2. +
    3. To obtain a granting ticket for AFS, one needs to run aklog. No password is necessary, but a valid +Kerberos ticket is mandatory. +
      aklog
      +
      +
    4. +
    5. To list the status of your granted tickets, users can use the klist command. +
      klist
      +
      +
    6. +
    7. To extend the validity of existing granting tickets, users can use the krenew command. +
      krenew
      +
      +
        +
      • Keep in mind that the maximum lifetime for granting tickets is 7 days, therefore krenew can not be used beyond that limit, +and then `kinit** should be used instead.
      • +
      +
    8. +
    + +

    Obtanining granting tickets with keytab

    + +

    Sometimes, obtaining granting tickets by using password authentication is not possible. An example are user Slurm jobs +requiring access to private areas in AFS. For that, there’s the possibility to generate a keytab file.

    + +

    Be aware that the keytab file must be private, fully protected by correct permissions and not shared with any +other users.

    + +

    Creating a keytab file

    + +

    For generating a keytab, one has to:

    + +
      +
    1. Load a newer Kerberos ( krb5/1.20 or higher) from Pmodules: +
      module load krb5/1.20
      +
      +
    2. +
    3. Create a private directory for storing the Kerberos keytab file +
      mkdir -p ~/.k5
      +
      +
    4. +
    5. Run the ktutil utility which comes with the loaded krb5 Pmodule: +
      ktutil
      +
      +
    6. +
    7. In the ktutil console, one has to generate a keytab file as follows: +
      # Replace $USER by your username
      +add_entry -password -k 0 -f -p $USER
      +wkt /psi/home/$USER/.k5/krb5.keytab
      +exit
      +
      +

      Notice that you will need to add your password once. This step is required for generating the keytab file.

      +
    8. +
    9. Once back to the main shell, one has to ensure that the file contains the proper permissions: +
      chmod 0600 ~/.k5/krb5.keytab
      +
      +
    10. +
    + +

    Obtaining tickets by using keytab files

    + +

    Once the keytab is created, one can obtain kerberos tickets without being prompted for a password as follows:

    + +
    kinit -kt ~/.k5/krb5.keytab $USER
    +aklog
    +
    + +

    Slurm jobs accessing AFS

    + +

    Some jobs may require to access private areas in AFS. For that, having a valid keytab file is required. +Then, from inside the batch script one can obtain granting tickets for Kerberos and AFS, which can be used for accessing AFS private areas.

    + +

    The steps should be the following:

    + +
      +
    • Setup KRB5CCNAME, which can be used to specify the location of the Kerberos5 credentials (ticket) cache. In general it should point to a shared area +($HOME/.k5 is a good location), and is strongly recommended to generate an independent Kerberos5 credential cache (it is, creating a new credential cache per Slurm job): +
      export KRB5CCNAME="$(mktemp "$HOME/.k5/krb5cc_XXXXXX")"
      +
      +
    • +
    • To obtain a Kerberos5 granting ticket, run kinit by using your keytab: +
      kinit -kt "$HOME/.k5/krb5.keytab" $USER@D.PSI.CH
      +
      +
    • +
    • To obtain a granting AFS ticket, run aklog: +
      aklog
      +
      +
    • +
    • At the end of the job, you can remove destroy existing Kerberos tickets. +
      kdestroy
      +
      +
    • +
    + +

    Slurm batch script example: obtaining KRB+AFS granting tickets

    + +

    Example 1: Independent crendetial cache per Slurm job

    + +

    This is the recommended way. At the end of the job, is strongly recommended to remove / destroy the existing kerberos tickets.

    + +
    #!/bin/bash
    +#SBATCH --partition=hourly            # Specify 'general' or 'daily' or 'hourly'
    +#SBATCH --time=01:00:00               # Strictly recommended when using 'general' partition.
    +#SBATCH --output=run.out              # Generate custom output file
    +#SBATCH --error=run.err               # Generate custom error  file
    +#SBATCH --nodes=1                     # Uncomment and specify #nodes to use
    +#SBATCH --ntasks=1                    # Uncomment and specify #nodes to use 
    +#SBATCH --cpus-per-task=1
    +#SBATCH --constraint=xeon-gold-6152
    +#SBATCH --hint=nomultithread
    +#SBATCH --job-name=krb5
    +
    +export KRB5CCNAME="$(mktemp "$HOME/.k5/krb5cc_XXXXXX")"
    +kinit -kt "$HOME/.k5/krb5.keytab" $USER@D.PSI.CH
    +aklog
    +klist
    +
    +echo "Here should go my batch script code."
    +
    +# Destroy Kerberos tickets created for this job only
    +kdestroy
    +klist
    +
    + +

    Example 2: Shared credential cache

    + +

    Some users may need/prefer to run with a shared cache file. For doing that, one needs to +setup KRB5CCNAME from the login node session, before submitting the job.

    + +
    export KRB5CCNAME="$(mktemp "$HOME/.k5/krb5cc_XXXXXX")"
    +
    + +

    Then, you can run one or multiple jobs scripts (or parallel job with srun). KRB5CCNAME will be propagated to the +job script or to the parallel job, therefore a single credential cache will be shared amongst different Slurm runs.

    + +
    
    +#!/bin/bash
    +#SBATCH --partition=hourly            # Specify 'general' or 'daily' or 'hourly'
    +#SBATCH --time=01:00:00               # Strictly recommended when using 'general' partition.
    +#SBATCH --output=run.out              # Generate custom output file
    +#SBATCH --error=run.err               # Generate custom error  file
    +#SBATCH --nodes=1                     # Uncomment and specify #nodes to use
    +#SBATCH --ntasks=1                    # Uncomment and specify #nodes to use 
    +#SBATCH --cpus-per-task=1
    +#SBATCH --constraint=xeon-gold-6152
    +#SBATCH --hint=nomultithread
    +#SBATCH --job-name=krb5
    +
    +# KRB5CCNAME is inherit from the login node session
    +kinit -kt "$HOME/.k5/krb5.keytab" $USER@D.PSI.CH
    +aklog
    +klist
    +
    +echo "Here should go my batch script code."
    +
    +echo "No need to run 'kdestroy', as it may have to survive for running other jobs"
    +
    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin6/known-problems.html b/merlin6/known-problems.html new file mode 100644 index 0000000..3ea9c25 --- /dev/null +++ b/merlin6/known-problems.html @@ -0,0 +1,932 @@ + + + + + + + + +Known Problems | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Known Problems

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    Common errors

    + +

    Illegal instruction error

    + +

    It may happened that your code, compiled on one machine will not be executed on another throwing exception like “(Illegal instruction)”. +This is usually because the software was compiled with a set of instructions newer than the ones available in the node where the software runs, +and it mostly depends on the processor generation.

    + +

    In example, merlin-l-001 and merlin-l-002 contain a newer generation of processors than the old GPUs nodes, or than the Merlin5 cluster. +Hence, unless one compiles the software with compatibility with set of instructions from older processors, it will not run on old nodes. +Sometimes, this is properly set by default at the compilation time, but sometimes is not.

    + +

    For GCC, please refer to GCC x86 Options for compiling options. In case of doubts, contact us.

    + +

    Slurm

    + +

    sbatch using one core despite setting -c/–cpus-per-task

    + +

    From Slurm v22.05.6, the behavior of srun has changed. Merlin has been updated to this version since Tuesday 13.12.2022.

    + +

    srun will no longer read in SLURM_CPUS_PER_TASK, which is typically set when defining -c/--cpus-per-task in the sbatch command. +This means you will implicitly have to specify -c\--cpus-per-task also on your srun calls, or set the new SRUN_CPUS_PER_TASK environment variable to accomplish the same thing. +Therefore, unless this is implicitly specified, srun will use only one Core per task (resulting in 2 CPUs per task when multithreading is enabled)

    + +

    An example for setting up srun with -c\--cpus-per-task:

    +
    (base)[caubet_m@merlin-l-001:/data/user/caubet_m]# cat mysbatch_method1
    +#!/bin/bash
    +#SBATCH -n 1
    +#SBATCH --cpus-per-task=8
    +
    +echo 'From Slurm v22.05.8 srun does not inherit $SLURM_CPUS_PER_TASK'
    +srun python -c "import os; print(os.sched_getaffinity(0))"
    +
    +echo 'One has to implicitly specify $SLURM_CPUS_PER_TASK'
    +echo 'In this example, by setting -c/--cpus-per-task in srun'
    +srun --cpus-per-task=$SLURM_CPUS_PER_TASK python -c "import os; print(os.sched_getaffinity(0))"
    +
    +(base)[caubet_m@merlin-l-001:/data/user/caubet_m]# sbatch mysbatch_method1
    +Submitted batch job 8000813
    +
    +(base)[caubet_m@merlin-l-001:/data/user/caubet_m]# cat slurm-8000813.out 
    +From Slurm v22.05.8 srun does not inherit $SLURM_CPUS_PER_TASK
    +{1, 45}
    +One has to implicitly specify $SLURM_CPUS_PER_TASK
    +In this example, by setting -c/--cpus-per-task in srun
    +{1, 2, 3, 4, 45, 46, 47, 48}
    +
    + +

    An example to accomplish the same thing with the SRUN_CPUS_PER_TASK environment variable:

    +
    (base)[caubet_m@merlin-l-001:/data/user/caubet_m]# cat mysbatch_method2
    +#!/bin/bash
    +#SBATCH -n 1
    +#SBATCH --cpus-per-task=8
    +
    +echo 'From Slurm v22.05.8 srun does not inherit $SLURM_CPUS_PER_TASK'
    +srun python -c "import os; print(os.sched_getaffinity(0))"
    +
    +echo 'One has to implicitly specify $SLURM_CPUS_PER_TASK'
    +echo 'In this example, by setting an environment variable SRUN_CPUS_PER_TASK'
    +export SRUN_CPUS_PER_TASK=$SLURM_CPUS_PER_TASK
    +srun python -c "import os; print(os.sched_getaffinity(0))"
    +
    +
    +(base)[caubet_m@merlin-l-001:/data/user/caubet_m]# sbatch mysbatch_method2
    +Submitted batch job 8000815
    +
    +(base)[caubet_m@merlin-l-001:/data/user/caubet_m]# cat slurm-8000815.out 
    +From Slurm v22.05.8 srun does not inherit $SLURM_CPUS_PER_TASK
    +{1, 45}
    +One has to implicitly specify $SLURM_CPUS_PER_TASK
    +In this example, by setting an environment variable SRUN_CPUS_PER_TASK
    +{1, 2, 3, 4, 45, 46, 47, 48}
    +
    + +

    General topics

    + +

    Default SHELL

    + +

    In general, /bin/bash is the recommended default user’s SHELL when working in Merlin.

    + +

    Some users might notice that BASH is not the default SHELL when logging in to Merlin systems, or they might need to run a different SHELL. +This is probably because when the PSI account was requested, no SHELL description was specified or a different one was requested explicitly by the requestor. +Users can check which is the default SHELL specified in the PSI account with the following command:

    + +
    getent passwd $USER | awk -F: '{print $NF}'
    +
    + +

    If SHELL does not correspond to the one you need to use, you should request a central change for it. +This is because Merlin accounts are central PSI accounts. Hence, change must be requested via PSI Service Now.

    + +

    Alternatively, if you work on other PSI Linux systems but for Merlin you need a different SHELL type, a temporary change can be performed during login startup. +You can update one of the following files:

    +
      +
    • ~/.login
    • +
    • ~/.profile
    • +
    • Any rc or profile file in your home directory (i.e. .cshrc, .bashrc, .bash_profile, etc.)
    • +
    + +

    with the following lines:

    + +
    # Replace MY_SHELL with the bash type you need
    +MY_SHELL=/bin/bash
    +exec $MY_SHELL -l
    +
    + +

    Notice that available shells can be found in the following file:

    + +
    cat /etc/shells
    +
    + +

    3D acceleration: OpenGL vs Mesa

    + +

    Some applications can run with OpenGL support. This is only possible when the node contains a GPU card.

    + +

    In general, X11 with Mesa Driver is the recommended method as it will work in all cases (no need of GPUs). In example, for ParaView:

    + +
    module load paraview
    +paraview-mesa paraview   # 'paraview --mesa' for old releases
    +
    + +

    However, if one needs to run with OpenGL support, this is still possible by running vglrun. In example, for running Paraview:

    + +
    module load paraview
    +vglrun paraview
    +
    + +

    Officially, the supported method for running vglrun is by using the NoMachine remote desktop. +Running vglrun it’s also possible using SSH with X11 Forwarding. However, it’s very slow and it’s only recommended when running +in Slurm (from NoMachine). Please, avoid running vglrun over SSH from a desktop or laptop.

    + +

    Software

    + +

    ANSYS

    + +

    Sometimes, running ANSYS/Fluent requires X11 support. For that, one should run fluent as follows.

    + +
    module load ANSYS
    +fluent -driver x11
    +
    + +

    Paraview

    + +

    For running Paraview, one can run it with Mesa support or OpenGL support. Please refer to OpenGL vs Mesa for +further information about how to run it.

    + +

    Module command not found

    + +

    In some circumstances the module command may not be initialized properly. For instance, you may see the following error upon logon:

    + +
    bash: module: command not found
    +
    + +

    The most common cause for this is a custom .bashrc file which fails to source the global /etc/bashrc responsible for setting up PModules in some OS versions. To fix this, add the following to $HOME/.bashrc:

    + +
    if [ -f /etc/bashrc ]; then
    +    . /etc/bashrc
    +fi
    +
    + +

    It can also be fixed temporarily in an existing terminal by running . /etc/bashrc manually.

    + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin6/merlin-rmount.html b/merlin6/merlin-rmount.html new file mode 100644 index 0000000..e9387bd --- /dev/null +++ b/merlin6/merlin-rmount.html @@ -0,0 +1,865 @@ + + + + + + + + +Using merlin_rmount | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Using merlin_rmount

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    Background

    + +

    Merlin provides a command for mounting remote file systems, called merlin_rmount. This +provides a helpful wrapper over the Gnome storage utilities (GIO and GVFS), and provides support for a wide range of remote file formats, including

    +
      +
    • SMB/CIFS (Windows shared folders)
    • +
    • WebDav
    • +
    • AFP
    • +
    • FTP, SFTP
    • +
    • complete list
    • +
    + +

    Usage

    + +

    Start a session

    + +

    First, start a new session. This will start a new bash shell in the current terminal where you can add further commands.

    + +
    $ merlin_rmount --init
    +[INFO] Starting new D-Bus RMOUNT session
    +
    +(RMOUNT STARTED) [bliven_s@merlin-l-002 ~]$
    +
    + +

    Note that behind the scenes this is creating a new dbus daemon. Running multiple daemons on the same login node leads to unpredictable results, so it is best not to initialize multiple sessions in parallel.

    + +

    Standard Endpoints

    + +

    Standard endpoints can be mounted using

    + +
    merlin_rmount --select-mount
    +
    + +

    Select the desired url using the arrow keys.

    + +

    merlin_rmount --select-mount

    + +

    From this list any of the standard supported endpoints can be mounted.

    + +

    Other endpoints

    + +

    Other endpoints can be mounted using the merlin_rmount --mount <endpoint> command.

    + +

    merlin_rmount --mount

    + +

    Accessing Files

    + +

    After mounting a volume the script will print the mountpoint. It should be of the form

    + +
    /run/user/$UID/gvfs/<endpoint>
    +
    + +

    where $UID gives your unix user id (a 5-digit number, also viewable with id -u) and +<endpoint> is some string generated from the mount options.

    + +

    For convenience, it may be useful to add a symbolic link for this gvfs directory. For instance, this would allow all volumes to be accessed in ~/mnt/:

    + +
    ln -s ~/mnt /run/user/$UID/gvfs
    +
    + +

    Files are accessible as long as the merlin_rmount shell remains open.

    + +

    Disconnecting

    + +

    To disconnect, close the session with one of the following:

    + +
      +
    • The exit command
    • +
    • CTRL-D
    • +
    • Closing the terminal
    • +
    + +

    Disconnecting will unmount all volumes.

    + +

    Alternatives

    + +

    Thunar

    + +

    Users that prefer a GUI file browser may prefer the thunar command, which opens the Gnome File Browser. This is also available in NoMachine sessions in the bottom bar (1). Thunar supports the same remote filesystems as merlin_rmount; just type the URL in the address bar (2).

    + +

    Mounting with thunar

    + +

    When using thunar within a NoMachine session, file transfers continue after closing NoMachine (as long as the NoMachine session stays active).

    + +

    Files can also be accessed at the command line as needed (see ‘Accessing Files’ above).

    + +

    Resources

    + + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin6/migrating.html b/merlin6/migrating.html new file mode 100644 index 0000000..5946690 --- /dev/null +++ b/merlin6/migrating.html @@ -0,0 +1,988 @@ + + + + + + + + +Migration From Merlin5 | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Migration From Merlin5

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    Directories

    + +

    Merlin5 vs Merlin6

    + + + + + + + + + + + + + + + + + + + + + + + + +
    ClusterHome DirectoryUser Home DirectoryGroup Home Directory
    merlin5/gpfs/home/$username/gpfs/data/$username/gpfs/group/$laboratory
    merlin6/psi/home/$username/data/user/$username/data/project/[general|bio]/$projectname
    + +

    Quota limits in Merlin6

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    DirectoryQuota_Type [Soft:Hard] (Block)Quota_Type [Soft:Hard] (Files)Quota Change Policy: BlockQuota Change Policy: Files
    /psi/home/$usernameUSR [10GB:11GB]UndefUp to x2 when strictly justified.N/A
    /data/user/$usernameUSR [1TB:1.074TB]USR [1M:1.1M]Inmutable. Need a project.Changeable when justified.
    /data/project/bio/$projectnameGRP+Fileset [1TB:1.074TB]GRP+Fileset [1M:1.1M]Changeable according to project requirements.Changeable according to project requirements.
    /data/project/general/$projectnameGRP+Fileset [1TB:1.074TB]GRP+Fileset [1M:1.1M]Changeable according to project requirements.Changeable according to project requirements.
    + +

    where:

    +
      +
    • Block is capacity size in GB and TB
    • +
    • Files is number of files + directories in Millions (M)
    • +
    • Quota types are the following: +
        +
      • USR: Quota is setup individually per user name
      • +
      • GRP: Quota is setup individually per Unix Group name
      • +
      • Fileset: Quota is setup per project root directory.
      • +
      +
    • +
    • User data directory /data/user has a strict user block quota limit policy. If more disk space is required, ‘project’ must be created.
    • +
    • Soft quotas can be exceeded for short periods of time. Hard quotas cannot be exceeded.
    • +
    + +

    Project directory

    + +

    Why is ‘project’ needed?

    + +

    Merlin6 introduces the concept of a project directory. These are the recommended location for all scientific data.

    + +
      +
    • /data/user is not suitable for sharing data between users
    • +
    • The Merlin5 group directories were a similar concept, but the association with a single organizational group made +interdepartmental sharing difficult. Projects can be shared by any PSI user.
    • +
    • Projects are shared by multiple users (at a minimum they should be shared with the supervisor/PI). This decreases +the chance of data being orphaned by personnel changes.
    • +
    • Shared projects are preferable to individual data for transparency and accountability in event of future questions +regarding the data.
    • +
    • One project member is designated as responsible. Responsibility can be transferred if needed.
    • +
    + +

    Requesting a project

    + +

    Refer to Requesting a project

    + +
    + +

    Migration Schedule

    + +

    Phase 1 [June]: Pre-migration

    + +
      +
    • Users keep working on Merlin5 +
        +
      • Merlin5 production directories: '/gpfs/home/', '/gpfs/data', '/gpfs/group'
      • +
      +
    • +
    • Users may raise any problems (quota limits, unaccessible files, etc.) to merlin-admins@lists.psi.ch
    • +
    • Users can start migrating data (see Migration steps) +
        +
      • Users should copy their data from Merlin5 /gpfs/data to Merlin6 /data/user
      • +
      • Users should copy their home from Merlin5 /gpfs/home to Merlin6 /psi/home
      • +
      +
    • +
    • Users should inform when migration is done, and which directories were migrated. Deletion for such directories can be requested by admins.
    • +
    + +

    Phase 2 [July-October]: Migration to Merlin6

    + +
      +
    • Merlin6 becomes official cluster, and directories are switched to the new structure: +
        +
      • Merlin6 production directories: '/psi/home/', '/data/user', '/data/project'
      • +
      • Merlin5 directories available in RW in login nodes: '/gpfs/home/', '/gpfs/data', '/gpfs/group' +
          +
        • In Merlin5 computing nodes, Merlin5 directories are mounted in RW: '/gpfs/home/', '/gpfs/data', '/gpfs/group'
        • +
        • In Merlin5 computing nodes, Merlin6 directories are mounted in RW: '/psi/home/', '/data/user', '/data/project'
        • +
        +
      • +
      +
    • +
    • Users must migrate their data (see Migration steps) +
        +
      • ALL data must be migrated
      • +
      +
    • +
    • Job submissions by default to Merlin6. Submission to Merlin5 computing nodes possible.
    • +
    • Users should inform when migration is done, and which directories were migrated. Deletion for such directories can be requested by admins.
    • +
    + +

    Phase 3 [November]: Merlin5 Decomission

    + +
      +
    • Old Merlin5 storage unmounted.
    • +
    • Migrated directories reported by users will be deleted.
    • +
    • Remaining Merlin5 data will be archived.
    • +
    + +
    + +

    Migration steps

    + +

    Cleanup / Archive files

    + +
      +
    • Users must cleanup and/or archive files, according to the quota limits for the target storage.
    • +
    • If extra space is needed, we advise users to request a project
    • +
    • If you need a larger quota in respect to the maximal allowed number of files, you can request an increase of your user quota.
    • +
    + +

    File list

    + +

    Step 1: Migrating

    + +

    First migration:

    + +
    rsync -avAHXS <source_merlin5> <destination_merlin6>
    +rsync -avAHXS /gpfs/data/$username/* /data/user/$username
    +
    + +

    This can take several hours or days:

    +
      +
    • You can try to parallelize multiple rsync commands in sub-directories for increasing transfer rate.
    • +
    • Please do not parallelize many concurrent directories. Let’s say, don’t add more than 10 together. +
        +
      • We may have other users doing the same and it could cause storage / UI performance problems in the Merlin5 cluster.
      • +
      +
    • +
    + +

    Step 2: Mirroring

    + +

    Once first migration is done, a second rsync should be ran. This is done with --delete. With this option rsync will +behave in a way where it will delete from the destination all files that were removed in the source, but also will propagate +new files from the source to the destination.

    + +
    rsync -avAHXS --delete <source_merlin5> <destination_merlin6>
    +rsync -avAHXS --delete /gpfs/data/$username/* /data/user/$username
    +
    + +

    Step 3: Removing / Archiving old data

    + +

    Removing migrated data

    + +

    Once you ensure that everything is migrated to the new storage, data is ready to be deleted from the old storage. +Users must report when migration is finished and report which directories are affected and ready to be removed.

    + +

    Merlin administrators will remove the directories, always asking for a last confirmation.

    + +

    Archiving data

    + +

    Once all migrated data has been removed from the old storage, missing data will be archived.

    + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin6/monitoring.html b/merlin6/monitoring.html new file mode 100644 index 0000000..afb1c86 --- /dev/null +++ b/merlin6/monitoring.html @@ -0,0 +1,1061 @@ + + + + + + + + +Monitoring | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Monitoring

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    Slurm Monitoring

    + +

    Job status

    + +

    The status of submitted jobs can be check with the squeue command:

    + +
    squeue -u $username
    +
    + +

    Common statuses:

    + +
      +
    • merlin-*: Running on the specified host
    • +
    • (Priority): Waiting in the queue
    • +
    • (Resources): At the head of the queue, waiting for machines to become available
    • +
    • (AssocGrpCpuLimit), (AssocGrpNodeLimit): Job would exceed per-user limitations on +the number of simultaneous CPUs/Nodes. Use scancel to remove the job and +resubmit with fewer resources, or else wait for your other jobs to finish.
    • +
    • (PartitionNodeLimit): Exceeds all resources available on this partition. +Run scancel and resubmit to a different partition (-p) or with fewer +resources.
    • +
    + +

    Check in the man pages (man squeue) for all possible options for this command.

    + +
    +[Show 'squeue' example] +
    +[root@merlin-slurmctld01 ~]# squeue -u feichtinger
    +             JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
    +         134332544   general spawner- feichtin  R 5-06:47:45      1 merlin-c-204
    +         134321376   general subm-tal feichtin  R 5-22:27:59      1 merlin-c-204
    +
    +
    + +

    Partition status

    + +

    The status of the nodes and partitions (a.k.a. queues) can be seen with the sinfo command:

    + +
    sinfo
    +
    + +

    Check in the man pages (man sinfo) for all possible options for this command.

    + +
    +[Show 'sinfo' example] +
    +[root@merlin-l-001 ~]# sinfo -l
    +Thu Jan 23 16:34:49 2020
    +PARTITION AVAIL  TIMELIMIT   JOB_SIZE ROOT OVERSUBS     GROUPS  NODES       STATE NODELIST
    +test         up 1-00:00:00 1-infinite   no       NO        all      3       mixed merlin-c-[024,223-224]
    +test         up 1-00:00:00 1-infinite   no       NO        all      2   allocated merlin-c-[123-124]
    +test         up 1-00:00:00 1-infinite   no       NO        all      1        idle merlin-c-023
    +general*     up 7-00:00:00       1-50   no       NO        all      6       mixed merlin-c-[007,204,207-209,219]
    +general*     up 7-00:00:00       1-50   no       NO        all     57   allocated merlin-c-[001-005,008-020,101-122,201-203,205-206,210-218,220-222]
    +general*     up 7-00:00:00       1-50   no       NO        all      3        idle merlin-c-[006,021-022]
    +daily        up 1-00:00:00       1-60   no       NO        all      9       mixed merlin-c-[007,024,204,207-209,219,223-224]
    +daily        up 1-00:00:00       1-60   no       NO        all     59   allocated merlin-c-[001-005,008-020,101-124,201-203,205-206,210-218,220-222]
    +daily        up 1-00:00:00       1-60   no       NO        all      4        idle merlin-c-[006,021-023]
    +hourly       up    1:00:00 1-infinite   no       NO        all      9       mixed merlin-c-[007,024,204,207-209,219,223-224]
    +hourly       up    1:00:00 1-infinite   no       NO        all     59   allocated merlin-c-[001-005,008-020,101-124,201-203,205-206,210-218,220-222]
    +hourly       up    1:00:00 1-infinite   no       NO        all      4        idle merlin-c-[006,021-023]
    +gpu          up 7-00:00:00 1-infinite   no       NO        all      1       mixed merlin-g-007
    +gpu          up 7-00:00:00 1-infinite   no       NO        all      8   allocated merlin-g-[001-006,008-009]
    +
    +
    + +

    Slurm commander

    + +

    The Slurm Commander (scom) is a simple but very useful open source text-based user interface for +simple and efficient interaction with Slurm. It is developed by the CLoud Infrastructure Project (CLIP-HPC) and external contributions. To use it, one can +simply run the following command:

    + +
    scom                         # merlin6 cluster
    +SLURM_CLUSTERS=merlin5  scom # merlin5 cluster
    +SLURM_CLUSTERS=gmerlin6 scom # gmerlin6 cluster
    +scom -h                      # Help and extra options
    +scom -d 14                   # Set Job History to 14 days (instead of default 7)
    +
    +

    With this simple interface, users can interact with their jobs, as well as getting information about past and present jobs:

    +
      +
    • Filtering jobs by substring is possible with the / key.
    • +
    • Users can perform multiple actions on their jobs (such like cancelling, holding or requeing a job), SSH to a node with an already running job, +or getting extended details and statistics of the job itself.
    • +
    + +

    Also, users can check the status of the cluster, to get statistics and node usage information as well as getting information about node properties.

    + +

    The interface also provides a few job templates for different use cases (i.e. MPI, OpenMP, Hybrid, single core). Users can modify these templates, +save it locally to the current directory, and submit the job to the cluster.

    + + + +

    For further information about how to use scom, please refer to the Slurm Commander Project webpage

    + +

    'scom' text-based user interface

    + +

    Job accounting

    + +

    Users can check detailed information of jobs (pending, running, completed, failed, etc.) with the sacct command. +This command is very flexible and can provide a lot of information. For checking all the available options, please read man sacct. +Below, we summarize some examples that can be useful for the users:

    + +
    # Today jobs, basic summary
    +sacct
    +
    +# Today jobs, with details
    +sacct --long
    +
    +# Jobs from January 1, 2022, 12pm, with details
    +sacct -S 2021-01-01T12:00:00 --long
    +
    +# Specific job accounting
    +sacct --long -j $jobid
    +
    +# Jobs custom details, without steps (-X)
    +sacct -X --format=User%20,JobID,Jobname,partition,state,time,submit,start,end,elapsed,AveRss,MaxRss,MaxRSSTask,MaxRSSNode%20,MaxVMSize,nnodes,ncpus,ntasks,reqcpus,totalcpu,reqmem,cluster,TimeLimit,TimeLimitRaw,cputime,nodelist%50,AllocTRES%80
    +
    +# Jobs custom details, with steps
    +sacct --format=User%20,JobID,Jobname,partition,state,time,submit,start,end,elapsed,AveRss,MaxRss,MaxRSSTask,MaxRSSNode%20,MaxVMSize,nnodes,ncpus,ntasks,reqcpus,totalcpu,reqmem,cluster,TimeLimit,TimeLimitRaw,cputime,nodelist%50,AllocTRES%80
    +
    + +

    Job efficiency

    + +

    Users can check how efficient are their jobs. For that, the seff command is available.

    + +
    seff $jobid
    +
    + +
    +[Show 'seff' example] +
    +[root@merlin-slurmctld01 ~]# seff 134333893
    +Job ID: 134333893
    +Cluster: merlin6
    +User/Group: albajacas_a/unx-sls
    +State: COMPLETED (exit code 0)
    +Nodes: 1
    +Cores per node: 8
    +CPU Utilized: 00:26:15
    +CPU Efficiency: 49.47% of 00:53:04 core-walltime
    +Job Wall-clock time: 00:06:38
    +Memory Utilized: 60.73 MB
    +Memory Efficiency: 0.19% of 31.25 GB
    +
    +
    + +

    List job attributes

    + +

    The sjstat command is used to display statistics of jobs under control of SLURM. To use it

    + +
    sjstat
    +
    + +
    +[Show 'sjstat' example] +
    +[root@merlin-l-001 ~]# sjstat -v
    +
    +Scheduling pool data:
    +----------------------------------------------------------------------------------
    +                           Total  Usable   Free   Node   Time      Other          
    +Pool         Memory  Cpus  Nodes   Nodes  Nodes  Limit  Limit      traits         
    +----------------------------------------------------------------------------------
    +test        373502Mb    88      6       6      1  UNLIM 1-00:00:00   
    +general*    373502Mb    88     66      66      8     50 7-00:00:00   
    +daily       373502Mb    88     72      72      9     60 1-00:00:00   
    +hourly      373502Mb    88     72      72      9  UNLIM   01:00:00   
    +gpu         128000Mb     8      1       1      0  UNLIM 7-00:00:00   
    +gpu         128000Mb    20      8       8      0  UNLIM 7-00:00:00   
    +
    +Running job data:
    +---------------------------------------------------------------------------------------------------
    +                                                 Time        Time            Time                  
    +JobID    User      Procs Pool      Status        Used       Limit         Started  Master/Other    
    +---------------------------------------------------------------------------------------------------
    +13433377 collu_g       1 gpu       PD            0:00    24:00:00             N/A  (Resources)
    +13433389 collu_g      20 gpu       PD            0:00    24:00:00             N/A  (Resources)
    +13433382 jaervine      4 gpu       PD            0:00    24:00:00             N/A  (Priority)
    +13433386 barret_d     20 gpu       PD            0:00    24:00:00             N/A  (Priority)
    +13433382 pamula_f     20 gpu       PD            0:00   168:00:00             N/A  (Priority)
    +13433387 pamula_f      4 gpu       PD            0:00    24:00:00             N/A  (Priority)
    +13433365 andreani    132 daily     PD            0:00    24:00:00             N/A  (Dependency)
    +13433388 marino_j      6 gpu       R          1:43:12   168:00:00  01-23T14:54:57  merlin-g-007
    +13433377 choi_s       40 gpu       R          2:09:55    48:00:00  01-23T14:28:14  merlin-g-006
    +13433373 qi_c         20 gpu       R          7:00:04    24:00:00  01-23T09:38:05  merlin-g-004
    +13433390 jaervine      2 gpu       R             5:18    24:00:00  01-23T16:32:51  merlin-g-007
    +13433390 jaervine      2 gpu       R            15:18    24:00:00  01-23T16:22:51  merlin-g-007
    +13433375 bellotti      4 gpu       R          7:35:44     9:00:00  01-23T09:02:25  merlin-g-001
    +13433358 bellotti      1 gpu       R       1-05:52:19   144:00:00  01-22T10:45:50  merlin-g-007
    +13433377 lavriha_     20 gpu       R          5:13:24    24:00:00  01-23T11:24:45  merlin-g-008
    +13433370 lavriha_     40 gpu       R         22:43:09    24:00:00  01-22T17:55:00  merlin-g-003
    +13433373 qi_c         20 gpu       R         15:03:15    24:00:00  01-23T01:34:54  merlin-g-002
    +13433371 qi_c          4 gpu       R         22:14:14   168:00:00  01-22T18:23:55  merlin-g-001
    +13433254 feichtin      2 general   R       5-07:26:11   156:00:00  01-18T09:11:58  merlin-c-204
    +13432137 feichtin      2 general   R       5-23:06:25   160:00:00  01-17T17:31:44  merlin-c-204
    +13433389 albajaca     32 hourly    R            41:19     1:00:00  01-23T15:56:50  merlin-c-219
    +13433387 riemann_      2 general   R          1:51:47     4:00:00  01-23T14:46:22  merlin-c-204
    +13433370 jimenez_      2 general   R         23:20:45   168:00:00  01-22T17:17:24  merlin-c-106
    +13433381 jimenez_      2 general   R          4:55:33   168:00:00  01-23T11:42:36  merlin-c-219
    +13433390 sayed_m     128 daily     R            21:49    10:00:00  01-23T16:16:20  merlin-c-223
    +13433359 adelmann      2 general   R       1-05:00:09    48:00:00  01-22T11:38:00  merlin-c-204
    +13433377 zimmerma      2 daily     R          6:13:38    24:00:00  01-23T10:24:31  merlin-c-007
    +13433375 zohdirad     24 daily     R          7:33:16    10:00:00  01-23T09:04:53  merlin-c-218
    +13433363 zimmerma      6 general   R       1-02:54:20    47:50:00  01-22T13:43:49  merlin-c-106
    +13433376 zimmerma      6 general   R          7:25:42    23:50:00  01-23T09:12:27  merlin-c-007
    +13433371 vazquez_     16 daily     R         21:46:31    23:59:00  01-22T18:51:38  merlin-c-106
    +13433382 vazquez_     16 daily     R          4:09:23    23:59:00  01-23T12:28:46  merlin-c-024
    +13433376 jiang_j1    440 daily     R          7:11:14    10:00:00  01-23T09:26:55  merlin-c-123
    +13433376 jiang_j1     24 daily     R          7:08:19    10:00:00  01-23T09:29:50  merlin-c-220
    +13433384 kranjcev    440 daily     R          2:48:19    24:00:00  01-23T13:49:50  merlin-c-108
    +13433371 vazquez_     16 general   R         20:15:15   120:00:00  01-22T20:22:54  merlin-c-210
    +13433371 vazquez_     16 general   R         21:15:51   120:00:00  01-22T19:22:18  merlin-c-210
    +13433374 colonna_    176 daily     R          8:23:18    24:00:00  01-23T08:14:51  merlin-c-211
    +13433374 bures_l      88 daily     R         10:45:06    24:00:00  01-23T05:53:03  merlin-c-001
    +13433375 derlet       88 daily     R          7:32:05    24:00:00  01-23T09:06:04  merlin-c-107
    +13433373 derlet       88 daily     R         17:21:57    24:00:00  01-22T23:16:12  merlin-c-002
    +13433373 derlet       88 daily     R         18:13:05    24:00:00  01-22T22:25:04  merlin-c-112
    +13433365 andreani    264 daily     R          4:10:08    24:00:00  01-23T12:28:01  merlin-c-003
    +13431187 mahrous_     88 general   R       6-15:59:16   168:00:00  01-17T00:38:53  merlin-c-111
    +13433387 kranjcev      2 general   R          1:48:47     4:00:00  01-23T14:49:22  merlin-c-204
    +13433368 karalis_    352 general   R       1-00:05:22    96:00:00  01-22T16:32:47  merlin-c-013
    +13433367 karalis_    352 general   R       1-00:06:44    96:00:00  01-22T16:31:25  merlin-c-118
    +13433385 karalis_    352 general   R          1:37:24    96:00:00  01-23T15:00:45  merlin-c-213
    +13433374 sato        256 general   R         14:55:55    24:00:00  01-23T01:42:14  merlin-c-204
    +13433374 sato         64 general   R         10:43:35    24:00:00  01-23T05:54:34  merlin-c-106
    +67723568 sato         32 general   R         10:40:07    24:00:00  01-23T05:58:02  merlin-c-007
    +13433265 khanppna    440 general   R       3-18:20:58   168:00:00  01-19T22:17:11  merlin-c-008
    +13433375 khanppna    704 general   R          7:31:24    24:00:00  01-23T09:06:45  merlin-c-101
    +13433371 khanppna    616 general   R         21:40:33    24:00:00  01-22T18:57:36  merlin-c-208
    +
    +
    + +

    Graphical user interface

    + +

    When using ssh with X11 forwarding (ssh -XY), or when using NoMachine, users can use sview. +SView is a graphical user interface to view and modify Slurm states. To run sview:

    + +
    ssh -XY $username@merlin-l-001.psi.ch # Not necessary when using NoMachine
    +sview
    +
    + +

    'sview' graphical user interface

    + +

    General Monitoring

    + +

    The following pages contain basic monitoring for Slurm and computing nodes. +Currently, monitoring is based on Grafana + InfluxDB. In the future it will +be moved to a different service based on ElasticSearch + LogStash + Kibana.

    + +

    In the meantime, the following monitoring pages are available in a best effort +support:

    + +

    Merlin6 Monitoring Pages

    + + + +

    Merlin5 Monitoring Pages

    + + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin6/nomachine.html b/merlin6/nomachine.html new file mode 100644 index 0000000..66bd1a6 --- /dev/null +++ b/merlin6/nomachine.html @@ -0,0 +1,887 @@ + + + + + + + + +Remote Desktop Access | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Remote Desktop Access

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    Users can login in Merlin through a Linux Remote Desktop Session. NoMachine +is a desktop virtualization tool. It is similar to VNC, Remote Desktop, etc. +It uses the NX protocol to enable a graphical login to remote servers.

    + +

    Installation

    + +

    NoMachine is available for PSI Windows computers in the Software Kiosk under the +name NX Client. Please use the latest version (at least 6.0). For MacOS and +Linux, the NoMachine client can be downloaded from https://www.nomachine.com/.

    + +

    Accessing Merlin6 NoMachine from PSI

    + +

    The Merlin6 NoMachine service is hosted in the following machine:

    + +
      +
    • merlin-nx.psi.ch
    • +
    + +

    This is the front-end (hence, the door) to the NoMachine back-end nodes, +which contain the NoMachine desktop service. The back-end nodes are the following:

    + +
      +
    • merlin-l-001.psi.ch
    • +
    • merlin-l-002.psi.ch
    • +
    + +

    Any access to the login node desktops must be done through merlin-nx.psi.ch +(or from rem-acc.psi.ch -> merlin-nx.psi.ch when connecting from outside PSI).

    + +

    The front-end service running on merlin-nx.psi.ch will load balance the sessions +and login to any of the available nodes in the back-end.

    + +

    Only 1 session per back-end is possible.

    + +

    Below are explained all the steps necessary for configuring the access to the +NoMachine service running on a login node.

    + +

    Creating a Merlin6 NoMachine connection

    + +

    Adding a new connection to the front-end

    + +

    Click the Add button to create a new connection to the merlin-nx.psi.ch front-end, and fill up +the following fields:

    +
      +
    • Name: Specify a custom name for the connection. Examples: merlin-nx, merlin-nx.psi.ch, Merlin Desktop
    • +
    • Host: Specify the hostname of the front-end service: merlin-nx.psi.ch
    • +
    • Protocol: specify the protocol that will be used for the connection. Recommended protocol: NX
    • +
    • Port: Specify the listening port of the front-end. It must be 4000.
    • +
    + +

    Create New NoMachine Connection

    + +

    Configuring NoMachine Authentication Method

    + +

    Depending on the client version, it may ask for different authentication options. +If it’s required, choose your authentication method and Continue (Password or Kerberos are the recommended ones).

    + +

    You will be requested for the crendentials (username / password). Do not add PSICH\ as a prefix for the username.

    + +

    Opening NoMachine desktop sessions

    + +

    By default, when connecting to the merlin-nx.psi.ch front-end it will automatically open a new +session if none exists.

    + +

    If there are existing sessions, instead of opening a new desktop session, users can reconnect to an +existing one by clicking to the proper icon (see image below).

    + +

    Open an existing Session

    + +

    Users can also create a second desktop session by selecting the New Desktop button (red rectangle in the +below image). This will create a second session on the second login node, as long as this node is up and running.

    + +

    Open a New Desktop

    + +

    NoMachine LightDM Session Example

    + +

    An example of the NoMachine session, which is based on LightDM +X Windows:

    + +

    NoMachine Session: LightDM Desktop

    + +

    Accessing Merlin6 NoMachine from outside PSI

    + +

    No VPN access

    + +

    Access to the Merlin6 NoMachine service is possible without VPN through ‘rem-acc.psi.ch’. +Please follow the steps described in PSI Remote Interactive Access for +remote access to the Merlin6 NoMachine services. Once logged in ‘rem-acc.psi.ch’, you must then login to the merlin-nx.psi.ch front-end . +services.

    + +

    VPN access

    + +

    Remote access is also possible through VPN, however, you must not use ‘rem-acc.psi.ch’, and you have to connect directly +to the Merlin6 NoMachine merlin-nx.psi.ch front-end as if you were inside PSI. For VPN access, you should request +it to the IT department by opening a PSI Service Now ticket: +VPN Access (PSI employees).

    + +

    Advanced Display Settings

    + +

    Nomachine Display Settings can be accessed and changed either when creating a new session or by clicking the very top right corner of a running session.

    + +

    Prevent Rescaling

    + +

    These settings prevent “bluriness” at the cost of some performance! (You might want to choose depending on performance)

    + +
      +
    • Display > Resize remote display (forces 1:1 pixel sizes)
    • +
    • Display > Change settings > Quality: Choose Medium-Best Quality
    • +
    • Display > Change settings > Modify advanced settings +
        +
      • Check: Disable network-adaptive display quality (diables lossy compression)
      • +
      • Check: Disable client side image post-processing
      • +
      +
    • +
    + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin6/openmpi.html b/merlin6/openmpi.html new file mode 100644 index 0000000..e356be0 --- /dev/null +++ b/merlin6/openmpi.html @@ -0,0 +1,903 @@ + + + + + + + + +OpenMPI Support | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    OpenMPI Support

    +
    + + + +
    + + +
    This document describes how to use OpenMPI in the Merlin6 cluster
    + + + + + + + +
    + + + + + + +

    Introduction

    + +

    This document describes which set of OpenMPI versions in PModules are supported in the Merlin6 cluster.

    + +

    srun

    + +

    We strongly recommend the use of ‘srun’ over ‘mpirun’ or ‘mpiexec’. Using ‘srun’ would properly +bind tasks in to cores and less customization is needed, while ‘mpirun’ and ‘mpiexec’ might need more advanced +configuration and should be only used by advanced users. Please, always adapt your scripts for using ‘srun’ +before opening a support ticket. Also, please contact us on any problem when using a module.

    + +

    Example:

    + +
    srun ./app
    +
    + + + +

    OpenMPI with UCX

    + +

    OpenMPI supports UCX starting from version 3.0, but it’s recommended to use version 4.0 or higher due to stability and performance improvements. +UCX should be used only by advanced users, as it requires to run it with mpirun (needs advanced knowledge) and is an exception for running MPI +without srun (UCX is not integrated at PSI within srun).

    + +

    For running UCX, one should:

    + +
      +
    • add the following options to mpirun: +
       -mca pml ucx --mca btl ^vader,tcp,openib,uct -x UCX_NET_DEVICES=mlx5_0:1
      +
      +
    • +
    • or alternatively, add the following options before mpirun +
       export OMPI_MCA_pml="ucx"
      + export OMPI_MCA_btl="^vader,tcp,openib,uct"
      + export UCX_NET_DEVICES=mlx5_0:1
      +
      +
    • +
    + +

    In addition, one can add the following options for debugging purposes (visit UCX Logging for possible UCX_LOG_LEVEL values):

    + +
    -x UCX_LOG_LEVEL=<data|debug|warn|info|...> -x UCX_LOG_FILE=<filename>
    +
    + +

    This can be also added externally before the mpirun call (see below example). Full example:

    + +
      +
    • Within the mpirun command: +
       mpirun -np $SLURM_NTASKS -mca pml ucx --mca btl ^vader,tcp,openib,uct -x UCX_NET_DEVICES=mlx5_0:1 -x UCX_LOG_LEVEL=data -x UCX_LOG_FILE=UCX-$SLURM_JOB_ID.log ./app
      +
      +
    • +
    • Outside the mpirun command: +
      export OMPI_MCA_pml="ucx"
      +export OMPI_MCA_btl="^vader,tcp,openib,uct"
      +export UCX_NET_DEVICES=mlx5_0:1
      +export UCX_LOG_LEVEL=data
      +export UCX_LOG_FILE=UCX-$SLURM_JOB_ID.log
      +
      +mpirun -np $SLURM_NTASKS ./app
      +
      +
    • +
    + +

    Supported OpenMPI versions

    + +

    For running OpenMPI properly in a Slurm batch system, OpenMPI and Slurm must be compiled accordingly.

    + +

    We can find a large number of compilations of OpenMPI modules in the PModules central repositories. However, only +some of them are suitable for running in a Slurm cluster: any OpenMPI versions with suffixes _slurm +are suitable for running in the Merlin6 cluster. Also, OpenMPI with suffix _merlin6 can be used, but these will be fully +replaced by the _slurm series in the future (so it can be used on any Slurm cluster at PSI). Please, avoid using any other OpenMPI releases.

    + + + +

    ‘unstable’ repository

    + +

    New OpenMPI versions that need to be tested will be compiled first in the unstable repository, and once validated will be moved to stable. +We can not ensure that modules in that repository are production ready, but you can use it at your own risk.

    + +

    For using unstable modules, you might need to load the unstable PModules repository as follows:

    +
    module use unstable
    +
    + +

    ‘stable’ repository

    + +

    Officially supported OpenMPI versions (https://www.open-mpi.org/) will be available in the stable repository (which is the default loaded repository). +For further information, please check https://www.open-mpi.org/software/ompi/ -> Current & Still Supported +versions.

    + +

    Usually, not more than 2 minor update releases will be present in the stable repository. Older minor update releases will be moved to deprecated +despite are officially supported. This will ensure that users compile new software with the latest stable versions, but we keep available the old versions +for software which was compiled with it.

    + +

    ‘deprecated’ repository

    + +

    Old OpenMPI versions (it is, any official OpenMPI version which has been moved to retired or ancient) will be +moved to the ‘deprecated’ PModules repository. +For further information, please check https://www.open-mpi.org/software/ompi/ -> Older Versions +versions.

    + +

    Also, as mentioned in before, older official supported OpenMPI releases (minor updates) will be moved to deprecated.

    + +

    For using deprecated modules, you might need to load the deprecated PModules repository as follows:

    +
    module use deprecated
    +
    +

    However, this is usually not needed: when loading directly a specific version in the deprecated repository, if this is not found in +stable it try to search and to fallback to other repositories (deprecated or unstable).

    + +

    About missing versions

    + +
    Missing OpenMPI versions
    + +

    For legacy software, some users might require a different OpenMPI version. We always encourage users to try one of the existing stable versions +(OpenMPI always with suffix _slurm or _merlin6!), as they will contain the latest bug fixes and they usually should work. In the worst case, you +can also try with the ones in the deprecated repository (again, OpenMPI always with suffix _slurm or _merlin6!), or for very old software which +was based on OpenMPI v1 you can follow the guide FAQ: Removed MPI constructs, which provides +some easy steps for migrating from OpenMPI v1 to v2 or superior or also is useful to find out why your code does not compile properly.

    + +

    When, after trying the mentioned versions and guide, you are still facing problems, please contact us. Also, please contact us if you require a newer +version with a different gcc or intel compiler (in example, Intel v19).

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin6/paraview.html b/merlin6/paraview.html new file mode 100644 index 0000000..e034a21 --- /dev/null +++ b/merlin6/paraview.html @@ -0,0 +1,821 @@ + + + + + + + + +Running Paraview | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Running Paraview

    +
    + + + +
    + + +
    This document describes how to run ParaView in the Merlin6 cluster
    + + + + + + + +
    + + + + + + +

    Requirements

    + +

    NoMachine is the official strongly recommended and supported tool for running ParaView. +Consider that running over SSH (X11-Forwarding needed) is very slow, but also configuration might not work as it also depends +on the client configuration (Linux workstation/laptop, Windows with XMing, etc.). Hence, please avoid running Paraview over SSH. +The only exception for running over SSH is when running it as a job from a NoMachine client.

    + +

    ParaView

    + +

    PModules

    + +

    Is strongly recommended the use of the latest ParaView version available in PModules. In example, for loading paraview:

    + +
    module use unstable
    +module load paraview/5.8.1
    +
    + +

    Running ParaView

    + +

    For running ParaView, one can run it with VirtualGL to take advantatge of the GPU card located on each login node. For that, once loaded, you can start paraview as follows:

    + +
    vglrun paraview
    +
    + +

    Alternatively, one can run paraview with mesa support with the below command. This can be useful when running on CPU computing nodes (with srun / salloc) +which have no graphics card (and where vglrun is not possible):

    + +
    paraview-mesa paraview
    +
    + +

    Running older versions of ParaView

    + +

    Older versions of ParaView available in PModules (i.e. paraview/5.0.1 and paraview/5.4.1) might require a different command +for running paraview with Mesa support. The command is the following:

    + +
    # Warning: only for Paraview 5.4.1 and older
    +paraview --mesa
    +
    + +

    Running ParaView interactively in the batch system

    + +

    One can run ParaView interactively in the CPU cluster as follows:

    + +
    # First, load module. In example: "module load paraview/5.8.1"
    +srun --pty --x11 --partition=general --ntasks=1 paraview-mesa paraview
    +
    + +

    One can change the partition, number of tasks or specify extra parameters to srun if needed.

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin6/past-downtimes.html b/merlin6/past-downtimes.html new file mode 100644 index 0000000..c97d23b --- /dev/null +++ b/merlin6/past-downtimes.html @@ -0,0 +1,942 @@ + + + + + + + + +Past Downtimes | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Past Downtimes

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    Past Downtimes: Log Changes

    + +

    2020

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    FromToServiceClustersDescriptionExceptions
    03.08.2020 8am03.08.2020 6pmArchivemerlin6Replace old merlin-export-01 for merlin-export-02 
    03.08.2020 8am03.08.2020 6pmRemoteAccessmerlin6ra-merlin-0[1,2] Remount merlin-export-02 
    06.07.202006.07.2020All servicesmerlin5,merlin6GPFS v5.0.4-4,OFED v5.0,YFS v0.195,RHEL7.7,Slurm v19.05.7,f/w 
    04.05.202004.05.2020Login nodesmerlin6Outage. YFS (AFS) update v0.194 and reboot 
    04.05.202004.05.2020CNmerlin5Outage. O.S. update, OFED drivers update, YFS (AFS) update. 
    03.02.2020 9am03.02.2020 10amSlurmmerlin5,merlin6Upgrading config HPCLOCAL-321 
    10.01.2020 9am10.01.2020 6pmAll Servicesmerlin5,merlin6Slurm v18->v19, IB Connected Mode, other. HPCLOCAL-300 
    + +

    Older downtimes

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    FromToServiceClustersDescriptionExceptions
    02.09.201902.09.2019GPFSmerlin5,merlin6v5.0.2-3 -> v5.0.3-2 
    02.09.201902.09.2019O.S.merlin5RHEL7.4 (rhel-7.4) -> RHEL7.6 (prod-00048)merlin-g-40, still running RHEL7.4*
    02.09.201902.09.2019O.S.merlin6RHEL7.6 (prod-00030) -> RHEL7.6 (prod-00048) 
    02.09.201902.09.2019Infinibandmerlin5OFED v4.4 -> v4.6merlin-g-40, still running OFED v4.4*
    02.09.201902.09.2019Infinibandmerlin6OFED v4.5 -> v4.6 
    02.09.201902.09.2019PModulesmerlin5,merlin6PModules v1.0.0rc4 -> v1.0.0rc5 
    02.09.201902.09.2019AFS(YFS)merlin5OpenAFS v1.6.22.2-236 -> YFS v188merlin-g-40, still running OpenAFS*
    02.09.201902.09.2019AFS(YFS)merlin6YFS v186 -> YFS v188 
    02.09.201902.09.2019O.S.merlin5RHEL7.4 -> RHEL7.6 (prod-00048) 
    02.09.201902.09.2019Slurmmerlin5,merlin6Slurm v18.08.6 -> v18.08.8 
    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin6/python.html b/merlin6/python.html new file mode 100644 index 0000000..0bf7e22 --- /dev/null +++ b/merlin6/python.html @@ -0,0 +1,922 @@ + + + + + + + + +Python | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Python

    +
    + + + +
    + + +
    Running Python on Merlin
    + + + + + + + +
    + + + + + + +

    PSI provides a variety of ways to execute python code.

    + +
      +
    1. Anaconda - Custom environments for using installation and development
    2. +
    3. Jupyterhub - Execute Jupyter notebooks on the cluster
    4. +
    5. System Python - Do not use! Only for OS applications.
    6. +
    + +

    Anaconda

    + +

    Anaconda (“conda” for short) is a package manager with +excellent python integration. Using it you can create isolated environments for each +of your python applications, containing exactly the dependencies needed for that app. +It is similar to the virtualenv python package, +but can also manage non-python requirements.

    + +

    Loading conda

    + +

    Conda is loaded from the module system:

    + +
    module load anaconda
    +
    + +

    Using pre-made environments

    + +

    Loading the module provides the conda command, but does not otherwise change your +environment. First an environment needs to be activated. Available environments can +be seen with conda info --envs and include many specialized environments for +software installs. After activating you should see the environment name in your +prompt:

    + +
    ~ $ conda activate datascience_py37
    +(datascience_py37) ~ $
    +
    + +

    CondaRC file

    + +

    Creating a ~/.condarc file is recommended if you want to create new environments on +merlin. Environments can grow quite large, so you will need to change the default +storage location from the default (your home directory) to a larger volume (usually +/data/user/$USER).

    + +

    Save the following as $HOME/.condarc:

    + +
    always_copy: true
    +
    +envs_dirs:
    +  - /data/user/$USER/conda/envs
    +
    +pkgs_dirs:
    +  - /data/user/$USER/conda/pkgs
    +  - $ANACONDA_PREFIX/conda/pkgs
    +
    +channels:
    +  - conda-forge
    +  - nodefaults
    +
    + +

    Run conda info to check that the variables are being set correctly.

    + +

    Creating environments

    + +

    We will create an environment named myenv which uses an older version of numpy, e.g. to test for backwards compatibility of our code (the -q and --yes switches are just for not getting prompted and disabling the progress bar). The environment will be created in the default location as defined by the .condarc configuration file (see above).

    + +
    ~ $ conda create -q --yes -n 'myenv1' numpy=1.8 scipy ipython
    +
    +Fetching package metadata: ...
    +Solving package specifications: .
    +Package plan for installation in environment /gpfs/home/feichtinger/conda-envs/myenv1:
    +
    +The following NEW packages will be INSTALLED:
    +
    +    ipython:    2.3.0-py27_0
    +    numpy:      1.8.2-py27_0
    +    openssl:    1.0.1h-1
    +    pip:        1.5.6-py27_0
    +    python:     2.7.8-1
    +    readline:   6.2-2
    +    scipy:      0.14.0-np18py27_0
    +    setuptools: 5.8-py27_0
    +    sqlite:     3.8.4.1-0
    +    system:     5.8-1
    +    tk:         8.5.15-0
    +    zlib:       1.2.7-0
    +
    +To activate this environment, use:
    +$ source activate myenv1
    +
    +To deactivate this environment, use:
    +$ source deactivate
    +
    + +

    The created environment contains just the packages that are needed to satisfy the +requirements and it is local to your installation. The python installation is even +independent of the central installation, i.e. your code will still work in such an +environment, even if you are offline or AFS is down. However, you need the central +installation if you want to use the conda command itself.

    + +

    Packages for your new environment will be either copied from the central one into +your new environment, or if there are newer packages available from anaconda and you +did not specify exactly the version from our central installation, they may get +downloaded from the web. **This will require significant space in the envs_dirs +that you defined in .condarc. If you create other environments on the same local +disk, they will share the packages using hard links.

    + +

    We can switch to the newly created environment with the conda activate command.

    + +
    $ conda activate myenv1
    +
    + +
    +

    Note that anaconda’s activate/deactivate +scripts are compatible with the bash and zsh shells but not with [t]csh.

    +
    + +

    Let’s test whether we indeed got the desired numpy version:

    + +
    $ python -c 'import numpy as np; print np.version.version'
    +
    +1.8.2
    +
    + +

    You can install additional packages into the active environment using the conda +install command.

    + +
    $ conda install --yes -q bottle
    +
    +Fetching package metadata: ...
    +Solving package specifications: .
    +Package plan for installation in environment /gpfs/home/feichtinger/conda-envs/myenv1:
    +
    +The following NEW packages will be INSTALLED:
    +
    +    bottle: 0.12.5-py27_0
    +
    + +

    Jupyterhub

    + +

    Jupyterhub is a service for running code notebooks on the cluster, particularly in +python. It is a powerful tool for data analysis and prototyping. For more infomation +see the Jupyterhub documentation.

    + +

    Pythons to avoid

    + +

    Avoid using the system python (/usr/bin/python). It is intended for OS software and +may not be up to date.

    + +

    Also avoid the ‘python’ module (module load python). This is a minimal install of +python intended for embedding in other modules.

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin6/request-account.html b/merlin6/request-account.html new file mode 100644 index 0000000..cac0059 --- /dev/null +++ b/merlin6/request-account.html @@ -0,0 +1,814 @@ + + + + + + + + +Requesting Merlin Accounts | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Requesting Merlin Accounts

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    Requesting Access to Merlin6

    + +

    Access to Merlin6 is regulated by a PSI user’s account being a member of the svc-cluster_merlin6 group. Access to this group will also grant access to older generations of Merlin (merlin5).

    + +

    Requesting Merlin6 access has to be done with the corresponding Request Linux Group Membership form, available in the PSI Service Now Service Catalog.

    + +

    Example: Requesting access to Merlin6

    + +

    Mandatory customizable fields are the following:

    +
      +
    • Order Access for user, which defaults to the logged in user. However, requesting access for another user it’s also possible.
    • +
    • Request membership for group, for Merlin6 the svc-cluster_merlin6 must be selected.
    • +
    • Justification, please add here a short justification why access to Merlin6 is necessary.
    • +
    + +

    Once submitted, the Merlin responsible will approve the request as soon as possible (within the next few hours on working days). Once the request is approved, it may take up to 30 minutes to get the account fully configured.

    + +

    Requesting Access to Merlin5

    + +

    Access to Merlin5 is regulated by a PSI user’s account being a member of the svc-cluster_merlin5 group. Access to this group does not grant access to newer generations of Merlin (merlin6, gmerlin6, and future ones).

    + +

    Requesting Merlin5 access has to be done with the corresponding Request Linux Group Membership form, available in the PSI Service Now Service Catalog.

    + +

    Example: Requesting access to Merlin5

    + +

    Mandatory customizable fields are the following:

    +
      +
    • Order Access for user, which defaults to the logged in user. However, requesting access for another user it’s also possible.
    • +
    • Request membership for group, for Merlin5 the svc-cluster_merlin5 must be selected.
    • +
    • Justification, please add here a short justification why access to Merlin5 is necessary.
    • +
    + +

    Once submitted, the Merlin responsible will approve the request as soon as possible (within the next few hours on working days). Once the request is approved, it may take up to 30 minutes to get the account fully configured.

    + +

    Further documentation

    + +

    Further information it’s also available in the Linux Central Documentation:

    + + +

    Special thanks to the Linux Central Team and AIT to make this possible.

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin6/request-project.html b/merlin6/request-project.html new file mode 100644 index 0000000..a5d48c4 --- /dev/null +++ b/merlin6/request-project.html @@ -0,0 +1,889 @@ + + + + + + + + +Requesting a Merlin Project | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Requesting a Merlin Project

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    A project owns its own storage area in Merlin, which can be accessed by other group members.

    + +

    Projects can receive a higher storage quota than user areas and should be the primary way of organizing bigger storage requirements +in a multi-user collaboration.

    + +

    Access to a project’s directories is governed by project members belonging to a common Unix group. You may use an existing +Unix group or you may have a new Unix group created especially for the project. The project responsible will be the owner of +the Unix group (this is important)!

    + +

    This document explains how to request new Unix group, to request membership for existing groups, and the procedure for requesting a Merlin project.

    + +

    About Unix groups

    + +

    Before requesting a Merlin project, it is important to have a Unix group that can be used to grant access to it to different members +of the project.

    + +

    Unix groups in the PSI Active Directory (which is the PSI central database containing user and group information, and more) are defined by the unx- prefix, followed by a name. +In general, PSI employees working on Linux systems (including HPC clusters, like Merlin) can request for a non-existing Unix group, and can become responsible for managing it. +In addition, a list of administrators can be set. The administrators, together with the group manager, can approve or deny membership requests. Further information about this topic +is covered in the Linux Documentation - Services Admin Guides: Unix Groups / Group Management, managed by the Central Linux Team.

    + +

    To gran access to specific Merlin project directories, some users may require to be added to some specific Unix groups:

    +
      +
    • Each Merlin project (i.e. /data/project/{bio|general}/$projectname) or experiment (i.e. /data/experiment/$experimentname) directory has access restricted by ownership and group membership (with a very few exceptions allowing public access).
    • +
    • Users requiring access to a specific restricted project or experiment directory have to request membership for the corresponding Unix group owning the directory.
    • +
    + +

    Requesting a new Unix group

    + +

    If you need a new Unix group to be created, you need to first get this group through a separate +PSI Service Now ticket. Please use the following template. +You can also specify the login names of the initial group members and the owner of the group. +The owner of the group is the person who will be allowed to modify the group.

    + +
      +
    • Please open an Incident Request with subject: +
       Subject: Request for new unix group xxxx
      +
      +
    • +
    • and base the text field of the request on this template +
       Dear HelpDesk
      +   
      + I would like to request a new unix group.
      +   
      + Unix Group Name: unx-xxxxx
      + Initial Group Members: xxxxx, yyyyy, zzzzz, ...
      + Group Owner: xxxxx
      + Group Administrators: aaaaa, bbbbb, ccccc, ....
      +
      + Best regards,
      +
      +
    • +
    + +

    Requesting Unix group membership

    + +

    Existing Merlin projects have already a Unix group assigned. To have access to a project, users must belong to the proper Unix group owning that project. +Supervisors should inform new users which extra groups are needed for their project(s). If this information is not known, one can check the permissions for that directory. In example:

    +
    (base)[caubet_m@merlin-l-001:/data/user/caubet_m]# ls -ltrhd /data/project/general/$projectname
    +(base)[caubet_m@merlin-l-001:/data/user/caubet_m]# ls -ltrhd /data/project/bio/$projectname
    +
    + +

    Requesting membership for a specific Unix group has to be done with the corresponding Request Linux Group Membership form, available in the PSI Service Now Service Catalog.

    + +

    Example: Requesting Unix Group membership

    + +

    Once submitted, the responsible of the Unix group has to approve the request.

    + +

    Important note: Requesting access to specific Unix Groups will require validation from the responsible of the Unix Group. If you ask for inclusion in many groups it may take longer, since the fulfillment of the request will depend on more people.

    + +

    Further information can be found in the Linux Documentation - Services User guide: Unix Groups / Group Management

    + +

    Managing Unix Groups

    + +

    Other administration operations on Unix Groups it’s mainly covered in the Linux Documentation - Services Admin Guides: Unix Groups / Group Management, managed by the Central Linux Team.

    + +

    Requesting a Merlin project

    + +

    Once a Unix group is available, a Merlin project can be requested. +To request a project, please provide the following information in a PSI Service Now ticket

    + +
      +
    • Please open an Incident Request with subject: +
       Subject: [Merlin6] Project Request for project name xxxxxx
      +
      +
    • +
    • and base the text field of the request on this template +
       Dear HelpDesk
      +   
      + I would like to request a new Merlin6 project.
      +   
      + Project Name: xxxxx
      + UnixGroup: xxxxx    # Must be an existing Unix Group
      +
      + The project responsible is the Owner of the Unix Group.
      + If you need a storage quota exceeding the defaults, please provide a description
      + and motivation for the higher storage needs:
      +   
      + Storage Quota: 1TB with a maximum of 1M Files
      + Reason: (None for default 1TB/1M)
      +
      + Best regards,
      +
      +
    • +
    + +

    The default storage quota for a project is 1TB (with a maximal Number of Files of 1M). If you need a larger assignment, you +need to request this and provide a description of your storage needs.

    + +

    Further documentation

    + +

    Further information it’s also available in the Linux Central Documentation:

    + + +

    Special thanks to the Linux Central Team and AIT to make this possible.

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin6/running-jobs.html b/merlin6/running-jobs.html new file mode 100644 index 0000000..b36a1f2 --- /dev/null +++ b/merlin6/running-jobs.html @@ -0,0 +1,1052 @@ + + + + + + + + +Running Slurm Scripts | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Running Slurm Scripts

    +
    + + + +
    + + +
    This document describes how to run batch scripts in Slurm.
    + + + + + + + +
    + + + + + + +

    The rules

    + +

    Before starting using the cluster, please read the following rules:

    + +
      +
    1. To ease and improve scheduling and backfilling, always try to estimate and to define a proper run time of your jobs: + +
    2. +
    3. Try to optimize your jobs for running at most within one day. Please, consider the following: +
        +
      • Some software can simply scale up by using more nodes while drastically reducing the run time.
      • +
      • Some software allow to save a specific state, and a second job can start from that state: Job Arrays with Checkpointing can help you with that.
      • +
      • Jobs submitted to hourly get more priority than jobs submitted to daily: always use hourly for jobs shorter than 1 hour.
      • +
      • Jobs submitted to daily get more priority than jobs submitted to general: always use daily for jobs shorter than 1 day.
      • +
      +
    4. +
    5. Is forbidden to run very short jobs as they cause a lot of overhead but also can cause severe problems to the main scheduler. +
        +
      • Question: Is my job a very short job? Answer: If it lasts in few seconds or very few minutes, yes.
      • +
      • Question: How long should my job run? Answer: as the Rule of Thumb, from 5’ would start being ok, from 15’ would preferred.
      • +
      • Use Packed Jobs for running a large number of short tasks.
      • +
      +
    6. +
    7. Do not submit hundreds of similar jobs! + +
    8. +
    + + + +

    Basic commands for running batch scripts

    + +
      +
    • Use sbatch for submitting a batch script to Slurm.
    • +
    • Use srun for running parallel tasks.
    • +
    • Use squeue for checking jobs status.
    • +
    • Use scancel for cancelling/deleting a job from the queue.
    • +
    + + + +

    Basic settings

    + +

    For a complete list of options and parameters available is recommended to use the man pages (i.e. man sbatch, man srun, man salloc). +Please, notice that behaviour for some parameters might change depending on the command used when running jobs (in example, --exclusive behaviour in sbatch differs from srun).

    + +

    In this chapter we show the basic parameters which are usually needed in the Merlin cluster.

    + +

    Common settings

    + +

    The following settings are the minimum required for running a job in the Merlin CPU and GPU nodes. Please, consider taking a look to the man pages (i.e. man sbatch, man salloc, man srun) for more information about all possible options. Also, do not hesitate to contact us on any questions.

    + +
      +
    • Clusters: For running jobs in the different Slurm clusters, users should to add the following option: +
      #SBATCH --clusters=<cluster_name>     # Possible values: merlin5, merlin6, gmerlin6
      +
      +

      Refer to the documentation of each cluster (merlin6,gmerlin6,merlin5 for further information.

      +
    • +
    • Partitions: except when using the default partition for each cluster, one needs to specify the partition: +
      #SBATCH --partition=<partition_name>  # Check each cluster documentation for possible values
      +
      + +

      Refer to the documentation of each cluster (merlin6,gmerlin6,merlin5 for further information.

      +
    • +
    • [Optional] Disabling shared nodes: by default, nodes are not exclusive. Hence, multiple users can run in the same node. One can request exclusive node usage with the following option: +
      #SBATCH --exclusive                   # Only if you want a dedicated node
      +
      +
    • +
    • Time: is important to define how long a job should run, according to the reality. This will help Slurm when scheduling and backfilling, and will let Slurm managing job queues in a more efficient way. This value can never exceed the MaxTime of the affected partition. +
       #SBATCH --time=<D-HH:MM:SS>          # Can not exceed the partition `MaxTime`
      +
      +

      Refer to the documentation of each cluster (merlin6,gmerlin6,merlin5 for further information about partition MaxTime values.

      +
    • +
    • Output and error files: by default, Slurm script will generate standard output (slurm-%j.out, where %j is the job_id) and error (slurm-%j.err, where %j is the job_id) files in the directory from where the job was submitted. Users can change default name with the following options: +
      #SBATCH --output=<filename>           # Can include path. Patterns accepted (i.e. %j)
      +#SBATCH --error=<filename>            # Can include path. Patterns accepted (i.e. %j)
      +
      +

      Use man sbatch (man sbatch | grep -A36 '^filename pattern') for getting a list specification of filename patterns.

      +
    • +
    • Enable/Disable Hyper-Threading: Whether a node has or not Hyper-Threading depends on the node configuration. By default, HT nodes have HT enabled, but one should specify it from the Slurm command as follows: +
      #SBATCH --hint=multithread            # Use extra threads with in-core multi-threading.
      +#SBATCH --hint=nomultithread          # Don't use extra threads with in-core multi-threading.
      +
      +

      Refer to the documentation of each cluster (merlin6,gmerlin6,merlin5 for further information about node configuration and Hyper-Threading. +Consider that, sometimes, depending on your job requirements, you might need also to setup how many --ntasks-per-core or --cpus-per-task (even other options) in addition to the --hint command. Please, contact us in case of doubts.

      + + +
    • +
    + +

    Batch script templates

    + +

    CPU-based jobs templates

    + +

    The following examples apply to the Merlin6 cluster.

    + +

    Nomultithreaded jobs template

    + +

    The following template should be used by any user submitting jobs to the Merlin6 CPU nodes:

    + +
    #!/bin/bash
    +#SBATCH --cluster=merlin6                 # Cluster name                                        
    +#SBATCH --partition=general,daily,hourly  # Specify one or multiple partitions
    +#SBATCH --time=<D-HH:MM:SS>               # Strongly recommended                                
    +#SBATCH --output=<output_file>            # Generate custom output file                         
    +#SBATCH --error=<error_file>              # Generate custom error  file                         
    +#SBATCH --hint=nomultithread              # Mandatory for multithreaded jobs                    
    +##SBATCH --exclusive                      # Uncomment if you need exclusive node usage          
    +##SBATCH --ntasks-per-core=1              # Only mandatory for multithreaded single tasks       
    +                                                                                               
    +## Advanced options example                                                                    
    +##SBATCH --nodes=1                        # Uncomment and specify #nodes to use                 
    +##SBATCH --ntasks=44                      # Uncomment and specify #nodes to use                 
    +##SBATCH --ntasks-per-node=44             # Uncomment and specify #tasks per node               
    +##SBATCH --cpus-per-task=44               # Uncomment and specify the number of cores per task  
    +
    + +

    Multithreaded jobs template

    + +

    The following template should be used by any user submitting jobs to the Merlin6 CPU nodes:

    + +
    #!/bin/bash
    +#SBATCH --cluster=merlin6                # Cluster name
    +#SBATCH --partition=general,daily,hourly # Specify one or multiple partitions
    +#SBATCH --time=<D-HH:MM:SS>              # Strongly recommended
    +#SBATCH --output=<output_file>           # Generate custom output file
    +#SBATCH --error=<error_file>             # Generate custom error  file
    +#SBATCH --hint=multithread               # Mandatory for multithreaded jobs
    +##SBATCH --exclusive                     # Uncomment if you need exclusive node usage
    +##SBATCH --ntasks-per-core=2             # Only mandatory for multithreaded single tasks
    +
    +## Advanced options example
    +##SBATCH --nodes=1                       # Uncomment and specify #nodes to use
    +##SBATCH --ntasks=88                     # Uncomment and specify #nodes to use
    +##SBATCH --ntasks-per-node=88            # Uncomment and specify #tasks per node
    +##SBATCH --cpus-per-task=88              # Uncomment and specify the number of cores per task
    +
    + +

    GPU-based jobs templates

    + +

    The following template should be used by any user submitting jobs to GPU nodes:

    + +
    #!/bin/bash
    +#SBATCH --cluster=gmerlin6                   # Cluster name
    +#SBATCH --partition=gpu,gpu-short            # Specify one or multiple partitions, or
    +#SBATCH --partition=gwendolen,gwendolen-long # Only for Gwendolen users
    +#SBATCH --gpus="<type>:<num_gpus>"           # <type> is optional, <num_gpus> is mandatory
    +#SBATCH --time=<D-HH:MM:SS>                  # Strongly recommended
    +#SBATCH --output=<output_file>               # Generate custom output file
    +#SBATCH --error=<error_file>                 # Generate custom error  file
    +##SBATCH --exclusive                         # Uncomment if you need exclusive node usage
    +
    +## Advanced options example
    +##SBATCH --nodes=1                           # Uncomment and specify number of nodes to use
    +##SBATCH --ntasks=1                          # Uncomment and specify number of nodes to use
    +##SBATCH --cpus-per-gpu=5                    # Uncomment and specify the number of cores per task
    +##SBATCH --mem-per-gpu=16000                 # Uncomment and specify the number of cores per task
    +##SBATCH --gpus-per-node=<type>:2            # Uncomment and specify the number of GPUs per node
    +##SBATCH --gpus-per-socket=<type>:2          # Uncomment and specify the number of GPUs per socket
    +##SBATCH --gpus-per-task=<type>:1            # Uncomment and specify the number of GPUs per task
    +
    + +

    Advanced configurations

    + + + +

    If you need to run a large number of jobs based on the same executable with systematically varying inputs, +e.g. for a parameter sweep, you can do this most easily in form of a simple array job.

    + +
    #!/bin/bash
    +#SBATCH --job-name=test-array
    +#SBATCH --partition=daily
    +#SBATCH --ntasks=1
    +#SBATCH --time=08:00:00
    +#SBATCH --array=1-8
    +
    +echo $(date) "I am job number ${SLURM_ARRAY_TASK_ID}"
    +srun myprogram config-file-${SLURM_ARRAY_TASK_ID}.dat
    +
    +
    + +

    This will run 8 independent jobs, where each job can use the counter +variable SLURM_ARRAY_TASK_ID defined by Slurm inside of the job’s +environment to feed the correct input arguments or configuration file +to the “myprogram” executable. Each job will receive the same set of +configurations (e.g. time limit of 8h in the example above).

    + +

    The jobs are independent, but they will run in parallel (if the cluster resources allow for +it). The jobs will get JobIDs like {some-number}_0 to {some-number}_7, and they also will each +have their own output file.

    + +

    Note:

    +
      +
    • Do not use such jobs if you have very short tasks, since each array sub job will incur the full overhead for launching an independent Slurm job. For such cases you should used a packed job (see below).
    • +
    • If you want to control how many of these jobs can run in parallel, you can use the #SBATCH --array=1-100%5 syntax. The %5 will define +that only 5 sub jobs may ever run in parallel.
    • +
    + +

    You also can use an array job approach to run over all files in a directory, substituting the payload with

    + +
    FILES=(/path/to/data/*)
    +srun ./myprogram ${FILES[$SLURM_ARRAY_TASK_ID]}
    +
    + +

    Or for a trivial case you could supply the values for a parameter scan in form +of a argument list that gets fed to the program using the counter variable.

    + +
    ARGS=(0.05 0.25 0.5 1 2 5 100)
    +srun ./my_program.exe ${ARGS[$SLURM_ARRAY_TASK_ID]}
    +
    + +

    Array jobs: running very long tasks with checkpoint files

    + +

    If you need to run a job for much longer than the queues (partitions) permit, and +your executable is able to create checkpoint files, you can use this +strategy:

    + +
    #!/bin/bash
    +#SBATCH --job-name=test-checkpoint
    +#SBATCH --partition=general
    +#SBATCH --ntasks=1
    +#SBATCH --time=7-00:00:00       # each job can run for 7 days
    +#SBATCH --cpus-per-task=1
    +#SBATCH --array=1-10%1   # Run a 10-job array, one job at a time.
    +if test -e checkpointfile; then 
    +     # There is a checkpoint file;
    +     myprogram --read-checkp checkpointfile
    +else
    +     # There is no checkpoint file, start a new simulation.
    +     myprogram
    +fi
    +
    + +

    The %1 in the #SBATCH --array=1-10%1 statement defines that only 1 subjob can ever run in parallel, so +this will result in subjob n+1 only being started when job n has finished. It will read the checkpoint file +if it is present.

    + +

    Packed jobs: running a large number of short tasks

    + +

    Since the launching of a Slurm job incurs some overhead, you should not submit each short task as a separate +Slurm job. Use job packing, i.e. you run the short tasks within the loop of a single Slurm job.

    + +

    You can launch the short tasks using srun with the --exclusive switch (not to be confused with the +switch of the same name used in the SBATCH commands). This switch will ensure that only a specified +number of tasks can run in parallel.

    + +

    As an example, the following job submission script will ask Slurm for +44 cores (threads), then it will run the =myprog= program 1000 times with +arguments passed from 1 to 1000. But with the =-N1 -n1 -c1 +–exclusive= option, it will control that at any point in time only 44 +instances are effectively running, each being allocated one CPU. You +can at this point decide to allocate several CPUs or tasks by adapting +the corresponding parameters.

    + +
    #! /bin/bash
    +#SBATCH --job-name=test-checkpoint
    +#SBATCH --partition=general
    +#SBATCH --ntasks=1
    +#SBATCH --time=7-00:00:00
    +#SBATCH --ntasks=44    # defines the number of parallel tasks
    +for i in {1..1000}
    +do
    +   srun -N1 -n1 -c1 --exclusive ./myprog $i &
    +done
    +wait
    +
    + +

    Note: The & at the end of the srun line is needed to not have the script waiting (blocking). +The wait command waits for all such background tasks to finish and returns the exit code.

    + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin6/slurm-access.html b/merlin6/slurm-access.html new file mode 100644 index 0000000..8619700 --- /dev/null +++ b/merlin6/slurm-access.html @@ -0,0 +1,818 @@ + + + + + + + + +Accessing Slurm Cluster | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Accessing Slurm Cluster

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    The Merlin Slurm clusters

    + +

    Merlin contains a multi-cluster setup, where multiple Slurm clusters coexist under the same umbrella. +It basically contains the following clusters:

    + +
      +
    • The Merlin6 Slurm CPU cluster, which is called merlin6.
    • +
    • The Merlin6 Slurm GPU cluster, which is called gmerlin6.
    • +
    • The old Merlin5 Slurm CPU cluster, which is called merlin5, still supported in a best effort basis.
    • +
    + +

    Accessing the Slurm clusters

    + +

    Any job submission must be performed from a Merlin login node. Please refer to the Accessing the Interactive Nodes documentation +for further information about how to access the cluster.

    + +

    In addition, any job must be submitted from a high performance storage area visible by the login nodes and by the computing nodes. For this, the possible storage areas are the following:

    +
      +
    • /data/user
    • +
    • /data/project
    • +
    • /shared-scratch +Please, avoid using /psi/home directories for submitting jobs.
    • +
    + +

    Merlin6 CPU cluster access

    + +

    The Merlin6 CPU cluster (merlin6) is the default cluster configured in the login nodes. Any job submission will use by default this cluster, unless +the option --cluster is specified with another of the existing clusters.

    + +

    For further information about how to use this cluster, please visit: Merlin6 CPU Slurm Cluster documentation.

    + +

    Merlin6 GPU cluster access

    + +

    The Merlin6 GPU cluster (gmerlin6) is visible from the login nodes. However, to submit jobs to this cluster, one needs to specify the option --cluster=gmerlin6 when submitting a job or allocation.

    + +

    For further information about how to use this cluster, please visit: Merlin6 GPU Slurm Cluster documentation.

    + +

    Merlin5 CPU cluster access

    + +

    The Merlin5 CPU cluster (merlin5) is visible from the login nodes. However, to submit jobs +to this cluster, one needs to specify the option --cluster=merlin5 when submitting a job or allocation.

    + +

    Using this cluster is in general not recommended, however this is still available for old users needing + extra computational resources or longer jobs. Have in mind that this cluster is only supported in a +best effort basis, and it contains very old hardware and configurations.

    + +

    For further information about how to use this cluster, please visit the Merlin5 CPU Slurm Cluster documentation.

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin6/slurm-basics.html b/merlin6/slurm-basics.html new file mode 100644 index 0000000..e504a75 --- /dev/null +++ b/merlin6/slurm-basics.html @@ -0,0 +1,821 @@ + + + + + + + + +Slurm Basic Commands | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Slurm Basic Commands

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    In this document some basic commands for using Slurm are showed. Advanced examples for some of these +are explained in other Merlin6 Slurm pages. You can always use man <command> pages for more +information about options and examples.

    + +

    Basic commands

    + +

    Useful commands for the slurm:

    + +
    sinfo            # to see the name of nodes, their occupancy, 
    +                 # name of slurm partitions, limits (try out with "-l" option)
    +squeue           # to see the currently running/waiting jobs in slurm 
    +                 # (additional "-l" option may also be useful)
    +sbatch Script.sh # to submit a script (example below) to the slurm.
    +srun <command>   # to submit a command to Slurm. Same options as in 'sbatch' can be used.
    +salloc           # to allocate computing nodes. Use for interactive runs.
    +scancel job_id   # to cancel slurm job, job id is the numeric id, seen by the squeue.
    +sview            # X interface for managing jobs and track job run information.
    +seff             # Calculates the efficiency of a job
    +sjstat           # List attributes of jobs under the SLURM control
    +sacct            # Show job accounting, useful for checking details of finished jobs.
    +
    + +
    + +

    Advanced basic commands:

    + +
    sinfo -N -l      # list nodes, state, resources (#CPUs, memory per node, ...), etc.
    +sshare -a        # to list shares of associations to a cluster
    +sprio -l         # to view the factors that comprise a job's scheduling priority 
    +                 # add '-u <username>' for filtering user
    +
    + +

    Show information for specific cluster

    + +

    By default, any of the above commands shows information of the local cluster which is *merlin6.

    + +

    If you want to see the same information for merlin5 you have to add the parameter --clusters=merlin5. +If you want to see both clusters at the same time, add the option --federation.

    + +

    Examples:

    + +
    sinfo                      # 'sinfo' local cluster which is 'merlin6'
    +sinfo --clusters=merlin5   # 'sinfo' non-local cluster 'merlin5'
    +sinfo --federation         # 'sinfo' all clusters which are 'merlin5' & 'merlin6'
    +squeue                     # 'squeue' local cluster which is 'merlin6'
    +squeue --clusters=merlin5  # 'squeue' non-local cluster 'merlin5'
    +squeue --federation        # 'squeue' all clusters which are 'merlin5' & 'merlin6'
    +
    + +
    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin6/slurm-configuration.html b/merlin6/slurm-configuration.html new file mode 100644 index 0000000..97e46b0 --- /dev/null +++ b/merlin6/slurm-configuration.html @@ -0,0 +1,1234 @@ + + + + + + + + +Slurm Configuration | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Slurm Configuration

    +
    + + + +
    + + +
    This document describes a summary of the Merlin6 configuration.
    + + + + + + + +
    + + + + + + +

    This documentation shows basic Slurm configuration and options needed to run jobs in the Merlin6 CPU cluster.

    + +

    Merlin6 CPU nodes definition

    + +

    The following table show default and maximum resources that can be used per node:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NodesDef.#CPUsMax.#CPUs#ThreadsMax.Mem/CPUMax.Mem/NodeMax.SwapDef.#GPUsMax.#GPUs
    merlin-c-[001-024]1 core44 cores235200035200010000N/AN/A
    merlin-c-[101-124]1 core44 cores235200035200010000N/AN/A
    merlin-c-[201-224]1 core44 cores235200035200010000N/AN/A
    merlin-c-[301-312]1 core44 cores274880074880010000N/AN/A
    merlin-c-[313-318]1 core44 cores174880074880010000N/AN/A
    merlin-c-[319-324]1 core44 cores274880074880010000N/AN/A
    + +

    If nothing is specified, by default each core will use up to 8GB of memory. Memory can be increased with the --mem=<mem_in_MB> and +--mem-per-cpu=<mem_in_MB> options, and maximum memory allowed is Max.Mem/Node.

    + +

    In merlin6, Memory is considered a Consumable Resource, as well as the CPU. Hence, both resources will account when submitting a job, +and by default resources can not be oversubscribed. This is a main difference with the old merlin5 cluster, when only CPU were accounted, +and memory was by default oversubscribed.

    + + + +

    Merlin6 CPU cluster

    + +

    To run jobs in the merlin6 cluster users can optionally specify the cluster name in Slurm:

    + +
    #SBATCH --cluster=merlin6
    +
    + +

    If no cluster name is specified, by default any job will be submitted to this cluster (as this is the main cluster). +Hence, this would be only necessary if one has to deal with multiple clusters or when one has defined some environmental +variables which can modify the cluster name.

    + +

    Merlin6 CPU partitions

    + +

    Users might need to specify the Slurm partition. If no partition is specified, it will default to general:

    + +
    #SBATCH --partition=<partition_name>  # Possible <partition_name> values: general, daily, hourly
    +
    + +

    The following partitions (also known as queues) are configured in Slurm:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    CPU PartitionDefault TimeMax TimeMax NodesPriorityJobFactor*PriorityTier**DefMemPerCPU
    general1 day1 week50114000
    daily1 day1 day6750014000
    hourly1 hour1 hourunlimited100014000
    asa-general1 hour2 weeksunlimited123712
    asa-daily1 hour1 weekunlimited50023712
    asa-visas1 hour90 daysunlimited100043712
    asa-ansys1 hour90 daysunlimited1000415600
    mu3e1 day7 daysunlimited100043712
    + +

    *The PriorityJobFactor value will be added to the job priority (PARTITION column in sprio -l ). In other words, jobs sent to higher priority +partitions will usually run first (however, other factors such like job age or mainly fair share might affect to that decision). For the GPU +partitions, Slurm will also attempt first to allocate jobs on partitions with higher priority over partitions with lesser priority.

    + +

    **Jobs submitted to a partition with a higher PriorityTier value will be dispatched before pending jobs in partition with lower PriorityTier value +and, if possible, they will preempt running jobs from partitions with lower PriorityTier values.

    + +
      +
    • The general partition is the default. It can not have more than 50 nodes running jobs.
    • +
    • For daily this limitation is extended to 67 nodes.
    • +
    • For hourly there are no limits.
    • +
    • asa-general,asa-daily,asa-ansys,asa-visas and mu3e are private partitions, belonging to different experiments owning the machines. Access is restricted in all cases. However, by agreement with the experiments, nodes are usually added to the hourly partition as extra resources for the public resources.
    • +
    + + + +

    Merlin5 CPU Accounts

    + +

    Users need to ensure that the public merlin account is specified. No specifying account options would default to this account. +This is mostly needed by users which have multiple Slurm accounts, which may define by mistake a different account.

    + +
    #SBATCH --account=merlin  # Possible values: merlin, gfa-asa
    +
    + +

    Not all the accounts can be used on all partitions. This is resumed in the table below:

    + + + + + + + + + + + + + + + + + + + + + + +
    Slurm AccountSlurm Partitions
    merlinhourly,daily, general
    gfa-asaasa-general,asa-daily,asa-visas,asa-ansys,hourly,daily, general
    mu3emu3e
    + +

    Private accounts

    + +
      +
    • The gfa-asa and mu3e accounts are private accounts. These can be used for accessing dedicated +partitions with nodes owned by different groups.
    • +
    + +

    Slurm CPU specific options

    + +

    Some options are available when using CPUs. These are detailed here.

    + +

    Alternative Slurm options for CPU based jobs are available. Please refer to the man pages +for each Slurm command for further information about it (man salloc, man sbatch, man srun). +Below are listed the most common settings:

    + +
    #SBATCH --hint=[no]multithread
    +#SBATCH --ntasks=<ntasks>
    +#SBATCH --ntasks-per-core=<ntasks>
    +#SBATCH --ntasks-per-socket=<ntasks>
    +#SBATCH --ntasks-per-node=<ntasks>
    +#SBATCH --mem=<size[units]>
    +#SBATCH --mem-per-cpu=<size[units]>
    +#SBATCH --cpus-per-task=<ncpus>
    +#SBATCH --cpu-bind=[{quiet,verbose},]<type>  # only for 'srun' command
    +
    + +

    Enabling/Disabling Hyper-Threading

    + +

    The merlin6 cluster contains nodes with Hyper-Threading enabled. One should always specify +whether to use Hyper-Threading or not. If not defined, Slurm will generally use it (exceptions apply).

    + +
    #SBATCH --hint=multithread            # Use extra threads with in-core multi-threading.
    +#SBATCH --hint=nomultithread          # Don't use extra threads with in-core multi-threading.
    +
    + +

    Constraint / Features

    + +

    Slurm allows to define a set of features in the node definition. This can be used to filter and select nodes according to one or more +specific features. For the CPU nodes, we have the following features:

    + +
    NodeName=merlin-c-[001-024,101-124,201-224]   Features=mem_384gb,xeon-gold-6152
    +NodeName=merlin-c-[301-312]                   Features=mem_768gb,xeon-gold-6240r
    +NodeName=merlin-c-[313-318]                   Features=mem_768gb,xeon-gold-6240r
    +NodeName=merlin-c-[319-324]                   Features=mem_384gb,xeon-gold-6240r
    +
    + +

    Therefore, users running on hourly can select which node they want to use (fat memory nodes vs regular memory nodes, CPU type). +This is possible by using the option --constraint=<feature_name> in Slurm.

    + +

    Examples:

    +
      +
    1. Select nodes with 48 cores only (nodes with 2 x Xeon Gold 6240R): +
      sbatch --constraint=xeon-gold-6240r ...
      +
      +
    2. +
    3. Select nodes with 44 cores only (nodes with 2 x Xeon Gold 6152): +
      sbatch --constraint=xeon-gold-6152 ...
      +
      +
    4. +
    5. Select fat memory nodes only: +
      sbatch --constraint=mem_768gb ...
      +
      +
    6. +
    7. Select regular memory nodes only: +
      sbatch --constraint=mem_384gb ...
      +
      +
    8. +
    9. Select fat memory nodes with 48 cores only: +
      sbatch --constraint=mem_768gb,xeon-gold-6240r ...
      +
      +
    10. +
    + +

    Detailing exactly which type of nodes you want to use is important, therefore, for groups with private accounts (mu3e,gfa-asa) or for +public users running on the hourly partition, constraining nodes by features is recommended. This becomes even more important when +having heterogeneous clusters.

    + +

    Running jobs in the ‘merlin6’ cluster

    + +

    In this chapter we will cover basic settings that users need to specify in order to run jobs in the Merlin6 CPU cluster.

    + +

    User and job limits

    + +

    In the CPU cluster we provide some limits which basically apply to jobs and users. The idea behind this is to ensure a fair usage of the resources and to +avoid overabuse of the resources from a single user or job. However, applying limits might affect the overall usage efficiency of the cluster (in example, +pending jobs from a single user while having many idle nodes due to low overall activity is something that can be seen when user limits are applied). +In the same way, these limits can be also used to improve the efficiency of the cluster (in example, without any job size limits, a job requesting all +resources from the batch system would drain the entire cluster for fitting the job, which is undesirable).

    + +

    Hence, there is a need of setting up wise limits and to ensure that there is a fair usage of the resources, by trying to optimize the overall efficiency +of the cluster while allowing jobs of different nature and sizes (it is, single core based vs parallel jobs of different sizes) to run.

    + + + + + +

    Per job limits

    + +

    These are limits which apply to a single job. In other words, there is a maximum of resources a single job can use. Limits are described in the table below with the format: SlurmQoS(limits) (possible SlurmQoS values can be listed with the command sacctmgr show qos). Some limits will vary depending on the day and time of the week.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PartitionMon-Fri 0h-18hSun-Thu 18h-0hFrom Fri 18h to Mon 0h
    generalnormal(cpu=704,mem=2750G)normal(cpu=704,mem=2750G)normal(cpu=704,mem=2750G)
    dailydaytime(cpu=704,mem=2750G)nighttime(cpu=1408,mem=5500G)unlimited(cpu=2200,mem=8593.75G)
    hourlyunlimited(cpu=2200,mem=8593.75G)unlimited(cpu=2200,mem=8593.75G)unlimited(cpu=2200,mem=8593.75G)
    + +

    By default, a job can not use more than 704 cores (max CPU per job). In the same way, memory is also proportionally limited. This is equivalent as +running a job using up to 8 nodes at once. This limit applies to the general partition (fixed limit) and to the daily partition (only during working hours). +Limits are softed for the daily partition during non working hours, and during the weekend limits are even wider.

    + +

    For the hourly partition, despite running many parallel jobs is something not desirable (for allocating such jobs it requires massive draining of nodes), +wider limits are provided. In order to avoid massive nodes drain in the cluster, for allocating huge jobs, setting per job limits is necessary. Hence, unlimited QoS +mostly refers to “per user” limits more than to “per job” limits (in other words, users can run any number of hourly jobs, but the job size for such jobs is limited +with wide values).

    + +

    Per user limits for CPU partitions

    + +

    These limits which apply exclusively to users. In other words, there is a maximum of resources a single user can use. Limits are described in the table below with the format: SlurmQoS(limits) (possible SlurmQoS values can be listed with the command sacctmgr show qos). Some limits will vary depending on the day and time of the week.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PartitionMon-Fri 0h-18hSun-Thu 18h-0hFrom Fri 18h to Mon 0h
    generalnormal(cpu=704,mem=2750G)normal(cpu=704,mem=2750G)normal(cpu=704,mem=2750G)
    dailydaytime(cpu=1408,mem=5500G)nighttime(cpu=2112,mem=8250G)unlimited(cpu=6336,mem=24750G)
    hourlyunlimited(cpu=6336,mem=24750G)unlimited(cpu=6336,mem=24750G)unlimited(cpu=6336,mem=24750G)
    + +

    By default, users can not use more than 704 cores at the same time (max CPU per user). Memory is also proportionally limited in the same way. This is +equivalent to 8 exclusive nodes. This limit applies to the general partition (fixed limit) and to the daily partition (only during working hours). +For the hourly partition, there are no limits restriction and user limits are removed. Limits are softed for the daily partition during non +working hours, and during the weekend limits are removed.

    + +

    Advanced Slurm configuration

    + +

    Clusters at PSI use the Slurm Workload Manager as the batch system technology for managing and scheduling jobs. +Slurm has been installed in a multi-clustered configuration, allowing to integrate multiple clusters in the same batch system.

    + +

    For understanding the Slurm configuration setup in the cluster, sometimes may be useful to check the following files:

    + +
      +
    • /etc/slurm/slurm.conf - can be found in the login nodes and computing nodes.
    • +
    • /etc/slurm/gres.conf - can be found in the GPU nodes, is also propgated to login nodes and computing nodes for user read access.
    • +
    • /etc/slurm/cgroup.conf - can be found in the computing nodes, is also propagated to login nodes for user read access.
    • +
    + +

    The previous configuration files which can be found in the login nodes, correspond exclusively to the merlin6 cluster configuration files. +Configuration files for the old merlin5 cluster or for the gmerlin6 cluster must be checked directly on any of the merlin5 or gmerlin6 computing nodes (in example, by login in to one of the nodes while a job or an active allocation is running).

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin6/slurm-examples.html b/merlin6/slurm-examples.html new file mode 100644 index 0000000..6c3168c --- /dev/null +++ b/merlin6/slurm-examples.html @@ -0,0 +1,1102 @@ + + + + + + + + +Slurm Examples | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Slurm Examples

    +
    + + + +
    + + +
    This document shows different template examples for running jobs in the Merlin cluster.
    + + + + + + + +
    + + + + + + +

    Single core based job examples

    + +

    Example 1: Hyperthreaded job

    + +

    In this example we want to use hyperthreading (--ntasks-per-core=2 and --hint=multithread). In our Merlin6 configuration, +the default memory per CPU (a CPU is equivalent to a core thread) is 4000MB, hence each task can use up 8000MB (2 threads x 4000MB).

    + +
    #!/bin/bash
    +#SBATCH --partition=hourly      # Using 'hourly' will grant higher priority
    +#SBATCH --ntasks-per-core=2     # Request the max ntasks be invoked on each core
    +#SBATCH --hint=multithread      # Use extra threads with in-core multi-threading
    +#SBATCH --time=00:30:00         # Define max time job will run
    +#SBATCH --output=myscript.out   # Define your output file
    +#SBATCH --error=myscript.err    # Define your error file
    +
    +module purge
    +module load $MODULE_NAME # where $MODULE_NAME is a software in PModules
    +srun $MYEXEC             # where $MYEXEC is a path to your binary file
    +
    + +

    Example 2: Non-hyperthreaded job

    + +

    In this example we do not want hyper-threading (--ntasks-per-core=1 and --hint=nomultithread). In our Merlin6 configuration, +the default memory per cpu (a CPU is equivalent to a core thread) is 4000MB. If we do not specify anything else, our +single core task will use a default of 4000MB. However, one could double it with --mem-per-cpu=8000 if you require more memory +(remember, the second thread will not be used so we can safely assign +4000MB to the unique active thread).

    + +
    #!/bin/bash
    +#SBATCH --partition=hourly      # Using 'hourly' will grant higher priority
    +#SBATCH --ntasks-per-core=1     # Request the max ntasks be invoked on each core
    +#SBATCH --hint=nomultithread    # Don't use extra threads with in-core multi-threading
    +#SBATCH --time=00:30:00         # Define max time job will run
    +#SBATCH --output=myscript.out   # Define your output file
    +#SBATCH --error=myscript.err    # Define your error file
    +
    +module purge
    +module load $MODULE_NAME # where $MODULE_NAME is a software in PModules
    +srun $MYEXEC             # where $MYEXEC is a path to your binary file
    +
    + +

    Multi core based job examples

    + +

    Example 1: MPI with Hyper-Threading

    + +

    In this example we run a job that will run 88 tasks. Merlin6 Apollo nodes have 44 cores each one with hyper-threading +enabled. This means that we can run 2 threads per core, in total 88 threads. To accomplish that, users should specify +--ntasks-per-core=2 and --hint=multithread.

    + +

    Use --nodes=1 if you want to use a node exclusively (88 hyperthreaded tasks would fit in a Merlin6 node).

    + +
    #!/bin/bash
    +#SBATCH --partition=hourly      # Using 'hourly' will grant higher priority
    +#SBATCH --ntasks=88             # Job will run 88 tasks
    +#SBATCH --ntasks-per-core=2     # Request the max ntasks be invoked on each core
    +#SBATCH --hint=multithread      # Use extra threads with in-core multi-threading
    +#SBATCH --time=00:30:00         # Define max time job will run
    +#SBATCH --output=myscript.out   # Define your output file
    +#SBATCH --error=myscript.err    # Define your error file
    +
    +module purge
    +module load $MODULE_NAME # where $MODULE_NAME is a software in PModules
    +srun $MYEXEC             # where $MYEXEC is a path to your binary file
    +
    + +

    Example 2: MPI without Hyper-Threading

    + +

    In this example, we want to run a job that will run 44 tasks, and due to performance reasons we want to disable hyper-threading. +Merlin6 Apollo nodes have 44 cores, each one with hyper-threading enabled. For ensuring that only 1 thread will be used per task, +users should specify --ntasks-per-core=1 and --hint=nomultithread. With this configuration, we tell Slurm to run only 1 +tasks per core and no hyperthreading should be used. Hence, each tasks will be assigned to an independent core.

    + +

    Use --nodes=1 if you want to use a node exclusively (44 non-hyperthreaded tasks would fit in a Merlin6 node).

    + +
    #!/bin/bash
    +#SBATCH --partition=hourly      # Using 'hourly' will grant higher priority
    +#SBATCH --ntasks=44             # Job will run 44 tasks
    +#SBATCH --ntasks-per-core=1     # Request the max ntasks be invoked on each core
    +#SBATCH --hint=nomultithread    # Don't use extra threads with in-core multi-threading
    +#SBATCH --time=00:30:00         # Define max time job will run
    +#SBATCH --output=myscript.out   # Define your output file
    +#SBATCH --error=myscript.err    # Define your output file
    +
    +module purge
    +module load $MODULE_NAME # where $MODULE_NAME is a software in PModules
    +srun $MYEXEC             # where $MYEXEC is a path to your binary file
    +
    + +

    Example 3: Hyperthreaded Hybrid MPI/OpenMP job

    + +

    In this example, we want to run a Hybrid Job using MPI and OpenMP using hyperthreading. In this job, we want to run 4 MPI +tasks by using 8 CPUs per task. Each task in our example requires 128GB of memory. Then we specify 16000MB per CPU +(8 x 16000MB = 128000MB). Notice that since hyperthreading is enabled, Slurm will use 4 cores per task (with hyperthreading +2 threads -a.k.a. Slurm CPUs- fit into a core).

    + +
    #!/bin/bash -l
    +#SBATCH --clusters=merlin6
    +#SBATCH --job-name=test
    +#SBATCH --ntasks=4
    +#SBATCH --ntasks-per-socket=1
    +#SBATCH --mem-per-cpu=16000
    +#SBATCH --cpus-per-task=8
    +#SBATCH --partition=hourly
    +#SBATCH --time=01:00:00
    +#SBATCH --output=srun_%j.out
    +#SBATCH --error=srun_%j.err
    +#SBATCH --hint=multithread
    +
    +module purge
    +module load $MODULE_NAME # where $MODULE_NAME is a software in PModules
    +srun $MYEXEC             # where $MYEXEC is a path to your binary file
    +
    + + + +

    Example 4: Non-hyperthreaded Hybrid MPI/OpenMP job

    + +

    In this example, we want to run a Hybrid Job using MPI and OpenMP without hyperthreading. In this job, we want to run 4 MPI +tasks by using 8 CPUs per task. Each task in our example requires 128GB of memory. Then we specify 16000MB per CPU +(8 x 16000MB = 128000MB). Notice that since hyperthreading is disabled, Slurm will use 8 cores per task (disabling hyperthreading +we force the use of only 1 thread -a.k.a. 1 CPU- per core).

    + +
    #!/bin/bash -l
    +#SBATCH --clusters=merlin6
    +#SBATCH --job-name=test
    +#SBATCH --ntasks=4
    +#SBATCH --ntasks-per-socket=1
    +#SBATCH --mem-per-cpu=16000
    +#SBATCH --cpus-per-task=8
    +#SBATCH --partition=hourly
    +#SBATCH --time=01:00:00
    +#SBATCH --output=srun_%j.out
    +#SBATCH --error=srun_%j.err
    +#SBATCH --hint=nomultithread
    +
    +module purge
    +module load $MODULE_NAME # where $MODULE_NAME is a software in PModules
    +srun $MYEXEC             # where $MYEXEC is a path to your binary file
    +
    + + + +

    GPU examples

    + +

    Using GPUs requires two major changes. First, the cluster needs to be specified +to gmerlin6. This should also be added to later commands pertaining to the +job, e.g. scancel --cluster=gmerlin6 <jobid>. Second, the number of GPUs +should be specified using --gpus, --gpus-per-task, or similar parameters. +Here’s an example for a simple test job:

    + +
    #!/bin/bash
    +#SBATCH --partition=gpu         # Or 'gpu-short' for higher priority but 2-hour limit
    +#SBATCH --cluster=gmerlin6      # Required for GPU
    +#SBATCH --gpus=2                # Total number of GPUs
    +#SBATCH --cpus-per-gpu=5        # Request CPU resources
    +#SBATCH --time=1-00:00:00       # Define max time job will run
    +#SBATCH --output=myscript.out   # Define your output file
    +#SBATCH --error=myscript.err    # Define your error file
    +
    +module purge
    +module load cuda                # load any needed modules here
    +srun $MYEXEC                    # where $MYEXEC is a path to your binary file
    +
    + +

    Slurm will automatically set the gpu visibility (eg $CUDA_VISIBLE_DEVICES).

    + +

    Advanced examples

    + + + +

    If you need to run a large number of jobs based on the same executable with systematically varying inputs, +e.g. for a parameter sweep, you can do this most easily in form of a simple array job.

    + +
    #!/bin/bash
    +#SBATCH --job-name=test-array
    +#SBATCH --partition=daily
    +#SBATCH --ntasks=1
    +#SBATCH --time=08:00:00
    +#SBATCH --array=1-8
    +
    +echo $(date) "I am job number ${SLURM_ARRAY_TASK_ID}"
    +srun $MYEXEC config-file-${SLURM_ARRAY_TASK_ID}.dat
    +
    + +

    This will run 8 independent jobs, where each job can use the counter +variable SLURM_ARRAY_TASK_ID defined by Slurm inside of the job’s +environment to feed the correct input arguments or configuration file +to the “myprogram” executable. Each job will receive the same set of +configurations (e.g. time limit of 8h in the example above).

    + +

    The jobs are independent, but they will run in parallel (if the cluster resources allow for +it). The jobs will get JobIDs like {some-number}_0 to {some-number}_7, and they also will each +have their own output file.

    + +

    Note:

    +
      +
    • Do not use such jobs if you have very short tasks, since each array sub job will incur the full overhead for launching an independent Slurm job. For such cases you should used a packed job (see below).
    • +
    • If you want to control how many of these jobs can run in parallel, you can use the #SBATCH --array=1-100%5 syntax. The %5 will define +that only 5 sub jobs may ever run in parallel.
    • +
    + +

    You also can use an array job approach to run over all files in a directory, substituting the payload with

    + +
    FILES=(/path/to/data/*)
    +srun $MYEXEC ${FILES[$SLURM_ARRAY_TASK_ID]}
    +
    + +

    Or for a trivial case you could supply the values for a parameter scan in form +of a argument list that gets fed to the program using the counter variable.

    + +
    ARGS=(0.05 0.25 0.5 1 2 5 100)
    +srun $MYEXEC ${ARGS[$SLURM_ARRAY_TASK_ID]}
    +
    + +

    Array jobs: running very long tasks with checkpoint files

    + +

    If you need to run a job for much longer than the queues (partitions) permit, and +your executable is able to create checkpoint files, you can use this +strategy:

    + +
    #!/bin/bash
    +#SBATCH --job-name=test-checkpoint
    +#SBATCH --partition=general
    +#SBATCH --ntasks=1
    +#SBATCH --time=7-00:00:00       # each job can run for 7 days
    +#SBATCH --cpus-per-task=1
    +#SBATCH --array=1-10%1   # Run a 10-job array, one job at a time.
    +if test -e checkpointfile; then
    +     # There is a checkpoint file;
    +     $MYEXEC --read-checkp checkpointfile
    +else
    +     # There is no checkpoint file, start a new simulation.
    +     $MYEXEC
    +fi
    +
    + +

    The %1 in the #SBATCH --array=1-10%1 statement defines that only 1 subjob can ever run in parallel, so +this will result in subjob n+1 only being started when job n has finished. It will read the checkpoint file +if it is present.

    + +

    Packed jobs: running a large number of short tasks

    + +

    Since the launching of a Slurm job incurs some overhead, you should not submit each short task as a separate +Slurm job. Use job packing, i.e. you run the short tasks within the loop of a single Slurm job.

    + +

    You can launch the short tasks using srun with the --exclusive switch (not to be confused with the +switch of the same name used in the SBATCH commands). This switch will ensure that only a specified +number of tasks can run in parallel.

    + +

    As an example, the following job submission script will ask Slurm for +44 cores (threads), then it will run the =myprog= program 1000 times with +arguments passed from 1 to 1000. But with the =-N1 -n1 -c1 +–exclusive= option, it will control that at any point in time only 44 +instances are effectively running, each being allocated one CPU. You +can at this point decide to allocate several CPUs or tasks by adapting +the corresponding parameters.

    + +
    #! /bin/bash
    +#SBATCH --job-name=test-checkpoint
    +#SBATCH --partition=general
    +#SBATCH --ntasks=1
    +#SBATCH --time=7-00:00:00
    +#SBATCH --ntasks=44    # defines the number of parallel tasks
    +for i in {1..1000}
    +do
    +   srun -N1 -n1 -c1 --exclusive $MYEXEC $i &
    +done
    +wait
    +
    + +

    Note: The & at the end of the srun line is needed to not have the script waiting (blocking). +The wait command waits for all such background tasks to finish and returns the exit code.

    + +

    Hands-On Example

    + +

    Copy-paste the following example in a file called myAdvancedTest.batch):

    + +
    #!/bin/bash
    +#SBATCH --partition=daily    # name of slurm partition to submit
    +#SBATCH --time=2:00:00       # limit the execution of this job to 2 hours, see sinfo for the max. allowance
    +#SBATCH --nodes=2            # number of nodes
    +#SBATCH --ntasks=44          # number of tasks
    +#SBATCH --ntasks-per-core=1  # Request the max ntasks be invoked on each core
    +#SBATCH --hint=nomultithread # Don't use extra threads with in-core multi-threading
    +
    +module load gcc/9.2.0 openmpi/3.1.5-1_merlin6
    +module list
    +
    +echo "Example no-MPI:" ; hostname        # will print one hostname per node
    +echo "Example MPI:"    ; srun hostname # will print one hostname per ntask
    +
    + +

    In the above example are specified the options --nodes=2 and --ntasks=44. This means that up 2 nodes are requested, +and is expected to run 44 tasks. Hence, 44 cores are needed for running that job. Slurm will try to allocate a maximum of +2 nodes, both together having at least 44 cores. Since our nodes have 44 cores / each, if nodes are empty (no other users +have running jobs there), job can land on a single node (it has enough cores to run 44 tasks).

    + +

    If we want to ensure that job is using at least two different nodes (i.e. for boosting CPU frequency, or because the job +requires more memory per core) you should specify other options.

    + +

    A good example is --ntasks-per-node=22. This will equally distribute 22 tasks on 2 nodes.

    + +
    #SBATCH --ntasks-per-node=22
    +
    + +

    A different example could be by specifying how much memory per core is needed. For instance --mem-per-cpu=32000 will reserve +~32000MB per core. Since we have a maximum of 352000MB per Apollo node, Slurm will be only able to allocate 11 cores (32000MB x 11cores = 352000MB) per node. +It means that 4 nodes will be needed (max 11 tasks per node due to memory definition, and we need to run 44 tasks), in this case we need to change --nodes=4 +(or remove --nodes). Alternatively, we can decrease --mem-per-cpu to a lower value which can allow the use of at least 44 cores per node (i.e. with 16000 +should be able to use 2 nodes)

    + +
    #SBATCH --mem-per-cpu=16000
    +
    + +

    Finally, in order to ensure exclusivity of the node, an option –exclusive can be used (see below). This will ensure that +the requested nodes are exclusive for the job (no other users jobs will interact with this node, and only completely +free nodes will be allocated).

    + +
    #SBATCH --exclusive
    +
    + +

    This can be combined with the previous examples.

    + +

    More advanced configurations can be defined and can be combined with the previous examples. More information about advanced +options can be found in the following link: https://slurm.schedmd.com/sbatch.html (or run ‘man sbatch’).

    + +

    If you have questions about how to properly execute your jobs, please contact us through merlin-admins@lists.psi.ch. Do not run +advanced configurations unless your are sure of what you are doing.

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin6/ssh-keys.html b/merlin6/ssh-keys.html new file mode 100644 index 0000000..cc5e634 --- /dev/null +++ b/merlin6/ssh-keys.html @@ -0,0 +1,931 @@ + + + + + + + + +Configuring SSH Keys in Merlin | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Configuring SSH Keys in Merlin

    +
    + + + +
    + + +
    This document describes how to deploy SSH Keys in Merlin.
    + + + + + + + +
    + + + + + + +

    Merlin users sometimes will need to access the different Merlin services without being constantly requested by a password. +One can achieve that with Kerberos authentication, however in some cases some software would require the setup of SSH Keys. +One example is ANSYS Fluent, which, when used interactively, the way of communication between the GUI and the different nodes +is through the SSH protocol, and the use of SSH Keys is enforced.

    + +

    Setting up SSH Keys on Merlin

    + +

    For security reason, users must always protect SSH Keys with a passphrase.

    + +

    User can check whether a SSH key already exists. These would be placed in the ~/.ssh/ directory. RSA encryption +is usually the default one, and files in there would be id_rsa (private key) and id_rsa.pub (public key).

    + +
    ls ~/.ssh/id*   
    +
    + +

    For creating SSH RSA Keys, one should:

    + +
      +
    1. Run ssh-keygen, a password will be requested twice. You must remember this password for the future. +
        +
      • Due to security reasons, always try protecting it with a password. There is only one exception, when running ANSYS software, which in general should not use password to simplify the way of running the software in Slurm.
      • +
      • This will generate a private key id_rsa, and a public key id_rsa.pub in your ~/.ssh directory.
      • +
      +
    2. +
    3. Add your public key to the authorized_keys file, and ensure proper permissions for that file, as follows: +
      cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
      +chmod 0600 ~/.ssh/authorized_keys
      +
      +
    4. +
    5. Configure the SSH client in order to force the usage of the psi.ch domain for trusting keys: +
      echo "CanonicalizeHostname yes" >> ~/.ssh/config
      +
      +
    6. +
    7. Configure further SSH options as follows: +
      echo "AddKeysToAgent yes" >> ~/.ssh/config
      +echo "ForwardAgent yes" >> ~/.ssh/config
      +
      +

      Other options may be added.

      +
    8. +
    9. Check that your SSH config file contains at least the lines mentioned in steps 3 and 4: +
      (base)[caubet_m@merlin-l-001:/data/user/caubet_m]# cat ~/.ssh/config
      +CanonicalizeHostname yes
      +AddKeysToAgent yes
      +ForwardAgent yes
      +
      +
    10. +
    + +

    Using the SSH Keys

    + +

    Using Authentication Agent in SSH session

    + +

    By default, when accessing the login node via SSH (with ForwardAgent=yes), it will automatically add your +SSH Keys to the authentication agent. Hence, no actions should not be needed by the user. One can configure +ForwardAgent=yes as follows:

    + +
      +
    • (Recommended) In your local Linux (workstation, laptop or desktop) add the following line in the + $HOME/.ssh/config (or alternatively in /etc/ssh/ssh_config) file: +
         ForwardAgent yes
      +
      +
    • +
    • Alternatively, on each SSH you can add the option ForwardAgent=yes in the SSH command. In example: +
         ssh -XY -o ForwardAgent=yes merlin-l-001.psi.ch
      +
      +
    • +
    + +

    If ForwardAgent is not enabled as shown above, one needs to run the authentication agent and then add your key +to the ssh-agent. This must be done once per SSH session, as follows:

    + +
      +
    • Run eval $(ssh-agent -s) to run the ssh-agent in that SSH session
    • +
    • Check whether the authentication agent has your key already added: +
         ssh-add -l | grep "/psi/home/$(whoami)/.ssh"
      +
      +
    • +
    • If no key is returned in the previous step, you have to add the private key identity to the authentication agent. + You will be requested for the passphrase of your key, and it can be done by running: +
         ssh-add
      +
      +
    • +
    + +

    Using Authentication Agent in NoMachine Session

    + +

    By default, when using a NoMachine session, the ssh-agent should be automatically started. Hence, there is no need of +starting the agent or forwarding it.

    + +

    However, for NoMachine one always need to add the private key identity to the authentication agent. This can be done as follows:

    + +
      +
    1. Check whether the authentication agent has already the key added: +
      ssh-add -l | grep "/psi/home/$(whoami)/.ssh"
      +
      +
    2. +
    3. If no key is returned in the previous step, you have to add the private key identity to the authentication agent. +You will be requested for the passphrase of your key, and it can be done by running: +
      ssh-add
      +
      +
    4. +
    + +

    You just need to run it once per NoMachine session, and it would apply to all terminal windows within that NoMachine session.

    + +

    Troubleshooting

    + +

    Errors when running ‘ssh-add’

    + +

    If the error Could not open a connection to your authentication agent. appears when running ssh-add, it means +that the authentication agent is not running. Please follow the previous procedures for starting it.

    + +

    Add/Update SSH RSA Key password

    + +

    If an existing SSH Key does not have password, or you want to update an existing password with a new one, you can do it as follows:

    + +
    ssh-keygen -p -f ~/.ssh/id_rsa
    +
    + +

    SSH Keys deployed but not working

    + +

    Please ensure proper permissions of the involved files, as well as any typos in the file names involved:

    + +
    chmod u+rwx,go-rwx,g+s ~/.ssh
    +chmod u+rw-x,go-rwx    ~/.ssh/authorized_keys
    +chmod u+rw-x,go-rwx    ~/.ssh/id_rsa
    +chmod u+rw-x,go+r-wx   ~/.ssh/id_rsa.pub
    +
    + +

    Testing SSH Keys

    + +

    Once SSH Key is created, for testing that the SSH Key is valid, one can do the following:

    + +
      +
    1. Create a new SSH session in one of the login nodes: +
      ssh merlin-l-001
      +
      +
    2. +
    3. In the login node session, destroy any existing Kerberos ticket or active SSH Key: +
      kdestroy
      +ssh-add -D
      +
      +
    4. +
    5. Add the new private key identity to the authentication agent. You will be requested by the passphrase. +
      ssh-add
      +
      +
    6. +
    7. Check that your key is active by the SSH agent: +
      ssh-add -l
      +
      +
    8. +
    9. SSH to the second login node. No password should be requested: +
      ssh -vvv merlin-l-002
      +
      +
    10. +
    + +

    If the last step succeeds, then means that your SSH Key is properly setup.

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin6/storage.html b/merlin6/storage.html new file mode 100644 index 0000000..30e271b --- /dev/null +++ b/merlin6/storage.html @@ -0,0 +1,1114 @@ + + + + + + + + +Merlin6 Storage | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Merlin6 Storage

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    Introduction

    + +

    This document describes the different directories of the Merlin6 cluster.

    + +

    User and project data

    + +
      +
    • Users are responsible for backing up their own data. Is recommended to backup the data on third party independent systems (i.e. LTS, Archive, AFS, SwitchDrive, Windows Shares, etc.). +
        +
      • /psi/home, as this contains a small amount of data, is the only directory where we can provide daily snapshots for one week. This can be found in the following directory /psi/home/.snapshot/
      • +
      +
    • +
    • When a user leaves PSI, she or her supervisor/team are responsible to backup and move the data out from the cluster: every few months, the storage space will be recycled for those old users who do not have an existing and valid PSI account.
    • +
    + + + +

    Checking user quota

    + +

    For each directory, we provide a way for checking quotas (when required). However, a single command merlin_quotas +is provided. This is useful to show with a single command all quotas for your filesystems (including AFS, which is not mentioned here).

    + +

    To check your quotas, please run:

    + +
    merlin_quotas
    +
    + +

    Merlin6 directories

    + +

    Merlin6 offers the following directory classes for users:

    + +
      +
    • /psi/home/<username>: Private user home directory
    • +
    • /data/user/<username>: Private user data directory
    • +
    • /data/project/general/<projectname>: Shared Project directory +
        +
      • For BIO experiments, a dedicated /data/project/bio/$projectname exists.
      • +
      +
    • +
    • /scratch: Local scratch disk (only visible by the node running a job).
    • +
    • /shared-scratch: Shared scratch disk (visible from all nodes).
    • +
    • /export: Export directory for data transfer, visible from ra-merlin-01.psi.ch, ra-merlin-02.psi.ch and Merlin login nodes. +
        +
      • Refer to Transferring Data for more information about the export area and data transfer service.
      • +
      +
    • +
    + + + +

    Properties of the directory classes:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    DirectoryBlock Quota [Soft:Hard]Block Quota [Soft:Hard]GraceTimeQuota Change Policy: BlockQuota Change Policy: FilesBackupBackup Policy
    /psi/home/$usernameUSR [10GB:11GB]UndefN/AUp to x2 when strongly justified.N/AyesDaily snapshots for 1 week
    /data/user/$usernameUSR [1TB:1.074TB]USR [1M:1.1M]7dInmutable. Need a project.Changeable when justified.noUsers responsible for backup
    /data/project/bio/$projectnameGRP [1TB:1.074TB]GRP [1M:1.1M]7dSubject to project requirements.Subject to project requirements.noProject responsible for backup
    /data/project/general/$projectnameGRP [1TB:1.074TB]GRP [1M:1.1M]7dSubject to project requirements.Subject to project requirements.noProject responsible for backup
    /scratchUndefUndefN/AN/AN/AnoN/A
    /shared-scratchUSR [512GB:2TB]USR [2M:2.5M]7dUp to x2 when strongly justified.Changeable when justified.noN/A
    /exportUSR [10MB:20TB]USR [512K:5M]10dSoft can be temporary increased.Changeable when justified.noN/A
    + + + +

    User home directory

    + +

    This is the default directory users will land when login in to any Merlin6 machine. +It is intended for your scripts, documents, software development, and other files which +you want to have backuped. Do not use it for data or HPC I/O-hungry tasks.

    + +

    This directory is mounted in the login and computing nodes under the path:

    + +
    /psi/home/$username
    +
    + +

    Home directories are part of the PSI NFS Central Home storage provided by AIT and +are managed by the Merlin6 administrators.

    + +

    Users can check their quota by running the following command:

    + +
    quota -s
    +
    + +

    Home directory policy

    + +
      +
    • Read Important: Code of Conduct for more information about Merlin6 policies.
    • +
    • Is forbidden to use the home directories for IO intensive tasks +
        +
      • Use /scratch, /shared-scratch, /data/user or /data/project for this purpose.
      • +
      +
    • +
    • +

      Users can retrieve up to 1 week of their lost data thanks to the automatic daily snapshots for 1 week. +Snapshots can be accessed at this path:

      + +
       /psi/home/.snapshop/$username
      +
      +
    • +
    + +

    User data directory

    + +

    The user data directory is intended for fast IO access and keeping large amounts of private data. +This directory is mounted in the login and computing nodes under the directory

    + +
    /data/user/$username
    +
    + +

    Users can check their quota by running the following command:

    + +
    mmlsquota -u <username> --block-size auto merlin-user
    +
    + +

    User data directory policy

    + +
      +
    • Read Important: Code of Conduct for more information about Merlin6 policies.
    • +
    • Is forbidden to use the data directories as scratch area during a job runtime. +
        +
      • Use /scratch, /shared-scratch for this purpose.
      • +
      +
    • +
    • No backup policy is applied for user data directories: users are responsible for backing up their data.
    • +
    + +

    Project data directory

    + +

    This storage is intended for fast IO access and keeping large amounts of a project’s data, where the data also can be +shared by all members of the project (the project’s corresponding unix group). We recommend to keep most data in +project related storage spaces, since it allows users to coordinate. Also, project spaces have more flexible policies +regarding extending the available storage space.

    + +

    Experiments can request a project space as described in [Accessing Merlin -> Requesting a Project]

    + +

    Once created, the project data directory will be mounted in the login and computing nodes under the dirctory:

    + +
    /data/project/general/$projectname
    +
    + +

    Project quotas are defined on a per group basis. Users can check the project quota by running the following command:

    + +
    mmlsquota -j $projectname --block-size auto -C merlin.psi.ch merlin-proj
    +
    + +

    Project Directory policy

    + +
      +
    • Read Important: Code of Conduct for more information about Merlin6 policies.
    • +
    • It is forbidden to use the data directories as scratch area during a job’s runtime, i.e. for high throughput I/O for a job’s temporary files. Please Use /scratch, /shared-scratch for this purpose.
    • +
    • No backups: users are responsible for managing the backups of their data directories.
    • +
    + +

    Scratch directories

    + +

    There are two different types of scratch storage: local (/scratch) and shared (/shared-scratch).

    + +

    local scratch should be used for all jobs that do not require the scratch files to be accessible from multiple nodes, which is trivially +true for all jobs running on a single node. +shared scratch is intended for files that need to be accessible by multiple nodes, e.g. by a MPI-job where tasks are spread out over the cluster +and all tasks need to do I/O on the same temporary files.

    + +

    local scratch in Merlin6 computing nodes provides a huge number of IOPS thanks to the NVMe technology. Shared scratch is implemented using a distributed parallel filesystem (GPFS) resulting in a higher latency, since it involves remote storage resources and more complex I/O coordination.

    + +

    /shared-scratch is only mounted in the Merlin6 computing nodes (i.e. not on the login nodes), and its current size is 50TB. This can be increased in the future.

    + +

    The properties of the available scratch storage spaces are given in the following table

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ClusterServiceScratchScratch MountpointShared ScratchShared Scratch MountpointComments
    merlin5computing node50GB / SAS/scratchN/AN/Amerlin-c-[01-64]
    merlin6login node100GB / SAS/scratch50TB / GPFS/shared-scratchmerlin-l-0[1,2]
    merlin6computing node1.3TB / NVMe/scratch50TB / GPFS/shared-scratchmerlin-c-[001-024,101-124,201-224]
    merlin6login node2.0TB / NVMe/scratch50TB / GPFS/shared-scratchmerlin-l-00[1,2]
    + +

    Scratch directories policy

    + +
      +
    • Read Important: Code of Conduct for more information about Merlin6 policies.
    • +
    • By default, always use local first and only use shared if your specific use case requires it.
    • +
    • Temporary files must be deleted at the end of the job by the user. +
        +
      • Remaining files will be deleted by the system if detected. +
          +
        • Files not accessed within 28 days will be automatically cleaned up by the system.
        • +
        • If for some reason the scratch areas get full, admins have the rights to cleanup the oldest data.
        • +
        +
      • +
      +
    • +
    + +

    Export directory

    + +

    Export directory is exclusively intended for transferring data from outside PSI to Merlin and viceversa. Is a temporary directoy with an auto-cleanup policy. +Please read Transferring Data for more information about it.

    + +

    Export directory policy

    + +
      +
    • Temporary files must be deleted at the end of the job by the user. +
        +
      • Remaining files will be deleted by the system if detected. +
          +
        • Files not accessed within 28 days will be automatically cleaned up by the system.
        • +
        • If for some reason the export area gets full, admins have the rights to cleanup the oldest data
        • +
        +
      • +
      +
    • +
    + +
    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin6/transfer-data.html b/merlin6/transfer-data.html new file mode 100644 index 0000000..f8c538b --- /dev/null +++ b/merlin6/transfer-data.html @@ -0,0 +1,955 @@ + + + + + + + + +Transferring Data | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Transferring Data

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    Overview

    + +

    Most methods allow data to be either transmitted or received, so it may make sense to +initiate the transfer from either merlin or the other system, depending on the network +visibility.

    + +
      +
    • Merlin login nodes are visible from the PSI network, so direct data transfer +(rsync/WinSCP) is generally preferable. This can be initiated from either endpoint.
    • +
    • Merlin login nodes can access the internet using a limited set of protocols +
        +
      • SSH-based protocols using port 22 (rsync-over-ssh, sftp, WinSCP, etc)
      • +
      • HTTP-based protocols using ports 80 or 445 (https, WebDav, etc)
      • +
      • Protocols using other ports require admin configuration and may only work with +specific hosts (ftp, rsync daemons, etc)
      • +
      +
    • +
    • Systems on the internet can access the PSI Data Transfer service +datatransfer.psi.ch, using ssh-based protocols and Globus
    • +
    + +

    Direct transfer via Merlin6 login nodes

    + +

    The following methods transfer data directly via the login +nodes. They are suitable +for use from within the PSI network.

    + +

    Rsync

    + +

    Rsync is the preferred method to transfer data from Linux/MacOS. It allows +transfers to be easily resumed if they get interrupted. The general syntax is:

    + +
    rsync -avAHXS <src> <dst>
    +
    + +

    For example, to transfer files from your local computer to a merlin project +directory:

    + +
    rsync -avAHXS ~/localdata user@merlin-l-01.psi.ch:/data/project/general/myproject/
    +
    + +

    You can resume interrupted transfers by simply rerunning the command. Previously +transferred files will be skipped.

    + +

    WinSCP

    + +

    The WinSCP tool can be used for remote file transfer on Windows. It is available +from the Software Kiosk on PSI machines. Add merlin-l-01.psi.ch as a host and +connect with your PSI credentials. You can then drag-and-drop files between your +local computer and merlin.

    + +

    SWITCHfilesender

    + +

    SWITCHfilesender is an installation of the FileSender project (filesender.org) which is a web based application that allows authenticated users to securely and easily send arbitrarily large files to other users.

    + +

    Authentication of users is provided through SimpleSAMLphp, supporting SAML2, LDAP and RADIUS and more. Users without an account can be sent an upload voucher by an authenticated user. FileSender is developed to the requirements of the higher education and research community.

    + +

    The purpose of the software is to send a large file to someone, have that file available for download for a certain number of downloads and/or a certain amount of time, and after that automatically delete the file. The software is not intended as a permanent file publishing platform.

    + +

    SWITCHfilesender is fully integrated with PSI, therefore, PSI employees can log in by using their PSI account (through Authentication and Authorization Infrastructure / AAI, by selecting PSI as the institution to be used for log in).

    + +

    PSI Data Transfer

    + +

    From August 2024, Merlin is connected to the PSI Data Transfer service, +datatransfer.psi.ch. This is a central service managed by the Linux team. However, any problems or questions related to it can be directly +reported to the Merlin administrators, which will forward the request if necessary.

    + +

    The PSI Data Transfer servers supports the following protocols:

    +
      +
    • Data Transfer - SSH (scp / rsync)
    • +
    • Data Transfer - Globus
    • +
    + +

    Notice that datatransfer.psi.ch does not allow SSH login, only rsync, scp and Globus access is allowed.

    + +

    The following filesystems are mounted:

    +
      +
    • /merlin/export which points to the /export directory in Merlin.
    • +
    • /merlin/data/experiment/mu3e which points to the /data/experiment/mu3e directories in Merlin. +
        +
      • Mu3e sub-directories are mounted in RW (read-write), except for data (read-only mounted)
      • +
      +
    • +
    • /merlin/data/project/general which points to the /data/project/general directories in Merlin. +
        +
      • Owners of Merlin projects should request explicit access to it.
      • +
      • Currently, only CSCS is available for transferring files between PizDaint/Alps and Merlin
      • +
      +
    • +
    • /merlin/data/project/bio which points to the /data/project/bio directories in Merlin.
    • +
    • /merlin/data/user which points to the /data/user directories in Merlin.
    • +
    + +

    Access to the PSI Data Transfer uses Multi factor authentication (MFA). +Therefore, having the Microsoft Authenticator App is required as explained here.

    + + + +

    Directories

    + +

    /merlin/data/user

    + +

    User data directories are mounted in RW.

    + + + +

    /merlin/export

    + +

    Transferring big amounts of data from outside PSI to Merlin is always possible through /export.

    + + + + + +
    Exporting data from Merlin
    + +

    For exporting data from Merlin to outside PSI by using /export, one has to:

    +
      +
    • From a Merlin login node, copy your data from any directory (i.e. /data/project, /data/user, /scratch) to +/export. Ensure to properly secure your directories and files with proper permissions.
    • +
    • Once data is copied, from datatransfer.psi.ch, copy the data from /merlin/export to outside PSI
    • +
    + +
    Importing data to Merlin
    + +

    For importing data from outside PSI to Merlin by using /export, one has to:

    +
      +
    • From datatransfer.psi.ch, copy the data from outside PSI to /merlin/export. +Ensure to properly secure your directories and files with proper permissions.
    • +
    • Once data is copied, from a Merlin login node, copy your data from /export to any directory (i.e. /data/project, /data/user, /scratch).
    • +
    + +

    Request access to your project directory

    + +

    Optionally, instead of using /export, Merlin project owners can request Read/Write or Read/Only access to their project directory.

    + + + +

    Connecting to Merlin6 from outside PSI

    + +

    Merlin6 is fully accessible from within the PSI network. To connect from outside you can use:

    + + + +

    Connecting from Merlin6 to outside file shares

    + +

    merlin_rmount command

    + +

    Merlin provides a command for mounting remote file systems, called merlin_rmount. This +provides a helpful wrapper over the Gnome storage utilities, and provides support for a wide range of remote file formats, including

    +
      +
    • SMB/CIFS (Windows shared folders)
    • +
    • WebDav
    • +
    • AFP
    • +
    • FTP, SFTP
    • +
    • others
    • +
    + +

    More instruction on using merlin_rmount

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin6/troubleshooting.html b/merlin6/troubleshooting.html new file mode 100644 index 0000000..7c727db --- /dev/null +++ b/merlin6/troubleshooting.html @@ -0,0 +1,810 @@ + + + + + + + + +Troubleshooting | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Troubleshooting

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    For troubleshooting, please contact us through the official channels. See Contact +for more information.

    + +

    Known Problems

    + +

    Before contacting us for support, please check the Merlin6 Support: Known Problems page to see if there is an existing +workaround for your specific problem.

    + +

    Troubleshooting Slurm Jobs

    + +

    If you want to report a problem or request for help when running jobs, please always provide +the following information:

    + +
      +
    1. Provide your batch script or, alternatively, the path to your batch script.
    2. +
    3. +

      Add always the following commands to your batch script

      + +
      echo "User information:"; who am i
      +echo "Running hostname:"; hostname
      +echo "Current location:"; pwd
      +echo "User environment:"; env
      +echo "List of PModules:"; module list
      +
      +
    4. +
    5. Whenever possible, provide the Slurm JobID.
    6. +
    + +

    Providing this information is extremely important in order to ease debugging, otherwise +only with the description of the issue or just the error message is completely insufficient +in most cases.

    + +

    Troubleshooting SSH

    + +

    Use the ssh command with the “-vvv” option and copy and paste (no screenshots please) +the output to your request in Service-Now. Example

    + +
    ssh -Y -vvv $username@merlin-l-01.psi.ch
    +
    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin6/using-modules.html b/merlin6/using-modules.html new file mode 100644 index 0000000..fb983e3 --- /dev/null +++ b/merlin6/using-modules.html @@ -0,0 +1,961 @@ + + + + + + + + +Using PModules | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Using PModules

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    Environment Modules

    + +

    On top of the operating system stack we provide different software using the PSI developed PModule system.

    + +

    PModules is the official supported way and each package is deployed by a specific expert. Usually, in PModules +software which is used by many people will be found.

    + +

    If you miss any package/versions or a software with a specific missing feature, contact us. We will study if is feasible or not to install it.

    + +

    Module release stages

    + +

    Three different release stages are available in Pmodules, ensuring proper software life cycling. These are the following: unstable, stable and deprecated

    + +

    Unstable release stage

    + +

    The unstable release stage contains unstable releases of software. Software compilations here are usually under development or are not fully production ready.

    + +

    This release stage is not directly visible by the end users, and needs to be explicitly invoked as follows:

    + +
    module use unstable
    +
    + +

    Once software is validated and considered production ready, this is moved to the stable release stage.

    + +

    Stable release stage

    + +

    The stable release stage contains stable releases of software, which have been deeply tested and are fully supported.

    + +

    This is the default release stage, and is visible by default. Whenever possible, users are strongly advised to use packages from this release stage.

    + +

    Deprecated release stage

    + +

    The deprecated release stage contains deprecated releases of software. Software in this release stage is usually deprecated or discontinued by their developers. +Also, minor versions or redundant compilations are moved here as long as there is a valid copy in the stable repository.

    + +

    This release stage is not directly visible by the users, and needs to be explicitly invoked as follows:

    + +
    module use deprecated
    +
    + +

    However, software moved to this release stage can be directly loaded without the need of invoking it. This ensure proper life cycling of the software, and making it transparent for the end users.

    + +

    Module overlays

    + +

    Recent Pmodules releases contain a feature called Pmodules overlays. In Merlin, overlays are used to source software from a different location. +In that way, we can have custom private versions of software in the cluster installed on high performance storage accessed over a low latency network.

    + +

    Pmodules overlays are still under development, therefore consider that some features may not work or do not work as expected.

    + +

    Pmodule overlays can be used from Pmodules v1.1.5. However, Merlin is running Pmodules v1.0.0rc10 as the default version. +Therefore, one needs to load first a newer version of it: this is available in the repositories and can be loaded with module load Pmodules/$version command.

    + +

    Once running the proper Pmodules version, overlays are added (or invoked) with the module use $overlay_name command.

    + +

    overlay_merlin

    + +

    Some Merlin software is already provided through PModule overlays and has been validated for using and running it in that way. +Therefore, Melin contains an overlay called overlay_merlin. In this overlay, the software is installed in the Merlin high performance storage, +specifically in the /data/software/pmodules directory. In general, if another copy exists in the standard repository, we strongly recommend to use +the replica in the overlay_merlin overlay instead, as it provides faster access and it may also provide some customizations for the Merlin6 cluster.

    + +

    For loading the overlay_merlin, please run:

    +
    module load Pmodules/1.1.6 # Or newer version
    +module use overlay_merlin
    +
    + +

    Then, once overlay_merlin is invoked, it will disable central software installations with the same version (if exist), and will be replaced +by the local ones in Merlin. Releases from the central Pmodules repository which do not have a copy in the Merlin overlay will remain +visible. In example, for each ANSYS release, one can identify where it is installed by searching ANSYS in PModules with the --verbose +option. This will show the location of the different ANSYS releases as follows:

    +
      +
    • For ANSYS releases installed in the central repositories, the path starts with /opt/psi
    • +
    • For ANSYS releases installed in the Merlin6 repository (and/or overwritting the central ones), the path starts with /data/software/pmodules
    • +
    + +
    (base)[caubet_m@merlin-l-001:/data/user/caubet_m]# module load Pmodules/1.1.6
    +module load: unstable module has been loaded -- Pmodules/1.1.6
    +
    +(base)[caubet_m@merlin-l-001:/data/user/caubet_m]# module use merlin_overlay
    +
    +(base)[caubet_m@merlin-l-001:/data/user/caubet_m]# module search ANSYS --verbose
    +
    +Module         Rel.stage  Group        Dependencies/Modulefile
    +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    +ANSYS/2019R3   stable     Tools        dependencies:
    +                                       modulefile:   /data/software/pmodules/Tools/modulefiles/ANSYS/2019R3
    +ANSYS/2020R1   stable     Tools        dependencies:
    +                                       modulefile:   /opt/psi/Tools/modulefiles/ANSYS/2020R1
    +ANSYS/2020R1-1 stable     Tools        dependencies:
    +                                       modulefile:   /opt/psi/Tools/modulefiles/ANSYS/2020R1-1
    +ANSYS/2020R2   stable     Tools        dependencies:
    +                                       modulefile:   /data/software/pmodules/Tools/modulefiles/ANSYS/2020R2
    +ANSYS/2021R1   stable     Tools        dependencies:
    +                                       modulefile:   /data/software/pmodules/Tools/modulefiles/ANSYS/2021R1
    +ANSYS/2021R2   stable     Tools        dependencies:
    +                                       modulefile:   /data/software/pmodules/Tools/modulefiles/ANSYS/2021R2
    +
    + +

    PModules commands

    + +

    Below is listed a summary of all available commands:

    + +
    module use                       # show all available PModule Software Groups as well as Release Stages
    +module avail                     # to see the list of available software packages provided via pmodules
    +module use unstable              # to get access to a set of packages not fully tested by the community
    +module load <package>/<version>  # to load specific software package with a specific version
    +module search <string>           # to search for a specific software package and its dependencies.
    +module list                      # to list which software is loaded in your environment
    +module purge                     # unload all loaded packages and cleanup the environment
    +
    + +

    module use/unuse

    + +

    Without any parameter, use lists all available PModule Software Groups and Release Stages.

    + +
    module use
    +
    + +

    When followed by a parameter, use/unuse invokes/uninvokes a PModule Software Group or Release Stage.

    + +
    module use EM         # Invokes the 'EM' software group
    +module unuse EM       # Uninvokes the 'EM' software group
    +module use unstable   # Invokes the 'unstable' Release stable
    +module unuse unstable # Uninvokes the 'unstable' Release stable
    +
    + +

    module avail

    + +

    This option lists all available PModule Software Groups and their packages.

    + +

    Please run module avail --help for further listing options.

    + + + +

    This is used to search for software packages. By default, if no Release Stage or Software Group is specified +in the options of the module search command, it will search from the already invoked Software Groups and Release Stages. +Direct package dependencies will be also showed.

    + +
    (base) [caubet_m@merlin-l-001 caubet_m]$ module search openmpi/4.0.5_slurm
    +
    +Module              Release    Group        Requires
    +---------------------------------------------------------------------------
    +openmpi/4.0.5_slurm stable     Compiler     gcc/8.4.0
    +openmpi/4.0.5_slurm stable     Compiler     gcc/9.2.0
    +openmpi/4.0.5_slurm stable     Compiler     gcc/9.3.0
    +openmpi/4.0.5_slurm stable     Compiler     intel/20.4
    +
    +(base) [caubet_m@merlin-l-001 caubet_m]$ module load intel/20.4 openmpi/4.0.5_slurm
    +
    + +

    Please run module search --help for further search options.

    + +

    module load/unload

    + +

    This loads/unloads specific software packages. Packages might have direct dependencies that need to be loaded first. Other dependencies +will be automatically loaded.

    + +

    In the example below, the openmpi/4.0.5_slurm package will be loaded, however gcc/9.3.0 must be loaded as well as this is a strict dependency. Direct dependencies must be loaded in advance. Users can load multiple packages one by one or at once. This can be useful for instance when loading a package with direct dependencies.

    + +
    # Single line
    +module load gcc/9.3.0 openmpi/4.0.5_slurm
    +
    +# Multiple line
    +module load gcc/9.3.0
    +module load openmpi/4.0.5_slurm
    +
    + +

    module purge

    + +

    This command is an alternative to module unload, which can be used to unload all loaded module files.

    + +
    module purge
    +
    + +

    When to request for new PModules packages

    + +

    Missing software

    + +

    If you don’t find a specific software and you know from other people interesing on it, it can be installed in PModules. Please contact us +and we will try to help with that. Deploying new software in PModules may take few days.

    + +

    Usually installation of new software are possible as long as few users will use it. If you are insterested in to maintain this software, +please let us know.

    + +

    Missing version

    + +

    If the existing PModules versions for a specific package do not fit to your needs, is possible to ask for a new version.

    + +

    Usually installation of newer versions will be supported, as long as few users will use it. Installation of intermediate versions can +be supported if this is strictly justified.

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin7.html b/merlin7.html new file mode 100644 index 0000000..99c8819 --- /dev/null +++ b/merlin7.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

    Redirecting…

    + Click here if you are not redirected. + diff --git a/merlin7/ansys-rsm.html b/merlin7/ansys-rsm.html new file mode 100644 index 0000000..988f733 --- /dev/null +++ b/merlin7/ansys-rsm.html @@ -0,0 +1,705 @@ + + + + + + + + +ANSYS RSM (Remote Resolve Manager) | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    ANSYS RSM (Remote Resolve Manager)

    +
    + + + +
    + + +
    This document describes how to use the ANSYS Remote Resolve Manager service in the Merlin7 cluster
    + + + + + + + +
    + + + + + + +

    ANSYS Remote Resolve Manager

    + +

    ANSYS Remote Solve Manager (RSM) is used by ANSYS Workbench to submit computational jobs to HPC clusters directly from Workbench on your desktop.

    + + + +

    The Merlin7 RSM service

    + +

    A RSM service is running on a dedicated Virtual Machine server. This service will listen a specific port and will process any request using RSM (in example, from ANSYS users workstations). +The following nodes are configured with such services:

    +
      +
    • merlin7-ansys-rsm.psi.ch
    • +
    + +

    The earliest version supported in the Merlin7 cluster is ANSYS/2022R2. Older versions are not supported due to existing bugs or missing functionalities. In case you strongly need to run an older version, please do not hesitate to contact the Merlin admins.

    + +

    Configuring RSM client on Windows workstations

    + +

    Users can setup ANSYS RSM in their workstations to connect to the Merlin7 cluster. +The different steps and settings required to make it work are that following:

    + +
      +
    1. Open the RSM Configuration service in Windows for the ANSYS release you want to configure.
    2. +
    3. Right-click the HPC Resources icon followed by Add HPC Resource… +Adding a new HPC Resource
    4. +
    5. In the HPC Resource tab, fill up the corresponding fields as follows: +HPC Resource +
        +
      • “Name”: Add here the preffered name for the cluster. For example: Merlin7 cluster
      • +
      • “HPC Type”: Select SLURM
      • +
      • “Submit host”: merlin7-rsm01.psi.ch
      • +
      • “Slurm Job submission arguments (optional)”: Add any required Slurm options for running your jobs. +
          +
        • --hint=nomultithread must be present.
        • +
        • --exclusive must also be present for now, due to a bug in the Slingshot interconnect which does not allow running shared nodes.
        • +
        +
      • +
      • Check “Use SSH protocol for inter and intra-node communication (Linux only)”
      • +
      • Select “Able to directly submit and monitor HPC jobs”.
      • +
      • “Apply” changes.
      • +
      +
    6. +
    7. In the “File Management” tab, fill up the corresponding fields as follows: +File Management +
        +
      • Select “RSM internal file transfer mechanism” and add /data/scratch/shared as the “Staging directory path on Cluster”
      • +
      • Select “Scratch directory local to the execution node(s)” and add /scratch as the HPC scratch directory.
      • +
      • Never check the option “Keep job files in the staging directory when job is complete” if the previous +option “Scratch directory local to the execution node(s)” was set.
      • +
      • “Apply” changes.
      • +
      +
    8. +
    9. In the “Queues” tab, use the left button to auto-discover partitions +Queues +
        +
      • If no authentication method was configured before, an authentication window will appear. Use your +PSI account to authenticate. Notice that the PSICH\ prefix must not be added. +Authenticating
      • +
      • From the partition list, select the ones you want to typically use. +
          +
        • In general, standard Merlin users must use hourly, daily and general only.
        • +
        • Other partitions are reserved for allowed users only.
        • +
        +
      • +
      • “Apply” changes. +Select partitions
      • +
      +
    10. +
    11. [Optional] You can perform a test by submitting a test job on each partition by clicking on the Submit button +for each selected partition.
    12. +
    + + + +

    Using RSM in ANSYS

    + +

    Using the RSM service in ANSYS is slightly different depending on the ANSYS software being used. +Please follow the official ANSYS documentation for details about how to use it for that specific software.

    + +

    Alternativaly, please refer to some the examples showed in the following chapters (ANSYS specific software).

    + +

    Using RSM in ANSYS Fluent

    + +

    For further information for using RSM with Fluent, please visit the ANSYS RSM section.

    + +

    Using RSM in ANSYS CFX

    + +

    For further information for using RSM with CFX, please visit the ANSYS RSM section.

    + +

    Using RSM in ANSYS MAPDL

    + +

    For further information for using RSM with MAPDL, please visit the ANSYS RSM section.

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin7/ansys.html b/merlin7/ansys.html new file mode 100644 index 0000000..d706064 --- /dev/null +++ b/merlin7/ansys.html @@ -0,0 +1,743 @@ + + + + + + + + +ANSYS | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    ANSYS

    +
    + + + +
    + + +
    This document describes how to load and use ANSYS in the Merlin7 cluster
    + + + + + + + +
    + + + + + + +

    This document describes generic information of how to load and run ANSYS software in the Merlin cluster

    + +

    ANSYS software in Pmodules

    + +

    The ANSYS software can be loaded through PModules.

    + +

    The default ANSYS versions are loaded from the central PModules repository.

    + +

    However, we provide local installations on Merlin7 which are needed mainly for some ANSYS packages, like Ansys RSM. +Due to this, and also to improve the interactive experience of the user, ANSYS has been also installed in the +Merlin high performance storage and we have made it available from Pmodules.

    + +

    Loading Merlin7 ANSYS

    + +

    For loading the Merlin7 ANSYS software, one needs to run Pmodules v1.1.22 or newer, and then use a specific repository +(called merlin) which is only available from the Merlin7 cluster:

    + +
    module purge
    +module load Pmodules/1.1.22
    +module use merlin
    +module use unstable
    +module use /etc/cscs-modules/
    +module load cray
    +module search ANSYS
    +
    +# Load the proper ANSYS version, in example for 2022R2
    +module load ANSYS/2022R2
    +
    +

    Once merlin is invoked, it will disable central ANSYS installations with the same version, which will be replaced +by the local ones in Merlin. Releases from the central Pmodules repository which have not a local installation will remain +visible. For each ANSYS release, one can identify where it is installed by searching ANSYS in PModules with the --verbose +option. This will show the location of the different ANSYS releases as follows:

    +
      +
    • For ANSYS releases installed in the central repositories, the path starts with /opt/psi
    • +
    • For ANSYS releases installed in the Merlin7 repository (and/or overwritting the central ones), the path starts with /data/software/pmodules
    • +
    + +

    We strongly recommend only using ANSYS/2022R2 or superior.

    + +
    +[Example] Loading ANSYS from the Merlin7 PModules repository +
    +🔥 [caubet_m@login001:~]# module purge                                              
    +🔥 [caubet_m@login001:~]# module load Pmodules/1.1.22                               
    +module load: unstable module has been loaded -- Pmodules/1.1.22                                                                                                         
    +
    +🔥 [caubet_m@login001:~]# module use merlin                                         
    +🔥 [caubet_m@login001:~]# module use unstable                                                                                                                           
    +🔥 [caubet_m@login001:~]# module use /etc/cscs-modules/                             
    +🔥 [caubet_m@login001:~]# module load cray                                          
    +                                                                                    
    +Activating Modules:                                                                 
    +  1) cce/17.0.0                                                                     
    +
    +🔥 [caubet_m@login001:~]# module load ANSYS/2022R2                                                                                                                      
    +module load: unstable module has been loaded -- ANSYS/2022R2          
    +
    +🔥 [caubet_m@login001:~]# module search ANSYS --verbose
    +ANSYS/2019R3:
    +  release stage: stable
    +  group:         Tools
    +  overlay:       base
    +  modulefile:    /opt/psi/Tools/modulefiles/ANSYS/2019R3
    +  dependencies:  (none)
    +ANSYS/2020R1:
    +  release stage: stable
    +  group:         Tools
    +  overlay:       base
    +  modulefile:    /opt/psi/Tools/modulefiles/ANSYS/2020R1
    +  dependencies:  (none)
    +ANSYS/2020R1-1:
    +  release stage: stable
    +  group:         Tools
    +  overlay:       base
    +  modulefile:    /opt/psi/Tools/modulefiles/ANSYS/2020R1-1
    +  dependencies:  (none)
    +ANSYS/2020R2:
    +  release stage: unstable
    +  group:         Tools
    +  overlay:       base
    +  modulefile:    /opt/psi/Tools/modulefiles/ANSYS/2020R2
    +  dependencies:  (none)
    +ANSYS/2021R1:
    +  release stage: unstable
    +  group:         Tools
    +  overlay:       base
    +  modulefile:    /opt/psi/Tools/modulefiles/ANSYS/2021R1
    +  dependencies:  (none)
    +ANSYS/2022R2:
    +  release stage: unstable
    +  group:         Tools
    +  overlay:       merlin
    +  modulefile:    /data/software/pmodules/Tools/modulefiles/ANSYS/2022R2
    +  dependencies:  (none)
    +ANSYS/2023R2:
    +  release stage: unstable
    +  group:         Tools
    +  overlay:       merlin
    +  modulefile:    /data/software/pmodules/Tools/modulefiles/ANSYS/2023R2
    +  dependencies:  (none)
    +ANSYS/2024R1:
    +  release stage: unstable
    +  group:         Tools
    +  overlay:       merlin
    +  modulefile:    /data/software/pmodules/Tools/modulefiles/ANSYS/2024R1
    +  dependencies:  (none)
    +
    +
    + + + +

    ANSYS Documentation by product

    + +

    ANSYS RSM

    + +

    ANSYS Remote Solve Manager (RSM) is used by ANSYS Workbench to submit computational jobs to HPC clusters directly from Workbench on your desktop. +Therefore, PSI workstations with direct access to Merlin can submit jobs by using RSM.

    + +

    For further information, please visit the ANSYS RSM section.

    + +

    ANSYS Fluent

    + +

    For further information, please visit the ANSYS RSM section.

    + +

    ANSYS CFX

    + +

    For further information, please visit the ANSYS RSM section.

    + +

    ANSYS MAPDL

    + +

    For further information, please visit the ANSYS RSM section.

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin7/archive.html b/merlin7/archive.html new file mode 100644 index 0000000..aa8908a --- /dev/null +++ b/merlin7/archive.html @@ -0,0 +1,998 @@ + + + + + + + + +Archive & PSI Data Catalog | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Archive & PSI Data Catalog

    +
    + + + +
    + + +
    This document describes how to use the PSI Data Catalog for archiving Merlin7 data.
    + + + + + + + +
    + + + + + + +

    PSI Data Catalog as a PSI Central Service

    + +

    PSI provides access to the Data Catalog for long-term data storage and retrieval. Data is +stored on the PetaByte Archive at the Swiss National Supercomputing Centre (CSCS).

    + +

    The Data Catalog and Archive is suitable for:

    + +
      +
    • Raw data generated by PSI instruments
    • +
    • Derived data produced by processing some inputs
    • +
    • Data required to reproduce PSI research and publications
    • +
    + +

    The Data Catalog is part of PSI’s effort to conform to the FAIR principles for data management. +In accordance with this policy, data will be publicly released under CC-BY-SA 4.0 after an +embargo period expires.

    + +

    The Merlin cluster is connected to the Data Catalog. Hence, users archive data stored in the +Merlin storage under the /data directories (currentlyi, /data/user and /data/project). +Archiving from other directories is also possible, however the process is much slower as data +can not be directly retrieved by the PSI archive central servers (central mode), and needs to +be indirectly copied to these (decentral mode).

    + +

    Archiving can be done from any node accessible by the users (usually from the login nodes).

    + + + +

    Procedure

    + +

    Overview

    + +

    Below are the main steps for using the Data Catalog.

    + +
      +
    • Ingest the dataset into the Data Catalog. This makes the data known to the Data Catalog system at PSI: +
        +
      • Prepare a metadata file describing the dataset
      • +
      • Run datasetIngestor script
      • +
      • If necessary, the script will copy the data to the PSI archive servers +
          +
        • Usually this is necessary when archiving from directories other than /data/user or +/data/project. It would be also necessary when the Merlin export server (merlin-archive.psi.ch) +is down for any reason.
        • +
        +
      • +
      +
    • +
    • Archive the dataset: +
        +
      • Visit https://discovery.psi.ch
      • +
      • Click Archive for the dataset
      • +
      • The system will now copy the data to the PetaByte Archive at CSCS
      • +
      +
    • +
    • Retrieve data from the catalog: +
        +
      • Find the dataset on https://discovery.psi.ch and click Retrieve
      • +
      • Wait for the data to be copied to the PSI retrieval system
      • +
      • Run datasetRetriever script
      • +
      +
    • +
    + +

    Since large data sets may take a lot of time to transfer, some steps are designed to happen in the +background. The discovery website can be used to track the progress of each step.

    + +

    Account Registration

    + +

    Two types of account permit access to the Data Catalog. If your data was collected at a beamline, you may +have been assigned a p-group (e.g. p12345) for the experiment. Other users are assigned a-group +(e.g. a-12345).

    + +

    Groups are usually assigned to a PI, and then individual user accounts are added to the group. This must be done +under user request through PSI Service Now. For existing a-groups and p-groups, you can follow the standard +central procedures. Alternatively, if you do not know how to do that, follow the Merlin7 +Requesting extra Unix groups procedure, or open +a PSI Service Now ticket.

    + +

    Documentation

    + +

    Accessing the Data Catalog is done through the SciCat software. +Documentation is here: ingestManual.

    + +

    Loading datacatalog tools

    + +

    The latest datacatalog software is maintained in the PSI module system. To access it from the Merlin systems, run the following command:

    + +
    module load datacatalog
    +
    + +

    It can be done from any host in the Merlin cluster accessible by users. Usually, login nodes will be the nodes used for archiving.

    + +

    Finding your token

    + +

    As of 2022-04-14 a secure token is required to interact with the data catalog. This is a long random string that replaces the previous user/password authentication (allowing access for non-PSI use cases). This string should be treated like a password and not shared.

    + +
      +
    1. Go to discovery.psi.ch
    2. +
    3. Click ‘Sign in’ in the top right corner. Click the ‘Login with PSI account’ and log in on the PSI login1. page.
    4. +
    5. You should be redirected to your user settings and see a ‘User Information’ section. If not, click on1. your username in the top right and choose ‘Settings’ from the menu.
    6. +
    7. Look for the field ‘Catamel Token’. This should be a 64-character string. Click the icon to copy the1. token.
    8. +
    + +

    SciCat website

    + +

    You will need to save this token for later steps. To avoid including it in all the commands, I suggest saving it to an environmental variable (Linux):

    + +
    $  SCICAT_TOKEN=RqYMZcqpqMJqluplbNYXLeSyJISLXfnkwlfBKuvTSdnlpKkU
    +
    + +

    (Hint: prefix this line with a space to avoid saving the token to your bash history.)

    + +

    Tokens expire after 2 weeks and will need to be fetched from the website again.

    + +

    Ingestion

    + +

    The first step to ingesting your data into the catalog is to prepare a file describing what data you have. This is called +metadata.json, and can be created with a text editor (e.g. vim). It can in principle be saved anywhere, +but keeping it with your archived data is recommended. For more information about the format, see the ‘Bio metadata’ +section below. An example follows:

    + +
    {
    +    "principalInvestigator": "albrecht.gessler@psi.ch",
    +    "creationLocation": "/PSI/EMF/JEOL2200FS",
    +    "dataFormat": "TIFF+LZW Image Stack",
    +    "sourceFolder": "/gpfs/group/LBR/pXXX/myimages",
    +    "owner": "Wilhelm Tell",
    +    "ownerEmail": "wilhelm.tell@psi.ch",
    +    "type": "raw",
    +    "description": "EM micrographs of amygdalin",
    +    "ownerGroup": "a-12345",
    +    "scientificMetadata": {
    +        "description": "EM micrographs of amygdalin",
    +        "sample": {
    +            "name": "Amygdalin beta-glucosidase 1",
    +            "uniprot": "P29259",
    +            "species": "Apple"
    +        },
    +        "dataCollection": {
    +            "date": "2018-08-01"
    +        },
    +        "microscopeParameters": {
    +            "pixel size": {
    +                "v": 0.885,
    +                "u": "A"
    +            },
    +            "voltage": {
    +                "v": 200,
    +                "u": "kV"
    +            },
    +            "dosePerFrame": {
    +                "v": 1.277,
    +                "u": "e/A2"
    +            }
    +        }
    +    }
    +}
    +
    + +

    It is recommended to use the ScicatEditor for creating metadata files. This is a browser-based tool specifically for ingesting PSI data. Using the tool avoids syntax errors and provides templates for common data sets and options. The finished JSON file can then be downloaded to merlin or copied into a text editor.

    + +

    Another option is to use the SciCat graphical interface from NoMachine. This provides a graphical interface for selecting data to archive. This is particularly useful for data associated with a DUO experiment and p-group. Type SciCat to get started after loading the datacatalog`` module. The GUI also replaces the the command-line ingestion described below.

    + +

    The following steps can be run from wherever you saved your metadata.json. First, perform a “dry-run” which will check the metadata for errors:

    + +
    datasetIngestor --token $SCICAT_TOKEN metadata.json
    +
    + +

    It will ask for your PSI credentials and then print some info about the data to be ingested. If there are no errors, proceed to the real ingestion:

    + +
    datasetIngestor --token $SCICAT_TOKEN --ingest --autoarchive metadata.json
    +
    + +

    You will be asked whether you want to copy the data to the central system:

    + +
      +
    • If you are on the Merlin cluster and you are archiving data from /data/user or /data/project, answer ‘no’ since the data catalog can +directly read the data.
    • +
    • If you are on a directory other than /data/user and ``/data/project, or you are on a desktop computer, answer ‘yes’. Copying large datasets +to the PSI archive system may take quite a while (minutes to hours).
    • +
    + +

    If there are no errors, your data has been accepted into the data catalog! From now on, no changes should be made to the ingested data. +This is important, since the next step is for the system to copy all the data to the CSCS Petabyte archive. Writing to tape is slow, so +this process may take several days, and it will fail if any modifications are detected.

    + +

    If using the --autoarchive option as suggested above, your dataset should now be in the queue. Check the data catalog: +https://discovery.psi.ch. Your job should have status ‘WorkInProgress’. You will receive an email when the ingestion +is complete.

    + +

    If you didn’t use --autoarchive, you need to manually move the dataset into the archive queue. From discovery.psi.ch, navigate to the ‘Archive’ +tab. You should see the newly ingested dataset. Check the dataset and click Archive. You should see the status change from datasetCreated to +scheduleArchiveJob. This indicates that the data is in the process of being transferred to CSCS.

    + +

    After a few days the dataset’s status will change to datasetOnAchive indicating the data is stored. At this point it is safe to delete the data.

    + +

    Useful commands

    + +

    Running the datasetIngestor in dry mode (without --ingest) finds most errors. However, it is sometimes convenient to find potential errors +yourself with simple unix commands.

    + +

    Find problematic filenames

    + +
    find . -iregex '.*/[^/]*[^a-zA-Z0-9_ ./-][^/]*'=
    +
    + +

    Find broken links

    + +
    find -L . -type l
    +
    + +

    Find outside links

    + +
    find . -type l -exec bash -c 'realpath --relative-base "`pwd`" "$0" 2>/dev/null |egrep "^[./]" |sed "s|^|$0 ->|" ' '{}' ';'
    +
    + +

    Delete certain files (use with caution)

    + +
    # Empty directories
    +find . -type d -empty -delete
    +# Backup files
    +find . -name '*~' -delete
    +find . -name '*#autosave#' -delete
    +
    + +

    Troubleshooting & Known Bugs

    + +
      +
    • +

      The following message can be safely ignored:

      + +
       key_cert_check_authority: invalid certificate
      + Certificate invalid: name is not a listed principal
      +
      +

      It indicates that no kerberos token was provided for authentication. You can avoid the warning by first running kinit (PSI linux systems).

      +
    • +
    • +

      For decentral ingestion cases, the copy step is indicated by a message Running [/usr/bin/rsync -e ssh -avxz .... It is expected that this +step will take a long time and may appear to have hung. You can check what files have been successfully transfered using rsync:

      + +
       rsync --list-only user_n@pb-archive.psi.ch:archive/UID/PATH/
      +
      + +

      where UID is the dataset ID (12345678-1234-1234-1234-123456789012) and PATH is the absolute path to your data. Note that rsync creates directories first and that the transfer order is not alphabetical in some cases, but it should be possible to see whether any data has transferred.

      +
    • +
    • +

      There is currently a limit on the number of files per dataset (technically, the limit is from the total length of all file paths). It is recommended to break up datasets into 300’000 files or less.

      +
        +
      • +

        If it is not possible or desirable to split data between multiple datasets, an alternate work-around is to package files into a tarball. For datasets which are already compressed, omit the -z option for a considerable speedup:

        + +
        tar -f [output].tar [srcdir]
        +
        + +

        Uncompressed data can be compressed on the cluster using the following command:

        + +
        sbatch /data/software/Slurm/Utilities/Parallel_TarGz.batch -s [srcdir] -t [output].tar -n
        +
        + +

        Run /data/software/Slurm/Utilities/Parallel_TarGz.batch -h for more details and options.

        +
      • +
      +
    • +
    + +

    Sample ingestion output (datasetIngestor 1.1.11)

    +
    +[Show Example]: Sample ingestion output (datasetIngestor 1.1.11) +
    +/data/project/bio/myproject/archive $ datasetIngestor -copy -autoarchive -allowexistingsource -ingest metadata.json
    +2019/11/06 11:04:43 Latest version: 1.1.11
    +
    +
    +2019/11/06 11:04:43 Your version of this program is up-to-date
    +2019/11/06 11:04:43 You are about to add a dataset to the === production === data catalog environment...
    +2019/11/06 11:04:43 Your username:
    +user_n
    +2019/11/06 11:04:48 Your password:
    +2019/11/06 11:04:52 User authenticated: XXX
    +2019/11/06 11:04:52 User is member in following a or p groups: XXX
    +2019/11/06 11:04:52 OwnerGroup information a-XXX verified successfully.
    +2019/11/06 11:04:52 contactEmail field added: XXX
    +2019/11/06 11:04:52 Scanning files in dataset /data/project/bio/myproject/archive
    +2019/11/06 11:04:52 No explicit filelistingPath defined - full folder /data/project/bio/myproject/archive is used.
    +2019/11/06 11:04:52 Source Folder: /data/project/bio/myproject/archive at /data/project/bio/myproject/archive
    +2019/11/06 11:04:57 The dataset contains 100000 files with a total size of 50000000000 bytes.
    +2019/11/06 11:04:57 creationTime field added: 2019-07-29 18:47:08 +0200 CEST
    +2019/11/06 11:04:57 endTime field added: 2019-11-06 10:52:17.256033 +0100 CET
    +2019/11/06 11:04:57 license field added: CC BY-SA 4.0
    +2019/11/06 11:04:57 isPublished field added: false
    +2019/11/06 11:04:57 classification field added: IN=medium,AV=low,CO=low
    +2019/11/06 11:04:57 Updated metadata object:
    +{
    +    "accessGroups": [
    +        "XXX"
    +    ],
    +    "classification": "IN=medium,AV=low,CO=low",
    +    "contactEmail": "XXX",
    +    "creationLocation": "XXX",
    +    "creationTime": "2019-07-29T18:47:08+02:00",
    +    "dataFormat": "XXX",
    +    "description": "XXX",
    +    "endTime": "2019-11-06T10:52:17.256033+01:00",
    +    "isPublished": false,
    +    "license": "CC BY-SA 4.0",
    +    "owner": "XXX",
    +    "ownerEmail": "XXX",
    +    "ownerGroup": "a-XXX",
    +    "principalInvestigator": "XXX",
    +    "scientificMetadata": {
    +...
    +    },
    +    "sourceFolder": "/data/project/bio/myproject/archive",
    +    "type": "raw"
    +}
    +2019/11/06 11:04:57 Running [/usr/bin/ssh -l user_n pb-archive.psi.ch test -d /data/project/bio/myproject/archive].
    +key_cert_check_authority: invalid certificate
    +Certificate invalid: name is not a listed principal
    +user_n@pb-archive.psi.ch's password:
    +2019/11/06 11:05:04 The source folder /data/project/bio/myproject/archive is not centrally available (decentral use case).
    +The data must first be copied to a rsync cache server.
    +
    +
    +2019/11/06 11:05:04 Do you want to continue (Y/n)?
    +Y
    +2019/11/06 11:05:09 Created dataset with id 12.345.67890/12345678-1234-1234-1234-123456789012
    +2019/11/06 11:05:09 The dataset contains 108057 files.
    +2019/11/06 11:05:10 Created file block 0 from file 0 to 1000 with total size of 413229990 bytes
    +2019/11/06 11:05:10 Created file block 1 from file 1000 to 2000 with total size of 416024000 bytes
    +2019/11/06 11:05:10 Created file block 2 from file 2000 to 3000 with total size of 416024000 bytes
    +2019/11/06 11:05:10 Created file block 3 from file 3000 to 4000 with total size of 416024000 bytes
    +...
    +2019/11/06 11:05:26 Created file block 105 from file 105000 to 106000 with total size of 416024000 bytes
    +2019/11/06 11:05:27 Created file block 106 from file 106000 to 107000 with total size of 416024000 bytes
    +2019/11/06 11:05:27 Created file block 107 from file 107000 to 108000 with total size of 850195143 bytes
    +2019/11/06 11:05:27 Created file block 108 from file 108000 to 108057 with total size of 151904903 bytes
    +2019/11/06 11:05:27 short dataset id: 0a9fe316-c9e7-4cc5-8856-e1346dd31e31
    +2019/11/06 11:05:27 Running [/usr/bin/rsync -e ssh -avxz /data/project/bio/myproject/archive/ user_n@pb-archive.psi.ch:archive
    +/0a9fe316-c9e7-4cc5-8856-e1346dd31e31/data/project/bio/myproject/archive].
    +key_cert_check_authority: invalid certificate
    +Certificate invalid: name is not a listed principal
    +user_n@pb-archive.psi.ch's password:
    +Permission denied, please try again.
    +user_n@pb-archive.psi.ch's password:
    +/usr/libexec/test_acl.sh: line 30: /tmp/tmpacl.txt: Permission denied
    +/usr/libexec/test_acl.sh: line 30: /tmp/tmpacl.txt: Permission denied
    +/usr/libexec/test_acl.sh: line 30: /tmp/tmpacl.txt: Permission denied
    +/usr/libexec/test_acl.sh: line 30: /tmp/tmpacl.txt: Permission denied
    +/usr/libexec/test_acl.sh: line 30: /tmp/tmpacl.txt: Permission denied
    +...
    +2019/11/06 12:05:08 Successfully updated {"pid":"12.345.67890/12345678-1234-1234-1234-123456789012",...}
    +2019/11/06 12:05:08 Submitting Archive Job for the ingested datasets.
    +2019/11/06 12:05:08 Job response Status: okay
    +2019/11/06 12:05:08 A confirmation email will be sent to XXX
    +12.345.67890/12345678-1234-1234-1234-123456789012
    +
    +
    + +

    Publishing

    + +

    After datasets are are ingested they can be assigned a public DOI. This can be included in publications and will make the datasets on http://doi.psi.ch.

    + +

    For instructions on this, please read the ‘Publish’ section in the ingest manual.

    + +

    Retrieving data

    + +

    Retrieving data from the archive is also initiated through the Data Catalog. Please read the ‘Retrieve’ section in the ingest manual.

    + +

    Further Information

    + + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin7/code-of-conduct.html b/merlin7/code-of-conduct.html new file mode 100644 index 0000000..7b352b2 --- /dev/null +++ b/merlin7/code-of-conduct.html @@ -0,0 +1,671 @@ + + + + + + + + +Code Of Conduct | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Code Of Conduct

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    The Basic principle

    + +

    The basic principle is courtesy and consideration for other users.

    + +
      +
    • Merlin7 is a system shared by many users, therefore you are kindly requested to apply common courtesy in using its resources. Please follow our guidelines which aim at providing and maintaining an efficient compute environment for all our users.
    • +
    • Basic shell programming skills are an essential requirement in a Linux/UNIX HPC cluster environment; a proficiency in shell programming is greatly beneficial.
    • +
    + +

    Interactive nodes

    + +
      +
    • The interactive nodes (also known as login nodes) are for development and quick testing: +
        +
      • It is strictly forbidden to run production jobs on the login nodes. All production jobs must be submitted to the batch system.
      • +
      • It is forbidden to run long processes occupying big parts of a login node’s resources.
      • +
      • According to the previous rules, misbehaving running processes will have to be killed. +in order to keep the system responsive for other users.
      • +
      +
    • +
    + +

    Batch system

    + +
      +
    • Make sure that no broken or run-away processes are left when your job is done. Keep the process space clean on all nodes.
    • +
    • During the runtime of a job, it is mandatory to use the /scratch and /data/scratch/shared partitions for temporary data: +
        +
      • It is forbidden to use the /data/user or /data/project for that purpose.
      • +
      • Always remove files you do not need any more (e.g. core dumps, temporary files) as early as possible. Keep the disk space clean on all nodes.
      • +
      • Prefer /scratch over /data/scratch/shared and use the latter only when you require the temporary files to be visible from multiple nodes.
      • +
      +
    • +
    • Read the description in Merlin7 directory structure for learning about the correct usage of each partition type.
    • +
    + +

    User and project data

    + +
      +
    • Users are responsible for backing up their own data. Is recommended to backup the data on third party independent systems (i.e. LTS, Archive, AFS, SwitchDrive, Windows Shares, etc.).
    • +
    • When a user leaves PSI, she or her supervisor/team are responsible to backup and move the data out from the cluster: every few months, the storage space will be recycled for those old users who do not have an existing and valid PSI account.
    • +
    + + + +

    System Administrator Rights

    + +
      +
    • The system administrator has the right to temporarily block the access to Merlin7 for an account violating the Code of Conduct in order to maintain the efficiency and stability of the system. +
        +
      • Repetitive violations by the same user will be escalated to the user’s supervisor.
      • +
      +
    • +
    • The system administrator has the right to delete files in the scratch directories +
        +
      • after a job, if the job failed to clean up its files.
      • +
      • during the job in order to prevent a job from destabilizing a node or multiple nodes.
      • +
      +
    • +
    • The system administrator has the right to kill any misbehaving running processes.
    • +
    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin7/connect-from-linux.html b/merlin7/connect-from-linux.html new file mode 100644 index 0000000..d454124 --- /dev/null +++ b/merlin7/connect-from-linux.html @@ -0,0 +1,650 @@ + + + + + + + + +Connecting from a Linux Client | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Connecting from a Linux Client

    +
    + + + +
    + + +
    This document describes a recommended setup for a Linux client.
    + + + + + + + +
    + + + + + + +

    SSH without X11 Forwarding

    + +

    This is the standard method. Official X11 support is provided through NoMachine. +For normal SSH sessions, use your SSH client as follows:

    + +
    ssh $username@login001.merlin7.psi.ch
    +ssh $username@login002.merlin7.psi.ch
    +
    + +

    SSH with X11 Forwarding

    + +

    Official X11 Forwarding support is through NoMachine. Please follow the document +{Job Submission -> Interactive Jobs} and +{Accessing Merlin -> NoMachine} for more details. However, +we provide a small recipe for enabling X11 Forwarding in Linux.

    + +
      +
    • +

      For enabling client X11 forwarding, add the following to the start of ~/.ssh/config +to implicitly add -X to all ssh connections:

      + +
       ForwardAgent yes
      + ForwardX11Trusted yes
      +
      +
    • +
    • +

      Alternatively, you can add the option -Y to the ssh command. In example:

      + +
       ssh -X $username@login001.merlin7.psi.ch
      + ssh -X $username@login002.merlin7.psi.ch
      +
      +
    • +
    • +

      For testing that X11 forwarding works, just run sview. A X11 based slurm view of the cluster should +popup in your client session:

      + +
       sview
      +
      +
    • +
    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin7/connect-from-macos.html b/merlin7/connect-from-macos.html new file mode 100644 index 0000000..8238907 --- /dev/null +++ b/merlin7/connect-from-macos.html @@ -0,0 +1,661 @@ + + + + + + + + +Connecting from a MacOS Client | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Connecting from a MacOS Client

    +
    + + + +
    + + +
    This document describes a recommended setup for a MacOS client.
    + + + + + + + +
    + + + + + + +

    SSH without X11 Forwarding

    + +

    This is the standard method. Official X11 support is provided through NoMachine. +For normal SSH sessions, use your SSH client as follows:

    + +
    ssh $username@login001.merlin7.psi.ch
    +ssh $username@login002.merlin7.psi.ch
    +
    + +

    SSH with X11 Forwarding

    + +

    Requirements

    + +

    For running SSH with X11 Forwarding in MacOS, one needs to have a X server running in MacOS. +The official X Server for MacOS is XQuartz. Please ensure +you have it running before starting a SSH connection with X11 forwarding.

    + +

    SSH with X11 Forwarding in MacOS

    + +

    Official X11 support is through NoMachine. Please follow the document +{Job Submission -> Interactive Jobs} and +{Accessing Merlin -> NoMachine} for more details. However, +we provide a small recipe for enabling X11 Forwarding in MacOS.

    + +
      +
    • +

      Ensure that XQuartz is installed and running in your MacOS.

      +
    • +
    • +

      For enabling client X11 forwarding, add the following to the start of ~/.ssh/config +to implicitly add -X to all ssh connections:

      + +
       ForwardAgent yes
      + ForwardX11Trusted yes
      +
      +
    • +
    • +

      Alternatively, you can add the option -Y to the ssh command. In example:

      + +
       ssh -X $username@login001.merlin7.psi.ch
      + ssh -X $username@login002.merlin7.psi.ch
      +
      +
    • +
    • +

      For testing that X11 forwarding works, just run sview. A X11 based slurm view of the cluster should +popup in your client session.

      + +
       sview
      +
      +
    • +
    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin7/connect-from-windows.html b/merlin7/connect-from-windows.html new file mode 100644 index 0000000..d07e53c --- /dev/null +++ b/merlin7/connect-from-windows.html @@ -0,0 +1,660 @@ + + + + + + + + +Connecting from a Windows Client | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Connecting from a Windows Client

    +
    + + + +
    + + +
    This document describes a recommended setup for a Windows client.
    + + + + + + + +
    + + + + + + +

    SSH with PuTTY without X11 Forwarding

    + +

    PuTTY is one of the most common tools for SSH.

    + +

    Check, if the following software packages are installed on the Windows workstation by +inspecting the Start menu (hint: use the Search box to save time):

    + + +

    If they are missing, you can install them using the Software Kiosk icon on the Desktop.

    + +
      +
    1. +

      Start PuTTY

      +
    2. +
    3. +

      [Optional] Enable xterm to have similar mouse behavour as in Linux:

      + +

      Enable 'xterm'

      +
    4. +
    5. +

      Create session to a Merlin login node and Open:

      + +

      Create Merlin Session

      +
    6. +
    + +

    SSH with PuTTY with X11 Forwarding

    + +

    Official X11 Forwarding support is through NoMachine. Please follow the document +{Job Submission -> Interactive Jobs} and +{Accessing Merlin -> NoMachine} for more details. However, +we provide a small recipe for enabling X11 Forwarding in Windows.

    + +

    Check, if the Xming is installed on the Windows workstation by inspecting the +Start menu (hint: use the Search box to save time). If missing, you can install it by +using the Software Kiosk icon (should be located on the Desktop).

    + +
      +
    1. +

      Ensure that a X server (Xming) is running. Otherwise, start it.

      +
    2. +
    3. +

      Enable X11 Forwarding in your SSH client. In example, for Putty:

      + +

      Enable X11 Forwarding in Putty

      +
    4. +
    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin7/contact.html b/merlin7/contact.html new file mode 100644 index 0000000..79bbf39 --- /dev/null +++ b/merlin7/contact.html @@ -0,0 +1,655 @@ + + + + + + + + +Contact | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Contact

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    Support

    + +

    Support can be asked through:

    + + +

    Basic contact information is also displayed on every shell login to the system using the Message of the Day mechanism.

    + +

    PSI Service Now

    + +

    PSI Service Now: is the official tool for opening incident requests.

    +
      +
    • PSI HelpDesk will redirect the incident to the corresponding department, or
    • +
    • you can always assign it directly by checking the box I know which service is affected and providing the service name Local HPC Resources (e.g. Merlin) [CF] (just type in Local and you should get the valid completions).
    • +
    + +

    Contact Merlin Administrators

    + +

    E-Mail merlin-admins@lists.psi.ch

    +
      +
    • This is the official way to contact Merlin Administrators for discussions which do not fit well into the incident category. +Do not hesitate to contact us for such cases.
    • +
    + +
    + +

    Get updated through the Merlin User list!

    + +

    Is strictly recommended that users subscribe to the Merlin Users mailing list: merlin7-users@lists.psi.ch

    + +

    This mailing list is the official channel used by Merlin administrators to inform users about downtimes, +interventions or problems. Users can be subscribed in two ways:

    + +
      +
    • (Preferred way) Self-registration through Sympa
    • +
    • If you need to subscribe many people (e.g. your whole group) by sending a request to the admin list merlin-admins@lists.psi.ch +and providing a list of email addresses.
    • +
    + +
    + +

    The Merlin Cluster Team

    + +

    The PSI Merlin clusters are managed by the High Performance Computing and Emerging technologies Group, which + is part of the Science IT Infrastructure, and Services department (AWI) in PSI’s Center for Scientific Computing, Theory and Data (SCD).

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin7/cray-module-env.html b/merlin7/cray-module-env.html new file mode 100644 index 0000000..a1678c5 --- /dev/null +++ b/merlin7/cray-module-env.html @@ -0,0 +1,662 @@ + + + + + + + + +Cray Programming Environment | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Cray Programming Environment

    +
    + + + +
    + + +
    This document describes how to use the Cray Programming Environment on Merlin7.
    + + + + + + + +
    + + + + + + +

    Loading the Cray module

    + +

    The Cray Programming Environment, with Cray’s compilers and MPI, is not loaded by default.

    + +

    To load it, one has to run the following command:

    + +
    module load cray
    +
    + +

    The Cray Programming Environment will load all the necessary dependencies. In example:

    + +
    🔥 [caubet_m@login001:~]# module list
    +Currently Loaded Modules:
    + 1) craype-x86-rome                                 2) libfabric/1.15.2.0
    + 3) craype-network-ofi                             
    + 4) xpmem/2.9.6-1.1_20240510205610__g087dc11fc19d   5) PrgEnv-cray/8.5.0
    + 6) cce/17.0.0                                      7) cray-libsci/23.12.5
    + 8) cray-mpich/8.1.28                               9) craype/2.7.30
    +10) perftools-base/23.12.0                         11) cpe/23.12
    +12) cray/23.12                                     
    +
    + +

    You will notice an unfamiliar PrgEnv-cray/8.5.0 that was loaded. This is a meta-module that Cray provides to simplify the switch of compilers and their associated dependencies and libraries, +as a whole called Programming Environment. In the Cray Programming Environment, there are 4 key modules.

    + +
      +
    • cray-libsci is a collection of numerical routines tuned for performance on Cray systems.
    • +
    • libfabric is an important low-level library that allows you to take advantage of the high performance Slingshot network.
    • +
    • cray-mpich is a CUDA-aware MPI implementation, optimized for Cray systems.
    • +
    • cce is the compiler from Cray. C/C++ compilers are based on Clang/LLVM while Fortran supports Fortran 2018 standard. More info: https://user.cscs.ch/computing/compilation/cray/
    • +
    + +

    You can switch between different programming environments. You can check the available module with the module avail command, as follows:

    + +
    🔥 [caubet_m@login001:~]# module avail PrgEnv
    +--------------------- /opt/cray/pe/lmod/modulefiles/core ---------------------
    +
    +PrgEnv-cray/8.5.0               PrgEnv-gnu/8.5.0                
    +PrgEnv-nvhpc/8.5.0              PrgEnv-nvidia/8.5.0             
    +
    +

    Switching compiler suites

    + +

    Compiler suites can be exchanged with PrgEnv (Programming Environments) provided by HPE-Cray. The wrappers call the correct compiler with appropriate options to build +and link applications with relevant libraries, as required by the loaded modules (only dynamic linking is supported) and therefore should replace direct calls to compiler +drivers in Makefiles and build scripts.

    + +

    To swap the the compiler suite from the default Cray to GNU compiler, one can run the following.

    + +
    🔥 [caubet_m@login001:~]# module swap PrgEnv-cray/8.5.0 PrgEnv-gnu/8.5.0
    +
    +Lmod is automatically replacing "cce/17.0.0" with "gcc-native/12.3".
    +
    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin7/data-directories.html b/merlin7/data-directories.html new file mode 100644 index 0000000..80e5cf7 --- /dev/null +++ b/merlin7/data-directories.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

    Redirecting…

    + Click here if you are not redirected. + diff --git a/merlin7/gromacs.html b/merlin7/gromacs.html new file mode 100644 index 0000000..e0b9bd5 --- /dev/null +++ b/merlin7/gromacs.html @@ -0,0 +1,664 @@ + + + + + + + + +GROMACS | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    GROMACS

    +
    + + + +
    + + +
    GROMACS (GROningen Machine for Chemical Simulations) is a versatile and widely-used open source package to perform molecular dynamics
    + + + + + + + +

    GROMACS

    + +

    GROMACS (GROningen Machine for Chemical Simulations) is a versatile and widely-used open source package to perform molecular dynamics, i.e. simulate the Newtonian equations of motion for systems with hundreds to millions of particles.

    + +

    It is primarily designed for biochemical molecules like proteins, lipids and nucleic acids that have a lot of complicated bonded interactions, but since GROMACS is extremely fast at calculating the nonbonded interactions (that usually dominate simulations) many groups are also using it for research on non-biological systems, e.g. polymers.)

    + +

    Licensing Terms and Conditions

    + +

    GROMACS is a joint effort, with contributions from developers around the world: users agree to acknowledge use of GROMACS in any reports or publications of results obtained with the Software (see GROMACS Homepage for details).

    + +

    How to run on Merlin7

    +

    CPU nodes

    +
    module use Spack unstable
    +module load gcc/12.3 openmpi/5.0.7-ax23-A100-gpu gromacs/2025.2-whcq-omp
    +
    +

    A100 nodes

    +
    module use Spack unstable
    +module load gcc/12.3 openmpi/5.0.7-3vzj-A100-gpu gromacs/2025.2-vbj4-A100-gpu-omp
    +
    +

    GH nodes

    +
    module use Spack unstable
    +module load gcc/12.3 openmpi/5.0.7-blxc-GH200-gpu gromacs/2025.2-cjnq-GH200-gpu-omp
    +
    + +

    SBATCH GH, 4 GPU, 32 OMP threads, 4 MPI ranks

    +
    #!/bin/bash
    +#SBATCH --get-user-env
    +#SBATCH --output=_scheduler-stdout.txt
    +#SBATCH --error=_scheduler-stderr.txt
    +#SBATCH --job-name="Testing GROMACS GH"
    +#SBATCH --nodes=1             # number of GH200 nodes with each node having 4 CPU+GPU
    +#SBATCH --ntasks-per-node=4  # 8 MPI ranks per node
    +#SBATCH --cpus-per-task 32    # 32 OMP threads per MPI rank
    +#SBATCH --cluster=gmerlin7
    +#SBATCH --hint=nomultithread 
    +#SBATCH --partition=gh-hourly
    +#SBATCH --gpus=4
    +#SBATCH --gpus-per-task=1
    +
    +unset PMODULES_ENV
    +module purge
    +module use Spack unstable
    +module load gcc/12.3 openmpi/5.0.7-blxc-GH200-gpu gromacs/2025.2-cjnq-GH200-gpu-omp
    +
    +export FI_CXI_RX_MATCH_MODE=software
    +
    +export GMX_GPU_DD_COMMS=true
    +export GMX_GPU_PME_PP_COMMS=true
    +export GMX_FORCE_UPDATE_DEFAULT_GPU=true
    +export GMX_ENABLE_DIRECT_GPU_COMM=1
    +export GMX_FORCE_GPU_AWARE_MPI=1
    +
    +srun gmx_mpi mdrun -s input.tpr -ntomp 32 -bonded gpu -nb gpu -pme gpu -pin on -v -noconfout -dlb yes -nstlist 300 -npme 1 -nsteps 10000 -update gpu
    +
    + +

    Developing your own GPU code

    +

    A100

    +
    module purge
    +module use Spack unstable
    +module load gcc/12.3 openmpi/5.0.7-3vzj-A100-gpu gromacs/2025.2-vbj4-A100-gpu-omp cmake/3.31.6-o3lb python/3.13.1-cyro
    +
    +git clone https://github.com/gromacs/gromacs.git
    +cd gromacs 
    +
    +mkdir build && cd build
    +cmake -DCMAKE_C_COMPILER=gcc-12 \
    +    -DCMAKE_CXX_COMPILER=g++-12 \
    +    -DGMX_MPI=on \
    +    -DGMX_GPU=CUDA \
    +    -GMX_CUDA_TARGET_SM="80" \ # 90 for the Hopper GPUs
    +    -DGMX_DOUBLE=off \ # turn on double precision only if useful
    +    ..
    +
    +make
    +
    +
    + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin7/index.html b/merlin7/index.html new file mode 100644 index 0000000..99c8819 --- /dev/null +++ b/merlin7/index.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

    Redirecting…

    + Click here if you are not redirected. + diff --git a/merlin7/interactive-jobs.html b/merlin7/interactive-jobs.html new file mode 100644 index 0000000..62db45c --- /dev/null +++ b/merlin7/interactive-jobs.html @@ -0,0 +1,801 @@ + + + + + + + + +Running Interactive Jobs | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Running Interactive Jobs

    +
    + + + +
    + + +
    This document describes how to run interactive jobs as well as X based software.
    + + + + + + + +
    + + + + + + +

    Running interactive jobs

    + +

    There are two different ways for running interactive jobs in Slurm. This is possible by using +the salloc and srun commands:

    + +
      +
    • salloc: to obtain a Slurm job allocation (a set of nodes), execute command(s), and then release the allocation when the command is finished.
    • +
    • srun: is used for running parallel tasks.
    • +
    + +

    srun

    + +

    Is run is used to run parallel jobs in the batch system. It can be used within a batch script +(which can be run with sbatch), or within a job allocation (which can be run with salloc). +Also, it can be used as a direct command (in example, from the login nodes).

    + +

    When used inside a batch script or during a job allocation, srun is constricted to the +amount of resources allocated by the sbatch/salloc commands. In sbatch, usually +these resources are defined inside the batch script with the format #SBATCH <option>=<value>. +In other words, if you define in your batch script or allocation 88 tasks (and 1 thread / core) +and 2 nodes, srun is constricted to these amount of resources (you can use less, but never +exceed those limits).

    + +

    When used from the login node, usually is used to run a specific command or software in an +interactive way. srun is a blocking process (it will block bash prompt until the srun +command finishes, unless you run it in background with &). This can be very useful to run +interactive software which pops up a Window and then submits jobs or run sub-tasks in the +background (in example, Relion, cisTEM, etc.)

    + +

    Refer to man srun for exploring all possible options for that command.

    + +
    +[Show 'srun' example]: Running 'hostname' command on 3 nodes, using 2 cores (1 task/core) per node +
    +caubet_m@login001:~> srun --clusters=merlin7 --ntasks=6 --ntasks-per-node=2 --nodes=3 hostname
    +cn001.merlin7.psi.ch
    +cn001.merlin7.psi.ch
    +cn002.merlin7.psi.ch
    +cn002.merlin7.psi.ch
    +cn003.merlin7.psi.ch
    +cn003.merlin7.psi.ch
    +
    +
    + +

    salloc

    + +

    salloc is used to obtain a Slurm job allocation (a set of nodes). Once job is allocated, +users are able to execute interactive command(s). Once finished (exit or Ctrl+D), +the allocation is released. salloc is a blocking command, it is, command will be blocked +until the requested resources are allocated.

    + +

    When running salloc, once the resources are allocated, by default the user will get +a new shell on one of the allocated resources (if a user has requested few nodes, it will +prompt a new shell on the first allocated node). However, this behaviour can be changed by adding +a shell ($SHELL) at the end of the salloc command. In example:

    + +
    # Typical 'salloc' call 
    +salloc --clusters=merlin7 -N 2 -n 2
    +
    +# Custom 'salloc' call
    +#   - $SHELL will open a local shell on the login node from where ``salloc`` is running
    +salloc --clusters=merlin7 -N 2 -n 2 $SHELL
    +
    + +
    +[Show 'salloc' example]: Allocating 2 cores (1 task/core) in 2 nodes (1 core/node) - Default +
    +caubet_m@login001:~> salloc --clusters=merlin7 -N 2 -n 2
    +salloc: Granted job allocation 161
    +salloc: Nodes cn[001-002] are ready for job
    +
    +caubet_m@login001:~> srun hostname
    +cn002.merlin7.psi.ch
    +cn001.merlin7.psi.ch
    +
    +caubet_m@login001:~> exit
    +exit
    +salloc: Relinquishing job allocation 161
    +
    +
    + +
    +[Show 'salloc' example]: Allocating 2 cores (1 task/core) in 2 nodes (1 core/node) - $SHELL +
    +caubet_m@login001:~> salloc --clusters=merlin7 --ntasks=2 --nodes=2 $SHELL
    +salloc: Granted job allocation 165
    +salloc: Nodes cn[001-002] are ready for job
    +caubet_m@login001:~> srun hostname
    +cn001.merlin7.psi.ch
    +cn002.merlin7.psi.ch
    +caubet_m@login001:~> exit
    +exit
    +salloc: Relinquishing job allocation 165
    +
    +
    + +

    Running interactive jobs with X11 support

    + +

    Requirements

    + +

    Graphical access

    + +

    NoMachine is the official supported service for graphical +access in the Merlin cluster. This service is running on the login nodes. Check the +document {Accessing Merlin -> NoMachine} for details about +how to connect to the NoMachine service in the Merlin cluster.

    + +

    For other non officially supported graphical access (X11 forwarding):

    + + + +

    ‘srun’ with x11 support

    + +

    Merlin6 and merlin7 clusters allow running any windows based applications. For that, you need to +add the option --x11 to the srun command. In example:

    + +
    srun --clusters=merlin7 --x11 sview
    +
    + +

    will popup a X11 based slurm view of the cluster.

    + +

    In the same manner, you can create a bash shell with x11 support. For doing that, you need +to add the option --pty to the srun --x11 command. Once resource is allocated, from +there you can interactively run X11 and non-X11 based commands.

    + +
    srun --clusters=merlin7 --x11 --pty bash
    +
    + +
    +[Show 'srun' with X11 support examples] +
    +caubet_m@login001:~> srun --clusters=merlin7 --x11 sview
    +
    +caubet_m@login001:~> 
    +
    +caubet_m@login001:~> srun --clusters=merlin7 --x11 --pty bash
    +
    +caubet_m@cn003:~> sview
    +
    +caubet_m@cn003:~> echo "This was an example"
    +This was an example
    +
    +caubet_m@cn003:~> exit
    +exit
    +
    +
    + +

    ‘salloc’ with x11 support

    + +

    Merlin6 and merlin7 clusters allow running any windows based applications. For that, you need to +add the option --x11 to the salloc command. In example:

    + +
    salloc --clusters=merlin7 --x11 sview
    +
    + +

    will popup a X11 based slurm view of the cluster.

    + +

    In the same manner, you can create a bash shell with x11 support. For doing that, you need +to add to run just salloc --clusters=merlin7 --x11. Once resource is allocated, from +there you can interactively run X11 and non-X11 based commands.

    + +
    salloc --clusters=merlin7 --x11
    +
    + +
    +[Show 'salloc' with X11 support examples] +
    +caubet_m@login001:~> salloc --clusters=merlin7 --x11 sview
    +salloc: Granted job allocation 174
    +salloc: Nodes cn001 are ready for job
    +salloc: Relinquishing job allocation 174
    +
    +caubet_m@login001:~> salloc --clusters=merlin7 --x11 
    +salloc: Granted job allocation 175
    +salloc: Nodes cn001 are ready for job
    +caubet_m@cn001:~> 
    +
    +caubet_m@cn001:~> sview
    +
    +caubet_m@cn001:~> echo "This was an example"
    +This was an example
    +
    +caubet_m@cn001:~> exit
    +exit
    +salloc: Relinquishing job allocation 175
    +
    +
    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin7/interactive.html b/merlin7/interactive.html new file mode 100644 index 0000000..8b32941 --- /dev/null +++ b/merlin7/interactive.html @@ -0,0 +1,686 @@ + + + + + + + + +Accessing Interactive Nodes | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Accessing Interactive Nodes

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    SSH Access

    + +

    For interactive command shell access, use an SSH client. We recommend to activate SSH’s X11 forwarding to allow you to use graphical +applications (e.g. a text editor, but for more performant graphical access, refer to the sections below). X applications are supported +in the login nodes and X11 forwarding can be used for those users who have properly configured X11 support in their desktops, however:

    + +
      +
    • Merlin7 administrators do not offer support for user desktop configuration (Windows, MacOS, Linux). +
        +
      • Hence, Merlin7 administrators do not offer official support for X11 client setup.
      • +
      • Nevertheless, a generic guide for X11 client setup (Linux, Windows and MacOS) is provided below.
      • +
      +
    • +
    • PSI desktop configuration issues must be addressed through PSI Service Now as an Incident Request. +
        +
      • Ticket will be redirected to the corresponding Desktop support group (Windows, Linux).
      • +
      +
    • +
    + +

    Accessing from a Linux client

    + +

    Refer to {How To Use Merlin -> Accessing from Linux Clients} for Linux SSH client and X11 configuration.

    + +

    Accessing from a Windows client

    + +

    Refer to {How To Use Merlin -> Accessing from Windows Clients} for Windows SSH client and X11 configuration.

    + +

    Accessing from a MacOS client

    + +

    Refer to {How To Use Merlin -> Accessing from MacOS Clients} for MacOS SSH client and X11 configuration.

    + +

    NoMachine Remote Desktop Access

    + +

    X applications are supported in the login nodes and can run efficiently through a NoMachine client. This is the officially supported way to run more demanding X applications on Merlin7.

    +
      +
    • For PSI Windows workstations, this can be installed from the Software Kiosk as ‘NX Client’. If you have difficulties installing, please request support through PSI Service Now as an Incident Request.
    • +
    • For other workstations The client software can be downloaded from the Nomachine Website.
    • +
    + +

    Configuring NoMachine

    + +

    Refer to {How To Use Merlin -> Remote Desktop Access} for further instructions of how to configure the NoMachine client and how to access it from PSI and from outside PSI.

    + +

    Login nodes hardware description

    + +

    The Merlin7 login nodes are the official machines for accessing the recources of Merlin7. +From these machines, users can submit jobs to the Slurm batch system as well as visualize or compile their software.

    + +

    The Merlin7 login nodes are the following:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    HostnameSSHNoMachineScratchScratch Mountpoint
    login001.merlin7.psi.chyesyes1TB NVMe/scratch
    login002.merlin7.psi.chyesyes1TB NVMe/scratch
    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin7/introduction.html b/merlin7/introduction.html new file mode 100644 index 0000000..c39e850 --- /dev/null +++ b/merlin7/introduction.html @@ -0,0 +1,710 @@ + + + + + + + + +Introduction | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Introduction

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    About Merlin7

    + +

    The Merlin7 cluster is moving toward production state since August 2024, this is expected latest by Q4 2025. Since January 2025 the system has been generally available, +but due to some remaining issues with the platform, the schedule of the migration of users and communities has been delayed. You will be notified well in advance +regarding the migration of data.

    + +

    All PSI users can request access to Merlin7, please go to the Requesting Merlin Accounts page and complete the steps given there.

    + +

    In case you identify errors or missing information, please provide feedback through merlin-admins mailing list mailing list or submit a ticket using the PSI service portal.

    + +

    Infrastructure

    + +

    Hardware

    + +

    The Merlin7 cluster contains the following node specification:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Node#NCPURAMGPU#GPUs
    Login22 AMD EPYC 7742 (64 Cores 2.25GHz)512GB  
    CPU772 AMD EPYC 7742 (64 Cores 2.25GHz)512GB  
    GPU A10082 AMD EPYC 7713 (64 Cores 3.2GHz)512GBA100 80GB4
    GPU GH5NVIDIA ARM Grace Neoverse v2 (144 Cores 3.1GHz)864GB (Unified)GH200 120GB4
    + +

    Network

    + +

    The Merlin7 cluster builds on top of HPE/Cray technologies, including a high-performance network fabric called Slingshot. This network fabric is able +to provide up to 200 Gbit/s throughput between nodes. Further information on Slignshot can be found on at HPE and +at https://www.glennklockwood.com/garden/slingshot.

    + +

    Through software interfaces like libFabric (which available on Merlin7), application can leverage the network seamlessly.

    + +

    Storage

    + +

    Unlike previous iteration of the Merlin HPC clusters, Merlin7 does not have any local storage. Instead storage for the entire cluster is provided through +a dedicated storage appliance from HPE/Cray called ClusterStor.

    + +

    The appliance is built of several storage servers:

    + +
      +
    • 2 management nodes
    • +
    • 2 MDS servers, 12 drives per server, 2.9TiB (Raid10)
    • +
    • 8 OSS-D servers, 106 drives per server, 14.5 T.B HDDs (Gridraid / Raid6)
    • +
    • 4 OSS-F servers, 12 drives per server 7TiB SSDs (Raid10)
    • +
    + +

    With effective storage capacity of:

    + +
      +
    • 10 PB HDD +
        +
      • value visible on linux: HDD 9302.4 TiB
      • +
      +
    • +
    • 162 TB SSD +
        +
      • value visible on linux: SSD 151.6 TiB
      • +
      +
    • +
    • 23.6 TiB on Metadata
    • +
    + +

    The storage is directly connected to the cluster (and each individual node) through the Slingshot NIC.

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin7/ippl.html b/merlin7/ippl.html new file mode 100644 index 0000000..acea010 --- /dev/null +++ b/merlin7/ippl.html @@ -0,0 +1,627 @@ + + + + + + + + +IPPL | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    IPPL

    +
    + + + +
    + + +
    Independent Parallel Particle Layer (IPPL) is a performance portable C++ library for Particle-Mesh methods
    + + + + + + + +

    IPPL

    + +

    Independent Parallel Particle Layer (IPPL) is a performance portable C++ library for Particle-Mesh methods. IPPL makes use of Kokkos (https://github.com/kokkos/kokkos), HeFFTe (https://github.com/icl-utk-edu/heffte), and MPI (Message Passing Interface) to deliver a portable, massively parallel toolkit for particle-mesh methods. IPPL supports simulations in one to six dimensions, mixed precision, and asynchronous execution in different execution spaces (e.g. CPUs and GPUs).

    + +

    Licensing Terms and Conditions

    + +

    GNU GPLv3

    + +

    How to run on Merlin7

    +

    A100 nodes

    +

    Pipeline

    +
    module use Spack unstable
    +module load gcc/13.2.0 openmpi/4.1.6-57rc-A100-gpu                 
    +module load boost/1.82.0-e7gp fftw/3.3.10 gnutls/3.8.3 googletest/1.14.0 gsl/2.8 h5hut/2.0.0rc7 openblas/0.3.26-omp cmake/3.31.6-oe7u
    +
    +cd <path to IPPL source directory>
    +mkdir build_gpu
    +cd build_gpu
    +
    +cmake -DCMAKE_BUILD_TYPE=Release -DKokkos_ARCH_AMPERE80=ON -DCMAKE_CXX_STANDARD=20 -DIPPL_ENABLE_FFT=ON -DIPPL_ENABLE_TESTS=ON -DUSE_ALTERNATIVE_VARIANT=ON -DIPPL_ENABLE_SOLVERS=ON -DIPPL_ENABLE_ALPINE=True -DIPPL_PLATFORMS=cuda ..
    +make [-jN]
    +
    + +

    GH nodes

    +

    Pipeline

    + +
    salloc --partition=gh-daily --clusters=gmerlin7 --time=08:00:00 --ntasks=4 --nodes=1 --gpus=1 --mem=40000 $SHELL
    +ssh <allocated_gpu>
    +
    +module use Spack unstable
    +module load gcc/13.2.0 openmpi/5.0.3-3lmi-GH200-gpu  
    +module load boost/1.82.0-3ns6 fftw/3.3.10 gnutls/3.8.3 googletest/1.14.0 gsl/2.7.1 h5hut/2.0.0rc7 openblas/0.3.26 cmake/3.31.4-u2nm  
    +
    +cd <path to IPPL source directory>
    +mkdir build_gh
    +cd build_gh
    +
    +cmake -DCMAKE_BUILD_TYPE=Release -DKokkos_ARCH_HOPPER90=ON -DCMAKE_CXX_STANDARD=20 -DIPPL_ENABLE_FFT=ON -DIPPL_ENABLE_TESTS=ON -DUSE_ALTERNATIVE_VARIANT=ON -DIPPL_ENABLE_SOLVERS=ON -DIPPL_ENABLE_ALPINE=True -DIPPL_PLATFORMS=cuda ..
    +make [-jN]
    +
    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin7/kerberos.html b/merlin7/kerberos.html new file mode 100644 index 0000000..224a0dc --- /dev/null +++ b/merlin7/kerberos.html @@ -0,0 +1,825 @@ + + + + + + + + +Kerberos and AFS authentication | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Kerberos and AFS authentication

    +
    + + + +
    + + +
    This document describes how to use Kerberos.
    + + + + + + + +
    + + + + + + +

    Projects and users have their own areas in the central PSI AFS service. In order +to access to these areas, valid Kerberos and AFS tickets must be granted.

    + +

    These tickets are automatically granted when accessing through SSH with +username and password. Alternatively, one can get a granting ticket with the kinit (Kerberos) +and aklog (AFS ticket, which needs to be run after kinit) commands.

    + +

    Due to PSI security policies, the maximum lifetime of the ticket is 7 days, and the default +time is 10 hours. It means than one needs to constantly renew (krenew command) the existing +granting tickets, and their validity can not be extended longer than 7 days. At this point, +one needs to obtain new granting tickets.

    + +

    Obtaining granting tickets with username and password

    + +

    As already described above, the most common use case is to obtain Kerberos and AFS granting tickets +by introducing username and password:

    + +
      +
    • When login to Merlin through SSH protocol, if this is done with username + password authentication, +tickets for Kerberos and AFS will be automatically obtained.
    • +
    • When login to Merlin through NoMachine, no Kerberos and AFS are granted. Therefore, users need to +run kinit (to obtain a granting Kerberos ticket) followed by aklog (to obtain a granting AFS ticket). +See further details below.
    • +
    + +

    To manually obtain granting tickets, one has to:

    + +
      +
    1. +

      To obtain a granting Kerberos ticket, one needs to run kinit $USER and enter the PSI password.

      + +
      kinit $USER@D.PSI.CH
      +
      +
    2. +
    3. +

      To obtain a granting ticket for AFS, one needs to run aklog. No password is necessary, but a valid +Kerberos ticket is mandatory.

      + +
      aklog
      +
      +
    4. +
    5. +

      To list the status of your granted tickets, users can use the klist command.

      + +
      klist
      +
      +
    6. +
    7. +

      To extend the validity of existing granting tickets, users can use the krenew command.

      + +
      krenew
      +
      + +
        +
      • Keep in mind that the maximum lifetime for granting tickets is 7 days, therefore krenew can not be used beyond that limit, +and then kinit should be used instead.
      • +
      +
    8. +
    + +

    Obtanining granting tickets with keytab

    + +

    Sometimes, obtaining granting tickets by using password authentication is not possible. An example are user Slurm jobs +requiring access to private areas in AFS. For that, there’s the possibility to generate a keytab file.

    + +

    Be aware that the keytab file must be private, fully protected by correct permissions and not shared with any +other users.

    + +

    Creating a keytab file

    + +

    For generating a keytab, one has to:

    + +
      +
    1. +

      Load a newer Kerberos ( krb5/1.20 or higher) from Pmodules:

      + +
      module load krb5/1.20
      +
      +
    2. +
    3. +

      Create a private directory for storing the Kerberos keytab file

      + +
      mkdir -p ~/.k5
      +
      +
    4. +
    5. +

      Run the ktutil utility which comes with the loaded krb5 Pmodule:

      + +
      ktutil
      +
      +
    6. +
    7. +

      In the ktutil console, one has to generate a keytab file as follows:

      + +
      # Replace $USER by your username
      +add_entry -password -k 0 -f -p $USER
      +wkt /data/user/$USER/.k5/krb5.keytab
      +exit
      +
      + +

      Notice that you will need to add your password once. This step is required for generating the keytab file.

      +
    8. +
    9. +

      Once back to the main shell, one has to ensure that the file contains the proper permissions:

      + +
      chmod 0600 ~/.k5/krb5.keytab
      +
      +
    10. +
    + +

    Obtaining tickets by using keytab files

    + +

    Once the keytab is created, one can obtain kerberos tickets without being prompted for a password as follows:

    + +
    kinit -kt ~/.k5/krb5.keytab $USER
    +aklog
    +
    + +

    Slurm jobs accessing AFS

    + +

    Some jobs may require to access private areas in AFS. For that, having a valid keytab file is required. +Then, from inside the batch script one can obtain granting tickets for Kerberos and AFS, which can be used for accessing AFS private areas.

    + +

    The steps should be the following:

    + +
      +
    • +

      Setup KRB5CCNAME, which can be used to specify the location of the Kerberos5 credentials (ticket) cache. In general it should point to a shared area +($HOME/.k5 is a good location), and is strongly recommended to generate an independent Kerberos5 credential cache (it is, creating a new credential cache per Slurm job):

      + +
      export KRB5CCNAME="$(mktemp "$HOME/.k5/krb5cc_XXXXXX")"
      +
      +
    • +
    • +

      To obtain a Kerberos5 granting ticket, run kinit by using your keytab:

      + +
      kinit -kt "$HOME/.k5/krb5.keytab" $USER@D.PSI.CH
      +
      +
    • +
    • +

      To obtain a granting AFS ticket, run aklog:

      + +
      aklog
      +
      +
    • +
    • +

      At the end of the job, you can remove destroy existing Kerberos tickets.

      + +
      kdestroy
      +
      +
    • +
    + +

    Slurm batch script example: obtaining KRB+AFS granting tickets

    + +

    Example 1: Independent crendetial cache per Slurm job

    + +

    This is the recommended way. At the end of the job, is strongly recommended to remove / destroy the existing kerberos tickets.

    + +
    #!/bin/bash
    +#SBATCH --partition=hourly            # Specify 'general' or 'daily' or 'hourly'
    +#SBATCH --time=01:00:00               # Strictly recommended when using 'general' partition.
    +#SBATCH --output=run.out              # Generate custom output file
    +#SBATCH --error=run.err               # Generate custom error  file
    +#SBATCH --nodes=1                     # Uncomment and specify #nodes to use
    +#SBATCH --ntasks=1                    # Uncomment and specify #nodes to use 
    +#SBATCH --cpus-per-task=1
    +#SBATCH --constraint=xeon-gold-6152
    +#SBATCH --hint=nomultithread
    +#SBATCH --job-name=krb5
    +
    +export KRB5CCNAME="$(mktemp "$HOME/.k5/krb5cc_XXXXXX")"
    +kinit -kt "$HOME/.k5/krb5.keytab" $USER@D.PSI.CH
    +aklog
    +klist
    +
    +echo "Here should go my batch script code."
    +
    +# Destroy Kerberos tickets created for this job only
    +kdestroy
    +klist
    +
    + +

    Example 2: Shared credential cache

    + +

    Some users may need/prefer to run with a shared cache file. For doing that, one needs to +setup KRB5CCNAME from the login node session, before submitting the job.

    + +
    export KRB5CCNAME="$(mktemp "$HOME/.k5/krb5cc_XXXXXX")"
    +
    + +

    Then, you can run one or multiple jobs scripts (or parallel job with srun). KRB5CCNAME will be propagated to the +job script or to the parallel job, therefore a single credential cache will be shared amongst different Slurm runs.

    + +
    #!/bin/bash
    +#SBATCH --partition=hourly            # Specify 'general' or 'daily' or 'hourly'
    +#SBATCH --time=01:00:00               # Strictly recommended when using 'general' partition.
    +#SBATCH --output=run.out              # Generate custom output file
    +#SBATCH --error=run.err               # Generate custom error  file
    +#SBATCH --nodes=1                     # Uncomment and specify #nodes to use
    +#SBATCH --ntasks=1                    # Uncomment and specify #nodes to use 
    +#SBATCH --cpus-per-task=1
    +#SBATCH --constraint=xeon-gold-6152
    +#SBATCH --hint=nomultithread
    +#SBATCH --job-name=krb5
    +
    +# KRB5CCNAME is inherit from the login node session
    +kinit -kt "$HOME/.k5/krb5.keytab" $USER@D.PSI.CH
    +aklog
    +klist
    +
    +echo "Here should go my batch script code."
    +
    +echo "No need to run 'kdestroy', as it may have to survive for running other jobs"
    +
    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin7/merlin-rmount.html b/merlin7/merlin-rmount.html new file mode 100644 index 0000000..99f2e42 --- /dev/null +++ b/merlin7/merlin-rmount.html @@ -0,0 +1,702 @@ + + + + + + + + +Using merlin_rmount | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Using merlin_rmount

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    Background

    + +

    Merlin provides a command for mounting remote file systems, called merlin_rmount. This +provides a helpful wrapper over the Gnome storage utilities (GIO and GVFS), and provides support for a wide range of remote file formats, including

    +
      +
    • SMB/CIFS (Windows shared folders)
    • +
    • WebDav
    • +
    • AFP
    • +
    • FTP, SFTP
    • +
    • complete list
    • +
    + +

    Usage

    + +

    Start a session

    + +

    First, start a new session. This will start a new bash shell in the current terminal where you can add further commands.

    + +
    $ merlin_rmount --init
    +[INFO] Starting new D-Bus RMOUNT session
    +
    +(RMOUNT STARTED) [bliven_s@login002 ~]$
    +
    + +

    Note that behind the scenes this is creating a new dbus daemon. Running multiple daemons on the same login node leads to unpredictable results, so it is best not to initialize multiple sessions in parallel.

    + +

    Standard Endpoints

    + +

    Standard endpoints can be mounted using

    + +
    merlin_rmount --select-mount
    +
    + +

    Select the desired url using the arrow keys.

    + +

    merlin_rmount --select-mount

    + +

    From this list any of the standard supported endpoints can be mounted.

    + +

    Other endpoints

    + +

    Other endpoints can be mounted using the merlin_rmount --mount <endpoint> command.

    + +

    merlin_rmount --mount

    + +

    Accessing Files

    + +

    After mounting a volume the script will print the mountpoint. It should be of the form

    + +
    /run/user/$UID/gvfs/<endpoint>
    +
    + +

    where $UID gives your unix user id (a 5-digit number, also viewable with id -u) and +<endpoint> is some string generated from the mount options.

    + +

    For convenience, it may be useful to add a symbolic link for this gvfs directory. For instance, this would allow all volumes to be accessed in ~/mnt/:

    + +
    ln -s ~/mnt /run/user/$UID/gvfs
    +
    + +

    Files are accessible as long as the merlin_rmount shell remains open.

    + +

    Disconnecting

    + +

    To disconnect, close the session with one of the following:

    + +
      +
    • The exit command
    • +
    • CTRL-D
    • +
    • Closing the terminal
    • +
    + +

    Disconnecting will unmount all volumes.

    + +

    Alternatives

    + +

    Thunar

    + +

    Users that prefer a GUI file browser may prefer the thunar command, which opens the Gnome File Browser. This is also available in NoMachine sessions in the bottom bar (1). Thunar supports the same remote filesystems as merlin_rmount; just type the URL in the address bar (2).

    + +

    Mounting with thunar

    + +

    When using thunar within a NoMachine session, file transfers continue after closing NoMachine (as long as the NoMachine session stays active).

    + +

    Files can also be accessed at the command line as needed (see ‘Accessing Files’ above).

    + +

    Resources

    + + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin7/merlin7-configuration.html b/merlin7/merlin7-configuration.html new file mode 100644 index 0000000..8c64e63 --- /dev/null +++ b/merlin7/merlin7-configuration.html @@ -0,0 +1,706 @@ + + + + + + + + +Slurm cluster 'merlin7' | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Slurm cluster 'merlin7'

    +
    + + + +
    + + +
    This document describes a summary of the Merlin7 configuration.
    + + + + + + + +
    + + + + + + +

    This documentation shows basic Slurm configuration and options needed to run jobs in the Merlin7 cluster.

    + +

    Infrastructure

    + +

    Hardware

    + +
      +
    • 2 CPU-only login nodes
    • +
    • 77 CPU-only compute nodes
    • +
    • 5 GPU A100 nodes
    • +
    • 8 GPU Grace Hopper nodes
    • +
    + +

    The specification of the node types is:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Node#NodesCPURAMGRES
    Login Nodes22x AMD EPYC 7742 (x86_64 Rome, 64 Cores, 2.25GHz)512GB DDR4 3200Mhz 
    CPU Nodes772x AMD EPYC 7742 (x86_64 Rome, 64 Cores, 2.25GHz)512GB DDR4 3200Mhz 
    A100 GPU Nodes82x AMD EPYC 7713 (x86_64 Milan, 64 Cores, 3.2GHz)512GB DDR4 3200Mhz4 x NV_A100 (80GB)
    GH GPU Nodes52x NVidia Grace Neoverse-V2 (SBSA ARM 64bit, 144 Cores, 3.1GHz)2x 480GB DDR5X (CPU+GPU)4 x NV_GH200 (120GB)
    + +

    Network

    + +

    The Merlin7 cluster builds on top of HPE/Cray technologies, including a high-performance network fabric called Slingshot. This network fabric is able +to provide up to 200 Gbit/s throughput between nodes. Further information on Slignshot can be found on at HPE and +at https://www.glennklockwood.com/garden/slingshot.

    + +

    Through software interfaces like libFabric (which available on Merlin7), application can leverage the network seamlessly.

    + +

    Storage

    + +

    Unlike previous iteration of the Merlin HPC clusters, Merlin7 does not have any local storage. Instead storage for the entire cluster is provided through +a dedicated storage appliance from HPE/Cray called ClusterStor.

    + +

    The appliance is built of several storage servers:

    + +
      +
    • 2 management nodes
    • +
    • 2 MDS servers, 12 drives per server, 2.9TiB (Raid10)
    • +
    • 8 OSS-D servers, 106 drives per server, 14.5 T.B HDDs (Gridraid / Raid6)
    • +
    • 4 OSS-F servers, 12 drives per server 7TiB SSDs (Raid10)
    • +
    + +

    With effective storage capacity of:

    + +
      +
    • 10 PB HDD +
        +
      • value visible on linux: HDD 9302.4 TiB
      • +
      +
    • +
    • 162 TB SSD +
        +
      • value visible on linux: SSD 151.6 TiB
      • +
      +
    • +
    • 23.6 TiB on Metadata
    • +
    + +

    The storage is directly connected to the cluster (and each individual node) through the Slingshot NIC.

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin7/migrating.html b/merlin7/migrating.html new file mode 100644 index 0000000..dc159d6 --- /dev/null +++ b/merlin7/migrating.html @@ -0,0 +1,1026 @@ + + + + + + + + + | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    Merlin6 to Merlin7 Migration Guide

    + +

    Welcome to the official documentation for migrating your data from Merlin6 to Merlin7. Please follow the instructions carefully to ensure a smooth and secure transition.

    + +

    📅 Migration Schedule

    + +

    Phase 1: Users without Projects — Deadline: July 11

    + +

    If you do not belong to any Merlin project, i.e for

    + +
      +
    • Users not in any group project (/data/projects/general)
    • +
    • Users not in BIO, MEG, Mu3e
    • +
    • Users not part of PSI-owned private Merlin nodes (ASA, MEG, Mu3e)
    • +
    + +

    You must complete your migration before July 11. You just need to migrate your personal /data/user/$USER and /home/psi/$USER directories.

    + +

    Users are responsible for initiating and completing the migration process as lined out below. +Contact the Merlin support team merlin-admins@lists.psi.ch if you need help.

    + +
    +

    ⚠️ In this phase, it’s important that you don’t belong to any project. +Once the migration is finished, access to Merlin6 will be no longer possible.

    +
    + +

    Please refer to the Phase 1: Step-by-Step Migration Instructions section +for detailed information about user data migration.

    + +

    Phase 2: Project Members and Owners — Start Before August 1

    + +

    For users in active projects:

    + +
      +
    • Project owners and members will be contacted by the Merlin admins.
    • +
    • Migration will be scheduled individually per project.
    • +
    • Expect contact before August 1.
    • +
    + +
    +

    ⚠️ In this phase, data and home directories of group owners and members will be also requested to be migrated in parallel.

    +
    + +

    Please refer to the Phase 2: Migration Instructions section +for further information.

    + +
    + +

    Directory Structure Changes

    + +

    Merlin6 vs Merlin7

    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ClusterHome DirectoryUser Data DirectoryProjectsExperiments
    merlin6/psi/home/$USER/data/user/$USER/data/project//data/experiments
    merlin7/data/user/$USER/data/user/$USER/data/project//data/project/
    + +
      +
    • The home directory and user data directory have been merged into the single new home directory/data/user/$USER.
    • +
    • +

      The experiments directory has been integrated into /data/project/:

      + +
        +
      • /data/project/general contains general Merlin7 projects.
      • +
      • Other subdirectories are used for large-scale projects such as CLS division, Mu3e, and MeG.
      • +
      +
    • +
    + +
    + +

    📋 Prerequisites and Preparation

    + +

    Before starting the migration, make sure you:

    + +
      +
    • +

      are registered on Merlin7.

      + + +
    • +
    • have cleaned up your data to reduce migration time and space usage.
    • +
    • +

      For the user data migration, ensure your total usage on Merlin6 (/psi/home+/data/user) is well below the 1 TB quota (use the merlin_quotas command). Remember:

      + +
        +
      • Merlin7 also has a 1 TB quota on your home directory, and you might already have data there.
      • +
      • If your usage exceeds this during the transfer, the process might fail.
      • +
      +
    • +
    + + + +
      +
    • Remove unused files and datasets.
    • +
    • Archive large, inactive data sets.
    • +
    • +

      Delete or clean up unused conda or virtualenv Python environments:

      + +
        +
      • These are often large and may not work as-is on Merlin7.
      • +
      • +

        You can export your conda environment description to a file with:

        + +
        conda env export -n myenv > $HOME/myenv.yml
        +
        +
      • +
      • Then recreate them later on Merlin7 from these files.
      • +
      +
    • +
    + +
    +

    🧹 For the user data, you can always remove more old data after migration — it will be copied into ~/merlin6data and ~/merlin6home on Merlin7.

    +
    + +
    + +

    Phase 1: Step-by-Step Migration Instructions

    + +

    Step 1: Run merlin7_migration.setup

    + +

    Log into any Merlin6 login node (merlin-l-001.psi.ch, merlin-l-002.psi.ch, merlin-l-01.psi.ch) and run:

    + +
    merlin7_migration.setup
    +
    + +

    This script will:

    + +
      +
    • Check that you have an account on Merlin7.
    • +
    • Configure and check that your environment is ready for transferring files via Slurm job.
    • +
    • +

      Create two directories:

      + +
        +
      • ~/merlin6data → copy of your old /data/user
      • +
      • ~/merlin6home → copy of your old home
      • +
      +
    • +
    + +
    +

    ⚠️ Important: If ~/merlin6home or ~/merlin6data already exist on Merlin7, the script will exit. +Please remove them or contact support.

    +
    + +

    If there are issues, the script will:

    + +
      +
    • Print clear diagnostic output
    • +
    • Give you some hints to resolve the issue
    • +
    + +

    If you are stuck, email: merlin-admins@lists.psi.ch

    + +
    + +

    Step 2: Run merlin7_migration.start

    + +

    After setup completes, start the migration by running:

    + +
    merlin7_migration.start
    +
    + +

    This script will:

    + +
      +
    • Check the status of your quota on Merlin6.
    • +
    • Submit SLURM batch jobs to the xfer partition
    • +
    • +

      Queue two jobs:

      + +
        +
      • migrate_merlin6data.batch (data dir)
      • +
      • migrate_merlin6home.batch (home dir) +
          +
        • This job will only start if migrate_merlin6data.batch has successfully +finished.
        • +
        +
      • +
      +
    • +
    • Automatically track the job IDs
    • +
    • Print log file locations for the different jobs
    • +
    + +
    +

    ⚠️ Once both transfers succeed, your access to Merlin6 will be revoked. +Do not attempt to reconnect to Merlin6 after this.

    +
    + +

    ❗ If Something Goes Wrong

    + +

    If a problem occurs during the migration process:

    + +
      +
    • 🔍 Check the job log files mentioned in the script output. They contain detailed messages that explain what failed and why.
    • +
    • +

      🛠️ Fix the root cause on the source system. Common issues include:

      + +
        +
      • Files with incorrect permissions
      • +
      • Ownership mismatches
      • +
      • Disk quota exceeded on Merlin7
      • +
      +
    • +
    • 📚 Refer to the ⚠️ Common rsync/fpsync Migration Issues section below for detailed explanations and solutions.
    • +
    + +
    +

    ℹ️ Important: If migrate_merlin6data.batch fails, the migration process will automatically cancel migrate_merlin6home.batch to avoid ending in an inconsistent state.

    +
    + +

    Once the problem is resolved, simply re-run the merlin7_migration.start script to resume the migration.

    + +
    + +

    Step 3: Monitor Transfer Jobs

    + +

    To monitor your transfer jobs, run:

    + +
    squeue -M merlin6 -u $USER -p xfer
    +
    + +

    Check the output to ensure your jobs are:

    + +
      +
    • Running (R) or completed (CG or removed from queue)
    • +
    • Not failed (F, TO, or stuck)
    • +
    + +

    You can also check logs (as printed by the script) to verify job completion.

    + +
    +

    ✅ When /data/user/$USER and /psi/home/$USER on Merlin6 are no longer accessible, migration is complete.

    +
    + +
    + +

    Examples

    + +

    Setup the Migration

    + +
    merlin7_migration.setup
    +
    + +

    Expected output:

    + +
    ✅ login002.merlin7.psi.ch                                                   
    +✅ `$USER` is a member of svc-cluster_merlin7
    +✅ Skipping key generation                                                   
    +✅ SSH key already added to agent.                                           
    +✅ SSH ID successfully copied to login00[1|2].merlin7.psi.ch.
    +✅ Test successful.
    +✅ /data/software/xfer_logs/caubet_m created.
    +✅ ~/merlin6data directory created.
    +✅ ~/merlin6home directory created.
    +
    + +

    Start the Migration

    + +
    merlin7_migration.start
    +
    + +

    Expected output:

    + +
    (base)[caubet_m@merlin-l-001:/data/software/admin/scripts/merlin-user-tools/alps(master)]# ./merlin7_migration.start
    +✅ Quota check passed.
    +Used: 512 GB, 234001 files
    +
    +###################################################
    +Submitting transfer jobs to Slurm
    +
    +   Job logs can be found here:
    +➡️  Directory '/data/user/caubet_m' does NOT have 000 permissions. Transfer pending, continuing...
    +✅ Submitted DATA_MIGRATION job: 24688554. Sleeping 3 seconds...
    +   - /data/user transfer logs:
    +     - /data/software/xfer_logs/caubet_m/data-24688554.out
    +     - /data/software/xfer_logs/caubet_m/data-24688554.err
    +➡️  Directory '/psi/home/caubet_m' does NOT have 000 permissions. Transfer pending, continuing...
    +✅ Submitted HOME_MIGRATION job with dependency on 24688554: 24688555. Sleeping 3 seconds...
    +   - /psi/home transfer logs:
    +     - /data/software/xfer_logs/caubet_m/home-24688555.out
    +     - /data/software/xfer_logs/caubet_m/home-24688555.err
    +
    +✅ You can start manually a monitoring window with:
    +   tmux new-session -d -s "xfersession" "watch 'squeue -M merlin6 -u caubet_m -p xfer'"
    +   tmux attach -t "xfersession"
    +
    +✅ FINISHED - PLEASE CHECK JOB TRANSFER PROGRESS
    +
    + +

    Monitor Progress

    + +
    squeue -M merlin6 -u $USER -p xfer
    +
    + +

    Output:

    + +
    $ squeue -M merlin6 -u $USER -p xfer
    +CLUSTER: merlin6
    +             JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
    +          24688581      xfer HOME_MIG caubet_m PD       0:00      1 (Dependency)
    +          24688580      xfer DATA_MIG caubet_m  R       0:22      1 merlin-c-017
    +
    + +
    + +

    Phase 2: Migration Instructions

    + +

    Please refer to the Prerequisites and Preparation section for initial setup steps. +Further instructions will be sent via email once the owning team is contacted by the Merlin administrators.

    + +
    + +

    ⚠️ Common rsync/fpsync Migration Issues

    + +

    File Permission Denied

    + +
      +
    • Cause: Files or directories are not readable by the user running the transfer.
    • +
    • +

      Solution: Fix source-side permissions:

      + +
      chmod -R u+rX /path/to/file_or_dir
      +
      +
    • +
    + +

    Ownership Mismatches

    + +
      +
    • Cause: Source files are owned by another user (e.g. root or a collaborator).
    • +
    • +

      Solution:

      + +
        +
      • +

        Change ownership before migration:

        + +
        chown -R $USER /path/to/file
        +
        +
      • +
      +
    • +
    + +

    Special Files (e.g. device files, sockets)

    + +
      +
    • Cause: rsync tries to copy UNIX sockets, device files, or FIFOs.
    • +
    • Effect: Errors or incomplete copies.
    • +
    • Solution: Avoid transferring such files entirely (by deleting them).
    • +
    + +

    Exceeded Disk Quota

    + +
      +
    • Cause: Combined size of existing + incoming data exceeds 1 TB quota on Merlin7.
    • +
    • Effect: Transfer stops abruptly.
    • +
    • Solution: Clean up or archive non-essential data before migration.
    • +
    + +

    Very Small Files or Large Trees → Many Small rsync Calls

    + +
      +
    • Cause: Directory with thousands/millions of small files.
    • +
    • Effect: Transfer is slow or hits process limits.
    • +
    • +

      Solution: Consider archiving to .tar.gz before transferring:

      + +
      tar -czf myenv.tar.gz myenv/
      +
      +
    • +
    + +
    + +

    Need Help?

    + +

    If something doesn’t work:

    + +
      +
    • Re-run the scripts and check the logs carefully.
    • +
    • Use less, cat, or tail -f to view your job logs.
    • +
    • Contact the Merlin support team: 📧 merlin-admins@lists.psi.ch
    • +
    + +
    +

    We are here to help you migrate safely and efficiently.

    +
    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin7/nomachine.html b/merlin7/nomachine.html new file mode 100644 index 0000000..b25bff0 --- /dev/null +++ b/merlin7/nomachine.html @@ -0,0 +1,786 @@ + + + + + + + + +Remote Desktop Access to Merlin7 | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Remote Desktop Access to Merlin7

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    Overview

    + +

    Merlin7 NoMachine provides users with remote desktop access to the Merlin7 computing environment. This service enables users to connect to their computing resources from any location, whether they are inside the PSI network or accessing from outside via secure methods.

    + +

    Accessing Merlin7 NoMachine

    + +

    From Inside PSI

    + +

    If you are inside the PSI network, you can directly connect to the Merlin7 NoMachine service without the need to go through another service.

    + +
      +
    1. Ensure Network Connectivity: Make sure you are connected to the PSI internal network.
    2. +
    3. Choose Your Access Method: You can access Merlin7 using either a web browser or the NoMachine client.
    4. +
    + +

    Method 1: Using a Web Browser

    + +

    Open your web browser and navigate to https://merlin7-nx.psi.ch:4443.

    + +

    Method 2: Using the NoMachine Client

    + +

    Settings for the NoMachine client:

    + +
      +
    • Host: merlin7-nx.psi.ch
    • +
    • Port: 4000
    • +
    • Protocol: NX
    • +
    • Authentication: Use password authentication
    • +
    + +

    From Outside PSI

    + +

    Users outside the PSI network have two options for accessing the Merlin7 NoMachine service: through nx.psi.ch or via a VPN connection.

    + +

    Option 1: Via nx.psi.ch

    + +

    Documentation about the nx.psi.ch service can be found here.

    + +
    Using a Web Browser
    + +

    Open your web browser and navigate to https://nx.psi.ch.

    + +
    Using the NoMachine Client
    + +

    Settings for the NoMachine client:

    + +
      +
    • Host: nx.psi.ch
    • +
    • Port: 4000
    • +
    • Protocol: NX
    • +
    • Authentication: Use password authentication
    • +
    + +

    Option 2: Via VPN

    + +

    Alternatively, you can use a VPN connection to access Merlin7 as if you were inside the PSI network.

    + +
      +
    1. Request VPN Access: Contact the IT department to request VPN access if you do not already have it. Submit a request through the PSI Service Now ticketing system: VPN Access (PSI employees).
    2. +
    3. Connect to the VPN: Once access is granted, connect to the PSI VPN using your credentials.
    4. +
    5. Access Merlin7 NoMachine: Once connected to the VPN, you can access Merlin7 using either a web browser or the NoMachine client as if you were inside the PSI network.
    6. +
    + +

    The NoMachine Client

    + +

    Installation

    + +

    Windows

    + +

    The NoMachine client is available for PSI Windows computers in the Software Kiosk under the name NX Client.

    + +

    macOS and Linux

    + +

    The NoMachine client can be downloaded from NoMachine’s download page.

    + +

    Connection Configuration

    + +
      +
    1. Launch NoMachine Client: Open the NoMachine client on your computer.
    2. +
    3. Create a New Connection: Click the Add button to create a new connection. +
        +
      • On the Address tab configure: +
          +
        • Name: Enter a name for your connection. This can be anything.
        • +
        • Host: Enter the appropriate hostname (e.g. merlin7-nx.psi.ch).
        • +
        • Port: Enter 4000.
        • +
        • Protocol: Select NX.
        • +
        +
      • +
      + +

      Create New NoMachine Connection

      + +
        +
      • On the Configuration tab ensure: +
          +
        • Authentication: Select Use password authentication.
        • +
        +
      • +
      + +

      Create New NoMachine Connection

      + +
        +
      • Click the Add button to finish creating the new connection.
      • +
      +
    4. +
    + +

    Authenticating

    + +

    When prompted, use your PSI credentials to authenticate.

    + +

    Create New NoMachine Connection

    + +

    Managing Sessions

    + +

    The Merlin7 NoMachine service is managed through a front-end server and back-end nodes, facilitating balanced and efficient access to remote desktop sessions.

    + +

    Architecture Overview

    + +
      +
    • Front-End Server: merlin7-nx.psi.ch +
        +
      • Serves as the entry point for users connecting to the NoMachine service.
      • +
      • Handles load-balancing and directs users to available back-end nodes.
      • +
      +
    • +
    • Back-End Nodes: +
        +
      • login001.merlin7.psi.ch
      • +
      • login002.merlin7.psi.ch
      • +
      • These nodes host the NoMachine desktop service and manage the individual desktop sessions.
      • +
      +
    • +
    + +

    Access to the login node desktops must be initiated through the merlin7-nx.psi.ch front-end. The front-end service will distribute sessions across available nodes in the back-end, ensuring optimal resource usage.

    + +

    Opening NoMachine Desktop Sessions

    + +

    When connecting to the merlin7-nx.psi.ch front-end, a new session automatically opens if no existing session is found. Users can manage their sessions as follows:

    + +
      +
    • Reconnect to an Existing Session: If you have an active session, you can reconnect to it by selecting the appropriate icon in the NoMachine client interface. This allows you to resume work without losing any progress. +Open an existing Session
    • +
    • Create a Second Session: If you require a separate session, you can select the New Desktop button. This option creates a second session on another login node, provided the node is available and operational.
    • +
    + +

    Session Management Considerations

    + +
      +
    • Load Balancing: The front-end service ensures that sessions are evenly distributed across the available back-end nodes to optimize performance and resource utilization.
    • +
    • Session Limits: Users are limited to one session per back-end node to maintain system stability and efficiency.
    • +
    + +

    Support and Resources

    + +

    If you encounter any issues or need further assistance with the Merlin7 NoMachine service, support is available via email. Please contact us at merlin-admins@lists.psi.ch, and our support team will be happy to assist you.

    + +

    Advanced Display Settings

    + +

    NoMachine provides several options to optimize the display settings for better performance and clarity. These settings can be accessed and adjusted when creating a new session or by clicking the top right corner of a running session.

    + +

    Prevent Rescaling

    + +

    Preventing rescaling can help eliminate “blurriness” in your display, though it may affect performance. Adjust these settings based on your performance needs:

    + +
      +
    • Display: Choose Resize remote display (forces 1:1 pixel sizes)
    • +
    • Display > Change settings > Quality: Choose medium-best quality
    • +
    • Display > Change settings > Modify the advanced display settings +
        +
      • Check: Disable network-adaptive display quality (turns off lossy compression)
      • +
      • Check: Disable client side image post-processing
      • +
      +
    • +
    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin7/opal-x.html b/merlin7/opal-x.html new file mode 100644 index 0000000..62a2877 --- /dev/null +++ b/merlin7/opal-x.html @@ -0,0 +1,649 @@ + + + + + + + + +OPAL-X | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    OPAL-X

    +
    + + + +
    + + +
    OPAL (Object Oriented Particle Accelerator Library) is an open source C++ framework for general particle accelerator simulations including 3D space charge, short range wake fields and particle matter interaction.
    + + + + + + + +

    OPAL

    + +

    OPAL (Object Oriented Particle Accelerator Library) is an open source C++ framework for general particle accelerator simulations including 3D space charge, short range wake fields and particle matter interaction.

    + +

    Licensing Terms and Conditions

    + +

    GNU GPLv3

    + +

    How to run on Merlin7

    +

    A100 nodes

    +
    module purge
    +module use Spack unstable
    +module load gcc/13.2.0 openmpi/4.1.6-57rc-A100-gpu opal-x/fixSolverUnits-q4ul-A100-gpu
    +
    + +

    GH nodes

    +
    module purge
    +module use Spack unstable
    +module load gcc/13.2.0 openmpi/5.0.3-3lmi-GH200-gpu opal-x/fixSolverUnits-ttg7-GH200-gpu 
    +
    + +

    Developing your own code

    +

    A100 nodes

    + +

    Pipeline

    + +
    module purge
    +module use Spack unstable
    +module load gcc/13.2.0 openmpi/4.1.6-57rc-A100-gpu                 
    +module load boost/1.82.0-e7gp fftw/3.3.10 gnutls/3.8.3 googletest/1.14.0 gsl/2.8 h5hut/2.0.0rc7 openblas/0.3.26-omp cmake/3.31.6-oe7u
    +
    +git clone https://gitlab.psi.ch/OPAL/opal-x/src.git opal-x
    +cd opal-x
    +./gen_OPALrevision
    +
    +mkdir build_gpu
    +cd build_gpu
    +
    +cmake -DCMAKE_BUILD_TYPE=Release -DKokkos_ARCH_AMPERE80=ON -DCMAKE_CXX_STANDARD=20 -DIPPL_ENABLE_FFT=ON -DIPPL_ENABLE_TESTS=OFF -DIPPL_ENABLE_SOLVERS=ON -DIPPL_ENABLE_ALPINE=True -DIPPL_PLATFORMS=cuda ..
    +make [-jN]
    +
    + +

    GH nodes

    +

    Pipeline

    + +
    salloc --partition=gh-daily --clusters=gmerlin7 --time=08:00:00 --ntasks=4 --nodes=1 --gpus=1 --mem=40000 $SHELL
    +ssh <allocated_gpu>
    +
    +module purge
    +module use Spack unstable
    +module load gcc/13.2.0 openmpi/5.0.3-3lmi-GH200-gpu  
    +module load boost/1.82.0-3ns6 fftw/3.3.10 gnutls/3.8.3 googletest/1.14.0 gsl/2.7.1 h5hut/2.0.0rc7 openblas/0.3.26 cmake/3.31.4-u2nm  
    +
    +git clone https://gitlab.psi.ch/OPAL/opal-x/src.git opal-x
    +cd opal-x
    +./gen_OPALrevision
    +mkdir build_gh
    +cd build_gh
    +
    +cmake -DCMAKE_BUILD_TYPE=Release -DKokkos_ARCH_HOPPER90=ON -DCMAKE_CXX_STANDARD=20 -DIPPL_ENABLE_FFT=ON -DIPPL_ENABLE_TESTS=OFF -DIPPL_ENABLE_SOLVERS=ON -DIPPL_ENABLE_ALPINE=OFF -DIPPL_PLATFORMS=cuda ..
    +make [-jN]
    +
    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin7/openmpi.html b/merlin7/openmpi.html new file mode 100644 index 0000000..c668ec4 --- /dev/null +++ b/merlin7/openmpi.html @@ -0,0 +1,684 @@ + + + + + + + + +OpenMPI Support | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    OpenMPI Support

    +
    + + + +
    + + +
    This document describes how to use OpenMPI in the Merlin7 cluster
    + + + + + + + +
    + + + + + + +

    Introduction

    + +

    This document outlines the supported OpenMPI versions in the Merlin7 cluster.

    + +

    OpenMPI supported versionso

    + +

    The Merlin cluster supports OpenMPI versions across three distinct stages: stable, unstable, and deprecated. Below is an overview of each stage:

    + +

    Stable

    + +

    Versions in the stable stage are fully functional, thoroughly tested, and officially supported by the Merlin administrators. +These versions are available via Pmodules and Spack, ensuring compatibility and reliability for production use.

    + +

    Unstable

    + +

    Versions in the unstable stage are available for testing and early access to new OpenMPI features. +While these versions can be used, their compilation and configuration are subject to change before they are promoted to the stable stage. +Administrators recommend caution when relying on unstable versions for critical workloads.

    + +

    Deprecated

    + +

    Versions in the deprecated stage are no longer supported by the Merlin administrators. +Typically, these include versions no longer supported by the official OpenMPI project. +While deprecated versions may still be available for use, their functionality cannot be guaranteed, and they will not receive updates or bug fixes.

    + +

    Using srun in Merlin7

    + +

    In OpenMPI versions prior to 5.0.x, using srun for direct task launches was faster than mpirun. +Although this is no longer the case, srun remains the recommended method due to its simplicity and ease of use.

    + +

    Key benefits of srun:

    +
      +
    • Automatically handles task binding to cores.
    • +
    • In general, requires less configuration compared to mpirun.
    • +
    • Best suited for most users, while mpirun is recommended only for advanced MPI configurations.
    • +
    + +

    Guidelines:

    +
      +
    • Always adapt your scripts to use srun before seeking support.
    • +
    • For any module-related issues, please contact the Merlin7 administrators.
    • +
    + +

    Example Usage:

    +
    srun ./app
    +
    + + + +

    PMIx Support in Merlin7

    + +

    Merlin7’s SLURM installation includes support for multiple PMI types, including pmix. To view the available options, use the following command:

    + +
    🔥 [caubet_m@login001:~]# srun --mpi=list
    +MPI plugin types are...
    +        none
    +        pmix
    +        pmi2
    +        cray_shasta
    +specific pmix plugin versions available: pmix_v5,pmix_v4,pmix_v3,pmix_v2
    +
    +

    Important Notes:

    +
      +
    • For OpenMPI, always use pmix by specifying the appropriate version (pmix_$version). +When loading an OpenMPI module (via Pmodules or Spack), the corresponding PMIx version will be automatically loaded.
    • +
    • Users do not need to manually manage PMIx compatibility.
    • +
    + + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin7/pmodules.html b/merlin7/pmodules.html new file mode 100644 index 0000000..3cd85c4 --- /dev/null +++ b/merlin7/pmodules.html @@ -0,0 +1,763 @@ + + + + + + + + +PSI Modules | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    PSI Modules

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    PSI Environment Modules

    + +

    On top of the operating system stack we provide different software using the PSI developed PModule system.

    + +

    PModules is the official supported way and each package is deployed by a specific expert. Usually, in PModules +software which is used by many people will be found.

    + +

    If you miss any package/versions or a software with a specific missing feature, contact us. We will study if is feasible or not to install it.

    + +

    Module Release Stages

    + +

    To ensure proper software lifecycle management, PModules uses three release stages: unstable, stable, and deprecated.

    + +
      +
    1. Unstable Release Stage: +
        +
      • Contains experimental or under-development software versions.
      • +
      • Not visible to users by default. Use explicitly:
      • +
      + +
      module use unstable
      +
      +
        +
      • Software is promoted to stable after validation.
      • +
      +
    2. +
    3. Stable Release Stage: +
        +
      • Default stage, containing fully tested and supported software versions.
      • +
      • Recommended for all production workloads.
      • +
      +
    4. +
    5. Deprecated Release Stage: +
        +
      • Contains software versions that are outdated or discontinued.
      • +
      • These versions are hidden by default but can be explicitly accessed:
      • +
      + +
      module use deprecated
      +
      +
        +
      • Deprecated software can still be loaded directly without additional configuration to ensure user transparency.
      • +
      +
    6. +
    + +

    PModules commands

    + +

    Below is listed a summary of common module commands:

    + +
    module use                       # show all available PModule Software Groups as well as Release Stages
    +module avail                     # to see the list of available software packages provided via pmodules
    +module use unstable              # to get access to a set of packages not fully tested by the community
    +module load <package>/<version>  # to load specific software package with a specific version
    +module search <string>           # to search for a specific software package and its dependencies.
    +module list                      # to list which software is loaded in your environment
    +module purge                     # unload all loaded packages and cleanup the environment
    +
    + +

    Please refer to the external PSI Modules document for +detailed information about the module command.

    + +

    module use/unuse

    + +

    Without any parameter, use lists all available PModule Software Groups and Release Stages.

    + +
    module use
    +
    + +

    When followed by a parameter, use/unuse invokes/uninvokes a PModule Software Group or Release Stage.

    + +
    module use EM         # Invokes the 'EM' software group
    +module unuse EM       # Uninvokes the 'EM' software group
    +module use unstable   # Invokes the 'unstable' Release stable
    +module unuse unstable # Uninvokes the 'unstable' Release stable
    +
    + +

    module avail

    + +

    This option lists all available PModule Software Groups and their packages.

    + +

    Please run module avail --help for further listing options.

    + + + +

    This is used to search for software packages. By default, if no Release Stage or Software Group is specified +in the options of the module search command, it will search from the already invoked Software Groups and Release Stages. +Direct package dependencies will be also showed.

    + +
    🔥 [caubet_m@login001:~]# module search openmpi
    +
    +Module        Rel.stage  Group        Overlay      Requires
    +--------------------------------------------------------------------------------
    +openmpi/4.1.6 stable     Compiler     Alps         gcc/12.3.0
    +openmpi/4.1.6 stable     Compiler     Alps         gcc/13.3.0
    +openmpi/4.1.6 stable     Compiler     Alps         gcc/14.2.0
    +openmpi/4.1.6 stable     Compiler     Alps         intelcc/22.2
    +openmpi/5.0.5 stable     Compiler     Alps         gcc/8.5.0
    +openmpi/5.0.5 stable     Compiler     Alps         gcc/12.3.0
    +openmpi/5.0.5 stable     Compiler     Alps         gcc/14.2.0
    +openmpi/5.0.5 stable     Compiler     Alps         intelcc/22.2
    +
    + +

    Please run module search --help for further search options.

    + +

    module load/unload

    + +

    This loads/unloads specific software packages. Packages might have direct dependencies that need to be loaded first. Other dependencies +will be automatically loaded.

    + +

    In the example below, the openmpi/5.0.5 package will be loaded, however gcc/14.2.0 must be loaded as well as this is a strict dependency. Direct dependencies must be loaded in advance. Users can load multiple packages one by one or at once. This can be useful for instance when loading a package with direct dependencies.

    + +
    # Single line
    +module load gcc/14.2.0 openmpi/5.0.5
    +
    +# Multiple line
    +module load gcc/14.2.0
    +module load openmpi/5.0.5
    +
    + +

    module purge

    + +

    This command is an alternative to module unload, which can be used to unload all loaded module files.

    + +
    module purge
    +
    + +

    Requesting New PModules Packages

    + +

    The PModules system is designed to accommodate the diverse software needs of Merlin7 users. Below are guidelines for requesting new software or versions to be added to PModules.

    + +

    Requesting Missing Software

    + +

    If a specific software package is not available in PModules and there is interest from multiple users:

    +
      +
    • Contact Support: Let us know about the software, and we will assess its feasibility for deployment.
    • +
    • Deployment Timeline: Adding new software to PModules typically takes a few days, depending on complexity and compatibility.
    • +
    • User Involvement: If you are interested in maintaining the software package, please inform us. Collaborative maintenance helps +ensure timely updates and support.
    • +
    + +

    Requesting a Missing Version

    +

    If the currently available versions of a package do not meet your requirements:

    +
      +
    • New Versions: Requests for newer versions are generally supported, especially if there is interest from multiple users.
    • +
    • Intermediate Versions: Installation of intermediate versions (e.g., versions between the current stable and deprecated versions) +can be considered if there is a strong justification, such as specific features or compatibility requirements.
    • +
    + +

    General Notes

    +
      +
    • New packages or versions are prioritized based on their relevance and usage.
    • +
    • For any request, providing detailed information about the required software or version (e.g., name, version, features) will help +expedite the process.
    • +
    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin7/quantum-espresso.html b/merlin7/quantum-espresso.html new file mode 100644 index 0000000..a0289a4 --- /dev/null +++ b/merlin7/quantum-espresso.html @@ -0,0 +1,704 @@ + + + + + + + + +Quantum Espresso | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Quantum Espresso

    +
    + + + +
    + + +
    Quantum Espresso code for electronic-structure calculations and materials modeling at the nanoscale
    + + + + + + + +

    Quantum ESPRESSO

    + +

    Quantum ESPRESSO is an integrated suite of Open-Source computer codes for electronic-structure calculations and materials modeling at the nanoscale. It is based on density-functional theory, plane waves, and pseudopotentials:

    + +
    PWscf (Plane-Wave Self-Consistent Field)
    +FPMD (First Principles Molecular Dynamics)
    +CP (Car-Parrinello)
    +
    + +

    Licensing Terms and Conditions

    + +

    Quantum ESPRESSO is an open initiative, in collaboration with many groups world-wide, coordinated by the Quantum ESPRESSO Foundation. Scientific work done using Quantum ESPRESSO should contain an explicit acknowledgment and reference to the main papers (see Quantum Espresso Homepage for the details).

    + +

    How to run on Merlin7

    +

    A100 nodes

    +
    module purge
    +module use Spack unstable
    +module load nvhpc/25.3 openmpi/main-6bnq-A100-gpu quantum-espresso/7.4.1-nxsw-gpu-omp
    +
    +

    GH nodes

    +
    module purge
    +module use Spack unstable
    +module load nvhpc/25.3 openmpi/5.0.7-e3bf-GH200-gpu quantum-espresso/7.4.1-gxvj-gpu-omp
    +
    + +

    SBATCH A100, 1 GPU, 64 OpenMP threads, one MPI rank example

    +
    #!/bin/bash
    +#SBATCH --no-requeue
    +#SBATCH --job-name="si64"
    +#SBATCH --get-user-env
    +#SBATCH --output=_scheduler-stdout.txt
    +#SBATCH --error=_scheduler-stderr.txt
    +#SBATCH --partition=a100-daily
    +#SBATCH --nodes=1
    +#SBATCH --ntasks-per-node=1
    +#SBATCH --time=06:00:00
    +#SBATCH --cpus-per-task=64
    +#SBATCH --cluster=gmerlin7
    +#SBATCH --gpus=1
    +#SBATCH --hint=nomultithread
    +
    +export OMP_NUM_THREADS=$SLURM_CPUS_PER_TASK
    +export OMP_PROC_BIND=spread
    +export OMP_PLACES=threads
    +
    +# Load necessary modules
    +module purge
    +module use Spack unstable
    +module load nvhpc/25.3 openmpi/main-6bnq-A100-gpu quantum-espresso/7.4.1-nxsw-gpu-omp
    +
    +"srun" '$(which pw.x)' '-npool' '1' '-in' 'aiida.in'  > "aiida.out"
    +
    + +

    Developing your own GPU code

    +

    Spack

    +
      +
    1. spack config edit
    2. +
    3. Add granularity: microarchitectures to your config (if you use nvhpc compiler! Not needed for CPU builds!) +
      spack:
      +  concretizer:
      + unify: false
      + targets:
      +   granularity: microarchitectures
      +
      +
    4. +
    5. spack add quantum-espresso@develop +cuda +mpi +mpigpu hdf5=parallel %nvhpc arch=linux-sles15-zen3 # GPU
    6. +
    7. spack add quantum-espresso@develop +mpi hdf5=parallel %gcc # CPU
    8. +
    9. spack develop quantum-espresso@develop # clone the code under /afs/psi.ch/sys/spack/user/$USER/spack-environment/quantum-espresso
    10. +
    11. Make changes in /afs/psi.ch/sys/spack/user/$USER/spack-environment/quantum-espresso
    12. +
    13. Build: spack install [-jN] -v --until=build quantum-espresso@develop
    14. +
    + +

    Environment modules

    +

    CPU

    +

    Pipeline

    + +
    module purge
    +module use Spack unstable
    +module load gcc/12.3 openmpi/main-syah fftw/3.3.10.6-omp hdf5/1.14.5-t46c openblas/0.3.29-omp cmake/3.31.6-oe7u
    +
    +cd <path to QE source directory>
    +mkdir build
    +cd build
    +
    +cmake -DQE_ENABLE_MPI:BOOL=ON -DQE_ENABLE_OPENMP:BOOL=ON -DCMAKE_C_COMPILER:STRING=mpicc -DCMAKE_Fortran_COMPILER:STRING=mpif90 -DQE_ENABLE_HDF5:BOOL=ON ..
    +make [-jN]
    +
    +

    A100

    +

    Pipeline

    + +
    module purge
    +module use Spack unstable
    +module load nvhpc/25.3 openmpi/main-6bnq-A100-gpu fftw/3.3.10.6-qbxu-omp hdf5/develop-2.0-rjgu netlib-scalapack/2.2.2-3hgw cmake/3.31.6-oe7u
    +
    +cd <path to QE source directory>
    +mkdir build
    +cd build
    +
    +cmake -DQE_ENABLE_MPI:BOOL=ON -DQE_ENABLE_OPENMP:BOOL=ON -DQE_ENABLE_SCALAPACK:BOOL=ON -DQE_ENABLE_CUDA:BOOL=ON -DQE_ENABLE_MPI_GPU_AWARE:BOOL=ON -DQE_ENABLE_OPENACC:BOOL=ON -DCMAKE_C_COMPILER:STRING=mpicc -DCMAKE_Fortran_COMPILER:STRING=mpif90 -DQE_ENABLE_HDF5:BOOL=ON ..
    +make [-jN]
    +
    +
    +

    GH200

    +

    Pipeline

    + +
    module purge
    +module use Spack unstable
    +module load nvhpc/25.3 openmpi/5.0.7-e3bf-GH200-gpu fftw/3.3.10-sfpw-omp hdf5/develop-2.0-ztvo nvpl-blas/0.4.0.1-3zpg nvpl-lapack/0.3.0-ymy5  netlib-scalapack/2.2.2-qrhq cmake/3.31.6-5dl7
    +
    +
    +cd <path to QE source directory>
    +mkdir build
    +cd build
    +
    +cmake -DQE_ENABLE_MPI:BOOL=ON -DQE_ENABLE_OPENMP:BOOL=ON -DQE_ENABLE_SCALAPACK:BOOL=ON -DQE_ENABLE_CUDA:BOOL=ON -DQE_ENABLE_MPI_GPU_AWARE:BOOL=ON -DQE_ENABLE_OPENACC:BOOL=ON -DCMAKE_C_COMPILER:STRING=mpicc -DCMAKE_Fortran_COMPILER:STRING=mpif90 -DQE_ENABLE_HDF5:BOOL=ON ..
    +make [-jN]
    +
    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin7/request-account.html b/merlin7/request-account.html new file mode 100644 index 0000000..78d2176 --- /dev/null +++ b/merlin7/request-account.html @@ -0,0 +1,624 @@ + + + + + + + + +Requesting Merlin Accounts | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Requesting Merlin Accounts

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    Requesting Access to Merlin7

    + +

    All PSI users can ask for access to the Merlin7 cluster. Access to Merlin7 is regulated by the PSI user’s account being a member of the svc-cluster_merlin7 access group.

    + +

    Requesting Merlin7 access has to be done using the Request Linux Group Membership form, available in PSI’s central Service Catalog on Service Now.

    + +

    Example: Requesting access to Merlin7

    + +

    Mandatory fields you need to fill:

    +
      +
    • Order Access for user: Defaults to the logged in user. However, requesting access for another user it’s also possible.
    • +
    • Request membership for group: Choosesvc-cluster_merlin7.
    • +
    • Justification: Please add a short justification of what you will be running on Merlin7.
    • +
    + +

    Once submitted, the Merlin responsibles will approve the request as soon as possible (within the next few hours on working days). Once the request is approved, it may take up to 30 minutes to get the account fully configured.

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin7/request-project.html b/merlin7/request-project.html new file mode 100644 index 0000000..5159e61 --- /dev/null +++ b/merlin7/request-project.html @@ -0,0 +1,726 @@ + + + + + + + + +Requesting a Merlin Project | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Requesting a Merlin Project

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    A project owns its own storage area in Merlin, which can be accessed by other group members.

    + +

    Projects can receive a higher storage quota than user areas and should be the primary way of organizing bigger storage requirements +in a multi-user collaboration.

    + +

    Access to a project’s directories is governed by project members belonging to a common Unix group. You may use an existing +Unix group or you may have a new Unix group created especially for the project. The project responsible will be the owner of +the Unix group (this is important)!

    + +

    This document explains how to request new Unix group, to request membership for existing groups, and the procedure for requesting a Merlin project.

    + +

    About Unix groups

    + +

    Before requesting a Merlin project, it is important to have a Unix group that can be used to grant access to it to different members +of the project.

    + +

    Unix groups in the PSI Active Directory (which is the PSI central database containing user and group information, and more) are defined by the unx- prefix, followed by a name. +In general, PSI employees working on Linux systems (including HPC clusters, like Merlin) can request for a non-existing Unix group, and can become responsible for managing it. +In addition, a list of administrators can be set. The administrators, together with the group manager, can approve or deny membership requests. Further information about this topic +is covered in the Linux Documentation - Services Admin Guides: Unix Groups / Group Management, managed by the Central Linux Team.

    + +

    To gran access to specific Merlin project directories, some users may require to be added to some specific Unix groups:

    +
      +
    • Each Merlin project (i.e. /data/project/{bio|general}/$projectname) or experiment (i.e. /data/experiment/$experimentname) directory has access restricted by ownership and group membership (with a very few exceptions allowing public access).
    • +
    • Users requiring access to a specific restricted project or experiment directory have to request membership for the corresponding Unix group owning the directory.
    • +
    + +

    Requesting a new Unix group

    + +

    If you need a new Unix group to be created, you need to first get this group through a separate +PSI Service Now ticket. Please use the following template. +You can also specify the login names of the initial group members and the owner of the group. +The owner of the group is the person who will be allowed to modify the group.

    + +
      +
    • Please open an Incident Request with subject: +
       Subject: Request for new unix group xxxx
      +
      +
    • +
    • and base the text field of the request on this template +
       Dear HelpDesk
      +   
      + I would like to request a new unix group.
      +   
      + Unix Group Name: unx-xxxxx
      + Initial Group Members: xxxxx, yyyyy, zzzzz, ...
      + Group Owner: xxxxx
      + Group Administrators: aaaaa, bbbbb, ccccc, ....
      +
      + Best regards,
      +
      +
    • +
    + +

    Requesting Unix group membership

    + +

    Existing Merlin projects have already a Unix group assigned. To have access to a project, users must belong to the proper Unix group owning that project. +Supervisors should inform new users which extra groups are needed for their project(s). If this information is not known, one can check the permissions for that directory. In example:

    +
    (base)[caubet_m@merlin-l-001:/data/user/caubet_m]# ls -ltrhd /data/project/general/$projectname
    +(base)[caubet_m@merlin-l-001:/data/user/caubet_m]# ls -ltrhd /data/project/bio/$projectname
    +
    + +

    Requesting membership for a specific Unix group has to be done with the corresponding Request Linux Group Membership form, available in the PSI Service Now Service Catalog.

    + +

    Example: Requesting Unix Group membership

    + +

    Once submitted, the responsible of the Unix group has to approve the request.

    + +

    Important note: Requesting access to specific Unix Groups will require validation from the responsible of the Unix Group. If you ask for inclusion in many groups it may take longer, since the fulfillment of the request will depend on more people.

    + +

    Further information can be found in the Linux Documentation - Services User guide: Unix Groups / Group Management

    + +

    Managing Unix Groups

    + +

    Other administration operations on Unix Groups it’s mainly covered in the Linux Documentation - Services Admin Guides: Unix Groups / Group Management, managed by the Central Linux Team.

    + +

    Requesting a Merlin project

    + +

    Once a Unix group is available, a Merlin project can be requested. +To request a project, please provide the following information in a PSI Service Now ticket

    + +
      +
    • Please open an Incident Request with subject: +
       Subject: [Merlin7] Project Request for project name xxxxxx
      +
      +
    • +
    • and base the text field of the request on this template +
       Dear HelpDesk
      +   
      + I would like to request a new Merlin7 project.
      +   
      + Project Name: xxxxx
      + UnixGroup: xxxxx    # Must be an existing Unix Group
      +
      + The project responsible is the Owner of the Unix Group.
      + If you need a storage quota exceeding the defaults, please provide a description
      + and motivation for the higher storage needs:
      +   
      + Storage Quota: 1TB with a maximum of 1M Files
      + Reason: (None for default 1TB/1M)
      +
      + Best regards,
      +
      +
    • +
    + +

    The default storage quota for a project is 1TB (with a maximal Number of Files of 1M). If you need a larger assignment, you +need to request this and provide a description of your storage needs.

    + +

    Further documentation

    + +

    Further information it’s also available in the Linux Central Documentation:

    + + +

    Special thanks to the Linux Central Team and AIT to make this possible.

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin7/slurm-access.html b/merlin7/slurm-access.html new file mode 100644 index 0000000..5b14a8d --- /dev/null +++ b/merlin7/slurm-access.html @@ -0,0 +1,642 @@ + + + + + + + + +Accessing Slurm Cluster | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Accessing Slurm Cluster

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    The Merlin Slurm clusters

    + +

    Merlin contains a multi-cluster setup, where multiple Slurm clusters coexist under the same umbrella. +It basically contains the following clusters:

    + +
      +
    • The Merlin7 Slurm CPU cluster, which is called merlin7.
    • +
    • The Merlin7 Slurm GPU cluster, which is called gmerlin7.
    • +
    + +

    Accessing the Slurm clusters

    + +

    Any job submission must be performed from a Merlin login node. Please refer to the Accessing the Interactive Nodes documentation +for further information about how to access the cluster.

    + +

    In addition, any job must be submitted from a high performance storage area visible by the login nodes and by the computing nodes. For this, the possible storage areas are the following:

    +
      +
    • /data/user
    • +
    • /data/project
    • +
    • /data/scratch/shared
    • +
    + +

    Merlin7 CPU cluster access

    + +

    The Merlin7 CPU cluster (merlin7) is the default cluster configured in the login nodes. Any job submission will use by default this cluster, unless +the option --cluster is specified with another of the existing clusters.

    + +

    For further information about how to use this cluster, please visit: Merlin7 CPU Slurm Cluster documentation.

    + +

    Merlin7 GPU cluster access

    + +

    The Merlin7 GPU cluster (gmerlin7) is visible from the login nodes. However, to submit jobs to this cluster, one needs to specify the option --cluster=gmerlin7 when submitting a job or allocation.

    + +

    For further information about how to use this cluster, please visit: Merlin7 GPU Slurm Cluster documentation.

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin7/slurm-configuration.html b/merlin7/slurm-configuration.html new file mode 100644 index 0000000..f3914eb --- /dev/null +++ b/merlin7/slurm-configuration.html @@ -0,0 +1,1481 @@ + + + + + + + + +Slurm merlin7 Configuration | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Slurm merlin7 Configuration

    +
    + + + +
    + + +
    This document describes a summary of the Merlin7 Slurm CPU-based configuration.
    + + + + + + + +
    + + + + + + +

    This documentation shows basic Slurm configuration and options needed to run jobs in the Merlin7 cluster.

    + +

    Public partitions configuration summary

    + +

    CPU public partitions

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PartitionNameDefaultTimeMaxTimePriorityAccountPer Job LimitsPer User Limits
    general1-00:00:007-00:00:00Lowmerlincpu=1024,mem=1920Gcpu=1024,mem=1920G
    daily0-01:00:001-00:00:00Mediummerlincpu=1024,mem=1920Gcpu=2048,mem=3840G
    hourly0-00:30:000-01:00:00Highmerlincpu=2048,mem=3840Gcpu=8192,mem=15T
    + +

    GPU public partitions

    + +

    A100 nodes

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PartitionNameDefaultTimeMaxTimePriorityAccountPer Job LimitsPer User Limits
    a100-general1-00:00:007-00:00:00Lowmerlingres/gpu=4gres/gpu=8
    a100-daily0-01:00:001-00:00:00Mediummerlingres/gpu=8gres/gpu=8
    a100-hourly0-00:30:000-01:00:00Highmerlingres/gpu=8gres/gpu=8
    a100-interactive0-01:00:000-12:00:00Very Highmerlincpu=16,gres/gpu=1,mem=60G,node=1cpu=16,gres/gpu=1,mem=60G,node=1
    + +

    Grace-Hopper nodes

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PartitionNameDefaultTimeMaxTimePriorityAccountPer Job LimitsPer User Limits
    gh-general1-00:00:007-00:00:00Lowmerlingres/gpu=4gres/gpu=8
    gh-daily0-01:00:001-00:00:00Mediummerlingres/gpu=8gres/gpu=8
    gh-hourly0-00:30:000-01:00:00Highmerlingres/gpu=8gres/gpu=8
    gh-interactive0-01:00:000-12:00:00Very Highmerlincpu=16,gres/gpu=1,mem=46G,node=1cpu=16,gres/gpu=1,mem=46G,node=1
    + +

    CPU cluster: merlin7

    + +

    By default, jobs will be submitted to merlin7, as it is the primary cluster configured on the login nodes. +Specifying the cluster name is typically unnecessary unless you have defined environment variables that could override the default cluster name. +However, when necessary, one can specify the cluster as follows:

    +
    #SBATCH --cluster=merlin7
    +
    + +

    CPU general configuration

    + +

    The Merlin7 CPU cluster is configured with the CR_CORE_MEMORY and CR_ONE_TASK_PER_CORE options.

    +
      +
    • This configuration treats both cores and memory as consumable resources.
    • +
    • Since the nodes are running with hyper-threading enabled, each core thread is counted as a CPU +to fulfill a job’s resource requirements.
    • +
    + +

    By default, Slurm will allocate one task per core, which means:

    +
      +
    • Each task will consume 2 CPUs, regardless of whether both threads are actively used by the job.
    • +
    + +

    This behavior ensures consistent resource allocation but may result in underutilization of hyper-threading in some cases.

    + +

    CPU nodes definition

    + +

    The table below provides an overview of the Slurm configuration for the different node types in the Merlin7 cluster. +This information is essential for understanding how resources are allocated, enabling users to tailor their submission +scripts accordingly.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NodesSocketsCoresPerSocketCoresThreadsPerCoreCPUsMaxMemPerNodeDefMemPerCPUFeatures
    login[001-002]2641282256480G1920MAMD_EPYC_7713
    cn[001-077]2641282256480G1920MAMD_EPYC_7713
    + +

    Notes on memory configuration:

    +
      +
    • Memory allocation options: To request additional memory, use the following options in your submission script: +
        +
      • --mem=<mem_in_MB>: Allocates memory per node.
      • +
      • --mem-per-cpu=<mem_in_MB>: Allocates memory per CPU (equivalent to a core thread).
      • +
      + +

      The total memory requested cannot exceed the MaxMemPerNode value.

      +
    • +
    • +

      Impact of disabling Hyper-Threading: Using the --hint=nomultithread option disables one thread per core, +effectively halving the number of available CPUs. Consequently, memory allocation will also be halved unless explicitly +adjusted.

      + +

      For MPI-based jobs, where performance generally improves with single-threaded CPUs, this option is recommended. +In such cases, you should double the --mem-per-cpu value to account for the reduced number of threads.

      +
    • +
    + + + +

    User and job limits with QoS

    + +

    In the merlin7 CPU cluster, we enforce certain limits on jobs and users to ensure fair resource usage and prevent +overuse by a single user or job. These limits aim to balance resource availability while maintaining overall cluster +efficiency. However, applying limits can occasionally impact the cluster’s utilization. For example, user-specific +limits may result in pending jobs even when many nodes are idle due to low activity.

    + +

    On the other hand, these limits also enhance cluster efficiency by preventing scenarios such as a single job monopolizing +all available resources, which could block other jobs from running. Without job size limits, for instance, a large job +might drain the entire cluster to satisfy its resource request, a situation that is generally undesirable.

    + +

    Thus, setting appropriate limits is essential to maintain fair resource usage while optimizing cluster efficiency. These +limits should allow for a mix of jobs of varying sizes and types, including single-core and parallel jobs, to coexist +effectively.

    + +

    To implement these limits, we utilize Quality of Service (QoS). Different QoS policies are defined and applied +to specific partitions in line with the established resource allocation policies. The table below outlines the +various QoS definitions applicable to the merlin7 CPU-based cluster. Here:

    +
      +
    • MaxTRES specifies resource limits per job.
    • +
    • MaxTRESPU specifies resource limits per user.
    • +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameMaxTRESMaxTRESPUScope
    normal  partition
    cpu_generalcpu=1024,mem=1920Gcpu=1024,mem=1920Guser, partition
    cpu_dailycpu=1024,mem=1920Gcpu=2048,mem=3840Gpartition
    cpu_hourlycpu=2048,mem=3840Gcpu=8192,mem=15Tpartition
    + +

    Where:

    +
      +
    • normal QoS: This QoS has no limits and is typically applied to partitions that do not require user or job +restrictions.
    • +
    • cpu_general QoS: This is the default QoS for merlin7 users. It limits the total resources available to each +user. Additionally, this QoS is applied to the general partition, enforcing restrictions at the partition level and +overriding user-level QoS.
    • +
    • cpu_daily QoS: Guarantees increased resources for the daily partition, accommodating shorter-duration jobs +with higher resource needs.
    • +
    • cpu_hourly QoS: Offers the least constraints, allowing more resources to be used for the hourly partition, +which caters to very short-duration jobs.
    • +
    + +

    For additional details, refer to the CPU partitions section.

    + + + +

    CPU partitions

    + +

    This section provides a summary of the partitions available in the merlin7 CPU cluster.

    + +

    Key concepts:

    +
      +
    • PriorityJobFactor: This value is added to a job’s priority (visible in the PARTITION column of the sprio -l command). +Jobs submitted to partitions with higher PriorityJobFactor values generally run sooner. However, other factors like job age +and especially fair share can also influence scheduling.
    • +
    • PriorityTier: Jobs submitted to partitions with higher PriorityTier values take precedence over pending jobs in partitions +with lower PriorityTier values. Additionally, jobs from higher PriorityTier partitions can preempt running jobs in lower-tier +partitions, where applicable.
    • +
    • QoS: Specifies the quality of service associated with a partition. It is used to control and restrict resource availability +for specific partitions, ensuring that resource allocation aligns with intended usage policies. Detailed explanations of the various +QoS settings can be found in the User and job limits with QoS section.
    • +
    + + + +

    CPU public partitions

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PartitionNameDefaultTimeMaxTimeTotalNodesPriorityJobFactorPriorityTierQoSAllowAccounts
    general1-00:00:007-00:00:005011cpu_generalmerlin
    daily0-01:00:001-00:00:00625001cpu_dailymerlin
    hourly0-00:30:000-01:00:007710001cpu_hourlymerlin
    + +

    All Merlin users are part of the merlin account, which is used as the default account when submitting jobs. +Similarly, if no partition is specified, jobs are automatically submitted to the general partition by default.

    + + + +

    The hourly partition may include private nodes as an additional buffer. However, the current Slurm partition configuration, governed +by PriorityTier, ensures that jobs submitted to private partitions are prioritized and processed first. As a result, access to the +hourly partition might experience delays in such scenarios.

    + +

    CPU private partitions

    + +
    CAS / ASA
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PartitionNameDefaultTimeMaxTimeTotalNodesPriorityJobFactorPriorityTierQoSAllowAccounts
    asa0-01:00:0014-00:00:001012normalasa
    + +
    CNM / Mu3e
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PartitionNameDefaultTimeMaxTimeTotalNodesPriorityJobFactorPriorityTierQoSAllowAccounts
    mu3e1-00:00:007-00:00:00412normalmu3e, meg
    + +
    CNM / MeG
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PartitionNameDefaultTimeMaxTimeTotalNodesPriorityJobFactorPriorityTierQoSAllowAccounts
    meg-short0-01:00:000-01:00:00unlimited10002normalmeg
    meg-long1-00:00:005-00:00:00unlimited12normalmeg
    meg-prod1-00:00:005-00:00:00unlimited10004normalmeg
    + +

    GPU cluster: gmerlin7

    + +

    As mentioned in previous sections, by default, jobs will be submitted to merlin7, as it is the primary cluster configured on the login nodes. +For submittng jobs to the GPU cluster, the cluster name gmerlin7 must be specified, as follows:

    +
    #SBATCH --cluster=gmerlin7
    +
    + +

    GPU general configuration

    + +

    The Merlin7 GPU cluster is configured with the CR_CORE_MEMORY, CR_ONE_TASK_PER_CORE, and ENFORCE_BINDING_GRES options.

    +
      +
    • This configuration treats both cores and memory as consumable resources.
    • +
    • Since the nodes are running with hyper-threading enabled, each core thread is counted as a CPU +to fulfill a job’s resource requirements.
    • +
    • Slurm will allocate the CPUs to the selected GPU.
    • +
    + +

    By default, Slurm will allocate one task per core, which means:

    +
      +
    • For hyper-threaded nodes (NVIDIA A100-based nodes), each task will consume 2 CPUs, regardless of whether both threads are actively used by the job.
    • +
    • For the NVIDIA GraceHopper-based nodes, each task will consume 1 CPU.
    • +
    + +

    This behavior ensures consistent resource allocation but may result in underutilization of hyper-threading in some cases.

    + +

    GPU nodes definition

    + +

    The table below provides an overview of the Slurm configuration for the different node types in the Merlin7 cluster. +This information is essential for understanding how resources are allocated, enabling users to tailor their submission +scripts accordingly.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NodesSocketsCoresPerSocketCoresThreadsPerCoreCPUsMaxMemPerNodeDefMemPerCPUGresFeatures
    gpu[001-007]4722881288828G2944Mgpu:gh200:4AMD_EPYC_7713, NV_A100
    gpu[101-105]164642128480G3840Mgpu:nvidia_a100-sxm4-80gb:4GH200, NV_H100
    + +

    Notes on memory configuration:

    +
      +
    • Memory allocation options: To request additional memory, use the following options in your submission script: +
        +
      • --mem=<mem_in_MB>: Allocates memory per node.
      • +
      • --mem-per-cpu=<mem_in_MB>: Allocates memory per CPU (equivalent to a core thread).
      • +
      + +

      The total memory requested cannot exceed the MaxMemPerNode value.

      +
    • +
    • +

      Impact of disabling Hyper-Threading: Using the --hint=nomultithread option disables one thread per core, +effectively halving the number of available CPUs. Consequently, memory allocation will also be halved unless explicitly +adjusted.

      + +

      For MPI-based jobs, where performance generally improves with single-threaded CPUs, this option is recommended. +In such cases, you should double the --mem-per-cpu value to account for the reduced number of threads.

      +
    • +
    + + + +

    User and job limits with QoS

    + +

    In the gmerlin7 CPU cluster, we enforce certain limits on jobs and users to ensure fair resource usage and prevent +overuse by a single user or job. These limits aim to balance resource availability while maintaining overall cluster +efficiency. However, applying limits can occasionally impact the cluster’s utilization. For example, user-specific +limits may result in pending jobs even when many nodes are idle due to low activity.

    + +

    On the other hand, these limits also enhance cluster efficiency by preventing scenarios such as a single job monopolizing +all available resources, which could block other jobs from running. Without job size limits, for instance, a large job +might drain the entire cluster to satisfy its resource request, a situation that is generally undesirable.

    + +

    Thus, setting appropriate limits is essential to maintain fair resource usage while optimizing cluster efficiency. These +limits should allow for a mix of jobs of varying sizes and types, including single-core and parallel jobs, to coexist +effectively.

    + +

    To implement these limits, we utilize Quality of Service (QoS). Different QoS policies are defined and applied +to specific partitions in line with the established resource allocation policies. The table below outlines the +various QoS definitions applicable to the merlin7 CPU-based cluster. Here:

    +
      +
    • MaxTRES specifies resource limits per job.
    • +
    • MaxTRESPU specifies resource limits per user.
    • +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameMaxTRESMaxTRESPUScope
    normal  partition
    gpu_generalgres/gpu=4gres/gpu=8user, partition
    gpu_dailygres/gpu=8gres/gpu=8partition
    gpu_hourlygres/gpu=8gres/gpu=8partition
    gpu_gh_interactivecpu=16,gres/gpu=1,mem=46G,node=1cpu=16,gres/gpu=1,mem=46G,node=1partition
    gpu_a100_interactivecpu=16,gres/gpu=1,mem=60G,node=1cpu=16,gres/gpu=1,mem=60G,node=1partition
    + +

    Where:

    +
      +
    • normal QoS: This QoS has no limits and is typically applied to partitions that do not require user or job +restrictions.
    • +
    • gpu_general QoS: This is the default QoS for gmerlin7 users. It limits the total resources available to each +user. Additionally, this QoS is applied to the [a100|gh]-general partitions, enforcing restrictions at the partition level and +overriding user-level QoS.
    • +
    • gpu_daily QoS: Guarantees increased resources for the [a100|gh]-daily partitions, accommodating shorter-duration jobs +with higher resource needs.
    • +
    • gpu_hourly QoS: Offers the least constraints, allowing more resources to be used for the [a100|gh]-hourly partitions, +which caters to very short-duration jobs.
    • +
    • gpu_a100_interactive & gpu_gh_interactive QoS: Guarantee interactive access to GPU nodes for software compilation and +small testing.
    • +
    + +

    For additional details, refer to the GPU partitions section.

    + + + +

    GPU partitions

    + +

    This section provides a summary of the partitions available in the merlin7 CPU cluster.

    + +

    Key concepts:

    +
      +
    • PriorityJobFactor: This value is added to a job’s priority (visible in the PARTITION column of the sprio -l command). +Jobs submitted to partitions with higher PriorityJobFactor values generally run sooner. However, other factors like job age +and especially fair share can also influence scheduling.
    • +
    • PriorityTier: Jobs submitted to partitions with higher PriorityTier values take precedence over pending jobs in partitions +with lower PriorityTier values. Additionally, jobs from higher PriorityTier partitions can preempt running jobs in lower-tier +partitions, where applicable.
    • +
    • QoS: Specifies the quality of service associated with a partition. It is used to control and restrict resource availability +for specific partitions, ensuring that resource allocation aligns with intended usage policies. Detailed explanations of the various +QoS settings can be found in the User and job limits with QoS section.
    • +
    + + + +

    A100-based partitions

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PartitionNameDefaultTimeMaxTimeTotalNodesPriorityJobFactorPriorityTierQoSAllowAccounts
    a100-general1-00:00:007-00:00:00311gpu_generalmerlin
    a100-daily0-01:00:001-00:00:0045001gpu_dailymerlin
    a100-hourly0-00:30:000-01:00:00510001gpu_hourlymerlin
    a100-interactive0-01:00:000-12:00:00512gpu_a100_interactivemerlin
    + +

    All Merlin users are part of the merlin account, which is used as the default account when submitting jobs. +Similarly, if no partition is specified, jobs are automatically submitted to the general partition by default.

    + + + +

    GH-based partitions

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PartitionNameDefaultTimeMaxTimeTotalNodesPriorityJobFactorPriorityTierQoSAllowAccounts
    gh-general1-00:00:007-00:00:00511gpu_generalmerlin
    gh-daily0-01:00:001-00:00:0065001gpu_dailymerlin
    gh-hourly0-00:30:000-01:00:00710001gpu_hourlymerlin
    gh-interactive0-01:00:000-12:00:00712gpu_gh_interactivemerlin
    + +

    All Merlin users are part of the merlin account, which is used as the default account when submitting jobs. +Similarly, if no partition is specified, jobs are automatically submitted to the general partition by default.

    + + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin7/slurm-examples.html b/merlin7/slurm-examples.html new file mode 100644 index 0000000..12d4d84 --- /dev/null +++ b/merlin7/slurm-examples.html @@ -0,0 +1,672 @@ + + + + + + + + +Slurm Examples | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Slurm Examples

    +
    + + + +
    + + +
    This document shows different template examples for running jobs in the Merlin cluster.
    + + + + + + + +
    + + + + + + +

    Work In Progress

    + + + +

    Single core based job examples

    + +
    #!/bin/bash
    +#SBATCH --partition=hourly      # Using 'hourly' will grant higher priority
    +#SBATCH --ntasks-per-core=2     # Request the max ntasks be invoked on each core
    +#SBATCH --hint=multithread      # Use extra threads with in-core multi-threading
    +#SBATCH --time=00:30:00         # Define max time job will run
    +#SBATCH --output=myscript.out   # Define your output file
    +#SBATCH --error=myscript.err    # Define your error file
    +
    +module purge
    +module load $MODULE_NAME # where $MODULE_NAME is a software in PModules
    +srun $MYEXEC             # where $MYEXEC is a path to your binary file
    +
    + +

    Multi-core based jobs example

    + +

    Pure MPI

    + +
    #!/bin/bash
    +#SBATCH --job-name=purempi
    +#SBATCH --partition=daily      # Using 'daily' will grant higher priority
    +#SBATCH --time=24:00:00        # Define max time job will run
    +#SBATCH --output=%x-%j.out     # Define your output file
    +#SBATCH --error=%x-%j.err      # Define your error file
    +#SBATCH --exclusive
    +#SBATCH --nodes=1
    +#SBATCH --ntasks=128
    +#SBATCH --hint=nomultithread
    +##SBATCH --cpus-per-task=1
    +
    +module purge
    +module load $MODULE_NAME # where $MODULE_NAME is a software in PModules
    +srun $MYEXEC             # where $MYEXEC is a path to your binary file
    +
    + +

    Hybrid

    + +
    #!/bin/bash
    +#SBATCH --job-name=hybrid
    +#SBATCH --partition=daily      # Using 'daily' will grant higher priority
    +#SBATCH --time=24:00:00        # Define max time job will run
    +#SBATCH --output=%x-%j.out     # Define your output file
    +#SBATCH --error=%x-%j.err      # Define your error file
    +#SBATCH --exclusive
    +#SBATCH --nodes=1
    +#SBATCH --ntasks=128
    +#SBATCH --hint=multithread
    +#SBATCH --cpus-per-task=2
    +
    +module purge
    +module load $MODULE_NAME # where $MODULE_NAME is a software in PModules
    +srun $MYEXEC             # where $MYEXEC is a path to your binary file
    +
    + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin7/software-repositories.html b/merlin7/software-repositories.html new file mode 100644 index 0000000..3eb73be --- /dev/null +++ b/merlin7/software-repositories.html @@ -0,0 +1,654 @@ + + + + + + + + +Software repositories | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Software repositories

    +
    + + + +
    + + +
    This page contains information about the different software repositories
    + + + + + + + +
    + + + + + + +

    Module Systems in Merlin7

    + +

    Merlin7 provides a modular environment to ensure flexibility, compatibility, and optimized performance. +The system supports three primary module types: PSI Environment Modules (PModules), Spack Modules, and Cray Environment Modules.

    + +

    PSI Environment Modules (PModules)

    + +

    The PModules system, developed by PSI, is the officially supported module system on Merlin7. It is the preferred choice for accessing validated software across a wide range of applications.

    + +

    Key Features:

    +
      +
    • Expert Deployment: Each package is deployed and maintained by specific experts to ensure reliability and compatibility.
    • +
    • Broad Availability: Commonly used software, such as OpenMPI, ANSYS, MATLAB, and other, is provided within PModules.
    • +
    • Custom Requests: If a package, version, or feature is missing, users can contact the support team to explore feasibility for installation.
    • +
    + + + +

    Spack Modules

    + +

    Merlin7 also provides Spack modules, offering a modern and flexible package management system. Spack supports a wide variety of software packages and versions. For more information, refer to the external PSI Spack documentation.

    + + + +

    Cray Environment Modules

    + +

    Merlin7 also supports Cray Environment Modules, which include compilers, MPI implementations, and libraries optimized +for Cray systems. However, Cray modules are not recommended as the default choice due to potential backward compatibility +issues when the Cray Programming Environment (CPE) is upgraded to a newer version.

    + +

    Recommendations:

    +
      +
    • Compiling Software: Cray modules can be used when optimization for Cray hardware is essential.
    • +
    • General Use: For most applications, prefer PModules, which ensure stability, backward compatibility, and long-term support.
    • +
    + + + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin7/spack.html b/merlin7/spack.html new file mode 100644 index 0000000..f3af225 --- /dev/null +++ b/merlin7/spack.html @@ -0,0 +1,596 @@ + + + + + + + + +Spack | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Spack

    +
    + + + +
    + + +
    Spack the HPC package manager documentation
    + + + + + + + +

    For Merlin7 the package manager for supercomputing Spack is available. It is meant to compliment the existing PModules +solution, giving users the opertunity to manage their own software environments.

    + +

    Documentation for how to use Spack on Merlin7 is provided here.

    + +

    The Spack PSI packages

    + +

    An initial collection of packages (and Spack reciepes) are located at Spack PSI, users can directly use these +through calls like spack add ....

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin7/ssh-keys.html b/merlin7/ssh-keys.html new file mode 100644 index 0000000..a6c87fa --- /dev/null +++ b/merlin7/ssh-keys.html @@ -0,0 +1,799 @@ + + + + + + + + +Configuring SSH Keys in Merlin | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Configuring SSH Keys in Merlin

    +
    + + + +
    + + +
    This document describes how to deploy SSH Keys in Merlin.
    + + + + + + + +
    + + + + + + +

    Merlin users sometimes will need to access the different Merlin services without being constantly requested by a password. +One can achieve that with Kerberos authentication, however in some cases some software would require the setup of SSH Keys. +One example is ANSYS Fluent, which, when used interactively, the way of communication between the GUI and the different nodes +is through the SSH protocol, and the use of SSH Keys is enforced.

    + +

    Setting up SSH Keys on Merlin

    + +

    For security reason, users must always protect SSH Keys with a passphrase.

    + +

    User can check whether a SSH key already exists. These would be placed in the ~/.ssh/ directory. RSA encryption +is usually the default one, and files in there would be id_rsa (private key) and id_rsa.pub (public key).

    + +
    ls ~/.ssh/id*   
    +
    + +

    For creating SSH RSA Keys, one should:

    + +
      +
    1. Run ssh-keygen, a password will be requested twice. You must remember this password for the future. +
        +
      • Due to security reasons, always try protecting it with a password. There is only one exception, when running ANSYS software, which in general should not use password to simplify the way of running the software in Slurm.
      • +
      • This will generate a private key id_rsa, and a public key id_rsa.pub in your ~/.ssh directory.
      • +
      +
    2. +
    3. +

      Add your public key to the authorized_keys file, and ensure proper permissions for that file, as follows:

      + +
      cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
      +chmod 0600 ~/.ssh/authorized_keys
      +
      +
    4. +
    5. +

      Configure the SSH client in order to force the usage of the psi.ch domain for trusting keys:

      + +
      echo "CanonicalizeHostname yes" >> ~/.ssh/config
      +
      +
    6. +
    7. +

      Configure further SSH options as follows:

      + +
      echo "AddKeysToAgent yes" >> ~/.ssh/config
      +echo "ForwardAgent yes" >> ~/.ssh/config
      +
      + +

      Other options may be added.

      +
    8. +
    9. +

      Check that your SSH config file contains at least the lines mentioned in steps 3 and 4:

      + +
      # cat ~/.ssh/config
      +CanonicalizeHostname yes
      +AddKeysToAgent yes
      +ForwardAgent yes
      +
      +
    10. +
    + +

    Using the SSH Keys

    + +

    Using Authentication Agent in SSH session

    + +

    By default, when accessing the login node via SSH (with ForwardAgent=yes), it will automatically add your +SSH Keys to the authentication agent. Hence, no actions should not be needed by the user. One can configure +ForwardAgent=yes as follows:

    + +
      +
    • +

      (Recommended) In your local Linux (workstation, laptop or desktop) add the following line in the +$HOME/.ssh/config (or alternatively in /etc/ssh/ssh_config) file:

      + +
      ForwardAgent yes
      +
      +
    • +
    • +

      Alternatively, on each SSH you can add the option ForwardAgent=yes in the SSH command. In example:

      + +
      ssh -XY -o ForwardAgent=yes login001.merlin7.psi.ch
      +
      +
    • +
    + +

    If ForwardAgent is not enabled as shown above, one needs to run the authentication agent and then add your key +to the ssh-agent. This must be done once per SSH session, as follows:

    + +
      +
    • Run eval $(ssh-agent -s) to run the ssh-agent in that SSH session
    • +
    • +

      Check whether the authentication agent has your key already added:

      + +
      ssh-add -l | grep "/data/user/$(whoami)/.ssh"
      +
      +
    • +
    • +

      If no key is returned in the previous step, you have to add the private key identity to the authentication agent. +You will be requested for the passphrase of your key, and it can be done by running:

      + +
      ssh-add
      +
      +
    • +
    + +

    Using Authentication Agent in NoMachine Session

    + +

    By default, when using a NoMachine session, the ssh-agent should be automatically started. Hence, there is no need of +starting the agent or forwarding it.

    + +

    However, for NoMachine one always need to add the private key identity to the authentication agent. This can be done as follows:

    + +
      +
    1. +

      Check whether the authentication agent has already the key added:

      + +
      ssh-add -l | grep "/data/user/$(whoami)/.ssh"
      +
      +
    2. +
    3. +

      If no key is returned in the previous step, you have to add the private key identity to the authentication agent. +You will be requested for the passphrase of your key, and it can be done by running:

      + +
      ssh-add
      +
      +
    4. +
    + +

    You just need to run it once per NoMachine session, and it would apply to all terminal windows within that NoMachine session.

    + +

    Troubleshooting

    + +

    Errors when running ‘ssh-add’

    + +

    If the error Could not open a connection to your authentication agent. appears when running ssh-add, it means +that the authentication agent is not running. Please follow the previous procedures for starting it.

    + +

    Add/Update SSH RSA Key password

    + +

    If an existing SSH Key does not have password, or you want to update an existing password with a new one, you can do it as follows:

    + +
    ssh-keygen -p -f ~/.ssh/id_rsa
    +
    + +

    SSH Keys deployed but not working

    + +

    Please ensure proper permissions of the involved files, as well as any typos in the file names involved:

    + +
    chmod u+rwx,go-rwx,g+s ~/.ssh
    +chmod u+rw-x,go-rwx    ~/.ssh/authorized_keys
    +chmod u+rw-x,go-rwx    ~/.ssh/id_rsa
    +chmod u+rw-x,go+r-wx   ~/.ssh/id_rsa.pub
    +
    + +

    Testing SSH Keys

    + +

    Once SSH Key is created, for testing that the SSH Key is valid, one can do the following:

    + +
      +
    1. +

      Create a new SSH session in one of the login nodes:

      + +
      ssh login001
      +
      +
    2. +
    3. +

      In the login node session, destroy any existing Kerberos ticket or active SSH Key:

      + +
      kdestroy
      +ssh-add -D
      +
      +
    4. +
    5. +

      Add the new private key identity to the authentication agent. You will be requested by the passphrase.

      + +
      ssh-add
      +
      +
    6. +
    7. +

      Check that your key is active by the SSH agent:

      + +
      ssh-add -l
      +
      +
    8. +
    9. +

      SSH to the second login node. No password should be requested:

      + +
      ssh -vvv login002
      +
      +
    10. +
    + +

    If the last step succeeds, then means that your SSH Key is properly setup.

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin7/storage.html b/merlin7/storage.html new file mode 100644 index 0000000..343198f --- /dev/null +++ b/merlin7/storage.html @@ -0,0 +1,852 @@ + + + + + + + + +Merlin7 Storage | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Merlin7 Storage

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    Introduction

    + +

    This document describes the different directories of the Merlin7 cluster.

    + +

    Backup and data policies

    + +
      +
    • Users are responsible for backing up their own data. Is recommended to backup the data on third party independent systems (i.e. LTS, Archive, AFS, SwitchDrive, Windows Shares, etc.).
    • +
    • When a user leaves PSI, she or her supervisor/team are responsible to backup and move the data out from the cluster: every few months, the storage space will be recycled for those old users who do not have an existing and valid PSI account.
    • +
    + + + +

    How to check quotas

    + +

    Some of the Merlin7 directories have quotas applied. A way for checking the quotas is provided with the merlin_quotas command. +This command is useful to show all quotas for the different user storage directories and partitions (including AFS). To check your quotas, please run:

    + +
    $ merlin_quotas 
    +Path            SpaceUsed  SpaceQuota  Space %  FilesUsed  FilesQuota  Files %
    +--------------  ---------  ----------  -------  ---------  ----------  -------
    +/data/user      30.26G     1T          03%      367296     2097152     18%    
    + └─ <USERNAME>
    +/afs/psi.ch     3.4G       9.5G        36%      0          0           0%     
    + └─ user/<USERDIR>                                                                
    +/data/scratch   688.9M     2T          00%      368471     0           00%
    + └─ shared
    +/data/project   3.373T     11T         31%      425644     2097152     20%
    + └─ bio/shared
    +/data/project   4.142T     11T         38%      579596     2097152     28%
    + └─ bio/hpce
    +
    + + + +

    The output shows the quotas set and how much you are using of the quota, for each filesystem that has this set. Notice that some users will have +one or more /data/project/... directories showing, depending on whether you are part of a specific PSI research group or project.

    + +

    The general quota constraints for the different directories are shown in the table below. Further details on how to use merlin_quotas +can be found on the Tools page.

    + + + +

    Merlin7 directories

    + +

    Merlin7 offers the following directory classes for users:

    + +
      +
    • /data/user/<username>: Private user home directory
    • +
    • /data/project/general: project directory for Merlin
    • +
    • /data/project/bio/$projectname: project directory for BIO
    • +
    • /data/project/mu3e/$projectname: project directory for Mu3e
    • +
    • /data/project/meg/$projectname: project directory for Mu3e
    • +
    • /scratch: Local scratch disk (only visible by the node running a job).
    • +
    • /data/scratch/shared: Shared scratch disk (visible from all nodes).
    • +
    + + + +

    Properties of the directory classes:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    DirectoryBlock Quota [Soft:Hard]Inode Quota [Soft:Hard]GraceTimeQuota Change Policy: BlockQuota Change Policy: InodesBackup
    /data/user/$usernamePRJ [1TB:1.074TB]PRJ [2M:2.1M]7dImmutable. Need a project.Changeable when justified.no
    /data/project/bio/$projectnamePRJ [1TB:1.074TB]PRJ [1M:1.1M]7dSubject to project requirements.Subject to project requirements.no
    /data/project/general/$projectnamePRJ [1TB:1.074TB]PRJ [1M:1.1M]7dSubject to project requirements.Subject to project requirements.no
    /data/scratch/sharedUSR [512GB:2TB] 7dUp to x2 when strongly justified.Changeable when justified.no
    /scratchUndefUndefN/AN/AN/Ano
    + + + +

    User home directory

    + +

    This is the default directory users will land when login in to any Merlin7 machine. +It is intended for your scripts, documents, software development and data. Do not use it for I/O-hungry tasks.

    + +

    The home directories are mounted in the login and computing nodes under the directory

    + +
    /data/user/$username
    +
    + +

    Directory policies:

    + +
      +
    • Read Important: Code of Conduct for more information about Merlin7 policies.
    • +
    • Is forbidden to use the home directories for IO-intensive tasks, instead use one of the scratch areas instead!
    • +
    • No backup policy is applied for the user home directories: users are responsible for backing up their data.
    • +
    + +

    Home directory quotas are defined in a per Lustre project basis. The quota can be checked using the merlin_quotas command described +above.

    + +

    Project data directory

    + +

    This storage is intended for keeping large amounts of a project’s data, where the data also can be +shared by all members of the project (the project’s corresponding UNIX group). We recommend to keep most data in +project related storage spaces, since it allows users to coordinate. Also, project spaces have more flexible policies +regarding extending the available storage space.

    + +

    Scientists can request a Merlin project space as described in [Accessing Merlin -> Requesting a Project]. +By default, Merlin can offer general project space, centrally covered, as long as it does not exceed 10TB (otherwise, it has to be justified). +General Merlin projects might need to be reviewed after one year of their creation.

    + +

    Once a Merlin project is created, the directory will be mounted in the login and computing nodes under the directory:

    + +
    /data/project/general/$projectname
    +
    + +

    Project quotas are defined in a per Lustre project basis. Users can check the project quota by running the following command:

    + +
    lfs quota -h -p $projectid /data
    +
    + + + +

    Directory policies:

    + +
      +
    • Read Important: Code of Conduct for more information about Merlin7 policies.
    • +
    • It is forbidden to use the data directories as /scratch area during a job’s runtime, i.e. for high throughput I/O for a job’s temporary files. +
        +
      • Please Use /scratch, /data/scratch/shared for this purpose.
      • +
      +
    • +
    • No backups: users are responsible for managing the backups of their data directories.
    • +
    + +

    Dedicated project directories

    + +

    Some departments or divisions have bigger storage space requirements on Merlin7. At present, bio, mu3e and meg are the main ones. +These are mounted under the following paths:

    + +
    /data/project/bio
    +/data/project/mu3e
    +/data/project/meg
    +
    + +

    They follow the same rules as the general projects, except that they have assigned more space.

    + +

    Scratch directories

    + +

    There are two different types of scratch storage: local (/scratch) and shared (/data/scratch/shared).

    + +
      +
    • local scratch should be used for all jobs that do not require the scratch files to be accessible from multiple nodes, which is trivially +true for all jobs running on a single node. Mount path:
    • +
    + +
    /scratch
    +
    + +
      +
    • shared scratch is intended for files that need to be accessible by multiple nodes, e.g. by a MPI-job where tasks are spread out over the cluster +and all tasks need to do I/O on the same temporary files.
    • +
    + +
    /data/scratch/shared
    +
    + +

    Scratch directories policies:

    + +
      +
    • Read Important: Code of Conduct for more information about Merlin7 policies.
    • +
    • By default, always use local first and only use shared if your specific use case requires it.
    • +
    • Temporary files must be deleted at the end of the job by the user. +
        +
      • Remaining files will be deleted by the system if detected. +
          +
        • Files not accessed within 28 days will be automatically cleaned up by the system.
        • +
        • If for some reason the scratch areas get full, admins have the rights to cleanup the oldest data.
        • +
        +
      • +
      +
    • +
    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin7/tools.html b/merlin7/tools.html new file mode 100644 index 0000000..4672317 --- /dev/null +++ b/merlin7/tools.html @@ -0,0 +1,702 @@ + + + + + + + + +Merlin7 Tools | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Merlin7 Tools

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    About

    + +

    We provide tool(s) to help user get the most out of using the cluster. The tools +described here are organised by use case and include usage examples.

    + +

    Files and Directories

    + +

    merlin_quotas

    + +

    This tool is available on all of the login nodes and provides a brief overview of +a user’s filesystem quotas. These are limits which restrict how much storage (or +number of files) a user can create. A generic table of filesystem quotas can be +found on the Storage page.

    + +

    Example #1: Viewing quotas

    + +

    Simply calling merlin_quotas will show you a table of our quotas:

    + +
    $ merlin_quotas 
    +Path            SpaceUsed  SpaceQuota  Space %  FilesUsed  FilesQuota  Files %
    +--------------  ---------  ----------  -------  ---------  ----------  -------
    +/data/user      30.26G     1T          03%      367296     2097152     18%    
    + └─ <USERNAME>
    +/afs/psi.ch     3.4G       9.5G        36%      0          0           00%
    + └─ user/<USERDIR>                                                                
    +/data/project   2.457T     10T         25%      58         2097152     00%    
    + └─ bio/shared                                                                
    +/data/project   338.3G     10T         03%      199391     2097152     10%    
    + └─ bio/hpce 
    +
    + + + +

    Example #2: Project view

    + +

    The tool can also be used to list out information about what projects directories +there are and who owns/manages these:

    + +
    $ merlin_quotas projects
    +Project ID  Path                      Owner      Group
    +----------  ------------------------  ---------  --------------
    +600000000   /data/project/bio/shared  germann_e  unx-merlin_adm
    +600000001   /data/project/bio/hpce    assman_g   unx-merlin_adm
    +
    + +

    By default this only shows information on projects that you have access to, but +to view the whole list you can pass --all flag:

    + +
    $ merlin_quotas projects --all
    +Project ID  Path                             Owner           Group
    +----------  -------------------------------  --------------  -----------------
    +500000000   /data/project/general/mcnp       gac-mcnp        unx-mcnp_all
    +500000001   /data/project/general/vis_as     talanov_v       unx-vis_as
    +500000002   /data/project/general/mmm        krack           org-7302
    +500000003   /data/project/general            laeuch_a        org-7201
    +             └─ LTC_CompPhys
    +600000000   /data/project/bio/shared         germann_e       unx-merlin_adm
    +600000001   /data/project/bio/hpce           assman_g        unx-merlin_adm
    +600000002   /data/project/bio/abrahams       abrahams_j      unx-bio_abrahams
    +600000003   /data/project/bio/benoit         benoit_r        unx-bio_benoit
    +600000004   /data/project/bio/ishikawa       ishikawa        unx-bio_ishikawa
    +600000005   /data/project/bio/kammerer       kammerer_r      unx-bio_kammerer
    +600000006   /data/project/bio/korkhov        korkhov_v       unx-bio_korkhov
    +600000007   /data/project/bio/luo            luo_j           unx-bio_luo
    +600000008   /data/project/bio/mueller        mueller_e       unx-bio_mueller
    +600000009   /data/project/bio/poghosyan      poghosyan_e     unx-bio_poghosyan
    +600000010   /data/project/bio/schertler      schertler_g     unx-bio_schertler
    +600000011   /data/project/bio/shivashankar   shivashankar_g  unx-bio_shivashan
    +600000012   /data/project/bio/standfuss      standfuss       unx-bio_standfuss
    +600000013   /data/project/bio/steinmetz      steinmetz       unx-bio_steinmetz
    +
    + + + +

    Example #3: Project config

    + +

    To make tracking quotas of projects easier, merlin_quotas generates a config +file in your home directory which defines the projects to show when you call the +tool (called ~/.merlin_quotas).

    + +

    The config file simply contains a list (one per line) of project IDs which should +be tracked. In theory any (or all available projects) can be tracked, but due to +UNIX and Lustre permissions, accessing quotas information for a project you’re not +a member of is not possible.

    + +

    If you are added/removed from a project, you can update this config file by +calling merlin_quotas genconf --force (notice the --force, which will overwrite +your existing config file) or by editing the file by hand (not recommended).

    + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/merlin7/transfer-data.html b/merlin7/transfer-data.html new file mode 100644 index 0000000..fa58d17 --- /dev/null +++ b/merlin7/transfer-data.html @@ -0,0 +1,674 @@ + + + + + + + + +Transferring Data | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Transferring Data

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    Overview

    + +

    Most methods allow data to be either transmitted or received, so it may make sense to +initiate the transfer from either merlin or the other system, depending on the network +visibility.

    + +
      +
    • Merlin login nodes are visible from the PSI network, so direct data transfer +(rsync/WinSCP/sftp) is generally preferable. +
        +
      • Protocols from Merlin7 to PSI may require special firewall rules.
      • +
      +
    • +
    • Merlin login nodes can access the internet using a limited set of protocols: +
        +
      • HTTP-based protocols using ports 80 or 445 (https, WebDav, etc)
      • +
      • Protocols using other ports require admin configuration and may only work with +specific hosts, and may require new firewall rules (ssh, ftp, rsync daemons, etc).
      • +
      +
    • +
    • Systems on the internet can access the PSI Data Transfer service +datatransfer.psi.ch, using ssh-based protocols and Globus
    • +
    + +

    SSH-based protocols using port 22 to most PSI servers and (rsync-over-ssh, sftp, WinSCP, etc.), are in general, not permitted

    + +

    Direct transfer via Merlin7 login nodes

    + +

    The following methods transfer data directly via the login +nodes. They are suitable +for use from within the PSI network.

    + +

    Rsync

    + +

    Rsync is the preferred method to transfer data from Linux/MacOS. It allows +transfers to be easily resumed if they get interrupted. The general syntax is:

    + +
    rsync -avAHXS <src> <dst>
    +
    + +

    For example, to transfer files from your local computer to a merlin project +directory:

    + +
    rsync -avAHXS ~/localdata $USER@login001.merlin7.psi.ch:/data/project/general/myproject/
    +
    + +

    You can resume interrupted transfers by simply rerunning the command. Previously +transferred files will be skipped.

    + +

    WinSCP

    + +

    The WinSCP tool can be used for remote file transfer on Windows. It is available +from the Software Kiosk on PSI machines. Add login001.merlin7.psi.ch or login002.merlin7.psi.ch +as a host and connect with your PSI credentials. You can then drag-and-drop files between your +local computer and merlin.

    + +

    SWITCHfilesender

    + +

    SWITCHfilesender is an installation of the FileSender project (filesender.org) which is a web based application that allows authenticated users to securely and easily send arbitrarily large files to other users.

    + +

    Authentication of users is provided through SimpleSAMLphp, supporting SAML2, LDAP and RADIUS and more. Users without an account can be sent an upload voucher by an authenticated user. FileSender is developed to the requirements of the higher education and research community.

    + +

    The purpose of the software is to send a large file to someone, have that file available for download for a certain number of downloads and/or a certain amount of time, and after that automatically delete the file. The software is not intended as a permanent file publishing platform.

    + +

    SWITCHfilesender is fully integrated with PSI, therefore, PSI employees can log in by using their PSI account (through Authentication and Authorization Infrastructure / AAI, by selecting PSI as the institution to be used for log in).

    + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/news.html b/news.html new file mode 100644 index 0000000..4b66175 --- /dev/null +++ b/news.html @@ -0,0 +1,405 @@ + + + + + + + + +News | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    News

    +
    + + + +
    + + + + + + + + +
    + +
    + + + +

    Merlin7 in preproduction

    + +

    The Merlin7 cluster is officially in preproduction. This phase will be tested by a few users +and slowly we will contact other users to be part of it. Keep in mind that access is restricted. + +Merlin7 documentation is now available https://hpce.pages.psi.ch/merlin7/slurm-configuration.html. + +More complete documentation will be coming shortly. +

    + + + + +

    Merlin 6 documentation available

    + +

    Merlin 6 docs are now available at https://hpce.pages.psi.ch/merlin6! + +More complete documentation will be coming shortly. +

    + + + +

    RSS Subscribe

    + +
    +

    See more posts from the News Archive.

    + +
    +
    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/news_archive.html b/news_archive.html new file mode 100644 index 0000000..31d99f1 --- /dev/null +++ b/news_archive.html @@ -0,0 +1,333 @@ + + + + + + + + +News | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    News

    +
    + + + +
    + + + + + + + + +
    + +
    + + +
    +

    This year's posts

    + + + +

    2019

    + +
    +
    +
    +
    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/pages/CSCS/downloads/CSCS/PSI_CSCSAllocations2023.xltx b/pages/CSCS/downloads/CSCS/PSI_CSCSAllocations2023.xltx new file mode 100644 index 0000000..daecd3d Binary files /dev/null and b/pages/CSCS/downloads/CSCS/PSI_CSCSAllocations2023.xltx differ diff --git a/pdf-all.sh b/pdf-all.sh new file mode 100644 index 0000000..1311770 --- /dev/null +++ b/pdf-all.sh @@ -0,0 +1 @@ +. pdf-mydoc.sh; . pdf-product1.sh; . pdf-product2.sh; \ No newline at end of file diff --git a/pdf-mydoc.sh b/pdf-mydoc.sh new file mode 100644 index 0000000..6b682ae --- /dev/null +++ b/pdf-mydoc.sh @@ -0,0 +1,14 @@ +# Note that .sh scripts work only on Mac. If you're on Windows, install Git Bash and use that as your client. + +echo 'Kill all Jekyll instances' +kill -9 $(ps aux | grep '[j]ekyll' | awk '{print $2}') +clear + +echo "Building PDF-friendly HTML site for Mydoc ..."; +bundle exec jekyll serve --detach --config _config.yml,pdfconfigs/config_mydoc_pdf.yml; +echo "done"; + +echo "Building the PDF ..."; +prince --javascript --input-list=_site/pdfconfigs/prince-list.txt -o pdf/mydoc.pdf; + +echo "Done. Look in the pdf directory to see if it printed successfully." diff --git a/pdf-product1.sh b/pdf-product1.sh new file mode 100644 index 0000000..ae5c674 --- /dev/null +++ b/pdf-product1.sh @@ -0,0 +1,11 @@ +echo 'Killing all Jekyll instances' +kill -9 $(ps aux | grep '[j]ekyll' | awk '{print $2}') +clear + +echo "Building PDF-friendly HTML site for Product1 ..."; +bundle exec jekyll serve --detach --config _config.yml,pdfconfigs/config_product1_pdf.yml; +echo "done"; + +echo "Building the PDF ..."; +prince --javascript --input-list=_site/pdfconfigs/prince-list.txt -o pdf/product1.pdf; +echo "done"; diff --git a/pdf-product2.sh b/pdf-product2.sh new file mode 100644 index 0000000..2bdbc73 --- /dev/null +++ b/pdf-product2.sh @@ -0,0 +1,11 @@ +echo 'Killing all Jekyll instances' +kill -9 $(ps aux | grep '[j]ekyll' | awk '{print $2}') +clear + +echo "Building PDF-friendly HTML site for Product2 ..."; +bundle exec jekyll serve --detach --config _config.yml,pdfconfigs/config_product2_pdf.yml; +echo "done"; + +echo "Building the PDF ..."; +prince --javascript --input-list=_site/pdfconfigs/prince-list.txt -o pdf/product2.pdf; +echo "done"; diff --git a/pdf/mydoc.pdf b/pdf/mydoc.pdf new file mode 100644 index 0000000..7169d61 --- /dev/null +++ b/pdf/mydoc.pdf @@ -0,0 +1,16246 @@ +%PDF-1.4 +% + +1 0 obj +<> +endobj + +194 0 obj +<> +endobj + +195 0 obj +<> +endobj + +196 0 obj +<> +endobj + +258 0 obj +<> +endobj + +259 0 obj +<> +endobj + +260 0 obj +<> +endobj + +261 0 obj +<> +endobj + +262 0 obj +<> +endobj + +244 0 obj +<> +endobj + +245 0 obj +<> +endobj + +246 0 obj +<> +endobj + +247 0 obj +<> +endobj + +248 0 obj +<> +endobj + +249 0 obj +<> +endobj + +250 0 obj +<> +endobj + +251 0 obj +<> +endobj + +252 0 obj +<> +endobj + +253 0 obj +<> +endobj + +254 0 obj +<> +endobj + +255 0 obj +<> +endobj + +256 0 obj +<> +endobj + +257 0 obj +<> +endobj + +197 0 obj +<> +endobj + +263 0 obj +<> +endobj + +264 0 obj +<> +endobj + +265 0 obj +<> +endobj + +198 0 obj +<> +endobj + +266 0 obj +<> +endobj + +267 0 obj +<> +endobj + +199 0 obj +<> +endobj + +200 0 obj +<> +endobj + +201 0 obj +<> +endobj + +268 0 obj +<> +endobj + +269 0 obj +<> +endobj + +270 0 obj +<> +endobj + +271 0 obj +<> +endobj + +272 0 obj +<> +endobj + +273 0 obj +<> +endobj + +274 0 obj +<> +endobj + +202 0 obj +<> +endobj + +275 0 obj +<> +endobj + +276 0 obj +<> +endobj + +277 0 obj +<> +endobj + +278 0 obj +<> +endobj + +279 0 obj +<> +endobj + +280 0 obj +<> +endobj + +281 0 obj +<> +endobj + +203 0 obj +<> +endobj + +282 0 obj +<> +endobj + +283 0 obj +<> +endobj + +284 0 obj +<> +endobj + +285 0 obj +<> +endobj + +286 0 obj +<> +endobj + +204 0 obj +<> +endobj + +287 0 obj +<> +endobj + +288 0 obj +<> +endobj + +289 0 obj +<> +endobj + +290 0 obj +<> +endobj + +291 0 obj +<> +endobj + +292 0 obj +<> +endobj + +293 0 obj +< +/Parent 205 0 R +/Dest [42 0 R /XYZ 0 590 0] +/Prev 292 0 R>> +endobj + +205 0 obj +<> +endobj + +294 0 obj +<> +endobj + +295 0 obj +<> +endobj + +296 0 obj +<> +endobj + +297 0 obj +<> +endobj + +298 0 obj +<> +endobj + +299 0 obj +<> +endobj + +300 0 obj +<> +endobj + +301 0 obj +<> +endobj + +206 0 obj +<> +endobj + +302 0 obj +<> +endobj + +303 0 obj +<> +endobj + +304 0 obj +<> +endobj + +305 0 obj +<> +endobj + +306 0 obj +<> +endobj + +307 0 obj +<> +endobj + +308 0 obj +<> +endobj + +309 0 obj +<> +endobj + +310 0 obj +<> +endobj + +311 0 obj +<> +endobj + +312 0 obj +<> +endobj + +318 0 obj +<> +endobj + +317 0 obj +<> +endobj + +313 0 obj +<> +endobj + +314 0 obj +<> +endobj + +315 0 obj +<> +endobj + +316 0 obj +<> +endobj + +207 0 obj +<> +endobj + +319 0 obj +<> +endobj + +320 0 obj +<> +endobj + +208 0 obj +<> +endobj + +321 0 obj +<> +endobj + +322 0 obj +<> +endobj + +323 0 obj +<> +endobj + +325 0 obj +<> +endobj + +324 0 obj +<> +endobj + +209 0 obj +<> +endobj + +326 0 obj +<> +endobj + +327 0 obj +<> +endobj + +328 0 obj +<> +endobj + +329 0 obj +<> +endobj + +330 0 obj +<> +endobj + +331 0 obj +<> +endobj + +332 0 obj +<> +endobj + +333 0 obj +<> +endobj + +210 0 obj +<> +endobj + +334 0 obj +<> +endobj + +335 0 obj +<> +endobj + +211 0 obj +<> +endobj + +336 0 obj +<> +endobj + +337 0 obj +<> +endobj + +338 0 obj +<> +endobj + +339 0 obj +<> +endobj + +340 0 obj +<> +endobj + +212 0 obj +<> +endobj + +341 0 obj +<> +endobj + +342 0 obj +<> +endobj + +343 0 obj +<> +endobj + +344 0 obj +<> +endobj + +345 0 obj +<> +endobj + +346 0 obj +<> +endobj + +347 0 obj +<> +endobj + +348 0 obj +<> +endobj + +349 0 obj +<> +endobj + +350 0 obj +<> +endobj + +351 0 obj +<> +endobj + +352 0 obj +<> +endobj + +213 0 obj +<> +endobj + +353 0 obj +<> +endobj + +214 0 obj +<> +endobj + +354 0 obj +<> +endobj + +355 0 obj +<> +endobj + +356 0 obj +<> +endobj + +357 0 obj +<> +endobj + +215 0 obj +<> +endobj + +358 0 obj +<> +endobj + +359 0 obj +<> +endobj + +360 0 obj +<> +endobj + +361 0 obj +<> +endobj + +362 0 obj +<> +endobj + +363 0 obj +<> +endobj + +371 0 obj +<> +endobj + +364 0 obj +<> +endobj + +372 0 obj +<> +endobj + +373 0 obj +<> +endobj + +374 0 obj +<> +endobj + +365 0 obj +<> +endobj + +366 0 obj +<> +endobj + +367 0 obj +<> +endobj + +368 0 obj +<> +endobj + +369 0 obj +<> +endobj + +370 0 obj +<> +endobj + +216 0 obj +<> +endobj + +375 0 obj +<> +endobj + +376 0 obj +<> +endobj + +377 0 obj +<> +endobj + +378 0 obj +<> +endobj + +379 0 obj +<> +endobj + +380 0 obj +<> +endobj + +381 0 obj +<> +endobj + +217 0 obj +<> +endobj + +382 0 obj +<> +endobj + +383 0 obj +<> +endobj + +384 0 obj +< +/Parent 218 0 R +/Dest [96 0 R /XYZ 0 655 0] +/Prev 383 0 R +/Next 385 0 R>> +endobj + +385 0 obj +<> +endobj + +386 0 obj +<> +endobj + +387 0 obj +<> +endobj + +388 0 obj +<> +endobj + +218 0 obj +<> +endobj + +389 0 obj +<> +endobj + +219 0 obj +<> +endobj + +390 0 obj +<> +endobj + +391 0 obj +<> +endobj + +392 0 obj +<> +endobj + +393 0 obj +<> +endobj + +394 0 obj +<> +endobj + +395 0 obj +<> +endobj + +396 0 obj +<> +endobj + +397 0 obj +<> +endobj + +398 0 obj +<> +endobj + +220 0 obj +<> +endobj + +399 0 obj +<> +endobj + +400 0 obj +<> +endobj + +401 0 obj +<> +endobj + +402 0 obj +<> +endobj + +403 0 obj +<> +endobj + +404 0 obj +<> +endobj + +221 0 obj +<> +endobj + +405 0 obj +<> +endobj + +406 0 obj +<> +endobj + +407 0 obj +<> +endobj + +222 0 obj +<> +endobj + +408 0 obj +<> +endobj + +223 0 obj +<> +endobj + +409 0 obj +<> +endobj + +224 0 obj +<> +endobj + +410 0 obj +<> +endobj + +411 0 obj +<> +endobj + +412 0 obj +<> +endobj + +413 0 obj +<> +endobj + +225 0 obj +<> +endobj + +414 0 obj +<> +endobj + +415 0 obj +<> +endobj + +416 0 obj +<> +endobj + +417 0 obj +<> +endobj + +418 0 obj +<> +endobj + +419 0 obj +<> +endobj + +420 0 obj +<> +endobj + +421 0 obj +<> +endobj + +422 0 obj +<> +endobj + +423 0 obj +<> +endobj + +424 0 obj +<> +endobj + +226 0 obj +<> +endobj + +425 0 obj +<> +endobj + +426 0 obj +<> +endobj + +427 0 obj +<> +endobj + +227 0 obj +<> +endobj + +428 0 obj +<> +endobj + +429 0 obj +<> +endobj + +228 0 obj +<> +endobj + +430 0 obj +<> +endobj + +431 0 obj +<> +endobj + +432 0 obj +<> +endobj + +229 0 obj +<> +endobj + +433 0 obj +<> +endobj + +434 0 obj +<> +endobj + +435 0 obj +<> +endobj + +436 0 obj +<> +endobj + +230 0 obj +<> +endobj + +437 0 obj +<> +endobj + +438 0 obj +<> +endobj + +439 0 obj +<> +endobj + +231 0 obj +<> +endobj + +440 0 obj +<> +endobj + +441 0 obj +<> +endobj + +232 0 obj +<> +endobj + +442 0 obj +<> +endobj + +443 0 obj +<> +endobj + +444 0 obj +<> +endobj + +445 0 obj +<> +endobj + +446 0 obj +<> +endobj + +447 0 obj +<> +endobj + +448 0 obj +<> +endobj + +449 0 obj +<> +endobj + +450 0 obj +<> +endobj + +451 0 obj +<> +endobj + +452 0 obj +<> +endobj + +233 0 obj +<> +endobj + +453 0 obj +<> +endobj + +454 0 obj +<> +endobj + +455 0 obj +< +/Parent 234 0 R +/Dest [159 0 R /XYZ 0 310 0] +/Prev 454 0 R +/Next 456 0 R>> +endobj + +456 0 obj +<> +endobj + +457 0 obj +<> +endobj + +458 0 obj +<> +endobj + +459 0 obj +<> +endobj + +460 0 obj +<> +endobj + +461 0 obj +<> +endobj + +462 0 obj +<> +endobj + +463 0 obj +<> +endobj + +234 0 obj +<> +endobj + +464 0 obj +<> +endobj + +465 0 obj +<> +endobj + +466 0 obj +<> +endobj + +467 0 obj +<> +endobj + +468 0 obj +<> +endobj + +469 0 obj +<> +endobj + +235 0 obj +<> +endobj + +470 0 obj +<> +endobj + +471 0 obj +<> +endobj + +472 0 obj +<> +endobj + +236 0 obj +<> +endobj + +473 0 obj +<> +endobj + +474 0 obj +<> +endobj + +237 0 obj +<> +endobj + +475 0 obj +<> +endobj + +476 0 obj +<> +endobj + +477 0 obj +<> +endobj + +478 0 obj +<> +endobj + +238 0 obj +<> +endobj + +481 0 obj +<> +endobj + +482 0 obj +<> +endobj + +483 0 obj +<> +endobj + +484 0 obj +<> +endobj + +479 0 obj +<> +endobj + +480 0 obj +<> +endobj + +239 0 obj +<> +endobj + +485 0 obj +<> +endobj + +240 0 obj +<> +endobj + +486 0 obj +<> +endobj + +487 0 obj +<> +endobj + +488 0 obj +<> +endobj + +489 0 obj +<> +endobj + +490 0 obj +<> +endobj + +491 0 obj +<> +endobj + +492 0 obj +<> +endobj + +493 0 obj +<> +endobj + +494 0 obj +<> +endobj + +241 0 obj +<> +endobj + +242 0 obj +<> +endobj + +497 0 obj +<> +endobj + +498 0 obj +<> +endobj + +495 0 obj +<> +endobj + +499 0 obj +< +/Parent 496 0 R +/Dest [191 0 R /XYZ 0 665 0] +/Next 500 0 R>> +endobj + +500 0 obj +<> +endobj + +501 0 obj +<> +endobj + +502 0 obj +< +/Parent 496 0 R +/Dest [192 0 R /XYZ 0 732 0] +/Prev 501 0 R +/Next 503 0 R>> +endobj + +503 0 obj +< +/Parent 496 0 R +/Dest [192 0 R /XYZ 0 630 0] +/Prev 502 0 R>> +endobj + +496 0 obj +<> +endobj + +243 0 obj +<> +endobj + +193 0 obj +<> +endobj + +2 0 obj +<> +endobj + +504 0 obj +<> +stream +xmMN0sY=c;6KT@lriMzLn#Mf{3(!Ӈk2+;T4 b%Ha3 KC:7+ Afxf>L'@m +VT#q IXVcuZ-Yrql{ MU/|1fgu[훰[l z_u>)#9^5*?⮟g<0Lm zx4Ӟa .BTqt/'k0x `AᢅgC +endstream +endobj + +505 0 obj +295 +endobj + +506 0 obj +<> +stream +xVy +7(A1iL1>H;%(׋MJT^?xi)bzI:Y"i.Yz:'M(y($Y/ZzX0-d6'a'Kې~9wY0sNH7, Y@*@#8 @ Q`5 - TZA 8Yp\7 !CT@Z>d +YB, BPCH @[BFW tA!hz}a ^`WWp:΃wp=| n/7~O"!#J6DX;D#qو H=҂t"==DF>cpab0>0 و)Tab010C w,5c}xl6[==}~pJ8C-KĭZq]>0nǫM@</+w#O2A`I"D\B9pp0J&@"XLl voG$y!ɑJJ$m!UZHWHd2YlG^N7+C ŝ"tQSST 5*6R/QQ?dd|e2dedʼ%˺ʮ]'[.{Rk9[n\~Iy||||u1W!O%aBӥ8G7_ EŊيՊ%JRR J_h,p][sA˂ Ք]yʭ0T>}}5|9~~.SC/5Y*\ \L= |dr_[Bք4| u -3 +uˆ o (D.y3J5>=s#+W|pUUW'>Fv {lLDLSWv =[;qp˸!΀2VetHMzѶIn7[y/t0[ZZ / 'Y'[N韪9M;]mhOhtDu;y7ߎ>[}N\y3]Jz}1pK_^~kW^qp`hisӿ[~צ;vw:|={W޿`كa<>{'O垖?SVɹ![C s_בZccgǽ\rUګUͩ]591Vv]{G>,=4c驂O*~f}et:+k7oΤMP[˜%88YĐTL|Jl%P~2{Y@!JBy-$dg5Ps`xBj8ģp"~0kL|YVȏO1|"PvN:BiB_ainn@Fl)zg33 xffnf: d. +? +endstream +endobj + +507 0 obj +2577 +endobj + +3 0 obj +<> +/XObject <> +/ProcSet [/PDF /Text /ImageC] +/ColorSpace <>>> +/Group <>>> +endobj + +512 0 obj +<> +stream +xuRM0+V 4KVj{ң +{ܱl~Reǐnr"$|{Q

    Aї%n;1!UB5gr!0;^_`@b K.#&rY]~pD^FaGK̋uqLE{!7vtQg4)8SxX=R0:au`#Y(&@?u#Fx_p'Q 9k +ra> +/ProcSet [/PDF /Text]>> +/Group <>>> +endobj + +515 0 obj +<> +stream +xYn6}W1-U})vŢxR S3GYvDŢ@"dgsFù(4a/u +7Gf,f=[g\.0A͌Rɽa4'+IvX.Ųr'?7w}G~Y sa{2NfTj؉ʇN=t_ (;4ܘN;v|z-ΤbE6 + 2kU{'7oueS` `%h%J+G]/ܻw `bLbr2#BT2!ey?oHMJ:S9K̦2a (^ed{5Q*7ȢczLm,b\sC}EE%H~SYNujoSYȉ LjoYЈSXp,Â㦆UUEҟ$9J $6[>]k]7]\{I_d,)|43VG1W\/VQ4}АP*&SY/Qc jJ,903mĢ~/re5ͨ + bgH@"|6;˅4)DZP!MIQ\weP"EMP!QvgMEEfSnmhˬ#"LEK/3EO"ԈB]fh(~JYU)v2Ն +'M%Bi/Q ޯ*C6 +G7R/VU~]jHKź2+rsA'qnE]vˢ%5ɹ8 uXHIu6BG|QB/8߾:6vP0 ljjS%FȢؠe9P!QTrҡWZP!MK#Oe;W O449Ci4;?f:o!G GmCQS &7dic=3f44lB2+ԪUf/!Iyh ɘ<aJC/nV}}#!wzε亃B'Wn#yVn }\>RgyNjkݶ( \ll *M#gn* +endstream +endobj + +516 0 obj +1134 +endobj + +5 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [517 0 R 518 0 R 519 0 R 520 0 R 521 0 R 522 0 R 523 0 R 524 0 R 525 0 R 526 0 R 527 0 R 528 0 R 529 0 R 530 0 R 531 0 R 532 0 R 533 0 R 534 0 R 535 0 R 536 0 R 537 0 R 538 0 R 539 0 R 540 0 R 541 0 R]>> +endobj + +517 0 obj +<> +endobj + +518 0 obj +<> +endobj + +519 0 obj +<> +endobj + +520 0 obj +<> +endobj + +521 0 obj +<> +endobj + +522 0 obj +<> +endobj + +523 0 obj +<> +endobj + +524 0 obj +<> +endobj + +525 0 obj +<> +endobj + +526 0 obj +<> +endobj + +527 0 obj +<> +endobj + +528 0 obj +<> +endobj + +529 0 obj +<> +endobj + +530 0 obj +<> +endobj + +531 0 obj +<> +endobj + +532 0 obj +<> +endobj + +533 0 obj +<> +endobj + +534 0 obj +<> +endobj + +535 0 obj +<> +endobj + +536 0 obj +<> +endobj + +537 0 obj +<> +endobj + +538 0 obj +<> +endobj + +539 0 obj +<> +endobj + +540 0 obj +<> +endobj + +541 0 obj +<> +endobj + +545 0 obj +<> +stream +x͘n6~ +.ӢU5K(\]mDC~̾QG,l 0lH7!G$Ń&Y%ߜ uњ$MrAf{NrrX+}CfM~ 0k?.XJ&-.Ɖ=g'[5b8][")5?k~J:<(n<ii6.T~׊$4$kY>TV8(Oۦ&rӗʍɐ] 8]?@uSdN_iee_Io+Y@}aL8f@0J(O~~ɛGKi^hxHudd4cMېe7M1upES&)X=(l:̫[}pJV-Dq(jsv~5j,/h'q-Ϛi +xzCV4w0|Q#7Z$ITa\0G[[RRl z ѝn|k9iL.daeƇjj]-J lrfښlZ֠O@~IwY]c˜uǕÚ%i_L>UPX4"T5.q?_s2 ޢ)^u_& 2ice^*ڡN,q,e#}L2.ՃH ź /h3gCe.oU<_ +}R,FJ3}#)u,^ V>(7Q*Ruۓk t)ΈZ3Yk{mmyJ #FqvoePOX%Xvx]D'T1۪"8mIaxC!ό@1,z7H0qK2r/fד~ 6ŏYz;BSuNWnMOů&Y \ SGſI +endstream +endobj + +546 0 obj +993 +endobj + +6 0 obj +<> +/ProcSet [/PDF /Text]>> +/Group <> +/Annots [547 0 R 548 0 R 549 0 R 550 0 R 551 0 R 552 0 R 553 0 R 554 0 R 555 0 R 556 0 R 557 0 R 558 0 R 559 0 R 560 0 R 561 0 R 562 0 R 563 0 R 564 0 R 565 0 R 566 0 R 567 0 R 568 0 R]>> +endobj + +547 0 obj +<> +endobj + +548 0 obj +<> +endobj + +549 0 obj +<> +endobj + +550 0 obj +<> +endobj + +551 0 obj +<> +endobj + +552 0 obj +<> +endobj + +553 0 obj +<> +endobj + +554 0 obj +<> +endobj + +555 0 obj +<> +endobj + +556 0 obj +<> +endobj + +557 0 obj +<> +endobj + +558 0 obj +<> +endobj + +559 0 obj +<> +endobj + +560 0 obj +<> +endobj + +561 0 obj +<> +endobj + +562 0 obj +<> +endobj + +563 0 obj +<> +endobj + +564 0 obj +<> +endobj + +565 0 obj +<> +endobj + +566 0 obj +<> +endobj + +567 0 obj +<> +endobj + +568 0 obj +<> +endobj + +569 0 obj +<> +stream +xXˎ6+t*>$QA tHS-f#K,9z1~PRDdf,b瘼s//C=np @4|j|{1X4 +I[Qʼ@/ dQ*B½(@zqq`EJ'WQ5D.h: 1h[cƖh@J2Y_5`t5jb5ed)kk}Bl js/u{:{z' Y 9  R#ᜱ16`:ȋs0e4>!.csr"֑w.3Ȃ1ilF'd7j)e]r#0ę{Q: Qj }DG戍;lY>G904,!64gqҝ16b!4ѩu>]2fcsz;Ø\,n0[%cY0f0GlZ.W籾C_#Ln:[p6jVm^H&u2r=i6i|F?~&`u}WEUM~VEl𱜙`v A10d9[w8$ ף>1ۇE6u$/RxUq$UGvSmqz#d8&E&V'"פy~ʛ˱L$rARuK'b /AM2#j ɦZr[}@&mU6~M\1jXDr8]UUidm-1G0Vǡ}9LXRjVaa2_nMZ_3R䷐jEn:H jZ3AI1e}A~Vanʜ[):LQw`4yHQ?  eR] ét,Ya1M6ݝstJ ndpz7R;jA~Kq"o yxB{|ReWfz9I2Nf5Ij0w1wΚ!4 ' +|WIL~dу..1HDux%^~k//cNѹhNI>,`1z^7Ct5\8Mct}hP* ̭tlzr%w$ ~`Yk=b +Q*MXrțFwk9:E!8hܙp_}KGSH!Ūy6?\#]y< +?)㹗)O;UWgQ:l@'(96m,-mHf""}3fvx8vEӈlfW +endstream +endobj + +570 0 obj +1764 +endobj + +7 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [571 0 R 572 0 R 573 0 R 574 0 R 575 0 R]>> +endobj + +571 0 obj +<>>> +endobj + +572 0 obj +<>>> +endobj + +573 0 obj +<> +endobj + +574 0 obj +<> +endobj + +575 0 obj +<>>> +endobj + +578 0 obj +<> +stream +xYnH+ji< G33hY*YJ(ҐY\UuQϬ@[OY&)2?eOÇ[lR%HD{U&Y^d jbϱ<:BJRRRZ/3 ) V+i3hg<c:*8Y"jnFhh (wttkz3EQέz\ݵi>0(L@{+L'_ݪQ4gMUNۙХ$ց`Z{G(6fpG<"4=1yOb)PvU2Q4w\ 4^nVHbДT˜K&3}uq8՞CpG?Z +e-V[" 0OJ*ʮ&(4DF$,²rʒ222Q-M*0IX81Ǣ"KGexȋ1ipW^eblhSܼ5oS~L?{+YCO z6"j`ag(bZGn^*cE,/(ڦV|0uh˹v}Cb~jՔ]}liJ}xX0!]Jģmd$25g?ч(fplg}a;TR H#M4-]{IYRhLvjB^J jA{"bՂae4ôQ^kHt,/eIVH+v$a'mt[=]p2xG.+?8ťQs{9)D͐wAZz6Uh?u3Q_wOmi"̧iv5*_n -rMn-~E!]ȧkϯ$̙No8k%XY? ~}BCDħnS R#Ŕx8. +endstream +endobj + +579 0 obj +2296 +endobj + +8 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [580 0 R 581 0 R 582 0 R]>> +endobj + +580 0 obj +<>>> +endobj + +581 0 obj +<>>> +endobj + +582 0 obj +<>>> +endobj + +584 0 obj +<> +stream +xYn+jb=Xd`[d0E,MK"R/'O-֋n3wcR}Թb{^T|VO%rj?-\diȤ*+LY|s}`g.8sJg,TUv,'zqy1]ɬ(b݇}Hzly,IcO64u|=zRbJP~|)ɘC&sEi2C(̈́="iۧXaT)τpBK x$Isa,IcOsQ߳;XLRŲ:pX3'H1 Fx˚4cdaIY,FުToBYA,Z[1C,[j{D +ʘTnDrVLpI0-Lq†cL>TCcTLfҮ +Is!,ϱH^dUbSC4$7W`(ʳGDE.0nc gsڞ>x\W+D Q+*hЮ.ICT^ "]4 Ab{:ow+()NZqӨH3&D;[e|mOf|{yNعoj{j2'·hFPBMclm6WO~` ꮵTMn](ۏ&.+!psj7E9\Z*\5~oKuՒ nZݱ9wjINt:38. 8皒 %ѧ {j) arVý@ri=1tOl~pӜBHX^^2((Z#;M}umq6ٶedyapwծ뾾_ +cs3pur\OE1.Toڞ[ +fmr#K޾ڮx1@YV~HM\߷fM=}b[۷zi֘^Ǽ㫮9ö;dz.\hF!:zMITZr m]ooczaP}2@ Gn֤Jb: ַ3rM K ۟wkc&5Ձ'?P +(1&LOQsdg_>:9P1a\_ۏHuSShrT{~6#us>Kn4{>K5Q$qx@o4þ4k{'f^&gEPЉ[RzO:Ē@đ<Fh؃̨'?o@=teo7v1:}fo=}zPVJaqu+0H1%1M[;a19_bfY;59bpL`. gjtT0(4X `7s&pŸ̒zripT\1uOC/7bظEp{1w$fݣ@\ ݀CAG]Ml,eAu'[hy!w*7ZwG,{Ĭ{͕5Fᰡ/v +`.Jbu概#u_nIcpn ߤtc> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [586 0 R 587 0 R]>> +endobj + +586 0 obj +<>>> +endobj + +587 0 obj +<>>> +endobj + +589 0 obj +<> +stream +xYn}Gm4^kHQ,`P3=cPrṽ'Hcg/騫TuUu(8MŧS+9v7l_E)ai0˕Fʢ4\CBR2!T&L0a͌l7*/+)3LWՅ IW׊BCZnRf*Ud7ͽnDSV= P X*w0&k.!oV e5nd {Jg,*htLJB",i*"0"zuО!UЕa y#𡸙 {-R13{#4G+gG.GCȵz׿c/K*z6' =eW8(n2p^!#0yƸZ4JUҚfFJ*)O6gO)Hg 5i7մ*d`5`QA{Ƞ륬I{y]̚kY)R\[f +&QJ2k(D-u##OfPRb3WCm n/Ey@}hN|zˮp{؞-Kѕ\ W%D6:b:`^R) %?Pq5yr7&dH2ruHG.:&+EMIJw$0ǢRI Je/| c.EWbWE5W:"\?\uQN-6|2Pc/^s/^9It3;;D?Bm) ;vW:<|qF]naWnkjӚ}I38]ֺ&p5NF8]㭆j/HWM^4"{ނMPǢTdO7v$zSnqf)͕U!\8 mF_w4{#>)},|w3k~O56]?{6 6j6&fKv ƬO3ތ IDvV +endstream +endobj + +590 0 obj +2308 +endobj + +10 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [591 0 R]>> +endobj + +591 0 obj +<> +endobj + +592 0 obj +<> +stream +xXMo8W],IC,Mt +SG#[,7럹?;%8so{y38C)d5)3>lsASK3%rKtfڿߦZiF8h.C_ŹkRΤ,Q &'rSQ$Ȏib 3z!6HDDoO^jb +)>!(bsYjb.K3bODCSf',)T9BFaȞ zQ,\ReLZsmSPk*S渏* +K*1/dO=p٘) yb $:#T&bf=ALzwzX#3TL}-*3V, #5b؝Ȟ b).˾2R,`I_#Y#{z%I;J w +7|97{+~lVEivӈ$AÄ{uEylڇ~پmU۝fGNͱ%bU9p_Zf%ʺ|T6k. ]N8\k~p#-喛sVBղjW~smֿmM\s}r>8*mqw~ &-Dlv +}&TCGoYHAղ8]pʙ!pA18HM.npTdp'6T>zSy .>,JI)KspX)3K^NEuӺTRW>JI+,),#3 'e*s4'Z +?BAy2%:D9R˔S'Nt$ *:.J8ܗ r}S]L~B9eodyqKLFu8=\g ;(wb}du.cR#ET8QTc.]XaGR[e78ia0LyCuSוeӱQtWgfOMa[ꮷp;?,:7ᐭM]7ϧnQ7:ރ}uUsMMx];.>.G%WN&̍/&HvU[w*}Bż!qpaWޱWd1_/5vq,;?AWZ$Ĉ  +endstream +endobj + +593 0 obj +1543 +endobj + +11 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +594 0 obj +<> +stream +xYn6)tJX, +$@O{p MI +A7P)b[dc: !-kAofD+)ֽ\FXYƆV|7,xJdJFQIKma(Y33َdM-(Cf'Ievjd4 nV ڭ3A4kT< 0yu3QˍG*@qA4^"?%%,R̻gkUD2$(K#DVFCYFAQ#5:Dߠxp~]nWc^ R +cOJ[VvUny{ +4EJ˟vP +#o̴|ڸ!44fNHdx̠1 KRŻ$ +6ZYA\S[Pj8jy>Y` !i{)B4$o+kBū󾤸B_ԊE릦TC-NqQ5b-( ThQ)a +xp'.>V+{?n9E;GYNI#)TktXd45ʔ=%q>hjZ8!lv̺<>hn]C8TɌM3g ևXc +>g֗1C}Kш {zvQd9 :V%>R2T hsG-G:˩P\֧ǘ Q J}}jĦ1'd3 9Bss"D +7Z!+4 1ڳiI,&#t=ώeCu.п\yq#!._ *B-GΛ|iL2B͐GHޛ7}1o5ݯssj/wO_z=\m:> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +596 0 obj +<> +stream +xZmo_CrP iC^qmS(htHO췾OgݙN|1ggg晗]2|U󓋟FWw_]I2;<< ]Y@J)sIY`0gκyQaL@TRcLDVWtGXXɠ1SG I6]sJ4KVF'ڀ +mEB% I&-ϊ_a-"0I@G,bYD,bK_h'G,b!FEX;"E""=B F 9η 7c㘛Dvi/d|-Gb5!tELCM+oQoZڀb,CQ;!V_ bv.ॷˈ,b*,bXs!,bi!C +Ev,"1Vר!|{RN|VҾZ|\_C)֏wW_78R +?zPU#E_[e<}kBE\@2r|-O>)I/U75 yo~K(p||+e>$Ksl?ݑ1RجTaQ&{[e0x؛dR9[RN/˷ meXt6\Ze ΘLe/:.¬[,'r/j._{| s/={iآggZMڼ㝅ii]9yYaKfa0iM8;ع)f)idzN zSB2l,bIWjUMs ^YlHB[#\^vB|E3ȇC#ԕ>tnx^0LI@4 +9In#8Kn?Kmi2hzA-a)C_JEVJϩ n{)+T0a1=D60jVF-zԢH-!SK{=I*9U8kܟ%xwFڱڶzl sGTU䌲p2H) 8:%ôI*i'&fX'"l%#\^vB.&4gv)w]?,8V*bu2ȬQY\^rf3t vXҕ0ba1=C60fV,z̢,!3K{=ݡF_gݾL\4iح S[˦-t邅H*ӥ. d9JoTNHNJq#& N]q!!2>J.ָח ⩔ywr {hFRG^>Xkb %GYjFT R!Ɯb^3L"Y_8 Hs8 hwIupH2HRJNC1a(F3,BudNDQ;!N{!`&/&cfPW0J.) jrE(n.%L^&!9JʰyҞ!h+=B^k䕐yŽ+N-hY!Ma)g&meWp-xIr0$B"x%,ڑWx%[WWרyg[4ǭWjɸC'ø?TۦmjQsL^ )? gVf)e]j7v&aaZp3LyvB4J8I9 qԮ,E6$$Г k#\^vBl\~=dO/d{U8 q׹̌v$mk^pVPa.FQ*i'D q'X%[UWרYe{=ɪ99çYħ/u+w;mplͶ,{ffiD[k1vb׫㳍/b: +7Et@d,g2\8$ +NR S,#l˱x Q0*j>3ڐЅ& tGFF{1z +.gEA>B^NLJoX]kEc!]dk1tbWb8w]tb j=[Aszthv{Jv]Vֵ=:!/)nr}|rc<]. +nTɭrzߛIѿzm7mdar_?Ͷ J6~?F.5[4Uv6}#rhs{hp]O 3vɸvP5ͣ뻺ˆ܂P߃!a&vr3|ͽ-pMuzuG}㮙 zn= shzSCߵyћ4\#mZڊR7bz3n5Tv%n`|[8%X0%XU!S 1*ܴ QKHi3q2tGAq̗P2;26uz3K6{HxT)CXx`eCJ +aN/&Ib*|"&[&p%z I׳gxڋ;: as@4G+a;;ll,a/d{RƉb|A7\SAzb2}:5)n7wy.pMu UUkrd88Fd?s[m1&|f! +4| +endstream +endobj + +597 0 obj +3061 +endobj + +13 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [598 0 R]>> +endobj + +598 0 obj +<>>> +endobj + +599 0 obj +<> +stream +xWnȞZzzZ#A -ͪ8G`4gͽ.\&-D +s9u2<\/(8'<Bfp+}x``gF΄P Bwϴj\`;\&"b{tń7LqXd΄&Qkv(budOqmBz.zG#LГI"JkAb-F.mf"b{$ME /|ZvB kAb-F"]Gl-'ۖ:] )k[dEs4@h=0ºǩFY6FuSך44{;8fG?WiCQ<6M(US\`|g0-aM$0wWػ"wJ{!F $(EtK*e~1!=4ermI&1:$XJg3eiCY_U[*d*]l~/OihKŀ P/wX?gTzR'G]Qd/ +e 9z|K| S݄J$()u=h+6Sû 0/7ˊUW.Ym+kRfu3[U<'=oU\>Xm~ "}x=Vf|*l>ly +N|TU?'ZYۺ>2̅=ᅝXk϶4juޣVܔaIWmK)e\TiJaWP1grTqm~b%ل.md|I[d=P/ۿ!º>!3s {?YU4 +endstream +endobj + +600 0 obj +1060 +endobj + +14 0 obj +<> +/ProcSet [/PDF /Text]>> +/Group <>>> +endobj + +601 0 obj +<> +stream +xYn6ShF 8,@qEVn%j!ۏyDR{ Y_8a4&ßS +>zC6lTW%-efD=`Sc]&FJDF=)fD+3!E 6 ׈)KT 6$[VnGb#{-fwiPe<>q1>~"6"zFz>!qFlASoEz #6zu`y<@xBXE4F |{ol}x|J#lL"()tNIqR(Q.e%RHM/*ouwu +Z(4iAS2|p@Nr)/(jcx(H]Jgkp3R%V~K8sQkm:gٓIFUOS#\~ɤB3w7.LXqaP 7 7=|cWCeCe;)]=[3Jw҅e#Q3Jw&zA醽j K6\őnH}ǎdȕP +-Ԣ]<1TXEqR2"LS3dNq7*j'LT:<_.L|&<\VW(H5mf$`!8OIW$lbǬsc~3u9oyng]r^\K~:DuyDppYC/W4]CuuYQzh{ʚuzZo!>9/ /KuQJH1zCVmϰQ +Bi5Hi:]Y6]u󙅗N +<z;$j6T"Wѿ\ aQ՟-88pEjnk^J;rl(nǗTY(S}$yV\g# WUݑ׺iN${B]/p7NEr u}mNkKz +~-\[UN^_m@\w/M;4A @wGU*r`w+TyQ(qysP}vU\뚬j]Ӹ*.xᆇT>t."z ,OK Q_|5x̢?Oe b:7贪6X{3Y !Žg7!뭂 )f?3"0Rj;a0`0DDƟ'ۀ\d91aSͳskS`kM(`ņyf(+z [L4 ykRxx?dI0H ++J8τ$ÆBe%$ xj"Lf8a! i!U((I{=O9;S\>ɸwB 0<^ڵdTDfM}pMw{ vbc#b{nˬeP{a<NצW{8Q&US }:}{sX\?`X" ‰ڠ]}_Nqͳs'݋~ѿŦá")1ߌ?m5a.Cna:h a&["< B|{O yqk2Pܺ'n>@8\ƫqu wWV#/<֔ψtlx=(̋! +endstream +endobj + +602 0 obj +1931 +endobj + +15 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [603 0 R 604 0 R 605 0 R]>> +endobj + +603 0 obj +<> +endobj + +604 0 obj +<> +endobj + +605 0 obj +<> +endobj + +606 0 obj +<> +stream +xYn}W\`Y""k$,kP!9U2 ri*96=uS2ORage:}O%r3g9\$WC(EdO OsLc)G)P +RN JT[ +R_YN:e ̦z`Jp&ظ`Tr`u?F69iRF`Q[(JHja2 +'قI-tJjXds&Q*MU`ua2t9, S. łTM.àG%}^{@r+y+)(OsMr|XQt伱2QX2\'w׮S +N+?r1]}$m̏xl(2;ZD֝#D]C\t]&AWөC: BN{hkW3ή=N K=Bx0{lM5-hahGR؛VCe=Vfd?~vSG&ƌqȓB:`I+UtiHuy Vtj]өCqX\;^GDJVt//OZkfSwm}}&Q~fy߰ejh}jXտ4-uT]wl-a0<_V3~x%/eN: SՇZtxUh؜,#Fo)t}sk)0ʒ!a}2:ug]Y\ |ћdSN{@;"t0N,;<2͜WA(H푭;GE+?^B׼Wmwa؏mJ2&̋-ER +֘sI]!cFR(1vsܛ} c| Pv)_T%q=n7L4z;B{ϵKx8rg&atjHJkOas1]Z 2D|N"qmݙ >}<}9}1=Y&60-A1;Suï=ۀsq կ'3bݱn z@a fʴ.]!e(G>|n[yblǍ g6 +^4fc, +DjFgC?t_&xjReMFEZ3y4fXOrzG> wO- [h"QY8ڒ\aJz.+9-b:짶b$\.niQgT t-hO#.KK+# U?@ /fzC0V\q<*[Xc+YSrPnˮ\NȽFՃdN=o"4`˙b*ƅ;q, +endstream +endobj + +607 0 obj +2483 +endobj + +16 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [608 0 R 609 0 R 610 0 R]>> +endobj + +608 0 obj +<> +endobj + +609 0 obj +<> +endobj + +610 0 obj +<> +endobj + +611 0 obj +<> +stream +xY[oF~ׯGg0/@.6u[@AS#8T\_!g\Pj y\|2E25?eSpf0ow4=D5i"p^Jnzwf{w?lPf BEdVab deA*XJ1ƒ,ROT""*Ƥ[czγDe2s b#4dyP/]U,g@(t^NgG^^IყҞ { +뒔\fT eKɛIMń@0I1^$P^߫?j:ˬϢʊ\YdZsΓSDJs֔\R8Zx"(0.[$ [:DXfҬ +68dy[G~KH\jEKԺL$.$Ev{N$d<yN'ʏڈKě %KDݮ]ޑ{(5_e!+\DdyL "S$rDYeX3Me0LF[eـ<f0^$a [ WVa9t9,xGg:YO0+9Ϙ?bbmLJ&3sUY6`3eGi +qH2Y80ybWY 0ۀ] !g3'ͳct=/F0(;Rw.;:N݅B¢Ȗj:e0g]Ӫ0]d+pn3(`o +D$s9ܚGh4`uh]eG-tE JluVÂNzg3(R-LAQcY4o z"ହLׇ[oH QU#hn.!H$+CUs5xs ٲL]FAFBmK:֤UM&jxXXR}nt"Ӓł +`IȯhaT^`h蒍JrJ~X2c뒝 B>cg]uSlWǑlݩ/j8-C#ތfp(Y*Nt=WZ7_&/9~`T]_4fg'pUM3^YD.B3PyD9bqCQ'9>L po+#u@*/Q3,R70H0v,V؎ξE/ǣFE rz9HdgZX V݈~MnTpn&,y$ijb2zK3 $ ~AcC!J3,no: +endstream +endobj + +612 0 obj +2191 +endobj + +17 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [613 0 R 614 0 R 615 0 R 616 0 R]>> +endobj + +613 0 obj +<>>> +endobj + +614 0 obj +<>>> +endobj + +615 0 obj +<>>> +endobj + +616 0 obj +<> +endobj + +617 0 obj +<> +stream +xXnF}WRd8H/5Y"}f\.ڍ$-Vq}ohZ?XX.1!`" t X + B87L$+abL8̺V<$w >(r].$+aeu[!-8R&sF1 ? c=f qhL8dN{XMsX)޺ɒ)c=2a c}FsY;272A@Ƕ&2±љ5QI.d>@$\xvWs{H0ڊ .$ce<] xvW8{H8zڝ00I &o2c"3,\w:1c&aFtk @Ȅa.kgCv i%n#tvZoSJ}n^8m\]suiP Ǫi R~5:IG4iun^ퟫ[?ZVu~AiִU}AվTUmVtNiNvQ[!͓%2^jwJZת=պAթm6~=Y>h=ZZjAXz VfNǝ (.Z{2t g؂'Û*9Jݭꠑ w&2t;'3{j>]~Uî:K&OifKЦoa,UDbbvPg"f@L# 4YʖʇMO?s-hh cD[K{VFA9t Z]@/^h*âCEnĝ%'0Jt$|Wg5$UHOx{iC*OŽj 0VMN8*)L!T V>DF3Iԑ7u`ȦҬݽK%q8˜"84ޛb]sa3wY{|7 Ȼ%u8fB>eȋ"Dxa;/ ΁yar!nc;'Ӄ=öA[A'}kvs#3J P`+.puj+ayve:Y|O$Do.p*d5ߴhb!e9bxp.o\DXک({:橒tȩ#QRkenHPp]\7L`m9bIr +5I01&ljÜm5 /n}i3 mOgps$!3/-{ХA7:.@г9NCgq9wGdG~}8AxvyL0,dϘb} +endstream +endobj + +618 0 obj +1674 +endobj + +18 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [619 0 R 620 0 R 621 0 R 622 0 R]>> +endobj + +619 0 obj +<> +endobj + +620 0 obj +<>>> +endobj + +621 0 obj +<> +endobj + +622 0 obj +<> +endobj + +623 0 obj +<> +stream +x]Mn0bi.4i.Lm嘽Q$$Ha|1tA䡯Gbldca0>oE(·K7!c**xY%?Rl٧ۡYg)'({QPqʢ,}@;Rw;EPu FTWu8U` 賋 +T%7p@/7 Z wsx.W{K>taw!PLw%9Q),HƈW.A l)NM3Q-8}Pɦ* +IC#IXbMK9gŸȮęk9;A{]ѹ×%z8 79i߁7F.6V +endstream +endobj + +624 0 obj +362 +endobj + +19 0 obj +<> +/ProcSet [/PDF /Text]>> +/Group <>>> +endobj + +625 0 obj +<> +stream +xVˎ6+)&ޒ4A 4 0@6DL$%)~P%M4tc[<>eboiGa (xX/E"ߋR?G1"B/鎬2/^> +.6Fɲ-ZYvQ~ I #WGO2De~b +|BAɣ(RmìgwdhvwĚsE40JEI00 qkܣ57M*iHnI4 ^H#S3 g!ХiM߹. x9ޛmΝuۦJ<gB\EgJ~M aYlc%G62w泌(JVYDu-fĹ^Pxra877I_T_%Mw`eS%[ٙ.@^6S >Sq|Ή5j@5AYk8he`Wi9+6ͻ~(GbE!Z z;Žܔ{7e&/YSNm93-Zй$' od= + wk +{}JtgQe0ZU.x7V{yV.[$g) h#_Yzf/v+Wɏ츓tuz[#PoKf'q \1țuKT-7U>BlTR^:_l> +s6Џ-@ ;kgI=Jޖzg_\Wqn+@vn͑ p%X%UP!YM,#k +nUv?7-Fˎl"L^R ֢Ƅ~ 5N/go N^|pyM p +_H1s#$!=AI&W)r/X=sey#fᮂ4f,A&G7,YyVCr2egqh6>=F$ +|G0ś0".;N%&_xrQ SC Y)cO6Az15 +endstream +endobj + +626 0 obj +1108 +endobj + +20 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [627 0 R 628 0 R 629 0 R]>> +endobj + +627 0 obj +<>>> +endobj + +628 0 obj +<>>> +endobj + +629 0 obj +<> +endobj + +630 0 obj +<> +stream +xXM6W̭bWܚiS$Eи(•h$d?AQZ.=zf8 +|]wi!h2QYW@ECU~ ?k{+idU >d0(?2%r?9/7HЗ*g>vr,Ȇm/G4 ot{$ZL*Q6< oZx@EnxwN0bkX3OtV^4aǾ/Ө[tŠw5H}&eL,oXGy)"w0vF> +Lh,i3_6]mM9ɲMWRvkY4)t)E6Zk\GX[-| +G!ٱI“M|xS!]h iapċY.%;ҕ6zZ%@YS?=1c^[RX(C֞^BrFkq>CJWSrH`鹒Š% n3O/$Q ;;z &aHl@p7nx yΫG|à=:$̉&n7Gtuu?PH{-P9mbf?]7 +endstream +endobj + +631 0 obj +1600 +endobj + +21 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [632 0 R 633 0 R 634 0 R]>> +endobj + +632 0 obj +<> +endobj + +633 0 obj +<>>> +endobj + +634 0 obj +<>>> +endobj + +635 0 obj +<> +stream +xXr6+t:*NͣcHqf)HdL~e )P K_{p?d\->Kq ;ZO\I"%rȍ9~4mqdN=#Ş燱{f:YG&u[&远Q G +gpp9IMes=ٍvn|8:p~ 'p<]p:N|eg-Pa-iKP7jV,f*=9֌S ? 3 Rn`Nkf$N1fz )6f`50čg]:> 11JjԧyѳLkv6p͡~r;9[EJ@ Il⧷>CXoWo] ud᠑ƾUVaG頒\\?# 3ByURY|yi3'TF,oXUd/,ȂAkfEKځaL%ٰ'V=kst@[;Zdp;7I67+yr ;Vh0;[ },&"WIeȖ5bI*! }m 'D*pFJ$7ͻՒܲG+g-ɫR>t#:'̊bącXAQ;Y6 rU)^(-J$SIɉ +(d բV89Andm]6o:( 鋯ltT=Qd Uⵧ;ċ|2  +M)ʛi2#Y`c 'X"V|_R="t:5c]EYN |#ЕՆȲf:˛kmafpAj:C7эv oVd=6}kU3*={罠OH6Jk X-vE!@'u W: +x<| wB3mQt8{*݁1ϢrȢH*m@olMd[π/\l_!iaF9|]{li3W!oTBQk1!/Q˨U1BfzL~hPdv`J W+j}'tUԲ͵\+\lD5fph\HͿ(B6‰DZ1IAQ +x r2)Wz 9MV@/{:lh*+?6D?5(vB0-J-VڪC՚oX v _7DWy[%yZ-ɗkf;V75U"5(83A7t/B&^C]z^/-L=8JW{2e +.B̊j +e生Fm +@j%{Fr oj!CmW/ Os0mfwf6kD^]8]>fӕB}Y *YCnC|b,$S1Lo>_BT:kxAr*%w^q8p5WO0J5T2!!&+~$t W} ta|#.ۊld_!s?TG9;[f%F~ō> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [637 0 R 638 0 R 639 0 R 640 0 R 641 0 R 642 0 R]>> +endobj + +637 0 obj +<>>> +endobj + +638 0 obj +<>>> +endobj + +639 0 obj +<>>> +endobj + +640 0 obj +<>>> +endobj + +641 0 obj +<>>> +endobj + +642 0 obj +<>>> +endobj + +643 0 obj +<> +stream +xX˒6+N scWٵ\ DB$e}f46H54=3Mh?8mrNqNli zYB_/I  <&/$./L/ ,0NlAvAmJ~8jz>cMH E(Y=wF[,zR|B,8I  -#Je`SbGl7XGmΣw^\H\]hQn(ޡ>o1VnpfџJwUѺ G'djqtWo[h#XiStL]%Ns"IutlD 34nbgjY~0yJL͵jabWWX[M}}aB;!ěyϾRجE5f-{ ⲉ6ȹ6xw_ ?1Q59xda0,}Gz\;,ٰ`b#5 k[ǟ{QvTCouZ|u 15MqU5ʊkGij:< -j +鐣CJcߣøҔ"AU}q|XN8X$r@# +'"-+xxu5C7=qHʟ/xs +-~Y3'VΈ iwa+=n3+Fk/ EsMFeǷJ +endstream +endobj + +644 0 obj +1571 +endobj + +23 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [645 0 R 646 0 R]>> +endobj + +645 0 obj +<>>> +endobj + +646 0 obj +<>>> +endobj + +647 0 obj +<> +stream +xXێ6}WqzUI y%fW l?R5r.w4<<c~s?9B&.(,yXo~zG!;Yy{(NDΧTȓx+bϿ^]ʊ4ȓ%!FZtLʭC~x Gzx=_q"D9?ݚ{Ozxw> y=7Ͻ^4'Lq`ZT[FƳ`[%tL˓_E˴YW{r-YIź ^q{ |/DNb lT3vy1)" I#8$U TpebEN5!?#G=ߤ-Y'KKb"4i9!8^"YA _59׃7xҊQG¼b9+g |V.}n/Tg =FlXšt<5T{S'Ã-t'A+yK"'% ٓZgͫTO#!'t/uK̜]\zg"-;X!=Wb +p{q8+Cn'KʡQ͂ŭ'e-X80b$ IH Ib0e#A'jy5GO{/6X$ԳW$sQz3y ^D-V#̉RNw4C Z7Q#Dv5,.`4ۿ +endstream +endobj + +648 0 obj +1651 +endobj + +24 0 obj +<> +/ProcSet [/PDF /Text]>> +/Group <>>> +endobj + +649 0 obj +<> +stream +xXMs6Wt? ԙ6Td2 DB*А_? M}fxvrC<>e$$"B|H(!y@S{ Z 3f%AMi1~4aALٵc,K1$aDq<劂u(\9Zrb#[?SO`w#p'y~UG l,L]Zmn>p,Nds0͡ގ0 aڢ#Lds1i:1dØ4 VW<4_]6i%0y*ֆ0i'ʧaIQsL 3gLs[^ mp{>b)6_ٜ$0O'_/fM=ɀc06GJp-]#7dMF-JI8G0WU$!=B{NZ4;^s(;.Ok"kъNTC +aj$[QpD*y^@DDd%nEuu/^Q7R]j"J $^kN`I~>hL /^bbI (A7\{[}(r >&u?wګ4F [$ȹQϲ-ᤅC/bJ- #n\b\-)Uѝ>\KUDSWiyHeW@h+DsmDijT]KMD %Ҡ^ q4j^$%ξ-5d`)rTf򛺈g,*oeBZaim1bם Rl<h`˜Vy;c3z[@v*۾N/dF^'+ZS]nY:7nͯnenDV˂|XqahTo2TWL=d+$E/ghW{UI#5gYh1P]c jj}{CdNhdq P~鷰|u3gQҲ_3l㻢Et(^zfO̺<+mןQ徂;7_{Qͧxj3?=y!1Gg/Z#tMgnjn߿" 8XőNMú";xD"$UY;`MnA +endstream +endobj + +650 0 obj +1538 +endobj + +25 0 obj +<> +/ProcSet [/PDF /Text]>> +/Group <>>> +endobj + +651 0 obj +<> +stream +xVn6}WL6- V˾e". .>Hb,E܇O/ `HP9gΜgAȽ-9>08~H// A3&,vȾF,m_|Z-l0;/Gu#Zݯ`4h~QgX,، Ibf^2 .q"j#4|0Xя|RZ`a'n-+JHgQƒ0M-*{$o`HQ^ ]ջg[ 9$+W^%pYk ֭kbmUYOs8#{nͭ0B3~ y HNi mUjNhId4ƻ&.d)Kf?e7S]Լ{=?YPtOPbPnsga3xF| MI􆽓:Ж8$ovW7+ +@:d+cj$‰ԃ@^kM7= D]+djrP_/՞|=@ou4gIж6N;*fx K8)ǶPD()9hț6/_iEMh+ 7:n5sn(*zO̠./i'[Yd?j|f 9Ɔ87 i\}(pq/:b֖QN۶h +(]em5i )K꫉J*cu1vh,tRi;}e3D:SMxaU#fo4 O +eMvhN1UU"|!ԩRTޥ,7s7ΗTq Cp\幊' +^nK $bݸFYڲΡ$7rA56xndjS9(W|Guݰ&ll3:Q7f2t-I͸,OƢn\{5%jޞЙ,hx}JrvlJtq|2a#8K&L: Z+5X~H֨!Ȗx~:ybw_qsGfu=~ЅXO4௞B>r:t"ɂOtA" +endstream +endobj + +652 0 obj +1157 +endobj + +26 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [653 0 R 654 0 R 655 0 R]>> +endobj + +653 0 obj +<>>> +endobj + +654 0 obj +<>>> +endobj + +655 0 obj +<>>> +endobj + +656 0 obj +<> +stream +xSn0+7Ŝ6MU=-+D3Gv$ M.3$r69|L0Tstc`DIeBEbz/ `Hz'_dgzDJ SʷZ! H>?dtr>|%tӱBR +R,g<B1~[Tkྐྵ6<@cNbVg!T]wOuќe+ *hwEWWXh?eg- +endstream +endobj + +657 0 obj +497 +endobj + +27 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [658 0 R 659 0 R 660 0 R]>> +endobj + +658 0 obj +<>>> +endobj + +659 0 obj +<>>> +endobj + +660 0 obj +<>>> +endobj + +661 0 obj +<> +stream +xWM6WQ) VܶHSlAw"^hDaO$[ni{Qly?%G_HZ.6?-BʳMv[G$Li +Iqd,/ dfH2'Ic`,e%E+QF<~_P(M'IL,L<NH]] }|@3N_sJݖAm$|P뮖+I>jynag$ZO]ud em1wH湅VQu `M(&Ȧ0cjA *#RH Tg`MtlU{ +Xw B9b +YUu\NFi {EJڭR5%(1Ra Ŭ͙Q,̩3!*@p"J*I&x1'$4E㉶ΒFFv-.i\QDNns{l`=~|惞@dJQGZ8UO.fx磲^+Y&Vz +fu OV*x؅صBP6'$M9yVUx܍r g1I̬摭ک!TnomQZȗrڋz6Mhm0Wq7F௝lW]Y(%4sn_6Jn䥒3u <j\IK܈cU1k5;die-bk/<㩉G'4K.v=6U(wsq{zD`ioK52^)w.ݔiD#O[i\W]!ON-{oufu7tl;g[gE#j öدcG߻ָy+,߮~VjߪQp)(8'FWJyحȷٿ osiOa^4"Yʓ>B%0[8Ae2a.aĠ{NLU*?Tot*WEFyl'ö + Z +endstream +endobj + +662 0 obj +1400 +endobj + +28 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [663 0 R 664 0 R 665 0 R 666 0 R 667 0 R]>> +endobj + +663 0 obj +<> +endobj + +664 0 obj +<> +endobj + +665 0 obj +<> +endobj + +666 0 obj +<> +endobj + +667 0 obj +<> +endobj + +668 0 obj +<> +stream +xTMk@W)foY=4%B(YWbw?J-* fޛ{>EdxGa0qQ|Xn ~>cQDMx%b5o l^7=J3_P(^w(T G.-XyeO8Bi +5ZИUWrFQ?s/ѡ4m*4ZI[skQ3ؔ8%/Q4m#[jY>22[eK0U.s)w5a25}}[ iZi%Fh8SkxܤL& +_Q0ˆS?BE׍Ix͒lnO^+ZF, jmN$ZTUW@kBHْ[5'Kg:JxI<`QtBQΖޤRyY?U&˖T"_Zcok\~!oc֣kGzzUXFI_urA72x`Jj|3 ,m:9uk-iZKW2Ou[@(>>iZI#,e<2Ժoהj0z%fA<; +TM7 Ӑ(Ow G[?ޒY +OG-qd?wj:OpEm; OtwpgAfGvѨ +endstream +endobj + +669 0 obj +730 +endobj + +29 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [670 0 R]>> +endobj + +670 0 obj +<> +endobj + +671 0 obj +<> +stream +xWˮ6+f#iU޴( %d&蒔]f:$%KJMg̜9ϧ?hޥkB6xh;^1SEKd)ǒ", 2Z<0Û +3szI0EEs}]a?7o!SШ WӳNP )t&^C +!Ǿgz䱗';?P*.DVTcf|A+=B#$]H,ν42X%̾qp7!?g)](Ņ߫ V(U2NCcU%^L#0z^ngAEIh{sNK0R$B+x-R\M@-.]{/FB"1Z'<1j`T%0`>_F +x1N$YKAtQ2dyݔ,aq?$u4^\\Ԭ> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +673 0 obj +<> +stream +x}VM6W)V[tӴMa"%K.I!CJv̼*$@ȃn=^8FEn8ݞ0H:$[B[vb Sh* +v,~ P@J$΂hJ u4 +Iآ J +zm_5*j'qxa^"E PtZ# 0yajA;" PHr _~7` /(K }pQF]JzT+2FYMZ j$D\Y`%S5e`TÁoo `֪]E efA!fϵ5Ǔn&JѢjM/&1YVz+U%ӏM9YGL$Bv Ia?A#K< 'ꠠ-`ZQ?6/ }&n$őKW8pٚZf2\c^={!Yg$<1MWCȴD[E'Q_AX5@+nV zY4! Vז€%E:g*b\`$VDxhc NK[|M Hj0+m7Γ3Q')ll:>`7972\H~\=j:ikUC7o8M=V[}x4nRyACSxmƥY$s[\(' q6Ke!(TgЩtcע|RЅp h.(LUE,) 78 +ڹvV{ -^]{ٖk|ˡq quJb<Z9G$oOlp„ٚlFԻbn+0'qqB,Θ ӵɒtWfo8=~wh*,).gOWYWX n$Z \8?-|* +endstream +endobj + +674 0 obj +1101 +endobj + +31 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [675 0 R]>> +endobj + +675 0 obj +<>>> +endobj + +676 0 obj +<> +stream +xWَ6}WGpT-6o Z@^h9ə/^Z:yAL&d(G6693?Q&W XYI Xg^Ĩo^7~kd!YH#yþ60C$c+Ֆ5w@:yb o쵯fJh=g).db!lkc$ĆBΡ|TMC]FoˎvV +B +&' )b%w.gQ6E=Snkcpzs{;1ERMS|\a>9Mp%ڈ^@2FJ>R^CLB9 knά56>jsW#->is@5t1;EI.> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [678 0 R 679 0 R 680 0 R 681 0 R 682 0 R]>> +endobj + +678 0 obj +<>>> +endobj + +679 0 obj +<>>> +endobj + +680 0 obj +<>>> +endobj + +681 0 obj +<>>> +endobj + +682 0 obj +<>>> +endobj + +683 0 obj +<> +stream +xXrF+H \(rUNX+6 0(C'=x.˹G% +3;%xQwGdIf?ܴ̈́D)OL%@IɅM+L ^LE<6qĄP<њ"}!pMYt_v%\iz>E4ȴ +v~LpFQaf#1ـE䀵%"t߽ұ!MRKG#PDty3# }3ƘƦOEșcCwlc16ѽe&짺1WC݋}ZO۬^1o=<^0#*|!pp\(a޻}@Me!}ݖ1(򐲴[<{F(EKT(#pkw 4bڗ=~-)0 %|,L kZ.N Oe"]L,5(⨅K#=N+09M8 Ui&Z y)\њ -5$*Q/Ӥ* N;*Gܷ%\0V;~9"U9't$'Q[46IuuC6h&" +k}jNTG* :mP-?([<7S+0n@y+۞5-`mXEv*H{d1vܱ<Y<ild ܉^Dp iOAiڭsPi"V軜2Kޞ }NCT(3MUoη驥f@8]-6 @hi*8!?:Ƕ+=띫T{qk:/ b3k}v_N۸ UqeY]oBb=RVyOoZ]ָ}586kٓ[eڱMlO? 'Փ9PbwbrȚirی5QkWN 3*OhȘĞˊ#.lj?V'D 8UBT^jKb o*Dzá*UKDC[5cUVZ"l=8nRIEu{q5g]蚲_9nϤ'yy1h} 1/ +u^7h+^,tNq|:3[@ _婫JuilՌ >6sk桕"AcN6uMKr] rOHF+iy xq@0@MV[.9dMZVEMn5լlB˩֋L$XiҴk%u<6S7h$ܰfegDz~i-#_ǼΛ,)[_>5S*l[vVn`0߬9hvD >pwb]Tf"Ca؟5i<\782Fpٿ2N +endstream +endobj + +684 0 obj +1557 +endobj + +33 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [685 0 R]>> +endobj + +685 0 obj +<>>> +endobj + +686 0 obj +<> +stream +xYMsFWQr{0TXJ. E)$`f w"q^@\?vX1~r*>hj՞[m=ӕxɍ3znD1ϝuIyeLB¸JJ[dd2]aG*.b&+v+cֈ#t+*!Q,#32' +R~NXfLNdԥedXƒb#İkd+TW9Z|cmiN O4RtD̈c"Bv+b{!dLlk@Ȍ1&bDN]^WP=L1)YAQ TX#Dv26S 1š9:u)\5b5dZy;sBT'.11 BdF^ j +jH1E)7!2#F,*\/z_d]bԥs22S,c$ֈM,!elbk7jXFfe1 2_c-xXK8KfƔ&o1*,"3bĘ b*vcG1ͩ#DH + ֝)U$A\5bNd'Q`T1,W)֩KedXH.v &Ea[~uCbh[+xF-YeRJ5Z)a0Vn v8*%*qg}ȪES&SJޛ F8pד|yWo7}̚}zlS}>,zqL"d{z_glNOpCN(޸d4^!pM{!wTzsIlnhaUBLp?G ۜY2ش6Ǵ4:MkZ==noqSlfy)7JC[9.4Yzb&p#XJyd.=i׍h.ee'nS@ Øn<}Nqo  pz%[ߥ|d{`[L8\K?3AdJT6uye2o'P_S( +UU6t7ih|Xe5>6tTKwU~t!cڃw؇ɼ0߀'G& +g0#r 2vr~ӧ H:<.۞.J=, +endstream +endobj + +687 0 obj +1861 +endobj + +34 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [688 0 R]>> +endobj + +688 0 obj +<>>> +endobj + +689 0 obj +<> +stream +xϒ8jM++b^sBGA e=o;9GScU0Z2]ՠZw裐"Tx➦i3Rn ۲I5irO' L)`:s;Uc!;_/s 5<f~+sc +_6[n+qfנ0 R^,?Xžj#}Bݴ +cSZ u@GTp$h@2jӭL965-pKʗSԄZH-|/wCz +A@0'^9~ vLk~eWZXrU"*H- *;i3khrS?1OSG&Ǎ}b-h6gYB}AŝdK_Al` f!? { +endstream +endobj + +690 0 obj +814 +endobj + +35 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [691 0 R]>> +endobj + +691 0 obj +<>>> +endobj + +692 0 obj +<> +stream +xXnF)xLٝAɒ8Vy̾QY.KTkC9T+T_VAuWMfSÊH6ʩnxT :L:̨LECd3IrLdG|Me}+ 8"]KTeLܯ2^t\ecz<*R^5Qv^[4k CEBݟ +O%SI& D}n>HJO%Y^djXqL†Ǝ<Hz g p5i +|#_Pt":U˷#UU./QSaf J#m /ML_wf50##Cd=7dS9h0SH-KX :ۇcE2(ڥh̢,7uC %w[kp@5|W?5D QKSQ̓Gt Rn# +>Eo`M\ _\jld=m|14 (i*[_a}a C(E[n N9hbC$0qRrK.vT Jvn;6!  ;k%OVi)FWv~jryo_z3w315y)tguW^ެ?=_կO +H_%E>6ñ=cg)=TyjO_sv f`wL:޽/S{;m{>~*+0{ˈo~ivO7H@p?W5ݗ?/! +endstream +endobj + +693 0 obj +1372 +endobj + +36 0 obj +<> +/ProcSet [/PDF /Text]>> +/Group <>>> +endobj + +694 0 obj +<> +stream +xXn6+-C_EP tuQJnZ;n{u(J1Uw_x|̙9PIzYo}Eڀk9ֳf21PV:0Щ\bZVX)t9~ i#O3 vQW)!Hǁژ&]RU0"awI&]ixv,%ӅzZ>wKV)]SfT\*)9͟2@61Dq~nGrXTҕi)CmJ\6JtoZܓTk1Ciyv&АQr +$` 7gql}ϸ Βp`=t7UP^5kQ^wpL)9B6emɏ!HChXJgsd #7҉@ NX*&j N!WF6:K=-@ A2JBC]tA JC +.FO餃 ؕړ:|сHx_a*39g726®kTu_FI\~yP-XeR&۰me I.DM#uQҋ&Kfm3<>3Sg +D_ƍ 7+bagIˇ/Ros5z̧{zXXj~h)/Mvj Y<b/ ZC#[sa&mpCHEYOR::}^A ZHͤ.RPѥF &[]&I:}84$=Nf%`+p"Ya>vYm-ʼ?Mv*ݥePTw[ѫ" xR +s*#(1zST|.,M(-3R.;-N)T'6ܿJL<B~/<oo`X[l=GAFpvI/y苤<Ao `>ɐmEs2wl4q*4LnBwĥ[FC. oSRqjdoUW|?0yonz~+>@^(<~ӔwhG\Nj#v'RLJSIzH +Re]%ě_?>v;A\x>toM-!$~{'mb{ K΁=Դ +endstream +endobj + +695 0 obj +1282 +endobj + +37 0 obj +<> +/ProcSet [/PDF /Text]>> +/Group <>>> +endobj + +696 0 obj +<> +stream +xXn6+L@RAď E[qcG.?=")ʵI>H[Ub5{㝌vH)]Y~RV^uQN]twfdUZ +L1Qʦ1YXS)y#y)1]iS{ٳن,F֌mF٣E1EÌ._^*0I>aDuEdXKW9{=R*bZ>]KU4T,""ƊE22̷')GZѮF<-G?̼OϣwHJPI%RrW-~OO̜ k$Hc јД&x L2QNF@a:ԘqNU:XCipGi*5TG6LilUſ1Rm>!!IXgN>e7kj&UԌcyISuc]$X66]H>nq螒4buȧV٦('pБ25CzzoQ9(Y|l;<\'iS +D$HOE\!IZYtc"´"7Ȣ  z'8N:$u +g +DHAo)qLn Ǐ\՜+P OI&WuM"0 zsU|E^ kb`yuqn^ޕFɌ-j8L*f mRv-rjuic +*ZS͎&)f߲o +ROFg1ּ6Jn9?EżwMm*hU0-k +E.N8&6H=FIzfSNAc"g5n$\]AfZ:1;˩}u--[zuhm:028R;x-OFWNb՞xwVG¤6S{R>rC4bt"yĭ__֋u,Zv Y|;qWb,9WJ^'شNlٌp/mWxSGe!oT^5Cj0J]T,v^}s-+|xHchd>3߳o|0|ˡ=54/ 3ۊ Wa2CUkG1ius_\|.3~~Em+/vw +?/ϋԛbu|բ Ӱ +endstream +endobj + +697 0 obj +1517 +endobj + +38 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [698 0 R]>> +endobj + +698 0 obj +<>>> +endobj + +699 0 obj +<> +stream +xY]o}ׯ)E'8]( +h %$~fzf8_8s;4+(O{@fu- 7`(>%VBeʈj(4RpXpKʋFD/)J]_Z\Y \k˜(*)*TXJUSeIcN'$`m9.df$YiYX֭RF(3D[&U4gu':e,`2aUYV|ɘGyf -y,zBr31YY~u*R.Ȃ1YBFKYӲŲRš)4, S(:G$9b0#gNŜ@ch +9$!C@2# 3bez`뙲+ً]0(bmTۗO6`YYG,g!c/e*kY!%cY0汬#3de8NW&҅J5ljcI ÁF֨BL1b0#gOȄl$a4S hX&̈ey 1<[{%{Q "& +2ҔK<`cYYG,g!c r24mކ2uRzBNvqC0v|/ir1ŗ ]oWp oWTwzG'7oٸ;@YBoqĘ~Cf])y\<磨hH;xG5Hs:4z4U8ZOWcA?64[rdWpؓv?v8".C3v? 4oG?l0NMk +o@}趤4v@ss<!wC4ntߠO͖5-0];HUp:AiiWmyLb! $Θ:vlhOsa4Ke1i €?qUZ[+ΪJ-A}^;kl#ms[+yJůdl_w۸.1^jqɠ; 4B;.JԽy*_͊+`!Dº/RpȞ,yX'DF[ń1h@iAu*U)V5`3 +X:Xϐ2J}ƾ`TK33b +fSep&pI? T\Z +7s{̫Z|3,5*۩ʄ5qlu= & Vg߅d=T!k1uTPB^׫X*)ŹmhFv؝tjrui.㻣㮙H.?>LjЁεLoL^@J(֥acsv]%]Nv\ .DLD3BQ1*Kĕ|){Zl1BPcyBp;.?A(JV44`[cZ_I!{V~fP5 ͹M C#vx0,#S$1$a21@ФUK}N`e +%=qEԃ"ռJI5\P)-eXiX|z6ǂ(JN+xw +-V@Q~ 1!Ki`KF"D)_/GVUw 0.d 'Leљd]yU! ,րu/Q".4 zor6E[˚~K=yqKmE4a[lU[Lfg 0 ,~){2ֻ9늧O4ww<8É]w|/bpGHǗ*\*t +0-*I"^j^#b!R 2Eդg3,zX{fm'_\PW8-*iBԕBR:Wu8>[ 쩣q>@~87ֵ][ghWf)SͿ8PSom_0>,Azt<S87s=5{rƍ=pLL?C7oHzfw`ι+Sk|i~5tk?w tZ8z._rm.I56|ͫ> :qBL{v\6fpQ{*e::Z\{i׸ +îOA_;oD9C9X`t1 ÿXe-Y +endstream +endobj + +700 0 obj +2485 +endobj + +39 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [701 0 R 702 0 R]>> +endobj + +701 0 obj +<>>> +endobj + +702 0 obj +<> +endobj + +703 0 obj +<> +stream +xKo}n.H6HAδԶHf~TE=KU]G7==lj>U+KoFYR.܉˅#er&֑*!L^vk{Z`2] Vs-er c}En0"dDdmhs:oJs2WI->Y(XU.@t [(́P<ꓬ(^*BĢb)"d5Z'dYo"?j=,Zue +GS0Ѿ.i#?1 )LdB0s-e2ƫR&Ȍ&2"YNͶ^h7^^)]XfP.mNM@KP,OiJsfP[(LWuMBFQuBa[+N펔JHJa*PN&"32RȰ:!s-e`T֮&Y|ȄȌ&2"YNHmoR=,݅btUcN,KdXbasuBbQŐyʕVUF-KdXbuB?jklZRҋF׈&2,/^H4f ÷&Y|ȄȌ&2"YNɶ^h7^B &.+mR1+UR,52lN^U,32Q: _Pl"M5uNȲޞuUKg#e|b()6F$BdFF +Z'[99R&*-a2!2##D"MWP (mLM`Jܩ}b>62lNNQ,32QYomikEŇLbFV Y-<>,\7_>N}{yKwennt;kr63v8=6/C`Ǧ^۱̶MΧ#{vH4lni0txu{Pb0{vņs^~;IrLWs5B? 'ak?@47'Tk븾(\J\hk`ROp>?kp;Y:~WPBZYY7:`ȈQpZZ_7@kޯn#d%Ol!4'ovœc}W Q3dv:!kX ѵ} W !{Z×\× S??_ Qڬ km*sT{i5heahnRº?֟BkڹKeG Kj? ?(ƧǐWv0xck6U|2uLUa*>ds} \81v!l~8Roa ]VG4\*ڏ1oGv +!،C> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +705 0 obj +<> +stream +xYn+jb`ݘ  M%)R(YIl$.{Ͻ,dwU[>gP˨tE)ˤS"+`UV%_)&3*PʳR(C+QXUu b X(CRLI@b/X!C@4,)̀%)s "=}gB.20#&J'2J>/`9{@Xyۚ)b1,2氤3dYo(9.E*p9^$0:4]G&oӇw]Tp!Y:$<Ԟqh grnK&5yI׏&/zSH i+B +.n^+e-7 u%l|A_Y+%~N%7+_?ԗd&T9}Se 6'MzD^~77mgD5Nk-) 7&Lgѹs7ͭFE 5j3t=V.G/GUCϾ"<&>~E&8w{r{DBk8ԯ-5i8moLjNEF:E|rYx^4 ޢ$ !AjIN_}쉑ɺywvگZ1MsDFG}-yt`kyg{;',LzͱnG+wCs>~M!ZI;}FZnjLH]{ +9 |p8.h&ȡa3;;õszI37LӍ$eƻˋ)oXSi!Ud%_\krfZdAȇdKO%G~$aQߚh$\ f+/q=xU3ӉInOq!4Wl&-a4S="y +f3/켲Wc +'Cԁ="s}kG[[\q$_*0`ʔl3#.H6C{:oE6ٶ5lvMꗡBls<0htyS]v^2xgݽak2qF=O{ +y{dN7:ܲ6o&vsżhFp=+a;wgJ/t/ Dl~ūd S=AdvB`Zdυ=}D31fc1jϞ E3R_%S=TQbJ*ĭ|S &3.l-v i.VRUqò2Zxh֯+Yh֌|mB- /,dWpfAJkHk8IxJ9~H4Az=?;#kW w 3nE}^ No@nFm֛Ogl тjA8 +endstream +endobj + +706 0 obj +2022 +endobj + +41 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [707 0 R 708 0 R 709 0 R]>> +endobj + +707 0 obj +<>>> +endobj + +708 0 obj +<>>> +endobj + +709 0 obj +<> +endobj + +710 0 obj +<> +stream +xYnF}G%p,I-LKb<3Ԓ3 Ϟj*$O]z̋ݪ)O?n\q. +, u*>])M8E!$Ź2YTcN-dj 391U4iXL6dJlJ, מ!&躧E=}jhHB5C/kBAY<2@^VEDL{d XaeYR|vx)y<2(b% 9[S*Tͤ%Լ(U$I-^:Ȉ`e"s.jOH1"14GyVTyd1euԞ!sЬ1¨.&,6 G.%9buYQ⏑|ZdaXF̈EzE 6dĤA1Ɇ ր!ѣe!3D]'Ms>1zzC >ZS||߼9CN",#3jOH*J!dr,b3dηkP5h6TAɮ74M}}:-;[ieC{=/oדr,5PL!RLrڔ"[O9_qv1# nC?<{;X٦ovc7Ndfߢzɓzg?̠BYSVes맇L=  +:S0pD] q`>ք4xd)&aە@/B0[מ!&<+bJaI{'dC@hkQA{AWboES$Oi,ϴW:JOtFFW\\su<"go݇#k7#\G`оl =l@^'y WᏘeqrJ<9xY^)pK׈gW>S:\_dOQ +om{ܢfaќqKe85ߎȶoTE:-kSOwp4}"5A:B#ƚ4ruCGpWRJSSf@+RA{@ *@ 4yvԐ,I& fz/qYp7*!An(q&2b I"yim6vj=`9͖Re?CfeT qUQ&*p#T+ h 4I&(Jz$Ӓ9sK2Y(Jpss`졶>eŬR_!b\6ͤ˰zܵͰEeKL2]+eNtTWlۢٽP6/٥] *!tD5wwf' vNYmE_j#ⷸ0Yno= +endstream +endobj + +711 0 obj +2455 +endobj + +42 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [712 0 R 713 0 R]>> +endobj + +712 0 obj +<>>> +endobj + +713 0 obj +<>>> +endobj + +714 0 obj +<> +stream +xXn7}b84M˒ Hj6EkҌsAOOfyq'r#ƙaaUz8e# dž'3~*)FZZPQ$'RUq 5_ZFflKSˌ \Kj +fD x4;c/"@SbZ2{ 3"f#X:\ oza%SDGTb#2QlB(e5a/B% +DvD)DE,(#X:4x,Ҝ:u.kᨩ9/kUYjeb*-91魒 )dNX K3}(SA>$V:3}H!sŠLX!^ *rAY7RwXZṬCMb#VuRq&)XX$ԹT(6bEY',G doH91pA2R F`ܮnl~q!w6,MQ#_sf1awqC4X,rqVX޷~?&/oɯuOͣ H_Vy$6'0X]+@;ťx/DZyqQLq.=sOn ޛo#|;a*.՜?CS/hXƑ)7Xd,*\:NSf#GY.'*:,V#{ĕ0: +\}&lE2;>D5|j2Eud/rMV)Ihz3UM@3Ӥy2nju[5c>P䌫>U/ߥ?H0E |lWjTE8z""믨87ZRn- aؖ8АL+l xuck +k`:^*ثrʴ5s&zT<)0\J fɨMA`}Ȳ5b?QI7ʪ+tJSrP\}BiהK'\hpa? +n0;)#N?;I +R +1,i~Yylj;F `.4/fB6=\q}_ح?vuۍo]LH ~$#eC4s?z怂񒀻ɞ1Ae BۀJ8mFjg2 F1k$^p3 %Ƥ*\5a(QRԉ@lzQ5#Ŵ҈SHB+SV)9Wx>gw~ 9Fj&U9I5.$~ۓy#mo2t8 0d_Nfu >)xL2Ӄmkh0nt ge=ǭ1X/ .Ya09JOW7]A_+; A¾$-U­/1}KViw]mdH( /J>6R x7!y +endstream +endobj + +715 0 obj +1786 +endobj + +43 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +716 0 obj +<> +stream +xYrWrIp?+H4U*%m03M @Qfi?9@?ckdsocXFh:~˧O)ӗlnLTbcρl9u+=ٶp +9g\̏\fytۗmSx1q!sWm߉>!3L@>^h lin @ N38 +j /9SOL0Q+bAoݓL03ձtۻ_(%b/ FϽi6v6 wU3rdgcۙc^6jZ_Av.Zr:%LAEI,"G)s/#}qiUVȈTxI{cat +l8GvxV6"EMd/y6%-H)/wJb-M4yMН e$ܦ:+ei_P`r0xH=z L"+ẁ+"=#eKUF \Q&,R^{D"LFމ睠]z gwYehQX#lI:;.b*˅g1s-Roͽi3_޵DjJ&XN{s6^x? E7?|ȸo~z題)Wh`"/< I`=̷p_8+/XV<Ž&!q)fNUnv>1ڀ%F7ba͹,D#wCy4,\bi$U^*X@",F7 x,?Cp$`unD^0ڄ*P{+i5^"naF +kwV?T0rˤk e2x*q RqbΰP (mZ2(1QrĊi„C*"s=L7z<,&ҍ5^1dm=t3< 3,8~e?TPe +B`g(O.0 04'ʙߪ\-"wwW05+ /WP5!fg[LW|mEb:2hk};ٗR}gr|bߤOHޟ}:I2 =S5 /?iE +endstream +endobj + +717 0 obj +2353 +endobj + +44 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [718 0 R 719 0 R 720 0 R]>> +endobj + +718 0 obj +<>>> +endobj + +719 0 obj +<>>> +endobj + +720 0 obj +<>>> +endobj + +721 0 obj +<> +stream +xX[۸}g1UŻ LE[`l]9[r%9H'yrB~ah٭}Wp6zh,R$cTiwҙw *%$"ҟr%ruebD_G\3c UR :x\]=vX<lds$s{{&0hYc#2؈Y+0kGH1,:R{lDf11oǂ՞=Bvccq%xJ4KRF6q;uB7ϫNꇍJzs9(Mr$S#UNZLQ{S'YΆ` $`yO)Gsg;PHFCS=Btr ƥ"*w*kcdǂ՞=BrTTHJI,v9!]$SE*uJC4e*R|kN"QGFr:w;\.ܴkEcmm>_nE.]rΝ'6QG;CmMY {L+.kQo^IDKxR<";XόH\%C ;ôtqS#{1[`5aO^,h: +:xǰOy,X#D{צx$+_v~=Ap.N)Kʖ$,zl̷' +@$^-.Q&CZJw?3"n +T!)UnVŰ[v5>hዉ5;7 ӡvc_zb2:rp$%lX8;vO]_#s֖.}:X^mc:;ˇ7U1H'F=U;qvmq\#{9b;ލcq60~9!9(E< nĺg/[[!ݹ/ +J#{Tl3&ڌXv|gsl O~xaljw{ee]ic5R˙+E2X(_0yrߛca FrxZ uůccM"۾!MiO# K8LOxml_/9^-Cс3vƈWg&?? +endstream +endobj + +722 0 obj +1958 +endobj + +45 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [723 0 R 724 0 R 725 0 R]>> +endobj + +723 0 obj +<>>> +endobj + +724 0 obj +<>>> +endobj + +725 0 obj +<>>> +endobj + +726 0 obj +<> +stream +xYˎܶWp9&K <*Sp? *Y&Iɥ"\Y@L * ENY)E6T ݅+3j)"&>c_>ЦJ̨CDvQ׈Ѣ%. :-8?]`?Hi:x#+yZ2e)"fT+I=汕"2gVr1<11oQĢՑ=AFCS|*2ʂRB!En+2!(if)JeH%q]=AbPa+6..<  +O*e^FesZXLYS9O!|E,bdOS!cOHfE"SX{AS!= !zɡ0JsP_^=+xٟ *xNs. +$%7%TB +.n$! ßqV_f7q^RJ\Ak]-%>i{- cG9%p23.ղď/`ь@a;1>\^Pmy$@!Ǿmk f73éiW[! "/sے 7yOP}4d'3faߌVeGgLmjMWCDhtDV;f*.<'RLU2"^V}2]ۏyi6Ll.Sc]iUHϷdAMP* E,EKd<`RƲ(Kya WЧq1C9Y%u G(`Ձ=ADZ +*sGR!)nm$+i-Q̬uӡ\lUͧdTBfj>#r4mM gKy8vw yNd~Olj|n}4ӗU;/QaCs57&ȱ5M57{M˳M7Nm 7$,G~I]fSe4ԑqol qcevS}y5_?o.L ߝőKys4ӗnf|fAH^wYHĵWZwf&}z ټͦlI,J5-피nZLˬ\5-,sDhłѠ'R' DD"ւ iERIVĒ E榕yJMo5oBMb8OLh˱?GsƓ۵ڤK$`0E`|QDDsY + 2"L-0^bdA*/]V0$g'pE]hQ\ ¿uJ/M@4 B6N)fm{:u+wsO{3v_U!VhQ"~xocU Sh_!~5c~#yka臯8Gid1KBNS ]2slmsS\ c/;K0,Xf'+{&wYCRgRQqG*Xi9ewav_T2& +)Wv睸^:2|`/A?ˀ¥Hv.wƯCL vQK E.Nt p byUaNCIQ춂?cL.;,BagĕJg*wwOZd3Rܙ9|@@p2ԫQorxb{t iZBWƒ@ +endstream +endobj + +727 0 obj +2134 +endobj + +46 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [728 0 R 729 0 R]>> +endobj + +728 0 obj +<>>> +endobj + +729 0 obj +<>>> +endobj + +730 0 obj +<> +stream +xT͎0)XbI +J!$5Mv1y#٦"z-IBAKu 6uBwo32x{(ϋ*X}8dӀB,ipEe)J4`v?5husDvn/I h6|,<30yҪ9:Ƃ{q@t~5Zl=>xݵzi~ֽ)AAPPP%8 +\K7,!r;m\2hʇ#&yr Ez.^L1r|%/ު!S3˷ɇS߃C ~$>m;P"5*4СCCT`r{eQ O'jH%Y2^P'h1[/+b NzzWPim,Y8,)lOY!$-Dǀ&,_gm$mglA4P[aE|s<LgψyA뛤ԻEF_@{.s%^Kԧ< Eo"J +endstream +endobj + +731 0 obj +568 +endobj + +47 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [732 0 R]>> +endobj + +732 0 obj +<>>> +endobj + +733 0 obj +<> +stream +xX[oD~ϯǀ*BHmE !hxҘ:vKK~&3dnNV[''}̙pNj=b{O%E/7Y^^,bŠG>W O[}{I/9H+kCQ= +<F1Q}ǵ|>ި(d=؋B?`K/R +;-u3H+3YYq823$:eQQi!b6@ js :;> Ͼ+N4־ =gjŞ `T/0^J82N;^25B/X̘)SVDL`шwp|L~EAƴ?#$bt͝f__?W;g_0-Z S{8$Gp۩>Y7ÎUY~bmmjv|<[ٲ˜5%;$Ome(cv +L!EYʶ<}l(KǪD1lWEsHTX<.yV5;d"e{wm:LHՒB=fbdeQ/@::;dyR`Ƕ:!}Y5hHg7Td@zVP{X{SYI;ۂ 8饱Bt~''"ۄ5毆4kn{Sg(=b'|{b? `g?^1(_7偲Vr 5_bqehMP%5Խ;OٷWe!/U3u]"rg y:9KͳˣDqgvM^`_(KM=|X(%H.6)X s')NlW)znv`դ^ezT_Ip n*5?6+6-$yIe>]ϐf 0k*ˆZOݛ @aS"8bi請SR?TYWV7iO5Řg*D:ǑkG6" ĨKḧ< b,{LLSX>l,IS,FShCgAŇ4L.:)_QYRj}u# |[r@'oEDdO Pk~@Ho+aHzp{8VQ26N uC:zwP"A5B R}Tʠlbq*Ml_M5^1q1'x.4Z P3:\Є+?7ݵ."#U;Q[WM//B*x7\eŅo,7Eg:& + 3|x!xd2pG&-t%Em08ϳlNpC*:5/ܠH[#]w6kn4ܠ57 +==lb=jB/"qm߆=+$Ća4P'gaaY84WPXÉ#`Q @GM8ܱ<ۘ9<<$+x c/_O;\r,5N4!FZ,uO*Nx&5 _ +endstream +endobj + +734 0 obj +1804 +endobj + +48 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +735 0 obj +<> +stream +xX]ܶ}_e$ +N[@>0`h%bIJLIMW9s336!O"rO)8[ 0CCDEfnj&ƞ@('e hu!PZCrhhl٣ghP~49ϒk2MCH҂O2(f 3[l&"7eӢȌ%q^Gb`4"ٺ&KRdcо׊YH-N-p->^Y $rٸ`ׂ,^Ͷ)lo>犔+U{e7oWvI$㏠n&(\$4KE +?,)yuv&(g$sby4zPݪh3iz4̜3 IUd$dAv h!FG`ܨSvx"ڀZN؞MՙƮ -XFd;rZmrLlڬEnW8os;[i^<[3KꝭA՝ 0^pfe069i_L+)7e5u\1H=|ǎ/pN0MPSm*ZSFS 02]JN d~"Mi(0T7zV;%7Z8 i,/RO' 3~ +B+k:W&s*z;c=ٽTWh"r$$9BW('GZ0bf0^^ A 3JPݔjFm93H3k`n7@ءeWkTY]3͕hWg#LE[RvphRp+u[|M? !8 y]Eދ8mPí6Zs޵q?74]!9y:'pW\@K] "& @蹏~4<9:Ff'zXsDMr d9B .u>|8CZ0.-6neS;HWFpWN|M71q=-eй1ɒzV+5w59̝\ hǛm> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +737 0 obj +<> +stream +xXn6}߯S8xhu<4m(J]eu/{tH(6#59<3sf82CM3:,K7/6a(YR/Ә DcLd@K< f}T0LtQb5`c +Eɉ4dk +Ƒja8qXCgH`qv'ˍG} +xRPxҒ(666^H <iͱ2L939Ӛ9tki/15 AX1s5>O-<*rZ +;g~CFCPHtn^QPynsuWWe[3t~ňJӫ_.uxh&[$uvjt!Q/>fo1*rnyNѹSeQfgVQ{(̃-xpPm~R{!k^ Ue,^pahDFT]MY 8OyC/.`ՓEUDmCktݠwWA'G> c1朮^cE?f:<|jP'",8_YCBZ˙8!Uq])B2VJ>8;GB{P ,H~j=CSx"*28fOTgW*02 2(\!_ܱ)E׸acNõ͒TMre.UM!@.LəDVg7FPǾt_MpЇÓKe7>EX#An+TV^wZ4\5LJ B'%ܠxsdGVɀrjU.Y{o].ӦbP(k9bS[sS'E)/ijZ=yɹ|RP+w3uO6}3gsH8C|CЍ2e ك?C2m i]EnXfkV^U~^~z1_O]ۮտmOV⮐Q!\` "XQGgN yo8#/"e8{!I6a+NwuyNzn5&Y{sAbcZtʻ}fF̉7 2cK~D{7ƁGp$ s'FtҪUe%=yQ њީ.om }VBx*֘G.d] rmN:v#Y +0n_HVP~ˉ) ABe ']q:N=]\yz)X1k/H B (=TvUqg3:wifdK_{RU!e ^up-l&l!ƅ7|h$v eu +mI~ i0v7q44>p軃*J3:n7.0Q j5s\ }pk9 +^sba܇x9J!4i'~'Hw G+D{k3X~nu-4F4 iGīa2#}=} X+_:cxY65n2 +endstream +endobj + +738 0 obj +1768 +endobj + +50 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [739 0 R 740 0 R]>> +endobj + +739 0 obj +<>>> +endobj + +740 0 obj +<>>> +endobj + +741 0 obj +<> +stream +xX]o6}cH(7I(Y X(WKi~fP"Gvs$r̙y=mtSI?f "J5E"W O1&q.\)iYXFk w"S0`)=B,Ɂ&t +I'7BvfCKd\$s;Ev1D"pQ@rWQ<ǜ&1NaK!Q<a:QRkFU%J,#E<"="&7ʟbʵWKe-iEYs;c*ɥsbrcDa&,JL(HzYVĘ Yk=g(̄EIX2/=B 덲+z2z˚E@"FCI#$X %$& t3{ =B}@IU,RN4ASPm~1(a|TmSof =v蟇={tJ'ҤbҡO'ؾˡ鯙dϯiOjw=;@Nܻ`خ" Gt.en@`+aG$=BL tdz0u7R (#y6JdoRp{c8`̵ܴ9{;*Yk2* eӵ~SfDOP`| -h==NPDw uzqy&?ق>O"FSHUAȽ~բ_Wcվ~ws?Qu,Xr5M_5pnC؂ɱZs^ƒr7r%Ls/_P9^dI46y<!ZL _na7]'sRwޱ+?sQNabu\譜V ŴFRDeH б'Cq@}{ޱ=ⴚC> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +743 0 obj +<> +stream +xXێ6}8pū ع  Xp$[ZqflR%J8SSb3Ƚ)]Վ1N~dv/"ӕ"4F1%TFmJDIV15$I6*%)d^h$zѕL/U(9^%e{eA&$u0hM\>/*b^4W$q~O "EF,i,y C/@Dl"e3kG/ZGl"60bG^ɚo7w@9~AGT󈓻|WՏ979wR5=i +]z`Iߜsr}s$wĴmX#jEO^m<Ԥ(+ UPwYweڼ>"_?U٫=p.voڼlzNneSSPv$35v'`ՙ -M Ngʈ +!IQI-v+yPIH^׬91hR nk 1⧶ɇ&ݐ ^[NTxsdC]GUoMAmzaӏd92Y 2&^weqe6mlf}B<4=VA6tZEUetsdTKyA\؈v925EG—=zD 5&ͳaDYeM ĭͻrozK(,.kAd|:P{|gkcYZK)mW^S@*s ԃ=Z(xlar_;ly-yh)35zG9.ql7#-{Z`M88z +a{Uv@ع`48$NGrzaRS|4ӌX~}Ϗ/=r~9qS83C@1 j0 ˠލ;8JZ>> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [745 0 R]>> +endobj + +745 0 obj +<>>> +endobj + +746 0 obj +<> +stream +xr6z +,~d2qNvZw醖` %ǏEߧ$p/dc* +7J#0񗍟]3cW*|T\W3I5*m@%_V%SSDe D_1ҘH3kQtnO "k%hKZISy gyQbEʢzA\Zʎ5{^~ƐH#1JdBf@4K2[)B~:7@dBRD娓zAMzCP\U0C_qcW !2_TGk(*_=ЖLVZ+5 )YQȊEu7fޘd,gdqsel`o Gu$%Vf b,Fi"d,7L$۾op+&|o<8op }78h:Jfa :ʍ07H}DVT>2_T/Zj-ح͕a5$R#娓zAx:_aoL2Twe!Jd +@ݏ)2X1d2\@۱I)3XrI z{s %JpN9\̾ ё_^N.uo5%ݎm=\5{ +lI)fdA7Ͱ`PL2xeQ8&LPUYlf-07 U0(8*dӃ2 +4LZkg9rI .i2JH$xngzdqT㾽Wq_M JDX7ݚl}\wYl+:iυI'PR +0 +&ǭcBTҺ@8 ƨ zQA3VSu3ᨅʴeuF -\kbL3O-YXaspq83͟oʯݶ'bA5pN4W5ސiYnC]ɓ f[_o̾t?!Kmc&kf!hBK6zihY1H8$2tnfmfڢ O@WaddSrGMaWu%nUh +rpbw+3UXYk0p.srpwT7(&.N#=/J締w>*9Gi9S=(n +esja9ܾv67-I~Ү}ӷ>4‡1u?~ϾOur|iS 'ړm=i5,@29ȓ?~16 +WQʷ$ĻnoZr_~q8#] #3LyR0t&ϡ68FI )W.~QOvWݵKE*Q9J7?֋omK,5cX%B*~j`LTI=p3f󜸹{x9\ E38bH%x쒊; oNbG5}n_Aþ3!w^ሿqxqtWƫ#}zUnAo0s  '?4UP ˘p4Px//Xe{sdik߀.^s?+ niO~6j-.\Bn7b7 |kЕ5E)IO +endstream +endobj + +747 0 obj +1794 +endobj + +53 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +748 0 obj +<> +stream +xXn6Wp7 (`uѮEQ eıh$W$g6ESS}b{xSLT +hwov2,GM ++0!?* J(5֎"a.JbHXJ&0!J׊dXb1#{O*F0|PrTZTU2'H̄J2Wt%Fɉ>D9aEb&,\)}z)uW%DqP,JP>3HXJF!vqW\9SlNX::߮ XH9+a$Gw[{APV oZRRBZ2a x"$7^`ww΃|A 0 8X{=zNh_avޢvFըk7EC;ES}豾ϟc +:"ڈνׄ%Rïf4j+Yl@ OVbS7>p v,TDtA*$jū '$׫g+H!È;m7p[m=غE=,3/Oh bD2zuc=f6g[*EAS|GЃj[&a2Z raV sOJ"(ZNc=*j"TNC{moi)jH`o?>-+kUPP(ưyBm?]h#tƎxEըšMLfPώ-x9kPq) 6ZIHA . + +s.)LXJ Хv1qM@ÀЉ3\h%-D,{j" v!7 %[YQDlyJ-n$1Ŋ3"Q1Z),5T:Ux] DG3u +ZdveY}Ⱦ5bg{h*t"BȕkI{q^T.?@C?Cۛ]nߦZJ'f߶U4ESwmסu6}#X*n +6v{90O9ΪbpźiN0XjpkrShzf{Dk=?Zh=l?ӻp/ch@8Ev[r&[mߖQfr]0ۺ;q>BneScHʿh UUoNԟF%:ۣW{nn!g.?G7vo!Xun0/~o@|-arSot|=Cs 8Al͊$iL +endstream +endobj + +749 0 obj +1474 +endobj + +54 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [750 0 R 751 0 R 752 0 R]>> +endobj + +750 0 obj +<> +endobj + +751 0 obj +<> +endobj + +752 0 obj +<> +endobj + +753 0 obj +<> +stream +xXr6+t:1'Ad2ؑݙ2CKņgz. R E'$T.{ HDrV dVB OO2hZ.:Nv +xSKY.$-1D>V48z:̴mW?ޢ`{X]|kus;3\v{#tdۡ,!p@=?ۤ;3D]V#iղf&Kی 0SzXYKa.S6h ?28B{}}h&>lPcZ6CZ&-#޲q.ѱ›2mb&%vI*?&`1mvau"\^a55uU#4۬*4+V_Y#yQ$kPp Iڲ|ϪDG|.r1:r )E^}{4Gٱ2!v$%\aC?bCVGV{$ ez C[.RSu\E,XDOE'ϞY(.zwt!Tz5uݲmdnlх RK/如2b++Q%XX3-bqYbryEaz۝ߋгiWDfO9+qe&7%oϧкwXhBgU`FjWZ}ZImD?$=(\,pʵ\n\6ȷ`mnu Fj3(SZi,Yfܻt0ƀ2}pYu85!(o樇Qw)XYm Wx' NkI7GNg|o+Pȵῇ-^&N"ASnɘNh:$\YIP[Ѕ7ᡛVQp@~*p :5m0q_+D$n8W1Ϲ|=$ּJ_ Cq)Y-ۗMhjwd|v=IAӥΕ6TF8087`~˧S`>F ~PlwRg`H.Zḿfp|.WPs7MDg=df6ol1 hN!?䴘R`ם݁;]hN1KQxfc'6[pBz̪aiMFe69A?9zd_EAٗ=m9׈Yy=5i{oC\!C_3bPA݈ +endstream +endobj + +754 0 obj +1680 +endobj + +55 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +755 0 obj +<> +stream +xXێ6}WqS$DQh"٢@h[Yt%*MOgHIn619;7#Mo6 K/76YB3<S(,%,]˹, 9 ʲ;Ҙ$h1O (W s3rnap8f<==8HLƄVN&`eBՎ_؍v`jj6)yDc8C3[D%:`#tu`(&I5~A#r b s7#G%vdmIJSo8 mg)60j9:p9x 0 UZ횽 ^DME[-M`/J\mC o #٢MꝨ1Ә'(_4/04PisePfO"$UӄӴ^{%?78|WY湍& JkU=_AΩmX..Z*Wⴅ?xm`|,$,.#=}>߃Iuutu4b_t&k={K^> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [757 0 R]>> +endobj + +757 0 obj +<>>> +endobj + +758 0 obj +<> +stream +xWn6}W-,Eч4M-]v AQ5"me7A 33S?l|2SIP=|[1Wc!5{8T㕊HjHE^i9 W^Ro!Kmڦ0P+73L3ʵsIRczIȦR\`-`.Rd}F"0cmi*3ٱMM"Vbd=Cĵ7]U73T 1OQ%P,aK)2,vi KXbZ!>]yE-/KHX¢b#İkdϐoZ@/zc-ˍ),h)tD2ˌ 3D\ Z 9o?gcbX"̈eDllb1qrFкbdJS*Be1<Ȟ!b +CS)-uRB X#]#{~YWm@8 9 U{(Myz[}wHwZC Y]4gr` 13f Ŝ;EVy[<ՏsOdӅz8m>lsz, ]#i:nڑʗS +$lu3yln؈cw[Mĺ +T}-acN*y{v8J)@4J U(j\ݪ՗ +ȓ2qRq29#Пڲo$(ũR=%H3"7wX+dyD6U6 X|vMwEvmC%ds7օp[PU]76,Q8G=cbsm!̵ݒU[~v6KdW SJ@]۲Lo4*.a3ryIAXC>\ke\.'/s}]8aoui{|> ;nB߇~q)!wPynږ}<̛cׅ̀ìp4򹙞.e=q.?y᭹̱y·;ְc8tپ'abip82E/ My8vd{ܜ~=4$*=A@نF:&N!U- +endstream +endobj + +759 0 obj +1146 +endobj + +57 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +760 0 obj +<> +stream +xr0~ +BV04Mp@x4Q[cwghUvw:2!We ELh\v<\P(ET\jH-xK5AҘ%1&( i%j95vDO~ϲ24XCT6Y5je;ZY'J~d]{޿3;5A{%|8cA]j<"jK3'JXEMSc'}&;)#:;:Z:e8o;9(#mj޴euNMnblSxp=g)]~ɚƑM`|0&\J]gGYb{c3.\$+F 0g˷ p1Ԋ 3I{?'Ap +r%?P +o'SRSBu.vw J +C@w`SiS +ĊB__9+o +endstream +endobj + +761 0 obj +884 +endobj + +58 0 obj +<> +/ProcSet [/PDF /Text]>> +/Group <>>> +endobj + +762 0 obj +<> +stream +xXn7}W -/Cr,KE.k[..A>EgvI.WM%rvp IYU$dt|ph&&JMUt1RҫKKCg-0#+gJ&b$M6YM( lSdB`sAe)1_i9CFVk6Q +"{ԉEUz{j{X&=*@qL1{T,b2桵d}"ҎEdXXQr֙@.-ԒlTTI21[P6VGг6DP/cEe,wMf/flPo SoZ1$XrF NbWV/'zv@YZ']P X13 P,abKEjcP +2JXub/atZgMUVQ- CKgpSZUWۖF}4uV9*gˌzA6-y߷uwe1B-^H>\TN(1]OҦ"*R+8cy3{JET*AF @TNP7wh1[L q2qw?|D肼{\f!TƘMiN7d=¢쭆(SB2PJ j}.Z3!r0Wb&cJ49d Η$ͬhlIn"Uu A!)}o˱;Hڥ|o8`G3{2(,e%H#JKj.'dJ6/IuYZj^ĨK\I엙F%n=$` ztP5mH~bRŔn3p𤮌uuuUCMA_YϕםwKYa5&"+٧+7fj[5ڤت*:ᦔujT}n[O1-[(n!>˨H-}5iJ朧LQliYLFa"h1jJBmWKBnIC4cN W/u;JFn|{H;epeuب=O %;9pC\=;TvJtTW?.o6xX'>5qb{Z.qc;?xjƣ9=wWck>]z`rߝֻ3T#6)ty&QdƴYg\PuPҔ]E*\z ;)VKW҉.}l_5qڋ=J>VnO_3x=oo+gBu^9onſvBɒW͡{{Lw `k܌!PAVZt9.-I%sa86=4^8x Lnv{s9_n.uJ|)Yήλiߕ߲~_.Kb2&P9/$i4'\y@/|983S#Q L={#̈́-D 2-t,|ǩ]l!6K5l/ĬYuDZ/8Sgƫo6vptՙ%^!7yu?Ay}/6 +endstream +endobj + +763 0 obj +1653 +endobj + +59 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +764 0 obj +<> +stream +x}Sn0+)CQZ)Ҧ@RJ̚"]ӕ(>RƄa/kP,+maQRV%0K+\vQ3+IҌnRihElN ^?xλ7}\^,;g9 +:[D@xSО{#|j' ٜ[V1ayR]?s|HY~fL +endstream +endobj + +765 0 obj +623 +endobj + +60 0 obj +<> +/XObject <> +/ProcSet [/PDF /Text /ImageC] +/ColorSpace <>>> +/Group <>>> +endobj + +767 0 obj +<> +stream +xXێD}71_"E<(Bz잝fma?ڷ!jWt:uu)qlЉa3*r(R {>0SyYBs/͓^۹3xe^x +/ Aq I Lr镬,$udqQ\;ldAi[YylAb$)w-M ݑi>`wf\36 +M|&1+bБ +ݑ8M2Y\%+F16y4'tGηov g#{ap}gnGYi{RvΝx Ԧ[v'U"*Gr Dz;Bbt(Q +W2a;UT9NaӀH+Zb@ue]TC26~o)S? : V?(J4;"M^޽xfQ(O-rf_9 mO ߠn +>GJZ!F3*dM=D'=Zv@7FMF\=\{K[T8^mV4**.ZYq2[5uJ3%1n*m܀MD]ZV@l3-n$.a2Hye) Zȅ?m*L/m k#X6cNҾ4Ӎpj\T~Ёz=HvJVB'[o[m dΪ rin;+ʺUOa|[6(O*[h,ěr1 r&jl8$kN +lrN&.O3[C`Z!*D;Y|kmؽ2ly C_N@ FZ6y&Re+)}QaBo;{?lh*CG)t%*~ZFY%4kamY.h@P*;nTmUYsxfuCL77B@q{詴!rةfh`r ܟ:EMFt42UP$EQ5y>pQ1nBv>#T ÄlejlN%DE1$Lk}8P~:sR90add +nB܏~6k 6w+x`ߣ X&Y߄|wy +endstream +endobj + +768 0 obj +1754 +endobj + +61 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [769 0 R 770 0 R]>> +endobj + +769 0 obj +<>>> +endobj + +770 0 obj +<>>> +endobj + +771 0 obj +<> +stream +xZKoW +I{ڐH#HatYqڳ;>2TtW,g*ВvWJ"'> msq tWbeaXcCz w^ +LU[HV)^菰R(0t"+aփ-d彳!+aYDXqYe=dUzwjw1BFX@jD+汄<02TEVt0%l1T%CD$h #e{,cdad5IgȘo*?j_Y YLi]D?FQNʆ` 1RêzF c$+K/HցB h9 b!̈́1b\3$fY3i{gzP{,c`ƖFS0y,OI =GޗF+U{,!#%5ad5IgȘoZAqʪJymT=b4=0N汄UkBFSϮkjΐ1>匍1@aN}]\~6~mhխ5Kmm[݋Uۈ_y#n~t3P+!?6XlDuw(~pXm{~6boSh`ipckSw_^]׶%7[.{.(a jgC}o^9i?Rڪw9+Ur?b4Z?j߈ϗ}iď7bn>7 fn\LKG_}ً0rʤl47jBg[d{.Ww#4DOhdE<}vּ$LXG׶PO v)G;ᇑpE-Dt`I/@59 +׼8cy7oum hd ͍r^~Dc%8 k[}+s=);g9;iw&@QτO(о;,h 掷E + GI: hԠs31PH}#AB1a <RGN-zF"D,McoYLEǺ7fUo|brcOZP !MtUZ6-*$kZ {5Z@lmt̫t"+a&:T/0SEIXE:r{A]N03eY H#]'ŃqTtCNZp:C۲IJb4b/t=6mwnw"'huM(䓉4+D8AoFhA.a{V SмUY:!YE85B,f&7lNYQq$j T2{v0?@c.nA`NnQ6v-i, 5$sqY"M|a?iֳ(C>M'̗Z:هkJ  Vil| ͦd61" EVlDL .qQÔկ*:dǓkp<N$fY/ t(L!*8nb`^?,y|YxװB]*G%y`V[zN!X`IWXv$ z1b> R|h7/źeDZfX> +ӑP kJ-"X;t*YҪ,!낕X3,EH+:X]KE+Vg 9;I_`q=ϗ_{|=;lAe{^|]^~LWPJf)hǃV`G + :lxcT0i7!ʘsҍʕ9|Lu>&eX3ĞKv;n+<)T4SEC7L|OWע]@o6voߋYiPxu*_%m~yj[l9bx }v,P1_~D> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +773 0 obj +<> +stream +xZmo~b?*r@bY}A@>$ּLΐ7tJZ|ңgg]e;=}J'Ltjc1\)6`ak!i1^S +Oke2Sfi-mYfB`J9{$cQ`żgs@v7121ؽD2{, +LEM"׉ޅM<|F/$P)}"ŴKx#$Rl<4DZSшMTnG^{I89ep8?\qmLΪG"=|xy1aPRӻlpH$ǢX$!qH/]D1噵i~S:Wc|*N1=B"+1YEHkb2SlXڱGHoB i l%7`߄fuUWmga%V0:@Ŏٶ]ES[W%[C]m}<ohn ̨~.MW]Q zw\r8xf` *c6 J`Tq 7*(b3!㘤"` `(t ܨ=B@:YLbTvQWV5Â׎=Br\Fk0f1:  Ca' +N+3n1ec`BΧ0͹7K٠( Pr=|'nb1C͛ 몕ҦSōCdˋrpߘ̹p@KcnizėU 6)-'H&͢F :#0y|E \K o +7H na1gZZ +, p̧pt PρYTbj8rKZ;"3E1hcNfm4hbK ez4)l捿caSPoEO/>O-?Tk8&R*m{j: gUE~ h b= a:3_T/szxF^Ne|Le +su@B`f 'ꀄ닰\ et,忤Xn=?tQ eOv |n1?, N@]S]^f-﹞ZxW0Rܫ0QoSpE "Q Ә R8+*¸n!4pMO R + cpuwy{#;zްVIIϋ tc-"sqv97G<4C^r:~u("qde{TT(P;6EaAi30Ȟu |/߁rb~@ϜU)4p[Pi'qi35j'#!PgOy2ZrH_|h\C:=C誢$u%?COWY JɒG+h8H/q u7*þũ*z8o` usH=JvXzl?7p/Se.U\]S8˄$jP\=nԉ <65L;O_=`s}˗p5xO18]}=tY=*/{v39lxK +hRъ^'F ,vj_4Ƿe|G@gM<"fMHU&պ~+)33x#Ⱥ7B-?2ILˠBPUDY7ܩQ +endstream +endobj + +774 0 obj +2252 +endobj + +63 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [775 0 R]>> +endobj + +775 0 obj +<>>> +endobj + +776 0 obj +<> +stream +xZKsWQJ6~dUYRN +sI .,gݙY`첈8t==Ev +|dOd\phVZ !+3W>1ݴ@UIs0-5vFD&Dd``HA=# 1+AWbи3tB+:+a݊<",,H\4^)?F7X'%ՀxD"bE,b襫R^{FʈEl183[YD,"E #="&M*+/u XiY SS)*t(HX!LH^^ "s%̺Ɂl%Yf>CB0V"d@\zD#"Ftf1$_DLRG'H# sY+ qEdeMX:\oe-bZZz;QmKW9)}Hi4iMHG  +Iɋ fY59Е! gHHf +aV,J\O2z$YJF;w.F,aT^ EVF0QC.kۇӈIF(k²׉@zx Qrp+8syft{]}ƽB*-{޴o)Bҏ7YxH>tr= +^WA0ߪ2ߒ1ɡBWpfRdĢIgtyn(0\2,ZC` iZԕYV] {nRIZ7֏@75\4$b5 W"7U^NDO\t_WJ]XįژӭWgLaO:3r8Y}&i|l +tbIh 4OACǻN?\8# 4~Ga`L?Ҡ&"8AIhmg '( BrP\3b2W⃰#aXa6W3$ .vĞ4< g_#&ƓlEA$:ZV)<axdmah6լ)sɥ0 '=4ݡdX_(#aRgO!nA;VwV$J)aa3( T.-:䈸i:ze[/'m + +qUbψ\  ّ0 MfjZϐࢳ& #I^{FlzI2UsQ1B](Pmvģt)Mzm}u횊]7nVݿֵv:bnGh ĥmf|6Gq+c,Wi>Ip}AY0(|+ bV%+c" "c1ĮAe*:!Jp%N؈׊+*Rv".uܔ +mF%O,c+TE~TH4?>\xe lHv14 db?z=b)h:w 81Z +*EA¿)8sEnkSIq.U$k"N#a0 @ LjV%" +y2;R琛I!n޵ .Msj(L'9yS@8pKF=F3=!>"l> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +778 0 obj +<> +stream +x]N0~= +$v̱Hz0`M8q:>f߈T(f> l:ha?JͿb6,fM60Z2P.AAEE9ٶ!m|8!]#.Կ^weϰwL G>I_.!@ |n +er o 2vp*4G"(~}{DT +endstream +endobj + +779 0 obj +214 +endobj + +65 0 obj +<> +/ProcSet [/PDF /Text]>> +/Group <>>> +endobj + +780 0 obj +<> +stream +xXnF+f.3! \}EQ @ASņ" "3$g8GA@p>}CW )3~iHUILhܯ3q&5Q8ұsrLDfxɓHXBLE0&XJacʭl%=J`qĔ0$3"'Yce8cKwnN68$[M:\M9,l>!Άliس;31I-?xbHsF䌱^H`Ks&=@20DJˏ/y|؈16b1& ӲF|Y#˚+b2 F԰ʛf1^^zIVHy̠b=%wf鱀Qz$N7;{/dϧc1MŜ1*2F])1_^zcC)r^mVO~-"`7hǼ^zN"缦1:i2anWooc/ݭ?UWJo?Acm E/')9 0E}l_di5h'X}nI#h݉]=92oIQc0*Zc9eqMD:! >orr*2UTy%E}ђǺmq(ʴC\z YAQYEx -NGgQ29>JH+]]}켬gL X>tH;d@p&jӐck;2sկ̒ZV1>> CzGP~z̰v.*IL<C&Y5){RТ= 8(g.!mP^%TS&I2QBr)7SB1|%/kq#H Rn(Z]~X0]r<|)TޓoEO綮v$nC4v]'x_KI|qזYjžy, Be!ˇ/i:0-Z\ldś/lwA.睷zh'ݢF4j}ȳbwӐ)^oPs12^ |dC^zA /g;gK#c KJ%mٖM?G,k)A20T3̽J#Xr\^aX(9zm}w>hBaZGHay M|]6><}Xu狞ot,kRI)lQT=^za{y1P B{_DܜW__3yCi){_ J^+o4l*{cAɰ˹ wp+l˙J[~B̫q  +fY޶}ǡ޻͞ta\RW4JV0 Y,"PD8!q0F"H;u =B5#J0YDَ ^ǸeyL$adC 0k/}B5#lȐ}:Aȧ6T+ӂoE}H3h}jp2*M~ܝF^xuCʴpWy#i\k t0f[N 3Rn0Fe,JGBG̤\אIօK4w3 +endstream +endobj + +781 0 obj +1738 +endobj + +66 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +782 0 obj +<> +stream +x͎0y,hdFEghfQ($n!?U,M{i[SI,| Pᡷ}B)#kMaVs REo7*ffxJ2@)'ZO1yO E"LvjdP/0FJV`z!gz{HbIt"~%sErDOzd6'&G ўiiX .Q^"2RԯdX`"K1ԽK*։J,0XpYtd=o= #R±+P[ia_&v|LdB{!)۔J#x;!OwUϰI(hi/rq&,tUM'n`,TmQ kp' j,o;j_z[@wo|<ֵ-QuI'XK7u˞)wPh Σ{- CU} em(-CU^=Y(W3EF'yߵζovLt[njղa`G>wOwRs;LEW2=1]16Q\xf(e\'(p18~Ώ2>o>B +endstream +endobj + +783 0 obj +625 +endobj + +67 0 obj +<> +/ProcSet [/PDF /Text]>> +/Group <>>> +endobj + +784 0 obj +<> +stream +xYnF+j E @n'Ϊ8d&K2THL3Hփ2V X:UM~ӷd@:fMe,24!~C)丞"!P, BLD GJiҮb# $DIe@`"X2;7 )6VÂ=bm(6OI,ޕ3;<Ðqb#˔.#6#͘2Rx.H[Db)Q, tYDlLfv=roS6xf +B+|$e]i"1y,7͵qپkZC6WI٘֒DFBN2t8ׁDsO,IirTjG^yΛ -H=HN.u9Mx]][#!!FMOyUkMB4}!"bQўrUFyݷj,?埴1WƆͰ ·UMH .ڶv;9Yos5Ρ;kC>D [:%%R$6K_ՆB'9*Oũ`x9"Nދ݉ü)ɱ~"Psڙpڷ IzSl֮*^6&ɩ&ߞpi?>gICcY "'ݙZV*91ulwը炊n&۞=Ǚs-,5u-u]f1O&~n0v6aT?sIJ?h9@31@߶}I ~jPb[j3-eO5Rg(愨!㣹T$g;p燻{R`N!gLk K|aʓ?<>aSU"<[`Χ +endstream +endobj + +785 0 obj +2040 +endobj + +68 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [786 0 R 787 0 R 788 0 R 789 0 R]>> +endobj + +786 0 obj +<>>> +endobj + +787 0 obj +<>>> +endobj + +788 0 obj +<>>> +endobj + +789 0 obj +<> +endobj + +790 0 obj +<> +stream +xmN0<јڿ<&6#̮h(&Ų +2̯1B]%SO=5F6(2oDJM^EkL|/ulWl 5KW۶=%T)T H}BV/?NM=O ¤R ^O#~!ޟS'BM,HyZe, H W -Herr痛L;a]᰺ؼb<N1b%! /6ʖC+FEO`j(<0@g\1-b718x +endstream +endobj + +791 0 obj +315 +endobj + +69 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [792 0 R]>> +endobj + +792 0 obj +<>>> +endobj + +793 0 obj +<> +stream +xWێ6}Ẉ[.-&mDʢ!QٸR,iU#]`W9gfH9"qO}EtP/UIQH~ zaCYqś3tb>j(%5$AEK}&#m6gU=垞s} 1tȁEA>N$SͨOwW#ݗZEW;  +L]]g'n*YnRV./3\>MG$)הgRS(Y?.g~YZz.ĚybB;jboȮjjOXgi7v7Y -AS}ƟT@C\<އJ5'{!kKzVN _LXr}eETPg]:׬@ Id%tJ$VmRVvQUqĜΨ J̤fCjEwt T |ߘb3̋7yT%5e)S*SMpny9#h +3mH^f2eiТ]STQP*4b%`Bmg*urg0T n5b5ĵ2zC oT~JH+6Ѓ7r1tF=i!EecK2}GAownQ) +:XKIZlQL,QO5Xk)2߉XϤ,i|&ZU1o+S稔  +4=JZV%~2ѪLcr T3t%Q Pk}.$uZ'=$M˾B(4|8|CS&.b7fɶg|&;43YIrqWMgJk9fk)0,N3uN9at;*3p2CAuh_EϢ͡/\b1׉Ǝe^hn>sRj@pcQ $4h1A<3jo{EfYy(vgtqouYS nN'UK ]YE߿E'rl +aX + ̼,%;B}ه6Q,}oMFf=b:!fQЍ9773'K۱t>Hf>N!LΤ́n ޸LIu +L;Õ сB(rۧaG;Ň +I텞L^h"] $i )f^1oE-X~G 殰~8©v1z||{G}c/Ksl+zqR lvIxQoj0 326C{ x75`^opLGq} ngB +endstream +endobj + +794 0 obj +1553 +endobj + +70 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [795 0 R]>> +endobj + +795 0 obj +<>>> +endobj + +796 0 obj +<> +stream +xXm60q1(p**m*!UĻ I,ӱ;ή(BJv2̋Gpf-4 +G_ZX0M8V2!NpJ0a@qD\ǘ3s30a?d H" H ճsE IϨMՔcj]POd5Rb5FCΎ\䧘FbjlIX:L+s0 c&vQ|f\I6 w1 z:2 łdXi-,KΊF Pg{N:D8Q{}z){UF!x#7ބA*OcD-֋&}l]>--~f#xáM4 ’rNv=;QQ5:dMzSn +*/`ԈY_e81L#b]/}/uErߣlϚU!@)e[#>!F%B)IpȂX;]1B XuQͭ\j}7lzߊhECWErxy-fLU`)| o&sT&&oJ6݈^g7%N1'p0)ѹK a)<xSqA{y~B U ch4&t 鉬KE,ʁJ4 +|'C@#ZWuv;VuOL`毮>F<֭"T)u{Dm)y]wס:sCXBy)e77 )AL) eziw@UWZ+"Ca"C4^{~n4!8"sXS+OQ`+?71? Νлb5-7RvZ5*gEC)t5l= C~,V^fmK;zxi=4=F +]prL./&3َ-< ++,Ըi(8:><ɑ8B%aFgТc$A2ej $HcY i =)#QX&V#,Y[IRM̚}pdP($1GC='_.9ӳ/$~桱ec֧PQ>dG[m yÈ;IP5ݪgR'7L 80+i7Tе5U~?w ]cL?z2^` R1t^}kX`uf_2U]ISs;Tzp7%I}na@M; +Cw ^-f-NQgkyع |z5& ĩ9Mc2I٤P]kPJopbT | >Y;Mb +5qǼ>xݻĮ#śMVpԣc/Uo2U#M/LWW*|)9xAa$(X۩15l,J =S ;28MN<2רBѷ^OK =5P0$2|+pS7Dw\!ִ~/AQחW[% 8]PIf +endstream +endobj + +797 0 obj +1711 +endobj + +71 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [798 0 R 799 0 R]>> +endobj + +798 0 obj +<>>> +endobj + +799 0 obj +<>>> +endobj + +800 0 obj +<> +stream +xX͒6 )8i6DQLd3ۿΤ\d^+W1{%iz^lCB!7:|6|ib"   !i818$Az'AÀ3b1! MȎL "^@g]EHu#|=fp>c0],1pT?dF:jcd=&Yd.fk9ḻF6$s0hF:,$A:ӒPt٘cmIbO#1#~Ƨ%S,αndvh,L{ӆ-{Y-CӊϏ/w+N_L>>4< M,Is1`BK QHkEQ2 љL%ԒMd!a48a=!sL F/LF322A$ɈҬ-MMn3fd0(SQ,Yd16Hiblɦc1[A0fd$X3,C26HblLݒjI m60Bt],_4U՛hqj1V{XM1{ȶ.jUZ/~W^ϒt2aC>t6"|GZ pd=~ UXD]gvՁ6lު! c݋SVItl{uM{P=wPS$og~H9=Fufř'^oeVmV@9Ko WE08zˀY 7VdRuxvM"vDj&hME<]u4OU-EkQnt˼pBaD=w_ۓ|wb,}áa D~j˃P=TtJE_..b[km\U~ZZo,M{2oQAh)Êe&( aWvtetڦsh =h,*8υCAjVZ'2W ]gq*Kޠ繟7S=#%cg8WqD,=rG#Mq`0.ѫ 4l=CS[gFXyJaշ|eD1ڐTX@cРoUn}Q,{j u3*mНGy^\Tkh$^ F . j)4o7N QEC'<+1[sjTR +endstream +endobj + +801 0 obj +1742 +endobj + +72 0 obj +<> +/ProcSet [/PDF /Text]>> +/Group <>>> +endobj + +802 0 obj +<> +stream +xuVK6Wi]DQ,=$ buQE([Y=\㟙CO"y47BǍ-Q^:)~|o(aLU0JbFb}.^ o4J>)J^*ժ˶Y:ATSw7 fÔ(7ek[&Ol2{GUJëҺl= 69|lsF-ƈF +KmgB#"/4G> +K>!sPߴjz?C +cܬ|&Um|TN3F^5鹖U5rLfHψAzIC6Z5㆜(DPa .#}g~A[O*Qi~ÿ# λM 7q_9?TX&pѺ]c'^Bk`=Lp<W-`Cm0My>GEUmԊTZc m5ef'|6ԧCx칻oһQ1Ք3JxNȹkLa+e9:F0v#6Δ ;C4~,HKL$ T͇n6@ t4>yYJ9%t $1&t }$R&$ Jdv%ӘBDB†a䟔ք>Kkвb28CхpZ3QbF &:b'a )wl-R&ABd{wS9k t-"}`V_M7W<)#PPvnpl-X>K +թ&S\)IDkKMТb%+MȚ1~wtzk]҄4GXN +wl*R:8{N\u1{waP]s!R;·Uk8*܆8񲓩#%;`4v'mvͭS߿C}C /8Q0K,P._phT齶 +endstream +endobj + +803 0 obj +1082 +endobj + +73 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +804 0 obj +<> +stream +xW͎6)iV")Qʡ@ɦ) +t%Zmeeѐu5AߧC%f4@ 437?$[+<9U4Ry"vcJA +/ Ii:/~^/}[4frAxG.?$@]\2k2}돋7nQIL/iEhBL A痎8$K\{z V)0Ks$u[u z ٜ]<#)"]JFT5 C`ǟGSpl}U:}@"wU B²'^G`12|w[8^5(,UYBuy\2٥,L0 ѡ gHM UY'`,7 I<#luA'3(佬jTVRTiv*]&/doXMCՔ~'u%TCFU[ª=?Kx6+$pXPL"R]diJCX>a]&S ѩnH莲xc@33" 1m&+VQrL4p!8)TXhln?$ĝg"1 'KIgbs+el9zG1KS8T[Tӛ1ߝUa ZK1j4A; +O{ H$` +y +3<5 R`gJ#9 +W7 ᆓ"\aOoٙW 9)-.9\@!g9 eMNuOظrج}xh7X^lbdau: |L '&}lEZl ?=oEWEwEI,rD[D몸7<%<JkLyz_u qjKV)fAJɶۡeqQxs8ֽBsxG4a{?pϏٸD Ceș>[zkti Bc)Xh y %#q|m ,M˪Hr0oSii) X +%;ըVUתP 4[b؜R> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [806 0 R]>> +endobj + +806 0 obj +<>>> +endobj + +807 0 obj +<> +stream +xZێ}W80$^ :p6dy1p$5% +$>h?(b/Pakx.ɒveR>'@O?tO41 RH3X]eYH'4 +yWV =Ō@a̮wˎ\~P7OY9ْJDT9ߗ +DRHq=X?qjS_dTugnP.ċxD(5-rMXL_c]9Mn` =_+ ;)̸Bcܞ:>uw,=]iPX=T{gkd"2uT6'"6Dyذ}Ud" #U_MYz`c{Z4D"$d"yu\4Vd\1$|x +,.2\;9=et!3Bk +cs֋\&Rjw؟},OvgvhҊkۡx׽}~ñk.rSr8u}яS9|S #h&R$,grRb&諁X2c`[°>񒰏O ) E!L?MkTXwfEEF9:ۻX+(2(ByLHk1k4C%YR0NfB+$)X y2WI90(\I. +:8\^W[V{(ǵ6#nᦴr~cbrww^WWu4[$ t}|?ͦ>A"gj-I4jtbԘ#$*CiBѩd^! %)2d`Y4|сaG.ȊcGa'՞= qZ3ΒtA? EK^dRR&fY=ug)Б&2Q!Jep291"EP9hi",煓#$\91¸uY` +:8d +:Yv"n h-y5 x'̄XKtzC5<(Xr2 *Jmu},hlBS1!* +y&FLIF>~$"JaK̄WJ ~DLR= ir!|3ca'՞= z-bZ@ +c¨KbЌCY;/PZ:5`וwJ0m}@$R,d +U IA1 炫ˡ$5G\s)ևAN: 9[`c}kDk"& "hDɏ%X[\ܽ/?W4#k]uW#uIPf ԎH;rۢ3FxQyf `d1s+B=Jyz,rk[=w!r5r?ݭ~n-edžݸOo6SyjFU]Fc$G4<`Hm*0ڶIʱ$\~t07\xv U[V{>.L)9냋o'|;T;vwYR8=$&Ulf\$x=7I9Ic&UtwjuבםL=ƎqgޏޯE]]..}fG2ù);#,öZ)}f0@yv,W/;W/ϻ[r{{0Gq='g̘U  =63vSCUڗX0{^?jt#BW`!a&~jL#}/bG~l h@o!xBxʋW_t cwJ"-f5@ uAc_`Ml[}oS_#NZIxWf~g??z` G S0c_ջΜ\1 +endstream +endobj + +808 0 obj +2702 +endobj + +75 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [809 0 R]>> +endobj + +809 0 obj +<>>> +endobj + +810 0 obj +<> +stream +xYnF+j G#=2q5M$)R gfSdUݒCF %^{$vXvuќ{dʶ7bEV'cN.4V Dzc[{p@< n2ܴzf1Vm4r]@aˢr0:ĩHEbevg2\r9VEVF0l;ea`Ŋ|rY|=;î;!srZKFcDžylp$/=0֝fQ@h}dc~>{#W+f-rGq\ U5H;%u~4)"C8{ 0' 6hD&phw6Ah OsO&Зg'$ȓ0aN@ĮI OQ3:nyFk y +5Brdv曋;!p}r??W/ kKK~pj<;]'sCoYDD^N=VCJX$_R!9h 3"@ o#D0-`a +gS;]vي|lc(aG]{<כE֊x9J\ NPgm߭Z + Lp*۽}T)pG7ACq6H0ދppG*P0|pnQ3:pGk] +^Z/{yfẙs%h@obOa<9(2JNs I2JH;;!އza<0<=#ougHg ~{'=K #^"/&žʅ7?VR +endstream +endobj + +811 0 obj +2134 +endobj + +76 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +812 0 obj +<> +stream +x[n$}W:شymm@ A`<Qk5޹3]gRK#lbV?ͧ O]4Ze_ΤTſ`[ThwI@뮕ɱS! l*Lhԭ76ZH P[LG`:,et޶Ay B˛ 4sC | Ra8z^ʪjtFONyڙcNWt +) &)5t14Ɓ@i/1:9X,&FtC~BD_J } 㝕 +Is/M5?lRdzD"GEzDCƉ. ?*r]6 Q>Ґ7 jR5ٵX2*^65Bѫ> 81YTx*z҄+2iܤzBVKbK2Z$OD`I*fZ2uK< DǓņxl:'jZ4ѱy/ڊNHSōq)b>\ǔ؃W/}3MG5G)Vj>D\AhcyBdNQ|ZȏUŅƅ0ފhg!7 Ctl*sQDi|3,O' #R)sŖuQ^LeKZ|1nlL!3r9hBF_ZAlk L +ϏXۄ$ GC_T +=O35g 6а+9J[^L5j'); !u-OUiydCk♝C>vP^>cVJB~(ۥDS7붙QZ{?a酣gΦ +S9ް^ I10c"UU0tM&D&b!gPlXD#jbgD&8N_aF8c?@*T[ :I<ME `RBzOJeO?Y_O +jwWf0;j~p \O/=X*Әqʫv__ Gͳb #8Y39)}u ʙE`yj\?iGp/҂z8xT9MQ]\<VAˡyz|s`z^5%lO=CsxKqe{?9b?<tݹ{@_e}W侂V!eZD,_yvTkf$BiŻ(k~P +LF1Ҧ+Ke +0hL.ߕ%: +\C$RSѳ@pl*аbo!f7L4뽍J!Ե +F:ҩtv ]gu|ՇGr!_*4T'_/_I .y4v`e21y2U C"Ŋ]H24y&XQ 23&SEὗkڵ^k=JݏNp4,V[(`O<ƽogC+aݤyƧ4Μ!";r9$p5W7 ~8?4WAUW#ۺ1~EXK-7j?nϰev= {0 yN' +endstream +endobj + +813 0 obj +3465 +endobj + +77 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +814 0 obj +<> +stream +xWK6W+QZiRiиmsW]Z9 )Yh~I3=fi䰪"._ӄ_-VVX*#xI"'cF3w}Q9IheW?oW?<*%/Yz*hZ6f>vZVi["{bԪ%jO~}Ew_>[1<#1 @\z_zs+K^[( iJa( kUĈ܊0ѵK` Do u{KGԤE d0|!giIHN+ĕϱ3`yPGo|F btXk)M2y(׊ rz 0xߺ8WV?7&iD< ͳ4<g8< &$ʴ]'J^p;h_(`KN^B L\]+`鵂UVh*`#GvVwmoF)YL̀FᄅJG}5XA_FZ ElhR,h4,x:vm{!G PƳuZZYv1%)p@jwA X荪tPCA޾4! c :x$dz~q#kO'8r&_~_U:e/!wl.7J?>E4Bѽe.b(@"5Kru[TetZ=M.r*J3%|IY6b5=ڮup0Hr3u;m1W kމz^GǗqc,M6GpPZQ,iYOn&GWBĕƍe ]E3pU61*![Nƍ ('tk~8j}bY$7ަ̩pP1H0b: [5n@sO `wi/VTh\omX$Y6r{'w8YΛ7UnpMg Y]{\ j׷:s([/،u-yZ9E|"Fd^!KhTh(?qpLG5K cYׄݏ#s1n"<"NwCh y|;nEAc޵mb,pr GDvQ8 lZ#Z\  +8H<{sMal$ae9Q=n^^ 5qB G"hTƜeSK"F9C"ec6W-i9sbvhbNqԾ=|'!'/g(- gN Hm( +endstream +endobj + +815 0 obj +1454 +endobj + +78 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [816 0 R]>> +endobj + +816 0 obj +<>>> +endobj + +817 0 obj +<> +stream +xXnF}WSH.o vEP @&W"c^riE~Pzf,S P :kaU6}oDÇV6߭\sG"'hr *[;:N9Ir`$'LVB;nZ2$3=dHX_Dq 1QqruLf tXk'6?jߊ9RGĉGpHb]"5H&H 2J/r"Y2/X$RFj!86RRZ0EJ!Qtw4|uy ?;vbtv_G%@RvԱ}^();&EV2{q`aqT}V@=T>YQܕY4NDXtq)SAHiGN<7_[\U++YخHȘԲ~ˍ>;&M.YiP\RҔ7ɑ}6w(lĵ1'׀H +\R-uҹܡR+R7y(2'-FEzҦVaTxҮ%TԔ9(沈Gh6i]; +b}]<ȶ%RTTAa@ǡ2+TvU}Ϫb봙 ۆf[YVD/A `a']yVJ't6EQ•':DC\2ڑ5d6U&+vغqVc΋*ut/(\v/ߣ^zvhIIE QfQheRk:)*/T.uM4nT +jZ)6_bhr?%f ~_K?_ +w_Ͽ5^_BH#sC6{.1e|ãpL)bt`l _A'B2;mn}vG;Ӹ\!ૉ q\?Im,6 6izB׆!,ei1{g"ۗ׬h`?c/e*;٢3oF1|/:Z<3)ʬ&]bd3l6Yv9j db-^ 7r+v +endstream +endobj + +818 0 obj +1584 +endobj + +79 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +819 0 obj +<> +stream +xZn}W[Ę" H Y-)G in U{6!#wz֌mբ%Y4sp|k${`^( . Ul豄 <`m Vځvez`d<'k=<-X:k'Șo^qA{jZӧ5j-Qv lPWr!*zҭeV܉yF Q¶>9W/D`$G +V^DW]>[z 1Jٚ#rHϒvD+\x`RZaN =F*LJ( B< +jF(d豄 <0Ra +V. 2 a4r"9z8.*1QzU!n.!f +v+cbr[ !n.!f˒3LޛB݁ +[$iͽhz,!%uJr!X`24%dౄ.X:kȈoQ +jts^ŻV/w͟7yڬϚ/o*A 0lև:5BTF8 *&ovp'WW]ULkO$S"20WV㫁alX cQ%!ʾi3AزkuVr-63yz>͡ 6yܙRI E0Υ/ZNj@X q%0,TH3e0& `GC um9 f2 cOLSc̶mAGZ.2?lpK)[RjP?nyul6fXwoVww#Y~7_Oc>FOkt&P,h9n *Az:&DD+A9kU@TJbMk+VpZO󪤝 ʘT+&Z&B]#z-Y3]T2V "z[΋tgًF2ܭ*߭.fnFfJWqN0ǥq߯/"A +z fÞa`LZWT]C"E0ǥjg_Uϐz1U$E{EܨKQ-+hGqY~"7[}LEM +!E"U @5%l$MUҫ*k2VM=ZT$E{Efu2sSY`Ƌ9!߭f?co&nL4SS?ǧq< +Ğ_kP& קǏ1Λä +sT+|^vu DbVBN 2\zm5̮k>՗dz4*4H?owT<|lbN +"'sӊ#='Gs[}sz&0;zxꃟ2PS-ӪVup)gPqԢr+(A0xd-'71Rg ,896hꠜ|xL7~-!u;Ǜ'B`˾Q!ë!7 Zdc!#0a-s C{Dq >яh5C뽮Ћ>tĪ%6rEXx+(QQx,æAwsN4tZC9$s; &k%`a$(-А_Nn>eBqYR`իNm VMZp#TEU[Ɵ6l4=wtO4⥗!9#O>'7 HhXTMJ#Sֻwɦ 7FR/NuDx+c F~%{lhNay80#73>"Y,[,^,RWc7,ZZ~/^uxj/zabnfW,jl#}FMg،F9n`:4ǧYmsOc1 |nɞƷ&3ҽ~^4حϛew=|b7,љ/l8!Lf{zvq5ki~;OwGf*Lq9^}k9ߣ +endstream +endobj + +820 0 obj +2308 +endobj + +80 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +821 0 obj +<> +stream +xYr6}Wѳbbj*U㱕d+J%އ -Aה);QHizF2#縻}xTXB. ~RHy]lÁ1Hˌ&),d2FLSu ciek*[392I6Df>9MUYD(z`\S>$JA&CDgŘ6=Z&X ,KT&D6U]eI2De9xdrX*XDY=Bٻc&@J#njȈsUD aJ=!c HulXLk1ǘcC>z 7Bj5:Q p#a*E XW!ze|YW@c8(ff(3E XDY=B2덶 1 /Ue#<3汨3D10; m6fXLk#d5XE[¹zQ_ssW>7'pk~f fqvߑ.]2'F~&wB6}T:'H!?*kK`N6Ξ5˒TnB_E,jWOvMw81S^K8u2Vin ITp!X-YW&uͮ8lI^l6($䇆O=%O%,_fs2}W;[7lYU פ=iO@b{xibTOEX0]Pވܰ*좼wǡbkH~ؖT6͢1]>°.8O)2,%nثE& " w8WަGV cDFOspFX&bd.ug5 +z BE3TPkZ^gTH&$#C|i[~;~I[ݙqv{Hq\|_='{@ v_~:E9>Wչ0køWgTQ_uS\{f ΰwCt{ɯESYͻgg-RJ?"x"u~tZ-n/K1n ^AAKUPd$v2,0A+-aݷ'0Ubǟ"o"t3]w\C3v7'%D( rmn^ZoG-*o^Zg]jr5YPgb~ض61\15hpcYC1ۮ2: =*݆^ٻQKP֟O|j$YBa]J݈;GK&9~?DR{D6J%}kB+[{̮Pi.{:ϰIüǙ~cqsN-ǯR~G`4"=c#7 +Pv +_3 M/[fԼOb#}u>4nQzVsK?46HH}nrǃ$XHsv; пkc ò_,3ؙjrvIK o:֮Ϯ!>}Cī`޶{ֺZsÒ?j}^5Xw:mQ,Z*5?[Kt8O? +endstream +endobj + +822 0 obj +2016 +endobj + +81 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +823 0 obj +<> +stream +xXn7}W1i5wA;Z $CymŕHA?]ݮ\;1`H899]<ル_""Q@:]YnA$+խ~x)y╶WRJPKSy۔6ΊH',gʛ*Ҧ|J@v K*/c=crcz3X!Yd/d#˥=d)P XP,fuf/aX ֠5 [uf|SʔTFj+3дV9:ǧz.2]!y2R蜱23Vh D&zT/@J\+"#Z8˧3HXe hs- *b+ur֙@6S8Ź&WqK^ 'sX +$b`K{~9{svi[8zLE^ J6#]nzv;>Xޗ3JXub/:(*VNh?bV~wS{vm% ]NqpK ^w7}]ln5S/؛v|"ƞ Z61o^ ۅA2(CSՂ* |fH΃` MS⑍ zI'mڶJg)ѸHGo'nEs "½he1"|Z|*!ʪSz$!}1c0 +NwQ+cJ,!ewe@BX"S +t'Űc\|}Jrz#svj%-ٕOˮ|bv X.zߒcK'X +7Zс#_G9ս./v_G?Ve+=DdzeJ+|S9A9t܉: 64Z'ndSsԮTR4^@1}B;IN2tRhT 4|Kׅry 1׷wfx:‘'k5~mp25PVe=Fbc8ӏS/'Ab Y=SZvr1n8溷g;ɴ~P,R 8kvbcݶ6lw~?߯ŚʌֲZNluUo/^zYo>{Oaµg +?u p65]wz,l2m0 wˆ}hq>VUͬKf +endstream +endobj + +824 0 obj +1705 +endobj + +82 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +825 0 obj +<> +stream +xZn9}W1pxg3Hb{7`XcGj[Hjo=?svhj^VdUSvS±'>ᇮYe*4INdeBV0+UcL,¹RU& ˅rfm(aʹvEc >$dCBdk¶QP̂vȨkh5ǟћ=/ B%Rz#2^Zj@""b 'h^2UF, E#۩ ޾͡'(&ш/ nes8rXC HM\)%}hޒd,7f>Ɲuh1#BIHh41r0VIG/*0u~<agv \085ŊQ N18>Tª!c U lpV`^ M;r0~`V:'1(Ed>W P waÄgaTR͊CsH=%3_t^1OMcQ7JNZG?6%+<`6|᷃i)JQaPWз~0OT&֯ }f P&1XKY E7+͈,L^REյQD\!+҅j=JAWdLY._?,1?,Z7er¾?,zXbXOM/D/Bf^EYV)Eȏi>c7J cB8ŏ;o@Ƿ0 ֿ +хi)|pW + 6F"{Jmf/b7lkviw[o ERŊJa9<3>X(]v.a%-KI ʹ-(kjy_#ʦFϳ58?=牊՜$"Q!N/MT,<7,sUSa(N!/;E2V@JaeVRWт>”XqW 8ܮcٜ~,42?lg0!xcH5?>;v3M}rDCnSoJ[\*3~!Гftu߬ޑf4bo tjtFWx7ޜ]U|5>>T"W˞]WSAB}Cf +endstream +endobj + +826 0 obj +2415 +endobj + +83 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +827 0 obj +<> +stream +xXn7}Won_ U0 +%EmYi i&CKnֲ0vq4<3s83L1t?$)8ݿVP (eXvc& C`ɉTfK&%vz3?f2,䀨3 +K,8VDӸ"jJ1 Q(#Hr&a5`^U kGqsLcc@{Ls!"kِQ2z ;MT˅b 3[X,HXDr"X a>K]gHXr+ DvȒR)1X(bC֑=Cz:hJ5nkj*/LjZ5&5ojNJuH:a9{dE,W,a +>KBKzPDzNؐudϐqbA%Ϯ4|؂ :tko0QkFd0 Qw?hj "jD@,J+,DAv-b8bHkfJU[,r`q"0I&H♘r_"Ď$SXH-ݴL z)L2I)L/I22 :sսku8UnSM +%{.ܢ3Mˍ\Gsyzj>8sa{n-ZѦ9r\<yQըnk7TisͶuv3| i=f W}}vkx?0?ox }Yq ZriE6lpT\ %E7Sai$d3[ +euaB4rqQJF1 0H|]k/J؛H" h9s\䡬5)!x)?!ʸ|u۩"xW>y!<'6J{JpfDE|2k\$Ɯ +[ ,lq"eK%W'~gM9fp8oV4kAP`hteGxI6Ohkᴇ[ڇ^(&O?&-(嶯XLuS[3E0P{h5ZoI -3f|+W#_:usyjߢ{uust 38cL'Ƴ؇q١U> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +829 0 obj +<> +stream +xYn}WaXV`0ȡ#peroC,ϻ7҇U]U.ˋ [N*_OBeU7L j]H+BB` P+8E!|ZŹkǐH+2V ŧ5Y]jJX B CUIzBL[VBEV3D1:(VG A6ԥ#9&|ROlNJlɷKhвVg;t}Wm{`9iB[dɘe98X3q7|~?('G"'aGfy)Y@U`Zc̭Jdv VUAzBD0b&}t= YhQ^̟K?ɟE[sl5}tu@u߸"sN (fhg[Qa/8(} +RF'$!rZ% k<Ӛk0s3L* +R&Y!^.Q:*[Ȋg dEhud=K+WGUJE,JɘS9n +u TSVaM P+v +20T NX +tP$!\ ))ɢ% yq zH6%WR^H;K$o& >,#h8Ԅɍ;i/ D +貢ёD 3DBړH/2aS:PAê =!: +41 >QT + xրAV(VG 1/&QU?Y-]-2;'Dx6~|`etG۟VKv{q44a=b?ukw۲nY6' EqQk*pɺX"=دO+77tMضNl0YmٸvI3#~uۮ21^4C|9:4i͸lqEu&.^5`Ac_Hu fQ \m]L7GØ!Dmkv csXpn|N Gwc:g +xRaђX8XC}3zwa^/p?IE7MRŌt7N!ɈA8[#c2ZFE_JEcę< +h c燷 VN>|+>ߪkr4$eKߣ,ߪޡaoBUZ"m1;T[OzQ]|Jo]O8<|\ږ\sepY^_k[^k](T ZQ^'Y\^a+>`lPVKg;ۖKm&{{jGܬWH†ӬPOHE5qқ@)>=<7(.R4wі *ŴJ*OR)0 0%MX$dE+9=kЪx@V8k +XvFOD7U݁V߮kػvSfT86ƆvV5~hѻEl|x.EefeqG> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +831 0 obj +<> +stream +xXn#7+xtKqsC;#V;/G)&{dGy xXmNc EՏU攁DZ +p3ǒ9d3`1jsI-@@D+Źe:d1G1:#c\SLPLh=cbcz3XYg=AH q7c B밐t"؀p +,gC2:,di`!KYHXeEL Xc8ҍTK׆!2[N*7*luy\{b]U>.rCŮ&E7;2/ULg,euQnw$bԐZT^ CL\~xi7 +QVR'n9ڲ@[p$\aŀ \bne]D M&De/JC*Dv7a@5xߙҔ| +` +ȱڠG>Dxc[ bH(b3BSU^W +[ƍ古SX*'ҙjIgr(e6a9aN!5UUBWj4Ij4IM$5s*p&`5~6Gi7Tʱq GӚiGkz-˸0yw|W_D>=jWٍws`ycxKM]`YCsnq֟o +B*}r:Y-ތS#a ߁'9HPccdKv( NUP5T*$v7nR"A܌m8X0VW*[;█Jki]]9ŶWL};khlPVE|b=|G>UYC;RlI'Ͼu'7H;|lwїv> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +833 0 obj +<> +stream +xYn7}Wn K,@A>Q֎]RYF:rJ^aH  ~ȳJhͮ=~7\P}pZxGd +}i&50¹N`ph7 +l"ٔ譥! L=iʼ +=3,Q5V4dCbXiz=W^@/c₅!Ƣ%c,,-!DY,zkE[X]@J8hXQYȒo8JRomuͅ:յ4a) +6LiyrOsLT_):6of`MSɵm+33,dClYL넮7TcBQrƢ%c,ڐ-3EGXe%lkXrƢ%c,ڐ-:EGny7Ρ=?e jH#/g^qQ;~|,FJXfa1zkGoX[u/J+CTDENDy7 d6p'rV\IŵPVMyY΍0_Dx +Că2ayp5R@R)10 V0-YgA_t4ゥka>Pҟ?T('䏡P\;dv@"umo +J^tڔCR&ʳD{OFÁKԁuR]YX]zu +'8.1Tk( +u *S7 _ m$AC4`eȠM5!j*iBoUm+D,C'USK W z24L꤯+#/SF\ǰP)ۦ{*C;+ # + C=i)# w GM`\&!5@$"/SEUBYӞ4A;0gk*CT=҄)Y Y?^ ( Y W z>DP1@zPZUF򒂫ᬶ3Շb׆|O/|Y.\A8fV!'UNPqj;.L)fFޔpMm-=fZj֚j)[#u%˦Cd4 :m ɩga}Lݻ%@E&dXoNoxXڌSK]wI(\:JvueCM+!/\lӭq3qƒ`'*Y`nTE&DJ+ +X/E.T t u2pO㖝Eoz~Y B4TfۧUEuo4˗3$k폅=n}wk؛!08 Io?'vrC*2n{}$?WVx`eX'S=Sv}xC&ռZ^T~ qb6ocīzκ"Yl/j |m/=B +UCS qT'"ɟ +endstream +endobj + +834 0 obj +1662 +endobj + +87 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +835 0 obj +<> +stream +xXr8+pt2 %ʎY*sȑ JT03 .HQ*~'gTO3Bh"/ 4cIaT1p,EsgRV#7raG +:C͗<´n},fW3Ǣum\p[>ޏfoA<c[mݶ2qp%4\j=B>QzLEI0c2XuyGhNhٸw~e ;Tay`_1\݂j:DRLrjtܮfBkUBz,hСhQY +e;TK[@mֶFƾ@_f7΋` oN_mwu~9;,ŪzfM6E)ʋI,ʖ VɔEiBޖb?tK*"٪h]؃ݬ@nS>4=\nc v-q3底 +G%I0%(i"WJK"c +0"]bBV*#QkXLJTsH$â˧=myas83ޅ\0>3}YmY?B=Un}n*$X## +0n' +x)47̰fʤ0:X;:BC;>^{Mwd$B̕ , sGzJf*f8z8O$1O0:02!n|c0J;^{@Xϰ| _!"Gl#['75PDI eb3y04h44ٷmfga?|JO0^jH}L!%Z&u"naDZ뉐mNj9O>pyd :%ˇhW5܌*>D%B@WSx)tc炰97\@%~%_olOiWi;Si 鉄^aN.ՋD7-`#MrҮXc +Q9Hb߾%põbW-ri̼sՖ%=E-s% DǢlkV/R0yaSս<_yKKKZߝTl_r/*wΡmvT2;EmMLeڥٺq=ynz`"8C@فiX50cڴHԽ6|nA18}Ѥ>Ek&rҊˑ-t=Gy + ]۝-!ktmv{gKDKD1Q}Ƌְsgke8ln3>଺<,jg9d I5+-Ҽ,O. +endstream +endobj + +836 0 obj +1766 +endobj + +88 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [837 0 R]>> +endobj + +837 0 obj +<>>> +endobj + +838 0 obj +<> +stream +xYMoFϯ62`E{XƞC0" +ɑ #8r`kuUW“nS˧~URX@cn&(êHErq\$YDp3茾/ȔپΜ_xk&  ޺,~OR4gˤP]q $V"b#lD[pro To2K}Di|t51{=|xIW.  ԅX9cZVy< <VW]=bCʥ^Nb\T[l=yלg@1Ey,OTa۲,bXPQ{9ͷjE_V!V$Ro\t2ts15=@a0 !|'e58&j!z ckԎ=@B^Cks,uE",T|y sXD"TJQJ+fH15j q]nh$% yZK^pM}5B%OhenVyߌoĆ{v]5Á#{ch;tI0pQ9 е #!B ՁM,?cUgHa*jl8q'^eq8>ݔcg~o`tN?#yWp:n)M2yܝ9vcծ  +UL38M$‰ݽ 73$hIKhe.rKt גrY[cz#i< b0J[e$\aVLN2[V>8ެ:۬9lڱHֺԨӄS +ϭd%˱ɄQYFwOJ 'eZ'Ex$sg|ѦLaa܍Ij,KgICif2A@e^]gn esvD~.1m,8; a{aiTњ{Ѫmt 8!.O=6'!G'IyEL1lYz-vzhV{3.V-_,Aso1V0/5۳]3s8nΌM!dl+8\oMLCDM5kدj'K߁C +gibHZ4"lƛl21s5Q_<,k؈7moKJ~` `>?o#9[W[@rҌ"XFVvh8KEԖ*co9>_=8ڤPʿ;śj{XZr0n?r1iU'x.0> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +840 0 obj +<> +stream +xYMo83~S ql/vYJI9?J(#{3$m&_U=V8O6|JruJ~Y.fJa..+ÂcMFeք@c̸& ;3A_'"8ʄ5Eg!"U5bU(bf=Aȵ#xC?RLjIh 9!QX@ft#Qnƞ b)1H)87W, 3F" 271T +Y-kuL1iJ͸Ǝ>#dfb~EQWCϭ23}HsĒ̌ؤȞ rzܝ)1qT7wqbBE,VgdOD4~kRb#*6bI]G,F2|uorL1oaш$E,ɷŬ &>s^4rP*'l&:0r#xG #X bΔVxTJocE3b"{$J,Uj!$)T%9B1ޑxuu"AMKv]E~wZ k~ίٱZp`԰xhqp(Sl[itەGvlw~ܕUݯ;rcMβmU,F~泵2$ Fe'vz\nUN%E+}6ʪkS߄28C*a3bdْV- 9v?YfUq,[қ=tI)c8E#\LF +^v&53<<o 4K!=J7sQ&!i!;u?A!oo{T,ՑW< Wh06d-LH#1{^Aۣ<3K%]W1"ϼ%t` +FyQ*K}c8/gj/xgKsYhz_. N qnYM,:ޘdXHZ_1mga֑K˩{\dpKD.tcSh>=pYlv'jjo}eg4 LV$+ٴ躲Fh@--ۖkJI$yKݾ]w<,*,nq,,qk)g}k~iЙuI-J*J= +)HOj|\-cXp:%%m[^"yci(ji=2?@#F0{QzD2x:{/~-~M3;#_4m罏W"t=*sg'ZR8ws;~ ǐ_,ͽKO4RjLszzW/E'2/w1 +xغp*ј.c;??Ӫ奆ouxPz:y;X/wsF58G-73شYSʡ~oV7Y?!amni ln(W[uz[tq-S@0 }F`}J⮺b_%ɛbфJ/FH{:f2ܩ]s6smS6ٿ1jon1poE"θVo|Uzj;v(i Ԗ1 D1hД 6DOCbgļƲ{uD%feŤ'K~eQ>Uِo5r/e5J_st~+G0 OG2IlA~jF3K(%܎y +endstream +endobj + +841 0 obj +1893 +endobj + +90 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +842 0 obj +<> +stream +xn]_1}c<5$- HՇr(mK>z^gKv_"ut9*a7*)zjA9gtCNp54JP >)".S +!\8=$R:skT̸1aJ΂"1*0d>90BQV\g^O4F]?CJa&@(.mCZZiU"6@c#Q TB=C"0Xo8rO9 $#V`omzZI~uw\)V7OiIoI>KZnɳiɗ8i*g.ז4}\$:ߏdO]T8I@~![KEHIsx>z OEALvU RR$%, +3n_7(gOd ,KԲ KB. *jŸZn4ל1(9|q%a!:a&D&nnY xMс"ƏKC&'" jǐݐ6D]xhh1w˒0(f jp;R]EM Ό^/R'mIFLfrER, mDw,D ;ԭrJ*(EAqID?E\3Bvie*`2lN C1KIPa'4sO!% #ٜDA[ ŮD@LKu$ .F0b0^ 3ajrxNHx-6?HMeN6: .fk:D>A[/,xfC.y"$4'7a(kklR3'^2To"0eCW7.F&}ӗX Wh?$9 x1ebv?P!^[g{hbcf>Z&c"xe +:5HyIh,NH/HB2uB~ޢs'&0(~Hz9 +&+ATq(9{|*[2~v ) `Y7^_Ya=f0;(נ\+pEO?Rd^"UI='~mUb$MVe D6]ݢo|X!m}f{tQ Ӵmw8Z1 7Z9B2|vHJ2F>#5i߻^GP7P +wY2.vRLt nyk+6xĹg৷4Cp¶*ۼY(}UzœŶg|^"{}34kG%/~K]+kZ. +n2wEvP!UMpl07u"|o֚VekQȹbOxW5UVeh/F %fZ\ w)ҥ?M/X;7;);֊jMm݉  %q&ώEZOi==f5c]rɨ*7#y>5eo*j߷t +:C sGl*3dCNnSOɭ9Y+[ x ;r\~)jl숃&| !`oYCu?a&Q3э] +endstream +endobj + +843 0 obj +2069 +endobj + +91 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [844 0 R 845 0 R]>> +endobj + +844 0 obj +<> +endobj + +845 0 obj +<> +endobj + +846 0 obj +<> +stream +xXKr7EJ`|eJ2MǩJe+;oF$$2Gҁr,r4@Ҕ7c ryYMw_3/8\PL*CdaZ j5:"dT+A\[u8WOg̶D[AOl`m}|.W + 4֐=0tr* +.{d}'Ѣݏ^|P9c k E*M}Ču`jt}ݦk,c3Ul=zEɉNr! +&$ы%z{?z% H%o@1rZ$VN@7??Foo!FJ>+>Vche:rZT(UX4y0K5bT 6sD"' + +"wR'Mj ALVGJRńc*Z9%xP՞SGYSB?\yQBTA!CӋ g/(l(Tx^`4j`s_'8 +# qL6 GT#*aQH =: Tw G2߲PRpFp4#C[GsCTbY +zMS_vz~ rwyp +*߳$%#^Pځu c/8+,t8.Ur椑?Wu +腰?,9gxYk[ܿ[2|%t3sB[\}yy(FC❫l벪݌<. l+8Zg`Cj> v$2_뢞#pGƛnuY/6kr;w+G7\F', ϗzPVCWEy} aK]=TQB$p88qwtE޹ֳH ck.jf8)L_Aqe:|F, JrӬP ةҨ^ Hiulɼ:P@s5D~lLzu?J+$[rzZ#x+W6SiD7} +?zNlϕ^;ޕJNjt9RQQǺ'OZؐ-J㼼sb] w_w-Ob?Wiͬʁ*!j3d,ĕ;dt>e)VclK +(_W>X̐9Alr8В!ԭ׀`aPQ UL8~$SZ6C/?Cbieisi(kpM'=}zZ+bK :dL,5ypkWx^N"q 2^twqfY2CVOhb3MkSaߊ j8GIQn> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [848 0 R 849 0 R 850 0 R 851 0 R 852 0 R 853 0 R 854 0 R 855 0 R 856 0 R 857 0 R 858 0 R]>> +endobj + +848 0 obj +<> +endobj + +849 0 obj +<> +endobj + +850 0 obj +<> +endobj + +851 0 obj +<> +endobj + +852 0 obj +<> +endobj + +853 0 obj +<> +endobj + +854 0 obj +<> +endobj + +855 0 obj +<> +endobj + +856 0 obj +<> +endobj + +857 0 obj +<> +endobj + +858 0 obj +<> +endobj + +859 0 obj +<> +stream +xY͎)xL`p`챜 ;A.H-Dy!Sc0t֑7w!Jv?F8yB`I<$YțnCRaB%"sf@S} )7I]\?X3 ov\ ,'GI6BR> +Mȴ;,ss*{I1_`cٱ1玔s$#}}1*&E +4ttAIPͱbSÓ*_0ǘxvCH'"[^ӄH7:&'9&@GJӊ)6tJ#Oi&hLhho)vGٵ82q, v?@}E1:NɬaN# +^%gKn8OYZDrj.鴡bR:YM-.k2nDN`tJvCZh+:1؈# N%$ Ypƹt-Yt)-8eGH؛=Ązo Z(Tܓ-]Qwc @߻Ure='c4eݯIlّQځNt ]_&@N&V'q)Fb|9$. )^y@N+ z^PhU-bmx;k;l۶oQuk9ԌC[{sS}c[=Vzx|}>]}8ץߡ|FUdk\CP:M&:g)75\#KE[NwgԠ>Uuވ'R'=k3[Nh:갳6oj\hSokYvT%lׇD 2ۉ{_80BLHu-/jq[R-s> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [861 0 R 862 0 R 863 0 R 864 0 R 865 0 R 866 0 R 867 0 R 868 0 R 869 0 R 870 0 R 871 0 R]>> +endobj + +861 0 obj +<> +endobj + +862 0 obj +<> +endobj + +863 0 obj +<> +endobj + +864 0 obj +<> +endobj + +865 0 obj +<> +endobj + +866 0 obj +<> +endobj + +867 0 obj +<> +endobj + +868 0 obj +<> +endobj + +869 0 obj +<> +endobj + +870 0 obj +<> +endobj + +871 0 obj +<> +endobj + +872 0 obj +<> +stream +xW͎6)- HJZ-n^2m+я!Q@iPEQ{ogr4"UF웜ʝսI K|ta>f@b<<%@iDX+/̈́+~fcb虈c2YM<GʑkBg'ZR|V~Evq.hIs%fE\A<??'?xTP97E PߗE /F[F%U۞XeGt +~eUm܏nCY@!Gi?*:Dv.AIuh~Dqv1L}NpP?#MMь M($"昌L Z+Rg3!B~CrIY9v0 f1%gvɭ!50W4{Ϋ=8V4GEE +QJj{h#V*1S`VI\.\3㺯O :?,9d9{ۗ5AnGsu[ jP&vK"CT)3߆D)!͜< - -j/ؚCo'7y7_4'UR :j_Y#T%##fH#:h>u,v9Sc Wʔvdž!Ǒ=3328 "㙳l OU&4g8+s9 *mQQV>runE#q> a%(#4⻥Ə x]\6کkl~uJwm\k-L2m +֨%mn!?TޙfEiσŴdu2]<4:V7˯lyPje4wuhWݹűߚ϶j3u?pBJs*m63#m$t"CֵBSokeGϩS4rKƋm_>W|lwʎ:PyQQQ5=tZ`^=?궫ap+K@p JKxHtTu*/W'f{nn/%, $" MBi +XʨۤQ +ӱ\^1%!ӻ7PXjTn**YFhpX23W(,~Ю-Ԥ} xgԿ /$ w@qf s +endstream +endobj + +873 0 obj +1360 +endobj + +94 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [874 0 R]>> +endobj + +874 0 obj +<> +endobj + +875 0 obj +<> +stream +xXێ6}WqS +wm(P @6k[ InRZm"}lTΈc~9cDy)N5Uد&ȀεI*fc[J3i@,MҁLZ;@?K:<Pf9轟 d=meYQ/ b֢a7YJq?zvr5X'S.>2UqZIV4<9/M~keQzYqiѝ09X+"\ZzYuHb]\uMS/q|_PMoL-qjT~%~W|Xdy8l]wlA*5:C*x"aC'ar5n( eu Tȇ.EњF.҈tL9z,"\q\LP-wc)V,Q!.M8b8K1"ÉIU[8Bp9q؂_a׿o]/|JÝ4e.KטCZ݀ kD<& jO@G+EU5dK߸aDW5o*ή1 ~dQZ]y :FTcȩΌ/q4@- +yBp DEP^z\wgEwʸUWsi.MK)Ӎzfp)D;μqss'ZVHUG8V4|=1Ѷݛ CegtX)KXtJa [9wDLP"]6Lԟs.lp[`B[:܌sK9.>@ti+ 7G! +6FOyw?F SOb4}1õY8Jg܆b-G[ҕYs=]ou!KE0ŧo]wOz>Uuq w~$HUrcK)[>쓱]GxlD+M2a|&nzX}6?%7dgo HHxc߻!pSΦX]q$$,6uM>ai\i'asQ,aq +endstream +endobj + +876 0 obj +1809 +endobj + +95 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [877 0 R]>> +endobj + +877 0 obj +<>>> +endobj + +878 0 obj +<> +stream +xY]6}m7`M1//v.z})(-ݕEH$E*rs Ù[96~2jQW08T#nL2jasI 40#rf+(G)fl@.cL \ST(%Hd7>6DdF츊E,zD^azX'$@<)1RC/m>!b dz)HP1QĢב=Ax!H$l,)SPg GjQ!Waڈ)25Q1ItX'$ؐD4fb6D$9bIdF,̳' \!g:SJbf *%Ĕ='Q}BR<)1MSlkbX^G˼mRŔ + f<9bN$ClquD%^=A0F)f)Ɇ$2G, ̈%yqBZSJbfE 3aJk'AOL1>1"3'HXR"VPVbJk\1dy,IM^ߺ?^=4{ iizو?=2>\Nv ;},t| €J@4?+\PWEN$W&! S0ZH9$WY"i1|Ta"WEĸUw6fW8 +lc*+ D7 |%^xdp. ԰P3$tWag`f` 15p ?t%L̎&vE[v\Mřh3 > +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +880 0 obj +<> +stream +xYˎF+j)zz+ [ b Elhj)HgIV, XSq-dtQ(V _X!,KK!I ~J1q,C9֊mR3,ψ Ƶ'\G:Ũu'8)W׀իQ9` d,`4Ӛg9 6_f (U8M0'H1M20f &J*s$c3s,Dd'INQI)zڭrDş8ۦ;tܣҡs\8U=* +j_}>\NCx\E_=VbDQ{+*AC" l>`X|D" tƅ7B VθIAŽ Ơ,'3>]U *rnՔ% Iŀʢ/~tjnR\ + +v +bp1j򂝂6<ÒA1`kD:((bSgt +>} (GgO}Z- +L +w }j2ӹPuUz'AC*rIyDGC;O}e5]*i몀ќS4#WA#Őݡ<-F_:ОG'KN 4FGpV !(g&`l0ŏC0˜pA=ۂ( ߤA89h  2L@löI91;"MfEQr {h1F|Ȅ)gKW^)*7Öd/u_/憢2qCSޛ5u@I;?9y>6?w0[ݫSm;CWѩj.Ms f3 9Pd+{evT!帍4UĠ[/r`cJf;o>6>x́WիQx2D#"=s`X+פQB-kRVGC]J53{4Z-5*&c\{IŜ)_ +?W1 Ш^sk\u~j/ 3tĺo j +cH%k9LPͧݿ%p?\ &ICi'S. 9KDExxW|6 +^p'YpZ{UR*sv\-INΊ،FZ#>/[ޘ*2cϰcΨ-5ܼ4f`!w9,#M3oC cӴ2a3'e[9$XL|e"y!L5V&Fju!?5̢QD͜gZءvS؃2OEJP3Lu}&(2<1FrMPވDv_C,o57F≹q+PbSfeƱ)}e)9fwץc^%aw.qg,5E51.[WF05ޘ2Mjd6t݇Hpp ]g>ZI.IXGRkXPYo5e&ՈD}o$\afjT +sTz5Teeލ"߁D%_կ/umQ<<ت^A]BD^4\Cm2%hfqV +endstream +endobj + +881 0 obj +2122 +endobj + +97 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [882 0 R 883 0 R 884 0 R]>> +endobj + +882 0 obj +<> +endobj + +883 0 obj +<> +endobj + +884 0 obj +<> +endobj + +885 0 obj +<> +stream +xWn6}WۦE*bd}SXtF ]6p!%ڒưg\4C3BKtJG@7Kv&Xn%*k(^)4 cQ™LAFɰ=ai0m,/&J(=;/Lўw? FJac*m"mJ a*`agrQCͳlֈ٣MB6a I20wr ĪG"b/m:؈"6bKM{gdM#1Ɋ'ߖ/#E#=~FI|7y_@i2 +DZػBkd>!)T4k𔆯M{)HsJ(p0DA1H?.Y7EB Է܏77-trرR0ù&D!Ð,$425N9}[Z춮rMֹVnO8PNpF\Ljl&& =_ "phv㰘biڔ[ʸ?UDm +endstream +endobj + +886 0 obj +1277 +endobj + +98 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [887 0 R]>> +endobj + +887 0 obj +<> +endobj + +888 0 obj +<> +stream +xXM6W U!AdI)"( JU?)R\i{l|3f/NRCMNOܽӌ8@^mnҤ ESx˰?n0& H2&(b8ap}yyF e(˅T`g/, STGX30ΒRi̯q~C ~U fGǪMc!j!s$2Sߩgvv0P@)ʜ-sB1(E"(0X$Vcb3Cn7|uE.QGgzˀ.-K\o)OhʳRmy<籸<ƳG \#',7hRz#,V>HތE6cs3{pOH7z"cf^E56sPl>aY{OkzΛƌYaEsB"Z@www 7#6Jzxv76čD=@ƺYDs +]^}#Qj5\!]vYMI6T]kh$/] <Ҷlй{oI j2jI>m{١A+h^0hH kB>ʲBԷRK8GW $Z%d>1n$ aX̑p$e v\"M0BdRjNxH UEPl+'գZ s˻x*73 %0[ԭ ,O|;KGR Oؼ7S@ շMQf_o)O9y fj`k?Ix5;&<im:fDXXi',6A bJq ~iݩ[ٶ]W͹ N!hUʬӽx0e/Mn>pO/*$$/~_ꓻ#?Fm3_;`r* +sS7ZOeK:;SLZo"Pd]e'暭xd#> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [890 0 R]>> +endobj + +890 0 obj +<> +endobj + +891 0 obj +<> +stream +xZn}Wd1`Nr1$&"#-ӶbJr()?3?"ZzM^= XQ麜Eǧ> (C.n[ck +S*, q~-!je+*Q +>bH\Y?:If"JX&B!Ù6Gb|< "XB&KzY%R0^v&#h-ƇKkK$b ÈGe] z+<,kUEUj+Mk%cL1V \ s7A +YoF 1&{vk{"'cJj@#DF0[=K$bknEx9؀{a15q<v:XUCV5YE"̘P&cY_.j=$VD'3cB%v)7F/kWF10Hǐ5ꆈX$biw' DD,a1VnKK$b 1rS8ˣLpEmufBGecL荱b\i_Do Л6l!2zI&vxz~)#Ƙ)ʻ_3XB&Kح=G#LF1 vZV6 ܭe] S^䜯'D,u)fKaBv\U# |UۃڴZkc7w}x;M U>V֐SR1kJ)[{XD$,}pb, 0>zV )7,F(?~Swy&:6h A ͽ߾[l'cJv2agI~60e<42նBtݤd|QvY8n}WZudg,f1ukb%n`MզhaiX,\T^; TJthNA#N`=I8 +ةi 0[3a%*31JK76Bf[ !Ge] ^;Z9+G'?źk(P0TK(cnUUTGS%"A.}>}_-պm6;@'Ӫ8mVQ:}{`շ.*!YG&ez&6i&Wf rԵpmF;#dr1fXGh*m V€=",{M"6:kC=ƃQіG,֍=6Bj|Sm׮Axq55V|-2F"r4+j"ocR 7LmE0G3B6|D>d=#o?"Z/~62} $5cD#R#Iz$pV: +qF{FrRI95lH**L3^NMIBɗ2p4Cqb)m38awܧ;?Ƿv=.նm.z dE_׳]0mZl* 6SgN]/"f sZl΍qtKt)E=>1˝ +a_x4goyF >ؚC ZkR'wo81;prv:a\o|y<֭w]6ז7^?V7%&Uuan> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +893 0 obj +<> +stream +xZQܶ~_spPD$M> pAP @!johuPP:8á\nirLR#7e|eΔrPo_mҤ,R TqxȰ,M2K +i4hFvt\}p\l"L'YZd-<[l7+a""&v:,yjJe֊!1)>!rS#bsQI(sQ{@b#L'RNn\Ɗy$RcN1a53$eݲզcۜҞ+2uoS* zA̅.;C3LרyB@?0#",D ȅr깕KMr+]~Uk.$L1DyEi|"#v0f~EvumG"<FvÕ$ȱ<4 k + M{ a`%Gbg \SJ`2`U0}0`UEX0vFQ;CrKR=:C"f|uQDŽÙO@$v0<)F 立2bpc+a53d]onUyHgMi,;jb9S0VoA`I.z*3E v*W1^o!nt]W*+ĔkBBbmb)&+B?!zC+F̫*X®b3ƻ53d]oVTg-Ӊӂ[f"\=x!Ǥ`IyI')Po=[0cFEM )V{z"bA%(}m +ƮX9dgScbPp ꢔ6V#bcJEM Yۺ[% 女8r F\WL("L=XbbF%4+&i$b|@7B\7+ # *M6SwEOCv0&A댽iE \1DbnE,D {'*l%l`>6_Wriya򁲖Zc +[͟4&)#/d^(GΤ:3d!uA*\C6)u0Nh!{P:}O4T'wQLêI4~wĥ:bߴߍ X;쪩zܧT3<H_QIKӟ"㩭u7&g|~fK1 \+bEJ؃)rZsig86)$%V%VqWY+w mURXOn6(ҫĩ`6i5O8KF?߄xi)+X +6,7ηUʤ/ +UP.Y ۹,5v(狾hquWcyU< +ʜqPKۺgwqy;GWÐlVF߻-t +endstream +endobj + +894 0 obj +2252 +endobj + +101 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +895 0 obj +<> +stream +xZMsܸϯQr1J$KRJ #3:9kAek{g4^?t7E{\T<|S+w !da mbtaqQM:Y Sr&*J a1Y/te'X ,H9w3EKŒf␐"qMXH%,,Zz"8]_͔fX'%飁(S,"#"F^‘nd}@r"6R,aR>:y)X)=JX:Yϐq> +`fH4хv9f S(@c"ɜ,0+Y=تzLp1UXk!! 3adz+izoT/H2V iM^VvXDFE,K넥L3$S,b# *=5yXX K^'2d,Uah.)KY eBKS tl\jw=RJj.Ū@2cAFYm撫deE"zI2VaUnÌCD֯4OkKn ˴$lboqSͳ5^ +0%ɷiF\n%,PN8},}',HRea5w7񫸊vK3KIscxap8#dPShy&;W2 KmcOI9WZ.woHi*:~P-O+κ⊒tdI?شY#8ShbӁgȲafneaLĹ #I2 +&,ٳmamNX2/z, ^ga~99*b 0c39in93s 7TJc?,(vYaU*LX|K3 }V#[^oWF;ҷ\!'@qr#ȾioKkKz2 +:GvX' +ƖDCjIha*\;X;$nNOLe*oÊ}oiUR2ܘ`Ы'VtֺPJ ;p~u԰a5mX!+NV,aR’5JCxY=<0JtgCu 5$aJ~T!bc nJo+a(`]0j#8QC$zl𺷞!t +(BU(ni|(3ty@cXv"}c(oCWY,T +utg9u_랚E4hއŀ1,[0 atz!D)v!-2L*ُ3&[ ef ֥ ==V ^3|sX kUjG( f.$Ark'ǡpO;<ۺk +3[{phg<ܞٹ5Xw]sJdTpWOvfmEMs.ߛ|WeA$jBK۲4u} d݌Z–ŒNo`/S +q^,*3p8|$^1(-t4`tw ,|85?Y? DN{96/`?۶6A55o/ (\=athGٯ=XA!ƃx}> 8O>>#:tv?oܾATsnv͎  ۆ&Q+k4 #eֽ4uiL- ʀ7>8"Z7ڷSo;^&5]RgDE8[ZUЁq02Xһj'$>q"ےG#ڻH?qO.4h5Jw~ =j5KO@=a2zi19Okd¸kR S&^5GxI蛛PUM ߠ  蠉JK,'Vp,EgrژU;D |7wwBs 4Ѹ-W,YNG;YQ,\bw/)'{QاiA&CNvaJev%\eJ|aB*:"j/DEULT=>?5k̫AJsFTW=1Am8[$VI&+m|OEa9Vc_pmJTah?#鷄C6 +=gX)|fʦnI5lפF + Z!>+> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [897 0 R 898 0 R 899 0 R]>> +endobj + +897 0 obj +<>>> +endobj + +898 0 obj +<>>> +endobj + +899 0 obj +<>>> +endobj + +900 0 obj +<> +stream +x[ˎ+j96zXF xXA6Eu˦Eeҟ'X[T 3hp˧oǹ6(C6O)~v cRoqik*fL(L)auvϛ~9nhecM% 1H`LH¨v7=^_3rȶ폀ڝHN?~7ӸNJvgkt~#Zř|N}vDq#iSh.Vuď+yVvO0Epq 6 SFM˾&TRV!%54?M6]2툗qd/}E:$|Cha_Ϡ.8_?3:T%\v:e3ttP{e#tI;a.}jjXGC+p5}p`%1ѐ0jkXIG<>v }Nw#<L2H;6$7k ;&#A~zsvMKKhy&;2KK<9seN;|Z +\ +dJ.f8)L6̋2aj;`gp3$E bF[9Lp +Jǹ#9rHt,;I6XթO~za2P,`a!m\('`PQzDy,Vcy:NmwYdŢ-`LmyOw̐r)zX1&גo_p\﷋sF uJg!5]iS~2'jnIOq%_eZ-Vsb' 6aj)NZ-٨2ea^@6+hVr"^ 2d.yIe8$'-].p|fqE;¹Udcr)B@yI˹wK4];:&[r85G:قn%nݵ%gm6{Z"tUMYsK|5l}kf+f\t?5͆6uDxj [?o+!WN9`mYrJ%l!Zn}DORP9:*Q;r.)-}ۙ%giTn(V45M VP6A݁ K>w\ݓnu;K/Th*D m^ƛ[Ejp3w8īoұ~WaNݛBD&s OMۗuieoH0BO\xw㙭á9 г]ٱ=4jYS[jϲD\=bдܜئ=SufSmyy3;awNѓ?*l=mjڕ+vl*&IaݮlWIiRT51?"NؖO.-h7E'Ge;y4=T#.hfOcEȩ3{nj +>|9BX:`V'DI!YN_>vIO;r^A +Rg<]S|e@ 2%*a2(fɲײGMк˚jc8:/A{2荐6qqm)o$ՙ*Pϧ}.}p:B(=ᴩɫc*_o;==Qy6SK +YB5ۆ?|At}off*xHhoWԺտo޲X}Gaٓy-8p4L3 +u KW0P2henÚ+z4Os3bxEÕ*„*o}Dhc4w{,XU +[kѸ3xHm& +B +z 7I$/ cKW3rǡ0]S-J nA{4 +_mxɅ!G;+|_a=ߕΦ+bXR_F#z17PAnF/2LevHM xtQVҔf}:V5P1Hh\Z$q*ϒhsa򱂀ܯ/ +endstream +endobj + +903 0 obj +2518 +endobj + +104 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +904 0 obj +<> +stream +xZn$}Xy'XVRy@A@;jI<>3 ?&խJfq<*"(Jÿ|F' lw3tV[#L *g\ fd块B)SEkI(gl XRfz^lrف08䘫F;I62-ga,d!!s=`$|-z=4b HDD X2XP #%l1|$vRq2X0b#kbgXo*?i[YLi 4SՊcRZ"Lh]C  c$E Q+c: ,9af0bCFX c$,3$d#iWF;a +қeP%d&"11`!kBIkp9%d&x2YLimMePӴT+Z06<&1aF"v•1Y,9־,6d0&LX;Cu$ߢtG#,VRPf1iGLxQr;CX2#FXj}Ikӈ$b=ҚufgXoqcnk䀯8+c/4pa]f˜0 #y;Cdʘ$%UWg7 aa& 0ΐ[^=(b)%˔҇EL#"11sرJqӈI]o~mf-V|/@V˟߽C+Wm&-)!գ dA=R+oJ;JFp2C (,efyTf/-\ c%(0ؐ1JF3kb/\τ pj%=C<"i.7%gOMAGeu1OG&T3;2Q(I|mpG@;SkZC) gP)bJW{l;I"`L^`ŗQ J<|qMgByD+5f0}Xn @Ctd ׏H5PLկpKMLz:C^f1?ԜT܎g܋Q,޽K`ԡϪPy&]aXJj{)Q.MW2X\:@@Pa$\| H#֧ `>V8Y!Uߞ, EdtXӴr'D0JK$ +0P .'#4?1+c!z. ^Iv?ؐ"[3\$ .s, Z|Nܧ/L!VQ]Oܩ6PC8^3,톁1Ɨ31qazja`Ì^S2Vai7 +{ޱbCbk$ k5o+1/0'd읠E\ +Ty^ +rZ] [>Fj,ض#'~y{q|7[RꟛlbA;\ +Y Ud'];?l?oVI@% Md~smz #YAj6>zz {͝e醆slEPsl?;svmJ{h:(w]nE[qm^3 oshU&:엷%{\n 5J >q _D+zD*UGD+H~ɗ\ ap1 X{A EV/8_paT!#,cM4ab2׫h4ˊE.=RcO*RXhNk?]aw4Ǵi`yZԚxcHpQ@jFKR \ R40@.ņbk@(cbj ^@hEO+}{R2uåΗ۱X`dR~f׉v‘ .y ﱂ3ۡ1\⁷jW|j4X=τy'?B #ഄШ> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +906 0 obj +<> +stream +xWM6W H}AM9l[P(V-K[Fh XOԛ7ÙHfrw W,[!M?4 + &[ LezPi q,A#΄D)B[% HPuU@h4b?#JGR@5Œ@r!gnz ^Ǫc $4$n;FlJ%GId؀q+9L#6`XDBS|7؀\Dl(bG^{ roG\ҋbpX,^5ѾwY+cʺ+ Ú'gUlDz`YeZ۽`,HEAsD[s_afꆙOfv6[\ʎMmMm'"ζCm/@xbJX)&~x|~WLSkYV|jmL7kS]]{F`쟫OYۖ(8 :\t;1S::i2n+ lVU$=`㪁cz42Vy Ԁ&]ck> 5'\!BZP\$gSJ}VZs*Vw⁇Zpxf$Pi|zY vYF~Sy6:հ笝-$) +nZA7_,J{b仲|ֵHH{Pa]ԝPKcv,*vχpC~*CM6\yG;ET(eU]˺W=g'V5͎UԆDƙTM!T:T܅B%{d +hu1B(û**ݹmJD"̔NOX/jTd)F hҲW*][%K+\颍zKkIG;3߷T o*VOz7uj0YC%mMn1j[V= 2Yeu?b=Ua65Ghm= -YgnzٲS[cWt*lj:2_3+1yDϕa`#%CL망RcBU;&VUbǬI,򡥱cճC T7G]} &k7 +7]mf#&b`I^e'?_]'fmZ$}2={Ln ؃Q.Jԉ);T tm{{Ȟ=tP#G }P8o0@x51i1ؽ#H&7pHQ=r<?c=r?lBOq-ʾ?`Й* 7Q ?_) +endstream +endobj + +907 0 obj +1617 +endobj + +106 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +908 0 obj +<> +stream +xYn8}zC/" ;ۙه` (ݴ[eH==?{Jl`_7@Zjԩ +ORa+TR3~i*MaS<$75+Ey4yLW|R d27Ï;VrTW e6"ՌsJACUgI^)ddy3ȔGXv@ TLDeAb^QoTV]Vh:V߰ڮ)N㶬zZ e~>]YԘΖ2ܷv{ +bQ7-iro'moBI6W5r-p#X[v^xb_w I8&rݺԐ)~"+@QyENjڟyLVݹA(n(/(D1a?Ez,qrRl]vHVw.u۾_߷]EmA!=>>2)e_b +$:>x4<ݠObigK{ ݷ8}b,7,O7x޽6LqU(VVYaK$4{R`?B 2)( +/pW\kCL1&e&uyqU/qp+׸a^7}!RRP R9zWt!jsA.}[rA0\iNL fOɅ O 7EdYD[?f6XZ\_P> c$\ϿÁBˬ㭩gJqέ> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [910 0 R 911 0 R]>> +endobj + +910 0 obj +<>>> +endobj + +911 0 obj +<>>> +endobj + +913 0 obj +<> +stream +xZMs6W8p`jj(ɞUJ푑h[t99l$-Eg~h xD_||27(9vz8֫VBB860eyC+`F΄PdFLfa b"b >x2A4,0٬kV1&vEzK=+0I"#b|EL Qz(mƞ؄eE +P3 +b)6a^)Ũ#;A|aGMAB,ӴֶJ#՞bP +LJL06 mlp!1 +`hz(2%f 3"sHbFH6D77T/nXtQJnҴQ2WlB2&L B U,b(9/Ӵqr؀02#[8|Slpe7e\CG[bDv0\#WpU4.z!E[Rԁ 2pjqԿ\bPPVؔəbqM)bqEvFVKl}U,`dF,E j*3PBbgb%+GoV fTRW'pZh!d$$csԚ .Fk9>ap)/gK<kq#8X(丩*," 7hX@qK!qV\LTrڸљzg/;#9S +YGp}E*;:yʴ*Se* IL,3U΢lz(Ksʴ*S*bpT92^vB\2|ʔdzYgE /RW2iU$ U6U=S,hI)\Ӎ50G?=?T=v`ƻQO<3ȍ? о {mC6{j Px x׌Hk3X5V SwͨL +Z@R5Ԍ-߈ZG3i~lzv\w^'V5KǞ'n`5'Y k3k8Rxu-)`n CJq7 f-5H)aV=!6qL[v.,㫡U! } rňbudOH~aI` xp-aC#Nj3ٳwZV=>ki+ڧyjțZ?6>%ppiA! #zl%\0(a!U k!(INӠLC*mgUbFi|%vV 8Qw_(7`(J0eo9_hY1s>>YJ {VZy{e_c}%0zi*>Gp1~zT63pMkpB@3OaLB~;S߿.a/abw't +g?(@ۇ~Sͮjsu +c۱Dʶe]pju47TW~ꊗ}[hS֟#2lm=f]43gdL/8^Lxv̬}~Y3\{v_#M,G_Xܐ62~g1}Gm7O~_]{` "j}RW fĿb +@hpK +endstream +endobj + +914 0 obj +2062 +endobj + +108 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +915 0 obj +<> +stream +x[n}Wѻ0_ 'mI<@AV291f?&8 gU x=::}YMruEVotT _?_hmz? *Φ80I6<M<2̪>:m+HT0ր^ +\ +W ܘc^)O!w4WaL\_hOzwz%bANƙ$DPb%BAX2 +p*&#6Oe/YZ/PbEa53DMcF8܇mҽ.T3} V7cQ4uB̄1cF"vƅck>F1)6D̄1c$ u_[YW(FXe&E@Y,#C+FXu +uRGXEbceMX"6S*ѲscZßi8M.3bܘ5{!;CLBLv",9Ōi9 eF1&YegUe5r}6*,UD(V1^ֈDv0í!F~_bb-kdg~Yg禲.@١&em99xiE6E0 c$E q 1%K!7cRm0 c$IV@YP=P0߻̛pˑ)VX5aTb\1 Rʺd9ebU5a-kdg~Y{=z6F\޻1G#eFf/dgn\Hck|͘&́&3a̘1*;Cr*W׬#dV֐vSŴWLc)b!֊Phl+wSd؀&&vLrY9QMé^ gS07šk!q!co:F%b !X 5B5Gr3l֒w bB10'Z!;Cbq1U+L'hXEbՊX2^*ocg~+qupFp~C>ս .qTJm!ch0bVCEY#ϡ*}Ue՚RsU:!eU +X~k5 aJkB +6&dP\ +D= xsQ_H) 5c 30;}Lv7]|7.?t7LmDB+)?ʅ\LCUbڃy|ሒt7bk}vhBy 1 lC[ )˂EWk*a⑅;8B_YR(CC9!pkup璕0=6әhAAy(} sS:pG$3&] A,҂`g,*H%&Ăf-:r,*ϗag!{a6%pe0jxR2Dոb lp|SA$X#}HA%#x|KA I/YL=#OzYn8:CFv:|44yRqjkCڊx2yaboVs6Tx|nP҄!tJt>--;n壡l:XZ'B[?^ yjR>=KvUn/R50_D(USz< s}]Tt䞭I r o'b&hZ' 5~? {.2g'Hg]>#9w#7=c0b +;†Ar?ߗN{;4WXs&kV][wX׈y X]z$d[a~G{msmB ͟6)0> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +917 0 obj +<> +stream +xZ]o6}i1%)~HA$/fQ,Ŗcmd)J"yQ}c~QH8&'3T΀?tf'yLB&q+i`)O6 &R4Bh7fFV%)<|1$\\STJ2nr9{vz-ڳD;ä^fySPgJTa`T!"b3)6chM,Rx {@b3)1ZgnX1TlcjN-d2Q8H1pmd7iTؑCz#5 2p9LIʹM()3 +{pUav+ޙy pg&ȗ3$q톢Gf! 7xfU;P ewbL?]Hϼ1WD3蚪FiNk}`»:'JrhA"HPm[뷇Xc }To=w}lۡ1aշEÎڟնmzj_>/`YSrIvm=L5E4>W5 u[FG;oku  ~M, ]T\)(:jC \}PB]7Zh!#{$! $\<&iz.U +( 8%|%xz>SpE,Bڳv%E՝, c\҈ݞa^"8_NF"ሗ~ V)5mi+' +4~g)!9cʊVPBv96\AL +\+t^u=:Nѩ`̕M$l~O0 +U ܌df'Lΰ[Xj np tƜڕ=$a~~%wk8] 0O=O_99kc #+ڧ-1 hhsWMnPE5@B,˫bctZ*\7m3˗r^]uEwZi᪱]L`YC\հVR۷uݾ`Fa(,]\O}}JV^X NE/*} |1?*:k,a1+i2E= +h)Z*4 L9b7%@p9瓦 BXaV4'V8v^x`]u4@InްHd2 )r0 6Xf( = 3x.˯&Fl}g/m 3 "v^^B:Z.4 * Ke!aYMIph Xʁ-Ȳoծb\fe?޵%p+Re!tM;bPJGt + lV y7*TP<YfD9w|)N ;` E]Llmo]9I]-u5qy?Y2'7,:yveUf19\@v_6eW{vUnTrc[I1^\> '* xlؿzFxt{jRܗƍ +endstream +endobj + +918 0 obj +2520 +endobj + +110 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [919 0 R 920 0 R 921 0 R]>> +endobj + +919 0 obj +<>>> +endobj + +920 0 obj +<>>> +endobj + +921 0 obj +<>>> +endobj + +922 0 obj +<> +stream +xZr#+a,mB1j-c|J˘KIy>8Q$%J$>J,=/խğq'w3#3LzW 3R8d !yl `KĂP0q^bC3:G;I6-gaLShR1ꝫ^TOt QWL4e,yO%/}^XBGKZ2(X0*OZP{U +VsEkb:Q0 cIXM[2f`i}^*U$a20&YfHͲPDjrsB{kY;KbS̗WZ!L5&jY'/lHXXYF^;C|{]&`>8Gp]~ ~ʏtB̄$ҋ+c&&DBMLrl LKL˜d"ņ7Cգm#̊nU,#bceM'3)FOAEej؀L0Vք^I.k0AǣemVS+51 >0 d&%&a5 +;Cd7:CX$a20&Yfg+\oz'WS+FR@-k$FeQ,c YXaV(uRV4e5a53ͷe+WIL)V['9ZK[SaF0 cI3Vip`1YkbՆ0 cI,37Cգm#ֲ̡N^*F&+W0X2u;b2QlXYV. ivwR bjdgUwOﺻg7w-'ES;:Sjn2jycx):!S=Ck±NkWS hgw4+;+%XޒҼ/e;)l'e;Jَ?WJ~KJ8"e3)لSSΔjKٌ?WJm ))H&*%rTw\f|+e} f$q|Ƴ$_7t_7//}7/I=1Y-QS;އG)nSX,RA< : +Ul9ha<3a}͛0Lkeʎ A.`qG^vU7.$zֵ Ą`; + *Ͷio[<׏}n0zL]投@dA5ڔ1fx bGvBjFafXDe/60W[kGu&)Q+rrZoc۟S*mXw~'vH 2|t Nv՗eaҥ[[m𛷈-Bõp6 +[98'͡YX/TP:ԇzJ 0ed5\??> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +925 0 obj +<> +stream +xZMo834` br֎ga%XT+XX*u"2?ær9֛7<+ @[Y :)&LZ;al7X X G.{Dcyis9q!3dȞr^> ݠ1 b~V<W9Ki bZ:}#G<梴u(mӠuyIHǜb>"0jd'Ho"7juq[Lv~оq:ӎXq˘Fy1az!;At6b$e,bbb"DfHb"F$ >IJ^ MCd9DzvQ"01n_>D<bXN1*/bY TlBM)k0jdY-9T1(fa.biYΫG!!F 5 y 18 KMID=Dz|C FvM]3*͌EV- @R<(1RŚ !y,Q 1tVez!(GFI K`1Z؄ ]6a}wU41z@̈D,W`'\eh)f"&&> BdF$&bD2N2p} BbRδWD1K1^bqv<("RbI)k0jd'HoI%μqa܇S*wn׏J)Fɝbyf 3;mxApv '͹#yv ќTV gK"L|!tǽa&"Q-<\B.M\Ԝ쩂! r[@xpZ#ɐrv=Ƹ'K$"i>i~o :^T~%`#4Vd ۲WZ-wʈ)(r2PRh_] +3U).o7&#vt#|~p{Oߛ[g&ҙ/cL*ҩab_ٱUݱ@yt qS8H뗪m8oSh'OݺXm>a?Xq`]]:z4fܳ?}ݳ8?J.~cvՇr<$>p:> ޱj`Ձ}l-DY#AҎ-0EvW籩w[$0H@Ş*8˦k +'CdʔGƧV'! tL&d\lĕIyV.~BV7SqynOtd..S47_kngyﰒUZ[Ek}՚  +TVivBmJcViDܙT7ZAֹx݃ ^jqٯ ,gެ[Wݳ*Zt^oqoN}r/*f X0dyݭ3pe,8gR`w +nm:}kO/|N[UU7x#|u3x#|uz}>F?yrٶljM ?!]k m~{*Í&*\E̲CkvI+1L +!0_:`;i.姕J28D{fS;&Y +4K%u%Y-Lóf7=p>t7kYtbE˶?V +󅍥6^ݰFPc5ֻ3o`GsV{~wڎP贯 D&ĿpvEX, +endstream +endobj + +926 0 obj +2055 +endobj + +112 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +927 0 obj +<> +stream +xr0<]&N3vwU.C!L}^YY֌{$@0N?eGyk%#0M&durn(kL9 t)r9:h#j")33LĴsg4N f s($fC"eƚXD'ĝChq:;%'vbԓ2䣉@xiX$" ]fDbK3S&"%e*ǐOT]*',BbRI}Bm%'㒓)6lځǺf&A_kHVk +9JBPjVU,q6߲MO9-# jt\jE#zQ9i+PP/6EGE##s.MGF_iMg/Ye45`lgMLEAӪ{zoKet=tۧo+zvthpqU4MwP[_ABwx凢nN+Dr2Eug6ar;ĔB^<;o/gVQج~e :&sc9 a~.v6$CoD{0η/_/ [\i$ŋ/cӄy{ҤU]yv(k'CUrt+?Ֆ^L&d';kjѕ +endstream +endobj + +928 0 obj +687 +endobj + +113 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [929 0 R]>> +endobj + +929 0 obj +<> +endobj + +930 0 obj +<> +stream +xX͒6 )xt;"43&v6ҋ֦jJr[)(J)33;978J(rGWoWibTRa1IOdBd&3"9uD,ͤ˄)[ʗ$Ŕ!i1f$ja'Q]1%dYdL'3P6җK$ەʕ$1'>}Y`t2-d!&п|̩L>, 1rs_ &-Sl) sI'3޵Li7+zQ@O݋3SyY*l40)V/8"㞱ٯoAwߠ͟ۍEA;\d\Q̠z9AOU @Ζv,Vbp}StzNI}U~\|0sg]`;#l6¸_un5ǾheQ?Db˾xY{6Cۦuݣ}T`ߴULS5$KIT(Bc]˼Yn5\$XbV>]j2~ۏsu?]m_MͩEGd4kØ3켯GlĜXNP*V˕k8/sgF=91ﺁcukMkw1.T肆&P)2`F2˧BvTk1} GI*-^1ɾg]q1ރ#`˸w/ Ʈ fQK Ņ; fWŇ EؙZFfLˇ[B|e\EJ)9n¹J-(`ɲ03x./ +yl5yQK e^P -)N,!2u!Lh bt$*8Q:_C0Ђ +r)# CFd7hB^4[}UB^_-VcC}.y m 9<97ddSR~:2RP$]!(rǶ9µ[χ `?t? ; y$1zm[ rb g<}Q#fH[\F ~Zh^ \:n\>:gs^ԝ-&ܾV[{oQxqg[/5% 3rr5t+Iv+]sQR7Нp`Fptlb+Om3Y~Lk/|I>SK^ h>&й*aŨa6|]Weџ/Qtu]Qs岋c9׾GR2+}.v6 +r`EuРG]v|O]U{>zc懅 n7#:ͧ (d]7K`?qOp:okVwwhWAF /S9V/RtӬ~ ^aϒS)(Ŋ>(e&XI*să\D7zM)ɞXzSD:,M}O>?:bwxNMdYδ 7?w?-N'Xho +endstream +endobj + +931 0 obj +1862 +endobj + +114 0 obj +<> +/XObject <> +/ProcSet [/PDF /Text /ImageC] +/ColorSpace <>>> +/Group <> +/Annots [932 0 R 933 0 R]>> +endobj + +932 0 obj +<>>> +endobj + +933 0 obj +<>>> +endobj + +935 0 obj +<> +stream +xY]o6}cZ~K*I;.@Bc+;JgϥD6hcS?FSHx/t90z`C@L(,gsP9TLiH|ܪrRT1|m X}@bz,Q,`EdI^**#b=U΀{E.˅x=],ۻ_Ŏ٪zl7WmGtZc3 ͮfmu߻U󴮏 Y^vl:1o?d`<^UGy}|jU˞OskYgc]np[^F $}z$lOT —c ?g2/( +bA97rki/ZVe POn,N~ JWS٬>Q::6j77ͦ}v ǫ^qRVSÿc\1~BUcUP=>lVnjsŜj1^\?v5Җ*][FB^wTh Û\DޛC?\ ^8o&)N$3˴o/;S⬝,1R%uxYuWBaO;Yq2+scIblI (9_^έ=K|3T瓵wd3͆c\E u\-&DB +b5K׀NSĻ2xt ~ ~;!0c7^ԅ@E>Ruj>>57w"sSfBedY5] qkrwIy<5ձe5E 5tB aGƋ֟<@/J}zzLfeg ԓV-=mqO cBAFႎc|kAoa?[GX +endstream +endobj + +936 0 obj +2112 +endobj + +115 0 obj +<> +/XObject <> +/ProcSet [/PDF /Text /ImageC] +/ColorSpace <>>> +/Group <>>> +endobj + +938 0 obj +<> +stream +x]ے#}WTľ+ +oe{8ew93|Hd $q`):$2O&%Tg^$U5"r^ &W41Ÿ~[:jOE-1nW"mƖnMQrܳ~Pr!=x)%WtT.n:e2f?*}YrqId.J/MS_+e&/-JW9f(26 C d5Y{{4 ,>,i0xMT\?sO:t0V9oYAŋǫۏa8l_ o{x|@k3. ix'WnX=k=<3 +}w.V6ʼ# S\Tq˔2e=5I}dtؓb5T6[U:3=cQˋBR*Eu$,+*Or^REBC_ &mp߁9 *s,I+} Qe8Q*/1 wJDٰ7VjvG؊M@挘qF1ngq݋(24/YWDljč=юqʸ4ce+Wg^r9uɇ67nfk|CWmD۪1 X[ƣ,.VV޵6 QkڑmQ2&0Zj2x<^wU$ފ0Uu}]K瘆EeGS#s3#j{aFDOto؟isd?zxzخsK!!0t!ۼlsb~)6pl8" {1Η3B9g>/*EBhBQ\ecjخ@»[&T>a>@{iQRfr_ͰLؿ@(ijda%1tdI1 О+J+]Jp}O L쎄/Tfn6Y2*T~_0ў$ĉ*]cV`MEfªŴ?Jx螅jkdE+Ul}=W[UUK6Ldt"2e6SjǸmBRM8z{T4`ܞ^Dg'p>dxk*0Y~6/'`B+yY '3Yb/cq __=1Mu7uѻtoy2ۗ|= l_ +/X \UDuklBڻBtV{"*cdmݝ:ﺚlBH{Bd8'h"jB7EhofƯ㋙aLvegW1qaVy&ȏ7}MIDfQ4#6(Mn3c#-5/yjK=.3臑A&7@|` ;970mPi`a>O0] ͦa=~"n\ qx\(||y +vFBW\6(ǂi0 Fv 2Ԙhv4apnUHws h V!90`0πLlҺ(I0r GN<s<h(& !F.6dRr0p۱jؽf}~sCu#o!† `W9^ +h$ VT_D{B:p #IAxvHX'xX.IH> .C-_aVYkv2"TbJ 4E1}о{08.ՠ@a.P g.aU>!@ `$vP41ug'xG$$2.v#04t^GqD5Tݝ`FD=Qny h(EFP:p>0 L d yx}PB82ya*x őX[Ò^!.b1KYo%`?8"@=Hy)3Ag-Lhgp0@LRv+o2o)xT)PuI2Y1,7Xā\Sw%ID~<={8NF ݚʧY"3&#~ Lk,sTdq$l<DNmUcUEZ`Ǒ}r3roUƚ84$5P9ݯ'isZKzǑl<*`r.y_X?$,E0tH"zh%Nt֏#^Űy_/&ܤ)o#[8;rǑ$,}0`Hr8՞h3GX\gn`Y}ζHu#IK0H"he7 }be'i,Č$RϧoXzޚq$#&XZ`~8(KQ跱S|,֕v?Bec/B&kN#Ժ)gH=Ʋ^9˹`J#|Rk'ODurYJP]DGoO"W9L2xF=f9o"ٖ8q̌-ͽuc<@.H!ra [%>M7 n$=ʁY$NBBXZf'[84Q1WRz֧HN#cF n$\vMxԳ/{O@ᔏUvݜ$-) \VHi%-OH8+HL7*,$$\!,sb7T.d0'/U :'nX4aߟ$ nF56^ }A仑-4B'X^ħ~=1;]Ɔ'?mRvbUD Ή5ivvNXhQf'hs^֞iGw /Fן;A@%> _F w󵘏}=u7: "Z *jxcK6d#$ #=h$W:'hJsQr9{L)aP (V. ?=o/gT^4rn@&+x?|=]M +Y=Q?6hPxdcgprTK*r`  vTz[߂}~=εs#NzvenO`Y_. BFrkIخ׺{>bb9SE<'$Go*`fGErPI"X&S3YK?xٮ_ bN@LRʕzh3oO؅+zV vlET&mʧ;ti߼~5||ͻp5fOOpsݼ~=\=\`M&I`o?Oz;>\ݽ`xxOx7Ca}Y?]7og߃O i_^p׹7&Sp0lzyν<;_4Y'U\S/9^]00EN7asw뇫ݯ֫=}0JI [O -~Sp$x>ßOI\e@w:~M/_[U7#w9x +endstream +endobj + +939 0 obj +5182 +endobj + +116 0 obj +<> +/XObject <> +/ProcSet [/PDF /Text /ImageC] +/ExtGState <>>> +/Pattern <> +/ColorSpace <>>> +/Group <> +/Annots [940 0 R 941 0 R 942 0 R]>> +endobj + +940 0 obj +<>>> +endobj + +941 0 obj +<>>> +endobj + +942 0 obj +<>>> +endobj + +947 0 obj +<> +stream +xXKs6WNA$wrLt XSt R\@yb!F(~`5i-RN/-D5 +"J( VGcMVa%(0&IuSN'dd a΅8yg`ZY(ѱd>X,yF^ĬHLkFim%W2%w(1NWA: ḇD;^XGIN6icyw,F "\:F^Y{dXog7XrJX A6Jbq[7ы8haAgq^ +\/.ET[;!ieREI*V,JH7+;@Q$7U"4O,V4#qG-I eՌu߱8Ԕ0Uɝ&?N`"nu_LrbM cT@HcvD"ʉBIaHj/f{(e|I{ՉL`]Z $Za(dbf f.2#1 L>s4`@BCL~̇ 1q`)&*2n; nlC(TS2Peg/'6#I,Д3h9u{/'vҒnC!'NDu;}]x{q^~Eqgߑ&>V M1FNnMt)qO=f~i [K[;1 F<fVEǙJ?}{BwN=0==Ա$1e?ΦԑF* o"M$0]O8t ki(o yf\vΫcȋBNjJK,>â1Pۢ)pA"puޢ<t + M>Y8Z(-ix.ʺՎq\>R>mKt8jG9rpAwZ%s"dNŮ>oԊ"8?Z::gdn{jSM6k;}w?z`Ƣ 1|1⏫/7]Iֶt94%pEwLyim^] 6Dk|Y",?\Z:ÔgdEq"ņ zSO*/"=Wכd5 化HFo. KV6 .bdJ8e:{<#6IYː7lQ۲X0^EX`՘7HXśTθLh<| +endstream +endobj + +948 0 obj +1496 +endobj + +117 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +949 0 obj +<> +stream +xmQN0+XrS{H6m K3#-—]Ȝ`KR6tsURsn:$-$R`WEC Hђܒ'"zn *YIK xV9:o|m* +juw ddE1)2M$AQw[ti$M!Kf&w`=̱ ;?w|?M~-ې1c@ٲ/< /tUbHkM%4Ro┫V{ +endstream +endobj + +950 0 obj +293 +endobj + +118 0 obj +<> +/XObject <> +/ProcSet [/PDF /Text /ImageC]>> +/Group <>>> +endobj + +952 0 obj +<> +stream +xWn6}W) -0 SP;"kj+m fC6Gᙡ)?\96a)`—C[uY2$7+U|EI DΙiytp: HkP% KؙwaQ$Kjf +NAݑ4mӮHyw@2S\4_ =LaЎd&Ou:v|)Kp偌9tý+u{88= փa*fܓ|IkP[`(Q}bUP77wrGWh[QHvc4HeY*(`|WyOLկqR4ñ/&l#s,9}S tʜuilNun -ԱwN䏪JyJ5nr0巋t}vq+ ;\pPSgxEZKa`ALJ,) \e\0l dž` + c\ CG1%4kj(bK֑=ӆE}c{okLz{e5'Î@~ k49tۇKlm˦npf:J&*sGO|5 +U9M|~Sgrɗ~H m{1m^8c4$Ƌ[`#G9Wic=v-l!nulF@~?v\e@kkK/iPU[mW}q[ +endstream +endobj + +953 0 obj +1225 +endobj + +119 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [954 0 R]>> +endobj + +954 0 obj +<>>> +endobj + +955 0 obj +<> +stream +xZMs۶W`qXt:k;43Q%#ђIHT̷y$qqA+l c{ /J_TR >&eW ZyWCrk~1\k/l!ULy0] asUꢔdRp5 u{ dQrpJD8ױ̀&ʛ\)@N| )f +‡ȎaMp'bD .r-$/=QSbA> +Gi\- Qڌ DCևp#{ۺb2RÂbCDaNL'aِ>,t0N|])K6OL kvrX߱ߓibt,eĘ0"upl;U8T֯U} ݏJsu-o۟NvLPGky:#q0!#.qD +%'ZDI m>eHK7/)5󁍈?+ɠ$$zCڞ,GAʒzV2ruMvp|K2(ųAI 0W2 qf2PIm+%d> $R<;gX^=) 6LaD4MvѶp>{J.`Ɗ>YoIxv(na}UB"nB} tгܐh28T[A) JЗvҰJOKav@6 8STO&"&M:QiУ@)lԅ=(s 畖,҆0"mWmu\ߡϽ"X.~PȢ*}a}Bՠop̶Ze ͽ,\ FrX_Ȏ5s Ջs%ՋaOr/)\YbEcb楊ESŢ!&"Y +b|OdOQ,bT1Ģ1KEcDF<`{8e8ޭ<.}xh7}b1YLaEB(U+֫֫ˁ]G„ ',O{4R8WRQur"'"ܙ…=6R 1-]b3qCg`'Q,bT1+&hLhtX4:FuZFEɡ8f@MjΖ/B1#B#4 ϳz5PjL=-TaOHR1~b";+!kkĨ=!"ܹԺ X@.ٕ*NFp!{b !E*X4:ѩb3'F yK1/}Q RɅd*h5`Y; g9e#J$=rJH\IbDX5kBNE3 =K;V C@ԫTbCL . V8Y Q,bT1&LrXt9F.Ǩ yV#Y"iZwF ' +oL!ϪFgOAO[bZvNoXr%HR1~b";+!kkQur""ܹ…\C _^fv%ESŢuX>]rK\FGv4:Ul0z`QZ"biAF"lh~Um =^~$^XVԬj=j-˺.tpǻ2Ke;`h.fHiq~+z/۲ 7pm/D]C;&|r0!` _͚y엫Icۼ6\h?n: VXy|c_&%|)3diW7ez[﫶YXp kpy֟>Qռý*\@bc;@n̏qWs*rpw.'~_-jƻVBZv$+7(1 +endstream +endobj + +956 0 obj +2448 +endobj + +120 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +957 0 obj +<> +stream +xXێ6|cbW€'7p; peVRۙ%^~YXjGv:Sp򥷻_vytBiG)ˤ&5gRʬd%Sb~tR-@]̼MYPʳRDyrYG;V*W RD.|NN1$4r؅ޅH'\ykTs3V,`% ϝ>HOq*D,,&V (T1E)Ȓb Rlb>#Ŭ={eϴ˚c פ˘4#%IdXb̀{#DŽSLfvZrƌ7#?vGGjS6i7y9\BO2vGb^^dg3> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +959 0 obj +<> +stream +xZn7Wp4F`@ &`6v7%u]*Y*a,[>"=/6* +'?0/[Y*acR7 &h1QY)iSiMD f+(MG$"BLV\JN]{ +m@d@[-#kdnMWvr5U,a<$ HXĂ2)G$W,bbI}"RE,(=B F )㍥f*j*,i_ +do\;}R x +UL&"̈eg\r rLWp;&6 2'[GeE 1+D7QB1x%$P+IK"R(,D XbpvLk1b)XP,zzRӴ/PzJHwT +šaH&3bY`""Gi*ވ)[9ts!!̈eX&Yddói7[(XyjǴV$@tJL11LNdϐL%L9(y^JZ*fS܌%l:$ޞ50ӚCL x<7 ɌXax!{'k181VYhCB2LȞ!"q=o}zbIM5"b 1LNd[!+Ν:xyXD +"5b׉=Cxo~gW>MS[)N,fAzoWaMw|etTt,6]4-n=Yf݁}wlHא;!~%5yl-_xXr*fY(U.b<4݆|ɯ#$*tO99!*Mȿ}~z0~8S-?xVMBK8/-o<=5V|.vФf0ޯPY'CO Z"oJŕ0kт%Tr| * `ᅡc5RO|ϧ [K}۠{r~<3ww]p@x l1 rI@#\}+ar֖ğXWqUR2#M2 +endstream +endobj + +960 0 obj +2188 +endobj + +122 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [961 0 R 962 0 R]>> +endobj + +961 0 obj +<> +endobj + +962 0 obj +<> +endobj + +963 0 obj +<> +stream +xMo7SB(u'Ry sc0861*NRg9VwX)[:ǝܱ9vbը:#|V`]9%CqKML0NL%&1J/RgDULh9nRIa=l&lTg$ϔ7=J݉cĴLZ9ʱ\{,)CGa#dH6Բq8wDf+kb54ߖrfL9_G:F!+n77Iaw +G[ װ4 .)pz;ߋ?on1Wtk]>4{lJ|}C#ϻVmx>:j|a68感kH7NAXt- X~u6,`2Ua㾵76<ڹV&Gॊe~]55N/ci=NR!3bc@x]pSD{Ǿ[q_}E@kwVRSZJ70mBHxx0$ y :42,ƌd0>-2V"Æc&2WIX~s P˙`p;UiTC!E{- ("IQz%h#Dh$ƋUnYj,ϕ> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [965 0 R]>> +endobj + +965 0 obj +<> +endobj + +966 0 obj +<> +stream +xXێ6}W VIb&i4qgZm5舒|PC]]&ExιIHiq0bqJ*X&K}@ `@?7/9QcJq,pFp"BRg?9xeU BkD,5TF\lP9̛hqP_TYW3֙US]ֽ]@+|4%s[sqL;d쌔]CwYqNbLW4CPR? uglꟅ&k/]GŧVRW;K1yqҚ { قބ܉V=@c5 +Bpm^9ʻ j7iS\<W1Yq?|La^?iA۪ޞkO5se4\&nP"hX)*kpl}s~3վk*VE@ +]Jm0z^UTvg3IJޝFZ<ưRٽy:TMAWm  9Cö}.FBW]`\u ~8ƀ+΃>ĂRL705t!W΂eϭ.YEo,1/&_ntkkS)kU>5iq_mT\ +TGU  +{! ;I2hh%نPk K0s-5Y_$|5`b5V~ɜbvL{ٸeu5IY`+6쐞yɦl;y o:s'{.z1ĺE~:5Y_$s\P{Vs@5'!-bGZ}.8}G=tnޞ s.{u(_'kxuh"Y1\<mUZ/ ``C&Ww]Hh'Ѻ'ይQC;pb~ 8h[#,hces r*#9,Xp -nIA'"Yd^s\ +&T>js+V ¤ִC?M` N%+ XWt Й`A4$lNd}?ҭ:+ #H%'lnN] ߹zhp +endstream +endobj + +967 0 obj +1573 +endobj + +124 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [968 0 R]>> +endobj + +968 0 obj +<> +endobj + +969 0 obj +<> +stream +xYMo6W-%JIl(biO{Ql&Qז4?>E*r"{{lD8o8##Yٻ +Zjo*=a$Pe@D'ʮLt݂2>W(ٛL$ɜ-dYK׏t8퍷'3ps<O0+Jeg"2&D{IgJ;w˰y*ft68zlu2ɼDuX Gobf!X'36^*F\Re!x^Gsœxi>b$tA瑓9' vuʱr;waSǕ PP"7wUQ|O$"#C?6+6y='}^#7Ζ7f~1E5yŦU^|:V4" +#q6DJIh뽱@sUP"扊s4Fg]~d rWV͇|S^?4|NUJ?Y7_}nr!ɕip  R I픤#]H..?5(@GBe7 3FxqXK+I 1X ,⒯$t]L%f""^f FB$!(]})څ#I2NdG4 T2`=/(3:+)ĔCu ++x +l8`X`@_NNpdK +5ΒjR! AjG&>@` n`Sa.P$+|6={5m +9/ttab2"p(J6B!R–򅖝AG "5cHpbǤĤqYYn!2nN] @p ?+6hT>RL :i[v6jrѷ +n_ eSFaQ5ԏ(ě$cNj Nh OG9Qí{SXG.>/Ⱥ,uE})ccʲ6 Hv]Vl}&Ϊ=Ɋgr-wjn&Csy Ywn|QWyqO6;6B_5) lObo[;=Ȟ>eՆekM‚n3\xC_J4QI7߬I6W`@KZ+컯ɽ.te^f ֻ[ĕ%r</3Gv\L쐸 3$[UnO> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +971 0 obj +<> +stream +xYMo6x~b`&/ "ضRCR៙CIjsǪzU%R?*VL Pӗެ߯(eX(*JsCNV saA +(X a(fB6+Q3lT&rƞ!$q!ĂJ"{ 3**F,e{hFr?=y"FqY2q=ɘCfsRa%X( {dELbJƭ^j8}$ ?-]3MNlW'>gmT,ʱw Ii̫M +r>q韯a_Pp3A@J* ݛMeͬhZ3,fz8}wlkS=nWPL+Mek?US=6MmPugJ0fj+3h?,gQ).U!|XC%ꁮQK'$vvsD cRXD{+Z`3!0QJ& [ 8S>uZ)Q%yၡu!_7{W6o͡(i.vMrpyLZNubs8(Jt.60*'$$vMr$ Y!|MbudObg{KBsqQ b]6mZrg$Ps2ф&-ӈLn@le)U`OL\Krg$Hb%$w(QG\,wyX-wv܌|zJaC;Ns8ͼ6& jgz0^b"[1A I +Fdl dE\cCF p-}f| n" +X:gT׉^_n tyq;gTu<̞i.yQ444N`%z% <jbϐ(y’6؃pɇ$y5I"%O{<$1ӷ$*I~D*H1}8 9.a.1XlңtXl) 0f}H 8>tt,E3s\쬧~ +SZ9 7O0d={~+ɂg4Cb_֒g<SYS[QgZ JNSc^m+jg_IR[ŷ@tهW>,߻fKfߛ>1mE!aF& c5_6pæo〿b;ߺwrcd]V}qvExM];f$no2l'PJb.=_j鷻6MU/n.Q8<`Ňε+{oP=/M_Ut_ϩ严u fW S+XjՆ>MGԿ 2m:#ߖ3<}uHҶ8 3[*(fT[i 8k꿣k5b38Td\b^v ݺpKKtѿm~>6uR xJuB+?P +endstream +endobj + +972 0 obj +2061 +endobj + +126 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [973 0 R]>> +endobj + +973 0 obj +<>>> +endobj + +974 0 obj +<> +stream +xmR˒0stRC&![Y@.$9D5 LwO()ӄ] z0j>F_(&IZJBOLJ}f@0R6j;UX ;ao?@;VHd!Ӝ$: g&'9x'%wM +endstream +endobj + +975 0 obj +438 +endobj + +127 0 obj +<> +/ProcSet [/PDF /Text]>> +/Group <>>> +endobj + +976 0 obj +<> +stream +xYn}Wgapwr۹ jZ%P"Rh2?9M4'뼏 XQKWWU(&K8IC Ź2#Y̰Xpm|NFLށbL؃lVրիQb<;A5z[)48ؽDN:7Z`>H3bSN!rzr +msMͤyJ r9>aaz̓MI8K6-ع;sɦx EW4i"k,T4!U1`,tNyu.}WM#8!qt9;B3dZשɺ4)9uV+n_Rw?mG^]o&iHk~ׄyE6-.ʶEW~)ة/oX̮Xr, e*WyМKvn.<P|:@ !CF>Ө:/υ[-+X[Nu9O\L•9ˇ@SSeս@~䬓J*;+z >_Òi)zls9c%bI cΧyzqYiww>QXTcj6 xZ23$-s 2_T+>NGw}tSоS +%.5*S/v" 2bADzERNr+>'k6gZùjUwe4="(O*7qN2*q}u^'e\tnڪXuh:[-jS5r4H1T?^Sɏů.*BbS/*NuX^7=-jsq<^Y{@a_ +?_>V^_g{&7c} W#3C>K(WLߚn! 5E鷮NOuAޖ*k4kƧ\ SNKU۵/jn66I_) 햡듖w%#ZFmʺufv\ zuRanb09<;$ug:;I5#M/˖`d6=_m0.C~ $zBC@{ +on\v{7>Gxۛ?{T{ղ*)[p{Y^\|MȰ5UKxa0:DR=dFd8;"b50% &dFvc 1s@";*@/mKc/#E=;Aw^tWϠKҜ7`ȕYzR7tLQdwrcČuօ1bstJRH)hl#P-[LA^&d.)ips0܃QʳG$d@blܣ13 3 zV{D^Qח3Xgns.n6X\<x*~;7u_f6M}9jgbkfi.|0Ұl_ b4$̸,pW]y,]~Myx%Yd 7 K8y<_O׺0mJj?pI^6/#C+A)`4 +endstream +endobj + +977 0 obj +2083 +endobj + +128 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +978 0 obj +<> +stream +xYrF+z)\H?TjDQLl&kS DBmp/i(,s_}oìCgJ;@f݌1^(( + JQRf&EJJE%E>)/LrYƌGs&4,h4F=8d5 \΂EK|GsX͞hQ {_=<?He6|x!fԅ*fԙsX1&mnc=2XY9#"dY48HV9)s(k 5H*H KV(TӪ`P J^ +clc6,w H0$nҰJ] qJQPBޞYT$x(̹&%$Nen3%}@aT0R\ L2FK*x\a+*=c-cLvkSo6Uk7XrZs2zaJc-IgmGaqE/(/kTL<Ѻ^ps_K̘i{mGp5ܓ B +^"i/4'rSF_lQ^x \/]%Dhy9ssiUfL5kcEՙdVZ2LWG#q>D04ߧ#y.߳rlo &7e= TQ[沌dhXtpOem"+Z  9gtNR4WPJVc>dV`˿17#3 He@R |\JZ\YD )m7z ד2NF^j B*;95[6.x.kKckhA\,Ua \{0rC;I&ah1֧D䓺LN/Y"I#o_oKL[:7dТϐ;_T8_F>~5BW#]HU99_G*/s4]4g/&sAz<`+'axx} )Gc+NQ UݍF6S{]ɘ{!WMӮq.TRo>7$5(}f8UמVxmnփeyɱ*|ݶ!kO r9ɶZwH}"ݹ4rN3o\O]6S{rh 6n+8X,D-L(3׫cC*)~b/"˻ۭͪ'9_dpnDL3p2NEku~ɢ>w}k,)gDБڲzjH =B:k<)V'?mVO:gpۆiXVKnɪ\oZP;iP:cJdjS=>:^zaCmk+&7|L9,+ %Eeb_(c18&RQj]Y,M1" YAƽ,C+*a!r$m6_Is0- ~BQkg_DK|`(bh Gv4^*r*~kXm\&&[#RY_+yw>Ǧm}ٮ=5刮@ڮ^_Us82I|@j"ǠH<΅ZPTF%KC$+aoJi K!+#Էo{D`i/ 0""rQK6<f P+ť9[TQ3_ 3ԾQz=}7 Εpڭnp|SS%fӶn7m -~^? +a$А-~OޏZHNuXF0=6f_d7{e >|zn[k$ZC'nu6c;}B>iu$:@O:`E+)<8̓ +endstream +endobj + +979 0 obj +2136 +endobj + +129 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [980 0 R 981 0 R 982 0 R]>> +endobj + +980 0 obj +<>>> +endobj + +981 0 obj +<> +endobj + +982 0 obj +<>>> +endobj + +983 0 obj +<> +stream +xZn}WL0}e q -Q6whɐuON1fGӧ[aߵ#`b0(tLUHU%bj/$~bO9& +K&Dy+!LBruB2ôs“/2>.Lұ=cjcXE,{&_ޯ=g,bNh !I9,ma0ҞxϐlFd"Vs;e錍ɌؘQb{(''ݭ f#[[z {fkm]/kkݿf Y|dw?-n(7180ì{įUQb)ta4͒xbeB [Hˈu* YeDV Wĸ&J02%K޹V)1ր1 W"D +m7|ƱL\WF[VVKm7Z+~oϰQ:9~}ZA%n2)@u]Ϻuw vn;"Jx!v=E=9>=G:MqJl[-g(T{ylW=cMst(fM*D0=\w{:zV׬f>n&F*ĉNAMahHqG@FY-SsN&0 +`Za8m];ob|X_1d:zO dil&tKm +D%'^N e< 6# f ~F{2ߒ_+߷͞6it]] +eؕa֯qB*oll]& u +-LAq=CL0e#2OޕV)Xr3 +X:x{)s" Ö\OZFhZBψu"<Ϻq"c6ӻ#+0iN‚*aDބ堆DQؾNF }kla +xgHԜɨ96B.FH191V4'fu!kNK՜%}ltDZ7Cͦ+U TC͢r\?4=<7vӮؗh,WIcy^mla0 +Fa07tCq36}ms0(=lhgf UPU `c8bXE,fgaLQ,$mHq+"o* :m}[}eNh?"ϗޮ=C貺IfPDuyo4.cuRM?<~_ф +8$m q(%!UFlg^(bJILO +8!b&LNJaE:ԽICZ'm ,eg3lbPBajrQXBJN㻢V*mϰ$ty`+-۰/VhkDaZ`Z)bi3,H{XCZkZQJ:)!Hi ъp^4:gNrFedzq֞;zbffss]^q}Վ~tI ?7v1s**ߑw/e*[XxIXA/-]å MJݕ2 | VR&!R&`ڥKK]p)bjcXE,fg2i2b9hbT&n4̕y&OpSpR.M"٪؊e,n76TVLѥL\pthgMfc+aYmhb 6b)VR{\܊7Z_A "lEIį"כ'ӆmVL;ʎcemD ;WREյ򣹎raAPJBh5m\iN<#( (06agHQ2lE'PFJQRFKYr\ec.ܱ+'^N9ϕT붯V2Yl{i`}ӿ4 ]PP{Bař`Jp*c[̔#8ʨ4vq7i<''N'UYZɿIz*H ys=p3勼iNsPxr6ep'9(?!Uo>l7ѶƋ%WXycfI +G4ʡw4m<d 3z#/@a/Jӑi"'UO/^"tn/Pbܮ; 9d{ q7< ģ.'l-C;wl٬{òb`|ßS[eo +=wg?:oN苩ҢSX?4 vSL +endstream +endobj + +984 0 obj +2773 +endobj + +130 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [985 0 R]>> +endobj + +985 0 obj +<>>> +endobj + +986 0 obj +<> +stream +xXn6}߯ࣛڪA[ MAeR,Jv?QH nߓ z<rdҒ Hb)3ʹAGaŌ-3FslS6H֬5:nH,@R?!w[8A[Ϋoݧݏw0Qbg.nP86Gvف3rd^;J5x>b'تR{ TvB k2tE^wT#|+R?Yۻ*y{%Ԍ ''`l\ +Zln).l!pqzU-&-*r2ՙ-?0'Fs'(ԗ5SGMYlIuPQOȆsxZ6'lIQ=;ҜhhjxhUTfAJ:x M:ܩ[LLzۊA@+(i,?HX3!E9` J޹1`)P Tu6{.p 9=-z[> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [988 0 R]>> +endobj + +988 0 obj +<>>> +endobj + +989 0 obj +<> +stream +xYKo6W Ctۉ 6=[qܵEdQEd=@h7Ù!pCw_A +/0f[ 0 jeErv1\PU C2@$5( SBW2 V_2K@88IVkq/  +er#dY=$T3XF3ŝGZCk ^Vp zFs,F, UYl%oE̶^j@D2I#I1/K"dX_Z9K[=V0 ^HoCAMHkg +j#41jtBZ+P(A%f +DX^ft@RVi84(č(F)Q{&j!UHP q :/HHB P=D8Rhfn]t'R T%*VnseZ3m53r7|7UD{ 7y\.W_nW] W^kEe^[VA_?=dwʈKr,[2+%w]sRnZUKqG>dT̖GD ']-& þQt7XF~Vd!NѩW.OEr*gv|/M?U]|8䋢Ec'/0 <9g$CSrp%¤ nSƌMTTJr +Jw אJs0BP>Bb k0A-EoUXEY:e0\0b \S0F.&,C:. +9zcj~xMd:y7$H(p ͕8unܔ1Mxt*"b +өhҸVt3dT R{^N+bR,|< {cQg{pP*'a$<54K7)q%aM%…Loq}Fb[Bc|$}?aAw0/7=S fS+aKh}7u ,V c*ƭ!3u:V;\7v\|;]%U6I-Pĩ WS>'j|@ 2ek_1]uՁk*T0u'ETD  bvMx0|7x a^UL]K7k@F'~\tD%)bBpS| Y@W#͉q'4\Ƅ~ft35 &<` +sy̾Wq K,6|嶮w:[eqA#da T#3Y}:(rܽ:AJlӛ'yq=7i/kF X۞'c\j!g.JkX.\igboƄusvb~S5~I͞Rf/Hvڽ-uvԭd(.0oӒpst98/ I#|FZaǓU}s 6(Q/u> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +991 0 obj +<> +stream +xZr#7+pf؁5Fp6Y8ͥ= ?PEJm_*=&/W$8*yfS+_h/J5! S W8U3!Tŵ&ʴtKÖ|!M0]= :]F5ė)& +vmZ[LGĕ,"& Z]O|T=F/RoEmJ2.Ӟ "y0VFcQWI0'Ho-o:˝`ʻ / _dR7/MP@,4 INXQѝ55,SKQ288$E K'ku({(3frV-ck 2% x,bFtT&XD2E,)pjҞ y]˲@Sߝ T%)iaSXHuB7$&a^CZIb +e) +8Hf’$,qYԞ u?{ޣVJ 5ַQAC7*Ҽ$Rk(*AZ;Ak9x[x(7e*b *U-[ߴӡo }.Nk;n ŀf<&B?6]sQn>ۻ@R+}Jי(*QM:. bJZ* ϋ S>%*hnI4qmP2 +NEmƼd "y]}';BQ. vu3Dp6b1C%/Dċn/ڂrhj~-՜u1?it\\CQBl7t~A7ŬJj;3.SbB +endstream +endobj + +992 0 obj +2120 +endobj + +133 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +993 0 obj +<> +stream +xn0sE;+*pU7nݤI9⁀bBN*+Eefh?{ aRyw(0{('y}'~޽$ՏԜLU_An}I zGQE5n@G4ԥ 41Ni$yIsY1JeTvP^@|R@1xP`# +] <: bRQ̳45'eYFQc~ǚ47 *>tW9QA!khZ9e=БOCc! thhF}"yKMTup4tc5Mnp .ebAa/]MkQКdgT)6l[mR^ v_: +endstream +endobj + +994 0 obj +668 +endobj + +134 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +995 0 obj +<> +stream +xZn}W7pbcYA8 ,RfL)!ӼWشK]NUE(?4K'^gA?v,UqT+R>(e8bT(#-&RF}Flę8B71"or]oe"T,YEִL$j`a3ʳ${vjm5 DcwA YΔ`:So|0INܘ2PırXL!S%`tl.>{3ՙb\#Fx!d6L&TLg?̜<5 .0?%Bzv|Y;٤O_TƬ[֩6(?MZ~P#"O~e[k{d^,ݥ;,KEIb_>f˝tk6yL/dW`}7KlR Ş,-y{:mXb#rZen4?գ{q +JERЪ]QZ>*ïUV%"`78^t6et *".Y[cn O\$ulK#%M'&t,pC 0}R!8Fރ ]MxuexSEm$[{3}emHJ^bi +`lVoxwN6Ζ퇵Mgf!ЛUPJ$][ҶX ,cF_o}$єGTm+F *$P8~p=Ң5+2߯+?W_{4뾲%N=6lK; },jٶKΉ@MNQx?O[ȋȟwz.9Ћ·g5yгhUO9"a0h(NH҈F -Gj c(i sXGc.v6 q c*xE!v#(oLT򅤒340>H3wPHpPtAAb %cA O`)sI^ +yuho +:q~ux*aR ۙ {t b1njM+=3P0\202QQ#|yLe3AGӸ%|\;(oa,eHKy`COҡwZ9ډ5cC(N0`: Xp&0cSe(el4_!5tG2/1씌kpM +n2&9&[шȒduk376`wp{ lΔKOpжFF6^ m&Sܮ>zsBa qa Waz3M롘&XF+c|B=N顿 ZSG(9]_:jt\3S+.`a0/`l  X3I *`G].` ԁ.p>3섀k]?șFv *fSLvcܤ^&r3brv`μL&R̂. ib6Xd17A5Z>X|#1SvJxNSjlf1'fNpOq*4aܟrQZ,&0|PNg4I|)x8Z&cELPs#ji#OvktgW?]ͣ- 3_0=8L7U$?d{d/wVc&aPZ> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [997 0 R 998 0 R]>> +endobj + +997 0 obj +<>>> +endobj + +998 0 obj +<>>> +endobj + +999 0 obj +<> +stream +xYnF}W0}ee%H<8miMZ]ƙ܇=d_{c[:>]E=_9޿*ZËCs+^k,F H[Xbs%g¨⽔0f JkU0ei.3&ӥ*VsELEv T!"˫kګhQĢՑ=CTZޫzw彯c +$Gz}ڎ< yFV{d"& g`ץ(J7؀<6`E#{M}*.*TºRGIkc(Ήʩ^*23b1"{1STRV)3Qd~X|6g \o뿼'sw䱈!+#ҹ&+S`<&'/btF <6`#E,*tJ9؀<6`ٹX:g8fH9yrV\ OW׿vgwl]jXk?3yl^s͑>+m{niݰv{9~}u@M^o{lضޝ,Ub?^Pudžϧn[wA?ևYc|~'ͪ훜YDK5OfYLnn@N|w'v<:VM}aj?"$%E*S }VeIńVP6:q[J_dtUJrJ3ԕ9_64qc7BJM|M>m[(Vv?u-f1{nNTOOTwВ0șyE*xeF +K~6 KJh^tq&L + Q+`x+]zCU;RIwi%`!&p;Ұ e 4iM)kP8l*Ku5Ώ{{|/-Qy3,N7U,3Ȥ0[[8!ah8qyd++{BR#9a!̑=9œtMaNŕȞ?le M~+]~PO'q)4.*(Sنzu/S\TYRY (|AdhEھ4]}3.[55'j|~G حq=]H(y)3.c0o033<͵Jߢ @A<cII MR,Mb/悿unhB,} $EIaf#KDycL߾aم R0dHBMND>P> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +1001 0 obj +<> +stream +xXnF}W4' `[RX/%@@K %*"QNuͦd3ȭbuiZre JFAKzf%▾$3Ez (z$d3ƂLrg@BpbƂ$b,Ȉ! QHroy&LoK҈M9&MGpDYoA&I!ʷ\rD<"-˼Np`D̍(FQwg3r+:e3%*c Pc=HfL Q$T&jJ9cjL 0GQwDiI0 ջf?vW7\هn>cqnf6M Lu*G3L +/'Cڊ/o`-{n.NҶ+-g?>צg⏒\ȃɰ[]ܴm3q˞.iwN/8흍[kNm//Mb'\JlqxZZQX4nYװ@j;|8% F,BK9M(|0*̔626?PA聒cLB2kƗ ~4= R]y8GjfH|1T)D-Wk(].$9δ\N +EI愅+jKɲʏz44¿aLGby(\F{7 {é,ljuo4{r_nh-{LR:S<7t(c7S{__nsSL(8Ryw/_ϛ!_ӟ6)ROӆADE?џj7P+5xq]~Rʄ1>h(5 +^bPv?QWz}'ذɊٯ`&.ʑC]7__"}MkŒoך']3e}KѨKF""ݠҢùjx'IPJebF;wDwKưov=] z`gWHKf?nF&KxtsR2QO +endstream +endobj + +1002 0 obj +1820 +endobj + +137 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +1003 0 obj +<> +stream +xXr+TR@\҃LUVp*Kj=2PTn}#bbF񭙽Cjz&!?tapƅ߼qD5rALd7VgW.0bT4! { Q60Xu 띴ǡ;Sb̻֨)jp1 +L1-閸L+X֌񭙽C}Z+Qԃii`Hʾk/;LE![UmH3c]d2⫲wn\S^{LI|;ۧ8?LpXlx|zNq?~}|_y:}CT=LQ 7Ř}k&%Q6K+1{eT*LTOv7NZ6"p@Ñl ܊Wf ]aBSFZmMW[&,)hʑX#~cAEnk(3bL2![`i3UW*98wG`V< 뛫/v~aQOR8&)}_xEBRۤů߿<~E< +խnILq~!4RxXK*AEOa%̲R ^HLGeҏ R}}.nU:c>H}F ;oQ;,Fi+ !c^ek +[ra g;]WUxbGTb, @J4vPp߈w򭙽!ro$r('ջ +aQrys2;* H_`kVAyzWwXqUxWsUc]î]Bj0dD]UWŚ;8W5Fo aWwgjo}~ԘmӦ nIOݝ=Oԫ?o'ߢTa/bӶ aBeԣN}S?kD÷ ՈK`hB-x'.uTɔ := R5\:T4 U`C!dYt2kq&pzRajJ}i4jvv$Vkk>swG42採s+t^զQ{61-hSoJs. /%kj+9x~uk`n 1D]]e4-Q-N$u2ERsW +ac6)0, ͙84zQIWo1J/5oQ=?(七"i2I.1 :Q]P%{n g&E> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +1005 0 obj +<> +stream +xXn$}l,h^Mca@Zi~0!@^Z3-=\vL ON5/͞ACaaY%SF.\7 |-URq;7>hÓiõnx}!ryq%ӵ R9.]]Lc@+0+m",)mDQ` I6OAWbWu,g? Y-٣Eqkv^bE uq>Q,""F^:(0M P,b2Vq<KᦊEdXHQƲי@q^Kkxe|^+W󚸊T97FemHsƊX>"Ɇ"2u,cdf? )tX+4'^^݉b Onk;fAX̟b1re,ggfRMXōrkRb("32M_Vfz4`WKT< Wݮݟ'k_w +5DejQ.3cyk/_6=3yo=kkְSN={qK?IR 1%6e 8oЯT'u! _p"#ˡe# O~Ś#]y +j󆦱iC{u{(;6!{)ujWg+GUǖm]ό^}vX@ڮA!,"T'M{h{vG"œ!Dˉ.煸]HTB뚇Мqb)t?!hǬզ.$.ƞC7]ǺŒa4RY73Y6g>D=8ibi}kQN/iLHQٛoCG˽z jh5vN0zi!4 01|VXJy#Ji L?5x/k#m^5F/FV1tCHe̖PYV{>qmcf7yȫO{WYJ'> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +1007 0 obj +<> +stream +xYێ۶}W)&]H]@PS(2=VF"]Iy9{.W9hX^C^r$qӤ橴-PهQl_lҤS +,O^ɚdiN+H˜dYԔ"UYڔWXXd04Wb@[+J0Rmy&uC֋0| i7>V|zTsApgή+0mX +Hmle,0*haeb[Tc j]c}u̲HȢbÊٌ<#oݚ[me*iX28r당5Go# B +iZ|,aVoYU!DX7)OtyF.* +,tk!Z5աl?y!QWcBb F*[=v#dɷo6iL*O2yon)l2a=t 5(x޽ně_Y oqݫ<9S%˷yxcS]oGSB~ p!7mr&"!(NJk>&}(?smMn=&K t>F1>ؼ;ϳ7U%s^iؽ6UpCykB^. I"t>w}ӧ:Nk@'m7KcN '3,-$!"\zGIڣR GaN%v z!hj4XuĶv5o\ݩRjirmԸWDI9 V8*Z|.tV uWTQN|k.`3@l~ !@/u TN!VۄjHi^aV} 5yi.jimͿXf>A'G5ML<%y'3ꨎd7Af 9seNZ |Ÿ`e lؔ;)nl1g'ddy=,5+8S5nmW>JtM; +(Y .-[N@Q@-nT/w|Z>%#{mMȆZoQYލU:!<^PGNH"[7'=-30D5jLȏڑoVQrFЅfu#^]2-]U?Y9k&? +hs% x5/B-YWWP~'=M +|ڿ"wYtA啷I_~59pǷ->xկpn_ +endstream +endobj + +1008 0 obj +1961 +endobj + +140 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +1009 0 obj +<> +stream +x}r0<GE c&Ӟ| ÂU D=-Fq&S.ّ$ tIƪXΌ!b~JTIJxVo(e$wRes4O6qHyWYAHYd@_@9h qDond]q gfEi" JFY}Zӿ9{l?"Rr'!O7y2Z|kC ݜ Nv"+Ěz-cOXcXJŊW@#BcqKz :jO/jpv)D.{!P~% +endstream +endobj + +1010 0 obj +441 +endobj + +141 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [1011 0 R]>> +endobj + +1011 0 obj +<>>> +endobj + +1012 0 obj +<> +stream +xY]oܸ}_G0T\,@B=J4@>?4cCF9"F 68+hs %FQɆ t(`Ŧ \/YZk9<ĵHҘJ9v{IAK+#aa&%Os2FrXY0aL#aQ {&2Iɣ83zSl^@ֿr(:#ц0 i(`!R WD: Y\}ݓwwI[?-9}%w}wXK»7VӆӵâN 7Jt?^l_=^,u .(A R7t(r-8hűC~ݓ +'_9jZOǁ3D#,9~\? [ &|q_9Xkպ_lp㊛T .-3WP s<3{su7u+j4(f;m"fU\lgv}C +A56Dm}0sIXIu b:2^vw3 г;mG:5FJK .7 +endstream +endobj + +1013 0 obj +2333 +endobj + +142 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +1014 0 obj +<> +stream +xXn6}߯uX^E1(؉ݦ@٢(eUBlOorKsxfHb?~ttfnE)~TaΨ@O54 di;7i=ZTvh8o8бkeezT6ܘ1`]\W\3Ob=R[GЈ6\v14zw*}9 ;`OOP+}#np"ɯ:S7uF z(*I8Щ@mhv7 3h),4 h +P~-1#T^Bː,Z*q).Z~x%b7e37XF}QTCc:٢ Xo1T9ZeiPh؃Xn_=@e a,h&}C+e.:bՊA@DQ8JrFITPdv2F9x0W2Xڳ'\qQ9 $… c嘜$B(?K_.4;f9O&z< 2;µ n\oکj +> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [1016 0 R 1017 0 R]>> +endobj + +1016 0 obj +<> +endobj + +1017 0 obj +<> +endobj + +1018 0 obj +<> +stream +xmN0 y +BY6)i iHJ떰4=1y#m"e닿mN&)dJY0sTHk&]$$Z \P}D*, Y>YXw䅬2oq8ZJHlҳ,\U#kb;=c> +/XObject <> +/ProcSet [/PDF /Text /ImageC]>> +/Group <>>> +endobj + +1021 0 obj +<> +stream +xXnF}W(rs>)(Ą"]CW.5H3ΜJ+>9PvWTstY#Ja"bSP1@`t(?^ha0a"ԟ"D3W\3D ZHrLHPqELh, Pb WׄQRԉ}Fs_BȞIy"F +,န>JY,3EfTXqa6J`Bٶ,!? V#̜ +,jE%z0dPyؚqQ1]Dd*_Dc}YGTق_ =\ LB{}b6?8Էwa.4จ9.d;tƞeC/9-Å&P}vQc?N#ȃ k7|4..wƚ8]#C~+xHHM}2>BFl=m`->LyA㝩݃;5g/Y6OiFs$|L~j:ށx6N%|};)ߙӸZZL:!D"ԟgR/509ƸD,WˆŨJt(ه|&_#"X!$r[o@C!|>!+:>bo#Ptx9T+xxTO +endstream +endobj + +1022 0 obj +1725 +endobj + +145 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [1023 0 R]>> +endobj + +1023 0 obj +<>>> +endobj + +1024 0 obj +<> +stream +xW͎D)a@#n0#Mر;I`'CU#83S3 BæS:~MOyRxб$KH^@d(29~9iqBV&s`ܽQ_ǭMBN0>ZN$0u8q8ȓV/^(E A~ \/RpGYHҾ{qQ;sT=.PvE',w"^ޡ`j:١}%۪"|ƅ5Dla% FʠUQײGD+% ʸ̱HpكhU,;A,A& uß(ăzA QS-\3`Z`΄nMkz^I=`tY=T,űcfid+!/򰺴Q%q]D`Q\/0bJd̉d}Qg0 x¶:9l6t){tKw~N +#2Ӊb>!ej.[L; K$i Vl{Q^xĨ_5Qɛ'1Fb3~&M$^\hԋ4k," \Z1^7QFYM[x'zqB A 'BSuTGl"r mNzUS"q,Fwս7HlC)ǞE35-ȻRĎZrY#hdFnꟆ#6\[=7V 2/:tlMc 3d_mvLr3:$=I6aΗc4yrU, I7FIf-cVrØ9x=9D$cg*K1?X25G4'tO̷EkCrm ,{7!kiQiA*gW'jZT3fA%$i c`oma2 +endstream +endobj + +1025 0 obj +1505 +endobj + +146 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [1026 0 R 1027 0 R 1028 0 R]>> +endobj + +1026 0 obj +<>>> +endobj + +1027 0 obj +<>>> +endobj + +1028 0 obj +<>>> +endobj + +1029 0 obj +<> +stream +xYێ6}Wq, ^>k-٫VTCCQHEN>'AVcpfHM(&mO +z@r~aieZc2xf挊J f m#Ll"R3!,*J_#0jՀeJa˜>X]=2"#L: +C׀ՋQ"z}X-,ign?7=+901IfdNIX$Rc-X(u}@bz,acʔtN둄,Dgf2"|cRajlcL 5ƭ=|.`F@w1U7=FfK1#%%~-Jkgʟ窮㩪 P eVUܜ꼙u-pRk.ч)?;3g_m_ +}qZSFbzڧS-1Z+د{(nEn-,<ipd\LpI%Zy'nMh&$қd-2< :U(Th0)y7'A0%P V䒈I9R EmK 7_F9?2:sFlm;r鐱h:\'g^Q"n$4CHJ=|3a@]N&pȱemKDM= 5:o`3`ID2ƜfwP0ًC &g<)KdȎY^SMq3x }J2hkׂW%zU"0&]*FpB +.6١{~\Qo 42+pa&r+WXT +Bvq'U͊G0BbU_E{1]0 }Nב7K&>S0a }O";!\7 +r6By2#Ϙ3tgE"qa!7pIk6ay|(Pb3K,BeAt~H*%אLb !dt Ю' :boahB#Mo393Q8`n|u5nQ0D6N]C9}a x9]ab< A%'<-e&x؎n]wY2?yGxj:m1{ǫŮ e"+c{wQ + 9`ɔ}[_Eu>O';kT ᵅtlѱ& }Xz.c{!,Hio}ri?6no X7m&oG0W|⻲"x_o >0di=y)+u~[t7%s9j]z|qsY`:4v4LW1ܪx*J4i֧!vD$/l y!ү<M0 +-( %s<h Q"aƧP`*$'3Rڱcn񪳙|VMu8"1vMK#^]>C7 kj@`5Ӻ> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +1031 0 obj +<> +stream +xZ͎)x'g.@Ж83muϪ[L''UO˚fŏ,?rrMϟR0_a +ʥVF5ZݡF%f4 bZ)qc*z%>Z,eJt@tr7yЖb$gZCB֫քQŠ"vwip$WKqN~O-# 4H^`YH[D,aj0>3;jYDl0bG K^'Y-HHj^qrYFVM];GOƇz?Hcٜъt~( ~ŹLh$7X%0;W>d|z-H9v¨V=#&q%AdӁ+a84LOVy ֈW(L^'ȕcl%!LB+**53εH#J5{yWL~\?͙*SϝZXjwߍϤȺ:.NuGv1=O>ZQRmO$i]sM.5xY6K=CW2ڙ@@aa h= +FJhmfd S-ܙ~p De ش2 [ 9Y5D@Zk` $"b"-f J%xHy'-!-T IU1Ƨz,[O{l%RHz~ +i8БwOۑ0ߦPC=LaܶjR4 *: Ai Of H O=={Xq!V]ߏdzwӽX \C{w\T]ZDB X*¢ رKm@&睄X$om뀶Fr?wگ=*SpJLW>-dC6zM!b$ޣ@Y]2 ^&e/ +endstream +endobj + +1032 0 obj +2686 +endobj + +148 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +1033 0 obj +<> +stream +xZ]۸}_G'jEG] ,vQbEƖm5Jr_!R$EɊf=^j!& wy0@b4Mdi(s(@Wq8TJB#Ε]c fD8LfDă,)2 0$R ++ Y8[q9y{HdemIoj1%+(>H{q 2K#ae2!^ 6R|q 2(b#9tb*X*IJe$jciT,ȍ?Fe ütK/'CAŤX$atn6X üt2#Cezoѻ.z.uGs B eM~""fg1S>I/b#0p!P%E +k ^[2η)|W d,iYs)XՐ<*gC0;KLr=,gro ato%üIq6|EEaH0VCYߦE̔+~N1BlCJuW>Mi͐lGU']MmkjgE S[VNΌeT3yˀ +R2~Ri,dl* -(d^b",BLrl l]הOG |Bt2 DZ0tC\VL 6}>YmZN՗>,p&"~O-]˭f^WYt׾+~_̻{Q:ܫŚT"F%,_\)&HL8ByP\1G(ng}R^&f eFoX,{B:]R`ާiwyᶕSL3YW m݁Ur>٨Kʹz C)@2`mWW"_MhxY}>HH\E2e~GQ>us6|,`Z5jaXt{ǐ'+'>/wDf FYb cA` E/*XC #b+̙ 8"$Wq5Y4qy]e{dY MAIjY U)U imuHta:MwC\K*OϱOD3Ew_E2/Ew399lgھ[[OuLB^`6u"cSc0nFuufnMu'V~\} +0+JAױJ^mJ  PbaX ۡ@=Pf%o4@vѲnseᾢ^_cSHb@̪Rke>>\[m1_6jcp6u EwНۚr}cx1"Wfw,`8UPa.9Mȳh?1ThuYC s4҃ ++NU.1'e(-:ۋKB}JdzGQK25QG!Bd ˲.Iv E%gL2R2Jdp`5)1ԡq"UiI0<Ai)k:kv M`袥g3D,sq,0P,ui|~kטm mn%GqtY5;8 Wq%C%|˖n`A}̋)p +<>p%kr+B sH _'e$(t%_s Kf]R'g&͹ӉԐhqLSoI 7v0M >gH °لkRC"ǤlфpLf9q<䭾t4&?_d)hBK,ZU:/zb.BIWH@'?38qI&+F[ў|cEg߇mdå$Y?#V__DZ<ٝJq93(V/],Oh"e"'xw߽aU/{!=}ZʿQ3+u> +endstream +endobj + +1034 0 obj +2577 +endobj + +149 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +1035 0 obj +<> +stream +xZr}ẈRs.g+VrM"WIDcPp$I0"~VFjE=J>OaWϖ_xV\!dfne9,L,79gB!ތ&||+2L rd="!gcX92ZKsmU"Ɗz!Y泧)͘ANRKǏp~EH˜\6b.KXec crS8~\y$ac1b5ZHo"7rja/͌2w\XxwD⹌4AFt0EĈ0CyE0e364c !4#F[' BYi~c

    fGF)kb:ARʋL崬q󨮵-L]@DeB 0vDψe"B 1e*+ 2U^fSeb"gĈ2#y 17d0TMkC~D!y,a 1 IevBD }Fah Zr(N>%  `T2WMXB"bD:Ax0^ )" +ӌ1Ќ&b2o Eu;=nbм8-keIC 00bP3E^IJ\۔1$y5b1` ˺4-8Yy,m(&Ka԰ +#G%b.Nmy1'jʐ#p$#P;GRp^*F#S2T aJj:C k01TB_0ʔH #o߾mg,C[4w}sj~};v%u'/;$qqz+Rm{tOKSf[?uٱԬ_Tu}j׎ B|״-e}h'V}[/j~>UV[mZcҏ]̛znW[ϻUm/{#/y]_j fיȤf+Y tFp@*t ;F&R!EH]A0؞L)'UjV@z\=֌ϑlx͂?y9Ӫem|nӮ?>xln^.{!u5e;F"]]-XmzG]9A +AeZ< 'QCC/9)8zsBP61kI$E[!݇$RG"Է⚫xܼ._$cy!q+ŵCĭUq !yqJVfa_ -.߯JPŠKG#ZPp"ZPyuGfG3%}jXbč hg} ڝ].ߝQL0x+W\H@GRG;ԝ#9< F.'"PoiKH[ taJwLq- +j 2Bɶi |ЅF;(8t;vd$$Si9J Di !@٥KH8zͩΦ}#Q'jK /=F^/ԍ MM6^mWRгԑ&ӸuA]#9 oݟst;M_f%Nvφ3mA0D~ۘ&RL ԟ|Po_@n,_FEa CGIJv >׾vź}6 \W&ǯY4%T$z[?kmQ9t7la +`^|ݭ/! i/뇋f@yĵ~ޱϾCC#vu561'` +endstream +endobj + +1036 0 obj +2340 +endobj + +150 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +1037 0 obj +<> +stream +xZMs7W(c|rRkERESCY~833@EgU~xh"*O6|j%fi&̀J[n002ʸ6 *5"1BhLvm@yOH}17$1Sy#&@bFQFe⢯~;~JiƌE rZ"? HX0KW9tAf +  XaR"?;f)EX@ +{zSJKoϖ媪6Le%WI*f2agJf6 Ҥh&,&a=Cduw!{I9cU1Pc| +B‹X*=C2V0F65f)\XDr"5a5yϐRoe7eU2aj+M^ V:!̈́e$EcȄI0UZ$LJ3f2aQgN.d[0165 c,OX(*<¨8{Br"3Fp;d''ƘsW(b)=CJVZ!Q]+S2e*kϑ>hC + ˔I鋼'$Ɛ)S@&Τ x&,S&ag{D]`BHctOʒb")PyQu`02zGPLtBwH0dM3#HN!*yC!#ǿ?g$>3 ztHVax-lap>|HA2x0@\qlƲ_=|h3D]=,篛?/Vv6kǾ7Xw r-/PȲ52[ + Y%<`Е!^/у| hÏ=qm40] +3D$_gɻU!"Y5bY(b)=CTt<@Ff3=+N4hwJ +Mmv+G' 8쀄WG ڔF(wڔQ}g]Kq>^\ ]LOZx\kyȭ'Y\SiB㇎Ih6EۯV%ۯls:UXNW^ +1/ǘӥwC:yi M + +7[(f +.ZH+[M?& 9_6ҍ}nOneTfeIER$N:;d5,gR0ZaͩCYa?R `Gt 63:ЌhQIH {нCs% +!쬬:E~{4mfa0|`\?Gʳ|иSDFOj_z^ Sk9ѵy_z~&A ɤtWSխMs=2ƶN4RS/!Oadžł4VLvJZY [m1r` pJ\Sswk < n3La۟ b2oV{+hk90kS_TmU"L&l+b +,y~J1Dd1KFl3KE,eg܈] =عɻx~>;%NN}ifw Pƺ|WEW}.= Ut] +Hi$ gR MM`r MB SD=Ct1/%Lw((ֈ(  (=˝Iq1bdRd)lc@ָèo5}NAd&0ET l5'rQٿ0KyuVqnd@ofc>zW.|P@QZ|y? a wVt*K9h*$M vPub nͣm~xvl5a[5`0]]C ,-׶݌.T&+YGx^r9DZ/VZ{+rIE-Sqd~(wl` +|:C6*A +&8NH~`jD=21mQ8!CDhwCL|!na>n({咈'tyOd2\i<ܡ'_4›?Sg +mi~55y3!ÈvjXݱ LUY4P;@ .<^fO+ r?.:\ +̯3p{BF%- +endstream +endobj + +1038 0 obj +2644 +endobj + +151 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +1039 0 obj +<> +stream +xXMs6Whw;LmLO9K.DIl)Cg]rC(=>,[|02#UƆOf|*)FbiŹUFI"H+!aQ #KBdscFdRa`rʲkĔ c1'I` 5d +Zl̳G\G _U3+1PQ8DS؈$RYڄ}BbF,Q,`%3,OHPqF f5. h$Ӓlv2 owھ'?WNcGq]})ﺢN8U!&nTRM:Uf Խ|PZ8Pk*C_;̂J6M̛LҎ2ƿ>"CYRYIjJQ]X\<}(;Il:!%!Y0}kg*\LIxB%8V&Sv;lv - +0\n`v熊>` VeoJ[+^$hNҕ$|ٕ\IR]I?nZ/^pE[Eb^p-T_ZǟkNύK1M~1P3_0f8iyxbF8Rƅ3zi3}LÎGdx2 T9 P-nЌ/]x=ʠ|Jo u$[VCow졯EK.Ѻy}2pӐpO!E8pt史;z7 HM_$tw( r0apeF Q+>fD+/Ě +E1jd`!ׄ#CTG 1x934k!sM/1Br9/ c`˫pI/|8ؚn-r!_ +#ݱ x"橆 ]/T+jd5Ź#.o➓ͱqļ|N9hI^Ⱦi:Mz4~:}.8^?VYT͗}6ƨ%?u^U_@9m_l0֧/r{ s<|ؖrKT|z0d(=?P< +3JP錌*oiѿL%eaIAe톸U]PԠD?:`?̲m )A@S~!b[`I8}AƫߊV*3Cw;?6mG~?r ,@mB=JOF +endstream +endobj + +1040 0 obj +1427 +endobj + +152 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +1041 0 obj +<> +stream +xZKo#W^c{= !VnJ0V9W`ZGBr\3.UY*)Rxѽiճ?ͤT_u%Ƌ~U։LY' +)uYC~)K3D*%2(@"X2]jQ"zq9DbeY(z 4QVzޥ葥SbRF>$(A0zEKO.(Ie (ӥWJ^rz Cb}DQ ?b*%1%VAi^+LАu*+Gf*th^e 3,+zO$nB*2HkFf8$9fFYY=׉3ыeEF8=5Eg'A'f^IX/cEYUj̘V^eI^GY:zO$owO~#+0D1WVOϳC?n0FYxsCA "wU,wf.Pj0)ِLF!&7F{ z`U)ʻDL)UX&=.y}iԁT3kgT9ePIL*TSm4\H 0b,@=h@4.xe*4!`}եD 6U¶T=jRx)s\"wÑiƌqƔiپeU4)ҨPaP94D cǕLOd2$U2h8&ʂ%^j3bnrK6nl6*&n9mKMd6 'ٮ@ LT\*0|Xtm]u ӴQ'0僀D:x?5@ջl 1Oـ_rl+vQśM;ψ@C<3#z>#LJ>[7ߊ)MН{Ǣl<& SSb+]_JfrYps2[䉥3 rǭRl4ޡt|&+e簒[dYi V[' l!L=_Nj +3<݂8Fڂs{=E-%/m ɅbgQY%X6^YYV YRtrb߷Wb_~mVeSrSox+Hk逸@?@XB{R(ϖn,(+}aNB+@7NuZZA,f:GBڅDfzdLBf Cz!T8AyŹl(Zƨ 6r5}% J:w iGqx~?'#(QOo}};ERi=\k__{S4bwtz9lr g>|^֛z7ojl7MLӽzzu:8d]mܳ,Vz[=[bft&U!'M/ah͑Ő8>_gm@"we" ұ|41 +\WcQHǽs?7bnq$pk-zz`/b:|+ns}|ͽ9I:!-@xP-N`nާIe9("Ml'v2:=;Jś۱(9b*-5+[I$}]Z?$JT.$EFg+ Jܧ* MHD]poJnhon]׹ZI}5U"RO=7ީgo*W覵 + +~ٕ%5ͯ>_ReqA?u w*HSi*Ȍy ;px)UZ4z_Uxޠks]qWuo3ʨylM7, C&dO=.WTݗc]WI>?kX&jobs7TO|R>zwu]]mVb}}>,o{|Nlrz+`qà_D +endstream +endobj + +1042 0 obj +2198 +endobj + +153 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +1043 0 obj +<> +stream +xZKsFWQrrlRTY{&A 6IЎ_lP$lzz@YO6|j%Pl3!dakeLUua~%{'53!TQiHFe>ӵ=vU@ u}=#1n;ZY6Dd}m,{1BYNu#iq|g[ÕҜ21Ijh@*DD ȌeQL{F(c%L圱 2=X:j'hϚE]Zֺa`vY,$:X.婹Pj9lM;5ݮݰ]3Q ֠RPᆮ4'aTx8N_p Xݰ%Œ;I7`Sm1޳-}~bnhS?<:+ɦnb~.JU||hݶ[mmwwpR$`*(LWSTBWP<+y w߸otmJ bwWVXfiSHZZ࿆C71 +F*aPRQ5%ٸ2 % jp-H(H7DX#PėD (U()_-2ĥ_knޚ(+y6 ײ;i óx9hqԼ!$SPp'AѮAL܀ =++5}f;4y8xa;ta{tK>طmK#Flp`č'q-F$oqj0|j(jɀu]7= C^* 'Ju5"0- + +Jv1bqe+- $A*/Aޫ"_yJy aiVz6 ""w3*rB0夲 !׃}<}XT;y _4&ެ'N@nlA~}ICnUtOƻL_t4 ScY|#JI0Y^*jψȺ"ϕ`"FvO,ې5ۚ5{V&MKU,IK2YT?#!}wb- b}r1=X1Ѝ4=8-n)JG@q•QE|Bօ@U.*7`4HEE%a2ŢXT hL=J+I{F^|d>Z,Emsm>A>d~h6?K2>Wm+2Om*#o89ޟG~Jzwv/],YO`>/8x^% ?pxwXᆭ~NVm ^w9K?הPW9U5?O vt:S*Rۓ%]( w^MuF̏$:Apÿoӯ{k?{oMӱ;+)gkZQk +endstream +endobj + +1044 0 obj +2669 +endobj + +154 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +1045 0 obj +<> +stream +xYr+zL9ppɪtf(5U +"Ac5D5{эF7YRݧ=?]d~S +4b݂&YJ%L`' +q3;``&ZiJI*%"15qj!3=*҄!dMGdJ2Jy1p)9Zs;j=ڳvVPPgr5Ul'.9$*Eٟ)0$)<^}DB)1 ZcZ+H1b#y={ƆcR2ʸv}DPTJ Fa.z,HLG:$&~*Ucbz7  dX $s cYOd~UD|Fy h3DzF/]P.X<ӳH؀9 }J WcYO*#z,(ky=$ߞ5emX"Ӳ\$ۇJ(jLLMH ǂO/ b̳+=oD=q<1q=@tމԍ[TKb)氠=ӳH"<'5۬WL=ۭؠG|lk qzCΏ-E_y1MEs^]QnT\۟78 HMgp_x` 3z:IF]ɾ:r;:դ< ݮ 7y oꟊUG6eUoH p1 )HU~.GֳÂnw#aMǪ#m ]Ō~va[d{R,i+߮hD|C"x'2Y tPʦJa벃U`:rw,u ~M =Pdv37>=x~?]h\7[S +^]ޑ?}ﲍ*P?D H]5#*UQM4ЂOťKy\ Lݰʨ +~Vsˁ˝ 57!Xaab:fc^v!`R"BS.mm.>lE\ܥTtg?b$P~!3o\mtt}t*uVc_]6q֍_Z_ߙa<-Jo~}֐.GVM99ʟVͮ/#X혹?vHgKTJAчCUkʮju]|ԄC[*?^[lcm/e]wmUڶ{Plf +] UP 9TTPD4-?;6.q- PRYd]>2$C$k8'l  H%3ȓR@ÃV'لi)ڎc3\Zl޶I2H &&fK+1xGh. +׼:%W$!0`<( 2``ɷIDG5`C$ 2fwDWKĢpT(R~uifÝOƍUH$ !i V)Q“vQ +I J +af} wmz"SGm `Ń8 2+/ܺ}uZc2by@}R `wlgg + +>R vJEoMy;?Şg):ʾ;p8isuv.oE?wU~DVU޶US?5ݯ7ok8~{Vx2a3~Xep7V=?SˀqQ=@5`.d"33v#ц . ^`<6z=^xzUDcCY=)ߜ6ܿ 1{ X.Yv۱M_<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +1047 0 obj +<> +stream +xZn}W4q0}ora _Jb̹`ȱV$ic"y˙UUerVQIw)ph~/j(/gҸ*)Wo2LB+M c(_1xdu&+}uʂYɪ:aOHr*@cZI؃ɆΒΒGB3D4Zn;GF4bO\r s?e$b^XY/̈́=!yG,b i<2lĂGK^  c)xL*ke +%2(-&D!)1nT4="Y#%fbzE a+`:T,4LJf! Y#%fIJy-{ebN"12A1_>X=C,X_ +zI4bDcYYG,yro_`xVnMBW̤:˜Nt1bYbF,WdU8"Ɯ9=lHe,d=CDzGы;Xt1#'I /b8#{d XqgNbgoEd]D#x3do_5VZ˚ac{FfT 9bYbF,WdA-EJf! Y#%fIJy-{ebN"1&Ҩi<2DzX,Ȟ!YG,`p.RY3h&$b:b|[ O9&`1mJ%7wgoPTQy([R&$:+\U*){%Lz8_ |TRH;r󏳫kGU{gXG;/{l4s2<45yl}=ݺx3(+wPqݑlfMYvhwۺkِq \?~ w݆<Zsk1ՄLFC/!c㡶kzP:=}S"3hQpamU3 WfozgnT"MX^e $Ƃss,dn "ܘ<MI%c`›Ju)cn^ʾ" e1J,a(/{2J ! CYdqHqT! րu/F,-KU]~ +Y6Z~n*SPfks;ncgEy푡I~?ABIu9#JC5tQ,fEHY1WS57NJݷs7Y7[0bn=ÌO}}B͛9A-S-tRAölz|Gc/uwl+1oLV635WW7E 4D/,xZ/w|8ہ|/B@@ wŹ>.kO.>~$h'GֵUuO,nAF7MUp,J QP?& [mT gV~TdOI\tz.`%K \ր+zgF#{B9ךyXZ7^@kVt9n7k |'Ud_vwh '5?v%zw̱W)ٙ]X%U 6v\}sC֣[4ܧVGmfk_Oۡ<F =Ӫ]!xh6/yŴ?Z.; wWG˽m;`1pn1Ve=L.3JWqdTdM.Z4п}ѐߨ֜}<(ʼCJ!\ytg$~].g1d(_oc.e@}Z|OtP~nu7eL=y=ڧ&}كx<ëP_]p{DFs)pnVg֐uOpZ_E!ہRU<B;%Db]1q&'Gp#@@x^<6:ּTt4 /5\m^Q/;FGQUU=f?6>˂ ^0j&l϶:e4ej6kqp'>z:ZuOE6O@1>k/)| +endstream +endobj + +1048 0 obj +2633 +endobj + +156 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [1049 0 R 1050 0 R]>> +endobj + +1049 0 obj +<> +endobj + +1050 0 obj +<> +endobj + +1051 0 obj +<> +stream +x]n0 ~ +'@dEC)c;RH}xI|!HI`>\JU$`r#dzJH.!+ +~BٔGHnxCkbh0tya%MUؿyZܗ7$ٴ6u!yr@Ay>m<8&`5ŴrL9)zV,5WH>g̦yi‹jo\YiLMKL\(Zw]4b'Z;SMQ ^:"҂B|,g+ܪ{U}{I^1Ibdd?|Y#y$4"#h..3z?1.yxC>!(M|nj6#T3opv@#H.쎹,$J> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +1053 0 obj +<> +stream +xVMs6WrGE ۷d\7ΡLCg|IHBCOHL}09۷$?8nKkA:ܴbsu< 4㌤Y@HR|Ҩ~qa^M /IƢB$ir} x`%|~17cs9Q6Đ$1$="Ø.v@dqt^xAkPZ7`O'8H%Ў-8|_wwъģzկh='T> uИ8㙟4s#;i-~϶{WYn.h͙D̺+pHb)n`}L}q.#~Y +/1 ۵ (sB<p0 IFN:yP:/DcX@K'G-fjm~J t>]gjp,!I G4s +endstream +endobj + +1054 0 obj +1063 +endobj + +158 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [1055 0 R 1056 0 R]>> +endobj + +1055 0 obj +<>>> +endobj + +1056 0 obj +<>>> +endobj + +1057 0 obj +<> +stream +x]m_1UEI4_\\I(JX|ϼi 3$G\tU& 8ƴ!ǘ&T)E1K%9){4ψiro핊|TֳMHOaAדI(izSm_fj+r7o*"/&]p?LrO\4`C5 +$[%?%{6r7 1,k?9U ܿ*dI*r2l%#i;NE>l;2Qr+-KL!u٥0Wt_ MҊmZ/YQUh'ӂP擂u 2B+.J0גVZx|0EVM,O:0ZZc=qśIr{O7w lvvvwlٵ5C¯75Ϳ>Ԑo|8frz=ͪowlˌv[ؽ4&JG"Լ`:Z0vTV[z}Osf:{22S\AUZណ7&V.td(hMeGYdC,#|b9gt#YG!;)gb7 QVَ(`xN^Y +7ͪl{rL]Dֽ8 *c)}M{JPlߓ٣̗B[W1X8he:hC2<6Sr6.ormŞ56\*4\IashQ3_ >Gk>p\i8 9p1{ϳarY7 -Ai*tf?,|50I/ Pqj oq>$مTV$9bFkޝyרl "H! +IZO,eG<90kl|'#h.<^ara*wD@[ +$?,If L4Fl色)aJ! 1Ue!z]| WՆ29b#^ө +z]$R}C@HGj|.P4Z vyc0DO;".ereU,GAH,0au~BTGC_fL9@sQ8s-1 kOHRuj'!*kkQ9TJҮґ&ĔwGoKB|ÏyO6/]?q?H + p[~\U0X҅D٧J>m5\m :W>Ps,зr|Kgm>?!2oK|[)?4ɕŒ s+xRrƭ5W)\%+;y!Q9Q~Bӊ+\٠"lȅ+w5yr\ v#:go4!ho3Qr _ hRm#)2dLtwVU|dO@Z3b9>2 01Ǚeh{)e) J(׮ rI'B(G*F!K5,t/.ZG]^Tn{:[ٗp+mcjc\fcFsDL:(Xe6 }ON5C銒]_LVBQ1?{ &tZp)|LLR23؎U*A2k¼9Fc֮4<{հ/8 +oU:}jeˏ? 9d?ThN'B D2!ZE9CaH= 2606V AJ?VwoJ;c0a`6*AVkJfFc>gF`,aĩ4ԨKNoGQ#m#$o,=)n,a[/bC%`WP}%`(3Z^PM:|"0ZVàK)aaZ:g ԫ(||yB1vE L^EӱYd9QzduV; +8, _3ʍM= JߵH0\J J9c]V r 86,6RvJըPaH$` g(8*`I0 +Adz0Hdr0%{ю0<,1FB]4lj ƫzp%ØcRH-XXQA* +;|U㓇 gxXD_0 +FO0;ґBJpu0y(D 诪XSoA4צi0cXNa/35"6Afe#Ѷ4cH= M?4PtLHS]*<9> <;!@;C%-h8 ISײ| x\ qU_ >G")7x,$t#GIN/V#Sbk a9\ &>ưg! Ą HtZ99oABƣt _o!L3tИ3 \DI46c2M~S0_TOG"|QYD"1U^Sj~inY6=KX c({j /1p!s$ݰ]Iȟogh [I_}o~]f~m6lVׯK\~lכ]6oj׮v ؾoo~ZͬݏCsX$cvgx4y[ }lX`vXvpv@CnꟻB?g7r3FY޶B3͚-_5ݵ`-M?~ڼ䀲Yygt(7pĞnmRg_7-z/dݦna3#n7;4ٶ:n"XC CNym/$7P$<eKsyu;7:&3 ݵw_4?zBRwۛqb7놅Y'>4[b@jx^.׿$~KmgP͎Γƌ@޶g +{c_|R +i~i-Ɏ9@u7=pEk+ywMrKo>˻7̧ma5D@-1~ +d2zbzPwrN1֕ynNb$ +̹K+t,vaQ`Яn9KMx7$b~}cyi_LA7t"ӗ@4~I;|qSHDpQ4oK;|!1{tƿJ +5+mniAAt\(O Uyf9w + e;oBT + O|Y*M~vJsY> +/XObject <> +/ProcSet [/PDF /Text /ImageC] +/ExtGState <>>> +/Pattern <> +/ColorSpace <>>> +/Group <>>> +endobj + +1059 0 obj +<> +stream +xZ_ק㹸nAki:HeiNJ+1ߧ3\rHV>ωKp89Õ8f  _vO3!de<+˝`vAm*fLhorLVX΄PU5"zD,f#l X] dAn W M!q'5IB34",3Y(bFU=ÕҌ-Fh HHxY, Z! PKWpϐb+,F5hTX@ + -4"&RƛO6Uؤ*)8%z +'H)HtB23&a^=CT0J{Lk\ +LRd $33aY`,pOHdZa3G[X0S)Qob"bH<(9{d XaA*F֨KX&& wrrr䒽[ξLw?xeaǾo?ӪaOݮew+6ߵ=ȴX`[zPuz_Ҿuq]}w|D3y-HWmUq}h#g p0:"}rY<& +jDjH=P 0NT0l2LUCS0aWL唱,qWzJ2Dx^${B\\!scn=i䋯nT I61ev<Yxw/VBR*mU ƗVN*9H:ҐkPDKJ$]+*rOI"\a{tP!6ɚ\45qOٮ:Ze(ܚxڭDPI +驝sd=Y83n[(2b?C tW3[vXBv~rS hġe?Rv;JbRBTYAa!Q +N@C4N!Nz ݥT{B()3,D\CT&8sS<'h%iMrv$~5lQ.y$ l=&I+RigDNc"u$ T5^3% o!A4~&_RC;ZL+ub%v#!Ή,]| caz +'`+0bsa#rRh;҂P;tl* %@x]8TVMsw|H6~W`r)@S;&xiSh<~zkNsY]#Gvi"x#{ I>7B0YM=&R.3'1]CTF䄠-ZH ;&Esd6'oX@=O(Ի=MJBSS5}5R( vDNc0K4*ӤKs"N9MOmwU>'0:|e"\#|Y( @yV a\N7cB,>"rRޚ1)Ԧk#M.-GX¢t)ڌɴ_tXG`fC 1p{ƥ5iA}n&4'z8gGd ?1rtʇ t2sq% A ߎy+kWW~|Mՠszy|Wtqػ?{h۵a.Kl#a˼|v{ +uZHqᆴq0뵟?a::]Y`r[Կ}xc%{| *l>z-v7Q/ +815 (w4^~qv∯>iT  0o(W"z4XT L|?UUiݖWew~#7 "Ppb)ޤXuBF _xIzdzevXwpK~khѾnjM݄xD/묕lLsM 9Ƌ8? Z}#?I_@V3iU[>`w?t}5ح?FYr]Y!" l@#S`1 kyI$Eh"ct 8mRONN[OCGz#/,*J o>[:-^=zg"t(—[(YxA +Pj/3Ju3jÞ S@'@'>JMP1~͓{I^R#Bhdݛ9^-^b!W*'C뾝/q/ Uqҕ~ iedKW??z]Vq9ozRѯuh7%xFѠɍ/oߴ%@97m,9̑ޥGKĩH_|D +endstream +endobj + +1060 0 obj +3166 +endobj + +160 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +1061 0 obj +<> +stream +xYmo6_C;b:nqh(+K>Inyw鐒(QSŀLᐜPL= Tݿv K+cDj10P9E7,"R!t\ʁlW¨ZT0f}BQ.3D)M`ŌFA{3(U5ЊU(&'59N|ע$#h>(I/1O!i.J`RG' b=-B,$&;|z.JczJXOsZ:hPzp%f% Cw[(wUGTZBڦE)j!C^WU#nwRm~@ 󔖭ljk}]9]媦{uPWqۢm˿y %j顮v,c{'E  v@^>aU@&[˄E&sgC+?1F?oEr!4n@s:'<$5 YaU(-Qsv1aA0&Ktu"'D`q(x*@iF۪(ͫr) IΕ:rk^Rcpjxt)ow9TYe}FEg ֯0pgN¼u%-bI~  A]qdRmU?/W?kΪ7(2Gw(JE,`nJEAk0*P=j:oƠphHh%ˤAN|GnX8wboBGZJ'>w +DP b LEqA/G(N NTFqi₃н'(âc/enxH{Q /\X_Z! +'΄ +3cㄉ89FK |Fҩ(Wd.J\FO(LCу1 ueo۵+l3?&= K9^1ui&An/1)6$Ep-0$ @Ч^qY&3J x^WqE.w,K\.GՉ1 +}t%M*rrhv4'sR2iW mPDM"8䉢؟tk՗Z"W)<=.giL$K9Ջ9\`ji"03} s*u㊘#׃<68rX13K@fRb3vmqhW\xqw +ŰW{ onQ6-z+eon`5':اxkVm{[4?ݤ'P6vGnLԑЖP? +endstream +endobj + +1062 0 obj +2001 +endobj + +161 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +1063 0 obj +<> +stream +xZKoHW ~c۲q`=X,0DJd+ 3gwĺ'-X]H YU>`~}7\¶W3h&[_r{ǂ&Y5*Esye9S}7m@-'~$=S $+ЄރMIAz3ِ(Y56QEGY4Zo;5ztҕ_HYUXpXT 4ҴD$yi*RF,Ъ%"K't!B0J@-yqxǒ&Gƥ[K-UM^PċzeY+2ϓ "rTZ$%LQNRúoQ;!jH%u'jԝREJDK=;HE@Ƚi9UT I(8E0k%i ղ];y{7;ߛ[viC4DG%XYtΤJ +eԜJT4ªW˂#&2P:,@,o3^#=5 5W\gtP*OVTPQ(eFTX'ym I1ڼ$p"Fi))w匲.q$~k+e +,x~&xmCR7piq?4w&# )ȑ\mpnجjxm ?/@pa8?I-Фp?/a6?AEyh><@2J,ӈ#w`wT JD^fA}Л(s-6\yǐ2֒Gk'}Cl~95FlIFu#9~~l~{j`m4h0I// '6 +j|~rp (n~GyPk;M%=m1-p +endstream +endobj + +1064 0 obj +2440 +endobj + +162 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [1065 0 R 1066 0 R]>> +endobj + +1065 0 obj +<>>> +endobj + +1066 0 obj +<>>> +endobj + +1067 0 obj +<> +stream +xX[o}_1R!0$KjMd9Kay}f8얉ZW:~]m2O< +' ~fM_L,Js ̼8I8&O\,7aAy)@"ߜ +1HY|R/,; "b~d],( "ݺ`bjzxd1'dt=RG=X%p 2 O"f7b#//ᡃɉtq"f17b3WDD4br Y,xm;)nArI{q|w ٰvT#+́v+; ~f۪9طdU+T3ӻd7wdb/f.Uc۪^jU^$a뇼d E[R~'KX5mq8|mA|)}IӰa`tve,|qƺ݆ǡfPUyq@P|sœ,,͒ԋxSIYK3`AeXꅑ,=NcsjaF :ce=Z/Hfe-MR#>"_L2<.  ?.jSn?8OK<4Y|'؞m;P[T)q aNEIbψ9~, lg]jbE9oS:(r2ho' މ*@u*Eq@L`bb dUh- YGQ"{xFƁȒ9G;<3S60V+;RhNGt\ʁ JCO"#vxsD %;;g]#kUJ4U:z[XP +tQWo2`VUr>cOMԱW|ne!}^$Lko%ΣmG=Tx@ )XG 4J:"Վ\+=pɉ" =2 +endstream +endobj + +1068 0 obj +2092 +endobj + +163 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +1069 0 obj +<> +stream +xYr+z)4- Tɦ(5Uɕ7ifY&)OD*Q}O=𔎟ZƇƞ=L ]T˂c>I,qT1&JrӻlpHDǢXIdP?{%{>u'y,yPe^L c#|qz1氘1 IBYkLLsH̘âXIi}_R$`c(kDWIOZ%)SmDx bXMHDǢO//=B p*6x$cQbz,l!zJ|N JRʚ c=rXEe1_^zD؄1I*!BY26"F,*kyۻ{'+xAlcgvl]tP,=e]YYͪ)a\SZZsy4/-z]wY!k[U]슕qSY, +o\.m7ݺ'c{j{bze^=vul:RX7+`i6/5iM*w+G UiTPvӶzג,fuזX"+cy%rX z`"؎UMmY" +}[]UgT}uޒnoyB#D5u?kaIU"kY$BF;H2Mn`$O`bHn u{Xi?X'b_ M W^/3+P3z7  +HӠiKi)rS Xьs&LR 2n͈= +ړΡ+0Aa $+`:^:r_lpdy[Y#{$wBDHL.3uql.(ǢP:2QSW-?+AcC34@ź( :g<[4rQ_U(:֮CE]DziVlҹ zkLHc=ָu\.Λ AûWY"{-o \5)er=<8"1uk 0%X7KAeHQS.RKgWcw=컁%׭]U+J^cQCF*KePFf psk FkzƸ@Y}E$>Dy"p1K1`FNbq{~GRTSziD7p0i!$B_ +;}_8mǯ;IpYwIgJ( e}*kM)k8}2df\jDpgFQ5ݤ2^)U<+d6rWDΤ^"C*JtXFt>,hJcj/_>rdFZn%CBip(BLLϒﶽ2?<q`>_U:zh~8jtF@;lq몶9Bev@?\ Ў@9&þ|f;K1XԏCBE,_AAi;k_,*hKe,zW>HNlNթޚ+5h?8sD߳#RC{^\]n~6M\fG-nGd_hhA]70UJD['|BN_Nῌ2\LY>^)b=p?Ozy9Y,U%IOv{bgWoLL&"d:>'3W!bzyP@*:,;\?p> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [1071 0 R]>> +endobj + +1071 0 obj +<>>> +endobj + +1072 0 obj +<> +stream +xZr)液K1-mdK:xm C^`в3Oz`Ar϶JEh/O|?EVٕnz5&oŞ̋zAkV&.KRW ͮ-+RXRź^kUlr$lx:[ (lUu +2Ic…AxnN/QՖ$rloI>۪ŮwQ\Pi"UPZn+d_ڌ ^qmF/ ;tU@I-*h btIl֡Ȳ(tڽͻ+fWˢl\VjA2"TmAˤ.oyȱ<01ō21)p~:~̔pi 0MFWOt«™g܉O);wzC?h]M* <*p8F E*Tr^$HhʻxY#tUU]{.W[ mZ#2/ZJ6MnkI^i_>KK^T7J*xF>醐CTڄF|3_w[d>2zhl5v֍v-r|EU>G9sh[JmKVJ9%&RdƘ3Ql$PEp PcPaE3i<; $lPFp 2qcsj`\ '[gC_F*nv{ތHQ4+*`3kz@Y-ߍ6hϬXD".ȱ1XnR~2d*_Ιāb]* +6.^܊ }BopvxOnՇc8*x@TgO)2zõX\LA0{ѬLPC5G Oj'ӡ"? FA7c S~NX0-z* 8%[ s"2fX[ Sl1ۅl1g ~B(S2U0E +&aV3R)ib BT+ۗ B 5 +b@$J[cL ; f &*%`e%:: 6ra dc lqK,Yc`.cFݟ%p,TYIV%cb BGX)M'YR` M1UBb u%(a&5;lqK,Yc`.cyxID8CЌ*168#>m+%<@, .dbj1 +bO H8;PETL:TSwYؐRx4fZ +-G:dW+u_j~\5~ \ pt&vk˼ɝ͓- ˮ K0kLī?{D|1({0wϪ $~^+~ C@Klᄨ?QM +endstream +endobj + +1073 0 obj +2328 +endobj + +165 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +1074 0 obj +<> +stream +xZn}Wl4&i+).g8&93)o,9ɣjt}tW)tw%r7gIY +8I6]Ʉg:eˤP5̍Lk3TYG\SZ&*M1J  F=xds[1og鸶<z٩<&0Wb2ϖc#+cde`c[xc*?cYxb1kǼ՞=Bzx{J!TId4|Ҵ.ƲDZaJQ~H"Ä hcL%az3c0=̲Gv\XO{^ yL%E)D8de.=f,k#$by 3Sñ&cr ǂՎ=Bz $'N$4S}qOg/g|޼?z3L~E,KKڱ9݅p?m׳jƾn;6]m =SK@[j!Y d77MuK3[.3]N΁2QRLi%`}%5!reXq0D~✩DßL8؎rI +ciLajḂrӄL3OV/KV&*U&TzEFf8>sCb̀BY{wCwmoǪmءk#kF6vڳеѰC5nW®Äm7߱'ZwY7 SE +CDDSa"RFC6[4` +0)uqvc\St}b +nI:]yT؃Cba:,QŒq"L%JJ":Όۮfm} ;mT8I۟܏f?/=(dE҆ͷ *ECF,00 +<ʳ$6c XaّϬ(eKEE)_, +LD)^+uiD(Z|#!EY%EQ0RFd4&DY}W(\%\&̎B#!X=((Logȋ(:T2YZP_unF:{{LuОTqVkͣLv~ZPT}$+nsU&愸?K+(dQ`ak7J99zD.q1B9waw{!W+E V;yyk=+Rb28a[JB.z`ճΗJ;\8r CnD.CpXV&UFYa!f]B^CE^&j/8ZOWzRF%na{Y~DZoQB`V|۟OXPRgVi6ÀCEK(^=/JA][Pϵmj!>VmS'{$Ɍ[c7Lk}@aG8PzLjzfju@>רhw n;5~n]7Kܬg C~zZ{w/>͚}q`fcڇՕd[k_~.fi@MW#ο~N h!d֫撿wLa^/aΕvfk6Z]+l;QO?Ov!cO.8_LDj}xJw;4;VbeO>-DQöM5oа*au|A}.f+Wl6Ձ7]ߛ>;EfRNq҃]$xim7"H)FB 4-01P(<ZbZ,cӨP0E V;7zwkE{䇘oy5m{T67;҃)Qf9,Yء;tM?=8 %phvC +C$YdU]JJˬKBUVbTAo&#LⰣ{@drv (gg=8\~V{d/nhW|˅'|OgAt=aU?<#PY0 5Q_$98SҞ=E%5SO ʝB|گ_G;yQ@PPY\dv_&p~˳oMe%Ј4!Ji=T{`TKVSG\3_0iiLv 5"&Fe?*մ*dd!=D:Sn .оv?M0U nF3YVNt (q-ܸtnP +endstream +endobj + +1075 0 obj +2924 +endobj + +166 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [1076 0 R 1077 0 R 1078 0 R 1079 0 R]>> +endobj + +1076 0 obj +<>>> +endobj + +1077 0 obj +<>>> +endobj + +1078 0 obj +<>>> +endobj + +1079 0 obj +<>>> +endobj + +1080 0 obj +<> +stream +xYn+jidqKE@<dIK%JTH_fsRE:Yf }sϭ*E{87CoRބC88 +N6YCp<H!s Dif*tk_kD'8i؏v܋v7a= oAaL"D JWh\ +:jv1@YF:|N[*|ϩR7[͛;ա4=l4+L UH>#;t=׋м> QǴG= +4==jB N)q2Rb..xz9*phHlU%p#Eo,}+}3Q &FtyE<5 @~lr*2MBBS~e#3Fz8C5#W6KCWR-!*8!+2NB5WBq cQs;5 +SW$G1S3/2RW 4c|#=wsh~Sfc_qdz;pWC<~ +i}J3aanW622_G~CiN^n>x$Tkd:Mwgs3m Wҹ_j_::%z9c͓;_b#Տzz_Eح۔gsMЖ0Z +>\S~[+m-9kxWKg[m˲*۱_eⷚ]Ul>*}^6CS|7yVmؾη-[,ٳ/,CU쫭[`>TƇE3ڑr} h@[%Ĩ4fӷuJ[9zEmٸmSG˞9Hk$I0aH6b7m/ȷy;4ZSuqsHSLO ˊdٶ:^(6D2UnEװ]V55?V3:e]Y RV|E:*Zۚ|lBq|@C2b[vgхT#V5@aW42htD+L;qB(wH8mc8l2+ɲݮȗYWùa9"Z)客du_Կ_B=vJb;?i{nVn1e{ A<3U$qeQ^> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [1082 0 R 1083 0 R]>> +endobj + +1082 0 obj +<>>> +endobj + +1083 0 obj +<>>> +endobj + +1084 0 obj +<> +stream +xXr6}W1$,L3铧u> )$?.D(R\k%[p#Gl:!۸1#eP*(BJ yt_-sb+@=kDÉzת"+6ؠ&ʩӇE; +-bU U"%TEyNNUDXomN"oU{27. +pӡH@P!_ecT@r !7GzX1)m֞qqz8petG'l!RC#փw=Pjy*R#@g;YONdsЧ5'M)o> ҂{L^|&K. #??_;81(g0W%&so2&C1'ȒT$1UPv1sgy틴Fu^B)hm->U/v2*p}*AA5s׶|bv&RH\m?NA̺ͫAz,VY5@!--ۭ+);<֠J* -*IU~<|\UU'D%det  /ء́ķPsU.)Zq9Q!)lN[ 哭a@`Ԩ~_ VUw:Uߨ| j[?UyJ!}p/" +endstream +endobj + +1085 0 obj +1394 +endobj + +168 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +1086 0 obj +<> +stream +xuVM6Wm')%{d'Tr %q2(-XX_M{ 6E8e5M)MYƩ ‹835aA悈s^ N0(8=dFe,!y321 QsZwە>%2MC؋7>K r*$ <^lx2=9a0ä!0[,b| S`n1>קyJDJ=׮Gd+NX7"tSA#ʔ[J*[ c$#嘆(r|g ` +hأ=#v@iðu8M ; OɁN R݇SE^-HνUêMX>N5Xʗ B,z=g:9 Տ+_޽#3N5V CMKI _IO,\7YDIQkhGw~/^Ou8/_|Kl48BFüJ~ 'q^(VZ7Ct{ig|B DmɡE +endstream +endobj + +1087 0 obj +991 +endobj + +169 0 obj +<> +/ProcSet [/PDF /Text]>> +/Group <>>> +endobj + +1088 0 obj +<> +stream +xWM6WVpYKAQ Ai" @.Dʢ!QP$o {& g޼19nhxǧ|\HƗl?o"Lؕ<Kb7q~QdLM8U߼ dS.ʌEzgf&?և5ڕ~Anl*xƃX$`ɫs'CѮk ZӒ^ʛ∳lCL`bieNBpDY0eM4yPV4ט\Kړ} ӵ#wnՀ`Ky5m#ޗ+-E ;CY{DۯHkƕgӮ` +}e}{w$57Fu6!3 +05}ׯ@DdT2r rXLN6;S덵ecrggh>l ^/dߝl $La:ZJ\JWAWEšvocK׎4Q8}0-@<{$GOmiO6AIZkeUٺU,=L4;P!7Z +:]#:T;H_C`>4텢ô<[o՞\oY/ho+<-ȡ)(*zIa»#~~AEkP21S{/$b0n#m:?y<5f'YP`HO 9xˇRI[ UrCo= Ԩ4ܫ!8i~@7>5tEf.&݇ƙ +^Y3{BF"BDE\c49(ʔ.!g\7d2ZkkkD_D3VXC(fkZT#3:ˆ]a%̾j3(ͷN8xCAIpx>NH)&Q9?+%$z<*Pi,dӪ(Y<24ߗce- K6 *fV׽o~W3*Aa}SR^ XW<*<%70-GB#Pd'}嬭\yi6_Zn~AT{j͗ގ34l1|[sVwA|fk](ð9gߕUn'D̖!sO] ⠢aޛ]hCj"ơT.tto}|Ct7j|U(ߚ2g?Ơ˹6"׈96' +c-WKi|_")xa[2*{v]0MG\zh@f\w- O.a #L3p[U-|o{)[a +?XӪ޷{[%8'T^\M41IJoEՓ&RALFܜ_X ^dBܾ7w=&e—wgHws+QVt#ɻ2i +#q?WdJ +endstream +endobj + +1089 0 obj +1574 +endobj + +170 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [1090 0 R]>> +endobj + +1090 0 obj +<>>> +endobj + +1091 0 obj +<> +stream +xYKsFWQR@**ɲ琤VC1@P/sn`^Vل>|nS~SɸO%29-Dټ@gTKXM1M6p.i"fs8ڨ\` `L0U "#$ hRQrI"73juXy,Z{:|zw +}鱀))Q䳕^z! 9 fق=Ay,Ẍ́@xvQЌ/=搅y,Zdor"2Lolw%-@#Ս%erLƾ;2ӉtTqǑr$Oݹْn<,iˏ}5 +0Bc[쀄PBwc-*kc^wǪ9o Cj Ggӂ-F4GKv-SQ"3* oҴF1 ( D#R̫Tqj +#&OYLU="&ry ,犛+`\٥WE<\AWW( V+f.lVH4'XgĈJ^1u~X2j8_xȜ1R1AnɩkYn W%dБ)zvvմu +nPM&b 3\5*me* X/%K0! ʳGG.>.]0G+1 +ieɿ6 +[Hv"mMRtgRXv87@],"bn^}CEx(2 0j!Jү Ek8Sx(2\1 uWy1L2ٙ+QLԕ"- +;Ձ="\dYpa[//ᙔ[wܳ<>aJ"!aӽ&ˍ@u6@ \hA-`06\ _;r+Rz#*${8(Z %_ ;e[uk%A OW$q(2CRQ7K~8MYAًMf(x%].D^efIb^/ex@i> NjU~Ih)4ŋw"F\h^0sy!<{]~(+΅ ;LOV߮yLKj~RK7ڹCܔԔuףrM4-Ό>bPbpfb^W[ +| +Yu5 F$ncO<6 }LW$Bϫ[I׀a, +X:'HzGYis%Z?1_>פ麏=q,Hu(mv+,=4 `oBz2}8! +i^w; MH>·c*DkǵXW=ھlVeĴ;@c$Ĉ"GaDkiKzT8@UY2sl d! 뱱d8C{ *9ut"4*ij>5Cݞm0!DNɢ9S[Kzh7V:_ +H@g͡u\{<][)W?x|ߌ04TϹ}*WG*'ѦӮXQ->#Dd BrՀjÃ%ۜv|K[|?1yqT-Ҝ4 dpUsYD;qW=\1\Pd)owoG8O~GleHa_hk%x> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [1093 0 R]>> +endobj + +1093 0 obj +<>>> +endobj + +1094 0 obj +<> +stream +xYێG}+щq/*6R,?GݍX,XgRLt5Lxeu;YVQG&6t*o}s'۟'J_ҕaMkbT%wQ'2A+4%J%mTi%t:@f+]Dt.IBޗ \`Lc$z8cQ\l7,H\Im?{c\`{~$H棄VkeweA;IX+CEVֻG)f ZgEeuHp͖_lF {Gyx9ArZ H06V L?:ԗ]_bE# =aAq \NHT%x !BUR߄cRGE%77*-*)9WBPrAAMrEofU9}FOfRS)`S%$/ î72`0dmw=(7$y27FU2T-R[G0p=ZLȏ2%}A_R#^ˍho7fR qZw<2f`ޤH+u:5c ;jm| /C_3S;t*˥CG,A\0.igAV~P ne}A{B:(Kjإ>& >]\%35O-GIA)Y "< mwpľᖰIBk; (GHKaDٗ;ywjψGqK +] ( W =N `30k"%(G: Gg)8!q3WB)zǹ2 #%V++'}faQfI4` +Jީ`Ql3ITp\aq"H +V^ g3:_jZ4nײ0څi#Q,5- KUʫ&V[C_<ŊUCJVoYsjrVߘ#tM qM _?`GMUDhո&xň{dh& 'hqh! ʇ\wh?oifB9f@㶈<,"qwFDȴ&vk 3+|1d8'_aP9irwoR Oe&-Ԕ 45-4Uyko*ݛpڽȸM +ilKh#_n'5]6az>wd>KJ.59n|[.뇟D8D6}?iLrZ_ĕ9bԙ 4$<Շ<ԛd^_ 8pL3dM#d{> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +1096 0 obj +<> +stream +xYnF}Wtޜ0-)HhYYH&7y1Kݧԭ)VQ#o{J;~9֓L +m+*!švТrZJ]9 Zi)aLTVJ/aL5d5Nd;lГ$谚lo_c +G6!JVgF$TA\NA&>AtRIBe-szCjRikOt "iexBIY1UDJdِoO[|;BSu@$DUNy lƨ/=ˌ/Lb+UO6&GʾFy6΁;>*-!rJE.,qYSc{:~B !RB3@y%r{)9}azߦXqL!wH(,=h Kw "kHb.@h~$ISIzS<)7ل [PC=FlV~v7x4W +v~toEI_Cڬ|g齐%8CqMĊ{_&o%IӖ-<[ E~)PE[ٽ_}!Aq/b*R.l&*\CTQA/&ZlX~sޏ8XJ򠍅q` ԁw~JvZhUDL飈U ds()0,ÔP` Kh+|+ ^W{%ODj QCĽ%]&͐agygo. +ˋ`Ktgc޷+Sؕϖ`4r>; +]JaSNβ/d{w/ ':~ޯ?v) a\$߼] +?8մEVUS}EBP),*f:L~Vc2^bU |P1+Y*lť_g2[աg B&(Sw ]vU!HVk&ɢ KVLbVzi)Ο6I ye85thrܯǬ"8g6KQ_nMbB +Yk0lLƭ z$f,c6=2uH&]ɢ3Zѓd4Y1uAvs/{MOuWZDmoK}"T Ejy"jdЫ/Þ^yy×zu>UG_<%_=-d_5Y>izs!BϺo7ۉs~>63Ъ0&yt9AR|L ps|~Z j [ $\7=hbۯ|.$=n7/&2(aǍ=C6[o=B\If~ ҹ&2aW"ueL> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [1098 0 R 1099 0 R 1100 0 R]>> +endobj + +1098 0 obj +<>>> +endobj + +1099 0 obj +<>>> +endobj + +1100 0 obj +<>>> +endobj + +1101 0 obj +<> +stream +xXr6}WQmq!28Ӧi=w2})ȢC*Ig!@a.Ab/g (?rұ&OP×Ƭ?H3 t#J~E)D/TI)DHp&+:bgP/$HTfA#g,(*("IQ!FW\FTH0jkĔp>wTɤ} +saB넕) ({u\Sgس'8ellL\Ė$26 cfTl*>!c#36ap'UA 0фL=$W+6@*S|Ȕ/5iLn7ׂnW4{rhmQ'ruZEBfC;RD*Sew>k{ +hʣTs<8w}$yVtx EEg]MY^Eut;CEL4RrӶvv$#[H?moy}0.뎘-Lcs`h(Ah{C;d,PRñkɄ1!Hv4*fF.|#-l/2!#\=í;S1n>սc3l=+`d}xnAy֑ñݑSWf8Jݐ˗N/;ܙOXW0Z@~gc?jZgQ0>G1\W,`[6A+&,E{I:ׯ *I%L%tͯ_q&DRdSi{/b< r\pqp\m}LYAKwf_F}ٹ)uU4]7O[kg9Oѐ6(:I0S4>9nʸ4óh][׶06v<=VSalϻzWuu>kϱY^-9DSv-ͳ,Aѥե=vԮS\uhYehiyؕ&Êm)EnsK%' 1c|c@MvoU(*3? +endstream +endobj + +1102 0 obj +1695 +endobj + +174 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +1103 0 obj +<> +stream +xMo0s,WTZZ!TӬw74mUa;Bܽ$zywRQo@/6QLR i9RPDprD (HHɂ42HӅGDk&4Y]Ԝ#y4X96W=npO8yu?ܳL.#nƗ±U*Rswlb +.б:*rlک{$Ljk5o δ8Ty.M&ţO,MӢ2u4p֡վX/4*ɶ7 +endstream +endobj + +1104 0 obj +771 +endobj + +175 0 obj +<> +/XObject <> +/ProcSet [/PDF /Text /ImageC]>> +/Group <>>> +endobj + +1106 0 obj +<> +stream +xXێ6}Wq[,X^⽴)`(K#[ INCCIȫMh1yfpf86 fI 񡱋 FsUyErIYp.sFM$5ʽϨܛ ˁq naD0wbfi¹C̰s׌H\abJ'{@!*$Z}ǪEcd#{]v +uX>)b#2Ql\ 4IXX$U&wxvb#2QlĜb>"Ũ={LiY E$S!)TpJ5!b XHC!*Ű߱L aF<$1 =3e]Rw*˥eۆq)(c)P="bK FZ>UlD&XRQ{~{^ _t&`zݣksFWnr ~^\?aCjՒ&m>r~WL)-5= \D»~_4W >>8Gtc3C.Q=W0v?(pP Lz'kۡS=fh@ɯ[lxjW .TZW7Rfh6)wYK)FFFTߪ@3Kx v+-To8G;޴I7݇`=xӥu˨rVMa}* 48 MīTF]"׶2"A{7g~8ἇtҐU]={$%"n[ˎ_UyAe&(ɍ𡇘 +endstream +endobj + +1107 0 obj +1522 +endobj + +176 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +1108 0 obj +<> +stream +xXrS('ZJjw%m]\)4]92y>$@r!Mڿ36Ǡ6٤IJNU)>9vJY"4,EID@hʒRRj77ZAVj<-  /iJoap6}Hߑ͸??:}C?on2ey.YdP -xR?3IҟrϪ]}SIs"gII\=J'@iԞ𵩕lՖ<\&k[t +t= :20}7n$MPjW:gyiK2ʄ ,͑BZ.&4 0UԣM\3B3L(h`4sr-68 +f[ XGPJ z [*x:]y|{WYeߐ9X/QIApeg2.XN,Q7W\*Z$˵JK)NStZ ?wc!RZbѲY!CveX _=}az;xTÛ:5zR-SBmQ=_Ȓ2/cV"ZeiF+ccuPƱrj4XCAMRkm_H2II!ZwgV9M%q\Myg՜*`^XkƦj@c~"d_n| '$ 55qZKg糼b4ת;)<bijozY~P4k@jI;f1 cvT\H0+WeӵX|εJo;XjS`SkC˜aL6`vC5 zھ^ǜ4{oFOQ -;m%Ǯh| x㮰=KA]Dy)u&'6(r/bij/*ש,zM0%[˅&8Ss }r'vDBTO/I>.>E 69>!hIhodzYh~* +22,DMM7k~Bx4.X j7X.7kQb#G[v^l=djv] ;`[A{򀚡9ށ +o@e8Ƌo]JŵnZϢ |vӥy +]y4asQ䙉\Oپ<6-@2}|<۠_LIm^3D?[rz#'LfI!yi+S~aoɍ⚠Hx}tgA&f-h{ w9w!`il 2 +endstream +endobj + +1109 0 obj +2095 +endobj + +177 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [1110 0 R 1111 0 R 1112 0 R 1113 0 R]>> +endobj + +1110 0 obj +<>>> +endobj + +1111 0 obj +<>>> +endobj + +1112 0 obj +<>>> +endobj + +1113 0 obj +<>>> +endobj + +1114 0 obj +<> +stream +xYn}WQ fba@(oLKuϴ0>3SݼT۱nFGCahiG<]4jTůΚ^HK8HjL6:'cqa2gfryev•0L tiB)̜fYCB s^k s(aLΐ&qzߩKwXjYYGDP)X˜3͙KW,cΆbkvXDfEK%d2mm\mmns[JKCT;`0m妨03 +3c2;CtJ SǼl֥0se a2gfƘd!!q}?Frme b6ه)f}2͙KW,c֔%gEdXĘ3VN Zǥ}嶦t;9ե0iqQ>trc\^!p% KnI3fj*,kH9c03$ q 7KwX`Ŧ!K)2͙KW,cL1[gd2{9+`2~s;'Nj˗Cm:о7{Aߣϧ/r4,/^ ϭ?nۮF6}8!NIةiɍh,+wfwݵo卺s`N޿[&꟝w^;[Hr9nA|c0DɨYoWvLtЋtO VubڵoGU(auly}.9Zq^ͦh$extz2~U׉~ӵÕ[Tb{+Z\!j/A~zxEA|bmnZæݯfAPa^m7$im&Aۡ]Buہ<͇jJb1,]ph?U?-mƱ9{}x3[[c=EB6fܽ%^4Rufٍ^v":fnZ0Wn"9keo<4kdLX۵V4~sniyhY f; s`[P,W5,M6c"+5wJ[W;ofqgs-n]%q!u8֪I.w C.Y$z`p<^`xjw'DR`rPD aݯY+z9Al^ XbrҦ %Pyث!Whp19ݿm,!^=kb" + Kd}Q!p% -}az=g(tU֐ty C3JX:3J\rR`ҳUvbqkTt([:JƜm^R?ZEKmG,q}|>VbS +'r*Vvy +ҝjЃϊٻy& +}apn9F%v̕0EX0ktn*&DaXf,g$o/BOyG2DGs(īYWʰh0a8 cա!z\ៃh7[s;bB;k/%Zn= o)j3~짻:~&mq3!^Azm57 Hy_n-h$I6;~QD6&7 ^5dPL}D@O1QSDT8Lm]g<o\ z)&g MN< Rt5D)zMX'O eL#A9D\P竦L6+Ci}$Q^]|CU^4C=>Me~~`e\uFfDD:=$޷v׊Pсq/cݵ'=SQ\ĿݴQ|SB)i +endstream +endobj + +1115 0 obj +2210 +endobj + +178 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [1116 0 R]>> +endobj + +1116 0 obj +<>>> +endobj + +1117 0 obj +<> +stream +xVnF}WG0&' +X^- +H̙%4gΜ(fd0 odݰBAǐ+Tv{D{,9Ked^ Ťh_V>b^$JDoHkq@(o.y\7E9c=U( +hn*^k(Db(Gg}'GwdWյSgSuw@ #<K"񤼢,\n<-8f*]\30hf#\]-|&8 eAь=DoPAݍ0Sw#ҎbkQ0S + a5 S $eGdΈ0qCUwUYj_$>7|!W,W( +մ˹p%ÿо"C.Jxe #3bW0|m`- +endstream +endobj + +1118 0 obj +980 +endobj + +179 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +1119 0 obj +<> +stream +xXn6+t +dGI.ECϨFSIǟEc(n7^{f.m SO2<9P`oj8UF`DI4l B(zRbJD +Xjeq;e!5K07DQϿ*~7lѢ#tGғtK.goǮC}|r׌h7#Xu6&rabw!)80!gjM=pMUCk[tM.a>Ox!̇\ }^ر,rgGCvmkU͌ܚ LǶuTu]foadWF}a͸Nҗwh^8ݦH E[AUVbKΩL7˰Dp뒈;] ~&&H|7G„BOsW8. H]p#WX[D Ƭ3DF5$r%](SeCB"ŚH%,e3Fo:ZJvRV,aRTdX@e 90ZgHX%̍*QbwyV̐3$(2JX:gȺތNۯ_=$Ěj۳^tG=ʕv^)Oehd S~nz>)lPG4OUD(xR9 +jC [LvB5LvsQBlxЦoaḦ́Nȍ\[Ov:4fljwm YW4jbظ&5Wlrnb"6L1ˉa.o"U=CJQߢ۳犅RF KY' YY2{mA ,M={e+𹯡Wd)g˥oϜGGCgPG/ <8e4(%7 ;Ȟ!0k@/V sJ&lPG(s6JF"=APdxrFavJDJdT2;)\AKXXAȐ,`r|# X~NJqe=&0bHday2SL& +c7jj?_/U*Ȧ`f?P"oS~bPZnKsy6ڽ*p3[9%Qg \pd<^߶fihYMnA >cZN ?V\k* +endstream +endobj + +1120 0 obj +1385 +endobj + +180 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [1121 0 R]>> +endobj + +1121 0 obj +<>>> +endobj + +1122 0 obj +<> +stream +xnF|=:r/ @4AP -J2$Ogtȹ4"'Grۄ am7?eW7Up.j/W7qN.~Mv:6nX7[iâOݰeSzƮ~ +W|%%kaoWl;Ovb?;/ͺb=ճad [DkkhM\JY='EG]+6ɦ6ERxL$JfF`^jۙz&qB#eT7.5 YTX+ŽaרNNZk63>3;$* ~"ER8K ]B=Xdcb9&"Tv FuBϛhd˚V>ViJ(ߵYnd"*$n7.¤NE 2T7 +Ga H֊l#d5b 3L{i:y߱\xSVicK:XpkAI±9 o.zvLc:Յ!îQ1;S#\jkd-,w-mؗ(dy Xܘx7ش~5`ym3af$JR'De` +L$&b")QX"# vꙤO^Y1d:X0M KǚǚbrC ) t,2V.LTώTq̤rG宓:!cvN.raq\xnX mrٶaI2m8Hnw~꿿=q23 K5޿~'& +1/\{XQ/h%,p.)^G6Mn`a\Mim?lswbb@qXRcaa?@} +endstream +endobj + +1123 0 obj +1634 +endobj + +181 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [1124 0 R 1125 0 R 1126 0 R]>> +endobj + +1124 0 obj +<>>> +endobj + +1125 0 obj +<>>> +endobj + +1126 0 obj +<>>> +endobj + +1127 0 obj +<> +stream +xXn6}WI޹ +8Eb3[Ne|P?%J&' J9gg8e,GG_*?z +*(0DX.˩u W &Jcj H@uk"2IX(zL:7`#1xAbJ@z>^CG+G}F=cOq=yޗ":a<#ıdE,di =4IXXk!o5 ŌzϺgO3,9K3*P1X%l1vkGHR1P*@ T*\0~]=3bil]Юm&J+fC*MrL3@!()>HN1S>cu1fCs+-U^Ӊ))Ure) ch-&$W)):D?q1xųFo La"HDzHT#:Z}8,HS0ڐz(*DR.DXc{F $̲`M+p`æ +{l[ai~d@SK,;vappxb +GkE2#bXWroyTu=~Xꌑ5, {{_~ݕ$!n|]K T,6 8%4҄^Uayu֋WX/WLحoTq|: Yg`eF%Ů~T !0Ttr{ih?Fd3=u]ԫ͚B~Se +Ā7!en?QYFq\SmF GužZYm蚴iƘ(JcuEnu. +Q(J1QԢ"?[Ol(KR8|af*F[ ԯƏ+wZqwEE~)\-N ncgͩE~==m:-=Tuqn.O-,2›:K_dCob7ɯ[aj2mk ` +endstream +endobj + +1128 0 obj +1269 +endobj + +182 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [1129 0 R 1130 0 R 1131 0 R 1132 0 R 1133 0 R 1134 0 R 1135 0 R 1136 0 R 1137 0 R 1138 0 R 1139 0 R]>> +endobj + +1129 0 obj +<> +endobj + +1130 0 obj +<> +endobj + +1131 0 obj +<> +endobj + +1132 0 obj +<> +endobj + +1133 0 obj +<> +endobj + +1134 0 obj +<> +endobj + +1135 0 obj +<> +endobj + +1136 0 obj +<> +endobj + +1137 0 obj +<> +endobj + +1138 0 obj +<> +endobj + +1139 0 obj +<> +endobj + +1140 0 obj +<> +stream +xU˒4+z옺̽E,5lG(,Zrq`C6uGZDnWE[~yI|Y(./ow*U>Z䠻1~9$wI2KCGQUAҊFplv=g2 $9m^yF2<1=W7 q)Aқ_]IXǡf#XƁ5g6ZZhx+Facᖢ+IQxJ fBr^ę@`{xR B;aѰob$}L NZqNiŸL,5V&MIšTZ2c,cZ]+h)^iBT0[q鄬LHRh^T"p5gyJ \#-gs)|06~) W̒L$iNk+w?Zf.: KdtiEf5tX\#PO!v'9@]QM2AV+7-ʻ|;ͬ4!3 xn{hB+<8/N,s$I[o%|^.zJKz;m$}}/;%z笁^t=,≶J=tJ5YJ#?s=~j~ڨqSlz&U$Wŀ`9n ).k|/i|qs^.ׁh[Q>̀UMFXئ9_Oua^o"Mj&CIݤ]m]_>=c {7|xqDU+!tq#p栐 ߨ h{0a8iոSvYߌiȊ/~ӢZ +endstream +endobj + +1141 0 obj +915 +endobj + +183 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +1142 0 obj +<> +stream +xWn6+)V|bc;iEN5/GѴq$%)6MO-w Hd0|q)Q˕q>xJ2@)'P* )'XXN x K ĘAc(P sby )5`u2 +XT=Bڹ$[=I<91^%wH ʢ9KERH\ ;X8Ήe9#󞸢Nr:oW+96K GUp%:V6k!doE%% ~KnV)d8rG^TjB6 +oQ-IiR!Ey%(J1ndW&s*JEB@PGmnHffMszdrZI%jI&)q%nG7$[܆|N9R" ʼM c9oGjW¶]g|}˺ӁjjE}\H}_bW>:"^_f@0McNiPئMC.ɒ^wnݶЁ3 +K, +wwϦmQ :74ݥ/'V}M]nbd1bSㅍ)̰(4;GeZ>zqzZؕf jaL@p}vrcۗecXmUl;,&KSW̾N +?%QoxwrKm}~ S"{[Ż?^Fl˦ĊWp]l8OTE^/~,x"SiJaEJ> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +1144 0 obj +<> +stream +xXn6+L 7`dO[M?@i[lzdҒhR;:r|=WGH C!ꮂMi''2,ݟt7wm\~Q<`c$nB#cW S# :aQ<֕ٝJ&uHԱs(D$RU^8m0VpWyJL%Z&b*HgBeabZ:X鄵!^ԇt+n! *e +CE8ņ cdD`}<햰$-x +`K8[wP7"5 G佼@)#aN81&k0& +)L}F$焍`eر/5qDꪸHaFt`QJq)Q;_o(@9 +~cЋL>< 0 %'.}(?;mS;_vwUkw[j^ZXW#-5綬S?6}~)mnܫz[TWؖJ틸;<-XV5HeZJ,wLvWhb +|)죨JFk|BcI1`4a}T~@TQ& +%o5pZ{ "U{zɕNFR!)\8]?X:p;G d;j 'z~Oo,5Ѳ?%ZeܙRu Yˢqc5z)n: +~YFyNB>éSnL+V iU;ꄇ~\Ôd0tUVvk˴hjvձ1BuĴg>5m[blfѢ +6߀W$-uD-]Yg>_vi +endstream +endobj + +1145 0 obj +1581 +endobj + +185 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +1146 0 obj +<> +stream +x]oW))*(Z$MS$EںڱlOv>n3z(/ei !s^+ 'V]3@VtgBCF^VJi/Fҧ0VkW]k#3bIJG)xL"mfn-9E[dԞ.mG50YZmW%#f%kDqY}^Rb9X"!R,Jbll@@1fXfAG}8okK,*1+Yst z|z{aƼ¦l#{,iQo" 3f8:]b1ktZ{OtOQe La0+Yst c]7^T$(V6PkK EceJvmX"b0+Yst z{=V=8g.#{V:Fͣ@D0f=̠RL{,9LۚyT^C&P AdV@<Ǻ=oP\bJ6^Cy7zX*ְ_dwH "EϤR*SҞomX"bdV@׫dx/8b,HOG}@6AdVz%3r`Ƀ2pjVͣ`-0aV@,Ǻ=oLRXf©!歺b{b`w`VŘb\|jK YɚYyA9.y8xr6k''5yf @^8I!VcQe La0+Yst -Ǻ=oLRXR%'51oe)T1~!1T*Ms.C{bT%ìdс,Z MfGIѝ$Q`G`6̰{@BߪI&n>ӨL2,g2JEbu4ƘHX"ba0+}сbUef+f|X"bdс,Z MfG+{CpjСG}@6AdVz%3r`իN Oo7AO`-0aV@4Ǻ=oPRXfNF +ejK '( LIc9W̒sT * YɚY{^zq&)/WEŷc^M~9b;ՈovB'ú]]}_Ķ<?^]'C}F:164~%ݮ?>~e]^gqźߋ4fsz^8p~qil޴m|:q:?n7;)7'Ahq+n8c*urur +c + +ZDgnBAiç8'v(ϻEkO,{ٯ &և tYߋŧ͙~+3'0ʌ͸ J`Qe LfS2grҍTUaeMٸg n.Zm[g\5 mhANN0>|bz~{9Ўjq]ԧ#FLC۔mV)a'6q'n[j,@>O#WT痒6Be yR?YJzjHi%?T![PJ(OJm{?ۈ]Nj0߈L7uVULS?sOaZE}t!.jXNFH>> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +1148 0 obj +<> +stream +x[r)f٥ +*ۛr*ImJ EB"$e=P(o`N>h˭ot` POrhqhϮ9 ~NnΤT啯F QnTMm$cU-R1&"jҢLBg&u 3!̬g}f~E\- I| dyF=:CZO7vo콂1d]"?f%c )KXW((}a=#fkIcu]2ERDQd!e}y]k)\3AruV(9uO}wrjkTK8g+@rf9v̀lLX33zӧg~bo-]բoE?o[4@ <|us6^.ݺ=bg;޴aAmzi4a|Ȱ^ b0,6{1,n +/Nso;,7 4UiD -ϟjg6LUF膶HS*JP\ wrjYD5զ4wv%>{! r{\"04'+ѷcڊCwmwT3]bs忊=>l94Oی~Rj^MĄZ7VNĤБT%`H8bzңLB at <^qMȓ$3Rg[m!6&|mzݤt$"#"M>FKI˽3F| c`zے%,F` M28ǭg1g 1ɻzݠuC("Ҥ:!4\`^vh[]Imˁ&5'u(CtiLWibMR:Cl <1,uW.EMKȼH{!im% +7A͌Q3ƨԟӆa1J7i:CcqÊֱj ư9cX;EMNS +z?ħaqbWo,FaYq-Rd(o r*GhiP*YgB(d 3+[>;QSTF፴,Fݜ1°ulf1Fca l!18ca9fXc؄8c؄("j5B(v$ +bvޟsBg0 +u+ yi;`CRh=#yc@,Y%rf_sHlH{)i4zXưA1Z3c3c!&.b1Ĩ:9g ⌡_iRd'\B?~unj[Bh KIej>} i`M(R4M'5$Jd,@0uLCNkNiRdRҢsKhjr3ƨcT1&x [c 1bX:VkC("Ҥ:!OԹ}buC:eor#S[Ne1Xa +NRH@!f":kIv`B;b"&i1x#Өrs\陱OtS3LAfAFc +CǸu\0v.GEM3<^t.gV`2߶Sw<,`^WI[> + C-yeR4fEj5&)\f$/c1,NG>%_YRD91\F፴5u=g0,G(--/X^g +4x fKXbXdJ` g FF[ !ORx߶b+6맧8;}%b\=oD@T.ZbUFxm% Bǔ"ȧAޥC`bDxpBr]5y~捵gXSA3^-3}3E)0nuLTmhBNi;3Ev +! g`_!ޠfT&26lɧ3~Zz,jԩ/3q#?ҥҐ S4P~n/zv+ zIm}9eTxv+vtq}vI9pl Xv0,mv$l5kISI9|2pˤnyrunwuj0HL\3QUM!x'Fu6/b*^C?@O<qXw.|el +Ra^;Oǫ 'l?Wp!╶*=7f(n)æI#3 ڑ,4C&C NiO}<l9i_;L@{?JNSq͏]?NTr眒Lq͟mj;5a盕2/4&Ox`*ϧ?k:._ +zX;l)H d!>J3kұCD_ FDEMV4xcErYXZŗu͗cx t0KKXaRQ )3:Cֿ{":ij k=J>>d'E1b,;̧lbŕ]w<_gU6餌R7,)aOk4vb@cȥ[f5܃  B/@C4ko=Zn=)\:W&l"#` 'bu0ƙB}hu1!t D kގ\ +#$G]OWxSM(g#Ͳb^z=y.D\Ţ]܅|RfWSB_)ŃYXOuh6aQt%)\Ot-6&<"&HʯB;bx*gK1mhWUhЭZя5V̈́쫲MˈY)]/64Рl)at?qCQ'ȓ?,fʞ+|㧃=,vx.U{p!LX&3:Fsg +endstream +endobj + +1149 0 obj +3263 +endobj + +187 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [1150 0 R 1151 0 R 1152 0 R 1153 0 R 1154 0 R 1155 0 R 1156 0 R 1157 0 R 1158 0 R 1159 0 R 1160 0 R 1161 0 R 1162 0 R 1163 0 R 1164 0 R 1165 0 R 1166 0 R 1167 0 R 1168 0 R 1169 0 R]>> +endobj + +1150 0 obj +<> +endobj + +1151 0 obj +<> +endobj + +1152 0 obj +<> +endobj + +1153 0 obj +<> +endobj + +1154 0 obj +<> +endobj + +1155 0 obj +<> +endobj + +1156 0 obj +<> +endobj + +1157 0 obj +<> +endobj + +1158 0 obj +<> +endobj + +1159 0 obj +<> +endobj + +1160 0 obj +<> +endobj + +1161 0 obj +<> +endobj + +1162 0 obj +<> +endobj + +1163 0 obj +<> +endobj + +1164 0 obj +<> +endobj + +1165 0 obj +<> +endobj + +1166 0 obj +<> +endobj + +1167 0 obj +<> +endobj + +1168 0 obj +<> +endobj + +1169 0 obj +<> +endobj + +1170 0 obj +<> +stream +xZێ6}Wm;D;Yj#[.bQmc?asU:u(.=,, +:}S +㿴v|OË !LL+M c"˥o͘ +k<\eFav$ /)O1':]iO8\WDD _Q4Z'UojX\L\V:$6)D1Q(8Ƹ)#*FKwzez~ĂĂ" %`<(~>F먪^`5xGHD()3K,>bw=B (7dpϜ倕6uJ,.}dz>YX3wodL |sô\Y-%Zʔiaw哭SZ"S2/bY廪=JVyV&*R7)˱əmb%/,)nf<+yH/Vbyw0rjT*,ⷾV/?mo_7"'8VsW'ˀ֥V_n~'򐰓ʳӯu ѩD2qi%YTl߯CߴUYjOivcGz'͚˾$l]K-·- +44B/;ɩ܂\(hUX =A`0.їrt#$R|b3B3Aq>3`(Sb*D) `0\IR|2hIL)Z &@opUh߯jpO|X1c!Tf( \"-yhvhe=nmgIeGےon*ۑuӞrݖwݑo'Ϩ{7]k׶ٓ _ 9 +Qpt?ӎIfUWOKfC?=H9*_:&g$=422 !rsEiPbM_U%ѺTK<.fG̰̕L !QWX~3tlk1nUX_"'oU7v;ߐuܝ=zOLqvtd>a']&l+;OLFEOqsĴ,1U+xG4XȾ;g :i GL1IZaY⍃R֑R/`q #)|&*PT +*&@op3^5TD^犡+.Cvb~xn;-+u/['֒\ߛS:ܯyַz{A΂ɈKAU +j\@?׫2$4Ήף(l7en֏ǓqPĥ+,?AlJuqOd9ږnV~>c{"ѨH,WҝM󻑔5IEpM|ѽo݋}%}Y25)1Ș(kO-vX]RaNnlv]O6՗[':A>n㝿Kzc,u=;f5,{s\0T+=(8?J˰O)G +endstream +endobj + +1171 0 obj +1944 +endobj + +188 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [1172 0 R 1173 0 R 1174 0 R 1175 0 R 1176 0 R 1177 0 R 1178 0 R 1179 0 R 1180 0 R 1181 0 R 1182 0 R 1183 0 R 1184 0 R 1185 0 R 1186 0 R 1187 0 R 1188 0 R 1189 0 R 1190 0 R 1191 0 R 1192 0 R 1193 0 R 1194 0 R 1195 0 R 1196 0 R 1197 0 R 1198 0 R 1199 0 R 1200 0 R 1201 0 R 1202 0 R 1203 0 R 1204 0 R 1205 0 R 1206 0 R 1207 0 R 1208 0 R]>> +endobj + +1172 0 obj +<> +endobj + +1173 0 obj +<> +endobj + +1174 0 obj +<> +endobj + +1175 0 obj +<> +endobj + +1176 0 obj +<> +endobj + +1177 0 obj +<> +endobj + +1178 0 obj +<> +endobj + +1179 0 obj +<> +endobj + +1180 0 obj +<> +endobj + +1181 0 obj +<> +endobj + +1182 0 obj +<> +endobj + +1183 0 obj +<> +endobj + +1184 0 obj +<> +endobj + +1185 0 obj +<> +endobj + +1186 0 obj +<> +endobj + +1187 0 obj +<> +endobj + +1188 0 obj +<> +endobj + +1189 0 obj +<> +endobj + +1190 0 obj +<> +endobj + +1191 0 obj +<> +endobj + +1192 0 obj +<> +endobj + +1193 0 obj +<> +endobj + +1194 0 obj +<> +endobj + +1195 0 obj +<> +endobj + +1196 0 obj +<> +endobj + +1197 0 obj +<> +endobj + +1198 0 obj +<>>> +endobj + +1199 0 obj +<> +endobj + +1200 0 obj +<> +endobj + +1201 0 obj +<> +endobj + +1202 0 obj +<> +endobj + +1203 0 obj +<>>> +endobj + +1204 0 obj +<>>> +endobj + +1205 0 obj +<> +endobj + +1206 0 obj +<> +endobj + +1207 0 obj +<> +endobj + +1208 0 obj +<> +endobj + +1209 0 obj +<> +stream +xYˎ6+*ߔ@4h&nmV#[$;ȫ+كIbX8{t1yyȰd{S +j;Y=$KtDyc,ɨ1RzDtSqL@V:,MY6bGR(?qFIN9@0#צS/5T?wz>@1^#W, 4aJ3`GR,`s녦^X2RyBEA|Q폧wEeXd1Tr0*~$?'?|:,Gp1j'(H=٦h1oȶj;bۺ]Kڊ4֒bEޒEu(d^3ɏYՖ_ 馰u^/6"/ %m$'bgV$|.vk޻k}e7[j*T[{弴ۼ-dnqdYfMK򲬎E]zPANy]]x2.-֎ڑj?}/)JKn {5N}zOX.GuFD+ܿMMaua"I}Y +HsL)\DȮY#" +߀AyT +U Kƍ`#@1x^ R#C(=WƚiWn'uQAP`P5#d8|OxX'E e _h~|p vD:L4}c=y~9ȕo]ʶ7."uO})I mF0sXʂB1P`D ``G0 ƺY[@14 +rU;BDGV=9\[F #n3H1;<=j=-{+bG2^ՐR !یP&Qff qd1ۡ3&HLL I}UzțCNi~(eә9;D%*qz[X$К~(I*UG6v;iV̨ᰘdv *Ƕ7_@Q Y+ ;Bx0qsGIhO(`Z_Dvck`"ߣSZF~իjX1W#``/!(=WƚƔjWLG.dcV%#d<2M|ć.rzmwC[OJ{K>K颠tW%\v MH/yɦDC/EPIi4v_݋0 QEJ|S Qp炔dqI٪8RÑ˪iB~"s.K, ad/kD]wͻ*(l}R_ ZΙLp"ȸa9S.Hu_E9_.,څ&i׷N>aI= +68+شdmwnv NA1nq|Wl-YU5YV-%;3hGkM8MIe77 +endstream +endobj + +1210 0 obj +1641 +endobj + +189 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [1211 0 R 1212 0 R 1213 0 R 1214 0 R 1215 0 R 1216 0 R 1217 0 R 1218 0 R 1219 0 R 1220 0 R 1221 0 R 1222 0 R 1223 0 R 1224 0 R 1225 0 R 1226 0 R]>> +endobj + +1211 0 obj +<> +endobj + +1212 0 obj +<> +endobj + +1213 0 obj +<> +endobj + +1214 0 obj +<> +endobj + +1215 0 obj +<> +endobj + +1216 0 obj +<> +endobj + +1217 0 obj +<> +endobj + +1218 0 obj +<> +endobj + +1219 0 obj +<> +endobj + +1220 0 obj +<> +endobj + +1221 0 obj +<> +endobj + +1222 0 obj +<> +endobj + +1223 0 obj +<> +endobj + +1224 0 obj +<> +endobj + +1225 0 obj +<>>> +endobj + +1226 0 obj +<>>> +endobj + +1227 0 obj +<> +stream +xXێ}W80},fvew5#`6I>o{zr*<~ɮ=ۆk͞ Ozx&`!*Ubf@ 9 YGߓcUA9j+B;?Q%ݵ((B9P:v|֝/gR5drNt7<ۑ (_O_==;ABŇ创PsSF[ +LI߹RTQy(PI.R, y~+W2ip'|+  Ԑ7Yp8+SPdWt(O'z$%}Cdےkd|c_>Xյ$nvOm7K26տGOwUК%wTc~)@K ړDweC| ؁HղG~*7ȴG+.\v+/ w\v&`*uٔ*`rrҚ6N[nF7\-EqӪȾ )Z001q!ţ %d3bY;C,S"gK\ '_ ^ƨz,,MbjD5&U j%7:,)ࣿ,*ݓ7p6Tù5Qs'rëb)KC8R,!%Zjt̺Rꀘh)h'qYl + "6 >A QZ3D"bBLEK!RCBRkRQ–{Բ7}˦C|exrw6whpFC]w +z]S'εǶۗj'8k7||W{7P +ġUoI+g5|XԳL;X;CS7j`nJk907T2u.Z~jB 9V}_Mf,ati~UaM?Zvq롚?^Ǣ?|x5wcyY;Mcnw_)]׾@sb_u~70Aʪ1.4 =X2 aw^\YL^ab"8o+hF; L  > +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +1229 0 obj +<> +stream +xX[6~t1Uě(i.,h:oYmȒ!J?=G$EQ}$|C}\vEjeSp zwǎRH d +se<䠢 ocRB)Or!ҟqHEv Ya<& ,I$0vWǢ9QIK^wO2yG +6,]g!9 T,0Jb(c3`Y"XBΘCVsfGg~؃(VTd_?Y-96&]?aoW{n$\7ő͑j]c쉳zN6y%KxH3~40]1wq?4IYפiRLB |Ȭ;R&Uhr&Lq% @Qa!4U Ͳ4{@ȵ`0\ERO$ܞ +>x_=BD Q{(7sUy* THN˧]޳)!myS/4"RRI9\7 };E~õժ-JQK(M%qd,\סFb'֨YfA^ǡ򼮿`-qwɗ! EQ H<`-`@c,{@آ[0Hrn̵- Mz>nhz)NR^6>fv??'`Wx-Z|DliJd7*&ņ iԕX~OXJUdja~xzۚ=ΝjB ;<M3@ R> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +1231 0 obj +<> +stream +xTn0+#D( +4MS$&@%VLE%geɁ`ˣ wgw)  h *I!` p"pRFdD.$U\ +a`Tz:(ꏇjs}ӳJTaǷ+o5/Ԑ:}ƷnRcp%}\y( kgwINJNJ׭vAW蛭jk4Ux ήޣ$ef+L^;eRo74v lBZ_V(,S0F_ԥ<+ݑYD%Ë'l;8jO?$d@l]_2/jv<׶D/o$jh<5Jv%Cr]8=M}a}+DM{Ee6K:@1,$$V8I[DFIWh \1d a?8ƣ?TtQ죨Ƙ[0X056qѨ:aD\F03GMw,:b&2)}k{ZM* +I Pϓm L%[ + !W˅f\p| Z8[yllSôKCeu;l$϶ > +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +1233 0 obj +<> +stream +zzzvvv +endstream +endobj + +1234 0 obj +<> +stream +vvvggg +endstream +endobj + +1235 0 obj +<> +stream +gggPPP +endstream +endobj + +1236 0 obj +<> +stream +PPP000 +endstream +endobj + +1237 0 obj +<> +stream +000 +endstream +endobj + +1238 0 obj +<> +stream + +endstream +endobj + +1239 0 obj +<> +stream + +endstream +endobj + +1240 0 obj +<> +endobj + +945 0 obj +<> +/Matrix [0.3225 0.0000 0.0000 -0.3225 112.5000 723.0000]>> +endobj + +1241 0 obj +<> +stream + +endstream +endobj + +1242 0 obj +<> +stream + +endstream +endobj + +1243 0 obj +<> +stream +  +endstream +endobj + +1244 0 obj +<> +stream +333 +endstream +endobj + +1245 0 obj +<> +stream +333PPP +endstream +endobj + +1246 0 obj +<> +stream +PPPttt +endstream +endobj + +1247 0 obj +<> +stream +tttzzz +endstream +endobj + +1248 0 obj +<> +endobj + +946 0 obj +<> +/Matrix [0.3225 0.0000 0.0000 -0.3225 112.5000 723.0000]>> +endobj + +1249 0 obj +<> +stream +x %DAK\ؐ +endstream +endobj + +1250 0 obj +300 +endobj + +1105 0 obj +<> +stream +x TY̙sy?;TwuY]ZetԔJt Z*U%j/. +ȾI"ɞh$f`X +h"DDF&d$s`_7"7~0\0\<E\<E\<E\<EpUXzY/FyDfqǔB'-\G1ZEsJ9{755=z!CngQzQFe휼RNIYY*COt/ёlaϗrhgqq^QY;' +(((pYc rYG3e=V?ֆ7TzXm'f9j*ix)_؍_~m|is 7mW.DX츑Q|^&doGj:dOyONZ.v/Lmἒv-]2}"Gc΀$V&6cN6 mQ+]Qvi(i%o ݗQQ:;6={[֓ UkzJ}:d+ [%^5=HٍoΫw +szOǟ%hmәw^cF]FtX}7&B?$e$Lb͵vz,c &yihg$t'LMTr<2 s{EY;[UÜ(yJ?Β{%>; @{V;YDtO ~Ji(i%Gu#us"sVG{_$J RZ(n==_v8?Q?͌?PkL?ai[KǦȳ.teb;;iJ"SGzY.H'јmi-4mR=ǭx%O ~6.Rz vi +x'4xϋ~_`V95:e]F_ zwLiA`(=l{agNGR!1c?ZІ~,U;>3~̀ZZY{ALg޽%EܷO{#{Ttdwo5>7+az?㔍9ѮjzBҟuyv`Spp|un܈GPz ^,y skee|C%&Zq^YE8;F=j>炗P9rK6qZOP #C:>mӹmvA|2a1<_<G3g$yA"ZJC_{^zL])IVWّG V"kpWRYstBgŀtDO^J<ėP)SWvtl]q['*aBYen$Y8TGy?uVH-^e6dL} jQqP~, KzT ]S m-a 5X7]9H!6#^4zQly׵/g0>l<'U°Una|L9DkT\RYGv,yr:K  e+Z.e9܉Õ%yl5XN4=Jź9ugzI%LpHp_M7>&ζ5;<@(OYc3pχ{rPOP拢i~'8Ef"E3ծ ڵT;A)2v2tRkpc2\[D/#G)P*ݓY罽Cx뱸}c0{?JJ{>r9])Tlc]ڟq+;{ ;O?4(_$/߲x s[mɓJ8toAYyt㹉vf@\l&C/*#-ll +?LԎ, 3N玣 }O&,B9Uv”5hp=Iʰ Vmo:0LneWU?WA@HeDӈCsklrމAYKo/䨎d]stg+TS4f%t<̓; ;,̇'U(BޮiioFD:Mm,& +3m?_T 'QZժ?̎hMw.Zcgi ߛ&H[=.4y8'38ʵds.˭(m8O?ԏ %BzZ%I:uڭxg ے,TxY{<я5؋=ƭ!נB + Mަf F]4lCU f[ݗbZzv +mdΎkb@nv}Mn\o2uyێ +T|ȭ[ &dlwi?M[pF t)toBM4Srt[DT?G!Ze'~*y;s+/`2 o/uD<ΦO,4;V\qSFD)&pqc%^1׵[qM}*I6aT|{x>BI5a\mi9D)핚a5-ӻl5H uuůjjjT*U=7~Chy0=ҋ'\ռѳ(0&_-eHrEȶ3~Ca}lLi\l( 0[B?@\$H$μ67_>veɵ%]=}DR"!!ž1ns#`.b,?CcofU8L<=ܶjCOxrp?bxەay닆Z/SϭI义Cb|tAڿl*yeG~E8jPjUJ$dVKސ=C:CY8T\$/T{\:C°aLez|!)VK}r{w#Ӊ yc#R{!xye(~G7zj`r-=AW#\9Dbk{͸¡5H׿Q1B$OPk[{Ɲmֶټw?{\MN#gs9.xw:c<\JXhɆG{+be/8QSwN-:YרL UˊɽLi4F6q cWo<Ю_ߌ/lfs:ۤi sa&d<7nЁֆDUtlɣf55t kSByRrO9xAqVZ xvU/=h#PFSSx-˱U囙3l2Y! W&jZKH4u:åhJdNBs8DY'ųKd,K17DUjd{4j%װ3#(p`RpOK8?G+m?!y*+y4X%äHv +R6uy2A, Z#-2I$Cd:]KsK} kaZBBK穽oNrkh8NW~ý=6"{D|tX/{甅tMYF/CVkoAQXbbӀl~Ofmrݑ/F 7i.Fh#.gkg .| Yc:FbZ-&~+~u}j%,\1Q9^:mz,_F_>gQzQFe^JX<10hFe4痼[x tgm?` ^2s.9yܽWCttkײݻ!yJƏDnٜw6heT+j SG y y y y yN'y-fzYlwgSVɓS`ttX+Ё`tᄒ7:?)_*$_=umJP=TRT&F,˚Z9R"0pV[}Ve<4~\dU'='Kg.%åӁ͠L915UOf|xw.)Y%oܢkQ[֫U+fw~6S:T˯q;7$i~*$^YekѽU%" +.8,`dm]ִ3`LZUpBp@X]$1RdjԘ I2: NM%G%m5k֦d؈ #p&.yr;ސ%=^VO>+'S}WMk"$S%l"J\Bm9S + M-fٲxų8VU/lCMJBDiL^XщC$L^%abWi| q!shʬt`sGc^1Jwj;EׅF ,<&Z}2+ \ar +ӂ7;lDbXTǗ}*$;sk QI-LZ T-<݉,T + g rF\<E\<E(&q0}Հd@@ HH$@ HH$@ HHPdl5qសD5UgoO9s\ +2nmcFG䗧\L_حS7ĵ蘮Ms + ;տT7ysOpze&yy 3~`C=ag6 n(@dc7TdؐLdPn#`' y y +$,ypKJa"yfΰ/WUC[HI!;$|:NVQ!1c Y;Dgp6@@Gy׌e I"S{/(hL1>"IiE +x˺{ +÷ˣHLˬ +ʶǯwJoF9}]C>K8m_+ZL /XM$}&p |/O>9]فݑ_>mep6uzu_Zz!j膡Υo6ݒ{CC˸MۜĶ6,_9~e9}xEst,U<`X&OWHHPDt$*gjɓyJ0Ʀ%yr<i%Q}BMJ}z0Xvz*}-!6%y;'H=b.Ów*K6|i1H\2}v@!/"adaAVR&[[e^f|X"/M> @GaW e. Ejby(7CKE+csOGk GJJ Xol8^YJ}DYĩ~EC+ 6d&3D˖XY(_6%OFZ\FM̥f#eWUz'Kk +OFGt`-R'_h#3,C>Eh5-5װǫiHeWT| -}[|u{{KK{ k7ʣkd+K*1%%-&ӠI\S#iڵ-%l(y}{/ e䙵P9>1f|E(+, + y yJ^RM;) 'y򼘵ޡ-zl`}1ڈVZ]^d%ZApKHw7'_qȷNt3>dB@TWC&|h2 +KxW:ɑl׊{HS ö/\КeeUk>mc_rQ$$o`$qݛ?=t'C5J=U: .(o 6!,Vr@~+ {調Ր\^%ǡN ]50[HT@|S1A0mhP y܁484 yO癹ŃBǽVDB yQ1{FLbW<V3\AZ+1 +HH0n&o5`Z(SJ;#5o&MOiNklY<7HPii̋|aSW`q!XȄ`G.!72'-V+ xi4=X+;? _ZdSBѬI`seF 6;HH +6EdQ6~8kܲ5?qCu[ο'~#mN&)?I5 ~Ɖs<.jM9u]w!=廾$*pm''yO9!Wq1c)XJC8t4Vu~$*zta= ZEOA&+w/Y9<-`"8C 2xـ9eYv + 5;{3ow8 %lwK VsL<::ZtOÂ]ui7) Za`O^) y y?6_ߛ?6Vq@^󇶯\qR% B#<H6$ B? w_5`@$p@$p@$p@$p@WÃJeEED"Gtn3ִݩ <ՀΝ;eeeO<' J^uVߖ_ڽ"3|Hj@]yypXe5݊k+۵>) /wO~:ʀ^ #p^ӑno$%K_miLw2`@WCffpǒXn[Ӎ>n$Q'3ݯ <4q.{{Φ +v拃QqB*)ܱ +T"MGL&?D>ɪMM*')!) $JY @,B~eD1*/}EAF)21l M+շ\+<ٵ:{$]ys +l  H/<\;0djjpǗQQ/t Ȇv{{ m/'zI'@Fɓ*U'E*|tUk)S)H^T-R)؟, Blr5Ȃc訅,/H89}v^z 5M.]ӭ7Я>;m~7$OͦxR OȔU/%eftcqQeHP=&Exa]X/fj\vlYC'fk)*ܞtW W[e}$ +"dq4%FD.gxR3>0K2(ԓyJS(s0]mi~d(UQM3x1Yl<.[-[=}TH89փwf)3LR>Ao_$a*ŽY<WsQRjKŏU]E M%oЁM ~`PUvwo J$Fe6Ym$.ڼǹ'XLq;㶼nmr?2HEYYlQ5o3VA8DPWhs!zC z^&y4#)ST$;q4JfN$ 2?㓙A$O4y%lJ! 0ZY”'^0,9G9cM$Z!&ko?⢹KcM%JH:7(oބM ádYģC~ y),Y#9W[$3dX #.z U(w#5xcH<$@46HʒJ AdYr$VK}&),I^NJ$oI8᤻xhnV:4*!`Qj٭-kw.6 ܍.#v^9Y+%,|wy ]G假S C +V7ޟ*nB(#x9xa8DÞ`CIK\xfX÷ɦ;'c=o7=6%O ^.&'yV&cvݦ@쀆 =*ü܁ڏ7(klpnd(*6YS*C 2u'ׇ{^?܋6Cnc=W~u0/ чRri^=pb1pr~/dC;#;~Ɲ!~yy,u+C!77yizq~0 o|zop $LIIIaapX3~t6W HjP(?pX| gO5f_[ m{XξvZttEK<WR1<>8ܝ`^%HT*RsE0/$ y y y@_E!0 y@_ЕYU77)izֶ:Q5Ӭ𝪩ZE6>'{*7z>~F鬖VeaP^3VU^ORZXcvVyޤjYw[㡢akk5E^TA}g]U}hBcIi2سZ)WUuI5;ʳ9 +ziç/smUkjБ}OIuzʳpKJJ( {6<<"ҝ(#%OFsQ*j_J,/>)آo*LP'Uݠim}UK2uڭ:ԫWEmvvVU}۳:4@:8لQ6uv<WA&^·2߄CkXd ״uv>m9<*ф,Nu$G?F9>D콇 ,J'YCD6O;u@ld2:䤴F󤵳UJi'::+;Vk!yf\4 nlcC &[ijkdxWQGgG +7N]ka$$ρ$`-jyqO*Xn٤X\^27UVV *W+2N~w trriU }ۓǝHz{tZ܇nwY4zu񵞧RQlKFY,5s^;Q'db krYEo!P"y \ѷvVnARy̭FkBNFrMdJ-{ƳƁMݳOڰu/Zq66qEj!͒UOBKZnj뭄+R?dȜa$$ρMc>6 /l)-[7ܝo/} <l "nMPϟWsöjjggմu4ϺP7VzT4m ; y y/eYYB{*wǼH+⋨nj+9}CUn|LFܢ;b|$yaO\*!ʳd4RUMϩ=/)[?;e} +?=zF1kMCc^&wܳ^>W$[`D7:cSH"W^lR[e*GFUJÇ $|V:($$ot0ԪxycJɲRLJ/)`|k`f!gY<$Oɩ܂b$k,(Bᯄ}¢6bpi +8&yUIӔKSHjQUs j3iޖ 1Sdl5s漵{~CZ}rlv?c"}6𽫧p;nw 85n_&;J$)"+jk2Hl3 g:qLb(E7 ^˸ɾ)Hz7!PIpY@}z0.*ҋScD?I#9s84/8.ZJ<g$/+$'8ї'XIl 'IJ* +4(0NC?FK + +WdĒɻ2 +^_|~ +HlMl-2U_zkEYBf.^ݲyyJ5K-v9FB + M>=؏ Nn^OK %OV%o+Z\0Wzјb𤃖"9A,gHonr5rS&bSK)?d)")%aX oǩX7A`Vʳ}% H".H".H".H".H".H"y{|T7/vGB#\Y򐜭SX3|C+d0:peCA5239L{!~<3';[{l$'n-K ?+Ⲓ[:Mx mhGzd^OcR/2Y>x9= 71&:c̡ 0rqYFCJ:3~Wʽ:G+dG"YV@!&x*yCZJ޼'㻕 +AX!c$oVH. NIvR:,,=sN7Jb7iַCoޖ1o/B*|WϤ_>\$QRrouZI @ɣ_T,yII^]q kUבͺ wԕ?|so +g|/qo|i.y u_*gpk,HޛoE&J+ʻEwkq7?T\MGu[.{W.DzSփ]X6'T-ج87JHe(2z7%ok&V+y(T; I'7hP@\ř1ffX~5Hڅ%lGZV_/{+}q>hcJv8³H^:(OC<8,λMOJSR^e$09j+oV&e%K +j]hHH.$.%%&%n!9r[*I>_Q4w.R3~=7og ii.ϦeUVVfD Q Ȯ(y8ۘ׷_/,:_?<<_EOG&f@JGy㫰to_pxtW6Eǽ@gRb BY[Eƅ.,:^+nPI-yev2$ƕ%ecJ\n ЉRn,*N-Xn{ϔ kʒ~t8w\h絭WFF:\\(/ǃj+ÏaҕGނ `(&q0}Հd@@ HH$P+..NNNvG8~  y$oI˲qqqyyy?W`}@ HȒ<\NYfffssN_i>D2; y$odI^ZZZBȬe-u~uư> +z;c%;$ +--MJJzi 3d,>8v/=))7/rgLprN϶wZ$ ̼w=!cѡ )Ef #wEFV7L(ݚ w*nZd[`$y(vC~sZ2}ѾK֟.ŕ͉>%97 +/$mrK~molx.:XѾtE9k+.ZVç Y-?pKW +?,;'M?|˰~$ ɋ"3d,x2wJ˿Px;$1K]LN?7O_!h/Ѿ_a%·/5X:OI$١ۦ=C + +B y $y7nܰ_p`N27, ?__yy&NХ|mjq;t!o5ffL)ɶH*CxdnNF~4"*yuƸ׶;V4z& y#H=Q⹑{AKW.PyǍџ>#Fr\o|Fss{n~oX' +Q'o\mo.@ Hj{N+2CeHxAKō4?ڿbnw9ɣQgf_qd^cVg&/w]=QM& y#H򪪪rss?!cѡ "[qbRO얇aY o IJȔܖ;jH^13JI0$@F!$IEENvBW9Tpb˛cfEfwqJ}$]?^7 yPɫ}TThűBm=w_Ɂjŕg.9gW+_R]A y#K +E^^5JD_!dfZJ o*rcߺs-ڳU1ieH6Y&jv7(}eUF5 y$oI ===AM\ <l7B%0$E!0 y y yVl` X 7ʀ HH$@ HH$@ HH$SIw.AKgss6M5hamoc`Sӊ|3~|̎hI$9Z`Ci#M5}Q}k#P\M)@M^q訩6Puj:g^) yDvB/Ro>zPօS[.ʓe։ɓ(Kq=`XoL$Ovx,7x|ퟍ\];&Rc6=*9/V9PL~wE{"Qi'( +iw3V/PXoؓGwboW?'зYEs l`sMt`.{.C*fl/?wš55WP`x,Io|ڿu5|=J'p7+q] oIB_ L+: +t!vB>\ 4\,lP,A@?whqdd5?J/9O[r{Yik=uy`E ,o #(_;K_[ %r|q\͝ 7e\6'mHS^1sQxɳt-^Tȷqr-:o^2CqtMƙy\%\w:W\smWym0s> G9'yj6 l2zx'dJ0.gx]D^v/8} ✣D)BRF_&6a)₷#uYtѡH_|n@F^hwJTNLY"Y=ojY^X/D*KgJʓ ϱ;nen1C5{;):k,΢} *Nag$؜Zqg(UVOGL/̋!Y7DCR=W3J[Zq<.sJeq/{q1WL߄MPjgĕTDMCH&>X6udNWSr3~y`zɃGs-$ꉛ1hZe.ix [DUdf錷[qukZtJ1jƓR4P)SLboQ9HېMdtRK'AU ydI2!3)Gs1D˖XY>>{J '3梐 +>27aKd(w8A vN8Z@1*6BX\ + GB%C[dRx6!KPʔ2H76j +OFjIm='zZ ݔA:#bOP(&ZFӉ1~1yuvmKme B+^7u _! -chI%otQ _r-:o2iGX|ն% Ā R$gF9O>`@ƈ<}}HH l:I +|OIգ <`IÛ57C^g~Usyt7q%KQ㦔-t`U);m{C^ rg4ej.0(Кʈ>gEe%kykq{mnF))]Yrm caeGiD緡GDn$;A ygI24.uҺ,TYD08v%ɤq_#y$Ocב9C ȯMqRVU_|L\}*Lt 8^"Ia~ DmQe*a̦q:%gM5ǭw%Ir"-gH%/eUWb}_t"o 7q@/)JA5x3˸g~K/y8zD٨(Bp;[n-TҘ)_<\ˢ\3lMNOisEkRykzp1Ku07^mDRmxMrȟf d[OaiZc̺FeJ^m.^E[w$Ќ>TQen$ N4Mi,Qyxs4=K+hɴ#|Q >X+׊/*1 r4F6q P]]Zx5{8C'(bfn/űsjnň;/ya N0vE!OUG|Hajɉ!E'3IEL^rXv>n\<[_[|HaR7ݟl2aE䩓}-CT%o l +J׃ؗdSȬ!O >{z\$cP(ڻR^Ň ȣqf\K"6].7մXDoe5@/>r'tO*_btydC +Z jٛ9oeBslfǽs\bZa~}P:>ZEO9w'S F43&c&θŋJtY.ך016^Zlvx21O뙌oA9(yV&c}_S(Xd8O&*ܭ6gh]-f]{{K]+ WgqVko}rki;:괘+9/>IO~)> 5Hy54KE2j4U5H}MaNF JY1YYθ?/.Yxܹů($һ1o[[jL5+T#KW]'\㜀j?^hBMAEo4&ڱs_TE}/]s楓W,;Nk Wr=WZ:$$otM@@F"nW <E\<E\<E\<E\<E\<E\<E\<E\<E\<E\<Ep.Sdl5s֤Ar&:_N_3wY{ +/?lɓ7ݷI3RI#lȚ<,[3"X:+xI)V +F&H$eg8YY89GчKcIom J$Hۙ]4d=)&ʛ8qP%zk=7>>n;R> a$Ov PZ]~y"o*UkOKLPY5,oq"yDG_]ŋ޸zz,.Uֲ7KWoXgb}sm 4vZ;Vў +)`.qڵ˼fϞ&VgXN\o_|KeMm-5uޚ̋f^QSvoZK{ +}4Ua6䯛=L6mR.g♜ռm)J/˦͞=Hf~J>A'X<>z2x5Z[se_T֧ygb0P٬/ }rjZ4mA6dn[L5M&p9ċp5g2N\d#$Uh}bOH$ª䬎1h5{yҔdr93l"v:.#x٢ş+sZ|Tlk${'UPz) q ܌93,&~w/KDmk:*MaTv.Je |~w4-w<+IƜAh| +* rY`'$\BS>Kj'ge칪J{kꊘ=*77}IE$"Rdٳ8~?9Ac_!cm-©*o3뫆 {gV,T[M"~fB/tY:[{:H(Z%LH:2p3iS1cG{oY*uhXaMN%?FZHEyY1a%61 [3%T%6^^_HIRhZbm\3&%*L~v| b?qs$צOg:O_$/K;3ҔqsƤ/1j>5}ϯWak<5ޟޜH]6ɣ&,z9Oo˳4iwŋm X-ִٟlk?`<uyr9ꊂ)5GX%dB4hʜ)wZt&q + nϘ<06׍ ԫ:UPo6^̅kՑ+CZ[fƝ +)q{^b{,}!^aFuQ]|ӹխ J4VE;WyIFUqNfffip[A7%AqPA7%AqPA7%AqPA7%AqPA7%AqP򀚚88BAF7瓼NiwD92n̢2IQ+ZV 9RQUłyR,yLpI!TN +\ *bEW&mw;IRZ &yT Չk AF<\~&[srMM/:!.5,6eQӖ +jEun?+N4dkI!K%h,hiՆm +/ߕk_oU //Ӑ+_sOP <&g"Ri[]IHrBޟpT/\2 m%ѣG[sb2fTix[ ^ JF%O*^ +mr1iuRiF]`@zLܜӨ!0QM"(|ҋ*ea_2(y, +QAoDGjZ; /͂ v-bؚ`YxL v1ͥI{'thJnCLТH X0}dupr 1[dfF~K8mϑZaP qjAJ^FFƓ'O\<0ckNyPpF^j5"qbmf5o8-W("]ɶ;eQsҙ91+:R +Y0cD|_ iJeiytfn%R1$>FN2g*JNz e1˄_nPǬK)3'1b=!H`4+UP~WJvN'_V A(l{+[Kv{qp+\D:? +:ʡp9rJΔtrTP^P$v:^X#pPȄP0QU +g츔Qii5zoyL7. n+yYYYK[s +V1Eī{caUL#yQ +N@XR8{Iu&sN?6e":n+yUUU---H5\s^ F- {@4=)LаAVO' zuN.(D; ^&nM~rrL5_? +9t$oи+#*Φk&WrofgyR + :*_cҔ$'gkLEI'Zꚮ%jqIv؀9µ\*~pꢓs=&nm>_;K g>"cC_gadlඒT^^.03R|嶚DJfl&/(ѨBfN`RtlRI9g%3ndF&<=sg*.|\69dN MUJbsy '#̯T){6k҆FfxIȕjF +(um4!"SEf;S`R ZӨKH.2&QZ|.?&SVNؖD +}duQ?E(~L[JqJS!.:i~@Ȧ4^iZLcv pWEaЂ\Ps$EG/pL-F %M'.Fΰ<\*zlASCB|/khb{ݗ샣 +Z pgkmmQ N `^;'KKUVjSMMƞ_>|1mrʃd-+De;3B3UvX.8ޥã$(:J[];g(ْ%ɌƢ8O[~* +zbhˣ M5(wk5ꄞNJ +pZvoWbyA#Lt 9\ή>ԥґcEm֒ZMmdK'RI3:&uK>BNd~pFwri߂/WX?5Kguї\QTf鿳HΠn7nېZ?!Qx$~%%n_#U֛g{pѭ"=/[!|]O8<;1˨m=xc͵'fZVDZExp6͜Iy"z0 lvL3u2ՉkB]䑿~XnY~~l'DfKk&1@+sɳ HKɓh+/gm{/T="y t{N2a;qO~Gaꆣ1V얯H'-RU"/_r%&Jg+yrWDŽ=7y{MizR~5\l۔|}Jݷɛ̽L8I[NV +>%^6l~РQRʋt~6݇%r!3N*mXUƁ2^tiYL򦳼R;+ oI/>AΥ8-ͼCu8HgCF$|yFu[Io}mW>̦AwT$mQĶ?ZH?V]7gH)vAʂKtS'f: kf'yi>5ߛBrNl <ޒ=,= K&8?Z =dl(y <LJ~}]Ɖ&8!CTc35) Lgl.Vi8/%mS\$Nsy=0% tXM{Gd"01?ew;t9|Щ-rw;bb%ߝTJzN*Hto^_V ldzst]5[di{P +;Z;$&޼Aȶo?2,0 +A3`Qpr#aGUj5\Aגo}Ʀ/z ^wO^h*\ٌiIJjtrl!<  zC޺(5!w}*P" +U]}nCnUD ]&ZӎB/Ooko8x,9\|(,V{Ҽљ_eiG`~syeU{Ҥ?5@}~f5#K7F(PnG~>5Kx .duhliij T f@cF?'KN+((HKKA[ +[HS`0mD~T@hz7|G* hhpgɃQ%''b<W-$)08'3*ǀf@cF?';K^aa!xsNׄS`fًb-)EK;/^6l8-ڽRٴ400\5cE\yuwZXu/" y h Dq_Vjunn.0?x`M/m;^ଊ'O?5wr|ԵKcKD ==|Ge)+ ?=#L*ct1@c^%"ⶒW\\`v>>KZ& 9- +Cqr{9 h\]?Iqj v'K@=.X؝v8}I-thU];4w ;n<3tE msc}_᪡xgsf;&~dhU_.<3s3' ?ijrh=’l2U[0? &2sᬚHSѥPVР +Z2\Ʒ*j7+!0&>h{ɣ.z)t72+sC;dZ;DlTVs:*i2~k5Jf&A}32%vAe1R%64" N$|C\7xN$*{ܷL}c6sh`Gcvy$O" sඒW$X3N.7ayzT'%CtdRYۉ>59HNg╝=TtvRYlYǤIe0%ot44q?uДmf50\HD|9ya\vB¢$"]?U8;i yiPlp6*q6D,S WwU~ ].MvI3dw!e_sWHS9h[JR3J4mBи +g_T}p>PIQ9W-N׸%<vKJ4% yԭvU K:"{(yp[r]X(j8yvD.4E}X'r|_eM50,O^J6:նZ8UdGUgXn]4.x~uQ ɑY6=&nS7k5Z&TG6m +$8L$<^*;im<َI۸&&4@w]w_f7I_1͖gW~*6"w>UL8P+ȩ2P3&SÇ i{]6+t=\\jAqސ=<yq.6Xf$O[#a`Au5 N7:ߕk+;i fNggΜ̶|۝s g D2^gN ֖ +% +eEZk?SakTwQj1.\lJhnY\lªvG]|Kj/æpv1YkmKWJ^D1uM&&WN%aw6;K%)l(y2UUU"y`B0ϨTUZ{% +x74$ i?tl?g G<&BiRtIj#Jə_'|Y8)MOʯn>G"Mkvx);59tJMJ<zy^ qH84`,5}^BNQnifVd6] 7t']`fԍpd'y] y%(y2p[kjj*//t7g03QM1FTTsA"͕dE`u Uzz+Ԧ sX] URQ_$3YۜJ]N\Ѩ +,hI0BG2VZQ,'%yfy8j<fu:g7ɋ {NXyJT)@$^\,+$;\X09CM Y UNbzugUdXzj!_+h{M6rObS̆ +€6FYjDdp3\­i=OEA#rX@KJ?!AL*nR$~,.M];żץ+*n@Cw֊ +5I_ِ5KOMcc&s13d*mDyZFd s4]:!<4A֩:So ok _'a'CJ:%ұNw,H47@%AFZxΝђ<̓ddAC1n2 +G* "AF<q=q>*@(v"@CA<AM@CA<AM@CA<AM@CA<AM@CA<AM@CA<AM@CA<AM@CA<AM@CA<AM@CA܄&y^fϚ(Zm,/@ަqqq5:]ݵ=\) 2R9❜isHf{ 'y崈 +oYΥ;[}`$kN߼u^o}(Ԙa'y|RBSi{}UۇHG_tlJAdIR3IJ+\_)=}.G;@F:f\hekZR!}gaP[#$o.]b6kEEA9dgk|`S,y5 7L~7" EɣudMf]E0Bq̨ӵ$N8Jjl9y2oXy:! eJ ,(y  (y  (y  (y  (y 8r-РT*Jym^OI?X^(y#w7nܨGg͵'3q5]sͲ"OV<.iJw7 Ȉ2ݲ2= z2ʓyF{z!!({( #giJ}Y{ѷ ̽|S, }ǡJHqqh"2X@|o*9`OF{z!Y3rv-֜= +?P|zڛ.HI[Gt;]OT fٌIk(96pKgݫߠ,Xz /1f'}Tgڶz۶5[xoqH+ҥ}ߖa\_X~J+䘾QzafuR3s}aL^n%0_dS5dd;2p6Mϳ\RPP/4S~.^U~n۟AT9~ܺFǗ^x5V~gŸ7CxY;JN@2)s:!^߿uߡ_ ,Z5 Oy!Pm|uXg[ dso3=ƇHFd\ a yvOm3DSa萜 y&<=1s'G}&,JjuH'ʵHJӺLp9ZdfH qlJӓkY$A~ +Έ Θ{¿~Leo?9j1ɻxHK8)BJI-G!ޘm.9Tfwҧ.:qWA17W$U47]5,y2.*fuOX/750LⱫOYz*cyrH甄/Y72O;csky25׽-!yRm37fέ@K-[}tH?Ń.$w )6FcZu$I,yoGnaaGsu6?f,}=_ۊsOu,y\C#My!{W$3} +P*aށ_q~]ޡem_8O鼅K^)"JKJSSuulZY;EH,RqEA̶*ysGA%|%?"W RdLxc+2] 2hj8e4H\QeBb"z(8~t0N͹3+sOϑqI)kHJ-,ν:!(I,ym]smkћi>*yF9>< +l>Mm:'Ð~4EqV$qS<բJ4)8P+$VOze=xIYoux<(6\i~p= +̼+796$pERTmI59xOUK[uN.c<?+xukv3g;C2#sO_z?[Lx)[x5U_n$Ɍ;v,Ϋ'YF~g:>44EIi%4'Qjɉ:Qר8 6;wT4g eg'<:MYkm*-n,RW7lP^e^Q2_)3ik|2( B ym+[WqP :eؓ&89ZJFPK{Wͧ9f7H^?co s8!YQӈ{9֥C l:i)MOg3ǝ6!ghq}Q{;/ҥ/*\xҸ!םV /DG'VT5KqcN &Hjt?HH^wdUWO[}.'ˈ C_`_Y@;K!gIxgPD]!DRgOޯ &S`)/ gU&'gB`ܨJX +G*\/8Դx uL[iDW.Hſ?;x!wMM̲ry^M1ܔubl]ng'6RAٳVlzngMy>]39`DkIxf$.] BFV6%',0 >`kD}v6m%AG"z1-4uY:;U]9X? ):A\dg  Gc-}zQ> +stream +x %QKl#H  +endstream +endobj + +1253 0 obj +297 +endobj + +1020 0 obj +<> +stream +x Tg_sy9=sgn&ɢ&1s% +3nhLTt%3*n\X"(T7i&4TP?KUuuM7M@Szz{\. €. €. €. Wk;eu/ӹg49O(6ȉm|fq W%kr + J;.ۃ}ƶBV7Ί=1]C= iJuC\]sɡ峹ydvia6UJS;mj-D/:d{>.)CskM]Ԭd 2e}ptF/_tYcu~~]TbGtLYnAֆcQu{oe +|_KXBo(E\#[NJcN܎Sv\ɼ]ww5y Ƽ0E[xp.g`<avrlly62̸f>,hlv{xt(aKF>l0 ] @ΔgpbVQ^!q÷6? 0kg *-0JO3%!|tbg" )܉#J;hgGiDp-{[$ V(>]Z OofWo;ani5G36'!硫L/)<-I@O yٚc@L&t8PD%f;#%ʥRA}MoKN^>/Q|];?R^d[~h>W,w|}Ǵ(Z-~ʌaPjhޖ+&}@騗9ݧ紟U=Xw}/кs{G|jï ס0n >P%[؋R@O%Z,In-@CC GV5Umu/󓕂%atd[ )3" E-x4uVN/4znQ ݝ;~1p]٠L mzl`~;PKɪ򢰶ģߏ6&:ȣ^s7?]cS%};9Wǿi̟.ȐgV#;mJoJYڡ?!6N}UގEPSnWqzœD6)xƊ\sϼmy,hXog +%G@mΆa.+\<0NF!n>8",3u #,UT '} wf7OHRY=CgfMW{k.wVSYeUb脂^dli2<9TjfٕJ;wd[QP>\^QjPs}a}:R-xBWICM`,_}܁QߦH +̗P¬˜ _ɞz ܭw:ϡ;5tݝ%z.|7z!)k4liUsunxݯQڮ.R;nX,PG-mְyg@LGV׈s?v Hz027O3ClN<'18^1AngFye\rKlT#*sj(sn 1n=L6ڧl*sG~-꼝XӡH,n~ F&RAtR)nn[W&*i2Te$)ub-<7[)6~L:)onF~CsP<&Jeh~/u:nuaZzF/O>k ֠aBG3onpbTiH2ٳ\K6 +BHy_7([ +kH}5{VϒF>sx-+뱾o#Up5/ xg%:K|KxXQGhNK@.Φ5B\_n9Hټ"p%;ƯEĒirCµmt-!#?[_m5 {^O^bmk>የQ} YD4o6X5v3|fSBElhòC]Lq6ּ<9SUp T8lZ/K+iJKKSr}ڬ.?ʀJN3zqc/\^Wɋ7rtyrfבcR?mT1xc/\^WɋbzjNNΝ;wVx*>QX g+^j(.Y;'ŀTiX€. €.  I!9 s1$9566b28Cm@gdpaBgzX3%H);dۤg, Z8)ox0f8>tJwt඄ap-D&H%;Ǒ %2R)T +ȈeYcC \ ggQw) ;ۃS>r{F\wSsYrbRK$#q4\rWgщ3E"V{SQ[6Ud37Qy:T˯ۃB~3D'SH#|h=W/[+#K Nڐ5nx2ڢL2gʁ,|+˿E|3bEUid*u,N檯-mB9oswwxc +~>.K"g΄3ɜG|V\=GGf/tg$YSm,\Bm9yw8v11IEsEM>8%dRbT)G#&,AT8S K+ak!`%M0NTKoEIN9\$iL^LdH2w0b200Ct~P94~R2{/r) AKu]Lٽ{Mt[BMʎ_ȵq1?s` +2$FPxƺ:pNxA`tw$ǗA4q HZ2V~UGc9SD|g$|y 2g +f].~K{qce2 B!I«s.Ψ9 s 20 s 20 s%I }Ր( +Ȝk 92d96* s 0|@ +Ȝk 92ڌ'.kPOV2adNS;mj-D/:d{>s|hxcJ0?Cm="2e}|^|5 27R7R𠿚&ܘ7v:T&2-0JO3Sk<]%]xc3o;æ1rB'2Nf9\Y\^z{{>|2\~\om!evAh0d sDa#rpk5hi!dѵ (7w8Iu%9UYBe=Ė#M_E펈F'.:XZ]O\Ee8fep-(s|wB]X.2\׋w-i-sڻq{f-@0yQWV]ә%:9 sh@yI+2 +Ì?y|}De]l/8r~'@:(jKYi~h#mR20b`0Ά,y}pM/% Z*sw}&.bleuFXzHVb|5&n#.eDQ C3̾stmFDv&թՅHGyΊL,BLzil6)m‡ק"gp[B I H&P2sl!DS>a:CdK6,JIDVސRÐ9]%] ]]]]sa%d)>_crU$+[~B}E2ڌ%WCXzr2'Ϗ]6mq8d 'Ւx7PØ'zsǴ-׶FT l9W+|W]Gsa>87.ᙬy44$wB;/'\fV>UR|dѵq T +eo*5 +V͹/jZ1joknnk((.[4ʰ25Ӳ.-k6 s 0|\DRx-ۛv8 96q `Dstm$qjȀ. €. €. €. €#GccRH$98:ϑmxE?9֑^yѝpFqo.//G3L]y _QˇeW{.}^1d9WQQ,]~wy I]xwo#G+Cd9$}`$~׋@bzx{~eȀ#GVVobcIvi$@"6 +ut2d^NSIv,A+Ōu&vv36]֏o#RIUȤl`<*įag(2 Z#$s Z4Tzzobce痵 %Dӟ,- sEǁKq;9+2Wޘ0B#v'ì-VN!]0̇2--71YnAh~}Sg?I=(@:>x <7LAeÃhCR /OLNR G0o|yӼ P"bf~ݴžz"jQWCd.;9{jd9Q:$fc?.mJmޗG&GvvFRPObCm:rMee*Y͍g ,T'C#ߙ9A ?ܜi뷌@/s!£?1ݔaیM9qB2D~gGD2 # \iEժnqe~oaw e1YcS +7:l#懚 Lf /oƪ=d!A^訅g*.89~zNiuM6C׫]6  ^T"<}"$~tޱ`rVVĎ 3>{ŎuZZrւIl<}m|bnŇl6!QY!qiEb am5$RHB, sS$#%((j^t)+- + $2=Dڄ926+YiFU;40y~my{{+p#J'p F$fFQuN(s#ݨb +Ԝ72D6F#xWPm$z:h2ʯ>h3KG- Z,XH m^6ic,[.ce?`B_4Y6 +YĢ|@2M7 shaS9pr> +BȆ Ց>bG sV%Xd'|" 2D9=nQ7ۯMaٚ@2plb{YzaLdW**U'aT5g{^ +R&M(7A0oi x;mИ>DŽ$Ϳٽoi^BKف$O䇐EXz[ʂc GӜ#9̱F2GOr&MCkk8X,xs[ժ(m*V]Mp:IL?R\`"(|D!f{xJL }8 iauxEwVڶePiI}oQQ zliwQR189B~m>*=F1bW̍J{fnn{e0.X{a9uqyza;bJE&<'*Oү/9G˳w)XT B\4B rE 9#O?JU6 #4b?M6F6{ 89o}!PؘׯW>ԣi`ˍ s V&c6}@쐆=4ߡd:HiP& sȐkTU"d2NΫ^;ԏݠ>+E/X3R2J(%xⅣj]e_ʿ$_/D*Ǡ?xWpמ<yyy/b_׋Ҁ^n?w}Ң"GX^@c_1UsʐFBQPP?;n ? mI\.z8hllsNNNիWcbb.\QGz!E1cx9ѝpF$v*JTs +E0ݗ 9\9\9$qjȀt: 9G> sXdѵVstmF) O 5iҌ +_1`9GfJ?{nCh{4Odh;2U@]QO)̛d96!~[UỐ<3Hl g AWus;}"I>YR3YcKF2fjR'/Nҵ)eP{VWC[}ժ'}#P4Zkٶ6fi({u_>33} Om6tH8# sͨG,s~0#qI^2x|2>-IlSY8[ E.ƪ5 3@-Yɜ:'GZrCn|$ݽbuP{R#m&2]Si]4[mkV+SkTl[]4XB}))pɽ;l96UgF& V&{6LN`*.cm 5Ծ:~=e/)g´,{sH&rZ>GfeBojwodX-ET'-2&H#0}@r+؉F9Gf#9y~iˏymM~iJSY*ˋڽr7jɬ:? 2GY1Г?7կQWW7#g lqA6t*XukWlmQU+MͩZZj$)G?kkCV=}哟Q:`L s}kh?PkQ*j)U7C-Dӯ_S ZZjjKxn_kd-fHYjut'''m@:ZyO:ոήIJگږO>,G-[] m?j)Ђ,N]duI/*R踇:;M-_YO^ٴ>zO$8Zw[ +aՑg2wMZ m+u<}},_ڧ Һ{E{R][~M+Κ!nOA? [hjKW~Vn^dѵdp jy=pO*am촸q\ +7]^^OkY8%([*@Yk@BCBc}Z iW;^&uӱGRQlsE,2SNNHdM?Wdse o˹kgv( xgrkȹ&T7k"ckl'>}Ky+Naʠ%κX"5uYkGRhIMmpEj{l6㳒p@]QOzTCnвV~ rEo_;y;<ߤ; +T-g:#^ ]dmn4?͂ ad-RBJ;m}x")%SO,.` s52vδ<3S;5;qt8Rkjpu̍Yhu{H.6A>}GSKMu#Bݬ<ɮnAv +Ec3mj˭Xe89GP)XU$*X/bF׍* BlxXlNJ,M IS؛kW>~`qD 2W)PbCåK<N}OF6EvܚƆ.{1xsdAn͗ԴIN6so=kk2>REYrssF*PgQIW`[m0dMBw,oUgd4V,U4 Rie^C٤Rk0d/} +s-(kU7gDvi6 +cJU-=P(}@4 6[ gPmʔ +p@]`<}t:*c:ζ^Ix;lVgwu*A鄊VkŤe< ZR/oBOEV2)0*stm5O;4(25 {@J{wƭtB. Ȝk G\wkKV *%˲Ju-8B dѵBVstm$qjȀ. €. €. €. €. €. €. €. €.\Ek<'ҌN|^Ys'\sS8 ]X pGH`A9Ul "JdqGX;T +ʂw *Y+l&pq +8 s)NӘIΤZQUc j3iX 1Sdnv9sޚݻV}).bݞd6AYU9? +I3|wϧ;'VJ먈Z/ qpRAR'cD%|:a7ǛFyÃ$ uSQ@M6jUbA!b+Fq3/DpI$ .ZG9gd._OQ)s*{ 'CJ*O 4-N7?FO ͯP'dzd4n)e~$m(d9gdsRl:x{`%$j-HK9IO=}6juEncb+XfdC\/daniq/u:WVƜ(07iQ}$igr53AmTt̮gd%dv&+8+ sktz1n;Xꂊ,Gh3{u<_fWEW[0[lt+tȜPevQ(8̩ժDÆ_N{x-L/: )b CRe ~ko;Y2V%Sx7Ɇ,idcX3oXR +o͙Edy{d2dpa@dpa@dpa@dpa@dpa@楕m =ϓ( E:\=y emޖ?s m(B.#`^6C2?NbiPӀ".dJl25K'V:dft2ϕ2%;OVמmled墜ul%/#/VqnO6J̌韽1;ϕ2?K_nrO~}z`P̥3yT2- mU̟zR}v!3dl8)˜!4Rx m2 +0zydn޹ ~܊z +@!cÑdeo/ߗRV֋tP Xng{ 0ud07+c%C+/\KS8ܓxR.8[(`kۊr7.FWhWܜ]T^fK($dYd$js5dmuՏ3I럙܂= 32QI*8'{sc^_%*ZѷK!N2~ddA mҠem䦉V0*Èx7ɮAUF,s3^t6@C.a\r!IF)rPpv&^P 2~dd 瞨V0NO裕%(9u I1h<β¦+x߁g?c08,)bJٛU^ͅpeʎQUJP0Hǯw^m BqֆƧޠ$ܐԔ_ +󩷤CK ymkT߬θs#|92y#:7WUU凄,(̡֬Pjc^v,Ԋ_ry s/̩zxdUTKql/X5YYd96Vx`%2,Ad/]~PYoo5L*F":PXwZY:UOM;3fN(xq}16$62U@]+r*2l*HFŋR/l1/Uלʿ}'Pקp2G3eľ^]CfFƯƗDy+md96V<"dE'n Ҳ*i[V7(-ē)ѷc~Ӓ*Iyd96* s 0|D!W 9\9L @Pw: G[Cd%]2!@aHa)Kz0sQPV@^r:E-pte+ s/9bs98; s 0d@9G2 sȜk 9ldѵ 2CƩdږE]葟PR8/SSt.^&1/# s#WN4iX]gUϝfv +cMRIځ +T"P3/s=l_(rxog܆YjNt˷æ1-iwon  vF{6w;]''1Ym=MbKyܖ)qy7~Max +b3ǭ":6K//@/v_l_awqh"bG|vyг3R*2q Rb\7чѥϙjzʜ*J={OsM,Z1{K6"ip&]=:TpGwپ/sNR {ٚ"kkNGW{Ku{/Erky<_N72̮׹BS߬#נsľBaQET$2;` +ASOLNR4`6u)b=1?aΒqf^A}dmQ:惫C o,`uc9mLI!6Hr}KڝAvFkjwI2!@cHbi2$29}enu+C*FE@u,4xm5,U5,vE"VC%!&G)v ڭ,h3;i֞ *<; +!&;dۦ#רd9er>6{U4zcŜJ)mG#-F/spR+ki("ۢotzb +b{{B9+qF+ =ߢf:Z0S <v_ޞ{ jA2w U]FO+]Q5t:LCik<;dSZʶkqFk[ޟbٴ^ΤpW"v%kx^D==l +jP"4vW̻;L,ڲ+;]s6;++4WOC\n+ juF/-$d7,Q7Q sԗ\)CcFZ< +p*ⰼ5lpܗ^93o +3d&nG(#zd_]w8UQ p2w4%}F9$:=9,\-^CjGn<pʲȻZzg&w:02_A7uNFmSZը?<,._Fz?0<7*@Fl*x?("1K"8AEQ+PKYi~X5&y>bLbzz$suE-?*??DH9Eq|6hB*W.:%["|rͯzE(!빻$A_InXC,g~/A%%~$q T^9l1>㘷I,Pq,Ӝ38Uj-;Q5zA!~evW+>7[f6^YH=t9+"Vy;nM "K pl0`K*#dJeI(XCx줨^~~d6AEG&LR3۷בugPADbfqJ)Sea,mQPbTVG}Z>lf27h +"7uKPԻ;/Cϣ9o {hMaI;lR2Wpfg5/y7*aDpE#O{CC;=! X^>~ڣ,iUbՋg]1(=Vβ2VV/ܦ2wZB˃ؕuAH09>ZTaEH0K2:[g#;ܸrNxw><\6؂X!GZcI̖)7r'$2U?sp=J[XMgi* Z|yy&j5`Ds7i\;n/*s5g.F}g+ nJ(k4mJ$67mt7g}N2W"9e=+`=no'RLjV0R2/גznإŎ0Gˣ[&27D,BVGx[2G[ヌ63Y3ںQQ +;5]i8Rك25WٕJd΃$s d[Ѫ *42%2M}1hfP.Ae/;)\ả𵶆%["vCNW=&>B딦rn$yoɕRq\ew ,TPGM&6o*63t̜BajEz,ӟ_1r\哦+t X9D>/}2 |m}^3TtZrc +7'l,ZS]#U$rE+x&R7 +ynaQE2҄Nr.&_ES] x DS-~@F);PKD@2'ڪ|4~\Idnrk,sjc Os*X3$QܰɁԁr,58eδZ5/sBIoa%*' %N.A 퇇;hy4BE*Fd^ +cz} utR͑/YЮ<2mo Cztt dՍH;Zhm}^9 o;B~CXۤ*#;vkQRnZ^KaEe,*wĨV[O-=̙om=zos3K7B,ИuyLIdzg(da$rď1&2g4%(xtE +:U>zAq'8ۤ.ˌ̈ RY@F'LΖJYXeeHbk{xJL }8ߒ̩OgUא~x/^ʪJ!N旗Ky: V}^5atw߿j/DX.0KȜ:,0Z]qi=o}WV"^JP ?N,kMm,أD9俒MX ETYJ$^A2j`5xAهH +k/c٦Y +CTw|)^umsЎռe+'MG9sH.!_X!hWdW6ӏX}ު0֨Y>4u?7J-"oyN$?z߅cgUQ0k'778eUyҎ38yc%Ľ5w^n3:Iˌ ypA޻@Eu5w{ƽ}F}:Ohk޽m#Ngߏ(bQCTHy +Ż +*BQ$AŨ2r9ZV@La5p\|?79 )lL/p׳-YA,q =f4jKãZ&sM[0Ar47Yf.y &j[TqH~KjĥސIܒL] c|s Xm7JfKڄKfkK??_-q +L/B,k8,6 +(YΌAy2g[Jt>2i؟(ڶ T#YD/,5X!۲-yVqN +AQj&2jt7[,,*a'ɜ]oN$s +tiP;(xYg],oln.cz:%YDы\\㓴1^!Z"ܚfKd([&(/>ӷsQ,i 's n27< zeK[L:Ɋ2P#+Sqԛc62DkY*Nsi¾FZHEEyq%60b G3NdP#L[S[ƆM[B7Rg&b\0& 'Lf|qbbz qgldEޙ6<]&q9rҎQLHWdF^,l4ԟ'q# }xr#9̆f!#x,Dƺ \66iK%ƻ{o" d+ssUor#+ym"Bjx\YT9=wnصk[wOIYo:yUPu9yK7lHպ + >pƍ铙4c}*7o ,h#񮙍Q6..HYܩr7$lҥKE$D2?X~,sG!7Y>) vc5VĒJKs3&ˠϤBf3݊Oxƍ9 yml/+}{E`]lgzjqlՕp:b{l CydSd}x9/WTsRA<9+j +b#LH+j~! 77\>- 2 1(s 2 1(s 2 1(s 2 1(s 2 1+sEEEiii(po!BA9FSRRUSS-.-$-0puAdNLgϞ RB"0suKA1dǏ:nYdՄ,Z %iSvNiMڼ| +K!<%sJ4`^ǥ´1^{DOË;Ʀvmw /-%sCk؜SWbWX +Agtt6G9E@3wBE3W SxR GhNgd؜\e0]ٟ2Tp.aLmfqkBdҌɜ5|S Y6dVeѺޔĐA>d_hmܶq..޴_!~WM*7;c LhJ:^V$=hvPrZnɁ 4^^AG\NNt306ԕ,dJNN&#'Rէoi۟"&Q5 i&pv2?arY^ȢSg&{\WA>&n:#ɲAx~egJȯI3BSI%L^O&fTy +CK.BlI:e~r8Hboo3UR9T jx19!^S^ ZvC%%syyysRk(/987];3ZULd{`@k"eZj@'⩺>W(}7_e,)JAƋDyB 蓉 +a6T7^d6>e=UAu`0 ȘQ2'J:csN.h)iㅦ)w"Rb!*#^Vz[2i9βcgMO[FTl&Rr;kp)+Z^a!و"shKAwikO{yA3%suuu9P[PcNx- +nH٧՜uXAϩN-xB< <v\]{rEqk_ 2$Ud Uủ V .#_|8Ɓ9;-kVի\R^7:!s,$WT╈&B!^S֦V6a& -s +$ٲf +*L(@*§.T\' y꛶2›YYAdQ2VHE66mB00 ̛u[A05G +;niBUiȢ`N@ksBQeIyS0j xRV" ԍ3Z %ky"8I:j O\WWWMM ]و6ZɩժIꞳ@IKtV;d'p /&sFtUWWwvvBPB"yO7["x1Ri>.zbC}fx _ 2NXCA<9AčACA9AčXkll,**JKK;G x n 2xi4o)po!nۈ  &sZd2={=h{Ay)4+--ǎ nYdՄ q$[>>Rm߈g4kqtמ_w|OX NT(!b(S*؜~ca')Y^2^ҳEG{sxkrt4tV*;{GQUx̕wtt q 0csNzBA;{-N0L T{ކw Y= :n um)Ag(Ǫ9'w(S!YS,#GV&n]ETr.@k:A·f-A6ioptvQ9X:C؜#16bz<9;4㻾'&@]Ŗ9[*4nhJ:5i"%s' ڔ {:eQ=DcI G$q74U')iݢ%B|B3XCUA Сt2%>]185P>.2 9[X͝ ȢAiQP;;f EKN΍ @t!nƸ0nIgO;7 J.#Ȩ(Ɂ.8#s` МzVVTJYʁ0Q%Ȼ0kMtF*eEo'#lb>u3r* 9k^l~BhT% +離 1,JisXbf]dO̕UZ +Vߴ)= $jidy'2UJ3NcŎuBؐ\ ,+*sb(TWtBucN[&T\U ~QQAۈOVJuhY^B!00RN\dET~9 .ɯ%2 *-ɀSdW5j>2ii(,- D9;3s*TCw9X->!lzAFG\^^2机5Ij0`򚼵H١VУ~紖 +X# *NP) KAziݭGNfs*Q/{]Ju37&^ksl nt4Ul;;Vө2E3oC]^t:LZXSk_Z-.)Yg(B^ɴ?gtI4VJ.*cSە9&I4CtvCc=ҝZMo'/ d9Tz%sRo."Q&k2e]^i%0mdpg = %ӠD舷Z'D7;$jXKAI`άfzgˎA/DT@:e~\nΚKR+XEȡj= ++%:e/Q.k|Eas`<2GC L9g+SԼ! :-w`,;M8G\]]]gg32f`li6ǜHk^!N-& .l&(RܫӅ!VYJ L% SWo3t[emSV" m%wtUl?~V7;St̠VVZ@.{C~ʥl;UEZZ`(̵ֿ,]Y<|v]lj/xso;e{M)Tm B7&8r]):0}nA%sv `fq㶠THOp\RHSX@嗤*EQILMN-T2Yt,]Sd7q,[Ņ 3q އPymԢ ŵ +y`2SdMUT)*u TT1:7ZM#{rd2h*O0g˚U +,)Ji|/:Pʳ lO%2gw=YUT%~P2g /X Kc豈h^d( (rykkdrqp "m(LWoIߘ)ni$-0ljZMAlV 8D+(Q1Ce"md ʹ&^DiiSݢ)`wfsC#˷Cω.+~QHA{{ns6вuj|ÄG/MjDrfnʴak~<* 欑Wx4(s0d:$ָg̈\,W};f{{{O;MX8u9ByZW~hY Q}S;mqH|/h}4}UZ%A/%69% W¿I?iI[ [Q(sȈ@suoagw1kۺGe_ w l~o[`{#e!@^^t# 'bd;leuIXCٓ3E>miktg2\qqLm>_ ΍y;Of`lix)[I}B3䘕mrA9kueyiU|Q {|NUovV>0ݢgs7E/=hvPrZdɁ di2=OYHOȷ@O%o >o@TAzx +5|\ ޅ4垜-n9+3¹Z_J4QEG2 ÿD?"MjSp 9bv|zF ZFeUv,*LtF*eE#丩A^S&T 'emF8ei%I'砑;inD +TV +'{^;{(؜ر7aF<<]8p}MULdec.HO].MzߪSr'|pN]W5n%9]t\:bGpVۛ4G 6n߷E3̩ok+K9$ө>-T45Q?6hUUű2.06Jd *ZQE`wrQ DzrդjJ/pO 'ktu*B<9Wfd.bd;B=e-;H]PZmCΩQڡ1mUQD ,hi0ZbN&z2 ԧ +$'Mot"|:4V2wT|89":w%lZyIDVIPNÇ=|F&F[PA9_cBuaŗz7){$h^n +;Ͷ-=OiJ(*fOjlƏPߑ_J$Kbo} o̝[Fݽ0r"]GW4v]Tc#Ȩ=IsdsN AiP[+JjllUπeս7'HM}Z-1b&>TvΩj": +)Ǝ䎕urX y鮘yρ=U'2:N.NHi~<.Wɚd.haѲ^m'5-Gɓ ,:.t8/s3+P +p-Om*md*s>YW t_JJԖ|I&״U\s&d߭Gnśav,˜;e>ǧje:P| /|@+åtWj"c@suoj /8jsOWv-(`S>D,e=Nj?񚴷WUfדC1\P[~/?I;klT9a#1AsB).<4;D\CCuLtl?:2(Y36nͭmT{-qnzK^QDdn6kvG%Sͻ`̙|Pd޴ϹN&Pw;HdA TҜ9;ZZw:.=~x&u:iB6U÷ xJB+tCG'F "ʜ{3 ӱ&O6PJuU\\t8+1"ٗ/'8IR)DMa^S&o͖5Ea&PhȯI4;toh&"xd<{dEȐ(#'%۷o+3J VMs $=>)WWGl!n2_I۷{^E?@suogj?N]Ÿzi6'-Ha M1 tx ʼbKm xRVbnf#5Tڈ'8uyEpT=uQ dbT8L0 q*H 7'q6SzOHѐM$iZZgl¦[qoI ok9'M%aC :,*OQQL)āiA޼$[?{4TƜ6^~]~Ml +a*@Ky[UHϪzqW?MtV*zҋ͓4/ne)_RŴʜ{3|h\=:QFG2ȤmxcNlz_yj9LL +rՒr϶aDs0&bbwv[nzl-!ʜ{O7[;-~]Gy%앏fJHݿ, d2ތ aMc<@oç;nJX>9"6l4Eqʜ{,sP\dG!\=W9AčACAƢsv!.ƍzSV̀Ƹz<ĭ@h4%%%YYY5550|K x p \F'ĥ]~7<Bh4 n$}}}&po!nvgȁOKd̀Ƹz<ĭ4+--c-03/Z%C]>]ڤͫ/ɻQWY-|eYptzU*>sߋNT(6֦l[‹|z<4 GɜR,,,YeC:f f'JUQ٧].sN /yr\] 5/"18?*zf먄C[@L6icNّ{MݻU_s~oGy$|wNNU9gsz{oHgm[gYUifs.L![ ;WkIW4?j449sb@l:Vm! #TTv;azV6l:.7 Nb@+ھs6]+ܝoomS? # x@90cq^v~\hhl?h¤QLYry%`'7zd$6"a+WuwMUryi̖sW9^S֦WU* dʔwW`3R,+z;$mY U2i9fu8TW{s4yYmu]N * ;*,sr̪聳Nfݴj9=o̜ +UO'OVJq!TEtv` N0*ڱUW|(}wv-zouʮo}U*{G"u(s(s^X,f 8ED)4Cy&rc_eG0O]Nn&eGV\i>9/z]PrQɭiynɽ&o-RvUj#]LV2Nk;epm<9A۸%;N?L4`׶rCI/_.3-_e ɋ +DZ+۴?gcNz1`"nP\LP* 1zC_^PotwFС!ȋãdN*u:h Ƣ !^S-񍪆TvD&h OeC]%Y'(ׄHaI[~ی"Pg9fM9i[Ҕ‡ssvcn"'Rt^!.ڭvnpt&j*s4v eA\G\]]]gg32f`,d(>ZR(Whȑ_ uIgwV&n:AQɠJ*t2{LR~jW %7 +;S: u2T٩IRZqNВQy],JdnNa_ l{vfO欼94{s>6q<84`<%}SAnQǓnͩcN0Wd4 u`Ƞe_2p`%s s(s2(koo~8yփ`fǗt)[kQCD;j6k*&[PMwY昀[DK8iJ%/DV.Pv;2 2"LRd&S=, (0BVDV٨R-`OHtx0Tkt nҜT埅bI,9!sĭCQ :ĸҧ.$mT)Nf)C,j-kV)*Nyl%U 듷JZ-(0.WgEp{u㋒9wwNO+H[OH]Z2w oߦk{wn:nn!OG [[[M&5-03sxEA4\Iδ4/`$ytdф) ؘYz۱gnDIwdȵ#2kB# 74QW,qk.>+f$8+t[bg>RCm (!P@wxӝ7g0giPmpGȚN4Q)znN%pF1U<[]7TuN\oGuuu*+G$/&unu^^"eA~GCY(4/ѯYmuC#|NFxw-9[ů|Nũ+r!üY#cOl&EAF#sVΜ9Q_»QqRge_`]T3͝]bz%آǗsUgj^ÜLj8o{} κ’KmD#ƗaI]#&%D~N~ +C\WMIIIC,/L;-IL޾j.HfkV`_3L.}QY%|4Ay~ƃ\|-}4!h!{R#܌JêpmMWy^kSȍl߷|s2NldN/eW&ebccj,dv#CmoYҨ4_JMfOAb\H`&]$`mQq2gIHA𮸕\;|6'Iz^oe^ާ)B9V2!%o.w<|%i]|9ȫ8ylz˞" 9Т爥C\i)LRu"me ʸmݏ]Y˅FTä~lo'tѨJ吝]eAK*vר/"Z6PfAdEi#{)5/b 4K_zKc6'FZq, 2Zƕ! ؂2 1(s 2 1(s 2 1(s 2 1(s 2 1(sƍ:U.WUUU" ?X.`B}Svo\= (Phכ#Dg'ksu9~jZ'3ҡ! ZZZ\A1cuiu/z4nu6yIE߹zz!! \~WDd4D^O>b/]d>᯹i񅿹zz!!rWDd,0xLr~\gzz!++ +v/˝/{ϗq7VO]HE욹9qE܊9;S=eUWqumJii_L}m}2_=}}l=vpɁqȇ'Iko_'<uBkt_0~B.trMߚ. +ews3/o֦692זK$r4.҈L6EjBߔQEL/>s2sHII-鿘 e- pqiV;/{b.RO},/ Q_?! Xjԧ)VwN̽XAGu ֖k\pfgq(#&kvJ+d7{m&*:&'|·'{OD |TтlIKRl҉Z-'smh]ӧ_AXMj2^Y7dn85 R@洤bF¨3"#'ӏO#>1fqΈdnh9pF$sZ؝Ju}Qη`ӹFN޶oKdBf17Vh47u,yɾĝ.:FeO8;+/[54]@bkOKYz"gt TD.[/ +o+ccWu +u#7eG^rΗ ]>|KlHK-Hm'2[ټN"O0HXL^+M\W[nhB>bfٖm)L\R=Հ 5F2>?b4K {dg~c +X(c׾_rqpnUA OtDן/rJ2R2beΨ)erA5%qO疖 LD,"K2B}$lRKe,(WsIe8! +yyβեpayy`|sEה@&Jje %:YZ^x BHaXfㅷZnPCRH*hH2DJ+ok@ΆKܣW{(jSqgJ0qB!WXZMk1U7-Cy%8Ybtl9(6Rn|}kP`!fH(C-_}%y,hxui$~݌+[@L3)ӽohvCʜ?`6O R_aOk##r_:$oM^i +oL ϐs2wF*:1SM|YinӴ΁\ +3ů3R|%otՕYF r*]>-sr/%\N&X(Ԋ7Xl j5%xȜ# Go̍dp,8U& r#۲=聱~#ӯ R@4ѣ`6@rM%-OKkaAf*sӧncM,27dlɔ)M$ ǁ~U}Ԗq;7?xpF4󻸧׏bM?fS ;śP^ieBR&/MܖY-z'U +IWtĚ9{B'T_B +:ʛo[|ʺcYVkdmna {S(Quؑ1*0o%EAHi>=ӵw a=Ӄ޶`=50{2BLUԄ([MLHר&q9d#_0)}w'9ZFr,l?l!Uo\&#(oc,.J|Fډg~Yq)g?>p "̽X+M"_fu-M/P{S-Y'krّvg2.MCV '@fLG|%[X<1SNJޥ~پ7g6#Vys4GPSC2]O089#f6EVr>ZX:577%Zq*/J:N.́Ѩ$:.YtYQ@WPO%Ͳ̣o ks]efmA]=Yծn) +>mW8^+S?k7~˺}2j.Wo͹p-%Ü?%}V!{Ym}{|P[PMaxuKKrom?NȜK\8/w)ӂ j7۲܉'OS?ZN?㯟їU >?24@Tƭç +#8aSI!"kc-JNFcWu +b|W[A*no<%nQ;06l.03gB62 +Ci+~aX^ݒ^Ls?[z$U&i❖T'pKRnZ{xƌֳZYdşmt3l/mQw9(ܿGlڞ?YX9wf?#kQV;`aL2> +stream +x1 g_ +endstream +endobj + +1256 0 obj +317 +endobj + +951 0 obj +<> +stream +x{Y{nLOO4t s(Ur,ɲ,+9gccir9c,gal!l`W!JyT]O$?Bm_@Eݫh0 S*Hlkk?xxA`rϟ޽xD Z劊 +x@μk׮V @ PqWW#bL~.{~gplNUxճ?U욓ZwVF "Ç^h__CJPW +#CƁHCPAIdESA?24qFCB}X/OU1݌͌"oä'/qѝNT=F.PzvKqKSX4#B;j.dԶ@cVbGku)̊ ΝJ<:`tp;g\v3&ht{rrr;=Ks^7Ko5v33׬_[t:V[^s%넺S^}C#1͌ s9ۢE@ζ/\C'rqޚ>ɷ+ +=/Y#jC}!HFc!Qmv\* ݅5·F6U,[[jkWw-2ٛ\:yh'Vl}9p'c +Bi;zcr\mlv%fꪓ)jxV=pʍ'j@8# 1@:rxז@ZAsyjc#cƆ.s@whw~x~*l$!ݜiz\M TGc[~sCdw|tD(sn,o{W摶@oƍK{knT߬sƻшY 1}lmnlm35{:7.TfXUBL{>%]"nr{7v]ёp UgU9~@a{j!wkqR,XirlGhKJ| SbHN*]ixp~[R!wJ77tP^wK2]L(_iUCz|"7&J+=wbvrkvTȫ4:2P+i|˶Cf<4<| 售;6>X}dtoݻ|\,쯪GlЕKxu􎌍u޻p +';W'0<[dl RNNn=NsrDJ^962<42x]-?vsF*_mU \ N 7׵ut77ܩ ر*[%Х:jx(ܷH6<Y]8}=>J!-=u9&(Yo}9+ c}2lt~rx`9D.?b1T{Ʊ>|{-Koީ;(نzo]>|Cjh N>HCT=|p}'NijdZo_Wa1|MM͝cG< B Uݮmj\ pc͓Ǐ;~fMC8 k^}3D-R,yT>q;Ҽ}סxvZla@Ҩ7Qoo%mMո /k3TbK&B0^?Xe(yzף-uחgUlz}A ^.bj9 %#wE ['8 x{@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ pw#7|3wyW_}b@ f_|aFAA5g?P|F$vd1ٌFf> EܬeBӚ(9~KO9@LjM&I@::^ђ5&Js\QMdNkQAYm_;rDglSCMh@lV6jYL&3Rh/، GB:zŜ(h,6aO [jlKpd4(1)'B&Ӓ$Zo90RNp%Kq#Xa9Xy-lkmunq;qU-: i-߼ܑ2.+oU ܻWwxj1uew߸ܸqC;mFh䝖><촴4؍ہ\ ~ |f)FF@ wC}*J?uԦQn9q}0 [f1yn0|/t&o׉+F.z܈&MW:EyIE8^΋LJGUwl\.3cq5c^v֕YI +c`eeۆt#D_hա#Lhۑsgmi('2qʅs<MIm(w'$ Vݵ:$ I{ꮽ]Yw_w +lnjnnmں̕l?r~tt4RqU2m: hvjPI\qHw(t0Lb[Oo':;Nz{Vcgv~r o + -H"*hdB_;G) +H,&&HM"Ov6]1I*t2?dj׉; lurtƷ޽{Q!OZ#r2񒌿kFKJh\u D$[rr}gݛu-5ti}n-%&$Nliz$vFO%EQY XKtr/8jިSwYعGDɪԖ;FnZ-Lb2l;µڱ%[xpK(&&ۜf:i~J\j8p טo7w ޻zڠ"rA*=,$./+{{ʼVM.I$,6@u#[$1FJ_~ukS:*'ppG%B$[3i)<WO&/!/ ͓r&R%} Syptlltps'`3Ql, &|l_`gaA Gw㰘)Y=V1v<ۗXӷZZnYL&Kի1O)bKR34vd[)F3fQ'cOa'u[ C;*I$嘌xңc7`RT&IBs626X{`P{,É1edp_oy|q*$-wh=,{/dD@}`/*ݸy˶rir\"->ϨU!Wl߹cWy] F###GجŞy*}^/HG\6 z1jv5썹s"'#/ K֮[WPKb̉~5X,F-84WJ(rmڴy/2}Z%n*d^VD?f(X^,'/}+uFIRH>:H,C)HUn~Qy2; +))Zuoݻi-[(沸;N Wdʛ`p5c7UdL&Gᾖ 7x0ԑMћm66аo61M0ߨRW_}(btk|'WhlZ]}ƍ;JSM# GV؄-|vjzbZܷjN5%KK^9w̟fgWbU0Ao2ohBP0A/ 8GAY @ek8wFgfg~jC9*RR>o%xh)pE'32ÝMhB>Ï> 2r 2s=g-C Nf2o0ο?!xAN~}f??|x@N~}fAП .B ɯόr2|!t! g9yּ|Ŀ {P#'#=bvja M3{zgb 瀜<ÁU]k7ͅߢ M3sj+R~>38;?p!4&82mϺJFNg8p}3TiJ4:jΫuO3^W>*n)X|8&EoN?d{1x] +Ǥ`d|?ʼ:/#F*5Nk}R|t:E"QZZ^}pLzi9yj-'1".;))0XDOZHgi)1GT.}VgW??`JOw8lPBbE Ijdd紂cR"'O#ɯ LWϣĜTi {ޠ +´@ٵ;]]Ɔ{O[ Z sPO-|i\"[PV%4ѥ t<&×|U|& Xȶ=!IJ+5:UwjF9./xJU4q0':?yO%Ϗ>Ƈ`T='>J9yAN~%lșwܹsܭ>X'易*5%8䤢hUK +JW?rNQH<:pB>JReR)NKERB9lX2J\24">L\IAV +R.`pӅ6iDLi-9tPe# Pi'd"?(#PժxlSr"ś{ [- yf^ف};fVp9"LahI,._T*DzKɘR6bFv㭋a ,XpBƧΕ*5r4J\d͛7߰^^͖k7n޲4ϢM6d2LH)؍x j16^dw,dB8ʚVi+ +%#Eov=y|CyjZzyyBiݲzJe\rU7UTj5X|e/8}Oٷc]!-)+uf;{Ba˓F]Rk]}_*Jxζ}ʓ+<\m j9!UvTVVX\oL.+_OSU:CriYE7Mkv<];kKYa~lZ*.7Qyqed?kɓ'*H `"9p;p :-b2`W \ZZZ*&x"[udΡ~|YgwɤW57]?"VVkr"{/VU8dE?omi v_-ǯ5k!If.<8*XV kj^iҨ4:ƶp8l>{]=j/VOUVF֮z%͗nwžkhru*ڒZ]l>Sy)VSSh{O۠ p-7>{1%ƞ7`6nݵ*6mr[ :v[gOOOwgၾ+e2ܝųjouX'Z) ^`0ѕՌjhh/رh7P!'O#ɯŖVnpHNb0蚔_O\%23wMWLM]Ã{wo^YwldϺBZbS~7;RuIt֮[7OtɄ\C=)W;Je\Rlm=Pm=t)Ӕl);0pvf A(toTd82{m`o Km˺*˥k c&w!oB>1jRm~N& 'n4v_uZR)^nOoCz> +/*}vT(?so vQ%pޚ>k &=?E@G"N.[;sZcލEcL vW m.rwKw+\!#rЯnohh B.]?a+ 'lGrrCo5u@V>S9݂ Xlb]n!P|-ŀ+ e&ѤI2ݍeFjYm#JJ GzJS{`K Bd^نPOے]o3`2g% 6[Pmm]GLZNj5<48k-&}]s췶5blTJu &]᫰%"W}ihngom?ˤ)SX7욜`0dz;IT< 'n'Ɲ !-{A}"C}]M`M/y`{i64]:$P,2F*uY7nZ~m~NI% BaҲT%FgrR +9ü1--URT'LɎTehX Ee+V,{tjvgjC2T(*́B pJUPTfPcқK+*3S nx}ȕꌜ+f;pRJc((-//7u^@PŸ-S<炫e5Pg0RSoJGbCb$)Ԇ++r&u@lZv},H,ENF_JשwtSLnU0)'7uYedI;b19|j1>vC,6dCz{β ⸷@С~/槼KEl> ?Z0}Y,>YyϮ۾l|@"82j.'Jy\2G61/"pBi9 i4 +FɌ?y)4AilzLw"'O3_oe M3tj˛Q<= '| N$MhY0ṙ2X\Mh G[`P?d~15r2x݃9@_A@ /fFNF {P#'#=bv5' Mher+&4 Mɯr2Є74!'hBЄ + ' MhzCr+̎/X SSgo?O~8?>Ru>p|_Cӗ :bڇvck:#I>zVp|}'_,R)s,xΝ ۇSǟ|٧%38?_Q_͝?wgOE}gGN)HS?}O/?5Λ?>stsͣN/-XoӿFǭi PA:a} lW_moSwӻ-V_?ۂ|Q|o_O{u5#cp_UʡӻB0YyƬt2Y !<ܼ̀b@U$,sa~δ_Fg.\>ꫯKwƙW&% w~ܹ_o_5/͛٧~|)46ҙ/>3M/3ϙ̟7˯d~XE~HEΛ;:8/̝7/| ;yX cO |;>0@̧5Λż/蛯EO/9sEzf~ȮbDzF,Yx "SЗM} }/>4_|w?,aP/Ϣ?.qQ%JókԚ'xp_O]o|_E6Q0/[w24*Jp|ҥK(Bt~O?dId…?M_hIE 4F'r~.pFdZH#HEiLZX|`0! G:GY6Ft񒥉|`q̥KO\DRDE \$!)?1a)rx$ZwDPIY"Q5ku?jDb"P12D7jzEJǤ,: SapR!'d-^#.u*qѢh,.Oa2 &.^*9sL'pAEBDž4>c?뀽r2"9AI +B7% q[Hg:D_qH'i&JC.4& ,@,#e2z%K`4zV-Kp9">H\f1b0.'Ƒ4AөƷ_6>7,_*Ob6!߁\sѻ=\ N'sE̼[f1 0qzZI2(bqZit)5VU)NӞ,Hs٭FMhIKKY"Ngj֜wZwpq4 "WӼF5EyZZŨT?DRh1|aS^GKvZoRu>Zhv_=Oloǖ>i_$1cE*Njr"b5cZ VY dlu2mKJJrfY. yBYӊ <9y92͗2rvG;)X#_tdd|lw MuJ?3(?I7T| WPl7(L-)..gy⬀7%ŕWXZ\#LP!vxx D]Sz}V@KJ] 2іiTA;BI$b,X{<~*KoHdi#$ Oj"Zk :L$IeJo Fw{}T"yI6M(q< +c,,y)pJJgg$$TAN?'+C,_UT"٠j3,z5bB J\"%_UF&0 2Z W~//tL2Ȅ3XHRӼ 2H3gR($;=>C,=I|ف8^~2Z#_q 0S[M +Apq|R(+[AX +'oah+0+ VD)RPjDlQ'3.dwq~VٖTKlz9[$+S|^$,%5EV-@oI-.#%+Jj!ZL`0R9B-S@(W, HE<ȷ: d :B gz>M7N)6N,%3nR +7~O.`?914-ݛl PBV'z] & ,%/ k'pIFLL{f>p>F$ɊrHtN2RߪD ;Bm:!K1Ua)үd/..-M6iUv ^ȑWcRg9YBYDz~ٲer<&c9yzN~ ތv? ҂L +DN^qMdr6WqQIa^jJ}AQq^NnNNNnn~QA. ٳ9u 'N,F7?#ܗ6ءN 7 L( 1'G?)N~)^HrB;d®8C)rw{!Ĥ2*-Y0)P(I0Tz L'LJtvpI*5n?'3nK%/#˕lKR4p_ uahX-̬lFy\X&OIMv;mPR/`+BC3L:5AP z%p2uI(d0%g8Y :Q2\$ʵ֬ ɑ)4L0j>}BjLuʨ=p6Mes0B޺ΐPsW,'G+\./d(DNvfL,ODdfp9"ɩa:/ ."dqE^aIY͢c6\ƺdt vՐ`8l8'89#sƘ99>ÄZO89' ]0S)il#a: OK,^,9y)f@dDŽy2hÑ( E%K,7D2&;;!oV^fϦ/"+srf D"Sܾ wf~v.PaO p؁ K4_V-~nfRR6hixBnvN-MHcBä/Y+C9  4II!ψ8Yۺhl5cΡnbKwFA6^>^Ma.y˓wD6Oeѓ/YL `MaJziɥ:NVp|Qvgv:++Qh{SlprV~1̖)).&]r.%EB +M>L,OG98is9힒.S," ,.,F,# +Rua?oi׌{ω˓ȭ㌼χ/(&N +32ss N.,(ˁ+0SI̜<6NAL 9P5/++ /Xlꍿ¢LL$ڼ

    ~/qfreBT*HTli54:$$)' <:-||T-f3T":ڌڈj9^ HB7FDaa? &f5ȉ5 +.9'+#rOpBӛM&ZAݜ Fɠb[24MPGRbС'v P(`c[+Tx#)W @}6a|tߩ5:$ H`2JyngXd'!'#^d )J6 ZRߡHRVOB6 +8Sk4ZsU\vRR)B~*/}TI8BT<.͑ŰZ 9)hZ5C/EOb.O} VWqA.@@acq.'d_FMqbK&/z\;I{*tHBqisPG"8~vĈ&iͧ+<IIpd<] '3"r[HP(.?ôc鍉ŏBه0%@NDE_2uxVMEw=Pf \ϳFгԶ(>z1c@NF r2@b怜@ 3d9 '#9@ f1s@NF r2@b֜Ι3g.@ Fo s27V;@ @ @ @ @&lN3Y,& 3l6۲  l SX{رÇ/+ g6`tIU`kZAO"༌X n\mx˷GF= .Y g ʺ/Idj(љ[+kq8%eV$f01C(PT9[u49,9@PZd# #R/g=HoI;;ٝj#9g18`3=?[-NI{}4VuUuۿ.UWѳ^k*)PQH\^lBRBlAYe9W*,&] Ob3p1e`hJjj\T(#[R)|y.%"HChJx"eb.1!N& }PDn>|9.J&I#4~Ԇc{V%=o/1Mg?pJF~ܠJS[,6dYǺ9Le?wk$2Y:cv[[].+*_}o۳2LNs*; +AP( A*{/^zZ#BC[_<(M 6ϻjr)F]؜VCłJ6!1:W^8xXkhܮxO ՁjoU-|4|01_~ rφx8&{azd){2D8YͿ^؞ xݐ ֢bklSr5ر) +*x61Ci<@fuOmlwq[5G 73 _Y`\}o I 1@=j2oD*8$D&$2:gҍBu_XJ>7Zzd.VőVBS4m[zD'O6(>N +6/6B {w; (y<4nΗݭn6\4Lɮtf-7e1oLJXW=n.UKxyʕnY-;y6vY #I$ܳt-wfVœ;w'׍ƕQ {A 28(J Iz61D)FPfUmw㩙qA + @@@BZW.ӊG]3SχoRTVay]yuNy@ d E0?˞f[5έi8CO0iDj85`T&yCGCB[F{[2 +\W-@>E. qJH|{}x/\-??]ʋlr9m<Ϡ(vy(!dp ?]-?ο7_|W_}{@Np[~_ +hD{NX^s?~.Y.e-'cN') 8/7l//_7,ȏ:byAu}7W>Y!tVw:q@'_,>rA 4ϵ\/ ts-K|Pwy+lK[ȏ:bzy/*s*!GAGym:-קrs@>2:p/Ca^,KR?= oV[ }U`TqQZƩl$6T4r|g7ql" %fR@>&t:0G5y:-/8QK䯾/R + +z h4V "c4n`RFy BNͩv͑2CRPQ$"~RyLA>\G@\Ӛ@Qm7(t;DcĦ޺Ġ5 JЕnn-%+яPQT;Yy3l +~HUN賱ʇ8%j\.f.<Wuct~Ċ޾4(@+b#FGǽؔX'nV!"88'+N% Գ\ѐ1Dbʯ}AAkmpsps 8 8O.5NYdlnCY(fp2/|Eoj*ׯHdP)Mc})ѩG'G"2pն_;<612n]Dq¼qajpՑ΁[[lt2HX(gp9;IeK vWG]z:932+kJoT,x=N[kN>υ\b.cոZ2SZ~8vil{KJShnnQcjU$>x1155'#!I1:gfk+s2 s8*ƧfǟŅNNs[t >'vDcȅƥ NL]RaLANSSMy \37wLUuH9:ZDb6؃% o~]+"6w/P;;;`X,>תqҎubq\tLbRRx!=;齹(<}Nf0 g ˄ű;g{mᩓitkLSE446f&5?WIQS'$j]J4qka1A,6\(eȾZ_;0[ +(ܶuqK-^7'S18da׾0_ܾȚi?r즅*=?4:bbE۵v4\S(y-!7/9gZXHɫ>v[luܦ~GPk׸\.4zbyiT +b!P+v}fv 3b>tgZҍ +c'TE@TIWNoYg;kSɮe1z]eDyȏXnL(87ؐDAnt9)ݖސ{dӢRA陓 +`rL"'dUrdr??[eaM20/ܹ~8y5",<:::6&F"$ݸpΜ0r0q}~sM{}xf4oKa./*6^)fW8>h{+,*,X/":'2/99Iu>E=G c䒴 $qޅM~5-Bd'qѱɳC'N_;saA0(fo2*}lȱݶX/Y=>rw>( +0[;9q@baQatgN/ ⊉]%]J(L+!nvu6Ue Pe\NФw?((MCΝ`N67Ǔm|BBrꗂL&aۼ5'Or<Ѳ%\]/\̚n=حԘRe+J&N*mLɄ<lNxҍrӶb$z'vռW S.ͲbXjK?/AﵱЃWA2f@{}%Z",n:j9پ:oe}Uk.F+B789&eL W'?Yo8Y1:B`緬dor{sSfDG*3w;;lOru*V=^wطVK}~YDEEd҆W\V~vT0c5w &a(; C(4klg֪[!Bղ4[JBQY[ff~RϕE魵q :Dέ뭦=EPH|mϿ{+Ej)& B?w@T >_S:KqR8,6O.t=O(It0 O K`+j2.-=!&E?1P6WKK8,1D]jr|$Rq'Ƀ"zۃxNF/#p/ɵ'F(EK&QMV[=g~cꯍIY߳mkĬxsep2S(dl&\BT"C!bL$y\$T%bX,fPD\|t( +@%QiVa8 +B#`sSÂ\6,T&%.Be'%$)e": )NgG蒒Â5\6*mDjN. +]N!U եhUR`E8=N%D +Л&ɒoʕo *,q;ewJX& sodg%Uj +>q2o9o7%\|_(trdr98 M:#yq_t(@$Q)|{OQp)|U1k'6 @PamgiD#`T8v"7_w?_X'oGI + \f7y)z>:?f{o(ޛ \Nϐg;` t$NIſ[Ǐj*J>]|Z|;|d>' Z&{P(PXd&?U>Ww}@~i/N@>m \*/ %t2rNX.ܖȥ:bp[B'C + 8 + + +X?_!:¡RT_|ů~|e%~ p +(7/t{Npp ro?|5y@'_POg~w M&ϥ]~L|GyAq>~reS[[(=*uZLW3S +n4=8oTNA}&dat'^3lZ{"c?RX!~N -BiʎNf-Q\I "16ArB vO ?%+Op'K$k}x jɘg\b O+z@^n~{˗}ͥT24iXǻXIÈ^bO#щqi$!O(n|6X19f )[ +qlvQ_p?#f N>icu@'&G!rP̂Ņh1L'W)-nphq~2JL>Nn Eϊ@>̓b|fpݖ>tzQ"8mnN#k,[9LjY*) Z)3qԉ2=FM:uH$UzPyɧV|5 ^18£)D 7 +F&gfFөzf{9 pE,QAyPwBP[^[WR_159(5FC\(Q5m=]5ѹys6d!Ƒ׷<!myx+=!#G]ss}OAdȒNԔ8 Ey6ʦəl*#gVKn1HX17??6ܗ&f.nTWܫiAQ"دM_q*?93;ln8YPQWcǗ6#yi6NL!Qj/OOz~N@U!1禛kZZoӛȝPm;\1O3ŇkH>N&7W +I7Kv.FOW{RFP[@~"m탎ާZYiF'@+n ++:d2|BwWSW:A9? 8zpxGw޷ǞugB2K1t+FI9k։LZ:̛ZʐLn^7f<|cߟn`r*UT"6aXi4;gz;9HdΆR4-7" e혷k۞:\_n&ޘ[ѡ#?5% XlYQx#Q,M (x|{+O5T'lKх*e *k:aٌY\=>NUyV2؝ c181k4[wW"ńvg;*(RHQ7+7By]aw[PN Je|Q{Lbf$.AO2ew-1H@;ϺLe9 'ˏl6W6@']%Q- + ';r!SCeESsݮ{Y1<E>Al*?oNFIY {:>o(F_#lJQq((ur[MJ8c &ݶ9IWN>v[Hd$0iz2 +$$y=e:ynydmmxwKdd˗GOj +(3#fZ*Fo;'۪P?NZN^س'8ۻ`0D +j"܇𘯍ɲ=Z/q߱7TkC-ou26UFFDFK*p3r3nZ{!8qK,V|.nlS6Z]@⟞[c29(YdhnMNL*si8SѠ7 A2YtGͽ'NBȴziחgVQbQ`l?^Cw[~wfkL2`py-NV&iH [ #Bnnm Aɰ-a0xe.?Xӛv+>kT7lea-J$EzaM W?v,f`w8צ3}d4+<غd=eo379Dyy~jekϺ-uXYZo(Y 4o$_!mZ`{f2p2]buL۷B,ͤ`!dlfήbe޳:ęfv7JXY2|Naoy퉓tX"4wYlT*a# JcFĤ"ByNgHظ(Ya(NQtX"&HEvGtpKUD{&@*{^c$ )ÓJͅɉOJXBb_EH/AOU * W)l v@4M2 Ja"ڻ=Y @"C8 S^:_( yF( Tra&QkT.W"x|cb N;Y + $5 ,{jYR$D:] + /N +yV p:&[Ȥ1cI]uVjSSuOGD`VhxlB|4͔C㣹 P % +mJZjxhn D*YBXdsYb +/s,TByzERIS%t&[ JHH a3!~U@7Ƃo.;*[$ލOd@Ͻ>򎞁3~3q#/D;K,)ߕ{ļ+O6vz}IѨ¼O~0wda1I8M;lVXɅ+l.L<3][Cb&ffoɰ7+}G_}ՙڅ|0SO)eգHW{ǀq>&'2pkﮩTz|ZfzB$P(d$.jǫ$>Nx?GM8y}a!1B}vsQRDdr"zZxx.h nkZ8ڋUKP hґeⳇl1u$*/p>>sԹMl\x1a`(Fe2itvzӺ>ťrD/zۚYlq>m<Fe5Lٺp2A2YNZߝƧ!QŎ(e0$i~}hiwy r?urpyt,2=ӛq ͸cߋQ_99J@`8ȋR g 9RZhs;J#S H$J~S?%}/fǟ,m_7E dw%Pߣ#Ó6k߲ΕN_] +0*HJiit5E)Hlzijjhz6<#-60*j#[v?>kcB;S(nJf]1MHB}}JCC$6ӡᾮPE̸h' ط1DLAv/a{ @v=}i V d ӷq*/DhK )Ohgd} zċ(@|;h<NLjOp일]8ɳo=`3yY@ 4v}^Qi1Ї =h:"|J |N !''OrF + @~F @ d<@'C :@.ryN@ t2\! @ O8@'/~|ʀs}1]v? ɬT*B!K@HH +8{9 䋾.;ɟ j>4!$OAAA?5a:8YV;<ڋFH![8^KPsNKU!r ä +{j#ϧ>Pqll,JLL/oP2;q %O+1|f7@Yzd/!z (KWE涧K`WyzWj4IW;r‘f^OsZ@& rhdBnn^BL(YI^[SxOqqqZNJJ +|]t N.X L|E"(^-B?2el\BzU!ZkwJR"X <ַҼx3oySmޟ%L5&& N7~OR:xO*ر,{{{fjDDĉMj4Ylͤ`cնlvp8jh>S=1ƽ̤ߩN}bwozd0Y6C8ؕsX +?^'VjBS6'w<8Nc0dl@<>L'"T:* +Ď*6gFФ +H$̮x<äxbJNE T.?Xz{vn2VL6TJR0*ʉX!wU.ȳg *5TJyp-}l-J ʭxʤ,G4>;@A +@4:n.Si3sJJ4Jilfޞ8U+ݩA0f r@TKSsA$RJE=> +ĠbjNzWq"FzY[{ +!}`Wdpf&$$~$\$ OB\B's^RReTtJdW:Y,YihLx B^+5d]m].3gx|GON܊  + +,0"daa14HOd +fF*05k Z*EČiXN +(W%u}svut8$0֍t? ̐㋋sd??`D`9)vWUYMEC Q%@&]e_ԑH`kMprum\AJtւU₊wZ)$I`сl]4oyT_U|bfaif|zr$uZ_]]ioX@»S]Ce|dn^ilMQىk 5 쁑b>r+汨T | \[4v5¨{ᶚ +{a|WYhYۚw-]:"ee4=[YH$ōIv8wu":PTO ۫.gkUA.{vMo6l wKYXZ|10tګSIcsybh$8(bnF,n\sϚZ- (2`vΕ%X!+|&{ܫo?pZJb"I +g2lvɻtbό=n n[p[OG>\ݞ*DQE;{V>3:4:rt`-.SjG֌du@ Pɑ-5A*emׄI^WS j`mW+ܾd[ۛ?xY[T'** +{;::fhkϭeee2I,C'/8+{&:/v˗t>D ݲ]ֶ2.'+8_2fnɵ/_l-϶ ۶6g.]%q/ͶG-.FSF-mc}M&(veGOO$>U{y W/ &G}E9!xEFhr)CGfW_~gZ+X۷=~c +=:$\vqdi'J+*!)B/fzzv5={Iɬ{U z= z :Ix-M|= aig7u'Oyt~3Onixq4rSMΘM Xsߎצ:£W1:Mbæ۳#m8 + Qf O駷σ표ݻh`ɕH,Wb2x+2/Jc +?onot!ӌã=U +Wit{m]CCorj#J܍7f&یeRW?Ă8D##ny{ E5v?zJTdӦqBu\O__O_?`PI&C;GLJkv8H'0ʩ}j{zd,Uc'RBAQGtE SkP_{635|dẆUV 7[:6#c1LNh{}^Td <87 E7~9jUfp` +foK#hxdbd64xb/{޿6KeǟI!(&|e`i`rGGǸF/|K3ZoLWw>i:O&%dVź-l2!]G&f'Zm9xK +|yflų'f"=[zY+8 {oF_Txvu<,am9vg.#VNwl\ᦷs}}ю1693aL6՞;;Ҡ 98=>:Gjld@[n?tf|znnfjaL*\ud `lIبg#R)P +,S{xx'uZÎWwk`+0 +C*l/z /74>}HT%F)QT;6L긯* +SC] ֛=?' & f9sd<}tDIDOrh|ԁ)P&,Y`r^ &k+1+58[w޹u驉{RxӋp\~2уcbSO^okczd@1JdziO&pezDes;mm7J'gdtd{)$K<}SS6'drh5@wlͮ׽}ma.>" +\V̏f<^p^oh޺j腮I;&s\nkd,&͡n*7qd=\**-6nJ8O3~3Ħ-]9;42۴J1QYf2ݿpX"rD"6W='/y݉] QFy%P#6^ + =#7/) +S +`Doeغͷo&炌Mv:&{*$fWG71 h;AhumzØMG<l51zY{13;ŧeq8ji2s}1vSp7`)mbl8y +:(4=ޛt jihOuh711O rƷNL4tt'oN?.8ERM^j+`UcsM'v*qWݏ/f޼}LdəLy=:]V26jzBaӴ6\L9RM +/pbz<‖1 # 4 +7&s?ٽd)՞@lټmw.V*P_jۍM=fBm8}ߤb-?zG=-]&X,{w?>OPdy¡M57L MC^l~7;TeF,FיlXHazۧFC Lrl ~99):sxm& HiT-&3*R!! + d$ˣRm=C7V* #͇FF#3 .U:SӃWOֹ]ÓC#lzlG[g&&Ɔf|wL&W-_9I]ӓV#p81UЮCjzvIg~^T"7ȃC#v1VU=08?dp5derTISk?֠V ,GMӓ#[Pn7ܢLW_LOwj ǮhAvPk{lKXow/_uq9m>HzU`˵9o>mζ{ _tLM N g!S*(#ג^J۽jU-腑F3ZL&)*8;4Ccpך$΂ɉWn2Or ft~kNt/ _"L| 9Ƈ]>E ߘ>#Klp2PxtE!`6\ft؅eOLoFcC{6KXn9rpRNeyb2P 6F$AjC0 FT  +J~S3Zh*(Q)PTֆ"D"YpHT?WbcV'̄jw㱈^kMX,bԂsLH V7J%Gb6VttP45*: adZ cFh-lZ˴NL  |05pV1ڏVa#0tcS`Z&#/~ +* OXY~6Mab:>SԉO_E`Ig&d|ͅ. dh:j.焬8}>SHqL^K}3_DŽZf,&Ck-L^?" i#fE3_~iO3-Z֍h&ӢEdZhZ?L-ZG4iѢEkf2-ZhLE#ɴhѢ~D3-Z֏h&&r趥EW _h}.>A@ټ?+Ds{Cqկlu<;T֯h&A 6V0/ +e٪1ާOv@,BdJߗ};,vF ] >XT(B2(H Xm+/?05"(D,v $Mh,*E3y +Lf~h"D0sW{jX&r۸O$QmXjE+Ɍf$KTS ׉JRk/z!YMdl.rl*Io\@$O.n+5ڼTLJM#RKd\6/d<`hPr5ā._n<7O@$4$ _B+ȧIe.GL|sӢ!!2^X:[9ͤY@~bXT0҂*dT$X^).Ɍ +Ub&CL_uuuF2Lm6L, S@uI%>$<|*C1٨JJUdxBB&R r3MD h,⯸bᒖ\nPLoōO,V5fH$&/z"D`2Q^dxUXDȵT\ xbN1b+5`# J9\.#x2|dvl Z2&s>j-.j9T*c2-S@@Jqc(-DG2s +IE2۟$҆B]AP,ɠ?nk4 +SJG"j2|%>jK"Sx<r̀V>bsBeѨYBL<L%S"$^k ^Crd'd"|`,OV|c[5K6W,d3U᠝x{cK@ox] MQL&(:܉D*55#`8XhH/K4׿}Ǚ ^p[=|&v:*ǖ*4\1IZ-faԩy\4;v#2}L\nMS/]-NpkJŐI阏 V8s!qHP~ZL֙}"y>1 d2k/st* r,q;3쏧#>TlseLVh ıZ-oP? y)L7N0h/泸Xf!L ld`dW (ȈeaCo+E`4N'R!_fr.(7h7H$֓&xGm:CsO.I1i:`WJ4&p+N F-8Pf jpf/%0_X4p¦u/>jI + U!>]L q%Lds/&~20Xٰ C2K6T]1k[\hE3yK*/ "@.V2$PX($*ktDtɀE3=B6) 5fWuBp4Y]"דnQ*(q T,/ ”riV)oFʗ39M0QC`Ig +Յ b1DeJ%Qt12hTT!np4q7PU*-YO&[gvkACy.iya(%*LYT"&{ł j*:}R>G'SK\l\IPM&_JǫJAZXO2RX3a XU|:De0R \,z2Ml +9A#HZBbQe/}K4׿(&oܸr*4dpU>d3%">qwfľ\c3p,峛,DEBI&L*<ӘUt:c3`;ib{cr9|bG$BO$ B!yB/st(LTSesG*$H%+B>2)RJq"&D*GzdlwYȑt<,ƒiQKyj@ubUH,ϤpHod2MT$uXtľ HhАLESYUL6X=DD +PrUz_rl.Wy,}|(]h\>#Y3Y=k6KLձB1HmWlX DF5**%~'+"" +E7W +D3yKFJ)/mޏ=fao֊'6̯~"V3~΃#>L^;;Nf6dIK,>Y߬,BdbANSQp_0񾠵E3yKk.Z \S+dZ>SC#dZhZ?L-ZG4iѢEkf2-ZhLE#ɴhѢ~D3-Z֏h&ӢEdZhZ?Uh-~3 fZ^4 +}/yV,Ì[Z[| !!Bo~ĉcZ?~p:KEd8m6c5:.KTL3kt}Ν;Hٳg*NjYCfR+ +Rɭ6Ekj]uL}L&j5_ T9C`\3b2e2u:h,h<ڇV5%ŌJL&WylBRs8 RCE3-׸@1-UV24:R3{:c2_Nh0|Lj#U> K dq +%48`P:c"WTT0CBj.&rvk̓z9 G0ɸF ?%LvBj,߂S1/e|/#D,fswb' +rdR pE[^qYmі1`|h8ˢ1Y  H\./o?xtwIb%M?* 6 Lkd +z;Vቶvtܖh[wzimGkb.NO0ob "hb"ոPWaВ&Mdz@jL Rѓxtn <`pWb}ãCCC=]}p866vāSAcgV봚#$F suF*HK?%TCy[Y+é0 LB@VU/F)GQ*~d.%P_}j섑ᡁ7/E {+i\'OPNw+C,ֆ}(w&^iۙw_>n:ɭdpby>DĖ1c7}~ٳ4}>Lk`qثRheG2"8@vh !alNyp&S~GF;-$\d=621^o{t~O5C$IAL&S(R1ﶛ +QQ  +rF`13 6W@WՐ ?T8~eUĮ%bTBd0(qH eөt/?R.j~}N`O^Re=''?]SSukm8PuVk_w-۶m䚆~}=T拼hoZjwQRj{Nc/G/xN  Ka_,A`Ѫp2۱g.JB>Ś4ᲂw-b j : lD"Wv^"0zo Fq`c;u&G޾̖߳3v޿\LfknĎbX"HWU/xPHX.? ER#J& W~;D3LkNSd$Jv+ÑHBEЯ0Bd'nBk G 9{Ft;TRB.i}R̋&9lVL޲+ux|9hSwf ;:n^:isGOX0D o/۞["z:^xL&|ī·wnܼl bxMgJ֒Ą4*pO6`AU7_tkkuzr}NW*MOU((T˷^D"X,5Z2u8ɹ {JwspHM fwN oMRjA/xʑ`& 3Dh+mOn47n[/WmeVTÙw{{ZoE6 ˷wuuuv_-RV2w8򪳧ɽtеm޾ͷ"N5LܸqW/o\ɑR7C>OU?8[pLcoڤ6.ܸ v:N쭑 +W^mj={tìD/vvn}R{ǹgmwO\P"&lb|A-_Onlz)kFۃ4?O_-gf&ROhdymGΝ9sݽ\ڴ*]Nnb֞[-=ϯL=vyAV;'Ğkr[`_(A;kRO,?y|Ť gdL&IƝUiwn;S{z|rt:b8­=##;Z݅g8u̙=%9:vynv'5LLxQGOۣvtݿhRiJCcӓk|:J!vTBծ@|voWT[/nzqǮKzpuRAW}\jtMMݾrv&4:OFoܩ4^)-L˾jjjjBB_z`1č[2@~q'zRC/%D}90#^v'6n~訯;z`lvvc CoM5է<|n2md 3w k&37lDwo]R]}{?tn'kӷwm|әnFW9ڇ?R(m>t`19n8uPaU|̅Kz W~䩙ƣ;75Ef v>;14lҏ?-[j=mkk bsX[N>9e!Ҝ=737q$]] ߿;w=u33#A.>h9%e12SLZ,KV9[GvUJ l+pSSs`njh7Z^7רu#=Ye˳3$QQ‚S'wP U/m_ɕz\ձKwۂFppo+(Ptk|ЪPj FǍg=mj5* 7_ LBX/-3Y ӊ?E0yL+JH-nLN w6Mbw{=^q{\.Q.tfw7'%b)sE_0ri4jc4;E VOv?r=^æRb[΍Y  v=uc p~KǛ}J M{=Ʃ*#*R۠}>߲h0{y'O[m>*!\.za3+NOftPoO/v~ePML9٬s*7t5_s62Ҧ]WMZs֣}}=[Ck3t͛N߿7w,[vdM[}}=]ݽWx"ol +Y3!04ؿ7難v O̼{A+n LKɚ* _(f=Oxs*4yxf']I-_\KXlzt`<339d0~J&_lmm:cU zzZ.b*ky2+QL^v_ѩ[<* )`GJ0U5GiyߙU|.r|vzbGѾHkbž4\XPo_o>6;;-I5J$I$* |tQ)PҝmwTbE9\ы:_ЫUdדwBM5]\XћnDSbVZl@$M#3(nvk `l"Yo({\<"$Oz|. mj,O\y]Þ4Ԛsɶg`2tR&7^z9e#.?GRLGzdփKlJ qmӝelO4="a2*?Ha/YP#NCgo7CE?kRc(^J! ԍ FWlܻևW:fGU01}q`{9:,ue|0`d_= Xi3.Gz[]j Ql?vۙ]ي ysBTpk}3g{|F0NFJ"^xfzu|ҡͨ\jD&VGrq`Z=Zqa^І)I$5[?d*S* 'k|UiBuN!UcSo_>Jx +KpGl80T7v?n|X$*ÈxxO_n~ӛ1a63hžSߍLo>|Q=~~75^}sGJa&[tN5jwxlߪU]vjxߖ \ǤrŀU%Tv靓o7(ld&7Uq?n%LnlI1Wan=xt]kmf\3+޿,b&XݹSow\!kzr6-I85Xv74󇇇}"&K/q~֦܎c`g֭'/F_;ՈTi|`K(o=؝ԮgC0`GZ\`{vˋ RNZL>{‘mxUf2G+\;{Ɂ㭯S]}AǮ>{⣆3ך'H81&W~P]y>=20':_O7,z!+Gq$R%k$43oGc0z! Z`f@l0)AeR>@aLGb5BuODo`J]vq?3qt$_|%Uh0fab3\%UJcp9mL$/92Z\)I +Í=m7g +ÙdspG +,o׈!8&a +/_*_IUg!W3!,_Y(0L[|uQ2P-2 3kK0šW{l-6C&.YjYV-r;·_RFv>d*ee)&/}.e>_kUpdjCqQZG?^~^h*p^mgTjk}38231+ȯe&/)NofQj.L>p詯ɴVbrm-(VzpA=Nkp\ټc۷:1J}7b1TZRpMD=*fW-> ɷFhL' sW4 Ec|y\P#(ֺo?t%u.`hAEZ/tQ^;)eDHkJ}[Ϸ/ Zj- 9-{ei3m6?҃4iѢEkf2-ZhLE#ɴhѢ~D3-Z֏h&ӢEdZhZ?L-ZGi}RDH}Q>mO_o}~si}:/\|ɴhѢEdZhZ?L-ZG4iѢEkf2-ZhLE#ɴhѢ~D3-Z֏h&ӢEdZhZ?Z'L|Jyd-Zb٬ +"e1&C +A $296dOրGkR1Qo~oYKvЗ岘L61?#.d2!3Y8\6wkHp獱2I~q'p=0Y |w+** NRQOa2/g2;hZ*}N;a>cQIz.V4zm(&xm6c59NX^J ”JX-蒡gD\O6[㊞o<4*O0"dh*J&H;6ȇ8lP,0P +@H +TW/r|U.H@E Mz`P(&3 '.GCl:ٴͨs?|HZ~au+q"4'#!n6jydɿ~Fϖۊ,fWYȟ$rQ\._ Id A\dWVv_(&FѼ Ri4`r<)=\hU[~/4ѷo#LHߖ|`1*=ź8ZL6o DI8,{rb|ph䶸R=zr~bnz'`3%rܺ {^Bw܅pY6[<{lbblxxxtttllvoYVrcD&|<v*ZL& B8\.|D$P_(ZS*Zu/p4xІ4&LZ/$%CÑb\0(aJ+{Ί-$GfMPM)7p9B28JMFVkHT3O@E8TB|\l)$&Z`r,;,s|깅Da~@"+"SfRITHZ?ɝe&40YVZR-e2SeOO\cdr98 -R!KrD,"vOM͇I&D%X8L,:2̎,d.l&kX2w +Jgʕ%Riypf'Y۷T! @%,L*1%SչrY,,rD. w&uw>xb#}c3]1EùىEy˵מv>a@R1\^Lşdogň*]|. C./Fb|&:+u'pdR6Dۂ^Jҩx̤áyrE Te±^%d:_,jqW @UX(p# +>M%*C8@%"6mU &ñRk0|% R lvW2vX.qHktFbR?TC2TU/ X:NƢrj̮tyRL2ѫ1hCXd: +x +\ Fk,6GГ '3I +xkD$wzi"80.f2oUK%vyQ#}~3t0wsP:Lɦ'c=Uf|Ӧ,bl2.5Zp1ŒM{@MŽgN +΍m[w޼s>d5>tɃ%4A1Uaeش“6GXqޞRQYzP߳vuQWwwCWdw}G:uX&`XH)KvD<3'|UA4855TnER>(|mVH)5R˨偪d1qmqBUAA0u*[_gdrŠ,Ǵb EsHjsMӄ8|$e2-}nђbRuM1:j Ylq,UaNQȥEoqHo4BQ %b*"VO*Nl6[,+f +@(WAAoszKݨb1Yj(@>q:BuR.&dB*1ɼ<+˥2 $b2ZBa1ڜ~*9'rp nP*U/X4wtlÉ|:N8pi R)Qrw[u<믂>M$(00h5 \2V&F LWpMOGNxfŦó~jvt W337^rǘ !\ΡW48"Aux3*`dC7n`4CˑMfnu3Y"|'~1N1!`\|=YF';8&WT(R4 `Uf+8ݡldv峄ir. +`rUHD+ J]2\] %½ nMAՆD* nd2R!h6UWBMX# `\;l+ӈXĆcɨp|]HGkj6? fz"J_&2ELE|67m:@W .ÅCbIZlFBղͤ^%&399&)59j9swwV{y9=e:瞙x&L*lI^$R)RUrw۲e˶lImEVj.3|{%LQ,,BA! r\ίʉ+ɒM?E"{\6R}cdxۭ}U@Z66qXhM/;@fA l+G)w0- +Rͱ 5/^9F'Gϼ\gKg{\jSҋ(v„@K3XBuc Gok1ّ}GzǧgG>,qlKi8nL)p[ / ;'o߾N\p$+zLdv ' #T'C">&pqS$Db`xrrQN2AdxEC*_;;x^F!tdp$ݶ<8 M:RNf/2ep0g1 uyYu2Rm(S:)";Y`i1A6bIUX,gmE&s4I'u +"B% +rBSa| i{{nvuW>K8\njbkN1N8#Q\ui +I'[aMrlbEYp,[\NH$e)l=pcm7Ytpr-dy<47ai P,DʌT'_}:(`d y]h=pr]P-FOOO:4wܑg/"0&[8g2hiLatƂ^ZiɷeHӬ׬csPhɞPE9Yc̉b9 &HfΖEjSn<NykC5$?|>̐lI>[Y>+'uLtxၮRFugfƦ&\ ZKpjӳgS3]wmZ9'r-=/tt @Rky464^0 +}QP3ISꋺFNm̬"wöޞgkzt(6܍a"s$ufdžoV}\CcĎ^[wdEE~h E B/n`*A&f|M'G6$=P1O]xK$BB,R/1`bD$-m|D'S)o^d`6%dɵU.)m1|xRlPvՖzG'O%F9\YDuCqq6_( yk*`]2/ьe19|-WEroר|'~8pu#ߌZ{nKN0Tf\"J[[Rj 8aTDYN%SsWk @j fKY.%_Z(/"XḿK"Kpᘡ6&YQ7Y=|BxY!#ҲUuUd +o.]<\]T7eekb5z#y[LF=0Vg28Β(5Fog?Nh@~=2No.IG1HMJiL 6ٚYSrRk9zRQcg|{#@B֡']:TX|oMJn yYI"K>w>@NF~YCEN]{Gr4pBD@Mi4Ցр_?a۶m9|% +r2_whe_?7l<@-Q!>!NE ro`@ 97? dXw w2N!  @|' xI9⠓7q2o&7r2dP0S`4 +N<|W?Cؔ/Iw~ 4>c&2ކOԒi2C={#JY +1ӟm۶!;HA>X1'"opuTr5[\./˦ON|B3w2~9qa'~R'XGpmP*9yf3HY"W y;$9ٚ_Zq;jslFj5Q('}J +r +{9kXr6#77h4LM+~PHpʝob1?rc,6˹&RK%5BZ'D?Ddk8S(U2'֐ID_ ''a/ad?8GtKȎ{[$do$g&ںa ? +'i""W4 H4-5h~WOm"vB1x,,O]I>D6_jݜėxHunmy9VkZ_Tmao(ռ,Z4oܛi'{UpbF.R&NzcR}:^NHk^#"[р L;v2LDH c5++c.r_`^V;W!w6Z1q#id [xN+ђXzFbͩ]>A}9~qnHCQˮ +N_'uprN|?a߲&?MI Vƨy! X"@:KQzGbא8&os䥾PEGu?sx">VX[" \M*an8堝PP'R7eo18Y6\T*;̎//!blDJ~}c&&Q 89KBI{b&K(q<8('BbT$Z&_zًן02\eWDmuO^z1P+"˖j[^~z8L=b~8[| !ĦNN$8:(DawdLH\%!k i"IsmHĪJ_06%) Ro0t|.Ul6G,8KJtJYNaq,b[\8xr=G(s<_ (-q$6_t㱘-./tv;2!U(9{L`ʋ^",u+|^pf7SqE6Òe*q +,& yYשJa)ӮCUbhzg1h`>0!qWV.Jd*x }[2lꂪ +>JDm#N=eWV1>ޱe"ZYMZ6"6k+rXV|OQN'%pJgvȜ%E쬬"+{(_DV)ca-炟;ؚ_>808\A>Ö/H}panJQ'$;{O"Vd1)}dx/޾rp嵺uf݇۞ < gdDkW8{rmYcg{z;-='htTqZ@w^_G<<q+Ξ85>r3˵K+ ӻ]VZ&M-xҐpu#]{<+62>TE8Muqt2^D^Nc2g)DzPd:cJ"|Ke6zd=y s*D !{kfG.1+/| +:Uc#1f474q + Hb>AجfΐKs958z9@]bEq{^%(֙?f]¹uZe#pLd|0ҮTŗx4j+-cep jsz㑀Kݾ/()TmcP~"{_YFTB(^97,OByE",)Jl^eP#69`8.[&=\yшA! 4 .,9VWBkVL:O1Gben{>lZU-r"o0ZܢxըI לlυ@Q1¶p:uwKC<9z=G/V$\3=,`LG"&dwK/V/}udiNcp|lw_4xeqzn&mpreyezժ3YLK|POsGGLJ::/&l7IJ)-q_~'CqN +:%8'+r)n0MNM_ R1 +gZ y|\y{Y,e+JM0Ċ:sn4z#J*$E@(V`!ٹvw,z@&_% .h +).2 d".d(<\<w`fh +8j[9++1|G<Jm8Y5B+LUSe|.OcE9ɐhYI 7*%hDfbrƣ Uaj4[`2j5h$< 'x\VEO\]>E\f!TVB e.<Temx FR+j)ZMdb7 |PbLZc[!ञdv{ِ'Rq + =;W NJsL 7:p%ba"YjB*MdZ`0a/ur*!$~b`xN* G,ɷZFƻr^.{tn?\U +3itZ =H8'c=ƣF=8srrgb[AtߙKF:e2Y'z +6KpՆ{j}bR(n5ޫZŅO;>[x6uj_7 +Nt2l׻O]5no / z#ypEXdaL, ujvJwZՕ*8Y,${5:;P24P$ M.opWyyqٻ=HXN.1(B w%bu č Uϒ W녈Ԟa1*cdz`DG`w谖x(Hz:ΊA?[%&8S}oHɡhV +^HD+AMZ7 gX*qI'G~E 'l\(WCO,CL4Wp@8$%WlnD:+􆢎#8䚴 B #7:pYzb!.9{nlVbUfpQ+RJ'Ԑ,9d2OP'׶T,vh_s.Ե u"6MA'qd')'Ŋrw`h|C3&K,t:rrOǽKK.U.>M8g3U;oqt!oA'stL'{go2tY/9\#QK۞iӪ;T*9#ԫ\IM"Xd\ '>jR\k΍á@8/ ڄ!NN$ꓩ!ɺ&;[ j"@糙2eTH2YD\F){ԠƗ(pRTTNV +cN.F.>pY DI'uL'f&n|zC xAeZuQdNH$e)l=pcm7Ytpr-d/j͍vl 2#k4 + BQ2<}O,uL atʕY(P<{tdHٓ)O^:8^agpzi=KgOeѮF!j]ur>YKeИj$[pN8O7.,)Es p!1*YۘmЪ7QX,βX$77n:Q-mҾ:rUQ+JY%PuXجWy\L}b\*SD,-$S%6>r8JRN<7BHV6䕕s %!kL lP' : W\ 1yBY +'xN߬ mq2ğd(RVZX3]sxvW sIB> Yw)5fߧ-E2RB.uKxZӫsj`0 ┾:S~ Ks0P WU Zw9Y S|^,[B!U!Šۄߧa[x"p@PpKrROl-R5[LZ(].!ry|r/ҭ'#יYs24EUJ0W"Y:%p벋H6["%۶mӄ/fHq2Sn 0;R}g8l&)w $}"ZFF==4>77㶦!?z:;779:p'"Fɍo7MMOM] d2wb/ɀ?#SWcUN%dV? ZFpPwkN~qΝ;˯(Br L%()'J21ћF@ Ew525I I$bG뗐]`$xxPMvIpaK$"U$SV_y3#l'˺UdJ("3FbuKǼCJ6+%bX]M"Sܔ7|R\?']71<| tc7tjBj&K{%L@E2 >jG`Wi6ݳ\#G{s>W$ ; Em%x' Q5>K:9Aʦ ˯5HҀ@MhEE+\h!z'KVBsv6Eɔj1l y {D/pX ,MQ/ ߴc5,$OKI|譑Nl:x{L郳%'sÊmT5ۏup]M_O"6NF˩ogyv+E=YrLItk6=C?8fS~f @ :~S '#[t@NF 8$M@lqIgv2Ѐs@Nu4_7h@/k@Nu4_7h@/k@NuS;M}d2@@ n N0 //p,ۿۿ{70_(޵,wݶmKq2_w;~J'g.r򯏟8 O>/ر;wF!*..sӿRSH͖ p+8H$}YZZ&ztdV5;`0@p&apT͘B4:cc?+lL8kyD ~*0 +$_%?!qXhor?O0OVVh4L,t:믿^V'bg3ϟ?{|Hd#6eOzb뿈ɦU6}듍38)4؇g+]_hܘ1He+8 p2_\\o^\\t/\ݣ]k |ucINA*Kd2 +lpy>M~C6K~'uŪAP܃c, 8BMOz: Jiqs#CvP7+#ccu 2톈_ZLvqnܹxl78h9Е8(\F uҢҾ}FLCCW_}3tzv߫KNW-Xt8a[XzvK{ܙզѧ=tƮh_CtX(͖L;/VF3{*XwG LO>',oU~3Sd,](x~//=#` ͯc'gٵK ' scQ 8[A(۷={vnnntth4F?-'oYx>?=3t݅#.`ךGʂNGi{t+yȡxt&B3wƻm:Νif{xnC>Wn2=- Zg]3+,ύzmi_ =_TZ r&b2E]6&iihCU[ub͖L={p4NH@Vp2DdRΝ;߿Z6_>{=N.h-Ic7u?q(-<\yr=`3e 3}b6 +]6hD,C7̌{=M*+utI#do<_Z^Ymw;i+ѹ}LN೙>*cCÃUtr2xd!D"_2NҘǯ5~x$f?h1I9L b$[bdff`+whfGOW4?Rp3 E嗕{c5/FL&GwutL/)ppb6X/zxNgZggKsT4}xQ# cZ-q&$cB!H d&N3pΗe,N%E㋯^>y.ߒ¥8aOvkl ;U8wp%꽧Ez./0%kV֡+/^;Ƞ988=_q\Й/byJB[4axFkY2ٕ7''&6{l t񮮞ɉAN M0ZUqP@L,|jWM1Y#W:$ܬ`(HY]ya +4y;LO*3lgq^AN茟/-ķ,n>_u2d55Dæ'˔fI)NpJޠ & #Uܝ{`R uFR.fO&,L&R)cV_\'s׊o@J9NH2>!;ADrlR +5 a03rOPwcoϱV#|c k~wWb; +N%L9%y|.#Z @X{@ M'#9@ u@NF r2@lb뀜@ [d: '#9@ ?/!bs@?w@ {U Nꫯ? @ T I,h@?@ @ @ @ @ g7L&k`L ŏ%}G+՗/|H^qWT-fX . L&9lUg+g1 î;uM Lx| 1Fqɀ8 +bt +V2q&2ei|xƀXc%&Q2@E#*L>ZJf!e*t5s"T +l0?vT@ ?=o}nu,8mz2p|Bm__;A8! 8,-漒c';y-׀HS;(0ㄸ1a1/r .8YCO=K-2L[ˎ~["inBO3Rٜ"+?p}wty ߽ )}=x"\srK\YbYΑ-g٘vēg'v{hk! f-,u ^9&PXLN=qVM,^>NˠU/MLM,,)E.,.NMu5jdbS\o[Xy0O#3w'G&&'V*tfrc @ ~( ̟T\.O?ݶm[``1|{<K/^}=QaNս^pLm+_߽|OUbi@Ob.xD(\uad0]wg)L[W+gv0MW|rFj[y>y4J3 LZ >L@ ~J&hsT*aL&K~nucL\bjm\~zey'mC #z f&-OV_Ys~ɵK+-DYA' '_>&`o;yVL6gGW +oCJH9Y{p\1x Fpq}pO5qt+"\îQ=aZfz&) !L)32o^ҊG_?wHy\*kH',3'zl٪LguR d>dW勗KG#6ZF6ttnaIν9tGNF ?*[Ʉa\_oo_ʼnrO`<[VV; YnL ݽ{odYwu9xu_zo:4a望u#s/n,-M޻8pEJXo=Ϧ;99@qFcX,CN!bPq s.9}2Tjq01g#ke|-g+?zȞk%@8ϨZ\4:L]s/9X0 +!3gNQI:-q 6}^xfb8awV6F}yQNfwk< r3 0!I06'cɑx8Y]Ly$'$C-3>:ElM=U@]'\PqTՀ@ 5'GB#-oeANF r2@lb뀜@ [d: '#9@ [?s(EjNNx`dRh4Ǒo-d'|_~_?_|̌@ ~ l)'{+wƍG=~ݻǎD۶mi@"Nb@___/}{_+B +,F15onn|ISSS]]]GGX,_P@ +Nϟ?p;HXիWV_ZM\a [ eco֎,ѵqC8X*+5P+' W +N#`0r[G"^֭c233?2iGXd/ M{TrI<ܠ:%?LS;yIa,W8I !s `~8F ?UI8ܢ`oa+ț9e,!(//okk{ꪪݻܜ ZEK$*DFLRUU / ̄Xga[ j +N1\e$.p.LlϹ{MX[ZQ֒Jf),ԺtIX꟫xJoIW/1otOZ7!%dbP>ɤ`4!=sZܗǠ:Z]dæocRC=wJ L؛uIo/?1k1YL@e +׮cL6ocnPI)6|]' i $B~wh|}陞sl&ߐ2U 8grFRk׫.DdE"N>q!;vxP5@Z=O +z- &}|X2TJpp& 8a}kKp s>sO?N:c1jBIgX-b1Db1CI|6٥ K" $"H !5R+B:D"MIY1&]Y-ъIY`#8DIK%^[]bB$jlGLL%zYd9 Ě}%zBwe3nWp΍<*ԪǁM6JCL71?Rd(76d$JGf8Fckbl.5'§jĦdK@b08*:؏l IH.ݼi42ʥsy]c0BHK$%,dX,!8wp~5pBNOL7$e^XZy+Ϟi$]g{T9 x=}yafx_4:W>ULir'zRw`ok.-.^+J\L_zs~`{1Rk7p/3L_v؝}5ygJ-,QÓњ3}+z]Սݝw٢}SC'eTs9<=;XGgR%1 I;9%+z:5%zzyÅVl> +&K;}Ssh a@r}xF1?z>?ۡQDgf&=&CQR.hŃlW>R,v\>5Ԣ!'^?u~<|w`oY;<[Nfr5c+E{w5uM^?&(64ՇJm\8JJMKcFwЋ'bc/ޞv_dwWM y}./0s榆bԳg3wM?~,T9wv:<ّH1z]Bl'嵵ߡyH$w^P4I=Er]#o\+wMLFm:G9>7W7%|3m]j[H}fG]=kn۹#-xp[79}$l<:[T2t@o'`]'Pw['JAKP'ovXG'GAEMGs#=F\ni~$ĈM+ɓRHE +NNpE۷$h40pee%n6?dE1=##=#3zzn8yoQqsO>{decbnƓ7:/Ls2CovՂtcM"ͨ:S6\B{Hխ:>\q2o7zVM?Yi࡛O΁x&Rpr+2=;Q@Ye9 +QaXo]C{ǽ\uQpGc,"+'{;zD< q i@]k"oGƦr֜LV$#gg_>_y=`VXÃRNԷ>˦Lu28{ػ#Q~~8..'"ۿn̖%P{!/6`M)F&ysNt6_ˤ%/bl͇ýˣ-CU\q~iQ!3zԞ̝ md"jNA`]>EkNc=ZLLMѣW{\H+k[<,/=:y'&w㧮v5h*nu9<NtxxZZى,u̿;Nv8{{6e{Ok$W=mo,+/뙘>sam812uOnJqD>:y"tAl'cT*Aׯ_Pƍ𣩩+í\/OnrId"$PF3* ׋m\) ދq<}3I4}!3g73JX'{^L9x̤\=5Т Dgl +$^] j85}sGfmNέ25d6]hZvw<,y`idxac2\<3[]#OJ +N_o~B婞iCs3M$U\kThd4paϢ989P&PS33ugˋ*'^];W!3F:FXٽdx@u.8tc@yps?(hsʧ_^>\e2zƟ=8OQM]ԃ3wWN.=679o=_hP |Mv's$̻Cg~\e˫|5>ߵ޻Lmx82:-֎loyHPKʤRqgujnܹ =sMxf?HWKCˊ";FA$?bC)o>uN(H7v=ҽ'=lmYSw*՝ml].71 ߺtg t޷*3֎Ta>7-A>.,6['Ov/^X]]M򆀠ZK֮[*Xs5K$&)J"Z̹R$Euh4-IEbEʔLCaz|55e>X}Bu,M,㥐K2b?TrX)"UəZY C 4j$+s +Lfq FG,W=?C@^B9LIQVew;챆xFCf&ARLCRȤ1eJ4bb$'=IdZ>qskox^"k<7ox<@W[qn|?JG!g}N/Nz,ב$R&bp yH$IjZͯnaod(jVڂ'V|222 -q\hnW?py2(`k<^N;"<;;ۊtB֗A*JT( +$$P(H8ⷵ<Ŀf1q8& 25~;N[v"s2 ׺%-MSLsrrq2c%r{mHzs2HuMoEN$Un7Pt2'!IaYvݩ&⧂-Gnܮ9O~5-»iiiLx +4{ F: '1LdlKI  dМyDZT6,SC߮^*9yɫdXg^Vx\)ǔe˙'j8޴ػ=kdL #zXn7oApsa'oq +`XZ^ؾ7 8N5֎?7i?uw Gd2A&+M4$iioY]? JY))U+4Ja0 ڊDˇ99@y%۫`(DEB> 3S(VE\-\>˫4jڨ"~¦ XPPyyy dxx5I0ܽ-N0#brk!Ls3RذHJB7CPFC)NIU덖S,Kz>a.l.҂\&e VQjS]"H^AT(}JAr;dX  1FZ犅˛"!2%uj7Xݵre8k5lfAOiCƕ1Yfk83nɑ $+ 2%$R0T!VrMF|>s.IyL!{ViKdtx@x)eҡNJѐ2+S JѤʺ +d˶[6agGI?~F.9'_H`d\/bT(}zy2H' DŒA+HP(u0O&u1(DQg_} +@1tq saM*v {d\޺5B%!2h2b 8 M'1FG3u=٬›ٞմZ1[k:]ASӴ>kFT+ ~nyܛWs&$J+)0Y/]AC4wmuI)H|ּlM?_vsjn~jlpmP$yn~~fjjhp~Aq& 977?;=#BIit{N^mqW&7O2>=vUGc9's_<F^b V Jʊ ̔tDʕx eBʕT~Q PTR;fɇ4[OoدȘ\W&%2&TUYZ)YB魪"T"J, +xP5w-'[Ȅ` y<Hៜsd[PVf|Rz+V_Qҙɩv7;\&9FZ:{gf'?djSwfLJVZ:Z fg^-(61v%q'syM)V5ګkʂfW!d2њS^4j(DJ̥F +gq;&_O& +vaqQ[\]- TXLaK%2rEyYlqKyh?Pm5ZCqIe5zFrNN"d}\.!HaK :ٸ|!:S5: +,\=תWT{\ 7_;P]@o~Ѿwjztnir@]Uٹ3`ZZUqrȗ D#./8D֠Qӡ^-N(CFz|hwd[F>Vv툨N4a6n}# on Q&O@3--UFPgƎLL4:p~qipYk|ea7e' =ZZ?x^Ihow>a$ICGǂ좪K 4g:G<٦OWr +աKǺs y^M:%3,Q&]e2`))幔fAjlD,p5Z%^ eE +_Ͷ)W\P&7%\JW_ ׃OMO -͙jr {1ɑ["D|}077y^{/$nKa;cs7cdx +ffhtj:<.ea^ίTR'.7L Uyr;c}&KMK3* f '^?q_|j]KOOe_DU8!CMӇ.7 x`)z^Xc7\;Q+b. !ұߑA펓aRpNFwFp7K&F>{~PV:b;YM t_CBnNjͿZ:h$E(3';M gMtڒ}0A<}t|A,;Q\}hzah wƟyo/4=kv$9|yn2C:z쵩]yQs`XoUμwp}*<ҙK܊.4Y%%f xy3+7Tf8~= dj p:6ڭ9bJE8 +C(}Z`Yxk 6'sY +X $]LZ- 4htF[ "Z?y7Vy EUχƇ?XW(oZT|{j/ߤ=ʹء0~=;;yoo˽f dG[Z(*ʆiȏAŌ^ &۳ȓ{ܽҩ=>pt}:c QNH$P?;9̑ծEM\-]-SRx4;/eJW_sK~-?@đ+m..^i}=q NẊO>X?>㓠!'39 J +-A*+*^R&vOmm]IQ`56Z+**mZ*dZg,  E_6)TڲBB*Q5eUf34P"j:TiYͶ` E|p_䪈x<9ꯣG]YDRbpnd@. s"o#~tQP$U\{lvXd?~`_UsdKyV{/^WRޟr5A}wpV Ͼz*U8P[>y>;;73331>V~:|pdblO )qhժO\lk(UT~پ'=#G[R79޽jTy>n-Iz]Do,',=CS p\5_1N?}t4?Ġ~yMr +-Oz;4:-$Pf#kw u:6& +Z 4X`4[F*~=sX,j*f*.ʆ`߃L8Mj34h +Mp}@;pIEfd U:l]nyVbZPk&44urYtM,S 5gԕhL)fbxD C!3T0`])wkxYLjY1YUsrd -.垰"mqr0P`$I6 aQŪNo2 zF#l2fkK2Kt.! l&dU Qd%a0[].3ceyjwS0!}i'CP?D5;?CF2 +Bp@D* ՚OkdX @ r>95Dv#na}ZYW}c3Ond(FG<[9n;Ngd!X|$s&VcͲhq XP@0GOɛSV $' 8aN Q͞?ȖH"dwx]Z'#89;ys| ^ pKq_ldmQF_99KI%9Gu'D%a8^zv~ɓ^[ݣ I2\5JfW[CES Lmvݩ_|Hr,cGYR0wo`v0)B|dNN oPۢwt>Eܻx\\pgsrT6ukCAW A$y@!#$(dA <A2 HBFI .8EAղ Bػ ɰB; CBػ IBFIW:A`A$y.'Aօ6F.d1 6CBػ IBFI6-8An +c+ H;B{ i-NF!#l 2li AJJZdNF#$Nzz_|AQNKD[WAOΫ6vKurBAIMMO !! +endstream +endobj + +1257 0 obj +87456 +endobj + +1258 0 obj +<> +stream +xu@UYySDPV%  4A ,JAJi0Ɖosν\T:s<8~^g?\pQ .\'&?GgLI-/1_ 9\W<(#͟`BEO ̟?oBD !1x + +JJ*())(,Y C7čўߋP0Z~9&zz::ZeK() o m!4a0C2` /g`dfaecgȰܐ6m\6f(fHy2kJ a!!~>\,L7Ͳ6 +F6ΚL3y W@HDt"yy9Yi) բ"B+8X!m*%q'KMqLAEMK(s]-!%+Fy5 M-mm mm-M kJI[ hR/,EUk֪imjfˑn'=2< Ղ+i.5_k~~_{g[)fFǽã%g?0|իׯzW/_LPSQ8+5!Fp FjR+8 a!$B׼)M"pf`[!$&N{ҧus12@ODȏcG{ښʊrcox95QZ6\ u9 C,AJKH{^>o="etL|+ԷXST^<> !y; +/DC"8=9>`t6V<{X_:fo}(H8bRGnBs]ϡx!?JNik1RB(B*Js/gS10~(ȹw #c};M7n{`_w{s]e1`q![sÍb,˩)-r_wNL_ s^XP@ڋV{a^0RfdTT߲;Rڦ1q>X'D]qsܽc# b$N% a1B5^t/XE* {11.pRYm`f{/f\rVay ?|ūDMbblda]+󰭹ZULtH)"HI"%i)$_Ỳy/P^ 30qpr JHyy9Y3TL\aϥщK/@8Ì CIȺ 3)&Wk98$$ed֐JAA^NVFZPR1x߾[ 濧LJlؐ@w[cUI^ڽ~.vi(J + 98,FǕ:Zu]V)T;š/, /i9Eu5ut6JGG[KS]m:EY)U+yWpqrpr_chqaIu-}CDΟylᾮgYI1/y0V98=5%k0s$$ , +`ef V磞 +gXIbf5^j:l502%^fa-56UBq \%!R1GWoƧT7 glM%y7ϝp6ޤ*Z,# '҈#) .$-%<<\ʕȴpyWPDLJNqM 2ٳ3᠝=6f;M tr֩o24/$AFAE3`c$t 7a] 2䂇˞[Hq`Y-)v&RtLHyJANVFz!Hiq|;BצgbX)&-^s. }s=᎔x +r?z;6hijjmbkqKcf?jlLo‡@XW<~[mZ*b"|+ŤTյuLܹk9512غYGc07~'PkaX_ŤT6hm71{173kj/s>^GmXnbc#A7j[:Gq}V8>º,?-ƕ36)IK(UwNs=`=L7k+iRLnj32r +S vu<~+o܎>!>>nLtC.9ua'{\y/QֈuO+pG ΟtڳK:5-]f6흏?uiB']86߮IcJ>Nxz#[S5=vO5^w{x +JMNJu+ZХ ==|._S\Є(k4_Mozu;띆[7nj|'NǪNC :ynf͵r<ȭ?5fW5^:[Mw9ߊ k2s>AK*IV{=)|^lMW/_~'.)1z k;kJr_>{+ss vNGݽ}/^E:EJN^sp~z̪?rTXk阇υ+7"&0_ +sC̒ =JKNeDe_/W}f+ q.&P,cdZl'}/ވOL-xkZZې>Rr/XcXʙʺpo5M@C=m I7/9w2|Aʣ̒0HM pzJR"- /us1٤*+ +P/[`W5YI-# +ղ*[L,m]NxG{WTVU70n;;{GOf=-aik./Al VNeƚ{wB.x١ P/]RM[I)Yw9|#xT6}ã7ox"{_bo3%g5l`XB\QU 1T$Pv5Ֆf=~};7ʬ\BGh?¿1^M{ܼBn&vzxSEj/~kwa= N-hz|tl;~Qi%-ۭy]=mjG@ae!^Xi32k]'aQaowWXaPx>^<ϑ7Hp0o "eX-!W#bʺfȷQv~ןHh^:3/ #kE xmf5/+׈870۱RXTBzn1ly~;Rx|k.߀h \?0$b%rU?Ly锓 "L4?zP%OTFE[ SrF™|bwMts7~d)~, ]-O2XCNaԾZE/4*)X,hBPy{ݓ@/GMJyiޱM/cW6Ξa1ɹ%5٫P抜l[/%@opbD Ao4r* nj~Y]k7m5)w.5ѐXt!dEYYY?0bV + pP|&*B + Kn6;v7(y. ! ʜ}5V^%/Ҧ!%ĈR/P4T6|hLJ4aw߳7Nڙ+IKHʼ?`M:j*!۬'w^eșƎ~4Y)WO޾EkZj!6|vm[6jWp~YOHHCUfuvbNY}{?uwWk =`@OWw6y#ıvv[N\-]g=e9$n6=q?odh6ԝ 7/wgenjjn{sM!H:B?q!G} U%99 M(iYwk;~GE5z_gS"\gu7W>N s򈳃lBSi!¯_wcjmcԌ\2YxF<~=4.dr8+1*슟YWCޛݍsz2ɶM$'clʛvtxANyC\d#a AkAW\ ?0C!r2SЫN< +`z"5۬ѐf^)akqŵm}qӅ ֕d&߿MzgTSUe%EsғGߺt#zCg=}vX붘;z]L~\3 1t uQ^fzjJJjzfN{s5 vhmij#IN|Ԭ't2Ed( 4L+DL^H.k4zb2}‚BU @GtO-p '-tro1槟UwPLZQM+8w~pw{KC]MuuMm}cK+|?3t4TB'W¬'qa^8=r Ca o$۞𿙘[=4z\d&6lokmmkG0C!@lO-ެ'عCa40ol`ֳt }T\nܻE CãgnG7q{ߙhEɕӆi4JJ۞W 1ܻ?( 5|1XƉ?ޟ~G1ɬ'oW=iCR/yFN)X$np!109 ExW@z-5Hg=]:zd/;#l:8/^),a#x:6Wbd=&.b27YO.¾t,98Q0)9zƤ?CzK'a=.{ +6鬧k[n}+YSbcw OȩhC"F&a=̷zgSEQvJ _w}+h(g5j`>rdjaM[sw5δ +s׃Jj}ez!%=ǁy?j؟!E` -uCeaF'- jN&U;ZtSXNsQ$=׿Ko #.MUOBN:Zj) p0P|U;ZvV)n2u,k{.t(LWKMinr̵ Vb K~Ex$!˴Z='>7L55`wk]Y^Jl@m~tF2 +ZV~`}` 79!^mw.ت&'uф]HVY;&^i*^;ql <㑄lrNyb3J2̝>>QĄ?nsZIAT/ +jBB&'4>9 ×[Pw&֑##3Mwkg\,6+&s3ǡd'DD8xo$Pގf 5"/"?4<$CN<<·Y'h߯'-y埝!oDo됡!]`.ϊv %C "]Nx;}45+7C %[o.?첰fd2jn%Ok&! @[ߣ[׉2^NZCHVh|nmy y)Y{ma-{׃3H6o4"?֏&3f!=I> 6Hy ,gSڸ;)5xL{8-I[cdɤB[d)3z= ӁY;N܄B,8 ;_?4 E蘹%uL;YЉ#7aK\? h܋)p I(j[9t+1oJnFn'F{>pnZFvI%m|MGg/K_Өs[_TFEK٠ȇ卝ؘp4 S0WXlYŵ#2Mf{ʹ8D5vq:y>vBfQUs>=Ei 4ȹYU7Z8@7uNM\?|㣤 )sK*oٱ안⪦~l<䤩s~Gms9 EA/K4#;HŴlr~Z~iMKg~5琻,&e4-'j9Mg.$eUַvNGP'M܌~z)<SP۲so{iyMC'_Oh NgPXsJ 63#/E'eV?8h!yYQBJZ]\[4pn4 +YaBVS=Y?RJHƖұp K*kZ98|'QAE!sMp~\[ԛ[XJE/4*)IU#п&3!'dp.˼|GH>DG/@8{$疠{&S*NM9aT3%dȐh$.յvMB_{±G̅hi"J&.AIeň mCc +Mz;+.b\gHJF6t|zAec{0tnUX% !GO98z*4y + ieec 6H 4Hog +M"tG]ؠNHC2a4 V wtz`t?#kCi^Mƚ&7Hl[XFu~aw +Г8hڎ !>.z$ C?K8%U6u=_WHW`KpvmQna^59_؁Tbd,B' J $7ouʅ+Vʩ[r')tMޚjT kV!ü{nu[/H*kAb {Fy;[J /_C捤c fޭ}oXܣ'5/5\]_u}Z ++h>81rȪ N-x=4749 N2-ۗ=6`hHӳK{\ӀEx9 Lޝrnu9xx!l Byx1߰̒:MA3j3#qYTaJc& nW`TJAճ zM  +Z&.D$7v īYГ y#hZ~h/44ig'mpA5l|rؾ:JU-c4A.&<9 SnzZv7.uRB3F1 +^1NaH׵<_$g@O ۛmfiOHW+RF`1=xs r[lˉ~t|x*^V:̻g0ojFn5:;z^J-!< _!=>߁lmF} y7iY$Y:{^vyޯs/Ƈ+ S6FJ  ?Xn*zUd[Uz)\ sn 5TjkMCQB ᴛzÄLbV~7 M@x\]}ޝ[Ћ?8_j^tfe;Lr߱_w&VsAOMshO^$Аm+IDr1#u2|4TKЄ dQX&\}xr0~߃&QІIʛ{& ?&;;ʲ"O4ݢ*^8^chC+)ll@G}IFܵk+ה?vI[ҡg˭uNc/r4$mAF߮:C k.7Pvn5Yg ?=ǚ+rD\pg)IE>w.{ܵQi5 -O'" uϡvx4~È`߰sM j|5E7l]x|8+-'7~? ;ANTw|:̾gx=xɏ#BPF]=` d3u|5^G jؐ*Gm#`Ԛ=xm",F+ewI{@"9'ˌ =beR/`{Hp8"tu6# vGߥHO\w-ӒFz+rX0zK 6Zo3Ty 5uyp'2[cJIjɏ$t&-kg\,9(>;E?U~lJ<=֏GF"5-Js~#uݽg11HBᮆG1`ޡ%/vԟ7ANyS87,.Yq!p*'d>ZXwd -}Ϟ&\?{d+'!E5~/7ߛ,cmՏ#|Zo]'i7iD&C]iQO#۬O%M)$gyփv|^9 +I'6+= YAv:~ +ix6#SR?\K~q% Iy\و 0QۮyfZ;Cq䣯i,)-"A:a8>U4at-="V53M_{OehZ;qщC5kSC@\I%uG8krд32WxFƏ^P2ilaT1u)">oxk<'M{';j9$ETL\B*50 mCc5X,RԿ_LE-,_^3|>O6WdLJ8mRi/@qM-}50Z a rERs2-1,j#k' עfW7wA:2zG^B7YspBzނ%(jemC+!YO` +>]X/oLÄzd}i,$ ,N(Bv[s(ޖʜagYnQ=\펟z>D OFтuBM2kKHQ/FPQjj{ʭO[^s*@{maLk +qS-D`_) ۉ٥um}#[D ;9="s#6K oe}2==ie"˷+[mT֡u ֐I~5W޸ fE3-a.E94 {e9yP2%- Ϫ5؋y8qbV{]`og-k~!hcB +ļJ +'=Wjn ~s ]HA̳ZQgW=s96$޵OaH[ꭓgf'=o!%+fsG"z|?='BGվ]Cs&Z +Lp<ׄ4֒nr! 6G΅g6x9:fH ў_vlB$f˴'/Jڂ/s%kǽ$u5aH|RЏFbOc׵}D4\_ v5U%ݾ`y?_k/e0zMϥr|xwZL0:OӇ(},.e Vdcx>67)#lw(}uH̛M@j Dsoq}e9n]t0S x _%";)5knDƊއl 4E҅4,!(cS5wYЅ Ml|rؾ:J :Gwx)覧iw]'%HM=5THV$0o +BnzdEMǦ+\+(6k݅` +Gx8Z˯eüBzj`˙kp n_{O9[jc_y A_g}7"1w[кݻq锋5¯ !sÂ|^A#h/:ʒL4"=K x'c_bp_{ceAz| +ZERj_ڻIR˨rTZ12_0Po[C8F6٨"%LGx/Sy+Q2]4Dv֕  t1ƾz&!-I{H㳊qΖ0Og`4 cz4Гχzۛd'E;Y@/Y0ov@-r#=Z_Qp' +Cme"YH {.``\S׃ZJBpE~znDoЀn,zs飶f4%f4~F6"r RneyݹEMA x6A]oI8zV_Y06Y7kMr9hf4~5@w[cuIP# ʈ3P4~?aFgyd 3  =;%Exh(͟eФ5'vkNۯ^L@-uOrRo\:jgiQU^LbAOՑ;nFiC|U[p~χQŹ Qaθު,-P`խ}x4жGۛG1m-6WMd_fzm6G·.kšxF Vg`G{ښjα7/x١,87"$uTS]W"S +[{ =q_oa~`񬱦In:@GUA\87J^ce6t q_("dHy|txss}UiaN>'\[)Is,o`ߴ|*<=b?I" e26hnoi(L8ZlTZĹ1Me\"rꆻ wxJ{;]H$(W/'1kpNOsi7[zZ%Dx9m@i qM;NG$d!Cja&&ِPGiCeEycn^>~[U$Ws2 o^),aו;I hP@_߁I'.|bRlkA1g>{z{͍TH +p1- +ohC2dJ>2voxP {>O$zȷd=u BytR\_SY`tp:y;=5r&F.gPٴZl|_z׿[ʎ=SR!x4ζgM U)se_GYߤ"/r!v$aY p~-c0a2:>4>1 Y 'ԟs}/'F{:Z[je''ܽ0yu65ڢ^IV\ p7j8HCI*:Qymp~m:ojPW=$O=LFGO|MXOB.h#ͫ1 P(}R (?u=1LmT_ Z 6+Ɔf[F# īoB94ht $+BpB!_@hŪgp]~0!.vDՀsOu:| ' #, ޡPS-Ck'πwSuQX/H +{OGksC]mmm}cK[Wxf53" '^C{Kw6Tf&ݏy=jaG[Yk*a>nv(xNƍ& 5eP6vI)nz>ܗr*@ z:Z꫁U4>IY-ocW`?04*`4l)/aAy{q>dzey"+8XLxj +Q;F%fU6&p -:,kZR(+'b<6w3yhGSUqn!/r?~nC'g* +ySCMi4e-C+nO/inAB5~Ӿ((C}]g&,22*&>15q)d݇??3>+X3򣆺.$ǜQ`潰oEQfRLDlXm7ܪVQNr53fߝMj*$oawrʺ4^쏡 .s a5V>xw'<$+AnDK΄[Q/? +'OJ+k;zi{PwKuQfo7=LlR[$/-Jy"DΜI3?|?4~z^S^G`B{ +0+hk)+|we?S^g/\ YWHn7ge0Z񬡪hSSRe?.;G(Y%ѾڒΟtiEGc","ʴ|gLXhV}UiAVjb|lTT݄좧w+r"κ[تv +N6$*IPc38Wɩn4;u!VCh-CArxȈ wvHeޏ |^Kӝ;vYs8q|HGO009ハ_S_ vXqfׂ]YT586Sߐ [ bCϻ0ܸ^QF\TRYF5 \3 jlP;Jieͭ8\ XT5v '^@)#A{e`~瑃6 6hn52}`zxӺ涮a3)чd!wC=`y(΃AU:{Z䃬YPgcY2c3#RRlLD=%rk6l2=tk>{R^]@ׯcF^ۋu rg -g܏ +{])QX` ڝ` ?clSyd@(7=k{-aW !Ie J)Q] 4%y9Xia,/^0XF%JFESoaBoML)M70pOLLNsFLɉ x&u;;}NOsq=ՔCTTTLRNYm>5!9O>&1x@y]hԄ!zuocia!ИԂYl_N!7Qfef"e4#PK2KȫjoiX|#G9U ͭ=}C## +02.z;[;GBc{ uՔdDyW +(m@Yr3&!%3IYU]cK{'|FF< .l[j- Zgv}G}.\ y7!9=+GKk[; ;z{hVEiqA^VÄ;Hϡ{̌펰†-f/ḼQ~96Pu/=r"\XH2YRF:8%™9 5 wYw8{104VdLć)iY923R&ޏxsomjZΰ@n X/Xh %yTp>w986x3s Tע8H3j= 8|O< +ض:U`#(n`}'(&ZԄi +=-O'߹io,JGIƔ!z"kAQIy5=]V:=q#cCw76:͈}N8oҰY~y.\J\%Vcv=vܽC d9y B4y9Y)܋;ژlP`eb``bPپ/lͶBA];wd0m`Xzb5 +270IO/\)$8(ʥ z{t=|p zgPh?cB (!J6}+ab=HJNI{0GiIFݹ,oO6f&6i[# |xO$Ҫz`RV5B;7Nܨ$˂L1@CԘ#`,*!VM[ws=]s;y봷iS'ݎqq@g*g3Kza&yV]}&kVX! 5͛[pjIyյ6m302پc.SLvnbdMOwJ2WbwvBip-RLJNqV,tp>|8@qagv[4O\-=Xh7_ᮑV9ot:uvbNY=bo{[kKGۛn^+)||o1[6εOPd44ut6"P۠Vi8]ŎQ,!AN!@-cyWIH+۠y+]DBckKs۶l,i_I`Ӌ/r^iOPü0|}4'/g+}598jtiB1S3s` @0sr +\%&!%-+'/ت‚ܜ,L Ύbz>g$D( i5lڼU3 P0ߺEWGKc,dlT7\HLJ~DE.%6_rFc%Bb +ʥԴtY9V  $"",$$dz; +-H>lj,6? x[BC=ue߱IERcΙ~{!B{Ʌ!7}C~0}@yBc$@P_ CvL$Zʲb܆'/ᄎ +_Nt?-Cλ0ݬ*-DC9QL6 +J*~9?t41g(Ƒ |DACx;%cnu)=+*u}Kw:E|u[aX]0:+X&@↼PPPRRA-B~Wxg݃hKD&DA3pl ;f j/\yHWv3|ht铬Ȑnͷ!fpSH y_D?-X02 ޝ3~c? 5H()[HA! P; J$N +^GZH[֕<;+b6oVf̹Q܀$h<? t>N?H DX!yq^K>VƛTV@s<>i +WnM/E +g`mu)JA6"-?bozo"=[Յ[qIX9{kGwoo8tG2+D"jHMef4m)R+4ulj\kD|El}3~^]ŃWwEv>/HzT. +;`u.Ӆ*Ysg߀rB3=?!^]+LU RNq!_ߺ =XR%kjV Njg\y5ivhbdHN~%F 6:l.#8Œ'#Sguaa jL9lC'?c`ċ0#2t8{frtlR5Vk0漢y6AV]N~iWS6v=]=P$R#o`pp]{wțUKKHL~j]?6Mwǁq$'>)53W(*^wUjwh+omU[Sy0'#%L~&NZ{֥r̜"q%kD +T$NOǘa贫Y]aFw@13iy¢bQ YgOr,-$Ӯ'|mz  8v^w$hwnNs.Œ;]@8;/(8$,>΍+/aGE0B|= '?aF쎈pg+3C4{ 9|g+DNdW7kz5Dw4H"+"ZJbJE>Gmv 9A[M["^+BXәDV {l(JDMq "aDѐxyW4g0c(0kJǗ6h'm Y¶.rW x +endstream +endobj + +1259 0 obj +23038 +endobj + +944 0 obj +<> +stream +x}KoWu~ZO3[2-ƒ<K$ԃV;W Y/Jn@ 2y)C]X$T|ڵk&l&l&lvw/v8oݝeM6dl'Ml/cusdM6upN1G? {#2M6dmHכy><^V{okCVw9uB&l7e0+\툚?F?G?z >g3ɅeM;IklblM=lXj/|Q#K*~L/wvrJ˝':hQ3F ̍]̓2h<g)@Ǯ27;I5>&4. +lv;v+ =~36H׿3WDg~ OUzt&9mr1:fnUZkxe2707376w1w4w7bM6푊dZE;.ϗYYI̅*ss3qQ;Q5nGߙjX/̎3;I?~q@U\6d-mTbWiiVmQc aC0H/X~$i҆۬B.qfEgLj*776w1w4w)Úa fN]5;l +rO\5N"&l[64fVTlO?yO0K*w zAT\BM @e3.q;r&ef{Qm +m ws!\U6D. <&>T a{sOͿ6;`v\ev=fWw ]-T?5)GsZP*..lmωAٞ3Z:X&=]$E-Ԝzs83==G!Epd6VKl=Jafmva^-[REM$D:Ute3EKk@Ay<_X&ܙԕ%0/#C;MQ*=D gy )#p &VnQP_j|wGƒA} լҮc&A^zr;)HieH۹Q e͐QE%(D)%%pׂk疽[)&YB9eoN:FS>Ju4HNHM]H{5^`ÒTZO'biCb ʗOu."K]x i:$RbWûk[MJ%:k@OO]ADIG$r5. V̋FES.l7wH׎eQX8+ ɑ\7~dovH{KmXpG*`.+ErO;f!r @ܗʛܓct*J [=w:20{PUjM +4"(*©z?LENLle^j o +jĔ/P 69/6NJ(=whk>NQd7TSgF*΋7Ru*sbox gK<&TQ`sćckwnr\˧ck)&4.-.! `bl9еjy, 6ׇ' G) ɥ<A)_"LrJh5~PC&h @'Pc.PP0A;_h*[̗ӊdOMN{&J|͊gi2?P!x=w\[zbim/RQ~*ƾvFI <>qc@gd1l>ɵ;v/.ݖ-pqͺgklؐqY.Ԕa8H'tZO)񟀳a.Fxv'Jjx[٤@ +f}Cb@G90oܜ^fpfOO8Wh0fiAɶۦb|?)vƮ CdNښWe865Z< u c]P#b \;3`]arM1䯐)`~&@٣agm¢hPyC=0%Lh-ǩaJ'$MvK≡~lרwWhC`1W'p=a8tt eLܔ8- iAґ.VmCd-lQoU!n_8ҋֆo!5n`ǞapF@8a+@!Dq~ZBU5銾\~2]*{7|p\);\Zִ:onF-ȵ;i<,,]Zȳȭ8;bu3Y;*k2$rpfxfPȏx'n - ϹwS ׃<>}Ky"l7y$bGFG[Tgkk|)ByQgh MY` +m +WFJD4`WiѕP~:* gMdL`} 'Ђ;nJ *X!NsKmm󳎲p엩`5hPh\ԃwObI !¿ݘR.yi܎!xCBKsN<$$LC;!sEq8@2$j"^\niW-3pDoS¥[@r2ޘwk2E8320ެ  q{uOk>qC F0gQ +3A+}pp/txfJFqܛ(ݸfe;j4iux YUOܴI4 g9FE%2CӚgIJ;1]IXQdM3ք4a%mЋOXTTZd utyrxrg&襠y +):W m3X) \z," >ja'ǔ\ep3uv0`3hHXOR sin s)'!eP&۵o_pIL)m-U(-O~댘K>/ C0"f10ycl }[q){$kӅ =/[16P4.ѱ/x!hy}Q1ig'7߭ٹ-}Mu4jדo^hgɦxfE#n`iV(vМ>^w-OiN ;NF!U2k}o69܊"۵nkL76EQ6`L@4(DH8;p{Ңm!Jz@`oc\XE\9F ک+ u#M5)a|TS9Tn o_SX/zv pS:91{Lτ381V'tc $d~5 TD ~j#蛣v]rlمg;J^.i}`'|.[ߖZreNk;4m&'{}|=-Ci[7FvRO= +[Xt{҂X!6=w}l6 y-UޝP²{݆n":Xlױ 3vltҷMm %~A `(c[ҳdXX'c Xz L[2n| {DqW%ŒF,O2Gfm4,D V 41ϚƁQjjEebiT;hlVУEMQA݌HKI +)V3eN-> Ȧ0z;!JwLڞsn_7(= )rsE{xH&<Kݧ>!m:mLI4~tr!C/.](}mv_F!L[{1AvCk\gu.9p!p>vy.I%Pi$Ž C/.87\HRj]7ў^ P +*{lFG} Wew +^.lCUگ@R]VK.;]Cv]ҿ7&6Hkk9\w#9MFd u[:9xv@¹gÖo%DoQ/\,D2ˁ =]ڨB{f ^Je߭y;WmppK@ n/(Qs /}m6$mg{1jgkUzWy{`Mߨy~r_xnՒ8cl cuM::)@YI8<5Mr,ih-ߑ jLxo=-}Sxo1 +۟ƽC۪H +d+? nN>`2Baǯ35Ar$nZfͷ !E?lDݬs/Cc0cOo~zvHvaa,E_ϸsHJ~bUK~7{;AH/!G뢷ym(a釿YeXэ\Wȝ](W5<' gx ǚ"kx\$ k QsWH>xxI{ކoʼn?ò9H,2 SzlvgN4)_~\OdR7[''-8pg/S0NVrOHU, +m}+#l"jL$39 b74vcEZOrp=[=O8Do>p@?I`BOɳU3v{|DBLI3C!{F XsFDo70{y[J~#?gVڠ_ ߗ; u2э mir|+lS9FCZ+y% aUrS}A3>RVy"<%r$(_Z(Lw=ǛqܚFZo k%ЅP bEJ=}WTf-CKdM!LK)ek[Hݮ(}ἯTU3>PKp=:zxk>ry{cM%L6׾ k d7w'z7)W[~+[Wv nи59X߲>E %A0.,3)պS*!rMo֍%m\M~u" #|>~feOf]} pB7y u?3Խ _ƅ뱎dtxYXN?. #' 'M{Ι)13lfum2% +&L*ojc0jʏOQVhTo n=X.u6_7/XGl˾U!{oj}Pd>u'a^=n7y>8d ]% +K4 +Qj[b +op>YgTh{2B&!&ωlZ6[%t.8Hosa+x`?C^yϨ90zֺq=[0J?/ؕmBio8%+L݌k'~ BDMLT˜;psΓެ_ -1S aAVw|\`~]8C"vk►}Vfjᇨ[x[pPDQ%<"? +hN>S05~-(?."joy/^J̜G;u}M ݃{0]|ih ]$60laTi,. +r;SqYj>MN:O? 6M)N e~4O-0fRSRХ6{}O@Anfq/l9f*IuK/ySLUlxf{Gqobtrgo"--?~-37iR W8  \xl5аt +K]PЫlG'c +rPC/^bm~YCr + 1B'l +<ɋ1yϜiL96g'$w+8ek%Kjg +aInX Jf'Svo#̽j:i B45S(w ̱)qj efA{\j0:)~EC=f)W;K9⡜9\y.V>JsKϒg]Ó?f*'~Sa"-lFI5#k fs]f ݌ Nge>&zxe}.ve|XW<ކ#.3vJ~ɂqIdp8TI4-45%RT?hBNu8pX+it12dN4M_dB{BS ]<-{g[u2z?g[KĖޝ Bgq-U#sLѪ`r"j5 +$lW/AN9.ܗrWxP<4xb%chZ|IJws:c)-\*4J6F- 3AL,K?Fq) ~/,ݑ(iIxU˲(`j"姬M)#4B3q8ᦰ5?»Z sX cVx4̴5 c\[ x8ϥ>@֊ 9־^} t3T3BV|fJ *eFυ?pDL,"2%G͘w#sլC;p.(;Da͓`_sVfs^(>k'hoP@p9I;L3\NBLI,m1ln8*)E;^q>Ч%uԓFmJLۑI[ +1\;9o R`pP^/'sh[sLF~J1!psT]6B=T:;X~JCoOUظk߆ W0[ޟpL \An,|DoS{-;]`,½~7T(ޮƣw6hx;}ܿ0*JmFp ӢrewL$uo kOs?pګ> 5}wqNW=[6AH1>ѿE8Rq:P= bv*}NZ]h-) +=뱃Tn(RD7%/R3"THZ4i@IQ)yROA0eFU=-!`u'T^4'/F:Pf˅=ډ5h&_GPWG>[+)L n`(nS .r16shR;iO󋛅ʹҮ%`G/mzY{P/2T}T۷&skӪ%ìk|wM{'@a|k79?]Əw +M +vgrkrg=}ƑH2ӧuVI|] ԎrOo2ʝ' 8)^kU )t>*f& +qf+Zz7 ʰAdWmT]֔.<χl>5FGƒm:(5khG/IESQC8k4,0)_˜Xz~ޞo|D3> N_}]\+ IpQ$@ʼP<R E3!'.| &UMJUQl/}2`WԢ4KܝJ +oH-(׮C>_YX=0.uv2e7:EsF-R'3t Lpj!ɋ`ON6;^i>f d` h[ \X {ݯ8$s?7Vdžy?m\O;'9X ]%hmr/:{)[C=0+$橜튰Uvʵ@ TFq эoc_Dƕ0m}حω0m;kRnŒa8C5V_MRt/W joI:v&Rx <ĥbMÐ7&ph n}J3U9nȼ0_%c/b @6 ) /"4=_ ŀR4=Q + F;( .b#f"5$|nM&3Ξ.CӴtKf_y.eL6Le.!FL{N](_l!{SՊ:9`uIА/x9O +; ,c,4dgB؜bvU^P0i۷o'òlRa(fU^_ n|5~a3 nB.nٓj($,ItNI6BܶL/z6 @.^i5B@ >tH#qh{6>MQǯ&F'~yMFF QnefL"kwGYr\V ;𛭟8,YgݸX`9nUϋ TVAV#NuvXNfRL5|$h5Xsb9‘(5@/tVN\/`'#(E`Y%pVWTChx/=?5OnCÉe{6~"y֩i )y&tTp2o/U@ !e<{R0P2nTlL1WUP?7O]kQ!p]9+wP6@ 6l$ypZ?~%%|w?'][{pr>U  x>uă\ Ou!$p'4*,/&YY<%'YՃIHOF?]4PTt1 )›v7dS +u([*kV:a;@ ppDP)waݍ͟U`Myr{kUO(WxZwT"r΢[(S{MRSH 3Y4;x="FRFDwI;' F5P$ɱ&t}{ xɛ~"Z7,(nk84(n>By2(ut=rێ-n'Ϣ*EV#2k'p) G=o +[1T :V2h1Xm'a9Ye{#M.O?ao@pQDDl + +o bY^Mkd3k|R4xO ˴|:) LziY[qYx|=(M n4Ejc3+܂&\>x= !"ο?.@螝*CmR:Sp+Iv~)6n&;AEJA|ZЩ î7Rw=X qkle4gޡpK s@ >nt{z +4턒>ըf{a{*J;ْ(\:%$>WE7B U^Pl7xRԪ]̔GreʷD)rט$,jnjMO'tjI)E0ۂa%]T8_ TD76N柬d#uT݆ͱ#fj GݣwK@ l-̶yhrQ 9Ie!ۏo8!=5_ԭ4,B_Ko7.\.oE-[L/ $rYNwI'೚aW#>yJǡAoFyhYXVE̾r6T?x_ۯ@M˹Nq8MYpѐD:y,J AxZKjjlRx8͝+UN'2E8!J@X+3W~A Yd c5!{Ljn0oa`)ߧ6ݰۜJRyˑkD--ֺ1yYO ll29`kAS3;R M&a7B<%J7h"NՍ+(q usw;GAn@p}tpDgU6j +6g W0ل+] j&&* +TJmX?n@p *lq`c/p tzx*Bn#Ř^4ܱ֍^n@pNݞ;v&'qv +L >(Ѭ!n&Px9nOFMJh--n)3LV:KaQ!L{Mbm*gZKI\xb(Mf0λ@JnSJkP@ }ۉa+, ::Cc3u`Χ.giRU5LW8DYw-~:īgu u ǀIZXm1OwJYާy=ާ# syv޻B*-d֝*j A@DygaZL@k0լˉ^Uo\G_P|gPރ`{sZwDMSP@ 5@Q4aVN4UC&BջJr{m`xNPx+8dIj!`2K^k. ۯڪ6V8ZT+=RxJߩNL'E ;ۥ]#:L^B^M^pUCǴvxW b+CXٍDVٛNWpb,GEZ$+!7>0TB  녷pߞA-3Ķƪ{T0f*ֺ?9u8 &8}*pSI$uHo_ ,@ U|`(Qv(.1m֎>)kÜijO/}6|}nz9ѿR# +5hɕt"z DxKi}tCsŊ neV/ܛNO&W8˔ystC0Vpr"(S:(8n { _ 29T@]gtL>}5̽q0o3Q¥:hl`x @ xp;&^-),x ~睵{m3ynj_)Rcs:-#Kf XHOs>0DN7'l ԇKURB޳N?1uodosH!Q^ Q><&}΢O_ n<\lNϕSpjT|>tN_Gy|ao;hI} +S4 pR[ l]h[2|İ* iw wW׭hV|2udod[[ \'^IM4L\9S{v"ԽMJn1kᆺ'z`H8\x~R.#`p<'Dk7zvRwI4mrR3s" +JOYg"{Rݥ ukєgF~o@pEp:]Ѩ6Uj./{z[f-]wq!8c%%FT^Ö^;UՏ!DMj|u{ > ~f};O^>7HaN74 ^ {K@ ++*Xxxy7ڥxM{:ON~/\K@p >ʑoSۼAK~ 5ug㢳k'/<>:D20(iJ+;f<0B]-8c~~^x6 >}l;I4S(; }])"+ a!j}I;4E<BS†59˼NeVW̱ۊ'l|vvm'`*>C8 i} M)%ٕH?[2lc'C +PeYl(\=ҷ:jvtk(氂v,S]٧΢*v;[ l1p]/l`Zv< S6Ii~֣2O|牾 +$c1{2*Vi>QHiT](;?,ۑ[ lJWlYKߎ)v _un})il:V}^I߮N$:~SIWõKn@DWv_ۍ`|}0Ly'W<]M氒{j>2aR~ -[I ڧ* T^Oa c?r;O0-94UwfM[CpI$nKB`PvQ2 sUiH%Ygo4J ts.&e1[lJgZU'&ݪ[)'9;!GI;VdS 0\8k 6ZjZGW8kY? +fvM)^p4;oY/18R'Fºωbn!^+jE9a~0{=f}RWLЇ: X6Edp@pS1HTLMxsoc-{ _ |4{d-(/{OAo  +R& Ppe'9vjMt7u4n2w9LspW;i@ F7)Bkm'eHћ1EB&k4ze\V^f²l'/ [熰w W-.; +\D)\:oL ǽC \ \'TNd\rwhQe>ZVkTgt1~m < %]kAF#p+u +G$zG,NbNf>IW) HǫYELTyP!s8<,,cF$_I@ 8ل9CQUf͸zuNp'9/4pAAOV>MP@ ziDAP6Uw%9 -4N<= ȿsH"bL4SpF'b'pR~ E(8qKv9Doh?^O@]Df}qY\ '1 ?KW3of2xڹKP`o;˨$->'›KJ;ry&5K&)VdM7Vl*py*:pDop/ ޿t +39'bڨb IYl_N6N}>ml*4zژV5 +'.!ao@pu\xPEYOn_o =&H(elΒn m9`r@,)ˆ0iRE".Xmlnz}QSͨhjhK#@ BG)CW=;7vY`%( ,+mX#Ybo +26w2AxN"e { ㇾ AM68-j`AK+!`ɋG['Tbah7.eDm@y raBܖi +oTv[uW/ ]ȗU*^B,g(p 0-^֪8?أ3T'| Ks*19Xq 5I*å~ z@ ;S4Nf2)R )݌Dlw}I6٫ޘ3D7I7 \흻N +o@.e3o|ne +( FU=XT=yRaͭ&\xlV61taN1RC̜ҫBw,?C+<=_.CecݍR&Yhwhr`/ـqzR &4`$rx5 +o!p@)A0KR<ӵ{JְXy|oL4-jU٬'$0.zas{&moi%˴P|)h&!T ju m,z=ͱiGxpW¥0{Su._Pap..Eh AѩLp.jr$[4Og\= œtr-UH-> ‘2*(#'h<`XIVYYjTP3LVlsmMh@vGPKLw]7ФD |$Jۯ9;s޶-);I0_LP3aCf&M"=TIW2wS"O no%L$wSn\ +06Q+=xk&6M̳K]}S`X +DJn@(- nM +8~W/cMR̈́6wbo=0UMӄNjpRj_@">t+u*SPw1U'*_!{{gs=kjܩYc6/ C V΃HK%H;i4cOJٻj efb4{}OG?o6ޮ1x/@O" +{;0ݚ°P .;XM+\8#oM&L݊{zM-M&oJ%\3~-f8Φ boE|s0 +{ ;tcG7ex1w QUvtv{1uD-&@ jx$.K2'P>N{N-³`ß_Cvn[ \Bގ5 kwNF@PW +3uondrKnIω@ +vB(5`PrUHt!hb0gUO˔wϥ[ |n.켶4`/9QLAMZ +Swe7.lԽ#}.Rަvk7F9y)۶j0SOhB[TK^n]M>+{Q24jO/}6;Mx +O2l2WW[d6]7{;ǐCв|vA9˽Y7z7r>o@Tlgo-eS4fxޏ.Ӑt6YLʗ_;}:X `c Hߠ@pvTl"c0/@}#00Ǯ6X44O0ZK(좗@ycVu8Ta{Q@I26@KXwbtS-[z;(@o4ul)x_*ߍc&>.&mKԝ( Q(iCDUwGbvBuo {nnᒤo2Raēv M"P` BBVc83]qր n^25œfK&__Q-ZhQy$}{S-p|Fighqo_p  +pїٖU~QjX%-P=WHぽa^hJqՎԓg0Ւ &k™'4y钼Cuf:Ou%.|눱URN-߸|ߝ9IyHcsWgBw 2Wj +*Ӆ)G)" +uvɨXb6\k_T叞|`]OlLǵDon3}w ;ԫ tx3 G&SkA%7L欹Sj,z-8(l<{.WjvՒ; 6+P ]BɃ +`=vh<[q!ߔ nU (7zGIѼT7D_ǡ]a>;>իrR Ar[*W+QKߟϿ<>ja~.VtKJ[W|Kߑ.,o %LAڶuQ]Du6'?ԙTP> ~=Y4/F{PrZxkFߙ~koRS݂]Rzr4}>`4~l=H07/ _\F_.y6N8iGf2.2~|ҳ2`ΏT]Ƞ ]% +XzyY3*ars%'PJK6Zty^#@+~b7w*:vmrYTfezR6͐Çw ,cƧO̜ӛiNƗwj$TrI;N-^w9Dܭ#-o[5_a-%{nv'' +XoM ;<[t=^]_ y{.3rkk!=]&: \DƔ/`KX'$T14zjڶ1,iJ(32fo w^SA}dHfUfT"%mVpީgL\|mAk6##َbv Hag,֮gM] ~/{0<2A)EWkjrg5<ٱZ_!XԤݑj%FQMާy!/ 'Gl ^fST"%m|b{s[wSW=G?v3}}Ym7_ /B:4qDcÆ2Ԗ\';_ س.]䎐Hk軜wٔls 0!͸e,Jn<5w|evu,C/1|@zz20t]h\D ؅jQEe25߲p!2\"Vweӗ.~}}J^<*ՈtQ/[q˛`biC):ZVj%)]9p56H%k>YcМ7u~۾ގx[lfw_ Ggiُ HMX2稆҅_Rs߲ܞFwEDO Hʈ,5z|R0+<}_U{4]ҹ +|KI[ZCU[2| M%}7 ')1vvӑ]}bxC4_=+Xy[Jޜ~'$07=|0]dSh\}{SeؤA0t1_Ҩ\R_ efS}+;>nx\p`WU ^bx;;x~Ewе8(6kmʶfptb }ÝemEZĸF_@h[RhЃ CtگsNi;~!SEُ2#<^ğN5+&-`cBbovL}B4TH[ls}{yH)gա4Ԑo6lpq?a4v:de@@Z|hQ z{Ml%PVHeG8дEsuKdS RGbާC%8 +/zCuNMh%N2Lm +#闥ZS+"yjYRDžC;x7 T!oF&Qm2Z8P$&]oAT@{}﯏6I$:5q ,/GL{sq n?ن@f0G 7Em @ePt]S0`4p$MH]qhs \Q:9@EP3 +רJv yGqG4pKJA9z- Vהz)>)YϋՍ[Ͻ"I'ɸW\ߏ(({= z@IuHJuzMnk텪E}Ce~}fOcbfjnZ)$?!޻o\BT ÛL2_OkeW#Wfೲ z >۶';{%y*b͗lq-VcMMg_}ZWOoV?_y vZ$|7RP|S^%!BRU+zV)X6)0PiD e~<~'p]l͉Uck)$M^3͇^lS+C6O<፞.ӎ.=.xxcov9V\!&X&zPò6![u4cшx Ƒhu"'Lf/)$ #B0lr/Τ}@@#oqi|_APȀU+WVS,*؅W:<-G+~rLJ|X!.kkr|SݞS#E0ιڲ]mMa^6mI3<:#9q vE9GխDJ/p?j=.{$k4 @Φ fdєnpJ)&F䓽(lslxTB9YFxhg"Ӷrxd׏)0N) #C2p9ǖ`!c`Foc0GlE!asmGbU12C':tYkKRʉjV @M SόɐLaҴeCҴ`':Q5VjEu9)54(PI>rҠrUv!}9_I#ky θ6iŞ[m03SwށOWEj6M_$7oW gz -JHwic"Џ*\JܑKn,"ÿhC e71WwdMpAOzGUYUlF&iDf~+@yR*Q[qp4$ +xJKcN\K[lCmO"P^5^ qTOCEBm|uXrMcrq +)th"WSwqs{‘Ӑ6ы>.F_Ka6E$o!b2TRl.DqY;E0EEhvl5peB୕%)SCFIU5Y[gιUHJ% +F|HZ}$]0AemȎh1-v =2ϾU+ވ5 ]\NDdYBfS +rC &%qh%GG(Z^[r;FN|=,_6=r W i5 +or ߔw + $閧;UpڈTI9Q-%n0ʱJOZt9q*R3 Z:mVWz2;-&P2P44}ɿ?f}hQ*za,^EݍsZaU$#> ^<: M 'tvچYIFLjXx:]؀ ͪ1@Vӈuru܏16PiZL =ЄIˉP{ۤK_ӹb\: +YD8*x3ptD Qxl Z)!K!z~$F[&/ob[*N0ylL!:zeCol~}ơEmuMӔGhVd; kK +nKqp$ؐe@WR*hUVYB0|֖3W3SN ܤzUΓ̺ p +n9p#s"+,^Dڈ%2X=1Y7{ctY8r"|)}3b+TQB^I%CRxp?e?֘Hu +Me/Ld.(|N8J ,YN7z֮%%:<~TILT hCعuwn<|1('A_S#_fon0`.. qD(4JQ0dQ蚽&ô %`ť Jێm'.hLtgTY&^Y4P6JwuQ5:#[nVZ|NdL?И4B|hjm]3i<13eZ5wpDކQ-sk*J4Z ï/%+f\4E6ɠ̸lAaMdtL-jy 5~-3M+qn۬)'1Zۂ۟>PILoKB]z^|_|EfLbQR(EoUhV*("AI0ё82Kpڬx_iS+pAV!X_d2[~鰰7N8|}|uG# ^Β2ջXK:Ƀ3JdIyqi-~mtaHz|ml[ +=!J)a0VD J)ʚj8u`}_}A17;NBANJ5mz5N8!_6bv)*~й,Ns)=]NQyN 1)2GIctiC+ZncY<qrɔ8&?z-m1@2laNݲH/^E.U\ "!2i?YI?KWwųo2}IJ-2000  ˿^թt22Jr5* )1Zw^Jx(lhK)f+Z(XuM(./sr]HɼWj\M6e^'38nv?>5a+\J<+\k]zh*ENJ4`;-Au jL 1z#mN@{ڴˠ:Y"7B؟ǤsqZ]`*\s8٬ܽ>u:44*Ly/{0)xgx'_J_O qd׌U@^aaѼZv*,[ıbbFic/H*wl̷6bIKmN\vmLO/XH=5D[2'c#r/mm#T6LU̧" ǨnŽ_:?d Z ].ד{gחOҽs;t]Jn߭`0N8Rf"HlWsըV0aZڅ;\$<#C]1FtLtnRg +N%XChIjmЛ[1)0&)ƕ~_t[:7K4wo{*[^Ѡ8`]׉R%8|mu8'j0.~y$VDžLwp h(rE˃훲r5Sx~;Tݣ!*[:qb'1r~wr~CҕvrhA Mm)b˿х/*&h-I`bޤަty˕p恜eކKciSzi zЏ-쁖B/bBi@{=Sɬ@|*u+0"CtCxUƏ18y-d 3[Q'؋/?RM öj%.RA)WeCװK0ymYZ +݌ާCaz|$nLd0?BZ!MG\R&.KTS秨'>-+A>w'R,wZqԌ6bY[ӵ8\)bE(k( Ǿ3g^ɜ9N. zp2҈ m9s_DZGFC}jE-_.ZqhxĤan{OdNke*K؅TqXǎ%6фCȒQSmPIF\ Z9Kx;Vs0HNw7r98^=܁חO0< ڀ1= u;o:l61\Ԍ#m4*銨)\|j!N^naQ/焮}=$I(mAqfdsg./xCd5Īͻ+E @!~_ h_e2Ux//O2 6x=1|b`CdBt9e۫.ʽoIzF!ǙGt0<됐n[+ tCˊn6f@6'=ٶUsu 7N^dˣ? pev:O~fGS&K2[#;\C} L!3KƙlWiCda3}7dqD_:1+n}D?_paF&K4S Cu`QЄl#4<,# \1S鞷1q-KAcyDᡈl&5;ttB *Yo:k&y @)+gPB6ǧ! &?+#XAyy;?f/tG_\AQQbRq\JFWx2 ;B9}mjZ.&?uƨn>5Ey=ũt*UH&RНY$0j+b~;>; BB-of'xNK0- +i-7j\p&!dG^-ZHpF㫗Ct?)ĮsEx䷈d}D8cX~Aw*F3Xl0s>d:?k( ^ Sb<^U2!8w0;muC|G^I}Tr?=@-)8%m)~\D@n0£.%A;qyҴ]{keT{T0:W,GHbP/fIj{ڛ +Pj!Dtrw^y_W7WIa_bC] %b 0x[PWOg3/ROr-`hƝzQ@n^fn'blDsw!P@IGãjfAL2tׇ~{ +-Q3pv|a޶a`#Iתؠުs3ǁT`|ƾK\Fҵ= ro;aJ ' V=D`Bw2;zV4 !&40pts ʉXܩxw6uԱ+#Nh +e[cD@bg!f]Vݵydh~C'mJ7НW^yk ,tɝ\ x'dPhn=\,;U\*lQwdB1|S eWRط+CB4Ə1b^НW^yY(O>xRAneB [yۆQY33{*Y/rx>{-5tss5H*-f7"J|儣Q)YNӯ ;'6e]^qS$vE&}N=YfnՋpX hxܥw䢋!Ӛ9}KKj6cR+f3rdAͲOzB}Qx+eھhM/vW? |ڜfܱNMo y>̅v3'œ څ6"m',\cVI'-zDZr +݁PW^y,7C(2R=Y>e;p6.XC{f~ýA4c]]A;Ԋ t#H-wZ[T*ЕűPM> kK>E7Ƽ+n%ep7 \BnCԝVp 6aQa#z[/?zdŃ/ +с}<#6σrfJ"wa +>WK+|*J+s Bʭ@?KG^¡I|r頕b8<.F.~,T[]nv9}q_3#| jI:O!c~{#"B}+^r C:T !`v_Ì~Qg=W- C5k ,z1sNTZb j}Xn]bu }^}sUvrnRI^y5z>a}plj+h]@oFAa 8lz?>WK:,c.nOyW^^᡻<mzc?ooA}7۽cGyW^r^'BFfmHnn z%3>~47AG+^vD$gø 7ǖ yW^bh| A/p}3yW^,-A/4$#v^y_+Y=+++d?_hA +endstream +endobj + +1260 0 obj +37793 +endobj + +1261 0 obj +<> +stream +xw@m_3̔i/ HCEB"eJl+Ҧ"Y<(Bs}xyz=<8\p7ig4m\gg _G h7QF~偄"#O9sΝ;o޼$3"9NH|~ ))!B~KIp!ł" Zp} ?㧤ZDMCKGGz% +p( 8d g`bfae~h@`, 8(0 )Q102sr.'JLLTDXH1/'; 3#-"ʅQ L׆kbBCr -=#3'7b!aQqI)Y9yE%eeLJ +r2RBy99ؘiiQRYY8D_*bjm]=5tuWk\$ &"HO/05\|bK5ViYk`dbjqfKK-@6]JC]MYa7+/"RQA J+Xo`l;vkg=vljl֪j2B1.71+ ,XOPlڊպk M-n߹]N~ &*"p™S.ݹuZm Uiq!>NVF|aa 5P,X}[@TJ^u}G\=\ +yAĔܼ¢LEy9ٙi)܏ tlj-kV+J/"pLf69!#725Fv;v=}R;Sӳrr+,.-ohjnimk~P_[]UQVZ\iVzr|l佐NvܵPw*rnS~6k$P0p.Y"LSN'x_~7̧E+k[::{z1twuv676T?/ ^Hmo2[TBhxv0|Ó#' 1s +IʩiX89y)VxL|JVnAIYUmCS x=}/^~=<<(ׯ_ ,45Vf"\zA;MFʲ ,v0rO8́%VT4 !UYgyÑF%e<-(-kjiEٿ}=$~-Yloi./-J {!rEį%~ټp%?NO Q4ʀQi;!ݏO~V\VUD??Da, :ښK +r2FtVV/fRϽ{=3E}'p@9He2-vV6^z <~A?Aq@`(~r8/+Qԝ ߳.woٰf(bXy(|* qs\ @LVe{ HZ 0??!"wo:Zk+JSE9}q6b H~dDFhf{YGx $@%!bdRXci;я -= @?Oa@P  y[^'fRIZ !͛F9XyὬD@'bRq ('25A\C4@%5 =#=68888x%hXw#aʓ|?޿}eOGK}ēw݁l[(%@G-j2H il&eW¬= aO +; 'Pe@ 1Qaa!!aQ i9 M;yݍI|VZU߂20& +G(@x5䠹iڣsN;6V]*!p26+̋if(,ݹ6Ocz4@:fV,(,&d5c6*+]onۅ7#s+@>@`G`4Dۛj^d' x-ƺ+dą;PNFfnNvV&h$kJ; 20 mBRJVZ=FO Quu&l IaYMS{O?dC`Z*Kr߸t昃FrҒKHJI.NZ0/H 1a<\h/+ҹ`I' "!TQU}%x M> Ó vp>*ҪQ@>H@@?x5\[Vx{Y \cbezLUI^VJBD\@=;6#kbHҿ#*ţg&14p ϋ]9vO`ff́ё޽qJV^qym "|zK2߻~Y?{2eyyy9zsMS]QF\b޿#*:9x`Of=Ox9{ѱ~xIzZPRQ֍dN(@vΖ򢜴7oܼ}74,"2 +xPj^7]ta'sMk(? ,*LsJZ p +(z{\v+42QxO> '9yIqa< O㶮>bV8u @04X '=QltdDDDTt̃ljɈ!~fyC6R_"쀆1?0 $.\k-x;S3s +K_9Vs CE%'```L(zyaޓLSRR3<}Z"ļ>JONs#1][6R[DK`O.9!3 YL`=w"bӟOs!@Deb$%i<Q^X\v6(-*}q'1'F:\tT 'ŀkS]5anfZ?WsҀ*}m{0PR^؆%N'?;Fư2+xP[V8"m5i!.&f<R <t 7C@b𰷫o(}֠FtcCEQvBuvm)Fj?MjS$P2q`w $=^#}Ğom +9/A=eh*~uj%l059b6i!2mͻz^ A@j oЃIi# `}%9/:lYR^' XJ0!5H (j1Ft/6)+Eu#v3i=d;7O"]8brYa.$& ;*l#@zK*[v?o&r«Aq㰀sGv.g1'_\n`opm3/f +B0*ʌ{〵 I2 + $V1p_07gAgSeAzM &q2.B?ANбp .QZn'.܉I.$On8 +&} eyQ6Q\Jώ/qt?DͻťT5`bȿ#`Po[ǡW=[FΎ/q dX <ҪZF[=s9$qf>7/{Z2vٻIOMJI.3p2 +|J6ގI~RTQd~3B(^t6%E=&  Sƚ2׼!ư:`Q1rtpajniuSG bx0 L kKn_:a$"<ԋ>;ey̞KHZUdWPأg/j[F3@"H ^v7WD].Og5oHR0w"v~IFV'.G<.lh) p#X xĪ׽, %DƘ25oPѱ+Z+8"!%  $=bkij"a8\>mzŒZQ69_ (jz baƃ~27Z3, L\B2ls301AЛx4W t6ܿyq۷Xl47߸Y._F\#A@L +:sޣ"+̠4'1'tۻa, y$ă0)P4ھ!3x? / |I77d'\捃]EBfn+ 8 I/oNCy:+$?s#ߕOgLl7;3-b?b<V۸ 1!GGplZFңаfLpQA^NF>; JZv:Iim[K<'aAc$Q&MMAFB #{ަ>@TnmN.߉,n~Ce!fǻ/$Ңgn\H_k}AH2}.oOͯhxC0!a hi*Kr78ilުe2p#dTr;Kfb emS##ARL@X + |: k޼NqڳdreY tQ΋hEVZs(&8 ï p0G_X\-yw;h=o4)_0pH/[wHLzAe3H +@fC01uïcrҚ7}ιuڽ|=MvC𹠈2xRI +K&B1?9ޏ3kRFܾwy:+dF +ԐSHvVSH<E<)}8\>歴if{7O27RWX"GX5EQJ9u#& +ߠ_gg׼W?IK smk5UZ5L 8H,yi/v[]̤}N;ei-Y+`_gasafq Y>Xk޺[ˋݏZjrS7k +@(xǡsA)*@< S(k = 2V<\9vv5JR¼Ȭݹ6V Vfۥ;KiljR_W{s 3)64g VY̴Ȑ_'595f ÞעS Zz^ +#B7An^'n5]./)Bhғ~k,.ߍM q~ DՖƅ߸|ڕ *1LvrT BKWY:w-: Z?xEjȞ7df~V;^nvo^*+>ك2W\Yg^W+xLS=o}O¯_:}n8?'b@ l;p&0*`8%_ o]tq6[BARy21 +Mw0n{E/Ⴏ✔lZJi  դF  7;Wqag¯ڳyǀޞ +]@fC1ŵ@`E+/Qߙ{iH s#'eZ!aϝ]o@[Ⱦc\=w~*0R!U-CoYtpBui^{]U߾;&`BZ6A@<7)0૿E~ƣ /WG+c-)AN&jIԉT v;~7xn8s42kw 3>`jeI~dGNdWֵ?u%01a*əՉvEx@y"Fȋ vK uҕ;^f u6U =Z 4p/a:QTA|f C =LWUJHDK'>h&2z0#kd9 뛭ԉhYR10 < 8Ġ"?-r4 NitHy BCHNsn߻ xrH| +8ue@Mfs +˯6%Bҳ־WUҌ!&V:L3/P +8E7ڝL(` :r=m3f@-gQEM#R k>#.$5řB.3Re·0r)Z8Dն"Y>λM59:1 =/ptG( HȪW-ϒ¯ߤ, FȩQ N EiAgo]&`@$rS@6BC`g}iփ 1X\+'=ʞ9dR!NwHvS@B6#Ab{͵Dk(`Op +MXbV]` ,IțIiE8d%$1+θ j = + +fhK#sL 2^#!HvuŬ4_">KXnюO0ѭvkb`*z:{oi6x#:V%ܽTSNM,=]@E#Yx%4! ^@VBþ֪+'6j+r1PM 0_@-$kytO6<ÿ#Qy&V$ (T;uN\vI@>Bκkgg:R xUVmwMܞS@6BH& ,)P0ʪjm; X->ꐜ4H8HCFm7 X_\N]dqO{qM]4R$ 4W> oٿ\*"r J*Xcfr>򆎾Wo9  MB^KX% +yuly>LVVߩKfE;TL +;akZ^rH^hh琻Op֞A|: )_U7V96xEdմ;UP^ x%3)(xAxEenrpS\ЎC@j +Ru=Sk^rK:z_BJ#yAr1"|&/ B@`c7m~BS@N"HїC%"|G&d׷vzOpLإbsEn]_@ 9XyD0|CW6=RHOdl>%- 2褜DH\8bm{ǿG@jy ietMw8u)~7h@B૊1n[l  k3"cHA)(z?~р<5iQNkT$/@P0p,Q2پOHt5- /|*,9D FaIciL&=MOu%}hR2C^Qy -.^95L5҉$; c +&.aYu}  B:Ԧ8>pq I +@fhـ.2HZ~ͧf +6>w7.kY lM \vw [NތM˯h! s:v # .|v]@JMo:!y Jz߆޷E_m4,b&;Ky^;=y +C6(:zTRC!8]06N|w18ʄc᧘вI(k>v!8:5dX!jdl3PcH *SxzWCr^w̅8.IND7$|V'惌֞oCr1 xq8ԉT>M E +V`Ʈ#LkZ,F?D@)ìX>Jj^; w!wo_"T$x YvT B LyV{<p4͋H@Dv鍙R0+뀬XAv):d. +@nXUxf? H8]PfՁ3̈́p\ߡt?ލ: + +2[LQl͇Yq%8,lkV."TQ憬_ o!pz7Q]u + V.N"^"0^սM~ ڪRhR0cH|@\^\1d*xחܺ~` i@R0uq5N+3VAA_GCy~Zm?6fzdE@fH9nR2F% ++" Ew>|RV:a͖}g+x󲧵9-:{r9Q^VzsM +ƤLEl9nxyq[+@٪S}=eOKUazM[֯TccX_AU^ -fW+ICf<;WK17٨&%HMֈ[HZ)ǀ̄\zz 9nAg:5 +OWq/rݤ"r! R '(d 0U :lέOS/:HCVnPfuR +Pв h<}։S@~" ?/Ea)cV~_yEcK}ry) 5j fG)": I^v(f>?6"St8[_GO,=$9lte&. >5*<_A\ΈV=p& _JšJ2(ufYg!Ț!|2i +&v0b 3]~>sÕ3^ %m]GGW6u 1`T 2k-.ݎ*icyЌ_I`4JA_[uArvD8&tLbH-"aflZ~Ec'q Cݫ֪gIOؚh ̞OI'ݸ&ר"7ᮯnB;H̀Tuv>UT܅c@.Br>fc! _NH'1 ?.n1 ]ox0akdQƄy,.^"1~0E8.+ɈL֪-~b1a>=b EMmG&1`P F_sQL@R%ZVNnףrJkZ^x\;.: +`Lu< +j&NA)U N܈NzZZ38!t}β DF|oKHZMg!s_`dI[}EZ [XfnŦ7vo(tWzɧ;XxDd:}n\fQuK -ŊP8`s>Y@E+t=G=#f fIܭlLLP(г!7c [{-fKd|@}S/Ǡŀbb &HQn9:;N Շ9XH~[Z@s)9s/fpxyv-6 j @#dP֤´蠳 K Mlg0zW 1Gbp +f1 r]vۤ,oabdDJAUk+1##3ƅ;W·R06fSWÓq +fϒ=]&ٔV@BfW#Dm#Œ +:Jvm(ʹ[+p5GO ߤ3sEس\x ,M< x%U!Ex8SEس^Wwv '.KР Ʉ[=3S@+:{pR sq3U|$ ZV;sCٲpFG9eM)$j*K<`RP&.u +QGBr]|&Kf>PokMQ惛.j~;[5IHDKIr_`l +p +f0޽n)yytF=5iAو0_;.L$֖>M rۼnRnIH  Pp V(=soxpjJAƃO G(/v?`&#Rܷx$?;!Lt `='! /Rbn^r?c 'd +Fvp#FLrlT.{iLF $&%oD7ڝlb)j[~lרˊbIQ@!,gfSBRW]-5vm_Tj&%F&U&}<~Z܃waP_gsu @VȉS-39Igl2+ wE#q6߅hRMU9I7/@h '%)@(/}xɲuV:mZ h0PQu @@`r( ZtG@C OFAWk]YA>ؘ#Nj G(F{O&U!-|zDyqa.af9IX$6!#<=C4 e1✔ػ]Mԗp0 01O`t ^ڠ +1֕Lt-F^Q# O АcE4V? +qv/L 'Bb%tGO^4tb/B0xd-uOczea"-J?%`+]^W- d#C9;ZT\" `xb ~ M݃op3"2@#wޭ&%L X2Q ?7Z+Kܼbj5YL &$$вKۺ?<)0>)2Ya$`>GLW*I 1,?g aS6} Н-"G!vm6V M\lxpmAyc}E4'|h(H'vTdDa4TA !Eխ8S#6d`eYfRlg]l6QacS<8BC!Y`ܯ>y^އaB`6B@oW[S-` +ax nn3GnF "fmh|T lm)GpÎMQ#`Bm[Eયtpt!.> PP]V9o24`*Ja2grJ=.@myӌ|θسt 4fOq4@1@̀]@JUo|hDz P$qLX7`@[]AJdf@%t#{q &E0F7}/r3E߻~PbL==|Hx-0^@S]U]>ؾ=V u5eyؙ@id?P H)"j!`=]-u%O  9vqV:*K%x9GJx{!C(|7h&hmn.Hy lNKu+|, 0+h {y=vvAGw5vTS)O#-dh2 Lyq~D us'۳}ju%YZ* ~ |bpdBvQec{SgOH SD@m?ɴ +F[ڛj+J sRb"ݼv缇'f4)J/fgG `3zvGWи`hv0y|z-лO3@e_g -NMxz+S·[̍VK q2QSR@`@ty;9E`v0yO~jhhիo޾c89(av1|y~vr\@]mmif #!FFaQ6jwͨǙϫ p]QMVH?8@@>%ΏAWR"aMxAG۝,LׯPSdcԆ0'F3b OpԜWH7~#WX(:Z[[:z'y "ߓ}G0q)(f@PQxN9l6\(DT H:0 0 1R^ef 2V50|ۏԨuѮOUUu-]}t&10!_I>1:03>߹@M@OKc$@DF:`: ap .Q7p̥O +jۺU9r6u(Y^^~aɋڦ&uԡ&@t1!ïyaaNgqa^.=͢ca@/.ceA Ӟ6AAA">fx_R^uI(@ g zZkJ_:f5Jr"y8٘ @60#P)0qʪj۸ikwc2J*U^#JHr1?F'i GED?O-zQU\qI.ޏO~Cc+ h8񝇄;ScPWSS]S(SF…gp~ :˖sB`I 09`bR\cy1'eUnH[vAd`?v+ra]%SswWoF=OJ|yYyEUuMMmP=&ZUU=/-.at=\9j^wƛ;v[a딠56;6tzPW[]Y @\tkW|vˤ9a39 |$_GP\Vy 8r>u/ƝظI)9O YӜԤGwCx"֛7C+ K+54ߺwc%(5 42tѧ{QZRT4;=%k~Ϟr9zng}>L{VV>5ݠ-f )mU Wɋ nmϞ3z3K=>s%ͻa1SR3H &:2AW}/9^“4W@t OaXK>+(*4TA`:UeIVFZrbwo]>{A=6;w;vpaz~yCTvCYy]f:*&o,@+(&%Bkf+}N{z߸ynhXDdTt} kttTdDX7o^z0x0́O?%)!a{C_:s]VLL̷8xߍ(nw4"oW{˵ek 3;z bQg7{y^r? 0((&W.z{?w}{vlݴp.4RS.Xb! +' +u L7[qqe- 3Ǐ ~-e gOذ^Okʕ ?pI|[P+ 3޹h y6j!, 3!-)#JGpFP]\N{x>C'\]=t`;odj^+Wlhw9s̝7r-pLq]{ ]{j뀆{#3b:B3']`Pg\UQnV㞁ak7qPgSeQ֣{g٘,។]&BXPRCSR[h;lvwptt`v͎,-7}vW'3o0zf6 C`Q'=x.f:~}/"O;j4t,WRLXXXl;g䵛"}Iآ(+>,Mka<ĵ "#cY7nliifM6]$/Czh+LBYH(,_e]v> p?LwﴶڲyZ]r8xEeTVmw1[w +>w]mo,~tr(fOZi~O@HTBJFNAIEM}Uut֐HOOWG[k+Tdu4u@U3:*(km0۸ya^;Ln]`~Քdąy9X`+ 6Xw5Gb,Sbp8SC"r a>pjZzFf6.B"bRҲKUH TVFJRBLDH`1/7|c]"~u!s!lƪzSR! Wi,_(Tz8rhXTk7x$WmF0"4!o1( /`cefj}$mhY%R2KU! 5Mӗ^"!.*,|iU|"S) 1g=M#{;\T 0:<"T4t L,l\\<$`gcea~ O h\sk¢Ke@?xPӑ[*>}/7;+ 4*9AZkU98򴤲{zې?-J"-kJ MY!H,,0300B1aB@OOG "G $ԸyDDF0!AsB ut:fҪZWnE'fb}o0$ yͳF[ۊ@LKII(͚5b 14wa…TPB> >ys@'CdЀ'@DM}:(~Ac +|ǥJۺ_~vHw+:[lq[K*:?CR𑈖;p@|$1Ws`] +J$`<_k7} M]O^  kG8fOnXO5q1:>ɃpYR,h+ri6QyHI8YA2t<}FάYoR|畛Q%uHmcVVvQ7x8@[rA~p,; ( #_F0SAMgc}Du7l{ڽؤgXHcV;Ѧ귄7++KeݶYlLK5e; ff 73e:3߷eX,TMpWBd痢h망X[=fE]ei~vplRt4qEMο33Y`[0H+7nbGƖmz5VVVEG췛TV}x&v!5=+f}g|n/K=H'$ݝH[丨A>g Y驧rſ\i:X+< +*:fb2*Mp=v䗔U64uVt8vv e|ϺEًyS *;208h,ߪYޒ):mVSZbLP,(.df} Y`(iY)@ AL1_~n{سYn&s ߗWHZ͓4\`zblx &+\NGl>{66ƌR ) j: 7Ofs#U/--u603-\R͊eRP~%4,9vGznabj̧~oOg͚ +=?b2#>{xH> +stream +xQnܺDў߃8 ݖIju*8;xo&w Չ,+L.F:\VB}R3opwPtu.>)r]X}:ԅ?Rn{ΝշxB]P uMK}m G]wWM݅|pyJ? q;.V _.Su^WN!QC ՟RR3K՟ RШ .vPbu GՏ8^+,~Yva1VUx]v=Ƿ\.[_nĻ慨9ꚼO+sgm^QwnЭ8Fݦ˫pVVu]I}++]JשwjqVdN}RO0P`uRr`Fu7U7VuPWEQtShS7Y\TDVW8V,W1vPw16QQ7Ol.lձnՁiil'QnoC쿥 .Zԕ:+_ln.\ +:OuU/<nzP'pw|`Qc"K=1^7uMo5xSgz K=` XYԃ`fQEE` 0so0s`0s`9`0 0Xs`E`0<E`0 99` _xg,Eaxg 0X?"0Xw_xgxxgxYO΁EؘEX-0`Kǫs`6Xd,N,ρE"l9<"9:|,Θ"9k9o,Z,E` "Q` "0X~ -QXE` E0 +  E0 + E0 +K ,QE`l,Õ`fv"iY("0$`&T-QE΁QJ=o xS/u X~C#:u$7U'HnթN]Rgp/uFZ]}:![W7w9ns\]O\]OYϩYϩV]OV]OV]OS3SOS3S3P]/cM믫M?R`uT&:?@!.?F".?F""?L$?R% +?X' +?^(>E*z>K+b>Q-J>W.2¾B1ꪾH3ꞾN4꒾T6ԑ̨F:tb̥nX?,>M<R_ StW}Kե;8שwNWJ[8E]pVV0u!*G}I Os[aS|K]wQ_ꎼ|"COԏB@[_ +xEjԕG0V?(`1uiq}[/N]K̢n#P?CWs#կ \P?R +uӰ;8K.~˹FO".uAWpsIQ P뫉 ÿDb>fR!(sH98V]{ +AQ_u!aB][}=յngu%NW+\Zݻ3oP;xPq\Vnԩ̫nIns,.#YP]ϩ?WpwVOG +endstream +endobj + +1263 0 obj +2565 +endobj + +1264 0 obj +<> +stream +x$g +endstream +endobj + +1265 0 obj +15 +endobj + +937 0 obj +<> +stream +x[KQo)+EA|Ph[jRې '3&\f--B$ĦI+&_fV3%Al^gyIrBfK$x6Mٽ0C8dYL&߃jShW͛KWuNV'ˍGaՂoϼ+>^PBCѵ!(^SK"QQAȝFʜ*Sw&r'R\!? Xŗ&GG%B +#`0@7PsGugxaY?G_ +G@6R8CsYش 䧞7\yZ{?Bnl@sYt0PGDIз϶Y+^v5;,<@7?>:)'Ì/Q $67i /O$I¦!M=kw;fP܉Ve#8RT*jVPzh#pWQ E;TM> +stream +x}PTU| +% +(Fhja29`:DX)P͠i8HQ(j žۏ[?{y} C<;Xc&Maeh~tTHVf_P%ʓnF#Yć G\=<~-ͻh3@tDŽe ^vN2"[2n4%n46aE5fCBnK"¹Y)pi`x#xOO9dE[DHst_ }z/!x@/PΨW6,dϱw1@2xF濪ՄfV܉ۜDBs,bf`[lgt`){o: +LTF1.pV3suG;P6JMTb6#oRXy_i B}Џy̯F6y1@X8S 7ÑOMR}"LՓibtti8͕o>TfŴX\זz$/oGi{/-`QߠEX]ſ|X/ 6  r +endstream +endobj + +1268 0 obj +1539 +endobj + +934 0 obj +<> +stream +xZyLgb@ۢx" +^BQ1I%Iw1Yӵ&d]Y, 0|sq3 G9dy2O>?r 37~vqqzLWqڵq~ +2A`ƍ7_^AQiYERa 2 !~ɩ#Gp!:55,B eʒ2?wccb;VPPh||tt4NT5U5.]>|؜'OLOR1*N6w(Uw +4 2C*h +Fh27utZz##]g%n(`Q' 6(T:jv9#.^/ڵ+%%eǎ۷o +d Za_ߴiXCݻwܹȄtYIkjjR8 TsSs308t:o߾|&''#;@BiӦ%A|ŸZۨT!;66>88! (R:_sm۰/6k3)Jk4a`C L6ۃ~̌N ]>R>0 #qtj֭yyyd0@ LzLkW144<11q…4hr YPF* Z-7o[|% LLmojjfEFF0@Bza*stp Qhji.@zz:Ro4A`&>:ZXXZEk|}>Ɣ &CLV)xn JnÇ  hXn'i~V>- +k!g?4LA+s?m~ll+!4ya cF^<#קh!0هhNb؍Ɓ\xJyQ'D|]d4AU*ԩ{tkhD& BШuI>PIH<ά<`(FAon)IMzMղe:e>u͜8q"ypCJ@D !S@UHl={`Ǒv.nQO0j⋂baFkeYۊNAbEHţnٲE6Ul ظq_\%Ԟ{ yh}}W^q\xazv:]J4b/16bGKhGS@&Q{1]0Gy|I X-Bm!EFV8e}]oѓLrlڣD3i(di_s,Ŀ+9#b:Zj:z*'Go_~xx)qaX;z2(^X{T2^N7M4>mL" |Dw"qd ԫZmcUVVqbbV62ҺaffN>`JqD 2)6] ȧxJ|bd$+-Mh4-5ocjkYfTmmݱbŊvBZxT,W Ͱrh aZb +%8 rA;+alWTל>qW_-%Lzkssr֭[? +Vtt4 +/ X2IJb`4эHơUA^f/8p!3!=]ŲM<0W LL-.T$%V,G$_`˳Xb8&1#\"իWtHavvuz,)͙p(ͦ'JJU"pM#w#Hoq@'yA[Fb C9 ʺO?U|,&嗕aaFkܹs!HhGU GjOG(oWTr/$uC(+^}U 6YZjX +^R *}PB~{MƎpmb޼2[DQ ]$1x©] NרTU;VaC!T, /C_}5441Ҹjժ96 L +V(4:/-OI +WpiU>`oQs]aÆL +ظqEN?* ++*z"y 7l7Î}hxO&/^ Y|֭Iĩgqq`T\\|yA`gzH/^"鬵( 3އH`4\λH'C*MH$&|?sf:~FRA-/j74r(u*VXU[ylNAhXd&RZY0C wNWJF`.WNNR *JQ<LJڻgE_ŇF0M ӽn`vY&~OAnn`nYZWN=? x(.)ѵVZ\V_\<õk.[,t{ +endstream +endobj + +1269 0 obj +2778 +endobj + +1270 0 obj +<> +stream +x1 gox ڥy +endstream +endobj + +1271 0 obj +232 +endobj + +766 0 obj +<> +stream +xXY?ݴwvv3r +"a41g ĀdPA$AP@A97iDctq{>ZUz뜷ϷSڰaCLtLRRJJjbTXpt|B腽\OMMI4"##3WaWܤ|:σkO{!_ ,cb/XTPB>A4LND$KDbg q)m*)*78Ps(!7%!@㎎&QE׾wCWaD"A|:vjge ,فo ;4dXLQF`5o% H :4Iztp`LNNdB:?&ܹ!|brR'<."Y<8 0*v1Ke2T*F)34] ЩT`9l:Q)L:M"+:pa9-HYVֱx#?ڷ#y,SQid%ܪU]9o b72Ȯ#_l'H޵GkY;*|5JU_ֆahV!~UOکjvb߸vq,]L'R|(~e֐c I8TUMC5VԣM>g*R^ C]| +$,Կ/sّ,EltqEvznb1Y!a7.,iu&"OGd#tuwz +[\PE8tBkEk/]=ZT[rM 532eR[UYQ/qQ{:4$Xo? W{JX>ZsSk+嬐+cQ}=7=:^w݌vYw';/uaLfqBH("9ò&_{ ?K>jmỦm6:[-BTXtd JɈ:^4:o=;# qt kɞG_@/+EaT6!!{ɂ7S#\rtrBpvc+p p$*r +q|2 ;tN{j1  Ug“ʩqXϺ ,ϤZ NLG`f]\ozu2u[3/t8s=U٧CnqJH{dT)xᅃȊ:ⴛngðFڧpO"<xK5gޤYVPl,}*|%^>1{yڥ9/Hb^!B角N 8PWUՃx#NUn[+x3<)&'FڞhuG=zB]UoBFܗ ]<5О52FJ,3_QQe7D 6b۽Jynݜ¢3kKȡ&E V/DDLP_#9ڛa!v7FkvO\2hp-α8Eș\bGzuyr~:pz +:X}szfYN5_|5`Vai^} 1=h,~F#~Meb/=|Dٌ=X~(r3# +͏ XzAlĬ/LkS Sebv}7eJXZ! 9;(bB9^_%}^'g=megc[-տ[ۯjzikQ6=]|@d܁6x1JT@rT;D.E. =AQ$_̫JaiU_,6@^"_|P;R m."& эs9dzZ$( pυRRVHd^Ѡ~涜uBӬ"y;6θԳ)TH(@3'p;bVw;E X?EhөJ&!A@,l[NQ;1QAl_hlH;_/[CHdP^[Q/>7'y9|.OZ=Ok=mhdlbfd`nc(]@:7@uiewO[ZvrNH<`$_ņCXX>둒 .61߿F[l!Ƴg[i8"!"Hĥkd> d0FNr*slgB*by3coշ5v?SzgC H%C7fmYNʱu3#yw}owmS3c ΄d?Κjd-fg21k}M~uK6—2 Jޕ}܅6nB WM3P6$d{.2qmH;s+2hҕy,r,r:w&qI ͮ|4``ḏMz{]Ndq&\ABB 42S/+Yںv_8Ѥ׃>kmnK:,mLR;[tFNЯ'CJ@% DX)E,*@ *KTI>Ջ*J&t 4ƌDG!Hit:$75uQW!QWb)/27r+FI g\WY3 Og"WPڛQdP Me AgϟX @ yl +Kc0"`f +$϶c蜥JN͉C--]n +?Vm%:xw\x06aZg FGDwЙV(6d]|v%ٞ7/a#W :}vs_b"JdL:?H<ېzɳLȘɫrOj@Gɳ}7Mnɥ"\| 74ݺW  $F1yd@E~Z:Ausrh\g 7э, + jr?'æ>\=FmdaIcta/eMe||Vy]7!:Afɳ్=xLfyb1g[O +B᧖g1| L WJ.ܑϸ%b +&W(߿@P0@8X djDCMwW~{p\a6@3gc:ȿvռ3o3COQ]:PWWAVGi獼nE!To'skҬB +XZ"X*z];W!7|, >m-o<,Gui]3EmV)]"#[[H}ÊDrB&I$'CC1($6q ;s)̖vs|)vE]ٺ} e2yP2&nʂ= }cX}7hk0liYVΝr"Ka#V;w /ﻜה]f-&H^ѷmWG+np~>F++N"GU;4k"l'M-mD +$hf\oz4!͐[!}5T;#&&5 ykʋ32S{Ř^7gP{kcBRp']k %5vtERGs,ncfh^֕wI&jׯ*xtpf6ڢ(Ɉ{[ ds{VIq] wEBJH.E <,R:\!P-=1E<@TX%$_wsiO!O$Ɵ(#)G6(dB5 )B\VeBwв Ϊ*f=E v51w\{ #B"*<_diiUMyY194H$ +2'cNT4".Y[{omgo qÄ=_|oH|r}U*Uww7JgksC}#sb\^jegbb|cuSぅӦk0%1[.=vZ3OA@O=47*;ĶFr..fYK;G$-6;߭A1 7S-9Vb]A34]##_} wA`B,n}}}G|?3,x "ՠ4gZ1`iŰcudʑBİ/,X(Hķw0_TpcT*Pd2) i˕2>i4y˪ >|,Xm!Y>Z >|O9 Oc|Vy::`D<|LTU*J)OJ2Igo)͟<1+/ai1{ؗIxypuJD+ +'2>S`t!/T'{yTfTefv{VMe|:ni3y"컗/wW50Dwidܷ >X_`lyS*Oac`梴&6G?htx-36FU|g{7wHptp2DOe|Nn"H(SnVwЅptpZK&2>S3뻼x<xD׷H$4l+ʑ<)x73[:(hilēhɐ௓HeX-|oٽ |ּWa4}:ϲku/'2>S><;1n 'W&2>S4yL&6NQd˧;l(c3F$o`Ǡ= {!lOo-x)g4, H K#bptld 'Po|7QIDL%QAw dĢilJoɳ=o^JT"`߰2}/SI޾st---,9k}[J}ƲU S?_k^Gl?mK4ec{_?}1M*'{qp)e$=e"N}ya Y*/X_~ːJ^]Xf{ + 6==akiajcUnGސ7q7q}N86Țwub[d7A0Z_oz[󼎭 ][(.|R:8{`rNIaikOEGL&(4qJ! +ecQBc &S"{x!F]H)-mFS)%6F$/J*p"JdrdT% +$# XD DV%HTer$~KE؃:&j|![-<.{g*p`,[qiGׄ籸|.G +!- 9luڋpĨsk4-uÂKJY8fEbfRp_seGve1`M +QrHNƋr) |'lP*Sp]p PHE|.[$\~ٍI5Ydڽ3 vH…8\Foz^Հ\rT& +L6)#-e%U giÁu02 9Fzi o^L6Vgtvq[qlos?6|`\UQqV$_ gns@poWK__wsmdѰaBYKvtd\[rLg}J +=ݔ&vn9`t3J ,mJ jSNf{;\.8֮ﵾfC.K&J..e93?ih5m^'lWe5E7/7[s}D2ˡ~xH֒oro~2ƧEv*sjmpFgBgG["Rܬ;cNf|y7/oh>3Xqyͷ?r;}os͈zlρb尪1?񐅙\5Zl95qۈ9=W,iʸ~dIy7Gjg=m<\I{Cc_`[NMO}3VPE-)%ž;j8fQ:9zg-y~0>urZ|JNMΙ{ xCug\{]7 HA:{v8m:sAJQ?,rbbϩc̬Q_,_^FFƖ9]-.β6:}q6 +$϶cCC |W 4IH"1_ftp7U)Yǵv0[)+m_t $3q;#L"<=VѢ~>XY1*%tPm\Bqq{O*ks/ 9ʢ2 q#`;ŸLCg1?:݇++nߝWh}X{6OBq+^SMs?{L>=/x0}:%cL?͌vޒ?%q* 1y>' k{E*F|q}ݭ~,H Cڪ =xμ>N}OBpKp]ٖ{bqQWW\ +LK^ݙlf,r8l!4_`'M4ݘR& bqn*/ɜfn / i=Xo _`pC%ָq3>i_z o?8 Y!lV˖Aʊ<7ɬlMPir~eQ ].JZoķk{ܣcR;ǻTt|weUcX0廟R]Y,v9|HzpmG]l{WLd6-/OK|,P{H~d6nH­jijZ嶿~yA;w^a9Y6s2YppO3Ĕz2Dņoٰ&E:H 8ąY8Xv .rÎ0خ?E Q5t{kU`nuGCRqNvqgҳl }p0ϡɳ|'ּ)akh,#/,Re=Q$tn`s:xM,[904q5:X|GF N:,ԕwIِgHG'WN'V@- x32&758@Iȇa$%߉79'5+}]LRI{o;}gdz/5-ܹW*B\K7^/ɭoI49wn/#kV7m8;mB' +%TKX8X){r.{{&>!][G!tAPmRZ_|"E+]H{&By54֝Z[ .ylnSM]Qٟrz &Zm(m4x0EnD +W&M[U_/l0 ȗц*=,f70gEn@$v*g;uiòx{["PC';S,|2:a\ u4u U%;ZW 4><;hO)q/bb 7?R݋J ?a]ת}9H)yxiꟶ9eʻ9:D4Z^XF]*Z7G353T?w=[::{$@ cg+{᠗e|3\gGcqя]՝7D+Y;$"6] 9{OeWKGM/= %VOa +gutu_eŅOB 5=aJRk,+[-;y#7VEp(k?,]zN~*"J AJgC_ohJNZ5נPٛK1s ҷx\2I}3V]WI(pT< " 5_ 9]<0Έ"*4)Cz]ybǩ')g>zzsۢq)QqZ;j᫱GfJyz)m.6N| +ZS/}H}tgA +p0 ˇK, &^߲$Gz;c ۰3Z_Ԍa>H}5;$LӘ|UXkh"-+8̰qS5:R:x#KΆ5C +H"IygRHB!Cw` zMOc}a`j\./[4aY"?w +*gWo˧ UfFj͸{;Q|Or8r괒>ZO嶬`3% +Ӟzmz9PnYCl=5揈"Jgݴ z$c߮v8r2Vk};)vs/}kYI[f |PuqOo/}TxL&]8CTf-7?x'-<2{9I: "Zfŏ +ٰ 4$<Ɉi3?gRhg8/b6NK~8TRgj1F燠clSO$!P~՛w3Gs"J߸8ώf{J8Ht⹳\OX!ђL-dXlreU-φ+#cMc"cdQTv-G.< ?}_1gחSfjOsIdʕ +Pf7=HhYmZK.qڣj,FƜF +$t u#0*YUiZ:Na=sI}+;u3'6C.mu1Ds;@8>$E4kJ;p-nJhk;m7t=9m l1R‹;3緰 Nw9z;5ɀ}HX8oJ)}c3S-M6|{c:hW+?Udhh(ɳ8􁾖A[ͳzlGt.9JTr)rRJ"!,bTT2{`r8$ +}Dx' +O$R?TJz2)"Rp&?0D{JTnH D XU}aћGcDH +ABDQj)%C$l/ R*ඏP1pPjN4U&H72]Sv+d +Y|#`o[y;CģbI?pQX"H9zԯ .1_PWTg`H$BiLPȽLzF(_2?F.Sj{E7A@;lxʳ &ݏjxYщ50ٌgA;6Le| yh H$ryB ƧP /MN:Iv^'3wnÃZo5&&&&&1k6cĆY@A:Z_ɡtxVSN?sNX0 1 i-3[յ4&ɪ)J'<۽) rv%_s&)tnxLu0:>u+D>` +'s^)4Bt@ g{Cy"P, -1͚ԢߘgJK jlx73pI)a3NMG95@Ag{ҙqQ;&2>S><۫EMe|g^?.d s-3X*% ./X!+L|f G?{tLU"P,F3![O$ߏIi|ه$ tv1h,#1 +=5O$C l 2~]YKZ9BGA >lCC[v0EK4:WS8D_`'T>y,Jz6, !>LGW~^o^>5` n//nxU2 VΎr^q*®'A .oڝ^7k~2u7hgⓚv""FRHRJ"3D"JxG4&bJN\6K^W%pɣRHTP)bbP@LI;{hyW:e3FR㖆FFIa çNX2Kl8^5U8tx$NJ|9-B\%wrwǮ>()~n>C{:?m%+y#O䵨j{wdæ|%$a[߃Wif^W +W=]8{0,Z3JɿiihlhecR#![/aӷd,AEL &D\x5jd#obtM9J#X7Y~JXTezȴvZ6=|iZ;Zչ1su\E9<# !J FH[n-+)b|*Y&=%$XKhS2*H`a4Z2hUgPl +`Y懢(g.'b =B&|^oo$woZ&81T:. {)G1yupX"|--R <|8%ZĐ*K?sC DXznF8UKں8 ([̏AaK{m>ߣc:hJ0"zĵs3 "%Qx_/ '蠼.ԥL$4<3J|l +SzfV>qюe|x[uܡl-ә|v!IEK)]JҬ*5'$_7_ƴ=/O\  t?zB S:!8"w~]s>oFl2~kqZhx)NiXmgZO9Y3ES,,':xϳ .+gn-sL'(Hbc`I8:&iav~`,~x;)s2Zӟvљ?{VE}=ϻa:&rP̣c9(,%AQ $s· ̮>wW׿n,w}Jnێ~ n@ 8QU|!iZXMnf+nv[c>O)eB%~BcxJU0b lzؼLNtַ eC{orNKg$C<.g'tP!Z{qt\zS$M'~=6vmH +_48v9/82y_qjmquFSHnjrc{C333ccѩnR잿[LkٞcUy_%k<-Qqccڋ.̀zrO8{Q`H-B"2AǏ@~hrJo.1=8ͣ #%'FJa$?e|@:x9,/$&MXta_i$K>dFLg:HBt0&0E'ۮzw 2J}jumC71<0:O5+^X +{f+L7lX’~6 uBNN/3ݢ~?1s5?YT?xݥ߁T /Wq[8Ny\#kcaQ]`k nB" 7dPm\^wg BG"XHht2mN)ß2Pލ=QGNuAEٞ2 >t]wILF&DRH"iP(P)dG~KRC4=\ \տ{%3 >MbHF$_#v@HB&Hr$Xo) #EP9p(/kF$TnH\Too\U+2PHXB( 2%(~N Gș7-8`CgclƀqŬ8\-h(JIlK>Z-t>i5^P&?tԨs[yω76 KU6?.i`5ǍoƴeW GZLTmVAGh3\od5ƒVjJ*ƽN9ݼS|'vTu&;;pϢv}eԑ)Mn/3F#.VE~ﱳ-HR[?qPS _yY"_ߚ-(+d菥 `tHhΙliuu>9AqGXsе;AS hrkBR.l,/)5Tbp:W;vZJvDRO{ZǗ(RE:OڛȬ%`PX_Q\V\N4J1q-`[u F$!gqxBͪeY| +$B|mSk}[H:_4f(VuûZhBdɸ-ՙ;)־6V&ǡPZjmpI8D˥8<_EϴC Ph+C)HM15@"rHvA8 N¡l4 +6#U,oN%C%L:`vaЮ>O8*e"BScșUީ+PFO>x Tm A3d}V"I=+nŮ8H#`>zN +[֘bPW]=H*Ǯ߶a-:!o#+9U{wlxt4 vԳ3pp޶|S{g~H>9KWi9叏찴s?zQ _snxvl߻j^^80~{X3z.0eۨ*XŔ]qeH^w쭵'ץpQKF]߳}Y1,zyfV+FKk-ۏkTO<crO}AOx˛~)Y֐}1_EW_ٵl4xxjƛ8yoZ뽷d(A+ɾxfڣbvvYnPpYZ[/9w~tx{{[]<Ìf@h+|V||]$og}g{bSRO2~ѝ?3*N#gˆBbK6_O\ue҇xdskڹbLۀlQӄ;\Y'=dd cSں]YhI?`ԟc6ۘLJo\zwB)_߬ۓGa68Kp~w>AK n_HR35я S^{ z%\qtBɈ~%8ԃ+dyUӧ<-k~5IAQpŞws&˗Z4*IP#LRケ8y^wd9V|񭧽bYJU YQn/;FhmF8R[ Qss,uf/J%c_Efn޼tәhWQ +݁? 2bܘ>5"owr -Xf^1źȽiC(b]u3ęN2q}l YOZuscJonJ;7~ḟ_6Qus> P밤w-6D|FxQ7>>C !T+aK +ח{ǿ(d +Eqx-報avޯT8llsOa L v>GХ뿙T󜿿E5'}C9Nvة]gP}'<0Ǭwih1f|%N3TP^K{r-y&"Im'`JAQ)M,z݄1O%0\uX<O rI,k$8qn/1޲?/!_+[]g$cOb1D2jbsii~+nH$RK#xn:݀!gE;>'o=eߡ +T§56Vm-nqk=1ID+:҄=3,%혊6-#pʣ&ZCn#J2?Q :i''I-avqaa >eɅ]gFɇ1-T0( + |=Ҫiym;K"f]=8%U: e˸ Bs+ +* 'wǴPڛZ1Dbl-3"*.+}nī#;ӶfI?#tؠ} +?g1 {bշ 6%ۇӓ=E^D>6;YۥGJ{q^X6Fi-OXMڪ{ͮgVxx/?>{9>*k=S=qž$(QUON)}LuCu9|χ'~yXY|T:z8C].:~z~y +AwG-O:,/etT7.-9?x3j1#ʡAP +PTt*ϫ!N_|10blѡ *ysw/vTya}F~\gޙxT+%M)sqʕkFGDFZNCuQ[Np#*??z*6='~mVXJ$Ϋyo [LhorY δbU.֫cp+챤]F6x##/_8wjΌF*5iS۰eG+vpW)A>Q`ldf렢"dOhVYvtӼK_zd(v~\aؼ*"^[?eׂ_ fou Mzspsլ'߹}BA Z9l閧^Q>fo^@|FnA:ļvѣu͌6>|nԂ+OzqΜw&1upj@ͨkdRN:~{tYz9*:K/ܫfahc`Gp*\̪"MmQhD?K&3Bv12+@?419[ǟ( $ >֟Gl|T `lRLQK(&:]X֣]3t=Мyjb}:"|霍(rf'+؋fF*޻#23WovӾugFQ-=}&#ᮠcкY?S+M p>0h" +'֥p@[~`"#/֘yjDW9unz-tpbr5sor3j{h4QkA1$S7så*,z˼|k^_ݙV&>fGsH$"ЙxFiq%k+ 5 4K=?=/ wk>AK wЕ4G^rɋzcɒ!!ZHkdà "hS<1~0 ?1ʹCo<){Yރɫ~Q*Я)3Ξ =CB5a`rz&ŕ A}'M "#w9L ڜEX\>knEl֎.pϯTJ#DswWz 7x3 ͍`Դ8'4z*]|s̊/LLB\ P ]PKmMOcլj)?{Ҧ]}(zAƛaG:7?\.HuÇsV:ޝw̾n0\6q Qy|B5!f :7xoeqKgH;oy-(.bj_O[ VM.Ov5L>rU𪔩ذ';!!gb9I;[::_]pA G`t]E=:A-ej23jas{= +IG8l:ItS_2ŹqtՖs"Ma8]-sHc S&vq"Z= Tuo[ru) 514-@o,vsPp +xҳ$x^-{qY)H%k$'Si\> ĺέ +  ^Z_nE1P>g1q3idE:i~JfH}||,ut6nu~Dn#/T=s:xl^e湓F\o B +[tJj-evV6P)uiR`7˘[^@rJ *!08Үk/wSr)nh5Ȗ)c]7|lːG,q= jۿ[*\GtVUp$bDK]K/'`ߏ`"vOJn'xy +MSXag& +baFF]++ζ뷰ZznWsL+!?gj6kay+Uo>,\}N031;z'ݬnHt^@8k;y2셷 KM f'-K-ķ]) :mT4/W=vfj Olus4M{3םJ&gZCytF]+mBZN+Th]7ygY +CT+V[:WZ)5;n^΀V~(zep2JZrQF%+~qdFcsS|H 7/26XGR +z܊!\Ys"64Y8 ɉdaafd`8~DZQ + O;onހh_OU6PM׬O7!zBJiɑkEE)FiqRj!eӪƦNךL+NB N- 1pR]'%f{fY[nl;\6V~+lY_fo9cYztu]x-]߶I-n.jbQqdq4 6fY[[;:X,?wfF+=3ɞyMX}2*VW fy2mre5w^(/3Π®75Ue3 +0S@o̢h~(yCRj8zZjɃ+;X6*6cp$_U4dΝRjgc N1y22U: ɽnn̅kP]tlǞu3,S>6WZU󍓝t\dUhk=EyK:(ݴ[Nv3k$b?@RpLӶ%CWz"R)1xj1Fg)- Jh1(E<%P+,: BgwA&gX|GPMH؟~t3^1TI*[0B.8 W&liyk \1LkS"6NRq,>P9*M\p6;.:AjO>C2>pB̢y}P9,J%Xw ]w}C.P~t9]F%ۋ=&mTj6#xmZBfid\,n)Bh`pq 㪹|Ju*|H13]_dۣ16rXkaPRŐ +{pNtRK^y"S0|Qq:(O߃Gb$PF$$̏8|hd\RO{ψ/J3 +3))BX('Bhl]-tq'Ү]~zb&: > Hcsm-T4z6xcIUCQ`Hq~|AACI:AWtPg۫H(9:(lVH6{FJ1sA'>7tQ΁;7MYCϲ8|PHv7T?]tDtmgXT|Qzye7;Dy+D%r=WwoنHDR)O"G_O@I|Qquk_N?*x^^wiD7*~+&' ^J@ d1(D4o|n:h_íB EžAcP4uJ~F { o>CFF(M,tpdccfԍYiobdt~wuY@Qƀ75i+߻F忄J.΋8:e(W9o fmq/jYMуG.$sٶfHCbxo> )t24^t"Ք'`?]:ZzXA!)mB5Gomi$)zTLK[G[BlkmmI"%{W!c;i,f,h4J  +?0R;t@cv72yp4J Sj[D4[Fuw'Β)e| +U_׃˥aryLLSSwR2IV17[[:{$*˛AF w6Z{kk є21qHIl)$"D$<[DW) d*>@$v[e5农;>qG"HzCvzKGשڄ]W/v>y¦w2^HKg_Ϫ뀂 1nLPY3{bwoVmijy'KjnD؎߯'胯uP 9tk=^7k`V-E\?Rk=$H.H] {?nel8fi +,^|rĤM^MmԖ=HB]-bU aeЈȰ'M^h9j~xh"Ar&%"_uI)7q˥r,lX +i9jjR9iÞapx +-]{ +< =|߻Zi^W$R.w ߓWUC዇"Xo|i0 +(%Ⴛ[8ȍHٷ2 !:P9cc ՚tn|W[%05glp-Y-4s@h[F2((<@$jƳ[e5k$>%|jZnߺv-Z|ns'PI ga)p~Jr`Z{Z )$M-l3E7 t0__eoyƵcn?1®WVxpy\Ձ$*%Et>^#j–˘UϻptqΨ>dw9{XPhZ _ڵeGX:G)?cm{7"Ẏu m,퟼|a6h]ay\R+UٵxMKaYMhnA.uo#K "Y# +֞8PUs/=%O*=;I'WO\0cĄEKPf]:+qZA[>r .rV71Ϩ|%kh4Z( +YUg̃acV-V dJIۺjO|XؗpjҦ^.E+fev_cae>R fN0773_t֢ː=j;]aQ %HH \7 g&.i7ڒHRNˬ}}JƺgO* {~HQr?8Q<чW8h&|:r 'h̗_Tu9Y||9:R:hÜ,hAg[:O;wx\.Mzbؾ> +3Fg;xQq-.]]](|l+i g;22?psh ( =jɔ6qr0' /}팭Sn5XaTB]KzI"w!2&HBoɌKڰ$wns%$A0' /8iQǞl BGecvĭ܆ F"L +_9Y|la. K(Uت[ =fAAdE8._(s(Ҕ<]!:Ђ?r|PժbD t +uq"aqYI뤊Vnb8oyom:u$/HSR^lL&3 +p{D? A sy7TM(j#"!dE StÜ,h sr8Hzl6|at[:hB~كuoڏ!::z'4g#9"P(?24mH>8mh5Z#:ølbfNݹNJ`YƇiϊBՇP/ATi9`\T[fDd"îkcylԓ'o A)QC\8h=VXA464w^ʠfp +{+4JLiweϩZP>j|&S Q=~pgE\~K}-k ^VVC >L4׷b=He|T,X̌O.+nk)^'zDކJ;+̞d?ڶآVJI ;woAgٿuӖc۝\BӪ"TtЌ)^Ύ6#2Iݤ6Mo}`gty(OR%nʻug&2j{J]6vrxZ%څM(Jˎ_޺`HH1fDŽ~l<ޫˆA A~ :xzȋvMut#k"\_9Y]g=v$3Oq Kk^C#+.qt<4!l&ùl7eKa~O{8-mkT2Lc2BI]?9UutkE6#@[b*Bz_;ҵ~H_9Ʊ'QI,qiALb8¡EB{<{pGJ.P;bceR\!ufNA9ℳɆ}ywON1̺ȍ$e=^ a3|3M%+X=;߯_*~OmbkINN?-YQd hY gٺ/Z~9R>ѨS1^sѲ#O>Rxی/>i;':EublVUh?{/6FICSmo*ĘDU$rq6ϓyDW9&θE]^4z'"H""߉5bG 㻅3l7&䬷'[=2 +QZxhYWR֊ێDit% +:#мQ옓 ۻ|<摡]ʾc憙]3"c$G, R +ޗ_)f3cltx(f}T(?4J7;n,,n]|~ A@:o!-3Z]獿tw;[Wn=rB/$@^ds?/SpZ\fruT;& Nfa 3sg攓Eb16glU([$iK1&:I""lo_lJޱzK39b,Pm׷yۚ@y96BX3X"X/7x<Úilj&̃?Nfaɳo/&ZR*UϞX檆vR.B&j(JOhL]Z\6JP~*=  g{>69d#GOQzO&F&;ni?xBLZ1n>$?jú devՊ;~R*HON>to/97{%:NW=_"' ˳mojr|NZWkeٝ1Y G +0;5Ί+>|ⓔW*-u&':h;AS39ކ9) ii 9)᮹M2 +ʳ22DYhy tPT)[ꔦ9791|SVj{MkRw*VE%eDP[YG$Kco_*53Ht @e`HX)egW~]TPBh$5Je%'kKJoy.<ۡ{Ub@(mQydP ҫ /-wsKmRQ[yK~=mu|)_=2{҅󦜸"TZ: ^c[0Cu滵WlYu|"P+87~ٲ6$ڴ+m?iΆ+|ٯaM)W~|uUT Ql&.pM_ +QB\>tźKNZ$Q6,ɲMNFVzp^ drnRR!nɤB OJ̧R}rtT")rV͆hG_m +ΎWVhwį1.|wdXu/\mu++łoF#!VƝ:ch =kkz)OSQ0)5+YDG,Ѓcli ˎ|N8|sЇҫcFf4b'N'-(s޿aν:62.ix3K0{|SJp)5"s-KU&tdݺyz6:뱓rT{K5Ag +HA/-'|ߢ{T槶_2p2<|cZoT]'3E9ell|3Vv2Wδ#Hgʈm{YVD{4a)m=loH*yWYJD(:?z\F}[6DW7X2,69#O+,p~xST&P3\gO8JACŧYPh'[>W+b.}rQ#+,lPԞkdyUvDUP`yw_eŖ3M'2K(9<{ĬܼC[~b'F-&o+X5hdW7V`5UknՄB!8;|`݊iah|cgEG7y!y+Z8i^ ƟqO)*e O9" 6;~_PZqYqnOQ3A9']6{Ńr\zijku!ԊN\Hj*Iuчe d#1+$n~!ji˗YdTYZf\EǕGݼuRzE+0n;Úr 0PPfsmzpAn֠twt"uwPT|\M#TO2ԏ˴~5y?ɌyuD>>jT&| Bx,0A=fz|a2D!dfn`M x(<6{׉ԬC] ;Gmi#=s 7 kyZ|~K(ˬLg34o0yDu1] Y`X޳q +_*{׸Yg|~jC~۩*<{ 7 kygUv.aҾJZym"+ @֋A;\ќ%etŃjZ*F_%`z^wP P62nʬ{D"!}kd2[P(p8\ߚ<.(ÕWlbHb=lxZ.faM?E|@ry@>yuܷl5l?C4vY.?`5/?pt6tI<ۜZ4vWMtӃW螩xVAi]Ul·&vXU@Hb})=VӜr)l I^ɳ-+QI1=| +^ESՃI$Cc({5*Dc3klɀzu?R$GFE%Ց!g;/?RKX +p`&_ptw)7/?r[o]4*>Tԃֆͥ,|!;Zys^ZΦW$wV)2˗5*Rs=:jQO[IQq~aEG0 nZ.)$jmTkjdjS#%ԝY߻gDW5URY&Ud4QĦF*_wKO#[jIBR^n=K\XE' |'09r;!+Zl {ئ/Tbzn\\ t~ +\Pn^TK9ΎqN&Ie{K +Bⓓ|+Z()>,Ivk=b3$JRH4pt q *h gGfVh4-L_匜2]Hoʵ0~h%BMA^!QQ])S-Ѣ8:BĊ r + p hb BK8Jzlx9[xs#Hox`d,z8fMޱ)s"Rl|iNPUM@.^iyLI~upnPNC +:ZG5Z}GltɓbژZN hZk;Gg[+#\Dك˳qi罘ԨxY16>54oknu\%7͏Hp032vvvrqt-jBt+FL\yM;'* 6 1l/"?TyQZ.%2,=C 쬋9!),jYE.7[4T?yf!*>V< +[j:5Xy&c_ԆlX\V]ӨѠO u +="dtbWTP,4Q| +:nB d5:ZwMVz;%ƭbmj] >9,H$BR9JsnQVօ'2 y"UQ+Q\|s-5LXB13L 94R#HgKjr o4vC`BL;R!zu+{Gq/Pqa`[FP@ĩk,>R˼Ƀ*J,QկԠ:&#Q9T%ZT w O),Lxd׮v71[R* p -kh.hK[Y[K䩕R +$->OU5yN- )6 819U5**鍦ZK}ZZC,xػ٭!n1YUxTIkδvϫljmNO/ q0Ź'5ULPjTOت7(JQlc؍-ʉlp[|" +[[K +r JYMwDaE5ԭ;tKV"Q + +}|#Z#,<*t9ڿ{BӍ5s3~>AaDTW'gcoC()> xX,GCo +pvv ,gig Jy[enGd[X@_QJ`=wZP<+.wMnzBL6,6%S,N(hE>h\[twz&u5B&9+8==g;JL6jJ*}X€$b!c^ + PEMg[ihrCBQKyӢ06]xpN|A[Zx9yzr&[e[(` NƐC!>. !>J\I˳la=")%;& .nz`J ;O剮iu}֘kS<*zB֜W|<5AMN+Xy=l!p̃wꞩuw0鍵K6=M5\.mm oz>·^֬V_h4B$!< ԃpq[aQG G|_>Oz=x 7 kPZQz UM8&'Ń1ofa K021!gfY16rdq 8"փY`Xz߷6IMڄƮ.R{B`cBx0< ԃNv6&iIdRH(j={kyAn`y-x8zM K*A;ӬgN s,Iμh[GY`XzҢÒ"^0w#w:XPo.)MH, +n-'* +kx0 <8PBP*j4J%r9C A2Yd­޷NHu{ +&[2|{ (z=x>F xϠiWWӧ?~~Ō Tk 7P^YuR<בpצuWxXD>H$"طy{=xb>()nԞ[]^׍>u}B" +C+bdd;<۶9V&kKd|"?bCAf[s.1>l/\pDWT*ҋ=o𫿅FT m^yoe8>Ʌ_ +t<,a.z}QU,r]$}dJMgCF'5 jEk .Dyͅ#?]k薉SlttŖ-5bSP߼rO1GѨl\=⛸sR묶V)J9m'_9U}{+X]Me> @ߠt*hUySX;jm-XQ +G>RWe4;Q"4jJ("Qɤ" m@z%W -w'ͽ2F !L3Mmo/J7B&KW\M 7_H"\(P)AFt7Riii۷oyfIID" :Mމ8t厪']hv{K}Fa8]vFIz壿9ƒheԃSgL]Dܺ[gvȴY62T <ϣL.cK ۽~ch+_m^ržO]"D2sO N}yCIp>|k`HEv= (sr eDR]rkzkdfq*EsgퟄcJDsg^gf0$1ҢKqz󫈄Z +QE}>q!M4~)ɴζ)//~`yWvyOI9)ʾ~mR =%zI0~wۙD4jfSn 0۽yQrN{kW*>aOM3ҞII.G[\I#*YO_V-^]ކ[6?z,A Q~Ξ֞L\tvl7ol"yE' +^^'JP05kq[~7n\q,i4l\c֯߀^h݊EYw1.X4C)H7™*)t[nT9~ĨU~VF}<<#ejH?YO> 7 k^ϳEOԳ /rf< 7 kzl /E|@$_L`4<ԃwVdu3ޥ|XRJIz5x(XU+-M +s'.<ߢ+bAnyl:fBE W,3:Rݾm6A/+̃&WY`Xz&ݔtvz_ԍo"Ç-6,GMp+hՎۜO_!5ƞY' zZzζ㒵EŮ>70L3wB+Q xEMrGs9)2$%hr&y6$2' QxٍAn֠4}3-&+ն +XO+8A.Aw3̃7Y`Xz5X]w\6da>^ɃnA`l?G ryHI 7 ktyy|> +|A=覒SgQʨ-͍S|KҖw<˻uWN]GoC^_m߶y)J)}/(PA rC4DաQtnBޢ5(jyGKs|^CF}+T2WURڦ:;jێ"+% +) =vDIAO*_QcGسgMӟB> +(àYݽ֘#SEܓK-"fscH~1U*i𼜨ܬ4zWifC%. j*!3<-E6p[AtF_g`?*}1#7ۓ@lEɈiNC8|@7[$&!z"6SH/rzjg|"S༹3 @ kVZϘf*Q2r˹߇(ѸLo'f&O_?)gNxU A/VR~!H7jZ 1kn%5;j)뱣Sh=FBh}^ܥdkBkʳj  + lE8+uMv씹jfO5#*(ݩaccMz%T~gQzz5+/]NFU־;_碿CпsMҴ=G"kG=Pc{4?L~2#ihL񵃦k}MkQ٩QWY@`p'-͘o[Zyn S$ENxC%HDxB)3 + d++kܽN/OYC~[orb6sy0r5++kr:UMhABsˡ[OljCD5a5U-m-Pi/Z/sE{Wc|bŃGv-oڊА\X~QyyJykMyLr WԎrZzGËwlOa_TGLj8Dކ+sxAiwaFSKwFg)JTCm.Y!<(<֎;drzB⒒+Rve߮7xsJCT490cF/8if8VD%fWuo4y0vӇ͚YDG$[gs^iUjݟl\bM1ܮNڊdS'Y˼Swג6NO +?3yG= spԴbQȻ8vBdn#ΑoEkãZS͖Lٵ +|3c)'JX?(F;!;bC[*x|2BE-;s+B.iWؠ}u_(8&C("AIJ%=2W9:H &zRV}eNO.h7_ 5T4-y4ekh4gS4+cOYى%}B] A_WV΋/~#u،р3=xsWJ~69b._23e)W(\#d]a"%]SFrj4Ӷf&A:_փ  DVh3+X4 ms8둁9_zwZAz(yWN<zDU`Wi23eʦibH1^ +-E5ǎGc+O8h0!y];3w E37ev֏UTp6_̤qcnj\|ejYFC{/ڟ=SCGKpFOSq,ZAIo4z>Ƽ&DKN;}[~ƌ/3=1 M߲0YHƧ'WJC;Sj6sGX )4Ii깻" (Prv.Ir +頧ۏ!=x}Wwi/!"}%["o[Rc/z!M?Ԣk )y)?[+u$E"B6 [?{Ϸs{',1?|>q\ԃ;2-݈֮Y;XaNH BA(ygWKPj|=6 +5)# 9;-$ iW{*Y\:W:^궶?Z7ջ>>v^TI +i#ū̥H}h+B,Ɩ_uOR5HWcbjuKBKQe?wcTJIUcktѡc3oj!k0Ɵ2T},yI)O|3Lz0 GfVO&8tփ*ύ6_çQu7?"{'d5/w<94]~~q{׉[.xxnMhBACyDAWNiez{`4_Y@!%atHȳuwkqNu0[<1;cˡ3 +gд§~?'aQbs~rtҭٕC?MX={YqK;+:֖)8r&f s~SYٝi{g&^nFO]O*))|A&"j+D_7y٭'.?2 e:mMqִS]T +*b@@nk|oQq{[rY/]=8=m߃J2.e|O6(zQڒb|xrSxp׮_, j'j}MA_ܜr1()B.%!VL3k6ZzWil2qN!!Nl;[|1ۖdyŊ7n:-czY];6ٽ~ۙ䆺c7-]bU烦 ++Oںew +\Pp~勶SOjA_NSJ_l DT4!]wH~Wbo-~~DqHaiDGHG{hv +׈B%7݉#0M~~ER -z @hB 7 -`?ش zSw޳ nnlOAn"chw15T]BB.Rێֻ}OٻGOIh/JH}֕2l[7,fnyzNջiyutnVʺ髧ލfSZCϫ62zvuLhǖ@#;gg;PxTDd_^N>vNbV +Mub7>mg*FwSsyQ(Pc>S;Eõ_-KB=(- ܊o.Sm5_Q_N~_)~ݎ_oMkCǯkeHk^~kI}BҦBe W__oRp^[ZB&eF7Q2By/]hh*/mC;;i$|^P@N%4$׏/B O E܄W_jrFitRWU@ &y)\׭,]c5crW_ރ5|,,{b}<N@=K3НztK +KőT* 0A=hooiz~15k۹Ӟy!xzTഹ}%{^gx]]K(| =j< PTZ>gI /yo*po`:uۄ} }{DΆX#SpA`zCMmdpjo[%>fջ\N _hY%-r9Ox\@EUO xzח/DBOfb nYQ$؎ןtHrnůEjƗSgHc!6v .jF&Cftdby“K{P̠di`fs>3~ .l-̭~xjp+~WDձF?9QN}9,7?4*<-^I*cC#b]>@G_KWqUtwǔRT,J?rpe7n`y,ӍoM3E"4m%~OKj=eƙg}cA#?3lgx:LMEy0U +MN?bfbFgk[}͇IBI7^͎3m‚# t~^u{N%zC~4jC>Sm/6F}sK(|_dRI{ܤolK #}B ovO^@y6Kc5BU3GMyyf׳x;W|~'}TډRs7tLohnjl~%tu5r; BԡQ)B=\|#3N3ksh:T3Ë́Y_Yk=u~>>ZeBG=o1akt yKx};oΡfL_+e48r$\ZoScb=(a1t&LAeFi=nWTgԝ1^.8ZGLTWhQ{w[z\tzO$FqerrF|Trq\-a=≴tg Mmz^%}lk)U"H׃A/϶ 6G<<>_ xB o^8!9X)R,E2 ^Au!06y| &]T3IBS(bCt::76!y9uy7|Dk{>l"C)`8̏t/>^wA91lksז='+4":fmg6?_hpnL;[fU7Dm_M9܏:[fAm}C\j6\5ed46+^cm(5[p.x ?J9_[Ei+7]5Q9H&y> +stream +x U5' +endstream +endobj + +1274 0 obj +127 +endobj + +511 0 obj +<> +stream +x흯{h,22..VEEE0T`b01̅a鄄uNM1|}dR$c{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDÙ,ey8r\`a iW8GM.ˮHa im0VE@BE߯g9[ͳg_(26~hųE$,(S +Ha i~l80n+$43 _&ug{m(wa i:y.o6nW'](2O311bGcYxFچiN:^"KWiVYq9!_w:OdEto|8Fe^v+fun/a i'~3F蟵:j$W:]%l.j= +^ g{Ax]ĈZ^ +V (2O *_OC#8 ?P=&cVKD/iL[vI_=l[v<ﻮ]_ּOt0(hin*UˮǷ= el\q?q(2/[wxAx;֑ׄRKz}uQdABEak4H7ƣi:*]Z okdt83Zw6kpύ{ak|ѓ`!t L+a_H<)lw+cL쿬r`>q3ts/6\h߽wCW>BۓM>F3?qۻ'~!E"[9QrPk_uw[u#<-l?U7ctQNjx^^ٿ!f~Ip1lͦ3 :;/iXzig.[Sߤ٪m5]՟ʏO]p[D+:&lgVܷ*Ͱ.PP$f#Ox~b?e˶O`n"ܱh0E^s]V^R[Pp]ՖR[t;z!g}NN{BDF^Ip'Ddl >~3x~!E"#C:ȏtȟ6BoQߧa3PO7Qmm՛sCR$2r ?4]a*Мl/37fN|_q6¶ϩ9c_H1дmixEȼw_󷁙sDR$2r ?4a{ٴ˾aھ!3: +ja/Hd~hqfC>n7I«MgW`mS'r^"ci r]zTF >~Sx~!E"#CFއuxݍs,4o/Hd~hZǏޡۻmS)r^"cikSc˛{[i0n>~Sx~!E"#CڍP.8fCt>ݜ9c_H1̻#/[K2cW(e5f#lo/Hd~hZٖ ֏`5u3f?3 ȘW,ZkS'r^"ciAV$^ef[ cQrW>3ڶw>/}Po/Hd~h:FM.8j7Z`KcVdm/}D?vZ'5<;"{ )9Uv"78Y]ޮ8k ~~?x~!E"#CcEeGA4 *e'eo/Hd~hj$nySf: {e1f:`u7BR$2r Vqx x\^V}Xyg;n N{BDFpEݞ Ҙ)֣d#{ )9Ϻj~nՈ/Hd^>75ہYe>7:rr^"cx]8vY I|w { )9WA}X7`3p/Hd^ $uf޼6!{ )9q-;<8x↳$ߡQx~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"?,. +endstream +endobj + +1275 0 obj +5636 +endobj + +508 0 obj +<> +endobj + +1276 0 obj +<> +endobj + +1277 0 obj +<> +stream +xy`Tս8~νw;{&&I2!B AEEŒnX-.ZIj.V%`GmZmkQiy-sLX}{~>7#th{_v`3 %?Bpnzx}o#6_T[Bhǯ]{oy3k|Cy~=ו"hB ]>P|zxP<1s>"N "R/ -Mo!2]ԁق6B( CH~^p{o>SKgUנեr#E(N +G7Q+FNڋ h ~q(栧Q`;.ZIToiGȎ!Bw@+ jCMx Bz.Ix8rې +zV?/!3tFAS! +~tvA3AshmA :v{ߣr]=} #ޏƙ ۦڃdC3%h-~-UJ.(} +I2#5諰oSoX +Y~zօG7n}V):kp `Z@ˠn'z<:p//OrS-%kV}Qp7zq q~:Um0 qtXOp5\e>l-(=]EDԈh3݈ +: ʨT7N0Ez }~4[0Ka|)1~ 3e_gիT&Ɏ%JVվ4z p aFo339p}y {';k>-@@Y'X?c;!Ɵ #aVblmesCܳ/UTkU +k>3RWDОqQ +QMBthzz >@8c +~-@ݝ>v{5[1\UL=´1̝̕p=`b>`zv+; !qWR5Wu)uJ+tvbzw7Sh=jꡩ~_Z^㏢4H(w > 3Ы@A`@Rk-σk!^ 2VpFa|;?HG`nOoCpG9~3,@s3Y3mc:E̥p]lkbnzy9¼Z(fײ.W7p \3{ 6*jWmT=zy~5?+BNExS(QV߇ye7gUV&= ';چRv{S4+_U5'fy ؀݋JY /e>Uܗaf3PgnW} 3cogo/TOTO0?A2w1C?fbA=\^) +[`g1wjM ;68s2;h R ]<0~} +/`t[77;1cif[O͘9 `LhZ;PZD?3BUo8*Bc^GM݅jQQyR/ɠ1|5b-PKm+ ;Z B7b0kUq^(S?{ڀ 8?ZqFOx5Vr) yx|j.R t+yy77(CaWZ<5tUa{wi=hM髥J4JQ=ڦe\hk_{nEzN ?KhgKϑ #+)t-\vM]+uCKOX66zRPF~ՓpW09oqJWv#^Ti5yFSe3T:QE#PP}^tحI2:F- +cR~y4?sI> +^P?*CQmF~L-Jr%fԜNay +!#ek7v/i {өQܶ>ng jF*2t/51 O67]3ʮ%0%sF7rB涞mzΫdݱcT^}c%_\M$uudDyzF95Fc}#4_/F7~\5n!5ADUEo?<%k+%|T"I% ӣhu5 v8 chx@!Cݰk{ {2Ë{yGJ6;2R3<]s0Fع?dol]K]W;+k۵\\]%\Vj^@ҕ=TюpUs`S]>3H_\aLi ;FW /+&Oc96%/ϸ(t;X0cܱCsQ];:rǎkJ²qa{v OoX=ю{{aq6f SKVP{i~3m{ =4 UuS@ 1 +Kc{E$byKP '_/CΤqd%ҙ慓ͨYjrAS{9tVf**)H!|th{)E`vflp& ~7ɩh19]9:)R,d[\$wuma7Yo< 9u |<C̿?[mk/_"DӜ<xѥ7CO}C}6dq؉Ӏ<=XgsCN'ch +@EHA>U ѵB/cZ1,:)f +9Vq3G>UYdB sK\Ħ"Yddu;%j &O̎"sH&nu}mcc@9`QBoȕW~F& S_X/84uEXi\i[mW{CƄϿ?F@yܪ9LHh{!aT7OL{s9cYd1OIf1OT7"*nf:#PN3#=i& [ac{y&Ê% cq 37xIN LM2 d1Cp09^5b .Y. +jFsp@#Fj.dm86IK=9OvYAJhIR=p!YacӾ;b[٠m;|y?|C9q_JT'6-jU5ݱʭ$4\l=Az ʮFԮWb:lbV1sNXÛhQd9׉( hnE¼ZyQt xPjŻٽ,Î+NBˈ^4F^2\Ct D䘖br irT4QٖIrfIrW4ԇ-l +\fzr<9gz_1~W'אx+MR}͍/߉~Ql5U \<+zHẌtS_&2{~t-?gwOnފw[/?9̽Ϭ~S=s-7y2<ƪQ:(81dB߇`0w@5(YP`ccȈ(B,Y"ibOl'ݺ1 GQ/i@w-xNR?Z <OX/;h~%K^oBE|c4Ͽ(k\!-6^)m s ;ۤmv1^tn2-OO]&P|~Wmxvc#LV&Q%2IVӀ ÎayM11~+'*/>DȂ-j; A11H1ȊpAd>{o8/1#6C&"pmŒN$M`iۤ[5 G\_rzqP +Hh zB1 ɿX7ln~7.-pq3_}kQ<Q3enܽXr`j 3_ f~*#a3l?L2u!aVcl7ٿ}ֱe{YUVL0AƃQ4vUUyY<ƼwД4ƶܩ߭gclVZsc\+=ׄcr+@VͲPa3˜SRC@a'ye3g&(Am^[LGy:t6D*5}2 Hv,<*` glV3<­ja_z#wpK/L=ny;[fCۧ|ol/#O[>ϣg_K_kxrd?+}R בa\qw#9%#+7M#רsԥMgonӲ~^zNޥgא9qyӽRjMR*ɀ_g0:ym13F"3̒y0'I2ytifc>Q61&6V:HDc +v7l w)jwky9)Hb*WY^DA ,$Ԥ> $f uOcmԐPsTۙ͡އ`Wɦb#T*)\ڈc3|yak (C܇ ,ݩmu@륌uٓۧnѮW[67Z,{_0w_kj:ߟƿ_™`AQ}E˔pB EJ$;͏*f̻IUnQ  )ݻŏX%' CV 8Y3HhgH$3x5 jRrGg nOxM.Q:t4Ȋ[dN AfOt3P:3D=a/M6OUbHbBX+4Xd뀼4/_O275r2crI١RwrKbfҘ\ô"QccevFu,gjW֟ϱ\ЌЌ:n"^ eesP!T +Zӆz1a!gc\)6:qJ\yRI-8'v"FOȑf"@q,$yVO\;dǃ' ٔK`'!XO.0Y`nEK-ͦt&+@; +$Q#! HJhs%s#C%K>"ph ߧ6/cVX!67xL3CG +倌rHA^x +&f9d⚃b#Vk(jh.ھ +$gPT_X!J`/X +`r=Gm:M+dIW{?(LDkʩhW+[>$`fi3p7AվTfw^{K@Ay8rW_y]q)S+FUUpF*noWUwޫ}U!!1'}U-Ea&lU2 [r܊{rrVKe036t1]XLZhmx"7>\ BOW2q¶#(Ʀ?h¤4a +X487pxѪX/qWuzWDP-ݢHP0 S^Tl0$&;y19!\kA` ola~mvס5CK}{ҺnsS`ױHk/|y_iNˁD" b,˹r\ Y[T\BZX='xORRRwoՅ+ Vh=Vn5 ,#dwΎW\jrtу63  x=GJG:U3$u.ƓU5lHXn<:Ê5db3aٴasDlm ;_9SU: J Ȱ(#gr\;qvV1}AeP1,ہ), BlKULRס!YMZWT2. WuUD&iAྶE^{Ji}x(Q_Eu\XH^0 43%¦:?Sx,6}6j{nƻ>=]Ό|.+nRCS|_^pۛ4:A Xm{.ۺxV]׭W\GSZ@a_ce)_wVpĶ14ngZ4WѰ-[BOl!Z(M"]cf3N@7FHMm[Wh,)ђHD*)jT|$4An't:n;ipJQМPpLEd3g']qĎӢ1ㄅzZ:Ƽ@qi! kNoE݅S}f{2© T v=Ii5AFyK3O;4o +;who35-LX͙D: ҕ*mQGn*Hn@ЯceݠtαJB[\\dέ}>z 8׬430bL`i3i:NŸսD%o4Q4D9%z: GqT"/0mH@@6TlFP EYViw Xh2" %3͓C@l93yOlLMM2-:z !E10VY^-jDE|/2[3TE/j2.fņM|W9)nSM xA@JȞ-f"ς3yf +yrDCb s`D'蔵E^nmQ[PEb )z_yFy|NP_P6nFNUl|i +EL#3|ΟxKZ1&fGw| Y0J:[5MԢ9qjܴş~g\nj-W6 +UG'gnjb>>-&&][F_X{)>LW{IJTJN)<աx*H)Hٵ2!2eJ?Q*;(Q )/`&%Yt{+FB*R@`+ 7w4vBeɣV|>B7Z;2;G@ +Fh%  l&Ax>pw +DWvH:# 2@- LT`| X+"l2 I@DsGa{F~Tf:x6\)nhUrDh~O9)UrrNSΩiN16UtɦnJ +.z{{-rncexÆm+Ll?|?סG_܆VIKngfd[#^'Ҩ"؛U$#V;*'%ECԎbb&j0S/Tek#Q!c8=<9k[OHe4Ncҫ:F{D>*yJ>to+ZNMwI?~/Qf#튱s9;;uG9Mo #nq hZ-@TI2^p/+*%?7E$W0xQHcwJ2|W'ǰl4I8BJ8Ńl}p{-Z%PlUBbP-{/E~`OrahI[KA6XyH*Αx>񱚯@AVlâb,"$LЍXw1Fѹk.v1"k!j* /ũqw;?E))7vv؜לDP̰KR27=`+$~x@ov= h +WQt;𢪁U\3Tğ3!U˫rU{`Uȣ^.ʰAَ@JQL9v:FbՂ[jrl7tqt4^Yz"&a2GPkmw&@))91$OJA#P +S|iC1$ā7Cg&ȁ;)!xsiZ]+#ĠkX5(VǖGzwߋ + e4hŋ Rqvx +/^hA|w/+L t|ŗd{ђb;ڼTJN*uG=oƁ>)kS4 ` 5>sb7mǝD2Eer)6ЧpWq9i'#=VR +Q!=cH1RLKcZ5jpGᮂ;xji(ԣɗ∝!% =ThZ+KKxݰ'o&(Y!1NI_ eʖ5[-X' 8H8H0Ӕ@/H$&utcCkS]I'B̢l x3ۨT4 7pH#78xM򸻱q)X i5*P:i~i~8X ּ0zDg b$i\ΈzDG5بּ4HE(@N4OHson.?e"^xzdfe|pħ%( _eesr\#DDNGTr;($Y[qcS9Nq8Jc%rA,C hwKg +Y3" +$R-NGJ褖w;1dĹyکr:EⲘ +&s/(,,຾=uzƌwմNeL܇ؔ_)!WS{3̊4JYQbs Q;.SH2he[˖5hJ+4T,5NߴA'+NdcRƯR{4CлVP K-5& +&$,,Js4׺e3uOHqCYFچOh=1 %9a +xK !zG]K{^BP;Ys.'D_GDIH/*rc5$5P )wr Lsc@52+,u1ѰP)&D$D; M4ZTBgGM:n d< DpA16$2Hc460 ̾pEkd‘ Z(-d^ {zǘA3NrYT9j9jo aZ+ +羯:/":>EtA/6CrAIL  P1꧝e@ȹb)"nR7byA^S?s2#p5 1UUS KҮ-nyFlM2m0ƪ7kY-S7, 49(T"ӥPVR SH3cT¥t(Ys(%QE$aB2$E"%I{G͛s;wscޘ&LF|-cRNR$c M됑KU![ @nQL37kn6l~zWUS{%SeQCbڪw \1b1篹፭o|?ZRf/U''qck`7{̽S٣kqTdBXK̠^fj 2Y\HfJ-2u2hZ^tW>{"UI3gG)Z?2QC}//)F +# $ Jp/rF^šc-=HVC`k43`tn-FZ2ɠx&C*GehhgT܉ʑj@53y*i+gZftV6]Ŵ%u>77))3pVdf UBa.ƜbTH44#_3٫a5 rwp 1 +J q[W Uf5({rHZ95HD)d-z1bhAqVA^5ڌ/Q, $a|Z_`Q &: v:w.ڱzgW:]S!nIa3jõK6ZZe#lq-k7c[mԇQll`朆Sl7\rő^49 \N{ TSHSqgW f@O*h^Bbu]/p;Q ٰ(95ƫ:N B@;ņ0.nVoU3jH)8AO +L1Ng?=i;=fLQa8Akq" +rk4jU0$%,@n_c|&P)d<, %JO|wbY:58TqW3%"2\țE -q΄p[#6-gϚJv\>5Rvkⲩy b#v*3K,ˆ)/5\/: +/u + VBLqq)GꌄՒzc ƍAΜT-*IU,ƸZpݸ=ff-j9* 1D})po,ӻsQ4E7gTLuPeRkTS1h0Ǐ73Y un@e͸Dx]m+LjHcZc#⥗P\)l(bJ[tZ{u+cIDTASI ƺ1,+ۀDp,r,[wRsߏ|Қ[R}ϤoM;m=nOoUx&kaڭfJxRԻ4_95'UEuknJܔtxo^]B?,D6nT^72th'!9k9cF*?>dk"$޽V{,,#3frgrZ&~8bdc^qݮL@bjwqVL(Q-uM#"$(q_o1  CzV,d H֪k{˞}CCyFV(Y[Ȓ&PoEc$TLTXi /qQ\nf7[~6xwN@IS|~>PK.lv/t n\ݱ\_)hsAWM:֙$;/_=?Xtڭ7F+q Na1ȃ'}g|hzhuTM,XeI edsB |T#kA5xVLV8͐r|ı +{wC<}r9'4]j鄋Xy@F]e󬘾NPwk=XEE8UyU ,e%#2@p-'ƥұik>lZu5x ôvv^ds}vv7^[_[E3d6bX={0kUF {?XVϏv d`oX-x؂ɿ[NXNZxK\RCCG-&6m Ӹ:[d`VG=5ck~}?ꪂLLO>v$~1oU׭Yl گpF4IerǩGDh媊ݶ"pJPMFl73V ( Nޗ2hv(eM)Z{Or +NJu"QZREzR)Tг M-TrkkŘL!O˶ۘ&1g6cZg!U[  ,81qF\^h*hYD"4Usdm'vŢA($2FjQ؀F169L.wlXaF-l.֋4&+GmӨ뜤Cx&E#S#KN=6@'v1h SJpKa.nmI^U\>0ٽ]|l~#\Dɹ +̼\Cj5ryGLpp3C@ˆ% !{QԨ=Z +sZ+5Y-f%2MȤe'%OK4=U.hBkmCI6GKv7&sYp5s4vG<"Vz7hKFjќWWܯH@úR4_:$pЊć|VLo pO:w;ϸ'H<(& uV2N +9"#n$&K5]#Zr } qX b +ܸ̑pٯ|@N *<0&q'l?!jCy[ީSGUS-@4&sSUY]XCrRӭ[w;v;Wvq<Čqгʳ*? ID3tfXg-KKU} ^>>^eowb=>f۝: XQvȞjn)Kj|otWBV#?] @>p:p6` o5ʮy|٪mB\l<== dIUŞW$r`RROF)tz[+|Ң6ńTw['WRF.* +#e<5Y=u`bSDKS#63ivՕ۪KMgUZ5 /T-a=Uϓo>'VQ,*X𔖽}c<=OҖzWҷ. +KllXIXai{"5 +c90!,s4T;Յ&fi3PB'l==?ⅺϢXEc֐}]Mhs.͍K=-K}x**5g;Ɲ2ww>:.v=(9$ XV:mEw,XCi8kvYt$PBљ-nk2c+i6=ܬ(/knnX0ݾd<lKˋv{iuXI{=gC=n%655"ڻZh^oTFE)miQJ.sQES. +\bGIpuN';*t R-SrZRin9Z[h>), MH7ZBuXHm:)|DI|ױZU~뫿yغ-UFx:C]%]a+X@DׅAIWMXqlO#FΘAL[V~sY,_L/y6[bR$ϩ(nӳ+OFƵhog.GQ[l΁D=6(l\NdNȜ,|P(QS2Tڢ D{ ˢsU\%%qvDžSYX r4P8+N@Y4%W,3zO/=#BRehDB~#1Q^p > x]w:w[bo{N;.ҷ?,{MXU"͛UaYrՎ=~qz|--Xw:՗VmBnBzLnIc/U=跍w}#TySƚd}E?>Cc|W&A.F]Я"@ox&K$ːZn~TG. `$ɀtM"CЕB&mMyϡB &ĴM# +RkB dN-!/[KHE!so'64x>@Ḧ́8! sBnm!KC!$,!=1BV;x}5#_ FD0Y.WD*|rNEwZVJ0R[y4w$ѶakmQ}hXRGH~/u1`-Qے͌A_m$y|]jWE5͊kjv9vU0KVG_# Iyyz$1Fcl*=ۇMyE2ۖ +$3Ȋpbl&5jYӷJeSn 5ΗScLzc6pfJ]Zc]rz;FNYIeCl" OpzLNC3&s#ٱT2z''>:S#䞍SI9N@ֱT&=WpߝJdѦH:'oIs$oLCȣɱ-,ۆwtC;c`b+FsCȚMC0 +@Ӑ+AX,!S9euȌu͇Xǒjy5_7S(%"8BC#ĕ H粣<Ƃ kZcZ >0 N?Yˇ5Z|D!OOyo7n{UkeR*;6/\}ðqeZWݪ 8zU #N^۲(z3/m;ƴ5#<\WK5o'}+S R[{x_&ş: 0 +@H|>igyo? uG⋅JqabYHenhnL~/b\SPB *C/Ly}4{3NJ$4OM;#=#O(9 |pp#iq2X=L"(0 ¯A~W;I-~\|~L|/} j/"~-9PDrhӐW>@/ϗ1SˀF!p!tLŏüI"\ +5G*ܑ.~" nwTmĝ ى4a "ĝgq V; ~ lT4i;)nD)wUdrlaXvf䔹ISsT +ڋA{̀N,x vDҸ0.ZrJ^,H i F7wEY67^>-(aMD=d`lmbWyn56=`=`[O[ZyiY9^64^zèa=JXolmƭVd7(1\?@o `'΁ RY@HagR;v^i^z5jf0 LRv!eCʆ Vg7QC \vQ|n;=-.d +NkF*Fo9/D"m4@''!e|zx-/c\8ҋh֦eXrv5 `*w縼G?L Z̭[-yq5g` 0 +8ЉkZ\-<''`6L"8Δ8MvP1`_3㸍coxl\foF&nmm6x 5&ql`9Kkljl[kl7հ|0wmB)V/Jl%BnRNs\q%;1amh! T\,ny{BAigiy.ձ4[ Q˅؇#&fEK ZP +(~<郅>O UBɞ-0A&Z0jB`L%|:V˧⤂7xy+]INWFj95<Q?^xTzio?K 9UNS4]UNMP +N )iAVǤ#Mғ=]? }γVtAPiV -^uf;vXEPc(,nZ=cREtaiwU>n@> O-Hs1k`\e|Fc(󌥦Tl*2YL&3 &b*e׎ůR +j1CV +$`]B4_EwM//ʛz߿fO#NSҷdR?N( {%;ソvO r+.RVr3zKuz _quElWUᮕk_Gs++{ qa8.2ҿ8svϚZaf$3"̌)n0Lk;;&kkUgRf 7ڤefB5r_^am]dyrGL!E M$?$;Cy21x S'<do`&c㱉ؑ>뇸T@mvvvZS͚cԊ9&ŧ?Kfs!( P/Y^KE[xhɷ w/Dl:]Vb=[t\bd%h4Q+תv#.B[ݎ7%'xK#yN>LL}?^pg3$fr@K3,[љS`)_r& +endstream +endobj + +1278 0 obj +24015 +endobj + +509 0 obj +<> +endobj + +1279 0 obj +<> +endobj + +1280 0 obj +<> +stream +x{{x[WG/Kdɲ$zY$˲$[vǏ<Y'%Me[ؖkI:%%4Pb +}smzz a 3^9$}:kz-PBH(V?0>?%3zM?Ok}r~j?APE205srR?#$Trc_I('ѡWܿܭAܿ +U3$Q==BH¢*LH,\r6.$L6i!dȞ/_~jc~%LjH +J)!Zʍ +sj;=^RW#~ PS8mnm]=6:6XIf]HvJ0{#iDMش1/BB;.S.@W0@ .yzn:P8t^Q?w{H<+6qV"yo4}E2uP'(%s8,ss ++|#{F1`?7p=܀sFz{JYA%}ΞsgB\Dl~;zqhF!I +R2ARv -[ 2׆g-v];$ Wy-BZ G!\v~[\a;da;ϓqܹr"QЗ K ~c"``k|(9Dj;t#U5F1<&z&|D8' _ ,d[k(~Q`Fj\* *:$FVN f(u26^_clm6Fno޿]u]橩1.Eh!elZ/=K.& $RBg6HTj/Bs,x,Nǎ}ǾI[7q pMs8+-6m h,ڳ*bG9BUevԞoɋt^JI0xqD;u +=dQ7UEUUƻϝWWKd"SKcq /]XXV_lXgi$p0 -YmKy+-6vm8{G{iolVl# %'w`BI]qgse䖢 a)zXa)zXa)zXҰ1V/oF{A a5(5_3,z_Yh@]qF4WWwn;ɋC#^K(ls:|:t3X}oxT/]ˣ(`(i̬6-F_;">NK@+::}r⡇бZ]x @)[b'QMQ Q Q Q Q Q Q ejH O/xz ^<O/xz ^U*e邅VdBޔ̂݊.gM̊'X*^jR/g* fOgG,mӟTM깜jٝrlۚhh|6GE I|],`,c\.d 2 ÅBp!c1\.d 21\. +ͫUj#2/հ\ +Z5Pܘ]y@ؗۢ~@gk|{b o;AaMk;'DG`̖ " &Om} UInGiCS,#k.3}rfjVkWXV,󝻣WK_m_iޓ{ןѵ7f.'n:}ݡӣ!>ʑG##̶ ڢ %rt,aф!7(驪ӓ <ӄG6Gа,gYfSLap6bce[l-@>aS]{0JYh%`Xh%`Xh%`X`XAD-ޗZ!9:m[oVMی?9p]&;F  +V:gsqUvw)Xlk:>2hU2R2$"G`]aмJxW5mi٘XWH~,V5w {-2>'Sk^H~޷N 헑)cOw_Gw`u v.3:"OVxa)7/-ո񀄟ZdST bukN}^#?z~+P%I##9ڼYA8 K&@P ܫFh󆩿XYA +- hKtTh}QyS_oA˫=`TkMF`MUE'[R#g,{@֤S٬6{..Ѫ +TSi)W;2_m$_c睬ȅt)^}b>EbA#}4O=dkbbWS}amV9œNDe%Eʍj~,ٽ,xX5ZZ/3Zjom.*C\kzhgඉ#U]XW+9qNɴp.aFRX)_+.JeY>fcQׂG +9oMZlqډꁥjgx0}[+nQL:w/ X%L"Fx k[{+-6vm8{G{ioۜ +6*\Ejx J +ل9(M.cdm}B]Nr(V~ej͆tm,V2>ץz'd/;]ް~P+N שGѸySPo uX`/8|%~t0жm +#.?.Hߢ:)(y>;7wXjLn?EuV8X-(Rkg,d +n+F|া%nhz:-~!mo{ /ئ[KKőo*v仜J̨RFs5obyF.Bt:1`ZXl˙E\4Is+Nal1EWcڲԶ2Wgt+l5\siSIrMnFrXĒHaCD:0d@>"\ڋZdJY %CEw.Y]\XX].or2Ԑmiv4Tkm&[ߨXUֆk/-áڨ/Z3\a[ +_ M L+|ak~>W5;Q4EeK!ohglGww w]#'z{S~pJyw yVymrk*VKCLr^vvmC;F;v7G> hsK +b>b[_Z"tȵ/]"g\^IUiWmԩ/sF濿$vp8:G{#5GS[dE^w~|ZR;þ`T@M(aTZ bjB^~lJ>GZKr`-+UC1KxkwEQ:z8gѮ;]ulCsEYud姅MX +{43H1)vA^oC1ߘ}LF- _Й PG{jiPuu)}v# [.G".GQ<=BhDvq9ŹȾ[؏H4aeQՆo|l.Z3B㖃M p0eveC`p"~tS_9ZZOfQOoyu'~Sw|.?ǧ;~T]u?0 +$ +tn]"3 Ϭ.A}h{tOC ԯx?;Y&=㫯)e.B!z18IUՉg{1j]50Zqt~|_Ezx&JJ] >7 Q;瀌ϼLvnBD!4f'D(!О#DEB4BJ D{+!:Ⱥ')ET)CC6J +ѯ/B w_cHH?vJl+A[)4`VdتR=AH ٻ~Ls?oqF\" #&!|u V s k ^ Q4\J[8Cd?+Ŕ~`kBEᄇw( + 4bKUDIդBi pJu4QK[|q+'KXR#V[FP.JR4!jbU˴XT]L[%C@Z%ÜB:՘L_^Nj8]崑L\M˜`ങt%V9~T)|]e־2i{Wܒ?Ή9>[gvɹ ݙNΧ@-$Nóc[̂edz&̥&㚶ff|r.ʆ͸eŅT6p<5OĉT:9)3`2Nϥ009IdDr!%NbxznJl29ʊ3\2̢Ίs|^O-NIqk*=K-Lāc,oNׄT:2hs89͋ Dz|Ed9dPY$ $M4zDlxI3T[ѱut$_C~\0C3cFg %N~{lA9&_̠%ї⼯ׄ7S3gE/#, wtM,cST~prgd] #'[o{~9jd6 ^ a5[fȒ^e/K9s>dt3J]٧QPvHo}uz:alIՏw~ +e'Fbm7!|h|TtlL6!0rJ7Ip#&~( DzYa[ƤRH+k +l*M0Few |Zb'oDWA&vP ?%/( +endstream +endobj + +1281 0 obj +8959 +endobj + +510 0 obj +<> +endobj + +1282 0 obj +<> +endobj + +1283 0 obj +<> +stream +x{{t[ǝ܋%$pAIx Eć)"eQ I&@=yxlc[q$=6Ijuͮ7muocv:6Ik;$e;ûݹs3w4!z Qlj~=z5'3ϟΧ+5-/_MBV...sSB˅O_B2*,!([W+\O{+ -PGx"}!2Cpi!z^21m"pf퇶ȐY!;\QTa)EpYxit8".(7 +frD'Wf;favv(%si=<-4RE+ԉ'<8204+O?;VꝑE?u conI *#dN$sBAaK56ZnA[*DEPGOA\ׇ9U("Eڍ\뛚b|no^,Jqm8H-à(1L lt7݄j%EV(DׇY_|;(/ԟTc3 -n@~Ÿ{ F6nQY"Eϡ<(ϢRfElƫ$S;l,3}tʫP۬ @s(lT3 +47(Z{s/ku3'-񮞓Cgr'RWǏGlX"n5 96-[kONNựWq'~9bKG$`t:hPT6\} 273 it~LPg*iJW-Fijiiiiii՛Pi4n?'naL6gI));-T=Ւhhl&Ɔ:JO\;22z;G#'B+nw{gpEcqKY‘dϡHt$je c>lT3g>3 |f3g>3 c]@q2=@B <$lievHJrx>,Y5p6iXf>FKs3e|R+jVr*4y:40'2#pHOw̎`(HyoX<O:SI;_}٘8T;=<f,y 7cWy(1Q|uG}=^*U_D~e|܃H)t:u.; +ΒpNJ:gzɿ|+/WpG1"z0VUfUZ,, , , , , , ,87`.RZ<]bRQSpO\̳,CS|{sXxSneO><_uP`00EY'#_GV@P䟯]4W2\XB4" Ui|eg"y|!nTN;o޸C%JlܹRnM v &Hl]PˣS@#FajFajFajƚjF=AZU:EX4ei"t`^434>+-,՞Neud%m}3#Wp4:&=)d.Leon<3~KdOӡ _뱧%MMs>&a`&wc=L7)ii0dt@Fdt@Fdt@Fdt@Fdt@Fdt@Fdt5dt@FG"]PcLPPBP\`Wh'{Ym[]JyRɌF +:o3,oP|ܴzBpF sVbaxmB.r1-TF[S-TF BeP-TF BeP-TF BePx``?EFZ1 qrD(WS!ݹ?:{mw)sVJ`(u{Ѕ'Tf 4.C\ߓ,N]MM$ݜ4G5dr/9E/{HߵU888t ϟݝǓG$ȿJr5~\yDLרY+K"2el-h@Q]e=W!t"ĝ} +_En'_<7ÐQ u:^)uBe9Zzڝ3| +;C]L^I&h=Έ,&}Nە#h\vdFSā^hW@n]b!-d/yfM+⺔̷7ṇn=LE#k/]!3Lݴ\Ms0Lr}ٹ:w|xyܬw13m֘9/tq=W=}mL3xFKI9'qlDBh~{_E~gm [d5Kt5&ЕLҁI:0I&$t`LҁI:0I4eٰmqm$Ŷ IcS \/x B{P^}/Ծj ԾjOd`䨜^{Q?[߭fsl?XITt'DsF +ŝj͑n)7l |zAk)*/3jm3rb/g5[ಹFA[sCo ~^`6?oKi_ЪQ[< +iOx l- +X<5*vw@vsljk-r0Ҙ$zw&FbT71PZ'6o 򜪺<~81dњzo>r%,hdM*{Y`cwyN0 9<'`syN0YcsJ9E~#XٙT cn6Kd҉F{njy2גֻ>.jsv}֬h'KM,֭UvD;oF&!,qEs(< ֈ5f!̐ a~D9oE i=_ZJSD?_ܑr7ve&!\tAwz"1ҏWƟ6Mݛ=ɜ/^X|b_멉Ԙ?h_ "6F&zУ(TO80 ppppp_ p\\G]+s,oDvBP3Cm5#6=^6KH#KA< ~σy?A< ~?b֌5]w#NK%Uu]GQ-ȗ-]6W\Wgu;F69hnP) ζ;3Ս$gWz3:]QV_t^GˢosQw}=ݞl=s?r#-F'U9 `?!=KҎ i߭ƌ *)333333333sm1c1F.MelM X6&`,elM X6IgdԱ{2{MEq1F:w,Vo<<ӘKǏtSٓZO&7t|41I=|'>^{Iwݞr}c9{iXz™nKOTF+},A$(m'EZ[`aPåZ}IdZZzZP7x7Rbs(9Ϗt3ɷ-U,zr Nխ|x@:<ϧu{Ԭg" +Xsto*/Yޅ +WhHuM%30%TSs֓F5Ɋ\ysҗ'r_yqWkBñ[7%622XXrt<?{T6i z &B]ii3:Ylg_(3 ks޷FSwx7}Uꯕ4(So#IuϪmnB}M!mࣤ|t=|Q+/GCy8d.xaugm->g;l#1j.1[/3AMf9ffM2ڼl+* f#!fc*]Ƭ5R[QZ+YmōrElo](L4k 0q9Q\+U.`o\=,6b,+|ӮpaeE/׊rL%,nʅsV;\KJ~eXX/-j~~V@BJA,+q=o6kKbOO|, ke<^)Kb,γFxdQ(ÅBalac!ml߷/CltNF9ʪV"FPXeP,/RsP\,ʕ+%:_+/66pyXY.mV +ցFYDVq}V 5"V02m?EG]~γҚEy6>?**q ޫۉs}@:Hj5<6 )LtdL}D x=!\ +endstream +endobj + +1284 0 obj +7970 +endobj + +514 0 obj +<> +endobj + +1285 0 obj +<> +endobj + +1286 0 obj +<> +stream +x| x[u@ @A '"7)$EZ$eHM IYVM4-in6ɦ7qVIGRƵv6&_46:yG3e5~~>Ν{f?y\J)'C k6> U wm5࿉?c)! K_ +tW9<$]Y?ƕ㸿fIcH ߶6{B} +tg]Cfi#~&?鍇+!kpD kk% QATh+tzCd[lvt5<-V_? #X<_Ovt{z94zcc'mo\>7:yO5&(k e /eB|I'(ݙtIRJs.š%z7 ^8O01Y|P< /^RKtӎK36=39J&G<8 w :2|%E{/;ХƦ/=5XABMqjԹ F#I91ԃ?2%rZ(CirԳ@=f!7z|z5qh_R2XҲbze\H_GJ7Wu3V\_BBM4|{oa> ~Fm\Ö[_GõnzԹiZpo%R{oP(*o(R9HPQ5I Z1 c(p!U(9WC`41,Q=#'X(Y/" ^ 0HK4- nI q)@|*jUfyHTuCY\m[6c^O k9eIU(j}q9]L%1@?6(Q2 +W NĻFc/EBPH\H^cBk5)k 5)APUI#uqr9{kj>i>;#%# ><%ÅEAjw'T(H i']TW~M YAUפk܈kW9jS$i+ia? AR j%A#PttqS(d();R{NVnW~=: ivpZw]ݣ"!Ĉuc8}U~-o LRoav62@1n@w= z $SlRlb )6HA Rlb Ŗby<0Cxa! <0CX,%))HIAJ +RR %))HIAJ +RRrC8e2Ű4,KqǕB] ƻW8W%mm2w M`Xq9,S'7xnR`uKy I/$0C׿wPKi64F-V\M-13>iHg{ +ǠܮZnbIlA3$ܬv;i h V2R£HRIJ I $)$%@HRIJ I $)HRIJt;JV%Qw(/J =V?7]wof n' +Y +RGس,u9+ylbׇif៹HgQ/vdѺ5gXDHf^>H~ty~t?:G~t#b #,K2$ˢPYw+/%,m76RObzլRok?Om?xz'fzzNR'<ɱ1=vpl1Q M.BZb,Y,D00t +@M³/@+Jޅ)m 'tZ& :- :-Nˠ2 :-Nˠ2 :-Nˠ2贌I'$V* !fB=@1iDu +#VĥhtFְ6Tw8 Ը?1i/=a{3NpLϨ#p |8R4p;mhЭxe@z>i M^B]h t.4Ѕ@B]h t9R==CIkQ(7/7r(7r(7r(7r(7r(7r(7zw +:֤ +={XUҁ=3(f ++ƞtsMWIޅ6yeݤpW[ͲRRMo&#)螎g==}ބ?:k36\WTJaqPN[}l<{P048S{[LZ} X@_*0Ǚ&{Fie@#fDۭ&Mv1\W^s3BO>DL<(.:- iU,''<`i9X<-y9/Gry9}^αEiE\V^A_<دJIϲIiԡt}˦ JԞ8j#}N%n {}=hMhJ1n[:n[Ih]]=zt596p2^cG:flչc77 ƨwM1A?}#{ۆ&=n/$v҇\Agl=lAe2Px`k7-IxPWbfQ,E1(f̒I,Drtu_;G;MdÒ|KΎg'vD!r-vɰ4.uqGu[K{,Tl$_my{&TOX )WDEtZBck@ vꞡ;;oi}pT(0nkYjKE Mo'QkO;<ֶ9D;4Hdb#g:'kUC}qc1w2vitE"TO#F}p̏QL뱯} 2YtEw(e=RVkj~yP4e@@A]=bekynU,\f8e`ϝ@M~I'=kG0D.yU'R RGWO=986ǭ#Kmֺ==VIs%yo !VIYߕ6Oaodkf]K|.(Ll0h9MoNZ&9~}9-:载j<;F5yֹt;׺+R0^`-ˤ;ʂfk[2E􅾭yl .AK]O|6Y[Ƃ?yd'?4&xӽ*cߙG$ӍUQ<义4FMZuMl+s>W[vnu152Rvͷqu>b0:yjD4RJaSΝݹ/ж=l=OC(A*P鉴֬Dz2? Gs#Ga(Lﳾ@zA Ty\ +ᛦU1?֧etlVf}3q^aZ#h}\o봷t.-itW#zP+=2+s+,3~Vȯo*|c#2i0v_b[76Xsd͵ڼ5ška͵ZXs-\ k5ška͵ZXsd͋w]vcx龾)k:z۽SS֚t,3Lfb+]]+ݽrEi9P{NbU*T]bZBUh +-V*X;Wcc\!vp]&)$S"\+reL5 ;yfi}*r3 g~t[Hzi&0b +.Fxqл;_hJ7=$G: qesc w [g>$1cu^#4ȡ楔t`ʭ0"pw|_|Onl]ԓ:ғz[>KOJz_ij%Xa}M4Xct27ۑdݷvFuDka~1Sd'BU-.3)~Pw$h ~z;$+H 8/ Ut*  hH!wH;$ x0Ov01OгUrkWIc$2 An(/¹T7;&¹T%ҹTa HmuC1k[rdP3(MV@w4u\!~&ÀC~ 'A'@ˠ O+-u5 'q#ccE.2y&c[ a' ;ifk ' [W]}c 3~S1fr7`%l51|M +SZh$[ th~ mVyQcuY:MI#{a!qGL~ِ&T7E4dP\Eo ɡL_`>=Mx$l t9+᳝ӒϦ-—cűj_#]Mu,cɄ2*4h{mE@Iur{j::Q()}=GF%=hzfG?ˎKKܸW@ \$R8r@}r@~ _0}$#J^Tr7Hmz8X@lb~cvݰLsö͍QDhDMCmj5=tJhmgo©3;Z.~Pkkؼ?:wtGJMѨr%܃v1lN˰uTܕ :1_'{˜- Q^1 x^.C) % %֨$IsޡUkvP:Y߉~wÎplwjJ8r/L#Vʓ]vv}mܓڛkyJM3QΔZTL+)픎({A{u~-Weݰ2g(.ahj;_|ʐ&&K>T)[O;g.qFZQYj'syF38fIFVJ5N~^aϊI pk/^+B +.e_{CUbev|(Gv"48|GjS/ŎEH8|}H5}Qcn^xahԘd+sD04xe}E+[*[Ryêmb5e Gf|/|$fR=kLs:G"rd6B!i?l m!`3l6Cf !`3lfzq5H>,b鶺,GSnzz.,|DG[=z< .і +MhnqV S +g9wGG5n.@KUeSwv0e66Tj+KJM@Jx t%Zo |ͿažaT}bJ9L5)r`\k4(zɩi]C1T˂GGsiՔ*UoT9԰{R$&sBq?l$`tΆqX\쁒`nGr@tcp@m ~:|[>;]sOA8/ l Cn_2(k'裹Qb0O/k}rYܫ_*OvC}_2.Cj%϶Kjۓ2Pvb_^*G$::ZɫX0|b%C*vXK{oҲWҦ+kֹJ]_:]CMJJ]k9!La|?/M(nvDw5TIʭƾQzo./|slvgwҒ83j9c6"r%XoX | C0º(32nEF&Ŧ,:x \YU4[JKfeYU z"FH^dSخ +A/\a6ՠM M=πݳ7ڮpzN>]X2JJ͑|,fBjjͯє%ke-̷颖<)DvРmcP&Tlf/?{fKqBRXNHqBR'8! )NHq8!řf{8 デ|p>x8<tհU| esϱfr<vy |.lpޓyg&*yh{$Rfs?!^OgHy+yEto]*|gH?}3( NfT*HD^ -R}[^dRٔi{7>{ICX H-G':Uj[_AiڲE,ŋ۰,9DiJ9.z)EmسW-3U~^醖'oVM3׶ }Z{ڑḑLWFP,o^mI9u/Q_-fCU@l}P+bD~DnZ?W5("OaG/Grv3(avWqyX5{{H2o 蟒5GZp;3HPOiqv#?D>/\&P 39#19*| +O_&GQ&£H󑣊e2#OQHcWč<;D>RήHFBnB-iɀ|mdWڌ|}psw",?gztAvR N115yz̲q}+ϩ42ES nBԸW !\5+@xA~-hnUO l?BXMVBLxnB^3c Z$Ē" k$i!6!v$D?BkD\& (!xͨ_ oЫxE|?@ۄЮ0A#!!$z !3>CHGNܧP߅BunF[{P~/ُ|A@Ay =Cag3=+{ofQ Ⱦk~+ +彮 ےA [-qn^zcBꍉ|oJogţsb(.N1 ڂѶ`x|B*Ktd3ϴ^߼ϯdVx?>XΠ]Luq};63[Lv{aV. k+s+73dב{٭b=)Loe3ٽ7F%lm+[ٳwQjKy @<]C$GD LL`( nɣ7fXBA +uo}^.7@e(u}nkYom y6m.'k/5nmg,F4MC,[m`f [lootϟ/K(J_-Ngo-r7V76`\n]<ǘvZ,oC+kkhC؆BѬ<@c+M9hrlE̺DsyJo`.pD$dVp)($姇yYHRrY6b߀D=ΒapNmť- jwo" ogTV R}ӽm;<]\h$:.&mV40- ?OZ8'h*OB%8R6nI: emeO-[ӼL [rx}C 3|$ mVk,۱W$eun}\z9Ouc\Ɛub6}\\B>u؟s9Hz8c5[-ܔ_.XŴm۲T]Bx& +M=>,}I!exaD&g>e}ccuc,{c~5rf/p_Լ"I^BEҦ )G]M?9ǎ$K<%C1>祿[1C T!{7Vb'F<񿼺/-7*I=[ee3xv +endstream +endobj + +1287 0 obj +12677 +endobj + +542 0 obj +<> +endobj + +1288 0 obj +<> +endobj + +1289 0 obj +<> +stream +xͽy|[u/>b#  $ /p'HWBQ-E%n")ˊH)i׼痗&yhql&ؿ$c^R;]M"̹Iɖ߯_̝;wsΜ9sfX&; ˟y IƔ[~8X %9<㋌ =sx}H)B;?/2vo8鳖e:29>i}Y:1=2̲A;ނ÷Ψr'I𽍱gϳ: &fns}7'o30S Fx%-=Úeg;r\|OPI8RZV^*}U&Z[7465wtvu[ӻa?ߦ|.&X7+gn96cmlR9[(9X9tqH&Q:D5P,r7&HFv-Yo(ʟ Wf?Wv*Y aJc{ ,l/[$|01ZMI\I+Z~[M9pV<` jGv[l,`}sAjrhRR Lnmfd2kȃi#v0J.cB_ 5 @>RHM6A2+@1[JOuTZwκ6{ˁ?>K23JµY^=v̱^rwC}}Í6W@šoV/g"U_'3,HK 3HJdڧ܋r"r[5rhPOcļ fR0| J_9y8ǞXn2(.,8H`$j@9(RSQds*)Ta:a:0a:0a:>I`@= 0F!P/KN @ r(gd!f ^ !M(1E! Sx֎\yN6D`Q(@l\XQtrPEeJahLo@ +bB*̖jZ*Vo,(U KY,pjk׮-(74t9+J<ޚMe][{pYtNX\y_~@Q8ʗ)g OW׬{ ` @8@<΁My|9j' ld# PÕ IP.8c̃vARE++彬c1/&5g'23#BJ8e0 wBr4C[B*N70rCa`| +iH5RTm*lʬZܺ3^3/S׾=7o w++@UC~Y+_:-G2ֹ|hsa[=)P/iL]hUq ʊtkLBPCo&N.4fnHaH 6@29gpU`.2/*/sk S}mcO%"b%)LlH= +M]K$'5CUOFh,n o +,!6lƠظg}e\憥Ϫ?t;ۣhKHicV Am'Le>1F& rhX$VdM'N#7ENk()sK͢EMAH0iʾ4n}DSvJD@!M 0wKH=^OP$ $6Ew&fd +P,9Lj@eh%1+ n1piv(w|A/+'Y/Y/Y/Y/Y/'Y/Y/^lv +k8lBV#VN#K+ꮎh:w]Iok4v||x,[no:X_7^׼=n]ۓHmQ{@MhnV7JX`"K.s>C xf]iTġěq8 + C8P"δp.CAXc@k;6p44WU0TU +*[+d3ϳV8N +`F@pt6uB)4R`' dt:-eiqHBhTX$Ƞ) R0! < φuN h患QhؔDEr0!1g5yѺ[=}#ʋjl;41OÉr1,O~Y7TmIϧp˴H$EWqT +ר[t'C8JU{ZB7rNNm4ݓܾL%(. zgAHp9!): $)B D#1ѠΪ5q [N_ʖymK(O4 KKKвRi7H )ԐQeZ'{fa,%nnB ^Bm9#s#~$PΟSMg钙. |RGޥV?KRη 钉r<\]zU*ҡҍֹ$xQT )`,f!!vQXk u!۳4\An 2(+b}B +K}=#E;0NM. %;EvuR[I@ϸj?.$E3hNyⵟ34|;Jc(L}@+`ҎdMg:kbMZ +]j]j$]jD华b}#R(fY84spp'- +re37Aץ?w?/rvg88r|nQm9#lG9` 3[Wt +òBWXZ?טt e)*EtŌ\3 +0@$ K &,M8D1`is=hAA`=h|bn5l|:5Ҽ\U]`f`{ݧڎXgV~m.Dn-ogk=cm=-8<= irE ai;g$GN u9ABr[j[un1y4LJoT)0 9 |N6+rT+~t%%n_mZͷo}i,һaoD0&|xS\4vRchC4Yr)F© 劋#5H1kUu6ҟ+KcOOmMg[K-kSD1CW~t~; K߃.~T~+p]f%(+#2)H>C 17>tdp\>)[ACR<2y$J&1nV)B0 AM˵ `KS)r<(lGگIwrz?%"2[*BbRy,'( Vt[t[mR(;i)z zLKκQ]Ooo|(&m(*ѝ͕ڴx(TU |{L薫:~8M 7ID I(bY"ז9 ^lR +:0deһt DeJnQ! _V| +նƬ7C=y6a1e~)s*i0+2r$jbPy6`6`6`6`6`6J_]qjGLqv e;H^k57k;k%s+~7OҢ[}qrLEdlv3 וӀf2͏*]%QI~AZ˪`I/LK`7 /0lpFfYf*a!MOk ",> 3z=E$b)ҳ~GMen!94p)'.rtJk"PIYE ,0ɱ@[-bZ"e4h*F_8zKj r7*4_ o3^ܟp:߇Om%6z~ ̉i@(tE3X\U^Vj1Wޥv(t;סDZhYP-*} dR@蓳 -{U.$⚠`R ]$C9FhlH8N1CrJ $~:H~4ED!oRЛ8m82 fظ2;ALu*sY7!EJI!%"1̲4ԓeVk4+?$AE{C[2 qzHl$-,׈^%yn+lҗ4D{hhBʥJ>䨂48ep13.?/0>nZy̵*/R#`9Q"ײB?q 9"zX /]9me9 Z~N$ 7ĉŠۼ(+ؗsToV=)$94x' O.]2 ڀ}< +}psl'((_WV" _iVùC.8.8i/CM`Qp!50aepɌ#ePy ^h=ryQJE^;vtz/@ka J dR MYY&YY#h`b7u PK,W HDpW2-VШ>~tWy`e懽T\*yeNC޼\+-={ˎ4`Z @K;+S6an@d1$}rXaz&Ub4@xBB# m[WjaU jX}/:+30H8а;__fb2vhLr'r@7ZĈ| ӅyZ"W 9oWI. wLƊ ?nժ^[_cPl;vc{ʝi܆ XxI]8뾰Ҥ/L2RGI E':X1gS夓M D@7F ON w&M015؃Q1a-E:]0JATD f)skcmN6pfk[/[0%[MbVP'0MLLDS'h 'ҷ(g@Sj)5ДPQM#v~ q$qN`|#ЀlMpZ>]58 y(W2~ uᲖPv;n٫n6l\0vW=5accOMc۲-'!  Tۢ~H1p݋?Zн"xX(nۧL~Ư40 _EiOjnDHL]rzvG#_>0V7rt/S ԙ$m<Խ ,yv~ I?>C"Fwtc2hz4y):$pш@V.6p?"_>49{VNMIs "sM*5><#r6Pj6A鲗ny9.^]B YsHC2pbWWMt +:^«%%ŘE/b[z7!p +wxLL n[a&8ԿJ:@?m[.#ޜܹ-~_%h)7R;V,]P@ֹ> +$ 7 +USWdн:׺d8B|* +r?X ~ +F&n\,C*Y_r t9A|@0N"-{u{g} !7wbM sk> 3V< PȿPyjO/߅m4b(yzԷ +.e&wvk.XV+ҽ*XPFo7p>Oz&I4 $oX&$uqpaHYDt|9[DLZ*e @Ky;v$HVŜ+:1n![jHWb^%DżO/Ǖ|*1pŃ.坅:xJ`m5:A7),1lO{p '20i4G`BEYȻB\ ўiBt%Ct $!Qk4eSܨByY݁Yi +n,fig[O䄝}@3|.PBRil 'byV<P9?E&BVN.\[<@GJ0$Vp)GBXl +` ]5dR[-; &&`%&R^@W/^L|XH`YkJ|iٸJ2O'@̃ <`0Oo +3֓N#`dRxq0qk1H]GR#Gsgͥ)rSY5ݾm\F OrB ڦp\4hvsY+6Re lTTm]?#>ZuVCSij{([d [4iZcd@ݰ PJnˣGyh pO* .&丑0EWC*/H;jN,h$r- T[,hVʆiQ[|uוڃ%ui٧Fw]n,5*ͭ:GSXC-c[*7Dbi \T0+I`]D;#XVPD$[U1.U#pޢ8JJea\ fk>/E\1#;wXaf y쏴"sÓgl'm@!SLv jqmUׁ*I_vMykQ0Ý7U`.:pغQoT%Z6]JR,UCdv >`.5fz3E*ډ9?Cf8idf+_/$irdRAiMtTBhI )RR1=`Fl3p+U5 +###\?=kmN9_3P}ܣ.6\(m(9BV KR7jaQT"_RvDzeZ"֕Jꊶ=J75ll¤_sIC'=)cݺJ:)kIMv3).p 鶐E"i͂&fAdAdAdqJ(}1A<WsXaqgUSEm{j2܁ҀrWL- +!pɢ\R' rw7SN(I`P`tx̐qyz Kf|.L~݅ !m$h`A@l$h6B!0');kjjjSjjjjwcVf{87˃r`khWV X<,"ۺ+`K vScv:{%ڳp}yOe;}SO׶hŖCM7o,/ܸ4u܎ ڣ(}xeV|`NpPkBFSvaڡ?ԟ;iم~pρ/ Z۬<4FcEՁYCٽ{+퍠c s$xoȳb{^ yhH$$JwE |Q9bnk39Y^rL]X}6s vq=kiU)2rH y(Junbi毇8jπ#jM;?uQ0?OaL%ZWW=]Hݰf%wDH +dʬ^z@3׻M*rm"8_Q%ik @BjW$:u;^1vAwN jo)۲oYZOgBJѧ]޺  ]q}w]VpȷC }m(;Lf.7wD@+Gj.\&"M5 SDeϹ[P$jB4V&M<4x`4@y&M&*牂Ƞ|Ɲ%U(Lʄ!W(o޾w [g#2sV5mrY啥7/=Tc%-=74~̘>;zv]=3hJ=|1Cv|!hc9WyW'Ԃ+kSZQvsvJ ^֯cxpS5姭 f೵ >#.ܭvBj.5;+w!ZwkeA7!a0ts9ndƮh[+ƠnUs͵O=v4Oެ5nfYKKwW:qݭjKQU.ϮWLcPGyZ'1=wB$|Vmw>*370Hx`FpF>CAg`LrFL"|З>KD} A&؞ M3nUvH9)(vORhhnNIT6Y4lW'fZCoMZC(1EusӫoRڰt;H8x[Gcry$ǼkbFA r5>GcWSMEeuLOfQ,kUU)ՐWw巕_ }wRO=,w7qT-wNCΑU$HefG,:[l'!p P2VKA^)B9$mt }H Ja$2 9AM^$'0#&|͙hmsNU$LIf9w\Ϩ܈b?,!ٶn#'pAyV^-zN*n#p]:G čh<ڐћ%RyԴ:,j֚²έZֈdZk83X[T^Z]S+5ټL%8)olp{EYr +D~}4]Zզ-4_U8SOPkD|SB:j h揶̇&yV]wiw `ġ=|`u;33!gUߪRM<0뜂tŰ[5:uV?[U=*~)]x*?@7gM9DL$]cJx] wBOFki, UQ];*ׄMĘi{=MzR).tRH?8c܆Z?W m!xk\ElYnN +CK;ԏrjZSz +"S솖k*Ч^ 'ity(Jњ"+yasIe`UH(dH|;)J}/ױBȜ4*՚վ ?!BzlN@: x~.&J#Z8 E?6Ƨ~B]mzwJP4V:O!҂ÿ9;q~_8}>=ca9@'䩿"b&~38H_ odYG9)uʩ$q?if* G_)5ʙ"5ϒSJRrޡ3T3U2^ Wg~|?鵑bAR#(UWrz'"4op@s0opArC[I%q(e;\`zr,z1u.u-DB *Ǭ +3+%$V`;NŰpz'lHKUiV`˅))KW^ĈfAՔ,p{%I1^M"}:þGǚJ]PD[r_SJr@\)UY9K9ҡzET) T+n'CeNPL\ B2xךvWh=\Z<$H(7 >GoiC,#t^4~~*PLwP\DX·k +nI؏9ԏ_+(~ne3D^O/gH$':|fIr qx.EIsH}:0!3k:0+iKAKCzd{R +Wʗ~4.5+ߩPr-ЦS6Z}oi7'D8D-%>H8"-'wqGX*le*&Ys@y}vF~z2y<ɢoSmp}c^Y6){8,)X9/Wz:p݅ђ$\Ea ]zsq a"J7A"$ˮ5hЏgRmDk 0*YE$ҡĵxL'B@ySkiIB:gÿ`#?{]W_'tV&3<aEi߸r{2?OYl7ZŽ{UD P+YRRR>$ Rļb,Pg?0~H7BV7C~ò p +l{(' }ipGY~p{UrT::Gx4Cy lc +ҿB=: c z(ễ h9nGpLSm8$Cc̔/Kd,1+١c^b,'c_C~݌i =z"$(=X,X[šM𽥒v]̦BHІ2wuv3vAnzC}2q3<u'FQHO3yxn9A[9?r-]VoHmM`1 7ߗ\[ g0Ilf,- Aәp^ %f{5)gS_]be%VYiXb6c0ܦ/K TEӠ$NgNO%`6ӯ$\$df^JK3{$1~N1f4p iqlmGy>ߺm58pylOqs/̱s9~c7/5wloq\8MLj34?70<; IFOL +$FG#SlbxtD"0}b~3Fcӳ#Sy ;O$ƆGs8V1>95;~<|@]4 TGC|jz l<2p U=2=Y螘[ s[ՁGҹó |>8?/)|S —NV&GύLLAgxmĭ3ЌT`xsxbCk*(?857 ljL+o]M[#ؾ1|zPbpb63{b﷩@Jhĉ[б#)|#'8CS0|=1;>7:>2?>=5'b^:my| +(|urZ4PFObnT`iIdg5#$%nHHlM\ںh4Q +VPWEZ +ZE4y Et񹹲a!(ӇQc'xcs@O98 GƑ) z9 +k9^YmsCb< +q ě0>35,R43=5 +z&r l35> +endobj + +1291 0 obj +<> +endobj + +1292 0 obj +<> +stream +x`TU0|ι}^RN&eI# )@H IHD " +;0$PQ[,o,b[twL; }sS)y9g0BȀ gê⥫ :BڰSIꖶ-[zUY0,[a141,oo|wϷW 4jhp9dڙ 4\ih}zz +ҽ׷1I̛MRÊw8HFn[Dt+B omMm A?y!̣UF !APA FYXmvo\MEn?3GeC壱G>G;h>Vh?OgHZBmc2lZ+ 4߅mH<u_Jk&zd Vg!I% ``2\yȏh݀@]!3ܼ;hID5Ch5a~̸ٻEO)/ qٜF?ѿ<\e#0 +CuRt9`t<쌞 o/\-؃SpfDRB ɿ ·y9ʼ||Nb׳`ԇh]aV*Vnރ1A {! pKRLJQ$~ CjI=~ؙj(GwFG7we`8Ofj=_;G '__?s|el.qx&eoWn|wͳEg4=1I"$ddFvQ4|&_[Ĥ2)"Yl`63>_c>bYX?3d3٫'ط/pz&vcc2?/o#F%,6 W +D$P7paYCϢN3CVlbhs7]KJI"Nx-^:CCxz8i'YAֳf|0ۇ;wX+ogւZ B;zUhGϣ{yu߅R$4OkCF_wXp?uF3b@q:R^FW2y = 2/'%x C'd"Weܻ}ӹ@,%6/phs-7ABh2iE0#RvF*P3գs=2!+js+d_??AEE2ݬR= + J~M.5 ] +Th:IB+8A#[P:3{ÉᲱcJG*).Y7"7';+3LKMI$_bB|v9v"MF^'bYSRIY4!u] +dUӥԩՔ5PsjXVJQiVRPޘP"xjQΪp +j P*'(]N\|GEh^W(oee:=z\5qU:LhQuy*< t]LJE}cY.\X҅! +*W˻N]5jehvȣh>}Kʎ,{sc9|= %A+Ƞt!BǪYk#0&+jxfT匿z]$@kˬj-%q("u@c-2P2z]j9?U,ՅCqV>uN`JŎnʋbP#11j)P4QmbSW)1"@jV*IZX_CR ņ5*4<=zXz ;0J]cnXY%ȝ;*J厺-Kq.a}nu7n|MMUtI8Д?HQ7> @yD1GZ;$PW:]>WZWC0"o[R E0~B +{ +T+fbC0ϑ6s,f1$O`;2&" $w&_x;4]{QY}!W>,֒lJCeE(k۱(_`0k(xsd3Ӄ +(sD=-HĈ, !B!w +c  T[ ¹>\Y[K +1y5fJҮz˺7zU?~y+aoB NkE9gGڊTLGE3<`D|Et,*hkCodnNŽ넭`Ymxhq8k$UA3e|ٳ,%*]2-aǨ)ĭW4H⣰b,2ep~qdB%Z6׺ .'N[ +PJ" +*)yWtF=)e=Nofbi~RI@:}~8$FE86oFR)fx>OiMy;_y􋖧.\wo D dB•"^NX^4 /9I6fD(` MdcT0IȆ@J#I@1H4VR~ƟD,|ҥKMuk!_O=sO&sG;:˼j6Drif+.H&I\lȡrqGqhoϭ")@MFnJf&ᑭӍz\ZP5KxX mQ7Po*O((||&= y,@94u2* +ȶB"?(//.w=ptWv}FJwbo{oF?W/Q((ˌtcxKI{Y!p\O90Ê,˧1b+A3$9EJ@sj-IgFp:='Jh4(Tİ~NHG<#dJNXxQڄYȠЊ6U mٽ*;`#5ET`Q5` 4,lRṳ%]C⇢0I0s =.a'2L!O~Y:sN~sRkzd:u1Y:a7ҦNѵ_ !i[وæUƄĐ a"Ӥrg=)W@oG;*e$/C A_zI "? b;LLB/2D"2cî$oF谮 PYD0}O@SAyqm LM2R E~gJZE&RiUZi6fb\yن諷FO{?pß |/ܱ7>u}N{{<}3Mb>Brć)$ k4~!QP,Xy# l%V"dG8`_D` UeUx@h05TY.%`L qlT1S>g|8ɿ/?}>iwo/UQQ Òa qS=jq8( Cy3>u(l !DZI2~/ʅ{o"`an? 5"^P")Dߤ80^N^+\s<\g04Fc=c4^ou(Bv=YhL Tgh+qc/ϰﶳzg ]zY ko.6at 8~r D-՟&crӂq >/|GgՏ5?r-a_4EVp~A8&%tðec9t%Jݜd8A˥XD.Fcv!iBW8L%6q[6YJ"\T:K|nuXϻdD@*nk@d} 1ŔP E(_T} Z8TC`̀N<}}%Z}y,ywOPH4=l<_v'Y ~pp5UvEQ5?Æ.%Z0ӏ_iHa\nR.ŅLP$Rl}7nC/Ѱ{D +}ra/h/p!&a="&0RXIxժ;̰&a{ @fb1rMXSg( vA8.[9XLN73{vء d$A``Xz$$>QS0(/-9}>d#QkImIvوk6V"őǫZfXo '92r2~&_Ƿ[xo'A|AAzYFeEͣn_9ƽ{OiK.)^';1p§75'uv j>b7F kқޫl'xZ~Z #)45A/)q޸DgʖT.hJ.OqɻėQSb2CLg< ΓaKEJ_I 'MjaX-N윕56Pcz3SdV&|lraU2^B40,ST!PI +$nw9lKnٶ2=0y wtc+D?p7GkW]nճ;/r{ݿ++؋0xmkN1zu@tdu +?hH"=DZNw+I/Lvbh4Pj3)T꒶:~ +$T2@brr (o.GS$_/OJ|W0cy+Tv~vD]ߡM <G9F0u^+>43}Qq_K&-_ӻal~.n&q'e`t;_b+a28'Qkbwb"((h)Ƞ4M WBP,3R!fiaƏ@¬٨#JQ NHpb<2dބ6e(\+1[۬!=RJ:j ޺xJ|n<ɉ;x&>B)9K!\߹um!KI+RB*! ȂTY݆BAZ6@-lgv"ӏ\u|Dއ5\|׷Њ޴p_̈́/[:s~/?[]_ugCEIq;[f0 ?haխ{O@՝ٽ8R3yQ5G`_^}KT0 +TXrQ8b8mVhzCTGTObfp'֏E~,as` Do9CxOxZp$K4Y.t4;~3ŲN끌HPȲJAPأ2$T"3>BM^|?6~'OԪx d^/ġ2t6if@̉|"|]'o{-=ٷF: `lj+\{ٙ0i5W󛪞F9axQtIhxQgَ4M + +tS)qav#aP kcufX<޸8wF&Qփi;ZNH4%&&Jp .Ht8ɥq$:F!n]-+ˀG8#䗔x9;G㞒nل=$'>#ygіr%4_ ۆGvyTGqIrr.s&f՘Fjj֩jb`I@B#Dƚ=9?|gI` +> {-\L;Mo7=PɌsg}ǁO5X9qxri*z:^3D\<&D05iz{\@ճ>9V)aʈ伦ZރWk{󌼋 'fY2..d#tن|xjq&ҀHYayr§[rRR&:;:~̀H L|2l0c*X1b}>^3%ZQ|N|Yxj;&~P=R.@dUo>F/ W[^-jk\J}7Ϸib!vA͟a &u O'༣v3nzL󾬌U{^x"}f?߻8|$i `ﺭ7vՀk's֕0eqz5ꮳEqN{TIțMs89LT˲V^X=Vp.6ߘoF&DLS +jc +@] ;1P4Tڙp ?{;0~3xū-\_]}sr|⹽Oܾ}+PJ+C{Y.&xfCx$8Mt!h]8u:nӕ:)m6+n (' f#zjyռ̚#8_VT%8NANkzRx ԵH(EՅU "HDo{e_jZ$CKljzu͓}'+3[my7.|U$t8S/⣾bb&]ú=D@G=/zT&Sλ"ZycsJq(n,xʹ*>3p]S 9R +Y6?LMNGHJM m4UJJG;5ހVbF,vn?vٕ/.[okjD\}EIlUo_sOg<ܳo7l߳O;c3p—Cۇv΍SV:85v:0a"a;dl lvSpHNg5Nes!#.鵝 mxZC,^1AS;,Z""pQm@Qz\]*I|!>w>wꆊƎ,_Mx9Ν7K=cFF/b +JB88J8jDl_ P##.6nɥrGk Xp/2].4O@E7|g-y<lI]qmqb0!)GB͍Drj#zt:@xYDm;t2=mPwbbm5vp)Y8~Wi"I>-j"\;QEEC8(1lmvT7QOO Z{ߟߵ'Ck_#uBMת=+_2v9]gԃ3xO?|=dΪYa~UwM*&M}lT >#p8W17-2aSSճ&bA܄ QnJ(ZPmvXcr[FV60.6Y1B. gy nyHFеFC5vbT>p%k8p5[)v\\[ہjۇh\ bh4ZtUG%L)c17̻־U; /y9Z ;$Y=pNX)=J7S\0C"-1>)G+=!%q,@%LBv@qsdu5Aha%Yڠ¾67kCZ-r WeIeelxlꙚ!Њr8>G]VMHSSYhkT4<;ķ!)Ԏ ~) E'|podcS3Jz#]7t\pan!{ {{;{''H,63>Ǻu\t5sƎЂlPdyD#z'|;:27 <8V$z}`avv(N ]xPF][ճCpH6pY cQ/p| p_(1]օSF݃&fšʂv(P2LB?_S`*qgut4_p'ίv-%g)OP)?WmrOp'~N 

    +LyKMgNL#|Sgҁ0Lz!XK:~ NHL B3)f5`4Îm6{ UfDeF;a,Y26Њї 'V2>9>DaQd]QIc(sOBv>& 8@7M1^!*C` v +p4iom5Y= \uFYk+*+zf676l7<;?t}%Oh }1dTEd$W,&K]\ҦULʐ!&e"8e4BU!' 2DaPB}\<']8OmC}AWzc}! R{ݪ~ajH I6.`|AC~?mʼn+nn;zcru_Ʀ_ոs.#-9?V`F?fLHA# XsZN~ڒ9L}c~|_ǗsS^kݘx}.ެpVNJ{$BRKT3EC]Qa,S_K_[qtw먎%ߞy;Gpy/y~ϭwmذpYwh3; gA~c87ؼ̍rUU.6ElY&zz}- {ܩb< /yя$lJЬ/3-Ad/.otOCXڮJVzMPRS{mK9[K# +Z,)m~] j[ jcTӘ;`:pCڛf~e'x:}ꊺM37O}ѯL$3y]xnf +3UX€7ynM`#tK}^hTbKDE|V~Ó]|3"XlDvC1h$uMA#O}{$ZڌLYb7ee%uᗞ;Ox9{T[;kWs8P} ]7]n;"G_Y?[O\ooVc93۶c+o;Θ,̚ѹ&*$X4_f$B2 obd&bAci; MrzhkK׫CmyI.͗Umq\:並V5m1%nr6:5RĘޮ_. z~A< 9;f@˚}Sr)YiڴIFFS|M2wGfK;zE룰[wNb2=o1zJNՃ \\ޯ?`d+ z&ÐO +XŠgŮdlJ8 /]@r$wL"jS ,9|[ Sv\4a:W[ `YPst{ʢm#͹űC gڑ_rУrzvyGs~}rJo g{ݲY]8m++[*ddlN|myys͸}…WF )mMwOfe1#>bћ;'pH\Z2DH\S4bC I *K$F]=q=6taow@euROsdAd1tkEۑ_$2bW®fu'J(f`E`3iމˢwms*I0-@WkTn>u|6lu"ܢ{ytEZ]a9reux`v8=v'Xr;=D f9ND).>h1q8o9U]]ggzHAG7ˮ⼺bo:eڪ/=?D}RSn@ֆT4x@ީge<鶤-GoN8mOߙPwNwHS_ͼ)`m=4F1T†kÃIL(l&kan"N$޴uU#Q `f fZ.LpRj(K}O7K:*v![5EE/jj~ykY0 7Ǧ=Y|_QB{9xYglo5\iƽ{_OtLS/P,b ztnN*S[yދL6]Sjm7xv4";izryՖ8ғƞS:=5CoDsa '>۫~hD6^4wW+Z*08+.8K+}Iնk\lbC6&fdI^{Ѿ<dIzqS65K\tU;խ_g:KnT7cSn-Ö GޢY x)xGr[ d2Dt`y&ǬY! \34^נd HlN$}! cQatdQ c[ZH(&E@xTiXTC=Ȣ?t'4G.unKW@("0naיyA~t<6$)=MKO^e:b/93W6tdK/6(M&aa1r` h 2cu:ub ßIW-Fɽ9gs@թ>Jb?1/5GfO*Zb;*$n,J,u{ۂL%7E>"{ }\SUWO"" q+ywwk~e!B={o8[.]\ϟ |oO-KO@yPu$°:R DH T݆YGGbײxnQn~{g!F| z A P p=F.g\mB<(,WF/ nw;-eQKo\g`[y]{xM9[uI#FH !VLxCȶ!lr!O!mG(J! BI%g 燐D(mD(32,h/sAh򠏂isXK~);bjP)ZtBA`ve +j9wD >tjT,1m,r/c01ybBgl 7` Fr\ r\} &`r+c0 1CfP 摉{& {-` Ulx}2ЗIx>+œy VaG`‚_ix1/Ua) 5/n5Xÿk` _5k +]7dzȷ`)bT ̢x)[M/JSb0lx&ii %m^65LVaڇС?i*T?4_Ïc0+e`0_L۹Xv`*ic*R Caq!K2/Ð! C0.g +&0hmoC`C~Z#J﯄x6-;j5q^ a#p3M:4nF iԐzZ+!W&oձ((z + +BNg)>-H6`f~6ZlV]OFhu:G_jڢc]>B'9 (,tt/VxZUObQQZOXO{FiZ:9~ 54CO> /|?ǟ(#3LXߞև +|J/|e/b<2&gLa{" C\.X>E GcOFe|$< +`iw ۝{V$B +ySV苈_o__|^xwj",ڗ!;|apE-Z(5K 2e2U@ᄌ|aߵ,<1_/ۧvu-Hc4,I7(vvvovvv +G +s9;E؝ E(& DQEV$"N+v^ҐUaАhMA]6f*:gUU|j&j UbUd=1BVǨ 1ҞBGPE3ՇE4|;嶱=c;a@PM.0KdxCYs |ygM,DS2L* Tt&@^@^_?efCf)dy86#"BMh5 :j +0 +endstream +endobj + +1293 0 obj +16846 +endobj + +544 0 obj +<> +endobj + +1294 0 obj +<> +endobj + +1295 0 obj +<> +stream +xy`TE0^Uv:Y:BDrYh7 I – &3"MTFGQG\gFS18{}iܪ9v0BH2gqM_Wy!lU?>0enHt44;7E7Jߊd ;k~7e F݉Fb3'| +ow)|F)d!5q3ooSlP!|;sx~|V/zvvF;V`-6G< [Q 0w9$ D  fr5yO=ҹWĕr\j# >y7)+v)V(蔷+utCMb .)/RX} |ۋ:!x `f^r:[(`+Xxٚ"2ύ4mA&?pJN9Í⪸:[E׹s+ϧa>gKGOO3)>4ba)K9@9D9A9QYܪ<|SU :-<+H""~j8›jA2˅d0.ad;Lscq+K? +{\[WcDJ`?p:˝J~'z`"Or (0zk«RGq) Sp>#.*>Br ݏky.TWO ي%B`ïz~3Dݰ9UCW]5Xi,7FPS|-ZCByn|>*3A> z`(7j9c/x>AƯ-'!L!h€A Ŀfğ@%{P`]cc7FQ$#}f.Lv/,\ QAɨ,%pwhltfGqd_|$=&Ɵ͏/BQ;(#@( fTG&[X=a+`Al-s<|ꔡrِkJ*X\TX߿_^>p(#4r:6lNQFR4\ѣ` TJP5>Qu)CϹ?)'z==(>RyP:sDRv1x,1Xp 7H#(ʣ#\^=ۧ E4ZE}138#HEEQWp]A F'L^>Tɍs(8,j.h8&* *4R= Cڗ{|Nͮj53GJ:):V^pt Oػm.wKrRt[41^Yy$LX1YQN ӚRTyA5ƽ9&y.6O D<ʚ}VyҊ.Yr]'whJ vt@]OXw +UL,+ +^ HA@ D nWh-P>^YDQEH JA^]SB7OzX Sp4PQ>:I0(JPmM<@ @ |GfEmĵf{ڑjrPD{`ӥIVL*>- E-çsc3{:Ӌ(cN +`idT+5M.Vt[rA_u}t9X0Sflެ X-18MGTHS'*ʆU=I(w nAi5AI n>D^$/nn,N1Ng-xAdiD6MN0^=" 27HTRo`f*XJ)C"+ЏHS65h tZ0J \4 $ TVI;`ڝ8#⥪KĮR\\ҿ_AQ*(3 (>xj%Su7¼ +NB)M ;}ƿ\UC';|)MʛKSY +Ow;ud*d^ h thʋD" ;<$Б>j:Hkќ ӘD1~^ &&Zuru)Iʅ9Ej +rLҸQx@y,y[x[ݳScDojAj%0{HdM2qU8VTYi +vM$B0=3lLb8.|cDza 抻^j[V]WEGYA;|5@OGW$Gd8_4"A:ӷg9o9܅zx_7NDpepZSwzjFѧd|^ޗUdzӅY)K0"ΣT sIY._D$&J,ޮ/oM<$"q־TºAzwzB0/daG0 qQNg㝇E˙J,Son%5HDrRNڔ-a0_zqv7a<!ظ'mۉٗRXTg]T%VʜpPz& +iMb;Yp0ECJD%Q0=<5{]]0jֶtnXP'έu[쳷_ۜn޺j|[׭2v}}u<'h7Qqtuc1_xNh9%ҁx+WrGc|A<]I I>Ph4& 5_JӉeRN*EmFBI""pLAz9`[ ڏ)KTLJ/J(KJ6 2F !n.-(p|ZZ)}dN֖&p. em+4)[ę0{^~#Vg;xvP۽c%$°?=4>kBkyWoHY `RFuGD'@2`d5½"ms}'-/ֽQ-NCSS=Ɓtl4`ԃٰ@ lE=gT|@]i BdB):3%$m(.BF|/0vÁ_TQ dm …P1tnjK@^ͪK ]yx]O 7˿ͩ}] + +~a׋WޯzԀ+Dz(N1W.R؏`^ӷp(ώh?x,•Aр׀2$xxMc/u/SkLӻT8Y-E8A`6pĺ*ql7f~a Mt:P#(::02o_s'(|fOF̋LSXFT/} vm}m?y W"*)Hc R  <cJ'u\i%icvR\8/TT\dk׆?}OWxߪj6W:@~jvnN릗-tv䦅$Ѣ˖tD:XƎ[̓HQ@vE#1v;[B{{Fǥ6bֿǥ){bVRbjnBM8.*Ls)KAKZz^иcǿXx㝱| 篿}M6y=yd?`s;ޟ{b8n5g+?vSR,IhgJOɢuIM19Mmh8&`H^'M:5)VNDgjS}=DEtv941.^=Ϧ=\8=.o_-/v tmq{Ⱦ}d}]+LzI| !S7&$Tr]0.AZȦmTOwP5m%l"mWz[z)pUeB +33Mec26K{j&08|yk+3gkk]޾{xrɘ54b;PױOc=9>̢;P A&B)ϕbאRkNU2JD'xL,E6ҡSNqN]y)!6Q-4 +]dBECZȌ׎6Ű2`e:'-]P2<4YvC`Zk+9BsW5gwsoI#12 L1vh#d4*ȑ8ZJia<e#FgXIn!(üØOl0ލ<䑎9_Y-"$Β](}.gC/Nʪ.y +uBT9 Kбxdyb)@`zFF&.6@>6YJalMp9rWc_7_HIm촢i럎9El[o_}<{bOO]_wS>ժo2pU5r濳v;.qCok=LOgߋ#ԟ]Ͽw}lky-'s2]x _M '[ 촏<ɏi>I\UDO;ڜx6vViĢ6R2ds$5?tMg'kXЦ7x' SJ:By*AP*^p9N"h5:^$[;'x8G 9UkLfS$kqU);`4 I,#gR2nݧᒻ׿|퉽8lK3;vē='`נG5S +JW8w%ĭ-dm"nɂX +]SPtX4|S jR vk {$=AqxOlОOonc#ՙF 0;Hڔ0>pf(C8Wf5s3/u<(N(x-g% ְL +Ϲ!ٱb~`1Ju/ 0zn aUCN}ZٍtZ$%\+BWXMԁ C̨sT,(f( +H3 +yCٗS9&n Y5vf;c|Oxo`/o8=776n~mc'iwm5(nY#VTؤdԌ +ZJN억ϨV5UXKlLڔM *9*ɂ%l`F,/R$UV&KjJeW)5ϻ"eT&EsCƒ*\ n}ܵjx-W\'|:|7S]έ3- +zx0 3!9JC7b1wU/ܒ?S?M\S@&ƌczD)!LP A/c6ᛏ>R5sGbpx˚4~/`Eʚq:?]Si[l`H:2όJ"&8);5 a+@bR^MR%ٱd`'F{ر;4)tizХ8kMmpeojD7c10 XWX?~h|qԞoTؕϹWڏ"RN.几,TLȹj:ǥwdsrJlŞA9Trsmo~n-+p=uu$t_lgFر2nlyPES)wܜ$Z~t4Ued>LQ{Sqb^F#?`un&Q <]͠{j-.MW]3: !SZ)/7(` S{ 0u8چ!gz^1@B@ݩ^I#0wX`(v{=-Z&b!=UcS" pSLHQS4VwpB`9Ai :q=:et³pA5+Ң%gnQH?u>03qGiMqkY zwFH5MΦ;*.kbؼ7& ~z4M V"EBQߟ-6AR{)8McU*tcF"|q[룴%)y~2c8 m^ XcΌ3Z,jemM'l<-Q3y\N"SHiBy SۊM1R-Bxށ" eZLi0cT6SVUwXW;;!bS`oTUrE3 *R5e.`z&gu<Ѽo&9G©w/{wK=8[Oľ[|߱wz˧@OurɘgaXFP#}*^^ 6^vd^RW2?У: wLLvT[!?.>֩.R-P,5OjtvG3269##袪aYt]hԢ腥gTL?{`ڈc$3f4q3\eVbLIIL*{ +O$ZJB/6ʮKg*.?J6ě*#L:lO7W/gƾm=u- weeiufNaTn?\ i)ǬbR)LQJE)/TBFToX}HrSy 'd2UT%_|'hsJDTLVeYn8;܍s}/J{n> " a}V56\\z[xG_s:Wm$b4ۭȼ##܃#X^$xvTL\Yt*8(7"|tI v bV1{s(.c rF"#Ā>BdUERB)ZEp䔂 +,$Qm ``p>s֮S>F>'m߾m٘F>=iaͿՌ\a 4 Wk +k6d- +4WZ6l hXӎNSNf9&s[\ܑڑ))99չmg3? |* N#kQDP?v ^QSi춂P&tq`!;m>PN2`jѣLчdZCZsP:ՈC(ݟqxx7~cq<tLbnJ[c:{pü_#mFW$5@[d\/vKp>[ _H89Mp(9h@0sC ܽ᭫79 xYK|ѕOԽ_2 M,rJQ=`zz:>>V"_ݨnSoOVWl,%O8݂x )Gy^8_ % \|V&S o3Ƨ4Op3 +9K )vD$U57EʦOh?| {澃=kI60M,pj]@} fHQ7IĈd  o,TSgJUXjWBz }457qK5g +aeHU" T+JaR_xPm[{ͬ(8'TUpVBJT +χBax&$g" ߉Z(B^$f3WW6H|"xx\d's23Ngf3b&8rFbK#2^bM@Rd"NRTJ9'[W_#jT`G AKԜ m!r8܆663q2gbeώ{t&OX ʔR/%i*Y m`3 /՚pvx顲!IE0uQh'O+)[leGNHf:QTBD\t+Ix`$eBlr~aY-af-u %Mt{h`{P;X~-'yjp_wLvwܬ=؝I~h֠{゚/_>᡻Mj٢ %vqZ.r-OUn)0 +? qwƝv3X5zΐdZfUhU*L0*̪jQ2SZfh1ӎsRsS yI;Qq'Hdrɔ|ga'%l2^)Čj#I)7ʺ~6IQiN{QcN>~jZQ9E⍏.}zQӑpt˓|cWw KG>r&PQ\xA{7B"B!k0+5.(ajP'ԫT {\0W˝33Փ*s}sbV\l^luބmjAASi4/4ʰfxaly_ɂɀW*ȀxכPJKF#!t2@;3gSC^F_*'!ꀠn:Bz(s媪^L}5豥DXkx(R^o=lwuj߸}Ă3Z?n>N‚6PЌ|x|N#^#V|_mimjc:uJ zqc}7||祸d1b+#Dٽ4D,ؽ-22h5՚6 /1JrA'=;r /;b {Ԋ-B#é+ ,^0{`*p* p0JzG-)jYK=&6>>,Xz[X'[[o8qKb?1fPNk'Juzŗ&<8ςEB~8?˷ڤRzIG +kFMU[H?J=VwJ_uv%%99<ĿKĪK=KH|ua fEQTGԗpahM=9Mg>B?!̧[SȘ^J}z]s_jWC!S 9S5S=S3S;S7S@@@@@@4f323dTjkõY֌_iݓu=x͓) #d%d +S@F +H V6Jf2C: 6^7M!\uƻfNjps~Vq=_lE,c"3R`DT`*ĸ̴Ei$kSz$}"[(yo_ߍ.,̧3SrŹ$zKwbDW']9tzGNv9w +|Gq9IY~[>ɧ LXVAP.@boEHF&F<5<;Inϥ(WdilR闤D(%&F"M/l!B&R&FLsZ *ah-"'%Rg)=X2.:Uƃ2!{_L'zQ_'Yv-ꥠG]"~f8/)*PPE=7hubJeo^(?t`ݓW??յԯZ`yZ˫O.lqMʿvQ+7sN98Mh2 +9cP9͈Mr"z>.ͅ5CvQ1jF1c9q\]^lT))ygeTy\yF)(@u2q,0kYn'lOODH Ey,@N<`ܟC ݥKiDw)UUNB$H|܁F4wwBꞃ~STRQW98= yfV\W94. YkiK"7/F=/r/pX疎v +mlG:bf[506oYhL㳺\v2?V9>B!E(Kg UW`* +TQd yİYoTuG?d߸퇽D WCEVW(>toAS!T +i$wn,H5=+#K(Ay#P\iMr$ +0H+hm6)AAKfC[πm4D_|!n hv%Bi~nBz;BƧ2A? l"d9"{o 5B3/!L>7|Fheu ^5@Z;y 5*EEJ01D!Ӑ B͎cZrMî(L&a݈nM<9ȇH2`UV؞U>h3Iͥ'O=|Q(> T,IS,Mu! f{1\vg@S|TXԀ@jE+P#WӼY2-&A<:(2kPEmZ +P |AzJ?;$ْ_BE0r?,́ho@sa^c;7{l?5Zkal5 ?u 1qT+) M]%f^yl=D6fuճ}+~SzMlznb=$i90RZ&Q?c6g'c/F}3-SK;Wkp/ѝ$K%?ZI 5WQ.))?V跔IWОC}wK ̯6,ih]X' ohnlhioXWh4~iR]K]ھCkMtQMsARJVKE}inhiۚzn웿ՍEZkj4/ǵIKVhVZZ7/khYӰtIks}]K4HOh~Ҥ0˸9մJj`95䚥KjaR K5+-u"܆%RkT[Ҹ`QRcs=T΁:(kZƺtW,9!jjii>, P/hi-DJ-aɢRV}Tx6ݫrvֽ N5(fi[Lq\6ܴdQCMHIlCK[ںeg~ݢƫ1tp&5 X\sSmJ"Z!n:w1H;|>$5<9eC:4 <|2Q2H mt W}E7?b9 7El=ȍ,@gYX%KPpxٞI}6pT( uKGCPN~)1yE!Xɛ0H4R5FH@o6j HQHe$rF ɐ&@R30M'9j'" `#+_'/5V +ʓv B;{D(E(]A^؟aLJ!σTiU!y_ht @mAY{Yxh^ -f,?i&zň8FH1٤2ubo}GjrيҀےPx:\8@®WEB%OCù@:{R'oAozoשN au=su] oAj(B/kK4W?)彩(ԉє8N{oBe;++ӾYfb*9dѭ*8-z_ѧ*UVDE\_,qqCh=7dDeeE'! SL!IK{(/C Z@?XZגQ>b_FP z9>coC'Y6':uz˺`7.^f]%/.8So|< DsfAޱl36[ͩLbzVFDGH晴ypp>4|}3GM(,j{* MҹFBs1mE*sӹFɣ\ThXr?j_=avqc-`BHeTCM}J@h &-xWIjSp.mY#ZZR'H\3hh)P[Mj;}r丞֩ɎNɒ=n#Gcه[QK%UL! +$0Rxh nI\v$|=R$EkL PGX+ /mhL +endstream +endobj + +1296 0 obj +17582 +endobj + +576 0 obj +<> +endobj + +1297 0 obj +<> +endobj + +1298 0 obj +<> +stream +x]j0 ໟPmBBa?JjXl8l5tC§H2.KkM#8A:栀J%ڨFVn"k>Srag$<4ct)f`iAjA¿(ömSez*Ę߇QN䅂 .kC9^DH<?7%z_eGWȳ+i}<-ZnCqF{Psiv{3܅/% +endstream +endobj + +1300 0 obj +274 +endobj + +1299 0 obj +<> +stream +xVMl~KGRekI+iEHUF0cJZYB$ i+zQM&FaF:AEF %iP>H(^Z-PU.eM%̛y3;@ &믍ʲ +O͜Nkw +8&3fӄ'fk/6ayfJdeӳpk׊Y?OO[.UkcN%@5@yw 0<٘㥘LV-jYU6E`Xa;$VSVBG,H̞XDMXJ%Hx'ѳ(d=)uKAOzyk5E~JߕWɯzv+'gd+.I; Zu;KZO4Q^sҎVNQH}NRoV+RϹMHAL#"jDm&BGSGE +('~ك݊eS/v浹ܵks|?M}^k|~ 9_@\mt0jDElȽM1E[}ZP򃶺@eCnn)D*AA7lIO)͜J^"u؈óFO* +q.-r<)zPFpRؔL3)B:kd#?SpSJߍl*>K㵃zCuEfN囹Dt=EhNa;(>i9!rn, pDtcW#m'ΓoAyL x,X&nryش)n#G?w.o81uF eiIgؤ 5Cx/b[>bZu\gJ3r ]rxZ[::Z7${/oSQ,TЭYFXAv7.MdDFQ}2Rq8l:)ܒuzki\/Gd-5%^?t]ĐNlLÆesq$!Nf]&nd1ΝB4NQ2l#P 9r{MM&E\ݺpcq.-˶sg Ǐ/ YasS%T +7 n1Wle {:vgq//4;E9痩F^v~[R@/dؿm~>M e_u:~q`j|?u@G#审Ʉ{[k7=,1_%~x.{v: 29`s9䲃~`?l lp"g+RL@8?zp<vJ8!~X@ *9`DB[pvr88xOBLA og@ "L`)! `&* l lK峕SS5`ጡ=S(NRvguUQ5*g TB{8̱J0- 9ZEf%4ZP`8uzPGY#=<ÈGώ;::t#_mc̫*zKjF߲8fTӥvbN~ɇ] N4+1:z,UTgQðIl+t&kLtEPZca8RĖrfQIJZmjר㓥 +DZ0a*/jZ2=v )jFItYoԴ|Y-Zƥxr#sv3`V+%Լ=t!RdO93dj$ +endstream +endobj + +1301 0 obj +2146 +endobj + +577 0 obj +<> +endobj + +1302 0 obj +<> +endobj + +1303 0 obj +<> +stream +x]͊0ὯBbs4(SM{-g m"w_)t +IAS>~qylNyq]?sos9_}ZOE^>oKn,{W\7o|w?s?\Ӻ>Mӟ|ppm}o5rxl~?wu ӌmMuzb_Uy9yh浞ף~=ZU:-V6tbG;w'tޡݰݠ3Ew켶~/{~O=_ ~/{~O=_+́~9Я0@W +s_a+́~9Я0@WWo o o o o0 op +op +9鏛T#JSp*N?©GaV#Y+~?¯GҟWFO ~?o'џ7FO ~?o' P͓ٛwaJ c5o󼎼mnS$ _ +S| +endstream +endobj + +1305 0 obj +601 +endobj + +1304 0 obj +<> +stream +x|y\TGoխ4k/ (;DQ +*b1nр'1JceQL\QcECIwކ`&}ٞuV:u::ua"bjcˠ}eH:(8}'f ½}aJy`__^@-n +.E |8)cONFz_?M^2W4iL9UL/E-J4~о_B0ba#BXdQR5Z`4->~րP suqGDv=9%GZzό^xf>үրك:#Fؘ9Oț8O:-Srn:> <>p3 ^thwmC*ԌkU`MA;fa+\[PA\0 +]0Neh4@ q먒Cd͢/\RKIy2n1? סs + yF +Äa0PCTEo(g>d?mE;I2^ OTY8vpq9H{YLT#T>I|!(vC-Ixa0szψlj\gLn&QK  Ⴥz!Uu?==xx[?Tʁ"jO~z7{Rcjci+}iZzLRE9xcn~Pր@*DG~xhJhGH52ǕXXޑ(rWx0m}n`TN!|q{r;rsY:Ƈ3fA4Gvԓ9#rK{;GͅVIẼ0+d6tI*ף;t0}: +~_V4 #qoG.g0p9]N3mfS$uϡZ/"$d?x DU.$ Ӆ ->f4; x:~E$/?ֈhFl>Si +jw0jN> jqjHP'MI]xo]6#+m>qi3bUb0DجF"ś.X3Z-k7PܻM74|MusbJ8{xـ|ad8"نXNIMNTm@}sESOO=qѝ{a^?Ȃ_?cخzgr}_N۶}f{D - +B6X/2j(J-_d+*(( h tE@vzc }^_};@\A4n]]<~( +@@%@j: &( =^ىNd삡-Dh!kXZ"E`-kXL^3 à0(; à0(;RՂ6 ;hڰ6HPFkAp0ꞗ  +3EW#1L^|S8\a=%)*ۀ+,G`?? + 5{Ȱ5 =ccYE.|tCZӰƳ0&&5 ϰ=5c);O'h!<5sJ* X%$`̙90gL 3s&`ΤG X-EJAgX]\rwK*[jUYm-k_oc_\M-\@rrS mwL-8S Ԃcj1ZpL-8S Ԃ .Wϗ\) T ҉Zhƕ4[l(%Ȍ*r #=A^H86 2m!(%N%7̙Sso,:Nd᝕x'q_KX>g󰼂725g6"HЀES3 +f,z7F=Z D٠f"?Ng:z&t._]2jh7z:%yp,&_-m]@?N\'ZΖ?SW +rh-m^Fen7$%7-e^ J("GAOLeF%xF6j5F`FQ#بl6j5F`Fу`bjDfVI+| +>iOZ'VI+| +>imI+U^vX,++3,>P}׊ù۷XK P?Хi,ūSY}o+)/Y_OЏ ˸o@g'd g]+N%1!7@B;Y6t/:SZO zc=#BcL֪Nl*^4L2ZP{,ʟ%d9%/,{'ߑZ^;pLw;RhPd.7mshF8 C&Mr 4vW_ $`iu56[l_ '桗Gl&޼Bo9$&v6u`. KVk&+<.Gj*S;̆a}nSkKK5(I(X, M.x#r&cU(+}6=n|ݜO}]wzy-+W]+;莠W7?x^7f|Ń{za>ٚ(dOGܼg +Q"0d@&N0[QnvWnTmB{+(/Z::"t:BT[l5{t]،j_pxyޘ6͝ݥn:ݎ?z} t\ϖ,=rӏgie^F"0MȦZ ̴2Ͳ ޑg]DbfX$8+7o\s86??-\UTN? kn zZLvb%ߏ-aŖ ++s;~<|Ǭ^}v4ҕ} 0Fj?_>wP rӠȍ,[% -M4*  rn&R50(U('BF P2AJN%{%q'H`>: PQ Pڛ3`e ;ӫC:n9{vUx.kv=Cl`Gz8'Vעjj$$)@\9NL1.,MWl:Mcp?zsx8Càm,Y#bFQ}et,jmlǽݺ9um?Qg:)nMk~[fTt0o( B$:䡹t('QL1@zAI7hv%;#N/hЉQoȴmոMfrʙ LIlwMd|u)t]2l-_RXޓv칕,&)O>2'))uO} +jk2Eq?OBܿa[WN%6 uoNn۵ 'I/Nk={+|I_3Xu +|QUYk%%^h7ˇ`^.g L,aY4hAt7ϓ{iүB:txRCǩrUAܰ5T !hFT <P鈲P$zKgKIp!\eqqcU9|nPZ6p%0CNb"h1J +Wl2@ 'c1GE%q -sCܘ4pnks|/ xtlJxl# hAfܵxyi\k|Y.thbKz9=YlGlIEHWXv$0ךH+g:Y#U ;01l&zpMݽ/Zoӽ|5Ȩ;RtezmJ&^2J80OhK['{օ 2"G]m$~UƚK- +n=]ާS[f͚mkvֶ8ѯw4Яq ΦKi)~ +kp)-gBy AQ\mB[L#!QÌl$_fJ:dZq}> +Ɖ+oTe:ﻇ9SB\ۙ-eew}y?v+Xg!QYY;d6W?y4&X@! !f9njfO&vhl$Y'\3źզv sZB?5k]9A!h,݄'I#?ƒԾZ^0E!fb Dޜ૱Ce51s D2AIc'lQ򡧜KP7˰9#Ow販ƵwB˛6V?ý[ h!.ӫWA'O/3h6M$nej6;}9ڌ@/*sMMK(<8͐+Gyk5q910-c[4 IvZ ^ sr{KkY?([iXeLeOL-p$|f11d[l"G`\cE`wK9If,7%c.quҲ2f=?E{fd 0m->={>Ȓ*PxbCAnvw 2Εٖժ;mAna{wsuBԽ(wd_С~5QVaNTRIp:n@SӪtZZآPJkh2?:)&/̐&ډkHC=4q֪ 7MTEp]2Nt*]]Fq\ˏƋ㥑mn@WB%EZ9)ʺVSo K|(UMr=r*scN`© +TD~Dౄ 2$l{ Y5?N$?Ϩ"nsɶ)sY\҃1䢸lw,CeNsrIx[4G\Rkk忝]`9s !X[gfvN` wV#󙠂^7=;޳Ap@d,͹uK\?*E^ yt|d݁8qK{L7?[ ڿ:sҭyw|?qGc]norwEvAtx׫G7s~ۢ(2FZěuc9n9tF *,rۡ]-5z4zw3fjb zۛ46 ;arZNZkm@m`m!w$7Rv='ˋg녿.u|@7J_yO?՛'?PN^.鉹?uH]%)""FLܬw`9/5{tjRaTWî2 @'AY0DyUr ]wN`9,G0$UkV_lmۗۧ؆./6_9ddl^~cGm`at qQ'HW?bBG+B6v&zG`[ծI=/#i+ݘmXzu־iQQOnM왫={3,9, Iы|* C#N<fv I)(ƿd\CClM7NMFk֒s#l5~NK~BaB<ޜ)1伯2ġD#}17\CW ?(kï]O0]bT/Uosxz~>^im٫*bՉioҰaG=s3䃺LX/ + p>R ި5]h((;5#D Ӕ;NY*87u(^IW4f ѷfČq\将]FDljb)WW+̙>[ikH'tXT8}̸M +`  P"X07k0'Aze'^FJ̊PH}3XYА{+{mzm⤩WnB"{G?Έ+e _wV~I A>xV+x\:ѫOhM$oAt 1{ T~bj2l'GU,Z挼h@;lj(0ZkO o}Eܒr9K8p1_Ucw,_ƾW^{UVe_oY![%`㭀ĔQݻWcQ`6Z 5GK 9ʟ T\w!EMrXnU@XO@1H +PE!RIzBNRUH+JH!_(J%dP"H!4/0Jk}[st\[߂@ʬTKHyD+?д֓g<ΌKoOm?yƛaa诞QK(4Xt|4$!Q5Tfj04ccۚѪ)،kC`g{B/ūxm>>} 'BX*JեRm222222yrĝ7Or/ZS;9kxi^~9ϐi蕶/m\v'MϠ?k~?v렜{+,BǰbG,~[ihD77g3|wɕ?nxwЏ?vzF: 鈏| 8@oGtwӋ`!oOM(8b͆rX.X| %bˀLXX|,hd[,S(^.3xۄLdv vQ֕6ަ8z=_ aT@h5 d,`U V%``8 sA,'@rI^UZ;P.B:XQ8ʅ ]ŮKKR41MJReYA1Xmn:WHL4"nDz6ƨ X#Pk(.J245\PYƭ % +~f&֞,X_vOտlk$r۶):tYԢ=J$0 /c+b=kj fn35y9-q*!&/rhù[dHqHA&ǏѨ`jhD0 ?f@4Z>#Im߶5whn @gg@,Y cZOՠg:V @фlF4A]!3MF=NZTlCW{=,cӜ2TaOy"2,@}!Ümζ5,)Jd +Le#@쀩a'l)1a} ߦmb?u 4̫;B?ÚQ_PHak7P1QRHU2H5䨦dJ^bX;$1m˹UUmSv^#nYxXS"_c*(gpɧ![ +{w,/'!\<P^uϲKn(''>XE3[.(zrӘrFz$غscX+r_:nZ~U1z^1$n afv$_%*cV^7{׾NTP`gc=,LKW.$<*kpI=m[2m}zusE'.oyɣwn`BVp.\Mw؄}+ã`mޣĔT>Cstkl"s?xߙ,8+2W|%YslT{,@j +/"gqũ݋ey礨nD>n̸ |ڰШz nUțfR eq>B?skV @P# Aȟ@>h6 +2,Vu޺Jo}9*5PD@n]޶ǁ{@E'@]|z.~Y撼Fz c@˼t&A[^yhTx&\cd4P=Ȑ׋@zsFyWaؿ o "^ |T-LV0~@s^!-@Ptv1K u@ d}an鎐Y|kgП?\9@P`4Tm :P(gG wkaـ}àOq_w d &"2,]O7XAQ K4 }ƀNb! ?aZbO`PreCL +;&;Fϛ?hY靆3p MHqQQG=X!ZCdTAMrÕP7 9P.Bw)r>Cy! O@i*:zj5BҐszp&|O>*r-%'Gɻߦ(9FQJޡ;K֑ƿ)pdE@D2Qdr2G}0Ja(%CdPv0(d?b@J݀|wYH*G2#H̾F!L28w}=mGG'x ӀKᮏN-ё> {S DudP3S +N'=I*%)1B +%ɃI `$Ja"% 8!8(X{D1$cFBfVQB%ݠe77ʥ ])$p#qg +( 30J8b}0A6JB) ݆P H( $+pf?k">ǗXJ0rs&1A&31)3tH z`;=N!z>^&:f[ DCڟLDD"%/!08rpPE!Dp/ۀo '/n> +endstream +endobj + +1306 0 obj +13136 +endobj + +583 0 obj +<> +endobj + +1307 0 obj +<> +endobj + +1308 0 obj +<> +stream +xzy\Ts}evfDA$M(.# +8,*Dp{0MCZ5ן!Gb1 }Mlb?kbbhLf1p}ϝA{=|@@-@oXTURR~7 @V6?; "L2Bz38Z5VQ%˂Ps ϖbn=C7(3W6*c?7Qxnx :K2a!֫G-ɅRzp~q{Hgam᪙  Št( :O|RA_wO_&{z2",nmqE诧1v/Z@\LP$f5f73Pѱ5aKr<:+[Ijn3eY۬NO=šCnlix=?'[~^Oɫ9lě?WN "!n-Y&<##}y^w$0[/xlnVF&1*y8ɑ,Yq$G|-" +Xӳ ~$+K6?[|z}wwJ箾cw'JiV5LDS< :]9v-´ g +ԼtYv7v[K( a7%1%pVT$Zܤb7rF'!\DjY+YZA^ = +\ҒBLW0q +a{f~}}!${ٯ#b͍ĹQuxFpwc[8ABфF +B.BJ&O <i .@sED@TI#&#E@XB;!!O LjCRīl[-f3DY1D؜$)9i͗_}_%)U,^bT,I!>/d#dkZ ٠oN3m>3YRE5FQhTШQF +D6UῦER!$/iD{Ϸ>ʲ0ɨ8x Iq$z%( +`^mi24ڪQPZԻi0S}) +wF}nQUfřN#;rƑI! ++/m +?䘰Z;ubS}]̂ωiWZ乛&UC"S`ς+fp}<)8F d"W@p2cnQݨ67 B#T7EksX+a)bcHwnHK:НswWz`_!MاI-\XU@uk8L8]pڒ!h[2D`YQW㮍ֶjj rut$5C#27uoˠ +Jz _q$f n 䇡♮jPZZbD^J>R fβxt&~lҡ\ϕ X'TH*t\c %G/oث_|Cwo(WųN:Ru>[\~ > Q N^bؒtm]jsn҃'IiAХ'P-% &_?PIsjF~˟Hppu-lѶ[A:4CC{(",;+dcr/X?ކag*{#7Uvi`]1m3?-hmg>yהQׇ&}Y; +XӛhdMδ5! +V^vDgqE婳HH"< +I<e VW/\G{|ϩtv$ +wuGFe){:tyM 5l7:#g0i9#lN"tSO6sSSĆq?wX3ÇtF!@QTD&-]Jb"~?k/Q :I"{T浱}⢯;TRJFHK2),0N|ϫ b`ZlfTkw>q)H]zb [ o߲#ݔ;RE*qzEJ ;OD hȞ'ʻ~-ז7r #I qjQIeê5QG1Fp9F@4*Fm %Y65toa3ؕ̎_, &v$L*1'ߔu7CJYx7#V\SCqd El2Ѡgk.#q)Ix~prK,Bsw-<ܦggz/_>x6xѬ_=ve+Ll㻏?Ǟf[L,Wm1BymW(C"@тU"-Q-Gy-k Ŗ!Ϙ'%OG;ɶEpkq܊z vB^:@2rqyoܼ~_#RzI^aؑP +h>c LJFFm]sU:ƪ#J< \-^X<Yi>;/Lgojtvd"S~.*/pUR( EI"5!C6Ϣr8XtxI1Y +);Sޓmof``/fpɸjFmZN#:0*bV,)?/7pK?cg'o_XYG? #&S.5fWYSl&(yicl|N +%ymr<_<q.%T.KҺt>s"}QX_/ޗ0^=^3^;^7^?2:>bm=H(<5ʤp]q#5W˫W{륭[ͳZ3wv@X0ޙvG@F1Æ 27Y6KYʇX'5kp_8v"5k:uS"t! +H ;!XXq` +b\}Bwp ~b"c٫XrJ8披por ǩ:1ʯD"C&G"PEJCվ.Y{!2{f9NU)F5Zѐ>PI5I鶄f(mp2Z-ڞUcGԴ 㒖UG+bCu{&X^0AOjV v[SdB0^kt 1*0!a('dž R]4'EIѦR)cZ泧9RbSRSR\C݉"2$<ݗ=>,?4Ҳx=U%,^2u{>Y?ű7`Dv3Ԗ@Ψ1wbMڿeM #Sڇjm r=<Fkcb hYZ\: +b/{v(\mNKv=a*6: [6ɯBfr3J ޼+$ʎ_…M +8TTу{@>[qO*^E~ߪ% +̯$Ȥ>~1 e-Js$AkYQ/σ9tX(w [^8KRvU,^;],ҤDՈDie/%Z4AO@"j*.Z:]Zo 1ݖ[7&ӷ] A ?`ӒH Bhcu $'SdTH +U+MͰEzqxwOSKV ԭ#k>_-g!!{ :a/s=ȷLd~$[ -eBРZHD5۲LKn˿θS)[54TTU\sgDhm&{ؑ#d@xB,tpɎ銟nr00M`2 2 8Gz :tUf:\,dDӾG.#Nu^0H(]'{5f{Nr)k`=D4xl"Z K)M_:k͐q$D${QJǫ!17nҧi_\m/׿\vC-욣pyp+<21IGDE!j} XQjx"D'1D ?rr\傏[œd8ä礓88xI%Ǜw6?XrWeSOU7ngS_m;s`=⡃gw=QCOJh1m;rk/H調PUU,nxOx|!&b{ >+ +> P6cF؍aB+;О0<GJ~{# Ё0#7a4B'0ya@B +''c +goc-b_Z cu(w1FpqN݁p@EE" f~#6Ff8M8f}-uXkEm#7"8pލ YcQWh3ivk]b8Hr7fzFI5) H amM-Z#ᶌm/m|؈7U+фZr7 u0JXna;kj*\O ]Sn#]M%+T/vM, ~w +&V67ԕTLX̕ԻV[^fbͲ2ѮLzFYf49<#{xfƭYedw+]%u%eU%uK]50rqIÊ;kj]70*P%PHe42{58Z}z- +řjl5@\p+#pfb^W(]]0[uv!T+"Rܿpח`;8p>Dه [Kq14;.j*a1Qrsӑ(gIWcYs\`?fKWެ5rYU+t)2k]c+8WʰBW!h1ύ|=("N2z}}:?A_c~llYJF_E葧 ґi=0OO*AjLC`=/t. R] tҾ~џ]{'m{i{$}џ0m+7Km6aݹ,f"^tVFl.[ZyEts@|K7m4IFN3ڊZe]RFEis];Akt5.XM*FW2Po nyTtZʹ&VWZV$UU-J. K%YrVnxi X\F+pxZne.bђfZ2:4ltJZUѹ~:ٳtl33R~;9,tfz-{4F2zϔv:%}uNn"I4/I'x?gchF;tR消w1gdCG"q##iH){*eFD,gFJ2ә4pHyIq(=OHítxhĴTfi]`/uQJ5.r +{d4HubT:DҤH))zJQ4cCbm?uFHqԅ4!&%Dx|3K4Fc#|pЈQ):FhR( 4/Fڨs*u :G;P[B6:,שg~j2HfjĞ!u&IOu&qJ/aUqBUzjD,$YK.8.JXtDb;֣7%SRE6$_ý!? +endstream +endobj + +1309 0 obj +8565 +endobj + +588 0 obj +<> +endobj + +1310 0 obj +<> +endobj + +1311 0 obj +<> +stream +xzy|Tof2{&M^B@HA(LF! dX@P$` +.jPCX\H ZZƷ_V[ +d{ޛAy{ys:Xtd܉5ceAW8;>g/5}}iign, +7|tm;4 qtvݸuA={#^R[ߠ2HNl[/cwD[ymE-{ǝ*lCz̏"S7tDߝ^Z0Mf Xlv?SU2A6,),u* Ђ>µG` +XWҧ'HHa^GH>Ȃ$p J>2 ͔> +%f'夗@>"zS̊dFpC̅y:v|nN_+DJH KnGnޢj5N~$#0LeL=bQ9Vb5܁%:JApj&Q@9 *JUQszf3~$UTDk^5ru|}HM1d$kH?9L~CN?W4!ju@RLO}% 0<+loßE~6ikXnܱAx)#HHLH#8I%Gj"҂Ԭ$k҇4HK9Jj3zzziJq/ʑebܓf`N'*{m$<Go0=;t>ԏP+;0<'$Sc4a&1RE%R>h-Dye2POQ 8zvNr:>GM>Fp'J. ?*7';+3#=mԔ$)' + xtmqVd4uZT,CS2ʤ:1RdR)S2TuE*'()h⍘~\-L B($1Z$oFRF W +̤( =6|>|B,s.*N, w-)+(FMf @+UXeATZtI\VySuYRCAczqe WTbleԳ9dt]X ]_#/aN:Ҡ!gfF<9:. S=Ț}5506ǰ"vJ.6M6VfY\l\_&Zf J@*{A4YZԳ% ¬n_@.{TK`G/=Ƒ̌ >@Ir=\h_*x`=m5i*H@oqг`ᯆ (xYlI{L'7zTɦ/@-68~pqYHZґHm&1AQj|f|6 +7nS : U'tu6WYsuu%kFZh|e<2@=z!? z@ [p8OVR3#͇P~Xr/Gi׈=b\\j$+5zjxS k<@Mxg<S3,ͰX'FpSfVT\S KkpSJ^Bzjq(zU3Fs<. Yf8EMOOZROG6hmXG BdLehO!Y5Ԅi*(1k|̯T^°^ +~ V*/E\ UӇ L_ [nHbq>nN} X4 58]wpJ_e:!)Wl)([k~՗rɳI%\c¿'s;$m-0Ȋ-Ꮦmi dfҷeS89\KѮPz_!C<0P<''ɓԗYۮRфaJ,,˱ 9F/tYW7pU!0HDBGաv¡!TbGE96l \yfd47ўӏ+s_ܒv˥M}})fR|0/q S% ԼR h4ø%h uz`mklW^!'lӶُQ^e $yն8kB:‚@Y.,{6D?g[ Ԛ- +/L?</>e)v7ͷ +cyNIQ@JD䉘Ĕ{v/5~~^xxZ|6X =~}Y<8uDǣ 슍#h5O, [66,t%;7ML=&oL }L-,<$VgוΟ_ZRGBot+ꛅ8XZifL;v6{هt {^a{Dp~U!~~rsLf5s. +L&m(roMHKЬVxo2 Z KS!DrnY=O{mM!r̯Y2d MT6" +Bo*˺w :/~B%(C@PҝV> +q㢻bymdS[S' #30-x.r4ldv_P+0z5 t2o;veX +`r&˜VY-%bm &cg}w' MZj?B f:/7eoWf9Βne|KIx6!ܜ3_ڵ0uN"IB%#PJ"(t@ 40$kawR +mFKC͏Y|\x8]`޳f˛/}Zg/>;(G*0Ou=}^8د>Y'ZشN+ƺ4gPZ".` +l/ѕ],q+bbrd)ݲjqgK⽄O%OY*kHQRI).±(.IE*}ڸ֯$7_26sO +FutZ'ͫYuNkI9\pr%TUd:MpxdM0\p]ifsٿm/B%JKY+IM%q9u[9}B>}9vFmmPGo`vuAIi(4^a0)*QZ㶲6܂lU + 7h˜.s1tyi9IS,EWkbh::4/瑥N +ӿ#)TT23?箋+GvQ?k[rHx(n#Oy6>3>.U fV([gP) R)h>TX:h 8M`Fj>I.楤Λ2>wP\TEv# zA] +d{m\1{e5:MI-Kӕ\NQ1ɹ'#eLFb5FiIRw;L++=+Iu::M;^^Ek$'y44r7TQ%{V &)fBҊ*D폟S1Ik<P8pp +WRs5\e充]]&vB&Pf*6Gq^RD~tڗ>}}M |,ܮKyLmpn?tuB[K[FoIǢ`"Ŷ0ب.tNhm^5v;(@9f ]9DMO68}.1Xou&+Zs%ka*78&@op<1iPTzxÝQ}iW,gj@'ǩqw?9=?a8a:a>n=w~qg!r'Os,oTN1MMn-&Yt︚"iġN: ])08ƢxX,'JLSc +}'t!|>#bg[hT +G"}}^=yWyE.Ǒc_R2=Z^g?>t\x,%ns1`$**ZM.DQ0Ϳ4SfMva&Pʿ +rD!rl!rDQb˿ +Vư'We.QNfhM@k^Ei4@(hAV,[^y +cЈ L~ F52J*h^ů,G=~;5gn;v ߪ.HHRG%fC6ɦGNPOЌI#4&6JIo3ۥRZB#P9>IմFmT^5\nt!FG8 +aeqo)4k͆fc@C[׭6t;B`/ 7uoS*Da\9ǣ.)#!0H#\:ԖL0fbnWZ3cpm̬?b~6T|O)|vV5>T.%%鱸r*>ICHe۵TGj9.ᥦdS)cԡ:;qWۥ^a?'֏/Xxs+S'4Sy76=yvQaRRvVqee뽇t{sܕ~kl`Vi`]r4\u(? ?Z'GޱR߬R" +F (^j4;ԏi5Ɣgbt-D K71Ř'1S9ovѼ(cƚQ?e Srޯdj/oyWTp7FM{'eni~;R5K TĴCnj7i.V p'طٿi}uKl>D-dFcdߢjh KT)cZh,DT*s:ZMh4Jΰ0%t ÅZӇ?Jq;ڛ E_~'I'x<^)?W> 復RqN򼲿b8ye`?{74E30j`#ЛFCAiz/4s=͜fmj 40ibatEdi0є0maBY4x3Zo +/fgVeq:``Lk2.,ʫêcxY +c &_(S9+!J_Ԙ+>R}8yy̑/Wx,\yBժP_<0^;To~.5 `r˽keb,+܉Q,ݱ>,7p.aم=9ZmBFfz1Wr@jhhW{@c=V]ufq3, +w.\CULxl9T^ +[QƾLB1A?`qމ*Da"LpfZe(QTUT:j6;aa +9+NyYMJ +lFXCeت|qʳ0~vk*2+tҹ2(cw9rrƉږĩd8uigGs. +:ɝ+aqΊ΀\kge1ܴLl](No]VUх |#(6tV4SZebɢKXzkVYΥ+ ج@qTNn^fQChMHa{IkKK2v[E/o q|Xصmo X Va)̂4A'B7c߃ |󫜳9\#nfn\:I`riL3׏2noxN//_>/Q~_vUf=d/ޚ%oD=1g0D6Dg'_/H<^G: ,g0 ,4{ E>;QMMkN'\ryPKx Kd+Q'/ð~ Gb +G @! +d_ǧB)kz8<3l'IY?I~$x u'e9D33IZ $rH8+H_LJgJ4F؉=Y8/<ѠTGǤQ)$O' zi, Z͎>?%:^!U%RǞɒ20!DQhg\BT"xaSTq3^?[r9\o:כ&pq7^kxW ODž"gr SwFM(_E?$<'ƕՕ:0TEm*v[sӿ9ɴGPK1, +D>JN6Gz^y#7:6:&8J"ޚiGg? ȓe)w]e~zGi54\lA\h @?&HxI)/O$/o_PVOGDLgF!^A$D/)(H +DN)(&61])^ L?qՒwFuRYK]pS"gpM([*RJ]ÂEr]%Ro*OJֲ9ˤҚY3nXk㵵f~d3ɪ䵲gIΒjjg)k5ϞnlvEO +endstream +endobj + +1312 0 obj +7879 +endobj + +912 0 obj +<> +endobj + +1313 0 obj +<> +endobj + +1314 0 obj +<> +stream +xzy|TEpխ[v$;NYI!-B aGd!, KH@q 8 F3bqP} +I坺 ?o9[Ns,Ս0BH#@EmYqcbe땾&BSckEC_h(j* a5Сۥh'6|S*@=9-[U/Dh0D%eU?G_-o[A(=/Nh|;Èa ?,T5ZE!d@FLf,V#qDH^F!'TOBﻨ>;݇Ρh+څJ<^L (e!8:QP F}4Z."z+gB +:#TNO]N(OoP9 COK6ك?RwӁ_To$R#6/Q&h!zFmIxX~TmR@ b)lK#<:(̠STc5G} +\n #I 3H,hpV\܎vH&ZՑ| c%Z܌#HR].;?V;-gMIvui]a]iEw.t^g4YZiEscCXǖC"tCS'fZџ0V}(?0 2o. kR] p)41 5%5V7S2rkRKR,Zς"w9P*.#x! U ^ҧNvuiEӋ;N5Nwq16@) "B4P1.TeKqw߲Źju`#T;6OS{Nq{@g1g~,P.NmP )}`d׋gtk]2O]L.i5^]#9)~n< \# +L32F RR2lX[v N*FfTCsH2? +A!#`A@M))TðhRΥlW|DZml83m{o]sC~;[MH8i;[%*pJ&gXݹn+I,/٘,ߍ_,7OʏìK'^/r޹ Y<|({W?l:]*Q"A843?sopiUNs@z-ޅ5.b7=>&Dө_3A'8H=Ǥ?Œ}++CGh-*#1ua" YDYrq8"8Q?˺@8|[ضWlj{WPMѰ{z2ހp[<sgH֫q6gT)@|PI*LazS mE\٠+ ӅM>~2-<;kJsc$Հ=9CS(Ȓ=xRâXnwW]+L}k͉S{L~lXؚgxpvV/xʯflC5V='EU\-6~ eF4J+eEl깘ɽ|ё8{!3vہބKTl+AEq8˚92'3+6|;v.8A' L(eJD`r+j2]K:ʵJ:**FUR9:pJ8mO34 +yJ +ȚeZۀV XlZ#j0uY\:We&-E +E[a+5qإiCTgFQ D"-6*ݢ\UO3t̊1 *^wPc݆1]cۚ.?ǺfV y#{c#{=oQPFn_7ݻ߷9[_5.QC:"@(B: (0L ÙVla 'ނBջF8guS@%GfS5T@rzk4-E@˿$Ńב:wB * S3ى4%{x/&xX1(XZ+ejDɖHi0`!c԰S~oJ!h r%=p/Z17VO=_vy_IǴLmzԩǶ/N9w~*9Q1Z;xFΜ>tOٲ׃7wϻTNjTESTiZ)XIw;=AOq fo>wϫn){8{u]g!軧º GG_O@E SIf^P.lAaL8C~&rKBAghY1]lkmK#*x-Z*VxUb8Si1ȖA!?~k%ZCP~jQp $dk-ٞ SH#Ah$x^ Bk^nAqX=$ccqPg_lJ̜'?(߰쳚+߮򽢍UxV=O{ۈ} JzjN2$۱G;0?!#?V侕pT YS/aYTc:uTP(eܤ_Vdw=C(+|C~?m؆Լe(ȹP:_vhj4('bzj0f5 >E{ Qf-m%ߒVh'#H6G%)NNdGiɘKf豨52E|uOP$r29I ]l׷=4v!tC?#ljʂvl@<' &籚p!%?IԼpM^ {WYYjBl8):V=o,wߓ}0)ivWM $xq/b6 HǢ{Xqww/1|K43;) +(OI9V\<㣚i>^>F nmT"#(nY<j|x-QUM֭v-(Ylct1(\Z['$Ӎ)ڔ>dXuݛ3 \`';N>!r~֬ϗ__R4Vm2c~ZPmؽxY\Oˁb3>)ţʬbOKXRK\щ +#])I= 'sqAեLT&FCuN#uںȺ:g]t]2*o+)jh:*X_Z8#}Iڽ2acZގ%_55Զ ր?򵢅$rGkf<>;w~{fC&LjW3Ӆٳ}-ٷF;Y1O[uaڲ6d=dPT 2%R\sm44p tA#0 A+-Ml0Q9L&p\ !{q5 0'Sa!݇$ JbvK 9=n +@g˷ z' /鳎mlʷ5W-#D.~kz]u~"-f* 6Q| a +4VNus;B#뒘뀇w6j1\ӳ$>i'|)Br +7pL"/<AiͤUf1x2@yʭ&hѢE5ŔAb)8Qhù<⾜Om~eO/>>tӸ!>*jFtY+VU mU$E4Lp IW>;J3l-\i6)x8_dىq¸lT0LgdĹnUU%fKYcؐQoD/ieI-`X +.\4h*Z۸S8"Y.磸uxge=NƾƥShgT$p ¨EsC 7^;®Ub--dSBk|k%N=ܨ xm(N OӥtEM#,^0aĥvloT &w ^B}AaRn^\z,olgO.Hil5g 4=y:R_(l"b { ʖ:n5~ٻN,-1jr4l^(sf;x6ີKV@R{ա%/7٫b:#EĪaJh&<&&]}w`^3&G2c]y~ܰb͆ {>~o vʳ'Zai*5cP:Gz<!6EbM -JLg!N勱cZ4UxiMĉFt"I`x:-AG/|Ӎ>6}M?pZ {kwT~1}SڐزmIiQ6钕k +&=K׭+)*i#g@^>GJjS'FTj|$2 +&m VͲ֬i,`Zel'_T.Ш`.pMb{Z}(p&0hթ{V,=^GI aQO."\u]>,\"B$UaؒR5إsee,' ť}ˍ66R p#${RxDo/FŸX(N^‚h5^-4W'w ]Ѷ8{\ӑ\( p=#<h<^0r\ M +]?13wwn~Q}zizWwfnmQlX5eT.. +ϟx4ή*{η@*c(FDF SM:gG TusV,lO7$ZEG4zj4جb+ YIff}z37[Un5 aK`Jh38GT(Et/Fg ޤN ]f_ֶps.w'>]Z-7?⮻?-ھlǽIs>̎>1↸Lpc_sK؍jt`D$N_3U)F%ĉq`e")}\y\UU@"ln0IPx:F+!%"RQ*t*ZBwf^[ݡO~ٯs-*g2b!x,`R0|]ݮt}G@>X?AtS"|_O*:8uk8$YDeɧ"5 ;A,IUƯLZqVTkCxټ C3xX{5" +=[g7 [q7|AYn/( ܇WfcĦyjdUkj L&Ȩܭpud(LeG~Sp+Fyf쫉S&ힳ@ڳ̽Z&\?5|C>d@HJ&BxwX؍GtwŠnbM7rY?8{QKzC^~T8go/?j uO'{30~#D5cI< p@i  ( +BN(l[P &ɇu h(1MvswPgPX@3}GCq`F=H`0`G@!ӵ`}gBS_qA:F;z3*B*Zo=&ՙN?_cKT:<^}+Tˡ!^)}G}p/8€޿,# +#0nrSS#/0I>`}F3wy7yH7#eWW9~\|X1}zKX19_J$/͠/^!G3FgbyXy(}'}U?$U?1v1<(|:v^!OG;SȓIFwO^F('줽<#A1#{UFUnF~ȮB3M ';N0#;v\F"2ZHe:*vrBeΛCK{t2/ed#=(KJ`FH2 5K +nF +9Lg22L32jM$w22eFF파`6F|y3o'>$\F1s =Jbd#dhWH*4Rm$EG3l#IhNȈIY$# 4B\h\%5hdhDEg:IDRI"^CN^ΈXaʈoa hͣi'1‚FF D $=#:xW(hM8EB04BLDLW8 ؊S߹?pB +endstream +endobj + +1315 0 obj +8848 +endobj + +924 0 obj +<> +endobj + +1316 0 obj +<> +endobj + +1317 0 obj +<> +stream +x]Mj0 >$Ӕ.BLȢ?4[I mgWV)tazO~H=zc:qkN։cuV|Y!oK¹sMKNȷh0Z7Sݯ!.A! 4EW5#H;C}#y[@.0\P4EBs׫w0oIYn2>sIRTK^-^c-Z/&x +endstream +endobj + +1319 0 obj +247 +endobj + +1318 0 obj +<> +stream +xV]lU>vv[ڲEAQ+QK--$<> >B4&*Pb@L| F&$@ bb;;R03{Ιs|; + +lўq*a| @|S1HD08{/Po{ <7e5B CS)_P@dumg8lMc;zF-{,;8>6952H F(q2AׇB +[1b@Q s뙣xcQpqsDnvnoV{뚽5)x y9Eb>\#@fo^2Iȵo6WRMu<тz;#%3 S?$PLFuD^ׅ#@`q { +Dn^֕AC^aE,СLi@F(H6!.PeHݦz[Ξ/Mĵ(٧o%dzɣԅ |j/9 :#[?2ú%ĸf; vLIk,[֒M3M\r+\;#gע2-OZģ}"GS5xꎶ}Y\,mؐ i|VP.5>\5Rݹ[WJ\]O_A?J8ۼ?`Y3$ 5fά9WM'"XeC%TUk,D<.WTF Yqb/hyz3|̥ZI3.喉ZO#.UU0י:tEWӓޞ7Ϳ'^7 ϩ҅q9-7/:_;DC +> 8IRd8$lBJߝvr>{w˨03y)hp 9 +E,A|2v!*RnY?39| A9=533/p؎t(<c00C0܏pdO,m4O@yO#۱71X#xe~qFهk [`#)،~k1 4N4ad#}ޅquo bK➳cvshhu:SkO/D!F1v}߼ ;{B3je_[g;#{a=VF3.d sBOzm+3m.kwc y+{m^)e +endstream +endobj + +1320 0 obj +1548 +endobj + +1321 0 obj +<> +endobj + +xref +0 1322 +0000000000 65535 f +0000000016 00000 n +0000040819 00000 n +0000045363 00000 n +0000046162 00000 n +0000047595 00000 n +0000052637 00000 n +0000057980 00000 n +0000061561 00000 n +0000064832 00000 n +0000067975 00000 n +0000070068 00000 n +0000071950 00000 n +0000075383 00000 n +0000077067 00000 n +0000079334 00000 n +0000082661 00000 n +0000085696 00000 n +0000088487 00000 n +0000089888 00000 n +0000091332 00000 n +0000093881 00000 n +0000096587 00000 n +0000099752 00000 n +0000102172 00000 n +0000104058 00000 n +0000105551 00000 n +0000107025 00000 n +0000109408 00000 n +0000111274 00000 n +0000113227 00000 n +0000114724 00000 n +0000116605 00000 n +0000119490 00000 n +0000121918 00000 n +0000123325 00000 n +0000125359 00000 n +0000126965 00000 n +0000128806 00000 n +0000131872 00000 n +0000134700 00000 n +0000137118 00000 n +0000140473 00000 n +0000143156 00000 n +0000145905 00000 n +0000148862 00000 n +0000151967 00000 n +0000153328 00000 n +0000155747 00000 n +0000158110 00000 n +0000160274 00000 n +0000163047 00000 n +0000165316 00000 n +0000167757 00000 n +0000169651 00000 n +0000172189 00000 n +0000174350 00000 n +0000176126 00000 n +0000177417 00000 n +0000179430 00000 n +0000180473 00000 n +0000182644 00000 n +0000186246 00000 n +0000188907 00000 n +0000192108 00000 n +0000192730 00000 n +0000194780 00000 n +0000195812 00000 n +0000198188 00000 n +0000199671 00000 n +0000201833 00000 n +0000204206 00000 n +0000206878 00000 n +0000208320 00000 n +0000210130 00000 n +0000213409 00000 n +0000216148 00000 n +0000220009 00000 n +0000221860 00000 n +0000224037 00000 n +0000226753 00000 n +0000229177 00000 n +0000231290 00000 n +0000234113 00000 n +0000235834 00000 n +0000238735 00000 n +0000240477 00000 n +0000242547 00000 n +0000244722 00000 n +0000247588 00000 n +0000249901 00000 n +0000252390 00000 n +0000254755 00000 n +0000258894 00000 n +0000262278 00000 n +0000264639 00000 n +0000267504 00000 n +0000270046 00000 n +0000272168 00000 n +0000274452 00000 n +0000277531 00000 n +0000280204 00000 n +0000283220 00000 n +0000286965 00000 n +0000289880 00000 n +0000293116 00000 n +0000295142 00000 n +0000297722 00000 n +0000300607 00000 n +0000303964 00000 n +0000306906 00000 n +0000310350 00000 n +0000312816 00000 n +0000313924 00000 n +0000316327 00000 n +0000319253 00000 n +0000324902 00000 n +0000327575 00000 n +0000328278 00000 n +0000329861 00000 n +0000332957 00000 n +0000335217 00000 n +0000337814 00000 n +0000339904 00000 n +0000342030 00000 n +0000344371 00000 n +0000346829 00000 n +0000347951 00000 n +0000350371 00000 n +0000352928 00000 n +0000356621 00000 n +0000358835 00000 n +0000361288 00000 n +0000363830 00000 n +0000364895 00000 n +0000367235 00000 n +0000370157 00000 n +0000372378 00000 n +0000374660 00000 n +0000376859 00000 n +0000379233 00000 n +0000380098 00000 n +0000383003 00000 n +0000385023 00000 n +0000386029 00000 n +0000388117 00000 n +0000390247 00000 n +0000393202 00000 n +0000396313 00000 n +0000399291 00000 n +0000402069 00000 n +0000405139 00000 n +0000406968 00000 n +0000409568 00000 n +0000412639 00000 n +0000415264 00000 n +0000418335 00000 n +0000419529 00000 n +0000420981 00000 n +0000427625 00000 n +0000431325 00000 n +0000433727 00000 n +0000436581 00000 n +0000439525 00000 n +0000442106 00000 n +0000445036 00000 n +0000448411 00000 n +0000451544 00000 n +0000453766 00000 n +0000455169 00000 n +0000457084 00000 n +0000459769 00000 n +0000461895 00000 n +0000464370 00000 n +0000467039 00000 n +0000468222 00000 n +0000470155 00000 n +0000472663 00000 n +0000476038 00000 n +0000477600 00000 n +0000479386 00000 n +0000481668 00000 n +0000483989 00000 n +0000486929 00000 n +0000488671 00000 n +0000490665 00000 n +0000493481 00000 n +0000497157 00000 n +0000502484 00000 n +0000510214 00000 n +0000515067 00000 n +0000517318 00000 n +0000518498 00000 n +0000040752 00000 n +0000000082 00000 n +0000000171 00000 n +0000000274 00000 n +0000002794 00000 n +0000003316 00000 n +0000003690 00000 n +0000003850 00000 n +0000003978 00000 n +0000004917 00000 n +0000005904 00000 n +0000006624 00000 n +0000007859 00000 n +0000009033 00000 n +0000011296 00000 n +0000011654 00000 n +0000012399 00000 n +0000013587 00000 n +0000013965 00000 n +0000014730 00000 n +0000016401 00000 n +0000016654 00000 n +0000017306 00000 n +0000019547 00000 n +0000020557 00000 n +0000021760 00000 n +0000022001 00000 n +0000023302 00000 n +0000024178 00000 n +0000024666 00000 n +0000024904 00000 n +0000025148 00000 n +0000025788 00000 n +0000027226 00000 n +0000027712 00000 n +0000028084 00000 n +0000028596 00000 n +0000029214 00000 n +0000029734 00000 n +0000030104 00000 n +0000031775 00000 n +0000033648 00000 n +0000034558 00000 n +0000035062 00000 n +0000035445 00000 n +0000036084 00000 n +0000036989 00000 n +0000037265 00000 n +0000038940 00000 n +0000039093 00000 n +0000040608 00000 n +0000001056 00000 n +0000001198 00000 n +0000001327 00000 n +0000001451 00000 n +0000001569 00000 n +0000001687 00000 n +0000001825 00000 n +0000001945 00000 n +0000002089 00000 n +0000002221 00000 n +0000002339 00000 n +0000002455 00000 n +0000002567 00000 n +0000002686 00000 n +0000000394 00000 n +0000000504 00000 n +0000000624 00000 n +0000000745 00000 n +0000000909 00000 n +0000002991 00000 n +0000003089 00000 n +0000003211 00000 n +0000003470 00000 n +0000003578 00000 n +0000004089 00000 n +0000004193 00000 n +0000004317 00000 n +0000004437 00000 n +0000004556 00000 n +0000004701 00000 n +0000004818 00000 n +0000005076 00000 n +0000005198 00000 n +0000005312 00000 n +0000005434 00000 n +0000005550 00000 n +0000005675 00000 n +0000005791 00000 n +0000006063 00000 n +0000006163 00000 n +0000006282 00000 n +0000006410 00000 n +0000006522 00000 n +0000006816 00000 n +0000006923 00000 n +0000007043 00000 n +0000007176 00000 n +0000007302 00000 n +0000007445 00000 n +0000007585 00000 n +0000008022 00000 n +0000008124 00000 n +0000008256 00000 n +0000008382 00000 n +0000008525 00000 n +0000008644 00000 n +0000008771 00000 n +0000008911 00000 n +0000009200 00000 n +0000009313 00000 n +0000009436 00000 n +0000009551 00000 n +0000009676 00000 n +0000009823 00000 n +0000009949 00000 n +0000010076 00000 n +0000010190 00000 n +0000010311 00000 n +0000010434 00000 n +0000010775 00000 n +0000010937 00000 n +0000011062 00000 n +0000011198 00000 n +0000010642 00000 n +0000010546 00000 n +0000011444 00000 n +0000011545 00000 n +0000011801 00000 n +0000011905 00000 n +0000012022 00000 n +0000012251 00000 n +0000012139 00000 n +0000012546 00000 n +0000012675 00000 n +0000012810 00000 n +0000012958 00000 n +0000013073 00000 n +0000013192 00000 n +0000013334 00000 n +0000013471 00000 n +0000013746 00000 n +0000013855 00000 n +0000014120 00000 n +0000014230 00000 n +0000014353 00000 n +0000014485 00000 n +0000014611 00000 n +0000014883 00000 n +0000015004 00000 n +0000015134 00000 n +0000015285 00000 n +0000015420 00000 n +0000015559 00000 n +0000015682 00000 n +0000015806 00000 n +0000015919 00000 n +0000016036 00000 n +0000016165 00000 n +0000016292 00000 n +0000016564 00000 n +0000016812 00000 n +0000016920 00000 n +0000017049 00000 n +0000017175 00000 n +0000017466 00000 n +0000017564 00000 n +0000017681 00000 n +0000017796 00000 n +0000017925 00000 n +0000018051 00000 n +0000018260 00000 n +0000018728 00000 n +0000018898 00000 n +0000019022 00000 n +0000019155 00000 n +0000019318 00000 n +0000019443 00000 n +0000018177 00000 n +0000018423 00000 n +0000018520 00000 n +0000018631 00000 n +0000019728 00000 n +0000019837 00000 n +0000019954 00000 n +0000020073 00000 n +0000020212 00000 n +0000020326 00000 n +0000020441 00000 n +0000020703 00000 n +0000020815 00000 n +0000020946 00000 n +0000021166 00000 n +0000021329 00000 n +0000021496 00000 n +0000021635 00000 n +0000021908 00000 n +0000022151 00000 n +0000022253 00000 n +0000022363 00000 n +0000022508 00000 n +0000022638 00000 n +0000022751 00000 n +0000022908 00000 n +0000023051 00000 n +0000023173 00000 n +0000023450 00000 n +0000023558 00000 n +0000023677 00000 n +0000023814 00000 n +0000023949 00000 n +0000024079 00000 n +0000024326 00000 n +0000024439 00000 n +0000024565 00000 n +0000024815 00000 n +0000025059 00000 n +0000025297 00000 n +0000025411 00000 n +0000025541 00000 n +0000025661 00000 n +0000025936 00000 n +0000026038 00000 n +0000026155 00000 n +0000026267 00000 n +0000026376 00000 n +0000026499 00000 n +0000026630 00000 n +0000026748 00000 n +0000026869 00000 n +0000026991 00000 n +0000027109 00000 n +0000027377 00000 n +0000027488 00000 n +0000027604 00000 n +0000027861 00000 n +0000027977 00000 n +0000028246 00000 n +0000028359 00000 n +0000028484 00000 n +0000028752 00000 n +0000028867 00000 n +0000029002 00000 n +0000029115 00000 n +0000029376 00000 n +0000029492 00000 n +0000029630 00000 n +0000029892 00000 n +0000029996 00000 n +0000030253 00000 n +0000030356 00000 n +0000030465 00000 n +0000030586 00000 n +0000030754 00000 n +0000030938 00000 n +0000031080 00000 n +0000031220 00000 n +0000031385 00000 n +0000031526 00000 n +0000031651 00000 n +0000031934 00000 n +0000032054 00000 n +0000032175 00000 n +0000032464 00000 n +0000032613 00000 n +0000032752 00000 n +0000032919 00000 n +0000033069 00000 n +0000033236 00000 n +0000033386 00000 n +0000033547 00000 n +0000033817 00000 n +0000033920 00000 n +0000034052 00000 n +0000034179 00000 n +0000034318 00000 n +0000034449 00000 n +0000034721 00000 n +0000034832 00000 n +0000034952 00000 n +0000035219 00000 n +0000035327 00000 n +0000035612 00000 n +0000035726 00000 n +0000035846 00000 n +0000035975 00000 n +0000036695 00000 n +0000036849 00000 n +0000036253 00000 n +0000036359 00000 n +0000036474 00000 n +0000036594 00000 n +0000037153 00000 n +0000037423 00000 n +0000037570 00000 n +0000037775 00000 n +0000037924 00000 n +0000038085 00000 n +0000038290 00000 n +0000038439 00000 n +0000038600 00000 n +0000038805 00000 n +0000039441 00000 n +0000040456 00000 n +0000039212 00000 n +0000039325 00000 n +0000039594 00000 n +0000039833 00000 n +0000039954 00000 n +0000040080 00000 n +0000040281 00000 n +0000042287 00000 n +0000042659 00000 n +0000042681 00000 n +0000045340 00000 n +0000850737 00000 n +0000875775 00000 n +0000885824 00000 n +0000844877 00000 n +0000045667 00000 n +0000046140 00000 n +0000894847 00000 n +0000046361 00000 n +0000047572 00000 n +0000048100 00000 n +0000048237 00000 n +0000048375 00000 n +0000048513 00000 n +0000048651 00000 n +0000048789 00000 n +0000048927 00000 n +0000049065 00000 n +0000049203 00000 n +0000049341 00000 n +0000049479 00000 n +0000049617 00000 n +0000049755 00000 n +0000049893 00000 n +0000050031 00000 n +0000050169 00000 n +0000050307 00000 n +0000050445 00000 n +0000050583 00000 n +0000050721 00000 n +0000050859 00000 n +0000050997 00000 n +0000051135 00000 n +0000051272 00000 n +0000051408 00000 n +0000908657 00000 n +0000926552 00000 n +0000944453 00000 n +0000051545 00000 n +0000052615 00000 n +0000053058 00000 n +0000053197 00000 n +0000053336 00000 n +0000053475 00000 n +0000053614 00000 n +0000053753 00000 n +0000053892 00000 n +0000054031 00000 n +0000054170 00000 n +0000054309 00000 n +0000054448 00000 n +0000054587 00000 n +0000054726 00000 n +0000054865 00000 n +0000055004 00000 n +0000055143 00000 n +0000055282 00000 n +0000055421 00000 n +0000055560 00000 n +0000055699 00000 n +0000055838 00000 n +0000055977 00000 n +0000056116 00000 n +0000057957 00000 n +0000058349 00000 n +0000058525 00000 n +0000058725 00000 n +0000058863 00000 n +0000059001 00000 n +0000963050 00000 n +0000966089 00000 n +0000059165 00000 n +0000061538 00000 n +0000061915 00000 n +0000062087 00000 n +0000062259 00000 n +0000980789 00000 n +0000062493 00000 n +0000064809 00000 n +0000065166 00000 n +0000065335 00000 n +0000990401 00000 n +0000065567 00000 n +0000067952 00000 n +0000068289 00000 n +0000068425 00000 n +0000070045 00000 n +0000070364 00000 n +0000071927 00000 n +0000072222 00000 n +0000075360 00000 n +0000075709 00000 n +0000075907 00000 n +0000077044 00000 n +0000077303 00000 n +0000079311 00000 n +0000079664 00000 n +0000079802 00000 n +0000079940 00000 n +0000080078 00000 n +0000082638 00000 n +0000082991 00000 n +0000083129 00000 n +0000083267 00000 n +0000083405 00000 n +0000085673 00000 n +0000086034 00000 n +0000086206 00000 n +0000086393 00000 n +0000086574 00000 n +0000086713 00000 n +0000088464 00000 n +0000088837 00000 n +0000088975 00000 n +0000089152 00000 n +0000089290 00000 n +0000089427 00000 n +0000089866 00000 n +0000090124 00000 n +0000091309 00000 n +0000091650 00000 n +0000091836 00000 n +0000092044 00000 n +0000092181 00000 n +0000093858 00000 n +0000094211 00000 n +0000094349 00000 n +0000094527 00000 n +0000094698 00000 n +0000096564 00000 n +0000096929 00000 n +0000097145 00000 n +0000097345 00000 n +0000097517 00000 n +0000097713 00000 n +0000097909 00000 n +0000098081 00000 n +0000099729 00000 n +0000100062 00000 n +0000100250 00000 n +0000100421 00000 n +0000102149 00000 n +0000102420 00000 n +0000104035 00000 n +0000104294 00000 n +0000105528 00000 n +0000105881 00000 n +0000106057 00000 n +0000106245 00000 n +0000106429 00000 n +0000107003 00000 n +0000107355 00000 n +0000107526 00000 n +0000107717 00000 n +0000107908 00000 n +0000109385 00000 n +0000109754 00000 n +0000109892 00000 n +0000110030 00000 n +0000110169 00000 n +0000110308 00000 n +0000110445 00000 n +0000111252 00000 n +0000111576 00000 n +0000111715 00000 n +0000113204 00000 n +0000113523 00000 n +0000114701 00000 n +0000115026 00000 n +0000115231 00000 n +0000116582 00000 n +0000116951 00000 n +0000117119 00000 n +0000117284 00000 n +0000117463 00000 n +0000117648 00000 n +0000117833 00000 n +0000119467 00000 n +0000119792 00000 n +0000119957 00000 n +0000121895 00000 n +0000122244 00000 n +0000122412 00000 n +0000123303 00000 n +0000123639 00000 n +0000123887 00000 n +0000125336 00000 n +0000125583 00000 n +0000126942 00000 n +0000127189 00000 n +0000128783 00000 n +0000129108 00000 n +0000129287 00000 n +0000131849 00000 n +0000132206 00000 n +0000132388 00000 n +0000132526 00000 n +0000134677 00000 n +0000134996 00000 n +0000137095 00000 n +0000137448 00000 n +0000137615 00000 n +0000137780 00000 n +0000137918 00000 n +0000140450 00000 n +0000140819 00000 n +0000141044 00000 n +0000141270 00000 n +0000143133 00000 n +0000143452 00000 n +0000145882 00000 n +0000146259 00000 n +0000146440 00000 n +0000146622 00000 n +0000146804 00000 n +0000148839 00000 n +0000149192 00000 n +0000149401 00000 n +0000149568 00000 n +0000149733 00000 n +0000151944 00000 n +0000152289 00000 n +0000152480 00000 n +0000152661 00000 n +0000153306 00000 n +0000153618 00000 n +0000153843 00000 n +0000155724 00000 n +0000156055 00000 n +0000158087 00000 n +0000158406 00000 n +0000160251 00000 n +0000160620 00000 n +0000160836 00000 n +0000161010 00000 n +0000163024 00000 n +0000163343 00000 n +0000165293 00000 n +0000165630 00000 n +0000165863 00000 n +0000167734 00000 n +0000168077 00000 n +0000169628 00000 n +0000169993 00000 n +0000170131 00000 n +0000170270 00000 n +0000170409 00000 n +0000172166 00000 n +0000172497 00000 n +0000174327 00000 n +0000174664 00000 n +0000174880 00000 n +0000176103 00000 n +0000176434 00000 n +0000177395 00000 n +0000177677 00000 n +0000179407 00000 n +0000179751 00000 n +0000180451 00000 n +0000787076 00000 n +0000180790 00000 n +0000182621 00000 n +0000182978 00000 n +0000183170 00000 n +0000183375 00000 n +0000186223 00000 n +0000186555 00000 n +0000188884 00000 n +0000189246 00000 n +0000189461 00000 n +0000192085 00000 n +0000192417 00000 n +0000192708 00000 n +0000192942 00000 n +0000194757 00000 n +0000195088 00000 n +0000195790 00000 n +0000196048 00000 n +0000198165 00000 n +0000198538 00000 n +0000198737 00000 n +0000198936 00000 n +0000199120 00000 n +0000199257 00000 n +0000199649 00000 n +0000199973 00000 n +0000200180 00000 n +0000201810 00000 n +0000202147 00000 n +0000202395 00000 n +0000204183 00000 n +0000204540 00000 n +0000204788 00000 n +0000205036 00000 n +0000206855 00000 n +0000207138 00000 n +0000208297 00000 n +0000208628 00000 n +0000210107 00000 n +0000210444 00000 n +0000210607 00000 n +0000213386 00000 n +0000213735 00000 n +0000213914 00000 n +0000216125 00000 n +0000216444 00000 n +0000219986 00000 n +0000220306 00000 n +0000221837 00000 n +0000222174 00000 n +0000222353 00000 n +0000224014 00000 n +0000224345 00000 n +0000226730 00000 n +0000227061 00000 n +0000229154 00000 n +0000229485 00000 n +0000231267 00000 n +0000231598 00000 n +0000234090 00000 n +0000234421 00000 n +0000235811 00000 n +0000236142 00000 n +0000238712 00000 n +0000239043 00000 n +0000240454 00000 n +0000240785 00000 n +0000242524 00000 n +0000242856 00000 n +0000244699 00000 n +0000245049 00000 n +0000245274 00000 n +0000247565 00000 n +0000247908 00000 n +0000249878 00000 n +0000250221 00000 n +0000252367 00000 n +0000252725 00000 n +0000252864 00000 n +0000253003 00000 n +0000254732 00000 n +0000255150 00000 n +0000255287 00000 n +0000255425 00000 n +0000255563 00000 n +0000255701 00000 n +0000255839 00000 n +0000255977 00000 n +0000256115 00000 n +0000256253 00000 n +0000256391 00000 n +0000256529 00000 n +0000256667 00000 n +0000258871 00000 n +0000259301 00000 n +0000259439 00000 n +0000259577 00000 n +0000259714 00000 n +0000259852 00000 n +0000259990 00000 n +0000260128 00000 n +0000260266 00000 n +0000260404 00000 n +0000260542 00000 n +0000260680 00000 n +0000260818 00000 n +0000262255 00000 n +0000262592 00000 n +0000262730 00000 n +0000264616 00000 n +0000264965 00000 n +0000265166 00000 n +0000267481 00000 n +0000267824 00000 n +0000270023 00000 n +0000270376 00000 n +0000270515 00000 n +0000270653 00000 n +0000270791 00000 n +0000272145 00000 n +0000272506 00000 n +0000272644 00000 n +0000274429 00000 n +0000274790 00000 n +0000274929 00000 n +0000277508 00000 n +0000277852 00000 n +0000280181 00000 n +0000280525 00000 n +0000283197 00000 n +0000283563 00000 n +0000283751 00000 n +0000283941 00000 n +0000284131 00000 n +0000286942 00000 n +0000287262 00000 n +0000289857 00000 n +0000290189 00000 n +0000293093 00000 n +0000293425 00000 n +0000295119 00000 n +0000295439 00000 n +0000297699 00000 n +0000298083 00000 n +0000298250 00000 n +0000999251 00000 n +0000298445 00000 n +0000300584 00000 n +0000300904 00000 n +0000303941 00000 n +0000304286 00000 n +0000306883 00000 n +0000307274 00000 n +0000307469 00000 n +0000307662 00000 n +0000307895 00000 n +0000310327 00000 n +0001009142 00000 n +0000310661 00000 n +0000312793 00000 n +0000313138 00000 n +0000313902 00000 n +0000314227 00000 n +0000314365 00000 n +0000316304 00000 n +0000316708 00000 n +0000316875 00000 n +0000783643 00000 n +0000317041 00000 n +0000319230 00000 n +0000781145 00000 n +0000319620 00000 n +0000324879 00000 n +0000325354 00000 n +0000325572 00000 n +0000325790 00000 n +0000778144 00000 n +0000716527 00000 n +0000519969 00000 n +0000521422 00000 n +0000325979 00000 n +0000327552 00000 n +0000327886 00000 n +0000328256 00000 n +0000605606 00000 n +0000328536 00000 n +0000329838 00000 n +0000330188 00000 n +0000330409 00000 n +0000332934 00000 n +0000333266 00000 n +0000335194 00000 n +0000335526 00000 n +0000337791 00000 n +0000338161 00000 n +0000338299 00000 n +0000338438 00000 n +0000339881 00000 n +0000340219 00000 n +0000340357 00000 n +0000342007 00000 n +0000342345 00000 n +0000342484 00000 n +0000344348 00000 n +0000344668 00000 n +0000346806 00000 n +0000347144 00000 n +0000347414 00000 n +0000347929 00000 n +0000348188 00000 n +0000350348 00000 n +0000350692 00000 n +0000352905 00000 n +0000353271 00000 n +0000353436 00000 n +0000353574 00000 n +0000353748 00000 n +0000356598 00000 n +0000356924 00000 n +0000357112 00000 n +0000358812 00000 n +0000359150 00000 n +0000359338 00000 n +0000361265 00000 n +0000361610 00000 n +0000363807 00000 n +0000364128 00000 n +0000364873 00000 n +0000365192 00000 n +0000367212 00000 n +0000367570 00000 n +0000367764 00000 n +0000367958 00000 n +0000370133 00000 n +0000370455 00000 n +0000372354 00000 n +0000372689 00000 n +0000374636 00000 n +0000374959 00000 n +0000376835 00000 n +0000377169 00000 n +0000379209 00000 n +0000379555 00000 n +0000380075 00000 n +0000380403 00000 n +0000380567 00000 n +0000382979 00000 n +0000383313 00000 n +0000384999 00000 n +0000385361 00000 n +0000385501 00000 n +0000385641 00000 n +0000386006 00000 n +0000564395 00000 n +0000386289 00000 n +0000388093 00000 n +0000388458 00000 n +0000388639 00000 n +0000390223 00000 n +0000390595 00000 n +0000390788 00000 n +0000390981 00000 n +0000391169 00000 n +0000393178 00000 n +0000393524 00000 n +0000396289 00000 n +0000396611 00000 n +0000399267 00000 n +0000399626 00000 n +0000402045 00000 n +0000402392 00000 n +0000405115 00000 n +0000405438 00000 n +0000406944 00000 n +0000407267 00000 n +0000409544 00000 n +0000409867 00000 n +0000412615 00000 n +0000412937 00000 n +0000415240 00000 n +0000415599 00000 n +0000418311 00000 n +0000418661 00000 n +0000418800 00000 n +0000418939 00000 n +0000419506 00000 n +0000419815 00000 n +0000420957 00000 n +0000421307 00000 n +0000421500 00000 n +0000421693 00000 n +0000427601 00000 n +0000428056 00000 n +0000431301 00000 n +0000431623 00000 n +0000433703 00000 n +0000434038 00000 n +0000436557 00000 n +0000436919 00000 n +0000437112 00000 n +0000437330 00000 n +0000439501 00000 n +0000439835 00000 n +0000442082 00000 n +0000442423 00000 n +0000442605 00000 n +0000445012 00000 n +0000445384 00000 n +0000448387 00000 n +0000448767 00000 n +0000448960 00000 n +0000449203 00000 n +0000449391 00000 n +0000449583 00000 n +0000451520 00000 n +0000451883 00000 n +0000452076 00000 n +0000452269 00000 n +0000453742 00000 n +0000454076 00000 n +0000455146 00000 n +0000455407 00000 n +0000457060 00000 n +0000457413 00000 n +0000457581 00000 n +0000459745 00000 n +0000460086 00000 n +0000460322 00000 n +0000461871 00000 n +0000462181 00000 n +0000464346 00000 n +0000464731 00000 n +0000464906 00000 n +0000465073 00000 n +0000465241 00000 n +0000467015 00000 n +0000467349 00000 n +0000468199 00000 n +0000522192 00000 n +0000468530 00000 n +0000470131 00000 n +0000470465 00000 n +0000472639 00000 n +0000473019 00000 n +0000473199 00000 n +0000473379 00000 n +0000473559 00000 n +0000473725 00000 n +0000476014 00000 n +0000476355 00000 n +0000476518 00000 n +0000477577 00000 n +0000477898 00000 n +0000479362 00000 n +0000479727 00000 n +0000479931 00000 n +0000481644 00000 n +0000482015 00000 n +0000482214 00000 n +0000482418 00000 n +0000482617 00000 n +0000483965 00000 n +0000484384 00000 n +0000484523 00000 n +0000484662 00000 n +0000484800 00000 n +0000484939 00000 n +0000485078 00000 n +0000485217 00000 n +0000485356 00000 n +0000485495 00000 n +0000485634 00000 n +0000485773 00000 n +0000485912 00000 n +0000486906 00000 n +0000487227 00000 n +0000488647 00000 n +0000488981 00000 n +0000490641 00000 n +0000490963 00000 n +0000493457 00000 n +0000493791 00000 n +0000497133 00000 n +0000497657 00000 n +0000497795 00000 n +0000497933 00000 n +0000498071 00000 n +0000498210 00000 n +0000498349 00000 n +0000498488 00000 n +0000498627 00000 n +0000498766 00000 n +0000498905 00000 n +0000499044 00000 n +0000499183 00000 n +0000499322 00000 n +0000499461 00000 n +0000499599 00000 n +0000499738 00000 n +0000499877 00000 n +0000500017 00000 n +0000500157 00000 n +0000500297 00000 n +0000500437 00000 n +0000502460 00000 n +0000503113 00000 n +0000503252 00000 n +0000503391 00000 n +0000503530 00000 n +0000503669 00000 n +0000503808 00000 n +0000503947 00000 n +0000504086 00000 n +0000504226 00000 n +0000504366 00000 n +0000504506 00000 n +0000504646 00000 n +0000504785 00000 n +0000504925 00000 n +0000505064 00000 n +0000505203 00000 n +0000505343 00000 n +0000505483 00000 n +0000505623 00000 n +0000505763 00000 n +0000505903 00000 n +0000506042 00000 n +0000506181 00000 n +0000506320 00000 n +0000506459 00000 n +0000506598 00000 n +0000506737 00000 n +0000506942 00000 n +0000507082 00000 n +0000507222 00000 n +0000507362 00000 n +0000507502 00000 n +0000507706 00000 n +0000507910 00000 n +0000508050 00000 n +0000508190 00000 n +0000508330 00000 n +0000508470 00000 n +0000510190 00000 n +0000510666 00000 n +0000510806 00000 n +0000510946 00000 n +0000511086 00000 n +0000511226 00000 n +0000511366 00000 n +0000511506 00000 n +0000511646 00000 n +0000511786 00000 n +0000511926 00000 n +0000512066 00000 n +0000512206 00000 n +0000512346 00000 n +0000512486 00000 n +0000512626 00000 n +0000512832 00000 n +0000513038 00000 n +0000515043 00000 n +0000515377 00000 n +0000517294 00000 n +0000517616 00000 n +0000518475 00000 n +0000518784 00000 n +0000518919 00000 n +0000519054 00000 n +0000519189 00000 n +0000519324 00000 n +0000519459 00000 n +0000519594 00000 n +0000519729 00000 n +0000520237 00000 n +0000520372 00000 n +0000520507 00000 n +0000520642 00000 n +0000520777 00000 n +0000520912 00000 n +0000521047 00000 n +0000521182 00000 n +0000521692 00000 n +0000522169 00000 n +0000563873 00000 n +0000563898 00000 n +0000564372 00000 n +0000605064 00000 n +0000605089 00000 n +0000605583 00000 n +0000693262 00000 n +0000693287 00000 n +0000716502 00000 n +0000754520 00000 n +0000754545 00000 n +0000778119 00000 n +0000780909 00000 n +0000780933 00000 n +0000781123 00000 n +0000781881 00000 n +0000781904 00000 n +0000783619 00000 n +0000786620 00000 n +0000786644 00000 n +0000787053 00000 n +0000844525 00000 n +0000844550 00000 n +0000844854 00000 n +0000850713 00000 n +0000851439 00000 n +0000851641 00000 n +0000875750 00000 n +0000876544 00000 n +0000876747 00000 n +0000885800 00000 n +0000886553 00000 n +0000886759 00000 n +0000894823 00000 n +0000895664 00000 n +0000895861 00000 n +0000908632 00000 n +0000909434 00000 n +0000909638 00000 n +0000926527 00000 n +0000927288 00000 n +0000927488 00000 n +0000944428 00000 n +0000945157 00000 n +0000945349 00000 n +0000963025 00000 n +0000963262 00000 n +0000963450 00000 n +0000963826 00000 n +0000963803 00000 n +0000966065 00000 n +0000966635 00000 n +0000966831 00000 n +0000967534 00000 n +0000967511 00000 n +0000980764 00000 n +0000981524 00000 n +0000981718 00000 n +0000990377 00000 n +0000991066 00000 n +0000991254 00000 n +0000999227 00000 n +0000999978 00000 n +0001000176 00000 n +0001009118 00000 n +0001009346 00000 n +0001009554 00000 n +0001009903 00000 n +0001009880 00000 n +0001011544 00000 n +0001011568 00000 n + +trailer +< <8C8D5D67F99E42C1B65FC0D80BCB6253>]>> +startxref +1011692 +%%EOF diff --git a/pdf/product1.pdf b/pdf/product1.pdf new file mode 100644 index 0000000..9b39f5f Binary files /dev/null and b/pdf/product1.pdf differ diff --git a/pdf/product2.pdf b/pdf/product2.pdf new file mode 100644 index 0000000..e7c0962 Binary files /dev/null and b/pdf/product2.pdf differ diff --git a/pdfconfigs/config_mydoc_pdf.yml b/pdfconfigs/config_mydoc_pdf.yml new file mode 100644 index 0000000..3a61d05 --- /dev/null +++ b/pdfconfigs/config_mydoc_pdf.yml @@ -0,0 +1,20 @@ +destination: _site/ +url: "http://127.0.0.1:4010" +baseurl: "/mydoc-pdf" +port: 4010 +output: pdf +product: mydoc +print_title: Jekyll theme for documentation — mydoc product +print_subtitle: version 6.0 +output: pdf +defaults: + - + scope: + path: "" + type: "pages" + values: + layout: "page_print" + comments: true + search: true + +pdf_sidebar: mydoc_sidebar diff --git a/pdfconfigs/config_product1_pdf.yml b/pdfconfigs/config_product1_pdf.yml new file mode 100644 index 0000000..04ba870 --- /dev/null +++ b/pdfconfigs/config_product1_pdf.yml @@ -0,0 +1,20 @@ +destination: _site/ +url: "http://127.0.0.1:4011" +baseurl: "/product1-pdf" +port: 4011 +output: pdf +product: product1 +print_title: Product 1 documentation +print_subtitle: version 1.0 +output: pdf +defaults: + - + scope: + path: "" + type: "pages" + values: + layout: "page_print" + comments: true + search: true + +pdf_sidebar: product1_sidebar diff --git a/pdfconfigs/config_product2_pdf.yml b/pdfconfigs/config_product2_pdf.yml new file mode 100644 index 0000000..725537d --- /dev/null +++ b/pdfconfigs/config_product2_pdf.yml @@ -0,0 +1,20 @@ +destination: _site/ +url: "http://127.0.0.1:4012" +baseurl: "/product2-pdf" +port: 4012 +output: pdf +product: product2 +print_title: Product 2 documentation +print_subtitle: version 1.0 +output: pdf +defaults: + - + scope: + path: "" + type: "pages" + values: + layout: "page_print" + comments: true + search: true + +pdf_sidebar: product2_sidebar diff --git a/pdfconfigs/prince-list.txt b/pdfconfigs/prince-list.txt new file mode 100644 index 0000000..5a31132 --- /dev/null +++ b/pdfconfigs/prince-list.txt @@ -0,0 +1,7 @@ + + + + + + + diff --git a/public/2019/06/12/launching-merlin6-docs.html b/public/2019/06/12/launching-merlin6-docs.html new file mode 100644 index 0000000..63fd0af --- /dev/null +++ b/public/2019/06/12/launching-merlin6-docs.html @@ -0,0 +1,367 @@ + + + + + + + + +Merlin 6 documentation available | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    + +
    +

    Merlin 6 documentation available

    + + + +
    + +
    + + +
    More pages will be coming soon.
    + + +

    Merlin 6 docs are now available at https://hpce.pages.psi.ch/merlin6!

    + +

    More complete documentation will be coming shortly.

    + +
    + + + +
    + + + + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/2024/08/07/merlin7-preprod-docs.html b/public/2024/08/07/merlin7-preprod-docs.html new file mode 100644 index 0000000..e7a9ee0 --- /dev/null +++ b/public/2024/08/07/merlin7-preprod-docs.html @@ -0,0 +1,370 @@ + + + + + + + + +Merlin7 in preproduction | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    + +
    +

    Merlin7 in preproduction

    + + + +
    + +
    + + +
    More pages will be coming soon.
    + + +

    The Merlin7 cluster is officially in preproduction. This phase will be tested by a few users +and slowly we will contact other users to be part of it. Keep in mind that access is restricted.

    + +

    Merlin7 documentation is now available https://hpce.pages.psi.ch/merlin7/slurm-configuration.html.

    + +

    More complete documentation will be coming shortly.

    + +
    + + + +
    + + + + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/404.html b/public/404.html new file mode 100644 index 0000000..8e2b7a8 --- /dev/null +++ b/public/404.html @@ -0,0 +1,376 @@ + + + + + + + + +Page Not Found | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Page Not Found

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    Sorry, but the page you were trying to view does not exist. Try searching for it or looking at the URL to see if it looks correct.

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/CSCS/index.html b/public/CSCS/index.html new file mode 100644 index 0000000..5c6f664 --- /dev/null +++ b/public/CSCS/index.html @@ -0,0 +1,426 @@ + + + + + + + + +PSI HPC@CSCS | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    PSI HPC@CSCS

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    PSI HPC@CSCS

    + +

    PSI has a long standing collaboration with CSCS for offering high end +HPC resources to PSI projects. PSI had co-invested in CSCS’ initial +Cray XT3 supercomputer Horizon in 2005 and we continue to procure a share on the +CSCS flagship systems.

    + +

    The share is mainly intended for projects that cannot profit from applying for regular +CSCS user lab allocation schemes.. +We can also help PSI groups to procure additional resources based on the PSI +conditions - please contact us in such a case.

    + +

    Capacity of PSI resources at CSCS

    + +

    For 2024 PSI we have a share of 400’000 NH (Node Hours) on Piz Daint, and 65 TB of storage.

    + +

    CSCS plans to decommission Piz Daint during 2024. All allocations +will be converted to allocations on the new user lab on the CSCS Alps +infrastructure. Users will be informed about the migration process.

    + +

    How to request a PSI project

    + +

    A survey is sent out to subscribed users once per year, usually in the third quarter. It serves for collecting the CSCS resources requests for the upcoming year.

    + +

    Users registered in the PSI HPC@CSCS mailing list psi-hpc-at-cscs@lists.psi.ch will +be contacted to take part in the yearly survey. Please subscribe to the list if you are interested.

    + +

    Users need to specify in the survey the total resources they intend to +use next year and also how this is to be split over the 4 quarters +(e.g. 25%, 25%, 25%, 25%), since CSCS allocates recources on a +quarterly basis. We provide the possibility to adapt the distribution +over the course of the active year or shift unused resources to other +projects (contact us on the mailing list).

    + +

    By default allocated nodes are on the CPU partition of PizDaint (36 cores per node). +However, allocations to the GPU partition are also possible (1 x NVIDIA P100 and 12 cores per +node).

    + +

    CSCS Systems reference information

    + + + +

    Contact information

    + + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/CSCS/transfer-data.html b/public/CSCS/transfer-data.html new file mode 100644 index 0000000..044a89b --- /dev/null +++ b/public/CSCS/transfer-data.html @@ -0,0 +1,405 @@ + + + + + + + + +Transferring Data betweem PSI and CSCS | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Transferring Data betweem PSI and CSCS

    +
    + + + +
    + + +
    This Document shows the procedure for transferring data between CSCS and PSI
    + + + + + + + +
    + + + + + + +

    Transferring Data

    + +

    This document shows how to transfer data between PSI and CSCS by using a Linux workstation.

    + +

    Preparing SSH configuration

    + +

    If the directory .ssh does not exist in your home directory, create it with 0700 permissions:

    + +
    mkdir ~/.ssh
    +chmod 0700 ~/.ssh
    +
    + +

    Then, if it does not exist, create a new file .ssh/config, otherwise add the following lines +to the already existing file, by replacing $cscs_accountname by your CSCS username:

    + +
    Host daint.cscs.ch
    +  Compression yes
    +  ProxyJump ela.cscs.ch
    +Host *.cscs.ch
    +  User $cscs_accountname
    +
    + +

    Advanced SSH configuration

    + +

    There are many different SSH settings available which would allow advanced configurations. +Users may have some configurations already present, therefore would need to adapt it accordingly.

    + +

    Transferring files

    + +

    Once the above configuration is set, then try to rsync from Merlin to CSCS, on any direction:

    + +
    # CSCS -> PSI
    +rsync -azv daint.cscs.ch:<source_path> <destination_path>
    +
    +# PSI  -> CSCS
    +rsync -azv <source_path> daint.cscs.ch:<destination_path>
    +
    + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/Dockerfile b/public/Dockerfile new file mode 100644 index 0000000..05da615 --- /dev/null +++ b/public/Dockerfile @@ -0,0 +1,24 @@ +FROM alpine:3.13 + +WORKDIR /tmp +COPY Gemfile /tmp/ +COPY Gemfile.lock /tmp/ + +RUN apk list -I && apk --no-cache add \ + libatomic readline readline-dev libxml2 libxml2-dev \ + ncurses-terminfo-base ncurses-terminfo \ + libxslt libxslt-dev zlib-dev zlib \ + ruby ruby-dev yaml yaml-dev \ + libffi-dev build-base git nodejs \ + && gem env \ + && gem install etc --no-document \ + && gem install bundler -v 2.4.22 --no-document \ + && pwd \ + && ls -l \ + && bundle install + +VOLUME /src +EXPOSE 4001 + +WORKDIR /src +CMD ["jekyll", "serve", "--livereload", "-H", "0.0.0.0"] diff --git a/public/Gemfile b/public/Gemfile new file mode 100644 index 0000000..c4e9e6b --- /dev/null +++ b/public/Gemfile @@ -0,0 +1,23 @@ +source "https://rubygems.org" + +# to publish on github page +# gem 'github-pages', group: :jekyll_plugins +gem 'github-pages', "~> 215" + +# to publish without github page +# gem "jekyll-redirect-from", group: :jekyll_plugins +gem "jekyll-redirect-from", "~> 0.16.0" +gem "json", "~> 2.2" +gem "webrick", "~> 1.7.0" +gem "etc", "~> 1.2.0" +gem "bigdecimal", "~> 1.4" +gem 'eventmachine', "~> 1.2.7" +gem 'faraday', "~> 1.4.3" +gem 'addressable', "~> 2.7.0" +gem 'faraday-net_http_persistent', "~> 1.1.0" +gem 'ruby2_keywords', "~> 0.0.4" +gem 'rubyzip', "~> 2.3.0" +# +gem 'ffi', "~> 1.15.3" +gem 'http_parser.rb', "~> 0.6.0" # requires mkdir in /usr/bin/mkdir +gem "jekyll", "~> 3.9.0" diff --git a/public/Gemfile.lock b/public/Gemfile.lock new file mode 100644 index 0000000..5e5a27a --- /dev/null +++ b/public/Gemfile.lock @@ -0,0 +1,292 @@ +GEM + remote: https://rubygems.org/ + specs: + activesupport (6.0.6.1) + concurrent-ruby (~> 1.0, >= 1.0.2) + i18n (>= 0.7, < 2) + minitest (~> 5.1) + tzinfo (~> 1.1) + zeitwerk (~> 2.2, >= 2.2.2) + addressable (2.7.0) + public_suffix (>= 2.0.2, < 5.0) + bigdecimal (1.4.4) + coffee-script (2.4.1) + coffee-script-source + execjs + coffee-script-source (1.11.1) + colorator (1.1.0) + commonmarker (0.17.13) + ruby-enum (~> 0.5) + concurrent-ruby (1.2.3) + dnsruby (1.70.0) + simpleidn (~> 0.2.1) + em-websocket (0.5.3) + eventmachine (>= 0.12.9) + http_parser.rb (~> 0) + etc (1.2.0) + ethon (0.16.0) + ffi (>= 1.15.0) + eventmachine (1.2.7) + execjs (2.9.1) + faraday (1.4.3) + faraday-em_http (~> 1.0) + faraday-em_synchrony (~> 1.0) + faraday-excon (~> 1.1) + faraday-net_http (~> 1.0) + faraday-net_http_persistent (~> 1.1) + multipart-post (>= 1.2, < 3) + ruby2_keywords (>= 0.0.4) + faraday-em_http (1.0.0) + faraday-em_synchrony (1.0.0) + faraday-excon (1.1.0) + faraday-net_http (1.0.1) + faraday-net_http_persistent (1.1.0) + ffi (1.15.5) + forwardable-extended (2.6.0) + gemoji (3.0.1) + github-pages (215) + github-pages-health-check (= 1.17.2) + jekyll (= 3.9.0) + jekyll-avatar (= 0.7.0) + jekyll-coffeescript (= 1.1.1) + jekyll-commonmark-ghpages (= 0.1.6) + jekyll-default-layout (= 0.1.4) + jekyll-feed (= 0.15.1) + jekyll-gist (= 1.5.0) + jekyll-github-metadata (= 2.13.0) + jekyll-mentions (= 1.6.0) + jekyll-optional-front-matter (= 0.3.2) + jekyll-paginate (= 1.1.0) + jekyll-readme-index (= 0.3.0) + jekyll-redirect-from (= 0.16.0) + jekyll-relative-links (= 0.6.1) + jekyll-remote-theme (= 0.4.3) + jekyll-sass-converter (= 1.5.2) + jekyll-seo-tag (= 2.7.1) + jekyll-sitemap (= 1.4.0) + jekyll-swiss (= 1.0.0) + jekyll-theme-architect (= 0.1.1) + jekyll-theme-cayman (= 0.1.1) + jekyll-theme-dinky (= 0.1.1) + jekyll-theme-hacker (= 0.1.2) + jekyll-theme-leap-day (= 0.1.1) + jekyll-theme-merlot (= 0.1.1) + jekyll-theme-midnight (= 0.1.1) + jekyll-theme-minimal (= 0.1.1) + jekyll-theme-modernist (= 0.1.1) + jekyll-theme-primer (= 0.5.4) + jekyll-theme-slate (= 0.1.1) + jekyll-theme-tactile (= 0.1.1) + jekyll-theme-time-machine (= 0.1.1) + jekyll-titles-from-headings (= 0.5.3) + jemoji (= 0.12.0) + kramdown (= 2.3.1) + kramdown-parser-gfm (= 1.1.0) + liquid (= 4.0.3) + mercenary (~> 0.3) + minima (= 2.5.1) + nokogiri (>= 1.10.4, < 2.0) + rouge (= 3.26.0) + terminal-table (~> 1.4) + github-pages-health-check (1.17.2) + addressable (~> 2.3) + dnsruby (~> 1.60) + octokit (~> 4.0) + public_suffix (>= 2.0.2, < 5.0) + typhoeus (~> 1.3) + html-pipeline (2.14.3) + activesupport (>= 2) + nokogiri (>= 1.4) + http_parser.rb (0.6.0) + i18n (0.9.5) + concurrent-ruby (~> 1.0) + jekyll (3.9.0) + addressable (~> 2.4) + colorator (~> 1.0) + em-websocket (~> 0.5) + i18n (~> 0.7) + jekyll-sass-converter (~> 1.0) + jekyll-watch (~> 2.0) + kramdown (>= 1.17, < 3) + liquid (~> 4.0) + mercenary (~> 0.3.3) + pathutil (~> 0.9) + rouge (>= 1.7, < 4) + safe_yaml (~> 1.0) + jekyll-avatar (0.7.0) + jekyll (>= 3.0, < 5.0) + jekyll-coffeescript (1.1.1) + coffee-script (~> 2.2) + coffee-script-source (~> 1.11.1) + jekyll-commonmark (1.3.1) + commonmarker (~> 0.14) + jekyll (>= 3.7, < 5.0) + jekyll-commonmark-ghpages (0.1.6) + commonmarker (~> 0.17.6) + jekyll-commonmark (~> 1.2) + rouge (>= 2.0, < 4.0) + jekyll-default-layout (0.1.4) + jekyll (~> 3.0) + jekyll-feed (0.15.1) + jekyll (>= 3.7, < 5.0) + jekyll-gist (1.5.0) + octokit (~> 4.2) + jekyll-github-metadata (2.13.0) + jekyll (>= 3.4, < 5.0) + octokit (~> 4.0, != 4.4.0) + jekyll-mentions (1.6.0) + html-pipeline (~> 2.3) + jekyll (>= 3.7, < 5.0) + jekyll-optional-front-matter (0.3.2) + jekyll (>= 3.0, < 5.0) + jekyll-paginate (1.1.0) + jekyll-readme-index (0.3.0) + jekyll (>= 3.0, < 5.0) + jekyll-redirect-from (0.16.0) + jekyll (>= 3.3, < 5.0) + jekyll-relative-links (0.6.1) + jekyll (>= 3.3, < 5.0) + jekyll-remote-theme (0.4.3) + addressable (~> 2.0) + jekyll (>= 3.5, < 5.0) + jekyll-sass-converter (>= 1.0, <= 3.0.0, != 2.0.0) + rubyzip (>= 1.3.0, < 3.0) + jekyll-sass-converter (1.5.2) + sass (~> 3.4) + jekyll-seo-tag (2.7.1) + jekyll (>= 3.8, < 5.0) + jekyll-sitemap (1.4.0) + jekyll (>= 3.7, < 5.0) + jekyll-swiss (1.0.0) + jekyll-theme-architect (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-theme-cayman (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-theme-dinky (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-theme-hacker (0.1.2) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-leap-day (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-theme-merlot (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-theme-midnight (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-theme-minimal (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-theme-modernist (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-theme-primer (0.5.4) + jekyll (> 3.5, < 5.0) + jekyll-github-metadata (~> 2.9) + jekyll-seo-tag (~> 2.0) + jekyll-theme-slate (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-theme-tactile (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-theme-time-machine (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-titles-from-headings (0.5.3) + jekyll (>= 3.3, < 5.0) + jekyll-watch (2.2.1) + listen (~> 3.0) + jemoji (0.12.0) + gemoji (~> 3.0) + html-pipeline (~> 2.2) + jekyll (>= 3.0, < 5.0) + json (2.7.1) + kramdown (2.3.1) + rexml + kramdown-parser-gfm (1.1.0) + kramdown (~> 2.0) + liquid (4.0.3) + listen (3.8.0) + rb-fsevent (~> 0.10, >= 0.10.3) + rb-inotify (~> 0.9, >= 0.9.10) + mercenary (0.3.6) + mini_portile2 (2.8.5) + minima (2.5.1) + jekyll (>= 3.5, < 5.0) + jekyll-feed (~> 0.9) + jekyll-seo-tag (~> 2.1) + minitest (5.21.2) + multipart-post (2.3.0) + nokogiri (1.15.5) + mini_portile2 (~> 2.8.2) + racc (~> 1.4) + octokit (4.25.1) + faraday (>= 1, < 3) + sawyer (~> 0.9) + pathutil (0.16.2) + forwardable-extended (~> 2.6) + public_suffix (4.0.7) + racc (1.7.3) + rb-fsevent (0.11.2) + rb-inotify (0.10.1) + ffi (~> 1.0) + rexml (3.2.6) + rouge (3.26.0) + ruby-enum (0.9.0) + i18n + ruby2_keywords (0.0.5) + rubyzip (2.3.2) + safe_yaml (1.0.5) + sass (3.7.4) + sass-listen (~> 4.0.0) + sass-listen (4.0.0) + rb-fsevent (~> 0.9, >= 0.9.4) + rb-inotify (~> 0.9, >= 0.9.7) + sawyer (0.9.2) + addressable (>= 2.3.5) + faraday (>= 0.17.3, < 3) + simpleidn (0.2.1) + unf (~> 0.1.4) + terminal-table (1.8.0) + unicode-display_width (~> 1.1, >= 1.1.1) + thread_safe (0.3.6) + typhoeus (1.4.1) + ethon (>= 0.9.0) + tzinfo (1.2.11) + thread_safe (~> 0.1) + unf (0.1.4) + unf_ext + unf_ext (0.0.9.1) + unicode-display_width (1.8.0) + webrick (1.7.0) + zeitwerk (2.6.12) + +PLATFORMS + ruby + x86_64-linux + +DEPENDENCIES + addressable (~> 2.7.0) + bigdecimal (~> 1.4) + etc (~> 1.2.0) + eventmachine (~> 1.2.7) + faraday (~> 1.4.3) + faraday-net_http_persistent (~> 1.1.0) + ffi (~> 1.15.3) + github-pages (~> 215) + http_parser.rb (~> 0.6.0) + jekyll (~> 3.9.0) + jekyll-redirect-from (~> 0.16.0) + json (~> 2.2) + ruby2_keywords (~> 0.0.4) + rubyzip (~> 2.3.0) + webrick (~> 1.7.0) + +BUNDLED WITH + 2.3.26 diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png new file mode 100644 index 0000000..b30a589 Binary files /dev/null and b/public/apple-touch-icon.png differ diff --git a/public/createtag b/public/createtag new file mode 100644 index 0000000..4766b6e --- /dev/null +++ b/public/createtag @@ -0,0 +1,54 @@ +#!/bin/sh + +# Using a 'cat' here document, create a file for jekyll +# website containing what's required for tag pages. + +# Pass in tag name(s) +# ./createtag linux bsd + +CMDLINEPARAM=1 # Takes at least one param. +TAGDIR="pages/tags" + +if [ $# -ge $CMDLINEPARAM ] +then + tags=$@ +else + echo "Atleast ${CMDLINEPARAM} tag name is required." + exit 1 +fi + +if [ -d "${TAGDIR}" ]; then + + echo "Creating tag(s) for ${tags}" + + for tag in ${tags}; do + echo "Title for $tag:" + read title + # Cannot indent here string. +cat <"${TAGDIR}/tag_${tag}.md" +--- +title: "${title}" +tagName: ${tag} +search: exclude +permalink: tag_${tag}.html +sidebar: mydoc_sidebar +hide_sidebar: true +folder: tags +--- + +{% include taglogic.html %} + +{% include links.html %} +EOF + +echo " - ${tag}" >> _data/tags.yml + + done + +else + echo "Directory ${TAGDIR} doesn't exist or you are not in the top-level directory." + echo "Please run again from the root directory of your project." + exit 1 +fi + +exit diff --git a/public/css/bootstrap.min.css b/public/css/bootstrap.min.css new file mode 100644 index 0000000..5b96335 --- /dev/null +++ b/public/css/bootstrap.min.css @@ -0,0 +1,6 @@ +/*! + * Bootstrap v3.4.1 (https://getbootstrap.com/) + * Copyright 2011-2019 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;-moz-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:"Glyphicons Halflings";src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format("embedded-opentype"),url(../fonts/glyphicons-halflings-regular.woff2) format("woff2"),url(../fonts/glyphicons-halflings-regular.woff) format("woff"),url(../fonts/glyphicons-halflings-regular.ttf) format("truetype"),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format("svg")}.glyphicon{position:relative;top:1px;display:inline-block;font-family:"Glyphicons Halflings";font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:"\2014 \00A0"}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:""}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:"\00A0 \2014"}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.row-no-gutters{margin-right:0;margin-left:0}.row-no-gutters [class*=col-]{padding-right:0;padding-left:0}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:none;-moz-appearance:none;appearance:none}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s,-webkit-box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=datetime-local].form-control,input[type=month].form-control,input[type=time].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],.input-group-sm input[type=time],input[type=date].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm,input[type=time].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],.input-group-lg input[type=time],input[type=date].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg,input[type=time].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;margin-bottom:0;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;padding:6px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);opacity:.65;-webkit-box-shadow:none;box-shadow:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;background-image:none;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;background-image:none;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;background-image:none;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;background-image:none;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;background-image:none;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;background-image:none;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-right:15px;margin-top:8px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-right:-15px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);margin-top:8px;margin-bottom:8px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0%;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out,-o-transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5);outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.42857143;line-break:auto;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;font-size:12px;filter:alpha(opacity=0);opacity:0}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.42857143;line-break:auto;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;font-size:14px;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover>.arrow{border-width:11px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out,-o-transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);left:0}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);left:0}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);left:0}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:rgba(0,0,0,0);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;outline:0;filter:alpha(opacity=90);opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:"\2039"}.carousel-control .icon-next:before{content:"\203a"}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} +/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/public/css/boxshadowproperties.css b/public/css/boxshadowproperties.css new file mode 100644 index 0000000..0f2e1e6 --- /dev/null +++ b/public/css/boxshadowproperties.css @@ -0,0 +1,24 @@ +/* box-shadow fonts return errors with prince, so extracting here to put in web output only */ + +#search-demo-container ul#results-container { + box-shadow: 2px 3px 2px #dedede; +} + + +hr.shaded { + box-shadow: inset 0 6px 6px -6px rgba(0,0,0,0.5); +} + +.videoThumbs img { + box-shadow: 2px 2px 1px #f0f0f0; +} + +.box { + box-shadow: 2px 2px 4px #dedede; +} + +@media (max-width: 1200px) { + .navbar-collapse { + box-shadow: inset 0 1px 0 rgba(255,255,255,0.1); + } +} diff --git a/public/css/customstyles.css b/public/css/customstyles.css new file mode 100644 index 0000000..1b4e34b --- /dev/null +++ b/public/css/customstyles.css @@ -0,0 +1,1217 @@ +body { + font-size:15px; +} + +/* HPCE Custom CSS styles - BEGIN */ +pre.terminal { + background-color: black; + color: white; + font-size: 75%; + font-family: Consolas,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,Courier New, monospace; + width: 100%; + display: inline-block; +} +details { + border: 1px solid #347DBE; + border-radius: 4px; + padding: .5em .5em 0; + color: #347DBE +} + +summary { + font-weight: bold; + margin: -.5em -.5em 0; + padding: .5em; +} + +details[open] { + padding: .5em; +} + +details[open] summary { + border-bottom: 1px solid #347DBE; + margin-bottom: .5em; +} +/* HPCE Custom CSS styles - END */ + +.bs-callout { + padding: 20px; + margin: 20px 0; + border: 1px solid #eee; + border-left-width: 5px; + border-radius: 3px; +} +.bs-callout h4 { + margin-top: 0; + margin-bottom: 5px; +} +.bs-callout p:last-child { + margin-bottom: 0; +} +.bs-callout code { + border-radius: 3px; +} +.bs-callout+.bs-callout { + margin-top: -5px; +} +.bs-callout-default { + border-left-color: #777; +} +.bs-callout-default h4 { + color: #777; +} +.bs-callout-primary { + border-left-color: #428bca; +} +.bs-callout-primary h4 { + color: #428bca; +} +.bs-callout-success { + border-left-color: #5cb85c; +} +.bs-callout-success h4 { + color: #5cb85c; +} +.bs-callout-danger { + border-left-color: #d9534f; +} +.bs-callout-danger h4 { + color: #d9534f; +} +.bs-callout-warning { + border-left-color: #f0ad4e; +} +.bs-callout-warning h4 { + color: #f0ad4e; +} +.bs-callout-warning .text-warning { + color: #f0ad4e; +} +.bs-callout-info { + border-left-color: #5bc0de; +} +.bs-callout-info h4 { + color: #5bc0de; +} + + +.gi-2x{font-size: 2em;} +.gi-3x{font-size: 3em;} +.gi-4x{font-size: 4em;} +.gi-5x{font-size: 5em;} + + + + + +.breadcrumb > .active {color: #777 !important;} + +/* make room for the nav bar */ +h1[id], +h2[id], +h3[id], +h4[id], +h5[id], +h6[id], +dt[id]{ +padding-top: 60px; +margin-top: -40px +} + +.post-content img { + margin-top: 12px; + margin-bottom: 3px; + max-width: 100%; + max-height: 100%; +} + +.post-content ol li, .post-content ul li { + margin: 10px 0px; +} + +.pageSummary { + font-size:13px; + display:block; + margin-bottom:15px; + padding-left:20px; +} + +.post-summary { + margin-bottom:12px; +} + +.bs-example{ + margin: 20px; +} + +.breadcrumb li { + color: gray; +} + +table { + background-color: transparent; +} +caption { + padding-top: 8px; + padding-bottom: 8px; + color: #777; + text-align: left; +} +th { + text-align: left; +} +table { + max-width: 90%; + margin-bottom: 20px; + border: 1px solid #dedede; +} + +table > thead > tr > th, +table > tbody > tr > th, +table > tfoot > tr > th, +table > thead > tr > td, +table > tbody > tr > td, +table > tfoot > tr > td { + padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border-top: 1px solid #ddd; +} +table > thead > tr > th { + vertical-align: bottom; + border-bottom: 2px solid #ddd; + text-transform: none; + background-color: #777; + color: white; + text-align: left; +} +table > caption + thead > tr:first-child > th, +table > colgroup + thead > tr:first-child > th, +table > thead:first-child > tr:first-child > th, +table > caption + thead > tr:first-child > td, +table > colgroup + thead > tr:first-child > td, +table > thead:first-child > tr:first-child > td { + border-top: 0; +} + +table > tbody > tr:nth-of-type(odd) { + background-color: #f9f9f9; +} + +table col[class*="col-"] { + position: static; + display: table-column; + float: none; +} +table td[class*="col-"], +table th[class*="col-"] { + position: static; + display: table-cell; + float: none; +} + +table tr td { + hyphens: auto; +} + + +p.external a { + text-align:right; + font-size:12px; + color: #0088cc; + display:inline; +} + +#definition-box-container div a.active { + font-weight: bold; +} +p.post-meta {font-size: 80%; color: #777;} + +.entry-date{font-size:14px;font-size:0.875rem;line-height:1.71429;margin-bottom:0;text-transform:uppercase;} + +/* search area */ +#search-demo-container ul#results-container { + list-style: none; + font-size: 12px; + background-color: white; + position: absolute; + top: 40px; /* if you change anything about the nav, you'll prob. need to reset the top and left values here.*/ + left: 20px; + z-index: -1; + width:223px; + border-left: 1px solid #dedede; +} + + +ul#results-container a { + background-color: transparent; +} + +ul#results-container a:hover { + color: black; +} + + +#search-demo-container a:hover { + color: black; +} +#search-input { + padding: .5em; + margin-left:20px; + width:20em; + font-size: 0.8em; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + margin-top:10px; +} +/* end search */ + +.filter-options { + margin-bottom: 20px; +} +.filter-options button { + margin: 3px; +} + +div#toc ul li { + margin: 8px 0px 8px 22px; + font-size: 90%; + list-style: square; +} +div#toc ul { + background-color: whitesmoke; + padding: 5px; + border-radius: 5px; + max-width: 300px; + color: gray; +} + +div#toc ul li ul { + padding-left:8px; + +} + +div#toc ul li ul li::before { + content: "– "; +} + +div#toc >ul::before { + content: "Table of Contents"; + font-weight: 500; + color: #555; + text-align:center; + margin-left:auto; + margin-right:auto; + width:70px; + padding-top:20px; + padding-bottom:20px; + padding-left:10px; +} + +li.dropdownActive a { + font-weight: bold; +} + + +.post-content a.fa-rss { + color: orange; +} + + +.navbar-inverse .navbar-nav > li > a { + background-color: transparent; + margin-top:10px; +} + +.post-content .rssfeedLink { + color: #248EC2; +} + +footer { + font-size: smaller; +} + +/* FAQ page */ +#accordion .panel-heading { + font-size: 12px; +} + +a.accordion-toggle, a.accordion-collapsed { + font-size: 14px; + text-decoration: none; +} + +/* navgoco sidebar styles (customized) */ +.nav, .nav ul, .nav li { + list-style: none; +} + +.nav ul { + padding: 0; + /*margin: 0 0 0 18px;*/ + margin:0px; +} + +.nav { + /* padding: 4px;*/ + padding:0px; + margin: 0px; +} + +.nav > li { + margin: 1px 0; +} + +.nav > li li { + margin: 2px 0; +} + +.nav a { + color: #333; + display: block; + outline: none; + /*-webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px;*/ + text-decoration: none; +} + +.nav li > a > span { + float: right; + font-size: 19px; + font-weight: bolder; +} + + +.nav li > a > span:after { + content: '\25be'; +} +.nav li.active > a > span:after { + content: '\25b4'; +} + +.nav a:hover, .nav li.active > a { + background-color: #8D8D8D; + color: #f5f5f5; +} + +.nav > li.active > a { +background-color: #347DBE; +} + +.nav li a { + font-size: 12px; + line-height: 18px; + padding: 2px 10px; + background-color: #f1f1f1; +} + +.nav > li > a { + font-size: 14px; + line-height: 20px; + padding: 4px 10px; +} + +ul#mysidebar { + border-radius:0px; +} + +.nav ul li ul li a { + padding-left:40px; +} + +.nav li.thirdlevel > a { + color: #248EC2; + font-weight:bold; + padding-left:20px; + background-color: whitesmoke !important; +} + + +.nav ul li a { + background-color: #FAFAFA; +} + +.nav li a { + padding-right:10px; +} + +.nav li a:hover { + background-color: #8D8D8D; +} + +.nav ul li a { + border-top:1px solid whitesmoke; + padding-left:10px; +} +/* end sidebar */ + +.navbar-inverse .navbar-nav > .active > a, .navbar-inverse .navbar-nav > .active > a:hover, .navbar-inverse .navbar-nav > .active > a:focus { + border-radius:5px; +} + +.navbar-inverse .navbar-nav>.open>a, .navbar-inverse .navbar-nav>.open>a:focus, .navbar-inverse .navbar-nav>.open>a:hover { + border-radius: 5px; +} + +span.projectTitle { + font-family: Helvetica; + font-weight: bold; +} + +.footer { + text-align: right; +} + +.footerMeta { + background-color: whitesmoke; + padding: 10px; + max-width: 250px; + border-radius: 5px; + margin-top: 50px; + font-style:italic; + font-size:12px; +} + +img.screenshotSmall { + max-width: 300px; +} + + +dl dt p { + margin-left:20px; +} + + +dl dd { + margin-top:10px; + margin-bottom:10px; +} + +dl.dl-horizontal dd { + padding-top: 20px; +} + +figcaption { + + padding-bottom:12px; + padding-top:6px; + max-width: 90%; + margin-bottom:20px; + font-style: italic; + color: gray; + +} + +.testing { + color: orange; +} + +.preference { + color: red; +} + + +table.dataTable thead { + background-color: #444; +} +table td { + hyphens: auto; +} + +section table tr.success { + background-color: #dff0d8 !important; +} + +table tr.info { + background-color: #d9edf7 !important; +} + +section table tr.warning, table tr.testing, table tr.testing > td.sorting_1 { + background-color: #fcf8e3 !important; +} +section table tr.danger, table tr.preference, table tr.preference > td.sorting_1 { + background-color: #f2dede !important; +} + +.orange { + color: orange; +} + +table.profile thead tr th { + background-color: #248ec2; +} + +table.request thead tr th { + background-color: #ED1951; +} + +.audienceLabel { + margin: 10px; + float: right; + border:1px solid #dedede; + padding:7px; +} + +.prefaceAudienceLabel { + color: gray; + text-align: center; + margin:5px; +} +span.myLabel { + padding-left:10px; + padding-right:10px; +} + +button.cursorNorm { + cursor: default; +} + +a.dropdown-toggle, .navbar-inverse .navbar-nav > li > a { + margin-left: 10px; +} + +hr.faded { + border: 0; + height: 1px; + background-image: -webkit-linear-gradient(left, rgba(0,0,0,0), rgba(0,0,0,0.75), rgba(0,0,0,0)); + background-image: -moz-linear-gradient(left, rgba(0,0,0,0), rgba(0,0,0,0.75), rgba(0,0,0,0)); + background-image: -ms-linear-gradient(left, rgba(0,0,0,0), rgba(0,0,0,0.75), rgba(0,0,0,0)); + background-image: -o-linear-gradient(left, rgba(0,0,0,0), rgba(0,0,0,0.75), rgba(0,0,0,0)); +} + +hr.shaded { + height: 12px; + border: 0; + margin-top: 70px; + background: white; + width: 100%; + margin-bottom: 10px; +} + +.fa-6x{font-size:900%;} +.fa-7x{font-size:1100%;} +.fa-8x{font-size:1300%;} +.fa-9x{font-size:1500%;} +.fa-10x{font-size:1700%;} + +i.border { + padding: 10px 20px; + background-color: whitesmoke; +} + +a[data-toggle] { + color: #248EC2; +} + +.summary { + font-size:120%; + color: #808080; + margin:20px 0px 20px 0px; + border-left: 5px solid #ED1951; + padding-left: 10px; + +} + +.summary:before { + content: "Summary: "; + font-weight: bold; +} + + +a.fa.fa-envelope-o.mailto { + font-weight: 600; +} + +h3 {color: #ED1951; font-weight:normal; font-size:130%;} +h4 {color: #808080; font-weight:normal; font-size:120%; font-style:italic;} + +.alert, .callout { + overflow: hidden; +} + +.nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus { + background-color: #248ec2; + color: white; +} + +ol li ol li {list-style-type: lower-alpha;} +ol li ul li {list-style-type: disc;} + +li img {clear:both; } + +div#toc ul li ul li { + list-style-type: none; + margin: 5px 0px 0px 0px; +} + +.tab-content { + padding: 15px; + background-color: #FAFAFA; +} + +span.tagTitle {font-weight: 500;} + +li.activeSeries { + font-weight: bold; +} + +.seriesContext .dropdown-menu li.active { + font-weight: bold; + margin-left: 43px; + font-size:18px; +} + +.alert-warning { + color: #444; +} + +div.alert code, h2 code { + background-color: transparent !important; +} +/* without this, the links in these notes aren't visible.*/ +.alert a { + text-decoration: underline; +} + +div.tags {padding: 10px 5px;} + +.tabLabel { + font-weight: normal; +} + +hr { + background: #999; + margin: 30px 0px; + width: 90%; + margin-left: auto; + margin-right: auto; +} + +button.cursorNorm { + cursor: pointer; +} + +h2 { + font-size:24px; + line-height:29px; +} +span.otherProgrammingLanguages { + font-style: normal; +} + +a[data-toggle="tooltip"] { + color: #649345; + font-style: italic; + cursor: default; +} + +.seriesNext, .seriesContext { + margin-top: 15px; + margin-bottom: 15px; +} + +.seriescontext ol li { + list-style-type: upper-roman; +} + +ol.series li { + list-style-type: decimal; + margin-left: 40px; + padding-left: 0px; +} + +.siteTagline { + font-size: 200%; + font-weight: bold; + color: silver; + font-family: monospace; + text-align: center; + line-height: 10px; + margin: 20px 0px; + display: block; +} + +.versionTagline { + text-align: center; + margin-bottom: 20px; + font-family: courier; + color: silver; + color: #444; + display:block; +} + +/* not sure if using this ...*/ +.navbar-inverse .navbar-collapse, .navbar-inverse .navbar-form { + border-color: #248ec2 !important; +} + +#mysidebar .nav ul { + background-color: #FAFAFA; +} +.nav ul.series li { + list-style: decimal; + font-size:12px; +} + +.nav ul.series li a:hover { + background-color: gray; +} +.nav ul.series { + padding-left: 30px; +} + +.nav ul.series { + background-color: #FAFAFA; +} + +/* +a.dropdown-toggle.otherProgLangs { + color: #f7e68f !important; +} +*/ + +span.muted {color: #666;} + +table code {background-color: transparent;} + +.highlight .err { + color: #a61717; + background-color: transparent !important; +} + +table p { + margin-top: 12px; + margin-bottom: 12px; +} + +pre, table code { + white-space: pre-wrap; /* css-3 */ + white-space: -moz-pre-wrap; /* Mozilla, since 1999 */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + word-wrap: break-word; /* Internet Explorer 5.5+ */ +} + +pre { + margin: 25px 0px; +} + +#json-box-container pre { + margin: 0px; +} + +.video-js { + margin: 30px 0px; +} + +video { + display: block; + margin: 30px 0px; + border: 1px solid #c0c0c0; +} + + +p.required, p.dataType {display: block; color: #c0c0c0; font-size: 80%; margin-left:4px;} + +dd {margin-left:20px;} + +.post-content img.inline { + margin:0px; + margin-bottom:6px; +} +.panel-heading { + font-weight: bold; +} + +.note code, .alert code, .warning code, div#toc code, h2 code, h3 code, h4 code { + color: inherit; + padding: 0px; +} + +.alert { + margin-bottom:10px; + margin-top:10px; +} + +a.accordion-toggle { + font-style: normal; +} + +span.red { + color: red; + font-family: Monaco, Menlo, Consolas, "Courier New", monospace; +} + +h3.codeExplanation { + font-size:18px; + font-style:normal; + color: black; + line-height: 24px; +} + +span.soft { + color: #c0c0c0; +} + +.githubEditButton { + margin-bottom:7px; +} + +.endpoint { + padding: 15px; + background-color: #f0f0f0; + font-family: courier; + font-size: 110%; + margin: 20px 0px; + color: #444; +} + +.parameter { + font-family: courier; + color: red !important; +} + +.formBoundary { + border: 1px solid gray; + padding: 15px; + margin: 15px 0px; + background-color: whitesmoke; +} + +@media (max-width: 767px) { + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { + color: #444; + } +} + +@media (max-width: 990px) { + #mysidebar { + position: relative; + } +} + +@media (min-width: 1000px) { + + ul#mysidebar { + width: 225px; + } +} + +@media (max-width: 900px) { + + ul#mysidebar { + max-width: 100%; + } +} + +.col-md-9 img { + max-width: 100%; + max-height: 100%; +} + + +.col-md-9 img { + max-width: 100%; + max-height: 100%; +} + +.videoThumbs img { + float: left; + margin:15px 15px 15px 0px; + border: 1px solid #dedede; +} + +@media only screen and (min-width: 900px), only screen and (min-device-width: 900px) { + .col-md-9 img { + max-width: 700px; + max-height: 700px; + } +} + +*:hover > .anchorjs-link { + transition: color .25s linear; + text-decoration: none; +} + +.kbCaption { + color: white; + background-color: #444; + padding:10px; +} + +/* this part adds an icon after external links, using FontAwesome*/ +a[href^="http://"]:after, a[href^="https://"]:after { + content: "\f08e"; + font-family: FontAwesome; + font-weight: normal; + font-style: normal; + display: inline-block; + text-decoration: none; + padding-left: 3px; +} + +/* Strip the outbound icon when this class is present */ +a[href].noCrossRef::after, +a.no_icon:after + { + content:"" !important; + padding-left: 0; +} + +.btn-default { + margin-bottom: 10px; +} + +/* algolia search */ + +.search { + text-align: left; +} +.search input { + font-size: 20px; + width: 300px; +} +.results { + margin: auto; + text-align: left; +} +.results ul { + list-style-type: none; + padding: 0; +} + +/* algolia */ + +div.results { + position: absolute; + background-color: white; + width: 100%; +} + +.post-meta { + font-size: 14px; + color: #828282; +} + +.post-link { + font-size: 22px; +} + +.post-list p { + margin: 10px 0px; +} + +time { + margin-right: 10px; +} + +p.post-meta time { + margin-right: 0px; +} + +span.label.label-default { + background-color: gray; +} + +span.label.label-primary { + background-color: #f0ad4e; +} +.col-lg-12 .nav li a {background-color: white} + + +.nav li.active > a.subfoldersTitle { + background-color: whitesmoke; + font-weight: bold; + color: black; + } + +a code { + color: #248EC2; +} + +code + a > code { + margin-left: -7px; +} + +table th code { + color: white; +} + +ol li ul li ol li { + list-style: decimal; +} + +ol li ul li ol li ul li{ + list-style: disc; +} + +.post-content table th { + vertical-align: top; +} + +table thead th code.highlighter-rouge { + background-color: transparent; +} + + +.box { + padding: 10px; + border: 1px solid #888; + width: 100px; + height: 80px; + background-color: #f5f5f5; + font-family: Arial; + font-size: 12px; + hyphens: auto; + float: left; + font-size: 12px; +} + +.box:hover { + background-color: #f0f0f0; +} + +#userMap { + overflow-x: auto; + overflow-y: auto; + padding: 20px; + min-width: 770px; +} + +#userMap .active { + background-color: #d6f5d6; + border:1px solid #555; + font-weight: bold; +} + +h2.userMapTitle { + font-family: Arial; +} + +#userMap a:hover { + text-decoration: none; + } + +div.arrow { + max-width: 50px; + margin-left: 15px; + margin-right: 15px; + font-size: 20px; +} + +div.content { + max-width: 110px +} + +#userMap div.arrow, #userMap div.content { + float: left; +} + +.clearfix { + clear: both; +} + + +#userMap div.arrow { + position: relative; + top: 30px; +} + +.box1 { + margin-left:0px; +} + +button.btn.btn-default.btn-lg.modalButton1 { + margin-left: -20px; +} + +div.box.box1 { + margin-left: -20px; +} + +#userMap .btn-lg { + width: 100px; + height: 80px; + +} + +#userMap .complexArrow { + font-size: 22px; + margin: 0px 10px; +} + + +#userMap .btn-lg .active { + background-color: #d6f5d6; +} + +#userMap .btn-lg { + white-space: pre-wrap; /* css-3 */ + white-space: -moz-pre-wrap; /* Mozilla, since 1999 */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + word-wrap: break-word; /* Internet Explorer 5.5+ */ + font-size: 14px; + } + +/* + * Let's target IE to respect aspect ratios and sizes for img tags containing SVG files + * + * [1] IE9 + * [2] IE10+ + */ +/* 1 */ +.ie9 img[src$=".svg"] { + width: 100%; +} +/* 2 */ +@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { + img[src$=".svg"] { + width: 100%; + } +} + +h4.panel-title { + padding-top: 0px; + margin-top: 0px; +} + +/*set navbar breakpoint so that it converts to hamburger earlier */ + +@media (max-width: 1200px) { + .navbar-header { + float: none; + } + .navbar-left,.navbar-right { + float: none !important; + } + .navbar-toggle { + display: block; + } + .navbar-collapse { + border-top: 1px solid transparent; + } + .navbar-fixed-top { + top: 0; + border-width: 0 0 1px; + } + .navbar-collapse.collapse { + display: none!important; + } + .navbar-nav { + float: none!important; + margin-top: 7.5px; + } + .navbar-nav>li { + float: none; + } + .navbar-nav>li>a { + padding-top: 10px; + padding-bottom: 10px; + } + .collapse.in{ + display:block !important; + } +} diff --git a/public/css/font-awesome.min.css b/public/css/font-awesome.min.css new file mode 100644 index 0000000..0e0645d --- /dev/null +++ b/public/css/font-awesome.min.css @@ -0,0 +1,4 @@ +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:'FontAwesome';src:url('fonts/fontawesome-webfont.eot?v=4.7.0');src:url('fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),url('fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'),url('fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),url('fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} diff --git a/public/css/fonts/FontAwesome.otf b/public/css/fonts/FontAwesome.otf new file mode 100644 index 0000000..401ec0f Binary files /dev/null and b/public/css/fonts/FontAwesome.otf differ diff --git a/public/css/fonts/fontawesome-webfont.eot b/public/css/fonts/fontawesome-webfont.eot new file mode 100644 index 0000000..e9f60ca Binary files /dev/null and b/public/css/fonts/fontawesome-webfont.eot differ diff --git a/public/css/fonts/fontawesome-webfont.svg b/public/css/fonts/fontawesome-webfont.svg new file mode 100644 index 0000000..855c845 --- /dev/null +++ b/public/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/css/fonts/fontawesome-webfont.ttf b/public/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000..35acda2 Binary files /dev/null and b/public/css/fonts/fontawesome-webfont.ttf differ diff --git a/public/css/fonts/fontawesome-webfont.woff b/public/css/fonts/fontawesome-webfont.woff new file mode 100644 index 0000000..400014a Binary files /dev/null and b/public/css/fonts/fontawesome-webfont.woff differ diff --git a/public/css/fonts/fontawesome-webfont.woff2 b/public/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 0000000..4d13fc6 Binary files /dev/null and b/public/css/fonts/fontawesome-webfont.woff2 differ diff --git a/public/css/modern-business.css b/public/css/modern-business.css new file mode 100755 index 0000000..b0323c5 --- /dev/null +++ b/public/css/modern-business.css @@ -0,0 +1,89 @@ +/*! + * Start Bootstrap - Modern Business HTML Template (http://startbootstrap.com) + * Code licensed under the Apache License v2.0. + * For details, see http://www.apache.org/licenses/LICENSE-2.0. + */ + +/* Global Styles */ + +html, +body { + height: 100%; +} + +.img-portfolio { + margin-bottom: 30px; +} + +.img-hover:hover { + opacity: 0.8; +} + +/* Home Page Carousel */ + +header.carousel { + height: 50%; +} + +header.carousel .item, +header.carousel .item.active, +header.carousel .carousel-inner { + height: 100%; +} + +header.carousel .fill { + width: 100%; + height: 100%; + background-position: center; + background-size: cover; +} + +/* 404 Page Styles */ + +.error-404 { + font-size: 100px; +} + +/* Pricing Page Styles */ + +.price { + display: block; + font-size: 50px; + line-height: 50px; +} + +.price sup { + top: -20px; + left: 2px; + font-size: 20px; +} + +.period { + display: block; + font-style: italic; +} + +/* Footer Styles */ + +footer { + margin: 50px 0; +} + +/* Responsive Styles */ + +@media(max-width:991px) { + .client-img, + .img-related { + margin-bottom: 30px; + } +} + +@media(max-width:767px) { + .img-portfolio { + margin-bottom: 15px; + } + + header.carousel .carousel { + height: 70%; + } +} diff --git a/public/css/printstyles.css b/public/css/printstyles.css new file mode 100644 index 0000000..64d0f63 --- /dev/null +++ b/public/css/printstyles.css @@ -0,0 +1,159 @@ + +/*body.print .container {max-width: 650px;}*/ + +body { + font-size:14px; +} +.nav ul li a {border-top:0px; background-color:transparent; color: #808080; } +#navig a[href] {color: #595959 !important;} +table .table {max-width:650px;} + +#navig li.sectionHead {font-weight: bold; font-size: 18px; color: #595959 !important; } +#navig li {font-weight: normal; } + +#navig a[href]::after { content: leader(".") target-counter(attr(href), page); } + +a[href]::after { + content: " (page " target-counter(attr(href), page) ")" +} + +a[href^="http:"]::after, a[href^="https:"]::after { + content: ""; +} + +a[href] { + color: blue !important; +} +a[href*="mailto"]::after, a[data-toggle="tooltip"]::after, a[href].noCrossRef::after { + content: ""; +} + + +@page { + margin: 60pt 90pt 60pt 90pt; + font-family: sans-serif; + font-style:none; + color: gray; + +} + +.printTitle { + line-height:30pt; + font-size:27pt; + font-weight: bold; + letter-spacing: -.5px; + margin-bottom:25px; +} + +.printSubtitle { + font-size: 19pt; + color: #cccccc !important; + font-family: "Grotesque MT Light"; + line-height: 22pt; + letter-spacing: -.5px; + margin-bottom:20px; +} +.printTitleArea hr { + color: #999999 !important; + height: 2px; + width: 100%; +} + +.printTitleImage { + max-width:300px; + margin-bottom:200px; +} + + +.printTitleImage { + max-width: 250px; +} + +#navig { + /*page-break-before: always;*/ +} + +.copyrightBoilerplate { + page-break-before:always; + font-size:14px; +} + +.lastGeneratedDate { + font-style: italic; + font-size:14px; + color: gray; +} + +.alert a { + text-decoration: none !important; +} + + +body.title { page: title } + +@page title { + @top-left { + content: " "; + } + @top-right { + content: " " + } + @bottom-right { + content: " "; + } + @bottom-left { + content: " "; + } +} + +body.frontmatter { page: frontmatter } +body.frontmatter {counter-reset: page 1} + + +@page frontmatter { + @top-left { + content: prince-script(guideName); + } + @top-right { + content: prince-script(datestamp); + } + @bottom-right { + content: counter(page, lower-roman); + } + @bottom-left { + content: "youremail@domain.com"; } +} + +body.first_page {counter-reset: page 1} + +h1 { string-set: doctitle content() } + +@page { + @top-left { + content: string(doctitle); + font-size: 11px; + font-style: italic; + } + @top-right { + content: prince-script(datestamp); + font-size: 11px; + } + + @bottom-right { + content: "Page " counter(page); + font-size: 11px; + } + @bottom-left { + content: prince-script(guideName); + font-size: 11px; + } +} +.alert { + background-color: #fafafa !important; + border-color: #dedede !important; + color: black; +} + +pre { + background-color: #fafafa; +} diff --git a/public/css/syntax.css b/public/css/syntax.css new file mode 100644 index 0000000..1e651cf --- /dev/null +++ b/public/css/syntax.css @@ -0,0 +1,60 @@ +.highlight { background: #ffffff; } +.highlight .c { color: #999988; font-style: italic } /* Comment */ +.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */ +.highlight .k { font-weight: bold } /* Keyword */ +.highlight .o { font-weight: bold } /* Operator */ +.highlight .cm { color: #999988; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #999999; font-weight: bold } /* Comment.Preproc */ +.highlight .c1 { color: #999988; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #999999; font-weight: bold; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */ +.highlight .gd .x { color: #000000; background-color: #ffaaaa } /* Generic.Deleted.Specific */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .gr { color: #aa0000 } /* Generic.Error */ +.highlight .gh { color: #999999 } /* Generic.Heading */ +.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */ +.highlight .gi .x { color: #000000; background-color: #aaffaa } /* Generic.Inserted.Specific */ +.highlight .go { color: #888888 } /* Generic.Output */ +.highlight .gp { color: #555555 } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #aaaaaa } /* Generic.Subheading */ +.highlight .gt { color: #aa0000 } /* Generic.Traceback */ +.highlight .kc { font-weight: bold } /* Keyword.Constant */ +.highlight .kd { font-weight: bold } /* Keyword.Declaration */ +.highlight .kp { font-weight: bold } /* Keyword.Pseudo */ +.highlight .kr { font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #445588; font-weight: bold } /* Keyword.Type */ +.highlight .m { color: #009999 } /* Literal.Number */ +.highlight .s { color: #d14 } /* Literal.String */ +.highlight .na { color: #008080 } /* Name.Attribute */ +.highlight .nb { color: #0086B3 } /* Name.Builtin */ +.highlight .nc { color: #445588; font-weight: bold } /* Name.Class */ +.highlight .no { color: #008080 } /* Name.Constant */ +.highlight .ni { color: #800080 } /* Name.Entity */ +.highlight .ne { color: #990000; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #990000; font-weight: bold } /* Name.Function */ +.highlight .nn { color: #555555 } /* Name.Namespace */ +.highlight .nt { color: #000080 } /* Name.Tag */ +.highlight .nv { color: #008080 } /* Name.Variable */ +.highlight .ow { font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mf { color: #009999 } /* Literal.Number.Float */ +.highlight .mh { color: #009999 } /* Literal.Number.Hex */ +.highlight .mi { color: #009999 } /* Literal.Number.Integer */ +.highlight .mo { color: #009999 } /* Literal.Number.Oct */ +.highlight .sb { color: #d14 } /* Literal.String.Backtick */ +.highlight .sc { color: #d14 } /* Literal.String.Char */ +.highlight .sd { color: #d14 } /* Literal.String.Doc */ +.highlight .s2 { color: #d14 } /* Literal.String.Double */ +.highlight .se { color: #d14 } /* Literal.String.Escape */ +.highlight .sh { color: #d14 } /* Literal.String.Heredoc */ +.highlight .si { color: #d14 } /* Literal.String.Interpol */ +.highlight .sx { color: #d14 } /* Literal.String.Other */ +.highlight .sr { color: #009926 } /* Literal.String.Regex */ +.highlight .s1 { color: #d14 } /* Literal.String.Single */ +.highlight .ss { color: #990073 } /* Literal.String.Symbol */ +.highlight .bp { color: #999999 } /* Name.Builtin.Pseudo */ +.highlight .vc { color: #008080 } /* Name.Variable.Class */ +.highlight .vg { color: #008080 } /* Name.Variable.Global */ +.highlight .vi { color: #008080 } /* Name.Variable.Instance */ +.highlight .il { color: #009999 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/public/css/theme-blue.css b/public/css/theme-blue.css new file mode 100644 index 0000000..db84521 --- /dev/null +++ b/public/css/theme-blue.css @@ -0,0 +1,121 @@ +.summary { + color: #808080; + border-left: 5px solid #ED1951; + font-size:16px; +} + + +h3 {color: #ED1951; } +h4 {color: #808080; } + +.nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus { + background-color: #248ec2; + color: white; +} + +.nav > li.active > a { + background-color: #347DBE; +} + +.nav > li > a:hover { + background-color: #248ec2; +} + +div.navbar-collapse .dropdown-menu > li > a:hover { + background-color: #347DBE; +} + +.nav li.thirdlevel > a { + background-color: #FAFAFA !important; + color: #248EC2; + font-weight: bold; +} + +a[data-toggle="tooltip"] { + color: #649345; + font-style: italic; + cursor: default; +} + +.navbar-inverse { + background-color: #347DBE; + border-color: #015CAE; +} +.navbar-inverse .navbar-nav>li>a, .navbar-inverse .navbar-brand { + color: white; +} + +.navbar-inverse .navbar-nav>li>a:hover, a.fa.fa-home.fa-lg.navbar-brand:hover { + color: #f0f0f0; +} + +a.navbar-brand:hover { + color: #f0f0f0; +} + +.navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .open > a:hover, .navbar-inverse .navbar-nav > .open > a:focus { + color: #015CAE; +} + +.navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .open > a:hover, .navbar-inverse .navbar-nav > .open > a:focus { + background-color: #015CAE; + color: #ffffff; +} + +.navbar-inverse .navbar-collapse, .navbar-inverse .navbar-form { + border-color: #248ec2 !important; +} + +.btn-primary { + color: #ffffff; + background-color: #347DBE; + border-color: #347DBE; +} + +.navbar-inverse .navbar-nav > .active > a, .navbar-inverse .navbar-nav > .active > a:hover, .navbar-inverse .navbar-nav > .active > a:focus { + background-color: #347DBE; +} + +.btn-primary:hover, +.btn-primary:focus, +.btn-primary:active, +.btn-primary.active, +.open .dropdown-toggle.btn-primary { + background-color: #248ec2; + border-color: #347DBE; +} + +.printTitle { + color: #015CAE !important; +} + +body.print h1 {color: #015CAE !important; font-size:28px !important;} +body.print h2 {color: #595959 !important; font-size:20px !important;} +body.print h3 {color: #E50E51 !important; font-size:14px !important;} +body.print h4 {color: #679DCE !important; font-size:14px; font-style: italic !important;} + +.anchorjs-link:hover { + color: #216f9b; +} + +div.sidebarTitle { + color: #015CAE; +} + +li.sidebarTitle { + margin-top:20px; + font-weight:normal; + font-size:130%; + color: #ED1951; + margin-bottom:10px; + margin-left: 5px; + +} + +.navbar-inverse .navbar-toggle:focus, .navbar-inverse .navbar-toggle:hover { + background-color: #015CAE; +} + +.navbar-inverse .navbar-toggle { + border-color: #015CAE; +} diff --git a/public/css/theme-green.css b/public/css/theme-green.css new file mode 100644 index 0000000..4991586 --- /dev/null +++ b/public/css/theme-green.css @@ -0,0 +1,110 @@ +.summary { + color: #808080; + border-left: 5px solid #E50E51; + font-size:16px; +} + + +h3 {color: #E50E51; } +h4 {color: #808080; } + +.nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus { + background-color: #248ec2; + color: white; +} + +.nav > li.active > a { + background-color: #72ac4a; +} + +.nav > li > a:hover { + background-color: #72ac4a; +} + +div.navbar-collapse .dropdown-menu > li > a:hover { + background-color: #72ac4a; +} + +.navbar-inverse .navbar-nav>li>a, .navbar-inverse .navbar-brand { + color: white; +} + +.navbar-inverse .navbar-nav>li>a:hover, a.fa.fa-home.fa-lg.navbar-brand:hover { + color: #f0f0f0; +} + +.nav li.thirdlevel > a { + background-color: #FAFAFA !important; + color: #72ac4a; + font-weight: bold; +} + +a[data-toggle="tooltip"] { + color: #649345; + font-style: italic; + cursor: default; +} + +.navbar-inverse { + background-color: #72ac4a; + border-color: #5b893c; +} + +.navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .open > a:hover, .navbar-inverse .navbar-nav > .open > a:focus { + color: #5b893c; +} + +.navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .open > a:hover, .navbar-inverse .navbar-nav > .open > a:focus { + background-color: #5b893c; + color: #ffffff; +} + +/* not sure if using this ...*/ +.navbar-inverse .navbar-collapse, .navbar-inverse .navbar-form { + border-color: #72ac4a !important; +} + +.btn-primary { + color: #ffffff; + background-color: #5b893c; + border-color: #5b893c; +} + +.btn-primary:hover, +.btn-primary:focus, +.btn-primary:active, +.btn-primary.active, +.open .dropdown-toggle.btn-primary { + background-color: #72ac4a; + border-color: #5b893c; +} + +.printTitle { + color: #5b893c !important; +} + +body.print h1 {color: #5b893c !important; font-size:28px;} +body.print h2 {color: #595959 !important; font-size:24px;} +body.print h3 {color: #E50E51 !important; font-size:14px;} +body.print h4 {color: #679DCE !important; font-size:14px; font-style: italic;} + +.anchorjs-link:hover { + color: #4f7233; +} + +div.sidebarTitle { + color: #E50E51; +} + +li.sidebarTitle { + margin-top:20px; + font-weight:normal; + font-size:130%; + color: #ED1951; + margin-bottom:10px; + margin-left: 5px; +} + +.navbar-inverse .navbar-toggle:focus, .navbar-inverse .navbar-toggle:hover { + background-color: #E50E51; +} diff --git a/public/docker-compose.yml b/public/docker-compose.yml new file mode 100644 index 0000000..ef68f0d --- /dev/null +++ b/public/docker-compose.yml @@ -0,0 +1,10 @@ +services: + server: + build: + context: . + dockerfile: Dockerfile + image: userdoc/latest + ports: + - "4001:4001" + volumes: + - ".:/src" diff --git a/public/favicon-16x16.png b/public/favicon-16x16.png new file mode 100644 index 0000000..31c82aa Binary files /dev/null and b/public/favicon-16x16.png differ diff --git a/public/favicon-32x32.png b/public/favicon-32x32.png new file mode 100644 index 0000000..d77d1b9 Binary files /dev/null and b/public/favicon-32x32.png differ diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000..107a8fe Binary files /dev/null and b/public/favicon.ico differ diff --git a/public/feed.xml b/public/feed.xml new file mode 100644 index 0000000..006d9a2 --- /dev/null +++ b/public/feed.xml @@ -0,0 +1,50 @@ + + + + + Merlin is the HPC cluster at Paul Scherrer Institute in Switzerland. + https://hpce.pages.psi.ch/ + + Wed, 18 Jun 2025 13:33:33 +0000 + Wed, 18 Jun 2025 13:33:33 +0000 + Jekyll v3.9.0 + + + Merlin7 in preproduction + <p>The Merlin7 cluster is officially in preproduction. This phase will be tested by a few users +and slowly we will contact other users to be part of it. Keep in mind that access is restricted.</p> + +<p>Merlin7 documentation is now available https://hpce.pages.psi.ch/merlin7/slurm-configuration.html.</p> + +<p>More complete documentation will be coming shortly.</p> + + Wed, 07 Aug 2024 00:00:00 +0000 + https://hpce.pages.psi.ch/2024/08/07/merlin7-preprod-docs.html + https://hpce.pages.psi.ch/2024/08/07/merlin7-preprod-docs.html + + news + + getting_started + + + + + + Merlin 6 documentation available + <p>Merlin 6 docs are now available at https://hpce.pages.psi.ch/merlin6!</p> + +<p>More complete documentation will be coming shortly.</p> + + Wed, 12 Jun 2019 00:00:00 +0000 + https://hpce.pages.psi.ch/2019/06/12/launching-merlin6-docs.html + https://hpce.pages.psi.ch/2019/06/12/launching-merlin6-docs.html + + news + + getting_started + + + + + + diff --git a/public/fonts/glyphicons-halflings-regular.eot b/public/fonts/glyphicons-halflings-regular.eot new file mode 100644 index 0000000..b93a495 Binary files /dev/null and b/public/fonts/glyphicons-halflings-regular.eot differ diff --git a/public/fonts/glyphicons-halflings-regular.svg b/public/fonts/glyphicons-halflings-regular.svg new file mode 100644 index 0000000..94fb549 --- /dev/null +++ b/public/fonts/glyphicons-halflings-regular.svg @@ -0,0 +1,288 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/fonts/glyphicons-halflings-regular.ttf b/public/fonts/glyphicons-halflings-regular.ttf new file mode 100644 index 0000000..1413fc6 Binary files /dev/null and b/public/fonts/glyphicons-halflings-regular.ttf differ diff --git a/public/fonts/glyphicons-halflings-regular.woff b/public/fonts/glyphicons-halflings-regular.woff new file mode 100644 index 0000000..9e61285 Binary files /dev/null and b/public/fonts/glyphicons-halflings-regular.woff differ diff --git a/public/fonts/glyphicons-halflings-regular.woff2 b/public/fonts/glyphicons-halflings-regular.woff2 new file mode 100644 index 0000000..64539b5 Binary files /dev/null and b/public/fonts/glyphicons-halflings-regular.woff2 differ diff --git a/public/gmerlin6/cluster-introduction.html b/public/gmerlin6/cluster-introduction.html new file mode 100644 index 0000000..455fffa --- /dev/null +++ b/public/gmerlin6/cluster-introduction.html @@ -0,0 +1,807 @@ + + + + + + + + +Introduction | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Introduction

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    About Merlin6 GPU cluster

    + +

    Introduction

    + +

    Merlin6 is a the official PSI Local HPC cluster for development and +mission-critical applications that has been built in 2019. It replaces +the Merlin5 cluster.

    + +

    Merlin6 is designed to be extensible, so is technically possible to add +more compute nodes and cluster storage without significant increase of +the costs of the manpower and the operations.

    + +

    Merlin6 is mostly based on CPU resources, but also contains a small amount +of GPU-based resources which are mostly used by the BIO experiments.

    + +

    Slurm ‘gmerlin6’

    + +

    THe GPU nodes have a dedicated Slurm cluster, called gmerli6.

    + +

    This cluster contains the same shared storage resources (/data/user, /data/project, /shared-scracth, /afs, /psi/home) +which are present in the other Merlin Slurm clusters (merlin5,merlin6). The Slurm gmerlin6 cluster is maintainted +independently to ease access for the users and keep independent user accounting.

    + +

    Merlin6 Architecture

    + +

    Merlin6 Cluster Architecture Diagram

    + +

    The following image shows the Merlin6 cluster architecture diagram:

    + +

    Merlin6 Architecture Diagram

    + +

    Merlin5 + Merlin6 Slurm Cluster Architecture Design

    + +

    The following image shows the Slurm architecture design for the Merlin5 & Merlin6 clusters:

    + +

    Merlin6 Slurm Architecture Design

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/gmerlin6/hardware-and-software.html b/public/gmerlin6/hardware-and-software.html new file mode 100644 index 0000000..8a1cf3d --- /dev/null +++ b/public/gmerlin6/hardware-and-software.html @@ -0,0 +1,913 @@ + + + + + + + + +Hardware And Software Description | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Hardware And Software Description

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    Hardware

    + +

    GPU Computing Nodes

    + +

    The GPU Merlin6 cluster was initially built from recycled workstations from different groups in the BIO division. +From then, little by little it was updated with new nodes from sporadic investments from the same division, and it was never possible a central big investment. +Hence, due to this, the Merlin6 GPU computing cluster has a non homogeneus solution, consisting on a big variety of hardware types and components.

    + +

    On 2018, for the common good, BIO decided to open the cluster to the Merlin users and make it widely accessible for the PSI scientists.

    + +

    The below table summarizes the hardware setup for the Merlin6 GPU computing nodes:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Merlin6 GPU Computing Nodes
    NodeProcessorSocketsCoresThreadsScratchMemoryGPUsGPU Model
    merlin-g-001Intel Core i7-5960X11621.8TB128GB2GTX1080
    merlin-g-00[2-5]Intel Xeon E5-264022011.8TB128GB4GTX1080
    merlin-g-006Intel Xeon E5-26402201800GB128GB4GTX1080Ti
    merlin-g-00[7-9]Intel Xeon E5-264022013.5TB128GB4GTX1080Ti
    merlin-g-01[0-3]Intel Xeon Silver 4210R22011.7TB128GB4RTX2080Ti
    merlin-g-014Intel Xeon Gold 6240R24812.9TB384GB8RTX2080Ti
    merlin-g-015Intel(R) Xeon Gold 5318S24812.9TB384GB8RTX A5000
    + +

    Login Nodes

    + +

    The login nodes are part of the Merlin6 HPC cluster, +and are used to compile and to submit jobs to the different Merlin Slurm clusters (merlin5,merlin6,gmerlin6,etc.). +Please refer to the Merlin6 Hardware Documentation for further information.

    + +

    Storage

    + +

    The storage is part of the Merlin6 HPC cluster, +and is mounted in all the Slurm clusters (merlin5,merlin6,gmerlin6,etc.). +Please refer to the Merlin6 Hardware Documentation for further information.

    + +

    Network

    + +

    The Merlin6 cluster connectivity is based on the Infiniband FDR and EDR technologies. +This allows fast access with very low latencies to the data as well as running extremely efficient MPI-based jobs. +To check the network speed (56Gbps for FDR, 100Gbps for EDR) of the different machines, it can be checked by running on each node the following command:

    + +
    ibstat | grep Rate
    +
    + +

    Software

    + +

    In the Merlin6 GPU computing nodes, we try to keep software stack coherency with the main cluster Merlin6.

    + +

    Due to this, the Merlin6 GPU nodes run:

    + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/gmerlin6/slurm-configuration.html b/public/gmerlin6/slurm-configuration.html new file mode 100644 index 0000000..6f72c37 --- /dev/null +++ b/public/gmerlin6/slurm-configuration.html @@ -0,0 +1,1276 @@ + + + + + + + + +Slurm cluster 'gmerlin6' | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Slurm cluster 'gmerlin6'

    +
    + + + +
    + + +
    This document describes a summary of the Slurm 'configuration.
    + + + + + + + +
    + + + + + + +

    This documentation shows basic Slurm configuration and options needed to run jobs in the GPU cluster.

    + +

    Merlin6 GPU nodes definition

    + +

    The table below shows a summary of the hardware setup for the different GPU nodes

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NodesDef.#CPUsMax.#CPUs#ThreadsDef.Mem/CPUMax.Mem/CPUMax.Mem/NodeMax.SwapGPU TypeDef.#GPUsMax.#GPUs
    merlin-g-[001]1 core8 cores1512010240010240010000geforce_gtx_108012
    merlin-g-[002-005]1 core20 cores1512010240010240010000geforce_gtx_108014
    merlin-g-[006-009]1 core20 cores1512010240010240010000geforce_gtx_1080_ti14
    merlin-g-[010-013]1 core20 cores1512010240010240010000geforce_rtx_2080_ti14
    merlin-g-0141 core48 cores1512036044836044810000geforce_rtx_2080_ti18
    merlin-g-0151 core48 cores1512036044836044810000A500018
    merlin-g-1001 core128 cores2390099840099840010000A10018
    + + + +

    Running jobs in the ‘gmerlin6’ cluster

    + +

    In this chapter we will cover basic settings that users need to specify in order to run jobs in the GPU cluster.

    + +

    Merlin6 GPU cluster

    + +

    To run jobs in the gmerlin6 cluster users must specify the cluster name in Slurm:

    + +
    #SBATCH --cluster=gmerlin6
    +
    + +

    Merlin6 GPU partitions

    + +

    Users might need to specify the Slurm partition. If no partition is specified, it will default to gpu:

    + +
    #SBATCH --partition=<partition_name>  # Possible <partition_name> values: gpu, gpu-short, gwendolen
    +
    + +

    The table below resumes shows all possible partitions available to users:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    GPU PartitionDefault TimeMax TimePriorityJobFactor*PriorityTier**
    gpu1 day1 week11
    gpu-short2 hours2 hours1000500
    gwendolen30 minutes2 hours10001000
    gwendolen-long***30 minutes8 hours11
    + +

    *The PriorityJobFactor value will be added to the job priority (PARTITION column in sprio -l ). In other words, jobs sent to higher priority +partitions will usually run first (however, other factors such like job age or mainly fair share might affect to that decision). For the GPU +partitions, Slurm will also attempt first to allocate jobs on partitions with higher priority over partitions with lesser priority.

    + +

    **Jobs submitted to a partition with a higher PriorityTier value will be dispatched before pending jobs in partition with lower PriorityTier value +and, if possible, they will preempt running jobs from partitions with lower PriorityTier values.

    + +

    ***gwnedolen-long is a special partition which is enabled during non-working hours only. As of Nov 2023, the current policy is to disable this partition from Mon to Fri, from 1am to 5pm. However, jobs can be submitted anytime, but can only be scheduled outside this time range.

    + +

    Merlin6 GPU Accounts

    + +

    Users need to ensure that the public merlin account is specified. No specifying account options would default to this account. +This is mostly needed by users which have multiple Slurm accounts, which may define by mistake a different account.

    + +
    #SBATCH --account=merlin  # Possible values: merlin, gwendolen
    +
    +

    Not all the accounts can be used on all partitions. This is resumed in the table below:

    + + + + + + + + + + + + + + + + + + +
    Slurm AccountSlurm Partitions
    merlingpu,gpu-short
    gwendolengwendolen,gwendolen-long
    + +

    By default, all users belong to the merlin Slurm accounts, and jobs are submitted to the gpu partition when no partition is defined.

    + +

    Users only need to specify the gwendolen account when using the gwendolen or gwendolen-long partitions, otherwise specifying account is not needed (it will always default to merlin).

    + +

    The ‘gwendolen’ account

    + +

    For running jobs in the gwendolen/gwendolen-long partitions, users must specify the gwendolen account. +The merlin account is not allowed to use the Gwendolen partitions.

    + +

    Gwendolen is restricted to a set of users belonging to the unx-gwendolen Unix group. If you belong to a project allowed to use Gwendolen, or you are a user which would like to have access to it, please request access to the unx-gwendolen Unix group through PSI Service Now: the request will be redirected to the responsible of the project (Andreas Adelmann).

    + +

    Slurm GPU specific options

    + +

    Some options are available when using GPUs. These are detailed here.

    + +

    Number of GPUs and type

    + +

    When using the GPU cluster, users must specify the number of GPUs they need to use:

    + +
    #SBATCH --gpus=[<type>:]<number>
    +
    + +

    The GPU type is optional: if left empty, it will try allocating any type of GPU. +The different [<type>:] values and <number> of GPUs depends on the node. +This is detailed in the below table.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NodesGPU Type#GPUs
    merlin-g-[001]geforce_gtx_10802
    merlin-g-[002-005]geforce_gtx_10804
    merlin-g-[006-009]geforce_gtx_1080_ti4
    merlin-g-[010-013]geforce_rtx_2080_ti4
    merlin-g-014geforce_rtx_2080_ti8
    merlin-g-015A50008
    merlin-g-100A1008
    + +

    Constraint / Features

    + +

    Instead of specifying the GPU type, sometimes users would need to specify the GPU by the amount of memory available in the GPU card itself. +This has been defined in Slurm with Features, which is a tag which defines the GPU memory for the different GPU cards. +Users can specify which GPU memory size needs to be used with the --constraint option. In that case, notice that in many cases + there is not need to specify [<type>:] in the --gpus option.

    + +
    #SBATCH --contraint=<Feature>    # Possible values: gpumem_8gb, gpumem_11gb, gpumem_24gb, gpumem_40gb
    +
    + +

    The table below shows the available Features and which GPU card models and GPU nodes they belong to:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Merlin6 GPU Computing Nodes
    NodesGPU TypeFeature
    merlin-g-[001-005]geforce_gtx_1080gpumem_8gb
    merlin-g-[006-009]geforce_gtx_1080_tigpumem_11gb
    merlin-g-[010-014]geforce_rtx_2080_ti
    merlin-g-015A5000gpumem_24gb
    merlin-g-100A100gpumem_40gb
    + +

    Other GPU options

    + +

    Alternative Slurm options for GPU based jobs are available. Please refer to the man pages +for each Slurm command for further information about it (man salloc, man sbatch, man srun). +Below are listed the most common settings:

    + +
    #SBATCH --hint=[no]multithread
    +#SBATCH --ntasks=\<ntasks\>
    +#SBATCH --ntasks-per-gpu=\<ntasks\>
    +#SBATCH --mem-per-gpu=\<size[units]\>
    +#SBATCH --cpus-per-gpu=\<ncpus\>
    +#SBATCH --gpus-per-node=[\<type\>:]\<number\>
    +#SBATCH --gpus-per-socket=[\<type\>:]\<number\>
    +#SBATCH --gpus-per-task=[\<type\>:]\<number\>
    +#SBATCH --gpu-bind=[verbose,]\<type\>
    +
    + +

    Please, notice that when defining [<type>:] once, then all other options must use it too!

    + +

    Dealing with Hyper-Threading

    + +

    The gmerlin6 cluster contains the partitions gwendolen and gwendolen-long, which have a node with Hyper-Threading enabled. +In that case, one should always specify whether to use Hyper-Threading or not. If not defined, Slurm will +generally use it (exceptions apply). For this machine, generally HT is recommended.

    + +
    #SBATCH --hint=multithread            # Use extra threads with in-core multi-threading.
    +#SBATCH --hint=nomultithread          # Don't use extra threads with in-core multi-threading.
    +
    + +

    User and job limits

    + +

    The GPU cluster contains some basic user and job limits to ensure that a single user can not overabuse the resources and a fair usage of the cluster. +The limits are described below.

    + +

    Per job limits

    + +

    These are limits applying to a single job. In other words, there is a maximum of resources a single job can use. +Limits are defined using QoS, and this is usually set at the partition level. Limits are described in the table below with the format: SlurmQoS(limits) +(possible SlurmQoS values can be listed with the command sacctmgr show qos):

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PartitionSlurm AccountMon-Sun 0h-24h
    gpumerlingpu_week(gres/gpu=8)
    gpu-shortmerlingpu_week(gres/gpu=8)
    gwendolengwendolenNo limits
    gwendolen-longgwendolenNo limits, active from 9pm to 5:30am
    + +
      +
    • +

      With the limits in the public gpu and gpu-short partitions, a single job using the merlin acccount +(default account) can not use more than 40 CPUs, more than 8 GPUs or more than 200GB. +Any job exceeding such limits will stay in the queue with the message QOSMax[Cpu|GRES|Mem]PerJob. +As there are no more existing QoS during the week temporary overriding job limits (this happens for +instance in the CPU daily partition), the job needs to be cancelled, and the requested resources +must be adapted according to the above resource limits.

      +
    • +
    • +

      The gwendolen and gwendolen-long partitions are two special partitions for a NVIDIA DGX A100 machine. +Only users belonging to the unx-gwendolen Unix group can run in these partitions. No limits are applied (machine resources can be completely used).

      +
    • +
    • +

      The gwendolen-long partition is available 24h. However,

      +
        +
      • from 5:30am to 9pm the partition is down (jobs can be submitted, but can not run until the partition is set to active).
      • +
      • from 9pm to 5:30am jobs are allowed to run (partition is set to active).
      • +
      +
    • +
    + +

    Per user limits for GPU partitions

    + +

    These limits apply exclusively to users. In other words, there is a maximum of resources a single user can use. +Limits are defined using QoS, and this is usually set at the partition level. Limits are described in the table below with the format: SlurmQoS(limits) +(possible SlurmQoS values can be listed with the command sacctmgr show qos):

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PartitionSlurm AccountMon-Sun 0h-24h
    gpumerlingpu_week(gres/gpu=16)
    gpu-shortmerlingpu_week(gres/gpu=16)
    gwendolengwendolenNo limits
    gwendolen-longgwendolenNo limits, active from 9pm to 5:30am
    + +
      +
    • +

      With the limits in the public gpu and gpu-short partitions, a single user can not use more than 80 CPUs, more than 16 GPUs or more than 400GB. +Jobs sent by any user already exceeding such limits will stay in the queue with the message QOSMax[Cpu|GRES|Mem]PerUser. +In that case, job can wait in the queue until some of the running resources are freed.

      +
    • +
    • +

      Notice that user limits are wider than job limits. In that way, a user can run up to two 8 GPUs based jobs, or up to four 4 GPUs based jobs, etc. +Please try to avoid occupying all GPUs of the same type for several hours or multiple days, otherwise it would block other users needing the same +type of GPU.

      +
    • +
    + +

    Advanced Slurm configuration

    + +

    Clusters at PSI use the Slurm Workload Manager as the batch system technology for managing and scheduling jobs. +Slurm has been installed in a multi-clustered configuration, allowing to integrate multiple clusters in the same batch system.

    + +

    For understanding the Slurm configuration setup in the cluster, sometimes may be useful to check the following files:

    + +
      +
    • /etc/slurm/slurm.conf - can be found in the login nodes and computing nodes.
    • +
    • /etc/slurm/gres.conf - can be found in the GPU nodes, is also propgated to login nodes and computing nodes for user read access.
    • +
    • /etc/slurm/cgroup.conf - can be found in the computing nodes, is also propagated to login nodes for user read access.
    • +
    + +

    The previous configuration files which can be found in the login nodes, correspond exclusively to the merlin6 cluster configuration files. +Configuration files for the old merlin5 cluster or for the gmerlin6 cluster must be checked directly on any of the merlin5 or gmerlin6 computing nodes (in example, by login in to one of the nodes while a job or an active allocation is running).

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/images/ANSYS/HFSS/01_Select_Scheduler_Menu.png b/public/images/ANSYS/HFSS/01_Select_Scheduler_Menu.png new file mode 100644 index 0000000..2264d75 Binary files /dev/null and b/public/images/ANSYS/HFSS/01_Select_Scheduler_Menu.png differ diff --git a/public/images/ANSYS/HFSS/02_Select_Scheduler_RSM_Remote.png b/public/images/ANSYS/HFSS/02_Select_Scheduler_RSM_Remote.png new file mode 100644 index 0000000..5e4db05 Binary files /dev/null and b/public/images/ANSYS/HFSS/02_Select_Scheduler_RSM_Remote.png differ diff --git a/public/images/ANSYS/HFSS/03_Select_Scheduler_Slurm.png b/public/images/ANSYS/HFSS/03_Select_Scheduler_Slurm.png new file mode 100644 index 0000000..a0c7ce8 Binary files /dev/null and b/public/images/ANSYS/HFSS/03_Select_Scheduler_Slurm.png differ diff --git a/public/images/ANSYS/HFSS/04_Submit_Job_Menu.png b/public/images/ANSYS/HFSS/04_Submit_Job_Menu.png new file mode 100644 index 0000000..7cea7d3 Binary files /dev/null and b/public/images/ANSYS/HFSS/04_Submit_Job_Menu.png differ diff --git a/public/images/ANSYS/HFSS/05_Submit_Job_Product_Path.png b/public/images/ANSYS/HFSS/05_Submit_Job_Product_Path.png new file mode 100644 index 0000000..7f2d9bc Binary files /dev/null and b/public/images/ANSYS/HFSS/05_Submit_Job_Product_Path.png differ diff --git a/public/images/ANSYS/cfx5launcher.png b/public/images/ANSYS/cfx5launcher.png new file mode 100644 index 0000000..60af47b Binary files /dev/null and b/public/images/ANSYS/cfx5launcher.png differ diff --git a/public/images/ANSYS/merlin7/HFSS/01_Select_Scheduler_Menu.png b/public/images/ANSYS/merlin7/HFSS/01_Select_Scheduler_Menu.png new file mode 100644 index 0000000..2264d75 Binary files /dev/null and b/public/images/ANSYS/merlin7/HFSS/01_Select_Scheduler_Menu.png differ diff --git a/public/images/ANSYS/merlin7/HFSS/02_Select_Scheduler_RSM_Remote.png b/public/images/ANSYS/merlin7/HFSS/02_Select_Scheduler_RSM_Remote.png new file mode 100644 index 0000000..5e4db05 Binary files /dev/null and b/public/images/ANSYS/merlin7/HFSS/02_Select_Scheduler_RSM_Remote.png differ diff --git a/public/images/ANSYS/merlin7/HFSS/03_Select_Scheduler_Slurm.png b/public/images/ANSYS/merlin7/HFSS/03_Select_Scheduler_Slurm.png new file mode 100644 index 0000000..a0c7ce8 Binary files /dev/null and b/public/images/ANSYS/merlin7/HFSS/03_Select_Scheduler_Slurm.png differ diff --git a/public/images/ANSYS/merlin7/HFSS/04_Submit_Job_Menu.png b/public/images/ANSYS/merlin7/HFSS/04_Submit_Job_Menu.png new file mode 100644 index 0000000..7cea7d3 Binary files /dev/null and b/public/images/ANSYS/merlin7/HFSS/04_Submit_Job_Menu.png differ diff --git a/public/images/ANSYS/merlin7/HFSS/05_Submit_Job_Product_Path.png b/public/images/ANSYS/merlin7/HFSS/05_Submit_Job_Product_Path.png new file mode 100644 index 0000000..7f2d9bc Binary files /dev/null and b/public/images/ANSYS/merlin7/HFSS/05_Submit_Job_Product_Path.png differ diff --git a/public/images/ANSYS/merlin7/cfx5launcher.png b/public/images/ANSYS/merlin7/cfx5launcher.png new file mode 100644 index 0000000..60af47b Binary files /dev/null and b/public/images/ANSYS/merlin7/cfx5launcher.png differ diff --git a/public/images/ANSYS/merlin7/merlin7/cfx5launcher.png b/public/images/ANSYS/merlin7/merlin7/cfx5launcher.png new file mode 100644 index 0000000..60af47b Binary files /dev/null and b/public/images/ANSYS/merlin7/merlin7/cfx5launcher.png differ diff --git a/public/images/ANSYS/merlin7/rsm-1-add_hpc_resource.png b/public/images/ANSYS/merlin7/rsm-1-add_hpc_resource.png new file mode 100644 index 0000000..91a5d1e Binary files /dev/null and b/public/images/ANSYS/merlin7/rsm-1-add_hpc_resource.png differ diff --git a/public/images/ANSYS/merlin7/rsm-2-add_cluster.png b/public/images/ANSYS/merlin7/rsm-2-add_cluster.png new file mode 100644 index 0000000..67611d6 Binary files /dev/null and b/public/images/ANSYS/merlin7/rsm-2-add_cluster.png differ diff --git a/public/images/ANSYS/merlin7/rsm-3-add_scratch_info.png b/public/images/ANSYS/merlin7/rsm-3-add_scratch_info.png new file mode 100644 index 0000000..487dad3 Binary files /dev/null and b/public/images/ANSYS/merlin7/rsm-3-add_scratch_info.png differ diff --git a/public/images/ANSYS/merlin7/rsm-4-get_slurm_queues.png b/public/images/ANSYS/merlin7/rsm-4-get_slurm_queues.png new file mode 100644 index 0000000..8b6a0b9 Binary files /dev/null and b/public/images/ANSYS/merlin7/rsm-4-get_slurm_queues.png differ diff --git a/public/images/ANSYS/merlin7/rsm-5-authenticating.png b/public/images/ANSYS/merlin7/rsm-5-authenticating.png new file mode 100644 index 0000000..2ff7ef8 Binary files /dev/null and b/public/images/ANSYS/merlin7/rsm-5-authenticating.png differ diff --git a/public/images/ANSYS/merlin7/rsm-6-selected-partitions.png b/public/images/ANSYS/merlin7/rsm-6-selected-partitions.png new file mode 100644 index 0000000..aa50651 Binary files /dev/null and b/public/images/ANSYS/merlin7/rsm-6-selected-partitions.png differ diff --git a/public/images/ANSYS/rsm-1-add_hpc_resource.png b/public/images/ANSYS/rsm-1-add_hpc_resource.png new file mode 100644 index 0000000..91a5d1e Binary files /dev/null and b/public/images/ANSYS/rsm-1-add_hpc_resource.png differ diff --git a/public/images/ANSYS/rsm-2-add_cluster.png b/public/images/ANSYS/rsm-2-add_cluster.png new file mode 100644 index 0000000..4bdfd8b Binary files /dev/null and b/public/images/ANSYS/rsm-2-add_cluster.png differ diff --git a/public/images/ANSYS/rsm-3-add_scratch_info.png b/public/images/ANSYS/rsm-3-add_scratch_info.png new file mode 100644 index 0000000..932deee Binary files /dev/null and b/public/images/ANSYS/rsm-3-add_scratch_info.png differ diff --git a/public/images/ANSYS/rsm-4-get_slurm_queues.png b/public/images/ANSYS/rsm-4-get_slurm_queues.png new file mode 100644 index 0000000..e9c241b Binary files /dev/null and b/public/images/ANSYS/rsm-4-get_slurm_queues.png differ diff --git a/public/images/ANSYS/rsm-5-authenticating.png b/public/images/ANSYS/rsm-5-authenticating.png new file mode 100644 index 0000000..2ff7ef8 Binary files /dev/null and b/public/images/ANSYS/rsm-5-authenticating.png differ diff --git a/public/images/ANSYS/rsm-6-selected-partitions.png b/public/images/ANSYS/rsm-6-selected-partitions.png new file mode 100644 index 0000000..4840cb9 Binary files /dev/null and b/public/images/ANSYS/rsm-6-selected-partitions.png differ diff --git a/public/images/Access/01-request-merlin5-membership.png b/public/images/Access/01-request-merlin5-membership.png new file mode 100644 index 0000000..37edbeb Binary files /dev/null and b/public/images/Access/01-request-merlin5-membership.png differ diff --git a/public/images/Access/01-request-merlin6-membership.png b/public/images/Access/01-request-merlin6-membership.png new file mode 100644 index 0000000..32d3782 Binary files /dev/null and b/public/images/Access/01-request-merlin6-membership.png differ diff --git a/public/images/Access/01-request-merlin7-membership.png b/public/images/Access/01-request-merlin7-membership.png new file mode 100644 index 0000000..4ab5cbe Binary files /dev/null and b/public/images/Access/01-request-merlin7-membership.png differ diff --git a/public/images/Access/01-request-unx-group-membership.png b/public/images/Access/01-request-unx-group-membership.png new file mode 100644 index 0000000..cf53e1a Binary files /dev/null and b/public/images/Access/01-request-unx-group-membership.png differ diff --git a/public/images/NoMachine/screen_nx1.png b/public/images/NoMachine/screen_nx1.png new file mode 100644 index 0000000..17b3aec Binary files /dev/null and b/public/images/NoMachine/screen_nx1.png differ diff --git a/public/images/NoMachine/screen_nx10.png b/public/images/NoMachine/screen_nx10.png new file mode 100644 index 0000000..969fa4b Binary files /dev/null and b/public/images/NoMachine/screen_nx10.png differ diff --git a/public/images/NoMachine/screen_nx2.png b/public/images/NoMachine/screen_nx2.png new file mode 100644 index 0000000..c287e56 Binary files /dev/null and b/public/images/NoMachine/screen_nx2.png differ diff --git a/public/images/NoMachine/screen_nx3.png b/public/images/NoMachine/screen_nx3.png new file mode 100644 index 0000000..bffe4ee Binary files /dev/null and b/public/images/NoMachine/screen_nx3.png differ diff --git a/public/images/NoMachine/screen_nx4.png b/public/images/NoMachine/screen_nx4.png new file mode 100644 index 0000000..c968aff Binary files /dev/null and b/public/images/NoMachine/screen_nx4.png differ diff --git a/public/images/NoMachine/screen_nx5.png b/public/images/NoMachine/screen_nx5.png new file mode 100644 index 0000000..aa7cde1 Binary files /dev/null and b/public/images/NoMachine/screen_nx5.png differ diff --git a/public/images/NoMachine/screen_nx6.png b/public/images/NoMachine/screen_nx6.png new file mode 100644 index 0000000..d99208d Binary files /dev/null and b/public/images/NoMachine/screen_nx6.png differ diff --git a/public/images/NoMachine/screen_nx7.png b/public/images/NoMachine/screen_nx7.png new file mode 100644 index 0000000..2e3172a Binary files /dev/null and b/public/images/NoMachine/screen_nx7.png differ diff --git a/public/images/NoMachine/screen_nx8.png b/public/images/NoMachine/screen_nx8.png new file mode 100644 index 0000000..9fe7558 Binary files /dev/null and b/public/images/NoMachine/screen_nx8.png differ diff --git a/public/images/NoMachine/screen_nx9.png b/public/images/NoMachine/screen_nx9.png new file mode 100644 index 0000000..101f0a3 Binary files /dev/null and b/public/images/NoMachine/screen_nx9.png differ diff --git a/public/images/NoMachine/screen_nx_address.png b/public/images/NoMachine/screen_nx_address.png new file mode 100644 index 0000000..7d37db2 Binary files /dev/null and b/public/images/NoMachine/screen_nx_address.png differ diff --git a/public/images/NoMachine/screen_nx_auth.png b/public/images/NoMachine/screen_nx_auth.png new file mode 100644 index 0000000..d10f0df Binary files /dev/null and b/public/images/NoMachine/screen_nx_auth.png differ diff --git a/public/images/NoMachine/screen_nx_configuration.png b/public/images/NoMachine/screen_nx_configuration.png new file mode 100644 index 0000000..065ca44 Binary files /dev/null and b/public/images/NoMachine/screen_nx_configuration.png differ diff --git a/public/images/NoMachine/screen_nx_single_session.png b/public/images/NoMachine/screen_nx_single_session.png new file mode 100644 index 0000000..113d204 Binary files /dev/null and b/public/images/NoMachine/screen_nx_single_session.png differ diff --git a/public/images/PuTTY/Putty_Disable_Kerberos_GSSAPI.png b/public/images/PuTTY/Putty_Disable_Kerberos_GSSAPI.png new file mode 100644 index 0000000..267400a Binary files /dev/null and b/public/images/PuTTY/Putty_Disable_Kerberos_GSSAPI.png differ diff --git a/public/images/PuTTY/Putty_Mouse_XTerm.png b/public/images/PuTTY/Putty_Mouse_XTerm.png new file mode 100644 index 0000000..d6bcf8d Binary files /dev/null and b/public/images/PuTTY/Putty_Mouse_XTerm.png differ diff --git a/public/images/PuTTY/Putty_Session.png b/public/images/PuTTY/Putty_Session.png new file mode 100644 index 0000000..8f609af Binary files /dev/null and b/public/images/PuTTY/Putty_Session.png differ diff --git a/public/images/PuTTY/Putty_X11_Forwarding.png b/public/images/PuTTY/Putty_X11_Forwarding.png new file mode 100644 index 0000000..89addf9 Binary files /dev/null and b/public/images/PuTTY/Putty_X11_Forwarding.png differ diff --git a/public/images/Slurm/scom.gif b/public/images/Slurm/scom.gif new file mode 100644 index 0000000..8325e26 Binary files /dev/null and b/public/images/Slurm/scom.gif differ diff --git a/public/images/Slurm/sview.png b/public/images/Slurm/sview.png new file mode 100644 index 0000000..d6081c7 Binary files /dev/null and b/public/images/Slurm/sview.png differ diff --git a/public/images/WIP/WIP1.jpeg b/public/images/WIP/WIP1.jpeg new file mode 100644 index 0000000..d464774 Binary files /dev/null and b/public/images/WIP/WIP1.jpeg differ diff --git a/public/images/WIP/WIP1.webp b/public/images/WIP/WIP1.webp new file mode 100644 index 0000000..7717a32 Binary files /dev/null and b/public/images/WIP/WIP1.webp differ diff --git a/public/images/favicon.ico b/public/images/favicon.ico new file mode 100644 index 0000000..0d505be Binary files /dev/null and b/public/images/favicon.ico differ diff --git a/public/images/hpce_logo.png b/public/images/hpce_logo.png new file mode 100644 index 0000000..2d6a9d2 Binary files /dev/null and b/public/images/hpce_logo.png differ diff --git a/public/images/jupyter-launch-classic.png b/public/images/jupyter-launch-classic.png new file mode 100644 index 0000000..2c4f401 Binary files /dev/null and b/public/images/jupyter-launch-classic.png differ diff --git a/public/images/jupyter-nbextensions.png b/public/images/jupyter-nbextensions.png new file mode 100644 index 0000000..31be093 Binary files /dev/null and b/public/images/jupyter-nbextensions.png differ diff --git a/public/images/jupytext_menu.png b/public/images/jupytext_menu.png new file mode 100644 index 0000000..cb35dba Binary files /dev/null and b/public/images/jupytext_menu.png differ diff --git a/public/images/merlin-slurm-architecture.png b/public/images/merlin-slurm-architecture.png new file mode 100644 index 0000000..38e44a8 Binary files /dev/null and b/public/images/merlin-slurm-architecture.png differ diff --git a/public/images/merlinschema3.png b/public/images/merlinschema3.png new file mode 100644 index 0000000..e09d89d Binary files /dev/null and b/public/images/merlinschema3.png differ diff --git a/public/images/psi-logo.png b/public/images/psi-logo.png new file mode 100644 index 0000000..c60da45 Binary files /dev/null and b/public/images/psi-logo.png differ diff --git a/public/images/rmount/mount.png b/public/images/rmount/mount.png new file mode 100644 index 0000000..27cea95 Binary files /dev/null and b/public/images/rmount/mount.png differ diff --git a/public/images/rmount/select-mount.png b/public/images/rmount/select-mount.png new file mode 100644 index 0000000..59d90b9 Binary files /dev/null and b/public/images/rmount/select-mount.png differ diff --git a/public/images/rmount/thunar_mount.png b/public/images/rmount/thunar_mount.png new file mode 100644 index 0000000..a970961 Binary files /dev/null and b/public/images/rmount/thunar_mount.png differ diff --git a/public/images/scicat_token.png b/public/images/scicat_token.png new file mode 100644 index 0000000..77f75c1 Binary files /dev/null and b/public/images/scicat_token.png differ diff --git a/public/index.html b/public/index.html new file mode 100644 index 0000000..c726e5c --- /dev/null +++ b/public/index.html @@ -0,0 +1,362 @@ + + + + + + + + + | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    +
    + + + +
    + + + + + + + + +

    High Performance Computing and Emerging Technologies

    + +

    The HPCE group is part of the PSI Center for Scientific Computing, Theory and Data +at Paul Scherrer Institute. It provides a range of HPC services for PSI scientists and also +engages in research activities on technologies (data analysis and machine learning technologies) used on these systems.

    + +

    Available documentation

    + +

    +

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/js/anchor.min.js b/public/js/anchor.min.js new file mode 100644 index 0000000..e302d89 --- /dev/null +++ b/public/js/anchor.min.js @@ -0,0 +1,9 @@ +// @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt Expat +// +// AnchorJS - v4.2.0 - 2019-01-01 +// https://github.com/bryanbraun/anchorjs +// Copyright (c) 2019 Bryan Braun; Licensed MIT +// +// @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt Expat +!function(A,e){"use strict";"function"==typeof define&&define.amd?define([],e):"object"==typeof module&&module.exports?module.exports=e():(A.AnchorJS=e(),A.anchors=new A.AnchorJS)}(this,function(){"use strict";return function(A){function f(A){A.icon=A.hasOwnProperty("icon")?A.icon:"",A.visible=A.hasOwnProperty("visible")?A.visible:"hover",A.placement=A.hasOwnProperty("placement")?A.placement:"right",A.ariaLabel=A.hasOwnProperty("ariaLabel")?A.ariaLabel:"Anchor",A.class=A.hasOwnProperty("class")?A.class:"",A.base=A.hasOwnProperty("base")?A.base:"",A.truncate=A.hasOwnProperty("truncate")?Math.floor(A.truncate):64,A.titleText=A.hasOwnProperty("titleText")?A.titleText:""}function p(A){var e;if("string"==typeof A||A instanceof String)e=[].slice.call(document.querySelectorAll(A));else{if(!(Array.isArray(A)||A instanceof NodeList))throw new Error("The selector provided to AnchorJS was invalid.");e=[].slice.call(A)}return e}this.options=A||{},this.elements=[],f(this.options),this.isTouchDevice=function(){return!!("ontouchstart"in window||window.DocumentTouch&&document instanceof DocumentTouch)},this.add=function(A){var e,t,i,n,o,s,a,r,c,h,l,u,d=[];if(f(this.options),"touch"===(l=this.options.visible)&&(l=this.isTouchDevice()?"always":"hover"),A||(A="h2, h3, h4, h5, h6"),0===(e=p(A)).length)return this;for(function(){if(null===document.head.querySelector("style.anchorjs")){var A,e=document.createElement("style");e.className="anchorjs",e.appendChild(document.createTextNode("")),void 0===(A=document.head.querySelector('[rel="stylesheet"], style'))?document.head.appendChild(e):document.head.insertBefore(e,A),e.sheet.insertRule(" .anchorjs-link { opacity: 0; text-decoration: none; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; }",e.sheet.cssRules.length),e.sheet.insertRule(" *:hover > .anchorjs-link, .anchorjs-link:focus { opacity: 1; }",e.sheet.cssRules.length),e.sheet.insertRule(" [data-anchorjs-icon]::after { content: attr(data-anchorjs-icon); }",e.sheet.cssRules.length),e.sheet.insertRule(' @font-face { font-family: "anchorjs-icons"; src: url(data:n/a;base64,AAEAAAALAIAAAwAwT1MvMg8yG2cAAAE4AAAAYGNtYXDp3gC3AAABpAAAAExnYXNwAAAAEAAAA9wAAAAIZ2x5ZlQCcfwAAAH4AAABCGhlYWQHFvHyAAAAvAAAADZoaGVhBnACFwAAAPQAAAAkaG10eASAADEAAAGYAAAADGxvY2EACACEAAAB8AAAAAhtYXhwAAYAVwAAARgAAAAgbmFtZQGOH9cAAAMAAAAAunBvc3QAAwAAAAADvAAAACAAAQAAAAEAAHzE2p9fDzz1AAkEAAAAAADRecUWAAAAANQA6R8AAAAAAoACwAAAAAgAAgAAAAAAAAABAAADwP/AAAACgAAA/9MCrQABAAAAAAAAAAAAAAAAAAAAAwABAAAAAwBVAAIAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAMCQAGQAAUAAAKZAswAAACPApkCzAAAAesAMwEJAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAQAAg//0DwP/AAEADwABAAAAAAQAAAAAAAAAAAAAAIAAAAAAAAAIAAAACgAAxAAAAAwAAAAMAAAAcAAEAAwAAABwAAwABAAAAHAAEADAAAAAIAAgAAgAAACDpy//9//8AAAAg6cv//f///+EWNwADAAEAAAAAAAAAAAAAAAAACACEAAEAAAAAAAAAAAAAAAAxAAACAAQARAKAAsAAKwBUAAABIiYnJjQ3NzY2MzIWFxYUBwcGIicmNDc3NjQnJiYjIgYHBwYUFxYUBwYGIwciJicmNDc3NjIXFhQHBwYUFxYWMzI2Nzc2NCcmNDc2MhcWFAcHBgYjARQGDAUtLXoWOR8fORYtLTgKGwoKCjgaGg0gEhIgDXoaGgkJBQwHdR85Fi0tOAobCgoKOBoaDSASEiANehoaCQkKGwotLXoWOR8BMwUFLYEuehYXFxYugC44CQkKGwo4GkoaDQ0NDXoaShoKGwoFBe8XFi6ALjgJCQobCjgaShoNDQ0NehpKGgobCgoKLYEuehYXAAAADACWAAEAAAAAAAEACAAAAAEAAAAAAAIAAwAIAAEAAAAAAAMACAAAAAEAAAAAAAQACAAAAAEAAAAAAAUAAQALAAEAAAAAAAYACAAAAAMAAQQJAAEAEAAMAAMAAQQJAAIABgAcAAMAAQQJAAMAEAAMAAMAAQQJAAQAEAAMAAMAAQQJAAUAAgAiAAMAAQQJAAYAEAAMYW5jaG9yanM0MDBAAGEAbgBjAGgAbwByAGoAcwA0ADAAMABAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAH//wAP) format("truetype"); }',e.sheet.cssRules.length)}}(),t=document.querySelectorAll("[id]"),i=[].map.call(t,function(A){return A.id}),o=0;o\]\.\/\(\)\*\\\n\t\b\v]/g,"-").replace(/-{2,}/g,"-").substring(0,this.options.truncate).replace(/^-+|-+$/gm,"").toLowerCase()},this.hasAnchorJSLink=function(A){var e=A.firstChild&&-1<(" "+A.firstChild.className+" ").indexOf(" anchorjs-link "),t=A.lastChild&&-1<(" "+A.lastChild.className+" ").indexOf(" anchorjs-link ");return e||t||!1}}}); +// @license-end \ No newline at end of file diff --git a/public/js/bootstrap.min.js b/public/js/bootstrap.min.js new file mode 100644 index 0000000..eb0a8b4 --- /dev/null +++ b/public/js/bootstrap.min.js @@ -0,0 +1,6 @@ +/*! + * Bootstrap v3.4.1 (https://getbootstrap.com/) + * Copyright 2011-2019 Twitter, Inc. + * Licensed under the MIT license + */ +if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");!function(t){"use strict";var e=jQuery.fn.jquery.split(" ")[0].split(".");if(e[0]<2&&e[1]<9||1==e[0]&&9==e[1]&&e[2]<1||3this.$items.length-1||t<0))return this.sliding?this.$element.one("slid.bs.carousel",function(){e.to(t)}):i==t?this.pause().cycle():this.slide(idocument.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&t?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!t?this.scrollbarWidth:""})},s.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},s.prototype.checkScrollbar=function(){var t=window.innerWidth;if(!t){var e=document.documentElement.getBoundingClientRect();t=e.right-Math.abs(e.left)}this.bodyIsOverflowing=document.body.clientWidth
    ',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0},sanitize:!0,sanitizeFn:null,whiteList:t},m.prototype.init=function(t,e,i){if(this.enabled=!0,this.type=t,this.$element=g(e),this.options=this.getOptions(i),this.$viewport=this.options.viewport&&g(document).find(g.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var o=this.options.trigger.split(" "),n=o.length;n--;){var s=o[n];if("click"==s)this.$element.on("click."+this.type,this.options.selector,g.proxy(this.toggle,this));else if("manual"!=s){var a="hover"==s?"mouseenter":"focusin",r="hover"==s?"mouseleave":"focusout";this.$element.on(a+"."+this.type,this.options.selector,g.proxy(this.enter,this)),this.$element.on(r+"."+this.type,this.options.selector,g.proxy(this.leave,this))}}this.options.selector?this._options=g.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},m.prototype.getDefaults=function(){return m.DEFAULTS},m.prototype.getOptions=function(t){var e=this.$element.data();for(var i in e)e.hasOwnProperty(i)&&-1!==g.inArray(i,o)&&delete e[i];return(t=g.extend({},this.getDefaults(),e,t)).delay&&"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),t.sanitize&&(t.template=n(t.template,t.whiteList,t.sanitizeFn)),t},m.prototype.getDelegateOptions=function(){var i={},o=this.getDefaults();return this._options&&g.each(this._options,function(t,e){o[t]!=e&&(i[t]=e)}),i},m.prototype.enter=function(t){var e=t instanceof this.constructor?t:g(t.currentTarget).data("bs."+this.type);if(e||(e=new this.constructor(t.currentTarget,this.getDelegateOptions()),g(t.currentTarget).data("bs."+this.type,e)),t instanceof g.Event&&(e.inState["focusin"==t.type?"focus":"hover"]=!0),e.tip().hasClass("in")||"in"==e.hoverState)e.hoverState="in";else{if(clearTimeout(e.timeout),e.hoverState="in",!e.options.delay||!e.options.delay.show)return e.show();e.timeout=setTimeout(function(){"in"==e.hoverState&&e.show()},e.options.delay.show)}},m.prototype.isInStateTrue=function(){for(var t in this.inState)if(this.inState[t])return!0;return!1},m.prototype.leave=function(t){var e=t instanceof this.constructor?t:g(t.currentTarget).data("bs."+this.type);if(e||(e=new this.constructor(t.currentTarget,this.getDelegateOptions()),g(t.currentTarget).data("bs."+this.type,e)),t instanceof g.Event&&(e.inState["focusout"==t.type?"focus":"hover"]=!1),!e.isInStateTrue()){if(clearTimeout(e.timeout),e.hoverState="out",!e.options.delay||!e.options.delay.hide)return e.hide();e.timeout=setTimeout(function(){"out"==e.hoverState&&e.hide()},e.options.delay.hide)}},m.prototype.show=function(){var t=g.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(t);var e=g.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(t.isDefaultPrevented()||!e)return;var i=this,o=this.tip(),n=this.getUID(this.type);this.setContent(),o.attr("id",n),this.$element.attr("aria-describedby",n),this.options.animation&&o.addClass("fade");var s="function"==typeof this.options.placement?this.options.placement.call(this,o[0],this.$element[0]):this.options.placement,a=/\s?auto?\s?/i,r=a.test(s);r&&(s=s.replace(a,"")||"top"),o.detach().css({top:0,left:0,display:"block"}).addClass(s).data("bs."+this.type,this),this.options.container?o.appendTo(g(document).find(this.options.container)):o.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var l=this.getPosition(),h=o[0].offsetWidth,d=o[0].offsetHeight;if(r){var p=s,c=this.getPosition(this.$viewport);s="bottom"==s&&l.bottom+d>c.bottom?"top":"top"==s&&l.top-dc.width?"left":"left"==s&&l.left-ha.top+a.height&&(n.top=a.top+a.height-l)}else{var h=e.left-s,d=e.left+s+i;ha.right&&(n.left=a.left+a.width-d)}return n},m.prototype.getTitle=function(){var t=this.$element,e=this.options;return t.attr("data-original-title")||("function"==typeof e.title?e.title.call(t[0]):e.title)},m.prototype.getUID=function(t){for(;t+=~~(1e6*Math.random()),document.getElementById(t););return t},m.prototype.tip=function(){if(!this.$tip&&(this.$tip=g(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},m.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},m.prototype.enable=function(){this.enabled=!0},m.prototype.disable=function(){this.enabled=!1},m.prototype.toggleEnabled=function(){this.enabled=!this.enabled},m.prototype.toggle=function(t){var e=this;t&&((e=g(t.currentTarget).data("bs."+this.type))||(e=new this.constructor(t.currentTarget,this.getDelegateOptions()),g(t.currentTarget).data("bs."+this.type,e))),t?(e.inState.click=!e.inState.click,e.isInStateTrue()?e.enter(e):e.leave(e)):e.tip().hasClass("in")?e.leave(e):e.enter(e)},m.prototype.destroy=function(){var t=this;clearTimeout(this.timeout),this.hide(function(){t.$element.off("."+t.type).removeData("bs."+t.type),t.$tip&&t.$tip.detach(),t.$tip=null,t.$arrow=null,t.$viewport=null,t.$element=null})},m.prototype.sanitizeHtml=function(t){return n(t,this.options.whiteList,this.options.sanitizeFn)};var e=g.fn.tooltip;g.fn.tooltip=function i(o){return this.each(function(){var t=g(this),e=t.data("bs.tooltip"),i="object"==typeof o&&o;!e&&/destroy|hide/.test(o)||(e||t.data("bs.tooltip",e=new m(this,i)),"string"==typeof o&&e[o]())})},g.fn.tooltip.Constructor=m,g.fn.tooltip.noConflict=function(){return g.fn.tooltip=e,this}}(jQuery),function(n){"use strict";var s=function(t,e){this.init("popover",t,e)};if(!n.fn.tooltip)throw new Error("Popover requires tooltip.js");s.VERSION="3.4.1",s.DEFAULTS=n.extend({},n.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:''}),((s.prototype=n.extend({},n.fn.tooltip.Constructor.prototype)).constructor=s).prototype.getDefaults=function(){return s.DEFAULTS},s.prototype.setContent=function(){var t=this.tip(),e=this.getTitle(),i=this.getContent();if(this.options.html){var o=typeof i;this.options.sanitize&&(e=this.sanitizeHtml(e),"string"===o&&(i=this.sanitizeHtml(i))),t.find(".popover-title").html(e),t.find(".popover-content").children().detach().end()["string"===o?"html":"append"](i)}else t.find(".popover-title").text(e),t.find(".popover-content").children().detach().end().text(i);t.removeClass("fade top bottom left right in"),t.find(".popover-title").html()||t.find(".popover-title").hide()},s.prototype.hasContent=function(){return this.getTitle()||this.getContent()},s.prototype.getContent=function(){var t=this.$element,e=this.options;return t.attr("data-content")||("function"==typeof e.content?e.content.call(t[0]):e.content)},s.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var t=n.fn.popover;n.fn.popover=function e(o){return this.each(function(){var t=n(this),e=t.data("bs.popover"),i="object"==typeof o&&o;!e&&/destroy|hide/.test(o)||(e||t.data("bs.popover",e=new s(this,i)),"string"==typeof o&&e[o]())})},n.fn.popover.Constructor=s,n.fn.popover.noConflict=function(){return n.fn.popover=t,this}}(jQuery),function(s){"use strict";function n(t,e){this.$body=s(document.body),this.$scrollElement=s(t).is(document.body)?s(window):s(t),this.options=s.extend({},n.DEFAULTS,e),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",s.proxy(this.process,this)),this.refresh(),this.process()}function e(o){return this.each(function(){var t=s(this),e=t.data("bs.scrollspy"),i="object"==typeof o&&o;e||t.data("bs.scrollspy",e=new n(this,i)),"string"==typeof o&&e[o]()})}n.VERSION="3.4.1",n.DEFAULTS={offset:10},n.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},n.prototype.refresh=function(){var t=this,o="offset",n=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),s.isWindow(this.$scrollElement[0])||(o="position",n=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var t=s(this),e=t.data("target")||t.attr("href"),i=/^#./.test(e)&&s(e);return i&&i.length&&i.is(":visible")&&[[i[o]().top+n,e]]||null}).sort(function(t,e){return t[0]-e[0]}).each(function(){t.offsets.push(this[0]),t.targets.push(this[1])})},n.prototype.process=function(){var t,e=this.$scrollElement.scrollTop()+this.options.offset,i=this.getScrollHeight(),o=this.options.offset+i-this.$scrollElement.height(),n=this.offsets,s=this.targets,a=this.activeTarget;if(this.scrollHeight!=i&&this.refresh(),o<=e)return a!=(t=s[s.length-1])&&this.activate(t);if(a&&e=n[t]&&(n[t+1]===undefined||e .active"),n=i&&r.support.transition&&(o.length&&o.hasClass("fade")||!!e.find("> .fade").length);function s(){o.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),t.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),n?(t[0].offsetWidth,t.addClass("in")):t.removeClass("fade"),t.parent(".dropdown-menu").length&&t.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),i&&i()}o.length&&n?o.one("bsTransitionEnd",s).emulateTransitionEnd(a.TRANSITION_DURATION):s(),o.removeClass("in")};var t=r.fn.tab;r.fn.tab=e,r.fn.tab.Constructor=a,r.fn.tab.noConflict=function(){return r.fn.tab=t,this};var i=function(t){t.preventDefault(),e.call(r(this),"show")};r(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',i).on("click.bs.tab.data-api",'[data-toggle="pill"]',i)}(jQuery),function(l){"use strict";var h=function(t,e){this.options=l.extend({},h.DEFAULTS,e);var i=this.options.target===h.DEFAULTS.target?l(this.options.target):l(document).find(this.options.target);this.$target=i.on("scroll.bs.affix.data-api",l.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",l.proxy(this.checkPositionWithEventLoop,this)),this.$element=l(t),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};function i(o){return this.each(function(){var t=l(this),e=t.data("bs.affix"),i="object"==typeof o&&o;e||t.data("bs.affix",e=new h(this,i)),"string"==typeof o&&e[o]()})}h.VERSION="3.4.1",h.RESET="affix affix-top affix-bottom",h.DEFAULTS={offset:0,target:window},h.prototype.getState=function(t,e,i,o){var n=this.$target.scrollTop(),s=this.$element.offset(),a=this.$target.height();if(null!=i&&"top"==this.affixed)return n 800) { + $( "#mysidebar" ).attr("class", "nav affix"); + } + // activate tooltips. although this is a bootstrap js function, it must be activated this way in your theme. + $('[data-toggle="tooltip"]').tooltip({ + placement : 'top' + }); + + /** + * AnchorJS + */ + anchors.add('h2,h3,h4,h5'); + +}); + +// needed for nav tabs on pages. See Formatting > Nav tabs for more details. +// script from http://stackoverflow.com/questions/10523433/how-do-i-keep-the-current-tab-active-with-twitter-bootstrap-after-a-page-reload +$(function() { + var json, tabsState; + $('a[data-toggle="pill"], a[data-toggle="tab"]').on('shown.bs.tab', function(e) { + var href, json, parentId, tabsState; + + tabsState = localStorage.getItem("tabs-state"); + json = JSON.parse(tabsState || "{}"); + parentId = $(e.target).parents("ul.nav.nav-pills, ul.nav.nav-tabs").attr("id"); + href = $(e.target).attr('href'); + json[parentId] = href; + + return localStorage.setItem("tabs-state", JSON.stringify(json)); + }); + + tabsState = localStorage.getItem("tabs-state"); + json = JSON.parse(tabsState || "{}"); + + $.each(json, function(containerId, href) { + return $("#" + containerId + " a[href=" + href + "]").tab('show'); + }); + + $("ul.nav.nav-pills, ul.nav.nav-tabs").each(function() { + var $this = $(this); + if (!json[$this.attr("id")]) { + return $this.find("a[data-toggle=tab]:first, a[data-toggle=pill]:first").tab("show"); + } + }); +}); diff --git a/public/js/html5shiv.js b/public/js/html5shiv.js new file mode 100644 index 0000000..448cebd --- /dev/null +++ b/public/js/html5shiv.js @@ -0,0 +1,8 @@ +/* + HTML5 Shiv v3.7.0 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +(function(l,f){function m(){var a=e.elements;return"string"==typeof a?a.split(" "):a}function i(a){var b=n[a[o]];b||(b={},h++,a[o]=h,n[h]=b);return b}function p(a,b,c){b||(b=f);if(g)return b.createElement(a);c||(c=i(b));b=c.cache[a]?c.cache[a].cloneNode():r.test(a)?(c.cache[a]=c.createElem(a)).cloneNode():c.createElem(a);return b.canHaveChildren&&!s.test(a)?c.frag.appendChild(b):b}function t(a,b){if(!b.cache)b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag(); +a.createElement=function(c){return!e.shivMethods?b.createElem(c):p(c,a,b)};a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+m().join().replace(/[\w\-]+/g,function(a){b.createElem(a);b.frag.createElement(a);return'c("'+a+'")'})+");return n}")(e,b.frag)}function q(a){a||(a=f);var b=i(a);if(e.shivCSS&&!j&&!b.hasCSS){var c,d=a;c=d.createElement("p");d=d.getElementsByTagName("head")[0]||d.documentElement;c.innerHTML="x"; +c=d.insertBefore(c.lastChild,d.firstChild);b.hasCSS=!!c}g||t(a,b);return a}var k=l.html5||{},s=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,r=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,j,o="_html5shiv",h=0,n={},g;(function(){try{var a=f.createElement("a");a.innerHTML="";j="hidden"in a;var b;if(!(b=1==a.childNodes.length)){f.createElement("a");var c=f.createDocumentFragment();b="undefined"==typeof c.cloneNode|| +"undefined"==typeof c.createDocumentFragment||"undefined"==typeof c.createElement}g=b}catch(d){g=j=!0}})();var e={elements:k.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output progress section summary template time video",version:"3.7.0",shivCSS:!1!==k.shivCSS,supportsUnknownElements:g,shivMethods:!1!==k.shivMethods,type:"default",shivDocument:q,createElement:p,createDocumentFragment:function(a,b){a||(a=f); +if(g)return a.createDocumentFragment();for(var b=b||i(a),c=b.frag.cloneNode(),d=0,e=m(),h=e.length;d=0}var self=this;self.matches=function(string,crit){return"string"!=typeof string?!1:(string=string.trim(),doMatch(string,crit))}}module.exports=new LiteralSearchStrategy},{}],4:[function(require,module){module.exports=function(){function findMatches(store,crit,strategy){for(var data=store.get(),i=0;i{title}
  • ',noResultsText:"No results found",limit:10,fuzzy:!1};self.init=function(_opt){validateOptions(_opt),assignOptions(_opt),isJSON(opt.dataSource)?initWithJSON(opt.dataSource):initWithURL(opt.dataSource)}}var Searcher=require("./Searcher"),Templater=require("./Templater"),Store=require("./Store"),JSONLoader=require("./JSONLoader"),searcher=new Searcher,templater=new Templater,store=new Store,jsonLoader=new JSONLoader;window.SimpleJekyllSearch=new SimpleJekyllSearch}(window,document)},{"./JSONLoader":1,"./Searcher":4,"./Store":5,"./Templater":6}]},{},[7]); diff --git a/public/js/jquery.ba-throttle-debounce.min.js b/public/js/jquery.ba-throttle-debounce.min.js new file mode 100644 index 0000000..0720550 --- /dev/null +++ b/public/js/jquery.ba-throttle-debounce.min.js @@ -0,0 +1,9 @@ +/* + * jQuery throttle / debounce - v1.1 - 3/7/2010 + * http://benalman.com/projects/jquery-throttle-debounce-plugin/ + * + * Copyright (c) 2010 "Cowboy" Ben Alman + * Dual licensed under the MIT and GPL licenses. + * http://benalman.com/about/license/ + */ +(function(b,c){var $=b.jQuery||b.Cowboy||(b.Cowboy={}),a;$.throttle=a=function(e,f,j,i){var h,d=0;if(typeof f!=="boolean"){i=j;j=f;f=c}function g(){var o=this,m=+new Date()-d,n=arguments;function l(){d=+new Date();j.apply(o,n)}function k(){h=c}if(i&&!h){l()}h&&clearTimeout(h);if(i===c&&m>e){l()}else{if(f!==true){h=setTimeout(i?k:l,i===c?e-m:e)}}}if($.guid){g.guid=j.guid=j.guid||$.guid++}return g};$.debounce=function(d,e,f){return f===c?a(d,e,false):a(d,f,e!==false)}})(this); \ No newline at end of file diff --git a/public/js/jquery.cookie.min.js b/public/js/jquery.cookie.min.js new file mode 100644 index 0000000..c0f19d8 --- /dev/null +++ b/public/js/jquery.cookie.min.js @@ -0,0 +1,2 @@ +/*! jquery.cookie v1.4.1 | MIT */ +!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):"object"==typeof exports?a(require("jquery")):a(jQuery)}(function(a){function b(a){return h.raw?a:encodeURIComponent(a)}function c(a){return h.raw?a:decodeURIComponent(a)}function d(a){return b(h.json?JSON.stringify(a):String(a))}function e(a){0===a.indexOf('"')&&(a=a.slice(1,-1).replace(/\\"/g,'"').replace(/\\\\/g,"\\"));try{return a=decodeURIComponent(a.replace(g," ")),h.json?JSON.parse(a):a}catch(b){}}function f(b,c){var d=h.raw?b:e(b);return a.isFunction(c)?c(d):d}var g=/\+/g,h=a.cookie=function(e,g,i){if(void 0!==g&&!a.isFunction(g)){if(i=a.extend({},h.defaults,i),"number"==typeof i.expires){var j=i.expires,k=i.expires=new Date;k.setTime(+k+864e5*j)}return document.cookie=[b(e),"=",d(g),i.expires?"; expires="+i.expires.toUTCString():"",i.path?"; path="+i.path:"",i.domain?"; domain="+i.domain:"",i.secure?"; secure":""].join("")}for(var l=e?void 0:{},m=document.cookie?document.cookie.split("; "):[],n=0,o=m.length;o>n;n++){var p=m[n].split("="),q=c(p.shift()),r=p.join("=");if(e&&e===q){l=f(r,g);break}e||void 0===(r=f(r))||(l[q]=r)}return l};h.defaults={},a.removeCookie=function(b,c){return void 0===a.cookie(b)?!1:(a.cookie(b,"",a.extend({},c,{expires:-1})),!a.cookie(b))}}); \ No newline at end of file diff --git a/public/js/jquery.min.js b/public/js/jquery.min.js new file mode 100644 index 0000000..a1c07fd --- /dev/null +++ b/public/js/jquery.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.4.1 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(m.childNodes),m.childNodes),t[m.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&((e?e.ownerDocument||e:m)!==C&&T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[k]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=k,!C.getElementsByName||!C.getElementsByName(k).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",$)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e===C||e.ownerDocument===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===C?-1:t===C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){A(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Vt.childNodes.length),k.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,k.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===k.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.fn[t]=function(e){return _(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return _(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){k.fn[n]=function(e,t){return 0").prepend(b.options.caretHtml),d=b.$el.find("li > a");b._trigger(c,!1),b._trigger(d,!0),b.$el.find("li:has(ul) > a").prepend(c)},_trigger:function(b,c){var d=this;b.on("click",function(b){b.stopPropagation();var e=c?a(this).next():a(this).parent().next(),f=!1;if(c){var g=a(this).attr("href");f=void 0===g||""===g||"#"===g}if(e=e.length>0?e:!1,d.options.onClickBefore.call(this,b,e),!c||e&&f)b.preventDefault(),d._toggle(e,e.is(":hidden")),d._save();else if(d.options.accordion){var h=d.state=d._parents(a(this));d.$el.find("ul").filter(":visible").each(function(){var b=a(this),c=b.attr("data-index");h.hasOwnProperty(c)||d._toggle(b,!1)}),d._save()}d.options.onClickAfter.call(this,b,e)})},_toggle:function(b,c){var d=this,e=b.attr("data-index"),f=b.parent();if(d.options.onToggleBefore.call(this,b,c),c){if(f.addClass(d.options.openClass),b.slideDown(d.options.slide),d.state[e]=1,d.options.accordion){var g=d.state=d._parents(b);g[e]=d.state[e]=1,d.$el.find("ul").filter(":visible").each(function(){var b=a(this),c=b.attr("data-index");g.hasOwnProperty(c)||d._toggle(b,!1)})}}else f.removeClass(d.options.openClass),b.slideUp(d.options.slide),d.state[e]=0;d.options.onToggleAfter.call(this,b,c)},_parents:function(b,c){var d={},e=b.parent(),f=e.parents("ul");return f.each(function(){var b=a(this),e=b.attr("data-index");return e?void(d[e]=c?b:1):!1}),d},_save:function(){if(this.options.save){var b={};for(var d in this.state)1===this.state[d]&&(b[d]=1);c[this.uuid]=this.state=b,a.cookie(this.options.cookie.name,JSON.stringify(c),this.options.cookie)}},_load:function(){if(this.options.save){if(null===c){var b=a.cookie(this.options.cookie.name);c=b?JSON.parse(b):{}}this.state=c.hasOwnProperty(this.uuid)?c[this.uuid]:{}}},toggle:function(b){var c=this,d=arguments.length;if(1>=d)c.$el.find("ul").each(function(){var d=a(this);c._toggle(d,b)});else{var e,f={},g=Array.prototype.slice.call(arguments,1);d--;for(var h=0;d>h;h++){e=g[h];var i=c.$el.find('ul[data-index="'+e+'"]').first();if(i&&(f[e]=i,b)){var j=c._parents(i,!0);for(var k in j)f.hasOwnProperty(k)||(f[k]=j[k])}}for(e in f)c._toggle(f[e],b)}c._save()},destroy:function(){a.removeData(this.$el),this.$el.find("li:has(ul) > a").unbind("click"),this.$el.find("li:has(ul) > a > span").unbind("click")}},a.fn.navgoco=function(c){if("string"==typeof c&&"_"!==c.charAt(0)&&"init"!==c)var d=!0,e=Array.prototype.slice.call(arguments,1);else c=a.extend({},a.fn.navgoco.defaults,c||{}),a.cookie||(c.save=!1);return this.each(function(f){var g=a(this),h=g.data("navgoco");h||(h=new b(this,d?a.fn.navgoco.defaults:c,f),g.data("navgoco",h)),d&&h[c].apply(h,e)})};var c=null;a.fn.navgoco.defaults={caretHtml:"",accordion:!1,openClass:"open",save:!0,cookie:{name:"navgoco",expires:!1,path:"/"},slide:{duration:400,easing:"swing"},onClickBefore:a.noop,onClickAfter:a.noop,onToggleBefore:a.noop,onToggleAfter:a.noop}}(jQuery); \ No newline at end of file diff --git a/public/js/jquery.shuffle.min.js b/public/js/jquery.shuffle.min.js new file mode 100644 index 0000000..d103127 --- /dev/null +++ b/public/js/jquery.shuffle.min.js @@ -0,0 +1,1588 @@ +/*! + * Shuffle.js by @Vestride + * Categorize, sort, and filter a responsive grid of items. + * Dependencies: jQuery 1.9+, Modernizr 2.6.2+ + * @license MIT license + * @version 3.0.0 + */ + +/* Modernizr 2.6.2 (Custom Build) | MIT & BSD + * Build: http://modernizr.com/download/#-csstransforms-csstransforms3d-csstransitions-cssclasses-prefixed-teststyles-testprop-testallprops-prefixes-domprefixes + */ +window.Modernizr=function(a,b,c){function z(a){j.cssText=a}function A(a,b){return z(m.join(a+";")+(b||""))}function B(a,b){return typeof a===b}function C(a,b){return!!~(""+a).indexOf(b)}function D(a,b){for(var d in a){var e=a[d];if(!C(e,"-")&&j[e]!==c)return b=="pfx"?e:!0}return!1}function E(a,b,d){for(var e in a){var f=b[a[e]];if(f!==c)return d===!1?a[e]:B(f,"function")?f.bind(d||b):f}return!1}function F(a,b,c){var d=a.charAt(0).toUpperCase()+a.slice(1),e=(a+" "+o.join(d+" ")+d).split(" ");return B(b,"string")||B(b,"undefined")?D(e,b):(e=(a+" "+p.join(d+" ")+d).split(" "),E(e,b,c))}var d="2.6.2",e={},f=!0,g=b.documentElement,h="modernizr",i=b.createElement(h),j=i.style,k,l={}.toString,m=" -webkit- -moz- -o- -ms- ".split(" "),n="Webkit Moz O ms",o=n.split(" "),p=n.toLowerCase().split(" "),q={},r={},s={},t=[],u=t.slice,v,w=function(a,c,d,e){var f,i,j,k,l=b.createElement("div"),m=b.body,n=m||b.createElement("body");if(parseInt(d,10))while(d--)j=b.createElement("div"),j.id=e?e[d]:h+(d+1),l.appendChild(j);return f=["­",'"].join(""),l.id=h,(m?l:n).innerHTML+=f,n.appendChild(l),m||(n.style.background="",n.style.overflow="hidden",k=g.style.overflow,g.style.overflow="hidden",g.appendChild(n)),i=c(l,a),m?l.parentNode.removeChild(l):(n.parentNode.removeChild(n),g.style.overflow=k),!!i},x={}.hasOwnProperty,y;!B(x,"undefined")&&!B(x.call,"undefined")?y=function(a,b){return x.call(a,b)}:y=function(a,b){return b in a&&B(a.constructor.prototype[b],"undefined")},Function.prototype.bind||(Function.prototype.bind=function(b){var c=this;if(typeof c!="function")throw new TypeError;var d=u.call(arguments,1),e=function(){if(this instanceof e){var a=function(){};a.prototype=c.prototype;var f=new a,g=c.apply(f,d.concat(u.call(arguments)));return Object(g)===g?g:f}return c.apply(b,d.concat(u.call(arguments)))};return e}),q.csstransforms=function(){return!!F("transform")},q.csstransforms3d=function(){var a=!!F("perspective");return a&&"webkitPerspective"in g.style&&w("@media (transform-3d),(-webkit-transform-3d){#modernizr{left:9px;position:absolute;height:3px;}}",function(b,c){a=b.offsetLeft===9&&b.offsetHeight===3}),a},q.csstransitions=function(){return F("transition")};for(var G in q)y(q,G)&&(v=G.toLowerCase(),e[v]=q[G](),t.push((e[v]?"":"no-")+v));return e.addTest=function(a,b){if(typeof a=="object")for(var d in a)y(a,d)&&e.addTest(d,a[d]);else{a=a.toLowerCase();if(e[a]!==c)return e;b=typeof b=="function"?b():b,typeof f!="undefined"&&f&&(g.className+=" "+(b?"":"no-")+a),e[a]=b}return e},z(""),i=k=null,e._version=d,e._prefixes=m,e._domPrefixes=p,e._cssomPrefixes=o,e.testProp=function(a){return D([a])},e.testAllProps=F,e.testStyles=w,e.prefixed=function(a,b,c){return b?F(a,b,c):F(a,"pfx")},g.className=g.className.replace(/(^|\s)no-js(\s|$)/,"$1$2")+(f?" js "+t.join(" "):""),e}(this,this.document); + +(function (factory) { + if (typeof define === 'function' && define.amd) { + define(['jquery', 'modernizr'], factory); + } else { + window.Shuffle = factory(window.jQuery, window.Modernizr); + } +})(function($, Modernizr, undefined) { + +'use strict'; + + +// Validate Modernizr exists. +// Shuffle requires `csstransitions`, `csstransforms`, `csstransforms3d`, +// and `prefixed` to exist on the Modernizr object. +if (typeof Modernizr !== 'object') { + throw new Error('Shuffle.js requires Modernizr.\n' + + 'http://vestride.github.io/Shuffle/#dependencies'); +} + + +/** + * Returns css prefixed properties like `-webkit-transition` or `box-sizing` + * from `transition` or `boxSizing`, respectively. + * @param {(string|boolean)} prop Property to be prefixed. + * @return {string} The prefixed css property. + */ +function dashify( prop ) { + if (!prop) { + return ''; + } + + // Replace upper case with dash-lowercase, + // then fix ms- prefixes because they're not capitalized. + return prop.replace(/([A-Z])/g, function( str, m1 ) { + return '-' + m1.toLowerCase(); + }).replace(/^ms-/,'-ms-'); +} + +// Constant, prefixed variables. +var TRANSITION = Modernizr.prefixed('transition'); +var TRANSITION_DELAY = Modernizr.prefixed('transitionDelay'); +var TRANSITION_DURATION = Modernizr.prefixed('transitionDuration'); + +// Note(glen): Stock Android 4.1.x browser will fail here because it wrongly +// says it supports non-prefixed transitions. +// https://github.com/Modernizr/Modernizr/issues/897 +var TRANSITIONEND = { + 'WebkitTransition' : 'webkitTransitionEnd', + 'transition' : 'transitionend' +}[ TRANSITION ]; + +var TRANSFORM = Modernizr.prefixed('transform'); +var CSS_TRANSFORM = dashify(TRANSFORM); + +// Constants +var CAN_TRANSITION_TRANSFORMS = Modernizr.csstransforms && Modernizr.csstransitions; +var HAS_TRANSFORMS_3D = Modernizr.csstransforms3d; +var SHUFFLE = 'shuffle'; +var COLUMN_THRESHOLD = 0.3; + +// Configurable. You can change these constants to fit your application. +// The default scale and concealed scale, however, have to be different values. +var ALL_ITEMS = 'all'; +var FILTER_ATTRIBUTE_KEY = 'groups'; +var DEFAULT_SCALE = 1; +var CONCEALED_SCALE = 0.001; + + +// Underscore's throttle function. +function throttle(func, wait, options) { + var context, args, result; + var timeout = null; + var previous = 0; + options = options || {}; + var later = function() { + previous = options.leading === false ? 0 : $.now(); + timeout = null; + result = func.apply(context, args); + context = args = null; + }; + return function() { + var now = $.now(); + if (!previous && options.leading === false) { + previous = now; + } + var remaining = wait - (now - previous); + context = this; + args = arguments; + if (remaining <= 0 || remaining > wait) { + clearTimeout(timeout); + timeout = null; + previous = now; + result = func.apply(context, args); + context = args = null; + } else if (!timeout && options.trailing !== false) { + timeout = setTimeout(later, remaining); + } + return result; + }; +} + +function each(obj, iterator, context) { + for (var i = 0, length = obj.length; i < length; i++) { + if (iterator.call(context, obj[i], i, obj) === {}) { + return; + } + } +} + +function defer(fn, context, wait) { + return setTimeout( $.proxy( fn, context ), wait ); +} + +function arrayMax( array ) { + return Math.max.apply( Math, array ); +} + +function arrayMin( array ) { + return Math.min.apply( Math, array ); +} + + +/** + * Always returns a numeric value, given a value. + * @param {*} value Possibly numeric value. + * @return {number} `value` or zero if `value` isn't numeric. + * @private + */ +function getNumber(value) { + return $.isNumeric(value) ? value : 0; +} + + +/** + * Represents a coordinate pair. + * @param {number} [x=0] X. + * @param {number} [y=0] Y. + */ +var Point = function(x, y) { + this.x = getNumber( x ); + this.y = getNumber( y ); +}; + + +/** + * Whether two points are equal. + * @param {Point} a Point A. + * @param {Point} b Point B. + * @return {boolean} + */ +Point.equals = function(a, b) { + return a.x === b.x && a.y === b.y; +}; + + +// Used for unique instance variables +var id = 0; +var $window = $( window ); + + +/** + * Categorize, sort, and filter a responsive grid of items. + * + * @param {Element} element An element which is the parent container for the grid items. + * @param {Object} [options=Shuffle.options] Options object. + * @constructor + */ +var Shuffle = function( element, options ) { + options = options || {}; + $.extend( this, Shuffle.options, options, Shuffle.settings ); + + this.$el = $(element); + this.element = element; + this.unique = 'shuffle_' + id++; + + this._fire( Shuffle.EventType.LOADING ); + this._init(); + + // Dispatch the done event asynchronously so that people can bind to it after + // Shuffle has been initialized. + defer(function() { + this.initialized = true; + this._fire( Shuffle.EventType.DONE ); + }, this, 16); +}; + + +/** + * Events the container element emits with the .shuffle namespace. + * For example, "done.shuffle". + * @enum {string} + */ +Shuffle.EventType = { + LOADING: 'loading', + DONE: 'done', + LAYOUT: 'layout', + REMOVED: 'removed' +}; + + +/** @enum {string} */ +Shuffle.ClassName = { + BASE: SHUFFLE, + SHUFFLE_ITEM: 'shuffle-item', + FILTERED: 'filtered', + CONCEALED: 'concealed' +}; + + +// Overrideable options +Shuffle.options = { + group: ALL_ITEMS, // Initial filter group. + speed: 250, // Transition/animation speed (milliseconds). + easing: 'ease-out', // CSS easing function to use. + itemSelector: '', // e.g. '.picture-item'. + sizer: null, // Sizer element. Use an element to determine the size of columns and gutters. + gutterWidth: 0, // A static number or function that tells the plugin how wide the gutters between columns are (in pixels). + columnWidth: 0, // A static number or function that returns a number which tells the plugin how wide the columns are (in pixels). + delimeter: null, // If your group is not json, and is comma delimeted, you could set delimeter to ','. + buffer: 0, // Useful for percentage based heights when they might not always be exactly the same (in pixels). + initialSort: null, // Shuffle can be initialized with a sort object. It is the same object given to the sort method. + throttle: throttle, // By default, shuffle will throttle resize events. This can be changed or removed. + throttleTime: 300, // How often shuffle can be called on resize (in milliseconds). + sequentialFadeDelay: 150, // Delay between each item that fades in when adding items. + supported: CAN_TRANSITION_TRANSFORMS // Whether to use transforms or absolute positioning. +}; + + +// Not overrideable +Shuffle.settings = { + useSizer: false, + itemCss : { // default CSS for each item + position: 'absolute', + top: 0, + left: 0, + visibility: 'visible' + }, + revealAppendedDelay: 300, + lastSort: {}, + lastFilter: ALL_ITEMS, + enabled: true, + destroyed: false, + initialized: false, + _animations: [], + styleQueue: [] +}; + + +// Expose for testing. +Shuffle.Point = Point; + + +/** + * Static methods. + */ + +/** + * If the browser has 3d transforms available, build a string with those, + * otherwise use 2d transforms. + * @param {Point} point X and Y positions. + * @param {number} scale Scale amount. + * @return {string} A normalized string which can be used with the transform style. + * @private + */ +Shuffle._getItemTransformString = function(point, scale) { + if ( HAS_TRANSFORMS_3D ) { + return 'translate3d(' + point.x + 'px, ' + point.y + 'px, 0) scale3d(' + scale + ', ' + scale + ', 1)'; + } else { + return 'translate(' + point.x + 'px, ' + point.y + 'px) scale(' + scale + ')'; + } +}; + + +/** + * Retrieve the computed style for an element, parsed as a float. This should + * not be used for width or height values because jQuery mangles them and they + * are not precise enough. + * @param {Element} element Element to get style for. + * @param {string} style Style property. + * @return {number} The parsed computed value or zero if that fails because IE + * will return 'auto' when the element doesn't have margins instead of + * the computed style. + * @private + */ +Shuffle._getNumberStyle = function( element, style ) { + return Shuffle._getFloat( $( element ).css( style ) ); +}; + + +/** + * Parse a string as an integer. + * @param {string} value String integer. + * @return {number} The string as an integer or zero. + * @private + */ +Shuffle._getInt = function(value) { + return getNumber( parseInt( value, 10 ) ); +}; + +/** + * Parse a string as an float. + * @param {string} value String float. + * @return {number} The string as an float or zero. + * @private + */ +Shuffle._getFloat = function(value) { + return getNumber( parseFloat( value ) ); +}; + + +/** + * Returns the outer width of an element, optionally including its margins. + * The `offsetWidth` property must be used because having a scale transform + * on the element affects the bounding box. Sadly, Firefox doesn't return an + * integer value for offsetWidth (yet). + * @param {Element} element The element. + * @param {boolean} [includeMargins] Whether to include margins. Default is false. + * @return {number} The width. + */ +Shuffle._getOuterWidth = function( element, includeMargins ) { + var width = element.offsetWidth; + + // Use jQuery here because it uses getComputedStyle internally and is + // cross-browser. Using the style property of the element will only work + // if there are inline styles. + if ( includeMargins ) { + var marginLeft = Shuffle._getNumberStyle( element, 'marginLeft'); + var marginRight = Shuffle._getNumberStyle( element, 'marginRight'); + width += marginLeft + marginRight; + } + + return width; +}; + + +/** + * Returns the outer height of an element, optionally including its margins. + * @param {Element} element The element. + * @param {boolean} [includeMargins] Whether to include margins. Default is false. + * @return {number} The height. + */ +Shuffle._getOuterHeight = function( element, includeMargins ) { + var height = element.offsetHeight; + + if ( includeMargins ) { + var marginTop = Shuffle._getNumberStyle( element, 'marginTop'); + var marginBottom = Shuffle._getNumberStyle( element, 'marginBottom'); + height += marginTop + marginBottom; + } + + return height; +}; + + +/** + * Change a property or execute a function which will not have a transition + * @param {Element} element DOM element that won't be transitioned + * @param {Function} callback A function which will be called while transition + * is set to 0ms. + * @param {Object} [context] Optional context for the callback function. + * @private + */ +Shuffle._skipTransition = function( element, callback, context ) { + var duration = element.style[ TRANSITION_DURATION ]; + + // Set the duration to zero so it happens immediately + element.style[ TRANSITION_DURATION ] = '0ms'; // ms needed for firefox! + + callback.call( context ); + + // Force reflow + var reflow = element.offsetWidth; + // Avoid jshint warnings: unused variables and expressions. + reflow = null; + + // Put the duration back + element.style[ TRANSITION_DURATION ] = duration; +}; + + +/** + * Instance methods. + */ + +Shuffle.prototype._init = function() { + this.$items = this._getItems(); + + this.sizer = this._getElementOption( this.sizer ); + + if ( this.sizer ) { + this.useSizer = true; + } + + // Add class and invalidate styles + this.$el.addClass( Shuffle.ClassName.BASE ); + + // Set initial css for each item + this._initItems(); + + // Bind resize events + // http://stackoverflow.com/questions/1852751/window-resize-event-firing-in-internet-explorer + $window.on('resize.' + SHUFFLE + '.' + this.unique, this._getResizeFunction()); + + // Get container css all in one request. Causes reflow + var containerCSS = this.$el.css(['position', 'overflow']); + var containerWidth = Shuffle._getOuterWidth( this.element ); + + // Add styles to the container if it doesn't have them. + this._validateStyles( containerCSS ); + + // We already got the container's width above, no need to cause another reflow getting it again... + // Calculate the number of columns there will be + this._setColumns( containerWidth ); + + // Kick off! + this.shuffle( this.group, this.initialSort ); + + // The shuffle items haven't had transitions set on them yet + // so the user doesn't see the first layout. Set them now that the first layout is done. + if ( this.supported ) { + defer(function() { + this._setTransitions(); + this.element.style[ TRANSITION ] = 'height ' + this.speed + 'ms ' + this.easing; + }, this); + } +}; + + +/** + * Returns a throttled and proxied function for the resize handler. + * @return {Function} + * @private + */ +Shuffle.prototype._getResizeFunction = function() { + var resizeFunction = $.proxy( this._onResize, this ); + return this.throttle ? + this.throttle( resizeFunction, this.throttleTime ) : + resizeFunction; +}; + + +/** + * Retrieve an element from an option. + * @param {string|jQuery|Element} option The option to check. + * @return {?Element} The plain element or null. + * @private + */ +Shuffle.prototype._getElementOption = function( option ) { + // If column width is a string, treat is as a selector and search for the + // sizer element within the outermost container + if ( typeof option === 'string' ) { + return this.$el.find( option )[0] || null; + + // Check for an element + } else if ( option && option.nodeType && option.nodeType === 1 ) { + return option; + + // Check for jQuery object + } else if ( option && option.jquery ) { + return option[0]; + } + + return null; +}; + + +/** + * Ensures the shuffle container has the css styles it needs applied to it. + * @param {Object} styles Key value pairs for position and overflow. + * @private + */ +Shuffle.prototype._validateStyles = function(styles) { + // Position cannot be static. + if ( styles.position === 'static' ) { + this.element.style.position = 'relative'; + } + + // Overflow has to be hidden + if ( styles.overflow !== 'hidden' ) { + this.element.style.overflow = 'hidden'; + } +}; + + +/** + * Filter the elements by a category. + * @param {string} [category] Category to filter by. If it's given, the last + * category will be used to filter the items. + * @param {ArrayLike} [$collection] Optionally filter a collection. Defaults to + * all the items. + * @return {jQuery} Filtered items. + * @private + */ +Shuffle.prototype._filter = function( category, $collection ) { + category = category || this.lastFilter; + $collection = $collection || this.$items; + + var set = this._getFilteredSets( category, $collection ); + + // Individually add/remove concealed/filtered classes + this._toggleFilterClasses( set.filtered, set.concealed ); + + // Save the last filter in case elements are appended. + this.lastFilter = category; + + // This is saved mainly because providing a filter function (like searching) + // will overwrite the `lastFilter` property every time its called. + if ( typeof category === 'string' ) { + this.group = category; + } + + return set.filtered; +}; + + +/** + * Returns an object containing the filtered and concealed elements. + * @param {string|Function} category Category or function to filter by. + * @param {ArrayLike.} $items A collection of items to filter. + * @return {!{filtered: jQuery, concealed: jQuery}} + * @private + */ +Shuffle.prototype._getFilteredSets = function( category, $items ) { + var $filtered = $(); + var $concealed = $(); + + // category === 'all', add filtered class to everything + if ( category === ALL_ITEMS ) { + $filtered = $items; + + // Loop through each item and use provided function to determine + // whether to hide it or not. + } else { + each($items, function( el ) { + var $item = $(el); + if ( this._doesPassFilter( category, $item ) ) { + $filtered = $filtered.add( $item ); + } else { + $concealed = $concealed.add( $item ); + } + }, this); + } + + return { + filtered: $filtered, + concealed: $concealed + }; +}; + + +/** + * Test an item to see if it passes a category. + * @param {string|Function} category Category or function to filter by. + * @param {jQuery} $item A single item, wrapped with jQuery. + * @return {boolean} Whether it passes the category/filter. + * @private + */ +Shuffle.prototype._doesPassFilter = function( category, $item ) { + if ( $.isFunction( category ) ) { + return category.call( $item[0], $item, this ); + + // Check each element's data-groups attribute against the given category. + } else { + var groups = $item.data( FILTER_ATTRIBUTE_KEY ); + var keys = this.delimeter && !$.isArray( groups ) ? + groups.split( this.delimeter ) : + groups; + return $.inArray(category, keys) > -1; + } +}; + + +/** + * Toggles the filtered and concealed class names. + * @param {jQuery} $filtered Filtered set. + * @param {jQuery} $concealed Concealed set. + * @private + */ +Shuffle.prototype._toggleFilterClasses = function( $filtered, $concealed ) { + $filtered + .removeClass( Shuffle.ClassName.CONCEALED ) + .addClass( Shuffle.ClassName.FILTERED ); + $concealed + .removeClass( Shuffle.ClassName.FILTERED ) + .addClass( Shuffle.ClassName.CONCEALED ); +}; + + +/** + * Set the initial css for each item + * @param {jQuery} [$items] Optionally specifiy at set to initialize + */ +Shuffle.prototype._initItems = function( $items ) { + $items = $items || this.$items; + $items.addClass([ + Shuffle.ClassName.SHUFFLE_ITEM, + Shuffle.ClassName.FILTERED + ].join(' ')); + $items.css( this.itemCss ).data('point', new Point()).data('scale', DEFAULT_SCALE); +}; + + +/** + * Updates the filtered item count. + * @private + */ +Shuffle.prototype._updateItemCount = function() { + this.visibleItems = this._getFilteredItems().length; +}; + + +/** + * Sets css transform transition on a an element. + * @param {Element} element Element to set transition on. + * @private + */ +Shuffle.prototype._setTransition = function( element ) { + element.style[ TRANSITION ] = CSS_TRANSFORM + ' ' + this.speed + 'ms ' + + this.easing + ', opacity ' + this.speed + 'ms ' + this.easing; +}; + + +/** + * Sets css transform transition on a group of elements. + * @param {ArrayLike.} $items Elements to set transitions on. + * @private + */ +Shuffle.prototype._setTransitions = function( $items ) { + $items = $items || this.$items; + each($items, function( el ) { + this._setTransition( el ); + }, this); +}; + + +/** + * Sets a transition delay on a collection of elements, making each delay + * greater than the last. + * @param {ArrayLike.} $collection Array to iterate over. + */ +Shuffle.prototype._setSequentialDelay = function( $collection ) { + if ( !this.supported ) { + return; + } + + // $collection can be an array of dom elements or jquery object + each($collection, function( el, i ) { + // This works because the transition-property: transform, opacity; + el.style[ TRANSITION_DELAY ] = '0ms,' + ((i + 1) * this.sequentialFadeDelay) + 'ms'; + }, this); +}; + + +Shuffle.prototype._getItems = function() { + return this.$el.children( this.itemSelector ); +}; + + +Shuffle.prototype._getFilteredItems = function() { + return this.$items.filter('.' + Shuffle.ClassName.FILTERED); +}; + + +Shuffle.prototype._getConcealedItems = function() { + return this.$items.filter('.' + Shuffle.ClassName.CONCEALED); +}; + + +/** + * Returns the column size, based on column width and sizer options. + * @param {number} containerWidth Size of the parent container. + * @param {number} gutterSize Size of the gutters. + * @return {number} + * @private + */ +Shuffle.prototype._getColumnSize = function( containerWidth, gutterSize ) { + var size; + + // If the columnWidth property is a function, then the grid is fluid + if ( $.isFunction( this.columnWidth ) ) { + size = this.columnWidth(containerWidth); + + // columnWidth option isn't a function, are they using a sizing element? + } else if ( this.useSizer ) { + size = Shuffle._getOuterWidth(this.sizer); + + // if not, how about the explicitly set option? + } else if ( this.columnWidth ) { + size = this.columnWidth; + + // or use the size of the first item + } else if ( this.$items.length > 0 ) { + size = Shuffle._getOuterWidth(this.$items[0], true); + + // if there's no items, use size of container + } else { + size = containerWidth; + } + + // Don't let them set a column width of zero. + if ( size === 0 ) { + size = containerWidth; + } + + return size + gutterSize; +}; + + +/** + * Returns the gutter size, based on gutter width and sizer options. + * @param {number} containerWidth Size of the parent container. + * @return {number} + * @private + */ +Shuffle.prototype._getGutterSize = function( containerWidth ) { + var size; + if ( $.isFunction( this.gutterWidth ) ) { + size = this.gutterWidth(containerWidth); + } else if ( this.useSizer ) { + size = Shuffle._getNumberStyle(this.sizer, 'marginLeft'); + } else { + size = this.gutterWidth; + } + + return size; +}; + + +/** + * Calculate the number of columns to be used. Gets css if using sizer element. + * @param {number} [theContainerWidth] Optionally specify a container width if it's already available. + */ +Shuffle.prototype._setColumns = function( theContainerWidth ) { + var containerWidth = theContainerWidth || Shuffle._getOuterWidth( this.element ); + var gutter = this._getGutterSize( containerWidth ); + var columnWidth = this._getColumnSize( containerWidth, gutter ); + var calculatedColumns = (containerWidth + gutter) / columnWidth; + + // Widths given from getComputedStyle are not precise enough... + if ( Math.abs(Math.round(calculatedColumns) - calculatedColumns) < COLUMN_THRESHOLD ) { + // e.g. calculatedColumns = 11.998876 + calculatedColumns = Math.round( calculatedColumns ); + } + + this.cols = Math.max( Math.floor(calculatedColumns), 1 ); + this.containerWidth = containerWidth; + this.colWidth = columnWidth; +}; + +/** + * Adjust the height of the grid + */ +Shuffle.prototype._setContainerSize = function() { + this.$el.css( 'height', this._getContainerSize() ); +}; + + +/** + * Based on the column heights, it returns the biggest one. + * @return {number} + * @private + */ +Shuffle.prototype._getContainerSize = function() { + return arrayMax( this.positions ); +}; + + +/** + * Fire events with .shuffle namespace + */ +Shuffle.prototype._fire = function( name, args ) { + this.$el.trigger( name + '.' + SHUFFLE, args && args.length ? args : [ this ] ); +}; + + +/** + * Zeros out the y columns array, which is used to determine item placement. + * @private + */ +Shuffle.prototype._resetCols = function() { + var i = this.cols; + this.positions = []; + while (i--) { + this.positions.push( 0 ); + } +}; + + +/** + * Loops through each item that should be shown and calculates the x, y position. + * @param {Array.} items Array of items that will be shown/layed out in order in their array. + * Because jQuery collection are always ordered in DOM order, we can't pass a jq collection. + * @param {boolean} [isOnlyPosition=false] If true this will position the items with zero opacity. + */ +Shuffle.prototype._layout = function( items, isOnlyPosition ) { + each(items, function( item ) { + this._layoutItem( item, !!isOnlyPosition ); + }, this); + + // `_layout` always happens after `_shrink`, so it's safe to process the style + // queue here with styles from the shrink method. + this._processStyleQueue(); + + // Adjust the height of the container. + this._setContainerSize(); +}; + + +/** + * Calculates the position of the item and pushes it onto the style queue. + * @param {Element} item Element which is being positioned. + * @param {boolean} isOnlyPosition Whether to position the item, but with zero + * opacity so that it can fade in later. + * @private + */ +Shuffle.prototype._layoutItem = function( item, isOnlyPosition ) { + var $item = $(item); + var itemData = $item.data(); + var currPos = itemData.point; + var currScale = itemData.scale; + var itemSize = { + width: Shuffle._getOuterWidth( item, true ), + height: Shuffle._getOuterHeight( item, true ) + }; + var pos = this._getItemPosition( itemSize ); + + // If the item will not change its position, do not add it to the render + // queue. Transitions don't fire when setting a property to the same value. + if ( Point.equals(currPos, pos) && currScale === DEFAULT_SCALE ) { + return; + } + + // Save data for shrink + itemData.point = pos; + itemData.scale = DEFAULT_SCALE; + + this.styleQueue.push({ + $item: $item, + point: pos, + scale: DEFAULT_SCALE, + opacity: isOnlyPosition ? 0 : 1, + skipTransition: isOnlyPosition, + callfront: function() { + if ( !isOnlyPosition ) { + $item.css( 'visibility', 'visible' ); + } + }, + callback: function() { + if ( isOnlyPosition ) { + $item.css( 'visibility', 'hidden' ); + } + } + }); +}; + + +/** + * Determine the location of the next item, based on its size. + * @param {{width: number, height: number}} itemSize Object with width and height. + * @return {Point} + * @private + */ +Shuffle.prototype._getItemPosition = function( itemSize ) { + var columnSpan = this._getColumnSpan( itemSize.width, this.colWidth, this.cols ); + + var setY = this._getColumnSet( columnSpan, this.cols ); + + // Finds the index of the smallest number in the set. + var shortColumnIndex = this._getShortColumn( setY, this.buffer ); + + // Position the item + var point = new Point( + Math.round( this.colWidth * shortColumnIndex ), + Math.round( setY[shortColumnIndex] )); + + // Update the columns array with the new values for each column. + // e.g. before the update the columns could be [250, 0, 0, 0] for an item + // which spans 2 columns. After it would be [250, itemHeight, itemHeight, 0]. + var setHeight = setY[shortColumnIndex] + itemSize.height; + var setSpan = this.cols + 1 - setY.length; + for ( var i = 0; i < setSpan; i++ ) { + this.positions[ shortColumnIndex + i ] = setHeight; + } + + return point; +}; + + +/** + * Determine the number of columns an items spans. + * @param {number} itemWidth Width of the item. + * @param {number} columnWidth Width of the column (includes gutter). + * @param {number} columns Total number of columns + * @return {number} + * @private + */ +Shuffle.prototype._getColumnSpan = function( itemWidth, columnWidth, columns ) { + var columnSpan = itemWidth / columnWidth; + + // If the difference between the rounded column span number and the + // calculated column span number is really small, round the number to + // make it fit. + if ( Math.abs(Math.round( columnSpan ) - columnSpan ) < COLUMN_THRESHOLD ) { + // e.g. columnSpan = 4.0089945390298745 + columnSpan = Math.round( columnSpan ); + } + + // Ensure the column span is not more than the amount of columns in the whole layout. + return Math.min( Math.ceil( columnSpan ), columns ); +}; + + +/** + * Retrieves the column set to use for placement. + * @param {number} columnSpan The number of columns this current item spans. + * @param {number} columns The total columns in the grid. + * @return {Array.} An array of numbers represeting the column set. + * @private + */ +Shuffle.prototype._getColumnSet = function( columnSpan, columns ) { + // The item spans only one column. + if ( columnSpan === 1 ) { + return this.positions; + + // The item spans more than one column, figure out how many different + // places it could fit horizontally. + // The group count is the number of places within the positions this block + // could fit, ignoring the current positions of items. + // Imagine a 2 column brick as the second item in a 4 column grid with + // 10px height each. Find the places it would fit: + // [10, 0, 0, 0] + // | | | + // * * * + // + // Then take the places which fit and get the bigger of the two: + // max([10, 0]), max([0, 0]), max([0, 0]) = [10, 0, 0] + // + // Next, find the first smallest number (the short column). + // [10, 0, 0] + // | + // * + // + // And that's where it should be placed! + } else { + var groupCount = columns + 1 - columnSpan; + var groupY = []; + + // For how many possible positions for this item there are. + for ( var i = 0; i < groupCount; i++ ) { + // Find the bigger value for each place it could fit. + groupY[i] = arrayMax( this.positions.slice( i, i + columnSpan ) ); + } + + return groupY; + } +}; + + +/** + * Find index of short column, the first from the left where this item will go. + * + * @param {Array.} positions The array to search for the smallest number. + * @param {number} buffer Optional buffer which is very useful when the height + * is a percentage of the width. + * @return {number} Index of the short column. + * @private + */ +Shuffle.prototype._getShortColumn = function( positions, buffer ) { + var minPosition = arrayMin( positions ); + for (var i = 0, len = positions.length; i < len; i++) { + if ( positions[i] >= minPosition - buffer && positions[i] <= minPosition + buffer ) { + return i; + } + } + return 0; +}; + + +/** + * Hides the elements that don't match our filter. + * @param {jQuery} $collection jQuery collection to shrink. + * @private + */ +Shuffle.prototype._shrink = function( $collection ) { + var $concealed = $collection || this._getConcealedItems(); + + each($concealed, function( item ) { + var $item = $(item); + var itemData = $item.data(); + + // Continuing would add a transitionend event listener to the element, but + // that listener would not execute because the transform and opacity would + // stay the same. + if ( itemData.scale === CONCEALED_SCALE ) { + return; + } + + itemData.scale = CONCEALED_SCALE; + + this.styleQueue.push({ + $item: $item, + point: itemData.point, + scale : CONCEALED_SCALE, + opacity: 0, + callback: function() { + $item.css( 'visibility', 'hidden' ); + } + }); + }, this); +}; + + +/** + * Resize handler. + * @private + */ +Shuffle.prototype._onResize = function() { + // If shuffle is disabled, destroyed, don't do anything + if ( !this.enabled || this.destroyed || this.isTransitioning ) { + return; + } + + // Will need to check height in the future if it's layed out horizontaly + var containerWidth = Shuffle._getOuterWidth( this.element ); + + // containerWidth hasn't changed, don't do anything + if ( containerWidth === this.containerWidth ) { + return; + } + + this.update(); +}; + + +/** + * Returns styles for either jQuery animate or transition. + * @param {Object} opts Transition options. + * @return {!Object} Transforms for transitions, left/top for animate. + * @private + */ +Shuffle.prototype._getStylesForTransition = function( opts ) { + var styles = { + opacity: opts.opacity + }; + + if ( this.supported ) { + styles[ TRANSFORM ] = Shuffle._getItemTransformString( opts.point, opts.scale ); + } else { + styles.left = opts.point.x; + styles.top = opts.point.y; + } + + return styles; +}; + + +/** + * Transitions an item in the grid + * + * @param {Object} opts options. + * @param {jQuery} opts.$item jQuery object representing the current item. + * @param {Point} opts.point A point object with the x and y coordinates. + * @param {number} opts.scale Amount to scale the item. + * @param {number} opts.opacity Opacity of the item. + * @param {Function} opts.callback Complete function for the animation. + * @param {Function} opts.callfront Function to call before transitioning. + * @private + */ +Shuffle.prototype._transition = function( opts ) { + var styles = this._getStylesForTransition( opts ); + this._startItemAnimation( opts.$item, styles, opts.callfront || $.noop, opts.callback || $.noop ); +}; + + +Shuffle.prototype._startItemAnimation = function( $item, styles, callfront, callback ) { + // Transition end handler removes its listener. + function handleTransitionEnd( evt ) { + // Make sure this event handler has not bubbled up from a child. + if ( evt.target === evt.currentTarget ) { + $( evt.target ).off( TRANSITIONEND, handleTransitionEnd ); + callback(); + } + } + + callfront(); + + // Transitions are not set until shuffle has loaded to avoid the initial transition. + if ( !this.initialized ) { + $item.css( styles ); + callback(); + return; + } + + // Use CSS Transforms if we have them + if ( this.supported ) { + $item.css( styles ); + $item.on( TRANSITIONEND, handleTransitionEnd ); + + // Use jQuery to animate left/top + } else { + // Save the deferred object which jQuery returns. + var anim = $item.stop( true ).animate( styles, this.speed, 'swing', callback ); + // Push the animation to the list of pending animations. + this._animations.push( anim.promise() ); + } +}; + + +/** + * Execute the styles gathered in the style queue. This applies styles to elements, + * triggering transitions. + * @param {boolean} noLayout Whether to trigger a layout event. + * @private + */ +Shuffle.prototype._processStyleQueue = function( noLayout ) { + var $transitions = $(); + + // Iterate over the queue and keep track of ones that use transitions. + each(this.styleQueue, function( transitionObj ) { + if ( transitionObj.skipTransition ) { + this._styleImmediately( transitionObj ); + } else { + $transitions = $transitions.add( transitionObj.$item ); + this._transition( transitionObj ); + } + }, this); + + + if ( $transitions.length > 0 && this.initialized ) { + // Set flag that shuffle is currently in motion. + this.isTransitioning = true; + + if ( this.supported ) { + this._whenCollectionDone( $transitions, TRANSITIONEND, this._movementFinished ); + + // The _transition function appends a promise to the animations array. + // When they're all complete, do things. + } else { + this._whenAnimationsDone( this._movementFinished ); + } + + // A call to layout happened, but none of the newly filtered items will + // change position. Asynchronously fire the callback here. + } else if ( !noLayout ) { + defer( this._layoutEnd, this ); + } + + // Remove everything in the style queue + this.styleQueue.length = 0; +}; + + +/** + * Apply styles without a transition. + * @param {Object} opts Transitions options object. + * @private + */ +Shuffle.prototype._styleImmediately = function( opts ) { + Shuffle._skipTransition(opts.$item[0], function() { + opts.$item.css( this._getStylesForTransition( opts ) ); + }, this); +}; + +Shuffle.prototype._movementFinished = function() { + this.isTransitioning = false; + this._layoutEnd(); +}; + +Shuffle.prototype._layoutEnd = function() { + this._fire( Shuffle.EventType.LAYOUT ); +}; + +Shuffle.prototype._addItems = function( $newItems, addToEnd, isSequential ) { + // Add classes and set initial positions. + this._initItems( $newItems ); + + // Add transition to each item. + this._setTransitions( $newItems ); + + // Update the list of + this.$items = this._getItems(); + + // Shrink all items (without transitions). + this._shrink( $newItems ); + each(this.styleQueue, function( transitionObj ) { + transitionObj.skipTransition = true; + }); + + // Apply shrink positions, but do not cause a layout event. + this._processStyleQueue( true ); + + if ( addToEnd ) { + this._addItemsToEnd( $newItems, isSequential ); + } else { + this.shuffle( this.lastFilter ); + } +}; + + +Shuffle.prototype._addItemsToEnd = function( $newItems, isSequential ) { + // Get ones that passed the current filter + var $passed = this._filter( null, $newItems ); + var passed = $passed.get(); + + // How many filtered elements? + this._updateItemCount(); + + this._layout( passed, true ); + + if ( isSequential && this.supported ) { + this._setSequentialDelay( passed ); + } + + this._revealAppended( passed ); +}; + + +/** + * Triggers appended elements to fade in. + * @param {ArrayLike.} $newFilteredItems Collection of elements. + * @private + */ +Shuffle.prototype._revealAppended = function( newFilteredItems ) { + defer(function() { + each(newFilteredItems, function( el ) { + var $item = $( el ); + this._transition({ + $item: $item, + opacity: 1, + point: $item.data('point'), + scale: DEFAULT_SCALE + }); + }, this); + + this._whenCollectionDone($(newFilteredItems), TRANSITIONEND, function() { + $(newFilteredItems).css( TRANSITION_DELAY, '0ms' ); + this._movementFinished(); + }); + }, this, this.revealAppendedDelay); +}; + + +/** + * Execute a function when an event has been triggered for every item in a collection. + * @param {jQuery} $collection Collection of elements. + * @param {string} eventName Event to listen for. + * @param {Function} callback Callback to execute when they're done. + * @private + */ +Shuffle.prototype._whenCollectionDone = function( $collection, eventName, callback ) { + var done = 0; + var items = $collection.length; + var self = this; + + function handleEventName( evt ) { + if ( evt.target === evt.currentTarget ) { + $( evt.target ).off( eventName, handleEventName ); + done++; + + // Execute callback if all items have emitted the correct event. + if ( done === items ) { + callback.call( self ); + } + } + } + + // Bind the event to all items. + $collection.on( eventName, handleEventName ); +}; + + +/** + * Execute a callback after jQuery `animate` for a collection has finished. + * @param {Function} callback Callback to execute when they're done. + * @private + */ +Shuffle.prototype._whenAnimationsDone = function( callback ) { + $.when.apply( null, this._animations ).always( $.proxy( function() { + this._animations.length = 0; + callback.call( this ); + }, this )); +}; + + +/** + * Public Methods + */ + +/** + * The magic. This is what makes the plugin 'shuffle' + * @param {string|Function} [category] Category to filter by. Can be a function + * @param {Object} [sortObj] A sort object which can sort the filtered set + */ +Shuffle.prototype.shuffle = function( category, sortObj ) { + if ( !this.enabled || this.isTransitioning ) { + return; + } + + if ( !category ) { + category = ALL_ITEMS; + } + + this._filter( category ); + + // How many filtered elements? + this._updateItemCount(); + + // Shrink each concealed item + this._shrink(); + + // Update transforms on .filtered elements so they will animate to their new positions + this.sort( sortObj ); +}; + + +/** + * Gets the .filtered elements, sorts them, and passes them to layout. + * @param {Object} opts the options object for the sorted plugin + */ +Shuffle.prototype.sort = function( opts ) { + if ( this.enabled && !this.isTransitioning ) { + this._resetCols(); + + var sortOptions = opts || this.lastSort; + var items = this._getFilteredItems().sorted( sortOptions ); + + this._layout( items ); + + this.lastSort = sortOptions; + } +}; + + +/** + * Reposition everything. + * @param {boolean} isOnlyLayout If true, column and gutter widths won't be + * recalculated. + */ +Shuffle.prototype.update = function( isOnlyLayout ) { + if ( this.enabled && !this.isTransitioning ) { + + if ( !isOnlyLayout ) { + // Get updated colCount + this._setColumns(); + } + + // Layout items + this.sort(); + } +}; + + +/** + * Use this instead of `update()` if you don't need the columns and gutters updated + * Maybe an image inside `shuffle` loaded (and now has a height), which means calculations + * could be off. + */ +Shuffle.prototype.layout = function() { + this.update( true ); +}; + + +/** + * New items have been appended to shuffle. Fade them in sequentially + * @param {jQuery} $newItems jQuery collection of new items + * @param {boolean} [addToEnd=false] If true, new items will be added to the end / bottom + * of the items. If not true, items will be mixed in with the current sort order. + * @param {boolean} [isSequential=true] If false, new items won't sequentially fade in + */ +Shuffle.prototype.appended = function( $newItems, addToEnd, isSequential ) { + this._addItems( $newItems, addToEnd === true, isSequential !== false ); +}; + + +/** + * Disables shuffle from updating dimensions and layout on resize + */ +Shuffle.prototype.disable = function() { + this.enabled = false; +}; + + +/** + * Enables shuffle again + * @param {boolean} [isUpdateLayout=true] if undefined, shuffle will update columns and gutters + */ +Shuffle.prototype.enable = function( isUpdateLayout ) { + this.enabled = true; + if ( isUpdateLayout !== false ) { + this.update(); + } +}; + + +/** + * Remove 1 or more shuffle items + * @param {jQuery} $collection A jQuery object containing one or more element in shuffle + * @return {Shuffle} The shuffle object + */ +Shuffle.prototype.remove = function( $collection ) { + + // If this isn't a jquery object, exit + if ( !$collection.length || !$collection.jquery ) { + return; + } + + function handleRemoved() { + // Remove the collection in the callback + $collection.remove(); + + // Update things now that elements have been removed. + this.$items = this._getItems(); + this._updateItemCount(); + + this._fire( Shuffle.EventType.REMOVED, [ $collection, this ] ); + + // Let it get garbage collected + $collection = null; + } + + // Hide collection first. + this._toggleFilterClasses( $(), $collection ); + this._shrink( $collection ); + + this.sort(); + + this.$el.one( Shuffle.EventType.LAYOUT + '.' + SHUFFLE, $.proxy( handleRemoved, this ) ); +}; + + +/** + * Destroys shuffle, removes events, styles, and classes + */ +Shuffle.prototype.destroy = function() { + // If there is more than one shuffle instance on the page, + // removing the resize handler from the window would remove them + // all. This is why a unique value is needed. + $window.off('.' + this.unique); + + // Reset container styles + this.$el + .removeClass( SHUFFLE ) + .removeAttr('style') + .removeData( SHUFFLE ); + + // Reset individual item styles + this.$items + .removeAttr('style') + .removeData('point') + .removeData('scale') + .removeClass([ + Shuffle.ClassName.CONCEALED, + Shuffle.ClassName.FILTERED, + Shuffle.ClassName.SHUFFLE_ITEM + ].join(' ')); + + // Null DOM references + this.$items = null; + this.$el = null; + this.sizer = null; + this.element = null; + + // Set a flag so if a debounced resize has been triggered, + // it can first check if it is actually destroyed and not doing anything + this.destroyed = true; +}; + + +// Plugin definition +$.fn.shuffle = function( opts ) { + var args = Array.prototype.slice.call( arguments, 1 ); + return this.each(function() { + var $this = $( this ); + var shuffle = $this.data( SHUFFLE ); + + // If we don't have a stored shuffle, make a new one and save it + if ( !shuffle ) { + shuffle = new Shuffle( this, opts ); + $this.data( SHUFFLE, shuffle ); + } else if ( typeof opts === 'string' && shuffle[ opts ] ) { + shuffle[ opts ].apply( shuffle, args ); + } + }); +}; + + +// http://stackoverflow.com/a/962890/373422 +function randomize( array ) { + var tmp, current; + var top = array.length; + + if ( !top ) { + return array; + } + + while ( --top ) { + current = Math.floor( Math.random() * (top + 1) ); + tmp = array[ current ]; + array[ current ] = array[ top ]; + array[ top ] = tmp; + } + + return array; +} + + +// You can return `undefined` from the `by` function to revert to DOM order +// This plugin does NOT return a jQuery object. It returns a plain array because +// jQuery sorts everything in DOM order. +$.fn.sorted = function(options) { + var opts = $.extend({}, $.fn.sorted.defaults, options); + var arr = this.get(); + var revert = false; + + if ( !arr.length ) { + return []; + } + + if ( opts.randomize ) { + return randomize( arr ); + } + + // Sort the elements by the opts.by function. + // If we don't have opts.by, default to DOM order + if ( $.isFunction( opts.by ) ) { + arr.sort(function(a, b) { + + // Exit early if we already know we want to revert + if ( revert ) { + return 0; + } + + var valA = opts.by($(a)); + var valB = opts.by($(b)); + + // If both values are undefined, use the DOM order + if ( valA === undefined && valB === undefined ) { + revert = true; + return 0; + } + + if ( valA < valB || valA === 'sortFirst' || valB === 'sortLast' ) { + return -1; + } + + if ( valA > valB || valA === 'sortLast' || valB === 'sortFirst' ) { + return 1; + } + + return 0; + }); + } + + // Revert to the original array if necessary + if ( revert ) { + return this.get(); + } + + if ( opts.reverse ) { + arr.reverse(); + } + + return arr; +}; + + +$.fn.sorted.defaults = { + reverse: false, // Use array.reverse() to reverse the results + by: null, // Sorting function + randomize: false // If true, this will skip the sorting and return a randomized order in the array +}; + +return Shuffle; + +}); \ No newline at end of file diff --git a/public/js/respond.min.js b/public/js/respond.min.js new file mode 100644 index 0000000..80a7b69 --- /dev/null +++ b/public/js/respond.min.js @@ -0,0 +1,5 @@ +/*! Respond.js v1.4.2: min/max-width media query polyfill * Copyright 2013 Scott Jehl + * Licensed under https://github.com/scottjehl/Respond/blob/master/LICENSE-MIT + * */ + +!function(a){"use strict";a.matchMedia=a.matchMedia||function(a){var b,c=a.documentElement,d=c.firstElementChild||c.firstChild,e=a.createElement("body"),f=a.createElement("div");return f.id="mq-test-1",f.style.cssText="position:absolute;top:-100em",e.style.background="none",e.appendChild(f),function(a){return f.innerHTML='­',c.insertBefore(e,d),b=42===f.offsetWidth,c.removeChild(e),{matches:b,media:a}}}(a.document)}(this),function(a){"use strict";function b(){u(!0)}var c={};a.respond=c,c.update=function(){};var d=[],e=function(){var b=!1;try{b=new a.XMLHttpRequest}catch(c){b=new a.ActiveXObject("Microsoft.XMLHTTP")}return function(){return b}}(),f=function(a,b){var c=e();c&&(c.open("GET",a,!0),c.onreadystatechange=function(){4!==c.readyState||200!==c.status&&304!==c.status||b(c.responseText)},4!==c.readyState&&c.send(null))};if(c.ajax=f,c.queue=d,c.regex={media:/@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi,keyframes:/@(?:\-(?:o|moz|webkit)\-)?keyframes[^\{]+\{(?:[^\{\}]*\{[^\}\{]*\})+[^\}]*\}/gi,urls:/(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,findStyles:/@media *([^\{]+)\{([\S\s]+?)$/,only:/(only\s+)?([a-zA-Z]+)\s?/,minw:/\([\s]*min\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/,maxw:/\([\s]*max\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/},c.mediaQueriesSupported=a.matchMedia&&null!==a.matchMedia("only all")&&a.matchMedia("only all").matches,!c.mediaQueriesSupported){var g,h,i,j=a.document,k=j.documentElement,l=[],m=[],n=[],o={},p=30,q=j.getElementsByTagName("head")[0]||k,r=j.getElementsByTagName("base")[0],s=q.getElementsByTagName("link"),t=function(){var a,b=j.createElement("div"),c=j.body,d=k.style.fontSize,e=c&&c.style.fontSize,f=!1;return b.style.cssText="position:absolute;font-size:1em;width:1em",c||(c=f=j.createElement("body"),c.style.background="none"),k.style.fontSize="100%",c.style.fontSize="100%",c.appendChild(b),f&&k.insertBefore(c,k.firstChild),a=b.offsetWidth,f?k.removeChild(c):c.removeChild(b),k.style.fontSize=d,e&&(c.style.fontSize=e),a=i=parseFloat(a)},u=function(b){var c="clientWidth",d=k[c],e="CSS1Compat"===j.compatMode&&d||j.body[c]||d,f={},o=s[s.length-1],r=(new Date).getTime();if(b&&g&&p>r-g)return a.clearTimeout(h),h=a.setTimeout(u,p),void 0;g=r;for(var v in l)if(l.hasOwnProperty(v)){var w=l[v],x=w.minw,y=w.maxw,z=null===x,A=null===y,B="em";x&&(x=parseFloat(x)*(x.indexOf(B)>-1?i||t():1)),y&&(y=parseFloat(y)*(y.indexOf(B)>-1?i||t():1)),w.hasquery&&(z&&A||!(z||e>=x)||!(A||y>=e))||(f[w.media]||(f[w.media]=[]),f[w.media].push(m[w.rules]))}for(var C in n)n.hasOwnProperty(C)&&n[C]&&n[C].parentNode===q&&q.removeChild(n[C]);n.length=0;for(var D in f)if(f.hasOwnProperty(D)){var E=j.createElement("style"),F=f[D].join("\n");E.type="text/css",E.media=D,q.insertBefore(E,o.nextSibling),E.styleSheet?E.styleSheet.cssText=F:E.appendChild(j.createTextNode(F)),n.push(E)}},v=function(a,b,d){var e=a.replace(c.regex.keyframes,"").match(c.regex.media),f=e&&e.length||0;b=b.substring(0,b.lastIndexOf("/"));var g=function(a){return a.replace(c.regex.urls,"$1"+b+"$2$3")},h=!f&&d;b.length&&(b+="/"),h&&(f=1);for(var i=0;f>i;i++){var j,k,n,o;h?(j=d,m.push(g(a))):(j=e[i].match(c.regex.findStyles)&&RegExp.$1,m.push(RegExp.$2&&g(RegExp.$2))),n=j.split(","),o=n.length;for(var p=0;o>p;p++)k=n[p],l.push({media:k.split("(")[0].match(c.regex.only)&&RegExp.$2||"all",rules:m.length-1,hasquery:k.indexOf("(")>-1,minw:k.match(c.regex.minw)&&parseFloat(RegExp.$1)+(RegExp.$2||""),maxw:k.match(c.regex.maxw)&&parseFloat(RegExp.$1)+(RegExp.$2||"")})}u()},w=function(){if(d.length){var b=d.shift();f(b.href,function(c){v(c,b.href,b.media),o[b.href]=!0,a.setTimeout(function(){w()},0)})}},x=function(){for(var b=0;b"; + headers.on('click', function() { + if (!settings.noBackToTopLinks) { + window.location.hash = this.id; + } + }) + .addClass('clickable-header') + .each(function(_, header) { + this_level = get_level(header); + if (!settings.noBackToTopLinks && this_level === highest_level) { + $(header).addClass('top-level-header').after(return_to_top); + } + if (this_level === level) // same level as before; same indenting + html += "
  • " + header.innerHTML + ""; + else if (this_level <= level){ // higher level than before; end parent ol + for(i = this_level; i < level; i++) { + html += "
  • " + } + html += "
  • " + header.innerHTML + ""; + } + else if (this_level > level) { // lower level than before; expand the previous to contain a ol + for(i = this_level; i > level; i--) { + html += "<"+settings.listType+">
  • " + } + html += "" + header.innerHTML + ""; + } + level = this_level; // update for the next one + }); + html += ""; + if (!settings.noBackToTopLinks) { + $(document).on('click', '.back-to-top', function() { + $(window).scrollTop(0); + window.location.hash = ''; + }); + } + + render[settings.showEffect](); + }; +})(jQuery); \ No newline at end of file diff --git a/public/licenses/LICENSE b/public/licenses/LICENSE new file mode 100644 index 0000000..e04b3d0 --- /dev/null +++ b/public/licenses/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 Tom Johnson + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/public/licenses/LICENSE-BSD-NAVGOCO.txt b/public/licenses/LICENSE-BSD-NAVGOCO.txt new file mode 100644 index 0000000..7fdefc3 --- /dev/null +++ b/public/licenses/LICENSE-BSD-NAVGOCO.txt @@ -0,0 +1,27 @@ +/* This license pertains to the Navgoco jQuery component used for the sidebar. */ + +Copyright (c) 2013, Christodoulos Tsoulloftas, http://www.komposta.net +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of the nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/public/merlin5/cluster-introduction.html b/public/merlin5/cluster-introduction.html new file mode 100644 index 0000000..0771083 --- /dev/null +++ b/public/merlin5/cluster-introduction.html @@ -0,0 +1,805 @@ + + + + + + + + +Cluster 'merlin5' | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Cluster 'merlin5'

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    Slurm ‘merlin5’ cluster

    + +

    Merlin5 was the old official PSI Local HPC cluster for development and +mission-critical applications which was built in 2016-2017. It was an +extension of the Merlin4 cluster and built from existing hardware due +to a lack of central investment on Local HPC Resources. Merlin5 was +then replaced by the Merlin6 cluster in 2019, +with an important central investment of ~1,5M CHF. Merlin5 was mostly +based on CPU resources, but also contained a small amount of GPU-based +resources which were mostly used by the BIO experiments.

    + +

    Merlin5 has been kept as a Local HPC Slurm cluster, +called merlin5. In that way, the old CPU computing nodes are still available as extra computation resources, +and as an extension of the official production merlin6 Slurm cluster.

    + +

    The old Merlin5 login nodes, GPU nodes and storage were fully migrated to the Merlin6 +cluster, which becomes the main Local HPC Cluster. Hence, Merlin6 +contains the storage which is mounted on the different Merlin HPC Slurm Clusters (merlin5, merlin6, gmerlin6).

    + +

    Submitting jobs to ‘merlin5’

    + +

    To submit jobs to the merlin5 Slurm cluster, it must be done from the Merlin6 login nodes by using +the option --clusters=merlin5 on any of the Slurm commands (sbatch, salloc, srun, etc. commands).

    + +

    The Merlin Architecture

    + +

    Multi Non-Federated Cluster Architecture Design: The Merlin cluster

    + +

    The following image shows the Slurm architecture design for Merlin cluster. +It contains a multi non-federated cluster setup, with a central Slurm database +and multiple independent clusters (merlin5, merlin6, gmerlin6):

    + +

    Merlin6 Slurm Architecture Design

    + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin5/hardware-and-software.html b/public/merlin5/hardware-and-software.html new file mode 100644 index 0000000..7bf1971 --- /dev/null +++ b/public/merlin5/hardware-and-software.html @@ -0,0 +1,865 @@ + + + + + + + + +Hardware And Software Description | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Hardware And Software Description

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    Hardware

    + +

    Computing Nodes

    + +

    Merlin5 is built from recycled nodes, and hardware will be decomissioned as soon as it fails (due to expired warranty and age of the cluster).

    +
      +
    • Merlin5 is based on the HPE c7000 Enclosure solution, with 16 x HPE ProLiant BL460c Gen8 nodes per chassis.
    • +
    • Connectivity is based on Infiniband ConnectX-3 QDR-40Gbps +
        +
      • 16 internal ports for intra chassis communication
      • +
      • 2 connected external ports for inter chassis communication and storage access.
      • +
      +
    • +
    + +

    The below table summarizes the hardware setup for the Merlin5 computing nodes:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Merlin5 CPU Computing Nodes
    ChassisNodeProcessorSocketsCoresThreadsScratchMemory
    #0merlin-c-[18-30]Intel Xeon E5-2670216150GB64GB
    merlin-c-[31,32]128GB
    #1merlin-c-[33-45]Intel Xeon E5-2670216150GB64GB
    merlin-c-[46,47]128GB
    + +

    Login Nodes

    + +

    The login nodes are part of the Merlin6 HPC cluster, +and are used to compile and to submit jobs to the different Merlin Slurm clusters (merlin5,merlin6,gmerlin6,etc.). +Please refer to the Merlin6 Hardware Documentation for further information.

    + +

    Storage

    + +

    The storage is part of the Merlin6 HPC cluster, +and is mounted in all the Slurm clusters (merlin5,merlin6,gmerlin6,etc.). +Please refer to the Merlin6 Hardware Documentation for further information.

    + +

    Network

    + +

    Merlin5 cluster connectivity is based on the Infiniband QDR technology. +This allows fast access with very low latencies to the data as well as running extremely efficient MPI-based jobs. +However, this is an old version of Infiniband which requires older drivers and software can not take advantage of the latest features.

    + +

    Software

    + +

    In Merlin5, we try to keep software stack coherency with the main cluster Merlin6.

    + +

    Due to this, Merlin5 runs:

    + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin5/slurm-configuration.html b/public/merlin5/slurm-configuration.html new file mode 100644 index 0000000..43e3284 --- /dev/null +++ b/public/merlin5/slurm-configuration.html @@ -0,0 +1,985 @@ + + + + + + + + +Slurm Configuration | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Slurm Configuration

    +
    + + + +
    + + +
    This document describes a summary of the Merlin5 Slurm configuration.
    + + + + + + + +
    + + + + + + +

    This documentation shows basic Slurm configuration and options needed to run jobs in the Merlin5 cluster.

    + +

    The Merlin5 cluster is an old cluster with old hardware which is maintained in a best effort for increasing the CPU power of the Merlin cluster.

    + +

    Merlin5 CPU nodes definition

    + +

    The following table show default and maximum resources that can be used per node:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NodesDef.#CPUsMax.#CPUs#ThreadsMax.Mem/NodeMax.Swap
    merlin-c-[18-30]1 core16 cores16000010000
    merlin-c-[31-32]1 core16 cores112400010000
    merlin-c-[33-45]1 core16 cores16000010000
    merlin-c-[46-47]1 core16 cores112400010000
    + +

    There is one main difference between the Merlin5 and Merlin6 clusters: Merlin5 is keeping an old configuration which does not +consider the memory as a consumable resource. Hence, users can oversubscribe memory. This might trigger some side-effects, but +this legacy configuration has been kept to ensure that old jobs can keep running in the same way they did a few years ago. +If you know that this might be a problem for you, please, always use Merlin6 instead.

    + +

    Running jobs in the ‘merlin5’ cluster

    + +

    In this chapter we will cover basic settings that users need to specify in order to run jobs in the Merlin5 CPU cluster.

    + +

    Merlin5 CPU cluster

    + +

    To run jobs in the merlin5 cluster users must specify the cluster name in Slurm:

    + +
    #SBATCH --cluster=merlin5
    +
    + +

    Merlin5 CPU partitions

    + +

    Users might need to specify the Slurm partition. If no partition is specified, it will default to merlin:

    + +
    #SBATCH --partition=<partition_name> # Possible <partition_name> values: merlin, merlin-long:
    +
    + +

    The table below resumes shows all possible partitions available to users:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    CPU PartitionDefault TimeMax TimeMax NodesPriorityJobFactor*PriorityTier**
    merlin5 days1 weekAll nodes5001
    merlin-long5 days21 days411
    + +

    *The PriorityJobFactor value will be added to the job priority (PARTITION column in sprio -l ). In other words, jobs sent to higher priority +partitions will usually run first (however, other factors such like job age or mainly fair share might affect to that decision). For the GPU +partitions, Slurm will also attempt first to allocate jobs on partitions with higher priority over partitions with lesser priority.

    + +

    **Jobs submitted to a partition with a higher PriorityTier value will be dispatched before pending jobs in partition with lower PriorityTier value +and, if possible, they will preempt running jobs from partitions with lower PriorityTier values.

    + +

    The merlin-long partition is limited to 4 nodes, as it might contain jobs running for up to 21 days.

    + +

    Merlin5 CPU Accounts

    + +

    Users need to ensure that the public merlin account is specified. No specifying account options would default to this account. +This is mostly needed by users which have multiple Slurm accounts, which may define by mistake a different account.

    + +
    #SBATCH --account=merlin  # Possible values: merlin
    +
    + +

    Slurm CPU specific options

    + +

    Some options are available when using CPUs. These are detailed here.

    + +

    Alternative Slurm options for CPU based jobs are available. Please refer to the man pages +for each Slurm command for further information about it (man salloc, man sbatch, man srun). +Below are listed the most common settings:

    + +
    #SBATCH --ntasks=<ntasks>
    +#SBATCH --ntasks-per-core=<ntasks>
    +#SBATCH --ntasks-per-socket=<ntasks>
    +#SBATCH --ntasks-per-node=<ntasks>
    +#SBATCH --mem=<size[units]>
    +#SBATCH --mem-per-cpu=<size[units]>
    +#SBATCH --cpus-per-task=<ncpus>
    +#SBATCH --cpu-bind=[{quiet,verbose},]<type>  # only for 'srun' command
    +
    + +

    Notice that in Merlin5 no hyper-threading is available (while in Merlin6 it is). +Hence, in Merlin5 there is not need to specify --hint hyper-threading related options.

    + +

    User and job limits

    + +

    In the CPU cluster we provide some limits which basically apply to jobs and users. The idea behind this is to ensure a fair usage of the resources and to +avoid overabuse of the resources from a single user or job. However, applying limits might affect the overall usage efficiency of the cluster (in example, +pending jobs from a single user while having many idle nodes due to low overall activity is something that can be seen when user limits are applied). +In the same way, these limits can be also used to improve the efficiency of the cluster (in example, without any job size limits, a job requesting all +resources from the batch system would drain the entire cluster for fitting the job, which is undesirable).

    + +

    Hence, there is a need of setting up wise limits and to ensure that there is a fair usage of the resources, by trying to optimize the overall efficiency +of the cluster while allowing jobs of different nature and sizes (it is, single core based vs parallel jobs of different sizes) to run.

    + +

    In the merlin5 cluster, as not many users are running on it, these limits are wider than the ones set in the merlin6 and gmerlin6 clusters.

    + +

    Per job limits

    + +

    These are limits which apply to a single job. In other words, there is a maximum of resources a single job can use. These limits are described in the table below, +with the format SlurmQoS(limits) (SlurmQoS can be listed from the sacctmgr show qos command):

    + + + + + + + + + + + + + + + + + + + + + +
    PartitionMon-Sun 0h-24hOther limits
    merlinmerlin5(cpu=384)None
    merlin-longmerlin5(cpu=384)Max. 4 nodes
    + +

    By default, by QoS limits, a job can not use more than 384 cores (max CPU per job). +However, for the merlin-long, this is even more restricted: there is an extra limit of 4 dedicated nodes for this partion. This is defined +at the partition level, and will overwrite any QoS limit as long as this is more restrictive.

    + +

    Per user limits for CPU partitions

    + +

    No user limits apply by QoS. For the merlin partition, a single user could fill the whole batch system with jobs (however, the restriction is at the job size, as explained above). For the merlin-limit partition, the 4 node limitation still applies.

    + +

    Advanced Slurm configuration

    + +

    Clusters at PSI use the Slurm Workload Manager as the batch system technology for managing and scheduling jobs. +Slurm has been installed in a multi-clustered configuration, allowing to integrate multiple clusters in the same batch system.

    + +

    For understanding the Slurm configuration setup in the cluster, sometimes may be useful to check the following files:

    + +
      +
    • /etc/slurm/slurm.conf - can be found in the login nodes and computing nodes.
    • +
    • /etc/slurm/gres.conf - can be found in the GPU nodes, is also propgated to login nodes and computing nodes for user read access.
    • +
    • /etc/slurm/cgroup.conf - can be found in the computing nodes, is also propagated to login nodes for user read access.
    • +
    + +

    The previous configuration files which can be found in the login nodes, correspond exclusively to the merlin6 cluster configuration files. +Configuration files for the old merlin5 cluster or for the gmerlin6 cluster must be checked directly on any of the merlin5 or gmerlin6 computing nodes (in example, by login in to one of the nodes while a job or an active allocation is running).

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin6.html b/public/merlin6.html new file mode 100644 index 0000000..4b2ef60 --- /dev/null +++ b/public/merlin6.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

    Redirecting…

    + Click here if you are not redirected. + diff --git a/public/merlin6/ansys-cfx.html b/public/merlin6/ansys-cfx.html new file mode 100644 index 0000000..24161d8 --- /dev/null +++ b/public/merlin6/ansys-cfx.html @@ -0,0 +1,903 @@ + + + + + + + + +ANSYS / CFX | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    ANSYS / CFX

    +
    + + + +
    + + +
    This document describes how to run ANSYS/CFX in the Merlin6 cluster
    + + + + + + + +
    + + + + + + +

    This document describes the different ways for running ANSYS/CFX

    + +

    ANSYS/CFX

    + +

    Is always recommended to check which parameters are available in CFX and adapt the below examples according to your needs. +For that, run cfx5solve -help for getting a list of options.

    + +

    Running CFX jobs

    + +

    PModules

    + +

    Is strongly recommended the use of the latest ANSYS software available in PModules.

    + +
    module use unstable
    +module load Pmodules/1.1.6
    +module use overlay_merlin
    +module load ANSYS/2022R1
    +
    + +

    Interactive: RSM from remote PSI Workstations

    + +

    Is possible to run CFX through RSM from remote PSI (Linux or Windows) Workstation having a local installation of ANSYS CFX and RSM client. +For that, please refer to the [ANSYS RSM](/merlin6/ansys-rsm.html) in the Merlin documentation for further information of how to setup a RSM client for submitting jobs to Merlin.

    + +

    Non-interactive: sbatch

    + +

    Running jobs with sbatch is always the recommended method. This makes the use of the resources more efficient. Notice that for +running non interactive Mechanical APDL jobs one must specify the -batch option.

    + +

    Serial example

    + +

    This example shows a very basic serial job.

    + +
    #!/bin/bash
    +#SBATCH --job-name=CFX       # Job Name
    +#SBATCH --partition=hourly   # Using 'daily' will grant higher priority than 'general'
    +#SBATCH --time=0-01:00:00    # Time needed for running the job. Must match with 'partition' limits.
    +#SBATCH --cpus-per-task=1    # Double if hyperthreading enabled
    +#SBATCH --ntasks-per-core=1  # Double if hyperthreading enabled
    +#SBATCH --hint=nomultithread # Disable Hyperthreading
    +#SBATCH --error=slurm-%j.err # Define your error file
    +
    +module use unstable
    +module load ANSYS/2020R1-1
    +
    +# [Optional:BEGIN] Specify your license server if this is not 'lic-ansys.psi.ch'
    +LICENSE_SERVER=<your_license_server>
    +export ANSYSLMD_LICENSE_FILE=1055@$LICENSE_SERVER
    +export ANSYSLI_SERVERS=2325@$LICENSE_SERVER
    +# [Optional:END]
    +
    +SOLVER_FILE=/data/user/caubet_m/CFX5/mysolver.in
    +cfx5solve -batch -def "$JOURNAL_FILE" 
    +
    + +

    One can enable hypertheading by defining --hint=multithread, --cpus-per-task=2 and --ntasks-per-core=2. +However, this is in general not recommended, unless one can ensure that can be beneficial.

    + +

    MPI-based example

    + +

    An example for running CFX using a Slurm batch script is the following:

    + +
    #!/bin/bash
    +#SBATCH --job-name=CFX       # Job Name
    +#SBATCH --partition=hourly   # Using 'daily' will grant higher priority than 'general'
    +#SBATCH --time=0-01:00:00    # Time needed for running the job. Must match with 'partition' limits.
    +#SBATCH --nodes=1            # Number of nodes
    +#SBATCH --ntasks=44          # Number of tasks
    +#SBATCH --cpus-per-task=1    # Double if hyperthreading enabled
    +#SBATCH --ntasks-per-core=1  # Double if hyperthreading enabled
    +#SBATCH --hint=nomultithread # Disable Hyperthreading
    +#SBATCH --error=slurm-%j.err # Define a file for standard error messages
    +##SBATCH --exclusive         # Uncomment if you want exclusive usage of the nodes
    +
    +module use unstable
    +module load ANSYS/2020R1-1
    +
    +# [Optional:BEGIN] Specify your license server if this is not 'lic-ansys.psi.ch'
    +LICENSE_SERVER=<your_license_server>
    +export ANSYSLMD_LICENSE_FILE=1055@$LICENSE_SERVER
    +export ANSYSLI_SERVERS=2325@$LICENSE_SERVER
    +# [Optional:END]
    +
    +export HOSTLIST=$(scontrol show hostname | tr '\n' ',' | sed 's/,$//g')
    +
    +JOURNAL_FILE=myjournal.in
    +
    +# INTELMPI=no  for IBM MPI
    +# INTELMPI=yes for INTEL MPI
    +INTELMPI=no
    +
    +if [ "$INTELMPI" == "yes" ]
    +then
    +  export I_MPI_DEBUG=4
    +  export I_MPI_PIN_CELL=core
    +  
    +  # Simple example: cfx5solve -batch -def "$JOURNAL_FILE" -par-dist "$HOSTLIST" \ 
    +  #                           -part $SLURM_NTASKS \ 
    +  #                           -start-method 'Intel MPI Distributed Parallel'
    +  cfx5solve -batch -part-large -double -verbose -def "$JOURNAL_FILE" -par-dist "$HOSTLIST" \ 
    +            -part $SLURM_NTASKS -par-local -start-method 'Intel MPI Distributed Parallel'
    +else
    +  # Simple example: cfx5solve -batch -def "$JOURNAL_FILE" -par-dist "$HOSTLIST" \ 
    +  #                           -part $SLURM_NTASKS \ 
    +  #                           -start-method 'IBM MPI Distributed Parallel'
    +  cfx5solve -batch -part-large -double -verbose -def "$JOURNAL_FILE" -par-dist "$HOSTLIST" \ 
    +            -part $SLURM_NTASKS -par-local -start-method 'IBM MPI Distributed Parallel'
    +fi
    +
    + +

    In the above example, one can increase the number of nodes and/or ntasks if needed and combine it +with --exclusive whenever needed. In general, no hypertheading is recommended for MPI based jobs. +Also, one can combine it with --exclusive when necessary. Finally, one can change the MPI technology in -start-method +(check CFX documentation for possible values).

    + +

    CFX5 Launcher: CFD-Pre/Post, Solve Manager, TurboGrid

    + +

    Some users might need to visualize or change some parameters when running calculations with the CFX Solver. For running +TurboGrid, CFX-Pre, CFX-Solver Manager or CFD-Post one should run it with the cfx5 launcher binary:

    + +
    cfx5
    +
    + +

    CFX5 Launcher Example

    + +

    Then, from the launcher, one can open the proper application (i.e. CFX-Solver Manager for visualizing and modifying an +existing job run)

    + +

    For running CFX5 Launcher, is required a proper SSH + X11 Forwarding access (ssh -XY) or preferrible NoMachine. +If ssh does not work for you, please use NoMachine instead (which is the supported X based access, and simpler).

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin6/ansys-fluent.html b/public/merlin6/ansys-fluent.html new file mode 100644 index 0000000..b1c0e95 --- /dev/null +++ b/public/merlin6/ansys-fluent.html @@ -0,0 +1,924 @@ + + + + + + + + +ANSYS / Fluent | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    ANSYS / Fluent

    +
    + + + +
    + + +
    This document describes how to run ANSYS/Fluent in the Merlin6 cluster
    + + + + + + + +
    + + + + + + +

    This document describes the different ways for running ANSYS/Fluent

    + +

    ANSYS/Fluent

    + +

    Is always recommended to check which parameters are available in Fluent and adapt the below example according to your needs. +For that, run fluent -help for getting a list of options. However, as when running Fluent one must specify one of the +following flags:

    +
      +
    • 2d: This is a 2D solver with single point precision.
    • +
    • 3d: This is a 3D solver with single point precision.
    • +
    • 2dpp: This is a 2D solver with double point precision.
    • +
    • 3dpp: This is a 3D solver with double point precision.
    • +
    + +

    Running Fluent jobs

    + +

    PModules

    + +

    Is strongly recommended the use of the latest ANSYS software available in PModules.

    + +
    module use unstable
    +module load Pmodules/1.1.6
    +module use overlay_merlin
    +module load ANSYS/2022R1
    +
    + +

    Interactive: RSM from remote PSI Workstations

    + +

    Is possible to run Fluent through RSM from remote PSI (Linux or Windows) Workstation having a local installation of ANSYS Fluent and RSM client. +For that, please refer to the [ANSYS RSM](/merlin6/ansys-rsm.html) in the Merlin documentation for further information of how to setup a RSM client for submitting jobs to Merlin.

    + +

    Non-interactive: sbatch

    + +

    Running jobs with sbatch is always the recommended method. This makes the use of the resources more efficient. +For running it as a job, one needs to run in no graphical mode (-g option).

    + +

    Serial example

    + +

    This example shows a very basic serial job.

    + +
    #!/bin/bash
    +#SBATCH --job-name=Fluent    # Job Name
    +#SBATCH --partition=hourly   # Using 'daily' will grant higher priority than 'general'
    +#SBATCH --time=0-01:00:00    # Time needed for running the job. Must match with 'partition' limits.
    +#SBATCH --cpus-per-task=1    # Double if hyperthreading enabled
    +#SBATCH --hint=nomultithread # Disable Hyperthreading
    +#SBATCH --error=slurm-%j.err # Define your error file
    +
    +module use unstable
    +module load ANSYS/2020R1-1
    +
    +# [Optional:BEGIN] Specify your license server if this is not 'lic-ansys.psi.ch'
    +LICENSE_SERVER=<your_license_server>
    +export ANSYSLMD_LICENSE_FILE=1055@$LICENSE_SERVER
    +export ANSYSLI_SERVERS=2325@$LICENSE_SERVER
    +# [Optional:END]
    +
    +JOURNAL_FILE=/data/user/caubet_m/Fluent/myjournal.in
    +fluent 3ddp -g -i ${JOURNAL_FILE}
    +
    + +

    One can enable hypertheading by defining --hint=multithread, --cpus-per-task=2 and --ntasks-per-core=2. +However, this is in general not recommended, unless one can ensure that can be beneficial.

    + +

    MPI-based example

    + +

    An example for running Fluent using a Slurm batch script is the following:

    + +
    #!/bin/bash
    +#SBATCH --job-name=Fluent    # Job Name
    +#SBATCH --partition=hourly   # Using 'daily' will grant higher priority than 'general'
    +#SBATCH --time=0-01:00:00    # Time needed for running the job. Must match with 'partition' limits.
    +#SBATCH --nodes=1            # Number of nodes
    +#SBATCH --ntasks=44          # Number of tasks
    +#SBATCH --cpus-per-task=1    # Double if hyperthreading enabled
    +#SBATCH --ntasks-per-core=1  # Run one task per core
    +#SBATCH --hint=nomultithread # Disable Hyperthreading
    +#SBATCH --error=slurm-%j.err # Define a file for standard error messages
    +##SBATCH --exclusive         # Uncomment if you want exclusive usage of the nodes
    +
    +module use unstable
    +module load ANSYS/2020R1-1
    +
    +# [Optional:BEGIN] Specify your license server if this is not 'lic-ansys.psi.ch'
    +LICENSE_SERVER=<your_license_server>
    +export ANSYSLMD_LICENSE_FILE=1055@$LICENSE_SERVER
    +export ANSYSLI_SERVERS=2325@$LICENSE_SERVER
    +# [Optional:END]
    +
    +JOURNAL_FILE=/data/user/caubet_m/Fluent/myjournal.in
    +fluent 3ddp -g -t ${SLURM_NTASKS} -i ${JOURNAL_FILE}
    +
    + +

    In the above example, one can increase the number of nodes and/or ntasks if needed. One can remove +--nodes for running on multiple nodes, but may lead to communication overhead. In general, no +hyperthreading is recommended for MPI based jobs. Also, one can combine it with --exclusive when necessary.

    + +

    Interactive: salloc

    + +

    Running Fluent interactively is strongly not recommended and one should whenever possible use sbatch. +However, sometimes interactive runs are needed. For jobs requiring only few CPUs (in example, 2 CPUs) and for a short period of time, one can use the login nodes. +Otherwise, one must use the Slurm batch system using allocations:

    +
      +
    • For short jobs requiring more CPUs, one can use the Merlin shortest partitions (hourly).
    • +
    • For longer jobs, one can use longer partitions, however, interactive access is not always possible (depending on the usage of the cluster).
    • +
    + +

    Please refer to the documentation Running Interactive Jobs for firther information about different ways for running interactive +jobs in the Merlin6 cluster.

    + +

    Requirements

    + +

    SSH Keys

    + +

    Running Fluent interactively requires the use of SSH Keys. This is the way of communication between the GUI and the different nodes. For doing that, one must have +a passphrase protected SSH Key. If the user does not have SSH Keys yet (simply run ls $HOME/.ssh/ to check whether id_rsa files exist or not). For +deploying SSH Keys for running Fluent interactively, one should follow this documentation: Configuring SSH Keys

    + +

    List of hosts

    + +

    For running Fluent using Slurm computing nodes, one needs to get the list of the reserved nodes. For getting that list, once you have the allocation, one can run +the following command:

    + +
    scontrol show hostname
    +
    + +

    This list must be included in the settings as the list of hosts where to run Fluent. Alternatively, one can give that list as parameter (-cnf option) when running fluent, +as follows:

    + +
    +[Running Fluent with 'salloc' example] +
    +(base) [caubet_m@merlin-l-001 caubet_m]$ salloc --nodes=2 --ntasks=88 --hint=nomultithread --time=0-01:00:00 --partition=test $SHELL
    +salloc: Pending job allocation 135030174
    +salloc: job 135030174 queued and waiting for resources
    +salloc: job 135030174 has been allocated resources
    +salloc: Granted job allocation 135030174
    +
    +(base) [caubet_m@merlin-l-001 caubet_m]$ module use unstable
    +(
    +base) [caubet_m@merlin-l-001 caubet_m]$ module load ANSYS/2020R1-1
    +module load: unstable module has been loaded -- ANSYS/2020R1-1
    +
    +(base) [caubet_m@merlin-l-001 caubet_m]$ fluent 3ddp -t$SLURM_NPROCS -cnf=$(scontrol show hostname | tr '\n' ',')
    +
    +(base) [caubet_m@merlin-l-001 caubet_m]$ exit
    +exit
    +salloc: Relinquishing job allocation 135030174
    +salloc: Job allocation 135030174 has been revoked.
    +
    +
    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin6/ansys-hfss.html b/public/merlin6/ansys-hfss.html new file mode 100644 index 0000000..3102362 --- /dev/null +++ b/public/merlin6/ansys-hfss.html @@ -0,0 +1,898 @@ + + + + + + + + +ANSYS HFSS / ElectroMagnetics | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    ANSYS HFSS / ElectroMagnetics

    +
    + + + +
    + + +
    This document describes how to run ANSYS HFSS (ElectroMagnetics) in the Merlin6 cluster
    + + + + + + + +
    + + + + + + +

    This document describes the different ways for running ANSYS HFSS (ElectroMagnetics)

    + +

    ANSYS HFSS (ElectroMagnetics)

    + +

    This recipe is intended to show how to run ANSYS HFSS (ElectroMagnetics) in Slurm. +Having in mind that in general, running ANSYS HFSS means running ANSYS Electronics Desktop.

    + +

    Running HFSS / Electromagnetics jobs

    + +

    PModules

    + +

    Is necessary to run at least ANSYS software ANSYS/2022R1, which is available in PModules:

    + +
    module use unstable
    +module load Pmodules/1.1.6
    +module use overlay_merlin
    +module load ANSYS/2022R1
    +
    + +

    Remote job submission: HFSS RSM and SLURM

    + +

    Running jobs through Remote RSM or Slurm is the recommended way for running ANSYS HFSS.

    +
      +
    • HFSS RSM can be used from ANSYS HFSS installations running on Windows workstations at PSI (as long as are in the internal PSI network).
    • +
    • Slurm can be used when submitting directly from a Merlin login node (i.e. sbatch command or interactively from ANSYS Electronics Desktop)
    • +
    + +

    HFSS RSM (from remote workstations)

    + +

    Running jobs through Remote RSM is the way for running ANSYS HFSS when submitting from an ANSYS HFSS installation on a PSI Windows workstation. +A HFSS RSM service is running on each Merlin login node, and the listening port depends on the ANSYS EM version. Current support ANSYS EM RSM +release and associated listening ports are the following:

    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ANSYS versionLogin nodesListening port
    2022R1merlin-l-001 merlin-l-001 merlin-l-00132958
    2022R2merlin-l-001 merlin-l-001 merlin-l-00132959
    2023R2merlin-l-001 merlin-l-001 merlin-l-00132960
    + +

    Notice that by default ANSYS EM is listening on port 32958, this is the default for ANSYS/2022R1 only.

    +
      +
    • Workstations connecting to the Merlin ANSYS EM service must ensure that Electronics Desktop is connecting to the proper port.
    • +
    • In the same way, the ANSYS Workstation version must be the same as the version running on Merlin.
    • +
    + +

    Notice that HFSS RSM is not the same RSM provided for other ANSYS products. Therefore, the configuration is different from ANSYS RSM.

    + +

    To setup HFSS RSM for using it with the Merlin cluster, it must be done from the following ANSYS Electronics Desktop menu:

    + +
      +
    1. [Tools]->[Job Management]->[Select Scheduler]. +Select_Scheduler
    2. +
    3. In the new [Select scheduler] window, setup the following settings and Refresh: +RSM_Remote_Scheduler +
        +
      • Select Scheduler: Remote RSM.
      • +
      • Server: Add a Merlin login node.
      • +
      • User name: Add your Merlin username.
      • +
      • Password: Add you Merlin username password.
      • +
      + +

      Once refreshed, the Scheduler info box must provide Slurm information of the server (see above picture). If the box contains that information, then you can save changes (OK button).

      +
    4. +
    5. [Tools]->[Job Management]->[Submit Job…].
    6. +
    + +

    Submit_Job

    + +
      +
    1. In the new [Submite Job] window, you must specify the location of the ANSYS Electronics Desktop binary. +Product_Path +
        +
      • In example, for ANSYS/2022R1, the location is /data/software/pmodules/Tools/ANSYS/2021R1/v211/AnsysEM21.1/Linux64/ansysedt.exe:.
      • +
      +
    2. +
    + +

    HFSS Slurm (from login node only)

    + +

    Running jobs through Slurm from ANSYS Electronics Desktop is the way for running ANSYS HFSS when submitting from an ANSYS HFSS installation in a Merlin login node. ANSYS Electronics Desktop usually needs to be run from the Merlin NoMachine service, which currently runs on:

    +
      +
    • merlin-l-001.psi.ch
    • +
    • merlin-l-002.psi.ch
    • +
    + +

    Since the Slurm client is present in the login node (where ANSYS Electronics Desktop is running), the application will be able to detect and to submit directly to Slurm. Therefore, we only have to configure ANSYS Electronics Desktop to submit to Slurm. This can set as follows:

    + +
      +
    1. [Tools]->[Job Management]->[Select Scheduler]. +Select_Scheduler
    2. +
    3. In the new [Select scheduler] window, setup the following settings and Refresh: +RSM_Remote_Scheduler +
        +
      • Select Scheduler: Slurm.
      • +
      • Server: must point to localhost.
      • +
      • User name: must be empty.
      • +
      • Password: must be empty. + The Server, User name and Password boxes can’t be modified, but if value do not match with the above settings, they should be changed by selecting another Scheduler which allows editig these boxes (i.e. RSM Remote).
      • +
      + +

      Once refreshed, the Scheduler info box must provide Slurm information of the server (see above picture). If the box contains that information, then you can save changes (OK button).

      +
    4. +
    + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin6/ansys-mapdl.html b/public/merlin6/ansys-mapdl.html new file mode 100644 index 0000000..28579d9 --- /dev/null +++ b/public/merlin6/ansys-mapdl.html @@ -0,0 +1,921 @@ + + + + + + + + +ANSYS / MAPDL | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    ANSYS / MAPDL

    +
    + + + +
    + + +
    This document describes how to run ANSYS/Mechanical APDL in the Merlin6 cluster
    + + + + + + + +
    + + + + + + +

    This document describes the different ways for running ANSYS/Mechanical APDL

    + +

    ANSYS/Mechanical APDL

    + +

    Is always recommended to check which parameters are available in Mechanical APDL and adapt the below examples according to your needs. +For that, please refer to the official Mechanical APDL documentation.

    + +

    Running Mechanical APDL jobs

    + +

    PModules

    + +

    Is strongly recommended the use of the latest ANSYS software available in PModules.

    + +
    module use unstable
    +module load Pmodules/1.1.6
    +module use overlay_merlin
    +module load ANSYS/2022R1
    +
    + +

    Interactive: RSM from remote PSI Workstations

    + +

    Is possible to run Mechanical through RSM from remote PSI (Linux or Windows) Workstation having a local installation of ANSYS Mechanical and RSM client. +For that, please refer to the [ANSYS RSM](/merlin6/ansys-rsm.html) in the Merlin documentation for further information of how to setup a RSM client for submitting jobs to Merlin.

    + +

    Non-interactive: sbatch

    + +

    Running jobs with sbatch is always the recommended method. This makes the use of the resources more efficient. Notice that for +running non interactive Mechanical APDL jobs one must specify the -b option.

    + +

    Serial example

    + +

    This example shows a very basic serial job.

    + +
    #!/bin/bash
    +#SBATCH --job-name=MAPDL     # Job Name
    +#SBATCH --partition=hourly   # Using 'daily' will grant higher priority than 'general'
    +#SBATCH --time=0-01:00:00    # Time needed for running the job. Must match with 'partition' limits.
    +#SBATCH --cpus-per-task=1    # Double if hyperthreading enabled
    +#SBATCH --ntasks-per-core=1  # Double if hyperthreading enabled
    +#SBATCH --hint=nomultithread # Disable Hyperthreading
    +#SBATCH --error=slurm-%j.err # Define your error file
    +
    +module use unstable
    +module load ANSYS/2020R1-1
    +
    +# [Optional:BEGIN] Specify your license server if this is not 'lic-ansys.psi.ch'
    +LICENSE_SERVER=<your_license_server>
    +export ANSYSLMD_LICENSE_FILE=1055@$LICENSE_SERVER
    +export ANSYSLI_SERVERS=2325@$LICENSE_SERVER
    +# [Optional:END]
    +
    +SOLVER_FILE=/data/user/caubet_m/MAPDL/mysolver.in
    +mapdl -b -i "$SOLVER_FILE"
    +
    + +

    One can enable hypertheading by defining --hint=multithread, --cpus-per-task=2 and --ntasks-per-core=2. +However, this is in general not recommended, unless one can ensure that can be beneficial.

    + +

    SMP-based example

    + +

    This example shows how to running Mechanical APDL in Shared-Memory Parallelism mode. It limits the use +to 1 single node, but by using many cores. In the example below, we use a node by using all his cores +and the whole memory.

    + +
    #!/bin/bash
    +#SBATCH --job-name=MAPDL     # Job Name
    +#SBATCH --partition=hourly   # Using 'daily' will grant higher priority than 'general'
    +#SBATCH --time=0-01:00:00    # Time needed for running the job. Must match with 'partition' limits.
    +#SBATCH --nodes=1            # Number of nodes
    +#SBATCH --ntasks=1           # Number of tasks
    +#SBATCH --cpus-per-task=44   # Double if hyperthreading enabled
    +#SBATCH --hint=nomultithread # Disable Hyperthreading
    +#SBATCH --error=slurm-%j.err # Define a file for standard error messages
    +#SBATCH --exclusive          # Uncomment if you want exclusive usage of the nodes
    +
    +module use unstable
    +module load ANSYS/2020R1-1
    +
    +# [Optional:BEGIN] Specify your license server if this is not 'lic-ansys.psi.ch'
    +LICENSE_SERVER=<your_license_server>
    +export ANSYSLMD_LICENSE_FILE=1055@$LICENSE_SERVER
    +export ANSYSLI_SERVERS=2325@$LICENSE_SERVER
    +# [Optional:END]
    +
    +SOLVER_FILE=/data/user/caubet_m/MAPDL/mysolver.in
    +mapdl -b -np ${SLURM_CPUS_PER_TASK} -i "$SOLVER_FILE"
    +
    + +

    In the above example, one can reduce the number of cpus per task. Here usually --exclusive +is recommended if one needs to use the whole memory.

    + +

    For SMP runs, one might try the hyperthreading mode by doubling the proper settings +(--cpus-per-task), in some cases it might be beneficial.

    + +

    Please notice that --ntasks-per-core=1 is not defined here, this is because we want to run 1 +task on many cores! As an alternative, one can explore --ntasks-per-socket or --ntasks-per-node +for fine grained configurations.

    + +

    MPI-based example

    + +

    This example enables Distributed ANSYS for running Mechanical APDL using a Slurm batch script.

    + +
    #!/bin/bash
    +#SBATCH --job-name=MAPDL     # Job Name
    +#SBATCH --partition=hourly   # Using 'daily' will grant higher priority than 'general'
    +#SBATCH --time=0-01:00:00    # Time needed for running the job. Must match with 'partition' limits.
    +#SBATCH --nodes=1            # Number of nodes
    +#SBATCH --ntasks=44          # Number of tasks
    +#SBATCH --cpus-per-task=1    # Double if hyperthreading enabled
    +#SBATCH --ntasks-per-core=1  # Run one task per core
    +#SBATCH --hint=nomultithread # Disable Hyperthreading
    +#SBATCH --error=slurm-%j.err # Define a file for standard error messages
    +##SBATCH --exclusive         # Uncomment if you want exclusive usage of the nodes
    +
    +module use unstable
    +module load ANSYS/2020R1-1
    +
    +# [Optional:BEGIN] Specify your license server if this is not 'lic-ansys.psi.ch'
    +LICENSE_SERVER=<your_license_server>
    +export ANSYSLMD_LICENSE_FILE=1055@$LICENSE_SERVER
    +export ANSYSLI_SERVERS=2325@$LICENSE_SERVER
    +# [Optional:END]
    +
    +SOLVER_FILE=input.dat
    +
    +# INTELMPI=no  for IBM MPI
    +# INTELMPI=yes for INTEL MPI
    +INTELMPI=no
    +
    +if [ "$INTELMPI" == "yes" ]
    +then
    +  # When using -mpi=intelmpi, KMP Affinity must be disabled
    +  export KMP_AFFINITY=disabled
    +
    +  # INTELMPI is not aware about distribution of tasks. 
    +  #   - We need to define tasks distribution.
    +  HOSTLIST=$(srun hostname | sort | uniq -c | awk '{print $2 ":" $1}' | tr '\n' ':' | sed 's/:$/\n/g')
    +  mapdl -b -dis -mpi intelmpi -machines $HOSTLIST -np ${SLURM_NTASKS} -i "$SOLVER_FILE"
    +else
    +  # IBMMPI (default) will be aware of the distribution of tasks. 
    +  #   - In principle, no need to force tasks distribution
    +  mapdl -b -dis -mpi ibmmpi -np ${SLURM_NTASKS} -i "$SOLVER_FILE"
    +fi
    +
    + +

    In the above example, one can increase the number of nodes and/or ntasks if needed and combine it +with --exclusive when necessary. In general, no hypertheading is recommended for MPI based jobs. +Also, one can combine it with --exclusive when necessary.

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin6/ansys-rsm.html b/public/merlin6/ansys-rsm.html new file mode 100644 index 0000000..84c04ed --- /dev/null +++ b/public/merlin6/ansys-rsm.html @@ -0,0 +1,889 @@ + + + + + + + + +ANSYS RSM (Remote Resolve Manager) | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    ANSYS RSM (Remote Resolve Manager)

    +
    + + + +
    + + +
    This document describes how to use the ANSYS Remote Resolve Manager service in the Merlin6 cluster
    + + + + + + + +
    + + + + + + +

    ANSYS Remote Resolve Manager

    + +

    ANSYS Remote Solve Manager (RSM) is used by ANSYS Workbench to submit computational jobs to HPC clusters directly from Workbench on your desktop. +Therefore, PSI workstations with direct access to Merlin can submit jobs by using RSM.

    + +

    Users are responsible for requesting possible necessary network access and debugging any possible connectivity problem with the cluster. +In example, in case that the workstation is behind a firewall, users would need to request a firewall rule to enable access to Merlin.

    + + + +

    The Merlin6 RSM service

    + +

    A RSM service is running on each login node. This service will listen a specific port and will process any request using RSM (in example, from ANSYS users workstations). +The following login nodes are configured with such services:

    +
      +
    • merlin-l-01.psi.ch
    • +
    • merlin-l-001.psi.ch
    • +
    • merlin-l-002.psi.ch
    • +
    + +

    Each ANSYS release installed in /data/software/pmodules/ANSYS should have its own RSM service running (the listening port is the default one set by that ANSYS release). With the following command users can check which ANSYS releases have an RSM instance running:

    + +
    systemctl | grep pli-ansys-rsm-v[0-9][0-9][0-9].service
    +
    + +
    +[Example] Listing RSM service running on merlin-l-001.psi.ch +
    +(base) ❄ [caubet_m@merlin-l-001:/data/user/caubet_m]# systemctl | grep pli-ansys-rsm-v[0-9][0-9][0-9].service
    +  pli-ansys-rsm-v195.service                         loaded active     exited    PSI ANSYS RSM v195
    +  pli-ansys-rsm-v202.service                         loaded active     exited    PSI ANSYS RSM v202
    +  pli-ansys-rsm-v211.service                         loaded active     exited    PSI ANSYS RSM v211
    +  pli-ansys-rsm-v212.service                         loaded active     exited    PSI ANSYS RSM v212
    +  pli-ansys-rsm-v221.service                         loaded active     exited    PSI ANSYS RSM v221
    +
    +
    + +

    Configuring RSM client on Windows workstations

    + +

    Users can setup ANSYS RSM in their workstations to connect to the Merlin6 cluster. +The different steps and settings required to make it work are that following:

    + +
      +
    1. Open the RSM Configuration service in Windows for the ANSYS release you want to configure.
    2. +
    3. Right-click the HPC Resources icon followed by Add HPC Resource… +Adding a new HPC Resource
    4. +
    5. In the HPC Resource tab, fill up the corresponding fields as follows: +HPC Resource +
        +
      • “Name”: Add here the preffered name for the cluster. In example: Merlin6 cluster - merlin-l-001
      • +
      • “HPC Type”: Select SLURM
      • +
      • “Submit host”: Add one of the login nodes. In example merlin-l-001.
      • +
      • “Slurm Job submission arguments (optional)”: Add any required Slurm options for running your jobs. +
          +
        • In general, --hint=nomultithread should be at least present.
        • +
        +
      • +
      • Check “Use SSH protocol for inter and intra-node communication (Linux only)”
      • +
      • Select “Able to directly submit and monitor HPC jobs”.
      • +
      • “Apply” changes.
      • +
      +
    6. +
    7. In the “File Management” tab, fill up the corresponding fields as follows: +File Management +
        +
      • Select “RSM internal file transfer mechanism” and add /shared-scratch as the “Staging directory path on Cluster”
      • +
      • Select “Scratch directory local to the execution node(s)” and add /scratch as the HPC scratch directory.
      • +
      • Never check the option “Keep job files in the staging directory when job is complete” if the previous +option “Scratch directory local to the execution node(s)” was set.
      • +
      • “Apply” changes.
      • +
      +
    8. +
    9. In the “Queues” tab, use the left button to auto-discover partitions +Queues +
        +
      • If no authentication method was configured before, an authentication window will appear. Use your +PSI account to authenticate. Notice that the PSICH\ prefix must not be added. +Authenticating
      • +
      • From the partition list, select the ones you want to typically use. +
          +
        • In general, standard Merlin users must use hourly, daily and general only.
        • +
        • Other partitions are reserved for allowed users only.
        • +
        +
      • +
      • “Apply” changes. +Select partitions
      • +
      +
    10. +
    11. [Optional] You can perform a test by submitting a test job on each partition by clicking on the Submit button +for each selected partition.
    12. +
    + + + +

    Using RSM in ANSYS

    + +

    Using the RSM service in ANSYS is slightly different depending on the ANSYS software being used. +Please follow the official ANSYS documentation for details about how to use it for that specific software.

    + +

    Alternativaly, please refer to some the examples showed in the following chapters (ANSYS specific software).

    + +

    Using RSM in ANSYS Fluent

    + +

    For further information for using RSM with Fluent, please visit the ANSYS RSM section.

    + +

    Using RSM in ANSYS CFX

    + +

    For further information for using RSM with CFX, please visit the ANSYS RSM section.

    + +

    Using RSM in ANSYS MAPDL

    + +

    For further information for using RSM with MAPDL, please visit the ANSYS RSM section.

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin6/ansys.html b/public/merlin6/ansys.html new file mode 100644 index 0000000..302720e --- /dev/null +++ b/public/merlin6/ansys.html @@ -0,0 +1,852 @@ + + + + + + + + +ANSYS | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    ANSYS

    +
    + + + +
    + + +
    This document describes how to load and use ANSYS in the Merlin6 cluster
    + + + + + + + +
    + + + + + + +

    This document describes generic information of how to load and run ANSYS software in the Merlin cluster

    + +

    ANSYS software in Pmodules

    + +

    The ANSYS software can be loaded through PModules.

    + +

    The default ANSYS versions are loaded from the central PModules repository. +However, there are some known problems that can pop up when using some specific ANSYS packages in advanced mode. +Due to this, and also to improve the interactive experience of the user, ANSYS has been also installed in the +Merlin high performance storage and we have made it available from Pmodules.

    + +

    Loading Merlin6 ANSYS

    + +

    For loading the Merlin6 ANSYS software, one needs to run Pmodules v1.1.4 or newer, and then use a specific repository +(called overlay_merlin) which is only available from the Merlin cluster:

    + +
    module load Pmodules/1.1.6
    +module use overlay_merlin
    +
    + +

    Once overlay_merlin is invoked, it will disable central ANSYS installations with the same version, which will be replaced +by the local ones in Merlin. Releases from the central Pmodules repository which have not a local installation will remain +visible. For each ANSYS release, one can identify where it is installed by searching ANSYS in PModules with the --verbose +option. This will show the location of the different ANSYS releases as follows:

    +
      +
    • For ANSYS releases installed in the central repositories, the path starts with /opt/psi
    • +
    • For ANSYS releases installed in the Merlin6 repository (and/or overwritting the central ones), the path starts with /data/software/pmodules
    • +
    + +
    +[Example] Loading ANSYS from the Merlin6 PModules repository +
    +(base) ❄ [caubet_m@merlin-l-001:/data/user/caubet_m]# module load Pmodules/1.1.6
    +module load: unstable module has been loaded -- Pmodules/1.1.6
    +
    +(base) ❄ [caubet_m@merlin-l-001:/data/user/caubet_m]# module use merlin_overlay
    +
    +(base) ❄ [caubet_m@merlin-l-001:/data/user/caubet_m]# module search ANSYS --verbose
    +
    +Module         Rel.stage  Group        Dependencies/Modulefile
    +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    +ANSYS/2019R3   stable     Tools        dependencies: 
    +                                       modulefile:   /data/software/pmodules/Tools/modulefiles/ANSYS/2019R3
    +ANSYS/2020R1   stable     Tools        dependencies: 
    +                                       modulefile:   /opt/psi/Tools/modulefiles/ANSYS/2020R1
    +ANSYS/2020R1-1 stable     Tools        dependencies: 
    +                                       modulefile:   /opt/psi/Tools/modulefiles/ANSYS/2020R1-1
    +ANSYS/2020R2   stable     Tools        dependencies: 
    +                                       modulefile:   /data/software/pmodules/Tools/modulefiles/ANSYS/2020R2
    +ANSYS/2021R1   stable     Tools        dependencies: 
    +                                       modulefile:   /data/software/pmodules/Tools/modulefiles/ANSYS/2021R1
    +ANSYS/2021R2   stable     Tools        dependencies: 
    +                                       modulefile:   /data/software/pmodules/Tools/modulefiles/ANSYS/2021R2
    +
    +
    + + + +

    ANSYS Documentation by product

    + +

    ANSYS RSM

    + +

    ANSYS Remote Solve Manager (RSM) is used by ANSYS Workbench to submit computational jobs to HPC clusters directly from Workbench on your desktop. +Therefore, PSI workstations with direct access to Merlin can submit jobs by using RSM.

    + +

    For further information, please visit the ANSYS RSM section.

    + +

    ANSYS Fluent

    + +

    For further information, please visit the ANSYS RSM section.

    + +

    ANSYS CFX

    + +

    For further information, please visit the ANSYS RSM section.

    + +

    ANSYS MAPDL

    + +

    For further information, please visit the ANSYS RSM section.

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin6/archive.html b/public/merlin6/archive.html new file mode 100644 index 0000000..fa16933 --- /dev/null +++ b/public/merlin6/archive.html @@ -0,0 +1,1161 @@ + + + + + + + + +Archive & PSI Data Catalog | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Archive & PSI Data Catalog

    +
    + + + +
    + + +
    This document describes how to use the PSI Data Catalog for archiving Merlin6 data.
    + + + + + + + +
    + + + + + + +

    PSI Data Catalog as a PSI Central Service

    + +

    PSI provides access to the Data Catalog for long-term data storage and retrieval. Data is +stored on the PetaByte Archive at the Swiss National Supercomputing Centre (CSCS).

    + +

    The Data Catalog and Archive is suitable for:

    + +
      +
    • Raw data generated by PSI instruments
    • +
    • Derived data produced by processing some inputs
    • +
    • Data required to reproduce PSI research and publications
    • +
    + +

    The Data Catalog is part of PSI’s effort to conform to the FAIR principles for data management. +In accordance with this policy, data will be publicly released under CC-BY-SA 4.0 after an +embargo period expires.

    + +

    The Merlin cluster is connected to the Data Catalog. Hence, users archive data stored in the +Merlin storage under the /data directories (currentlyi, /data/user and /data/project). +Archiving from other directories is also possible, however the process is much slower as data +can not be directly retrieved by the PSI archive central servers (central mode), and needs to +be indirectly copied to these (decentral mode).

    + +

    Archiving can be done from any node accessible by the users (usually from the login nodes).

    + + + +

    Procedure

    + +

    Overview

    + +

    Below are the main steps for using the Data Catalog.

    + +
      +
    • Ingest the dataset into the Data Catalog. This makes the data known to the Data Catalog system at PSI: +
        +
      • Prepare a metadata file describing the dataset
      • +
      • Run datasetIngestor script
      • +
      • If necessary, the script will copy the data to the PSI archive servers +
          +
        • Usually this is necessary when archiving from directories other than /data/user or +/data/project. It would be also necessary when the Merlin export server (merlin-archive.psi.ch) +is down for any reason.
        • +
        +
      • +
      +
    • +
    • Archive the dataset: +
        +
      • Visit https://discovery.psi.ch
      • +
      • Click Archive for the dataset
      • +
      • The system will now copy the data to the PetaByte Archive at CSCS
      • +
      +
    • +
    • Retrieve data from the catalog: +
        +
      • Find the dataset on https://discovery.psi.ch and click Retrieve
      • +
      • Wait for the data to be copied to the PSI retrieval system
      • +
      • Run datasetRetriever script
      • +
      +
    • +
    + +

    Since large data sets may take a lot of time to transfer, some steps are designed to happen in the +background. The discovery website can be used to track the progress of each step.

    + +

    Account Registration

    + +

    Two types of account permit access to the Data Catalog. If your data was collected at a beamline, you may +have been assigned a p-group (e.g. p12345) for the experiment. Other users are assigned a-group +(e.g. a-12345).

    + +

    Groups are usually assigned to a PI, and then individual user accounts are added to the group. This must be done +under user request through PSI Service Now. For existing a-groups and p-groups, you can follow the standard +central procedures. Alternatively, if you do not know how to do that, follow the Merlin6 +Requesting extra Unix groups procedure, or open +a PSI Service Now ticket.

    + +

    Documentation

    + +

    Accessing the Data Catalog is done through the SciCat software. +Documentation is here: ingestManual.

    + +

    Loading datacatalog tools

    + +

    The latest datacatalog software is maintained in the PSI module system. To access it from the Merlin systems, run the following command:

    + +
    module load datacatalog
    +
    + +

    It can be done from any host in the Merlin cluster accessible by users. Usually, login nodes will be the nodes used for archiving.

    + +

    Finding your token

    + +

    As of 2022-04-14 a secure token is required to interact with the data catalog. This is a long random string that replaces the previous user/password authentication (allowing access for non-PSI use cases). This string should be treated like a password and not shared.

    + +
      +
    1. Go to discovery.psi.ch
    2. +
    3. Click ‘Sign in’ in the top right corner. Click the ‘Login with PSI account’ and log in on the PSI login1. page.
    4. +
    5. You should be redirected to your user settings and see a ‘User Information’ section. If not, click on1. your username in the top right and choose ‘Settings’ from the menu.
    6. +
    7. Look for the field ‘Catamel Token’. This should be a 64-character string. Click the icon to copy the1. token.
    8. +
    + +

    SciCat website

    + +

    You will need to save this token for later steps. To avoid including it in all the commands, I suggest saving it to an environmental variable (Linux):

    + +
    $  SCICAT_TOKEN=RqYMZcqpqMJqluplbNYXLeSyJISLXfnkwlfBKuvTSdnlpKkU
    +
    + +

    (Hint: prefix this line with a space to avoid saving the token to your bash history.)

    + +

    Tokens expire after 2 weeks and will need to be fetched from the website again.

    + +

    Ingestion

    + +

    The first step to ingesting your data into the catalog is to prepare a file describing what data you have. This is called +metadata.json, and can be created with a text editor (e.g. vim). It can in principle be saved anywhere, +but keeping it with your archived data is recommended. For more information about the format, see the ‘Bio metadata’ +section below. An example follows:

    + +
    {
    +    "principalInvestigator": "albrecht.gessler@psi.ch",
    +    "creationLocation": "/PSI/EMF/JEOL2200FS",
    +    "dataFormat": "TIFF+LZW Image Stack",
    +    "sourceFolder": "/gpfs/group/LBR/pXXX/myimages",
    +    "owner": "Wilhelm Tell",
    +    "ownerEmail": "wilhelm.tell@psi.ch",
    +    "type": "raw",
    +    "description": "EM micrographs of amygdalin",
    +    "ownerGroup": "a-12345",
    +    "scientificMetadata": {
    +        "description": "EM micrographs of amygdalin",
    +        "sample": {
    +            "name": "Amygdalin beta-glucosidase 1",
    +            "uniprot": "P29259",
    +            "species": "Apple"
    +        },
    +        "dataCollection": {
    +            "date": "2018-08-01"
    +        },
    +        "microscopeParameters": {
    +            "pixel size": {
    +                "v": 0.885,
    +                "u": "A"
    +            },
    +            "voltage": {
    +                "v": 200,
    +                "u": "kV"
    +            },
    +            "dosePerFrame": {
    +                "v": 1.277,
    +                "u": "e/A2"
    +            }
    +        }
    +    }
    +}
    +
    + +

    It is recommended to use the ScicatEditor for creating metadata files. This is a browser-based tool specifically for ingesting PSI data. Using the tool avoids syntax errors and provides templates for common data sets and options. The finished JSON file can then be downloaded to merlin or copied into a text editor.

    + +

    Another option is to use the SciCat graphical interface from NoMachine. This provides a graphical interface for selecting data to archive. This is particularly useful for data associated with a DUO experiment and p-group. Type SciCat to get started after loading the datacatalog`` module. The GUI also replaces the the command-line ingestion described below.

    + +

    The following steps can be run from wherever you saved your metadata.json. First, perform a “dry-run” which will check the metadata for errors:

    + +
    datasetIngestor --token $SCICAT_TOKEN metadata.json
    +
    + +

    It will ask for your PSI credentials and then print some info about the data to be ingested. If there are no errors, proceed to the real ingestion:

    + +
    datasetIngestor --token $SCICAT_TOKEN --ingest --autoarchive metadata.json
    +
    + +

    You will be asked whether you want to copy the data to the central system:

    + +
      +
    • If you are on the Merlin cluster and you are archiving data from /data/user or /data/project, answer ‘no’ since the data catalog can +directly read the data.
    • +
    • If you are on a directory other than /data/user and ``/data/project, or you are on a desktop computer, answer ‘yes’. Copying large datasets +to the PSI archive system may take quite a while (minutes to hours).
    • +
    + +

    If there are no errors, your data has been accepted into the data catalog! From now on, no changes should be made to the ingested data. +This is important, since the next step is for the system to copy all the data to the CSCS Petabyte archive. Writing to tape is slow, so +this process may take several days, and it will fail if any modifications are detected.

    + +

    If using the --autoarchive option as suggested above, your dataset should now be in the queue. Check the data catalog: +https://discovery.psi.ch. Your job should have status ‘WorkInProgress’. You will receive an email when the ingestion +is complete.

    + +

    If you didn’t use --autoarchive, you need to manually move the dataset into the archive queue. From discovery.psi.ch, navigate to the ‘Archive’ +tab. You should see the newly ingested dataset. Check the dataset and click Archive. You should see the status change from datasetCreated to +scheduleArchiveJob. This indicates that the data is in the process of being transferred to CSCS.

    + +

    After a few days the dataset’s status will change to datasetOnAchive indicating the data is stored. At this point it is safe to delete the data.

    + +

    Useful commands

    + +

    Running the datasetIngestor in dry mode (without --ingest) finds most errors. However, it is sometimes convenient to find potential errors +yourself with simple unix commands.

    + +

    Find problematic filenames

    + +
    find . -iregex '.*/[^/]*[^a-zA-Z0-9_ ./-][^/]*'=
    +
    + +

    Find broken links

    + +
    find -L . -type l
    +
    + +

    Find outside links

    + +
    find . -type l -exec bash -c 'realpath --relative-base "`pwd`" "$0" 2>/dev/null |egrep "^[./]" |sed "s|^|$0 ->|" ' '{}' ';'
    +
    + +

    Delete certain files (use with caution)

    + +
    # Empty directories
    +find . -type d -empty -delete
    +# Backup files
    +find . -name '*~' -delete
    +find . -name '*#autosave#' -delete
    +
    + +

    Troubleshooting & Known Bugs

    + +
      +
    • +

      The following message can be safely ignored:

      + +
       key_cert_check_authority: invalid certificate
      + Certificate invalid: name is not a listed principal
      +
      +

      It indicates that no kerberos token was provided for authentication. You can avoid the warning by first running kinit (PSI linux systems).

      +
    • +
    • +

      For decentral ingestion cases, the copy step is indicated by a message Running [/usr/bin/rsync -e ssh -avxz .... It is expected that this +step will take a long time and may appear to have hung. You can check what files have been successfully transfered using rsync:

      + +
       rsync --list-only user_n@pb-archive.psi.ch:archive/UID/PATH/
      +
      + +

      where UID is the dataset ID (12345678-1234-1234-1234-123456789012) and PATH is the absolute path to your data. Note that rsync creates directories first and that the transfer order is not alphabetical in some cases, but it should be possible to see whether any data has transferred.

      +
    • +
    • +

      There is currently a limit on the number of files per dataset (technically, the limit is from the total length of all file paths). It is recommended to break up datasets into 300’000 files or less.

      +
        +
      • +

        If it is not possible or desirable to split data between multiple datasets, an alternate work-around is to package files into a tarball. For datasets which are already compressed, omit the -z option for a considerable speedup:

        + +
        tar -f [output].tar [srcdir]
        +
        + +

        Uncompressed data can be compressed on the cluster using the following command:

        + +
        sbatch /data/software/Slurm/Utilities/Parallel_TarGz.batch -s [srcdir] -t [output].tar -n
        +
        + +

        Run /data/software/Slurm/Utilities/Parallel_TarGz.batch -h for more details and options.

        +
      • +
      +
    • +
    + +

    Sample ingestion output (datasetIngestor 1.1.11)

    +
    +[Show Example]: Sample ingestion output (datasetIngestor 1.1.11) +
    +/data/project/bio/myproject/archive $ datasetIngestor -copy -autoarchive -allowexistingsource -ingest metadata.json
    +2019/11/06 11:04:43 Latest version: 1.1.11
    +
    +
    +2019/11/06 11:04:43 Your version of this program is up-to-date
    +2019/11/06 11:04:43 You are about to add a dataset to the === production === data catalog environment...
    +2019/11/06 11:04:43 Your username:
    +user_n
    +2019/11/06 11:04:48 Your password:
    +2019/11/06 11:04:52 User authenticated: XXX
    +2019/11/06 11:04:52 User is member in following a or p groups: XXX
    +2019/11/06 11:04:52 OwnerGroup information a-XXX verified successfully.
    +2019/11/06 11:04:52 contactEmail field added: XXX
    +2019/11/06 11:04:52 Scanning files in dataset /data/project/bio/myproject/archive
    +2019/11/06 11:04:52 No explicit filelistingPath defined - full folder /data/project/bio/myproject/archive is used.
    +2019/11/06 11:04:52 Source Folder: /data/project/bio/myproject/archive at /data/project/bio/myproject/archive
    +2019/11/06 11:04:57 The dataset contains 100000 files with a total size of 50000000000 bytes.
    +2019/11/06 11:04:57 creationTime field added: 2019-07-29 18:47:08 +0200 CEST
    +2019/11/06 11:04:57 endTime field added: 2019-11-06 10:52:17.256033 +0100 CET
    +2019/11/06 11:04:57 license field added: CC BY-SA 4.0
    +2019/11/06 11:04:57 isPublished field added: false
    +2019/11/06 11:04:57 classification field added: IN=medium,AV=low,CO=low
    +2019/11/06 11:04:57 Updated metadata object:
    +{
    +    "accessGroups": [
    +        "XXX"
    +    ],
    +    "classification": "IN=medium,AV=low,CO=low",
    +    "contactEmail": "XXX",
    +    "creationLocation": "XXX",
    +    "creationTime": "2019-07-29T18:47:08+02:00",
    +    "dataFormat": "XXX",
    +    "description": "XXX",
    +    "endTime": "2019-11-06T10:52:17.256033+01:00",
    +    "isPublished": false,
    +    "license": "CC BY-SA 4.0",
    +    "owner": "XXX",
    +    "ownerEmail": "XXX",
    +    "ownerGroup": "a-XXX",
    +    "principalInvestigator": "XXX",
    +    "scientificMetadata": {
    +...
    +    },
    +    "sourceFolder": "/data/project/bio/myproject/archive",
    +    "type": "raw"
    +}
    +2019/11/06 11:04:57 Running [/usr/bin/ssh -l user_n pb-archive.psi.ch test -d /data/project/bio/myproject/archive].
    +key_cert_check_authority: invalid certificate
    +Certificate invalid: name is not a listed principal
    +user_n@pb-archive.psi.ch's password:
    +2019/11/06 11:05:04 The source folder /data/project/bio/myproject/archive is not centrally available (decentral use case).
    +The data must first be copied to a rsync cache server.
    +
    +
    +2019/11/06 11:05:04 Do you want to continue (Y/n)?
    +Y
    +2019/11/06 11:05:09 Created dataset with id 12.345.67890/12345678-1234-1234-1234-123456789012
    +2019/11/06 11:05:09 The dataset contains 108057 files.
    +2019/11/06 11:05:10 Created file block 0 from file 0 to 1000 with total size of 413229990 bytes
    +2019/11/06 11:05:10 Created file block 1 from file 1000 to 2000 with total size of 416024000 bytes
    +2019/11/06 11:05:10 Created file block 2 from file 2000 to 3000 with total size of 416024000 bytes
    +2019/11/06 11:05:10 Created file block 3 from file 3000 to 4000 with total size of 416024000 bytes
    +...
    +2019/11/06 11:05:26 Created file block 105 from file 105000 to 106000 with total size of 416024000 bytes
    +2019/11/06 11:05:27 Created file block 106 from file 106000 to 107000 with total size of 416024000 bytes
    +2019/11/06 11:05:27 Created file block 107 from file 107000 to 108000 with total size of 850195143 bytes
    +2019/11/06 11:05:27 Created file block 108 from file 108000 to 108057 with total size of 151904903 bytes
    +2019/11/06 11:05:27 short dataset id: 0a9fe316-c9e7-4cc5-8856-e1346dd31e31
    +2019/11/06 11:05:27 Running [/usr/bin/rsync -e ssh -avxz /data/project/bio/myproject/archive/ user_n@pb-archive.psi.ch:archive
    +/0a9fe316-c9e7-4cc5-8856-e1346dd31e31/data/project/bio/myproject/archive].
    +key_cert_check_authority: invalid certificate
    +Certificate invalid: name is not a listed principal
    +user_n@pb-archive.psi.ch's password:
    +Permission denied, please try again.
    +user_n@pb-archive.psi.ch's password:
    +/usr/libexec/test_acl.sh: line 30: /tmp/tmpacl.txt: Permission denied
    +/usr/libexec/test_acl.sh: line 30: /tmp/tmpacl.txt: Permission denied
    +/usr/libexec/test_acl.sh: line 30: /tmp/tmpacl.txt: Permission denied
    +/usr/libexec/test_acl.sh: line 30: /tmp/tmpacl.txt: Permission denied
    +/usr/libexec/test_acl.sh: line 30: /tmp/tmpacl.txt: Permission denied
    +...
    +2019/11/06 12:05:08 Successfully updated {"pid":"12.345.67890/12345678-1234-1234-1234-123456789012",...}
    +2019/11/06 12:05:08 Submitting Archive Job for the ingested datasets.
    +2019/11/06 12:05:08 Job response Status: okay
    +2019/11/06 12:05:08 A confirmation email will be sent to XXX
    +12.345.67890/12345678-1234-1234-1234-123456789012
    +
    +
    + +

    Publishing

    + +

    After datasets are are ingested they can be assigned a public DOI. This can be included in publications and will make the datasets on http://doi.psi.ch.

    + +

    For instructions on this, please read the ‘Publish’ section in the ingest manual.

    + +

    Retrieving data

    + +

    Retrieving data from the archive is also initiated through the Data Catalog. Please read the ‘Retrieve’ section in the ingest manual.

    + +

    Further Information

    + + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin6/cluster-introduction.html b/public/merlin6/cluster-introduction.html new file mode 100644 index 0000000..4603389 --- /dev/null +++ b/public/merlin6/cluster-introduction.html @@ -0,0 +1,792 @@ + + + + + + + + +Introduction | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Introduction

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    Slurm clusters

    + +
      +
    • The new Slurm CPU cluster is called merlin6.
    • +
    • The new Slurm GPU cluster is called gmerlin6
    • +
    • The old Slurm merlin cluster is still active and best effort support is provided. +The cluster, was renamed as merlin5.
    • +
    + +

    From July 2019, merlin6 becomes the default Slurm cluster and any job submitted from the login node will be submitted to that cluster if not .

    +
      +
    • Users can keep submitting to the old merlin5 computing nodes by using the option --cluster=merlin5.
    • +
    • Users submitting to the gmerlin6 GPU cluster need to specify the option --cluster=gmerlin6.
    • +
    + +

    Slurm ‘merlin6’

    + +

    CPU nodes are configured in a Slurm cluster, called merlin6, and +this is the default Slurm cluster. Hence, by default, if no Slurm cluster is +specified (with the --cluster option), this will be the cluster to which the jobs +will be sent.

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin6/code-of-conduct.html b/public/merlin6/code-of-conduct.html new file mode 100644 index 0000000..f012c81 --- /dev/null +++ b/public/merlin6/code-of-conduct.html @@ -0,0 +1,838 @@ + + + + + + + + +Code Of Conduct | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Code Of Conduct

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    The Basic principle

    + +

    The basic principle is courtesy and consideration for other users.

    + +
      +
    • Merlin6 is a system shared by many users, therefore you are kindly requested to apply common courtesy in using its resources. Please follow our guidelines which aim at providing and maintaining an efficient compute environment for all our users.
    • +
    • Basic shell programming skills are an essential requirement in a Linux/UNIX HPC cluster environment; a proficiency in shell programming is greatly beneficial.
    • +
    + +

    Interactive nodes

    + +
      +
    • The interactive nodes (also known as login nodes) are for development and quick testing: +
        +
      • It is strictly forbidden to run production jobs on the login nodes. All production jobs must be submitted to the batch system.
      • +
      • It is forbidden to run long processes occupying big parts of a login node’s resources.
      • +
      • According to the previous rules, misbehaving running processes will have to be killed. +in order to keep the system responsive for other users.
      • +
      +
    • +
    + +

    Batch system

    + +
      +
    • Make sure that no broken or run-away processes are left when your job is done. Keep the process space clean on all nodes.
    • +
    • During the runtime of a job, it is mandatory to use the /scratch and /shared-scratch partitions for temporary data: +
        +
      • It is forbidden to use the /data/user, /data/project or /psi/home/ for that purpose.
      • +
      • Always remove files you do not need any more (e.g. core dumps, temporary files) as early as possible. Keep the disk space clean on all nodes.
      • +
      • Prefer /scratch over /shared-scratch and use the latter only when you require the temporary files to be visible from multiple nodes.
      • +
      +
    • +
    • Read the description in Merlin6 directory structure for learning about the correct usage of each partition type.
    • +
    + +

    User and project data

    + +
      +
    • Users are responsible for backing up their own data. Is recommended to backup the data on third party independent systems (i.e. LTS, Archive, AFS, SwitchDrive, Windows Shares, etc.). +
        +
      • /psi/home, as this contains a small amount of data, is the only directory where we can provide daily snapshots for one week. This can be found in the following directory /psi/home/.snapshot/
      • +
      +
    • +
    • When a user leaves PSI, she or her supervisor/team are responsible to backup and move the data out from the cluster: every few months, the storage space will be recycled for those old users who do not have an existing and valid PSI account.
    • +
    + + + +

    System Administrator Rights

    + +
      +
    • The system administrator has the right to temporarily block the access to Merlin6 for an account violating the Code of Conduct in order to maintain the efficiency and stability of the system. +
        +
      • Repetitive violations by the same user will be escalated to the user’s supervisor.
      • +
      +
    • +
    • The system administrator has the right to delete files in the scratch directories +
        +
      • after a job, if the job failed to clean up its files.
      • +
      • during the job in order to prevent a job from destabilizing a node or multiple nodes.
      • +
      +
    • +
    • The system administrator has the right to kill any misbehaving running processes.
    • +
    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin6/connect-from-linux.html b/public/merlin6/connect-from-linux.html new file mode 100644 index 0000000..247a718 --- /dev/null +++ b/public/merlin6/connect-from-linux.html @@ -0,0 +1,815 @@ + + + + + + + + +Connecting from a Linux Client | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Connecting from a Linux Client

    +
    + + + +
    + + +
    This document describes a recommended setup for a Linux client.
    + + + + + + + +
    + + + + + + +

    SSH without X11 Forwarding

    + +

    This is the standard method. Official X11 support is provided through NoMachine. +For normal SSH sessions, use your SSH client as follows:

    + +
    ssh $username@merlin-l-01.psi.ch
    +ssh $username@merlin-l-001.psi.ch
    +ssh $username@merlin-l-002.psi.ch
    +
    + +

    SSH with X11 Forwarding

    + +

    Official X11 Forwarding support is through NoMachine. Please follow the document +{Job Submission -> Interactive Jobs} and +{Accessing Merlin -> NoMachine} for more details. However, +we provide a small recipe for enabling X11 Forwarding in Linux.

    + +
      +
    • +

      For enabling client X11 forwarding, add the following to the start of ~/.ssh/config +to implicitly add -X to all ssh connections:

      + +
       ForwardAgent yes
      + ForwardX11Trusted yes
      +
      +
    • +
    • +

      Alternatively, you can add the option -Y to the ssh command. In example:

      + +
       ssh -X $username@merlin-l-01.psi.ch
      + ssh -X $username@merlin-l-001.psi.ch
      + ssh -X $username@merlin-l-002.psi.ch
      +
      +
    • +
    • +

      For testing that X11 forwarding works, just run xclock. A X11 based clock should +popup in your client session:

      + +
       xclock
      +
      +
    • +
    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin6/connect-from-macos.html b/public/merlin6/connect-from-macos.html new file mode 100644 index 0000000..ebe0e77 --- /dev/null +++ b/public/merlin6/connect-from-macos.html @@ -0,0 +1,826 @@ + + + + + + + + +Connecting from a MacOS Client | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Connecting from a MacOS Client

    +
    + + + +
    + + +
    This document describes a recommended setup for a MacOS client.
    + + + + + + + +
    + + + + + + +

    SSH without X11 Forwarding

    + +

    This is the standard method. Official X11 support is provided through NoMachine. +For normal SSH sessions, use your SSH client as follows:

    + +
    ssh $username@merlin-l-01.psi.ch
    +ssh $username@merlin-l-001.psi.ch
    +ssh $username@merlin-l-002.psi.ch
    +
    + +

    SSH with X11 Forwarding

    + +

    Requirements

    + +

    For running SSH with X11 Forwarding in MacOS, one needs to have a X server running in MacOS. +The official X Server for MacOS is XQuartz. Please ensure +you have it running before starting a SSH connection with X11 forwarding.

    + +

    SSH with X11 Forwarding in MacOS

    + +

    Official X11 support is through NoMachine. Please follow the document +{Job Submission -> Interactive Jobs} and +{Accessing Merlin -> NoMachine} for more details. However, +we provide a small recipe for enabling X11 Forwarding in MacOS.

    + +
      +
    • +

      Ensure that XQuartz is installed and running in your MacOS.

      +
    • +
    • +

      For enabling client X11 forwarding, add the following to the start of ~/.ssh/config +to implicitly add -X to all ssh connections:

      + +
       ForwardAgent yes
      + ForwardX11Trusted yes
      +
      +
    • +
    • +

      Alternatively, you can add the option -Y to the ssh command. In example:

      + +
       ssh -X $username@merlin-l-01.psi.ch
      + ssh -X $username@merlin-l-001.psi.ch
      + ssh -X $username@merlin-l-002.psi.ch
      +
      +
    • +
    • +

      For testing that X11 forwarding works, just run xclock. A X11 based clock should +popup in your client session.

      + +
       xclock
      +
      +
    • +
    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin6/connect-from-windows.html b/public/merlin6/connect-from-windows.html new file mode 100644 index 0000000..82848f7 --- /dev/null +++ b/public/merlin6/connect-from-windows.html @@ -0,0 +1,823 @@ + + + + + + + + +Connecting from a Windows Client | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Connecting from a Windows Client

    +
    + + + +
    + + +
    This document describes a recommended setup for a Windows client.
    + + + + + + + +
    + + + + + + +

    SSH with PuTTY without X11 Forwarding

    + +

    PuTTY is one of the most common tools for SSH.

    + +

    Check, if the following software packages are installed on the Windows workstation by +inspecting the Start menu (hint: use the Search box to save time):

    + + +

    If they are missing, you can install them using the Software Kiosk icon on the Desktop.

    + +
      +
    1. +

      Start PuTTY

      +
    2. +
    3. +

      [Optional] Enable xterm to have similar mouse behavour as in Linux:

      + +

      Enable 'xterm'

      +
    4. +
    5. +

      Create session to a Merlin login node and Open:

      + +

      Create Merlin Session

      +
    6. +
    + +

    SSH with PuTTY with X11 Forwarding

    + +

    Official X11 Forwarding support is through NoMachine. Please follow the document +{Job Submission -> Interactive Jobs} and +{Accessing Merlin -> NoMachine} for more details. However, +we provide a small recipe for enabling X11 Forwarding in Windows.

    + +

    Check, if the Xming is installed on the Windows workstation by inspecting the +Start menu (hint: use the Search box to save time). If missing, you can install it by +using the Software Kiosk icon (should be located on the Desktop).

    + +
      +
    1. +

      Ensure that a X server (Xming) is running. Otherwise, start it.

      +
    2. +
    3. +

      Enable X11 Forwarding in your SSH client. In example, for Putty:

      + +

      Enable X11 Forwarding in Putty

      +
    4. +
    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin6/contact.html b/public/merlin6/contact.html new file mode 100644 index 0000000..f998b39 --- /dev/null +++ b/public/merlin6/contact.html @@ -0,0 +1,818 @@ + + + + + + + + +Contact | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Contact

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    Support

    + +

    Basic contact information can be also found when logging into the Merlin Login Nodes through the Message of the Day.

    + +

    Support can be asked through:

    + + +

    PSI Service Now

    + +

    PSI Service Now: is the official tool for opening incident requests.

    +
      +
    • PSI HelpDesk will redirect the incident to the corresponding department, or
    • +
    • you can always assign it directly by checking the box I know which service is affected and providing the service name Local HPC Resources (e.g. Merlin) [CF] (just type in Local and you should get the valid completions).
    • +
    + +

    Contact Merlin6 Administrators

    + +

    E-Mail merlin-admins@lists.psi.ch

    +
      +
    • This is the official way to contact Merlin6 Administrators for discussions which do not fit well into the incident category. +Do not hesitate to contact us for such cases.
    • +
    + +
    + +

    Get updated through the Merlin User list!

    + +

    Is strictly recommended that users subscribe to the Merlin Users mailing list: merlin-users@lists.psi.ch

    + +

    This mailing list is the official channel used by Merlin6 administrators to inform users about downtimes, +interventions or problems. Users can be subscribed in two ways:

    + +
      +
    • (Preferred way) Self-registration through Sympa
    • +
    • If you need to subscribe many people (e.g. your whole group) by sending a request to the admin list merlin-admins@lists.psi.ch +and providing a list of email addresses.
    • +
    + +
    + +

    The Merlin Cluster Team

    + +

    The PSI Merlin clusters are managed by the High Performance Computing and Emerging technologies Group, which + is part of the Science IT Infrastructure, and Services department (AWI) in PSI’s Center for Scientific Computing, Theory and Data (SCD).

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin6/data-directories.html b/public/merlin6/data-directories.html new file mode 100644 index 0000000..d8f0d73 --- /dev/null +++ b/public/merlin6/data-directories.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

    Redirecting…

    + Click here if you are not redirected. + diff --git a/public/merlin6/downtimes.html b/public/merlin6/downtimes.html new file mode 100644 index 0000000..a217890 --- /dev/null +++ b/public/merlin6/downtimes.html @@ -0,0 +1,883 @@ + + + + + + + + +Downtimes | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Downtimes

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    On the first Monday of each month the Merlin6 cluster might be subject to interruption due to maintenance. +Users will be informed with at least one week in advance when a downtime is scheduled for the next month.

    + +

    Downtimes will be informed to users through the merlin-users@lists.psi.ch mail list. Also, a detailed description +for the nexts scheduled interventions will be available in Next Scheduled Downtimes).

    + +
    + +

    Scheduled Downtime Draining Policy

    + +

    Scheduled downtimes mostly affecting the storage and Slurm configurantions may require draining the nodes. +When this is required, users will be informed accordingly. Two different types of draining are possible:

    + +
      +
    • soft drain: new jobs may be queued on the partition, but queued jobs may not be allocated nodes and run from the partition. +Jobs already running on the partition continue to run. This will be the default drain method.
    • +
    • hard drain: no new jobs may be queued on the partition (job submission requests will be denied with an error message), +but jobs already queued on the partition may be allocated to nodes and run.
    • +
    + +

    Unless explicitly specified, the default draining policy for each partition will be the following:

    + +
      +
    • The daily and general partitions will be soft drained 12h before the downtime.
    • +
    • The hourly partition will be soft drained 1 hour before the downtime.
    • +
    • The gpu and gpu-short partitions will be soft drained 1 hour before the downtime.
    • +
    + +

    Finally, remaining running jobs will be killed by default when the downtime starts. In some specific rare cases jobs will be +just paused and resumed back when the downtime finished.

    + +

    Draining Policy Summary

    + +

    The following table contains a summary of the draining policies during a Schedule Downtime:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PartitionDrain PolicyDefault Drain TypeDefault Job Policy
    general12h before the SDsoft drainKill running jobs when SD starts
    daily12h before the SDsoft drainKill running jobs when SD starts
    hourly1h before the SDsoft drainKill running jobs when SD starts
    gpu1h before the SDsoft drainKill running jobs when SD starts
    gpu-short1h before the SDsoft drainKill running jobs when SD starts
    gfa-asa1h before the SDsoft drainKill running jobs when SD starts
    + +
    + +

    Next Scheduled Downtimes

    + +

    The table below shows a description for the next Scheduled Downtime:

    + + + + + + + + + + + + + + + + + + +
    FromToServiceDescription
    05.09.2020 8am05.09.2020 6pm
    + +
      +
    • Note: An e-mail will be sent when the services are fully available.
    • +
    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin6/faq.html b/public/merlin6/faq.html new file mode 100644 index 0000000..cc04612 --- /dev/null +++ b/public/merlin6/faq.html @@ -0,0 +1,834 @@ + + + + + + + + +FAQ | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    FAQ

    +
    + + + +
    + + + + + + + + +
    + + + + + + + + + + +
    + +

    How do I register for Merlin?

    + +

    See Requesting Merlin Access.

    + +

    How do I get information about downtimes and updates?

    + +

    See Get updated through the Merlin User list!

    + +

    How can I request access to a Merlin project directory?

    + +

    Merlin projects are placed in the /data/project directory. Access to each project is controlled by Unix group membership. +If you require access to an existing project, please request group membership as described in Requesting Unix Group Membership.

    + +

    Your project leader or project colleagues will know what Unix group you should belong to. Otherwise, you can check what Unix group is allowed to access that project directory (simply run ls -ltrhd for the project directory).

    + +

    Can I install software myself?

    + +

    Most software can be installed in user directories without any special permissions. We recommend using /data/user/$USER/bin for software since home directories are fairly small. For software that will be used by multiple groups/users you can also request the admins install it as a module.

    + +

    How to install depends a bit on the software itself. There are three common installation procedures:

    + +
      +
    1. binary distributions. These are easy; just put them in a directory (eg /data/user/$USER/bin) and add that to your PATH.
    2. +
    3. source compilation using make/cmake/autoconfig/etc. Usually the compilation scripts accept a --prefix=/data/user/$USER directory for where to install it. Then they place files under <prefix>/bin, <prefix>/lib, etc. The exact syntax should be documented in the installation instructions.
    4. +
    5. conda environment. This is now becoming standard for python-based software, including lots of the AI tools. First follow the initial setup instructions to configure conda to use /data/user instead of your home directory. Then you can create environments like:
    6. +
    + +
    module load anaconda/2019.07
    +# if they provide environment.yml
    +conda env create -f environment.yml
    +
    +# or to create manually
    +conda create --name myenv python==3.9 ...
    +
    +conda activate myenv
    +
    + +

    Something doesn’t work

    + +

    Check the list of known problems to see if a solution is known. +If not, please contact the admins.

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin6/gothic.html b/public/merlin6/gothic.html new file mode 100644 index 0000000..d7beb05 --- /dev/null +++ b/public/merlin6/gothic.html @@ -0,0 +1,990 @@ + + + + + + + + +GOTHIC | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    GOTHIC

    +
    + + + +
    + + +
    This document describes how to run Gothic in the Merlin cluster
    + + + + + + + +
    + + + + + + +

    This document describes generic information of how to run Gothic in the +Merlin cluster

    + +

    Gothic installation

    + +

    Gothic is locally installed in Merlin in the following directory:

    +
    /data/project/general/software/gothic
    +
    + +

    Multiple versions are available. As of August 22, 2022, the latest +installed version is Gothic 8.3 QA.

    + +

    Future releases will be placed in the PSI Modules system, therefore, +loading it through PModules will be possible at some point. However, in the +meantime one has to use the existing installations present in +/data/project/general/software/gothic.

    + +

    Running Gothic

    + +

    General requirements

    + +

    When running Gothic in interactive or batch mode, one has to consider +the following requirements:

    + +
      +
    • Use always one node only: Gothic runs a single instance. +Therefore, it can not run on multiple nodes. Adding option --nodes=1-1 +or -N 1-1 is strongly recommended: this will prevent Slurm to allocate +multiple nodes if the Slurm allocation definition is ambiguous.
    • +
    • Use one task only: Gothic spawns one main process, which then will +spawn multiple threads depending on the number of available cores. +Therefore, one has to specify 1 task (--ntasks=1 or -n 1).
    • +
    • Use multiple CPUs: since Gothic will spawn multiple threads, then +multiple CPUs can be used. Adding --cpus-per-task=<num_cpus> +or -c <num_cpus> is in general recommended. +Notice that <num_cpus> must never exceed the maximum number of CPUS +in a compute node (usually 88).
    • +
    • Use multithread: Gothic is an OpenMP based software, therefore, +running in hyper-threading mode is strongly recommended. Use the option +--hint=multithread for enforcing hyper-threading.
    • +
    • [Optional] Memory setup: The default memory per CPU (4000MB) +is usually enough for running Gothic. If you require more memory, you +can always set the --mem=<mem_in_MB> option. This is in general +not necessary.
    • +
    + +

    Interactive

    + +

    Is not allowed to run CPU intensive interactive jobs in the +login nodes. Only applications capable to limit the number of cores are +allowed to run for longer time. Also, running in the login nodes is not +efficient, since resources are shared with other processes and users.

    + +

    Is possible to submit interactive jobs to the cluster by allocating a +full compute node, or even by allocating a few cores only. This will grant +dedicated CPUs and resources and in general it will not affect other users.

    + +

    For interactive jobs, is strongly recommended to use the hourly partition, +which usually has a good availability of nodes.

    + +

    For longer runs, one should use the daily (or general) partition. +However, getting interactive access to nodes on these partitions is +sometimes more difficult if the cluster is pretty full.

    + +

    To submit an interactive job, consider the following requirements:

    +
      +
    • X11 forwarding must be enabled: Gothic spawns an interactive +window which requires X11 forwarding when using it remotely, therefore +using the Slurm option --x11 is necessary.
    • +
    • Ensure that the scratch area is accessible: For running Gothic, +one has to define a scratch area with the GTHTMP environment variable. +There are two options: +
        +
      1. Use local scratch: Each compute node has its own /scratch area. +This area is independent to any other node, therefore not visible by other nodes. +Using the top directory /scratch for interactive jobs is the simplest way, +and it can be defined before or after the allocation creation, as follows: +
        # Example 1: Define GTHTMP before the allocation
        +export GTHTMP=/scratch
        +salloc ...
        +      
        +# Example 2: Define GTHTMP after the allocation
        +salloc ...
        +export GTHTMP=/scratch
        +
        +

        Notice that if you want to create a custom sub-directory (i.e. +/scratch/$USER, one has to create the sub-directory on every new +allocation! In example:

        +
        # Example 1: 
        +export GTHTMP=/scratch/$USER
        +salloc ...
        +mkdir -p $GTHTMP
        +
        +# Example 2:
        +salloc ...
        +export GTHTMP=/scratch/$USER
        +mkdir -p $GTHTMP
        +
        +

        Creating sub-directories makes the process more complex, therefore +using just /scratch is simpler and recommended.

        +
      2. +
      3. Shared scratch: Using shared scratch allows to have a +directory visible from all compute nodes and login nodes. Therefore, +one can use /shared-scratch to achieve the same as in 1., but +creating a sub-directory needs to be done just once.
      4. +
      + +

      Please, consider that /scratch usually provides better performance and, +in addition, will offload the main storage. Therefore, using local scratch +is strongly recommended. Use the shared scratch only when strongly necessary.

      +
    • +
    • Use the hourly partition: Using the hourly partition is +recommended for running interactive jobs (latency is in general +lower). However, daily and general are also available if you expect +longer runs, but in these cases you should expect longer waiting times.
    • +
    + +

    These requirements are in addition to the requirements previously described +in the General requirements +section.

    + +

    Interactive allocations: examples

    +
      +
    • Requesting a full node, +
      salloc --partition=hourly  -N 1 -n 1 -c 88 --hint=multithread --x11 --exclusive --mem=0 
      +
      +
    • +
    • Requesting 22 CPUs from a node, with default memory per CPU (4000MB/CPU): +
      num_cpus=22
      +salloc --partition=hourly -N 1 -n 1 -c $num_cpus --hint=multithread --x11
      +
      +
    • +
    + +

    Batch job

    + +

    The Slurm cluster is mainly used by non interactive batch jobs: Users +submit a job, which goes into a queue, and waits until Slurm can assign +resources to it. In general, the longer the job, the longer the waiting time, +unless there are enough free resources to inmediately start running it.

    + +

    Running Gothic in a Slurm batch script is pretty simple. One has to mainly +consider the requirements described in the General requirements +section, and:

    +
      +
    • Use local scratch for running batch jobs. In general, defining +GTHTMP in a batch script is simpler than on an allocation. If you plan +to run multiple jobs in the same node, you can even create a second sub-directory +level based on the Slurm Job ID: +
       mkdir -p /scratch/$USER/$SLURM_JOB_ID
      + export GTHTMP=/scratch/$USER/$SLURM_JOB_ID
      + ... # Run Gothic here
      + rm -rf /scratch/$USER/$SLURM_JOB_ID
      +
      +

      Temporary data generated by the job in GTHTMP must be removed at the end of +the job, as showed above.

      +
    • +
    + +

    Batch script: examples

    + +
      +
    • Requesting a full node: +
       #!/bin/bash -l
      + #SBATCH --job-name=Gothic
      + #SBATCH --time=3-00:00:00
      + #SBATCH --partition=general
      + #SBATCH --nodes=1
      + #SBATCH --ntasks=1
      + #SBATCH --cpus-per-task=88
      + #SBATCH --hint=multithread
      + #SBATCH --exclusive
      + #SBATCH --mem=0
      + #SBATCH --clusters=merlin6
      +   
      + INPUT_FILE='MY_INPUT.SIN'
      +   
      + mkdir -p /scratch/$USER/$SLURM_JOB_ID
      + export GTHTMP=/scratch/$USER/$SLURM_JOB_ID
      +   
      + /data/project/general/software/gothic/gothic8.3qa/bin/gothic_s.sh $INPUT_FILE -m -np $SLURM_CPUS_PER_TASK
      + gth_exit_code=$?
      +
      + # Clean up data in /scratch   
      + rm -rf /scratch/$USER/$SLURM_JOB_ID
      +
      + # Return exit code from GOTHIC
      + exit $gth_exit_code
      +
      +
    • +
    • Requesting 22 CPUs from a node, with default memory per CPU (4000MB/CPU): +
       #!/bin/bash -l
      + #SBATCH --job-name=Gothic
      + #SBATCH --time=3-00:00:00
      + #SBATCH --partition=general
      + #SBATCH --nodes=1
      + #SBATCH --ntasks=1
      + #SBATCH --cpus-per-task=22
      + #SBATCH --hint=multithread
      + #SBATCH --clusters=merlin6
      +   
      + INPUT_FILE='MY_INPUT.SIN'
      +   
      + mkdir -p /scratch/$USER/$SLURM_JOB_ID
      + export GTHTMP=/scratch/$USER/$SLURM_JOB_ID
      +   
      + /data/project/general/software/gothic/gothic8.3qa/bin/gothic_s.sh $INPUT_FILE -m -np $SLURM_CPUS_PER_TASK
      + gth_exit_code=$?
      +
      + # Clean up data in /scratch   
      + rm -rf /scratch/$USER/$SLURM_JOB_ID
      +
      + # Return exit code from GOTHIC
      + exit $gth_exit_code
      +
      +
    • +
    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin6/hardware-and-software.html b/public/merlin6/hardware-and-software.html new file mode 100644 index 0000000..a1a19d2 --- /dev/null +++ b/public/merlin6/hardware-and-software.html @@ -0,0 +1,950 @@ + + + + + + + + +Hardware And Software Description | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Hardware And Software Description

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    Hardware

    + +

    Computing Nodes

    + +

    The new Merlin6 cluster contains a solution based on four HPE Apollo k6000 Chassis

    +
      +
    • Three of them contain 24 x HP Apollo XL230K Gen10 blades.
    • +
    • A fourth chassis was purchased on 2021 with HP Apollo XL230K Gen10 blades dedicated to few experiments. Blades have slighly different components depending on specific project requirements.
    • +
    + +

    The connectivity for the Merlin6 cluster is based on ConnectX-5 EDR-100Gbps, and each chassis contains:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Merlin6 CPU Computing Nodes
    ChassisNodeProcessorSocketsCoresThreadsScratchMemory
    #0merlin-c-0[01-24]Intel Xeon Gold 615224421.2TB384GB
    #1merlin-c-1[01-24]Intel Xeon Gold 615224421.2TB384GB
    #2merlin-c-2[01-24]Intel Xeon Gold 615224421.2TB384GB
    #3merlin-c-3[01-12]Intel Xeon Gold 6240R24821.2TB768GB
    merlin-c-3[03-18]1
    merlin-c-3[19-24]2384GB
    +

    Each blade contains a NVMe disk, where up to 300TB are dedicated to the O.S., and ~1.2TB are reserved for local /scratch.

    + +

    Login Nodes

    + +

    One old login node (merlin-l-01.psi.ch) is inherit from the previous Merlin5 cluster. Its mainly use is for running some BIO services (cryosparc) and for submitting jobs. +Two new login nodes (merlin-l-001.psi.ch,merlin-l-002.psi.ch) with similar configuration to the Merlin6 computing nodes are available for the users. The mainly use +is for compiling software and submitting jobs.

    + +

    The connectivity is based on ConnectX-5 EDR-100Gbps for the new login nodes, and ConnectIB FDR-56Gbps for the old one.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Merlin6 CPU Computing Nodes
    HardwareNodeProcessorSocketsCoresThreadsScratchMemory
    Oldmerlin-l-01Intel Xeon E5-2697AV42162100GB512GB
    Newmerlin-l-00[1,2]Intel Xeon Gold 615224421.8TB384GB
    + +

    Storage

    + +

    The storage node is based on the Lenovo Distributed Storage Solution for IBM Spectrum Scale.

    +
      +
    • 2 x Lenovo DSS G240 systems, each one composed by 2 IO Nodes ThinkSystem SR650 mounting 4 x Lenovo Storage D3284 High Density Expansion enclosures.
    • +
    • Each IO node has a connectivity of 400Gbps (4 x EDR 100Gbps ports, 2 of them are ConnectX-5 and 2 are ConnectX-4).
    • +
    + +

    The storage solution is connected to the HPC clusters through 2 x Mellanox SB7800 InfiniBand 1U Switches for high availability and load balancing.

    + +

    Network

    + +

    Merlin6 cluster connectivity is based on the Infiniband technology. This allows fast access with very low latencies to the data as well as running +extremely efficient MPI-based jobs:

    +
      +
    • Connectivity amongst different computing nodes on different chassis ensures up to 1200Gbps of aggregated bandwidth.
    • +
    • Inter connectivity (communication amongst computing nodes in the same chassis) ensures up to 2400Gbps of aggregated bandwidth.
    • +
    • Communication to the storage ensures up to 800Gbps of aggregated bandwidth.
    • +
    + +

    Merlin6 cluster currently contains 5 Infiniband Managed switches and 3 Infiniband Unmanaged switches (one per HP Apollo chassis):

    +
      +
    • 1 x MSX6710 (FDR) for connecting old GPU nodes, old login nodes and MeG cluster to the Merlin6 cluster (and storage). No High Availability mode possible.
    • +
    • 2 x MSB7800 (EDR) for connecting Login Nodes, Storage and other nodes in High Availability mode.
    • +
    • 3 x HP EDR Unmanaged switches, each one embedded to each HP Apollo k6000 chassis solution.
    • +
    • 2 x MSB7700 (EDR) are the top switches, interconnecting the Apollo unmanaged switches and the managed switches (MSX6710, MSB7800).
    • +
    + +

    Software

    + +

    In Merlin6, we try to keep the latest software stack release to get the latest features and improvements. Due to this, Merlin6 runs:

    + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin6/impi.html b/public/merlin6/impi.html new file mode 100644 index 0000000..0eeb660 --- /dev/null +++ b/public/merlin6/impi.html @@ -0,0 +1,806 @@ + + + + + + + + +Intel MPI Support | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Intel MPI Support

    +
    + + + +
    + + +
    This document describes how to use Intel MPI in the Merlin6 cluster
    + + + + + + + +
    + + + + + + +

    Introduction

    + +

    This document describes which set of Intel MPI versions in PModules are supported in the Merlin6 cluster.

    + +

    srun

    + +

    We strongly recommend the use of ‘srun’ over ‘mpirun’ or ‘mpiexec’. Using ‘srun’ would properly +bind tasks in to cores and less customization is needed, while ‘mpirun’ and ‘mpiexec’ might need more advanced +configuration and should be only used by advanced users. Please, always adapt your scripts for using ‘srun’ +before opening a support ticket. Also, please contact us on any problem when using a module.

    + + + +

    When running with srun, one should tell Intel MPI to use the PMI libraries provided by Slurm. For PMI-1:

    + +
    export I_MPI_PMI_LIBRARY=/usr/lib64/libpmi.so
    +
    +srun ./app
    +
    + +

    Alternatively, one can use PMI-2, but then one needs to specify it as follows:

    + +
    export I_MPI_PMI_LIBRARY=/usr/lib64/libpmi2.so
    +export I_MPI_PMI2=yes
    +
    +srun ./app
    +
    + +

    For more information, please read Slurm Intel MPI Guide

    + +

    Note: Please note that PMI2 might not work properly in some Intel MPI versions. If so, you can either fallback +to PMI-1 or to contact the Merlin administrators.

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin6/index.html b/public/merlin6/index.html new file mode 100644 index 0000000..4b2ef60 --- /dev/null +++ b/public/merlin6/index.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

    Redirecting…

    + Click here if you are not redirected. + diff --git a/public/merlin6/interactive-jobs.html b/public/merlin6/interactive-jobs.html new file mode 100644 index 0000000..7a6bdf4 --- /dev/null +++ b/public/merlin6/interactive-jobs.html @@ -0,0 +1,997 @@ + + + + + + + + +Running Interactive Jobs | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Running Interactive Jobs

    +
    + + + +
    + + +
    This document describes how to run interactive jobs as well as X based software.
    + + + + + + + +
    + + + + + + +

    Running interactive jobs

    + +

    There are two different ways for running interactive jobs in Slurm. This is possible by using +the salloc and srun commands:

    + +
      +
    • salloc: to obtain a Slurm job allocation (a set of nodes), execute command(s), and then release the allocation when the command is finished.
    • +
    • srun: is used for running parallel tasks.
    • +
    + +

    srun

    + +

    Is run is used to run parallel jobs in the batch system. It can be used within a batch script +(which can be run with sbatch), or within a job allocation (which can be run with salloc). +Also, it can be used as a direct command (in example, from the login nodes).

    + +

    When used inside a batch script or during a job allocation, srun is constricted to the +amount of resources allocated by the sbatch/salloc commands. In sbatch, usually +these resources are defined inside the batch script with the format #SBATCH <option>=<value>. +In other words, if you define in your batch script or allocation 88 tasks (and 1 thread / core) +and 2 nodes, srun is constricted to these amount of resources (you can use less, but never +exceed those limits).

    + +

    When used from the login node, usually is used to run a specific command or software in an +interactive way. srun is a blocking process (it will block bash prompt until the srun +command finishes, unless you run it in background with &). This can be very useful to run +interactive software which pops up a Window and then submits jobs or run sub-tasks in the +background (in example, Relion, cisTEM, etc.)

    + +

    Refer to man srun for exploring all possible options for that command.

    + +
    +[Show 'srun' example]: Running 'hostname' command on 3 nodes, using 2 cores (1 task/core) per node +
    +(base) [caubet_m@merlin-l-001 ~]$ srun --clusters=merlin6 --ntasks=6 --ntasks-per-node=2 --nodes=3 hostname
    +srun: job 135088230 queued and waiting for resources
    +srun: job 135088230 has been allocated resources
    +merlin-c-102.psi.ch
    +merlin-c-102.psi.ch
    +merlin-c-101.psi.ch
    +merlin-c-101.psi.ch
    +merlin-c-103.psi.ch
    +merlin-c-103.psi.ch
    +
    +
    + +

    salloc

    + +

    salloc is used to obtain a Slurm job allocation (a set of nodes). Once job is allocated, +users are able to execute interactive command(s). Once finished (exit or Ctrl+D), +the allocation is released. salloc is a blocking command, it is, command will be blocked +until the requested resources are allocated.

    + +

    When running salloc, once the resources are allocated, by default the user will get +a new shell on one of the allocated resources (if a user has requested few nodes, it will +prompt a new shell on the first allocated node). However, this behaviour can be changed by adding +a shell ($SHELL) at the end of the salloc command. In example:

    + +
    # Typical 'salloc' call
    +#   - Same as running:
    +#    'salloc --clusters=merlin6 -N 2 -n 2 srun -n1 -N1 --mem-per-cpu=0 --gres=gpu:0 --pty --preserve-env --mpi=none $SHELL' 
    +salloc --clusters=merlin6 -N 2 -n 2
    +
    +# Custom 'salloc' call
    +#   - $SHELL will open a local shell on the login node from where ``salloc`` is running
    +salloc --clusters=merlin6 -N 2 -n 2 $SHELL
    +
    + +
    +[Show 'salloc' example]: Allocating 2 cores (1 task/core) in 2 nodes (1 core/node) - Default +
    +(base) [caubet_m@merlin-l-001 ~]$ salloc --clusters=merlin6 --ntasks=2 --nodes=2
    +salloc: Pending job allocation 135171306
    +salloc: job 135171306 queued and waiting for resources
    +salloc: job 135171306 has been allocated resources
    +salloc: Granted job allocation 135171306
    +
    +(base) [caubet_m@merlin-c-213 ~]$ srun hostname
    +merlin-c-213.psi.ch
    +merlin-c-214.psi.ch
    +
    +(base) [caubet_m@merlin-c-213 ~]$ exit
    +exit
    +salloc: Relinquishing job allocation 135171306
    +
    +(base) [caubet_m@merlin-l-001 ~]$ salloc --clusters=merlin6 -N 2 -n 2 srun -n1 -N1 --mem-per-cpu=0 --gres=gpu:0 --pty --preserve-env --mpi=none $SHELL
    +salloc: Pending job allocation 135171342
    +salloc: job 135171342 queued and waiting for resources
    +salloc: job 135171342 has been allocated resources
    +salloc: Granted job allocation 135171342
    +
    +(base) [caubet_m@merlin-c-021 ~]$ srun hostname
    +merlin-c-021.psi.ch
    +merlin-c-022.psi.ch
    +
    +(base) [caubet_m@merlin-c-021 ~]$ exit
    +exit
    +salloc: Relinquishing job allocation 135171342
    +
    +
    + +
    +[Show 'salloc' example]: Allocating 2 cores (1 task/core) in 2 nodes (1 core/node) - $SHELL +
    +(base) [caubet_m@merlin-export-01 ~]$ salloc --clusters=merlin6 --ntasks=2 --nodes=2 $SHELL
    +salloc: Pending job allocation 135171308
    +salloc: job 135171308 queued and waiting for resources
    +salloc: job 135171308 has been allocated resources
    +salloc: Granted job allocation 135171308
    +
    +(base) [caubet_m@merlin-export-01 ~]$ srun hostname
    +merlin-c-218.psi.ch
    +merlin-c-117.psi.ch
    +
    +(base) [caubet_m@merlin-export-01 ~]$ exit
    +exit
    +salloc: Relinquishing job allocation 135171308
    +
    +
    + +

    Running interactive jobs with X11 support

    + +

    Requirements

    + +

    Graphical access

    + +

    NoMachine is the official supported service for graphical +access in the Merlin cluster. This service is running on the login nodes. Check the +document {Accessing Merlin -> NoMachine} for details about +how to connect to the NoMachine service in the Merlin cluster.

    + +

    For other non officially supported graphical access (X11 forwarding):

    + + + +

    ‘srun’ with x11 support

    + +

    Merlin5 and Merlin6 clusters allow running any windows based applications. For that, you need to +add the option --x11 to the srun command. In example:

    + +
    srun --clusters=merlin6 --x11 xclock
    +
    + +

    will popup a X11 based clock.

    + +

    In the same manner, you can create a bash shell with x11 support. For doing that, you need +to add the option --pty to the srun --x11 command. Once resource is allocated, from +there you can interactively run X11 and non-X11 based commands.

    + +
    srun --clusters=merlin6 --x11 --pty bash
    +
    + +
    +[Show 'srun' with X11 support examples] +
    +(base) [caubet_m@merlin-l-001 ~]$ srun --clusters=merlin6 --x11 xclock
    +srun: job 135095591 queued and waiting for resources
    +srun: job 135095591 has been allocated resources
    +
    +(base) [caubet_m@merlin-l-001 ~]$ 
    +
    +(base) [caubet_m@merlin-l-001 ~]$ srun --clusters=merlin6 --x11 --pty bash
    +srun: job 135095592 queued and waiting for resources
    +srun: job 135095592 has been allocated resources
    +
    +(base) [caubet_m@merlin-c-205 ~]$ xclock
    +
    +(base) [caubet_m@merlin-c-205 ~]$ echo "This was an example"
    +This was an example
    +
    +(base) [caubet_m@merlin-c-205 ~]$ exit
    +exit
    +
    +
    + +

    ‘salloc’ with x11 support

    + +

    Merlin5 and Merlin6 clusters allow running any windows based applications. For that, you need to +add the option --x11 to the salloc command. In example:

    + +
    salloc --clusters=merlin6 --x11 xclock
    +
    + +

    will popup a X11 based clock.

    + +

    In the same manner, you can create a bash shell with x11 support. For doing that, you need +to add to run just salloc --clusters=merlin6 --x11. Once resource is allocated, from +there you can interactively run X11 and non-X11 based commands.

    + +
    salloc --clusters=merlin6 --x11
    +
    + +
    +[Show 'salloc' with X11 support examples] +
    +(base) [caubet_m@merlin-l-001 ~]$ salloc --clusters=merlin6 --x11 xclock
    +salloc: Pending job allocation 135171355
    +salloc: job 135171355 queued and waiting for resources
    +salloc: job 135171355 has been allocated resources
    +salloc: Granted job allocation 135171355
    +salloc: Relinquishing job allocation 135171355
    +
    +(base) [caubet_m@merlin-l-001 ~]$ salloc --clusters=merlin6 --x11 
    +salloc: Pending job allocation 135171349
    +salloc: job 135171349 queued and waiting for resources
    +salloc: job 135171349 has been allocated resources
    +salloc: Granted job allocation 135171349
    +salloc: Waiting for resource configuration
    +salloc: Nodes merlin-c-117 are ready for job
    +
    +(base) [caubet_m@merlin-c-117 ~]$ xclock
    +
    +(base) [caubet_m@merlin-c-117 ~]$ echo "This was an example"
    +This was an example
    +
    +(base) [caubet_m@merlin-c-117 ~]$ exit
    +exit
    +salloc: Relinquishing job allocation 135171349
    +
    +
    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin6/interactive.html b/public/merlin6/interactive.html new file mode 100644 index 0000000..d3672da --- /dev/null +++ b/public/merlin6/interactive.html @@ -0,0 +1,872 @@ + + + + + + + + +Accessing Interactive Nodes | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Accessing Interactive Nodes

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    SSH Access

    + +

    For interactive command shell access, use an SSH client. We recommend to activate SSH’s X11 forwarding to allow you to use graphical +applications (e.g. a text editor, but for more performant graphical access, refer to the sections below). X applications are supported +in the login nodes and X11 forwarding can be used for those users who have properly configured X11 support in their desktops, however:

    + +
      +
    • Merlin6 administrators do not offer support for user desktop configuration (Windows, MacOS, Linux). +
        +
      • Hence, Merlin6 administrators do not offer official support for X11 client setup.
      • +
      • Nevertheless, a generic guide for X11 client setup (Linux, Windows and MacOS) is provided below.
      • +
      +
    • +
    • PSI desktop configuration issues must be addressed through PSI Service Now as an Incident Request. +
        +
      • Ticket will be redirected to the corresponding Desktop support group (Windows, Linux).
      • +
      +
    • +
    + +

    Accessing from a Linux client

    + +

    Refer to {How To Use Merlin -> Accessing from Linux Clients} for Linux SSH client and X11 configuration.

    + +

    Accessing from a Windows client

    + +

    Refer to {How To Use Merlin -> Accessing from Windows Clients} for Windows SSH client and X11 configuration.

    + +

    Accessing from a MacOS client

    + +

    Refer to {How To Use Merlin -> Accessing from MacOS Clients} for MacOS SSH client and X11 configuration.

    + +

    NoMachine Remote Desktop Access

    + +

    X applications are supported in the login nodes and can run efficiently through a NoMachine client. This is the officially supported way to run more demanding X applications on Merlin6.

    +
      +
    • For PSI Windows workstations, this can be installed from the Software Kiosk as ‘NX Client’. If you have difficulties installing, please request support through PSI Service Now as an Incident Request.
    • +
    • For other workstations The client software can be downloaded from the Nomachine Website.
    • +
    + +

    Configuring NoMachine

    + +

    Refer to {How To Use Merlin -> Remote Desktop Access} for further instructions of how to configure the NoMachine client and how to access it from PSI and from outside PSI.

    + +

    Login nodes hardware description

    + +

    The Merlin6 login nodes are the official machines for accessing the recources of Merlin6. +From these machines, users can submit jobs to the Slurm batch system as well as visualize or compile their software.

    + +

    The Merlin6 login nodes are the following:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    HostnameSSHNoMachine#cores#ThreadsCPUMemoryScratchScratch Mountpoint
    merlin-l-001.psi.chyesyes2 x 222Intel Xeon Gold 6152384GB1.8TB NVMe/scratch
    merlin-l-002.psi.chyesyes2 x 222Intel Xeon Gold 6142384GB1.8TB NVMe/scratch
    merlin-l-01.psi.chyes-2 x 162Intel Xeon E5-2697Av4512GB100GB SAS/scratch
    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin6/introduction.html b/public/merlin6/introduction.html new file mode 100644 index 0000000..f9e5c5e --- /dev/null +++ b/public/merlin6/introduction.html @@ -0,0 +1,837 @@ + + + + + + + + +Introduction | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Introduction

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    The Merlin local HPC cluster

    + +

    Historically, the local HPC clusters at PSI were named Merlin. Over the years, +multiple generations of Merlin have been deployed.

    + +

    At present, the Merlin local HPC cluster contains two generations of it:

    +
      +
    • the old Merlin5 cluster (merlin5 Slurm cluster), and
    • +
    • the newest generation Merlin6, which is divided in two Slurm clusters: +
        +
      • merlin6 as the Slurm CPU cluster
      • +
      • gmerlin6 as the Slurm GPU cluster.
      • +
      +
    • +
    + +

    Access to the different Slurm clusters is possible from the Merlin login nodes, +which can be accessed through the SSH protocol or the NoMachine (NX) service.

    + +

    The following image shows the Slurm architecture design for the Merlin5 & Merlin6 (CPU & GPU) clusters:

    + +

    Merlin6 Slurm Architecture Design

    + +

    Merlin6

    + +

    Merlin6 is a the official PSI Local HPC cluster for development and +mission-critical applications that has been built in 2019. It replaces +the Merlin5 cluster.

    + +

    Merlin6 is designed to be extensible, so is technically possible to add +more compute nodes and cluster storage without significant increase of +the costs of the manpower and the operations.

    + +

    Merlin6 contains all the main services needed for running cluster, including +login nodes, storage, computing nodes and other subservices, +connected to the central PSI IT infrastructure.

    + +

    CPU and GPU Slurm clusters

    + +

    The Merlin6 computing nodes are mostly based on CPU resources. However, +it also contains a small amount of GPU-based resources, which are mostly used +by the BIO Division and by Deep Leaning project.

    + +

    These computational resources are split into two different Slurm clusters:

    +
      +
    • The Merlin6 CPU nodes are in a dedicated Slurm cluster called merlin6. +
        +
      • This is the default Slurm cluster configured in the login nodes: any job submitted without the option --cluster will be submited to this cluster.
      • +
      +
    • +
    • The Merlin6 GPU resources are in a dedicated Slurm cluster called gmerlin6. +
        +
      • Users submitting to the gmerlin6 GPU cluster need to specify the option --cluster=gmerlin6.
      • +
      +
    • +
    + +

    Merlin5

    + +

    The old Slurm CPU merlin cluster is still active and is maintained in a best effort basis.

    + +

    Merlin5 only contains computing nodes resources in a dedicated Slurm cluster.

    +
      +
    • The Merlin5 CPU cluster is called merlin5.
    • +
    + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin6/jupyter-examples.html b/public/merlin6/jupyter-examples.html new file mode 100644 index 0000000..663a7fc --- /dev/null +++ b/public/merlin6/jupyter-examples.html @@ -0,0 +1,793 @@ + + + + + + + + +Jupyter examples on merlin6 | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Jupyter examples on merlin6

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    These examples demonstrate the use of certain python libraries and modules in the merlin6 environment. They are provided to get you started fast. You can check out a repository of the examples from

    + +

    https://git.psi.ch/lsm-hpce/merlin6-jupyterhub-examples

    + +

    A number of standard data sets for the tutorials of the libraries are hosted on merlin6 centrally under /data/project/general/public, so you do not need to store them in your user space.

    + +

    Dask

    + +

    Dask is a flexible library for parallel computing in Python. It provides the abstraction of a dask dataframe that can reside on multiple machines and can be manipulated by an API designed to be as close as possible to pandas. The example shows how to start up dask workers on merlin6 through slurm.

    + + + +

    Plotly

    +

    Plotly is an interactive open source plotting library

    + + + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin6/jupyter-extensions.html b/public/merlin6/jupyter-extensions.html new file mode 100644 index 0000000..c250abe --- /dev/null +++ b/public/merlin6/jupyter-extensions.html @@ -0,0 +1,795 @@ + + + + + + + + +Jupyter Extensions | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Jupyter Extensions

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    Using nbextensions for adding features to your notebook

    + +

    There exist a number of useful contributed but unofficial +extensions +that add useful features to your notebooks.

    + +

    From the classic Notebook UI you can access the available extensions in a separate tab as displayed in the screenshot, below. You may have to unselect the disable configuration for nbextensions without explicit copatibility. The extensions we tested still worked fine with this jupyterhub version of 1.0.0.

    + +
    Launch Classic Notebook
    + +

    Extensions for working with large notebooks

    + +

    Especially the following extensions make working with larger notebooks easier

    +
      +
    • Table of Contents: Displays a TOC on the left and you can also configure it +to add and update a TOC at the head of the document.
    • +
    • Collapsible Headings: allows you to fold all the cells below a heading
    • +
    + +

    It may also be interesting for you to explore the Jupytext server extension.

    + +

    Variable Inspector

    + +

    The variable inspector extension provides a constantly updated window in which you can see the value and type of your notebook’s variables.

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin6/jupyterhub-trouble.html b/public/merlin6/jupyterhub-trouble.html new file mode 100644 index 0000000..aed11f7 --- /dev/null +++ b/public/merlin6/jupyterhub-trouble.html @@ -0,0 +1,823 @@ + + + + + + + + +Jupyterhub Troubleshooting | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Jupyterhub Troubleshooting

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    In case of problems or requests, please either submit a PSI Service Now incident containing “Merlin Jupyterhub” as part of the subject, or contact us by mail through merlin-admins@lists.psi.ch.

    + +

    General steps for troubleshooting

    + +

    Investigate the Slurm output file

    +

    Your jupyterhub session runs as a normal batch job on the cluster, and each launch will create a slurm output file in your HOME directory named like jupyterhub_batchspawner_{$JOBID}.log, where the $JOBID part is the slurm job ID of your job. After a failed launch, investigate the contents of that file. An error message will usually be found towards the end of the file, often including a python backtrace.

    + +

    Investigate python environment interferences

    +

    Jupyterhub just runs a jupyter notebook executable as your user inside the batch job. A frequent source of errors consists of a user’s local python environment definitions getting mixed up with the environment that jupyter needs to launch.

    + +
      +
    • setting PYTHONPATH inside of the ~/.bash_profile or any other startup script
    • +
    • having installed packages to your local user area (e.g. using pip install --user <some-package>). Such installation will interfere with the environment offered by the module system on our cluster (based on anaconda). You can list such packages by executing + pip list user. They are usually located in ~/.local/lib/pythonX.Y/....
    • +
    + +

    You can investigate the launching of a notebook interactively, by logging in to Merlin6 and running a jupyter command in the correct environment.

    + +
      module use unstable
    +  module load anaconda/2019.07
    +  conda activate jupyterhub-1.0.0_py36
    +  jupyter --paths
    +
    + +

    Known Problems and workarounds

    +

    Spawner times out

    +

    If the cluster is very full, it may be difficult to launch a session. We always reserve some slots for interactive Jupyterhub use, but it may be that these slots have been taken or that the resources you requested are currently not available.

    + +

    Inside of a Merlin6 terminal shell, you can run the standard commands like sinfo and squeue to get an overview of how full the cluster is.

    + +

    Your user environment is not among the kernels offered for choice

    +

    Refer to our documentation about using your own custom made +environments with jupyterhub.

    + +

    Cannot save notebook - xsrf argument missing

    +

    You cannot save your notebook anymore and you get this error:

    + +
     **'_xsrf' argument missing from POST**
    +
    + +

    This issue occurs very seldomly. There exists the following workaround:

    + +

    Go to the jupyterhub file browsing window and just open another +notebook using the same kernel in another browser window. The issue +should then go away. For more information refer to this github +thread

    + + + + + + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin6/jupyterhub.html b/public/merlin6/jupyterhub.html new file mode 100644 index 0000000..cec1187 --- /dev/null +++ b/public/merlin6/jupyterhub.html @@ -0,0 +1,862 @@ + + + + + + + + +Jupyterhub on Merlin | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Jupyterhub on Merlin

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    Jupyterhub provides jupyter notebooks that are launched on +cluster nodes of merlin and can be accessed through a web portal.

    + +

    Accessing Jupyterhub and launching a session

    + +

    The service is available inside of PSI (or through a VPN connection) at

    + +

    https://merlin-jupyter.psi.ch:8000

    + +
      +
    1. Login: You will be presented with a Login web page for +authenticating with your PSI account.
    2. +
    3. Spawn job: The Spawner Options page allows you to +specify the properties (Slurm partition, running time,…) of +the batch jobs that will be running your jupyter notebook. Once +you click on the Spawn button, your job will be sent to the +Slurm batch system. If the cluster is not currently overloaded +and the resources you requested are available, your job will +usually start within 30 seconds.
    4. +
    + +

    Jupyter software environments - running different kernels

    + +

    Your notebooks can run within different software environments which are offered by a number of available Jupyter kernels.

    + +

    E.g. in this test installation we provide two environments targeted at data science

    +
      +
    • tensorflow-1.13.1_py37: contains Tensorflow, Keras, scikit-learn, Pandas, numpy, dask, and dependencies. Stable
    • +
    • talos_py36: also contains the Talos package. This +environment is experimental and subject to updates and changes.
    • +
    + +

    When you create a new notebook you will be asked to specify which kernel you want to use. It is also possible to switch the kernel of a running notebook, but you will lose the state of the current kernel, so you will have to recalculate the notebook cells with this new kernel.

    + +

    These environments are also available for standard work in a shell session. You can activate an environment in a normal merlin terminal session by using the module (q.v. using Pmodules) command to load anaconda python, and from there using the conda command to switch to the desired environment

    + +
    module use unstable
    +module load anaconda/2019.07
    +conda activate tensorflow-1.13.1_py36
    +
    + +

    When the anaconda module has been loaded, you can list the available environments by executing

    + +
    conda info -e
    +
    + +

    You can get more info on the use of the conda package management tool at its official https://conda.io/projects/conda/en/latest/commands.html.

    + +

    Using your own custom made environments with jupyterhub

    +

    Python environments can take up a lot of space due to the many dependencies that will be installed. You should always install your extra environments to the data area belonging to your account, e.g. /data/user/${YOUR-USERNAME}/conda-envs

    + +

    In order for jupyterhub (and jupyter in general) to recognize the provided environment as a valid kernel, make sure that you include the nb_conda_kernels package in your environment. This package provides the necessary activation and the dependencies.

    + +

    Example:

    +
    conda create -c conda-forge -p /data/user/${USER}/conda-envs/my-test-env python=3.7 nb_conda_kernels
    +
    + +

    After this, your new kernel will be visible as my-test-env inside of your jupyterhub session.

    + +

    Requesting additional resources

    + +

    The Spawner Options page covers the most common options. These are used to +create a submission script for the jupyterhub job and submit it to the slurm +queue. Additional customization can be implemented using the ‘Optional user +defined line to be added to the batch launcher script’ option. This line is +added to the submission script at the end of other #SBATCH lines. Parameters can +be passed to SLURM by starting the line with #SBATCH, like in Running Slurm +Scripts. Some ideas:

    + +

    Request additional memory

    + +
    #SBATCH --mem=100G
    +
    + +

    Request multiple GPUs (gpu partition only)

    + +
    #SBATCH --gpus=2
    +
    + +

    Log additional information

    + +
    hostname; date; echo $USER
    +
    + +

    Output is found in ~/jupyterhub_batchspawner_<jobid>.log.

    + +

    Contact

    +

    In case of problems or requests, please either submit a PSI Service +Now incident containing “Merlin +Jupyterhub” as part of the subject, or contact us by mail through +merlin-admins@lists.psi.ch.

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin6/jupyterlab.html b/public/merlin6/jupyterlab.html new file mode 100644 index 0000000..5ff128e --- /dev/null +++ b/public/merlin6/jupyterlab.html @@ -0,0 +1,789 @@ + + + + + + + + +Jupyterlab User interface | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Jupyterlab User interface

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    Testing out Jupyterlab

    +

    Jupyterlab is a new interface to interact with your Jupyter notebooks. However, it is in very active development and undergoing constant changes. You can read about its features on the official website.

    + +

    You can test it out on our server by using the following kind of URL, where $YOUR-USER must be replaced by your PSI username. You must already have an active session on the jupyterhub.

    + +

    https://merlin-jupyter.psi.ch:8000/user/$YOUR-USER/lab

    + +

    Switching to the Classic Notebook user interface

    + +

    You can switch to the classical notebook UI by using the “Launch Classic Notebook” command from the left sidebar of JupyterLab.

    + +
    Launch Classic Notebook
    + +

    Jupyterlab does not support the older nbextensions

    + +

    These regrettably are not yet supported from within the JupyterLab UI, +but you can activate them through the Classic Notebook interface (see +above)

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin6/jupytext.html b/public/merlin6/jupytext.html new file mode 100644 index 0000000..7a1f258 --- /dev/null +++ b/public/merlin6/jupytext.html @@ -0,0 +1,800 @@ + + + + + + + + +Jupytext - efficient editing | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Jupytext - efficient editing

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    Jupytext is a Jupyter serverextension that allows creating a text file from a notebook that can be kept in sync with it with the aim of using more efficient editors or IDEs on it. The file can be created in a number of formats, e.g. markdown, *.py (light Script), and others. Jupytext will keep the both the notebook and this paired file in sync: If you save the paired file, changes will be carried over into the notebook, and vice versa. This pairing will persist also in new sessions of your notebook until you explicitely remove it again.

    + +

    The paired file contains only the cell contents and not the output. Therefore it also is much better suited for revision control, since the differences between versions are limited to the cells and these file formats yield more meaningful text differences than the default notebook storage format.

    + +

    Creating a paired file in python format for efficient refactoring

    + +

    From your notebook, go to the file menu and navigate to the jupytext submenu. Select the light script pairing option. This will create a *.py file version with the same basename as your notebook file.

    + +
    Jupytext menu
    + +

    You can edit that file separately in your favourite python editor. The markdown text parts will be conserved in the file in the form of python comments.

    + +

    When you save the file and do a browser page reload of your jupyter notebook, you will see all the changes carried over into your jupyter notebook.

    + +

    Creating a paired file in mardown format for efficient text authoring

    + +

    If you want to efficiently work on the descriptive text base of your notebook, just pair it using the Pair notebook with Markdown menu item and edit the generated *.md file with your favourite Markdown editor.

    + +

    Disable autosaving when working on the paired file

    + +

    Your notebooks usually auto save every 2 min (default). Turn this feature off when working with the paired file. Otherwise Jupyter will continue to save the state while you are editing the paired file, and the changes will be synced to the disk version of the paired file. You can disable the autosave by unchecking the Autosave notebook menu item in the Juytext menu (see above image).

    + +

    Further information

    + +

    Please refer to

    + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin6/kerberos.html b/public/merlin6/kerberos.html new file mode 100644 index 0000000..ea18d49 --- /dev/null +++ b/public/merlin6/kerberos.html @@ -0,0 +1,959 @@ + + + + + + + + +Kerberos and AFS authentication | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Kerberos and AFS authentication

    +
    + + + +
    + + +
    This document describes how to use Kerberos.
    + + + + + + + +
    + + + + + + +

    Projects and users have their own areas in the central PSI AFS service. In order +to access to these areas, valid Kerberos and AFS tickets must be granted.

    + +

    These tickets are automatically granted when accessing through SSH with +username and password. Alternatively, one can get a granting ticket with the kinit (Kerberos) +and aklog (AFS ticket, which needs to be run after kinit) commands.

    + +

    Due to PSI security policies, the maximum lifetime of the ticket is 7 days, and the default +time is 10 hours. It means than one needs to constantly renew (krenew command) the existing +granting tickets, and their validity can not be extended longer than 7 days. At this point, +one needs to obtain new granting tickets.

    + +

    Obtaining granting tickets with username and password

    + +

    As already described above, the most common use case is to obtain Kerberos and AFS granting tickets +by introducing username and password:

    +
      +
    • When login to Merlin through SSH protocol, if this is done with username + password authentication, +tickets for Kerberos and AFS will be automatically obtained.
    • +
    • When login to Merlin through NoMachine, no Kerberos and AFS are granted. Therefore, users need to +run kinit (to obtain a granting Kerberos ticket) followed by aklog (to obtain a granting AFS ticket). +See further details below.
    • +
    + +

    To manually obtain granting tickets, one has to:

    +
      +
    1. To obtain a granting Kerberos ticket, one needs to run kinit $USER and enter the PSI password. +
      kinit $USER@D.PSI.CH
      +
      +
    2. +
    3. To obtain a granting ticket for AFS, one needs to run aklog. No password is necessary, but a valid +Kerberos ticket is mandatory. +
      aklog
      +
      +
    4. +
    5. To list the status of your granted tickets, users can use the klist command. +
      klist
      +
      +
    6. +
    7. To extend the validity of existing granting tickets, users can use the krenew command. +
      krenew
      +
      +
        +
      • Keep in mind that the maximum lifetime for granting tickets is 7 days, therefore krenew can not be used beyond that limit, +and then `kinit** should be used instead.
      • +
      +
    8. +
    + +

    Obtanining granting tickets with keytab

    + +

    Sometimes, obtaining granting tickets by using password authentication is not possible. An example are user Slurm jobs +requiring access to private areas in AFS. For that, there’s the possibility to generate a keytab file.

    + +

    Be aware that the keytab file must be private, fully protected by correct permissions and not shared with any +other users.

    + +

    Creating a keytab file

    + +

    For generating a keytab, one has to:

    + +
      +
    1. Load a newer Kerberos ( krb5/1.20 or higher) from Pmodules: +
      module load krb5/1.20
      +
      +
    2. +
    3. Create a private directory for storing the Kerberos keytab file +
      mkdir -p ~/.k5
      +
      +
    4. +
    5. Run the ktutil utility which comes with the loaded krb5 Pmodule: +
      ktutil
      +
      +
    6. +
    7. In the ktutil console, one has to generate a keytab file as follows: +
      # Replace $USER by your username
      +add_entry -password -k 0 -f -p $USER
      +wkt /psi/home/$USER/.k5/krb5.keytab
      +exit
      +
      +

      Notice that you will need to add your password once. This step is required for generating the keytab file.

      +
    8. +
    9. Once back to the main shell, one has to ensure that the file contains the proper permissions: +
      chmod 0600 ~/.k5/krb5.keytab
      +
      +
    10. +
    + +

    Obtaining tickets by using keytab files

    + +

    Once the keytab is created, one can obtain kerberos tickets without being prompted for a password as follows:

    + +
    kinit -kt ~/.k5/krb5.keytab $USER
    +aklog
    +
    + +

    Slurm jobs accessing AFS

    + +

    Some jobs may require to access private areas in AFS. For that, having a valid keytab file is required. +Then, from inside the batch script one can obtain granting tickets for Kerberos and AFS, which can be used for accessing AFS private areas.

    + +

    The steps should be the following:

    + +
      +
    • Setup KRB5CCNAME, which can be used to specify the location of the Kerberos5 credentials (ticket) cache. In general it should point to a shared area +($HOME/.k5 is a good location), and is strongly recommended to generate an independent Kerberos5 credential cache (it is, creating a new credential cache per Slurm job): +
      export KRB5CCNAME="$(mktemp "$HOME/.k5/krb5cc_XXXXXX")"
      +
      +
    • +
    • To obtain a Kerberos5 granting ticket, run kinit by using your keytab: +
      kinit -kt "$HOME/.k5/krb5.keytab" $USER@D.PSI.CH
      +
      +
    • +
    • To obtain a granting AFS ticket, run aklog: +
      aklog
      +
      +
    • +
    • At the end of the job, you can remove destroy existing Kerberos tickets. +
      kdestroy
      +
      +
    • +
    + +

    Slurm batch script example: obtaining KRB+AFS granting tickets

    + +

    Example 1: Independent crendetial cache per Slurm job

    + +

    This is the recommended way. At the end of the job, is strongly recommended to remove / destroy the existing kerberos tickets.

    + +
    #!/bin/bash
    +#SBATCH --partition=hourly            # Specify 'general' or 'daily' or 'hourly'
    +#SBATCH --time=01:00:00               # Strictly recommended when using 'general' partition.
    +#SBATCH --output=run.out              # Generate custom output file
    +#SBATCH --error=run.err               # Generate custom error  file
    +#SBATCH --nodes=1                     # Uncomment and specify #nodes to use
    +#SBATCH --ntasks=1                    # Uncomment and specify #nodes to use 
    +#SBATCH --cpus-per-task=1
    +#SBATCH --constraint=xeon-gold-6152
    +#SBATCH --hint=nomultithread
    +#SBATCH --job-name=krb5
    +
    +export KRB5CCNAME="$(mktemp "$HOME/.k5/krb5cc_XXXXXX")"
    +kinit -kt "$HOME/.k5/krb5.keytab" $USER@D.PSI.CH
    +aklog
    +klist
    +
    +echo "Here should go my batch script code."
    +
    +# Destroy Kerberos tickets created for this job only
    +kdestroy
    +klist
    +
    + +

    Example 2: Shared credential cache

    + +

    Some users may need/prefer to run with a shared cache file. For doing that, one needs to +setup KRB5CCNAME from the login node session, before submitting the job.

    + +
    export KRB5CCNAME="$(mktemp "$HOME/.k5/krb5cc_XXXXXX")"
    +
    + +

    Then, you can run one or multiple jobs scripts (or parallel job with srun). KRB5CCNAME will be propagated to the +job script or to the parallel job, therefore a single credential cache will be shared amongst different Slurm runs.

    + +
    
    +#!/bin/bash
    +#SBATCH --partition=hourly            # Specify 'general' or 'daily' or 'hourly'
    +#SBATCH --time=01:00:00               # Strictly recommended when using 'general' partition.
    +#SBATCH --output=run.out              # Generate custom output file
    +#SBATCH --error=run.err               # Generate custom error  file
    +#SBATCH --nodes=1                     # Uncomment and specify #nodes to use
    +#SBATCH --ntasks=1                    # Uncomment and specify #nodes to use 
    +#SBATCH --cpus-per-task=1
    +#SBATCH --constraint=xeon-gold-6152
    +#SBATCH --hint=nomultithread
    +#SBATCH --job-name=krb5
    +
    +# KRB5CCNAME is inherit from the login node session
    +kinit -kt "$HOME/.k5/krb5.keytab" $USER@D.PSI.CH
    +aklog
    +klist
    +
    +echo "Here should go my batch script code."
    +
    +echo "No need to run 'kdestroy', as it may have to survive for running other jobs"
    +
    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin6/known-problems.html b/public/merlin6/known-problems.html new file mode 100644 index 0000000..3ea9c25 --- /dev/null +++ b/public/merlin6/known-problems.html @@ -0,0 +1,932 @@ + + + + + + + + +Known Problems | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Known Problems

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    Common errors

    + +

    Illegal instruction error

    + +

    It may happened that your code, compiled on one machine will not be executed on another throwing exception like “(Illegal instruction)”. +This is usually because the software was compiled with a set of instructions newer than the ones available in the node where the software runs, +and it mostly depends on the processor generation.

    + +

    In example, merlin-l-001 and merlin-l-002 contain a newer generation of processors than the old GPUs nodes, or than the Merlin5 cluster. +Hence, unless one compiles the software with compatibility with set of instructions from older processors, it will not run on old nodes. +Sometimes, this is properly set by default at the compilation time, but sometimes is not.

    + +

    For GCC, please refer to GCC x86 Options for compiling options. In case of doubts, contact us.

    + +

    Slurm

    + +

    sbatch using one core despite setting -c/–cpus-per-task

    + +

    From Slurm v22.05.6, the behavior of srun has changed. Merlin has been updated to this version since Tuesday 13.12.2022.

    + +

    srun will no longer read in SLURM_CPUS_PER_TASK, which is typically set when defining -c/--cpus-per-task in the sbatch command. +This means you will implicitly have to specify -c\--cpus-per-task also on your srun calls, or set the new SRUN_CPUS_PER_TASK environment variable to accomplish the same thing. +Therefore, unless this is implicitly specified, srun will use only one Core per task (resulting in 2 CPUs per task when multithreading is enabled)

    + +

    An example for setting up srun with -c\--cpus-per-task:

    +
    (base)[caubet_m@merlin-l-001:/data/user/caubet_m]# cat mysbatch_method1
    +#!/bin/bash
    +#SBATCH -n 1
    +#SBATCH --cpus-per-task=8
    +
    +echo 'From Slurm v22.05.8 srun does not inherit $SLURM_CPUS_PER_TASK'
    +srun python -c "import os; print(os.sched_getaffinity(0))"
    +
    +echo 'One has to implicitly specify $SLURM_CPUS_PER_TASK'
    +echo 'In this example, by setting -c/--cpus-per-task in srun'
    +srun --cpus-per-task=$SLURM_CPUS_PER_TASK python -c "import os; print(os.sched_getaffinity(0))"
    +
    +(base)[caubet_m@merlin-l-001:/data/user/caubet_m]# sbatch mysbatch_method1
    +Submitted batch job 8000813
    +
    +(base)[caubet_m@merlin-l-001:/data/user/caubet_m]# cat slurm-8000813.out 
    +From Slurm v22.05.8 srun does not inherit $SLURM_CPUS_PER_TASK
    +{1, 45}
    +One has to implicitly specify $SLURM_CPUS_PER_TASK
    +In this example, by setting -c/--cpus-per-task in srun
    +{1, 2, 3, 4, 45, 46, 47, 48}
    +
    + +

    An example to accomplish the same thing with the SRUN_CPUS_PER_TASK environment variable:

    +
    (base)[caubet_m@merlin-l-001:/data/user/caubet_m]# cat mysbatch_method2
    +#!/bin/bash
    +#SBATCH -n 1
    +#SBATCH --cpus-per-task=8
    +
    +echo 'From Slurm v22.05.8 srun does not inherit $SLURM_CPUS_PER_TASK'
    +srun python -c "import os; print(os.sched_getaffinity(0))"
    +
    +echo 'One has to implicitly specify $SLURM_CPUS_PER_TASK'
    +echo 'In this example, by setting an environment variable SRUN_CPUS_PER_TASK'
    +export SRUN_CPUS_PER_TASK=$SLURM_CPUS_PER_TASK
    +srun python -c "import os; print(os.sched_getaffinity(0))"
    +
    +
    +(base)[caubet_m@merlin-l-001:/data/user/caubet_m]# sbatch mysbatch_method2
    +Submitted batch job 8000815
    +
    +(base)[caubet_m@merlin-l-001:/data/user/caubet_m]# cat slurm-8000815.out 
    +From Slurm v22.05.8 srun does not inherit $SLURM_CPUS_PER_TASK
    +{1, 45}
    +One has to implicitly specify $SLURM_CPUS_PER_TASK
    +In this example, by setting an environment variable SRUN_CPUS_PER_TASK
    +{1, 2, 3, 4, 45, 46, 47, 48}
    +
    + +

    General topics

    + +

    Default SHELL

    + +

    In general, /bin/bash is the recommended default user’s SHELL when working in Merlin.

    + +

    Some users might notice that BASH is not the default SHELL when logging in to Merlin systems, or they might need to run a different SHELL. +This is probably because when the PSI account was requested, no SHELL description was specified or a different one was requested explicitly by the requestor. +Users can check which is the default SHELL specified in the PSI account with the following command:

    + +
    getent passwd $USER | awk -F: '{print $NF}'
    +
    + +

    If SHELL does not correspond to the one you need to use, you should request a central change for it. +This is because Merlin accounts are central PSI accounts. Hence, change must be requested via PSI Service Now.

    + +

    Alternatively, if you work on other PSI Linux systems but for Merlin you need a different SHELL type, a temporary change can be performed during login startup. +You can update one of the following files:

    +
      +
    • ~/.login
    • +
    • ~/.profile
    • +
    • Any rc or profile file in your home directory (i.e. .cshrc, .bashrc, .bash_profile, etc.)
    • +
    + +

    with the following lines:

    + +
    # Replace MY_SHELL with the bash type you need
    +MY_SHELL=/bin/bash
    +exec $MY_SHELL -l
    +
    + +

    Notice that available shells can be found in the following file:

    + +
    cat /etc/shells
    +
    + +

    3D acceleration: OpenGL vs Mesa

    + +

    Some applications can run with OpenGL support. This is only possible when the node contains a GPU card.

    + +

    In general, X11 with Mesa Driver is the recommended method as it will work in all cases (no need of GPUs). In example, for ParaView:

    + +
    module load paraview
    +paraview-mesa paraview   # 'paraview --mesa' for old releases
    +
    + +

    However, if one needs to run with OpenGL support, this is still possible by running vglrun. In example, for running Paraview:

    + +
    module load paraview
    +vglrun paraview
    +
    + +

    Officially, the supported method for running vglrun is by using the NoMachine remote desktop. +Running vglrun it’s also possible using SSH with X11 Forwarding. However, it’s very slow and it’s only recommended when running +in Slurm (from NoMachine). Please, avoid running vglrun over SSH from a desktop or laptop.

    + +

    Software

    + +

    ANSYS

    + +

    Sometimes, running ANSYS/Fluent requires X11 support. For that, one should run fluent as follows.

    + +
    module load ANSYS
    +fluent -driver x11
    +
    + +

    Paraview

    + +

    For running Paraview, one can run it with Mesa support or OpenGL support. Please refer to OpenGL vs Mesa for +further information about how to run it.

    + +

    Module command not found

    + +

    In some circumstances the module command may not be initialized properly. For instance, you may see the following error upon logon:

    + +
    bash: module: command not found
    +
    + +

    The most common cause for this is a custom .bashrc file which fails to source the global /etc/bashrc responsible for setting up PModules in some OS versions. To fix this, add the following to $HOME/.bashrc:

    + +
    if [ -f /etc/bashrc ]; then
    +    . /etc/bashrc
    +fi
    +
    + +

    It can also be fixed temporarily in an existing terminal by running . /etc/bashrc manually.

    + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin6/merlin-rmount.html b/public/merlin6/merlin-rmount.html new file mode 100644 index 0000000..e9387bd --- /dev/null +++ b/public/merlin6/merlin-rmount.html @@ -0,0 +1,865 @@ + + + + + + + + +Using merlin_rmount | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Using merlin_rmount

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    Background

    + +

    Merlin provides a command for mounting remote file systems, called merlin_rmount. This +provides a helpful wrapper over the Gnome storage utilities (GIO and GVFS), and provides support for a wide range of remote file formats, including

    +
      +
    • SMB/CIFS (Windows shared folders)
    • +
    • WebDav
    • +
    • AFP
    • +
    • FTP, SFTP
    • +
    • complete list
    • +
    + +

    Usage

    + +

    Start a session

    + +

    First, start a new session. This will start a new bash shell in the current terminal where you can add further commands.

    + +
    $ merlin_rmount --init
    +[INFO] Starting new D-Bus RMOUNT session
    +
    +(RMOUNT STARTED) [bliven_s@merlin-l-002 ~]$
    +
    + +

    Note that behind the scenes this is creating a new dbus daemon. Running multiple daemons on the same login node leads to unpredictable results, so it is best not to initialize multiple sessions in parallel.

    + +

    Standard Endpoints

    + +

    Standard endpoints can be mounted using

    + +
    merlin_rmount --select-mount
    +
    + +

    Select the desired url using the arrow keys.

    + +

    merlin_rmount --select-mount

    + +

    From this list any of the standard supported endpoints can be mounted.

    + +

    Other endpoints

    + +

    Other endpoints can be mounted using the merlin_rmount --mount <endpoint> command.

    + +

    merlin_rmount --mount

    + +

    Accessing Files

    + +

    After mounting a volume the script will print the mountpoint. It should be of the form

    + +
    /run/user/$UID/gvfs/<endpoint>
    +
    + +

    where $UID gives your unix user id (a 5-digit number, also viewable with id -u) and +<endpoint> is some string generated from the mount options.

    + +

    For convenience, it may be useful to add a symbolic link for this gvfs directory. For instance, this would allow all volumes to be accessed in ~/mnt/:

    + +
    ln -s ~/mnt /run/user/$UID/gvfs
    +
    + +

    Files are accessible as long as the merlin_rmount shell remains open.

    + +

    Disconnecting

    + +

    To disconnect, close the session with one of the following:

    + +
      +
    • The exit command
    • +
    • CTRL-D
    • +
    • Closing the terminal
    • +
    + +

    Disconnecting will unmount all volumes.

    + +

    Alternatives

    + +

    Thunar

    + +

    Users that prefer a GUI file browser may prefer the thunar command, which opens the Gnome File Browser. This is also available in NoMachine sessions in the bottom bar (1). Thunar supports the same remote filesystems as merlin_rmount; just type the URL in the address bar (2).

    + +

    Mounting with thunar

    + +

    When using thunar within a NoMachine session, file transfers continue after closing NoMachine (as long as the NoMachine session stays active).

    + +

    Files can also be accessed at the command line as needed (see ‘Accessing Files’ above).

    + +

    Resources

    + + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin6/migrating.html b/public/merlin6/migrating.html new file mode 100644 index 0000000..5946690 --- /dev/null +++ b/public/merlin6/migrating.html @@ -0,0 +1,988 @@ + + + + + + + + +Migration From Merlin5 | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Migration From Merlin5

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    Directories

    + +

    Merlin5 vs Merlin6

    + + + + + + + + + + + + + + + + + + + + + + + + +
    ClusterHome DirectoryUser Home DirectoryGroup Home Directory
    merlin5/gpfs/home/$username/gpfs/data/$username/gpfs/group/$laboratory
    merlin6/psi/home/$username/data/user/$username/data/project/[general|bio]/$projectname
    + +

    Quota limits in Merlin6

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    DirectoryQuota_Type [Soft:Hard] (Block)Quota_Type [Soft:Hard] (Files)Quota Change Policy: BlockQuota Change Policy: Files
    /psi/home/$usernameUSR [10GB:11GB]UndefUp to x2 when strictly justified.N/A
    /data/user/$usernameUSR [1TB:1.074TB]USR [1M:1.1M]Inmutable. Need a project.Changeable when justified.
    /data/project/bio/$projectnameGRP+Fileset [1TB:1.074TB]GRP+Fileset [1M:1.1M]Changeable according to project requirements.Changeable according to project requirements.
    /data/project/general/$projectnameGRP+Fileset [1TB:1.074TB]GRP+Fileset [1M:1.1M]Changeable according to project requirements.Changeable according to project requirements.
    + +

    where:

    +
      +
    • Block is capacity size in GB and TB
    • +
    • Files is number of files + directories in Millions (M)
    • +
    • Quota types are the following: +
        +
      • USR: Quota is setup individually per user name
      • +
      • GRP: Quota is setup individually per Unix Group name
      • +
      • Fileset: Quota is setup per project root directory.
      • +
      +
    • +
    • User data directory /data/user has a strict user block quota limit policy. If more disk space is required, ‘project’ must be created.
    • +
    • Soft quotas can be exceeded for short periods of time. Hard quotas cannot be exceeded.
    • +
    + +

    Project directory

    + +

    Why is ‘project’ needed?

    + +

    Merlin6 introduces the concept of a project directory. These are the recommended location for all scientific data.

    + +
      +
    • /data/user is not suitable for sharing data between users
    • +
    • The Merlin5 group directories were a similar concept, but the association with a single organizational group made +interdepartmental sharing difficult. Projects can be shared by any PSI user.
    • +
    • Projects are shared by multiple users (at a minimum they should be shared with the supervisor/PI). This decreases +the chance of data being orphaned by personnel changes.
    • +
    • Shared projects are preferable to individual data for transparency and accountability in event of future questions +regarding the data.
    • +
    • One project member is designated as responsible. Responsibility can be transferred if needed.
    • +
    + +

    Requesting a project

    + +

    Refer to Requesting a project

    + +
    + +

    Migration Schedule

    + +

    Phase 1 [June]: Pre-migration

    + +
      +
    • Users keep working on Merlin5 +
        +
      • Merlin5 production directories: '/gpfs/home/', '/gpfs/data', '/gpfs/group'
      • +
      +
    • +
    • Users may raise any problems (quota limits, unaccessible files, etc.) to merlin-admins@lists.psi.ch
    • +
    • Users can start migrating data (see Migration steps) +
        +
      • Users should copy their data from Merlin5 /gpfs/data to Merlin6 /data/user
      • +
      • Users should copy their home from Merlin5 /gpfs/home to Merlin6 /psi/home
      • +
      +
    • +
    • Users should inform when migration is done, and which directories were migrated. Deletion for such directories can be requested by admins.
    • +
    + +

    Phase 2 [July-October]: Migration to Merlin6

    + +
      +
    • Merlin6 becomes official cluster, and directories are switched to the new structure: +
        +
      • Merlin6 production directories: '/psi/home/', '/data/user', '/data/project'
      • +
      • Merlin5 directories available in RW in login nodes: '/gpfs/home/', '/gpfs/data', '/gpfs/group' +
          +
        • In Merlin5 computing nodes, Merlin5 directories are mounted in RW: '/gpfs/home/', '/gpfs/data', '/gpfs/group'
        • +
        • In Merlin5 computing nodes, Merlin6 directories are mounted in RW: '/psi/home/', '/data/user', '/data/project'
        • +
        +
      • +
      +
    • +
    • Users must migrate their data (see Migration steps) +
        +
      • ALL data must be migrated
      • +
      +
    • +
    • Job submissions by default to Merlin6. Submission to Merlin5 computing nodes possible.
    • +
    • Users should inform when migration is done, and which directories were migrated. Deletion for such directories can be requested by admins.
    • +
    + +

    Phase 3 [November]: Merlin5 Decomission

    + +
      +
    • Old Merlin5 storage unmounted.
    • +
    • Migrated directories reported by users will be deleted.
    • +
    • Remaining Merlin5 data will be archived.
    • +
    + +
    + +

    Migration steps

    + +

    Cleanup / Archive files

    + +
      +
    • Users must cleanup and/or archive files, according to the quota limits for the target storage.
    • +
    • If extra space is needed, we advise users to request a project
    • +
    • If you need a larger quota in respect to the maximal allowed number of files, you can request an increase of your user quota.
    • +
    + +

    File list

    + +

    Step 1: Migrating

    + +

    First migration:

    + +
    rsync -avAHXS <source_merlin5> <destination_merlin6>
    +rsync -avAHXS /gpfs/data/$username/* /data/user/$username
    +
    + +

    This can take several hours or days:

    +
      +
    • You can try to parallelize multiple rsync commands in sub-directories for increasing transfer rate.
    • +
    • Please do not parallelize many concurrent directories. Let’s say, don’t add more than 10 together. +
        +
      • We may have other users doing the same and it could cause storage / UI performance problems in the Merlin5 cluster.
      • +
      +
    • +
    + +

    Step 2: Mirroring

    + +

    Once first migration is done, a second rsync should be ran. This is done with --delete. With this option rsync will +behave in a way where it will delete from the destination all files that were removed in the source, but also will propagate +new files from the source to the destination.

    + +
    rsync -avAHXS --delete <source_merlin5> <destination_merlin6>
    +rsync -avAHXS --delete /gpfs/data/$username/* /data/user/$username
    +
    + +

    Step 3: Removing / Archiving old data

    + +

    Removing migrated data

    + +

    Once you ensure that everything is migrated to the new storage, data is ready to be deleted from the old storage. +Users must report when migration is finished and report which directories are affected and ready to be removed.

    + +

    Merlin administrators will remove the directories, always asking for a last confirmation.

    + +

    Archiving data

    + +

    Once all migrated data has been removed from the old storage, missing data will be archived.

    + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin6/monitoring.html b/public/merlin6/monitoring.html new file mode 100644 index 0000000..afb1c86 --- /dev/null +++ b/public/merlin6/monitoring.html @@ -0,0 +1,1061 @@ + + + + + + + + +Monitoring | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Monitoring

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    Slurm Monitoring

    + +

    Job status

    + +

    The status of submitted jobs can be check with the squeue command:

    + +
    squeue -u $username
    +
    + +

    Common statuses:

    + +
      +
    • merlin-*: Running on the specified host
    • +
    • (Priority): Waiting in the queue
    • +
    • (Resources): At the head of the queue, waiting for machines to become available
    • +
    • (AssocGrpCpuLimit), (AssocGrpNodeLimit): Job would exceed per-user limitations on +the number of simultaneous CPUs/Nodes. Use scancel to remove the job and +resubmit with fewer resources, or else wait for your other jobs to finish.
    • +
    • (PartitionNodeLimit): Exceeds all resources available on this partition. +Run scancel and resubmit to a different partition (-p) or with fewer +resources.
    • +
    + +

    Check in the man pages (man squeue) for all possible options for this command.

    + +
    +[Show 'squeue' example] +
    +[root@merlin-slurmctld01 ~]# squeue -u feichtinger
    +             JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
    +         134332544   general spawner- feichtin  R 5-06:47:45      1 merlin-c-204
    +         134321376   general subm-tal feichtin  R 5-22:27:59      1 merlin-c-204
    +
    +
    + +

    Partition status

    + +

    The status of the nodes and partitions (a.k.a. queues) can be seen with the sinfo command:

    + +
    sinfo
    +
    + +

    Check in the man pages (man sinfo) for all possible options for this command.

    + +
    +[Show 'sinfo' example] +
    +[root@merlin-l-001 ~]# sinfo -l
    +Thu Jan 23 16:34:49 2020
    +PARTITION AVAIL  TIMELIMIT   JOB_SIZE ROOT OVERSUBS     GROUPS  NODES       STATE NODELIST
    +test         up 1-00:00:00 1-infinite   no       NO        all      3       mixed merlin-c-[024,223-224]
    +test         up 1-00:00:00 1-infinite   no       NO        all      2   allocated merlin-c-[123-124]
    +test         up 1-00:00:00 1-infinite   no       NO        all      1        idle merlin-c-023
    +general*     up 7-00:00:00       1-50   no       NO        all      6       mixed merlin-c-[007,204,207-209,219]
    +general*     up 7-00:00:00       1-50   no       NO        all     57   allocated merlin-c-[001-005,008-020,101-122,201-203,205-206,210-218,220-222]
    +general*     up 7-00:00:00       1-50   no       NO        all      3        idle merlin-c-[006,021-022]
    +daily        up 1-00:00:00       1-60   no       NO        all      9       mixed merlin-c-[007,024,204,207-209,219,223-224]
    +daily        up 1-00:00:00       1-60   no       NO        all     59   allocated merlin-c-[001-005,008-020,101-124,201-203,205-206,210-218,220-222]
    +daily        up 1-00:00:00       1-60   no       NO        all      4        idle merlin-c-[006,021-023]
    +hourly       up    1:00:00 1-infinite   no       NO        all      9       mixed merlin-c-[007,024,204,207-209,219,223-224]
    +hourly       up    1:00:00 1-infinite   no       NO        all     59   allocated merlin-c-[001-005,008-020,101-124,201-203,205-206,210-218,220-222]
    +hourly       up    1:00:00 1-infinite   no       NO        all      4        idle merlin-c-[006,021-023]
    +gpu          up 7-00:00:00 1-infinite   no       NO        all      1       mixed merlin-g-007
    +gpu          up 7-00:00:00 1-infinite   no       NO        all      8   allocated merlin-g-[001-006,008-009]
    +
    +
    + +

    Slurm commander

    + +

    The Slurm Commander (scom) is a simple but very useful open source text-based user interface for +simple and efficient interaction with Slurm. It is developed by the CLoud Infrastructure Project (CLIP-HPC) and external contributions. To use it, one can +simply run the following command:

    + +
    scom                         # merlin6 cluster
    +SLURM_CLUSTERS=merlin5  scom # merlin5 cluster
    +SLURM_CLUSTERS=gmerlin6 scom # gmerlin6 cluster
    +scom -h                      # Help and extra options
    +scom -d 14                   # Set Job History to 14 days (instead of default 7)
    +
    +

    With this simple interface, users can interact with their jobs, as well as getting information about past and present jobs:

    +
      +
    • Filtering jobs by substring is possible with the / key.
    • +
    • Users can perform multiple actions on their jobs (such like cancelling, holding or requeing a job), SSH to a node with an already running job, +or getting extended details and statistics of the job itself.
    • +
    + +

    Also, users can check the status of the cluster, to get statistics and node usage information as well as getting information about node properties.

    + +

    The interface also provides a few job templates for different use cases (i.e. MPI, OpenMP, Hybrid, single core). Users can modify these templates, +save it locally to the current directory, and submit the job to the cluster.

    + + + +

    For further information about how to use scom, please refer to the Slurm Commander Project webpage

    + +

    'scom' text-based user interface

    + +

    Job accounting

    + +

    Users can check detailed information of jobs (pending, running, completed, failed, etc.) with the sacct command. +This command is very flexible and can provide a lot of information. For checking all the available options, please read man sacct. +Below, we summarize some examples that can be useful for the users:

    + +
    # Today jobs, basic summary
    +sacct
    +
    +# Today jobs, with details
    +sacct --long
    +
    +# Jobs from January 1, 2022, 12pm, with details
    +sacct -S 2021-01-01T12:00:00 --long
    +
    +# Specific job accounting
    +sacct --long -j $jobid
    +
    +# Jobs custom details, without steps (-X)
    +sacct -X --format=User%20,JobID,Jobname,partition,state,time,submit,start,end,elapsed,AveRss,MaxRss,MaxRSSTask,MaxRSSNode%20,MaxVMSize,nnodes,ncpus,ntasks,reqcpus,totalcpu,reqmem,cluster,TimeLimit,TimeLimitRaw,cputime,nodelist%50,AllocTRES%80
    +
    +# Jobs custom details, with steps
    +sacct --format=User%20,JobID,Jobname,partition,state,time,submit,start,end,elapsed,AveRss,MaxRss,MaxRSSTask,MaxRSSNode%20,MaxVMSize,nnodes,ncpus,ntasks,reqcpus,totalcpu,reqmem,cluster,TimeLimit,TimeLimitRaw,cputime,nodelist%50,AllocTRES%80
    +
    + +

    Job efficiency

    + +

    Users can check how efficient are their jobs. For that, the seff command is available.

    + +
    seff $jobid
    +
    + +
    +[Show 'seff' example] +
    +[root@merlin-slurmctld01 ~]# seff 134333893
    +Job ID: 134333893
    +Cluster: merlin6
    +User/Group: albajacas_a/unx-sls
    +State: COMPLETED (exit code 0)
    +Nodes: 1
    +Cores per node: 8
    +CPU Utilized: 00:26:15
    +CPU Efficiency: 49.47% of 00:53:04 core-walltime
    +Job Wall-clock time: 00:06:38
    +Memory Utilized: 60.73 MB
    +Memory Efficiency: 0.19% of 31.25 GB
    +
    +
    + +

    List job attributes

    + +

    The sjstat command is used to display statistics of jobs under control of SLURM. To use it

    + +
    sjstat
    +
    + +
    +[Show 'sjstat' example] +
    +[root@merlin-l-001 ~]# sjstat -v
    +
    +Scheduling pool data:
    +----------------------------------------------------------------------------------
    +                           Total  Usable   Free   Node   Time      Other          
    +Pool         Memory  Cpus  Nodes   Nodes  Nodes  Limit  Limit      traits         
    +----------------------------------------------------------------------------------
    +test        373502Mb    88      6       6      1  UNLIM 1-00:00:00   
    +general*    373502Mb    88     66      66      8     50 7-00:00:00   
    +daily       373502Mb    88     72      72      9     60 1-00:00:00   
    +hourly      373502Mb    88     72      72      9  UNLIM   01:00:00   
    +gpu         128000Mb     8      1       1      0  UNLIM 7-00:00:00   
    +gpu         128000Mb    20      8       8      0  UNLIM 7-00:00:00   
    +
    +Running job data:
    +---------------------------------------------------------------------------------------------------
    +                                                 Time        Time            Time                  
    +JobID    User      Procs Pool      Status        Used       Limit         Started  Master/Other    
    +---------------------------------------------------------------------------------------------------
    +13433377 collu_g       1 gpu       PD            0:00    24:00:00             N/A  (Resources)
    +13433389 collu_g      20 gpu       PD            0:00    24:00:00             N/A  (Resources)
    +13433382 jaervine      4 gpu       PD            0:00    24:00:00             N/A  (Priority)
    +13433386 barret_d     20 gpu       PD            0:00    24:00:00             N/A  (Priority)
    +13433382 pamula_f     20 gpu       PD            0:00   168:00:00             N/A  (Priority)
    +13433387 pamula_f      4 gpu       PD            0:00    24:00:00             N/A  (Priority)
    +13433365 andreani    132 daily     PD            0:00    24:00:00             N/A  (Dependency)
    +13433388 marino_j      6 gpu       R          1:43:12   168:00:00  01-23T14:54:57  merlin-g-007
    +13433377 choi_s       40 gpu       R          2:09:55    48:00:00  01-23T14:28:14  merlin-g-006
    +13433373 qi_c         20 gpu       R          7:00:04    24:00:00  01-23T09:38:05  merlin-g-004
    +13433390 jaervine      2 gpu       R             5:18    24:00:00  01-23T16:32:51  merlin-g-007
    +13433390 jaervine      2 gpu       R            15:18    24:00:00  01-23T16:22:51  merlin-g-007
    +13433375 bellotti      4 gpu       R          7:35:44     9:00:00  01-23T09:02:25  merlin-g-001
    +13433358 bellotti      1 gpu       R       1-05:52:19   144:00:00  01-22T10:45:50  merlin-g-007
    +13433377 lavriha_     20 gpu       R          5:13:24    24:00:00  01-23T11:24:45  merlin-g-008
    +13433370 lavriha_     40 gpu       R         22:43:09    24:00:00  01-22T17:55:00  merlin-g-003
    +13433373 qi_c         20 gpu       R         15:03:15    24:00:00  01-23T01:34:54  merlin-g-002
    +13433371 qi_c          4 gpu       R         22:14:14   168:00:00  01-22T18:23:55  merlin-g-001
    +13433254 feichtin      2 general   R       5-07:26:11   156:00:00  01-18T09:11:58  merlin-c-204
    +13432137 feichtin      2 general   R       5-23:06:25   160:00:00  01-17T17:31:44  merlin-c-204
    +13433389 albajaca     32 hourly    R            41:19     1:00:00  01-23T15:56:50  merlin-c-219
    +13433387 riemann_      2 general   R          1:51:47     4:00:00  01-23T14:46:22  merlin-c-204
    +13433370 jimenez_      2 general   R         23:20:45   168:00:00  01-22T17:17:24  merlin-c-106
    +13433381 jimenez_      2 general   R          4:55:33   168:00:00  01-23T11:42:36  merlin-c-219
    +13433390 sayed_m     128 daily     R            21:49    10:00:00  01-23T16:16:20  merlin-c-223
    +13433359 adelmann      2 general   R       1-05:00:09    48:00:00  01-22T11:38:00  merlin-c-204
    +13433377 zimmerma      2 daily     R          6:13:38    24:00:00  01-23T10:24:31  merlin-c-007
    +13433375 zohdirad     24 daily     R          7:33:16    10:00:00  01-23T09:04:53  merlin-c-218
    +13433363 zimmerma      6 general   R       1-02:54:20    47:50:00  01-22T13:43:49  merlin-c-106
    +13433376 zimmerma      6 general   R          7:25:42    23:50:00  01-23T09:12:27  merlin-c-007
    +13433371 vazquez_     16 daily     R         21:46:31    23:59:00  01-22T18:51:38  merlin-c-106
    +13433382 vazquez_     16 daily     R          4:09:23    23:59:00  01-23T12:28:46  merlin-c-024
    +13433376 jiang_j1    440 daily     R          7:11:14    10:00:00  01-23T09:26:55  merlin-c-123
    +13433376 jiang_j1     24 daily     R          7:08:19    10:00:00  01-23T09:29:50  merlin-c-220
    +13433384 kranjcev    440 daily     R          2:48:19    24:00:00  01-23T13:49:50  merlin-c-108
    +13433371 vazquez_     16 general   R         20:15:15   120:00:00  01-22T20:22:54  merlin-c-210
    +13433371 vazquez_     16 general   R         21:15:51   120:00:00  01-22T19:22:18  merlin-c-210
    +13433374 colonna_    176 daily     R          8:23:18    24:00:00  01-23T08:14:51  merlin-c-211
    +13433374 bures_l      88 daily     R         10:45:06    24:00:00  01-23T05:53:03  merlin-c-001
    +13433375 derlet       88 daily     R          7:32:05    24:00:00  01-23T09:06:04  merlin-c-107
    +13433373 derlet       88 daily     R         17:21:57    24:00:00  01-22T23:16:12  merlin-c-002
    +13433373 derlet       88 daily     R         18:13:05    24:00:00  01-22T22:25:04  merlin-c-112
    +13433365 andreani    264 daily     R          4:10:08    24:00:00  01-23T12:28:01  merlin-c-003
    +13431187 mahrous_     88 general   R       6-15:59:16   168:00:00  01-17T00:38:53  merlin-c-111
    +13433387 kranjcev      2 general   R          1:48:47     4:00:00  01-23T14:49:22  merlin-c-204
    +13433368 karalis_    352 general   R       1-00:05:22    96:00:00  01-22T16:32:47  merlin-c-013
    +13433367 karalis_    352 general   R       1-00:06:44    96:00:00  01-22T16:31:25  merlin-c-118
    +13433385 karalis_    352 general   R          1:37:24    96:00:00  01-23T15:00:45  merlin-c-213
    +13433374 sato        256 general   R         14:55:55    24:00:00  01-23T01:42:14  merlin-c-204
    +13433374 sato         64 general   R         10:43:35    24:00:00  01-23T05:54:34  merlin-c-106
    +67723568 sato         32 general   R         10:40:07    24:00:00  01-23T05:58:02  merlin-c-007
    +13433265 khanppna    440 general   R       3-18:20:58   168:00:00  01-19T22:17:11  merlin-c-008
    +13433375 khanppna    704 general   R          7:31:24    24:00:00  01-23T09:06:45  merlin-c-101
    +13433371 khanppna    616 general   R         21:40:33    24:00:00  01-22T18:57:36  merlin-c-208
    +
    +
    + +

    Graphical user interface

    + +

    When using ssh with X11 forwarding (ssh -XY), or when using NoMachine, users can use sview. +SView is a graphical user interface to view and modify Slurm states. To run sview:

    + +
    ssh -XY $username@merlin-l-001.psi.ch # Not necessary when using NoMachine
    +sview
    +
    + +

    'sview' graphical user interface

    + +

    General Monitoring

    + +

    The following pages contain basic monitoring for Slurm and computing nodes. +Currently, monitoring is based on Grafana + InfluxDB. In the future it will +be moved to a different service based on ElasticSearch + LogStash + Kibana.

    + +

    In the meantime, the following monitoring pages are available in a best effort +support:

    + +

    Merlin6 Monitoring Pages

    + + + +

    Merlin5 Monitoring Pages

    + + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin6/nomachine.html b/public/merlin6/nomachine.html new file mode 100644 index 0000000..66bd1a6 --- /dev/null +++ b/public/merlin6/nomachine.html @@ -0,0 +1,887 @@ + + + + + + + + +Remote Desktop Access | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Remote Desktop Access

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    Users can login in Merlin through a Linux Remote Desktop Session. NoMachine +is a desktop virtualization tool. It is similar to VNC, Remote Desktop, etc. +It uses the NX protocol to enable a graphical login to remote servers.

    + +

    Installation

    + +

    NoMachine is available for PSI Windows computers in the Software Kiosk under the +name NX Client. Please use the latest version (at least 6.0). For MacOS and +Linux, the NoMachine client can be downloaded from https://www.nomachine.com/.

    + +

    Accessing Merlin6 NoMachine from PSI

    + +

    The Merlin6 NoMachine service is hosted in the following machine:

    + +
      +
    • merlin-nx.psi.ch
    • +
    + +

    This is the front-end (hence, the door) to the NoMachine back-end nodes, +which contain the NoMachine desktop service. The back-end nodes are the following:

    + +
      +
    • merlin-l-001.psi.ch
    • +
    • merlin-l-002.psi.ch
    • +
    + +

    Any access to the login node desktops must be done through merlin-nx.psi.ch +(or from rem-acc.psi.ch -> merlin-nx.psi.ch when connecting from outside PSI).

    + +

    The front-end service running on merlin-nx.psi.ch will load balance the sessions +and login to any of the available nodes in the back-end.

    + +

    Only 1 session per back-end is possible.

    + +

    Below are explained all the steps necessary for configuring the access to the +NoMachine service running on a login node.

    + +

    Creating a Merlin6 NoMachine connection

    + +

    Adding a new connection to the front-end

    + +

    Click the Add button to create a new connection to the merlin-nx.psi.ch front-end, and fill up +the following fields:

    +
      +
    • Name: Specify a custom name for the connection. Examples: merlin-nx, merlin-nx.psi.ch, Merlin Desktop
    • +
    • Host: Specify the hostname of the front-end service: merlin-nx.psi.ch
    • +
    • Protocol: specify the protocol that will be used for the connection. Recommended protocol: NX
    • +
    • Port: Specify the listening port of the front-end. It must be 4000.
    • +
    + +

    Create New NoMachine Connection

    + +

    Configuring NoMachine Authentication Method

    + +

    Depending on the client version, it may ask for different authentication options. +If it’s required, choose your authentication method and Continue (Password or Kerberos are the recommended ones).

    + +

    You will be requested for the crendentials (username / password). Do not add PSICH\ as a prefix for the username.

    + +

    Opening NoMachine desktop sessions

    + +

    By default, when connecting to the merlin-nx.psi.ch front-end it will automatically open a new +session if none exists.

    + +

    If there are existing sessions, instead of opening a new desktop session, users can reconnect to an +existing one by clicking to the proper icon (see image below).

    + +

    Open an existing Session

    + +

    Users can also create a second desktop session by selecting the New Desktop button (red rectangle in the +below image). This will create a second session on the second login node, as long as this node is up and running.

    + +

    Open a New Desktop

    + +

    NoMachine LightDM Session Example

    + +

    An example of the NoMachine session, which is based on LightDM +X Windows:

    + +

    NoMachine Session: LightDM Desktop

    + +

    Accessing Merlin6 NoMachine from outside PSI

    + +

    No VPN access

    + +

    Access to the Merlin6 NoMachine service is possible without VPN through ‘rem-acc.psi.ch’. +Please follow the steps described in PSI Remote Interactive Access for +remote access to the Merlin6 NoMachine services. Once logged in ‘rem-acc.psi.ch’, you must then login to the merlin-nx.psi.ch front-end . +services.

    + +

    VPN access

    + +

    Remote access is also possible through VPN, however, you must not use ‘rem-acc.psi.ch’, and you have to connect directly +to the Merlin6 NoMachine merlin-nx.psi.ch front-end as if you were inside PSI. For VPN access, you should request +it to the IT department by opening a PSI Service Now ticket: +VPN Access (PSI employees).

    + +

    Advanced Display Settings

    + +

    Nomachine Display Settings can be accessed and changed either when creating a new session or by clicking the very top right corner of a running session.

    + +

    Prevent Rescaling

    + +

    These settings prevent “bluriness” at the cost of some performance! (You might want to choose depending on performance)

    + +
      +
    • Display > Resize remote display (forces 1:1 pixel sizes)
    • +
    • Display > Change settings > Quality: Choose Medium-Best Quality
    • +
    • Display > Change settings > Modify advanced settings +
        +
      • Check: Disable network-adaptive display quality (diables lossy compression)
      • +
      • Check: Disable client side image post-processing
      • +
      +
    • +
    + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin6/openmpi.html b/public/merlin6/openmpi.html new file mode 100644 index 0000000..e356be0 --- /dev/null +++ b/public/merlin6/openmpi.html @@ -0,0 +1,903 @@ + + + + + + + + +OpenMPI Support | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    OpenMPI Support

    +
    + + + +
    + + +
    This document describes how to use OpenMPI in the Merlin6 cluster
    + + + + + + + +
    + + + + + + +

    Introduction

    + +

    This document describes which set of OpenMPI versions in PModules are supported in the Merlin6 cluster.

    + +

    srun

    + +

    We strongly recommend the use of ‘srun’ over ‘mpirun’ or ‘mpiexec’. Using ‘srun’ would properly +bind tasks in to cores and less customization is needed, while ‘mpirun’ and ‘mpiexec’ might need more advanced +configuration and should be only used by advanced users. Please, always adapt your scripts for using ‘srun’ +before opening a support ticket. Also, please contact us on any problem when using a module.

    + +

    Example:

    + +
    srun ./app
    +
    + + + +

    OpenMPI with UCX

    + +

    OpenMPI supports UCX starting from version 3.0, but it’s recommended to use version 4.0 or higher due to stability and performance improvements. +UCX should be used only by advanced users, as it requires to run it with mpirun (needs advanced knowledge) and is an exception for running MPI +without srun (UCX is not integrated at PSI within srun).

    + +

    For running UCX, one should:

    + +
      +
    • add the following options to mpirun: +
       -mca pml ucx --mca btl ^vader,tcp,openib,uct -x UCX_NET_DEVICES=mlx5_0:1
      +
      +
    • +
    • or alternatively, add the following options before mpirun +
       export OMPI_MCA_pml="ucx"
      + export OMPI_MCA_btl="^vader,tcp,openib,uct"
      + export UCX_NET_DEVICES=mlx5_0:1
      +
      +
    • +
    + +

    In addition, one can add the following options for debugging purposes (visit UCX Logging for possible UCX_LOG_LEVEL values):

    + +
    -x UCX_LOG_LEVEL=<data|debug|warn|info|...> -x UCX_LOG_FILE=<filename>
    +
    + +

    This can be also added externally before the mpirun call (see below example). Full example:

    + +
      +
    • Within the mpirun command: +
       mpirun -np $SLURM_NTASKS -mca pml ucx --mca btl ^vader,tcp,openib,uct -x UCX_NET_DEVICES=mlx5_0:1 -x UCX_LOG_LEVEL=data -x UCX_LOG_FILE=UCX-$SLURM_JOB_ID.log ./app
      +
      +
    • +
    • Outside the mpirun command: +
      export OMPI_MCA_pml="ucx"
      +export OMPI_MCA_btl="^vader,tcp,openib,uct"
      +export UCX_NET_DEVICES=mlx5_0:1
      +export UCX_LOG_LEVEL=data
      +export UCX_LOG_FILE=UCX-$SLURM_JOB_ID.log
      +
      +mpirun -np $SLURM_NTASKS ./app
      +
      +
    • +
    + +

    Supported OpenMPI versions

    + +

    For running OpenMPI properly in a Slurm batch system, OpenMPI and Slurm must be compiled accordingly.

    + +

    We can find a large number of compilations of OpenMPI modules in the PModules central repositories. However, only +some of them are suitable for running in a Slurm cluster: any OpenMPI versions with suffixes _slurm +are suitable for running in the Merlin6 cluster. Also, OpenMPI with suffix _merlin6 can be used, but these will be fully +replaced by the _slurm series in the future (so it can be used on any Slurm cluster at PSI). Please, avoid using any other OpenMPI releases.

    + + + +

    ‘unstable’ repository

    + +

    New OpenMPI versions that need to be tested will be compiled first in the unstable repository, and once validated will be moved to stable. +We can not ensure that modules in that repository are production ready, but you can use it at your own risk.

    + +

    For using unstable modules, you might need to load the unstable PModules repository as follows:

    +
    module use unstable
    +
    + +

    ‘stable’ repository

    + +

    Officially supported OpenMPI versions (https://www.open-mpi.org/) will be available in the stable repository (which is the default loaded repository). +For further information, please check https://www.open-mpi.org/software/ompi/ -> Current & Still Supported +versions.

    + +

    Usually, not more than 2 minor update releases will be present in the stable repository. Older minor update releases will be moved to deprecated +despite are officially supported. This will ensure that users compile new software with the latest stable versions, but we keep available the old versions +for software which was compiled with it.

    + +

    ‘deprecated’ repository

    + +

    Old OpenMPI versions (it is, any official OpenMPI version which has been moved to retired or ancient) will be +moved to the ‘deprecated’ PModules repository. +For further information, please check https://www.open-mpi.org/software/ompi/ -> Older Versions +versions.

    + +

    Also, as mentioned in before, older official supported OpenMPI releases (minor updates) will be moved to deprecated.

    + +

    For using deprecated modules, you might need to load the deprecated PModules repository as follows:

    +
    module use deprecated
    +
    +

    However, this is usually not needed: when loading directly a specific version in the deprecated repository, if this is not found in +stable it try to search and to fallback to other repositories (deprecated or unstable).

    + +

    About missing versions

    + +
    Missing OpenMPI versions
    + +

    For legacy software, some users might require a different OpenMPI version. We always encourage users to try one of the existing stable versions +(OpenMPI always with suffix _slurm or _merlin6!), as they will contain the latest bug fixes and they usually should work. In the worst case, you +can also try with the ones in the deprecated repository (again, OpenMPI always with suffix _slurm or _merlin6!), or for very old software which +was based on OpenMPI v1 you can follow the guide FAQ: Removed MPI constructs, which provides +some easy steps for migrating from OpenMPI v1 to v2 or superior or also is useful to find out why your code does not compile properly.

    + +

    When, after trying the mentioned versions and guide, you are still facing problems, please contact us. Also, please contact us if you require a newer +version with a different gcc or intel compiler (in example, Intel v19).

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin6/paraview.html b/public/merlin6/paraview.html new file mode 100644 index 0000000..e034a21 --- /dev/null +++ b/public/merlin6/paraview.html @@ -0,0 +1,821 @@ + + + + + + + + +Running Paraview | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Running Paraview

    +
    + + + +
    + + +
    This document describes how to run ParaView in the Merlin6 cluster
    + + + + + + + +
    + + + + + + +

    Requirements

    + +

    NoMachine is the official strongly recommended and supported tool for running ParaView. +Consider that running over SSH (X11-Forwarding needed) is very slow, but also configuration might not work as it also depends +on the client configuration (Linux workstation/laptop, Windows with XMing, etc.). Hence, please avoid running Paraview over SSH. +The only exception for running over SSH is when running it as a job from a NoMachine client.

    + +

    ParaView

    + +

    PModules

    + +

    Is strongly recommended the use of the latest ParaView version available in PModules. In example, for loading paraview:

    + +
    module use unstable
    +module load paraview/5.8.1
    +
    + +

    Running ParaView

    + +

    For running ParaView, one can run it with VirtualGL to take advantatge of the GPU card located on each login node. For that, once loaded, you can start paraview as follows:

    + +
    vglrun paraview
    +
    + +

    Alternatively, one can run paraview with mesa support with the below command. This can be useful when running on CPU computing nodes (with srun / salloc) +which have no graphics card (and where vglrun is not possible):

    + +
    paraview-mesa paraview
    +
    + +

    Running older versions of ParaView

    + +

    Older versions of ParaView available in PModules (i.e. paraview/5.0.1 and paraview/5.4.1) might require a different command +for running paraview with Mesa support. The command is the following:

    + +
    # Warning: only for Paraview 5.4.1 and older
    +paraview --mesa
    +
    + +

    Running ParaView interactively in the batch system

    + +

    One can run ParaView interactively in the CPU cluster as follows:

    + +
    # First, load module. In example: "module load paraview/5.8.1"
    +srun --pty --x11 --partition=general --ntasks=1 paraview-mesa paraview
    +
    + +

    One can change the partition, number of tasks or specify extra parameters to srun if needed.

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin6/past-downtimes.html b/public/merlin6/past-downtimes.html new file mode 100644 index 0000000..c97d23b --- /dev/null +++ b/public/merlin6/past-downtimes.html @@ -0,0 +1,942 @@ + + + + + + + + +Past Downtimes | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Past Downtimes

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    Past Downtimes: Log Changes

    + +

    2020

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    FromToServiceClustersDescriptionExceptions
    03.08.2020 8am03.08.2020 6pmArchivemerlin6Replace old merlin-export-01 for merlin-export-02 
    03.08.2020 8am03.08.2020 6pmRemoteAccessmerlin6ra-merlin-0[1,2] Remount merlin-export-02 
    06.07.202006.07.2020All servicesmerlin5,merlin6GPFS v5.0.4-4,OFED v5.0,YFS v0.195,RHEL7.7,Slurm v19.05.7,f/w 
    04.05.202004.05.2020Login nodesmerlin6Outage. YFS (AFS) update v0.194 and reboot 
    04.05.202004.05.2020CNmerlin5Outage. O.S. update, OFED drivers update, YFS (AFS) update. 
    03.02.2020 9am03.02.2020 10amSlurmmerlin5,merlin6Upgrading config HPCLOCAL-321 
    10.01.2020 9am10.01.2020 6pmAll Servicesmerlin5,merlin6Slurm v18->v19, IB Connected Mode, other. HPCLOCAL-300 
    + +

    Older downtimes

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    FromToServiceClustersDescriptionExceptions
    02.09.201902.09.2019GPFSmerlin5,merlin6v5.0.2-3 -> v5.0.3-2 
    02.09.201902.09.2019O.S.merlin5RHEL7.4 (rhel-7.4) -> RHEL7.6 (prod-00048)merlin-g-40, still running RHEL7.4*
    02.09.201902.09.2019O.S.merlin6RHEL7.6 (prod-00030) -> RHEL7.6 (prod-00048) 
    02.09.201902.09.2019Infinibandmerlin5OFED v4.4 -> v4.6merlin-g-40, still running OFED v4.4*
    02.09.201902.09.2019Infinibandmerlin6OFED v4.5 -> v4.6 
    02.09.201902.09.2019PModulesmerlin5,merlin6PModules v1.0.0rc4 -> v1.0.0rc5 
    02.09.201902.09.2019AFS(YFS)merlin5OpenAFS v1.6.22.2-236 -> YFS v188merlin-g-40, still running OpenAFS*
    02.09.201902.09.2019AFS(YFS)merlin6YFS v186 -> YFS v188 
    02.09.201902.09.2019O.S.merlin5RHEL7.4 -> RHEL7.6 (prod-00048) 
    02.09.201902.09.2019Slurmmerlin5,merlin6Slurm v18.08.6 -> v18.08.8 
    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin6/python.html b/public/merlin6/python.html new file mode 100644 index 0000000..0bf7e22 --- /dev/null +++ b/public/merlin6/python.html @@ -0,0 +1,922 @@ + + + + + + + + +Python | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Python

    +
    + + + +
    + + +
    Running Python on Merlin
    + + + + + + + +
    + + + + + + +

    PSI provides a variety of ways to execute python code.

    + +
      +
    1. Anaconda - Custom environments for using installation and development
    2. +
    3. Jupyterhub - Execute Jupyter notebooks on the cluster
    4. +
    5. System Python - Do not use! Only for OS applications.
    6. +
    + +

    Anaconda

    + +

    Anaconda (“conda” for short) is a package manager with +excellent python integration. Using it you can create isolated environments for each +of your python applications, containing exactly the dependencies needed for that app. +It is similar to the virtualenv python package, +but can also manage non-python requirements.

    + +

    Loading conda

    + +

    Conda is loaded from the module system:

    + +
    module load anaconda
    +
    + +

    Using pre-made environments

    + +

    Loading the module provides the conda command, but does not otherwise change your +environment. First an environment needs to be activated. Available environments can +be seen with conda info --envs and include many specialized environments for +software installs. After activating you should see the environment name in your +prompt:

    + +
    ~ $ conda activate datascience_py37
    +(datascience_py37) ~ $
    +
    + +

    CondaRC file

    + +

    Creating a ~/.condarc file is recommended if you want to create new environments on +merlin. Environments can grow quite large, so you will need to change the default +storage location from the default (your home directory) to a larger volume (usually +/data/user/$USER).

    + +

    Save the following as $HOME/.condarc:

    + +
    always_copy: true
    +
    +envs_dirs:
    +  - /data/user/$USER/conda/envs
    +
    +pkgs_dirs:
    +  - /data/user/$USER/conda/pkgs
    +  - $ANACONDA_PREFIX/conda/pkgs
    +
    +channels:
    +  - conda-forge
    +  - nodefaults
    +
    + +

    Run conda info to check that the variables are being set correctly.

    + +

    Creating environments

    + +

    We will create an environment named myenv which uses an older version of numpy, e.g. to test for backwards compatibility of our code (the -q and --yes switches are just for not getting prompted and disabling the progress bar). The environment will be created in the default location as defined by the .condarc configuration file (see above).

    + +
    ~ $ conda create -q --yes -n 'myenv1' numpy=1.8 scipy ipython
    +
    +Fetching package metadata: ...
    +Solving package specifications: .
    +Package plan for installation in environment /gpfs/home/feichtinger/conda-envs/myenv1:
    +
    +The following NEW packages will be INSTALLED:
    +
    +    ipython:    2.3.0-py27_0
    +    numpy:      1.8.2-py27_0
    +    openssl:    1.0.1h-1
    +    pip:        1.5.6-py27_0
    +    python:     2.7.8-1
    +    readline:   6.2-2
    +    scipy:      0.14.0-np18py27_0
    +    setuptools: 5.8-py27_0
    +    sqlite:     3.8.4.1-0
    +    system:     5.8-1
    +    tk:         8.5.15-0
    +    zlib:       1.2.7-0
    +
    +To activate this environment, use:
    +$ source activate myenv1
    +
    +To deactivate this environment, use:
    +$ source deactivate
    +
    + +

    The created environment contains just the packages that are needed to satisfy the +requirements and it is local to your installation. The python installation is even +independent of the central installation, i.e. your code will still work in such an +environment, even if you are offline or AFS is down. However, you need the central +installation if you want to use the conda command itself.

    + +

    Packages for your new environment will be either copied from the central one into +your new environment, or if there are newer packages available from anaconda and you +did not specify exactly the version from our central installation, they may get +downloaded from the web. **This will require significant space in the envs_dirs +that you defined in .condarc. If you create other environments on the same local +disk, they will share the packages using hard links.

    + +

    We can switch to the newly created environment with the conda activate command.

    + +
    $ conda activate myenv1
    +
    + +
    +

    Note that anaconda’s activate/deactivate +scripts are compatible with the bash and zsh shells but not with [t]csh.

    +
    + +

    Let’s test whether we indeed got the desired numpy version:

    + +
    $ python -c 'import numpy as np; print np.version.version'
    +
    +1.8.2
    +
    + +

    You can install additional packages into the active environment using the conda +install command.

    + +
    $ conda install --yes -q bottle
    +
    +Fetching package metadata: ...
    +Solving package specifications: .
    +Package plan for installation in environment /gpfs/home/feichtinger/conda-envs/myenv1:
    +
    +The following NEW packages will be INSTALLED:
    +
    +    bottle: 0.12.5-py27_0
    +
    + +

    Jupyterhub

    + +

    Jupyterhub is a service for running code notebooks on the cluster, particularly in +python. It is a powerful tool for data analysis and prototyping. For more infomation +see the Jupyterhub documentation.

    + +

    Pythons to avoid

    + +

    Avoid using the system python (/usr/bin/python). It is intended for OS software and +may not be up to date.

    + +

    Also avoid the ‘python’ module (module load python). This is a minimal install of +python intended for embedding in other modules.

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin6/request-account.html b/public/merlin6/request-account.html new file mode 100644 index 0000000..cac0059 --- /dev/null +++ b/public/merlin6/request-account.html @@ -0,0 +1,814 @@ + + + + + + + + +Requesting Merlin Accounts | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Requesting Merlin Accounts

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    Requesting Access to Merlin6

    + +

    Access to Merlin6 is regulated by a PSI user’s account being a member of the svc-cluster_merlin6 group. Access to this group will also grant access to older generations of Merlin (merlin5).

    + +

    Requesting Merlin6 access has to be done with the corresponding Request Linux Group Membership form, available in the PSI Service Now Service Catalog.

    + +

    Example: Requesting access to Merlin6

    + +

    Mandatory customizable fields are the following:

    +
      +
    • Order Access for user, which defaults to the logged in user. However, requesting access for another user it’s also possible.
    • +
    • Request membership for group, for Merlin6 the svc-cluster_merlin6 must be selected.
    • +
    • Justification, please add here a short justification why access to Merlin6 is necessary.
    • +
    + +

    Once submitted, the Merlin responsible will approve the request as soon as possible (within the next few hours on working days). Once the request is approved, it may take up to 30 minutes to get the account fully configured.

    + +

    Requesting Access to Merlin5

    + +

    Access to Merlin5 is regulated by a PSI user’s account being a member of the svc-cluster_merlin5 group. Access to this group does not grant access to newer generations of Merlin (merlin6, gmerlin6, and future ones).

    + +

    Requesting Merlin5 access has to be done with the corresponding Request Linux Group Membership form, available in the PSI Service Now Service Catalog.

    + +

    Example: Requesting access to Merlin5

    + +

    Mandatory customizable fields are the following:

    +
      +
    • Order Access for user, which defaults to the logged in user. However, requesting access for another user it’s also possible.
    • +
    • Request membership for group, for Merlin5 the svc-cluster_merlin5 must be selected.
    • +
    • Justification, please add here a short justification why access to Merlin5 is necessary.
    • +
    + +

    Once submitted, the Merlin responsible will approve the request as soon as possible (within the next few hours on working days). Once the request is approved, it may take up to 30 minutes to get the account fully configured.

    + +

    Further documentation

    + +

    Further information it’s also available in the Linux Central Documentation:

    + + +

    Special thanks to the Linux Central Team and AIT to make this possible.

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin6/request-project.html b/public/merlin6/request-project.html new file mode 100644 index 0000000..a5d48c4 --- /dev/null +++ b/public/merlin6/request-project.html @@ -0,0 +1,889 @@ + + + + + + + + +Requesting a Merlin Project | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Requesting a Merlin Project

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    A project owns its own storage area in Merlin, which can be accessed by other group members.

    + +

    Projects can receive a higher storage quota than user areas and should be the primary way of organizing bigger storage requirements +in a multi-user collaboration.

    + +

    Access to a project’s directories is governed by project members belonging to a common Unix group. You may use an existing +Unix group or you may have a new Unix group created especially for the project. The project responsible will be the owner of +the Unix group (this is important)!

    + +

    This document explains how to request new Unix group, to request membership for existing groups, and the procedure for requesting a Merlin project.

    + +

    About Unix groups

    + +

    Before requesting a Merlin project, it is important to have a Unix group that can be used to grant access to it to different members +of the project.

    + +

    Unix groups in the PSI Active Directory (which is the PSI central database containing user and group information, and more) are defined by the unx- prefix, followed by a name. +In general, PSI employees working on Linux systems (including HPC clusters, like Merlin) can request for a non-existing Unix group, and can become responsible for managing it. +In addition, a list of administrators can be set. The administrators, together with the group manager, can approve or deny membership requests. Further information about this topic +is covered in the Linux Documentation - Services Admin Guides: Unix Groups / Group Management, managed by the Central Linux Team.

    + +

    To gran access to specific Merlin project directories, some users may require to be added to some specific Unix groups:

    +
      +
    • Each Merlin project (i.e. /data/project/{bio|general}/$projectname) or experiment (i.e. /data/experiment/$experimentname) directory has access restricted by ownership and group membership (with a very few exceptions allowing public access).
    • +
    • Users requiring access to a specific restricted project or experiment directory have to request membership for the corresponding Unix group owning the directory.
    • +
    + +

    Requesting a new Unix group

    + +

    If you need a new Unix group to be created, you need to first get this group through a separate +PSI Service Now ticket. Please use the following template. +You can also specify the login names of the initial group members and the owner of the group. +The owner of the group is the person who will be allowed to modify the group.

    + +
      +
    • Please open an Incident Request with subject: +
       Subject: Request for new unix group xxxx
      +
      +
    • +
    • and base the text field of the request on this template +
       Dear HelpDesk
      +   
      + I would like to request a new unix group.
      +   
      + Unix Group Name: unx-xxxxx
      + Initial Group Members: xxxxx, yyyyy, zzzzz, ...
      + Group Owner: xxxxx
      + Group Administrators: aaaaa, bbbbb, ccccc, ....
      +
      + Best regards,
      +
      +
    • +
    + +

    Requesting Unix group membership

    + +

    Existing Merlin projects have already a Unix group assigned. To have access to a project, users must belong to the proper Unix group owning that project. +Supervisors should inform new users which extra groups are needed for their project(s). If this information is not known, one can check the permissions for that directory. In example:

    +
    (base)[caubet_m@merlin-l-001:/data/user/caubet_m]# ls -ltrhd /data/project/general/$projectname
    +(base)[caubet_m@merlin-l-001:/data/user/caubet_m]# ls -ltrhd /data/project/bio/$projectname
    +
    + +

    Requesting membership for a specific Unix group has to be done with the corresponding Request Linux Group Membership form, available in the PSI Service Now Service Catalog.

    + +

    Example: Requesting Unix Group membership

    + +

    Once submitted, the responsible of the Unix group has to approve the request.

    + +

    Important note: Requesting access to specific Unix Groups will require validation from the responsible of the Unix Group. If you ask for inclusion in many groups it may take longer, since the fulfillment of the request will depend on more people.

    + +

    Further information can be found in the Linux Documentation - Services User guide: Unix Groups / Group Management

    + +

    Managing Unix Groups

    + +

    Other administration operations on Unix Groups it’s mainly covered in the Linux Documentation - Services Admin Guides: Unix Groups / Group Management, managed by the Central Linux Team.

    + +

    Requesting a Merlin project

    + +

    Once a Unix group is available, a Merlin project can be requested. +To request a project, please provide the following information in a PSI Service Now ticket

    + +
      +
    • Please open an Incident Request with subject: +
       Subject: [Merlin6] Project Request for project name xxxxxx
      +
      +
    • +
    • and base the text field of the request on this template +
       Dear HelpDesk
      +   
      + I would like to request a new Merlin6 project.
      +   
      + Project Name: xxxxx
      + UnixGroup: xxxxx    # Must be an existing Unix Group
      +
      + The project responsible is the Owner of the Unix Group.
      + If you need a storage quota exceeding the defaults, please provide a description
      + and motivation for the higher storage needs:
      +   
      + Storage Quota: 1TB with a maximum of 1M Files
      + Reason: (None for default 1TB/1M)
      +
      + Best regards,
      +
      +
    • +
    + +

    The default storage quota for a project is 1TB (with a maximal Number of Files of 1M). If you need a larger assignment, you +need to request this and provide a description of your storage needs.

    + +

    Further documentation

    + +

    Further information it’s also available in the Linux Central Documentation:

    + + +

    Special thanks to the Linux Central Team and AIT to make this possible.

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin6/running-jobs.html b/public/merlin6/running-jobs.html new file mode 100644 index 0000000..b36a1f2 --- /dev/null +++ b/public/merlin6/running-jobs.html @@ -0,0 +1,1052 @@ + + + + + + + + +Running Slurm Scripts | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Running Slurm Scripts

    +
    + + + +
    + + +
    This document describes how to run batch scripts in Slurm.
    + + + + + + + +
    + + + + + + +

    The rules

    + +

    Before starting using the cluster, please read the following rules:

    + +
      +
    1. To ease and improve scheduling and backfilling, always try to estimate and to define a proper run time of your jobs: + +
    2. +
    3. Try to optimize your jobs for running at most within one day. Please, consider the following: +
        +
      • Some software can simply scale up by using more nodes while drastically reducing the run time.
      • +
      • Some software allow to save a specific state, and a second job can start from that state: Job Arrays with Checkpointing can help you with that.
      • +
      • Jobs submitted to hourly get more priority than jobs submitted to daily: always use hourly for jobs shorter than 1 hour.
      • +
      • Jobs submitted to daily get more priority than jobs submitted to general: always use daily for jobs shorter than 1 day.
      • +
      +
    4. +
    5. Is forbidden to run very short jobs as they cause a lot of overhead but also can cause severe problems to the main scheduler. +
        +
      • Question: Is my job a very short job? Answer: If it lasts in few seconds or very few minutes, yes.
      • +
      • Question: How long should my job run? Answer: as the Rule of Thumb, from 5’ would start being ok, from 15’ would preferred.
      • +
      • Use Packed Jobs for running a large number of short tasks.
      • +
      +
    6. +
    7. Do not submit hundreds of similar jobs! + +
    8. +
    + + + +

    Basic commands for running batch scripts

    + +
      +
    • Use sbatch for submitting a batch script to Slurm.
    • +
    • Use srun for running parallel tasks.
    • +
    • Use squeue for checking jobs status.
    • +
    • Use scancel for cancelling/deleting a job from the queue.
    • +
    + + + +

    Basic settings

    + +

    For a complete list of options and parameters available is recommended to use the man pages (i.e. man sbatch, man srun, man salloc). +Please, notice that behaviour for some parameters might change depending on the command used when running jobs (in example, --exclusive behaviour in sbatch differs from srun).

    + +

    In this chapter we show the basic parameters which are usually needed in the Merlin cluster.

    + +

    Common settings

    + +

    The following settings are the minimum required for running a job in the Merlin CPU and GPU nodes. Please, consider taking a look to the man pages (i.e. man sbatch, man salloc, man srun) for more information about all possible options. Also, do not hesitate to contact us on any questions.

    + +
      +
    • Clusters: For running jobs in the different Slurm clusters, users should to add the following option: +
      #SBATCH --clusters=<cluster_name>     # Possible values: merlin5, merlin6, gmerlin6
      +
      +

      Refer to the documentation of each cluster (merlin6,gmerlin6,merlin5 for further information.

      +
    • +
    • Partitions: except when using the default partition for each cluster, one needs to specify the partition: +
      #SBATCH --partition=<partition_name>  # Check each cluster documentation for possible values
      +
      + +

      Refer to the documentation of each cluster (merlin6,gmerlin6,merlin5 for further information.

      +
    • +
    • [Optional] Disabling shared nodes: by default, nodes are not exclusive. Hence, multiple users can run in the same node. One can request exclusive node usage with the following option: +
      #SBATCH --exclusive                   # Only if you want a dedicated node
      +
      +
    • +
    • Time: is important to define how long a job should run, according to the reality. This will help Slurm when scheduling and backfilling, and will let Slurm managing job queues in a more efficient way. This value can never exceed the MaxTime of the affected partition. +
       #SBATCH --time=<D-HH:MM:SS>          # Can not exceed the partition `MaxTime`
      +
      +

      Refer to the documentation of each cluster (merlin6,gmerlin6,merlin5 for further information about partition MaxTime values.

      +
    • +
    • Output and error files: by default, Slurm script will generate standard output (slurm-%j.out, where %j is the job_id) and error (slurm-%j.err, where %j is the job_id) files in the directory from where the job was submitted. Users can change default name with the following options: +
      #SBATCH --output=<filename>           # Can include path. Patterns accepted (i.e. %j)
      +#SBATCH --error=<filename>            # Can include path. Patterns accepted (i.e. %j)
      +
      +

      Use man sbatch (man sbatch | grep -A36 '^filename pattern') for getting a list specification of filename patterns.

      +
    • +
    • Enable/Disable Hyper-Threading: Whether a node has or not Hyper-Threading depends on the node configuration. By default, HT nodes have HT enabled, but one should specify it from the Slurm command as follows: +
      #SBATCH --hint=multithread            # Use extra threads with in-core multi-threading.
      +#SBATCH --hint=nomultithread          # Don't use extra threads with in-core multi-threading.
      +
      +

      Refer to the documentation of each cluster (merlin6,gmerlin6,merlin5 for further information about node configuration and Hyper-Threading. +Consider that, sometimes, depending on your job requirements, you might need also to setup how many --ntasks-per-core or --cpus-per-task (even other options) in addition to the --hint command. Please, contact us in case of doubts.

      + + +
    • +
    + +

    Batch script templates

    + +

    CPU-based jobs templates

    + +

    The following examples apply to the Merlin6 cluster.

    + +

    Nomultithreaded jobs template

    + +

    The following template should be used by any user submitting jobs to the Merlin6 CPU nodes:

    + +
    #!/bin/bash
    +#SBATCH --cluster=merlin6                 # Cluster name                                        
    +#SBATCH --partition=general,daily,hourly  # Specify one or multiple partitions
    +#SBATCH --time=<D-HH:MM:SS>               # Strongly recommended                                
    +#SBATCH --output=<output_file>            # Generate custom output file                         
    +#SBATCH --error=<error_file>              # Generate custom error  file                         
    +#SBATCH --hint=nomultithread              # Mandatory for multithreaded jobs                    
    +##SBATCH --exclusive                      # Uncomment if you need exclusive node usage          
    +##SBATCH --ntasks-per-core=1              # Only mandatory for multithreaded single tasks       
    +                                                                                               
    +## Advanced options example                                                                    
    +##SBATCH --nodes=1                        # Uncomment and specify #nodes to use                 
    +##SBATCH --ntasks=44                      # Uncomment and specify #nodes to use                 
    +##SBATCH --ntasks-per-node=44             # Uncomment and specify #tasks per node               
    +##SBATCH --cpus-per-task=44               # Uncomment and specify the number of cores per task  
    +
    + +

    Multithreaded jobs template

    + +

    The following template should be used by any user submitting jobs to the Merlin6 CPU nodes:

    + +
    #!/bin/bash
    +#SBATCH --cluster=merlin6                # Cluster name
    +#SBATCH --partition=general,daily,hourly # Specify one or multiple partitions
    +#SBATCH --time=<D-HH:MM:SS>              # Strongly recommended
    +#SBATCH --output=<output_file>           # Generate custom output file
    +#SBATCH --error=<error_file>             # Generate custom error  file
    +#SBATCH --hint=multithread               # Mandatory for multithreaded jobs
    +##SBATCH --exclusive                     # Uncomment if you need exclusive node usage
    +##SBATCH --ntasks-per-core=2             # Only mandatory for multithreaded single tasks
    +
    +## Advanced options example
    +##SBATCH --nodes=1                       # Uncomment and specify #nodes to use
    +##SBATCH --ntasks=88                     # Uncomment and specify #nodes to use
    +##SBATCH --ntasks-per-node=88            # Uncomment and specify #tasks per node
    +##SBATCH --cpus-per-task=88              # Uncomment and specify the number of cores per task
    +
    + +

    GPU-based jobs templates

    + +

    The following template should be used by any user submitting jobs to GPU nodes:

    + +
    #!/bin/bash
    +#SBATCH --cluster=gmerlin6                   # Cluster name
    +#SBATCH --partition=gpu,gpu-short            # Specify one or multiple partitions, or
    +#SBATCH --partition=gwendolen,gwendolen-long # Only for Gwendolen users
    +#SBATCH --gpus="<type>:<num_gpus>"           # <type> is optional, <num_gpus> is mandatory
    +#SBATCH --time=<D-HH:MM:SS>                  # Strongly recommended
    +#SBATCH --output=<output_file>               # Generate custom output file
    +#SBATCH --error=<error_file>                 # Generate custom error  file
    +##SBATCH --exclusive                         # Uncomment if you need exclusive node usage
    +
    +## Advanced options example
    +##SBATCH --nodes=1                           # Uncomment and specify number of nodes to use
    +##SBATCH --ntasks=1                          # Uncomment and specify number of nodes to use
    +##SBATCH --cpus-per-gpu=5                    # Uncomment and specify the number of cores per task
    +##SBATCH --mem-per-gpu=16000                 # Uncomment and specify the number of cores per task
    +##SBATCH --gpus-per-node=<type>:2            # Uncomment and specify the number of GPUs per node
    +##SBATCH --gpus-per-socket=<type>:2          # Uncomment and specify the number of GPUs per socket
    +##SBATCH --gpus-per-task=<type>:1            # Uncomment and specify the number of GPUs per task
    +
    + +

    Advanced configurations

    + + + +

    If you need to run a large number of jobs based on the same executable with systematically varying inputs, +e.g. for a parameter sweep, you can do this most easily in form of a simple array job.

    + +
    #!/bin/bash
    +#SBATCH --job-name=test-array
    +#SBATCH --partition=daily
    +#SBATCH --ntasks=1
    +#SBATCH --time=08:00:00
    +#SBATCH --array=1-8
    +
    +echo $(date) "I am job number ${SLURM_ARRAY_TASK_ID}"
    +srun myprogram config-file-${SLURM_ARRAY_TASK_ID}.dat
    +
    +
    + +

    This will run 8 independent jobs, where each job can use the counter +variable SLURM_ARRAY_TASK_ID defined by Slurm inside of the job’s +environment to feed the correct input arguments or configuration file +to the “myprogram” executable. Each job will receive the same set of +configurations (e.g. time limit of 8h in the example above).

    + +

    The jobs are independent, but they will run in parallel (if the cluster resources allow for +it). The jobs will get JobIDs like {some-number}_0 to {some-number}_7, and they also will each +have their own output file.

    + +

    Note:

    +
      +
    • Do not use such jobs if you have very short tasks, since each array sub job will incur the full overhead for launching an independent Slurm job. For such cases you should used a packed job (see below).
    • +
    • If you want to control how many of these jobs can run in parallel, you can use the #SBATCH --array=1-100%5 syntax. The %5 will define +that only 5 sub jobs may ever run in parallel.
    • +
    + +

    You also can use an array job approach to run over all files in a directory, substituting the payload with

    + +
    FILES=(/path/to/data/*)
    +srun ./myprogram ${FILES[$SLURM_ARRAY_TASK_ID]}
    +
    + +

    Or for a trivial case you could supply the values for a parameter scan in form +of a argument list that gets fed to the program using the counter variable.

    + +
    ARGS=(0.05 0.25 0.5 1 2 5 100)
    +srun ./my_program.exe ${ARGS[$SLURM_ARRAY_TASK_ID]}
    +
    + +

    Array jobs: running very long tasks with checkpoint files

    + +

    If you need to run a job for much longer than the queues (partitions) permit, and +your executable is able to create checkpoint files, you can use this +strategy:

    + +
    #!/bin/bash
    +#SBATCH --job-name=test-checkpoint
    +#SBATCH --partition=general
    +#SBATCH --ntasks=1
    +#SBATCH --time=7-00:00:00       # each job can run for 7 days
    +#SBATCH --cpus-per-task=1
    +#SBATCH --array=1-10%1   # Run a 10-job array, one job at a time.
    +if test -e checkpointfile; then 
    +     # There is a checkpoint file;
    +     myprogram --read-checkp checkpointfile
    +else
    +     # There is no checkpoint file, start a new simulation.
    +     myprogram
    +fi
    +
    + +

    The %1 in the #SBATCH --array=1-10%1 statement defines that only 1 subjob can ever run in parallel, so +this will result in subjob n+1 only being started when job n has finished. It will read the checkpoint file +if it is present.

    + +

    Packed jobs: running a large number of short tasks

    + +

    Since the launching of a Slurm job incurs some overhead, you should not submit each short task as a separate +Slurm job. Use job packing, i.e. you run the short tasks within the loop of a single Slurm job.

    + +

    You can launch the short tasks using srun with the --exclusive switch (not to be confused with the +switch of the same name used in the SBATCH commands). This switch will ensure that only a specified +number of tasks can run in parallel.

    + +

    As an example, the following job submission script will ask Slurm for +44 cores (threads), then it will run the =myprog= program 1000 times with +arguments passed from 1 to 1000. But with the =-N1 -n1 -c1 +–exclusive= option, it will control that at any point in time only 44 +instances are effectively running, each being allocated one CPU. You +can at this point decide to allocate several CPUs or tasks by adapting +the corresponding parameters.

    + +
    #! /bin/bash
    +#SBATCH --job-name=test-checkpoint
    +#SBATCH --partition=general
    +#SBATCH --ntasks=1
    +#SBATCH --time=7-00:00:00
    +#SBATCH --ntasks=44    # defines the number of parallel tasks
    +for i in {1..1000}
    +do
    +   srun -N1 -n1 -c1 --exclusive ./myprog $i &
    +done
    +wait
    +
    + +

    Note: The & at the end of the srun line is needed to not have the script waiting (blocking). +The wait command waits for all such background tasks to finish and returns the exit code.

    + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin6/slurm-access.html b/public/merlin6/slurm-access.html new file mode 100644 index 0000000..8619700 --- /dev/null +++ b/public/merlin6/slurm-access.html @@ -0,0 +1,818 @@ + + + + + + + + +Accessing Slurm Cluster | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Accessing Slurm Cluster

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    The Merlin Slurm clusters

    + +

    Merlin contains a multi-cluster setup, where multiple Slurm clusters coexist under the same umbrella. +It basically contains the following clusters:

    + +
      +
    • The Merlin6 Slurm CPU cluster, which is called merlin6.
    • +
    • The Merlin6 Slurm GPU cluster, which is called gmerlin6.
    • +
    • The old Merlin5 Slurm CPU cluster, which is called merlin5, still supported in a best effort basis.
    • +
    + +

    Accessing the Slurm clusters

    + +

    Any job submission must be performed from a Merlin login node. Please refer to the Accessing the Interactive Nodes documentation +for further information about how to access the cluster.

    + +

    In addition, any job must be submitted from a high performance storage area visible by the login nodes and by the computing nodes. For this, the possible storage areas are the following:

    +
      +
    • /data/user
    • +
    • /data/project
    • +
    • /shared-scratch +Please, avoid using /psi/home directories for submitting jobs.
    • +
    + +

    Merlin6 CPU cluster access

    + +

    The Merlin6 CPU cluster (merlin6) is the default cluster configured in the login nodes. Any job submission will use by default this cluster, unless +the option --cluster is specified with another of the existing clusters.

    + +

    For further information about how to use this cluster, please visit: Merlin6 CPU Slurm Cluster documentation.

    + +

    Merlin6 GPU cluster access

    + +

    The Merlin6 GPU cluster (gmerlin6) is visible from the login nodes. However, to submit jobs to this cluster, one needs to specify the option --cluster=gmerlin6 when submitting a job or allocation.

    + +

    For further information about how to use this cluster, please visit: Merlin6 GPU Slurm Cluster documentation.

    + +

    Merlin5 CPU cluster access

    + +

    The Merlin5 CPU cluster (merlin5) is visible from the login nodes. However, to submit jobs +to this cluster, one needs to specify the option --cluster=merlin5 when submitting a job or allocation.

    + +

    Using this cluster is in general not recommended, however this is still available for old users needing + extra computational resources or longer jobs. Have in mind that this cluster is only supported in a +best effort basis, and it contains very old hardware and configurations.

    + +

    For further information about how to use this cluster, please visit the Merlin5 CPU Slurm Cluster documentation.

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin6/slurm-basics.html b/public/merlin6/slurm-basics.html new file mode 100644 index 0000000..e504a75 --- /dev/null +++ b/public/merlin6/slurm-basics.html @@ -0,0 +1,821 @@ + + + + + + + + +Slurm Basic Commands | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Slurm Basic Commands

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    In this document some basic commands for using Slurm are showed. Advanced examples for some of these +are explained in other Merlin6 Slurm pages. You can always use man <command> pages for more +information about options and examples.

    + +

    Basic commands

    + +

    Useful commands for the slurm:

    + +
    sinfo            # to see the name of nodes, their occupancy, 
    +                 # name of slurm partitions, limits (try out with "-l" option)
    +squeue           # to see the currently running/waiting jobs in slurm 
    +                 # (additional "-l" option may also be useful)
    +sbatch Script.sh # to submit a script (example below) to the slurm.
    +srun <command>   # to submit a command to Slurm. Same options as in 'sbatch' can be used.
    +salloc           # to allocate computing nodes. Use for interactive runs.
    +scancel job_id   # to cancel slurm job, job id is the numeric id, seen by the squeue.
    +sview            # X interface for managing jobs and track job run information.
    +seff             # Calculates the efficiency of a job
    +sjstat           # List attributes of jobs under the SLURM control
    +sacct            # Show job accounting, useful for checking details of finished jobs.
    +
    + +
    + +

    Advanced basic commands:

    + +
    sinfo -N -l      # list nodes, state, resources (#CPUs, memory per node, ...), etc.
    +sshare -a        # to list shares of associations to a cluster
    +sprio -l         # to view the factors that comprise a job's scheduling priority 
    +                 # add '-u <username>' for filtering user
    +
    + +

    Show information for specific cluster

    + +

    By default, any of the above commands shows information of the local cluster which is *merlin6.

    + +

    If you want to see the same information for merlin5 you have to add the parameter --clusters=merlin5. +If you want to see both clusters at the same time, add the option --federation.

    + +

    Examples:

    + +
    sinfo                      # 'sinfo' local cluster which is 'merlin6'
    +sinfo --clusters=merlin5   # 'sinfo' non-local cluster 'merlin5'
    +sinfo --federation         # 'sinfo' all clusters which are 'merlin5' & 'merlin6'
    +squeue                     # 'squeue' local cluster which is 'merlin6'
    +squeue --clusters=merlin5  # 'squeue' non-local cluster 'merlin5'
    +squeue --federation        # 'squeue' all clusters which are 'merlin5' & 'merlin6'
    +
    + +
    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin6/slurm-configuration.html b/public/merlin6/slurm-configuration.html new file mode 100644 index 0000000..97e46b0 --- /dev/null +++ b/public/merlin6/slurm-configuration.html @@ -0,0 +1,1234 @@ + + + + + + + + +Slurm Configuration | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Slurm Configuration

    +
    + + + +
    + + +
    This document describes a summary of the Merlin6 configuration.
    + + + + + + + +
    + + + + + + +

    This documentation shows basic Slurm configuration and options needed to run jobs in the Merlin6 CPU cluster.

    + +

    Merlin6 CPU nodes definition

    + +

    The following table show default and maximum resources that can be used per node:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NodesDef.#CPUsMax.#CPUs#ThreadsMax.Mem/CPUMax.Mem/NodeMax.SwapDef.#GPUsMax.#GPUs
    merlin-c-[001-024]1 core44 cores235200035200010000N/AN/A
    merlin-c-[101-124]1 core44 cores235200035200010000N/AN/A
    merlin-c-[201-224]1 core44 cores235200035200010000N/AN/A
    merlin-c-[301-312]1 core44 cores274880074880010000N/AN/A
    merlin-c-[313-318]1 core44 cores174880074880010000N/AN/A
    merlin-c-[319-324]1 core44 cores274880074880010000N/AN/A
    + +

    If nothing is specified, by default each core will use up to 8GB of memory. Memory can be increased with the --mem=<mem_in_MB> and +--mem-per-cpu=<mem_in_MB> options, and maximum memory allowed is Max.Mem/Node.

    + +

    In merlin6, Memory is considered a Consumable Resource, as well as the CPU. Hence, both resources will account when submitting a job, +and by default resources can not be oversubscribed. This is a main difference with the old merlin5 cluster, when only CPU were accounted, +and memory was by default oversubscribed.

    + + + +

    Merlin6 CPU cluster

    + +

    To run jobs in the merlin6 cluster users can optionally specify the cluster name in Slurm:

    + +
    #SBATCH --cluster=merlin6
    +
    + +

    If no cluster name is specified, by default any job will be submitted to this cluster (as this is the main cluster). +Hence, this would be only necessary if one has to deal with multiple clusters or when one has defined some environmental +variables which can modify the cluster name.

    + +

    Merlin6 CPU partitions

    + +

    Users might need to specify the Slurm partition. If no partition is specified, it will default to general:

    + +
    #SBATCH --partition=<partition_name>  # Possible <partition_name> values: general, daily, hourly
    +
    + +

    The following partitions (also known as queues) are configured in Slurm:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    CPU PartitionDefault TimeMax TimeMax NodesPriorityJobFactor*PriorityTier**DefMemPerCPU
    general1 day1 week50114000
    daily1 day1 day6750014000
    hourly1 hour1 hourunlimited100014000
    asa-general1 hour2 weeksunlimited123712
    asa-daily1 hour1 weekunlimited50023712
    asa-visas1 hour90 daysunlimited100043712
    asa-ansys1 hour90 daysunlimited1000415600
    mu3e1 day7 daysunlimited100043712
    + +

    *The PriorityJobFactor value will be added to the job priority (PARTITION column in sprio -l ). In other words, jobs sent to higher priority +partitions will usually run first (however, other factors such like job age or mainly fair share might affect to that decision). For the GPU +partitions, Slurm will also attempt first to allocate jobs on partitions with higher priority over partitions with lesser priority.

    + +

    **Jobs submitted to a partition with a higher PriorityTier value will be dispatched before pending jobs in partition with lower PriorityTier value +and, if possible, they will preempt running jobs from partitions with lower PriorityTier values.

    + +
      +
    • The general partition is the default. It can not have more than 50 nodes running jobs.
    • +
    • For daily this limitation is extended to 67 nodes.
    • +
    • For hourly there are no limits.
    • +
    • asa-general,asa-daily,asa-ansys,asa-visas and mu3e are private partitions, belonging to different experiments owning the machines. Access is restricted in all cases. However, by agreement with the experiments, nodes are usually added to the hourly partition as extra resources for the public resources.
    • +
    + + + +

    Merlin5 CPU Accounts

    + +

    Users need to ensure that the public merlin account is specified. No specifying account options would default to this account. +This is mostly needed by users which have multiple Slurm accounts, which may define by mistake a different account.

    + +
    #SBATCH --account=merlin  # Possible values: merlin, gfa-asa
    +
    + +

    Not all the accounts can be used on all partitions. This is resumed in the table below:

    + + + + + + + + + + + + + + + + + + + + + + +
    Slurm AccountSlurm Partitions
    merlinhourly,daily, general
    gfa-asaasa-general,asa-daily,asa-visas,asa-ansys,hourly,daily, general
    mu3emu3e
    + +

    Private accounts

    + +
      +
    • The gfa-asa and mu3e accounts are private accounts. These can be used for accessing dedicated +partitions with nodes owned by different groups.
    • +
    + +

    Slurm CPU specific options

    + +

    Some options are available when using CPUs. These are detailed here.

    + +

    Alternative Slurm options for CPU based jobs are available. Please refer to the man pages +for each Slurm command for further information about it (man salloc, man sbatch, man srun). +Below are listed the most common settings:

    + +
    #SBATCH --hint=[no]multithread
    +#SBATCH --ntasks=<ntasks>
    +#SBATCH --ntasks-per-core=<ntasks>
    +#SBATCH --ntasks-per-socket=<ntasks>
    +#SBATCH --ntasks-per-node=<ntasks>
    +#SBATCH --mem=<size[units]>
    +#SBATCH --mem-per-cpu=<size[units]>
    +#SBATCH --cpus-per-task=<ncpus>
    +#SBATCH --cpu-bind=[{quiet,verbose},]<type>  # only for 'srun' command
    +
    + +

    Enabling/Disabling Hyper-Threading

    + +

    The merlin6 cluster contains nodes with Hyper-Threading enabled. One should always specify +whether to use Hyper-Threading or not. If not defined, Slurm will generally use it (exceptions apply).

    + +
    #SBATCH --hint=multithread            # Use extra threads with in-core multi-threading.
    +#SBATCH --hint=nomultithread          # Don't use extra threads with in-core multi-threading.
    +
    + +

    Constraint / Features

    + +

    Slurm allows to define a set of features in the node definition. This can be used to filter and select nodes according to one or more +specific features. For the CPU nodes, we have the following features:

    + +
    NodeName=merlin-c-[001-024,101-124,201-224]   Features=mem_384gb,xeon-gold-6152
    +NodeName=merlin-c-[301-312]                   Features=mem_768gb,xeon-gold-6240r
    +NodeName=merlin-c-[313-318]                   Features=mem_768gb,xeon-gold-6240r
    +NodeName=merlin-c-[319-324]                   Features=mem_384gb,xeon-gold-6240r
    +
    + +

    Therefore, users running on hourly can select which node they want to use (fat memory nodes vs regular memory nodes, CPU type). +This is possible by using the option --constraint=<feature_name> in Slurm.

    + +

    Examples:

    +
      +
    1. Select nodes with 48 cores only (nodes with 2 x Xeon Gold 6240R): +
      sbatch --constraint=xeon-gold-6240r ...
      +
      +
    2. +
    3. Select nodes with 44 cores only (nodes with 2 x Xeon Gold 6152): +
      sbatch --constraint=xeon-gold-6152 ...
      +
      +
    4. +
    5. Select fat memory nodes only: +
      sbatch --constraint=mem_768gb ...
      +
      +
    6. +
    7. Select regular memory nodes only: +
      sbatch --constraint=mem_384gb ...
      +
      +
    8. +
    9. Select fat memory nodes with 48 cores only: +
      sbatch --constraint=mem_768gb,xeon-gold-6240r ...
      +
      +
    10. +
    + +

    Detailing exactly which type of nodes you want to use is important, therefore, for groups with private accounts (mu3e,gfa-asa) or for +public users running on the hourly partition, constraining nodes by features is recommended. This becomes even more important when +having heterogeneous clusters.

    + +

    Running jobs in the ‘merlin6’ cluster

    + +

    In this chapter we will cover basic settings that users need to specify in order to run jobs in the Merlin6 CPU cluster.

    + +

    User and job limits

    + +

    In the CPU cluster we provide some limits which basically apply to jobs and users. The idea behind this is to ensure a fair usage of the resources and to +avoid overabuse of the resources from a single user or job. However, applying limits might affect the overall usage efficiency of the cluster (in example, +pending jobs from a single user while having many idle nodes due to low overall activity is something that can be seen when user limits are applied). +In the same way, these limits can be also used to improve the efficiency of the cluster (in example, without any job size limits, a job requesting all +resources from the batch system would drain the entire cluster for fitting the job, which is undesirable).

    + +

    Hence, there is a need of setting up wise limits and to ensure that there is a fair usage of the resources, by trying to optimize the overall efficiency +of the cluster while allowing jobs of different nature and sizes (it is, single core based vs parallel jobs of different sizes) to run.

    + + + + + +

    Per job limits

    + +

    These are limits which apply to a single job. In other words, there is a maximum of resources a single job can use. Limits are described in the table below with the format: SlurmQoS(limits) (possible SlurmQoS values can be listed with the command sacctmgr show qos). Some limits will vary depending on the day and time of the week.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PartitionMon-Fri 0h-18hSun-Thu 18h-0hFrom Fri 18h to Mon 0h
    generalnormal(cpu=704,mem=2750G)normal(cpu=704,mem=2750G)normal(cpu=704,mem=2750G)
    dailydaytime(cpu=704,mem=2750G)nighttime(cpu=1408,mem=5500G)unlimited(cpu=2200,mem=8593.75G)
    hourlyunlimited(cpu=2200,mem=8593.75G)unlimited(cpu=2200,mem=8593.75G)unlimited(cpu=2200,mem=8593.75G)
    + +

    By default, a job can not use more than 704 cores (max CPU per job). In the same way, memory is also proportionally limited. This is equivalent as +running a job using up to 8 nodes at once. This limit applies to the general partition (fixed limit) and to the daily partition (only during working hours). +Limits are softed for the daily partition during non working hours, and during the weekend limits are even wider.

    + +

    For the hourly partition, despite running many parallel jobs is something not desirable (for allocating such jobs it requires massive draining of nodes), +wider limits are provided. In order to avoid massive nodes drain in the cluster, for allocating huge jobs, setting per job limits is necessary. Hence, unlimited QoS +mostly refers to “per user” limits more than to “per job” limits (in other words, users can run any number of hourly jobs, but the job size for such jobs is limited +with wide values).

    + +

    Per user limits for CPU partitions

    + +

    These limits which apply exclusively to users. In other words, there is a maximum of resources a single user can use. Limits are described in the table below with the format: SlurmQoS(limits) (possible SlurmQoS values can be listed with the command sacctmgr show qos). Some limits will vary depending on the day and time of the week.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PartitionMon-Fri 0h-18hSun-Thu 18h-0hFrom Fri 18h to Mon 0h
    generalnormal(cpu=704,mem=2750G)normal(cpu=704,mem=2750G)normal(cpu=704,mem=2750G)
    dailydaytime(cpu=1408,mem=5500G)nighttime(cpu=2112,mem=8250G)unlimited(cpu=6336,mem=24750G)
    hourlyunlimited(cpu=6336,mem=24750G)unlimited(cpu=6336,mem=24750G)unlimited(cpu=6336,mem=24750G)
    + +

    By default, users can not use more than 704 cores at the same time (max CPU per user). Memory is also proportionally limited in the same way. This is +equivalent to 8 exclusive nodes. This limit applies to the general partition (fixed limit) and to the daily partition (only during working hours). +For the hourly partition, there are no limits restriction and user limits are removed. Limits are softed for the daily partition during non +working hours, and during the weekend limits are removed.

    + +

    Advanced Slurm configuration

    + +

    Clusters at PSI use the Slurm Workload Manager as the batch system technology for managing and scheduling jobs. +Slurm has been installed in a multi-clustered configuration, allowing to integrate multiple clusters in the same batch system.

    + +

    For understanding the Slurm configuration setup in the cluster, sometimes may be useful to check the following files:

    + +
      +
    • /etc/slurm/slurm.conf - can be found in the login nodes and computing nodes.
    • +
    • /etc/slurm/gres.conf - can be found in the GPU nodes, is also propgated to login nodes and computing nodes for user read access.
    • +
    • /etc/slurm/cgroup.conf - can be found in the computing nodes, is also propagated to login nodes for user read access.
    • +
    + +

    The previous configuration files which can be found in the login nodes, correspond exclusively to the merlin6 cluster configuration files. +Configuration files for the old merlin5 cluster or for the gmerlin6 cluster must be checked directly on any of the merlin5 or gmerlin6 computing nodes (in example, by login in to one of the nodes while a job or an active allocation is running).

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin6/slurm-examples.html b/public/merlin6/slurm-examples.html new file mode 100644 index 0000000..6c3168c --- /dev/null +++ b/public/merlin6/slurm-examples.html @@ -0,0 +1,1102 @@ + + + + + + + + +Slurm Examples | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Slurm Examples

    +
    + + + +
    + + +
    This document shows different template examples for running jobs in the Merlin cluster.
    + + + + + + + +
    + + + + + + +

    Single core based job examples

    + +

    Example 1: Hyperthreaded job

    + +

    In this example we want to use hyperthreading (--ntasks-per-core=2 and --hint=multithread). In our Merlin6 configuration, +the default memory per CPU (a CPU is equivalent to a core thread) is 4000MB, hence each task can use up 8000MB (2 threads x 4000MB).

    + +
    #!/bin/bash
    +#SBATCH --partition=hourly      # Using 'hourly' will grant higher priority
    +#SBATCH --ntasks-per-core=2     # Request the max ntasks be invoked on each core
    +#SBATCH --hint=multithread      # Use extra threads with in-core multi-threading
    +#SBATCH --time=00:30:00         # Define max time job will run
    +#SBATCH --output=myscript.out   # Define your output file
    +#SBATCH --error=myscript.err    # Define your error file
    +
    +module purge
    +module load $MODULE_NAME # where $MODULE_NAME is a software in PModules
    +srun $MYEXEC             # where $MYEXEC is a path to your binary file
    +
    + +

    Example 2: Non-hyperthreaded job

    + +

    In this example we do not want hyper-threading (--ntasks-per-core=1 and --hint=nomultithread). In our Merlin6 configuration, +the default memory per cpu (a CPU is equivalent to a core thread) is 4000MB. If we do not specify anything else, our +single core task will use a default of 4000MB. However, one could double it with --mem-per-cpu=8000 if you require more memory +(remember, the second thread will not be used so we can safely assign +4000MB to the unique active thread).

    + +
    #!/bin/bash
    +#SBATCH --partition=hourly      # Using 'hourly' will grant higher priority
    +#SBATCH --ntasks-per-core=1     # Request the max ntasks be invoked on each core
    +#SBATCH --hint=nomultithread    # Don't use extra threads with in-core multi-threading
    +#SBATCH --time=00:30:00         # Define max time job will run
    +#SBATCH --output=myscript.out   # Define your output file
    +#SBATCH --error=myscript.err    # Define your error file
    +
    +module purge
    +module load $MODULE_NAME # where $MODULE_NAME is a software in PModules
    +srun $MYEXEC             # where $MYEXEC is a path to your binary file
    +
    + +

    Multi core based job examples

    + +

    Example 1: MPI with Hyper-Threading

    + +

    In this example we run a job that will run 88 tasks. Merlin6 Apollo nodes have 44 cores each one with hyper-threading +enabled. This means that we can run 2 threads per core, in total 88 threads. To accomplish that, users should specify +--ntasks-per-core=2 and --hint=multithread.

    + +

    Use --nodes=1 if you want to use a node exclusively (88 hyperthreaded tasks would fit in a Merlin6 node).

    + +
    #!/bin/bash
    +#SBATCH --partition=hourly      # Using 'hourly' will grant higher priority
    +#SBATCH --ntasks=88             # Job will run 88 tasks
    +#SBATCH --ntasks-per-core=2     # Request the max ntasks be invoked on each core
    +#SBATCH --hint=multithread      # Use extra threads with in-core multi-threading
    +#SBATCH --time=00:30:00         # Define max time job will run
    +#SBATCH --output=myscript.out   # Define your output file
    +#SBATCH --error=myscript.err    # Define your error file
    +
    +module purge
    +module load $MODULE_NAME # where $MODULE_NAME is a software in PModules
    +srun $MYEXEC             # where $MYEXEC is a path to your binary file
    +
    + +

    Example 2: MPI without Hyper-Threading

    + +

    In this example, we want to run a job that will run 44 tasks, and due to performance reasons we want to disable hyper-threading. +Merlin6 Apollo nodes have 44 cores, each one with hyper-threading enabled. For ensuring that only 1 thread will be used per task, +users should specify --ntasks-per-core=1 and --hint=nomultithread. With this configuration, we tell Slurm to run only 1 +tasks per core and no hyperthreading should be used. Hence, each tasks will be assigned to an independent core.

    + +

    Use --nodes=1 if you want to use a node exclusively (44 non-hyperthreaded tasks would fit in a Merlin6 node).

    + +
    #!/bin/bash
    +#SBATCH --partition=hourly      # Using 'hourly' will grant higher priority
    +#SBATCH --ntasks=44             # Job will run 44 tasks
    +#SBATCH --ntasks-per-core=1     # Request the max ntasks be invoked on each core
    +#SBATCH --hint=nomultithread    # Don't use extra threads with in-core multi-threading
    +#SBATCH --time=00:30:00         # Define max time job will run
    +#SBATCH --output=myscript.out   # Define your output file
    +#SBATCH --error=myscript.err    # Define your output file
    +
    +module purge
    +module load $MODULE_NAME # where $MODULE_NAME is a software in PModules
    +srun $MYEXEC             # where $MYEXEC is a path to your binary file
    +
    + +

    Example 3: Hyperthreaded Hybrid MPI/OpenMP job

    + +

    In this example, we want to run a Hybrid Job using MPI and OpenMP using hyperthreading. In this job, we want to run 4 MPI +tasks by using 8 CPUs per task. Each task in our example requires 128GB of memory. Then we specify 16000MB per CPU +(8 x 16000MB = 128000MB). Notice that since hyperthreading is enabled, Slurm will use 4 cores per task (with hyperthreading +2 threads -a.k.a. Slurm CPUs- fit into a core).

    + +
    #!/bin/bash -l
    +#SBATCH --clusters=merlin6
    +#SBATCH --job-name=test
    +#SBATCH --ntasks=4
    +#SBATCH --ntasks-per-socket=1
    +#SBATCH --mem-per-cpu=16000
    +#SBATCH --cpus-per-task=8
    +#SBATCH --partition=hourly
    +#SBATCH --time=01:00:00
    +#SBATCH --output=srun_%j.out
    +#SBATCH --error=srun_%j.err
    +#SBATCH --hint=multithread
    +
    +module purge
    +module load $MODULE_NAME # where $MODULE_NAME is a software in PModules
    +srun $MYEXEC             # where $MYEXEC is a path to your binary file
    +
    + + + +

    Example 4: Non-hyperthreaded Hybrid MPI/OpenMP job

    + +

    In this example, we want to run a Hybrid Job using MPI and OpenMP without hyperthreading. In this job, we want to run 4 MPI +tasks by using 8 CPUs per task. Each task in our example requires 128GB of memory. Then we specify 16000MB per CPU +(8 x 16000MB = 128000MB). Notice that since hyperthreading is disabled, Slurm will use 8 cores per task (disabling hyperthreading +we force the use of only 1 thread -a.k.a. 1 CPU- per core).

    + +
    #!/bin/bash -l
    +#SBATCH --clusters=merlin6
    +#SBATCH --job-name=test
    +#SBATCH --ntasks=4
    +#SBATCH --ntasks-per-socket=1
    +#SBATCH --mem-per-cpu=16000
    +#SBATCH --cpus-per-task=8
    +#SBATCH --partition=hourly
    +#SBATCH --time=01:00:00
    +#SBATCH --output=srun_%j.out
    +#SBATCH --error=srun_%j.err
    +#SBATCH --hint=nomultithread
    +
    +module purge
    +module load $MODULE_NAME # where $MODULE_NAME is a software in PModules
    +srun $MYEXEC             # where $MYEXEC is a path to your binary file
    +
    + + + +

    GPU examples

    + +

    Using GPUs requires two major changes. First, the cluster needs to be specified +to gmerlin6. This should also be added to later commands pertaining to the +job, e.g. scancel --cluster=gmerlin6 <jobid>. Second, the number of GPUs +should be specified using --gpus, --gpus-per-task, or similar parameters. +Here’s an example for a simple test job:

    + +
    #!/bin/bash
    +#SBATCH --partition=gpu         # Or 'gpu-short' for higher priority but 2-hour limit
    +#SBATCH --cluster=gmerlin6      # Required for GPU
    +#SBATCH --gpus=2                # Total number of GPUs
    +#SBATCH --cpus-per-gpu=5        # Request CPU resources
    +#SBATCH --time=1-00:00:00       # Define max time job will run
    +#SBATCH --output=myscript.out   # Define your output file
    +#SBATCH --error=myscript.err    # Define your error file
    +
    +module purge
    +module load cuda                # load any needed modules here
    +srun $MYEXEC                    # where $MYEXEC is a path to your binary file
    +
    + +

    Slurm will automatically set the gpu visibility (eg $CUDA_VISIBLE_DEVICES).

    + +

    Advanced examples

    + + + +

    If you need to run a large number of jobs based on the same executable with systematically varying inputs, +e.g. for a parameter sweep, you can do this most easily in form of a simple array job.

    + +
    #!/bin/bash
    +#SBATCH --job-name=test-array
    +#SBATCH --partition=daily
    +#SBATCH --ntasks=1
    +#SBATCH --time=08:00:00
    +#SBATCH --array=1-8
    +
    +echo $(date) "I am job number ${SLURM_ARRAY_TASK_ID}"
    +srun $MYEXEC config-file-${SLURM_ARRAY_TASK_ID}.dat
    +
    + +

    This will run 8 independent jobs, where each job can use the counter +variable SLURM_ARRAY_TASK_ID defined by Slurm inside of the job’s +environment to feed the correct input arguments or configuration file +to the “myprogram” executable. Each job will receive the same set of +configurations (e.g. time limit of 8h in the example above).

    + +

    The jobs are independent, but they will run in parallel (if the cluster resources allow for +it). The jobs will get JobIDs like {some-number}_0 to {some-number}_7, and they also will each +have their own output file.

    + +

    Note:

    +
      +
    • Do not use such jobs if you have very short tasks, since each array sub job will incur the full overhead for launching an independent Slurm job. For such cases you should used a packed job (see below).
    • +
    • If you want to control how many of these jobs can run in parallel, you can use the #SBATCH --array=1-100%5 syntax. The %5 will define +that only 5 sub jobs may ever run in parallel.
    • +
    + +

    You also can use an array job approach to run over all files in a directory, substituting the payload with

    + +
    FILES=(/path/to/data/*)
    +srun $MYEXEC ${FILES[$SLURM_ARRAY_TASK_ID]}
    +
    + +

    Or for a trivial case you could supply the values for a parameter scan in form +of a argument list that gets fed to the program using the counter variable.

    + +
    ARGS=(0.05 0.25 0.5 1 2 5 100)
    +srun $MYEXEC ${ARGS[$SLURM_ARRAY_TASK_ID]}
    +
    + +

    Array jobs: running very long tasks with checkpoint files

    + +

    If you need to run a job for much longer than the queues (partitions) permit, and +your executable is able to create checkpoint files, you can use this +strategy:

    + +
    #!/bin/bash
    +#SBATCH --job-name=test-checkpoint
    +#SBATCH --partition=general
    +#SBATCH --ntasks=1
    +#SBATCH --time=7-00:00:00       # each job can run for 7 days
    +#SBATCH --cpus-per-task=1
    +#SBATCH --array=1-10%1   # Run a 10-job array, one job at a time.
    +if test -e checkpointfile; then
    +     # There is a checkpoint file;
    +     $MYEXEC --read-checkp checkpointfile
    +else
    +     # There is no checkpoint file, start a new simulation.
    +     $MYEXEC
    +fi
    +
    + +

    The %1 in the #SBATCH --array=1-10%1 statement defines that only 1 subjob can ever run in parallel, so +this will result in subjob n+1 only being started when job n has finished. It will read the checkpoint file +if it is present.

    + +

    Packed jobs: running a large number of short tasks

    + +

    Since the launching of a Slurm job incurs some overhead, you should not submit each short task as a separate +Slurm job. Use job packing, i.e. you run the short tasks within the loop of a single Slurm job.

    + +

    You can launch the short tasks using srun with the --exclusive switch (not to be confused with the +switch of the same name used in the SBATCH commands). This switch will ensure that only a specified +number of tasks can run in parallel.

    + +

    As an example, the following job submission script will ask Slurm for +44 cores (threads), then it will run the =myprog= program 1000 times with +arguments passed from 1 to 1000. But with the =-N1 -n1 -c1 +–exclusive= option, it will control that at any point in time only 44 +instances are effectively running, each being allocated one CPU. You +can at this point decide to allocate several CPUs or tasks by adapting +the corresponding parameters.

    + +
    #! /bin/bash
    +#SBATCH --job-name=test-checkpoint
    +#SBATCH --partition=general
    +#SBATCH --ntasks=1
    +#SBATCH --time=7-00:00:00
    +#SBATCH --ntasks=44    # defines the number of parallel tasks
    +for i in {1..1000}
    +do
    +   srun -N1 -n1 -c1 --exclusive $MYEXEC $i &
    +done
    +wait
    +
    + +

    Note: The & at the end of the srun line is needed to not have the script waiting (blocking). +The wait command waits for all such background tasks to finish and returns the exit code.

    + +

    Hands-On Example

    + +

    Copy-paste the following example in a file called myAdvancedTest.batch):

    + +
    #!/bin/bash
    +#SBATCH --partition=daily    # name of slurm partition to submit
    +#SBATCH --time=2:00:00       # limit the execution of this job to 2 hours, see sinfo for the max. allowance
    +#SBATCH --nodes=2            # number of nodes
    +#SBATCH --ntasks=44          # number of tasks
    +#SBATCH --ntasks-per-core=1  # Request the max ntasks be invoked on each core
    +#SBATCH --hint=nomultithread # Don't use extra threads with in-core multi-threading
    +
    +module load gcc/9.2.0 openmpi/3.1.5-1_merlin6
    +module list
    +
    +echo "Example no-MPI:" ; hostname        # will print one hostname per node
    +echo "Example MPI:"    ; srun hostname # will print one hostname per ntask
    +
    + +

    In the above example are specified the options --nodes=2 and --ntasks=44. This means that up 2 nodes are requested, +and is expected to run 44 tasks. Hence, 44 cores are needed for running that job. Slurm will try to allocate a maximum of +2 nodes, both together having at least 44 cores. Since our nodes have 44 cores / each, if nodes are empty (no other users +have running jobs there), job can land on a single node (it has enough cores to run 44 tasks).

    + +

    If we want to ensure that job is using at least two different nodes (i.e. for boosting CPU frequency, or because the job +requires more memory per core) you should specify other options.

    + +

    A good example is --ntasks-per-node=22. This will equally distribute 22 tasks on 2 nodes.

    + +
    #SBATCH --ntasks-per-node=22
    +
    + +

    A different example could be by specifying how much memory per core is needed. For instance --mem-per-cpu=32000 will reserve +~32000MB per core. Since we have a maximum of 352000MB per Apollo node, Slurm will be only able to allocate 11 cores (32000MB x 11cores = 352000MB) per node. +It means that 4 nodes will be needed (max 11 tasks per node due to memory definition, and we need to run 44 tasks), in this case we need to change --nodes=4 +(or remove --nodes). Alternatively, we can decrease --mem-per-cpu to a lower value which can allow the use of at least 44 cores per node (i.e. with 16000 +should be able to use 2 nodes)

    + +
    #SBATCH --mem-per-cpu=16000
    +
    + +

    Finally, in order to ensure exclusivity of the node, an option –exclusive can be used (see below). This will ensure that +the requested nodes are exclusive for the job (no other users jobs will interact with this node, and only completely +free nodes will be allocated).

    + +
    #SBATCH --exclusive
    +
    + +

    This can be combined with the previous examples.

    + +

    More advanced configurations can be defined and can be combined with the previous examples. More information about advanced +options can be found in the following link: https://slurm.schedmd.com/sbatch.html (or run ‘man sbatch’).

    + +

    If you have questions about how to properly execute your jobs, please contact us through merlin-admins@lists.psi.ch. Do not run +advanced configurations unless your are sure of what you are doing.

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin6/ssh-keys.html b/public/merlin6/ssh-keys.html new file mode 100644 index 0000000..cc5e634 --- /dev/null +++ b/public/merlin6/ssh-keys.html @@ -0,0 +1,931 @@ + + + + + + + + +Configuring SSH Keys in Merlin | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Configuring SSH Keys in Merlin

    +
    + + + +
    + + +
    This document describes how to deploy SSH Keys in Merlin.
    + + + + + + + +
    + + + + + + +

    Merlin users sometimes will need to access the different Merlin services without being constantly requested by a password. +One can achieve that with Kerberos authentication, however in some cases some software would require the setup of SSH Keys. +One example is ANSYS Fluent, which, when used interactively, the way of communication between the GUI and the different nodes +is through the SSH protocol, and the use of SSH Keys is enforced.

    + +

    Setting up SSH Keys on Merlin

    + +

    For security reason, users must always protect SSH Keys with a passphrase.

    + +

    User can check whether a SSH key already exists. These would be placed in the ~/.ssh/ directory. RSA encryption +is usually the default one, and files in there would be id_rsa (private key) and id_rsa.pub (public key).

    + +
    ls ~/.ssh/id*   
    +
    + +

    For creating SSH RSA Keys, one should:

    + +
      +
    1. Run ssh-keygen, a password will be requested twice. You must remember this password for the future. +
        +
      • Due to security reasons, always try protecting it with a password. There is only one exception, when running ANSYS software, which in general should not use password to simplify the way of running the software in Slurm.
      • +
      • This will generate a private key id_rsa, and a public key id_rsa.pub in your ~/.ssh directory.
      • +
      +
    2. +
    3. Add your public key to the authorized_keys file, and ensure proper permissions for that file, as follows: +
      cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
      +chmod 0600 ~/.ssh/authorized_keys
      +
      +
    4. +
    5. Configure the SSH client in order to force the usage of the psi.ch domain for trusting keys: +
      echo "CanonicalizeHostname yes" >> ~/.ssh/config
      +
      +
    6. +
    7. Configure further SSH options as follows: +
      echo "AddKeysToAgent yes" >> ~/.ssh/config
      +echo "ForwardAgent yes" >> ~/.ssh/config
      +
      +

      Other options may be added.

      +
    8. +
    9. Check that your SSH config file contains at least the lines mentioned in steps 3 and 4: +
      (base)[caubet_m@merlin-l-001:/data/user/caubet_m]# cat ~/.ssh/config
      +CanonicalizeHostname yes
      +AddKeysToAgent yes
      +ForwardAgent yes
      +
      +
    10. +
    + +

    Using the SSH Keys

    + +

    Using Authentication Agent in SSH session

    + +

    By default, when accessing the login node via SSH (with ForwardAgent=yes), it will automatically add your +SSH Keys to the authentication agent. Hence, no actions should not be needed by the user. One can configure +ForwardAgent=yes as follows:

    + +
      +
    • (Recommended) In your local Linux (workstation, laptop or desktop) add the following line in the + $HOME/.ssh/config (or alternatively in /etc/ssh/ssh_config) file: +
         ForwardAgent yes
      +
      +
    • +
    • Alternatively, on each SSH you can add the option ForwardAgent=yes in the SSH command. In example: +
         ssh -XY -o ForwardAgent=yes merlin-l-001.psi.ch
      +
      +
    • +
    + +

    If ForwardAgent is not enabled as shown above, one needs to run the authentication agent and then add your key +to the ssh-agent. This must be done once per SSH session, as follows:

    + +
      +
    • Run eval $(ssh-agent -s) to run the ssh-agent in that SSH session
    • +
    • Check whether the authentication agent has your key already added: +
         ssh-add -l | grep "/psi/home/$(whoami)/.ssh"
      +
      +
    • +
    • If no key is returned in the previous step, you have to add the private key identity to the authentication agent. + You will be requested for the passphrase of your key, and it can be done by running: +
         ssh-add
      +
      +
    • +
    + +

    Using Authentication Agent in NoMachine Session

    + +

    By default, when using a NoMachine session, the ssh-agent should be automatically started. Hence, there is no need of +starting the agent or forwarding it.

    + +

    However, for NoMachine one always need to add the private key identity to the authentication agent. This can be done as follows:

    + +
      +
    1. Check whether the authentication agent has already the key added: +
      ssh-add -l | grep "/psi/home/$(whoami)/.ssh"
      +
      +
    2. +
    3. If no key is returned in the previous step, you have to add the private key identity to the authentication agent. +You will be requested for the passphrase of your key, and it can be done by running: +
      ssh-add
      +
      +
    4. +
    + +

    You just need to run it once per NoMachine session, and it would apply to all terminal windows within that NoMachine session.

    + +

    Troubleshooting

    + +

    Errors when running ‘ssh-add’

    + +

    If the error Could not open a connection to your authentication agent. appears when running ssh-add, it means +that the authentication agent is not running. Please follow the previous procedures for starting it.

    + +

    Add/Update SSH RSA Key password

    + +

    If an existing SSH Key does not have password, or you want to update an existing password with a new one, you can do it as follows:

    + +
    ssh-keygen -p -f ~/.ssh/id_rsa
    +
    + +

    SSH Keys deployed but not working

    + +

    Please ensure proper permissions of the involved files, as well as any typos in the file names involved:

    + +
    chmod u+rwx,go-rwx,g+s ~/.ssh
    +chmod u+rw-x,go-rwx    ~/.ssh/authorized_keys
    +chmod u+rw-x,go-rwx    ~/.ssh/id_rsa
    +chmod u+rw-x,go+r-wx   ~/.ssh/id_rsa.pub
    +
    + +

    Testing SSH Keys

    + +

    Once SSH Key is created, for testing that the SSH Key is valid, one can do the following:

    + +
      +
    1. Create a new SSH session in one of the login nodes: +
      ssh merlin-l-001
      +
      +
    2. +
    3. In the login node session, destroy any existing Kerberos ticket or active SSH Key: +
      kdestroy
      +ssh-add -D
      +
      +
    4. +
    5. Add the new private key identity to the authentication agent. You will be requested by the passphrase. +
      ssh-add
      +
      +
    6. +
    7. Check that your key is active by the SSH agent: +
      ssh-add -l
      +
      +
    8. +
    9. SSH to the second login node. No password should be requested: +
      ssh -vvv merlin-l-002
      +
      +
    10. +
    + +

    If the last step succeeds, then means that your SSH Key is properly setup.

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin6/storage.html b/public/merlin6/storage.html new file mode 100644 index 0000000..30e271b --- /dev/null +++ b/public/merlin6/storage.html @@ -0,0 +1,1114 @@ + + + + + + + + +Merlin6 Storage | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Merlin6 Storage

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    Introduction

    + +

    This document describes the different directories of the Merlin6 cluster.

    + +

    User and project data

    + +
      +
    • Users are responsible for backing up their own data. Is recommended to backup the data on third party independent systems (i.e. LTS, Archive, AFS, SwitchDrive, Windows Shares, etc.). +
        +
      • /psi/home, as this contains a small amount of data, is the only directory where we can provide daily snapshots for one week. This can be found in the following directory /psi/home/.snapshot/
      • +
      +
    • +
    • When a user leaves PSI, she or her supervisor/team are responsible to backup and move the data out from the cluster: every few months, the storage space will be recycled for those old users who do not have an existing and valid PSI account.
    • +
    + + + +

    Checking user quota

    + +

    For each directory, we provide a way for checking quotas (when required). However, a single command merlin_quotas +is provided. This is useful to show with a single command all quotas for your filesystems (including AFS, which is not mentioned here).

    + +

    To check your quotas, please run:

    + +
    merlin_quotas
    +
    + +

    Merlin6 directories

    + +

    Merlin6 offers the following directory classes for users:

    + +
      +
    • /psi/home/<username>: Private user home directory
    • +
    • /data/user/<username>: Private user data directory
    • +
    • /data/project/general/<projectname>: Shared Project directory +
        +
      • For BIO experiments, a dedicated /data/project/bio/$projectname exists.
      • +
      +
    • +
    • /scratch: Local scratch disk (only visible by the node running a job).
    • +
    • /shared-scratch: Shared scratch disk (visible from all nodes).
    • +
    • /export: Export directory for data transfer, visible from ra-merlin-01.psi.ch, ra-merlin-02.psi.ch and Merlin login nodes. +
        +
      • Refer to Transferring Data for more information about the export area and data transfer service.
      • +
      +
    • +
    + + + +

    Properties of the directory classes:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    DirectoryBlock Quota [Soft:Hard]Block Quota [Soft:Hard]GraceTimeQuota Change Policy: BlockQuota Change Policy: FilesBackupBackup Policy
    /psi/home/$usernameUSR [10GB:11GB]UndefN/AUp to x2 when strongly justified.N/AyesDaily snapshots for 1 week
    /data/user/$usernameUSR [1TB:1.074TB]USR [1M:1.1M]7dInmutable. Need a project.Changeable when justified.noUsers responsible for backup
    /data/project/bio/$projectnameGRP [1TB:1.074TB]GRP [1M:1.1M]7dSubject to project requirements.Subject to project requirements.noProject responsible for backup
    /data/project/general/$projectnameGRP [1TB:1.074TB]GRP [1M:1.1M]7dSubject to project requirements.Subject to project requirements.noProject responsible for backup
    /scratchUndefUndefN/AN/AN/AnoN/A
    /shared-scratchUSR [512GB:2TB]USR [2M:2.5M]7dUp to x2 when strongly justified.Changeable when justified.noN/A
    /exportUSR [10MB:20TB]USR [512K:5M]10dSoft can be temporary increased.Changeable when justified.noN/A
    + + + +

    User home directory

    + +

    This is the default directory users will land when login in to any Merlin6 machine. +It is intended for your scripts, documents, software development, and other files which +you want to have backuped. Do not use it for data or HPC I/O-hungry tasks.

    + +

    This directory is mounted in the login and computing nodes under the path:

    + +
    /psi/home/$username
    +
    + +

    Home directories are part of the PSI NFS Central Home storage provided by AIT and +are managed by the Merlin6 administrators.

    + +

    Users can check their quota by running the following command:

    + +
    quota -s
    +
    + +

    Home directory policy

    + +
      +
    • Read Important: Code of Conduct for more information about Merlin6 policies.
    • +
    • Is forbidden to use the home directories for IO intensive tasks +
        +
      • Use /scratch, /shared-scratch, /data/user or /data/project for this purpose.
      • +
      +
    • +
    • +

      Users can retrieve up to 1 week of their lost data thanks to the automatic daily snapshots for 1 week. +Snapshots can be accessed at this path:

      + +
       /psi/home/.snapshop/$username
      +
      +
    • +
    + +

    User data directory

    + +

    The user data directory is intended for fast IO access and keeping large amounts of private data. +This directory is mounted in the login and computing nodes under the directory

    + +
    /data/user/$username
    +
    + +

    Users can check their quota by running the following command:

    + +
    mmlsquota -u <username> --block-size auto merlin-user
    +
    + +

    User data directory policy

    + +
      +
    • Read Important: Code of Conduct for more information about Merlin6 policies.
    • +
    • Is forbidden to use the data directories as scratch area during a job runtime. +
        +
      • Use /scratch, /shared-scratch for this purpose.
      • +
      +
    • +
    • No backup policy is applied for user data directories: users are responsible for backing up their data.
    • +
    + +

    Project data directory

    + +

    This storage is intended for fast IO access and keeping large amounts of a project’s data, where the data also can be +shared by all members of the project (the project’s corresponding unix group). We recommend to keep most data in +project related storage spaces, since it allows users to coordinate. Also, project spaces have more flexible policies +regarding extending the available storage space.

    + +

    Experiments can request a project space as described in [Accessing Merlin -> Requesting a Project]

    + +

    Once created, the project data directory will be mounted in the login and computing nodes under the dirctory:

    + +
    /data/project/general/$projectname
    +
    + +

    Project quotas are defined on a per group basis. Users can check the project quota by running the following command:

    + +
    mmlsquota -j $projectname --block-size auto -C merlin.psi.ch merlin-proj
    +
    + +

    Project Directory policy

    + +
      +
    • Read Important: Code of Conduct for more information about Merlin6 policies.
    • +
    • It is forbidden to use the data directories as scratch area during a job’s runtime, i.e. for high throughput I/O for a job’s temporary files. Please Use /scratch, /shared-scratch for this purpose.
    • +
    • No backups: users are responsible for managing the backups of their data directories.
    • +
    + +

    Scratch directories

    + +

    There are two different types of scratch storage: local (/scratch) and shared (/shared-scratch).

    + +

    local scratch should be used for all jobs that do not require the scratch files to be accessible from multiple nodes, which is trivially +true for all jobs running on a single node. +shared scratch is intended for files that need to be accessible by multiple nodes, e.g. by a MPI-job where tasks are spread out over the cluster +and all tasks need to do I/O on the same temporary files.

    + +

    local scratch in Merlin6 computing nodes provides a huge number of IOPS thanks to the NVMe technology. Shared scratch is implemented using a distributed parallel filesystem (GPFS) resulting in a higher latency, since it involves remote storage resources and more complex I/O coordination.

    + +

    /shared-scratch is only mounted in the Merlin6 computing nodes (i.e. not on the login nodes), and its current size is 50TB. This can be increased in the future.

    + +

    The properties of the available scratch storage spaces are given in the following table

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ClusterServiceScratchScratch MountpointShared ScratchShared Scratch MountpointComments
    merlin5computing node50GB / SAS/scratchN/AN/Amerlin-c-[01-64]
    merlin6login node100GB / SAS/scratch50TB / GPFS/shared-scratchmerlin-l-0[1,2]
    merlin6computing node1.3TB / NVMe/scratch50TB / GPFS/shared-scratchmerlin-c-[001-024,101-124,201-224]
    merlin6login node2.0TB / NVMe/scratch50TB / GPFS/shared-scratchmerlin-l-00[1,2]
    + +

    Scratch directories policy

    + +
      +
    • Read Important: Code of Conduct for more information about Merlin6 policies.
    • +
    • By default, always use local first and only use shared if your specific use case requires it.
    • +
    • Temporary files must be deleted at the end of the job by the user. +
        +
      • Remaining files will be deleted by the system if detected. +
          +
        • Files not accessed within 28 days will be automatically cleaned up by the system.
        • +
        • If for some reason the scratch areas get full, admins have the rights to cleanup the oldest data.
        • +
        +
      • +
      +
    • +
    + +

    Export directory

    + +

    Export directory is exclusively intended for transferring data from outside PSI to Merlin and viceversa. Is a temporary directoy with an auto-cleanup policy. +Please read Transferring Data for more information about it.

    + +

    Export directory policy

    + +
      +
    • Temporary files must be deleted at the end of the job by the user. +
        +
      • Remaining files will be deleted by the system if detected. +
          +
        • Files not accessed within 28 days will be automatically cleaned up by the system.
        • +
        • If for some reason the export area gets full, admins have the rights to cleanup the oldest data
        • +
        +
      • +
      +
    • +
    + +
    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin6/transfer-data.html b/public/merlin6/transfer-data.html new file mode 100644 index 0000000..f8c538b --- /dev/null +++ b/public/merlin6/transfer-data.html @@ -0,0 +1,955 @@ + + + + + + + + +Transferring Data | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Transferring Data

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    Overview

    + +

    Most methods allow data to be either transmitted or received, so it may make sense to +initiate the transfer from either merlin or the other system, depending on the network +visibility.

    + +
      +
    • Merlin login nodes are visible from the PSI network, so direct data transfer +(rsync/WinSCP) is generally preferable. This can be initiated from either endpoint.
    • +
    • Merlin login nodes can access the internet using a limited set of protocols +
        +
      • SSH-based protocols using port 22 (rsync-over-ssh, sftp, WinSCP, etc)
      • +
      • HTTP-based protocols using ports 80 or 445 (https, WebDav, etc)
      • +
      • Protocols using other ports require admin configuration and may only work with +specific hosts (ftp, rsync daemons, etc)
      • +
      +
    • +
    • Systems on the internet can access the PSI Data Transfer service +datatransfer.psi.ch, using ssh-based protocols and Globus
    • +
    + +

    Direct transfer via Merlin6 login nodes

    + +

    The following methods transfer data directly via the login +nodes. They are suitable +for use from within the PSI network.

    + +

    Rsync

    + +

    Rsync is the preferred method to transfer data from Linux/MacOS. It allows +transfers to be easily resumed if they get interrupted. The general syntax is:

    + +
    rsync -avAHXS <src> <dst>
    +
    + +

    For example, to transfer files from your local computer to a merlin project +directory:

    + +
    rsync -avAHXS ~/localdata user@merlin-l-01.psi.ch:/data/project/general/myproject/
    +
    + +

    You can resume interrupted transfers by simply rerunning the command. Previously +transferred files will be skipped.

    + +

    WinSCP

    + +

    The WinSCP tool can be used for remote file transfer on Windows. It is available +from the Software Kiosk on PSI machines. Add merlin-l-01.psi.ch as a host and +connect with your PSI credentials. You can then drag-and-drop files between your +local computer and merlin.

    + +

    SWITCHfilesender

    + +

    SWITCHfilesender is an installation of the FileSender project (filesender.org) which is a web based application that allows authenticated users to securely and easily send arbitrarily large files to other users.

    + +

    Authentication of users is provided through SimpleSAMLphp, supporting SAML2, LDAP and RADIUS and more. Users without an account can be sent an upload voucher by an authenticated user. FileSender is developed to the requirements of the higher education and research community.

    + +

    The purpose of the software is to send a large file to someone, have that file available for download for a certain number of downloads and/or a certain amount of time, and after that automatically delete the file. The software is not intended as a permanent file publishing platform.

    + +

    SWITCHfilesender is fully integrated with PSI, therefore, PSI employees can log in by using their PSI account (through Authentication and Authorization Infrastructure / AAI, by selecting PSI as the institution to be used for log in).

    + +

    PSI Data Transfer

    + +

    From August 2024, Merlin is connected to the PSI Data Transfer service, +datatransfer.psi.ch. This is a central service managed by the Linux team. However, any problems or questions related to it can be directly +reported to the Merlin administrators, which will forward the request if necessary.

    + +

    The PSI Data Transfer servers supports the following protocols:

    +
      +
    • Data Transfer - SSH (scp / rsync)
    • +
    • Data Transfer - Globus
    • +
    + +

    Notice that datatransfer.psi.ch does not allow SSH login, only rsync, scp and Globus access is allowed.

    + +

    The following filesystems are mounted:

    +
      +
    • /merlin/export which points to the /export directory in Merlin.
    • +
    • /merlin/data/experiment/mu3e which points to the /data/experiment/mu3e directories in Merlin. +
        +
      • Mu3e sub-directories are mounted in RW (read-write), except for data (read-only mounted)
      • +
      +
    • +
    • /merlin/data/project/general which points to the /data/project/general directories in Merlin. +
        +
      • Owners of Merlin projects should request explicit access to it.
      • +
      • Currently, only CSCS is available for transferring files between PizDaint/Alps and Merlin
      • +
      +
    • +
    • /merlin/data/project/bio which points to the /data/project/bio directories in Merlin.
    • +
    • /merlin/data/user which points to the /data/user directories in Merlin.
    • +
    + +

    Access to the PSI Data Transfer uses Multi factor authentication (MFA). +Therefore, having the Microsoft Authenticator App is required as explained here.

    + + + +

    Directories

    + +

    /merlin/data/user

    + +

    User data directories are mounted in RW.

    + + + +

    /merlin/export

    + +

    Transferring big amounts of data from outside PSI to Merlin is always possible through /export.

    + + + + + +
    Exporting data from Merlin
    + +

    For exporting data from Merlin to outside PSI by using /export, one has to:

    +
      +
    • From a Merlin login node, copy your data from any directory (i.e. /data/project, /data/user, /scratch) to +/export. Ensure to properly secure your directories and files with proper permissions.
    • +
    • Once data is copied, from datatransfer.psi.ch, copy the data from /merlin/export to outside PSI
    • +
    + +
    Importing data to Merlin
    + +

    For importing data from outside PSI to Merlin by using /export, one has to:

    +
      +
    • From datatransfer.psi.ch, copy the data from outside PSI to /merlin/export. +Ensure to properly secure your directories and files with proper permissions.
    • +
    • Once data is copied, from a Merlin login node, copy your data from /export to any directory (i.e. /data/project, /data/user, /scratch).
    • +
    + +

    Request access to your project directory

    + +

    Optionally, instead of using /export, Merlin project owners can request Read/Write or Read/Only access to their project directory.

    + + + +

    Connecting to Merlin6 from outside PSI

    + +

    Merlin6 is fully accessible from within the PSI network. To connect from outside you can use:

    + + + +

    Connecting from Merlin6 to outside file shares

    + +

    merlin_rmount command

    + +

    Merlin provides a command for mounting remote file systems, called merlin_rmount. This +provides a helpful wrapper over the Gnome storage utilities, and provides support for a wide range of remote file formats, including

    +
      +
    • SMB/CIFS (Windows shared folders)
    • +
    • WebDav
    • +
    • AFP
    • +
    • FTP, SFTP
    • +
    • others
    • +
    + +

    More instruction on using merlin_rmount

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin6/troubleshooting.html b/public/merlin6/troubleshooting.html new file mode 100644 index 0000000..7c727db --- /dev/null +++ b/public/merlin6/troubleshooting.html @@ -0,0 +1,810 @@ + + + + + + + + +Troubleshooting | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Troubleshooting

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    For troubleshooting, please contact us through the official channels. See Contact +for more information.

    + +

    Known Problems

    + +

    Before contacting us for support, please check the Merlin6 Support: Known Problems page to see if there is an existing +workaround for your specific problem.

    + +

    Troubleshooting Slurm Jobs

    + +

    If you want to report a problem or request for help when running jobs, please always provide +the following information:

    + +
      +
    1. Provide your batch script or, alternatively, the path to your batch script.
    2. +
    3. +

      Add always the following commands to your batch script

      + +
      echo "User information:"; who am i
      +echo "Running hostname:"; hostname
      +echo "Current location:"; pwd
      +echo "User environment:"; env
      +echo "List of PModules:"; module list
      +
      +
    4. +
    5. Whenever possible, provide the Slurm JobID.
    6. +
    + +

    Providing this information is extremely important in order to ease debugging, otherwise +only with the description of the issue or just the error message is completely insufficient +in most cases.

    + +

    Troubleshooting SSH

    + +

    Use the ssh command with the “-vvv” option and copy and paste (no screenshots please) +the output to your request in Service-Now. Example

    + +
    ssh -Y -vvv $username@merlin-l-01.psi.ch
    +
    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin6/using-modules.html b/public/merlin6/using-modules.html new file mode 100644 index 0000000..fb983e3 --- /dev/null +++ b/public/merlin6/using-modules.html @@ -0,0 +1,961 @@ + + + + + + + + +Using PModules | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Using PModules

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    Environment Modules

    + +

    On top of the operating system stack we provide different software using the PSI developed PModule system.

    + +

    PModules is the official supported way and each package is deployed by a specific expert. Usually, in PModules +software which is used by many people will be found.

    + +

    If you miss any package/versions or a software with a specific missing feature, contact us. We will study if is feasible or not to install it.

    + +

    Module release stages

    + +

    Three different release stages are available in Pmodules, ensuring proper software life cycling. These are the following: unstable, stable and deprecated

    + +

    Unstable release stage

    + +

    The unstable release stage contains unstable releases of software. Software compilations here are usually under development or are not fully production ready.

    + +

    This release stage is not directly visible by the end users, and needs to be explicitly invoked as follows:

    + +
    module use unstable
    +
    + +

    Once software is validated and considered production ready, this is moved to the stable release stage.

    + +

    Stable release stage

    + +

    The stable release stage contains stable releases of software, which have been deeply tested and are fully supported.

    + +

    This is the default release stage, and is visible by default. Whenever possible, users are strongly advised to use packages from this release stage.

    + +

    Deprecated release stage

    + +

    The deprecated release stage contains deprecated releases of software. Software in this release stage is usually deprecated or discontinued by their developers. +Also, minor versions or redundant compilations are moved here as long as there is a valid copy in the stable repository.

    + +

    This release stage is not directly visible by the users, and needs to be explicitly invoked as follows:

    + +
    module use deprecated
    +
    + +

    However, software moved to this release stage can be directly loaded without the need of invoking it. This ensure proper life cycling of the software, and making it transparent for the end users.

    + +

    Module overlays

    + +

    Recent Pmodules releases contain a feature called Pmodules overlays. In Merlin, overlays are used to source software from a different location. +In that way, we can have custom private versions of software in the cluster installed on high performance storage accessed over a low latency network.

    + +

    Pmodules overlays are still under development, therefore consider that some features may not work or do not work as expected.

    + +

    Pmodule overlays can be used from Pmodules v1.1.5. However, Merlin is running Pmodules v1.0.0rc10 as the default version. +Therefore, one needs to load first a newer version of it: this is available in the repositories and can be loaded with module load Pmodules/$version command.

    + +

    Once running the proper Pmodules version, overlays are added (or invoked) with the module use $overlay_name command.

    + +

    overlay_merlin

    + +

    Some Merlin software is already provided through PModule overlays and has been validated for using and running it in that way. +Therefore, Melin contains an overlay called overlay_merlin. In this overlay, the software is installed in the Merlin high performance storage, +specifically in the /data/software/pmodules directory. In general, if another copy exists in the standard repository, we strongly recommend to use +the replica in the overlay_merlin overlay instead, as it provides faster access and it may also provide some customizations for the Merlin6 cluster.

    + +

    For loading the overlay_merlin, please run:

    +
    module load Pmodules/1.1.6 # Or newer version
    +module use overlay_merlin
    +
    + +

    Then, once overlay_merlin is invoked, it will disable central software installations with the same version (if exist), and will be replaced +by the local ones in Merlin. Releases from the central Pmodules repository which do not have a copy in the Merlin overlay will remain +visible. In example, for each ANSYS release, one can identify where it is installed by searching ANSYS in PModules with the --verbose +option. This will show the location of the different ANSYS releases as follows:

    +
      +
    • For ANSYS releases installed in the central repositories, the path starts with /opt/psi
    • +
    • For ANSYS releases installed in the Merlin6 repository (and/or overwritting the central ones), the path starts with /data/software/pmodules
    • +
    + +
    (base)[caubet_m@merlin-l-001:/data/user/caubet_m]# module load Pmodules/1.1.6
    +module load: unstable module has been loaded -- Pmodules/1.1.6
    +
    +(base)[caubet_m@merlin-l-001:/data/user/caubet_m]# module use merlin_overlay
    +
    +(base)[caubet_m@merlin-l-001:/data/user/caubet_m]# module search ANSYS --verbose
    +
    +Module         Rel.stage  Group        Dependencies/Modulefile
    +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    +ANSYS/2019R3   stable     Tools        dependencies:
    +                                       modulefile:   /data/software/pmodules/Tools/modulefiles/ANSYS/2019R3
    +ANSYS/2020R1   stable     Tools        dependencies:
    +                                       modulefile:   /opt/psi/Tools/modulefiles/ANSYS/2020R1
    +ANSYS/2020R1-1 stable     Tools        dependencies:
    +                                       modulefile:   /opt/psi/Tools/modulefiles/ANSYS/2020R1-1
    +ANSYS/2020R2   stable     Tools        dependencies:
    +                                       modulefile:   /data/software/pmodules/Tools/modulefiles/ANSYS/2020R2
    +ANSYS/2021R1   stable     Tools        dependencies:
    +                                       modulefile:   /data/software/pmodules/Tools/modulefiles/ANSYS/2021R1
    +ANSYS/2021R2   stable     Tools        dependencies:
    +                                       modulefile:   /data/software/pmodules/Tools/modulefiles/ANSYS/2021R2
    +
    + +

    PModules commands

    + +

    Below is listed a summary of all available commands:

    + +
    module use                       # show all available PModule Software Groups as well as Release Stages
    +module avail                     # to see the list of available software packages provided via pmodules
    +module use unstable              # to get access to a set of packages not fully tested by the community
    +module load <package>/<version>  # to load specific software package with a specific version
    +module search <string>           # to search for a specific software package and its dependencies.
    +module list                      # to list which software is loaded in your environment
    +module purge                     # unload all loaded packages and cleanup the environment
    +
    + +

    module use/unuse

    + +

    Without any parameter, use lists all available PModule Software Groups and Release Stages.

    + +
    module use
    +
    + +

    When followed by a parameter, use/unuse invokes/uninvokes a PModule Software Group or Release Stage.

    + +
    module use EM         # Invokes the 'EM' software group
    +module unuse EM       # Uninvokes the 'EM' software group
    +module use unstable   # Invokes the 'unstable' Release stable
    +module unuse unstable # Uninvokes the 'unstable' Release stable
    +
    + +

    module avail

    + +

    This option lists all available PModule Software Groups and their packages.

    + +

    Please run module avail --help for further listing options.

    + + + +

    This is used to search for software packages. By default, if no Release Stage or Software Group is specified +in the options of the module search command, it will search from the already invoked Software Groups and Release Stages. +Direct package dependencies will be also showed.

    + +
    (base) [caubet_m@merlin-l-001 caubet_m]$ module search openmpi/4.0.5_slurm
    +
    +Module              Release    Group        Requires
    +---------------------------------------------------------------------------
    +openmpi/4.0.5_slurm stable     Compiler     gcc/8.4.0
    +openmpi/4.0.5_slurm stable     Compiler     gcc/9.2.0
    +openmpi/4.0.5_slurm stable     Compiler     gcc/9.3.0
    +openmpi/4.0.5_slurm stable     Compiler     intel/20.4
    +
    +(base) [caubet_m@merlin-l-001 caubet_m]$ module load intel/20.4 openmpi/4.0.5_slurm
    +
    + +

    Please run module search --help for further search options.

    + +

    module load/unload

    + +

    This loads/unloads specific software packages. Packages might have direct dependencies that need to be loaded first. Other dependencies +will be automatically loaded.

    + +

    In the example below, the openmpi/4.0.5_slurm package will be loaded, however gcc/9.3.0 must be loaded as well as this is a strict dependency. Direct dependencies must be loaded in advance. Users can load multiple packages one by one or at once. This can be useful for instance when loading a package with direct dependencies.

    + +
    # Single line
    +module load gcc/9.3.0 openmpi/4.0.5_slurm
    +
    +# Multiple line
    +module load gcc/9.3.0
    +module load openmpi/4.0.5_slurm
    +
    + +

    module purge

    + +

    This command is an alternative to module unload, which can be used to unload all loaded module files.

    + +
    module purge
    +
    + +

    When to request for new PModules packages

    + +

    Missing software

    + +

    If you don’t find a specific software and you know from other people interesing on it, it can be installed in PModules. Please contact us +and we will try to help with that. Deploying new software in PModules may take few days.

    + +

    Usually installation of new software are possible as long as few users will use it. If you are insterested in to maintain this software, +please let us know.

    + +

    Missing version

    + +

    If the existing PModules versions for a specific package do not fit to your needs, is possible to ask for a new version.

    + +

    Usually installation of newer versions will be supported, as long as few users will use it. Installation of intermediate versions can +be supported if this is strictly justified.

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin7.html b/public/merlin7.html new file mode 100644 index 0000000..99c8819 --- /dev/null +++ b/public/merlin7.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

    Redirecting…

    + Click here if you are not redirected. + diff --git a/public/merlin7/ansys-rsm.html b/public/merlin7/ansys-rsm.html new file mode 100644 index 0000000..988f733 --- /dev/null +++ b/public/merlin7/ansys-rsm.html @@ -0,0 +1,705 @@ + + + + + + + + +ANSYS RSM (Remote Resolve Manager) | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    ANSYS RSM (Remote Resolve Manager)

    +
    + + + +
    + + +
    This document describes how to use the ANSYS Remote Resolve Manager service in the Merlin7 cluster
    + + + + + + + +
    + + + + + + +

    ANSYS Remote Resolve Manager

    + +

    ANSYS Remote Solve Manager (RSM) is used by ANSYS Workbench to submit computational jobs to HPC clusters directly from Workbench on your desktop.

    + + + +

    The Merlin7 RSM service

    + +

    A RSM service is running on a dedicated Virtual Machine server. This service will listen a specific port and will process any request using RSM (in example, from ANSYS users workstations). +The following nodes are configured with such services:

    +
      +
    • merlin7-ansys-rsm.psi.ch
    • +
    + +

    The earliest version supported in the Merlin7 cluster is ANSYS/2022R2. Older versions are not supported due to existing bugs or missing functionalities. In case you strongly need to run an older version, please do not hesitate to contact the Merlin admins.

    + +

    Configuring RSM client on Windows workstations

    + +

    Users can setup ANSYS RSM in their workstations to connect to the Merlin7 cluster. +The different steps and settings required to make it work are that following:

    + +
      +
    1. Open the RSM Configuration service in Windows for the ANSYS release you want to configure.
    2. +
    3. Right-click the HPC Resources icon followed by Add HPC Resource… +Adding a new HPC Resource
    4. +
    5. In the HPC Resource tab, fill up the corresponding fields as follows: +HPC Resource +
        +
      • “Name”: Add here the preffered name for the cluster. For example: Merlin7 cluster
      • +
      • “HPC Type”: Select SLURM
      • +
      • “Submit host”: merlin7-rsm01.psi.ch
      • +
      • “Slurm Job submission arguments (optional)”: Add any required Slurm options for running your jobs. +
          +
        • --hint=nomultithread must be present.
        • +
        • --exclusive must also be present for now, due to a bug in the Slingshot interconnect which does not allow running shared nodes.
        • +
        +
      • +
      • Check “Use SSH protocol for inter and intra-node communication (Linux only)”
      • +
      • Select “Able to directly submit and monitor HPC jobs”.
      • +
      • “Apply” changes.
      • +
      +
    6. +
    7. In the “File Management” tab, fill up the corresponding fields as follows: +File Management +
        +
      • Select “RSM internal file transfer mechanism” and add /data/scratch/shared as the “Staging directory path on Cluster”
      • +
      • Select “Scratch directory local to the execution node(s)” and add /scratch as the HPC scratch directory.
      • +
      • Never check the option “Keep job files in the staging directory when job is complete” if the previous +option “Scratch directory local to the execution node(s)” was set.
      • +
      • “Apply” changes.
      • +
      +
    8. +
    9. In the “Queues” tab, use the left button to auto-discover partitions +Queues +
        +
      • If no authentication method was configured before, an authentication window will appear. Use your +PSI account to authenticate. Notice that the PSICH\ prefix must not be added. +Authenticating
      • +
      • From the partition list, select the ones you want to typically use. +
          +
        • In general, standard Merlin users must use hourly, daily and general only.
        • +
        • Other partitions are reserved for allowed users only.
        • +
        +
      • +
      • “Apply” changes. +Select partitions
      • +
      +
    10. +
    11. [Optional] You can perform a test by submitting a test job on each partition by clicking on the Submit button +for each selected partition.
    12. +
    + + + +

    Using RSM in ANSYS

    + +

    Using the RSM service in ANSYS is slightly different depending on the ANSYS software being used. +Please follow the official ANSYS documentation for details about how to use it for that specific software.

    + +

    Alternativaly, please refer to some the examples showed in the following chapters (ANSYS specific software).

    + +

    Using RSM in ANSYS Fluent

    + +

    For further information for using RSM with Fluent, please visit the ANSYS RSM section.

    + +

    Using RSM in ANSYS CFX

    + +

    For further information for using RSM with CFX, please visit the ANSYS RSM section.

    + +

    Using RSM in ANSYS MAPDL

    + +

    For further information for using RSM with MAPDL, please visit the ANSYS RSM section.

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin7/ansys.html b/public/merlin7/ansys.html new file mode 100644 index 0000000..d706064 --- /dev/null +++ b/public/merlin7/ansys.html @@ -0,0 +1,743 @@ + + + + + + + + +ANSYS | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    ANSYS

    +
    + + + +
    + + +
    This document describes how to load and use ANSYS in the Merlin7 cluster
    + + + + + + + +
    + + + + + + +

    This document describes generic information of how to load and run ANSYS software in the Merlin cluster

    + +

    ANSYS software in Pmodules

    + +

    The ANSYS software can be loaded through PModules.

    + +

    The default ANSYS versions are loaded from the central PModules repository.

    + +

    However, we provide local installations on Merlin7 which are needed mainly for some ANSYS packages, like Ansys RSM. +Due to this, and also to improve the interactive experience of the user, ANSYS has been also installed in the +Merlin high performance storage and we have made it available from Pmodules.

    + +

    Loading Merlin7 ANSYS

    + +

    For loading the Merlin7 ANSYS software, one needs to run Pmodules v1.1.22 or newer, and then use a specific repository +(called merlin) which is only available from the Merlin7 cluster:

    + +
    module purge
    +module load Pmodules/1.1.22
    +module use merlin
    +module use unstable
    +module use /etc/cscs-modules/
    +module load cray
    +module search ANSYS
    +
    +# Load the proper ANSYS version, in example for 2022R2
    +module load ANSYS/2022R2
    +
    +

    Once merlin is invoked, it will disable central ANSYS installations with the same version, which will be replaced +by the local ones in Merlin. Releases from the central Pmodules repository which have not a local installation will remain +visible. For each ANSYS release, one can identify where it is installed by searching ANSYS in PModules with the --verbose +option. This will show the location of the different ANSYS releases as follows:

    +
      +
    • For ANSYS releases installed in the central repositories, the path starts with /opt/psi
    • +
    • For ANSYS releases installed in the Merlin7 repository (and/or overwritting the central ones), the path starts with /data/software/pmodules
    • +
    + +

    We strongly recommend only using ANSYS/2022R2 or superior.

    + +
    +[Example] Loading ANSYS from the Merlin7 PModules repository +
    +🔥 [caubet_m@login001:~]# module purge                                              
    +🔥 [caubet_m@login001:~]# module load Pmodules/1.1.22                               
    +module load: unstable module has been loaded -- Pmodules/1.1.22                                                                                                         
    +
    +🔥 [caubet_m@login001:~]# module use merlin                                         
    +🔥 [caubet_m@login001:~]# module use unstable                                                                                                                           
    +🔥 [caubet_m@login001:~]# module use /etc/cscs-modules/                             
    +🔥 [caubet_m@login001:~]# module load cray                                          
    +                                                                                    
    +Activating Modules:                                                                 
    +  1) cce/17.0.0                                                                     
    +
    +🔥 [caubet_m@login001:~]# module load ANSYS/2022R2                                                                                                                      
    +module load: unstable module has been loaded -- ANSYS/2022R2          
    +
    +🔥 [caubet_m@login001:~]# module search ANSYS --verbose
    +ANSYS/2019R3:
    +  release stage: stable
    +  group:         Tools
    +  overlay:       base
    +  modulefile:    /opt/psi/Tools/modulefiles/ANSYS/2019R3
    +  dependencies:  (none)
    +ANSYS/2020R1:
    +  release stage: stable
    +  group:         Tools
    +  overlay:       base
    +  modulefile:    /opt/psi/Tools/modulefiles/ANSYS/2020R1
    +  dependencies:  (none)
    +ANSYS/2020R1-1:
    +  release stage: stable
    +  group:         Tools
    +  overlay:       base
    +  modulefile:    /opt/psi/Tools/modulefiles/ANSYS/2020R1-1
    +  dependencies:  (none)
    +ANSYS/2020R2:
    +  release stage: unstable
    +  group:         Tools
    +  overlay:       base
    +  modulefile:    /opt/psi/Tools/modulefiles/ANSYS/2020R2
    +  dependencies:  (none)
    +ANSYS/2021R1:
    +  release stage: unstable
    +  group:         Tools
    +  overlay:       base
    +  modulefile:    /opt/psi/Tools/modulefiles/ANSYS/2021R1
    +  dependencies:  (none)
    +ANSYS/2022R2:
    +  release stage: unstable
    +  group:         Tools
    +  overlay:       merlin
    +  modulefile:    /data/software/pmodules/Tools/modulefiles/ANSYS/2022R2
    +  dependencies:  (none)
    +ANSYS/2023R2:
    +  release stage: unstable
    +  group:         Tools
    +  overlay:       merlin
    +  modulefile:    /data/software/pmodules/Tools/modulefiles/ANSYS/2023R2
    +  dependencies:  (none)
    +ANSYS/2024R1:
    +  release stage: unstable
    +  group:         Tools
    +  overlay:       merlin
    +  modulefile:    /data/software/pmodules/Tools/modulefiles/ANSYS/2024R1
    +  dependencies:  (none)
    +
    +
    + + + +

    ANSYS Documentation by product

    + +

    ANSYS RSM

    + +

    ANSYS Remote Solve Manager (RSM) is used by ANSYS Workbench to submit computational jobs to HPC clusters directly from Workbench on your desktop. +Therefore, PSI workstations with direct access to Merlin can submit jobs by using RSM.

    + +

    For further information, please visit the ANSYS RSM section.

    + +

    ANSYS Fluent

    + +

    For further information, please visit the ANSYS RSM section.

    + +

    ANSYS CFX

    + +

    For further information, please visit the ANSYS RSM section.

    + +

    ANSYS MAPDL

    + +

    For further information, please visit the ANSYS RSM section.

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin7/archive.html b/public/merlin7/archive.html new file mode 100644 index 0000000..aa8908a --- /dev/null +++ b/public/merlin7/archive.html @@ -0,0 +1,998 @@ + + + + + + + + +Archive & PSI Data Catalog | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Archive & PSI Data Catalog

    +
    + + + +
    + + +
    This document describes how to use the PSI Data Catalog for archiving Merlin7 data.
    + + + + + + + +
    + + + + + + +

    PSI Data Catalog as a PSI Central Service

    + +

    PSI provides access to the Data Catalog for long-term data storage and retrieval. Data is +stored on the PetaByte Archive at the Swiss National Supercomputing Centre (CSCS).

    + +

    The Data Catalog and Archive is suitable for:

    + +
      +
    • Raw data generated by PSI instruments
    • +
    • Derived data produced by processing some inputs
    • +
    • Data required to reproduce PSI research and publications
    • +
    + +

    The Data Catalog is part of PSI’s effort to conform to the FAIR principles for data management. +In accordance with this policy, data will be publicly released under CC-BY-SA 4.0 after an +embargo period expires.

    + +

    The Merlin cluster is connected to the Data Catalog. Hence, users archive data stored in the +Merlin storage under the /data directories (currentlyi, /data/user and /data/project). +Archiving from other directories is also possible, however the process is much slower as data +can not be directly retrieved by the PSI archive central servers (central mode), and needs to +be indirectly copied to these (decentral mode).

    + +

    Archiving can be done from any node accessible by the users (usually from the login nodes).

    + + + +

    Procedure

    + +

    Overview

    + +

    Below are the main steps for using the Data Catalog.

    + +
      +
    • Ingest the dataset into the Data Catalog. This makes the data known to the Data Catalog system at PSI: +
        +
      • Prepare a metadata file describing the dataset
      • +
      • Run datasetIngestor script
      • +
      • If necessary, the script will copy the data to the PSI archive servers +
          +
        • Usually this is necessary when archiving from directories other than /data/user or +/data/project. It would be also necessary when the Merlin export server (merlin-archive.psi.ch) +is down for any reason.
        • +
        +
      • +
      +
    • +
    • Archive the dataset: +
        +
      • Visit https://discovery.psi.ch
      • +
      • Click Archive for the dataset
      • +
      • The system will now copy the data to the PetaByte Archive at CSCS
      • +
      +
    • +
    • Retrieve data from the catalog: +
        +
      • Find the dataset on https://discovery.psi.ch and click Retrieve
      • +
      • Wait for the data to be copied to the PSI retrieval system
      • +
      • Run datasetRetriever script
      • +
      +
    • +
    + +

    Since large data sets may take a lot of time to transfer, some steps are designed to happen in the +background. The discovery website can be used to track the progress of each step.

    + +

    Account Registration

    + +

    Two types of account permit access to the Data Catalog. If your data was collected at a beamline, you may +have been assigned a p-group (e.g. p12345) for the experiment. Other users are assigned a-group +(e.g. a-12345).

    + +

    Groups are usually assigned to a PI, and then individual user accounts are added to the group. This must be done +under user request through PSI Service Now. For existing a-groups and p-groups, you can follow the standard +central procedures. Alternatively, if you do not know how to do that, follow the Merlin7 +Requesting extra Unix groups procedure, or open +a PSI Service Now ticket.

    + +

    Documentation

    + +

    Accessing the Data Catalog is done through the SciCat software. +Documentation is here: ingestManual.

    + +

    Loading datacatalog tools

    + +

    The latest datacatalog software is maintained in the PSI module system. To access it from the Merlin systems, run the following command:

    + +
    module load datacatalog
    +
    + +

    It can be done from any host in the Merlin cluster accessible by users. Usually, login nodes will be the nodes used for archiving.

    + +

    Finding your token

    + +

    As of 2022-04-14 a secure token is required to interact with the data catalog. This is a long random string that replaces the previous user/password authentication (allowing access for non-PSI use cases). This string should be treated like a password and not shared.

    + +
      +
    1. Go to discovery.psi.ch
    2. +
    3. Click ‘Sign in’ in the top right corner. Click the ‘Login with PSI account’ and log in on the PSI login1. page.
    4. +
    5. You should be redirected to your user settings and see a ‘User Information’ section. If not, click on1. your username in the top right and choose ‘Settings’ from the menu.
    6. +
    7. Look for the field ‘Catamel Token’. This should be a 64-character string. Click the icon to copy the1. token.
    8. +
    + +

    SciCat website

    + +

    You will need to save this token for later steps. To avoid including it in all the commands, I suggest saving it to an environmental variable (Linux):

    + +
    $  SCICAT_TOKEN=RqYMZcqpqMJqluplbNYXLeSyJISLXfnkwlfBKuvTSdnlpKkU
    +
    + +

    (Hint: prefix this line with a space to avoid saving the token to your bash history.)

    + +

    Tokens expire after 2 weeks and will need to be fetched from the website again.

    + +

    Ingestion

    + +

    The first step to ingesting your data into the catalog is to prepare a file describing what data you have. This is called +metadata.json, and can be created with a text editor (e.g. vim). It can in principle be saved anywhere, +but keeping it with your archived data is recommended. For more information about the format, see the ‘Bio metadata’ +section below. An example follows:

    + +
    {
    +    "principalInvestigator": "albrecht.gessler@psi.ch",
    +    "creationLocation": "/PSI/EMF/JEOL2200FS",
    +    "dataFormat": "TIFF+LZW Image Stack",
    +    "sourceFolder": "/gpfs/group/LBR/pXXX/myimages",
    +    "owner": "Wilhelm Tell",
    +    "ownerEmail": "wilhelm.tell@psi.ch",
    +    "type": "raw",
    +    "description": "EM micrographs of amygdalin",
    +    "ownerGroup": "a-12345",
    +    "scientificMetadata": {
    +        "description": "EM micrographs of amygdalin",
    +        "sample": {
    +            "name": "Amygdalin beta-glucosidase 1",
    +            "uniprot": "P29259",
    +            "species": "Apple"
    +        },
    +        "dataCollection": {
    +            "date": "2018-08-01"
    +        },
    +        "microscopeParameters": {
    +            "pixel size": {
    +                "v": 0.885,
    +                "u": "A"
    +            },
    +            "voltage": {
    +                "v": 200,
    +                "u": "kV"
    +            },
    +            "dosePerFrame": {
    +                "v": 1.277,
    +                "u": "e/A2"
    +            }
    +        }
    +    }
    +}
    +
    + +

    It is recommended to use the ScicatEditor for creating metadata files. This is a browser-based tool specifically for ingesting PSI data. Using the tool avoids syntax errors and provides templates for common data sets and options. The finished JSON file can then be downloaded to merlin or copied into a text editor.

    + +

    Another option is to use the SciCat graphical interface from NoMachine. This provides a graphical interface for selecting data to archive. This is particularly useful for data associated with a DUO experiment and p-group. Type SciCat to get started after loading the datacatalog`` module. The GUI also replaces the the command-line ingestion described below.

    + +

    The following steps can be run from wherever you saved your metadata.json. First, perform a “dry-run” which will check the metadata for errors:

    + +
    datasetIngestor --token $SCICAT_TOKEN metadata.json
    +
    + +

    It will ask for your PSI credentials and then print some info about the data to be ingested. If there are no errors, proceed to the real ingestion:

    + +
    datasetIngestor --token $SCICAT_TOKEN --ingest --autoarchive metadata.json
    +
    + +

    You will be asked whether you want to copy the data to the central system:

    + +
      +
    • If you are on the Merlin cluster and you are archiving data from /data/user or /data/project, answer ‘no’ since the data catalog can +directly read the data.
    • +
    • If you are on a directory other than /data/user and ``/data/project, or you are on a desktop computer, answer ‘yes’. Copying large datasets +to the PSI archive system may take quite a while (minutes to hours).
    • +
    + +

    If there are no errors, your data has been accepted into the data catalog! From now on, no changes should be made to the ingested data. +This is important, since the next step is for the system to copy all the data to the CSCS Petabyte archive. Writing to tape is slow, so +this process may take several days, and it will fail if any modifications are detected.

    + +

    If using the --autoarchive option as suggested above, your dataset should now be in the queue. Check the data catalog: +https://discovery.psi.ch. Your job should have status ‘WorkInProgress’. You will receive an email when the ingestion +is complete.

    + +

    If you didn’t use --autoarchive, you need to manually move the dataset into the archive queue. From discovery.psi.ch, navigate to the ‘Archive’ +tab. You should see the newly ingested dataset. Check the dataset and click Archive. You should see the status change from datasetCreated to +scheduleArchiveJob. This indicates that the data is in the process of being transferred to CSCS.

    + +

    After a few days the dataset’s status will change to datasetOnAchive indicating the data is stored. At this point it is safe to delete the data.

    + +

    Useful commands

    + +

    Running the datasetIngestor in dry mode (without --ingest) finds most errors. However, it is sometimes convenient to find potential errors +yourself with simple unix commands.

    + +

    Find problematic filenames

    + +
    find . -iregex '.*/[^/]*[^a-zA-Z0-9_ ./-][^/]*'=
    +
    + +

    Find broken links

    + +
    find -L . -type l
    +
    + +

    Find outside links

    + +
    find . -type l -exec bash -c 'realpath --relative-base "`pwd`" "$0" 2>/dev/null |egrep "^[./]" |sed "s|^|$0 ->|" ' '{}' ';'
    +
    + +

    Delete certain files (use with caution)

    + +
    # Empty directories
    +find . -type d -empty -delete
    +# Backup files
    +find . -name '*~' -delete
    +find . -name '*#autosave#' -delete
    +
    + +

    Troubleshooting & Known Bugs

    + +
      +
    • +

      The following message can be safely ignored:

      + +
       key_cert_check_authority: invalid certificate
      + Certificate invalid: name is not a listed principal
      +
      +

      It indicates that no kerberos token was provided for authentication. You can avoid the warning by first running kinit (PSI linux systems).

      +
    • +
    • +

      For decentral ingestion cases, the copy step is indicated by a message Running [/usr/bin/rsync -e ssh -avxz .... It is expected that this +step will take a long time and may appear to have hung. You can check what files have been successfully transfered using rsync:

      + +
       rsync --list-only user_n@pb-archive.psi.ch:archive/UID/PATH/
      +
      + +

      where UID is the dataset ID (12345678-1234-1234-1234-123456789012) and PATH is the absolute path to your data. Note that rsync creates directories first and that the transfer order is not alphabetical in some cases, but it should be possible to see whether any data has transferred.

      +
    • +
    • +

      There is currently a limit on the number of files per dataset (technically, the limit is from the total length of all file paths). It is recommended to break up datasets into 300’000 files or less.

      +
        +
      • +

        If it is not possible or desirable to split data between multiple datasets, an alternate work-around is to package files into a tarball. For datasets which are already compressed, omit the -z option for a considerable speedup:

        + +
        tar -f [output].tar [srcdir]
        +
        + +

        Uncompressed data can be compressed on the cluster using the following command:

        + +
        sbatch /data/software/Slurm/Utilities/Parallel_TarGz.batch -s [srcdir] -t [output].tar -n
        +
        + +

        Run /data/software/Slurm/Utilities/Parallel_TarGz.batch -h for more details and options.

        +
      • +
      +
    • +
    + +

    Sample ingestion output (datasetIngestor 1.1.11)

    +
    +[Show Example]: Sample ingestion output (datasetIngestor 1.1.11) +
    +/data/project/bio/myproject/archive $ datasetIngestor -copy -autoarchive -allowexistingsource -ingest metadata.json
    +2019/11/06 11:04:43 Latest version: 1.1.11
    +
    +
    +2019/11/06 11:04:43 Your version of this program is up-to-date
    +2019/11/06 11:04:43 You are about to add a dataset to the === production === data catalog environment...
    +2019/11/06 11:04:43 Your username:
    +user_n
    +2019/11/06 11:04:48 Your password:
    +2019/11/06 11:04:52 User authenticated: XXX
    +2019/11/06 11:04:52 User is member in following a or p groups: XXX
    +2019/11/06 11:04:52 OwnerGroup information a-XXX verified successfully.
    +2019/11/06 11:04:52 contactEmail field added: XXX
    +2019/11/06 11:04:52 Scanning files in dataset /data/project/bio/myproject/archive
    +2019/11/06 11:04:52 No explicit filelistingPath defined - full folder /data/project/bio/myproject/archive is used.
    +2019/11/06 11:04:52 Source Folder: /data/project/bio/myproject/archive at /data/project/bio/myproject/archive
    +2019/11/06 11:04:57 The dataset contains 100000 files with a total size of 50000000000 bytes.
    +2019/11/06 11:04:57 creationTime field added: 2019-07-29 18:47:08 +0200 CEST
    +2019/11/06 11:04:57 endTime field added: 2019-11-06 10:52:17.256033 +0100 CET
    +2019/11/06 11:04:57 license field added: CC BY-SA 4.0
    +2019/11/06 11:04:57 isPublished field added: false
    +2019/11/06 11:04:57 classification field added: IN=medium,AV=low,CO=low
    +2019/11/06 11:04:57 Updated metadata object:
    +{
    +    "accessGroups": [
    +        "XXX"
    +    ],
    +    "classification": "IN=medium,AV=low,CO=low",
    +    "contactEmail": "XXX",
    +    "creationLocation": "XXX",
    +    "creationTime": "2019-07-29T18:47:08+02:00",
    +    "dataFormat": "XXX",
    +    "description": "XXX",
    +    "endTime": "2019-11-06T10:52:17.256033+01:00",
    +    "isPublished": false,
    +    "license": "CC BY-SA 4.0",
    +    "owner": "XXX",
    +    "ownerEmail": "XXX",
    +    "ownerGroup": "a-XXX",
    +    "principalInvestigator": "XXX",
    +    "scientificMetadata": {
    +...
    +    },
    +    "sourceFolder": "/data/project/bio/myproject/archive",
    +    "type": "raw"
    +}
    +2019/11/06 11:04:57 Running [/usr/bin/ssh -l user_n pb-archive.psi.ch test -d /data/project/bio/myproject/archive].
    +key_cert_check_authority: invalid certificate
    +Certificate invalid: name is not a listed principal
    +user_n@pb-archive.psi.ch's password:
    +2019/11/06 11:05:04 The source folder /data/project/bio/myproject/archive is not centrally available (decentral use case).
    +The data must first be copied to a rsync cache server.
    +
    +
    +2019/11/06 11:05:04 Do you want to continue (Y/n)?
    +Y
    +2019/11/06 11:05:09 Created dataset with id 12.345.67890/12345678-1234-1234-1234-123456789012
    +2019/11/06 11:05:09 The dataset contains 108057 files.
    +2019/11/06 11:05:10 Created file block 0 from file 0 to 1000 with total size of 413229990 bytes
    +2019/11/06 11:05:10 Created file block 1 from file 1000 to 2000 with total size of 416024000 bytes
    +2019/11/06 11:05:10 Created file block 2 from file 2000 to 3000 with total size of 416024000 bytes
    +2019/11/06 11:05:10 Created file block 3 from file 3000 to 4000 with total size of 416024000 bytes
    +...
    +2019/11/06 11:05:26 Created file block 105 from file 105000 to 106000 with total size of 416024000 bytes
    +2019/11/06 11:05:27 Created file block 106 from file 106000 to 107000 with total size of 416024000 bytes
    +2019/11/06 11:05:27 Created file block 107 from file 107000 to 108000 with total size of 850195143 bytes
    +2019/11/06 11:05:27 Created file block 108 from file 108000 to 108057 with total size of 151904903 bytes
    +2019/11/06 11:05:27 short dataset id: 0a9fe316-c9e7-4cc5-8856-e1346dd31e31
    +2019/11/06 11:05:27 Running [/usr/bin/rsync -e ssh -avxz /data/project/bio/myproject/archive/ user_n@pb-archive.psi.ch:archive
    +/0a9fe316-c9e7-4cc5-8856-e1346dd31e31/data/project/bio/myproject/archive].
    +key_cert_check_authority: invalid certificate
    +Certificate invalid: name is not a listed principal
    +user_n@pb-archive.psi.ch's password:
    +Permission denied, please try again.
    +user_n@pb-archive.psi.ch's password:
    +/usr/libexec/test_acl.sh: line 30: /tmp/tmpacl.txt: Permission denied
    +/usr/libexec/test_acl.sh: line 30: /tmp/tmpacl.txt: Permission denied
    +/usr/libexec/test_acl.sh: line 30: /tmp/tmpacl.txt: Permission denied
    +/usr/libexec/test_acl.sh: line 30: /tmp/tmpacl.txt: Permission denied
    +/usr/libexec/test_acl.sh: line 30: /tmp/tmpacl.txt: Permission denied
    +...
    +2019/11/06 12:05:08 Successfully updated {"pid":"12.345.67890/12345678-1234-1234-1234-123456789012",...}
    +2019/11/06 12:05:08 Submitting Archive Job for the ingested datasets.
    +2019/11/06 12:05:08 Job response Status: okay
    +2019/11/06 12:05:08 A confirmation email will be sent to XXX
    +12.345.67890/12345678-1234-1234-1234-123456789012
    +
    +
    + +

    Publishing

    + +

    After datasets are are ingested they can be assigned a public DOI. This can be included in publications and will make the datasets on http://doi.psi.ch.

    + +

    For instructions on this, please read the ‘Publish’ section in the ingest manual.

    + +

    Retrieving data

    + +

    Retrieving data from the archive is also initiated through the Data Catalog. Please read the ‘Retrieve’ section in the ingest manual.

    + +

    Further Information

    + + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin7/code-of-conduct.html b/public/merlin7/code-of-conduct.html new file mode 100644 index 0000000..7b352b2 --- /dev/null +++ b/public/merlin7/code-of-conduct.html @@ -0,0 +1,671 @@ + + + + + + + + +Code Of Conduct | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Code Of Conduct

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    The Basic principle

    + +

    The basic principle is courtesy and consideration for other users.

    + +
      +
    • Merlin7 is a system shared by many users, therefore you are kindly requested to apply common courtesy in using its resources. Please follow our guidelines which aim at providing and maintaining an efficient compute environment for all our users.
    • +
    • Basic shell programming skills are an essential requirement in a Linux/UNIX HPC cluster environment; a proficiency in shell programming is greatly beneficial.
    • +
    + +

    Interactive nodes

    + +
      +
    • The interactive nodes (also known as login nodes) are for development and quick testing: +
        +
      • It is strictly forbidden to run production jobs on the login nodes. All production jobs must be submitted to the batch system.
      • +
      • It is forbidden to run long processes occupying big parts of a login node’s resources.
      • +
      • According to the previous rules, misbehaving running processes will have to be killed. +in order to keep the system responsive for other users.
      • +
      +
    • +
    + +

    Batch system

    + +
      +
    • Make sure that no broken or run-away processes are left when your job is done. Keep the process space clean on all nodes.
    • +
    • During the runtime of a job, it is mandatory to use the /scratch and /data/scratch/shared partitions for temporary data: +
        +
      • It is forbidden to use the /data/user or /data/project for that purpose.
      • +
      • Always remove files you do not need any more (e.g. core dumps, temporary files) as early as possible. Keep the disk space clean on all nodes.
      • +
      • Prefer /scratch over /data/scratch/shared and use the latter only when you require the temporary files to be visible from multiple nodes.
      • +
      +
    • +
    • Read the description in Merlin7 directory structure for learning about the correct usage of each partition type.
    • +
    + +

    User and project data

    + +
      +
    • Users are responsible for backing up their own data. Is recommended to backup the data on third party independent systems (i.e. LTS, Archive, AFS, SwitchDrive, Windows Shares, etc.).
    • +
    • When a user leaves PSI, she or her supervisor/team are responsible to backup and move the data out from the cluster: every few months, the storage space will be recycled for those old users who do not have an existing and valid PSI account.
    • +
    + + + +

    System Administrator Rights

    + +
      +
    • The system administrator has the right to temporarily block the access to Merlin7 for an account violating the Code of Conduct in order to maintain the efficiency and stability of the system. +
        +
      • Repetitive violations by the same user will be escalated to the user’s supervisor.
      • +
      +
    • +
    • The system administrator has the right to delete files in the scratch directories +
        +
      • after a job, if the job failed to clean up its files.
      • +
      • during the job in order to prevent a job from destabilizing a node or multiple nodes.
      • +
      +
    • +
    • The system administrator has the right to kill any misbehaving running processes.
    • +
    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin7/connect-from-linux.html b/public/merlin7/connect-from-linux.html new file mode 100644 index 0000000..d454124 --- /dev/null +++ b/public/merlin7/connect-from-linux.html @@ -0,0 +1,650 @@ + + + + + + + + +Connecting from a Linux Client | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Connecting from a Linux Client

    +
    + + + +
    + + +
    This document describes a recommended setup for a Linux client.
    + + + + + + + +
    + + + + + + +

    SSH without X11 Forwarding

    + +

    This is the standard method. Official X11 support is provided through NoMachine. +For normal SSH sessions, use your SSH client as follows:

    + +
    ssh $username@login001.merlin7.psi.ch
    +ssh $username@login002.merlin7.psi.ch
    +
    + +

    SSH with X11 Forwarding

    + +

    Official X11 Forwarding support is through NoMachine. Please follow the document +{Job Submission -> Interactive Jobs} and +{Accessing Merlin -> NoMachine} for more details. However, +we provide a small recipe for enabling X11 Forwarding in Linux.

    + +
      +
    • +

      For enabling client X11 forwarding, add the following to the start of ~/.ssh/config +to implicitly add -X to all ssh connections:

      + +
       ForwardAgent yes
      + ForwardX11Trusted yes
      +
      +
    • +
    • +

      Alternatively, you can add the option -Y to the ssh command. In example:

      + +
       ssh -X $username@login001.merlin7.psi.ch
      + ssh -X $username@login002.merlin7.psi.ch
      +
      +
    • +
    • +

      For testing that X11 forwarding works, just run sview. A X11 based slurm view of the cluster should +popup in your client session:

      + +
       sview
      +
      +
    • +
    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin7/connect-from-macos.html b/public/merlin7/connect-from-macos.html new file mode 100644 index 0000000..8238907 --- /dev/null +++ b/public/merlin7/connect-from-macos.html @@ -0,0 +1,661 @@ + + + + + + + + +Connecting from a MacOS Client | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Connecting from a MacOS Client

    +
    + + + +
    + + +
    This document describes a recommended setup for a MacOS client.
    + + + + + + + +
    + + + + + + +

    SSH without X11 Forwarding

    + +

    This is the standard method. Official X11 support is provided through NoMachine. +For normal SSH sessions, use your SSH client as follows:

    + +
    ssh $username@login001.merlin7.psi.ch
    +ssh $username@login002.merlin7.psi.ch
    +
    + +

    SSH with X11 Forwarding

    + +

    Requirements

    + +

    For running SSH with X11 Forwarding in MacOS, one needs to have a X server running in MacOS. +The official X Server for MacOS is XQuartz. Please ensure +you have it running before starting a SSH connection with X11 forwarding.

    + +

    SSH with X11 Forwarding in MacOS

    + +

    Official X11 support is through NoMachine. Please follow the document +{Job Submission -> Interactive Jobs} and +{Accessing Merlin -> NoMachine} for more details. However, +we provide a small recipe for enabling X11 Forwarding in MacOS.

    + +
      +
    • +

      Ensure that XQuartz is installed and running in your MacOS.

      +
    • +
    • +

      For enabling client X11 forwarding, add the following to the start of ~/.ssh/config +to implicitly add -X to all ssh connections:

      + +
       ForwardAgent yes
      + ForwardX11Trusted yes
      +
      +
    • +
    • +

      Alternatively, you can add the option -Y to the ssh command. In example:

      + +
       ssh -X $username@login001.merlin7.psi.ch
      + ssh -X $username@login002.merlin7.psi.ch
      +
      +
    • +
    • +

      For testing that X11 forwarding works, just run sview. A X11 based slurm view of the cluster should +popup in your client session.

      + +
       sview
      +
      +
    • +
    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin7/connect-from-windows.html b/public/merlin7/connect-from-windows.html new file mode 100644 index 0000000..d07e53c --- /dev/null +++ b/public/merlin7/connect-from-windows.html @@ -0,0 +1,660 @@ + + + + + + + + +Connecting from a Windows Client | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Connecting from a Windows Client

    +
    + + + +
    + + +
    This document describes a recommended setup for a Windows client.
    + + + + + + + +
    + + + + + + +

    SSH with PuTTY without X11 Forwarding

    + +

    PuTTY is one of the most common tools for SSH.

    + +

    Check, if the following software packages are installed on the Windows workstation by +inspecting the Start menu (hint: use the Search box to save time):

    + + +

    If they are missing, you can install them using the Software Kiosk icon on the Desktop.

    + +
      +
    1. +

      Start PuTTY

      +
    2. +
    3. +

      [Optional] Enable xterm to have similar mouse behavour as in Linux:

      + +

      Enable 'xterm'

      +
    4. +
    5. +

      Create session to a Merlin login node and Open:

      + +

      Create Merlin Session

      +
    6. +
    + +

    SSH with PuTTY with X11 Forwarding

    + +

    Official X11 Forwarding support is through NoMachine. Please follow the document +{Job Submission -> Interactive Jobs} and +{Accessing Merlin -> NoMachine} for more details. However, +we provide a small recipe for enabling X11 Forwarding in Windows.

    + +

    Check, if the Xming is installed on the Windows workstation by inspecting the +Start menu (hint: use the Search box to save time). If missing, you can install it by +using the Software Kiosk icon (should be located on the Desktop).

    + +
      +
    1. +

      Ensure that a X server (Xming) is running. Otherwise, start it.

      +
    2. +
    3. +

      Enable X11 Forwarding in your SSH client. In example, for Putty:

      + +

      Enable X11 Forwarding in Putty

      +
    4. +
    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin7/contact.html b/public/merlin7/contact.html new file mode 100644 index 0000000..79bbf39 --- /dev/null +++ b/public/merlin7/contact.html @@ -0,0 +1,655 @@ + + + + + + + + +Contact | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Contact

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    Support

    + +

    Support can be asked through:

    + + +

    Basic contact information is also displayed on every shell login to the system using the Message of the Day mechanism.

    + +

    PSI Service Now

    + +

    PSI Service Now: is the official tool for opening incident requests.

    +
      +
    • PSI HelpDesk will redirect the incident to the corresponding department, or
    • +
    • you can always assign it directly by checking the box I know which service is affected and providing the service name Local HPC Resources (e.g. Merlin) [CF] (just type in Local and you should get the valid completions).
    • +
    + +

    Contact Merlin Administrators

    + +

    E-Mail merlin-admins@lists.psi.ch

    +
      +
    • This is the official way to contact Merlin Administrators for discussions which do not fit well into the incident category. +Do not hesitate to contact us for such cases.
    • +
    + +
    + +

    Get updated through the Merlin User list!

    + +

    Is strictly recommended that users subscribe to the Merlin Users mailing list: merlin7-users@lists.psi.ch

    + +

    This mailing list is the official channel used by Merlin administrators to inform users about downtimes, +interventions or problems. Users can be subscribed in two ways:

    + +
      +
    • (Preferred way) Self-registration through Sympa
    • +
    • If you need to subscribe many people (e.g. your whole group) by sending a request to the admin list merlin-admins@lists.psi.ch +and providing a list of email addresses.
    • +
    + +
    + +

    The Merlin Cluster Team

    + +

    The PSI Merlin clusters are managed by the High Performance Computing and Emerging technologies Group, which + is part of the Science IT Infrastructure, and Services department (AWI) in PSI’s Center for Scientific Computing, Theory and Data (SCD).

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin7/cray-module-env.html b/public/merlin7/cray-module-env.html new file mode 100644 index 0000000..a1678c5 --- /dev/null +++ b/public/merlin7/cray-module-env.html @@ -0,0 +1,662 @@ + + + + + + + + +Cray Programming Environment | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Cray Programming Environment

    +
    + + + +
    + + +
    This document describes how to use the Cray Programming Environment on Merlin7.
    + + + + + + + +
    + + + + + + +

    Loading the Cray module

    + +

    The Cray Programming Environment, with Cray’s compilers and MPI, is not loaded by default.

    + +

    To load it, one has to run the following command:

    + +
    module load cray
    +
    + +

    The Cray Programming Environment will load all the necessary dependencies. In example:

    + +
    🔥 [caubet_m@login001:~]# module list
    +Currently Loaded Modules:
    + 1) craype-x86-rome                                 2) libfabric/1.15.2.0
    + 3) craype-network-ofi                             
    + 4) xpmem/2.9.6-1.1_20240510205610__g087dc11fc19d   5) PrgEnv-cray/8.5.0
    + 6) cce/17.0.0                                      7) cray-libsci/23.12.5
    + 8) cray-mpich/8.1.28                               9) craype/2.7.30
    +10) perftools-base/23.12.0                         11) cpe/23.12
    +12) cray/23.12                                     
    +
    + +

    You will notice an unfamiliar PrgEnv-cray/8.5.0 that was loaded. This is a meta-module that Cray provides to simplify the switch of compilers and their associated dependencies and libraries, +as a whole called Programming Environment. In the Cray Programming Environment, there are 4 key modules.

    + +
      +
    • cray-libsci is a collection of numerical routines tuned for performance on Cray systems.
    • +
    • libfabric is an important low-level library that allows you to take advantage of the high performance Slingshot network.
    • +
    • cray-mpich is a CUDA-aware MPI implementation, optimized for Cray systems.
    • +
    • cce is the compiler from Cray. C/C++ compilers are based on Clang/LLVM while Fortran supports Fortran 2018 standard. More info: https://user.cscs.ch/computing/compilation/cray/
    • +
    + +

    You can switch between different programming environments. You can check the available module with the module avail command, as follows:

    + +
    🔥 [caubet_m@login001:~]# module avail PrgEnv
    +--------------------- /opt/cray/pe/lmod/modulefiles/core ---------------------
    +
    +PrgEnv-cray/8.5.0               PrgEnv-gnu/8.5.0                
    +PrgEnv-nvhpc/8.5.0              PrgEnv-nvidia/8.5.0             
    +
    +

    Switching compiler suites

    + +

    Compiler suites can be exchanged with PrgEnv (Programming Environments) provided by HPE-Cray. The wrappers call the correct compiler with appropriate options to build +and link applications with relevant libraries, as required by the loaded modules (only dynamic linking is supported) and therefore should replace direct calls to compiler +drivers in Makefiles and build scripts.

    + +

    To swap the the compiler suite from the default Cray to GNU compiler, one can run the following.

    + +
    🔥 [caubet_m@login001:~]# module swap PrgEnv-cray/8.5.0 PrgEnv-gnu/8.5.0
    +
    +Lmod is automatically replacing "cce/17.0.0" with "gcc-native/12.3".
    +
    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin7/data-directories.html b/public/merlin7/data-directories.html new file mode 100644 index 0000000..80e5cf7 --- /dev/null +++ b/public/merlin7/data-directories.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

    Redirecting…

    + Click here if you are not redirected. + diff --git a/public/merlin7/gromacs.html b/public/merlin7/gromacs.html new file mode 100644 index 0000000..e0b9bd5 --- /dev/null +++ b/public/merlin7/gromacs.html @@ -0,0 +1,664 @@ + + + + + + + + +GROMACS | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    GROMACS

    +
    + + + +
    + + +
    GROMACS (GROningen Machine for Chemical Simulations) is a versatile and widely-used open source package to perform molecular dynamics
    + + + + + + + +

    GROMACS

    + +

    GROMACS (GROningen Machine for Chemical Simulations) is a versatile and widely-used open source package to perform molecular dynamics, i.e. simulate the Newtonian equations of motion for systems with hundreds to millions of particles.

    + +

    It is primarily designed for biochemical molecules like proteins, lipids and nucleic acids that have a lot of complicated bonded interactions, but since GROMACS is extremely fast at calculating the nonbonded interactions (that usually dominate simulations) many groups are also using it for research on non-biological systems, e.g. polymers.)

    + +

    Licensing Terms and Conditions

    + +

    GROMACS is a joint effort, with contributions from developers around the world: users agree to acknowledge use of GROMACS in any reports or publications of results obtained with the Software (see GROMACS Homepage for details).

    + +

    How to run on Merlin7

    +

    CPU nodes

    +
    module use Spack unstable
    +module load gcc/12.3 openmpi/5.0.7-ax23-A100-gpu gromacs/2025.2-whcq-omp
    +
    +

    A100 nodes

    +
    module use Spack unstable
    +module load gcc/12.3 openmpi/5.0.7-3vzj-A100-gpu gromacs/2025.2-vbj4-A100-gpu-omp
    +
    +

    GH nodes

    +
    module use Spack unstable
    +module load gcc/12.3 openmpi/5.0.7-blxc-GH200-gpu gromacs/2025.2-cjnq-GH200-gpu-omp
    +
    + +

    SBATCH GH, 4 GPU, 32 OMP threads, 4 MPI ranks

    +
    #!/bin/bash
    +#SBATCH --get-user-env
    +#SBATCH --output=_scheduler-stdout.txt
    +#SBATCH --error=_scheduler-stderr.txt
    +#SBATCH --job-name="Testing GROMACS GH"
    +#SBATCH --nodes=1             # number of GH200 nodes with each node having 4 CPU+GPU
    +#SBATCH --ntasks-per-node=4  # 8 MPI ranks per node
    +#SBATCH --cpus-per-task 32    # 32 OMP threads per MPI rank
    +#SBATCH --cluster=gmerlin7
    +#SBATCH --hint=nomultithread 
    +#SBATCH --partition=gh-hourly
    +#SBATCH --gpus=4
    +#SBATCH --gpus-per-task=1
    +
    +unset PMODULES_ENV
    +module purge
    +module use Spack unstable
    +module load gcc/12.3 openmpi/5.0.7-blxc-GH200-gpu gromacs/2025.2-cjnq-GH200-gpu-omp
    +
    +export FI_CXI_RX_MATCH_MODE=software
    +
    +export GMX_GPU_DD_COMMS=true
    +export GMX_GPU_PME_PP_COMMS=true
    +export GMX_FORCE_UPDATE_DEFAULT_GPU=true
    +export GMX_ENABLE_DIRECT_GPU_COMM=1
    +export GMX_FORCE_GPU_AWARE_MPI=1
    +
    +srun gmx_mpi mdrun -s input.tpr -ntomp 32 -bonded gpu -nb gpu -pme gpu -pin on -v -noconfout -dlb yes -nstlist 300 -npme 1 -nsteps 10000 -update gpu
    +
    + +

    Developing your own GPU code

    +

    A100

    +
    module purge
    +module use Spack unstable
    +module load gcc/12.3 openmpi/5.0.7-3vzj-A100-gpu gromacs/2025.2-vbj4-A100-gpu-omp cmake/3.31.6-o3lb python/3.13.1-cyro
    +
    +git clone https://github.com/gromacs/gromacs.git
    +cd gromacs 
    +
    +mkdir build && cd build
    +cmake -DCMAKE_C_COMPILER=gcc-12 \
    +    -DCMAKE_CXX_COMPILER=g++-12 \
    +    -DGMX_MPI=on \
    +    -DGMX_GPU=CUDA \
    +    -GMX_CUDA_TARGET_SM="80" \ # 90 for the Hopper GPUs
    +    -DGMX_DOUBLE=off \ # turn on double precision only if useful
    +    ..
    +
    +make
    +
    +
    + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin7/index.html b/public/merlin7/index.html new file mode 100644 index 0000000..99c8819 --- /dev/null +++ b/public/merlin7/index.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

    Redirecting…

    + Click here if you are not redirected. + diff --git a/public/merlin7/interactive-jobs.html b/public/merlin7/interactive-jobs.html new file mode 100644 index 0000000..62db45c --- /dev/null +++ b/public/merlin7/interactive-jobs.html @@ -0,0 +1,801 @@ + + + + + + + + +Running Interactive Jobs | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Running Interactive Jobs

    +
    + + + +
    + + +
    This document describes how to run interactive jobs as well as X based software.
    + + + + + + + +
    + + + + + + +

    Running interactive jobs

    + +

    There are two different ways for running interactive jobs in Slurm. This is possible by using +the salloc and srun commands:

    + +
      +
    • salloc: to obtain a Slurm job allocation (a set of nodes), execute command(s), and then release the allocation when the command is finished.
    • +
    • srun: is used for running parallel tasks.
    • +
    + +

    srun

    + +

    Is run is used to run parallel jobs in the batch system. It can be used within a batch script +(which can be run with sbatch), or within a job allocation (which can be run with salloc). +Also, it can be used as a direct command (in example, from the login nodes).

    + +

    When used inside a batch script or during a job allocation, srun is constricted to the +amount of resources allocated by the sbatch/salloc commands. In sbatch, usually +these resources are defined inside the batch script with the format #SBATCH <option>=<value>. +In other words, if you define in your batch script or allocation 88 tasks (and 1 thread / core) +and 2 nodes, srun is constricted to these amount of resources (you can use less, but never +exceed those limits).

    + +

    When used from the login node, usually is used to run a specific command or software in an +interactive way. srun is a blocking process (it will block bash prompt until the srun +command finishes, unless you run it in background with &). This can be very useful to run +interactive software which pops up a Window and then submits jobs or run sub-tasks in the +background (in example, Relion, cisTEM, etc.)

    + +

    Refer to man srun for exploring all possible options for that command.

    + +
    +[Show 'srun' example]: Running 'hostname' command on 3 nodes, using 2 cores (1 task/core) per node +
    +caubet_m@login001:~> srun --clusters=merlin7 --ntasks=6 --ntasks-per-node=2 --nodes=3 hostname
    +cn001.merlin7.psi.ch
    +cn001.merlin7.psi.ch
    +cn002.merlin7.psi.ch
    +cn002.merlin7.psi.ch
    +cn003.merlin7.psi.ch
    +cn003.merlin7.psi.ch
    +
    +
    + +

    salloc

    + +

    salloc is used to obtain a Slurm job allocation (a set of nodes). Once job is allocated, +users are able to execute interactive command(s). Once finished (exit or Ctrl+D), +the allocation is released. salloc is a blocking command, it is, command will be blocked +until the requested resources are allocated.

    + +

    When running salloc, once the resources are allocated, by default the user will get +a new shell on one of the allocated resources (if a user has requested few nodes, it will +prompt a new shell on the first allocated node). However, this behaviour can be changed by adding +a shell ($SHELL) at the end of the salloc command. In example:

    + +
    # Typical 'salloc' call 
    +salloc --clusters=merlin7 -N 2 -n 2
    +
    +# Custom 'salloc' call
    +#   - $SHELL will open a local shell on the login node from where ``salloc`` is running
    +salloc --clusters=merlin7 -N 2 -n 2 $SHELL
    +
    + +
    +[Show 'salloc' example]: Allocating 2 cores (1 task/core) in 2 nodes (1 core/node) - Default +
    +caubet_m@login001:~> salloc --clusters=merlin7 -N 2 -n 2
    +salloc: Granted job allocation 161
    +salloc: Nodes cn[001-002] are ready for job
    +
    +caubet_m@login001:~> srun hostname
    +cn002.merlin7.psi.ch
    +cn001.merlin7.psi.ch
    +
    +caubet_m@login001:~> exit
    +exit
    +salloc: Relinquishing job allocation 161
    +
    +
    + +
    +[Show 'salloc' example]: Allocating 2 cores (1 task/core) in 2 nodes (1 core/node) - $SHELL +
    +caubet_m@login001:~> salloc --clusters=merlin7 --ntasks=2 --nodes=2 $SHELL
    +salloc: Granted job allocation 165
    +salloc: Nodes cn[001-002] are ready for job
    +caubet_m@login001:~> srun hostname
    +cn001.merlin7.psi.ch
    +cn002.merlin7.psi.ch
    +caubet_m@login001:~> exit
    +exit
    +salloc: Relinquishing job allocation 165
    +
    +
    + +

    Running interactive jobs with X11 support

    + +

    Requirements

    + +

    Graphical access

    + +

    NoMachine is the official supported service for graphical +access in the Merlin cluster. This service is running on the login nodes. Check the +document {Accessing Merlin -> NoMachine} for details about +how to connect to the NoMachine service in the Merlin cluster.

    + +

    For other non officially supported graphical access (X11 forwarding):

    + + + +

    ‘srun’ with x11 support

    + +

    Merlin6 and merlin7 clusters allow running any windows based applications. For that, you need to +add the option --x11 to the srun command. In example:

    + +
    srun --clusters=merlin7 --x11 sview
    +
    + +

    will popup a X11 based slurm view of the cluster.

    + +

    In the same manner, you can create a bash shell with x11 support. For doing that, you need +to add the option --pty to the srun --x11 command. Once resource is allocated, from +there you can interactively run X11 and non-X11 based commands.

    + +
    srun --clusters=merlin7 --x11 --pty bash
    +
    + +
    +[Show 'srun' with X11 support examples] +
    +caubet_m@login001:~> srun --clusters=merlin7 --x11 sview
    +
    +caubet_m@login001:~> 
    +
    +caubet_m@login001:~> srun --clusters=merlin7 --x11 --pty bash
    +
    +caubet_m@cn003:~> sview
    +
    +caubet_m@cn003:~> echo "This was an example"
    +This was an example
    +
    +caubet_m@cn003:~> exit
    +exit
    +
    +
    + +

    ‘salloc’ with x11 support

    + +

    Merlin6 and merlin7 clusters allow running any windows based applications. For that, you need to +add the option --x11 to the salloc command. In example:

    + +
    salloc --clusters=merlin7 --x11 sview
    +
    + +

    will popup a X11 based slurm view of the cluster.

    + +

    In the same manner, you can create a bash shell with x11 support. For doing that, you need +to add to run just salloc --clusters=merlin7 --x11. Once resource is allocated, from +there you can interactively run X11 and non-X11 based commands.

    + +
    salloc --clusters=merlin7 --x11
    +
    + +
    +[Show 'salloc' with X11 support examples] +
    +caubet_m@login001:~> salloc --clusters=merlin7 --x11 sview
    +salloc: Granted job allocation 174
    +salloc: Nodes cn001 are ready for job
    +salloc: Relinquishing job allocation 174
    +
    +caubet_m@login001:~> salloc --clusters=merlin7 --x11 
    +salloc: Granted job allocation 175
    +salloc: Nodes cn001 are ready for job
    +caubet_m@cn001:~> 
    +
    +caubet_m@cn001:~> sview
    +
    +caubet_m@cn001:~> echo "This was an example"
    +This was an example
    +
    +caubet_m@cn001:~> exit
    +exit
    +salloc: Relinquishing job allocation 175
    +
    +
    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin7/interactive.html b/public/merlin7/interactive.html new file mode 100644 index 0000000..8b32941 --- /dev/null +++ b/public/merlin7/interactive.html @@ -0,0 +1,686 @@ + + + + + + + + +Accessing Interactive Nodes | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Accessing Interactive Nodes

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    SSH Access

    + +

    For interactive command shell access, use an SSH client. We recommend to activate SSH’s X11 forwarding to allow you to use graphical +applications (e.g. a text editor, but for more performant graphical access, refer to the sections below). X applications are supported +in the login nodes and X11 forwarding can be used for those users who have properly configured X11 support in their desktops, however:

    + +
      +
    • Merlin7 administrators do not offer support for user desktop configuration (Windows, MacOS, Linux). +
        +
      • Hence, Merlin7 administrators do not offer official support for X11 client setup.
      • +
      • Nevertheless, a generic guide for X11 client setup (Linux, Windows and MacOS) is provided below.
      • +
      +
    • +
    • PSI desktop configuration issues must be addressed through PSI Service Now as an Incident Request. +
        +
      • Ticket will be redirected to the corresponding Desktop support group (Windows, Linux).
      • +
      +
    • +
    + +

    Accessing from a Linux client

    + +

    Refer to {How To Use Merlin -> Accessing from Linux Clients} for Linux SSH client and X11 configuration.

    + +

    Accessing from a Windows client

    + +

    Refer to {How To Use Merlin -> Accessing from Windows Clients} for Windows SSH client and X11 configuration.

    + +

    Accessing from a MacOS client

    + +

    Refer to {How To Use Merlin -> Accessing from MacOS Clients} for MacOS SSH client and X11 configuration.

    + +

    NoMachine Remote Desktop Access

    + +

    X applications are supported in the login nodes and can run efficiently through a NoMachine client. This is the officially supported way to run more demanding X applications on Merlin7.

    +
      +
    • For PSI Windows workstations, this can be installed from the Software Kiosk as ‘NX Client’. If you have difficulties installing, please request support through PSI Service Now as an Incident Request.
    • +
    • For other workstations The client software can be downloaded from the Nomachine Website.
    • +
    + +

    Configuring NoMachine

    + +

    Refer to {How To Use Merlin -> Remote Desktop Access} for further instructions of how to configure the NoMachine client and how to access it from PSI and from outside PSI.

    + +

    Login nodes hardware description

    + +

    The Merlin7 login nodes are the official machines for accessing the recources of Merlin7. +From these machines, users can submit jobs to the Slurm batch system as well as visualize or compile their software.

    + +

    The Merlin7 login nodes are the following:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    HostnameSSHNoMachineScratchScratch Mountpoint
    login001.merlin7.psi.chyesyes1TB NVMe/scratch
    login002.merlin7.psi.chyesyes1TB NVMe/scratch
    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin7/introduction.html b/public/merlin7/introduction.html new file mode 100644 index 0000000..c39e850 --- /dev/null +++ b/public/merlin7/introduction.html @@ -0,0 +1,710 @@ + + + + + + + + +Introduction | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Introduction

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    About Merlin7

    + +

    The Merlin7 cluster is moving toward production state since August 2024, this is expected latest by Q4 2025. Since January 2025 the system has been generally available, +but due to some remaining issues with the platform, the schedule of the migration of users and communities has been delayed. You will be notified well in advance +regarding the migration of data.

    + +

    All PSI users can request access to Merlin7, please go to the Requesting Merlin Accounts page and complete the steps given there.

    + +

    In case you identify errors or missing information, please provide feedback through merlin-admins mailing list mailing list or submit a ticket using the PSI service portal.

    + +

    Infrastructure

    + +

    Hardware

    + +

    The Merlin7 cluster contains the following node specification:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Node#NCPURAMGPU#GPUs
    Login22 AMD EPYC 7742 (64 Cores 2.25GHz)512GB  
    CPU772 AMD EPYC 7742 (64 Cores 2.25GHz)512GB  
    GPU A10082 AMD EPYC 7713 (64 Cores 3.2GHz)512GBA100 80GB4
    GPU GH5NVIDIA ARM Grace Neoverse v2 (144 Cores 3.1GHz)864GB (Unified)GH200 120GB4
    + +

    Network

    + +

    The Merlin7 cluster builds on top of HPE/Cray technologies, including a high-performance network fabric called Slingshot. This network fabric is able +to provide up to 200 Gbit/s throughput between nodes. Further information on Slignshot can be found on at HPE and +at https://www.glennklockwood.com/garden/slingshot.

    + +

    Through software interfaces like libFabric (which available on Merlin7), application can leverage the network seamlessly.

    + +

    Storage

    + +

    Unlike previous iteration of the Merlin HPC clusters, Merlin7 does not have any local storage. Instead storage for the entire cluster is provided through +a dedicated storage appliance from HPE/Cray called ClusterStor.

    + +

    The appliance is built of several storage servers:

    + +
      +
    • 2 management nodes
    • +
    • 2 MDS servers, 12 drives per server, 2.9TiB (Raid10)
    • +
    • 8 OSS-D servers, 106 drives per server, 14.5 T.B HDDs (Gridraid / Raid6)
    • +
    • 4 OSS-F servers, 12 drives per server 7TiB SSDs (Raid10)
    • +
    + +

    With effective storage capacity of:

    + +
      +
    • 10 PB HDD +
        +
      • value visible on linux: HDD 9302.4 TiB
      • +
      +
    • +
    • 162 TB SSD +
        +
      • value visible on linux: SSD 151.6 TiB
      • +
      +
    • +
    • 23.6 TiB on Metadata
    • +
    + +

    The storage is directly connected to the cluster (and each individual node) through the Slingshot NIC.

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin7/ippl.html b/public/merlin7/ippl.html new file mode 100644 index 0000000..acea010 --- /dev/null +++ b/public/merlin7/ippl.html @@ -0,0 +1,627 @@ + + + + + + + + +IPPL | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    IPPL

    +
    + + + +
    + + +
    Independent Parallel Particle Layer (IPPL) is a performance portable C++ library for Particle-Mesh methods
    + + + + + + + +

    IPPL

    + +

    Independent Parallel Particle Layer (IPPL) is a performance portable C++ library for Particle-Mesh methods. IPPL makes use of Kokkos (https://github.com/kokkos/kokkos), HeFFTe (https://github.com/icl-utk-edu/heffte), and MPI (Message Passing Interface) to deliver a portable, massively parallel toolkit for particle-mesh methods. IPPL supports simulations in one to six dimensions, mixed precision, and asynchronous execution in different execution spaces (e.g. CPUs and GPUs).

    + +

    Licensing Terms and Conditions

    + +

    GNU GPLv3

    + +

    How to run on Merlin7

    +

    A100 nodes

    +

    Pipeline

    +
    module use Spack unstable
    +module load gcc/13.2.0 openmpi/4.1.6-57rc-A100-gpu                 
    +module load boost/1.82.0-e7gp fftw/3.3.10 gnutls/3.8.3 googletest/1.14.0 gsl/2.8 h5hut/2.0.0rc7 openblas/0.3.26-omp cmake/3.31.6-oe7u
    +
    +cd <path to IPPL source directory>
    +mkdir build_gpu
    +cd build_gpu
    +
    +cmake -DCMAKE_BUILD_TYPE=Release -DKokkos_ARCH_AMPERE80=ON -DCMAKE_CXX_STANDARD=20 -DIPPL_ENABLE_FFT=ON -DIPPL_ENABLE_TESTS=ON -DUSE_ALTERNATIVE_VARIANT=ON -DIPPL_ENABLE_SOLVERS=ON -DIPPL_ENABLE_ALPINE=True -DIPPL_PLATFORMS=cuda ..
    +make [-jN]
    +
    + +

    GH nodes

    +

    Pipeline

    + +
    salloc --partition=gh-daily --clusters=gmerlin7 --time=08:00:00 --ntasks=4 --nodes=1 --gpus=1 --mem=40000 $SHELL
    +ssh <allocated_gpu>
    +
    +module use Spack unstable
    +module load gcc/13.2.0 openmpi/5.0.3-3lmi-GH200-gpu  
    +module load boost/1.82.0-3ns6 fftw/3.3.10 gnutls/3.8.3 googletest/1.14.0 gsl/2.7.1 h5hut/2.0.0rc7 openblas/0.3.26 cmake/3.31.4-u2nm  
    +
    +cd <path to IPPL source directory>
    +mkdir build_gh
    +cd build_gh
    +
    +cmake -DCMAKE_BUILD_TYPE=Release -DKokkos_ARCH_HOPPER90=ON -DCMAKE_CXX_STANDARD=20 -DIPPL_ENABLE_FFT=ON -DIPPL_ENABLE_TESTS=ON -DUSE_ALTERNATIVE_VARIANT=ON -DIPPL_ENABLE_SOLVERS=ON -DIPPL_ENABLE_ALPINE=True -DIPPL_PLATFORMS=cuda ..
    +make [-jN]
    +
    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin7/kerberos.html b/public/merlin7/kerberos.html new file mode 100644 index 0000000..224a0dc --- /dev/null +++ b/public/merlin7/kerberos.html @@ -0,0 +1,825 @@ + + + + + + + + +Kerberos and AFS authentication | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Kerberos and AFS authentication

    +
    + + + +
    + + +
    This document describes how to use Kerberos.
    + + + + + + + +
    + + + + + + +

    Projects and users have their own areas in the central PSI AFS service. In order +to access to these areas, valid Kerberos and AFS tickets must be granted.

    + +

    These tickets are automatically granted when accessing through SSH with +username and password. Alternatively, one can get a granting ticket with the kinit (Kerberos) +and aklog (AFS ticket, which needs to be run after kinit) commands.

    + +

    Due to PSI security policies, the maximum lifetime of the ticket is 7 days, and the default +time is 10 hours. It means than one needs to constantly renew (krenew command) the existing +granting tickets, and their validity can not be extended longer than 7 days. At this point, +one needs to obtain new granting tickets.

    + +

    Obtaining granting tickets with username and password

    + +

    As already described above, the most common use case is to obtain Kerberos and AFS granting tickets +by introducing username and password:

    + +
      +
    • When login to Merlin through SSH protocol, if this is done with username + password authentication, +tickets for Kerberos and AFS will be automatically obtained.
    • +
    • When login to Merlin through NoMachine, no Kerberos and AFS are granted. Therefore, users need to +run kinit (to obtain a granting Kerberos ticket) followed by aklog (to obtain a granting AFS ticket). +See further details below.
    • +
    + +

    To manually obtain granting tickets, one has to:

    + +
      +
    1. +

      To obtain a granting Kerberos ticket, one needs to run kinit $USER and enter the PSI password.

      + +
      kinit $USER@D.PSI.CH
      +
      +
    2. +
    3. +

      To obtain a granting ticket for AFS, one needs to run aklog. No password is necessary, but a valid +Kerberos ticket is mandatory.

      + +
      aklog
      +
      +
    4. +
    5. +

      To list the status of your granted tickets, users can use the klist command.

      + +
      klist
      +
      +
    6. +
    7. +

      To extend the validity of existing granting tickets, users can use the krenew command.

      + +
      krenew
      +
      + +
        +
      • Keep in mind that the maximum lifetime for granting tickets is 7 days, therefore krenew can not be used beyond that limit, +and then kinit should be used instead.
      • +
      +
    8. +
    + +

    Obtanining granting tickets with keytab

    + +

    Sometimes, obtaining granting tickets by using password authentication is not possible. An example are user Slurm jobs +requiring access to private areas in AFS. For that, there’s the possibility to generate a keytab file.

    + +

    Be aware that the keytab file must be private, fully protected by correct permissions and not shared with any +other users.

    + +

    Creating a keytab file

    + +

    For generating a keytab, one has to:

    + +
      +
    1. +

      Load a newer Kerberos ( krb5/1.20 or higher) from Pmodules:

      + +
      module load krb5/1.20
      +
      +
    2. +
    3. +

      Create a private directory for storing the Kerberos keytab file

      + +
      mkdir -p ~/.k5
      +
      +
    4. +
    5. +

      Run the ktutil utility which comes with the loaded krb5 Pmodule:

      + +
      ktutil
      +
      +
    6. +
    7. +

      In the ktutil console, one has to generate a keytab file as follows:

      + +
      # Replace $USER by your username
      +add_entry -password -k 0 -f -p $USER
      +wkt /data/user/$USER/.k5/krb5.keytab
      +exit
      +
      + +

      Notice that you will need to add your password once. This step is required for generating the keytab file.

      +
    8. +
    9. +

      Once back to the main shell, one has to ensure that the file contains the proper permissions:

      + +
      chmod 0600 ~/.k5/krb5.keytab
      +
      +
    10. +
    + +

    Obtaining tickets by using keytab files

    + +

    Once the keytab is created, one can obtain kerberos tickets without being prompted for a password as follows:

    + +
    kinit -kt ~/.k5/krb5.keytab $USER
    +aklog
    +
    + +

    Slurm jobs accessing AFS

    + +

    Some jobs may require to access private areas in AFS. For that, having a valid keytab file is required. +Then, from inside the batch script one can obtain granting tickets for Kerberos and AFS, which can be used for accessing AFS private areas.

    + +

    The steps should be the following:

    + +
      +
    • +

      Setup KRB5CCNAME, which can be used to specify the location of the Kerberos5 credentials (ticket) cache. In general it should point to a shared area +($HOME/.k5 is a good location), and is strongly recommended to generate an independent Kerberos5 credential cache (it is, creating a new credential cache per Slurm job):

      + +
      export KRB5CCNAME="$(mktemp "$HOME/.k5/krb5cc_XXXXXX")"
      +
      +
    • +
    • +

      To obtain a Kerberos5 granting ticket, run kinit by using your keytab:

      + +
      kinit -kt "$HOME/.k5/krb5.keytab" $USER@D.PSI.CH
      +
      +
    • +
    • +

      To obtain a granting AFS ticket, run aklog:

      + +
      aklog
      +
      +
    • +
    • +

      At the end of the job, you can remove destroy existing Kerberos tickets.

      + +
      kdestroy
      +
      +
    • +
    + +

    Slurm batch script example: obtaining KRB+AFS granting tickets

    + +

    Example 1: Independent crendetial cache per Slurm job

    + +

    This is the recommended way. At the end of the job, is strongly recommended to remove / destroy the existing kerberos tickets.

    + +
    #!/bin/bash
    +#SBATCH --partition=hourly            # Specify 'general' or 'daily' or 'hourly'
    +#SBATCH --time=01:00:00               # Strictly recommended when using 'general' partition.
    +#SBATCH --output=run.out              # Generate custom output file
    +#SBATCH --error=run.err               # Generate custom error  file
    +#SBATCH --nodes=1                     # Uncomment and specify #nodes to use
    +#SBATCH --ntasks=1                    # Uncomment and specify #nodes to use 
    +#SBATCH --cpus-per-task=1
    +#SBATCH --constraint=xeon-gold-6152
    +#SBATCH --hint=nomultithread
    +#SBATCH --job-name=krb5
    +
    +export KRB5CCNAME="$(mktemp "$HOME/.k5/krb5cc_XXXXXX")"
    +kinit -kt "$HOME/.k5/krb5.keytab" $USER@D.PSI.CH
    +aklog
    +klist
    +
    +echo "Here should go my batch script code."
    +
    +# Destroy Kerberos tickets created for this job only
    +kdestroy
    +klist
    +
    + +

    Example 2: Shared credential cache

    + +

    Some users may need/prefer to run with a shared cache file. For doing that, one needs to +setup KRB5CCNAME from the login node session, before submitting the job.

    + +
    export KRB5CCNAME="$(mktemp "$HOME/.k5/krb5cc_XXXXXX")"
    +
    + +

    Then, you can run one or multiple jobs scripts (or parallel job with srun). KRB5CCNAME will be propagated to the +job script or to the parallel job, therefore a single credential cache will be shared amongst different Slurm runs.

    + +
    #!/bin/bash
    +#SBATCH --partition=hourly            # Specify 'general' or 'daily' or 'hourly'
    +#SBATCH --time=01:00:00               # Strictly recommended when using 'general' partition.
    +#SBATCH --output=run.out              # Generate custom output file
    +#SBATCH --error=run.err               # Generate custom error  file
    +#SBATCH --nodes=1                     # Uncomment and specify #nodes to use
    +#SBATCH --ntasks=1                    # Uncomment and specify #nodes to use 
    +#SBATCH --cpus-per-task=1
    +#SBATCH --constraint=xeon-gold-6152
    +#SBATCH --hint=nomultithread
    +#SBATCH --job-name=krb5
    +
    +# KRB5CCNAME is inherit from the login node session
    +kinit -kt "$HOME/.k5/krb5.keytab" $USER@D.PSI.CH
    +aklog
    +klist
    +
    +echo "Here should go my batch script code."
    +
    +echo "No need to run 'kdestroy', as it may have to survive for running other jobs"
    +
    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin7/merlin-rmount.html b/public/merlin7/merlin-rmount.html new file mode 100644 index 0000000..99f2e42 --- /dev/null +++ b/public/merlin7/merlin-rmount.html @@ -0,0 +1,702 @@ + + + + + + + + +Using merlin_rmount | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Using merlin_rmount

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    Background

    + +

    Merlin provides a command for mounting remote file systems, called merlin_rmount. This +provides a helpful wrapper over the Gnome storage utilities (GIO and GVFS), and provides support for a wide range of remote file formats, including

    +
      +
    • SMB/CIFS (Windows shared folders)
    • +
    • WebDav
    • +
    • AFP
    • +
    • FTP, SFTP
    • +
    • complete list
    • +
    + +

    Usage

    + +

    Start a session

    + +

    First, start a new session. This will start a new bash shell in the current terminal where you can add further commands.

    + +
    $ merlin_rmount --init
    +[INFO] Starting new D-Bus RMOUNT session
    +
    +(RMOUNT STARTED) [bliven_s@login002 ~]$
    +
    + +

    Note that behind the scenes this is creating a new dbus daemon. Running multiple daemons on the same login node leads to unpredictable results, so it is best not to initialize multiple sessions in parallel.

    + +

    Standard Endpoints

    + +

    Standard endpoints can be mounted using

    + +
    merlin_rmount --select-mount
    +
    + +

    Select the desired url using the arrow keys.

    + +

    merlin_rmount --select-mount

    + +

    From this list any of the standard supported endpoints can be mounted.

    + +

    Other endpoints

    + +

    Other endpoints can be mounted using the merlin_rmount --mount <endpoint> command.

    + +

    merlin_rmount --mount

    + +

    Accessing Files

    + +

    After mounting a volume the script will print the mountpoint. It should be of the form

    + +
    /run/user/$UID/gvfs/<endpoint>
    +
    + +

    where $UID gives your unix user id (a 5-digit number, also viewable with id -u) and +<endpoint> is some string generated from the mount options.

    + +

    For convenience, it may be useful to add a symbolic link for this gvfs directory. For instance, this would allow all volumes to be accessed in ~/mnt/:

    + +
    ln -s ~/mnt /run/user/$UID/gvfs
    +
    + +

    Files are accessible as long as the merlin_rmount shell remains open.

    + +

    Disconnecting

    + +

    To disconnect, close the session with one of the following:

    + +
      +
    • The exit command
    • +
    • CTRL-D
    • +
    • Closing the terminal
    • +
    + +

    Disconnecting will unmount all volumes.

    + +

    Alternatives

    + +

    Thunar

    + +

    Users that prefer a GUI file browser may prefer the thunar command, which opens the Gnome File Browser. This is also available in NoMachine sessions in the bottom bar (1). Thunar supports the same remote filesystems as merlin_rmount; just type the URL in the address bar (2).

    + +

    Mounting with thunar

    + +

    When using thunar within a NoMachine session, file transfers continue after closing NoMachine (as long as the NoMachine session stays active).

    + +

    Files can also be accessed at the command line as needed (see ‘Accessing Files’ above).

    + +

    Resources

    + + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin7/merlin7-configuration.html b/public/merlin7/merlin7-configuration.html new file mode 100644 index 0000000..8c64e63 --- /dev/null +++ b/public/merlin7/merlin7-configuration.html @@ -0,0 +1,706 @@ + + + + + + + + +Slurm cluster 'merlin7' | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Slurm cluster 'merlin7'

    +
    + + + +
    + + +
    This document describes a summary of the Merlin7 configuration.
    + + + + + + + +
    + + + + + + +

    This documentation shows basic Slurm configuration and options needed to run jobs in the Merlin7 cluster.

    + +

    Infrastructure

    + +

    Hardware

    + +
      +
    • 2 CPU-only login nodes
    • +
    • 77 CPU-only compute nodes
    • +
    • 5 GPU A100 nodes
    • +
    • 8 GPU Grace Hopper nodes
    • +
    + +

    The specification of the node types is:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Node#NodesCPURAMGRES
    Login Nodes22x AMD EPYC 7742 (x86_64 Rome, 64 Cores, 2.25GHz)512GB DDR4 3200Mhz 
    CPU Nodes772x AMD EPYC 7742 (x86_64 Rome, 64 Cores, 2.25GHz)512GB DDR4 3200Mhz 
    A100 GPU Nodes82x AMD EPYC 7713 (x86_64 Milan, 64 Cores, 3.2GHz)512GB DDR4 3200Mhz4 x NV_A100 (80GB)
    GH GPU Nodes52x NVidia Grace Neoverse-V2 (SBSA ARM 64bit, 144 Cores, 3.1GHz)2x 480GB DDR5X (CPU+GPU)4 x NV_GH200 (120GB)
    + +

    Network

    + +

    The Merlin7 cluster builds on top of HPE/Cray technologies, including a high-performance network fabric called Slingshot. This network fabric is able +to provide up to 200 Gbit/s throughput between nodes. Further information on Slignshot can be found on at HPE and +at https://www.glennklockwood.com/garden/slingshot.

    + +

    Through software interfaces like libFabric (which available on Merlin7), application can leverage the network seamlessly.

    + +

    Storage

    + +

    Unlike previous iteration of the Merlin HPC clusters, Merlin7 does not have any local storage. Instead storage for the entire cluster is provided through +a dedicated storage appliance from HPE/Cray called ClusterStor.

    + +

    The appliance is built of several storage servers:

    + +
      +
    • 2 management nodes
    • +
    • 2 MDS servers, 12 drives per server, 2.9TiB (Raid10)
    • +
    • 8 OSS-D servers, 106 drives per server, 14.5 T.B HDDs (Gridraid / Raid6)
    • +
    • 4 OSS-F servers, 12 drives per server 7TiB SSDs (Raid10)
    • +
    + +

    With effective storage capacity of:

    + +
      +
    • 10 PB HDD +
        +
      • value visible on linux: HDD 9302.4 TiB
      • +
      +
    • +
    • 162 TB SSD +
        +
      • value visible on linux: SSD 151.6 TiB
      • +
      +
    • +
    • 23.6 TiB on Metadata
    • +
    + +

    The storage is directly connected to the cluster (and each individual node) through the Slingshot NIC.

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin7/migrating.html b/public/merlin7/migrating.html new file mode 100644 index 0000000..dc159d6 --- /dev/null +++ b/public/merlin7/migrating.html @@ -0,0 +1,1026 @@ + + + + + + + + + | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    Merlin6 to Merlin7 Migration Guide

    + +

    Welcome to the official documentation for migrating your data from Merlin6 to Merlin7. Please follow the instructions carefully to ensure a smooth and secure transition.

    + +

    📅 Migration Schedule

    + +

    Phase 1: Users without Projects — Deadline: July 11

    + +

    If you do not belong to any Merlin project, i.e for

    + +
      +
    • Users not in any group project (/data/projects/general)
    • +
    • Users not in BIO, MEG, Mu3e
    • +
    • Users not part of PSI-owned private Merlin nodes (ASA, MEG, Mu3e)
    • +
    + +

    You must complete your migration before July 11. You just need to migrate your personal /data/user/$USER and /home/psi/$USER directories.

    + +

    Users are responsible for initiating and completing the migration process as lined out below. +Contact the Merlin support team merlin-admins@lists.psi.ch if you need help.

    + +
    +

    ⚠️ In this phase, it’s important that you don’t belong to any project. +Once the migration is finished, access to Merlin6 will be no longer possible.

    +
    + +

    Please refer to the Phase 1: Step-by-Step Migration Instructions section +for detailed information about user data migration.

    + +

    Phase 2: Project Members and Owners — Start Before August 1

    + +

    For users in active projects:

    + +
      +
    • Project owners and members will be contacted by the Merlin admins.
    • +
    • Migration will be scheduled individually per project.
    • +
    • Expect contact before August 1.
    • +
    + +
    +

    ⚠️ In this phase, data and home directories of group owners and members will be also requested to be migrated in parallel.

    +
    + +

    Please refer to the Phase 2: Migration Instructions section +for further information.

    + +
    + +

    Directory Structure Changes

    + +

    Merlin6 vs Merlin7

    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ClusterHome DirectoryUser Data DirectoryProjectsExperiments
    merlin6/psi/home/$USER/data/user/$USER/data/project//data/experiments
    merlin7/data/user/$USER/data/user/$USER/data/project//data/project/
    + +
      +
    • The home directory and user data directory have been merged into the single new home directory/data/user/$USER.
    • +
    • +

      The experiments directory has been integrated into /data/project/:

      + +
        +
      • /data/project/general contains general Merlin7 projects.
      • +
      • Other subdirectories are used for large-scale projects such as CLS division, Mu3e, and MeG.
      • +
      +
    • +
    + +
    + +

    📋 Prerequisites and Preparation

    + +

    Before starting the migration, make sure you:

    + +
      +
    • +

      are registered on Merlin7.

      + + +
    • +
    • have cleaned up your data to reduce migration time and space usage.
    • +
    • +

      For the user data migration, ensure your total usage on Merlin6 (/psi/home+/data/user) is well below the 1 TB quota (use the merlin_quotas command). Remember:

      + +
        +
      • Merlin7 also has a 1 TB quota on your home directory, and you might already have data there.
      • +
      • If your usage exceeds this during the transfer, the process might fail.
      • +
      +
    • +
    + + + +
      +
    • Remove unused files and datasets.
    • +
    • Archive large, inactive data sets.
    • +
    • +

      Delete or clean up unused conda or virtualenv Python environments:

      + +
        +
      • These are often large and may not work as-is on Merlin7.
      • +
      • +

        You can export your conda environment description to a file with:

        + +
        conda env export -n myenv > $HOME/myenv.yml
        +
        +
      • +
      • Then recreate them later on Merlin7 from these files.
      • +
      +
    • +
    + +
    +

    🧹 For the user data, you can always remove more old data after migration — it will be copied into ~/merlin6data and ~/merlin6home on Merlin7.

    +
    + +
    + +

    Phase 1: Step-by-Step Migration Instructions

    + +

    Step 1: Run merlin7_migration.setup

    + +

    Log into any Merlin6 login node (merlin-l-001.psi.ch, merlin-l-002.psi.ch, merlin-l-01.psi.ch) and run:

    + +
    merlin7_migration.setup
    +
    + +

    This script will:

    + +
      +
    • Check that you have an account on Merlin7.
    • +
    • Configure and check that your environment is ready for transferring files via Slurm job.
    • +
    • +

      Create two directories:

      + +
        +
      • ~/merlin6data → copy of your old /data/user
      • +
      • ~/merlin6home → copy of your old home
      • +
      +
    • +
    + +
    +

    ⚠️ Important: If ~/merlin6home or ~/merlin6data already exist on Merlin7, the script will exit. +Please remove them or contact support.

    +
    + +

    If there are issues, the script will:

    + +
      +
    • Print clear diagnostic output
    • +
    • Give you some hints to resolve the issue
    • +
    + +

    If you are stuck, email: merlin-admins@lists.psi.ch

    + +
    + +

    Step 2: Run merlin7_migration.start

    + +

    After setup completes, start the migration by running:

    + +
    merlin7_migration.start
    +
    + +

    This script will:

    + +
      +
    • Check the status of your quota on Merlin6.
    • +
    • Submit SLURM batch jobs to the xfer partition
    • +
    • +

      Queue two jobs:

      + +
        +
      • migrate_merlin6data.batch (data dir)
      • +
      • migrate_merlin6home.batch (home dir) +
          +
        • This job will only start if migrate_merlin6data.batch has successfully +finished.
        • +
        +
      • +
      +
    • +
    • Automatically track the job IDs
    • +
    • Print log file locations for the different jobs
    • +
    + +
    +

    ⚠️ Once both transfers succeed, your access to Merlin6 will be revoked. +Do not attempt to reconnect to Merlin6 after this.

    +
    + +

    ❗ If Something Goes Wrong

    + +

    If a problem occurs during the migration process:

    + +
      +
    • 🔍 Check the job log files mentioned in the script output. They contain detailed messages that explain what failed and why.
    • +
    • +

      🛠️ Fix the root cause on the source system. Common issues include:

      + +
        +
      • Files with incorrect permissions
      • +
      • Ownership mismatches
      • +
      • Disk quota exceeded on Merlin7
      • +
      +
    • +
    • 📚 Refer to the ⚠️ Common rsync/fpsync Migration Issues section below for detailed explanations and solutions.
    • +
    + +
    +

    ℹ️ Important: If migrate_merlin6data.batch fails, the migration process will automatically cancel migrate_merlin6home.batch to avoid ending in an inconsistent state.

    +
    + +

    Once the problem is resolved, simply re-run the merlin7_migration.start script to resume the migration.

    + +
    + +

    Step 3: Monitor Transfer Jobs

    + +

    To monitor your transfer jobs, run:

    + +
    squeue -M merlin6 -u $USER -p xfer
    +
    + +

    Check the output to ensure your jobs are:

    + +
      +
    • Running (R) or completed (CG or removed from queue)
    • +
    • Not failed (F, TO, or stuck)
    • +
    + +

    You can also check logs (as printed by the script) to verify job completion.

    + +
    +

    ✅ When /data/user/$USER and /psi/home/$USER on Merlin6 are no longer accessible, migration is complete.

    +
    + +
    + +

    Examples

    + +

    Setup the Migration

    + +
    merlin7_migration.setup
    +
    + +

    Expected output:

    + +
    ✅ login002.merlin7.psi.ch                                                   
    +✅ `$USER` is a member of svc-cluster_merlin7
    +✅ Skipping key generation                                                   
    +✅ SSH key already added to agent.                                           
    +✅ SSH ID successfully copied to login00[1|2].merlin7.psi.ch.
    +✅ Test successful.
    +✅ /data/software/xfer_logs/caubet_m created.
    +✅ ~/merlin6data directory created.
    +✅ ~/merlin6home directory created.
    +
    + +

    Start the Migration

    + +
    merlin7_migration.start
    +
    + +

    Expected output:

    + +
    (base)[caubet_m@merlin-l-001:/data/software/admin/scripts/merlin-user-tools/alps(master)]# ./merlin7_migration.start
    +✅ Quota check passed.
    +Used: 512 GB, 234001 files
    +
    +###################################################
    +Submitting transfer jobs to Slurm
    +
    +   Job logs can be found here:
    +➡️  Directory '/data/user/caubet_m' does NOT have 000 permissions. Transfer pending, continuing...
    +✅ Submitted DATA_MIGRATION job: 24688554. Sleeping 3 seconds...
    +   - /data/user transfer logs:
    +     - /data/software/xfer_logs/caubet_m/data-24688554.out
    +     - /data/software/xfer_logs/caubet_m/data-24688554.err
    +➡️  Directory '/psi/home/caubet_m' does NOT have 000 permissions. Transfer pending, continuing...
    +✅ Submitted HOME_MIGRATION job with dependency on 24688554: 24688555. Sleeping 3 seconds...
    +   - /psi/home transfer logs:
    +     - /data/software/xfer_logs/caubet_m/home-24688555.out
    +     - /data/software/xfer_logs/caubet_m/home-24688555.err
    +
    +✅ You can start manually a monitoring window with:
    +   tmux new-session -d -s "xfersession" "watch 'squeue -M merlin6 -u caubet_m -p xfer'"
    +   tmux attach -t "xfersession"
    +
    +✅ FINISHED - PLEASE CHECK JOB TRANSFER PROGRESS
    +
    + +

    Monitor Progress

    + +
    squeue -M merlin6 -u $USER -p xfer
    +
    + +

    Output:

    + +
    $ squeue -M merlin6 -u $USER -p xfer
    +CLUSTER: merlin6
    +             JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
    +          24688581      xfer HOME_MIG caubet_m PD       0:00      1 (Dependency)
    +          24688580      xfer DATA_MIG caubet_m  R       0:22      1 merlin-c-017
    +
    + +
    + +

    Phase 2: Migration Instructions

    + +

    Please refer to the Prerequisites and Preparation section for initial setup steps. +Further instructions will be sent via email once the owning team is contacted by the Merlin administrators.

    + +
    + +

    ⚠️ Common rsync/fpsync Migration Issues

    + +

    File Permission Denied

    + +
      +
    • Cause: Files or directories are not readable by the user running the transfer.
    • +
    • +

      Solution: Fix source-side permissions:

      + +
      chmod -R u+rX /path/to/file_or_dir
      +
      +
    • +
    + +

    Ownership Mismatches

    + +
      +
    • Cause: Source files are owned by another user (e.g. root or a collaborator).
    • +
    • +

      Solution:

      + +
        +
      • +

        Change ownership before migration:

        + +
        chown -R $USER /path/to/file
        +
        +
      • +
      +
    • +
    + +

    Special Files (e.g. device files, sockets)

    + +
      +
    • Cause: rsync tries to copy UNIX sockets, device files, or FIFOs.
    • +
    • Effect: Errors or incomplete copies.
    • +
    • Solution: Avoid transferring such files entirely (by deleting them).
    • +
    + +

    Exceeded Disk Quota

    + +
      +
    • Cause: Combined size of existing + incoming data exceeds 1 TB quota on Merlin7.
    • +
    • Effect: Transfer stops abruptly.
    • +
    • Solution: Clean up or archive non-essential data before migration.
    • +
    + +

    Very Small Files or Large Trees → Many Small rsync Calls

    + +
      +
    • Cause: Directory with thousands/millions of small files.
    • +
    • Effect: Transfer is slow or hits process limits.
    • +
    • +

      Solution: Consider archiving to .tar.gz before transferring:

      + +
      tar -czf myenv.tar.gz myenv/
      +
      +
    • +
    + +
    + +

    Need Help?

    + +

    If something doesn’t work:

    + +
      +
    • Re-run the scripts and check the logs carefully.
    • +
    • Use less, cat, or tail -f to view your job logs.
    • +
    • Contact the Merlin support team: 📧 merlin-admins@lists.psi.ch
    • +
    + +
    +

    We are here to help you migrate safely and efficiently.

    +
    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin7/nomachine.html b/public/merlin7/nomachine.html new file mode 100644 index 0000000..b25bff0 --- /dev/null +++ b/public/merlin7/nomachine.html @@ -0,0 +1,786 @@ + + + + + + + + +Remote Desktop Access to Merlin7 | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Remote Desktop Access to Merlin7

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    Overview

    + +

    Merlin7 NoMachine provides users with remote desktop access to the Merlin7 computing environment. This service enables users to connect to their computing resources from any location, whether they are inside the PSI network or accessing from outside via secure methods.

    + +

    Accessing Merlin7 NoMachine

    + +

    From Inside PSI

    + +

    If you are inside the PSI network, you can directly connect to the Merlin7 NoMachine service without the need to go through another service.

    + +
      +
    1. Ensure Network Connectivity: Make sure you are connected to the PSI internal network.
    2. +
    3. Choose Your Access Method: You can access Merlin7 using either a web browser or the NoMachine client.
    4. +
    + +

    Method 1: Using a Web Browser

    + +

    Open your web browser and navigate to https://merlin7-nx.psi.ch:4443.

    + +

    Method 2: Using the NoMachine Client

    + +

    Settings for the NoMachine client:

    + +
      +
    • Host: merlin7-nx.psi.ch
    • +
    • Port: 4000
    • +
    • Protocol: NX
    • +
    • Authentication: Use password authentication
    • +
    + +

    From Outside PSI

    + +

    Users outside the PSI network have two options for accessing the Merlin7 NoMachine service: through nx.psi.ch or via a VPN connection.

    + +

    Option 1: Via nx.psi.ch

    + +

    Documentation about the nx.psi.ch service can be found here.

    + +
    Using a Web Browser
    + +

    Open your web browser and navigate to https://nx.psi.ch.

    + +
    Using the NoMachine Client
    + +

    Settings for the NoMachine client:

    + +
      +
    • Host: nx.psi.ch
    • +
    • Port: 4000
    • +
    • Protocol: NX
    • +
    • Authentication: Use password authentication
    • +
    + +

    Option 2: Via VPN

    + +

    Alternatively, you can use a VPN connection to access Merlin7 as if you were inside the PSI network.

    + +
      +
    1. Request VPN Access: Contact the IT department to request VPN access if you do not already have it. Submit a request through the PSI Service Now ticketing system: VPN Access (PSI employees).
    2. +
    3. Connect to the VPN: Once access is granted, connect to the PSI VPN using your credentials.
    4. +
    5. Access Merlin7 NoMachine: Once connected to the VPN, you can access Merlin7 using either a web browser or the NoMachine client as if you were inside the PSI network.
    6. +
    + +

    The NoMachine Client

    + +

    Installation

    + +

    Windows

    + +

    The NoMachine client is available for PSI Windows computers in the Software Kiosk under the name NX Client.

    + +

    macOS and Linux

    + +

    The NoMachine client can be downloaded from NoMachine’s download page.

    + +

    Connection Configuration

    + +
      +
    1. Launch NoMachine Client: Open the NoMachine client on your computer.
    2. +
    3. Create a New Connection: Click the Add button to create a new connection. +
        +
      • On the Address tab configure: +
          +
        • Name: Enter a name for your connection. This can be anything.
        • +
        • Host: Enter the appropriate hostname (e.g. merlin7-nx.psi.ch).
        • +
        • Port: Enter 4000.
        • +
        • Protocol: Select NX.
        • +
        +
      • +
      + +

      Create New NoMachine Connection

      + +
        +
      • On the Configuration tab ensure: +
          +
        • Authentication: Select Use password authentication.
        • +
        +
      • +
      + +

      Create New NoMachine Connection

      + +
        +
      • Click the Add button to finish creating the new connection.
      • +
      +
    4. +
    + +

    Authenticating

    + +

    When prompted, use your PSI credentials to authenticate.

    + +

    Create New NoMachine Connection

    + +

    Managing Sessions

    + +

    The Merlin7 NoMachine service is managed through a front-end server and back-end nodes, facilitating balanced and efficient access to remote desktop sessions.

    + +

    Architecture Overview

    + +
      +
    • Front-End Server: merlin7-nx.psi.ch +
        +
      • Serves as the entry point for users connecting to the NoMachine service.
      • +
      • Handles load-balancing and directs users to available back-end nodes.
      • +
      +
    • +
    • Back-End Nodes: +
        +
      • login001.merlin7.psi.ch
      • +
      • login002.merlin7.psi.ch
      • +
      • These nodes host the NoMachine desktop service and manage the individual desktop sessions.
      • +
      +
    • +
    + +

    Access to the login node desktops must be initiated through the merlin7-nx.psi.ch front-end. The front-end service will distribute sessions across available nodes in the back-end, ensuring optimal resource usage.

    + +

    Opening NoMachine Desktop Sessions

    + +

    When connecting to the merlin7-nx.psi.ch front-end, a new session automatically opens if no existing session is found. Users can manage their sessions as follows:

    + +
      +
    • Reconnect to an Existing Session: If you have an active session, you can reconnect to it by selecting the appropriate icon in the NoMachine client interface. This allows you to resume work without losing any progress. +Open an existing Session
    • +
    • Create a Second Session: If you require a separate session, you can select the New Desktop button. This option creates a second session on another login node, provided the node is available and operational.
    • +
    + +

    Session Management Considerations

    + +
      +
    • Load Balancing: The front-end service ensures that sessions are evenly distributed across the available back-end nodes to optimize performance and resource utilization.
    • +
    • Session Limits: Users are limited to one session per back-end node to maintain system stability and efficiency.
    • +
    + +

    Support and Resources

    + +

    If you encounter any issues or need further assistance with the Merlin7 NoMachine service, support is available via email. Please contact us at merlin-admins@lists.psi.ch, and our support team will be happy to assist you.

    + +

    Advanced Display Settings

    + +

    NoMachine provides several options to optimize the display settings for better performance and clarity. These settings can be accessed and adjusted when creating a new session or by clicking the top right corner of a running session.

    + +

    Prevent Rescaling

    + +

    Preventing rescaling can help eliminate “blurriness” in your display, though it may affect performance. Adjust these settings based on your performance needs:

    + +
      +
    • Display: Choose Resize remote display (forces 1:1 pixel sizes)
    • +
    • Display > Change settings > Quality: Choose medium-best quality
    • +
    • Display > Change settings > Modify the advanced display settings +
        +
      • Check: Disable network-adaptive display quality (turns off lossy compression)
      • +
      • Check: Disable client side image post-processing
      • +
      +
    • +
    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin7/opal-x.html b/public/merlin7/opal-x.html new file mode 100644 index 0000000..62a2877 --- /dev/null +++ b/public/merlin7/opal-x.html @@ -0,0 +1,649 @@ + + + + + + + + +OPAL-X | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    OPAL-X

    +
    + + + +
    + + +
    OPAL (Object Oriented Particle Accelerator Library) is an open source C++ framework for general particle accelerator simulations including 3D space charge, short range wake fields and particle matter interaction.
    + + + + + + + +

    OPAL

    + +

    OPAL (Object Oriented Particle Accelerator Library) is an open source C++ framework for general particle accelerator simulations including 3D space charge, short range wake fields and particle matter interaction.

    + +

    Licensing Terms and Conditions

    + +

    GNU GPLv3

    + +

    How to run on Merlin7

    +

    A100 nodes

    +
    module purge
    +module use Spack unstable
    +module load gcc/13.2.0 openmpi/4.1.6-57rc-A100-gpu opal-x/fixSolverUnits-q4ul-A100-gpu
    +
    + +

    GH nodes

    +
    module purge
    +module use Spack unstable
    +module load gcc/13.2.0 openmpi/5.0.3-3lmi-GH200-gpu opal-x/fixSolverUnits-ttg7-GH200-gpu 
    +
    + +

    Developing your own code

    +

    A100 nodes

    + +

    Pipeline

    + +
    module purge
    +module use Spack unstable
    +module load gcc/13.2.0 openmpi/4.1.6-57rc-A100-gpu                 
    +module load boost/1.82.0-e7gp fftw/3.3.10 gnutls/3.8.3 googletest/1.14.0 gsl/2.8 h5hut/2.0.0rc7 openblas/0.3.26-omp cmake/3.31.6-oe7u
    +
    +git clone https://gitlab.psi.ch/OPAL/opal-x/src.git opal-x
    +cd opal-x
    +./gen_OPALrevision
    +
    +mkdir build_gpu
    +cd build_gpu
    +
    +cmake -DCMAKE_BUILD_TYPE=Release -DKokkos_ARCH_AMPERE80=ON -DCMAKE_CXX_STANDARD=20 -DIPPL_ENABLE_FFT=ON -DIPPL_ENABLE_TESTS=OFF -DIPPL_ENABLE_SOLVERS=ON -DIPPL_ENABLE_ALPINE=True -DIPPL_PLATFORMS=cuda ..
    +make [-jN]
    +
    + +

    GH nodes

    +

    Pipeline

    + +
    salloc --partition=gh-daily --clusters=gmerlin7 --time=08:00:00 --ntasks=4 --nodes=1 --gpus=1 --mem=40000 $SHELL
    +ssh <allocated_gpu>
    +
    +module purge
    +module use Spack unstable
    +module load gcc/13.2.0 openmpi/5.0.3-3lmi-GH200-gpu  
    +module load boost/1.82.0-3ns6 fftw/3.3.10 gnutls/3.8.3 googletest/1.14.0 gsl/2.7.1 h5hut/2.0.0rc7 openblas/0.3.26 cmake/3.31.4-u2nm  
    +
    +git clone https://gitlab.psi.ch/OPAL/opal-x/src.git opal-x
    +cd opal-x
    +./gen_OPALrevision
    +mkdir build_gh
    +cd build_gh
    +
    +cmake -DCMAKE_BUILD_TYPE=Release -DKokkos_ARCH_HOPPER90=ON -DCMAKE_CXX_STANDARD=20 -DIPPL_ENABLE_FFT=ON -DIPPL_ENABLE_TESTS=OFF -DIPPL_ENABLE_SOLVERS=ON -DIPPL_ENABLE_ALPINE=OFF -DIPPL_PLATFORMS=cuda ..
    +make [-jN]
    +
    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin7/openmpi.html b/public/merlin7/openmpi.html new file mode 100644 index 0000000..c668ec4 --- /dev/null +++ b/public/merlin7/openmpi.html @@ -0,0 +1,684 @@ + + + + + + + + +OpenMPI Support | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    OpenMPI Support

    +
    + + + +
    + + +
    This document describes how to use OpenMPI in the Merlin7 cluster
    + + + + + + + +
    + + + + + + +

    Introduction

    + +

    This document outlines the supported OpenMPI versions in the Merlin7 cluster.

    + +

    OpenMPI supported versionso

    + +

    The Merlin cluster supports OpenMPI versions across three distinct stages: stable, unstable, and deprecated. Below is an overview of each stage:

    + +

    Stable

    + +

    Versions in the stable stage are fully functional, thoroughly tested, and officially supported by the Merlin administrators. +These versions are available via Pmodules and Spack, ensuring compatibility and reliability for production use.

    + +

    Unstable

    + +

    Versions in the unstable stage are available for testing and early access to new OpenMPI features. +While these versions can be used, their compilation and configuration are subject to change before they are promoted to the stable stage. +Administrators recommend caution when relying on unstable versions for critical workloads.

    + +

    Deprecated

    + +

    Versions in the deprecated stage are no longer supported by the Merlin administrators. +Typically, these include versions no longer supported by the official OpenMPI project. +While deprecated versions may still be available for use, their functionality cannot be guaranteed, and they will not receive updates or bug fixes.

    + +

    Using srun in Merlin7

    + +

    In OpenMPI versions prior to 5.0.x, using srun for direct task launches was faster than mpirun. +Although this is no longer the case, srun remains the recommended method due to its simplicity and ease of use.

    + +

    Key benefits of srun:

    +
      +
    • Automatically handles task binding to cores.
    • +
    • In general, requires less configuration compared to mpirun.
    • +
    • Best suited for most users, while mpirun is recommended only for advanced MPI configurations.
    • +
    + +

    Guidelines:

    +
      +
    • Always adapt your scripts to use srun before seeking support.
    • +
    • For any module-related issues, please contact the Merlin7 administrators.
    • +
    + +

    Example Usage:

    +
    srun ./app
    +
    + + + +

    PMIx Support in Merlin7

    + +

    Merlin7’s SLURM installation includes support for multiple PMI types, including pmix. To view the available options, use the following command:

    + +
    🔥 [caubet_m@login001:~]# srun --mpi=list
    +MPI plugin types are...
    +        none
    +        pmix
    +        pmi2
    +        cray_shasta
    +specific pmix plugin versions available: pmix_v5,pmix_v4,pmix_v3,pmix_v2
    +
    +

    Important Notes:

    +
      +
    • For OpenMPI, always use pmix by specifying the appropriate version (pmix_$version). +When loading an OpenMPI module (via Pmodules or Spack), the corresponding PMIx version will be automatically loaded.
    • +
    • Users do not need to manually manage PMIx compatibility.
    • +
    + + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin7/pmodules.html b/public/merlin7/pmodules.html new file mode 100644 index 0000000..3cd85c4 --- /dev/null +++ b/public/merlin7/pmodules.html @@ -0,0 +1,763 @@ + + + + + + + + +PSI Modules | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    PSI Modules

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    PSI Environment Modules

    + +

    On top of the operating system stack we provide different software using the PSI developed PModule system.

    + +

    PModules is the official supported way and each package is deployed by a specific expert. Usually, in PModules +software which is used by many people will be found.

    + +

    If you miss any package/versions or a software with a specific missing feature, contact us. We will study if is feasible or not to install it.

    + +

    Module Release Stages

    + +

    To ensure proper software lifecycle management, PModules uses three release stages: unstable, stable, and deprecated.

    + +
      +
    1. Unstable Release Stage: +
        +
      • Contains experimental or under-development software versions.
      • +
      • Not visible to users by default. Use explicitly:
      • +
      + +
      module use unstable
      +
      +
        +
      • Software is promoted to stable after validation.
      • +
      +
    2. +
    3. Stable Release Stage: +
        +
      • Default stage, containing fully tested and supported software versions.
      • +
      • Recommended for all production workloads.
      • +
      +
    4. +
    5. Deprecated Release Stage: +
        +
      • Contains software versions that are outdated or discontinued.
      • +
      • These versions are hidden by default but can be explicitly accessed:
      • +
      + +
      module use deprecated
      +
      +
        +
      • Deprecated software can still be loaded directly without additional configuration to ensure user transparency.
      • +
      +
    6. +
    + +

    PModules commands

    + +

    Below is listed a summary of common module commands:

    + +
    module use                       # show all available PModule Software Groups as well as Release Stages
    +module avail                     # to see the list of available software packages provided via pmodules
    +module use unstable              # to get access to a set of packages not fully tested by the community
    +module load <package>/<version>  # to load specific software package with a specific version
    +module search <string>           # to search for a specific software package and its dependencies.
    +module list                      # to list which software is loaded in your environment
    +module purge                     # unload all loaded packages and cleanup the environment
    +
    + +

    Please refer to the external PSI Modules document for +detailed information about the module command.

    + +

    module use/unuse

    + +

    Without any parameter, use lists all available PModule Software Groups and Release Stages.

    + +
    module use
    +
    + +

    When followed by a parameter, use/unuse invokes/uninvokes a PModule Software Group or Release Stage.

    + +
    module use EM         # Invokes the 'EM' software group
    +module unuse EM       # Uninvokes the 'EM' software group
    +module use unstable   # Invokes the 'unstable' Release stable
    +module unuse unstable # Uninvokes the 'unstable' Release stable
    +
    + +

    module avail

    + +

    This option lists all available PModule Software Groups and their packages.

    + +

    Please run module avail --help for further listing options.

    + + + +

    This is used to search for software packages. By default, if no Release Stage or Software Group is specified +in the options of the module search command, it will search from the already invoked Software Groups and Release Stages. +Direct package dependencies will be also showed.

    + +
    🔥 [caubet_m@login001:~]# module search openmpi
    +
    +Module        Rel.stage  Group        Overlay      Requires
    +--------------------------------------------------------------------------------
    +openmpi/4.1.6 stable     Compiler     Alps         gcc/12.3.0
    +openmpi/4.1.6 stable     Compiler     Alps         gcc/13.3.0
    +openmpi/4.1.6 stable     Compiler     Alps         gcc/14.2.0
    +openmpi/4.1.6 stable     Compiler     Alps         intelcc/22.2
    +openmpi/5.0.5 stable     Compiler     Alps         gcc/8.5.0
    +openmpi/5.0.5 stable     Compiler     Alps         gcc/12.3.0
    +openmpi/5.0.5 stable     Compiler     Alps         gcc/14.2.0
    +openmpi/5.0.5 stable     Compiler     Alps         intelcc/22.2
    +
    + +

    Please run module search --help for further search options.

    + +

    module load/unload

    + +

    This loads/unloads specific software packages. Packages might have direct dependencies that need to be loaded first. Other dependencies +will be automatically loaded.

    + +

    In the example below, the openmpi/5.0.5 package will be loaded, however gcc/14.2.0 must be loaded as well as this is a strict dependency. Direct dependencies must be loaded in advance. Users can load multiple packages one by one or at once. This can be useful for instance when loading a package with direct dependencies.

    + +
    # Single line
    +module load gcc/14.2.0 openmpi/5.0.5
    +
    +# Multiple line
    +module load gcc/14.2.0
    +module load openmpi/5.0.5
    +
    + +

    module purge

    + +

    This command is an alternative to module unload, which can be used to unload all loaded module files.

    + +
    module purge
    +
    + +

    Requesting New PModules Packages

    + +

    The PModules system is designed to accommodate the diverse software needs of Merlin7 users. Below are guidelines for requesting new software or versions to be added to PModules.

    + +

    Requesting Missing Software

    + +

    If a specific software package is not available in PModules and there is interest from multiple users:

    +
      +
    • Contact Support: Let us know about the software, and we will assess its feasibility for deployment.
    • +
    • Deployment Timeline: Adding new software to PModules typically takes a few days, depending on complexity and compatibility.
    • +
    • User Involvement: If you are interested in maintaining the software package, please inform us. Collaborative maintenance helps +ensure timely updates and support.
    • +
    + +

    Requesting a Missing Version

    +

    If the currently available versions of a package do not meet your requirements:

    +
      +
    • New Versions: Requests for newer versions are generally supported, especially if there is interest from multiple users.
    • +
    • Intermediate Versions: Installation of intermediate versions (e.g., versions between the current stable and deprecated versions) +can be considered if there is a strong justification, such as specific features or compatibility requirements.
    • +
    + +

    General Notes

    +
      +
    • New packages or versions are prioritized based on their relevance and usage.
    • +
    • For any request, providing detailed information about the required software or version (e.g., name, version, features) will help +expedite the process.
    • +
    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin7/quantum-espresso.html b/public/merlin7/quantum-espresso.html new file mode 100644 index 0000000..a0289a4 --- /dev/null +++ b/public/merlin7/quantum-espresso.html @@ -0,0 +1,704 @@ + + + + + + + + +Quantum Espresso | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Quantum Espresso

    +
    + + + +
    + + +
    Quantum Espresso code for electronic-structure calculations and materials modeling at the nanoscale
    + + + + + + + +

    Quantum ESPRESSO

    + +

    Quantum ESPRESSO is an integrated suite of Open-Source computer codes for electronic-structure calculations and materials modeling at the nanoscale. It is based on density-functional theory, plane waves, and pseudopotentials:

    + +
    PWscf (Plane-Wave Self-Consistent Field)
    +FPMD (First Principles Molecular Dynamics)
    +CP (Car-Parrinello)
    +
    + +

    Licensing Terms and Conditions

    + +

    Quantum ESPRESSO is an open initiative, in collaboration with many groups world-wide, coordinated by the Quantum ESPRESSO Foundation. Scientific work done using Quantum ESPRESSO should contain an explicit acknowledgment and reference to the main papers (see Quantum Espresso Homepage for the details).

    + +

    How to run on Merlin7

    +

    A100 nodes

    +
    module purge
    +module use Spack unstable
    +module load nvhpc/25.3 openmpi/main-6bnq-A100-gpu quantum-espresso/7.4.1-nxsw-gpu-omp
    +
    +

    GH nodes

    +
    module purge
    +module use Spack unstable
    +module load nvhpc/25.3 openmpi/5.0.7-e3bf-GH200-gpu quantum-espresso/7.4.1-gxvj-gpu-omp
    +
    + +

    SBATCH A100, 1 GPU, 64 OpenMP threads, one MPI rank example

    +
    #!/bin/bash
    +#SBATCH --no-requeue
    +#SBATCH --job-name="si64"
    +#SBATCH --get-user-env
    +#SBATCH --output=_scheduler-stdout.txt
    +#SBATCH --error=_scheduler-stderr.txt
    +#SBATCH --partition=a100-daily
    +#SBATCH --nodes=1
    +#SBATCH --ntasks-per-node=1
    +#SBATCH --time=06:00:00
    +#SBATCH --cpus-per-task=64
    +#SBATCH --cluster=gmerlin7
    +#SBATCH --gpus=1
    +#SBATCH --hint=nomultithread
    +
    +export OMP_NUM_THREADS=$SLURM_CPUS_PER_TASK
    +export OMP_PROC_BIND=spread
    +export OMP_PLACES=threads
    +
    +# Load necessary modules
    +module purge
    +module use Spack unstable
    +module load nvhpc/25.3 openmpi/main-6bnq-A100-gpu quantum-espresso/7.4.1-nxsw-gpu-omp
    +
    +"srun" '$(which pw.x)' '-npool' '1' '-in' 'aiida.in'  > "aiida.out"
    +
    + +

    Developing your own GPU code

    +

    Spack

    +
      +
    1. spack config edit
    2. +
    3. Add granularity: microarchitectures to your config (if you use nvhpc compiler! Not needed for CPU builds!) +
      spack:
      +  concretizer:
      + unify: false
      + targets:
      +   granularity: microarchitectures
      +
      +
    4. +
    5. spack add quantum-espresso@develop +cuda +mpi +mpigpu hdf5=parallel %nvhpc arch=linux-sles15-zen3 # GPU
    6. +
    7. spack add quantum-espresso@develop +mpi hdf5=parallel %gcc # CPU
    8. +
    9. spack develop quantum-espresso@develop # clone the code under /afs/psi.ch/sys/spack/user/$USER/spack-environment/quantum-espresso
    10. +
    11. Make changes in /afs/psi.ch/sys/spack/user/$USER/spack-environment/quantum-espresso
    12. +
    13. Build: spack install [-jN] -v --until=build quantum-espresso@develop
    14. +
    + +

    Environment modules

    +

    CPU

    +

    Pipeline

    + +
    module purge
    +module use Spack unstable
    +module load gcc/12.3 openmpi/main-syah fftw/3.3.10.6-omp hdf5/1.14.5-t46c openblas/0.3.29-omp cmake/3.31.6-oe7u
    +
    +cd <path to QE source directory>
    +mkdir build
    +cd build
    +
    +cmake -DQE_ENABLE_MPI:BOOL=ON -DQE_ENABLE_OPENMP:BOOL=ON -DCMAKE_C_COMPILER:STRING=mpicc -DCMAKE_Fortran_COMPILER:STRING=mpif90 -DQE_ENABLE_HDF5:BOOL=ON ..
    +make [-jN]
    +
    +

    A100

    +

    Pipeline

    + +
    module purge
    +module use Spack unstable
    +module load nvhpc/25.3 openmpi/main-6bnq-A100-gpu fftw/3.3.10.6-qbxu-omp hdf5/develop-2.0-rjgu netlib-scalapack/2.2.2-3hgw cmake/3.31.6-oe7u
    +
    +cd <path to QE source directory>
    +mkdir build
    +cd build
    +
    +cmake -DQE_ENABLE_MPI:BOOL=ON -DQE_ENABLE_OPENMP:BOOL=ON -DQE_ENABLE_SCALAPACK:BOOL=ON -DQE_ENABLE_CUDA:BOOL=ON -DQE_ENABLE_MPI_GPU_AWARE:BOOL=ON -DQE_ENABLE_OPENACC:BOOL=ON -DCMAKE_C_COMPILER:STRING=mpicc -DCMAKE_Fortran_COMPILER:STRING=mpif90 -DQE_ENABLE_HDF5:BOOL=ON ..
    +make [-jN]
    +
    +
    +

    GH200

    +

    Pipeline

    + +
    module purge
    +module use Spack unstable
    +module load nvhpc/25.3 openmpi/5.0.7-e3bf-GH200-gpu fftw/3.3.10-sfpw-omp hdf5/develop-2.0-ztvo nvpl-blas/0.4.0.1-3zpg nvpl-lapack/0.3.0-ymy5  netlib-scalapack/2.2.2-qrhq cmake/3.31.6-5dl7
    +
    +
    +cd <path to QE source directory>
    +mkdir build
    +cd build
    +
    +cmake -DQE_ENABLE_MPI:BOOL=ON -DQE_ENABLE_OPENMP:BOOL=ON -DQE_ENABLE_SCALAPACK:BOOL=ON -DQE_ENABLE_CUDA:BOOL=ON -DQE_ENABLE_MPI_GPU_AWARE:BOOL=ON -DQE_ENABLE_OPENACC:BOOL=ON -DCMAKE_C_COMPILER:STRING=mpicc -DCMAKE_Fortran_COMPILER:STRING=mpif90 -DQE_ENABLE_HDF5:BOOL=ON ..
    +make [-jN]
    +
    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin7/request-account.html b/public/merlin7/request-account.html new file mode 100644 index 0000000..78d2176 --- /dev/null +++ b/public/merlin7/request-account.html @@ -0,0 +1,624 @@ + + + + + + + + +Requesting Merlin Accounts | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Requesting Merlin Accounts

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    Requesting Access to Merlin7

    + +

    All PSI users can ask for access to the Merlin7 cluster. Access to Merlin7 is regulated by the PSI user’s account being a member of the svc-cluster_merlin7 access group.

    + +

    Requesting Merlin7 access has to be done using the Request Linux Group Membership form, available in PSI’s central Service Catalog on Service Now.

    + +

    Example: Requesting access to Merlin7

    + +

    Mandatory fields you need to fill:

    +
      +
    • Order Access for user: Defaults to the logged in user. However, requesting access for another user it’s also possible.
    • +
    • Request membership for group: Choosesvc-cluster_merlin7.
    • +
    • Justification: Please add a short justification of what you will be running on Merlin7.
    • +
    + +

    Once submitted, the Merlin responsibles will approve the request as soon as possible (within the next few hours on working days). Once the request is approved, it may take up to 30 minutes to get the account fully configured.

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin7/request-project.html b/public/merlin7/request-project.html new file mode 100644 index 0000000..5159e61 --- /dev/null +++ b/public/merlin7/request-project.html @@ -0,0 +1,726 @@ + + + + + + + + +Requesting a Merlin Project | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Requesting a Merlin Project

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    A project owns its own storage area in Merlin, which can be accessed by other group members.

    + +

    Projects can receive a higher storage quota than user areas and should be the primary way of organizing bigger storage requirements +in a multi-user collaboration.

    + +

    Access to a project’s directories is governed by project members belonging to a common Unix group. You may use an existing +Unix group or you may have a new Unix group created especially for the project. The project responsible will be the owner of +the Unix group (this is important)!

    + +

    This document explains how to request new Unix group, to request membership for existing groups, and the procedure for requesting a Merlin project.

    + +

    About Unix groups

    + +

    Before requesting a Merlin project, it is important to have a Unix group that can be used to grant access to it to different members +of the project.

    + +

    Unix groups in the PSI Active Directory (which is the PSI central database containing user and group information, and more) are defined by the unx- prefix, followed by a name. +In general, PSI employees working on Linux systems (including HPC clusters, like Merlin) can request for a non-existing Unix group, and can become responsible for managing it. +In addition, a list of administrators can be set. The administrators, together with the group manager, can approve or deny membership requests. Further information about this topic +is covered in the Linux Documentation - Services Admin Guides: Unix Groups / Group Management, managed by the Central Linux Team.

    + +

    To gran access to specific Merlin project directories, some users may require to be added to some specific Unix groups:

    +
      +
    • Each Merlin project (i.e. /data/project/{bio|general}/$projectname) or experiment (i.e. /data/experiment/$experimentname) directory has access restricted by ownership and group membership (with a very few exceptions allowing public access).
    • +
    • Users requiring access to a specific restricted project or experiment directory have to request membership for the corresponding Unix group owning the directory.
    • +
    + +

    Requesting a new Unix group

    + +

    If you need a new Unix group to be created, you need to first get this group through a separate +PSI Service Now ticket. Please use the following template. +You can also specify the login names of the initial group members and the owner of the group. +The owner of the group is the person who will be allowed to modify the group.

    + +
      +
    • Please open an Incident Request with subject: +
       Subject: Request for new unix group xxxx
      +
      +
    • +
    • and base the text field of the request on this template +
       Dear HelpDesk
      +   
      + I would like to request a new unix group.
      +   
      + Unix Group Name: unx-xxxxx
      + Initial Group Members: xxxxx, yyyyy, zzzzz, ...
      + Group Owner: xxxxx
      + Group Administrators: aaaaa, bbbbb, ccccc, ....
      +
      + Best regards,
      +
      +
    • +
    + +

    Requesting Unix group membership

    + +

    Existing Merlin projects have already a Unix group assigned. To have access to a project, users must belong to the proper Unix group owning that project. +Supervisors should inform new users which extra groups are needed for their project(s). If this information is not known, one can check the permissions for that directory. In example:

    +
    (base)[caubet_m@merlin-l-001:/data/user/caubet_m]# ls -ltrhd /data/project/general/$projectname
    +(base)[caubet_m@merlin-l-001:/data/user/caubet_m]# ls -ltrhd /data/project/bio/$projectname
    +
    + +

    Requesting membership for a specific Unix group has to be done with the corresponding Request Linux Group Membership form, available in the PSI Service Now Service Catalog.

    + +

    Example: Requesting Unix Group membership

    + +

    Once submitted, the responsible of the Unix group has to approve the request.

    + +

    Important note: Requesting access to specific Unix Groups will require validation from the responsible of the Unix Group. If you ask for inclusion in many groups it may take longer, since the fulfillment of the request will depend on more people.

    + +

    Further information can be found in the Linux Documentation - Services User guide: Unix Groups / Group Management

    + +

    Managing Unix Groups

    + +

    Other administration operations on Unix Groups it’s mainly covered in the Linux Documentation - Services Admin Guides: Unix Groups / Group Management, managed by the Central Linux Team.

    + +

    Requesting a Merlin project

    + +

    Once a Unix group is available, a Merlin project can be requested. +To request a project, please provide the following information in a PSI Service Now ticket

    + +
      +
    • Please open an Incident Request with subject: +
       Subject: [Merlin7] Project Request for project name xxxxxx
      +
      +
    • +
    • and base the text field of the request on this template +
       Dear HelpDesk
      +   
      + I would like to request a new Merlin7 project.
      +   
      + Project Name: xxxxx
      + UnixGroup: xxxxx    # Must be an existing Unix Group
      +
      + The project responsible is the Owner of the Unix Group.
      + If you need a storage quota exceeding the defaults, please provide a description
      + and motivation for the higher storage needs:
      +   
      + Storage Quota: 1TB with a maximum of 1M Files
      + Reason: (None for default 1TB/1M)
      +
      + Best regards,
      +
      +
    • +
    + +

    The default storage quota for a project is 1TB (with a maximal Number of Files of 1M). If you need a larger assignment, you +need to request this and provide a description of your storage needs.

    + +

    Further documentation

    + +

    Further information it’s also available in the Linux Central Documentation:

    + + +

    Special thanks to the Linux Central Team and AIT to make this possible.

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin7/slurm-access.html b/public/merlin7/slurm-access.html new file mode 100644 index 0000000..5b14a8d --- /dev/null +++ b/public/merlin7/slurm-access.html @@ -0,0 +1,642 @@ + + + + + + + + +Accessing Slurm Cluster | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Accessing Slurm Cluster

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    The Merlin Slurm clusters

    + +

    Merlin contains a multi-cluster setup, where multiple Slurm clusters coexist under the same umbrella. +It basically contains the following clusters:

    + +
      +
    • The Merlin7 Slurm CPU cluster, which is called merlin7.
    • +
    • The Merlin7 Slurm GPU cluster, which is called gmerlin7.
    • +
    + +

    Accessing the Slurm clusters

    + +

    Any job submission must be performed from a Merlin login node. Please refer to the Accessing the Interactive Nodes documentation +for further information about how to access the cluster.

    + +

    In addition, any job must be submitted from a high performance storage area visible by the login nodes and by the computing nodes. For this, the possible storage areas are the following:

    +
      +
    • /data/user
    • +
    • /data/project
    • +
    • /data/scratch/shared
    • +
    + +

    Merlin7 CPU cluster access

    + +

    The Merlin7 CPU cluster (merlin7) is the default cluster configured in the login nodes. Any job submission will use by default this cluster, unless +the option --cluster is specified with another of the existing clusters.

    + +

    For further information about how to use this cluster, please visit: Merlin7 CPU Slurm Cluster documentation.

    + +

    Merlin7 GPU cluster access

    + +

    The Merlin7 GPU cluster (gmerlin7) is visible from the login nodes. However, to submit jobs to this cluster, one needs to specify the option --cluster=gmerlin7 when submitting a job or allocation.

    + +

    For further information about how to use this cluster, please visit: Merlin7 GPU Slurm Cluster documentation.

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin7/slurm-configuration.html b/public/merlin7/slurm-configuration.html new file mode 100644 index 0000000..f3914eb --- /dev/null +++ b/public/merlin7/slurm-configuration.html @@ -0,0 +1,1481 @@ + + + + + + + + +Slurm merlin7 Configuration | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Slurm merlin7 Configuration

    +
    + + + +
    + + +
    This document describes a summary of the Merlin7 Slurm CPU-based configuration.
    + + + + + + + +
    + + + + + + +

    This documentation shows basic Slurm configuration and options needed to run jobs in the Merlin7 cluster.

    + +

    Public partitions configuration summary

    + +

    CPU public partitions

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PartitionNameDefaultTimeMaxTimePriorityAccountPer Job LimitsPer User Limits
    general1-00:00:007-00:00:00Lowmerlincpu=1024,mem=1920Gcpu=1024,mem=1920G
    daily0-01:00:001-00:00:00Mediummerlincpu=1024,mem=1920Gcpu=2048,mem=3840G
    hourly0-00:30:000-01:00:00Highmerlincpu=2048,mem=3840Gcpu=8192,mem=15T
    + +

    GPU public partitions

    + +

    A100 nodes

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PartitionNameDefaultTimeMaxTimePriorityAccountPer Job LimitsPer User Limits
    a100-general1-00:00:007-00:00:00Lowmerlingres/gpu=4gres/gpu=8
    a100-daily0-01:00:001-00:00:00Mediummerlingres/gpu=8gres/gpu=8
    a100-hourly0-00:30:000-01:00:00Highmerlingres/gpu=8gres/gpu=8
    a100-interactive0-01:00:000-12:00:00Very Highmerlincpu=16,gres/gpu=1,mem=60G,node=1cpu=16,gres/gpu=1,mem=60G,node=1
    + +

    Grace-Hopper nodes

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PartitionNameDefaultTimeMaxTimePriorityAccountPer Job LimitsPer User Limits
    gh-general1-00:00:007-00:00:00Lowmerlingres/gpu=4gres/gpu=8
    gh-daily0-01:00:001-00:00:00Mediummerlingres/gpu=8gres/gpu=8
    gh-hourly0-00:30:000-01:00:00Highmerlingres/gpu=8gres/gpu=8
    gh-interactive0-01:00:000-12:00:00Very Highmerlincpu=16,gres/gpu=1,mem=46G,node=1cpu=16,gres/gpu=1,mem=46G,node=1
    + +

    CPU cluster: merlin7

    + +

    By default, jobs will be submitted to merlin7, as it is the primary cluster configured on the login nodes. +Specifying the cluster name is typically unnecessary unless you have defined environment variables that could override the default cluster name. +However, when necessary, one can specify the cluster as follows:

    +
    #SBATCH --cluster=merlin7
    +
    + +

    CPU general configuration

    + +

    The Merlin7 CPU cluster is configured with the CR_CORE_MEMORY and CR_ONE_TASK_PER_CORE options.

    +
      +
    • This configuration treats both cores and memory as consumable resources.
    • +
    • Since the nodes are running with hyper-threading enabled, each core thread is counted as a CPU +to fulfill a job’s resource requirements.
    • +
    + +

    By default, Slurm will allocate one task per core, which means:

    +
      +
    • Each task will consume 2 CPUs, regardless of whether both threads are actively used by the job.
    • +
    + +

    This behavior ensures consistent resource allocation but may result in underutilization of hyper-threading in some cases.

    + +

    CPU nodes definition

    + +

    The table below provides an overview of the Slurm configuration for the different node types in the Merlin7 cluster. +This information is essential for understanding how resources are allocated, enabling users to tailor their submission +scripts accordingly.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NodesSocketsCoresPerSocketCoresThreadsPerCoreCPUsMaxMemPerNodeDefMemPerCPUFeatures
    login[001-002]2641282256480G1920MAMD_EPYC_7713
    cn[001-077]2641282256480G1920MAMD_EPYC_7713
    + +

    Notes on memory configuration:

    +
      +
    • Memory allocation options: To request additional memory, use the following options in your submission script: +
        +
      • --mem=<mem_in_MB>: Allocates memory per node.
      • +
      • --mem-per-cpu=<mem_in_MB>: Allocates memory per CPU (equivalent to a core thread).
      • +
      + +

      The total memory requested cannot exceed the MaxMemPerNode value.

      +
    • +
    • +

      Impact of disabling Hyper-Threading: Using the --hint=nomultithread option disables one thread per core, +effectively halving the number of available CPUs. Consequently, memory allocation will also be halved unless explicitly +adjusted.

      + +

      For MPI-based jobs, where performance generally improves with single-threaded CPUs, this option is recommended. +In such cases, you should double the --mem-per-cpu value to account for the reduced number of threads.

      +
    • +
    + + + +

    User and job limits with QoS

    + +

    In the merlin7 CPU cluster, we enforce certain limits on jobs and users to ensure fair resource usage and prevent +overuse by a single user or job. These limits aim to balance resource availability while maintaining overall cluster +efficiency. However, applying limits can occasionally impact the cluster’s utilization. For example, user-specific +limits may result in pending jobs even when many nodes are idle due to low activity.

    + +

    On the other hand, these limits also enhance cluster efficiency by preventing scenarios such as a single job monopolizing +all available resources, which could block other jobs from running. Without job size limits, for instance, a large job +might drain the entire cluster to satisfy its resource request, a situation that is generally undesirable.

    + +

    Thus, setting appropriate limits is essential to maintain fair resource usage while optimizing cluster efficiency. These +limits should allow for a mix of jobs of varying sizes and types, including single-core and parallel jobs, to coexist +effectively.

    + +

    To implement these limits, we utilize Quality of Service (QoS). Different QoS policies are defined and applied +to specific partitions in line with the established resource allocation policies. The table below outlines the +various QoS definitions applicable to the merlin7 CPU-based cluster. Here:

    +
      +
    • MaxTRES specifies resource limits per job.
    • +
    • MaxTRESPU specifies resource limits per user.
    • +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameMaxTRESMaxTRESPUScope
    normal  partition
    cpu_generalcpu=1024,mem=1920Gcpu=1024,mem=1920Guser, partition
    cpu_dailycpu=1024,mem=1920Gcpu=2048,mem=3840Gpartition
    cpu_hourlycpu=2048,mem=3840Gcpu=8192,mem=15Tpartition
    + +

    Where:

    +
      +
    • normal QoS: This QoS has no limits and is typically applied to partitions that do not require user or job +restrictions.
    • +
    • cpu_general QoS: This is the default QoS for merlin7 users. It limits the total resources available to each +user. Additionally, this QoS is applied to the general partition, enforcing restrictions at the partition level and +overriding user-level QoS.
    • +
    • cpu_daily QoS: Guarantees increased resources for the daily partition, accommodating shorter-duration jobs +with higher resource needs.
    • +
    • cpu_hourly QoS: Offers the least constraints, allowing more resources to be used for the hourly partition, +which caters to very short-duration jobs.
    • +
    + +

    For additional details, refer to the CPU partitions section.

    + + + +

    CPU partitions

    + +

    This section provides a summary of the partitions available in the merlin7 CPU cluster.

    + +

    Key concepts:

    +
      +
    • PriorityJobFactor: This value is added to a job’s priority (visible in the PARTITION column of the sprio -l command). +Jobs submitted to partitions with higher PriorityJobFactor values generally run sooner. However, other factors like job age +and especially fair share can also influence scheduling.
    • +
    • PriorityTier: Jobs submitted to partitions with higher PriorityTier values take precedence over pending jobs in partitions +with lower PriorityTier values. Additionally, jobs from higher PriorityTier partitions can preempt running jobs in lower-tier +partitions, where applicable.
    • +
    • QoS: Specifies the quality of service associated with a partition. It is used to control and restrict resource availability +for specific partitions, ensuring that resource allocation aligns with intended usage policies. Detailed explanations of the various +QoS settings can be found in the User and job limits with QoS section.
    • +
    + + + +

    CPU public partitions

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PartitionNameDefaultTimeMaxTimeTotalNodesPriorityJobFactorPriorityTierQoSAllowAccounts
    general1-00:00:007-00:00:005011cpu_generalmerlin
    daily0-01:00:001-00:00:00625001cpu_dailymerlin
    hourly0-00:30:000-01:00:007710001cpu_hourlymerlin
    + +

    All Merlin users are part of the merlin account, which is used as the default account when submitting jobs. +Similarly, if no partition is specified, jobs are automatically submitted to the general partition by default.

    + + + +

    The hourly partition may include private nodes as an additional buffer. However, the current Slurm partition configuration, governed +by PriorityTier, ensures that jobs submitted to private partitions are prioritized and processed first. As a result, access to the +hourly partition might experience delays in such scenarios.

    + +

    CPU private partitions

    + +
    CAS / ASA
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PartitionNameDefaultTimeMaxTimeTotalNodesPriorityJobFactorPriorityTierQoSAllowAccounts
    asa0-01:00:0014-00:00:001012normalasa
    + +
    CNM / Mu3e
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PartitionNameDefaultTimeMaxTimeTotalNodesPriorityJobFactorPriorityTierQoSAllowAccounts
    mu3e1-00:00:007-00:00:00412normalmu3e, meg
    + +
    CNM / MeG
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PartitionNameDefaultTimeMaxTimeTotalNodesPriorityJobFactorPriorityTierQoSAllowAccounts
    meg-short0-01:00:000-01:00:00unlimited10002normalmeg
    meg-long1-00:00:005-00:00:00unlimited12normalmeg
    meg-prod1-00:00:005-00:00:00unlimited10004normalmeg
    + +

    GPU cluster: gmerlin7

    + +

    As mentioned in previous sections, by default, jobs will be submitted to merlin7, as it is the primary cluster configured on the login nodes. +For submittng jobs to the GPU cluster, the cluster name gmerlin7 must be specified, as follows:

    +
    #SBATCH --cluster=gmerlin7
    +
    + +

    GPU general configuration

    + +

    The Merlin7 GPU cluster is configured with the CR_CORE_MEMORY, CR_ONE_TASK_PER_CORE, and ENFORCE_BINDING_GRES options.

    +
      +
    • This configuration treats both cores and memory as consumable resources.
    • +
    • Since the nodes are running with hyper-threading enabled, each core thread is counted as a CPU +to fulfill a job’s resource requirements.
    • +
    • Slurm will allocate the CPUs to the selected GPU.
    • +
    + +

    By default, Slurm will allocate one task per core, which means:

    +
      +
    • For hyper-threaded nodes (NVIDIA A100-based nodes), each task will consume 2 CPUs, regardless of whether both threads are actively used by the job.
    • +
    • For the NVIDIA GraceHopper-based nodes, each task will consume 1 CPU.
    • +
    + +

    This behavior ensures consistent resource allocation but may result in underutilization of hyper-threading in some cases.

    + +

    GPU nodes definition

    + +

    The table below provides an overview of the Slurm configuration for the different node types in the Merlin7 cluster. +This information is essential for understanding how resources are allocated, enabling users to tailor their submission +scripts accordingly.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NodesSocketsCoresPerSocketCoresThreadsPerCoreCPUsMaxMemPerNodeDefMemPerCPUGresFeatures
    gpu[001-007]4722881288828G2944Mgpu:gh200:4AMD_EPYC_7713, NV_A100
    gpu[101-105]164642128480G3840Mgpu:nvidia_a100-sxm4-80gb:4GH200, NV_H100
    + +

    Notes on memory configuration:

    +
      +
    • Memory allocation options: To request additional memory, use the following options in your submission script: +
        +
      • --mem=<mem_in_MB>: Allocates memory per node.
      • +
      • --mem-per-cpu=<mem_in_MB>: Allocates memory per CPU (equivalent to a core thread).
      • +
      + +

      The total memory requested cannot exceed the MaxMemPerNode value.

      +
    • +
    • +

      Impact of disabling Hyper-Threading: Using the --hint=nomultithread option disables one thread per core, +effectively halving the number of available CPUs. Consequently, memory allocation will also be halved unless explicitly +adjusted.

      + +

      For MPI-based jobs, where performance generally improves with single-threaded CPUs, this option is recommended. +In such cases, you should double the --mem-per-cpu value to account for the reduced number of threads.

      +
    • +
    + + + +

    User and job limits with QoS

    + +

    In the gmerlin7 CPU cluster, we enforce certain limits on jobs and users to ensure fair resource usage and prevent +overuse by a single user or job. These limits aim to balance resource availability while maintaining overall cluster +efficiency. However, applying limits can occasionally impact the cluster’s utilization. For example, user-specific +limits may result in pending jobs even when many nodes are idle due to low activity.

    + +

    On the other hand, these limits also enhance cluster efficiency by preventing scenarios such as a single job monopolizing +all available resources, which could block other jobs from running. Without job size limits, for instance, a large job +might drain the entire cluster to satisfy its resource request, a situation that is generally undesirable.

    + +

    Thus, setting appropriate limits is essential to maintain fair resource usage while optimizing cluster efficiency. These +limits should allow for a mix of jobs of varying sizes and types, including single-core and parallel jobs, to coexist +effectively.

    + +

    To implement these limits, we utilize Quality of Service (QoS). Different QoS policies are defined and applied +to specific partitions in line with the established resource allocation policies. The table below outlines the +various QoS definitions applicable to the merlin7 CPU-based cluster. Here:

    +
      +
    • MaxTRES specifies resource limits per job.
    • +
    • MaxTRESPU specifies resource limits per user.
    • +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameMaxTRESMaxTRESPUScope
    normal  partition
    gpu_generalgres/gpu=4gres/gpu=8user, partition
    gpu_dailygres/gpu=8gres/gpu=8partition
    gpu_hourlygres/gpu=8gres/gpu=8partition
    gpu_gh_interactivecpu=16,gres/gpu=1,mem=46G,node=1cpu=16,gres/gpu=1,mem=46G,node=1partition
    gpu_a100_interactivecpu=16,gres/gpu=1,mem=60G,node=1cpu=16,gres/gpu=1,mem=60G,node=1partition
    + +

    Where:

    +
      +
    • normal QoS: This QoS has no limits and is typically applied to partitions that do not require user or job +restrictions.
    • +
    • gpu_general QoS: This is the default QoS for gmerlin7 users. It limits the total resources available to each +user. Additionally, this QoS is applied to the [a100|gh]-general partitions, enforcing restrictions at the partition level and +overriding user-level QoS.
    • +
    • gpu_daily QoS: Guarantees increased resources for the [a100|gh]-daily partitions, accommodating shorter-duration jobs +with higher resource needs.
    • +
    • gpu_hourly QoS: Offers the least constraints, allowing more resources to be used for the [a100|gh]-hourly partitions, +which caters to very short-duration jobs.
    • +
    • gpu_a100_interactive & gpu_gh_interactive QoS: Guarantee interactive access to GPU nodes for software compilation and +small testing.
    • +
    + +

    For additional details, refer to the GPU partitions section.

    + + + +

    GPU partitions

    + +

    This section provides a summary of the partitions available in the merlin7 CPU cluster.

    + +

    Key concepts:

    +
      +
    • PriorityJobFactor: This value is added to a job’s priority (visible in the PARTITION column of the sprio -l command). +Jobs submitted to partitions with higher PriorityJobFactor values generally run sooner. However, other factors like job age +and especially fair share can also influence scheduling.
    • +
    • PriorityTier: Jobs submitted to partitions with higher PriorityTier values take precedence over pending jobs in partitions +with lower PriorityTier values. Additionally, jobs from higher PriorityTier partitions can preempt running jobs in lower-tier +partitions, where applicable.
    • +
    • QoS: Specifies the quality of service associated with a partition. It is used to control and restrict resource availability +for specific partitions, ensuring that resource allocation aligns with intended usage policies. Detailed explanations of the various +QoS settings can be found in the User and job limits with QoS section.
    • +
    + + + +

    A100-based partitions

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PartitionNameDefaultTimeMaxTimeTotalNodesPriorityJobFactorPriorityTierQoSAllowAccounts
    a100-general1-00:00:007-00:00:00311gpu_generalmerlin
    a100-daily0-01:00:001-00:00:0045001gpu_dailymerlin
    a100-hourly0-00:30:000-01:00:00510001gpu_hourlymerlin
    a100-interactive0-01:00:000-12:00:00512gpu_a100_interactivemerlin
    + +

    All Merlin users are part of the merlin account, which is used as the default account when submitting jobs. +Similarly, if no partition is specified, jobs are automatically submitted to the general partition by default.

    + + + +

    GH-based partitions

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PartitionNameDefaultTimeMaxTimeTotalNodesPriorityJobFactorPriorityTierQoSAllowAccounts
    gh-general1-00:00:007-00:00:00511gpu_generalmerlin
    gh-daily0-01:00:001-00:00:0065001gpu_dailymerlin
    gh-hourly0-00:30:000-01:00:00710001gpu_hourlymerlin
    gh-interactive0-01:00:000-12:00:00712gpu_gh_interactivemerlin
    + +

    All Merlin users are part of the merlin account, which is used as the default account when submitting jobs. +Similarly, if no partition is specified, jobs are automatically submitted to the general partition by default.

    + + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin7/slurm-examples.html b/public/merlin7/slurm-examples.html new file mode 100644 index 0000000..12d4d84 --- /dev/null +++ b/public/merlin7/slurm-examples.html @@ -0,0 +1,672 @@ + + + + + + + + +Slurm Examples | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Slurm Examples

    +
    + + + +
    + + +
    This document shows different template examples for running jobs in the Merlin cluster.
    + + + + + + + +
    + + + + + + +

    Work In Progress

    + + + +

    Single core based job examples

    + +
    #!/bin/bash
    +#SBATCH --partition=hourly      # Using 'hourly' will grant higher priority
    +#SBATCH --ntasks-per-core=2     # Request the max ntasks be invoked on each core
    +#SBATCH --hint=multithread      # Use extra threads with in-core multi-threading
    +#SBATCH --time=00:30:00         # Define max time job will run
    +#SBATCH --output=myscript.out   # Define your output file
    +#SBATCH --error=myscript.err    # Define your error file
    +
    +module purge
    +module load $MODULE_NAME # where $MODULE_NAME is a software in PModules
    +srun $MYEXEC             # where $MYEXEC is a path to your binary file
    +
    + +

    Multi-core based jobs example

    + +

    Pure MPI

    + +
    #!/bin/bash
    +#SBATCH --job-name=purempi
    +#SBATCH --partition=daily      # Using 'daily' will grant higher priority
    +#SBATCH --time=24:00:00        # Define max time job will run
    +#SBATCH --output=%x-%j.out     # Define your output file
    +#SBATCH --error=%x-%j.err      # Define your error file
    +#SBATCH --exclusive
    +#SBATCH --nodes=1
    +#SBATCH --ntasks=128
    +#SBATCH --hint=nomultithread
    +##SBATCH --cpus-per-task=1
    +
    +module purge
    +module load $MODULE_NAME # where $MODULE_NAME is a software in PModules
    +srun $MYEXEC             # where $MYEXEC is a path to your binary file
    +
    + +

    Hybrid

    + +
    #!/bin/bash
    +#SBATCH --job-name=hybrid
    +#SBATCH --partition=daily      # Using 'daily' will grant higher priority
    +#SBATCH --time=24:00:00        # Define max time job will run
    +#SBATCH --output=%x-%j.out     # Define your output file
    +#SBATCH --error=%x-%j.err      # Define your error file
    +#SBATCH --exclusive
    +#SBATCH --nodes=1
    +#SBATCH --ntasks=128
    +#SBATCH --hint=multithread
    +#SBATCH --cpus-per-task=2
    +
    +module purge
    +module load $MODULE_NAME # where $MODULE_NAME is a software in PModules
    +srun $MYEXEC             # where $MYEXEC is a path to your binary file
    +
    + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin7/software-repositories.html b/public/merlin7/software-repositories.html new file mode 100644 index 0000000..3eb73be --- /dev/null +++ b/public/merlin7/software-repositories.html @@ -0,0 +1,654 @@ + + + + + + + + +Software repositories | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Software repositories

    +
    + + + +
    + + +
    This page contains information about the different software repositories
    + + + + + + + +
    + + + + + + +

    Module Systems in Merlin7

    + +

    Merlin7 provides a modular environment to ensure flexibility, compatibility, and optimized performance. +The system supports three primary module types: PSI Environment Modules (PModules), Spack Modules, and Cray Environment Modules.

    + +

    PSI Environment Modules (PModules)

    + +

    The PModules system, developed by PSI, is the officially supported module system on Merlin7. It is the preferred choice for accessing validated software across a wide range of applications.

    + +

    Key Features:

    +
      +
    • Expert Deployment: Each package is deployed and maintained by specific experts to ensure reliability and compatibility.
    • +
    • Broad Availability: Commonly used software, such as OpenMPI, ANSYS, MATLAB, and other, is provided within PModules.
    • +
    • Custom Requests: If a package, version, or feature is missing, users can contact the support team to explore feasibility for installation.
    • +
    + + + +

    Spack Modules

    + +

    Merlin7 also provides Spack modules, offering a modern and flexible package management system. Spack supports a wide variety of software packages and versions. For more information, refer to the external PSI Spack documentation.

    + + + +

    Cray Environment Modules

    + +

    Merlin7 also supports Cray Environment Modules, which include compilers, MPI implementations, and libraries optimized +for Cray systems. However, Cray modules are not recommended as the default choice due to potential backward compatibility +issues when the Cray Programming Environment (CPE) is upgraded to a newer version.

    + +

    Recommendations:

    +
      +
    • Compiling Software: Cray modules can be used when optimization for Cray hardware is essential.
    • +
    • General Use: For most applications, prefer PModules, which ensure stability, backward compatibility, and long-term support.
    • +
    + + + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin7/spack.html b/public/merlin7/spack.html new file mode 100644 index 0000000..f3af225 --- /dev/null +++ b/public/merlin7/spack.html @@ -0,0 +1,596 @@ + + + + + + + + +Spack | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Spack

    +
    + + + +
    + + +
    Spack the HPC package manager documentation
    + + + + + + + +

    For Merlin7 the package manager for supercomputing Spack is available. It is meant to compliment the existing PModules +solution, giving users the opertunity to manage their own software environments.

    + +

    Documentation for how to use Spack on Merlin7 is provided here.

    + +

    The Spack PSI packages

    + +

    An initial collection of packages (and Spack reciepes) are located at Spack PSI, users can directly use these +through calls like spack add ....

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin7/ssh-keys.html b/public/merlin7/ssh-keys.html new file mode 100644 index 0000000..a6c87fa --- /dev/null +++ b/public/merlin7/ssh-keys.html @@ -0,0 +1,799 @@ + + + + + + + + +Configuring SSH Keys in Merlin | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Configuring SSH Keys in Merlin

    +
    + + + +
    + + +
    This document describes how to deploy SSH Keys in Merlin.
    + + + + + + + +
    + + + + + + +

    Merlin users sometimes will need to access the different Merlin services without being constantly requested by a password. +One can achieve that with Kerberos authentication, however in some cases some software would require the setup of SSH Keys. +One example is ANSYS Fluent, which, when used interactively, the way of communication between the GUI and the different nodes +is through the SSH protocol, and the use of SSH Keys is enforced.

    + +

    Setting up SSH Keys on Merlin

    + +

    For security reason, users must always protect SSH Keys with a passphrase.

    + +

    User can check whether a SSH key already exists. These would be placed in the ~/.ssh/ directory. RSA encryption +is usually the default one, and files in there would be id_rsa (private key) and id_rsa.pub (public key).

    + +
    ls ~/.ssh/id*   
    +
    + +

    For creating SSH RSA Keys, one should:

    + +
      +
    1. Run ssh-keygen, a password will be requested twice. You must remember this password for the future. +
        +
      • Due to security reasons, always try protecting it with a password. There is only one exception, when running ANSYS software, which in general should not use password to simplify the way of running the software in Slurm.
      • +
      • This will generate a private key id_rsa, and a public key id_rsa.pub in your ~/.ssh directory.
      • +
      +
    2. +
    3. +

      Add your public key to the authorized_keys file, and ensure proper permissions for that file, as follows:

      + +
      cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
      +chmod 0600 ~/.ssh/authorized_keys
      +
      +
    4. +
    5. +

      Configure the SSH client in order to force the usage of the psi.ch domain for trusting keys:

      + +
      echo "CanonicalizeHostname yes" >> ~/.ssh/config
      +
      +
    6. +
    7. +

      Configure further SSH options as follows:

      + +
      echo "AddKeysToAgent yes" >> ~/.ssh/config
      +echo "ForwardAgent yes" >> ~/.ssh/config
      +
      + +

      Other options may be added.

      +
    8. +
    9. +

      Check that your SSH config file contains at least the lines mentioned in steps 3 and 4:

      + +
      # cat ~/.ssh/config
      +CanonicalizeHostname yes
      +AddKeysToAgent yes
      +ForwardAgent yes
      +
      +
    10. +
    + +

    Using the SSH Keys

    + +

    Using Authentication Agent in SSH session

    + +

    By default, when accessing the login node via SSH (with ForwardAgent=yes), it will automatically add your +SSH Keys to the authentication agent. Hence, no actions should not be needed by the user. One can configure +ForwardAgent=yes as follows:

    + +
      +
    • +

      (Recommended) In your local Linux (workstation, laptop or desktop) add the following line in the +$HOME/.ssh/config (or alternatively in /etc/ssh/ssh_config) file:

      + +
      ForwardAgent yes
      +
      +
    • +
    • +

      Alternatively, on each SSH you can add the option ForwardAgent=yes in the SSH command. In example:

      + +
      ssh -XY -o ForwardAgent=yes login001.merlin7.psi.ch
      +
      +
    • +
    + +

    If ForwardAgent is not enabled as shown above, one needs to run the authentication agent and then add your key +to the ssh-agent. This must be done once per SSH session, as follows:

    + +
      +
    • Run eval $(ssh-agent -s) to run the ssh-agent in that SSH session
    • +
    • +

      Check whether the authentication agent has your key already added:

      + +
      ssh-add -l | grep "/data/user/$(whoami)/.ssh"
      +
      +
    • +
    • +

      If no key is returned in the previous step, you have to add the private key identity to the authentication agent. +You will be requested for the passphrase of your key, and it can be done by running:

      + +
      ssh-add
      +
      +
    • +
    + +

    Using Authentication Agent in NoMachine Session

    + +

    By default, when using a NoMachine session, the ssh-agent should be automatically started. Hence, there is no need of +starting the agent or forwarding it.

    + +

    However, for NoMachine one always need to add the private key identity to the authentication agent. This can be done as follows:

    + +
      +
    1. +

      Check whether the authentication agent has already the key added:

      + +
      ssh-add -l | grep "/data/user/$(whoami)/.ssh"
      +
      +
    2. +
    3. +

      If no key is returned in the previous step, you have to add the private key identity to the authentication agent. +You will be requested for the passphrase of your key, and it can be done by running:

      + +
      ssh-add
      +
      +
    4. +
    + +

    You just need to run it once per NoMachine session, and it would apply to all terminal windows within that NoMachine session.

    + +

    Troubleshooting

    + +

    Errors when running ‘ssh-add’

    + +

    If the error Could not open a connection to your authentication agent. appears when running ssh-add, it means +that the authentication agent is not running. Please follow the previous procedures for starting it.

    + +

    Add/Update SSH RSA Key password

    + +

    If an existing SSH Key does not have password, or you want to update an existing password with a new one, you can do it as follows:

    + +
    ssh-keygen -p -f ~/.ssh/id_rsa
    +
    + +

    SSH Keys deployed but not working

    + +

    Please ensure proper permissions of the involved files, as well as any typos in the file names involved:

    + +
    chmod u+rwx,go-rwx,g+s ~/.ssh
    +chmod u+rw-x,go-rwx    ~/.ssh/authorized_keys
    +chmod u+rw-x,go-rwx    ~/.ssh/id_rsa
    +chmod u+rw-x,go+r-wx   ~/.ssh/id_rsa.pub
    +
    + +

    Testing SSH Keys

    + +

    Once SSH Key is created, for testing that the SSH Key is valid, one can do the following:

    + +
      +
    1. +

      Create a new SSH session in one of the login nodes:

      + +
      ssh login001
      +
      +
    2. +
    3. +

      In the login node session, destroy any existing Kerberos ticket or active SSH Key:

      + +
      kdestroy
      +ssh-add -D
      +
      +
    4. +
    5. +

      Add the new private key identity to the authentication agent. You will be requested by the passphrase.

      + +
      ssh-add
      +
      +
    6. +
    7. +

      Check that your key is active by the SSH agent:

      + +
      ssh-add -l
      +
      +
    8. +
    9. +

      SSH to the second login node. No password should be requested:

      + +
      ssh -vvv login002
      +
      +
    10. +
    + +

    If the last step succeeds, then means that your SSH Key is properly setup.

    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin7/storage.html b/public/merlin7/storage.html new file mode 100644 index 0000000..343198f --- /dev/null +++ b/public/merlin7/storage.html @@ -0,0 +1,852 @@ + + + + + + + + +Merlin7 Storage | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Merlin7 Storage

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    Introduction

    + +

    This document describes the different directories of the Merlin7 cluster.

    + +

    Backup and data policies

    + +
      +
    • Users are responsible for backing up their own data. Is recommended to backup the data on third party independent systems (i.e. LTS, Archive, AFS, SwitchDrive, Windows Shares, etc.).
    • +
    • When a user leaves PSI, she or her supervisor/team are responsible to backup and move the data out from the cluster: every few months, the storage space will be recycled for those old users who do not have an existing and valid PSI account.
    • +
    + + + +

    How to check quotas

    + +

    Some of the Merlin7 directories have quotas applied. A way for checking the quotas is provided with the merlin_quotas command. +This command is useful to show all quotas for the different user storage directories and partitions (including AFS). To check your quotas, please run:

    + +
    $ merlin_quotas 
    +Path            SpaceUsed  SpaceQuota  Space %  FilesUsed  FilesQuota  Files %
    +--------------  ---------  ----------  -------  ---------  ----------  -------
    +/data/user      30.26G     1T          03%      367296     2097152     18%    
    + └─ <USERNAME>
    +/afs/psi.ch     3.4G       9.5G        36%      0          0           0%     
    + └─ user/<USERDIR>                                                                
    +/data/scratch   688.9M     2T          00%      368471     0           00%
    + └─ shared
    +/data/project   3.373T     11T         31%      425644     2097152     20%
    + └─ bio/shared
    +/data/project   4.142T     11T         38%      579596     2097152     28%
    + └─ bio/hpce
    +
    + + + +

    The output shows the quotas set and how much you are using of the quota, for each filesystem that has this set. Notice that some users will have +one or more /data/project/... directories showing, depending on whether you are part of a specific PSI research group or project.

    + +

    The general quota constraints for the different directories are shown in the table below. Further details on how to use merlin_quotas +can be found on the Tools page.

    + + + +

    Merlin7 directories

    + +

    Merlin7 offers the following directory classes for users:

    + +
      +
    • /data/user/<username>: Private user home directory
    • +
    • /data/project/general: project directory for Merlin
    • +
    • /data/project/bio/$projectname: project directory for BIO
    • +
    • /data/project/mu3e/$projectname: project directory for Mu3e
    • +
    • /data/project/meg/$projectname: project directory for Mu3e
    • +
    • /scratch: Local scratch disk (only visible by the node running a job).
    • +
    • /data/scratch/shared: Shared scratch disk (visible from all nodes).
    • +
    + + + +

    Properties of the directory classes:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    DirectoryBlock Quota [Soft:Hard]Inode Quota [Soft:Hard]GraceTimeQuota Change Policy: BlockQuota Change Policy: InodesBackup
    /data/user/$usernamePRJ [1TB:1.074TB]PRJ [2M:2.1M]7dImmutable. Need a project.Changeable when justified.no
    /data/project/bio/$projectnamePRJ [1TB:1.074TB]PRJ [1M:1.1M]7dSubject to project requirements.Subject to project requirements.no
    /data/project/general/$projectnamePRJ [1TB:1.074TB]PRJ [1M:1.1M]7dSubject to project requirements.Subject to project requirements.no
    /data/scratch/sharedUSR [512GB:2TB] 7dUp to x2 when strongly justified.Changeable when justified.no
    /scratchUndefUndefN/AN/AN/Ano
    + + + +

    User home directory

    + +

    This is the default directory users will land when login in to any Merlin7 machine. +It is intended for your scripts, documents, software development and data. Do not use it for I/O-hungry tasks.

    + +

    The home directories are mounted in the login and computing nodes under the directory

    + +
    /data/user/$username
    +
    + +

    Directory policies:

    + +
      +
    • Read Important: Code of Conduct for more information about Merlin7 policies.
    • +
    • Is forbidden to use the home directories for IO-intensive tasks, instead use one of the scratch areas instead!
    • +
    • No backup policy is applied for the user home directories: users are responsible for backing up their data.
    • +
    + +

    Home directory quotas are defined in a per Lustre project basis. The quota can be checked using the merlin_quotas command described +above.

    + +

    Project data directory

    + +

    This storage is intended for keeping large amounts of a project’s data, where the data also can be +shared by all members of the project (the project’s corresponding UNIX group). We recommend to keep most data in +project related storage spaces, since it allows users to coordinate. Also, project spaces have more flexible policies +regarding extending the available storage space.

    + +

    Scientists can request a Merlin project space as described in [Accessing Merlin -> Requesting a Project]. +By default, Merlin can offer general project space, centrally covered, as long as it does not exceed 10TB (otherwise, it has to be justified). +General Merlin projects might need to be reviewed after one year of their creation.

    + +

    Once a Merlin project is created, the directory will be mounted in the login and computing nodes under the directory:

    + +
    /data/project/general/$projectname
    +
    + +

    Project quotas are defined in a per Lustre project basis. Users can check the project quota by running the following command:

    + +
    lfs quota -h -p $projectid /data
    +
    + + + +

    Directory policies:

    + +
      +
    • Read Important: Code of Conduct for more information about Merlin7 policies.
    • +
    • It is forbidden to use the data directories as /scratch area during a job’s runtime, i.e. for high throughput I/O for a job’s temporary files. +
        +
      • Please Use /scratch, /data/scratch/shared for this purpose.
      • +
      +
    • +
    • No backups: users are responsible for managing the backups of their data directories.
    • +
    + +

    Dedicated project directories

    + +

    Some departments or divisions have bigger storage space requirements on Merlin7. At present, bio, mu3e and meg are the main ones. +These are mounted under the following paths:

    + +
    /data/project/bio
    +/data/project/mu3e
    +/data/project/meg
    +
    + +

    They follow the same rules as the general projects, except that they have assigned more space.

    + +

    Scratch directories

    + +

    There are two different types of scratch storage: local (/scratch) and shared (/data/scratch/shared).

    + +
      +
    • local scratch should be used for all jobs that do not require the scratch files to be accessible from multiple nodes, which is trivially +true for all jobs running on a single node. Mount path:
    • +
    + +
    /scratch
    +
    + +
      +
    • shared scratch is intended for files that need to be accessible by multiple nodes, e.g. by a MPI-job where tasks are spread out over the cluster +and all tasks need to do I/O on the same temporary files.
    • +
    + +
    /data/scratch/shared
    +
    + +

    Scratch directories policies:

    + +
      +
    • Read Important: Code of Conduct for more information about Merlin7 policies.
    • +
    • By default, always use local first and only use shared if your specific use case requires it.
    • +
    • Temporary files must be deleted at the end of the job by the user. +
        +
      • Remaining files will be deleted by the system if detected. +
          +
        • Files not accessed within 28 days will be automatically cleaned up by the system.
        • +
        • If for some reason the scratch areas get full, admins have the rights to cleanup the oldest data.
        • +
        +
      • +
      +
    • +
    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin7/tools.html b/public/merlin7/tools.html new file mode 100644 index 0000000..4672317 --- /dev/null +++ b/public/merlin7/tools.html @@ -0,0 +1,702 @@ + + + + + + + + +Merlin7 Tools | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Merlin7 Tools

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    About

    + +

    We provide tool(s) to help user get the most out of using the cluster. The tools +described here are organised by use case and include usage examples.

    + +

    Files and Directories

    + +

    merlin_quotas

    + +

    This tool is available on all of the login nodes and provides a brief overview of +a user’s filesystem quotas. These are limits which restrict how much storage (or +number of files) a user can create. A generic table of filesystem quotas can be +found on the Storage page.

    + +

    Example #1: Viewing quotas

    + +

    Simply calling merlin_quotas will show you a table of our quotas:

    + +
    $ merlin_quotas 
    +Path            SpaceUsed  SpaceQuota  Space %  FilesUsed  FilesQuota  Files %
    +--------------  ---------  ----------  -------  ---------  ----------  -------
    +/data/user      30.26G     1T          03%      367296     2097152     18%    
    + └─ <USERNAME>
    +/afs/psi.ch     3.4G       9.5G        36%      0          0           00%
    + └─ user/<USERDIR>                                                                
    +/data/project   2.457T     10T         25%      58         2097152     00%    
    + └─ bio/shared                                                                
    +/data/project   338.3G     10T         03%      199391     2097152     10%    
    + └─ bio/hpce 
    +
    + + + +

    Example #2: Project view

    + +

    The tool can also be used to list out information about what projects directories +there are and who owns/manages these:

    + +
    $ merlin_quotas projects
    +Project ID  Path                      Owner      Group
    +----------  ------------------------  ---------  --------------
    +600000000   /data/project/bio/shared  germann_e  unx-merlin_adm
    +600000001   /data/project/bio/hpce    assman_g   unx-merlin_adm
    +
    + +

    By default this only shows information on projects that you have access to, but +to view the whole list you can pass --all flag:

    + +
    $ merlin_quotas projects --all
    +Project ID  Path                             Owner           Group
    +----------  -------------------------------  --------------  -----------------
    +500000000   /data/project/general/mcnp       gac-mcnp        unx-mcnp_all
    +500000001   /data/project/general/vis_as     talanov_v       unx-vis_as
    +500000002   /data/project/general/mmm        krack           org-7302
    +500000003   /data/project/general            laeuch_a        org-7201
    +             └─ LTC_CompPhys
    +600000000   /data/project/bio/shared         germann_e       unx-merlin_adm
    +600000001   /data/project/bio/hpce           assman_g        unx-merlin_adm
    +600000002   /data/project/bio/abrahams       abrahams_j      unx-bio_abrahams
    +600000003   /data/project/bio/benoit         benoit_r        unx-bio_benoit
    +600000004   /data/project/bio/ishikawa       ishikawa        unx-bio_ishikawa
    +600000005   /data/project/bio/kammerer       kammerer_r      unx-bio_kammerer
    +600000006   /data/project/bio/korkhov        korkhov_v       unx-bio_korkhov
    +600000007   /data/project/bio/luo            luo_j           unx-bio_luo
    +600000008   /data/project/bio/mueller        mueller_e       unx-bio_mueller
    +600000009   /data/project/bio/poghosyan      poghosyan_e     unx-bio_poghosyan
    +600000010   /data/project/bio/schertler      schertler_g     unx-bio_schertler
    +600000011   /data/project/bio/shivashankar   shivashankar_g  unx-bio_shivashan
    +600000012   /data/project/bio/standfuss      standfuss       unx-bio_standfuss
    +600000013   /data/project/bio/steinmetz      steinmetz       unx-bio_steinmetz
    +
    + + + +

    Example #3: Project config

    + +

    To make tracking quotas of projects easier, merlin_quotas generates a config +file in your home directory which defines the projects to show when you call the +tool (called ~/.merlin_quotas).

    + +

    The config file simply contains a list (one per line) of project IDs which should +be tracked. In theory any (or all available projects) can be tracked, but due to +UNIX and Lustre permissions, accessing quotas information for a project you’re not +a member of is not possible.

    + +

    If you are added/removed from a project, you can update this config file by +calling merlin_quotas genconf --force (notice the --force, which will overwrite +your existing config file) or by editing the file by hand (not recommended).

    + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/merlin7/transfer-data.html b/public/merlin7/transfer-data.html new file mode 100644 index 0000000..fa58d17 --- /dev/null +++ b/public/merlin7/transfer-data.html @@ -0,0 +1,674 @@ + + + + + + + + +Transferring Data | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Transferring Data

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    Overview

    + +

    Most methods allow data to be either transmitted or received, so it may make sense to +initiate the transfer from either merlin or the other system, depending on the network +visibility.

    + +
      +
    • Merlin login nodes are visible from the PSI network, so direct data transfer +(rsync/WinSCP/sftp) is generally preferable. +
        +
      • Protocols from Merlin7 to PSI may require special firewall rules.
      • +
      +
    • +
    • Merlin login nodes can access the internet using a limited set of protocols: +
        +
      • HTTP-based protocols using ports 80 or 445 (https, WebDav, etc)
      • +
      • Protocols using other ports require admin configuration and may only work with +specific hosts, and may require new firewall rules (ssh, ftp, rsync daemons, etc).
      • +
      +
    • +
    • Systems on the internet can access the PSI Data Transfer service +datatransfer.psi.ch, using ssh-based protocols and Globus
    • +
    + +

    SSH-based protocols using port 22 to most PSI servers and (rsync-over-ssh, sftp, WinSCP, etc.), are in general, not permitted

    + +

    Direct transfer via Merlin7 login nodes

    + +

    The following methods transfer data directly via the login +nodes. They are suitable +for use from within the PSI network.

    + +

    Rsync

    + +

    Rsync is the preferred method to transfer data from Linux/MacOS. It allows +transfers to be easily resumed if they get interrupted. The general syntax is:

    + +
    rsync -avAHXS <src> <dst>
    +
    + +

    For example, to transfer files from your local computer to a merlin project +directory:

    + +
    rsync -avAHXS ~/localdata $USER@login001.merlin7.psi.ch:/data/project/general/myproject/
    +
    + +

    You can resume interrupted transfers by simply rerunning the command. Previously +transferred files will be skipped.

    + +

    WinSCP

    + +

    The WinSCP tool can be used for remote file transfer on Windows. It is available +from the Software Kiosk on PSI machines. Add login001.merlin7.psi.ch or login002.merlin7.psi.ch +as a host and connect with your PSI credentials. You can then drag-and-drop files between your +local computer and merlin.

    + +

    SWITCHfilesender

    + +

    SWITCHfilesender is an installation of the FileSender project (filesender.org) which is a web based application that allows authenticated users to securely and easily send arbitrarily large files to other users.

    + +

    Authentication of users is provided through SimpleSAMLphp, supporting SAML2, LDAP and RADIUS and more. Users without an account can be sent an upload voucher by an authenticated user. FileSender is developed to the requirements of the higher education and research community.

    + +

    The purpose of the software is to send a large file to someone, have that file available for download for a certain number of downloads and/or a certain amount of time, and after that automatically delete the file. The software is not intended as a permanent file publishing platform.

    + +

    SWITCHfilesender is fully integrated with PSI, therefore, PSI employees can log in by using their PSI account (through Authentication and Authorization Infrastructure / AAI, by selecting PSI as the institution to be used for log in).

    + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/news.html b/public/news.html new file mode 100644 index 0000000..4b66175 --- /dev/null +++ b/public/news.html @@ -0,0 +1,405 @@ + + + + + + + + +News | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    News

    +
    + + + +
    + + + + + + + + +
    + +
    + + + +

    Merlin7 in preproduction

    + +

    The Merlin7 cluster is officially in preproduction. This phase will be tested by a few users +and slowly we will contact other users to be part of it. Keep in mind that access is restricted. + +Merlin7 documentation is now available https://hpce.pages.psi.ch/merlin7/slurm-configuration.html. + +More complete documentation will be coming shortly. +

    + + + + +

    Merlin 6 documentation available

    + +

    Merlin 6 docs are now available at https://hpce.pages.psi.ch/merlin6! + +More complete documentation will be coming shortly. +

    + + + +

    RSS Subscribe

    + +
    +

    See more posts from the News Archive.

    + +
    +
    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/news_archive.html b/public/news_archive.html new file mode 100644 index 0000000..31d99f1 --- /dev/null +++ b/public/news_archive.html @@ -0,0 +1,333 @@ + + + + + + + + +News | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    News

    +
    + + + +
    + + + + + + + + +
    + +
    + + +
    +

    This year's posts

    + + + +

    2019

    + +
    +
    +
    +
    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/pages/CSCS/downloads/CSCS/PSI_CSCSAllocations2023.xltx b/public/pages/CSCS/downloads/CSCS/PSI_CSCSAllocations2023.xltx new file mode 100644 index 0000000..daecd3d Binary files /dev/null and b/public/pages/CSCS/downloads/CSCS/PSI_CSCSAllocations2023.xltx differ diff --git a/public/pdf-all.sh b/public/pdf-all.sh new file mode 100644 index 0000000..1311770 --- /dev/null +++ b/public/pdf-all.sh @@ -0,0 +1 @@ +. pdf-mydoc.sh; . pdf-product1.sh; . pdf-product2.sh; \ No newline at end of file diff --git a/public/pdf-mydoc.sh b/public/pdf-mydoc.sh new file mode 100644 index 0000000..6b682ae --- /dev/null +++ b/public/pdf-mydoc.sh @@ -0,0 +1,14 @@ +# Note that .sh scripts work only on Mac. If you're on Windows, install Git Bash and use that as your client. + +echo 'Kill all Jekyll instances' +kill -9 $(ps aux | grep '[j]ekyll' | awk '{print $2}') +clear + +echo "Building PDF-friendly HTML site for Mydoc ..."; +bundle exec jekyll serve --detach --config _config.yml,pdfconfigs/config_mydoc_pdf.yml; +echo "done"; + +echo "Building the PDF ..."; +prince --javascript --input-list=_site/pdfconfigs/prince-list.txt -o pdf/mydoc.pdf; + +echo "Done. Look in the pdf directory to see if it printed successfully." diff --git a/public/pdf-product1.sh b/public/pdf-product1.sh new file mode 100644 index 0000000..ae5c674 --- /dev/null +++ b/public/pdf-product1.sh @@ -0,0 +1,11 @@ +echo 'Killing all Jekyll instances' +kill -9 $(ps aux | grep '[j]ekyll' | awk '{print $2}') +clear + +echo "Building PDF-friendly HTML site for Product1 ..."; +bundle exec jekyll serve --detach --config _config.yml,pdfconfigs/config_product1_pdf.yml; +echo "done"; + +echo "Building the PDF ..."; +prince --javascript --input-list=_site/pdfconfigs/prince-list.txt -o pdf/product1.pdf; +echo "done"; diff --git a/public/pdf-product2.sh b/public/pdf-product2.sh new file mode 100644 index 0000000..2bdbc73 --- /dev/null +++ b/public/pdf-product2.sh @@ -0,0 +1,11 @@ +echo 'Killing all Jekyll instances' +kill -9 $(ps aux | grep '[j]ekyll' | awk '{print $2}') +clear + +echo "Building PDF-friendly HTML site for Product2 ..."; +bundle exec jekyll serve --detach --config _config.yml,pdfconfigs/config_product2_pdf.yml; +echo "done"; + +echo "Building the PDF ..."; +prince --javascript --input-list=_site/pdfconfigs/prince-list.txt -o pdf/product2.pdf; +echo "done"; diff --git a/public/pdf/mydoc.pdf b/public/pdf/mydoc.pdf new file mode 100644 index 0000000..7169d61 --- /dev/null +++ b/public/pdf/mydoc.pdf @@ -0,0 +1,16246 @@ +%PDF-1.4 +% + +1 0 obj +<> +endobj + +194 0 obj +<> +endobj + +195 0 obj +<> +endobj + +196 0 obj +<> +endobj + +258 0 obj +<> +endobj + +259 0 obj +<> +endobj + +260 0 obj +<> +endobj + +261 0 obj +<> +endobj + +262 0 obj +<> +endobj + +244 0 obj +<> +endobj + +245 0 obj +<> +endobj + +246 0 obj +<> +endobj + +247 0 obj +<> +endobj + +248 0 obj +<> +endobj + +249 0 obj +<> +endobj + +250 0 obj +<> +endobj + +251 0 obj +<> +endobj + +252 0 obj +<> +endobj + +253 0 obj +<> +endobj + +254 0 obj +<> +endobj + +255 0 obj +<> +endobj + +256 0 obj +<> +endobj + +257 0 obj +<> +endobj + +197 0 obj +<> +endobj + +263 0 obj +<> +endobj + +264 0 obj +<> +endobj + +265 0 obj +<> +endobj + +198 0 obj +<> +endobj + +266 0 obj +<> +endobj + +267 0 obj +<> +endobj + +199 0 obj +<> +endobj + +200 0 obj +<> +endobj + +201 0 obj +<> +endobj + +268 0 obj +<> +endobj + +269 0 obj +<> +endobj + +270 0 obj +<> +endobj + +271 0 obj +<> +endobj + +272 0 obj +<> +endobj + +273 0 obj +<> +endobj + +274 0 obj +<> +endobj + +202 0 obj +<> +endobj + +275 0 obj +<> +endobj + +276 0 obj +<> +endobj + +277 0 obj +<> +endobj + +278 0 obj +<> +endobj + +279 0 obj +<> +endobj + +280 0 obj +<> +endobj + +281 0 obj +<> +endobj + +203 0 obj +<> +endobj + +282 0 obj +<> +endobj + +283 0 obj +<> +endobj + +284 0 obj +<> +endobj + +285 0 obj +<> +endobj + +286 0 obj +<> +endobj + +204 0 obj +<> +endobj + +287 0 obj +<> +endobj + +288 0 obj +<> +endobj + +289 0 obj +<> +endobj + +290 0 obj +<> +endobj + +291 0 obj +<> +endobj + +292 0 obj +<> +endobj + +293 0 obj +< +/Parent 205 0 R +/Dest [42 0 R /XYZ 0 590 0] +/Prev 292 0 R>> +endobj + +205 0 obj +<> +endobj + +294 0 obj +<> +endobj + +295 0 obj +<> +endobj + +296 0 obj +<> +endobj + +297 0 obj +<> +endobj + +298 0 obj +<> +endobj + +299 0 obj +<> +endobj + +300 0 obj +<> +endobj + +301 0 obj +<> +endobj + +206 0 obj +<> +endobj + +302 0 obj +<> +endobj + +303 0 obj +<> +endobj + +304 0 obj +<> +endobj + +305 0 obj +<> +endobj + +306 0 obj +<> +endobj + +307 0 obj +<> +endobj + +308 0 obj +<> +endobj + +309 0 obj +<> +endobj + +310 0 obj +<> +endobj + +311 0 obj +<> +endobj + +312 0 obj +<> +endobj + +318 0 obj +<> +endobj + +317 0 obj +<> +endobj + +313 0 obj +<> +endobj + +314 0 obj +<> +endobj + +315 0 obj +<> +endobj + +316 0 obj +<> +endobj + +207 0 obj +<> +endobj + +319 0 obj +<> +endobj + +320 0 obj +<> +endobj + +208 0 obj +<> +endobj + +321 0 obj +<> +endobj + +322 0 obj +<> +endobj + +323 0 obj +<> +endobj + +325 0 obj +<> +endobj + +324 0 obj +<> +endobj + +209 0 obj +<> +endobj + +326 0 obj +<> +endobj + +327 0 obj +<> +endobj + +328 0 obj +<> +endobj + +329 0 obj +<> +endobj + +330 0 obj +<> +endobj + +331 0 obj +<> +endobj + +332 0 obj +<> +endobj + +333 0 obj +<> +endobj + +210 0 obj +<> +endobj + +334 0 obj +<> +endobj + +335 0 obj +<> +endobj + +211 0 obj +<> +endobj + +336 0 obj +<> +endobj + +337 0 obj +<> +endobj + +338 0 obj +<> +endobj + +339 0 obj +<> +endobj + +340 0 obj +<> +endobj + +212 0 obj +<> +endobj + +341 0 obj +<> +endobj + +342 0 obj +<> +endobj + +343 0 obj +<> +endobj + +344 0 obj +<> +endobj + +345 0 obj +<> +endobj + +346 0 obj +<> +endobj + +347 0 obj +<> +endobj + +348 0 obj +<> +endobj + +349 0 obj +<> +endobj + +350 0 obj +<> +endobj + +351 0 obj +<> +endobj + +352 0 obj +<> +endobj + +213 0 obj +<> +endobj + +353 0 obj +<> +endobj + +214 0 obj +<> +endobj + +354 0 obj +<> +endobj + +355 0 obj +<> +endobj + +356 0 obj +<> +endobj + +357 0 obj +<> +endobj + +215 0 obj +<> +endobj + +358 0 obj +<> +endobj + +359 0 obj +<> +endobj + +360 0 obj +<> +endobj + +361 0 obj +<> +endobj + +362 0 obj +<> +endobj + +363 0 obj +<> +endobj + +371 0 obj +<> +endobj + +364 0 obj +<> +endobj + +372 0 obj +<> +endobj + +373 0 obj +<> +endobj + +374 0 obj +<> +endobj + +365 0 obj +<> +endobj + +366 0 obj +<> +endobj + +367 0 obj +<> +endobj + +368 0 obj +<> +endobj + +369 0 obj +<> +endobj + +370 0 obj +<> +endobj + +216 0 obj +<> +endobj + +375 0 obj +<> +endobj + +376 0 obj +<> +endobj + +377 0 obj +<> +endobj + +378 0 obj +<> +endobj + +379 0 obj +<> +endobj + +380 0 obj +<> +endobj + +381 0 obj +<> +endobj + +217 0 obj +<> +endobj + +382 0 obj +<> +endobj + +383 0 obj +<> +endobj + +384 0 obj +< +/Parent 218 0 R +/Dest [96 0 R /XYZ 0 655 0] +/Prev 383 0 R +/Next 385 0 R>> +endobj + +385 0 obj +<> +endobj + +386 0 obj +<> +endobj + +387 0 obj +<> +endobj + +388 0 obj +<> +endobj + +218 0 obj +<> +endobj + +389 0 obj +<> +endobj + +219 0 obj +<> +endobj + +390 0 obj +<> +endobj + +391 0 obj +<> +endobj + +392 0 obj +<> +endobj + +393 0 obj +<> +endobj + +394 0 obj +<> +endobj + +395 0 obj +<> +endobj + +396 0 obj +<> +endobj + +397 0 obj +<> +endobj + +398 0 obj +<> +endobj + +220 0 obj +<> +endobj + +399 0 obj +<> +endobj + +400 0 obj +<> +endobj + +401 0 obj +<> +endobj + +402 0 obj +<> +endobj + +403 0 obj +<> +endobj + +404 0 obj +<> +endobj + +221 0 obj +<> +endobj + +405 0 obj +<> +endobj + +406 0 obj +<> +endobj + +407 0 obj +<> +endobj + +222 0 obj +<> +endobj + +408 0 obj +<> +endobj + +223 0 obj +<> +endobj + +409 0 obj +<> +endobj + +224 0 obj +<> +endobj + +410 0 obj +<> +endobj + +411 0 obj +<> +endobj + +412 0 obj +<> +endobj + +413 0 obj +<> +endobj + +225 0 obj +<> +endobj + +414 0 obj +<> +endobj + +415 0 obj +<> +endobj + +416 0 obj +<> +endobj + +417 0 obj +<> +endobj + +418 0 obj +<> +endobj + +419 0 obj +<> +endobj + +420 0 obj +<> +endobj + +421 0 obj +<> +endobj + +422 0 obj +<> +endobj + +423 0 obj +<> +endobj + +424 0 obj +<> +endobj + +226 0 obj +<> +endobj + +425 0 obj +<> +endobj + +426 0 obj +<> +endobj + +427 0 obj +<> +endobj + +227 0 obj +<> +endobj + +428 0 obj +<> +endobj + +429 0 obj +<> +endobj + +228 0 obj +<> +endobj + +430 0 obj +<> +endobj + +431 0 obj +<> +endobj + +432 0 obj +<> +endobj + +229 0 obj +<> +endobj + +433 0 obj +<> +endobj + +434 0 obj +<> +endobj + +435 0 obj +<> +endobj + +436 0 obj +<> +endobj + +230 0 obj +<> +endobj + +437 0 obj +<> +endobj + +438 0 obj +<> +endobj + +439 0 obj +<> +endobj + +231 0 obj +<> +endobj + +440 0 obj +<> +endobj + +441 0 obj +<> +endobj + +232 0 obj +<> +endobj + +442 0 obj +<> +endobj + +443 0 obj +<> +endobj + +444 0 obj +<> +endobj + +445 0 obj +<> +endobj + +446 0 obj +<> +endobj + +447 0 obj +<> +endobj + +448 0 obj +<> +endobj + +449 0 obj +<> +endobj + +450 0 obj +<> +endobj + +451 0 obj +<> +endobj + +452 0 obj +<> +endobj + +233 0 obj +<> +endobj + +453 0 obj +<> +endobj + +454 0 obj +<> +endobj + +455 0 obj +< +/Parent 234 0 R +/Dest [159 0 R /XYZ 0 310 0] +/Prev 454 0 R +/Next 456 0 R>> +endobj + +456 0 obj +<> +endobj + +457 0 obj +<> +endobj + +458 0 obj +<> +endobj + +459 0 obj +<> +endobj + +460 0 obj +<> +endobj + +461 0 obj +<> +endobj + +462 0 obj +<> +endobj + +463 0 obj +<> +endobj + +234 0 obj +<> +endobj + +464 0 obj +<> +endobj + +465 0 obj +<> +endobj + +466 0 obj +<> +endobj + +467 0 obj +<> +endobj + +468 0 obj +<> +endobj + +469 0 obj +<> +endobj + +235 0 obj +<> +endobj + +470 0 obj +<> +endobj + +471 0 obj +<> +endobj + +472 0 obj +<> +endobj + +236 0 obj +<> +endobj + +473 0 obj +<> +endobj + +474 0 obj +<> +endobj + +237 0 obj +<> +endobj + +475 0 obj +<> +endobj + +476 0 obj +<> +endobj + +477 0 obj +<> +endobj + +478 0 obj +<> +endobj + +238 0 obj +<> +endobj + +481 0 obj +<> +endobj + +482 0 obj +<> +endobj + +483 0 obj +<> +endobj + +484 0 obj +<> +endobj + +479 0 obj +<> +endobj + +480 0 obj +<> +endobj + +239 0 obj +<> +endobj + +485 0 obj +<> +endobj + +240 0 obj +<> +endobj + +486 0 obj +<> +endobj + +487 0 obj +<> +endobj + +488 0 obj +<> +endobj + +489 0 obj +<> +endobj + +490 0 obj +<> +endobj + +491 0 obj +<> +endobj + +492 0 obj +<> +endobj + +493 0 obj +<> +endobj + +494 0 obj +<> +endobj + +241 0 obj +<> +endobj + +242 0 obj +<> +endobj + +497 0 obj +<> +endobj + +498 0 obj +<> +endobj + +495 0 obj +<> +endobj + +499 0 obj +< +/Parent 496 0 R +/Dest [191 0 R /XYZ 0 665 0] +/Next 500 0 R>> +endobj + +500 0 obj +<> +endobj + +501 0 obj +<> +endobj + +502 0 obj +< +/Parent 496 0 R +/Dest [192 0 R /XYZ 0 732 0] +/Prev 501 0 R +/Next 503 0 R>> +endobj + +503 0 obj +< +/Parent 496 0 R +/Dest [192 0 R /XYZ 0 630 0] +/Prev 502 0 R>> +endobj + +496 0 obj +<> +endobj + +243 0 obj +<> +endobj + +193 0 obj +<> +endobj + +2 0 obj +<> +endobj + +504 0 obj +<> +stream +xmMN0sY=c;6KT@lriMzLn#Mf{3(!Ӈk2+;T4 b%Ha3 KC:7+ Afxf>L'@m +VT#q IXVcuZ-Yrql{ MU/|1fgu[훰[l z_u>)#9^5*?⮟g<0Lm zx4Ӟa .BTqt/'k0x `AᢅgC +endstream +endobj + +505 0 obj +295 +endobj + +506 0 obj +<> +stream +xVy +7(A1iL1>H;%(׋MJT^?xi)bzI:Y"i.Yz:'M(y($Y/ZzX0-d6'a'Kې~9wY0sNH7, Y@*@#8 @ Q`5 - TZA 8Yp\7 !CT@Z>d +YB, BPCH @[BFW tA!hz}a ^`WWp:΃wp=| n/7~O"!#J6DX;D#qو H=҂t"==DF>cpab0>0 و)Tab010C w,5c}xl6[==}~pJ8C-KĭZq]>0nǫM@</+w#O2A`I"D\B9pp0J&@"XLl voG$y!ɑJJ$m!UZHWHd2YlG^N7+C ŝ"tQSST 5*6R/QQ?dd|e2dedʼ%˺ʮ]'[.{Rk9[n\~Iy||||u1W!O%aBӥ8G7_ EŊيՊ%JRR J_h,p][sA˂ Ք]yʭ0T>}}5|9~~.SC/5Y*\ \L= |dr_[Bք4| u -3 +uˆ o (D.y3J5>=s#+W|pUUW'>Fv {lLDLSWv =[;qp˸!΀2VetHMzѶIn7[y/t0[ZZ / 'Y'[N韪9M;]mhOhtDu;y7ߎ>[}N\y3]Jz}1pK_^~kW^qp`hisӿ[~צ;vw:|={W޿`كa<>{'O垖?SVɹ![C s_בZccgǽ\rUګUͩ]591Vv]{G>,=4c驂O*~f}et:+k7oΤMP[˜%88YĐTL|Jl%P~2{Y@!JBy-$dg5Ps`xBj8ģp"~0kL|YVȏO1|"PvN:BiB_ainn@Fl)zg33 xffnf: d. +? +endstream +endobj + +507 0 obj +2577 +endobj + +3 0 obj +<> +/XObject <> +/ProcSet [/PDF /Text /ImageC] +/ColorSpace <>>> +/Group <
    >>> +endobj + +512 0 obj +<> +stream +xuRM0+V 4KVj{ң +{ܱl~Reǐnr"$|{Q

    Aї%n;1!UB5gr!0;^_`@b K.#&rY]~pD^FaGK̋uqLE{!7vtQg4)8SxX=R0:au`#Y(&@?u#Fx_p'Q 9k +ra> +/ProcSet [/PDF /Text]>> +/Group <>>> +endobj + +515 0 obj +<> +stream +xYn6}W1-U})vŢxR S3GYvDŢ@"dgsFù(4a/u +7Gf,f=[g\.0A͌Rɽa4'+IvX.Ųr'?7w}G~Y sa{2NfTj؉ʇN=t_ (;4ܘN;v|z-ΤbE6 + 2kU{'7oueS` `%h%J+G]/ܻw `bLbr2#BT2!ey?oHMJ:S9K̦2a (^ed{5Q*7ȢczLm,b\sC}EE%H~SYNujoSYȉ LjoYЈSXp,Â㦆UUEҟ$9J $6[>]k]7]\{I_d,)|43VG1W\/VQ4}АP*&SY/Qc jJ,903mĢ~/re5ͨ + bgH@"|6;˅4)DZP!MIQ\weP"EMP!QvgMEEfSnmhˬ#"LEK/3EO"ԈB]fh(~JYU)v2Ն +'M%Bi/Q ޯ*C6 +G7R/VU~]jHKź2+rsA'qnE]vˢ%5ɹ8 uXHIu6BG|QB/8߾:6vP0 ljjS%FȢؠe9P!QTrҡWZP!MK#Oe;W O449Ci4;?f:o!G GmCQS &7dic=3f44lB2+ԪUf/!Iyh ɘ<aJC/nV}}#!wzε亃B'Wn#yVn }\>RgyNjkݶ( \ll *M#gn* +endstream +endobj + +516 0 obj +1134 +endobj + +5 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [517 0 R 518 0 R 519 0 R 520 0 R 521 0 R 522 0 R 523 0 R 524 0 R 525 0 R 526 0 R 527 0 R 528 0 R 529 0 R 530 0 R 531 0 R 532 0 R 533 0 R 534 0 R 535 0 R 536 0 R 537 0 R 538 0 R 539 0 R 540 0 R 541 0 R]>> +endobj + +517 0 obj +<> +endobj + +518 0 obj +<> +endobj + +519 0 obj +<> +endobj + +520 0 obj +<> +endobj + +521 0 obj +<> +endobj + +522 0 obj +<> +endobj + +523 0 obj +<> +endobj + +524 0 obj +<> +endobj + +525 0 obj +<> +endobj + +526 0 obj +<> +endobj + +527 0 obj +<> +endobj + +528 0 obj +<> +endobj + +529 0 obj +<> +endobj + +530 0 obj +<> +endobj + +531 0 obj +<> +endobj + +532 0 obj +<> +endobj + +533 0 obj +<> +endobj + +534 0 obj +<> +endobj + +535 0 obj +<> +endobj + +536 0 obj +<> +endobj + +537 0 obj +<> +endobj + +538 0 obj +<> +endobj + +539 0 obj +<> +endobj + +540 0 obj +<> +endobj + +541 0 obj +<> +endobj + +545 0 obj +<> +stream +x͘n6~ +.ӢU5K(\]mDC~̾QG,l 0lH7!G$Ń&Y%ߜ uњ$MrAf{NrrX+}CfM~ 0k?.XJ&-.Ɖ=g'[5b8][")5?k~J:<(n<ii6.T~׊$4$kY>TV8(Oۦ&rӗʍɐ] 8]?@uSdN_iee_Io+Y@}aL8f@0J(O~~ɛGKi^hxHudd4cMېe7M1upES&)X=(l:̫[}pJV-Dq(jsv~5j,/h'q-Ϛi +xzCV4w0|Q#7Z$ITa\0G[[RRl z ѝn|k9iL.daeƇjj]-J lrfښlZ֠O@~IwY]c˜uǕÚ%i_L>UPX4"T5.q?_s2 ޢ)^u_& 2ice^*ڡN,q,e#}L2.ՃH ź /h3gCe.oU<_ +}R,FJ3}#)u,^ V>(7Q*Ruۓk t)ΈZ3Yk{mmyJ #FqvoePOX%Xvx]D'T1۪"8mIaxC!ό@1,z7H0qK2r/fד~ 6ŏYz;BSuNWnMOů&Y \ SGſI +endstream +endobj + +546 0 obj +993 +endobj + +6 0 obj +<> +/ProcSet [/PDF /Text]>> +/Group <> +/Annots [547 0 R 548 0 R 549 0 R 550 0 R 551 0 R 552 0 R 553 0 R 554 0 R 555 0 R 556 0 R 557 0 R 558 0 R 559 0 R 560 0 R 561 0 R 562 0 R 563 0 R 564 0 R 565 0 R 566 0 R 567 0 R 568 0 R]>> +endobj + +547 0 obj +<> +endobj + +548 0 obj +<> +endobj + +549 0 obj +<> +endobj + +550 0 obj +<> +endobj + +551 0 obj +<> +endobj + +552 0 obj +<> +endobj + +553 0 obj +<> +endobj + +554 0 obj +<> +endobj + +555 0 obj +<> +endobj + +556 0 obj +<> +endobj + +557 0 obj +<> +endobj + +558 0 obj +<> +endobj + +559 0 obj +<> +endobj + +560 0 obj +<> +endobj + +561 0 obj +<> +endobj + +562 0 obj +<> +endobj + +563 0 obj +<> +endobj + +564 0 obj +<> +endobj + +565 0 obj +<> +endobj + +566 0 obj +<> +endobj + +567 0 obj +<> +endobj + +568 0 obj +<> +endobj + +569 0 obj +<> +stream +xXˎ6+t*>$QA tHS-f#K,9z1~PRDdf,b瘼s//C=np @4|j|{1X4 +I[Qʼ@/ dQ*B½(@zqq`EJ'WQ5D.h: 1h[cƖh@J2Y_5`t5jb5ed)kk}Bl js/u{:{z' Y 9  R#ᜱ16`:ȋs0e4>!.csr"֑w.3Ȃ1ilF'd7j)e]r#0ę{Q: Qj }DG戍;lY>G904,!64gqҝ16b!4ѩu>]2fcsz;Ø\,n0[%cY0f0GlZ.W籾C_#Ln:[p6jVm^H&u2r=i6i|F?~&`u}WEUM~VEl𱜙`v A10d9[w8$ ף>1ۇE6u$/RxUq$UGvSmqz#d8&E&V'"פy~ʛ˱L$rARuK'b /AM2#j ɦZr[}@&mU6~M\1jXDr8]UUidm-1G0Vǡ}9LXRjVaa2_nMZ_3R䷐jEn:H jZ3AI1e}A~Vanʜ[):LQw`4yHQ?  eR] ét,Ya1M6ݝstJ ndpz7R;jA~Kq"o yxB{|ReWfz9I2Nf5Ij0w1wΚ!4 ' +|WIL~dу..1HDux%^~k//cNѹhNI>,`1z^7Ct5\8Mct}hP* ̭tlzr%w$ ~`Yk=b +Q*MXrțFwk9:E!8hܙp_}KGSH!Ūy6?\#]y< +?)㹗)O;UWgQ:l@'(96m,-mHf""}3fvx8vEӈlfW +endstream +endobj + +570 0 obj +1764 +endobj + +7 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [571 0 R 572 0 R 573 0 R 574 0 R 575 0 R]>> +endobj + +571 0 obj +<>>> +endobj + +572 0 obj +<>>> +endobj + +573 0 obj +<> +endobj + +574 0 obj +<> +endobj + +575 0 obj +<>>> +endobj + +578 0 obj +<> +stream +xYnH+ji< G33hY*YJ(ҐY\UuQϬ@[OY&)2?eOÇ[lR%HD{U&Y^d jbϱ<:BJRRRZ/3 ) V+i3hg<c:*8Y"jnFhh (wttkz3EQέz\ݵi>0(L@{+L'_ݪQ4gMUNۙХ$ց`Z{G(6fpG<"4=1yOb)PvU2Q4w\ 4^nVHbДT˜K&3}uq8՞CpG?Z +e-V[" 0OJ*ʮ&(4DF$,²rʒ222Q-M*0IX81Ǣ"KGexȋ1ipW^eblhSܼ5oS~L?{+YCO z6"j`ag(bZGn^*cE,/(ڦV|0uh˹v}Cb~jՔ]}liJ}xX0!]Jģmd$25g?ч(fplg}a;TR H#M4-]{IYRhLvjB^J jA{"bՂae4ôQ^kHt,/eIVH+v$a'mt[=]p2xG.+?8ťQs{9)D͐wAZz6Uh?u3Q_wOmi"̧iv5*_n -rMn-~E!]ȧkϯ$̙No8k%XY? ~}BCDħnS R#Ŕx8. +endstream +endobj + +579 0 obj +2296 +endobj + +8 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [580 0 R 581 0 R 582 0 R]>> +endobj + +580 0 obj +<>>> +endobj + +581 0 obj +<>>> +endobj + +582 0 obj +<>>> +endobj + +584 0 obj +<> +stream +xYn+jb=Xd`[d0E,MK"R/'O-֋n3wcR}Թb{^T|VO%rj?-\diȤ*+LY|s}`g.8sJg,TUv,'zqy1]ɬ(b݇}Hzly,IcO64u|=zRbJP~|)ɘC&sEi2C(̈́="iۧXaT)τpBK x$Isa,IcOsQ߳;XLRŲ:pX3'H1 Fx˚4cdaIY,FުToBYA,Z[1C,[j{D +ʘTnDrVLpI0-Lq†cL>TCcTLfҮ +Is!,ϱH^dUbSC4$7W`(ʳGDE.0nc gsڞ>x\W+D Q+*hЮ.ICT^ "]4 Ab{:ow+()NZqӨH3&D;[e|mOf|{yNعoj{j2'·hFPBMclm6WO~` ꮵTMn](ۏ&.+!psj7E9\Z*\5~oKuՒ nZݱ9wjINt:38. 8皒 %ѧ {j) arVý@ri=1tOl~pӜBHX^^2((Z#;M}umq6ٶedyapwծ뾾_ +cs3pur\OE1.Toڞ[ +fmr#K޾ڮx1@YV~HM\߷fM=}b[۷zi֘^Ǽ㫮9ö;dz.\hF!:zMITZr m]ooczaP}2@ Gn֤Jb: ַ3rM K ۟wkc&5Ձ'?P +(1&LOQsdg_>:9P1a\_ۏHuSShrT{~6#us>Kn4{>K5Q$qx@o4þ4k{'f^&gEPЉ[RzO:Ē@đ<Fh؃̨'?o@=teo7v1:}fo=}zPVJaqu+0H1%1M[;a19_bfY;59bpL`. gjtT0(4X `7s&pŸ̒zripT\1uOC/7bظEp{1w$fݣ@\ ݀CAG]Ml,eAu'[hy!w*7ZwG,{Ĭ{͕5Fᰡ/v +`.Jbu概#u_nIcpn ߤtc> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [586 0 R 587 0 R]>> +endobj + +586 0 obj +<>>> +endobj + +587 0 obj +<>>> +endobj + +589 0 obj +<> +stream +xYn}Gm4^kHQ,`P3=cPrṽ'Hcg/騫TuUu(8MŧS+9v7l_E)ai0˕Fʢ4\CBR2!T&L0a͌l7*/+)3LWՅ IW׊BCZnRf*Ud7ͽnDSV= P X*w0&k.!oV e5nd {Jg,*htLJB",i*"0"zuО!UЕa y#𡸙 {-R13{#4G+gG.GCȵz׿c/K*z6' =eW8(n2p^!#0yƸZ4JUҚfFJ*)O6gO)Hg 5i7մ*d`5`QA{Ƞ륬I{y]̚kY)R\[f +&QJ2k(D-u##OfPRb3WCm n/Ey@}hN|zˮp{؞-Kѕ\ W%D6:b:`^R) %?Pq5yr7&dH2ruHG.:&+EMIJw$0ǢRI Je/| c.EWbWE5W:"\?\uQN-6|2Pc/^s/^9It3;;D?Bm) ;vW:<|qF]naWnkjӚ}I38]ֺ&p5NF8]㭆j/HWM^4"{ނMPǢTdO7v$zSnqf)͕U!\8 mF_w4{#>)},|w3k~O56]?{6 6j6&fKv ƬO3ތ IDvV +endstream +endobj + +590 0 obj +2308 +endobj + +10 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [591 0 R]>> +endobj + +591 0 obj +<> +endobj + +592 0 obj +<> +stream +xXMo8W],IC,Mt +SG#[,7럹?;%8so{y38C)d5)3>lsASK3%rKtfڿߦZiF8h.C_ŹkRΤ,Q &'rSQ$Ȏib 3z!6HDDoO^jb +)>!(bsYjb.K3bODCSf',)T9BFaȞ zQ,\ReLZsmSPk*S渏* +K*1/dO=p٘) yb $:#T&bf=ALzwzX#3TL}-*3V, #5b؝Ȟ b).˾2R,`I_#Y#{z%I;J w +7|97{+~lVEivӈ$AÄ{uEylڇ~پmU۝fGNͱ%bU9p_Zf%ʺ|T6k. ]N8\k~p#-喛sVBղjW~smֿmM\s}r>8*mqw~ &-Dlv +}&TCGoYHAղ8]pʙ!pA18HM.npTdp'6T>zSy .>,JI)KspX)3K^NEuӺTRW>JI+,),#3 'e*s4'Z +?BAy2%:D9R˔S'Nt$ *:.J8ܗ r}S]L~B9eodyqKLFu8=\g ;(wb}du.cR#ET8QTc.]XaGR[e78ia0LyCuSוeӱQtWgfOMa[ꮷp;?,:7ᐭM]7ϧnQ7:ރ}uUsMMx];.>.G%WN&̍/&HvU[w*}Bż!qpaWޱWd1_/5vq,;?AWZ$Ĉ  +endstream +endobj + +593 0 obj +1543 +endobj + +11 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +594 0 obj +<> +stream +xYn6)tJX, +$@O{p MI +A7P)b[dc: !-kAofD+)ֽ\FXYƆV|7,xJdJFQIKma(Y33َdM-(Cf'Ievjd4 nV ڭ3A4kT< 0yu3QˍG*@qA4^"?%%,R̻gkUD2$(K#DVFCYFAQ#5:Dߠxp~]nWc^ R +cOJ[VvUny{ +4EJ˟vP +#o̴|ڸ!44fNHdx̠1 KRŻ$ +6ZYA\S[Pj8jy>Y` !i{)B4$o+kBū󾤸B_ԊE릦TC-NqQ5b-( ThQ)a +xp'.>V+{?n9E;GYNI#)TktXd45ʔ=%q>hjZ8!lv̺<>hn]C8TɌM3g ևXc +>g֗1C}Kш {zvQd9 :V%>R2T hsG-G:˩P\֧ǘ Q J}}jĦ1'd3 9Bss"D +7Z!+4 1ڳiI,&#t=ώeCu.п\yq#!._ *B-GΛ|iL2B͐GHޛ7}1o5ݯssj/wO_z=\m:> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +596 0 obj +<> +stream +xZmo_CrP iC^qmS(htHO췾OgݙN|1ggg晗]2|U󓋟FWw_]I2;<< ]Y@J)sIY`0gκyQaL@TRcLDVWtGXXɠ1SG I6]sJ4KVF'ڀ +mEB% I&-ϊ_a-"0I@G,bYD,bK_h'G,b!FEX;"E""=B F 9η 7c㘛Dvi/d|-Gb5!tELCM+oQoZڀb,CQ;!V_ bv.ॷˈ,b*,bXs!,bi!C +Ev,"1Vר!|{RN|VҾZ|\_C)֏wW_78R +?zPU#E_[e<}kBE\@2r|-O>)I/U75 yo~K(p||+e>$Ksl?ݑ1RجTaQ&{[e0x؛dR9[RN/˷ meXt6\Ze ΘLe/:.¬[,'r/j._{| s/={iآggZMڼ㝅ii]9yYaKfa0iM8;ع)f)idzN zSB2l,bIWjUMs ^YlHB[#\^vB|E3ȇC#ԕ>tnx^0LI@4 +9In#8Kn?Kmi2hzA-a)C_JEVJϩ n{)+T0a1=D60jVF-zԢH-!SK{=I*9U8kܟ%xwFڱڶzl sGTU䌲p2H) 8:%ôI*i'&fX'"l%#\^vB.&4gv)w]?,8V*bu2ȬQY\^rf3t vXҕ0ba1=C60fV,z̢,!3K{=ݡF_gݾL\4iح S[˦-t邅H*ӥ. d9JoTNHNJq#& N]q!!2>J.ָח ⩔ywr {hFRG^>Xkb %GYjFT R!Ɯb^3L"Y_8 Hs8 hwIupH2HRJNC1a(F3,BudNDQ;!N{!`&/&cfPW0J.) jrE(n.%L^&!9JʰyҞ!h+=B^k䕐yŽ+N-hY!Ma)g&meWp-xIr0$B"x%,ڑWx%[WWרyg[4ǭWjɸC'ø?TۦmjQsL^ )? gVf)e]j7v&aaZp3LyvB4J8I9 qԮ,E6$$Г k#\^vBl\~=dO/d{U8 q׹̌v$mk^pVPa.FQ*i'D q'X%[UWרYe{=ɪ99çYħ/u+w;mplͶ,{ffiD[k1vb׫㳍/b: +7Et@d,g2\8$ +NR S,#l˱x Q0*j>3ڐЅ& tGFF{1z +.gEA>B^NLJoX]kEc!]dk1tbWb8w]tb j=[Aszthv{Jv]Vֵ=:!/)nr}|rc<]. +nTɭrzߛIѿzm7mdar_?Ͷ J6~?F.5[4Uv6}#rhs{hp]O 3vɸvP5ͣ뻺ˆ܂P߃!a&vr3|ͽ-pMuzuG}㮙 zn= shzSCߵyћ4\#mZڊR7bz3n5Tv%n`|[8%X0%XU!S 1*ܴ QKHi3q2tGAq̗P2;26uz3K6{HxT)CXx`eCJ +aN/&Ib*|"&[&p%z I׳gxڋ;: as@4G+a;;ll,a/d{RƉb|A7\SAzb2}:5)n7wy.pMu UUkrd88Fd?s[m1&|f! +4| +endstream +endobj + +597 0 obj +3061 +endobj + +13 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [598 0 R]>> +endobj + +598 0 obj +<>>> +endobj + +599 0 obj +<> +stream +xWnȞZzzZ#A -ͪ8G`4gͽ.\&-D +s9u2<\/(8'<Bfp+}x``gF΄P Bwϴj\`;\&"b{tń7LqXd΄&Qkv(budOqmBz.zG#LГI"JkAb-F.mf"b{$ME /|ZvB kAb-F"]Gl-'ۖ:] )k[dEs4@h=0ºǩFY6FuSך44{;8fG?WiCQ<6M(US\`|g0-aM$0wWػ"wJ{!F $(EtK*e~1!=4ermI&1:$XJg3eiCY_U[*d*]l~/OihKŀ P/wX?gTzR'G]Qd/ +e 9z|K| S݄J$()u=h+6Sû 0/7ˊUW.Ym+kRfu3[U<'=oU\>Xm~ "}x=Vf|*l>ly +N|TU?'ZYۺ>2̅=ᅝXk϶4juޣVܔaIWmK)e\TiJaWP1grTqm~b%ل.md|I[d=P/ۿ!º>!3s {?YU4 +endstream +endobj + +600 0 obj +1060 +endobj + +14 0 obj +<> +/ProcSet [/PDF /Text]>> +/Group <>>> +endobj + +601 0 obj +<> +stream +xYn6ShF 8,@qEVn%j!ۏyDR{ Y_8a4&ßS +>zC6lTW%-efD=`Sc]&FJDF=)fD+3!E 6 ׈)KT 6$[VnGb#{-fwiPe<>q1>~"6"zFz>!qFlASoEz #6zu`y<@xBXE4F |{ol}x|J#lL"()tNIqR(Q.e%RHM/*ouwu +Z(4iAS2|p@Nr)/(jcx(H]Jgkp3R%V~K8sQkm:gٓIFUOS#\~ɤB3w7.LXqaP 7 7=|cWCeCe;)]=[3Jw҅e#Q3Jw&zA醽j K6\őnH}ǎdȕP +-Ԣ]<1TXEqR2"LS3dNq7*j'LT:<_.L|&<\VW(H5mf$`!8OIW$lbǬsc~3u9oyng]r^\K~:DuyDppYC/W4]CuuYQzh{ʚuzZo!>9/ /KuQJH1zCVmϰQ +Bi5Hi:]Y6]u󙅗N +<z;$j6T"Wѿ\ aQ՟-88pEjnk^J;rl(nǗTY(S}$yV\g# WUݑ׺iN${B]/p7NEr u}mNkKz +~-\[UN^_m@\w/M;4A @wGU*r`w+TyQ(qysP}vU\뚬j]Ӹ*.xᆇT>t."z ,OK Q_|5x̢?Oe b:7贪6X{3Y !Žg7!뭂 )f?3"0Rj;a0`0DDƟ'ۀ\d91aSͳskS`kM(`ņyf(+z [L4 ykRxx?dI0H ++J8τ$ÆBe%$ xj"Lf8a! i!U((I{=O9;S\>ɸwB 0<^ڵdTDfM}pMw{ vbc#b{nˬeP{a<NצW{8Q&US }:}{sX\?`X" ‰ڠ]}_Nqͳs'݋~ѿŦá")1ߌ?m5a.Cna:h a&["< B|{O yqk2Pܺ'n>@8\ƫqu wWV#/<֔ψtlx=(̋! +endstream +endobj + +602 0 obj +1931 +endobj + +15 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [603 0 R 604 0 R 605 0 R]>> +endobj + +603 0 obj +<> +endobj + +604 0 obj +<> +endobj + +605 0 obj +<> +endobj + +606 0 obj +<> +stream +xYn}W\`Y""k$,kP!9U2 ri*96=uS2ORage:}O%r3g9\$WC(EdO OsLc)G)P +RN JT[ +R_YN:e ̦z`Jp&ظ`Tr`u?F69iRF`Q[(JHja2 +'قI-tJjXds&Q*MU`ua2t9, S. łTM.àG%}^{@r+y+)(OsMr|XQt伱2QX2\'w׮S +N+?r1]}$m̏xl(2;ZD֝#D]C\t]&AWөC: BN{hkW3ή=N K=Bx0{lM5-hahGR؛VCe=Vfd?~vSG&ƌqȓB:`I+UtiHuy Vtj]өCqX\;^GDJVt//OZkfSwm}}&Q~fy߰ejh}jXտ4-uT]wl-a0<_V3~x%/eN: SՇZtxUh؜,#Fo)t}sk)0ʒ!a}2:ug]Y\ |ћdSN{@;"t0N,;<2͜WA(H푭;GE+?^B׼Wmwa؏mJ2&̋-ER +֘sI]!cFR(1vsܛ} c| Pv)_T%q=n7L4z;B{ϵKx8rg&atjHJkOas1]Z 2D|N"qmݙ >}<}9}1=Y&60-A1;Suï=ۀsq կ'3bݱn z@a fʴ.]!e(G>|n[yblǍ g6 +^4fc, +DjFgC?t_&xjReMFEZ3y4fXOrzG> wO- [h"QY8ڒ\aJz.+9-b:짶b$\.niQgT t-hO#.KK+# U?@ /fzC0V\q<*[Xc+YSrPnˮ\NȽFՃdN=o"4`˙b*ƅ;q, +endstream +endobj + +607 0 obj +2483 +endobj + +16 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [608 0 R 609 0 R 610 0 R]>> +endobj + +608 0 obj +<> +endobj + +609 0 obj +<> +endobj + +610 0 obj +<> +endobj + +611 0 obj +<> +stream +xY[oF~ׯGg0/@.6u[@AS#8T\_!g\Pj y\|2E25?eSpf0ow4=D5i"p^Jnzwf{w?lPf BEdVab deA*XJ1ƒ,ROT""*Ƥ[czγDe2s b#4dyP/]U,g@(t^NgG^^IყҞ { +뒔\fT eKɛIMń@0I1^$P^߫?j:ˬϢʊ\YdZsΓSDJs֔\R8Zx"(0.[$ [:DXfҬ +68dy[G~KH\jEKԺL$.$Ev{N$d<yN'ʏڈKě %KDݮ]ޑ{(5_e!+\DdyL "S$rDYeX3Me0LF[eـ<f0^$a [ WVa9t9,xGg:YO0+9Ϙ?bbmLJ&3sUY6`3eGi +qH2Y80ybWY 0ۀ] !g3'ͳct=/F0(;Rw.;:N݅B¢Ȗj:e0g]Ӫ0]d+pn3(`o +D$s9ܚGh4`uh]eG-tE JluVÂNzg3(R-LAQcY4o z"ହLׇ[oH QU#hn.!H$+CUs5xs ٲL]FAFBmK:֤UM&jxXXR}nt"Ӓł +`IȯhaT^`h蒍JrJ~X2c뒝 B>cg]uSlWǑlݩ/j8-C#ތfp(Y*Nt=WZ7_&/9~`T]_4fg'pUM3^YD.B3PyD9bqCQ'9>L po+#u@*/Q3,R70H0v,V؎ξE/ǣFE rz9HdgZX V݈~MnTpn&,y$ijb2zK3 $ ~AcC!J3,no: +endstream +endobj + +612 0 obj +2191 +endobj + +17 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [613 0 R 614 0 R 615 0 R 616 0 R]>> +endobj + +613 0 obj +<>>> +endobj + +614 0 obj +<>>> +endobj + +615 0 obj +<>>> +endobj + +616 0 obj +<> +endobj + +617 0 obj +<> +stream +xXnF}WRd8H/5Y"}f\.ڍ$-Vq}ohZ?XX.1!`" t X + B87L$+abL8̺V<$w >(r].$+aeu[!-8R&sF1 ? c=f qhL8dN{XMsX)޺ɒ)c=2a c}FsY;272A@Ƕ&2±љ5QI.d>@$\xvWs{H0ڊ .$ce<] xvW8{H8zڝ00I &o2c"3,\w:1c&aFtk @Ȅa.kgCv i%n#tvZoSJ}n^8m\]suiP Ǫi R~5:IG4iun^ퟫ[?ZVu~AiִU}AվTUmVtNiNvQ[!͓%2^jwJZת=պAթm6~=Y>h=ZZjAXz VfNǝ (.Z{2t g؂'Û*9Jݭꠑ w&2t;'3{j>]~Uî:K&OifKЦoa,UDbbvPg"f@L# 4YʖʇMO?s-hh cD[K{VFA9t Z]@/^h*âCEnĝ%'0Jt$|Wg5$UHOx{iC*OŽj 0VMN8*)L!T V>DF3Iԑ7u`ȦҬݽK%q8˜"84ޛb]sa3wY{|7 Ȼ%u8fB>eȋ"Dxa;/ ΁yar!nc;'Ӄ=öA[A'}kvs#3J P`+.puj+ayve:Y|O$Do.p*d5ߴhb!e9bxp.o\DXک({:橒tȩ#QRkenHPp]\7L`m9bIr +5I01&ljÜm5 /n}i3 mOgps$!3/-{ХA7:.@г9NCgq9wGdG~}8AxvyL0,dϘb} +endstream +endobj + +618 0 obj +1674 +endobj + +18 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [619 0 R 620 0 R 621 0 R 622 0 R]>> +endobj + +619 0 obj +<> +endobj + +620 0 obj +<>>> +endobj + +621 0 obj +<> +endobj + +622 0 obj +<> +endobj + +623 0 obj +<> +stream +x]Mn0bi.4i.Lm嘽Q$$Ha|1tA䡯Gbldca0>oE(·K7!c**xY%?Rl٧ۡYg)'({QPqʢ,}@;Rw;EPu FTWu8U` 賋 +T%7p@/7 Z wsx.W{K>taw!PLw%9Q),HƈW.A l)NM3Q-8}Pɦ* +IC#IXbMK9gŸȮęk9;A{]ѹ×%z8 79i߁7F.6V +endstream +endobj + +624 0 obj +362 +endobj + +19 0 obj +<> +/ProcSet [/PDF /Text]>> +/Group <>>> +endobj + +625 0 obj +<> +stream +xVˎ6+)&ޒ4A 4 0@6DL$%)~P%M4tc[<>eboiGa (xX/E"ߋR?G1"B/鎬2/^> +.6Fɲ-ZYvQ~ I #WGO2De~b +|BAɣ(RmìgwdhvwĚsE40JEI00 qkܣ57M*iHnI4 ^H#S3 g!ХiM߹. x9ޛmΝuۦJ<gB\EgJ~M aYlc%G62w泌(JVYDu-fĹ^Pxra877I_T_%Mw`eS%[ٙ.@^6S >Sq|Ή5j@5AYk8he`Wi9+6ͻ~(GbE!Z z;Žܔ{7e&/YSNm93-Zй$' od= + wk +{}JtgQe0ZU.x7V{yV.[$g) h#_Yzf/v+Wɏ츓tuz[#PoKf'q \1țuKT-7U>BlTR^:_l> +s6Џ-@ ;kgI=Jޖzg_\Wqn+@vn͑ p%X%UP!YM,#k +nUv?7-Fˎl"L^R ֢Ƅ~ 5N/go N^|pyM p +_H1s#$!=AI&W)r/X=sey#fᮂ4f,A&G7,YyVCr2egqh6>=F$ +|G0ś0".;N%&_xrQ SC Y)cO6Az15 +endstream +endobj + +626 0 obj +1108 +endobj + +20 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [627 0 R 628 0 R 629 0 R]>> +endobj + +627 0 obj +<>>> +endobj + +628 0 obj +<>>> +endobj + +629 0 obj +<> +endobj + +630 0 obj +<> +stream +xXM6W̭bWܚiS$Eи(•h$d?AQZ.=zf8 +|]wi!h2QYW@ECU~ ?k{+idU >d0(?2%r?9/7HЗ*g>vr,Ȇm/G4 ot{$ZL*Q6< oZx@EnxwN0bkX3OtV^4aǾ/Ө[tŠw5H}&eL,oXGy)"w0vF> +Lh,i3_6]mM9ɲMWRvkY4)t)E6Zk\GX[-| +G!ٱI“M|xS!]h iapċY.%;ҕ6zZ%@YS?=1c^[RX(C֞^BrFkq>CJWSrH`鹒Š% n3O/$Q ;;z &aHl@p7nx yΫG|à=:$̉&n7Gtuu?PH{-P9mbf?]7 +endstream +endobj + +631 0 obj +1600 +endobj + +21 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [632 0 R 633 0 R 634 0 R]>> +endobj + +632 0 obj +<> +endobj + +633 0 obj +<>>> +endobj + +634 0 obj +<>>> +endobj + +635 0 obj +<> +stream +xXr6+t:*NͣcHqf)HdL~e )P K_{p?d\->Kq ;ZO\I"%rȍ9~4mqdN=#Ş燱{f:YG&u[&远Q G +gpp9IMes=ٍvn|8:p~ 'p<]p:N|eg-Pa-iKP7jV,f*=9֌S ? 3 Rn`Nkf$N1fz )6f`50čg]:> 11JjԧyѳLkv6p͡~r;9[EJ@ Il⧷>CXoWo] ud᠑ƾUVaG頒\\?# 3ByURY|yi3'TF,oXUd/,ȂAkfEKځaL%ٰ'V=kst@[;Zdp;7I67+yr ;Vh0;[ },&"WIeȖ5bI*! }m 'D*pFJ$7ͻՒܲG+g-ɫR>t#:'̊bącXAQ;Y6 rU)^(-J$SIɉ +(d բV89Andm]6o:( 鋯ltT=Qd Uⵧ;ċ|2  +M)ʛi2#Y`c 'X"V|_R="t:5c]EYN |#ЕՆȲf:˛kmafpAj:C7эv oVd=6}kU3*={罠OH6Jk X-vE!@'u W: +x<| wB3mQt8{*݁1ϢrȢH*m@olMd[π/\l_!iaF9|]{li3W!oTBQk1!/Q˨U1BfzL~hPdv`J W+j}'tUԲ͵\+\lD5fph\HͿ(B6‰DZ1IAQ +x r2)Wz 9MV@/{:lh*+?6D?5(vB0-J-VڪC՚oX v _7DWy[%yZ-ɗkf;V75U"5(83A7t/B&^C]z^/-L=8JW{2e +.B̊j +e生Fm +@j%{Fr oj!CmW/ Os0mfwf6kD^]8]>fӕB}Y *YCnC|b,$S1Lo>_BT:kxAr*%w^q8p5WO0J5T2!!&+~$t W} ta|#.ۊld_!s?TG9;[f%F~ō> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [637 0 R 638 0 R 639 0 R 640 0 R 641 0 R 642 0 R]>> +endobj + +637 0 obj +<>>> +endobj + +638 0 obj +<>>> +endobj + +639 0 obj +<>>> +endobj + +640 0 obj +<>>> +endobj + +641 0 obj +<>>> +endobj + +642 0 obj +<>>> +endobj + +643 0 obj +<> +stream +xX˒6+N scWٵ\ DB$e}f46H54=3Mh?8mrNqNli zYB_/I  <&/$./L/ ,0NlAvAmJ~8jz>cMH E(Y=wF[,zR|B,8I  -#Je`SbGl7XGmΣw^\H\]hQn(ޡ>o1VnpfџJwUѺ G'djqtWo[h#XiStL]%Ns"IutlD 34nbgjY~0yJL͵jabWWX[M}}aB;!ěyϾRجE5f-{ ⲉ6ȹ6xw_ ?1Q59xda0,}Gz\;,ٰ`b#5 k[ǟ{QvTCouZ|u 15MqU5ʊkGij:< -j +鐣CJcߣøҔ"AU}q|XN8X$r@# +'"-+xxu5C7=qHʟ/xs +-~Y3'VΈ iwa+=n3+Fk/ EsMFeǷJ +endstream +endobj + +644 0 obj +1571 +endobj + +23 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [645 0 R 646 0 R]>> +endobj + +645 0 obj +<>>> +endobj + +646 0 obj +<>>> +endobj + +647 0 obj +<> +stream +xXێ6}WqzUI y%fW l?R5r.w4<<c~s?9B&.(,yXo~zG!;Yy{(NDΧTȓx+bϿ^]ʊ4ȓ%!FZtLʭC~x Gzx=_q"D9?ݚ{Ozxw> y=7Ͻ^4'Lq`ZT[FƳ`[%tL˓_E˴YW{r-YIź ^q{ |/DNb lT3vy1)" I#8$U TpebEN5!?#G=ߤ-Y'KKb"4i9!8^"YA _59׃7xҊQG¼b9+g |V.}n/Tg =FlXšt<5T{S'Ã-t'A+yK"'% ٓZgͫTO#!'t/uK̜]\zg"-;X!=Wb +p{q8+Cn'KʡQ͂ŭ'e-X80b$ IH Ib0e#A'jy5GO{/6X$ԳW$sQz3y ^D-V#̉RNw4C Z7Q#Dv5,.`4ۿ +endstream +endobj + +648 0 obj +1651 +endobj + +24 0 obj +<> +/ProcSet [/PDF /Text]>> +/Group <>>> +endobj + +649 0 obj +<> +stream +xXMs6Wt? ԙ6Td2 DB*А_? M}fxvrC<>e$$"B|H(!y@S{ Z 3f%AMi1~4aALٵc,K1$aDq<劂u(\9Zrb#[?SO`w#p'y~UG l,L]Zmn>p,Nds0͡ގ0 aڢ#Lds1i:1dØ4 VW<4_]6i%0y*ֆ0i'ʧaIQsL 3gLs[^ mp{>b)6_ٜ$0O'_/fM=ɀc06GJp-]#7dMF-JI8G0WU$!=B{NZ4;^s(;.Ok"kъNTC +aj$[QpD*y^@DDd%nEuu/^Q7R]j"J $^kN`I~>hL /^bbI (A7\{[}(r >&u?wګ4F [$ȹQϲ-ᤅC/bJ- #n\b\-)Uѝ>\KUDSWiyHeW@h+DsmDijT]KMD %Ҡ^ q4j^$%ξ-5d`)rTf򛺈g,*oeBZaim1bם Rl<h`˜Vy;c3z[@v*۾N/dF^'+ZS]nY:7nͯnenDV˂|XqahTo2TWL=d+$E/ghW{UI#5gYh1P]c jj}{CdNhdq P~鷰|u3gQҲ_3l㻢Et(^zfO̺<+mןQ徂;7_{Qͧxj3?=y!1Gg/Z#tMgnjn߿" 8XőNMú";xD"$UY;`MnA +endstream +endobj + +650 0 obj +1538 +endobj + +25 0 obj +<> +/ProcSet [/PDF /Text]>> +/Group <>>> +endobj + +651 0 obj +<> +stream +xVn6}WL6- V˾e". .>Hb,E܇O/ `HP9gΜgAȽ-9>08~H// A3&,vȾF,m_|Z-l0;/Gu#Zݯ`4h~QgX,، Ibf^2 .q"j#4|0Xя|RZ`a'n-+JHgQƒ0M-*{$o`HQ^ ]ջg[ 9$+W^%pYk ֭kbmUYOs8#{nͭ0B3~ y HNi mUjNhId4ƻ&.d)Kf?e7S]Լ{=?YPtOPbPnsga3xF| MI􆽓:Ж8$ovW7+ +@:d+cj$‰ԃ@^kM7= D]+djrP_/՞|=@ou4gIж6N;*fx K8)ǶPD()9hț6/_iEMh+ 7:n5sn(*zO̠./i'[Yd?j|f 9Ɔ87 i\}(pq/:b֖QN۶h +(]em5i )K꫉J*cu1vh,tRi;}e3D:SMxaU#fo4 O +eMvhN1UU"|!ԩRTޥ,7s7ΗTq Cp\幊' +^nK $bݸFYڲΡ$7rA56xndjS9(W|Guݰ&ll3:Q7f2t-I͸,OƢn\{5%jޞЙ,hx}JrvlJtq|2a#8K&L: Z+5X~H֨!Ȗx~:ybw_qsGfu=~ЅXO4௞B>r:t"ɂOtA" +endstream +endobj + +652 0 obj +1157 +endobj + +26 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [653 0 R 654 0 R 655 0 R]>> +endobj + +653 0 obj +<>>> +endobj + +654 0 obj +<>>> +endobj + +655 0 obj +<>>> +endobj + +656 0 obj +<> +stream +xSn0+7Ŝ6MU=-+D3Gv$ M.3$r69|L0Tstc`DIeBEbz/ `Hz'_dgzDJ SʷZ! H>?dtr>|%tӱBR +R,g<B1~[Tkྐྵ6<@cNbVg!T]wOuќe+ *hwEWWXh?eg- +endstream +endobj + +657 0 obj +497 +endobj + +27 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [658 0 R 659 0 R 660 0 R]>> +endobj + +658 0 obj +<>>> +endobj + +659 0 obj +<>>> +endobj + +660 0 obj +<>>> +endobj + +661 0 obj +<> +stream +xWM6WQ) VܶHSlAw"^hDaO$[ni{Qly?%G_HZ.6?-BʳMv[G$Li +Iqd,/ dfH2'Ic`,e%E+QF<~_P(M'IL,L<NH]] }|@3N_sJݖAm$|P뮖+I>jynag$ZO]ud em1wH湅VQu `M(&Ȧ0cjA *#RH Tg`MtlU{ +Xw B9b +YUu\NFi {EJڭR5%(1Ra Ŭ͙Q,̩3!*@p"J*I&x1'$4E㉶ΒFFv-.i\QDNns{l`=~|惞@dJQGZ8UO.fx磲^+Y&Vz +fu OV*x؅صBP6'$M9yVUx܍r g1I̬摭ک!TnomQZȗrڋz6Mhm0Wq7F௝lW]Y(%4sn_6Jn䥒3u <j\IK܈cU1k5;die-bk/<㩉G'4K.v=6U(wsq{zD`ioK52^)w.ݔiD#O[i\W]!ON-{oufu7tl;g[gE#j öدcG߻ָy+,߮~VjߪQp)(8'FWJyحȷٿ osiOa^4"Yʓ>B%0[8Ae2a.aĠ{NLU*?Tot*WEFyl'ö + Z +endstream +endobj + +662 0 obj +1400 +endobj + +28 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [663 0 R 664 0 R 665 0 R 666 0 R 667 0 R]>> +endobj + +663 0 obj +<> +endobj + +664 0 obj +<> +endobj + +665 0 obj +<> +endobj + +666 0 obj +<> +endobj + +667 0 obj +<> +endobj + +668 0 obj +<> +stream +xTMk@W)foY=4%B(YWbw?J-* fޛ{>EdxGa0qQ|Xn ~>cQDMx%b5o l^7=J3_P(^w(T G.-XyeO8Bi +5ZИUWrFQ?s/ѡ4m*4ZI[skQ3ؔ8%/Q4m#[jY>22[eK0U.s)w5a25}}[ iZi%Fh8SkxܤL& +_Q0ˆS?BE׍Ix͒lnO^+ZF, jmN$ZTUW@kBHْ[5'Kg:JxI<`QtBQΖޤRyY?U&˖T"_Zcok\~!oc֣kGzzUXFI_urA72x`Jj|3 ,m:9uk-iZKW2Ou[@(>>iZI#,e<2Ժoהj0z%fA<; +TM7 Ӑ(Ow G[?ޒY +OG-qd?wj:OpEm; OtwpgAfGvѨ +endstream +endobj + +669 0 obj +730 +endobj + +29 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [670 0 R]>> +endobj + +670 0 obj +<> +endobj + +671 0 obj +<> +stream +xWˮ6+f#iU޴( %d&蒔]f:$%KJMg̜9ϧ?hޥkB6xh;^1SEKd)ǒ", 2Z<0Û +3szI0EEs}]a?7o!SШ WӳNP )t&^C +!Ǿgz䱗';?P*.DVTcf|A+=B#$]H,ν42X%̾qp7!?g)](Ņ߫ V(U2NCcU%^L#0z^ngAEIh{sNK0R$B+x-R\M@-.]{/FB"1Z'<1j`T%0`>_F +x1N$YKAtQ2dyݔ,aq?$u4^\\Ԭ> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +673 0 obj +<> +stream +x}VM6W)V[tӴMa"%K.I!CJv̼*$@ȃn=^8FEn8ݞ0H:$[B[vb Sh* +v,~ P@J$΂hJ u4 +Iآ J +zm_5*j'qxa^"E PtZ# 0yajA;" PHr _~7` /(K }pQF]JzT+2FYMZ j$D\Y`%S5e`TÁoo `֪]E efA!fϵ5Ǔn&JѢjM/&1YVz+U%ӏM9YGL$Bv Ia?A#K< 'ꠠ-`ZQ?6/ }&n$őKW8pٚZf2\c^={!Yg$<1MWCȴD[E'Q_AX5@+nV zY4! Vז€%E:g*b\`$VDxhc NK[|M Hj0+m7Γ3Q')ll:>`7972\H~\=j:ikUC7o8M=V[}x4nRyACSxmƥY$s[\(' q6Ke!(TgЩtcע|RЅp h.(LUE,) 78 +ڹvV{ -^]{ٖk|ˡq quJb<Z9G$oOlp„ٚlFԻbn+0'qqB,Θ ӵɒtWfo8=~wh*,).gOWYWX n$Z \8?-|* +endstream +endobj + +674 0 obj +1101 +endobj + +31 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [675 0 R]>> +endobj + +675 0 obj +<>>> +endobj + +676 0 obj +<> +stream +xWَ6}WGpT-6o Z@^h9ə/^Z:yAL&d(G6693?Q&W XYI Xg^Ĩo^7~kd!YH#yþ60C$c+Ֆ5w@:yb o쵯fJh=g).db!lkc$ĆBΡ|TMC]FoˎvV +B +&' )b%w.gQ6E=Snkcpzs{;1ERMS|\a>9Mp%ڈ^@2FJ>R^CLB9 knά56>jsW#->is@5t1;EI.> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [678 0 R 679 0 R 680 0 R 681 0 R 682 0 R]>> +endobj + +678 0 obj +<>>> +endobj + +679 0 obj +<>>> +endobj + +680 0 obj +<>>> +endobj + +681 0 obj +<>>> +endobj + +682 0 obj +<>>> +endobj + +683 0 obj +<> +stream +xXrF+H \(rUNX+6 0(C'=x.˹G% +3;%xQwGdIf?ܴ̈́D)OL%@IɅM+L ^LE<6qĄP<њ"}!pMYt_v%\iz>E4ȴ +v~LpFQaf#1ـE䀵%"t߽ұ!MRKG#PDty3# }3ƘƦOEșcCwlc16ѽe&짺1WC݋}ZO۬^1o=<^0#*|!pp\(a޻}@Me!}ݖ1(򐲴[<{F(EKT(#pkw 4bڗ=~-)0 %|,L kZ.N Oe"]L,5(⨅K#=N+09M8 Ui&Z y)\њ -5$*Q/Ӥ* N;*Gܷ%\0V;~9"U9't$'Q[46IuuC6h&" +k}jNTG* :mP-?([<7S+0n@y+۞5-`mXEv*H{d1vܱ<Y<ild ܉^Dp iOAiڭsPi"V軜2Kޞ }NCT(3MUoη驥f@8]-6 @hi*8!?:Ƕ+=띫T{qk:/ b3k}v_N۸ UqeY]oBb=RVyOoZ]ָ}586kٓ[eڱMlO? 'Փ9PbwbrȚirی5QkWN 3*OhȘĞˊ#.lj?V'D 8UBT^jKb o*Dzá*UKDC[5cUVZ"l=8nRIEu{q5g]蚲_9nϤ'yy1h} 1/ +u^7h+^,tNq|:3[@ _婫JuilՌ >6sk桕"AcN6uMKr] rOHF+iy xq@0@MV[.9dMZVEMn5լlB˩֋L$XiҴk%u<6S7h$ܰfegDz~i-#_ǼΛ,)[_>5S*l[vVn`0߬9hvD >pwb]Tf"Ca؟5i<\782Fpٿ2N +endstream +endobj + +684 0 obj +1557 +endobj + +33 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [685 0 R]>> +endobj + +685 0 obj +<>>> +endobj + +686 0 obj +<> +stream +xYMsFWQr{0TXJ. E)$`f w"q^@\?vX1~r*>hj՞[m=ӕxɍ3znD1ϝuIyeLB¸JJ[dd2]aG*.b&+v+cֈ#t+*!Q,#32' +R~NXfLNdԥedXƒb#İkd+TW9Z|cmiN O4RtD̈c"Bv+b{!dLlk@Ȍ1&bDN]^WP=L1)YAQ TX#Dv26S 1š9:u)\5b5dZy;sBT'.11 BdF^ j +jH1E)7!2#F,*\/z_d]bԥs22S,c$ֈM,!elbk7jXFfe1 2_c-xXK8KfƔ&o1*,"3bĘ b*vcG1ͩ#DH + ֝)U$A\5bNd'Q`T1,W)֩KedXH.v &Ea[~uCbh[+xF-YeRJ5Z)a0Vn v8*%*qg}ȪES&SJޛ F8pד|yWo7}̚}zlS}>,zqL"d{z_glNOpCN(޸d4^!pM{!wTzsIlnhaUBLp?G ۜY2ش6Ǵ4:MkZ==noqSlfy)7JC[9.4Yzb&p#XJyd.=i׍h.ee'nS@ Øn<}Nqo  pz%[ߥ|d{`[L8\K?3AdJT6uye2o'P_S( +UU6t7ih|Xe5>6tTKwU~t!cڃw؇ɼ0߀'G& +g0#r 2vr~ӧ H:<.۞.J=, +endstream +endobj + +687 0 obj +1861 +endobj + +34 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [688 0 R]>> +endobj + +688 0 obj +<>>> +endobj + +689 0 obj +<> +stream +xϒ8jM++b^sBGA e=o;9GScU0Z2]ՠZw裐"Tx➦i3Rn ۲I5irO' L)`:s;Uc!;_/s 5<f~+sc +_6[n+qfנ0 R^,?Xžj#}Bݴ +cSZ u@GTp$h@2jӭL965-pKʗSԄZH-|/wCz +A@0'^9~ vLk~eWZXrU"*H- *;i3khrS?1OSG&Ǎ}b-h6gYB}AŝdK_Al` f!? { +endstream +endobj + +690 0 obj +814 +endobj + +35 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [691 0 R]>> +endobj + +691 0 obj +<>>> +endobj + +692 0 obj +<> +stream +xXnF)xLٝAɒ8Vy̾QY.KTkC9T+T_VAuWMfSÊH6ʩnxT :L:̨LECd3IrLdG|Me}+ 8"]KTeLܯ2^t\ecz<*R^5Qv^[4k CEBݟ +O%SI& D}n>HJO%Y^djXqL†Ǝ<Hz g p5i +|#_Pt":U˷#UU./QSaf J#m /ML_wf50##Cd=7dS9h0SH-KX :ۇcE2(ڥh̢,7uC %w[kp@5|W?5D QKSQ̓Gt Rn# +>Eo`M\ _\jld=m|14 (i*[_a}a C(E[n N9hbC$0qRrK.vT Jvn;6!  ;k%OVi)FWv~jryo_z3w315y)tguW^ެ?=_կO +H_%E>6ñ=cg)=TyjO_sv f`wL:޽/S{;m{>~*+0{ˈo~ivO7H@p?W5ݗ?/! +endstream +endobj + +693 0 obj +1372 +endobj + +36 0 obj +<> +/ProcSet [/PDF /Text]>> +/Group <>>> +endobj + +694 0 obj +<> +stream +xXn6+-C_EP tuQJnZ;n{u(J1Uw_x|̙9PIzYo}Eڀk9ֳf21PV:0Щ\bZVX)t9~ i#O3 vQW)!Hǁژ&]RU0"awI&]ixv,%ӅzZ>wKV)]SfT\*)9͟2@61Dq~nGrXTҕi)CmJ\6JtoZܓTk1Ciyv&АQr +$` 7gql}ϸ Βp`=t7UP^5kQ^wpL)9B6emɏ!HChXJgsd #7҉@ NX*&j N!WF6:K=-@ A2JBC]tA JC +.FO餃 ؕړ:|сHx_a*39g726®kTu_FI\~yP-XeR&۰me I.DM#uQҋ&Kfm3<>3Sg +D_ƍ 7+bagIˇ/Ros5z̧{zXXj~h)/Mvj Y<b/ ZC#[sa&mpCHEYOR::}^A ZHͤ.RPѥF &[]&I:}84$=Nf%`+p"Ya>vYm-ʼ?Mv*ݥePTw[ѫ" xR +s*#(1zST|.,M(-3R.;-N)T'6ܿJL<B~/<oo`X[l=GAFpvI/y苤<Ao `>ɐmEs2wl4q*4LnBwĥ[FC. oSRqjdoUW|?0yonz~+>@^(<~ӔwhG\Nj#v'RLJSIzH +Re]%ě_?>v;A\x>toM-!$~{'mb{ K΁=Դ +endstream +endobj + +695 0 obj +1282 +endobj + +37 0 obj +<> +/ProcSet [/PDF /Text]>> +/Group <>>> +endobj + +696 0 obj +<> +stream +xXn6+L@RAď E[qcG.?=")ʵI>H[Ub5{㝌vH)]Y~RV^uQN]twfdUZ +L1Qʦ1YXS)y#y)1]iS{ٳن,F֌mF٣E1EÌ._^*0I>aDuEdXKW9{=R*bZ>]KU4T,""ƊE22̷')GZѮF<-G?̼OϣwHJPI%RrW-~OO̜ k$Hc јД&x L2QNF@a:ԘqNU:XCipGi*5TG6LilUſ1Rm>!!IXgN>e7kj&UԌcyISuc]$X66]H>nq螒4buȧV٦('pБ25CzzoQ9(Y|l;<\'iS +D$HOE\!IZYtc"´"7Ȣ  z'8N:$u +g +DHAo)qLn Ǐ\՜+P OI&WuM"0 zsU|E^ kb`yuqn^ޕFɌ-j8L*f mRv-rjuic +*ZS͎&)f߲o +ROFg1ּ6Jn9?EżwMm*hU0-k +E.N8&6H=FIzfSNAc"g5n$\]AfZ:1;˩}u--[zuhm:028R;x-OFWNb՞xwVG¤6S{R>rC4bt"yĭ__֋u,Zv Y|;qWb,9WJ^'شNlٌp/mWxSGe!oT^5Cj0J]T,v^}s-+|xHchd>3߳o|0|ˡ=54/ 3ۊ Wa2CUkG1ius_\|.3~~Em+/vw +?/ϋԛbu|բ Ӱ +endstream +endobj + +697 0 obj +1517 +endobj + +38 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [698 0 R]>> +endobj + +698 0 obj +<>>> +endobj + +699 0 obj +<> +stream +xY]o}ׯ)E'8]( +h %$~fzf8_8s;4+(O{@fu- 7`(>%VBeʈj(4RpXpKʋFD/)J]_Z\Y \k˜(*)*TXJUSeIcN'$`m9.df$YiYX֭RF(3D[&U4gu':e,`2aUYV|ɘGyf -y,zBr31YY~u*R.Ȃ1YBFKYӲŲRš)4, S(:G$9b0#gNŜ@ch +9$!C@2# 3bez`뙲+ً]0(bmTۗO6`YYG,g!c/e*kY!%cY0汬#3de8NW&҅J5ljcI ÁF֨BL1b0#gOȄl$a4S hX&̈ey 1<[{%{Q "& +2ҔK<`cYYG,g!c r24mކ2uRzBNvqC0v|/ir1ŗ ]oWp oWTwzG'7oٸ;@YBoqĘ~Cf])y\<磨hH;xG5Hs:4z4U8ZOWcA?64[rdWpؓv?v8".C3v? 4oG?l0NMk +o@}趤4v@ss<!wC4ntߠO͖5-0];HUp:AiiWmyLb! $Θ:vlhOsa4Ke1i €?qUZ[+ΪJ-A}^;kl#ms[+yJůdl_w۸.1^jqɠ; 4B;.JԽy*_͊+`!Dº/RpȞ,yX'DF[ń1h@iAu*U)V5`3 +X:Xϐ2J}ƾ`TK33b +fSep&pI? T\Z +7s{̫Z|3,5*۩ʄ5qlu= & Vg߅d=T!k1uTPB^׫X*)ŹmhFv؝tjrui.㻣㮙H.?>LjЁεLoL^@J(֥acsv]%]Nv\ .DLD3BQ1*Kĕ|){Zl1BPcyBp;.?A(JV44`[cZ_I!{V~fP5 ͹M C#vx0,#S$1$a21@ФUK}N`e +%=qEԃ"ռJI5\P)-eXiX|z6ǂ(JN+xw +-V@Q~ 1!Ki`KF"D)_/GVUw 0.d 'Leљd]yU! ,րu/Q".4 zor6E[˚~K=yqKmE4a[lU[Lfg 0 ,~){2ֻ9늧O4ww<8É]w|/bpGHǗ*\*t +0-*I"^j^#b!R 2Eդg3,zX{fm'_\PW8-*iBԕBR:Wu8>[ 쩣q>@~87ֵ][ghWf)SͿ8PSom_0>,Azt<S87s=5{rƍ=pLL?C7oHzfw`ι+Sk|i~5tk?w tZ8z._rm.I56|ͫ> :qBL{v\6fpQ{*e::Z\{i׸ +îOA_;oD9C9X`t1 ÿXe-Y +endstream +endobj + +700 0 obj +2485 +endobj + +39 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [701 0 R 702 0 R]>> +endobj + +701 0 obj +<>>> +endobj + +702 0 obj +<> +endobj + +703 0 obj +<> +stream +xKo}n.H6HAδԶHf~TE=KU]G7==lj>U+KoFYR.܉˅#er&֑*!L^vk{Z`2] Vs-er c}En0"dDdmhs:oJs2WI->Y(XU.@t [(́P<ꓬ(^*BĢb)"d5Z'dYo"?j=,Zue +GS0Ѿ.i#?1 )LdB0s-e2ƫR&Ȍ&2"YNͶ^h7^^)]XfP.mNM@KP,OiJsfP[(LWuMBFQuBa[+N펔JHJa*PN&"32RȰ:!s-e`T֮&Y|ȄȌ&2"YNHmoR=,݅btUcN,KdXbasuBbQŐyʕVUF-KdXbuB?jklZRҋF׈&2,/^H4f ÷&Y|ȄȌ&2"YNɶ^h7^B &.+mR1+UR,52lN^U,32Q: _Pl"M5uNȲޞuUKg#e|b()6F$BdFF +Z'[99R&*-a2!2##D"MWP (mLM`Jܩ}b>62lNNQ,32QYomikEŇLbFV Y-<>,\7_>N}{yKwennt;kr63v8=6/C`Ǧ^۱̶MΧ#{vH4lni0txu{Pb0{vņs^~;IrLWs5B? 'ak?@47'Tk븾(\J\hk`ROp>?kp;Y:~WPBZYY7:`ȈQpZZ_7@kޯn#d%Ol!4'ovœc}W Q3dv:!kX ѵ} W !{Z×\× S??_ Qڬ km*sT{i5heahnRº?֟BkڹKeG Kj? ?(ƧǐWv0xck6U|2uLUa*>ds} \81v!l~8Roa ]VG4\*ڏ1oGv +!،C> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +705 0 obj +<> +stream +xYn+jb`ݘ  M%)R(YIl$.{Ͻ,dwU[>gP˨tE)ˤS"+`UV%_)&3*PʳR(C+QXUu b X(CRLI@b/X!C@4,)̀%)s "=}gB.20#&J'2J>/`9{@Xyۚ)b1,2氤3dYo(9.E*p9^$0:4]G&oӇw]Tp!Y:$<Ԟqh grnK&5yI׏&/zSH i+B +.n^+e-7 u%l|A_Y+%~N%7+_?ԗd&T9}Se 6'MzD^~77mgD5Nk-) 7&Lgѹs7ͭFE 5j3t=V.G/GUCϾ"<&>~E&8w{r{DBk8ԯ-5i8moLjNEF:E|rYx^4 ޢ$ !AjIN_}쉑ɺywvگZ1MsDFG}-yt`kyg{;',LzͱnG+wCs>~M!ZI;}FZnjLH]{ +9 |p8.h&ȡa3;;õszI37LӍ$eƻˋ)oXSi!Ud%_\krfZdAȇdKO%G~$aQߚh$\ f+/q=xU3ӉInOq!4Wl&-a4S="y +f3/켲Wc +'Cԁ="s}kG[[\q$_*0`ʔl3#.H6C{:oE6ٶ5lvMꗡBls<0htyS]v^2xgݽak2qF=O{ +y{dN7:ܲ6o&vsżhFp=+a;wgJ/t/ Dl~ūd S=AdvB`Zdυ=}D31fc1jϞ E3R_%S=TQbJ*ĭ|S &3.l-v i.VRUqò2Zxh֯+Yh֌|mB- /,dWpfAJkHk8IxJ9~H4Az=?;#kW w 3nE}^ No@nFm֛Ogl тjA8 +endstream +endobj + +706 0 obj +2022 +endobj + +41 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [707 0 R 708 0 R 709 0 R]>> +endobj + +707 0 obj +<>>> +endobj + +708 0 obj +<>>> +endobj + +709 0 obj +<> +endobj + +710 0 obj +<> +stream +xYnF}G%p,I-LKb<3Ԓ3 Ϟj*$O]z̋ݪ)O?n\q. +, u*>])M8E!$Ź2YTcN-dj 391U4iXL6dJlJ, מ!&躧E=}jhHB5C/kBAY<2@^VEDL{d XaeYR|vx)y<2(b% 9[S*Tͤ%Լ(U$I-^:Ȉ`e"s.jOH1"14GyVTyd1euԞ!sЬ1¨.&,6 G.%9buYQ⏑|ZdaXF̈EzE 6dĤA1Ɇ ր!ѣe!3D]'Ms>1zzC >ZS||߼9CN",#3jOH*J!dr,b3dηkP5h6TAɮ74M}}:-;[ieC{=/oדr,5PL!RLrڔ"[O9_qv1# nC?<{;X٦ovc7Ndfߢzɓzg?̠BYSVes맇L=  +:S0pD] q`>ք4xd)&aە@/B0[מ!&<+bJaI{'dC@hkQA{AWboES$Oi,ϴW:JOtFFW\\su<"go݇#k7#\G`оl =l@^'y WᏘeqrJ<9xY^)pK׈gW>S:\_dOQ +om{ܢfaќqKe85ߎȶoTE:-kSOwp4}"5A:B#ƚ4ruCGpWRJSSf@+RA{@ *@ 4yvԐ,I& fz/qYp7*!An(q&2b I"yim6vj=`9͖Re?CfeT qUQ&*p#T+ h 4I&(Jz$Ӓ9sK2Y(Jpss`졶>eŬR_!b\6ͤ˰zܵͰEeKL2]+eNtTWlۢٽP6/٥] *!tD5wwf' vNYmE_j#ⷸ0Yno= +endstream +endobj + +711 0 obj +2455 +endobj + +42 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [712 0 R 713 0 R]>> +endobj + +712 0 obj +<>>> +endobj + +713 0 obj +<>>> +endobj + +714 0 obj +<> +stream +xXn7}b84M˒ Hj6EkҌsAOOfyq'r#ƙaaUz8e# dž'3~*)FZZPQ$'RUq 5_ZFflKSˌ \Kj +fD x4;c/"@SbZ2{ 3"f#X:\ oza%SDGTb#2QlB(e5a/B% +DvD)DE,(#X:4x,Ҝ:u.kᨩ9/kUYjeb*-91魒 )dNX K3}(SA>$V:3}H!sŠLX!^ *rAY7RwXZṬCMb#VuRq&)XX$ԹT(6bEY',G doH91pA2R F`ܮnl~q!w6,MQ#_sf1awqC4X,rqVX޷~?&/oɯuOͣ H_Vy$6'0X]+@;ťx/DZyqQLq.=sOn ޛo#|;a*.՜?CS/hXƑ)7Xd,*\:NSf#GY.'*:,V#{ĕ0: +\}&lE2;>D5|j2Eud/rMV)Ihz3UM@3Ӥy2nju[5c>P䌫>U/ߥ?H0E |lWjTE8z""믨87ZRn- aؖ8АL+l xuck +k`:^*ثrʴ5s&zT<)0\J fɨMA`}Ȳ5b?QI7ʪ+tJSrP\}BiהK'\hpa? +n0;)#N?;I +R +1,i~Yylj;F `.4/fB6=\q}_ح?vuۍo]LH ~$#eC4s?z怂񒀻ɞ1Ae BۀJ8mFjg2 F1k$^p3 %Ƥ*\5a(QRԉ@lzQ5#Ŵ҈SHB+SV)9Wx>gw~ 9Fj&U9I5.$~ۓy#mo2t8 0d_Nfu >)xL2Ӄmkh0nt ge=ǭ1X/ .Ya09JOW7]A_+; A¾$-U­/1}KViw]mdH( /J>6R x7!y +endstream +endobj + +715 0 obj +1786 +endobj + +43 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +716 0 obj +<> +stream +xYrWrIp?+H4U*%m03M @Qfi?9@?ckdsocXFh:~˧O)ӗlnLTbcρl9u+=ٶp +9g\̏\fytۗmSx1q!sWm߉>!3L@>^h lin @ N38 +j /9SOL0Q+bAoݓL03ձtۻ_(%b/ FϽi6v6 wU3rdgcۙc^6jZ_Av.Zr:%LAEI,"G)s/#}qiUVȈTxI{cat +l8GvxV6"EMd/y6%-H)/wJb-M4yMН e$ܦ:+ei_P`r0xH=z L"+ẁ+"=#eKUF \Q&,R^{D"LFމ睠]z gwYehQX#lI:;.b*˅g1s-Roͽi3_޵DjJ&XN{s6^x? E7?|ȸo~z題)Wh`"/< I`=̷p_8+/XV<Ž&!q)fNUnv>1ڀ%F7ba͹,D#wCy4,\bi$U^*X@",F7 x,?Cp$`unD^0ڄ*P{+i5^"naF +kwV?T0rˤk e2x*q RqbΰP (mZ2(1QrĊi„C*"s=L7z<,&ҍ5^1dm=t3< 3,8~e?TPe +B`g(O.0 04'ʙߪ\-"wwW05+ /WP5!fg[LW|mEb:2hk};ٗR}gr|bߤOHޟ}:I2 =S5 /?iE +endstream +endobj + +717 0 obj +2353 +endobj + +44 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [718 0 R 719 0 R 720 0 R]>> +endobj + +718 0 obj +<>>> +endobj + +719 0 obj +<>>> +endobj + +720 0 obj +<>>> +endobj + +721 0 obj +<> +stream +xX[۸}g1UŻ LE[`l]9[r%9H'yrB~ah٭}Wp6zh,R$cTiwҙw *%$"ҟr%ruebD_G\3c UR :x\]=vX<lds$s{{&0hYc#2؈Y+0kGH1,:R{lDf11oǂ՞=Bvccq%xJ4KRF6q;uB7ϫNꇍJzs9(Mr$S#UNZLQ{S'YΆ` $`yO)Gsg;PHFCS=Btr ƥ"*w*kcdǂ՞=BrTTHJI,v9!]$SE*uJC4e*R|kN"QGFr:w;\.ܴkEcmm>_nE.]rΝ'6QG;CmMY {L+.kQo^IDKxR<";XόH\%C ;ôtqS#{1[`5aO^,h: +:xǰOy,X#D{צx$+_v~=Ap.N)Kʖ$,zl̷' +@$^-.Q&CZJw?3"n +T!)UnVŰ[v5>hዉ5;7 ӡvc_zb2:rp$%lX8;vO]_#s֖.}:X^mc:;ˇ7U1H'F=U;qvmq\#{9b;ލcq60~9!9(E< nĺg/[[!ݹ/ +J#{Tl3&ڌXv|gsl O~xaljw{ee]ic5R˙+E2X(_0yrߛca FrxZ uůccM"۾!MiO# K8LOxml_/9^-Cс3vƈWg&?? +endstream +endobj + +722 0 obj +1958 +endobj + +45 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [723 0 R 724 0 R 725 0 R]>> +endobj + +723 0 obj +<>>> +endobj + +724 0 obj +<>>> +endobj + +725 0 obj +<>>> +endobj + +726 0 obj +<> +stream +xYˎܶWp9&K <*Sp? *Y&Iɥ"\Y@L * ENY)E6T ݅+3j)"&>c_>ЦJ̨CDvQ׈Ѣ%. :-8?]`?Hi:x#+yZ2e)"fT+I=汕"2gVr1<11oQĢՑ=AFCS|*2ʂRB!En+2!(if)JeH%q]=AbPa+6..<  +O*e^FesZXLYS9O!|E,bdOS!cOHfE"SX{AS!= !zɡ0JsP_^=+xٟ *xNs. +$%7%TB +.n$! ßqV_f7q^RJ\Ak]-%>i{- cG9%p23.ղď/`ь@a;1>\^Pmy$@!Ǿmk f73éiW[! "/sے 7yOP}4d'3faߌVeGgLmjMWCDhtDV;f*.<'RLU2"^V}2]ۏyi6Ll.Sc]iUHϷdAMP* E,EKd<`RƲ(Kya WЧq1C9Y%u G(`Ձ=ADZ +*sGR!)nm$+i-Q̬uӡ\lUͧdTBfj>#r4mM gKy8vw yNd~Olj|n}4ӗU;/QaCs57&ȱ5M57{M˳M7Nm 7$,G~I]fSe4ԑqol qcevS}y5_?o.L ߝőKys4ӗnf|fAH^wYHĵWZwf&}z ټͦlI,J5-피nZLˬ\5-,sDhłѠ'R' DD"ւ iERIVĒ E榕yJMo5oBMb8OLh˱?GsƓ۵ڤK$`0E`|QDDsY + 2"L-0^bdA*/]V0$g'pE]hQ\ ¿uJ/M@4 B6N)fm{:u+wsO{3v_U!VhQ"~xocU Sh_!~5c~#yka臯8Gid1KBNS ]2slmsS\ c/;K0,Xf'+{&wYCRgRQqG*Xi9ewav_T2& +)Wv睸^:2|`/A?ˀ¥Hv.wƯCL vQK E.Nt p byUaNCIQ춂?cL.;,BagĕJg*wwOZd3Rܙ9|@@p2ԫQorxb{t iZBWƒ@ +endstream +endobj + +727 0 obj +2134 +endobj + +46 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [728 0 R 729 0 R]>> +endobj + +728 0 obj +<>>> +endobj + +729 0 obj +<>>> +endobj + +730 0 obj +<> +stream +xT͎0)XbI +J!$5Mv1y#٦"z-IBAKu 6uBwo32x{(ϋ*X}8dӀB,ipEe)J4`v?5husDvn/I h6|,<30yҪ9:Ƃ{q@t~5Zl=>xݵzi~ֽ)AAPPP%8 +\K7,!r;m\2hʇ#&yr Ez.^L1r|%/ު!S3˷ɇS߃C ~$>m;P"5*4СCCT`r{eQ O'jH%Y2^P'h1[/+b NzzWPim,Y8,)lOY!$-Dǀ&,_gm$mglA4P[aE|s<LgψyA뛤ԻEF_@{.s%^Kԧ< Eo"J +endstream +endobj + +731 0 obj +568 +endobj + +47 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [732 0 R]>> +endobj + +732 0 obj +<>>> +endobj + +733 0 obj +<> +stream +xX[oD~ϯǀ*BHmE !hxҘ:vKK~&3dnNV[''}̙pNj=b{O%E/7Y^^,bŠG>W O[}{I/9H+kCQ= +<F1Q}ǵ|>ި(d=؋B?`K/R +;-u3H+3YYq823$:eQQi!b6@ js :;> Ͼ+N4־ =gjŞ `T/0^J82N;^25B/X̘)SVDL`шwp|L~EAƴ?#$bt͝f__?W;g_0-Z S{8$Gp۩>Y7ÎUY~bmmjv|<[ٲ˜5%;$Ome(cv +L!EYʶ<}l(KǪD1lWEsHTX<.yV5;d"e{wm:LHՒB=fbdeQ/@::;dyR`Ƕ:!}Y5hHg7Td@zVP{X{SYI;ۂ 8饱Bt~''"ۄ5毆4kn{Sg(=b'|{b? `g?^1(_7偲Vr 5_bqehMP%5Խ;OٷWe!/U3u]"rg y:9KͳˣDqgvM^`_(KM=|X(%H.6)X s')NlW)znv`դ^ezT_Ip n*5?6+6-$yIe>]ϐf 0k*ˆZOݛ @aS"8bi請SR?TYWV7iO5Řg*D:ǑkG6" ĨKḧ< b,{LLSX>l,IS,FShCgAŇ4L.:)_QYRj}u# |[r@'oEDdO Pk~@Ho+aHzp{8VQ26N uC:zwP"A5B R}Tʠlbq*Ml_M5^1q1'x.4Z P3:\Є+?7ݵ."#U;Q[WM//B*x7\eŅo,7Eg:& + 3|x!xd2pG&-t%Em08ϳlNpC*:5/ܠH[#]w6kn4ܠ57 +==lb=jB/"qm߆=+$Ća4P'gaaY84WPXÉ#`Q @GM8ܱ<ۘ9<<$+x c/_O;\r,5N4!FZ,uO*Nx&5 _ +endstream +endobj + +734 0 obj +1804 +endobj + +48 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +735 0 obj +<> +stream +xX]ܶ}_e$ +N[@>0`h%bIJLIMW9s336!O"rO)8[ 0CCDEfnj&ƞ@('e hu!PZCrhhl٣ghP~49ϒk2MCH҂O2(f 3[l&"7eӢȌ%q^Gb`4"ٺ&KRdcо׊YH-N-p->^Y $rٸ`ׂ,^Ͷ)lo>犔+U{e7oWvI$㏠n&(\$4KE +?,)yuv&(g$sby4zPݪh3iz4̜3 IUd$dAv h!FG`ܨSvx"ڀZN؞MՙƮ -XFd;rZmrLlڬEnW8os;[i^<[3KꝭA՝ 0^pfe069i_L+)7e5u\1H=|ǎ/pN0MPSm*ZSFS 02]JN d~"Mi(0T7zV;%7Z8 i,/RO' 3~ +B+k:W&s*z;c=ٽTWh"r$$9BW('GZ0bf0^^ A 3JPݔjFm93H3k`n7@ءeWkTY]3͕hWg#LE[RvphRp+u[|M? !8 y]Eދ8mPí6Zs޵q?74]!9y:'pW\@K] "& @蹏~4<9:Ff'zXsDMr d9B .u>|8CZ0.-6neS;HWFpWN|M71q=-eй1ɒzV+5w59̝\ hǛm> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +737 0 obj +<> +stream +xXn6}߯S8xhu<4m(J]eu/{tH(6#59<3sf82CM3:,K7/6a(YR/Ә DcLd@K< f}T0LtQb5`c +Eɉ4dk +Ƒja8qXCgH`qv'ˍG} +xRPxҒ(666^H <iͱ2L939Ӛ9tki/15 AX1s5>O-<*rZ +;g~CFCPHtn^QPynsuWWe[3t~ňJӫ_.uxh&[$uvjt!Q/>fo1*rnyNѹSeQfgVQ{(̃-xpPm~R{!k^ Ue,^pahDFT]MY 8OyC/.`ՓEUDmCktݠwWA'G> c1朮^cE?f:<|jP'",8_YCBZ˙8!Uq])B2VJ>8;GB{P ,H~j=CSx"*28fOTgW*02 2(\!_ܱ)E׸acNõ͒TMre.UM!@.LəDVg7FPǾt_MpЇÓKe7>EX#An+TV^wZ4\5LJ B'%ܠxsdGVɀrjU.Y{o].ӦbP(k9bS[sS'E)/ijZ=yɹ|RP+w3uO6}3gsH8C|CЍ2e ك?C2m i]EnXfkV^U~^~z1_O]ۮտmOV⮐Q!\` "XQGgN yo8#/"e8{!I6a+NwuyNzn5&Y{sAbcZtʻ}fF̉7 2cK~D{7ƁGp$ s'FtҪUe%=yQ њީ.om }VBx*֘G.d] rmN:v#Y +0n_HVP~ˉ) ABe ']q:N=]\yz)X1k/H B (=TvUqg3:wifdK_{RU!e ^up-l&l!ƅ7|h$v eu +mI~ i0v7q44>p軃*J3:n7.0Q j5s\ }pk9 +^sba܇x9J!4i'~'Hw G+D{k3X~nu-4F4 iGīa2#}=} X+_:cxY65n2 +endstream +endobj + +738 0 obj +1768 +endobj + +50 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [739 0 R 740 0 R]>> +endobj + +739 0 obj +<>>> +endobj + +740 0 obj +<>>> +endobj + +741 0 obj +<> +stream +xX]o6}cH(7I(Y X(WKi~fP"Gvs$r̙y=mtSI?f "J5E"W O1&q.\)iYXFk w"S0`)=B,Ɂ&t +I'7BvfCKd\$s;Ev1D"pQ@rWQ<ǜ&1NaK!Q<a:QRkFU%J,#E<"="&7ʟbʵWKe-iEYs;c*ɥsbrcDa&,JL(HzYVĘ Yk=g(̄EIX2/=B 덲+z2z˚E@"FCI#$X %$& t3{ =B}@IU,RN4ASPm~1(a|TmSof =v蟇={tJ'ҤbҡO'ؾˡ鯙dϯiOjw=;@Nܻ`خ" Gt.en@`+aG$=BL tdz0u7R (#y6JdoRp{c8`̵ܴ9{;*Yk2* eӵ~SfDOP`| -h==NPDw uzqy&?ق>O"FSHUAȽ~բ_Wcվ~ws?Qu,Xr5M_5pnC؂ɱZs^ƒr7r%Ls/_P9^dI46y<!ZL _na7]'sRwޱ+?sQNabu\譜V ŴFRDeH б'Cq@}{ޱ=ⴚC> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +743 0 obj +<> +stream +xXێ6}8pū ع  Xp$[ZqflR%J8SSb3Ƚ)]Վ1N~dv/"ӕ"4F1%TFmJDIV15$I6*%)d^h$zѕL/U(9^%e{eA&$u0hM\>/*b^4W$q~O "EF,i,y C/@Dl"e3kG/ZGl"60bG^ɚo7w@9~AGT󈓻|WՏ979wR5=i +]z`Iߜsr}s$wĴmX#jEO^m<Ԥ(+ UPwYweڼ>"_?U٫=p.voڼlzNneSSPv$35v'`ՙ -M Ngʈ +!IQI-v+yPIH^׬91hR nk 1⧶ɇ&ݐ ^[NTxsdC]GUoMAmzaӏd92Y 2&^weqe6mlf}B<4=VA6tZEUetsdTKyA\؈v925EG—=zD 5&ͳaDYeM ĭͻrozK(,.kAd|:P{|gkcYZK)mW^S@*s ԃ=Z(xlar_;ly-yh)35zG9.ql7#-{Z`M88z +a{Uv@ع`48$NGrzaRS|4ӌX~}Ϗ/=r~9qS83C@1 j0 ˠލ;8JZ>> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [745 0 R]>> +endobj + +745 0 obj +<>>> +endobj + +746 0 obj +<> +stream +xr6z +,~d2qNvZw醖` %ǏEߧ$p/dc* +7J#0񗍟]3cW*|T\W3I5*m@%_V%SSDe D_1ҘH3kQtnO "k%hKZISy gyQbEʢzA\Zʎ5{^~ƐH#1JdBf@4K2[)B~:7@dBRD娓zAMzCP\U0C_qcW !2_TGk(*_=ЖLVZ+5 )YQȊEu7fޘd,gdqsel`o Gu$%Vf b,Fi"d,7L$۾op+&|o<8op }78h:Jfa :ʍ07H}DVT>2_T/Zj-ح͕a5$R#娓zAx:_aoL2Twe!Jd +@ݏ)2X1d2\@۱I)3XrI z{s %JpN9\̾ ё_^N.uo5%ݎm=\5{ +lI)fdA7Ͱ`PL2xeQ8&LPUYlf-07 U0(8*dӃ2 +4LZkg9rI .i2JH$xngzdqT㾽Wq_M JDX7ݚl}\wYl+:iυI'PR +0 +&ǭcBTҺ@8 ƨ zQA3VSu3ᨅʴeuF -\kbL3O-YXaspq83͟oʯݶ'bA5pN4W5ސiYnC]ɓ f[_o̾t?!Kmc&kf!hBK6zihY1H8$2tnfmfڢ O@WaddSrGMaWu%nUh +rpbw+3UXYk0p.srpwT7(&.N#=/J締w>*9Gi9S=(n +esja9ܾv67-I~Ү}ӷ>4‡1u?~ϾOur|iS 'ړm=i5,@29ȓ?~16 +WQʷ$ĻnoZr_~q8#] #3LyR0t&ϡ68FI )W.~QOvWݵKE*Q9J7?֋omK,5cX%B*~j`LTI=p3f󜸹{x9\ E38bH%x쒊; oNbG5}n_Aþ3!w^ሿqxqtWƫ#}zUnAo0s  '?4UP ˘p4Px//Xe{sdik߀.^s?+ niO~6j-.\Bn7b7 |kЕ5E)IO +endstream +endobj + +747 0 obj +1794 +endobj + +53 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +748 0 obj +<> +stream +xXn6Wp7 (`uѮEQ eıh$W$g6ESS}b{xSLT +hwov2,GM ++0!?* J(5֎"a.JbHXJ&0!J׊dXb1#{O*F0|PrTZTU2'H̄J2Wt%Fɉ>D9aEb&,\)}z)uW%DqP,JP>3HXJF!vqW\9SlNX::߮ XH9+a$Gw[{APV oZRRBZ2a x"$7^`ww΃|A 0 8X{=zNh_avޢvFըk7EC;ES}豾ϟc +:"ڈνׄ%Rïf4j+Yl@ OVbS7>p v,TDtA*$jū '$׫g+H!È;m7p[m=غE=,3/Oh bD2zuc=f6g[*EAS|GЃj[&a2Z raV sOJ"(ZNc=*j"TNC{moi)jH`o?>-+kUPP(ưyBm?]h#tƎxEըšMLfPώ-x9kPq) 6ZIHA . + +s.)LXJ Хv1qM@ÀЉ3\h%-D,{j" v!7 %[YQDlyJ-n$1Ŋ3"Q1Z),5T:Ux] DG3u +ZdveY}Ⱦ5bg{h*t"BȕkI{q^T.?@C?Cۛ]nߦZJ'f߶U4ESwmסu6}#X*n +6v{90O9ΪbpźiN0XjpkrShzf{Dk=?Zh=l?ӻp/ch@8Ev[r&[mߖQfr]0ۺ;q>BneScHʿh UUoNԟF%:ۣW{nn!g.?G7vo!Xun0/~o@|-arSot|=Cs 8Al͊$iL +endstream +endobj + +749 0 obj +1474 +endobj + +54 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [750 0 R 751 0 R 752 0 R]>> +endobj + +750 0 obj +<> +endobj + +751 0 obj +<> +endobj + +752 0 obj +<> +endobj + +753 0 obj +<> +stream +xXr6+t:1'Ad2ؑݙ2CKņgz. R E'$T.{ HDrV dVB OO2hZ.:Nv +xSKY.$-1D>V48z:̴mW?ޢ`{X]|kus;3\v{#tdۡ,!p@=?ۤ;3D]V#iղf&Kی 0SzXYKa.S6h ?28B{}}h&>lPcZ6CZ&-#޲q.ѱ›2mb&%vI*?&`1mvau"\^a55uU#4۬*4+V_Y#yQ$kPp Iڲ|ϪDG|.r1:r )E^}{4Gٱ2!v$%\aC?bCVGV{$ ez C[.RSu\E,XDOE'ϞY(.zwt!Tz5uݲmdnlх RK/如2b++Q%XX3-bqYbryEaz۝ߋгiWDfO9+qe&7%oϧкwXhBgU`FjWZ}ZImD?$=(\,pʵ\n\6ȷ`mnu Fj3(SZi,Yfܻt0ƀ2}pYu85!(o樇Qw)XYm Wx' NkI7GNg|o+Pȵῇ-^&N"ASnɘNh:$\YIP[Ѕ7ᡛVQp@~*p :5m0q_+D$n8W1Ϲ|=$ּJ_ Cq)Y-ۗMhjwd|v=IAӥΕ6TF8087`~˧S`>F ~PlwRg`H.Zḿfp|.WPs7MDg=df6ol1 hN!?䴘R`ם݁;]hN1KQxfc'6[pBz̪aiMFe69A?9zd_EAٗ=m9׈Yy=5i{oC\!C_3bPA݈ +endstream +endobj + +754 0 obj +1680 +endobj + +55 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +755 0 obj +<> +stream +xXێ6}WqS$DQh"٢@h[Yt%*MOgHIn619;7#Mo6 K/76YB3<S(,%,]˹, 9 ʲ;Ҙ$h1O (W s3rnap8f<==8HLƄVN&`eBՎ_؍v`jj6)yDc8C3[D%:`#tu`(&I5~A#r b s7#G%vdmIJSo8 mg)60j9:p9x 0 UZ횽 ^DME[-M`/J\mC o #٢MꝨ1Ә'(_4/04PisePfO"$UӄӴ^{%?78|WY湍& JkU=_AΩmX..Z*Wⴅ?xm`|,$,.#=}>߃Iuutu4b_t&k={K^> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [757 0 R]>> +endobj + +757 0 obj +<>>> +endobj + +758 0 obj +<> +stream +xWn6}W-,Eч4M-]v AQ5"me7A 33S?l|2SIP=|[1Wc!5{8T㕊HjHE^i9 W^Ro!Kmڦ0P+73L3ʵsIRczIȦR\`-`.Rd}F"0cmi*3ٱMM"Vbd=Cĵ7]U73T 1OQ%P,aK)2,vi KXbZ!>]yE-/KHX¢b#İkdϐoZ@/zc-ˍ),h)tD2ˌ 3D\ Z 9o?gcbX"̈eDllb1qrFкbdJS*Be1<Ȟ!b +CS)-uRB X#]#{~YWm@8 9 U{(Myz[}wHwZC Y]4gr` 13f Ŝ;EVy[<ՏsOdӅz8m>lsz, ]#i:nڑʗS +$lu3yln؈cw[Mĺ +T}-acN*y{v8J)@4J U(j\ݪ՗ +ȓ2qRq29#Пڲo$(ũR=%H3"7wX+dyD6U6 X|vMwEvmC%ds7օp[PU]76,Q8G=cbsm!̵ݒU[~v6KdW SJ@]۲Lo4*.a3ryIAXC>\ke\.'/s}]8aoui{|> ;nB߇~q)!wPynږ}<̛cׅ̀ìp4򹙞.e=q.?y᭹̱y·;ְc8tپ'abip82E/ My8vd{ܜ~=4$*=A@نF:&N!U- +endstream +endobj + +759 0 obj +1146 +endobj + +57 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +760 0 obj +<> +stream +xr0~ +BV04Mp@x4Q[cwghUvw:2!We ELh\v<\P(ET\jH-xK5AҘ%1&( i%j95vDO~ϲ24XCT6Y5je;ZY'J~d]{޿3;5A{%|8cA]j<"jK3'JXEMSc'}&;)#:;:Z:e8o;9(#mj޴euNMnblSxp=g)]~ɚƑM`|0&\J]gGYb{c3.\$+F 0g˷ p1Ԋ 3I{?'Ap +r%?P +o'SRSBu.vw J +C@w`SiS +ĊB__9+o +endstream +endobj + +761 0 obj +884 +endobj + +58 0 obj +<> +/ProcSet [/PDF /Text]>> +/Group <>>> +endobj + +762 0 obj +<> +stream +xXn7}W -/Cr,KE.k[..A>EgvI.WM%rvp IYU$dt|ph&&JMUt1RҫKKCg-0#+gJ&b$M6YM( lSdB`sAe)1_i9CFVk6Q +"{ԉEUz{j{X&=*@qL1{T,b2桵d}"ҎEdXXQr֙@.-ԒlTTI21[P6VGг6DP/cEe,wMf/flPo SoZ1$XrF NbWV/'zv@YZ']P X13 P,abKEjcP +2JXub/atZgMUVQ- CKgpSZUWۖF}4uV9*gˌzA6-y߷uwe1B-^H>\TN(1]OҦ"*R+8cy3{JET*AF @TNP7wh1[L q2qw?|D肼{\f!TƘMiN7d=¢쭆(SB2PJ j}.Z3!r0Wb&cJ49d Η$ͬhlIn"Uu A!)}o˱;Hڥ|o8`G3{2(,e%H#JKj.'dJ6/IuYZj^ĨK\I엙F%n=$` ztP5mH~bRŔn3p𤮌uuuUCMA_YϕםwKYa5&"+٧+7fj[5ڤت*:ᦔujT}n[O1-[(n!>˨H-}5iJ朧LQliYLFa"h1jJBmWKBnIC4cN W/u;JFn|{H;epeuب=O %;9pC\=;TvJtTW?.o6xX'>5qb{Z.qc;?xjƣ9=wWck>]z`rߝֻ3T#6)ty&QdƴYg\PuPҔ]E*\z ;)VKW҉.}l_5qڋ=J>VnO_3x=oo+gBu^9onſvBɒW͡{{Lw `k܌!PAVZt9.-I%sa86=4^8x Lnv{s9_n.uJ|)Yήλiߕ߲~_.Kb2&P9/$i4'\y@/|983S#Q L={#̈́-D 2-t,|ǩ]l!6K5l/ĬYuDZ/8Sgƫo6vptՙ%^!7yu?Ay}/6 +endstream +endobj + +763 0 obj +1653 +endobj + +59 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +764 0 obj +<> +stream +x}Sn0+)CQZ)Ҧ@RJ̚"]ӕ(>RƄa/kP,+maQRV%0K+\vQ3+IҌnRihElN ^?xλ7}\^,;g9 +:[D@xSО{#|j' ٜ[V1ayR]?s|HY~fL +endstream +endobj + +765 0 obj +623 +endobj + +60 0 obj +<> +/XObject <> +/ProcSet [/PDF /Text /ImageC] +/ColorSpace <>>> +/Group <>>> +endobj + +767 0 obj +<> +stream +xXێD}71_"E<(Bz잝fma?ڷ!jWt:uu)qlЉa3*r(R {>0SyYBs/͓^۹3xe^x +/ Aq I Lr镬,$udqQ\;ldAi[YylAb$)w-M ݑi>`wf\36 +M|&1+bБ +ݑ8M2Y\%+F16y4'tGηov g#{ap}gnGYi{RvΝx Ԧ[v'U"*Gr Dz;Bbt(Q +W2a;UT9NaӀH+Zb@ue]TC26~o)S? : V?(J4;"M^޽xfQ(O-rf_9 mO ߠn +>GJZ!F3*dM=D'=Zv@7FMF\=\{K[T8^mV4**.ZYq2[5uJ3%1n*m܀MD]ZV@l3-n$.a2Hye) Zȅ?m*L/m k#X6cNҾ4Ӎpj\T~Ёz=HvJVB'[o[m dΪ rin;+ʺUOa|[6(O*[h,ěr1 r&jl8$kN +lrN&.O3[C`Z!*D;Y|kmؽ2ly C_N@ FZ6y&Re+)}QaBo;{?lh*CG)t%*~ZFY%4kamY.h@P*;nTmUYsxfuCL77B@q{詴!rةfh`r ܟ:EMFt42UP$EQ5y>pQ1nBv>#T ÄlejlN%DE1$Lk}8P~:sR90add +nB܏~6k 6w+x`ߣ X&Y߄|wy +endstream +endobj + +768 0 obj +1754 +endobj + +61 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [769 0 R 770 0 R]>> +endobj + +769 0 obj +<>>> +endobj + +770 0 obj +<>>> +endobj + +771 0 obj +<> +stream +xZKoW +I{ڐH#HatYqڳ;>2TtW,g*ВvWJ"'> msq tWbeaXcCz w^ +LU[HV)^菰R(0t"+aփ-d彳!+aYDXqYe=dUzwjw1BFX@jD+汄<02TEVt0%l1T%CD$h #e{,cdad5IgȘo*?j_Y YLi]D?FQNʆ` 1RêzF c$+K/HցB h9 b!̈́1b\3$fY3i{gzP{,c`ƖFS0y,OI =GޗF+U{,!#%5ad5IgȘoZAqʪJymT=b4=0N汄UkBFSϮkjΐ1>匍1@aN}]\~6~mhխ5Kmm[݋Uۈ_y#n~t3P+!?6XlDuw(~pXm{~6boSh`ipckSw_^]׶%7[.{.(a jgC}o^9i?Rڪw9+Ur?b4Z?j߈ϗ}iď7bn>7 fn\LKG_}ً0rʤl47jBg[d{.Ww#4DOhdE<}vּ$LXG׶PO v)G;ᇑpE-Dt`I/@59 +׼8cy7oum hd ͍r^~Dc%8 k[}+s=);g9;iw&@QτO(о;,h 掷E + GI: hԠs31PH}#AB1a <RGN-zF"D,McoYLEǺ7fUo|brcOZP !MtUZ6-*$kZ {5Z@lmt̫t"+a&:T/0SEIXE:r{A]N03eY H#]'ŃqTtCNZp:C۲IJb4b/t=6mwnw"'huM(䓉4+D8AoFhA.a{V SмUY:!YE85B,f&7lNYQq$j T2{v0?@c.nA`NnQ6v-i, 5$sqY"M|a?iֳ(C>M'̗Z:هkJ  Vil| ͦd61" EVlDL .qQÔկ*:dǓkp<N$fY/ t(L!*8nb`^?,y|YxװB]*G%y`V[zN!X`IWXv$ z1b> R|h7/źeDZfX> +ӑP kJ-"X;t*YҪ,!낕X3,EH+:X]KE+Vg 9;I_`q=ϗ_{|=;lAe{^|]^~LWPJf)hǃV`G + :lxcT0i7!ʘsҍʕ9|Lu>&eX3ĞKv;n+<)T4SEC7L|OWע]@o6voߋYiPxu*_%m~yj[l9bx }v,P1_~D> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +773 0 obj +<> +stream +xZmo~b?*r@bY}A@>$ּLΐ7tJZ|ңgg]e;=}J'Ltjc1\)6`ak!i1^S +Oke2Sfi-mYfB`J9{$cQ`żgs@v7121ؽD2{, +LEM"׉ޅM<|F/$P)}"ŴKx#$Rl<4DZSшMTnG^{I89ep8?\qmLΪG"=|xy1aPRӻlpH$ǢX$!qH/]D1噵i~S:Wc|*N1=B"+1YEHkb2SlXڱGHoB i l%7`߄fuUWmga%V0:@Ŏٶ]ES[W%[C]m}<ohn ̨~.MW]Q zw\r8xf` *c6 J`Tq 7*(b3!㘤"` `(t ܨ=B@:YLbTvQWV5Â׎=Br\Fk0f1:  Ca' +N+3n1ec`BΧ0͹7K٠( Pr=|'nb1C͛ 몕ҦSōCdˋrpߘ̹p@KcnizėU 6)-'H&͢F :#0y|E \K o +7H na1gZZ +, p̧pt PρYTbj8rKZ;"3E1hcNfm4hbK ez4)l捿caSPoEO/>O-?Tk8&R*m{j: gUE~ h b= a:3_T/szxF^Ne|Le +su@B`f 'ꀄ닰\ et,忤Xn=?tQ eOv |n1?, N@]S]^f-﹞ZxW0Rܫ0QoSpE "Q Ә R8+*¸n!4pMO R + cpuwy{#;zްVIIϋ tc-"sqv97G<4C^r:~u("qde{TT(P;6EaAi30Ȟu |/߁rb~@ϜU)4p[Pi'qi35j'#!PgOy2ZrH_|h\C:=C誢$u%?COWY JɒG+h8H/q u7*þũ*z8o` usH=JvXzl?7p/Se.U\]S8˄$jP\=nԉ <65L;O_=`s}˗p5xO18]}=tY=*/{v39lxK +hRъ^'F ,vj_4Ƿe|G@gM<"fMHU&պ~+)33x#Ⱥ7B-?2ILˠBPUDY7ܩQ +endstream +endobj + +774 0 obj +2252 +endobj + +63 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [775 0 R]>> +endobj + +775 0 obj +<>>> +endobj + +776 0 obj +<> +stream +xZKsWQJ6~dUYRN +sI .,gݙY`첈8t==Ev +|dOd\phVZ !+3W>1ݴ@UIs0-5vFD&Dd``HA=# 1+AWbи3tB+:+a݊<",,H\4^)?F7X'%ՀxD"bE,b襫R^{FʈEl183[YD,"E #="&M*+/u XiY SS)*t(HX!LH^^ "s%̺Ɂl%Yf>CB0V"d@\zD#"Ftf1$_DLRG'H# sY+ qEdeMX:\oe-bZZz;QmKW9)}Hi4iMHG  +Iɋ fY59Е! gHHf +aV,J\O2z$YJF;w.F,aT^ EVF0QC.kۇӈIF(k²׉@zx Qrp+8syft{]}ƽB*-{޴o)Bҏ7YxH>tr= +^WA0ߪ2ߒ1ɡBWpfRdĢIgtyn(0\2,ZC` iZԕYV] {nRIZ7֏@75\4$b5 W"7U^NDO\t_WJ]XįژӭWgLaO:3r8Y}&i|l +tbIh 4OACǻN?\8# 4~Ga`L?Ҡ&"8AIhmg '( BrP\3b2W⃰#aXa6W3$ .vĞ4< g_#&ƓlEA$:ZV)<axdmah6լ)sɥ0 '=4ݡdX_(#aRgO!nA;VwV$J)aa3( T.-:䈸i:ze[/'m + +qUbψ\  ّ0 MfjZϐࢳ& #I^{FlzI2UsQ1B](Pmvģt)Mzm}u횊]7nVݿֵv:bnGh ĥmf|6Gq+c,Wi>Ip}AY0(|+ bV%+c" "c1ĮAe*:!Jp%N؈׊+*Rv".uܔ +mF%O,c+TE~TH4?>\xe lHv14 db?z=b)h:w 81Z +*EA¿)8sEnkSIq.U$k"N#a0 @ LjV%" +y2;R琛I!n޵ .Msj(L'9yS@8pKF=F3=!>"l> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +778 0 obj +<> +stream +x]N0~= +$v̱Hz0`M8q:>f߈T(f> l:ha?JͿb6,fM60Z2P.AAEE9ٶ!m|8!]#.Կ^weϰwL G>I_.!@ |n +er o 2vp*4G"(~}{DT +endstream +endobj + +779 0 obj +214 +endobj + +65 0 obj +<> +/ProcSet [/PDF /Text]>> +/Group <>>> +endobj + +780 0 obj +<> +stream +xXnF+f.3! \}EQ @ASņ" "3$g8GA@p>}CW )3~iHUILhܯ3q&5Q8ұsrLDfxɓHXBLE0&XJacʭl%=J`qĔ0$3"'Yce8cKwnN68$[M:\M9,l>!Άliس;31I-?xbHsF䌱^H`Ks&=@20DJˏ/y|؈16b1& ӲF|Y#˚+b2 F԰ʛf1^^zIVHy̠b=%wf鱀Qz$N7;{/dϧc1MŜ1*2F])1_^zcC)r^mVO~-"`7hǼ^zN"缦1:i2anWooc/ݭ?UWJo?Acm E/')9 0E}l_di5h'X}nI#h݉]=92oIQc0*Zc9eqMD:! >orr*2UTy%E}ђǺmq(ʴC\z YAQYEx -NGgQ29>JH+]]}켬gL X>tH;d@p&jӐck;2sկ̒ZV1>> CzGP~z̰v.*IL<C&Y5){RТ= 8(g.!mP^%TS&I2QBr)7SB1|%/kq#H Rn(Z]~X0]r<|)TޓoEO綮v$nC4v]'x_KI|qזYjžy, Be!ˇ/i:0-Z\ldś/lwA.睷zh'ݢF4j}ȳbwӐ)^oPs12^ |dC^zA /g;gK#c KJ%mٖM?G,k)A20T3̽J#Xr\^aX(9zm}w>hBaZGHay M|]6><}Xu狞ot,kRI)lQT=^za{y1P B{_DܜW__3yCi){_ J^+o4l*{cAɰ˹ wp+l˙J[~B̫q  +fY޶}ǡ޻͞ta\RW4JV0 Y,"PD8!q0F"H;u =B5#J0YDَ ^ǸeyL$adC 0k/}B5#lȐ}:Aȧ6T+ӂoE}H3h}jp2*M~ܝF^xuCʴpWy#i\k t0f[N 3Rn0Fe,JGBG̤\אIօK4w3 +endstream +endobj + +781 0 obj +1738 +endobj + +66 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +782 0 obj +<> +stream +x͎0y,hdFEghfQ($n!?U,M{i[SI,| Pᡷ}B)#kMaVs REo7*ffxJ2@)'ZO1yO E"LvjdP/0FJV`z!gz{HbIt"~%sErDOzd6'&G ўiiX .Q^"2RԯdX`"K1ԽK*։J,0XpYtd=o= #R±+P[ia_&v|LdB{!)۔J#x;!OwUϰI(hi/rq&,tUM'n`,TmQ kp' j,o;j_z[@wo|<ֵ-QuI'XK7u˞)wPh Σ{- CU} em(-CU^=Y(W3EF'yߵζovLt[njղa`G>wOwRs;LEW2=1]16Q\xf(e\'(p18~Ώ2>o>B +endstream +endobj + +783 0 obj +625 +endobj + +67 0 obj +<> +/ProcSet [/PDF /Text]>> +/Group <>>> +endobj + +784 0 obj +<> +stream +xYnF+j E @n'Ϊ8d&K2THL3Hփ2V X:UM~ӷd@:fMe,24!~C)丞"!P, BLD GJiҮb# $DIe@`"X2;7 )6VÂ=bm(6OI,ޕ3;<Ðqb#˔.#6#͘2Rx.H[Db)Q, tYDlLfv=roS6xf +B+|$e]i"1y,7͵qپkZC6WI٘֒DFBN2t8ׁDsO,IirTjG^yΛ -H=HN.u9Mx]][#!!FMOyUkMB4}!"bQўrUFyݷj,?埴1WƆͰ ·UMH .ڶv;9Yos5Ρ;kC>D [:%%R$6K_ՆB'9*Oũ`x9"Nދ݉ü)ɱ~"Psڙpڷ IzSl֮*^6&ɩ&ߞpi?>gICcY "'ݙZV*91ulwը炊n&۞=Ǚs-,5u-u]f1O&~n0v6aT?sIJ?h9@31@߶}I ~jPb[j3-eO5Rg(愨!㣹T$g;p燻{R`N!gLk K|aʓ?<>aSU"<[`Χ +endstream +endobj + +785 0 obj +2040 +endobj + +68 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [786 0 R 787 0 R 788 0 R 789 0 R]>> +endobj + +786 0 obj +<>>> +endobj + +787 0 obj +<>>> +endobj + +788 0 obj +<>>> +endobj + +789 0 obj +<> +endobj + +790 0 obj +<> +stream +xmN0<јڿ<&6#̮h(&Ų +2̯1B]%SO=5F6(2oDJM^EkL|/ulWl 5KW۶=%T)T H}BV/?NM=O ¤R ^O#~!ޟS'BM,HyZe, H W -Herr痛L;a]᰺ؼb<N1b%! /6ʖC+FEO`j(<0@g\1-b718x +endstream +endobj + +791 0 obj +315 +endobj + +69 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [792 0 R]>> +endobj + +792 0 obj +<>>> +endobj + +793 0 obj +<> +stream +xWێ6}Ẉ[.-&mDʢ!QٸR,iU#]`W9gfH9"qO}EtP/UIQH~ zaCYqś3tb>j(%5$AEK}&#m6gU=垞s} 1tȁEA>N$SͨOwW#ݗZEW;  +L]]g'n*YnRV./3\>MG$)הgRS(Y?.g~YZz.ĚybB;jboȮjjOXgi7v7Y -AS}ƟT@C\<އJ5'{!kKzVN _LXr}eETPg]:׬@ Id%tJ$VmRVvQUqĜΨ J̤fCjEwt T |ߘb3̋7yT%5e)S*SMpny9#h +3mH^f2eiТ]STQP*4b%`Bmg*urg0T n5b5ĵ2zC oT~JH+6Ѓ7r1tF=i!EecK2}GAownQ) +:XKIZlQL,QO5Xk)2߉XϤ,i|&ZU1o+S稔  +4=JZV%~2ѪLcr T3t%Q Pk}.$uZ'=$M˾B(4|8|CS&.b7fɶg|&;43YIrqWMgJk9fk)0,N3uN9at;*3p2CAuh_EϢ͡/\b1׉Ǝe^hn>sRj@pcQ $4h1A<3jo{EfYy(vgtqouYS nN'UK ]YE߿E'rl +aX + ̼,%;B}ه6Q,}oMFf=b:!fQЍ9773'K۱t>Hf>N!LΤ́n ޸LIu +L;Õ сB(rۧaG;Ň +I텞L^h"] $i )f^1oE-X~G 殰~8©v1z||{G}c/Ksl+zqR lvIxQoj0 326C{ x75`^opLGq} ngB +endstream +endobj + +794 0 obj +1553 +endobj + +70 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [795 0 R]>> +endobj + +795 0 obj +<>>> +endobj + +796 0 obj +<> +stream +xXm60q1(p**m*!UĻ I,ӱ;ή(BJv2̋Gpf-4 +G_ZX0M8V2!NpJ0a@qD\ǘ3s30a?d H" H ճsE IϨMՔcj]POd5Rb5FCΎ\䧘FbjlIX:L+s0 c&vQ|f\I6 w1 z:2 łdXi-,KΊF Pg{N:D8Q{}z){UF!x#7ބA*OcD-֋&}l]>--~f#xáM4 ’rNv=;QQ5:dMzSn +*/`ԈY_e81L#b]/}/uErߣlϚU!@)e[#>!F%B)IpȂX;]1B XuQͭ\j}7lzߊhECWErxy-fLU`)| o&sT&&oJ6݈^g7%N1'p0)ѹK a)<xSqA{y~B U ch4&t 鉬KE,ʁJ4 +|'C@#ZWuv;VuOL`毮>F<֭"T)u{Dm)y]wס:sCXBy)e77 )AL) eziw@UWZ+"Ca"C4^{~n4!8"sXS+OQ`+?71? Νлb5-7RvZ5*gEC)t5l= C~,V^fmK;zxi=4=F +]prL./&3َ-< ++,Ըi(8:><ɑ8B%aFgТc$A2ej $HcY i =)#QX&V#,Y[IRM̚}pdP($1GC='_.9ӳ/$~桱ec֧PQ>dG[m yÈ;IP5ݪgR'7L 80+i7Tе5U~?w ]cL?z2^` R1t^}kX`uf_2U]ISs;Tzp7%I}na@M; +Cw ^-f-NQgkyع |z5& ĩ9Mc2I٤P]kPJopbT | >Y;Mb +5qǼ>xݻĮ#śMVpԣc/Uo2U#M/LWW*|)9xAa$(X۩15l,J =S ;28MN<2רBѷ^OK =5P0$2|+pS7Dw\!ִ~/AQחW[% 8]PIf +endstream +endobj + +797 0 obj +1711 +endobj + +71 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [798 0 R 799 0 R]>> +endobj + +798 0 obj +<>>> +endobj + +799 0 obj +<>>> +endobj + +800 0 obj +<> +stream +xX͒6 )8i6DQLd3ۿΤ\d^+W1{%iz^lCB!7:|6|ib"   !i818$Az'AÀ3b1! MȎL "^@g]EHu#|=fp>c0],1pT?dF:jcd=&Yd.fk9ḻF6$s0hF:,$A:ӒPt٘cmIbO#1#~Ƨ%S,αndvh,L{ӆ-{Y-CӊϏ/w+N_L>>4< M,Is1`BK QHkEQ2 љL%ԒMd!a48a=!sL F/LF322A$ɈҬ-MMn3fd0(SQ,Yd16Hiblɦc1[A0fd$X3,C26HblLݒjI m60Bt],_4U՛hqj1V{XM1{ȶ.jUZ/~W^ϒt2aC>t6"|GZ pd=~ UXD]gvՁ6lު! c݋SVItl{uM{P=wPS$og~H9=Fufř'^oeVmV@9Ko WE08zˀY 7VdRuxvM"vDj&hME<]u4OU-EkQnt˼pBaD=w_ۓ|wb,}áa D~j˃P=TtJE_..b[km\U~ZZo,M{2oQAh)Êe&( aWvtetڦsh =h,*8υCAjVZ'2W ]gq*Kޠ繟7S=#%cg8WqD,=rG#Mq`0.ѫ 4l=CS[gFXyJaշ|eD1ڐTX@cРoUn}Q,{j u3*mНGy^\Tkh$^ F . j)4o7N QEC'<+1[sjTR +endstream +endobj + +801 0 obj +1742 +endobj + +72 0 obj +<> +/ProcSet [/PDF /Text]>> +/Group <>>> +endobj + +802 0 obj +<> +stream +xuVK6Wi]DQ,=$ buQE([Y=\㟙CO"y47BǍ-Q^:)~|o(aLU0JbFb}.^ o4J>)J^*ժ˶Y:ATSw7 fÔ(7ek[&Ol2{GUJëҺl= 69|lsF-ƈF +KmgB#"/4G> +K>!sPߴjz?C +cܬ|&Um|TN3F^5鹖U5rLfHψAzIC6Z5㆜(DPa .#}g~A[O*Qi~ÿ# λM 7q_9?TX&pѺ]c'^Bk`=Lp<W-`Cm0My>GEUmԊTZc m5ef'|6ԧCx칻oһQ1Ք3JxNȹkLa+e9:F0v#6Δ ;C4~,HKL$ T͇n6@ t4>yYJ9%t $1&t }$R&$ Jdv%ӘBDB†a䟔ք>Kkвb28CхpZ3QbF &:b'a )wl-R&ABd{wS9k t-"}`V_M7W<)#PPvnpl-X>K +թ&S\)IDkKMТb%+MȚ1~wtzk]҄4GXN +wl*R:8{N\u1{waP]s!R;·Uk8*܆8񲓩#%;`4v'mvͭS߿C}C /8Q0K,P._phT齶 +endstream +endobj + +803 0 obj +1082 +endobj + +73 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +804 0 obj +<> +stream +xW͎6)iV")Qʡ@ɦ) +t%Zmeeѐu5AߧC%f4@ 437?$[+<9U4Ry"vcJA +/ Ii:/~^/}[4frAxG.?$@]\2k2}돋7nQIL/iEhBL A痎8$K\{z V)0Ks$u[u z ٜ]<#)"]JFT5 C`ǟGSpl}U:}@"wU B²'^G`12|w[8^5(,UYBuy\2٥,L0 ѡ gHM UY'`,7 I<#luA'3(佬jTVRTiv*]&/doXMCՔ~'u%TCFU[ª=?Kx6+$pXPL"R]diJCX>a]&S ѩnH莲xc@33" 1m&+VQrL4p!8)TXhln?$ĝg"1 'KIgbs+el9zG1KS8T[Tӛ1ߝUa ZK1j4A; +O{ H$` +y +3<5 R`gJ#9 +W7 ᆓ"\aOoٙW 9)-.9\@!g9 eMNuOظrج}xh7X^lbdau: |L '&}lEZl ?=oEWEwEI,rD[D몸7<%<JkLyz_u qjKV)fAJɶۡeqQxs8ֽBsxG4a{?pϏٸD Ceș>[zkti Bc)Xh y %#q|m ,M˪Hr0oSii) X +%;ըVUתP 4[b؜R> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [806 0 R]>> +endobj + +806 0 obj +<>>> +endobj + +807 0 obj +<> +stream +xZێ}W80$^ :p6dy1p$5% +$>h?(b/Pakx.ɒveR>'@O?tO41 RH3X]eYH'4 +yWV =Ō@a̮wˎ\~P7OY9ْJDT9ߗ +DRHq=X?qjS_dTugnP.ċxD(5-rMXL_c]9Mn` =_+ ;)̸Bcܞ:>uw,=]iPX=T{gkd"2uT6'"6Dyذ}Ud" #U_MYz`c{Z4D"$d"yu\4Vd\1$|x +,.2\;9=et!3Bk +cs֋\&Rjw؟},OvgvhҊkۡx׽}~ñk.rSr8u}яS9|S #h&R$,grRb&諁X2c`[°>񒰏O ) E!L?MkTXwfEEF9:ۻX+(2(ByLHk1k4C%YR0NfB+$)X y2WI90(\I. +:8\^W[V{(ǵ6#nᦴr~cbrww^WWu4[$ t}|?ͦ>A"gj-I4jtbԘ#$*CiBѩd^! %)2d`Y4|сaG.ȊcGa'՞= qZ3ΒtA? EK^dRR&fY=ug)Б&2Q!Jep291"EP9hi",煓#$\91¸uY` +:8d +:Yv"n h-y5 x'̄XKtzC5<(Xr2 *Jmu},hlBS1!* +y&FLIF>~$"JaK̄WJ ~DLR= ir!|3ca'՞= z-bZ@ +c¨KbЌCY;/PZ:5`וwJ0m}@$R,d +U IA1 炫ˡ$5G\s)ևAN: 9[`c}kDk"& "hDɏ%X[\ܽ/?W4#k]uW#uIPf ԎH;rۢ3FxQyf `d1s+B=Jyz,rk[=w!r5r?ݭ~n-edžݸOo6SyjFU]Fc$G4<`Hm*0ڶIʱ$\~t07\xv U[V{>.L)9냋o'|;T;vwYR8=$&Ulf\$x=7I9Ic&UtwjuבםL=ƎqgޏޯE]]..}fG2ù);#,öZ)}f0@yv,W/;W/ϻ[r{{0Gq='g̘U  =63vSCUڗX0{^?jt#BW`!a&~jL#}/bG~l h@o!xBxʋW_t cwJ"-f5@ uAc_`Ml[}oS_#NZIxWf~g??z` G S0c_ջΜ\1 +endstream +endobj + +808 0 obj +2702 +endobj + +75 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [809 0 R]>> +endobj + +809 0 obj +<>>> +endobj + +810 0 obj +<> +stream +xYnF+j G#=2q5M$)R gfSdUݒCF %^{$vXvuќ{dʶ7bEV'cN.4V Dzc[{p@< n2ܴzf1Vm4r]@aˢr0:ĩHEbevg2\r9VEVF0l;ea`Ŋ|rY|=;î;!srZKFcDžylp$/=0֝fQ@h}dc~>{#W+f-rGq\ U5H;%u~4)"C8{ 0' 6hD&phw6Ah OsO&Зg'$ȓ0aN@ĮI OQ3:nyFk y +5Brdv曋;!p}r??W/ kKK~pj<;]'sCoYDD^N=VCJX$_R!9h 3"@ o#D0-`a +gS;]vي|lc(aG]{<כE֊x9J\ NPgm߭Z + Lp*۽}T)pG7ACq6H0ދppG*P0|pnQ3:pGk] +^Z/{yfẙs%h@obOa<9(2JNs I2JH;;!އza<0<=#ougHg ~{'=K #^"/&žʅ7?VR +endstream +endobj + +811 0 obj +2134 +endobj + +76 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +812 0 obj +<> +stream +x[n$}W:شymm@ A`<Qk5޹3]gRK#lbV?ͧ O]4Ze_ΤTſ`[ThwI@뮕ɱS! l*Lhԭ76ZH P[LG`:,et޶Ay B˛ 4sC | Ra8z^ʪjtFONyڙcNWt +) &)5t14Ɓ@i/1:9X,&FtC~BD_J } 㝕 +Is/M5?lRdzD"GEzDCƉ. ?*r]6 Q>Ґ7 jR5ٵX2*^65Bѫ> 81YTx*z҄+2iܤzBVKbK2Z$OD`I*fZ2uK< DǓņxl:'jZ4ѱy/ڊNHSōq)b>\ǔ؃W/}3MG5G)Vj>D\AhcyBdNQ|ZȏUŅƅ0ފhg!7 Ctl*sQDi|3,O' #R)sŖuQ^LeKZ|1nlL!3r9hBF_ZAlk L +ϏXۄ$ GC_T +=O35g 6а+9J[^L5j'); !u-OUiydCk♝C>vP^>cVJB~(ۥDS7붙QZ{?a酣gΦ +S9ް^ I10c"UU0tM&D&b!gPlXD#jbgD&8N_aF8c?@*T[ :I<ME `RBzOJeO?Y_O +jwWf0;j~p \O/=X*Әqʫv__ Gͳb #8Y39)}u ʙE`yj\?iGp/҂z8xT9MQ]\<VAˡyz|s`z^5%lO=CsxKqe{?9b?<tݹ{@_e}W侂V!eZD,_yvTkf$BiŻ(k~P +LF1Ҧ+Ke +0hL.ߕ%: +\C$RSѳ@pl*аbo!f7L4뽍J!Ե +F:ҩtv ]gu|ՇGr!_*4T'_/_I .y4v`e21y2U C"Ŋ]H24y&XQ 23&SEὗkڵ^k=JݏNp4,V[(`O<ƽogC+aݤyƧ4Μ!";r9$p5W7 ~8?4WAUW#ۺ1~EXK-7j?nϰev= {0 yN' +endstream +endobj + +813 0 obj +3465 +endobj + +77 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +814 0 obj +<> +stream +xWK6W+QZiRiиmsW]Z9 )Yh~I3=fi䰪"._ӄ_-VVX*#xI"'cF3w}Q9IheW?oW?<*%/Yz*hZ6f>vZVi["{bԪ%jO~}Ew_>[1<#1 @\z_zs+K^[( iJa( kUĈ܊0ѵK` Do u{KGԤE d0|!giIHN+ĕϱ3`yPGo|F btXk)M2y(׊ rz 0xߺ8WV?7&iD< ͳ4<g8< &$ʴ]'J^p;h_(`KN^B L\]+`鵂UVh*`#GvVwmoF)YL̀FᄅJG}5XA_FZ ElhR,h4,x:vm{!G PƳuZZYv1%)p@jwA X荪tPCA޾4! c :x$dz~q#kO'8r&_~_U:e/!wl.7J?>E4Bѽe.b(@"5Kru[TetZ=M.r*J3%|IY6b5=ڮup0Hr3u;m1W kމz^GǗqc,M6GpPZQ,iYOn&GWBĕƍe ]E3pU61*![Nƍ ('tk~8j}bY$7ަ̩pP1H0b: [5n@sO `wi/VTh\omX$Y6r{'w8YΛ7UnpMg Y]{\ j׷:s([/،u-yZ9E|"Fd^!KhTh(?qpLG5K cYׄݏ#s1n"<"NwCh y|;nEAc޵mb,pr GDvQ8 lZ#Z\  +8H<{sMal$ae9Q=n^^ 5qB G"hTƜeSK"F9C"ec6W-i9sbvhbNqԾ=|'!'/g(- gN Hm( +endstream +endobj + +815 0 obj +1454 +endobj + +78 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [816 0 R]>> +endobj + +816 0 obj +<>>> +endobj + +817 0 obj +<> +stream +xXnF}WSH.o vEP @&W"c^riE~Pzf,S P :kaU6}oDÇV6߭\sG"'hr *[;:N9Ir`$'LVB;nZ2$3=dHX_Dq 1QqruLf tXk'6?jߊ9RGĉGpHb]"5H&H 2J/r"Y2/X$RFj!86RRZ0EJ!Qtw4|uy ?;vbtv_G%@RvԱ}^();&EV2{q`aqT}V@=T>YQܕY4NDXtq)SAHiGN<7_[\U++YخHȘԲ~ˍ>;&M.YiP\RҔ7ɑ}6w(lĵ1'׀H +\R-uҹܡR+R7y(2'-FEzҦVaTxҮ%TԔ9(沈Gh6i]; +b}]<ȶ%RTTAa@ǡ2+TvU}Ϫb봙 ۆf[YVD/A `a']yVJ't6EQ•':DC\2ڑ5d6U&+vغqVc΋*ut/(\v/ߣ^zvhIIE QfQheRk:)*/T.uM4nT +jZ)6_bhr?%f ~_K?_ +w_Ͽ5^_BH#sC6{.1e|ãpL)bt`l _A'B2;mn}vG;Ӹ\!ૉ q\?Im,6 6izB׆!,ei1{g"ۗ׬h`?c/e*;٢3oF1|/:Z<3)ʬ&]bd3l6Yv9j db-^ 7r+v +endstream +endobj + +818 0 obj +1584 +endobj + +79 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +819 0 obj +<> +stream +xZn}W[Ę" H Y-)G in U{6!#wz֌mբ%Y4sp|k${`^( . Ul豄 <`m Vځvez`d<'k=<-X:k'Șo^qA{jZӧ5j-Qv lPWr!*zҭeV܉yF Q¶>9W/D`$G +V^DW]>[z 1Jٚ#rHϒvD+\x`RZaN =F*LJ( B< +jF(d豄 <0Ra +V. 2 a4r"9z8.*1QzU!n.!f +v+cbr[ !n.!f˒3LޛB݁ +[$iͽhz,!%uJr!X`24%dౄ.X:kȈoQ +jts^ŻV/w͟7yڬϚ/o*A 0lև:5BTF8 *&ovp'WW]ULkO$S"20WV㫁alX cQ%!ʾi3AزkuVr-63yz>͡ 6yܙRI E0Υ/ZNj@X q%0,TH3e0& `GC um9 f2 cOLSc̶mAGZ.2?lpK)[RjP?nyul6fXwoVww#Y~7_Oc>FOkt&P,h9n *Az:&DD+A9kU@TJbMk+VpZO󪤝 ʘT+&Z&B]#z-Y3]T2V "z[΋tgًF2ܭ*߭.fnFfJWqN0ǥq߯/"A +z fÞa`LZWT]C"E0ǥjg_Uϐz1U$E{EܨKQ-+hGqY~"7[}LEM +!E"U @5%l$MUҫ*k2VM=ZT$E{Efu2sSY`Ƌ9!߭f?co&nL4SS?ǧq< +Ğ_kP& קǏ1Λä +sT+|^vu DbVBN 2\zm5̮k>՗dz4*4H?owT<|lbN +"'sӊ#='Gs[}sz&0;zxꃟ2PS-ӪVup)gPqԢr+(A0xd-'71Rg ,896hꠜ|xL7~-!u;Ǜ'B`˾Q!ë!7 Zdc!#0a-s C{Dq >яh5C뽮Ћ>tĪ%6rEXx+(QQx,æAwsN4tZC9$s; &k%`a$(-А_Nn>eBqYR`իNm VMZp#TEU[Ɵ6l4=wtO4⥗!9#O>'7 HhXTMJ#Sֻwɦ 7FR/NuDx+c F~%{lhNay80#73>"Y,[,^,RWc7,ZZ~/^uxj/zabnfW,jl#}FMg،F9n`:4ǧYmsOc1 |nɞƷ&3ҽ~^4حϛew=|b7,љ/l8!Lf{zvq5ki~;OwGf*Lq9^}k9ߣ +endstream +endobj + +820 0 obj +2308 +endobj + +80 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +821 0 obj +<> +stream +xYr6}Wѳbbj*U㱕d+J%އ -Aה);QHizF2#縻}xTXB. ~RHy]lÁ1Hˌ&),d2FLSu ciek*[392I6Df>9MUYD(z`\S>$JA&CDgŘ6=Z&X ,KT&D6U]eI2De9xdrX*XDY=Bٻc&@J#njȈsUD aJ=!c HulXLk1ǘcC>z 7Bj5:Q p#a*E XW!ze|YW@c8(ff(3E XDY=B2덶 1 /Ue#<3汨3D10; m6fXLk#d5XE[¹zQ_ssW>7'pk~f fqvߑ.]2'F~&wB6}T:'H!?*kK`N6Ξ5˒TnB_E,jWOvMw81S^K8u2Vin ITp!X-YW&uͮ8lI^l6($䇆O=%O%,_fs2}W;[7lYU פ=iO@b{xibTOEX0]Pވܰ*좼wǡbkH~ؖT6͢1]>°.8O)2,%nثE& " w8WަGV cDFOspFX&bd.ug5 +z BE3TPkZ^gTH&$#C|i[~;~I[ݙqv{Hq\|_='{@ v_~:E9>Wչ0køWgTQ_uS\{f ΰwCt{ɯESYͻgg-RJ?"x"u~tZ-n/K1n ^AAKUPd$v2,0A+-aݷ'0Ubǟ"o"t3]w\C3v7'%D( rmn^ZoG-*o^Zg]jr5YPgb~ض61\15hpcYC1ۮ2: =*݆^ٻQKP֟O|j$YBa]J݈;GK&9~?DR{D6J%}kB+[{̮Pi.{:ϰIüǙ~cqsN-ǯR~G`4"=c#7 +Pv +_3 M/[fԼOb#}u>4nQzVsK?46HH}nrǃ$XHsv; пkc ò_,3ؙjrvIK o:֮Ϯ!>}Cī`޶{ֺZsÒ?j}^5Xw:mQ,Z*5?[Kt8O? +endstream +endobj + +822 0 obj +2016 +endobj + +81 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +823 0 obj +<> +stream +xXn7}W1i5wA;Z $CymŕHA?]ݮ\;1`H899]<ル_""Q@:]YnA$+խ~x)y╶WRJPKSy۔6ΊH',gʛ*Ҧ|J@v K*/c=crcz3X!Yd/d#˥=d)P XP,fuf/aX ֠5 [uf|SʔTFj+3дV9:ǧz.2]!y2R蜱23Vh D&zT/@J\+"#Z8˧3HXe hs- *b+ur֙@6S8Ź&WqK^ 'sX +$b`K{~9{svi[8zLE^ J6#]nzv;>Xޗ3JXub/:(*VNh?bV~wS{vm% ]NqpK ^w7}]ln5S/؛v|"ƞ Z61o^ ۅA2(CSՂ* |fH΃` MS⑍ zI'mڶJg)ѸHGo'nEs "½he1"|Z|*!ʪSz$!}1c0 +NwQ+cJ,!ewe@BX"S +t'Űc\|}Jrz#svj%-ٕOˮ|bv X.zߒcK'X +7Zс#_G9ս./v_G?Ve+=DdzeJ+|S9A9t܉: 64Z'ndSsԮTR4^@1}B;IN2tRhT 4|Kׅry 1׷wfx:‘'k5~mp25PVe=Fbc8ӏS/'Ab Y=SZvr1n8溷g;ɴ~P,R 8kvbcݶ6lw~?߯ŚʌֲZNluUo/^zYo>{Oaµg +?u p65]wz,l2m0 wˆ}hq>VUͬKf +endstream +endobj + +824 0 obj +1705 +endobj + +82 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +825 0 obj +<> +stream +xZn9}W1pxg3Hb{7`XcGj[Hjo=?svhj^VdUSvS±'>ᇮYe*4INdeBV0+UcL,¹RU& ˅rfm(aʹvEc >$dCBdk¶QP̂vȨkh5ǟћ=/ B%Rz#2^Zj@""b 'h^2UF, E#۩ ޾͡'(&ш/ nes8rXC HM\)%}hޒd,7f>Ɲuh1#BIHh41r0VIG/*0u~<agv \085ŊQ N18>Tª!c U lpV`^ M;r0~`V:'1(Ed>W P waÄgaTR͊CsH=%3_t^1OMcQ7JNZG?6%+<`6|᷃i)JQaPWз~0OT&֯ }f P&1XKY E7+͈,L^REյQD\!+҅j=JAWdLY._?,1?,Z7er¾?,zXbXOM/D/Bf^EYV)Eȏi>c7J cB8ŏ;o@Ƿ0 ֿ +хi)|pW + 6F"{Jmf/b7lkviw[o ERŊJa9<3>X(]v.a%-KI ʹ-(kjy_#ʦFϳ58?=牊՜$"Q!N/MT,<7,sUSa(N!/;E2V@JaeVRWт>”XqW 8ܮcٜ~,42?lg0!xcH5?>;v3M}rDCnSoJ[\*3~!Гftu߬ޑf4bo tjtFWx7ޜ]U|5>>T"W˞]WSAB}Cf +endstream +endobj + +826 0 obj +2415 +endobj + +83 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +827 0 obj +<> +stream +xXn7}Won_ U0 +%EmYi i&CKnֲ0vq4<3s83L1t?$)8ݿVP (eXvc& C`ɉTfK&%vz3?f2,䀨3 +K,8VDӸ"jJ1 Q(#Hr&a5`^U kGqsLcc@{Ls!"kِQ2z ;MT˅b 3[X,HXDr"X a>K]gHXr+ DvȒR)1X(bC֑=Cz:hJ5nkj*/LjZ5&5ojNJuH:a9{dE,W,a +>KBKzPDzNؐudϐqbA%Ϯ4|؂ :tko0QkFd0 Qw?hj "jD@,J+,DAv-b8bHkfJU[,r`q"0I&H♘r_"Ď$SXH-ݴL z)L2I)L/I22 :sսku8UnSM +%{.ܢ3Mˍ\Gsyzj>8sa{n-ZѦ9r\<yQըnk7TisͶuv3| i=f W}}vkx?0?ox }Yq ZriE6lpT\ %E7Sai$d3[ +euaB4rqQJF1 0H|]k/J؛H" h9s\䡬5)!x)?!ʸ|u۩"xW>y!<'6J{JpfDE|2k\$Ɯ +[ ,lq"eK%W'~gM9fp8oV4kAP`hteGxI6Ohkᴇ[ڇ^(&O?&-(嶯XLuS[3E0P{h5ZoI -3f|+W#_:usyjߢ{uust 38cL'Ƴ؇q١U> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +829 0 obj +<> +stream +xYn}WaXV`0ȡ#peroC,ϻ7҇U]U.ˋ [N*_OBeU7L j]H+BB` P+8E!|ZŹkǐH+2V ŧ5Y]jJX B CUIzBL[VBEV3D1:(VG A6ԥ#9&|ROlNJlɷKhвVg;t}Wm{`9iB[dɘe98X3q7|~?('G"'aGfy)Y@U`Zc̭Jdv VUAzBD0b&}t= YhQ^̟K?ɟE[sl5}tu@u߸"sN (fhg[Qa/8(} +RF'$!rZ% k<Ӛk0s3L* +R&Y!^.Q:*[Ȋg dEhud=K+WGUJE,JɘS9n +u TSVaM P+v +20T NX +tP$!\ ))ɢ% yq zH6%WR^H;K$o& >,#h8Ԅɍ;i/ D +貢ёD 3DBړH/2aS:PAê =!: +41 >QT + xրAV(VG 1/&QU?Y-]-2;'Dx6~|`etG۟VKv{q44a=b?ukw۲nY6' EqQk*pɺX"=دO+77tMضNl0YmٸvI3#~uۮ21^4C|9:4i͸lqEu&.^5`Ac_Hu fQ \m]L7GØ!Dmkv csXpn|N Gwc:g +xRaђX8XC}3zwa^/p?IE7MRŌt7N!ɈA8[#c2ZFE_JEcę< +h c燷 VN>|+>ߪkr4$eKߣ,ߪޡaoBUZ"m1;T[OzQ]|Jo]O8<|\ږ\sepY^_k[^k](T ZQ^'Y\^a+>`lPVKg;ۖKm&{{jGܬWH†ӬPOHE5qқ@)>=<7(.R4wі *ŴJ*OR)0 0%MX$dE+9=kЪx@V8k +XvFOD7U݁V߮kػvSfT86ƆvV5~hѻEl|x.EefeqG> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +831 0 obj +<> +stream +xXn#7+xtKqsC;#V;/G)&{dGy xXmNc EՏU攁DZ +p3ǒ9d3`1jsI-@@D+Źe:d1G1:#c\SLPLh=cbcz3XYg=AH q7c B밐t"؀p +,gC2:,di`!KYHXeEL Xc8ҍTK׆!2[N*7*luy\{b]U>.rCŮ&E7;2/ULg,euQnw$bԐZT^ CL\~xi7 +QVR'n9ڲ@[p$\aŀ \bne]D M&De/JC*Dv7a@5xߙҔ| +` +ȱڠG>Dxc[ bH(b3BSU^W +[ƍ古SX*'ҙjIgr(e6a9aN!5UUBWj4Ij4IM$5s*p&`5~6Gi7Tʱq GӚiGkz-˸0yw|W_D>=jWٍws`ycxKM]`YCsnq֟o +B*}r:Y-ތS#a ߁'9HPccdKv( NUP5T*$v7nR"A܌m8X0VW*[;█Jki]]9ŶWL};khlPVE|b=|G>UYC;RlI'Ͼu'7H;|lwїv> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +833 0 obj +<> +stream +xYn7}Wn K,@A>Q֎]RYF:rJ^aH  ~ȳJhͮ=~7\P}pZxGd +}i&50¹N`ph7 +l"ٔ譥! L=iʼ +=3,Q5V4dCbXiz=W^@/c₅!Ƣ%c,,-!DY,zkE[X]@J8hXQYȒo8JRomuͅ:յ4a) +6LiyrOsLT_):6of`MSɵm+33,dClYL넮7TcBQrƢ%c,ڐ-3EGXe%lkXrƢ%c,ڐ-:EGny7Ρ=?e jH#/g^qQ;~|,FJXfa1zkGoX[u/J+CTDENDy7 d6p'rV\IŵPVMyY΍0_Dx +Că2ayp5R@R)10 V0-YgA_t4ゥka>Pҟ?T('䏡P\;dv@"umo +J^tڔCR&ʳD{OFÁKԁuR]YX]zu +'8.1Tk( +u *S7 _ m$AC4`eȠM5!j*iBoUm+D,C'USK W z24L꤯+#/SF\ǰP)ۦ{*C;+ # + C=i)# w GM`\&!5@$"/SEUBYӞ4A;0gk*CT=҄)Y Y?^ ( Y W z>DP1@zPZUF򒂫ᬶ3Շb׆|O/|Y.\A8fV!'UNPqj;.L)fFޔpMm-=fZj֚j)[#u%˦Cd4 :m ɩga}Lݻ%@E&dXoNoxXڌSK]wI(\:JvueCM+!/\lӭq3qƒ`'*Y`nTE&DJ+ +X/E.T t u2pO㖝Eoz~Y B4TfۧUEuo4˗3$k폅=n}wk؛!08 Io?'vrC*2n{}$?WVx`eX'S=Sv}xC&ռZ^T~ qb6ocīzκ"Yl/j |m/=B +UCS qT'"ɟ +endstream +endobj + +834 0 obj +1662 +endobj + +87 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +835 0 obj +<> +stream +xXr8+pt2 %ʎY*sȑ JT03 .HQ*~'gTO3Bh"/ 4cIaT1p,EsgRV#7raG +:C͗<´n},fW3Ǣum\p[>ޏfoA<c[mݶ2qp%4\j=B>QzLEI0c2XuyGhNhٸw~e ;Tay`_1\݂j:DRLrjtܮfBkUBz,hСhQY +e;TK[@mֶFƾ@_f7΋` oN_mwu~9;,ŪzfM6E)ʋI,ʖ VɔEiBޖb?tK*"٪h]؃ݬ@nS>4=\nc v-q3底 +G%I0%(i"WJK"c +0"]bBV*#QkXLJTsH$â˧=myas83ޅ\0>3}YmY?B=Un}n*$X## +0n' +x)47̰fʤ0:X;:BC;>^{Mwd$B̕ , sGzJf*f8z8O$1O0:02!n|c0J;^{@Xϰ| _!"Gl#['75PDI eb3y04h44ٷmfga?|JO0^jH}L!%Z&u"naDZ뉐mNj9O>pyd :%ˇhW5܌*>D%B@WSx)tc炰97\@%~%_olOiWi;Si 鉄^aN.ՋD7-`#MrҮXc +Q9Hb߾%põbW-ri̼sՖ%=E-s% DǢlkV/R0yaSս<_yKKKZߝTl_r/*wΡmvT2;EmMLeڥٺq=ynz`"8C@فiX50cڴHԽ6|nA18}Ѥ>Ek&rҊˑ-t=Gy + ]۝-!ktmv{gKDKD1Q}Ƌְsgke8ln3>଺<,jg9d I5+-Ҽ,O. +endstream +endobj + +836 0 obj +1766 +endobj + +88 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [837 0 R]>> +endobj + +837 0 obj +<>>> +endobj + +838 0 obj +<> +stream +xYMoFϯ62`E{XƞC0" +ɑ #8r`kuUW“nS˧~URX@cn&(êHErq\$YDp3茾/ȔپΜ_xk&  ޺,~OR4gˤP]q $V"b#lD[pro To2K}Di|t51{=|xIW.  ԅX9cZVy< <VW]=bCʥ^Nb\T[l=yלg@1Ey,OTa۲,bXPQ{9ͷjE_V!V$Ro\t2ts15=@a0 !|'e58&j!z ckԎ=@B^Cks,uE",T|y sXD"TJQJ+fH15j q]nh$% yZK^pM}5B%OhenVyߌoĆ{v]5Á#{ch;tI0pQ9 е #!B ՁM,?cUgHa*jl8q'^eq8>ݔcg~o`tN?#yWp:n)M2yܝ9vcծ  +UL38M$‰ݽ 73$hIKhe.rKt גrY[cz#i< b0J[e$\aVLN2[V>8ެ:۬9lڱHֺԨӄS +ϭd%˱ɄQYFwOJ 'eZ'Ex$sg|ѦLaa܍Ij,KgICif2A@e^]gn esvD~.1m,8; a{aiTњ{Ѫmt 8!.O=6'!G'IyEL1lYz-vzhV{3.V-_,Aso1V0/5۳]3s8nΌM!dl+8\oMLCDM5kدj'K߁C +gibHZ4"lƛl21s5Q_<,k؈7moKJ~` `>?o#9[W[@rҌ"XFVvh8KEԖ*co9>_=8ڤPʿ;śj{XZr0n?r1iU'x.0> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +840 0 obj +<> +stream +xYMo83~S ql/vYJI9?J(#{3$m&_U=V8O6|JruJ~Y.fJa..+ÂcMFeք@c̸& ;3A_'"8ʄ5Eg!"U5bU(bf=Aȵ#xC?RLjIh 9!QX@ft#Qnƞ b)1H)87W, 3F" 271T +Y-kuL1iJ͸Ǝ>#dfb~EQWCϭ23}HsĒ̌ؤȞ rzܝ)1qT7wqbBE,VgdOD4~kRb#*6bI]G,F2|uorL1oaш$E,ɷŬ &>s^4rP*'l&:0r#xG #X bΔVxTJocE3b"{$J,Uj!$)T%9B1ޑxuu"AMKv]E~wZ k~ίٱZp`԰xhqp(Sl[itەGvlw~ܕUݯ;rcMβmU,F~泵2$ Fe'vz\nUN%E+}6ʪkS߄28C*a3bdْV- 9v?YfUq,[қ=tI)c8E#\LF +^v&53<<o 4K!=J7sQ&!i!;u?A!oo{T,ՑW< Wh06d-LH#1{^Aۣ<3K%]W1"ϼ%t` +FyQ*K}c8/gj/xgKsYhz_. N qnYM,:ޘdXHZ_1mga֑K˩{\dpKD.tcSh>=pYlv'jjo}eg4 LV$+ٴ躲Fh@--ۖkJI$yKݾ]w<,*,nq,,qk)g}k~iЙuI-J*J= +)HOj|\-cXp:%%m[^"yci(ji=2?@#F0{QzD2x:{/~-~M3;#_4m罏W"t=*sg'ZR8ws;~ ǐ_,ͽKO4RjLszzW/E'2/w1 +xغp*ј.c;??Ӫ奆ouxPz:y;X/wsF58G-73شYSʡ~oV7Y?!amni ln(W[uz[tq-S@0 }F`}J⮺b_%ɛbфJ/FH{:f2ܩ]s6smS6ٿ1jon1poE"θVo|Uzj;v(i Ԗ1 D1hД 6DOCbgļƲ{uD%feŤ'K~eQ>Uِo5r/e5J_st~+G0 OG2IlA~jF3K(%܎y +endstream +endobj + +841 0 obj +1893 +endobj + +90 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +842 0 obj +<> +stream +xn]_1}c<5$- HՇr(mK>z^gKv_"ut9*a7*)zjA9gtCNp54JP >)".S +!\8=$R:skT̸1aJ΂"1*0d>90BQV\g^O4F]?CJa&@(.mCZZiU"6@c#Q TB=C"0Xo8rO9 $#V`omzZI~uw\)V7OiIoI>KZnɳiɗ8i*g.ז4}\$:ߏdO]T8I@~![KEHIsx>z OEALvU RR$%, +3n_7(gOd ,KԲ KB. *jŸZn4ל1(9|q%a!:a&D&nnY xMс"ƏKC&'" jǐݐ6D]xhh1w˒0(f jp;R]EM Ό^/R'mIFLfrER, mDw,D ;ԭrJ*(EAqID?E\3Bvie*`2lN C1KIPa'4sO!% #ٜDA[ ŮD@LKu$ .F0b0^ 3ajrxNHx-6?HMeN6: .fk:D>A[/,xfC.y"$4'7a(kklR3'^2To"0eCW7.F&}ӗX Wh?$9 x1ebv?P!^[g{hbcf>Z&c"xe +:5HyIh,NH/HB2uB~ޢs'&0(~Hz9 +&+ATq(9{|*[2~v ) `Y7^_Ya=f0;(נ\+pEO?Rd^"UI='~mUb$MVe D6]ݢo|X!m}f{tQ Ӵmw8Z1 7Z9B2|vHJ2F>#5i߻^GP7P +wY2.vRLt nyk+6xĹg৷4Cp¶*ۼY(}UzœŶg|^"{}34kG%/~K]+kZ. +n2wEvP!UMpl07u"|o֚VekQȹbOxW5UVeh/F %fZ\ w)ҥ?M/X;7;);֊jMm݉  %q&ώEZOi==f5c]rɨ*7#y>5eo*j߷t +:C sGl*3dCNnSOɭ9Y+[ x ;r\~)jl숃&| !`oYCu?a&Q3э] +endstream +endobj + +843 0 obj +2069 +endobj + +91 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [844 0 R 845 0 R]>> +endobj + +844 0 obj +<> +endobj + +845 0 obj +<> +endobj + +846 0 obj +<> +stream +xXKr7EJ`|eJ2MǩJe+;oF$$2Gҁr,r4@Ҕ7c ryYMw_3/8\PL*CdaZ j5:"dT+A\[u8WOg̶D[AOl`m}|.W + 4֐=0tr* +.{d}'Ѣݏ^|P9c k E*M}Ču`jt}ݦk,c3Ul=zEɉNr! +&$ы%z{?z% H%o@1rZ$VN@7??Foo!FJ>+>Vche:rZT(UX4y0K5bT 6sD"' + +"wR'Mj ALVGJRńc*Z9%xP՞SGYSB?\yQBTA!CӋ g/(l(Tx^`4j`s_'8 +# qL6 GT#*aQH =: Tw G2߲PRpFp4#C[GsCTbY +zMS_vz~ rwyp +*߳$%#^Pځu c/8+,t8.Ur椑?Wu +腰?,9gxYk[ܿ[2|%t3sB[\}yy(FC❫l벪݌<. l+8Zg`Cj> v$2_뢞#pGƛnuY/6kr;w+G7\F', ϗzPVCWEy} aK]=TQB$p88qwtE޹ֳH ck.jf8)L_Aqe:|F, JrӬP ةҨ^ Hiulɼ:P@s5D~lLzu?J+$[rzZ#x+W6SiD7} +?zNlϕ^;ޕJNjt9RQQǺ'OZؐ-J㼼sb] w_w-Ob?Wiͬʁ*!j3d,ĕ;dt>e)VclK +(_W>X̐9Alr8В!ԭ׀`aPQ UL8~$SZ6C/?Cbieisi(kpM'=}zZ+bK :dL,5ypkWx^N"q 2^twqfY2CVOhb3MkSaߊ j8GIQn> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [848 0 R 849 0 R 850 0 R 851 0 R 852 0 R 853 0 R 854 0 R 855 0 R 856 0 R 857 0 R 858 0 R]>> +endobj + +848 0 obj +<> +endobj + +849 0 obj +<> +endobj + +850 0 obj +<> +endobj + +851 0 obj +<> +endobj + +852 0 obj +<> +endobj + +853 0 obj +<> +endobj + +854 0 obj +<> +endobj + +855 0 obj +<> +endobj + +856 0 obj +<> +endobj + +857 0 obj +<> +endobj + +858 0 obj +<> +endobj + +859 0 obj +<> +stream +xY͎)xL`p`챜 ;A.H-Dy!Sc0t֑7w!Jv?F8yB`I<$YțnCRaB%"sf@S} )7I]\?X3 ov\ ,'GI6BR> +Mȴ;,ss*{I1_`cٱ1玔s$#}}1*&E +4ttAIPͱbSÓ*_0ǘxvCH'"[^ӄH7:&'9&@GJӊ)6tJ#Oi&hLhho)vGٵ82q, v?@}E1:NɬaN# +^%gKn8OYZDrj.鴡bR:YM-.k2nDN`tJvCZh+:1؈# N%$ Ypƹt-Yt)-8eGH؛=Ązo Z(Tܓ-]Qwc @߻Ure='c4eݯIlّQځNt ]_&@N&V'q)Fb|9$. )^y@N+ z^PhU-bmx;k;l۶oQuk9ԌC[{sS}c[=Vzx|}>]}8ץߡ|FUdk\CP:M&:g)75\#KE[NwgԠ>Uuވ'R'=k3[Nh:갳6oj\hSokYvT%lׇD 2ۉ{_80BLHu-/jq[R-s> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [861 0 R 862 0 R 863 0 R 864 0 R 865 0 R 866 0 R 867 0 R 868 0 R 869 0 R 870 0 R 871 0 R]>> +endobj + +861 0 obj +<> +endobj + +862 0 obj +<> +endobj + +863 0 obj +<> +endobj + +864 0 obj +<> +endobj + +865 0 obj +<> +endobj + +866 0 obj +<> +endobj + +867 0 obj +<> +endobj + +868 0 obj +<> +endobj + +869 0 obj +<> +endobj + +870 0 obj +<> +endobj + +871 0 obj +<> +endobj + +872 0 obj +<> +stream +xW͎6)- HJZ-n^2m+я!Q@iPEQ{ogr4"UF웜ʝսI K|ta>f@b<<%@iDX+/̈́+~fcb虈c2YM<GʑkBg'ZR|V~Evq.hIs%fE\A<??'?xTP97E PߗE /F[F%U۞XeGt +~eUm܏nCY@!Gi?*:Dv.AIuh~Dqv1L}NpP?#MMь M($"昌L Z+Rg3!B~CrIY9v0 f1%gvɭ!50W4{Ϋ=8V4GEE +QJj{h#V*1S`VI\.\3㺯O :?,9d9{ۗ5AnGsu[ jP&vK"CT)3߆D)!͜< - -j/ؚCo'7y7_4'UR :j_Y#T%##fH#:h>u,v9Sc Wʔvdž!Ǒ=3328 "㙳l OU&4g8+s9 *mQQV>runE#q> a%(#4⻥Ə x]\6کkl~uJwm\k-L2m +֨%mn!?TޙfEiσŴdu2]<4:V7˯lyPje4wuhWݹűߚ϶j3u?pBJs*m63#m$t"CֵBSokeGϩS4rKƋm_>W|lwʎ:PyQQQ5=tZ`^=?궫ap+K@p JKxHtTu*/W'f{nn/%, $" MBi +XʨۤQ +ӱ\^1%!ӻ7PXjTn**YFhpX23W(,~Ю-Ԥ} xgԿ /$ w@qf s +endstream +endobj + +873 0 obj +1360 +endobj + +94 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [874 0 R]>> +endobj + +874 0 obj +<> +endobj + +875 0 obj +<> +stream +xXێ6}WqS +wm(P @6k[ InRZm"}lTΈc~9cDy)N5Uد&ȀεI*fc[J3i@,MҁLZ;@?K:<Pf9轟 d=meYQ/ b֢a7YJq?zvr5X'S.>2UqZIV4<9/M~keQzYqiѝ09X+"\ZzYuHb]\uMS/q|_PMoL-qjT~%~W|Xdy8l]wlA*5:C*x"aC'ar5n( eu Tȇ.EњF.҈tL9z,"\q\LP-wc)V,Q!.M8b8K1"ÉIU[8Bp9q؂_a׿o]/|JÝ4e.KטCZ݀ kD<& jO@G+EU5dK߸aDW5o*ή1 ~dQZ]y :FTcȩΌ/q4@- +yBp DEP^z\wgEwʸUWsi.MK)Ӎzfp)D;μqss'ZVHUG8V4|=1Ѷݛ CegtX)KXtJa [9wDLP"]6Lԟs.lp[`B[:܌sK9.>@ti+ 7G! +6FOyw?F SOb4}1õY8Jg܆b-G[ҕYs=]ou!KE0ŧo]wOz>Uuq w~$HUrcK)[>쓱]GxlD+M2a|&nzX}6?%7dgo HHxc߻!pSΦX]q$$,6uM>ai\i'asQ,aq +endstream +endobj + +876 0 obj +1809 +endobj + +95 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [877 0 R]>> +endobj + +877 0 obj +<>>> +endobj + +878 0 obj +<> +stream +xY]6}m7`M1//v.z})(-ݕEH$E*rs Ù[96~2jQW08T#nL2jasI 40#rf+(G)fl@.cL \ST(%Hd7>6DdF츊E,zD^azX'$@<)1RC/m>!b dz)HP1QĢב=Ax!H$l,)SPg GjQ!Waڈ)25Q1ItX'$ؐD4fb6D$9bIdF,̳' \!g:SJbf *%Ĕ='Q}BR<)1MSlkbX^G˼mRŔ + f<9bN$ClquD%^=A0F)f)Ɇ$2G, ̈%yqBZSJbfE 3aJk'AOL1>1"3'HXR"VPVbJk\1dy,IM^ߺ?^=4{ iizو?=2>\Nv ;},t| €J@4?+\PWEN$W&! S0ZH9$WY"i1|Ta"WEĸUw6fW8 +lc*+ D7 |%^xdp. ԰P3$tWag`f` 15p ?t%L̎&vE[v\Mřh3 > +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +880 0 obj +<> +stream +xYˎF+j)zz+ [ b Elhj)HgIV, XSq-dtQ(V _X!,KK!I ~J1q,C9֊mR3,ψ Ƶ'\G:Ũu'8)W׀իQ9` d,`4Ӛg9 6_f (U8M0'H1M20f &J*s$c3s,Dd'INQI)zڭrDş8ۦ;tܣҡs\8U=* +j_}>\NCx\E_=VbDQ{+*AC" l>`X|D" tƅ7B VθIAŽ Ơ,'3>]U *rnՔ% Iŀʢ/~tjnR\ + +v +bp1j򂝂6<ÒA1`kD:((bSgt +>} (GgO}Z- +L +w }j2ӹPuUz'AC*rIyDGC;O}e5]*i몀ќS4#WA#Őݡ<-F_:ОG'KN 4FGpV !(g&`l0ŏC0˜pA=ۂ( ߤA89h  2L@löI91;"MfEQr {h1F|Ȅ)gKW^)*7Öd/u_/憢2qCSޛ5u@I;?9y>6?w0[ݫSm;CWѩj.Ms f3 9Pd+{evT!帍4UĠ[/r`cJf;o>6>x́WիQx2D#"=s`X+פQB-kRVGC]J53{4Z-5*&c\{IŜ)_ +?W1 Ш^sk\u~j/ 3tĺo j +cH%k9LPͧݿ%p?\ &ICi'S. 9KDExxW|6 +^p'YpZ{UR*sv\-INΊ،FZ#>/[ޘ*2cϰcΨ-5ܼ4f`!w9,#M3oC cӴ2a3'e[9$XL|e"y!L5V&Fju!?5̢QD͜gZءvS؃2OEJP3Lu}&(2<1FrMPވDv_C,o57F≹q+PbSfeƱ)}e)9fwץc^%aw.qg,5E51.[WF05ޘ2Mjd6t݇Hpp ]g>ZI.IXGRkXPYo5e&ՈD}o$\afjT +sTz5Teeލ"߁D%_կ/umQ<<ت^A]BD^4\Cm2%hfqV +endstream +endobj + +881 0 obj +2122 +endobj + +97 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [882 0 R 883 0 R 884 0 R]>> +endobj + +882 0 obj +<> +endobj + +883 0 obj +<> +endobj + +884 0 obj +<> +endobj + +885 0 obj +<> +stream +xWn6}WۦE*bd}SXtF ]6p!%ڒưg\4C3BKtJG@7Kv&Xn%*k(^)4 cQ™LAFɰ=ai0m,/&J(=;/Lўw? FJac*m"mJ a*`agrQCͳlֈ٣MB6a I20wr ĪG"b/m:؈"6bKM{gdM#1Ɋ'ߖ/#E#=~FI|7y_@i2 +DZػBkd>!)T4k𔆯M{)HsJ(p0DA1H?.Y7EB Է܏77-trرR0ù&D!Ð,$425N9}[Z춮rMֹVnO8PNpF\Ljl&& =_ "phv㰘biڔ[ʸ?UDm +endstream +endobj + +886 0 obj +1277 +endobj + +98 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [887 0 R]>> +endobj + +887 0 obj +<> +endobj + +888 0 obj +<> +stream +xXM6W U!AdI)"( JU?)R\i{l|3f/NRCMNOܽӌ8@^mnҤ ESx˰?n0& H2&(b8ap}yyF e(˅T`g/, STGX30ΒRi̯q~C ~U fGǪMc!j!s$2Sߩgvv0P@)ʜ-sB1(E"(0X$Vcb3Cn7|uE.QGgzˀ.-K\o)OhʳRmy<籸<ƳG \#',7hRz#,V>HތE6cs3{pOH7z"cf^E56sPl>aY{OkzΛƌYaEsB"Z@www 7#6Jzxv76čD=@ƺYDs +]^}#Qj5\!]vYMI6T]kh$/] <Ҷlй{oI j2jI>m{١A+h^0hH kB>ʲBԷRK8GW $Z%d>1n$ aX̑p$e v\"M0BdRjNxH UEPl+'գZ s˻x*73 %0[ԭ ,O|;KGR Oؼ7S@ շMQf_o)O9y fj`k?Ix5;&<im:fDXXi',6A bJq ~iݩ[ٶ]W͹ N!hUʬӽx0e/Mn>pO/*$$/~_ꓻ#?Fm3_;`r* +sS7ZOeK:;SLZo"Pd]e'暭xd#> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [890 0 R]>> +endobj + +890 0 obj +<> +endobj + +891 0 obj +<> +stream +xZn}Wd1`Nr1$&"#-ӶbJr()?3?"ZzM^= XQ麜Eǧ> (C.n[ck +S*, q~-!je+*Q +>bH\Y?:If"JX&B!Ù6Gb|< "XB&KzY%R0^v&#h-ƇKkK$b ÈGe] z+<,kUEUj+Mk%cL1V \ s7A +YoF 1&{vk{"'cJj@#DF0[=K$bknEx9؀{a15q<v:XUCV5YE"̘P&cY_.j=$VD'3cB%v)7F/kWF10Hǐ5ꆈX$biw' DD,a1VnKK$b 1rS8ˣLpEmufBGecL荱b\i_Do Л6l!2zI&vxz~)#Ƙ)ʻ_3XB&Kح=G#LF1 vZV6 ܭe] S^䜯'D,u)fKaBv\U# |UۃڴZkc7w}x;M U>V֐SR1kJ)[{XD$,}pb, 0>zV )7,F(?~Swy&:6h A ͽ߾[l'cJv2agI~60e<42նBtݤd|QvY8n}WZudg,f1ukb%n`MզhaiX,\T^; TJthNA#N`=I8 +ةi 0[3a%*31JK76Bf[ !Ge] ^;Z9+G'?źk(P0TK(cnUUTGS%"A.}>}_-պm6;@'Ӫ8mVQ:}{`շ.*!YG&ez&6i&Wf rԵpmF;#dr1fXGh*m V€=",{M"6:kC=ƃQіG,֍=6Bj|Sm׮Axq55V|-2F"r4+j"ocR 7LmE0G3B6|D>d=#o?"Z/~62} $5cD#R#Iz$pV: +qF{FrRI95lH**L3^NMIBɗ2p4Cqb)m38awܧ;?Ƿv=.նm.z dE_׳]0mZl* 6SgN]/"f sZl΍qtKt)E=>1˝ +a_x4goyF >ؚC ZkR'wo81;prv:a\o|y<֭w]6ז7^?V7%&Uuan> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +893 0 obj +<> +stream +xZQܶ~_spPD$M> pAP @!johuPP:8á\nirLR#7e|eΔrPo_mҤ,R TqxȰ,M2K +i4hFvt\}p\l"L'YZd-<[l7+a""&v:,yjJe֊!1)>!rS#bsQI(sQ{@b#L'RNn\Ɗy$RcN1a53$eݲզcۜҞ+2uoS* zA̅.;C3LרyB@?0#",D ȅr깕KMr+]~Uk.$L1DyEi|"#v0f~EvumG"<FvÕ$ȱ<4 k + M{ a`%Gbg \SJ`2`U0}0`UEX0vFQ;CrKR=:C"f|uQDŽÙO@$v0<)F 立2bpc+a53d]onUyHgMi,;jb9S0VoA`I.z*3E v*W1^o!nt]W*+ĔkBBbmb)&+B?!zC+F̫*X®b3ƻ53d]oVTg-Ӊӂ[f"\=x!Ǥ`IyI')Po=[0cFEM )V{z"bA%(}m +ƮX9dgScbPp ꢔ6V#bcJEM Yۺ[% 女8r F\WL("L=XbbF%4+&i$b|@7B\7+ # *M6SwEOCv0&A댽iE \1DbnE,D {'*l%l`>6_Wriya򁲖Zc +[͟4&)#/d^(GΤ:3d!uA*\C6)u0Nh!{P:}O4T'wQLêI4~wĥ:bߴߍ X;쪩zܧT3<H_QIKӟ"㩭u7&g|~fK1 \+bEJ؃)rZsig86)$%V%VqWY+w mURXOn6(ҫĩ`6i5O8KF?߄xi)+X +6,7ηUʤ/ +UP.Y ۹,5v(狾hquWcyU< +ʜqPKۺgwqy;GWÐlVF߻-t +endstream +endobj + +894 0 obj +2252 +endobj + +101 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +895 0 obj +<> +stream +xZMsܸϯQr1J$KRJ #3:9kAek{g4^?t7E{\T<|S+w !da mbtaqQM:Y Sr&*J a1Y/te'X ,H9w3EKŒf␐"qMXH%,,Zz"8]_͔fX'%飁(S,"#"F^‘nd}@r"6R,aR>:y)X)=JX:Yϐq> +`fH4хv9f S(@c"ɜ,0+Y=تzLp1UXk!! 3adz+izoT/H2V iM^VvXDFE,K넥L3$S,b# *=5yXX K^'2d,Uah.)KY eBKS tl\jw=RJj.Ū@2cAFYm撫deE"zI2VaUnÌCD֯4OkKn ˴$lboqSͳ5^ +0%ɷiF\n%,PN8},}',HRea5w7񫸊vK3KIscxap8#dPShy&;W2 KmcOI9WZ.woHi*:~P-O+κ⊒tdI?شY#8ShbӁgȲafneaLĹ #I2 +&,ٳmamNX2/z, ^ga~99*b 0c39in93s 7TJc?,(vYaU*LX|K3 }V#[^oWF;ҷ\!'@qr#ȾioKkKz2 +:GvX' +ƖDCjIha*\;X;$nNOLe*oÊ}oiUR2ܘ`Ы'VtֺPJ ;p~u԰a5mX!+NV,aR’5JCxY=<0JtgCu 5$aJ~T!bc nJo+a(`]0j#8QC$zl𺷞!t +(BU(ni|(3ty@cXv"}c(oCWY,T +utg9u_랚E4hއŀ1,[0 atz!D)v!-2L*ُ3&[ ef ֥ ==V ^3|sX kUjG( f.$Ark'ǡpO;<ۺk +3[{phg<ܞٹ5Xw]sJdTpWOvfmEMs.ߛ|WeA$jBK۲4u} d݌Z–ŒNo`/S +q^,*3p8|$^1(-t4`tw ,|85?Y? DN{96/`?۶6A55o/ (\=athGٯ=XA!ƃx}> 8O>>#:tv?oܾATsnv͎  ۆ&Q+k4 #eֽ4uiL- ʀ7>8"Z7ڷSo;^&5]RgDE8[ZUЁq02Xһj'$>q"ےG#ڻH?qO.4h5Jw~ =j5KO@=a2zi19Okd¸kR S&^5GxI蛛PUM ߠ  蠉JK,'Vp,EgrژU;D |7wwBs 4Ѹ-W,YNG;YQ,\bw/)'{QاiA&CNvaJev%\eJ|aB*:"j/DEULT=>?5k̫AJsFTW=1Am8[$VI&+m|OEa9Vc_pmJTah?#鷄C6 +=gX)|fʦnI5lפF + Z!>+> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [897 0 R 898 0 R 899 0 R]>> +endobj + +897 0 obj +<>>> +endobj + +898 0 obj +<>>> +endobj + +899 0 obj +<>>> +endobj + +900 0 obj +<> +stream +x[ˎ+j96zXF xXA6Eu˦Eeҟ'X[T 3hp˧oǹ6(C6O)~v cRoqik*fL(L)auvϛ~9nhecM% 1H`LH¨v7=^_3rȶ폀ڝHN?~7ӸNJvgkt~#Zř|N}vDq#iSh.Vuď+yVvO0Epq 6 SFM˾&TRV!%54?M6]2툗qd/}E:$|Cha_Ϡ.8_?3:T%\v:e3ttP{e#tI;a.}jjXGC+p5}p`%1ѐ0jkXIG<>v }Nw#<L2H;6$7k ;&#A~zsvMKKhy&;2KK<9seN;|Z +\ +dJ.f8)L6̋2aj;`gp3$E bF[9Lp +Jǹ#9rHt,;I6XթO~za2P,`a!m\('`PQzDy,Vcy:NmwYdŢ-`LmyOw̐r)zX1&גo_p\﷋sF uJg!5]iS~2'jnIOq%_eZ-Vsb' 6aj)NZ-٨2ea^@6+hVr"^ 2d.yIe8$'-].p|fqE;¹Udcr)B@yI˹wK4];:&[r85G:قn%nݵ%gm6{Z"tUMYsK|5l}kf+f\t?5͆6uDxj [?o+!WN9`mYrJ%l!Zn}DORP9:*Q;r.)-}ۙ%giTn(V45M VP6A݁ K>w\ݓnu;K/Th*D m^ƛ[Ejp3w8īoұ~WaNݛBD&s OMۗuieoH0BO\xw㙭á9 г]ٱ=4jYS[jϲD\=bдܜئ=SufSmyy3;awNѓ?*l=mjڕ+vl*&IaݮlWIiRT51?"NؖO.-h7E'Ge;y4=T#.hfOcEȩ3{nj +>|9BX:`V'DI!YN_>vIO;r^A +Rg<]S|e@ 2%*a2(fɲײGMк˚jc8:/A{2荐6qqm)o$ՙ*Pϧ}.}p:B(=ᴩɫc*_o;==Qy6SK +YB5ۆ?|At}off*xHhoWԺտo޲X}Gaٓy-8p4L3 +u KW0P2henÚ+z4Os3bxEÕ*„*o}Dhc4w{,XU +[kѸ3xHm& +B +z 7I$/ cKW3rǡ0]S-J nA{4 +_mxɅ!G;+|_a=ߕΦ+bXR_F#z17PAnF/2LevHM xtQVҔf}:V5P1Hh\Z$q*ϒhsa򱂀ܯ/ +endstream +endobj + +903 0 obj +2518 +endobj + +104 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +904 0 obj +<> +stream +xZn$}Xy'XVRy@A@;jI<>3 ?&խJfq<*"(Jÿ|F' lw3tV[#L *g\ fd块B)SEkI(gl XRfz^lrف08䘫F;I62-ga,d!!s=`$|-z=4b HDD X2XP #%l1|$vRq2X0b#kbgXo*?i[YLi 4SՊcRZ"Lh]C  c$E Q+c: ,9af0bCFX c$,3$d#iWF;a +қeP%d&"11`!kBIkp9%d&x2YLimMePӴT+Z06<&1aF"v•1Y,9־,6d0&LX;Cu$ߢtG#,VRPf1iGLxQr;CX2#FXj}Ikӈ$b=ҚufgXoqcnk䀯8+c/4pa]f˜0 #y;Cdʘ$%UWg7 aa& 0ΐ[^=(b)%˔҇EL#"11sرJqӈI]o~mf-V|/@V˟߽C+Wm&-)!գ dA=R+oJ;JFp2C (,efyTf/-\ c%(0ؐ1JF3kb/\τ pj%=C<"i.7%gOMAGeu1OG&T3;2Q(I|mpG@;SkZC) gP)bJW{l;I"`L^`ŗQ J<|qMgByD+5f0}Xn @Ctd ׏H5PLկpKMLz:C^f1?ԜT܎g܋Q,޽K`ԡϪPy&]aXJj{)Q.MW2X\:@@Pa$\| H#֧ `>V8Y!Uߞ, EdtXӴr'D0JK$ +0P .'#4?1+c!z. ^Iv?ؐ"[3\$ .s, Z|Nܧ/L!VQ]Oܩ6PC8^3,톁1Ɨ31qazja`Ì^S2Vai7 +{ޱbCbk$ k5o+1/0'd읠E\ +Ty^ +rZ] [>Fj,ض#'~y{q|7[RꟛlbA;\ +Y Ud'];?l?oVI@% Md~smz #YAj6>zz {͝e醆slEPsl?;svmJ{h:(w]nE[qm^3 oshU&:엷%{\n 5J >q _D+zD*UGD+H~ɗ\ ap1 X{A EV/8_paT!#,cM4ab2׫h4ˊE.=RcO*RXhNk?]aw4Ǵi`yZԚxcHpQ@jFKR \ R40@.ņbk@(cbj ^@hEO+}{R2uåΗ۱X`dR~f׉v‘ .y ﱂ3ۡ1\⁷jW|j4X=τy'?B #ഄШ> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +906 0 obj +<> +stream +xWM6W H}AM9l[P(V-K[Fh XOԛ7ÙHfrw W,[!M?4 + &[ LezPi q,A#΄D)B[% HPuU@h4b?#JGR@5Œ@r!gnz ^Ǫc $4$n;FlJ%GId؀q+9L#6`XDBS|7؀\Dl(bG^{ roG\ҋbpX,^5ѾwY+cʺ+ Ú'gUlDz`YeZ۽`,HEAsD[s_afꆙOfv6[\ʎMmMm'"ζCm/@xbJX)&~x|~WLSkYV|jmL7kS]]{F`쟫OYۖ(8 :\t;1S::i2n+ lVU$=`㪁cz42Vy Ԁ&]ck> 5'\!BZP\$gSJ}VZs*Vw⁇Zpxf$Pi|zY vYF~Sy6:հ笝-$) +nZA7_,J{b仲|ֵHH{Pa]ԝPKcv,*vχpC~*CM6\yG;ET(eU]˺W=g'V5͎UԆDƙTM!T:T܅B%{d +hu1B(û**ݹmJD"̔NOX/jTd)F hҲW*][%K+\颍zKkIG;3߷T o*VOz7uj0YC%mMn1j[V= 2Yeu?b=Ua65Ghm= -YgnzٲS[cWt*lj:2_3+1yDϕa`#%CL망RcBU;&VUbǬI,򡥱cճC T7G]} &k7 +7]mf#&b`I^e'?_]'fmZ$}2={Ln ؃Q.Jԉ);T tm{{Ȟ=tP#G }P8o0@x51i1ؽ#H&7pHQ=r<?c=r?lBOq-ʾ?`Й* 7Q ?_) +endstream +endobj + +907 0 obj +1617 +endobj + +106 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +908 0 obj +<> +stream +xYn8}zC/" ;ۙه` (ݴ[eH==?{Jl`_7@Zjԩ +ORa+TR3~i*MaS<$75+Ey4yLW|R d27Ï;VrTW e6"ՌsJACUgI^)ddy3ȔGXv@ TLDeAb^QoTV]Vh:V߰ڮ)N㶬zZ e~>]YԘΖ2ܷv{ +bQ7-iro'moBI6W5r-p#X[v^xb_w I8&rݺԐ)~"+@QyENjڟyLVݹA(n(/(D1a?Ez,qrRl]vHVw.u۾_߷]EmA!=>>2)e_b +$:>x4<ݠObigK{ ݷ8}b,7,O7x޽6LqU(VVYaK$4{R`?B 2)( +/pW\kCL1&e&uyqU/qp+׸a^7}!RRP R9zWt!jsA.}[rA0\iNL fOɅ O 7EdYD[?f6XZ\_P> c$\ϿÁBˬ㭩gJqέ> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [910 0 R 911 0 R]>> +endobj + +910 0 obj +<>>> +endobj + +911 0 obj +<>>> +endobj + +913 0 obj +<> +stream +xZMs6W8p`jj(ɞUJ푑h[t99l$-Eg~h xD_||27(9vz8֫VBB860eyC+`F΄PdFLfa b"b >x2A4,0٬kV1&vEzK=+0I"#b|EL Qz(mƞ؄eE +P3 +b)6a^)Ũ#;A|aGMAB,ӴֶJ#՞bP +LJL06 mlp!1 +`hz(2%f 3"sHbFH6D77T/nXtQJnҴQ2WlB2&L B U,b(9/Ӵqr؀02#[8|Slpe7e\CG[bDv0\#WpU4.z!E[Rԁ 2pjqԿ\bPPVؔəbqM)bqEvFVKl}U,`dF,E j*3PBbgb%+GoV fTRW'pZh!d$$csԚ .Fk9>ap)/gK<kq#8X(丩*," 7hX@qK!qV\LTrڸљzg/;#9S +YGp}E*;:yʴ*Se* IL,3U΢lz(Ksʴ*S*bpT92^vB\2|ʔdzYgE /RW2iU$ U6U=S,hI)\Ӎ50G?=?T=v`ƻQO<3ȍ? о {mC6{j Px x׌Hk3X5V SwͨL +Z@R5Ԍ-߈ZG3i~lzv\w^'V5KǞ'n`5'Y k3k8Rxu-)`n CJq7 f-5H)aV=!6qL[v.,㫡U! } rňbudOH~aI` xp-aC#Nj3ٳwZV=>ki+ڧyjțZ?6>%ppiA! #zl%\0(a!U k!(INӠLC*mgUbFi|%vV 8Qw_(7`(J0eo9_hY1s>>YJ {VZy{e_c}%0zi*>Gp1~zT63pMkpB@3OaLB~;S߿.a/abw't +g?(@ۇ~Sͮjsu +c۱Dʶe]pju47TW~ꊗ}[hS֟#2lm=f]43gdL/8^Lxv̬}~Y3\{v_#M,G_Xܐ62~g1}Gm7O~_]{` "j}RW fĿb +@hpK +endstream +endobj + +914 0 obj +2062 +endobj + +108 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +915 0 obj +<> +stream +x[n}Wѻ0_ 'mI<@AV291f?&8 gU x=::}YMruEVotT _?_hmz? *Φ80I6<M<2̪>:m+HT0ր^ +\ +W ܘc^)O!w4WaL\_hOzwz%bANƙ$DPb%BAX2 +p*&#6Oe/YZ/PbEa53DMcF8܇mҽ.T3} V7cQ4uB̄1cF"vƅck>F1)6D̄1c$ u_[YW(FXe&E@Y,#C+FXu +uRGXEbceMX"6S*ѲscZßi8M.3bܘ5{!;CLBLv",9Ōi9 eF1&YegUe5r}6*,UD(V1^ֈDv0í!F~_bb-kdg~Yg禲.@١&em99xiE6E0 c$E q 1%K!7cRm0 c$IV@YP=P0߻̛pˑ)VX5aTb\1 Rʺd9ebU5a-kdg~Y{=z6F\޻1G#eFf/dgn\Hck|͘&́&3a̘1*;Cr*W׬#dV֐vSŴWLc)b!֊Phl+wSd؀&&vLrY9QMé^ gS07šk!q!co:F%b !X 5B5Gr3l֒w bB10'Z!;Cbq1U+L'hXEbՊX2^*ocg~+qupFp~C>ս .qTJm!ch0bVCEY#ϡ*}Ue՚RsU:!eU +X~k5 aJkB +6&dP\ +D= xsQ_H) 5c 30;}Lv7]|7.?t7LmDB+)?ʅ\LCUbڃy|ሒt7bk}vhBy 1 lC[ )˂EWk*a⑅;8B_YR(CC9!pkup璕0=6әhAAy(} sS:pG$3&] A,҂`g,*H%&Ăf-:r,*ϗag!{a6%pe0jxR2Dոb lp|SA$X#}HA%#x|KA I/YL=#OzYn8:CFv:|44yRqjkCڊx2yaboVs6Tx|nP҄!tJt>--;n壡l:XZ'B[?^ yjR>=KvUn/R50_D(USz< s}]Tt䞭I r o'b&hZ' 5~? {.2g'Hg]>#9w#7=c0b +;†Ar?ߗN{;4WXs&kV][wX׈y X]z$d[a~G{msmB ͟6)0> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +917 0 obj +<> +stream +xZ]o6}i1%)~HA$/fQ,Ŗcmd)J"yQ}c~QH8&'3T΀?tf'yLB&q+i`)O6 &R4Bh7fFV%)<|1$\\STJ2nr9{vz-ڳD;ä^fySPgJTa`T!"b3)6chM,Rx {@b3)1ZgnX1TlcjN-d2Q8H1pmd7iTؑCz#5 2p9LIʹM()3 +{pUav+ޙy pg&ȗ3$q톢Gf! 7xfU;P ewbL?]Hϼ1WD3蚪FiNk}`»:'JrhA"HPm[뷇Xc }To=w}lۡ1aշEÎڟնmzj_>/`YSrIvm=L5E4>W5 u[FG;oku  ~M, ]T\)(:jC \}PB]7Zh!#{$! $\<&iz.U +( 8%|%xz>SpE,Bڳv%E՝, c\҈ݞa^"8_NF"ሗ~ V)5mi+' +4~g)!9cʊVPBv96\AL +\+t^u=:Nѩ`̕M$l~O0 +U ܌df'Lΰ[Xj np tƜڕ=$a~~%wk8] 0O=O_99kc #+ڧ-1 hhsWMnPE5@B,˫bctZ*\7m3˗r^]uEwZi᪱]L`YC\հVR۷uݾ`Fa(,]\O}}JV^X NE/*} |1?*:k,a1+i2E= +h)Z*4 L9b7%@p9瓦 BXaV4'V8v^x`]u4@InްHd2 )r0 6Xf( = 3x.˯&Fl}g/m 3 "v^^B:Z.4 * Ke!aYMIph Xʁ-Ȳoծb\fe?޵%p+Re!tM;bPJGt + lV y7*TP<YfD9w|)N ;` E]Llmo]9I]-u5qy?Y2'7,:yveUf19\@v_6eW{vUnTrc[I1^\> '* xlؿzFxt{jRܗƍ +endstream +endobj + +918 0 obj +2520 +endobj + +110 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [919 0 R 920 0 R 921 0 R]>> +endobj + +919 0 obj +<>>> +endobj + +920 0 obj +<>>> +endobj + +921 0 obj +<>>> +endobj + +922 0 obj +<> +stream +xZr#+a,mB1j-c|J˘KIy>8Q$%J$>J,=/խğq'w3#3LzW 3R8d !yl `KĂP0q^bC3:G;I6-gaLShR1ꝫ^TOt QWL4e,yO%/}^XBGKZ2(X0*OZP{U +VsEkb:Q0 cIXM[2f`i}^*U$a20&YfHͲPDjrsB{kY;KbS̗WZ!L5&jY'/lHXXYF^;C|{]&`>8Gp]~ ~ʏtB̄$ҋ+c&&DBMLrl LKL˜d"ņ7Cգm#̊nU,#bceM'3)FOAEej؀L0Vք^I.k0AǣemVS+51 >0 d&%&a5 +;Cd7:CX$a20&Yfg+\oz'WS+FR@-k$FeQ,c YXaV(uRV4e5a53ͷe+WIL)V['9ZK[SaF0 cI3Vip`1YkbՆ0 cI,37Cգm#ֲ̡N^*F&+W0X2u;b2QlXYV. ivwR bjdgUwOﺻg7w-'ES;:Sjn2jycx):!S=Ck±NkWS hgw4+;+%XޒҼ/e;)l'e;Jَ?WJ~KJ8"e3)لSSΔjKٌ?WJm ))H&*%rTw\f|+e} f$q|Ƴ$_7t_7//}7/I=1Y-QS;އG)nSX,RA< : +Ul9ha<3a}͛0Lkeʎ A.`qG^vU7.$zֵ Ą`; + *Ͷio[<׏}n0zL]投@dA5ڔ1fx bGvBjFafXDe/60W[kGu&)Q+rrZoc۟S*mXw~'vH 2|t Nv՗eaҥ[[m𛷈-Bõp6 +[98'͡YX/TP:ԇzJ 0ed5\??> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +925 0 obj +<> +stream +xZMo834` br֎ga%XT+XX*u"2?ær9֛7<+ @[Y :)&LZ;al7X X G.{Dcyis9q!3dȞr^> ݠ1 b~V<W9Ki bZ:}#G<梴u(mӠuyIHǜb>"0jd'Ho"7juq[Lv~оq:ӎXq˘Fy1az!;At6b$e,bbb"DfHb"F$ >IJ^ MCd9DzvQ"01n_>D<bXN1*/bY TlBM)k0jdY-9T1(fa.biYΫG!!F 5 y 18 KMID=Dz|C FvM]3*͌EV- @R<(1RŚ !y,Q 1tVez!(GFI K`1Z؄ ]6a}wU41z@̈D,W`'\eh)f"&&> BdF$&bD2N2p} BbRδWD1K1^bqv<("RbI)k0jd'HoI%μqa܇S*wn׏J)Fɝbyf 3;mxApv '͹#yv ќTV gK"L|!tǽa&"Q-<\B.M\Ԝ쩂! r[@xpZ#ɐrv=Ƹ'K$"i>i~o :^T~%`#4Vd ۲WZ-wʈ)(r2PRh_] +3U).o7&#vt#|~p{Oߛ[g&ҙ/cL*ҩab_ٱUݱ@yt qS8H뗪m8oSh'OݺXm>a?Xq`]]:z4fܳ?}ݳ8?J.~cvՇr<$>p:> ޱj`Ձ}l-DY#AҎ-0EvW籩w[$0H@Ş*8˦k +'CdʔGƧV'! tL&d\lĕIyV.~BV7SqynOtd..S47_kngyﰒUZ[Ek}՚  +TVivBmJcViDܙT7ZAֹx݃ ^jqٯ ,gެ[Wݳ*Zt^oqoN}r/*f X0dyݭ3pe,8gR`w +nm:}kO/|N[UU7x#|u3x#|uz}>F?yrٶljM ?!]k m~{*Í&*\E̲CkvI+1L +!0_:`;i.姕J28D{fS;&Y +4K%u%Y-Lóf7=p>t7kYtbE˶?V +󅍥6^ݰFPc5ֻ3o`GsV{~wڎP贯 D&ĿpvEX, +endstream +endobj + +926 0 obj +2055 +endobj + +112 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +927 0 obj +<> +stream +xr0<]&N3vwU.C!L}^YY֌{$@0N?eGyk%#0M&durn(kL9 t)r9:h#j")33LĴsg4N f s($fC"eƚXD'ĝChq:;%'vbԓ2䣉@xiX$" ]fDbK3S&"%e*ǐOT]*',BbRI}Bm%'㒓)6lځǺf&A_kHVk +9JBPjVU,q6߲MO9-# jt\jE#zQ9i+PP/6EGE##s.MGF_iMg/Ye45`lgMLEAӪ{zoKet=tۧo+zvthpqU4MwP[_ABwx凢nN+Dr2Eug6ar;ĔB^<;o/gVQج~e :&sc9 a~.v6$CoD{0η/_/ [\i$ŋ/cӄy{ҤU]yv(k'CUrt+?Ֆ^L&d';kjѕ +endstream +endobj + +928 0 obj +687 +endobj + +113 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [929 0 R]>> +endobj + +929 0 obj +<> +endobj + +930 0 obj +<> +stream +xX͒6 )xt;"43&v6ҋ֦jJr[)(J)33;978J(rGWoWibTRa1IOdBd&3"9uD,ͤ˄)[ʗ$Ŕ!i1f$ja'Q]1%dYdL'3P6җK$ەʕ$1'>}Y`t2-d!&п|̩L>, 1rs_ &-Sl) sI'3޵Li7+zQ@O݋3SyY*l40)V/8"㞱ٯoAwߠ͟ۍEA;\d\Q̠z9AOU @Ζv,Vbp}StzNI}U~\|0sg]`;#l6¸_un5ǾheQ?Db˾xY{6Cۦuݣ}T`ߴULS5$KIT(Bc]˼Yn5\$XbV>]j2~ۏsu?]m_MͩEGd4kØ3켯GlĜXNP*V˕k8/sgF=91ﺁcukMkw1.T肆&P)2`F2˧BvTk1} GI*-^1ɾg]q1ރ#`˸w/ Ʈ fQK Ņ; fWŇ EؙZFfLˇ[B|e\EJ)9n¹J-(`ɲ03x./ +yl5yQK e^P -)N,!2u!Lh bt$*8Q:_C0Ђ +r)# CFd7hB^4[}UB^_-VcC}.y m 9<97ddSR~:2RP$]!(rǶ9µ[χ `?t? ; y$1zm[ rb g<}Q#fH[\F ~Zh^ \:n\>:gs^ԝ-&ܾV[{oQxqg[/5% 3rr5t+Iv+]sQR7Нp`Fptlb+Om3Y~Lk/|I>SK^ h>&й*aŨa6|]Weџ/Qtu]Qs岋c9׾GR2+}.v6 +r`EuРG]v|O]U{>zc懅 n7#:ͧ (d]7K`?qOp:okVwwhWAF /S9V/RtӬ~ ^aϒS)(Ŋ>(e&XI*să\D7zM)ɞXzSD:,M}O>?:bwxNMdYδ 7?w?-N'Xho +endstream +endobj + +931 0 obj +1862 +endobj + +114 0 obj +<> +/XObject <> +/ProcSet [/PDF /Text /ImageC] +/ColorSpace <>>> +/Group <> +/Annots [932 0 R 933 0 R]>> +endobj + +932 0 obj +<>>> +endobj + +933 0 obj +<>>> +endobj + +935 0 obj +<> +stream +xY]o6}cZ~K*I;.@Bc+;JgϥD6hcS?FSHx/t90z`C@L(,gsP9TLiH|ܪrRT1|m X}@bz,Q,`EdI^**#b=U΀{E.˅x=],ۻ_Ŏ٪zl7WmGtZc3 ͮfmu߻U󴮏 Y^vl:1o?d`<^UGy}|jU˞OskYgc]np[^F $}z$lOT —c ?g2/( +bA97rki/ZVe POn,N~ JWS٬>Q::6j77ͦ}v ǫ^qRVSÿc\1~BUcUP=>lVnjsŜj1^\?v5Җ*][FB^wTh Û\DޛC?\ ^8o&)N$3˴o/;S⬝,1R%uxYuWBaO;Yq2+scIblI (9_^έ=K|3T瓵wd3͆c\E u\-&DB +b5K׀NSĻ2xt ~ ~;!0c7^ԅ@E>Ruj>>57w"sSfBedY5] qkrwIy<5ձe5E 5tB aGƋ֟<@/J}zzLfeg ԓV-=mqO cBAFႎc|kAoa?[GX +endstream +endobj + +936 0 obj +2112 +endobj + +115 0 obj +<> +/XObject <> +/ProcSet [/PDF /Text /ImageC] +/ColorSpace <>>> +/Group <>>> +endobj + +938 0 obj +<> +stream +x]ے#}WTľ+ +oe{8ew93|Hd $q`):$2O&%Tg^$U5"r^ &W41Ÿ~[:jOE-1nW"mƖnMQrܳ~Pr!=x)%WtT.n:e2f?*}YrqId.J/MS_+e&/-JW9f(26 C d5Y{{4 ,>,i0xMT\?sO:t0V9oYAŋǫۏa8l_ o{x|@k3. ix'WnX=k=<3 +}w.V6ʼ# S\Tq˔2e=5I}dtؓb5T6[U:3=cQˋBR*Eu$,+*Or^REBC_ &mp߁9 *s,I+} Qe8Q*/1 wJDٰ7VjvG؊M@挘qF1ngq݋(24/YWDljč=юqʸ4ce+Wg^r9uɇ67nfk|CWmD۪1 X[ƣ,.VV޵6 QkڑmQ2&0Zj2x<^wU$ފ0Uu}]K瘆EeGS#s3#j{aFDOto؟isd?zxzخsK!!0t!ۼlsb~)6pl8" {1Η3B9g>/*EBhBQ\ecjخ@»[&T>a>@{iQRfr_ͰLؿ@(ijda%1tdI1 О+J+]Jp}O L쎄/Tfn6Y2*T~_0ў$ĉ*]cV`MEfªŴ?Jx螅jkdE+Ul}=W[UUK6Ldt"2e6SjǸmBRM8z{T4`ܞ^Dg'p>dxk*0Y~6/'`B+yY '3Yb/cq __=1Mu7uѻtoy2ۗ|= l_ +/X \UDuklBڻBtV{"*cdmݝ:ﺚlBH{Bd8'h"jB7EhofƯ㋙aLvegW1qaVy&ȏ7}MIDfQ4#6(Mn3c#-5/yjK=.3臑A&7@|` ;970mPi`a>O0] ͦa=~"n\ qx\(||y +vFBW\6(ǂi0 Fv 2Ԙhv4apnUHws h V!90`0πLlҺ(I0r GN<s<h(& !F.6dRr0p۱jؽf}~sCu#o!† `W9^ +h$ VT_D{B:p #IAxvHX'xX.IH> .C-_aVYkv2"TbJ 4E1}о{08.ՠ@a.P g.aU>!@ `$vP41ug'xG$$2.v#04t^GqD5Tݝ`FD=Qny h(EFP:p>0 L d yx}PB82ya*x őX[Ò^!.b1KYo%`?8"@=Hy)3Ag-Lhgp0@LRv+o2o)xT)PuI2Y1,7Xā\Sw%ID~<={8NF ݚʧY"3&#~ Lk,sTdq$l<DNmUcUEZ`Ǒ}r3roUƚ84$5P9ݯ'isZKzǑl<*`r.y_X?$,E0tH"zh%Nt֏#^Űy_/&ܤ)o#[8;rǑ$,}0`Hr8՞h3GX\gn`Y}ζHu#IK0H"he7 }be'i,Č$RϧoXzޚq$#&XZ`~8(KQ跱S|,֕v?Bec/B&kN#Ժ)gH=Ʋ^9˹`J#|Rk'ODurYJP]DGoO"W9L2xF=f9o"ٖ8q̌-ͽuc<@.H!ra [%>M7 n$=ʁY$NBBXZf'[84Q1WRz֧HN#cF n$\vMxԳ/{O@ᔏUvݜ$-) \VHi%-OH8+HL7*,$$\!,sb7T.d0'/U :'nX4aߟ$ nF56^ }A仑-4B'X^ħ~=1;]Ɔ'?mRvbUD Ή5ivvNXhQf'hs^֞iGw /Fן;A@%> _F w󵘏}=u7: "Z *jxcK6d#$ #=h$W:'hJsQr9{L)aP (V. ?=o/gT^4rn@&+x?|=]M +Y=Q?6hPxdcgprTK*r`  vTz[߂}~=εs#NzvenO`Y_. BFrkIخ׺{>bb9SE<'$Go*`fGErPI"X&S3YK?xٮ_ bN@LRʕzh3oO؅+zV vlET&mʧ;ti߼~5||ͻp5fOOpsݼ~=\=\`M&I`o?Oz;>\ݽ`xxOx7Ca}Y?]7og߃O i_^p׹7&Sp0lzyν<;_4Y'U\S/9^]00EN7asw뇫ݯ֫=}0JI [O -~Sp$x>ßOI\e@w:~M/_[U7#w9x +endstream +endobj + +939 0 obj +5182 +endobj + +116 0 obj +<> +/XObject <> +/ProcSet [/PDF /Text /ImageC] +/ExtGState <>>> +/Pattern <> +/ColorSpace <>>> +/Group <> +/Annots [940 0 R 941 0 R 942 0 R]>> +endobj + +940 0 obj +<>>> +endobj + +941 0 obj +<>>> +endobj + +942 0 obj +<>>> +endobj + +947 0 obj +<> +stream +xXKs6WNA$wrLt XSt R\@yb!F(~`5i-RN/-D5 +"J( VGcMVa%(0&IuSN'dd a΅8yg`ZY(ѱd>X,yF^ĬHLkFim%W2%w(1NWA: ḇD;^XGIN6icyw,F "\:F^Y{dXog7XrJX A6Jbq[7ы8haAgq^ +\/.ET[;!ieREI*V,JH7+;@Q$7U"4O,V4#qG-I eՌu߱8Ԕ0Uɝ&?N`"nu_LrbM cT@HcvD"ʉBIaHj/f{(e|I{ՉL`]Z $Za(dbf f.2#1 L>s4`@BCL~̇ 1q`)&*2n; nlC(TS2Peg/'6#I,Д3h9u{/'vҒnC!'NDu;}]x{q^~Eqgߑ&>V M1FNnMt)qO=f~i [K[;1 F<fVEǙJ?}{BwN=0==Ա$1e?ΦԑF* o"M$0]O8t ki(o yf\vΫcȋBNjJK,>â1Pۢ)pA"puޢ<t + M>Y8Z(-ix.ʺՎq\>R>mKt8jG9rpAwZ%s"dNŮ>oԊ"8?Z::gdn{jSM6k;}w?z`Ƣ 1|1⏫/7]Iֶt94%pEwLyim^] 6Dk|Y",?\Z:ÔgdEq"ņ zSO*/"=Wכd5 化HFo. KV6 .bdJ8e:{<#6IYː7lQ۲X0^EX`՘7HXśTθLh<| +endstream +endobj + +948 0 obj +1496 +endobj + +117 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +949 0 obj +<> +stream +xmQN0+XrS{H6m K3#-—]Ȝ`KR6tsURsn:$-$R`WEC Hђܒ'"zn *YIK xV9:o|m* +juw ddE1)2M$AQw[ti$M!Kf&w`=̱ ;?w|?M~-ې1c@ٲ/< /tUbHkM%4Ro┫V{ +endstream +endobj + +950 0 obj +293 +endobj + +118 0 obj +<> +/XObject <> +/ProcSet [/PDF /Text /ImageC]>> +/Group <>>> +endobj + +952 0 obj +<> +stream +xWn6}W) -0 SP;"kj+m fC6Gᙡ)?\96a)`—C[uY2$7+U|EI DΙiytp: HkP% KؙwaQ$Kjf +NAݑ4mӮHyw@2S\4_ =LaЎd&Ou:v|)Kp偌9tý+u{88= փa*fܓ|IkP[`(Q}bUP77wrGWh[QHvc4HeY*(`|WyOLկqR4ñ/&l#s,9}S tʜuilNun -ԱwN䏪JyJ5nr0巋t}vq+ ;\pPSgxEZKa`ALJ,) \e\0l dž` + c\ CG1%4kj(bK֑=ӆE}c{okLz{e5'Î@~ k49tۇKlm˦npf:J&*sGO|5 +U9M|~Sgrɗ~H m{1m^8c4$Ƌ[`#G9Wic=v-l!nulF@~?v\e@kkK/iPU[mW}q[ +endstream +endobj + +953 0 obj +1225 +endobj + +119 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [954 0 R]>> +endobj + +954 0 obj +<>>> +endobj + +955 0 obj +<> +stream +xZMs۶W`qXt:k;43Q%#ђIHT̷y$qqA+l c{ /J_TR >&eW ZyWCrk~1\k/l!ULy0] asUꢔdRp5 u{ dQrpJD8ױ̀&ʛ\)@N| )f +‡ȎaMp'bD .r-$/=QSbA> +Gi\- Qڌ DCևp#{ۺb2RÂbCDaNL'aِ>,t0N|])K6OL kvrX߱ߓibt,eĘ0"upl;U8T֯U} ݏJsu-o۟NvLPGky:#q0!#.qD +%'ZDI m>eHK7/)5󁍈?+ɠ$$zCڞ,GAʒzV2ruMvp|K2(ųAI 0W2 qf2PIm+%d> $R<;gX^=) 6LaD4MvѶp>{J.`Ɗ>YoIxv(na}UB"nB} tгܐh28T[A) JЗvҰJOKav@6 8STO&"&M:QiУ@)lԅ=(s 畖,҆0"mWmu\ߡϽ"X.~PȢ*}a}Bՠop̶Ze ͽ,\ FrX_Ȏ5s Ջs%ՋaOr/)\YbEcb楊ESŢ!&"Y +b|OdOQ,bT1Ģ1KEcDF<`{8e8ޭ<.}xh7}b1YLaEB(U+֫֫ˁ]G„ ',O{4R8WRQur"'"ܙ…=6R 1-]b3qCg`'Q,bT1+&hLhtX4:FuZFEɡ8f@MjΖ/B1#B#4 ϳz5PjL=-TaOHR1~b";+!kkĨ=!"ܹԺ X@.ٕ*NFp!{b !E*X4:ѩb3'F yK1/}Q RɅd*h5`Y; g9e#J$=rJH\IbDX5kBNE3 =K;V C@ԫTbCL . V8Y Q,bT1&LrXt9F.Ǩ yV#Y"iZwF ' +oL!ϪFgOAO[bZvNoXr%HR1~b";+!kkQur""ܹ…\C _^fv%ESŢuX>]rK\FGv4:Ul0z`QZ"biAF"lh~Um =^~$^XVԬj=j-˺.tpǻ2Ke;`h.fHiq~+z/۲ 7pm/D]C;&|r0!` _͚y엫Icۼ6\h?n: VXy|c_&%|)3diW7ez[﫶YXp kpy֟>Qռý*\@bc;@n̏qWs*rpw.'~_-jƻVBZv$+7(1 +endstream +endobj + +956 0 obj +2448 +endobj + +120 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +957 0 obj +<> +stream +xXێ6|cbW€'7p; peVRۙ%^~YXjGv:Sp򥷻_vytBiG)ˤ&5gRʬd%Sb~tR-@]̼MYPʳRDyrYG;V*W RD.|NN1$4r؅ޅH'\ykTs3V,`% ϝ>HOq*D,,&V (T1E)Ȓb Rlb>#Ŭ={eϴ˚c פ˘4#%IdXb̀{#DŽSLfvZrƌ7#?vGGjS6i7y9\BO2vGb^^dg3> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +959 0 obj +<> +stream +xZn7Wp4F`@ &`6v7%u]*Y*a,[>"=/6* +'?0/[Y*acR7 &h1QY)iSiMD f+(MG$"BLV\JN]{ +m@d@[-#kdnMWvr5U,a<$ HXĂ2)G$W,bbI}"RE,(=B F )㍥f*j*,i_ +do\;}R x +UL&"̈eg\r rLWp;&6 2'[GeE 1+D7QB1x%$P+IK"R(,D XbpvLk1b)XP,zzRӴ/PzJHwT +šaH&3bY`""Gi*ވ)[9ts!!̈eX&Yddói7[(XyjǴV$@tJL11LNdϐL%L9(y^JZ*fS܌%l:$ޞ50ӚCL x<7 ɌXax!{'k181VYhCB2LȞ!"q=o}zbIM5"b 1LNd[!+Ν:xyXD +"5b׉=Cxo~gW>MS[)N,fAzoWaMw|etTt,6]4-n=Yf݁}wlHא;!~%5yl-_xXr*fY(U.b<4݆|ɯ#$*tO99!*Mȿ}~z0~8S-?xVMBK8/-o<=5V|.vФf0ޯPY'CO Z"oJŕ0kт%Tr| * `ᅡc5RO|ϧ [K}۠{r~<3ww]p@x l1 rI@#\}+ar֖ğXWqUR2#M2 +endstream +endobj + +960 0 obj +2188 +endobj + +122 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [961 0 R 962 0 R]>> +endobj + +961 0 obj +<> +endobj + +962 0 obj +<> +endobj + +963 0 obj +<> +stream +xMo7SB(u'Ry sc0861*NRg9VwX)[:ǝܱ9vbը:#|V`]9%CqKML0NL%&1J/RgDULh9nRIa=l&lTg$ϔ7=J݉cĴLZ9ʱ\{,)CGa#dH6Բq8wDf+kb54ߖrfL9_G:F!+n77Iaw +G[ װ4 .)pz;ߋ?on1Wtk]>4{lJ|}C#ϻVmx>:j|a68感kH7NAXt- X~u6,`2Ua㾵76<ڹV&Gॊe~]55N/ci=NR!3bc@x]pSD{Ǿ[q_}E@kwVRSZJ70mBHxx0$ y :42,ƌd0>-2V"Æc&2WIX~s P˙`p;UiTC!E{- ("IQz%h#Dh$ƋUnYj,ϕ> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [965 0 R]>> +endobj + +965 0 obj +<> +endobj + +966 0 obj +<> +stream +xXێ6}W VIb&i4qgZm5舒|PC]]&ExιIHiq0bqJ*X&K}@ `@?7/9QcJq,pFp"BRg?9xeU BkD,5TF\lP9̛hqP_TYW3֙US]ֽ]@+|4%s[sqL;d쌔]CwYqNbLW4CPR? uglꟅ&k/]GŧVRW;K1yqҚ { قބ܉V=@c5 +Bpm^9ʻ j7iS\<W1Yq?|La^?iA۪ޞkO5se4\&nP"hX)*kpl}s~3վk*VE@ +]Jm0z^UTvg3IJޝFZ<ưRٽy:TMAWm  9Cö}.FBW]`\u ~8ƀ+΃>ĂRL705t!W΂eϭ.YEo,1/&_ntkkS)kU>5iq_mT\ +TGU  +{! ;I2hh%نPk K0s-5Y_$|5`b5V~ɜbvL{ٸeu5IY`+6쐞yɦl;y o:s'{.z1ĺE~:5Y_$s\P{Vs@5'!-bGZ}.8}G=tnޞ s.{u(_'kxuh"Y1\<mUZ/ ``C&Ww]Hh'Ѻ'ይQC;pb~ 8h[#,hces r*#9,Xp -nIA'"Yd^s\ +&T>js+V ¤ִC?M` N%+ XWt Й`A4$lNd}?ҭ:+ #H%'lnN] ߹zhp +endstream +endobj + +967 0 obj +1573 +endobj + +124 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [968 0 R]>> +endobj + +968 0 obj +<> +endobj + +969 0 obj +<> +stream +xYMo6W-%JIl(biO{Ql&Qז4?>E*r"{{lD8o8##Yٻ +Zjo*=a$Pe@D'ʮLt݂2>W(ٛL$ɜ-dYK׏t8퍷'3ps<O0+Jeg"2&D{IgJ;w˰y*ft68zlu2ɼDuX Gobf!X'36^*F\Re!x^Gsœxi>b$tA瑓9' vuʱr;waSǕ PP"7wUQ|O$"#C?6+6y='}^#7Ζ7f~1E5yŦU^|:V4" +#q6DJIh뽱@sUP"扊s4Fg]~d rWV͇|S^?4|NUJ?Y7_}nr!ɕip  R I픤#]H..?5(@GBe7 3FxqXK+I 1X ,⒯$t]L%f""^f FB$!(]})څ#I2NdG4 T2`=/(3:+)ĔCu ++x +l8`X`@_NNpdK +5ΒjR! AjG&>@` n`Sa.P$+|6={5m +9/ttab2"p(J6B!R–򅖝AG "5cHpbǤĤqYYn!2nN] @p ?+6hT>RL :i[v6jrѷ +n_ eSFaQ5ԏ(ě$cNj Nh OG9Qí{SXG.>/Ⱥ,uE})ccʲ6 Hv]Vl}&Ϊ=Ɋgr-wjn&Csy Ywn|QWyqO6;6B_5) lObo[;=Ȟ>eՆekM‚n3\xC_J4QI7߬I6W`@KZ+컯ɽ.te^f ֻ[ĕ%r</3Gv\L쐸 3$[UnO> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +971 0 obj +<> +stream +xYMo6x~b`&/ "ضRCR៙CIjsǪzU%R?*VL Pӗެ߯(eX(*JsCNV saA +(X a(fB6+Q3lT&rƞ!$q!ĂJ"{ 3**F,e{hFr?=y"FqY2q=ɘCfsRa%X( {dELbJƭ^j8}$ ?-]3MNlW'>gmT,ʱw Ii̫M +r>q韯a_Pp3A@J* ݛMeͬhZ3,fz8}wlkS=nWPL+Mek?US=6MmPugJ0fj+3h?,gQ).U!|XC%ꁮQK'$vvsD cRXD{+Z`3!0QJ& [ 8S>uZ)Q%yၡu!_7{W6o͡(i.vMrpyLZNubs8(Jt.60*'$$vMr$ Y!|MbudObg{KBsqQ b]6mZrg$Ps2ф&-ӈLn@le)U`OL\Krg$Hb%$w(QG\,wyX-wv܌|zJaC;Ns8ͼ6& jgz0^b"[1A I +Fdl dE\cCF p-}f| n" +X:gT׉^_n tyq;gTu<̞i.yQ444N`%z% <jbϐ(y’6؃pɇ$y5I"%O{<$1ӷ$*I~D*H1}8 9.a.1XlңtXl) 0f}H 8>tt,E3s\쬧~ +SZ9 7O0d={~+ɂg4Cb_֒g<SYS[QgZ JNSc^m+jg_IR[ŷ@tهW>,߻fKfߛ>1mE!aF& c5_6pæo〿b;ߺwrcd]V}qvExM];f$no2l'PJb.=_j鷻6MU/n.Q8<`Ňε+{oP=/M_Ut_ϩ严u fW S+XjՆ>MGԿ 2m:#ߖ3<}uHҶ8 3[*(fT[i 8k꿣k5b38Td\b^v ݺpKKtѿm~>6uR xJuB+?P +endstream +endobj + +972 0 obj +2061 +endobj + +126 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [973 0 R]>> +endobj + +973 0 obj +<>>> +endobj + +974 0 obj +<> +stream +xmR˒0stRC&![Y@.$9D5 LwO()ӄ] z0j>F_(&IZJBOLJ}f@0R6j;UX ;ao?@;VHd!Ӝ$: g&'9x'%wM +endstream +endobj + +975 0 obj +438 +endobj + +127 0 obj +<> +/ProcSet [/PDF /Text]>> +/Group <>>> +endobj + +976 0 obj +<> +stream +xYn}Wgapwr۹ jZ%P"Rh2?9M4'뼏 XQKWWU(&K8IC Ź2#Y̰Xpm|NFLށbL؃lVրիQb<;A5z[)48ؽDN:7Z`>H3bSN!rzr +msMͤyJ r9>aaz̓MI8K6-ع;sɦx EW4i"k,T4!U1`,tNyu.}WM#8!qt9;B3dZשɺ4)9uV+n_Rw?mG^]o&iHk~ׄyE6-.ʶEW~)ة/oX̮Xr, e*WyМKvn.<P|:@ !CF>Ө:/υ[-+X[Nu9O\L•9ˇ@SSeս@~䬓J*;+z >_Òi)zls9c%bI cΧyzqYiww>QXTcj6 xZ23$-s 2_T+>NGw}tSоS +%.5*S/v" 2bADzERNr+>'k6gZùjUwe4="(O*7qN2*q}u^'e\tnڪXuh:[-jS5r4H1T?^Sɏů.*BbS/*NuX^7=-jsq<^Y{@a_ +?_>V^_g{&7c} W#3C>K(WLߚn! 5E鷮NOuAޖ*k4kƧ\ SNKU۵/jn66I_) 햡듖w%#ZFmʺufv\ zuRanb09<;$ug:;I5#M/˖`d6=_m0.C~ $zBC@{ +on\v{7>Gxۛ?{T{ղ*)[p{Y^\|MȰ5UKxa0:DR=dFd8;"b50% &dFvc 1s@";*@/mKc/#E=;Aw^tWϠKҜ7`ȕYzR7tLQdwrcČuօ1bstJRH)hl#P-[LA^&d.)ips0܃QʳG$d@blܣ13 3 zV{D^Qח3Xgns.n6X\<x*~;7u_f6M}9jgbkfi.|0Ұl_ b4$̸,pW]y,]~Myx%Yd 7 K8y<_O׺0mJj?pI^6/#C+A)`4 +endstream +endobj + +977 0 obj +2083 +endobj + +128 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +978 0 obj +<> +stream +xYrF+z)\H?TjDQLl&kS DBmp/i(,s_}oìCgJ;@f݌1^(( + JQRf&EJJE%E>)/LrYƌGs&4,h4F=8d5 \΂EK|GsX͞hQ {_=<?He6|x!fԅ*fԙsX1&mnc=2XY9#"dY48HV9)s(k 5H*H KV(TӪ`P J^ +clc6,w H0$nҰJ] qJQPBޞYT$x(̹&%$Nen3%}@aT0R\ L2FK*x\a+*=c-cLvkSo6Uk7XrZs2zaJc-IgmGaqE/(/kTL<Ѻ^ps_K̘i{mGp5ܓ B +^"i/4'rSF_lQ^x \/]%Dhy9ssiUfL5kcEՙdVZ2LWG#q>D04ߧ#y.߳rlo &7e= TQ[沌dhXtpOem"+Z  9gtNR4WPJVc>dV`˿17#3 He@R |\JZ\YD )m7z ד2NF^j B*;95[6.x.kKckhA\,Ua \{0rC;I&ah1֧D䓺LN/Y"I#o_oKL[:7dТϐ;_T8_F>~5BW#]HU99_G*/s4]4g/&sAz<`+'axx} )Gc+NQ UݍF6S{]ɘ{!WMӮq.TRo>7$5(}f8UמVxmnփeyɱ*|ݶ!kO r9ɶZwH}"ݹ4rN3o\O]6S{rh 6n+8X,D-L(3׫cC*)~b/"˻ۭͪ'9_dpnDL3p2NEku~ɢ>w}k,)gDБڲzjH =B:k<)V'?mVO:gpۆiXVKnɪ\oZP;iP:cJdjS=>:^zaCmk+&7|L9,+ %Eeb_(c18&RQj]Y,M1" YAƽ,C+*a!r$m6_Is0- ~BQkg_DK|`(bh Gv4^*r*~kXm\&&[#RY_+yw>Ǧm}ٮ=5刮@ڮ^_Us82I|@j"ǠH<΅ZPTF%KC$+aoJi K!+#Էo{D`i/ 0""rQK6<f P+ť9[TQ3_ 3ԾQz=}7 Εpڭnp|SS%fӶn7m -~^? +a$А-~OޏZHNuXF0=6f_d7{e >|zn[k$ZC'nu6c;}B>iu$:@O:`E+)<8̓ +endstream +endobj + +979 0 obj +2136 +endobj + +129 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [980 0 R 981 0 R 982 0 R]>> +endobj + +980 0 obj +<>>> +endobj + +981 0 obj +<> +endobj + +982 0 obj +<>>> +endobj + +983 0 obj +<> +stream +xZn}WL0}e q -Q6whɐuON1fGӧ[aߵ#`b0(tLUHU%bj/$~bO9& +K&Dy+!LBruB2ôs“/2>.Lұ=cjcXE,{&_ޯ=g,bNh !I9,ma0ҞxϐlFd"Vs;e錍ɌؘQb{(''ݭ f#[[z {fkm]/kkݿf Y|dw?-n(7180ì{įUQb)ta4͒xbeB [Hˈu* YeDV Wĸ&J02%K޹V)1ր1 W"D +m7|ƱL\WF[VVKm7Z+~oϰQ:9~}ZA%n2)@u]Ϻuw vn;"Jx!v=E=9>=G:MqJl[-g(T{ylW=cMst(fM*D0=\w{:zV׬f>n&F*ĉNAMahHqG@FY-SsN&0 +`Za8m];ob|X_1d:zO dil&tKm +D%'^N e< 6# f ~F{2ߒ_+߷͞6it]] +eؕa֯qB*oll]& u +-LAq=CL0e#2OޕV)Xr3 +X:x{)s" Ö\OZFhZBψu"<Ϻq"c6ӻ#+0iN‚*aDބ堆DQؾNF }kla +xgHԜɨ96B.FH191V4'fu!kNK՜%}ltDZ7Cͦ+U TC͢r\?4=<7vӮؗh,WIcy^mla0 +Fa07tCq36}ms0(=lhgf UPU `c8bXE,fgaLQ,$mHq+"o* :m}[}eNh?"ϗޮ=C貺IfPDuyo4.cuRM?<~_ф +8$m q(%!UFlg^(bJILO +8!b&LNJaE:ԽICZ'm ,eg3lbPBajrQXBJN㻢V*mϰ$ty`+-۰/VhkDaZ`Z)bi3,H{XCZkZQJ:)!Hi ъp^4:gNrFedzq֞;zbffss]^q}Վ~tI ?7v1s**ߑw/e*[XxIXA/-]å MJݕ2 | VR&!R&`ڥKK]p)bjcXE,fg2i2b9hbT&n4̕y&OpSpR.M"٪؊e,n76TVLѥL\pthgMfc+aYmhb 6b)VR{\܊7Z_A "lEIį"כ'ӆmVL;ʎcemD ;WREյ򣹎raAPJBh5m\iN<#( (06agHQ2lE'PFJQRFKYr\ec.ܱ+'^N9ϕT붯V2Yl{i`}ӿ4 ]PP{Bař`Jp*c[̔#8ʨ4vq7i<''N'UYZɿIz*H ys=p3勼iNsPxr6ep'9(?!Uo>l7ѶƋ%WXycfI +G4ʡw4m<d 3z#/@a/Jӑi"'UO/^"tn/Pbܮ; 9d{ q7< ģ.'l-C;wl٬{òb`|ßS[eo +=wg?:oN苩ҢSX?4 vSL +endstream +endobj + +984 0 obj +2773 +endobj + +130 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [985 0 R]>> +endobj + +985 0 obj +<>>> +endobj + +986 0 obj +<> +stream +xXn6}߯ࣛڪA[ MAeR,Jv?QH nߓ z<rdҒ Hb)3ʹAGaŌ-3FslS6H֬5:nH,@R?!w[8A[Ϋoݧݏw0Qbg.nP86Gvف3rd^;J5x>b'تR{ TvB k2tE^wT#|+R?Yۻ*y{%Ԍ ''`l\ +Zln).l!pqzU-&-*r2ՙ-?0'Fs'(ԗ5SGMYlIuPQOȆsxZ6'lIQ=;ҜhhjxhUTfAJ:x M:ܩ[LLzۊA@+(i,?HX3!E9` J޹1`)P Tu6{.p 9=-z[> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [988 0 R]>> +endobj + +988 0 obj +<>>> +endobj + +989 0 obj +<> +stream +xYKo6W Ctۉ 6=[qܵEdQEd=@h7Ù!pCw_A +/0f[ 0 jeErv1\PU C2@$5( SBW2 V_2K@88IVkq/  +er#dY=$T3XF3ŝGZCk ^Vp zFs,F, UYl%oE̶^j@D2I#I1/K"dX_Z9K[=V0 ^HoCAMHkg +j#41jtBZ+P(A%f +DX^ft@RVi84(č(F)Q{&j!UHP q :/HHB P=D8Rhfn]t'R T%*VnseZ3m53r7|7UD{ 7y\.W_nW] W^kEe^[VA_?=dwʈKr,[2+%w]sRnZUKqG>dT̖GD ']-& þQt7XF~Vd!NѩW.OEr*gv|/M?U]|8䋢Ec'/0 <9g$CSrp%¤ nSƌMTTJr +Jw אJs0BP>Bb k0A-EoUXEY:e0\0b \S0F.&,C:. +9zcj~xMd:y7$H(p ͕8unܔ1Mxt*"b +өhҸVt3dT R{^N+bR,|< {cQg{pP*'a$<54K7)q%aM%…Loq}Fb[Bc|$}?aAw0/7=S fS+aKh}7u ,V c*ƭ!3u:V;\7v\|;]%U6I-Pĩ WS>'j|@ 2ek_1]uՁk*T0u'ETD  bvMx0|7x a^UL]K7k@F'~\tD%)bBpS| Y@W#͉q'4\Ƅ~ft35 &<` +sy̾Wq K,6|嶮w:[eqA#da T#3Y}:(rܽ:AJlӛ'yq=7i/kF X۞'c\j!g.JkX.\igboƄusvb~S5~I͞Rf/Hvڽ-uvԭd(.0oӒpst98/ I#|FZaǓU}s 6(Q/u> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +991 0 obj +<> +stream +xZr#7+pf؁5Fp6Y8ͥ= ?PEJm_*=&/W$8*yfS+_h/J5! S W8U3!Tŵ&ʴtKÖ|!M0]= :]F5ė)& +vmZ[LGĕ,"& Z]O|T=F/RoEmJ2.Ӟ "y0VFcQWI0'Ho-o:˝`ʻ / _dR7/MP@,4 INXQѝ55,SKQ288$E K'ku({(3frV-ck 2% x,bFtT&XD2E,)pjҞ y]˲@Sߝ T%)iaSXHuB7$&a^CZIb +e) +8Hf’$,qYԞ u?{ޣVJ 5ַQAC7*Ҽ$Rk(*AZ;Ak9x[x(7e*b *U-[ߴӡo }.Nk;n ŀf<&B?6]sQn>ۻ@R+}Jי(*QM:. bJZ* ϋ S>%*hnI4qmP2 +NEmƼd "y]}';BQ. vu3Dp6b1C%/Dċn/ڂrhj~-՜u1?it\\CQBl7t~A7ŬJj;3.SbB +endstream +endobj + +992 0 obj +2120 +endobj + +133 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +993 0 obj +<> +stream +xn0sE;+*pU7nݤI9⁀bBN*+Eefh?{ aRyw(0{('y}'~޽$ՏԜLU_An}I zGQE5n@G4ԥ 41Ni$yIsY1JeTvP^@|R@1xP`# +] <: bRQ̳45'eYFQc~ǚ47 *>tW9QA!khZ9e=БOCc! thhF}"yKMTup4tc5Mnp .ebAa/]MkQКdgT)6l[mR^ v_: +endstream +endobj + +994 0 obj +668 +endobj + +134 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +995 0 obj +<> +stream +xZn}W7pbcYA8 ,RfL)!ӼWشK]NUE(?4K'^gA?v,UqT+R>(e8bT(#-&RF}Flę8B71"or]oe"T,YEִL$j`a3ʳ${vjm5 DcwA YΔ`:So|0INܘ2PırXL!S%`tl.>{3ՙb\#Fx!d6L&TLg?̜<5 .0?%Bzv|Y;٤O_TƬ[֩6(?MZ~P#"O~e[k{d^,ݥ;,KEIb_>f˝tk6yL/dW`}7KlR Ş,-y{:mXb#rZen4?գ{q +JERЪ]QZ>*ïUV%"`78^t6et *".Y[cn O\$ulK#%M'&t,pC 0}R!8Fރ ]MxuexSEm$[{3}emHJ^bi +`lVoxwN6Ζ퇵Mgf!ЛUPJ$][ҶX ,cF_o}$єGTm+F *$P8~p=Ң5+2߯+?W_{4뾲%N=6lK; },jٶKΉ@MNQx?O[ȋȟwz.9Ћ·g5yгhUO9"a0h(NH҈F -Gj c(i sXGc.v6 q c*xE!v#(oLT򅤒340>H3wPHpPtAAb %cA O`)sI^ +yuho +:q~ux*aR ۙ {t b1njM+=3P0\202QQ#|yLe3AGӸ%|\;(oa,eHKy`COҡwZ9ډ5cC(N0`: Xp&0cSe(el4_!5tG2/1씌kpM +n2&9&[шȒduk376`wp{ lΔKOpжFF6^ m&Sܮ>zsBa qa Waz3M롘&XF+c|B=N顿 ZSG(9]_:jt\3S+.`a0/`l  X3I *`G].` ԁ.p>3섀k]?șFv *fSLvcܤ^&r3brv`μL&R̂. ib6Xd17A5Z>X|#1SvJxNSjlf1'fNpOq*4aܟrQZ,&0|PNg4I|)x8Z&cELPs#ji#OvktgW?]ͣ- 3_0=8L7U$?d{d/wVc&aPZ> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [997 0 R 998 0 R]>> +endobj + +997 0 obj +<>>> +endobj + +998 0 obj +<>>> +endobj + +999 0 obj +<> +stream +xYnF}W0}ee%H<8miMZ]ƙ܇=d_{c[:>]E=_9޿*ZËCs+^k,F H[Xbs%g¨⽔0f JkU0ei.3&ӥ*VsELEv T!"˫kګhQĢՑ=CTZޫzw彯c +$Gz}ڎ< yFV{d"& g`ץ(J7؀<6`E#{M}*.*TºRGIkc(Ήʩ^*23b1"{1STRV)3Qd~X|6g \o뿼'sw䱈!+#ҹ&+S`<&'/btF <6`#E,*tJ9؀<6`ٹX:g8fH9yrV\ OW׿vgwl]jXk?3yl^s͑>+m{niݰv{9~}u@M^o{lضޝ,Ub?^Pudžϧn[wA?ևYc|~'ͪ훜YDK5OfYLnn@N|w'v<:VM}aj?"$%E*S }VeIńVP6:q[J_dtUJrJ3ԕ9_64qc7BJM|M>m[(Vv?u-f1{nNTOOTwВ0șyE*xeF +K~6 KJh^tq&L + Q+`x+]zCU;RIwi%`!&p;Ұ e 4iM)kP8l*Ku5Ώ{{|/-Qy3,N7U,3Ȥ0[[8!ah8qyd++{BR#9a!̑=9œtMaNŕȞ?le M~+]~PO'q)4.*(Sنzu/S\TYRY (|AdhEھ4]}3.[55'j|~G حq=]H(y)3.c0o033<͵Jߢ @A<cII MR,Mb/悿unhB,} $EIaf#KDycL߾aم R0dHBMND>P> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +1001 0 obj +<> +stream +xXnF}W4' `[RX/%@@K %*"QNuͦd3ȭbuiZre JFAKzf%▾$3Ez (z$d3ƂLrg@BpbƂ$b,Ȉ! QHroy&LoK҈M9&MGpDYoA&I!ʷ\rD<"-˼Np`D̍(FQwg3r+:e3%*c Pc=HfL Q$T&jJ9cjL 0GQwDiI0 ջf?vW7\هn>cqnf6M Lu*G3L +/'Cڊ/o`-{n.NҶ+-g?>צg⏒\ȃɰ[]ܴm3q˞.iwN/8흍[kNm//Mb'\JlqxZZQX4nYװ@j;|8% F,BK9M(|0*̔626?PA聒cLB2kƗ ~4= R]y8GjfH|1T)D-Wk(].$9δ\N +EI愅+jKɲʏz44¿aLGby(\F{7 {é,ljuo4{r_nh-{LR:S<7t(c7S{__nsSL(8Ryw/_ϛ!_ӟ6)ROӆADE?џj7P+5xq]~Rʄ1>h(5 +^bPv?QWz}'ذɊٯ`&.ʑC]7__"}MkŒoך']3e}KѨKF""ݠҢùjx'IPJebF;wDwKưov=] z`gWHKf?nF&KxtsR2QO +endstream +endobj + +1002 0 obj +1820 +endobj + +137 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +1003 0 obj +<> +stream +xXr+TR@\҃LUVp*Kj=2PTn}#bbF񭙽Cjz&!?tapƅ߼qD5rALd7VgW.0bT4! { Q60Xu 띴ǡ;Sb̻֨)jp1 +L1-閸L+X֌񭙽C}Z+Qԃii`Hʾk/;LE![UmH3c]d2⫲wn\S^{LI|;ۧ8?LpXlx|zNq?~}|_y:}CT=LQ 7Ř}k&%Q6K+1{eT*LTOv7NZ6"p@Ñl ܊Wf ]aBSFZmMW[&,)hʑX#~cAEnk(3bL2![`i3UW*98wG`V< 뛫/v~aQOR8&)}_xEBRۤů߿<~E< +խnILq~!4RxXK*AEOa%̲R ^HLGeҏ R}}.nU:c>H}F ;oQ;,Fi+ !c^ek +[ra g;]WUxbGTb, @J4vPp߈w򭙽!ro$r('ջ +aQrys2;* H_`kVAyzWwXqUxWsUc]î]Bj0dD]UWŚ;8W5Fo aWwgjo}~ԘmӦ nIOݝ=Oԫ?o'ߢTa/bӶ aBeԣN}S?kD÷ ՈK`hB-x'.uTɔ := R5\:T4 U`C!dYt2kq&pzRajJ}i4jvv$Vkk>swG42採s+t^զQ{61-hSoJs. /%kj+9x~uk`n 1D]]e4-Q-N$u2ERsW +ac6)0, ͙84zQIWo1J/5oQ=?(七"i2I.1 :Q]P%{n g&E> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +1005 0 obj +<> +stream +xXn$}l,h^Mca@Zi~0!@^Z3-=\vL ON5/͞ACaaY%SF.\7 |-URq;7>hÓiõnx}!ryq%ӵ R9.]]Lc@+0+m",)mDQ` I6OAWbWu,g? Y-٣Eqkv^bE uq>Q,""F^:(0M P,b2Vq<KᦊEdXHQƲי@q^Kkxe|^+W󚸊T97FemHsƊX>"Ɇ"2u,cdf? )tX+4'^^݉b Onk;fAX̟b1re,ggfRMXōrkRb("32M_Vfz4`WKT< Wݮݟ'k_w +5DejQ.3cyk/_6=3yo=kkְSN={qK?IR 1%6e 8oЯT'u! _p"#ˡe# O~Ś#]y +j󆦱iC{u{(;6!{)ujWg+GUǖm]ό^}vX@ڮA!,"T'M{h{vG"œ!Dˉ.煸]HTB뚇Мqb)t?!hǬզ.$.ƞC7]ǺŒa4RY73Y6g>D=8ibi}kQN/iLHQٛoCG˽z jh5vN0zi!4 01|VXJy#Ji L?5x/k#m^5F/FV1tCHe̖PYV{>qmcf7yȫO{WYJ'> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +1007 0 obj +<> +stream +xYێ۶}W)&]H]@PS(2=VF"]Iy9{.W9hX^C^r$qӤ橴-PهQl_lҤS +,O^ɚdiN+H˜dYԔ"UYڔWXXd04Wb@[+J0Rmy&uC֋0| i7>V|zTsApgή+0mX +Hmle,0*haeb[Tc j]c}u̲HȢbÊٌ<#oݚ[me*iX28r당5Go# B +iZ|,aVoYU!DX7)OtyF.* +,tk!Z5աl?y!QWcBb F*[=v#dɷo6iL*O2yon)l2a=t 5(x޽ně_Y oqݫ<9S%˷yxcS]oGSB~ p!7mr&"!(NJk>&}(?smMn=&K t>F1>ؼ;ϳ7U%s^iؽ6UpCykB^. I"t>w}ӧ:Nk@'m7KcN '3,-$!"\zGIڣR GaN%v z!hj4XuĶv5o\ݩRjirmԸWDI9 V8*Z|.tV uWTQN|k.`3@l~ !@/u TN!VۄjHi^aV} 5yi.jimͿXf>A'G5ML<%y'3ꨎd7Af 9seNZ |Ÿ`e lؔ;)nl1g'ddy=,5+8S5nmW>JtM; +(Y .-[N@Q@-nT/w|Z>%#{mMȆZoQYލU:!<^PGNH"[7'=-30D5jLȏڑoVQrFЅfu#^]2-]U?Y9k&? +hs% x5/B-YWWP~'=M +|ڿ"wYtA啷I_~59pǷ->xկpn_ +endstream +endobj + +1008 0 obj +1961 +endobj + +140 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +1009 0 obj +<> +stream +x}r0<GE c&Ӟ| ÂU D=-Fq&S.ّ$ tIƪXΌ!b~JTIJxVo(e$wRes4O6qHyWYAHYd@_@9h qDond]q gfEi" JFY}Zӿ9{l?"Rr'!O7y2Z|kC ݜ Nv"+Ěz-cOXcXJŊW@#BcqKz :jO/jpv)D.{!P~% +endstream +endobj + +1010 0 obj +441 +endobj + +141 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [1011 0 R]>> +endobj + +1011 0 obj +<>>> +endobj + +1012 0 obj +<> +stream +xY]oܸ}_G0T\,@B=J4@>?4cCF9"F 68+hs %FQɆ t(`Ŧ \/YZk9<ĵHҘJ9v{IAK+#aa&%Os2FrXY0aL#aQ {&2Iɣ83zSl^@ֿr(:#ц0 i(`!R WD: Y\}ݓwwI[?-9}%w}wXK»7VӆӵâN 7Jt?^l_=^,u .(A R7t(r-8hűC~ݓ +'_9jZOǁ3D#,9~\? [ &|q_9Xkպ_lp㊛T .-3WP s<3{su7u+j4(f;m"fU\lgv}C +A56Dm}0sIXIu b:2^vw3 г;mG:5FJK .7 +endstream +endobj + +1013 0 obj +2333 +endobj + +142 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +1014 0 obj +<> +stream +xXn6}߯uX^E1(؉ݦ@٢(eUBlOorKsxfHb?~ttfnE)~TaΨ@O54 di;7i=ZTvh8o8бkeezT6ܘ1`]\W\3Ob=R[GЈ6\v14zw*}9 ;`OOP+}#np"ɯ:S7uF z(*I8Щ@mhv7 3h),4 h +P~-1#T^Bː,Z*q).Z~x%b7e37XF}QTCc:٢ Xo1T9ZeiPh؃Xn_=@e a,h&}C+e.:bՊA@DQ8JrFITPdv2F9x0W2Xڳ'\qQ9 $… c嘜$B(?K_.4;f9O&z< 2;µ n\oکj +> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [1016 0 R 1017 0 R]>> +endobj + +1016 0 obj +<> +endobj + +1017 0 obj +<> +endobj + +1018 0 obj +<> +stream +xmN0 y +BY6)i iHJ떰4=1y#m"e닿mN&)dJY0sTHk&]$$Z \P}D*, Y>YXw䅬2oq8ZJHlҳ,\U#kb;=c> +/XObject <> +/ProcSet [/PDF /Text /ImageC]>> +/Group <>>> +endobj + +1021 0 obj +<> +stream +xXnF}W(rs>)(Ą"]CW.5H3ΜJ+>9PvWTstY#Ja"bSP1@`t(?^ha0a"ԟ"D3W\3D ZHrLHPqELh, Pb WׄQRԉ}Fs_BȞIy"F +,န>JY,3EfTXqa6J`Bٶ,!? V#̜ +,jE%z0dPyؚqQ1]Dd*_Dc}YGTق_ =\ LB{}b6?8Էwa.4จ9.d;tƞeC/9-Å&P}vQc?N#ȃ k7|4..wƚ8]#C~+xHHM}2>BFl=m`->LyA㝩݃;5g/Y6OiFs$|L~j:ށx6N%|};)ߙӸZZL:!D"ԟgR/509ƸD,WˆŨJt(ه|&_#"X!$r[o@C!|>!+:>bo#Ptx9T+xxTO +endstream +endobj + +1022 0 obj +1725 +endobj + +145 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [1023 0 R]>> +endobj + +1023 0 obj +<>>> +endobj + +1024 0 obj +<> +stream +xW͎D)a@#n0#Mر;I`'CU#83S3 BæS:~MOyRxб$KH^@d(29~9iqBV&s`ܽQ_ǭMBN0>ZN$0u8q8ȓV/^(E A~ \/RpGYHҾ{qQ;sT=.PvE',w"^ޡ`j:١}%۪"|ƅ5Dla% FʠUQײGD+% ʸ̱HpكhU,;A,A& uß(ăzA QS-\3`Z`΄nMkz^I=`tY=T,űcfid+!/򰺴Q%q]D`Q\/0bJd̉d}Qg0 x¶:9l6t){tKw~N +#2Ӊb>!ej.[L; K$i Vl{Q^xĨ_5Qɛ'1Fb3~&M$^\hԋ4k," \Z1^7QFYM[x'zqB A 'BSuTGl"r mNzUS"q,Fwս7HlC)ǞE35-ȻRĎZrY#hdFnꟆ#6\[=7V 2/:tlMc 3d_mvLr3:$=I6aΗc4yrU, I7FIf-cVrØ9x=9D$cg*K1?X25G4'tO̷EkCrm ,{7!kiQiA*gW'jZT3fA%$i c`oma2 +endstream +endobj + +1025 0 obj +1505 +endobj + +146 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [1026 0 R 1027 0 R 1028 0 R]>> +endobj + +1026 0 obj +<>>> +endobj + +1027 0 obj +<>>> +endobj + +1028 0 obj +<>>> +endobj + +1029 0 obj +<> +stream +xYێ6}Wq, ^>k-٫VTCCQHEN>'AVcpfHM(&mO +z@r~aieZc2xf挊J f m#Ll"R3!,*J_#0jՀeJa˜>X]=2"#L: +C׀ՋQ"z}X-,ign?7=+901IfdNIX$Rc-X(u}@bz,acʔtN둄,Dgf2"|cRajlcL 5ƭ=|.`F@w1U7=FfK1#%%~-Jkgʟ窮㩪 P eVUܜ꼙u-pRk.ч)?;3g_m_ +}qZSFbzڧS-1Z+د{(nEn-,<ipd\LpI%Zy'nMh&$қd-2< :U(Th0)y7'A0%P V䒈I9R EmK 7_F9?2:sFlm;r鐱h:\'g^Q"n$4CHJ=|3a@]N&pȱemKDM= 5:o`3`ID2ƜfwP0ًC &g<)KdȎY^SMq3x }J2hkׂW%zU"0&]*FpB +.6١{~\Qo 42+pa&r+WXT +Bvq'U͊G0BbU_E{1]0 }Nב7K&>S0a }O";!\7 +r6By2#Ϙ3tgE"qa!7pIk6ay|(Pb3K,BeAt~H*%אLb !dt Ю' :boahB#Mo393Q8`n|u5nQ0D6N]C9}a x9]ab< A%'<-e&x؎n]wY2?yGxj:m1{ǫŮ e"+c{wQ + 9`ɔ}[_Eu>O';kT ᵅtlѱ& }Xz.c{!,Hio}ri?6no X7m&oG0W|⻲"x_o >0di=y)+u~[t7%s9j]z|qsY`:4v4LW1ܪx*J4i֧!vD$/l y!ү<M0 +-( %s<h Q"aƧP`*$'3Rڱcn񪳙|VMu8"1vMK#^]>C7 kj@`5Ӻ> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +1031 0 obj +<> +stream +xZ͎)x'g.@Ж83muϪ[L''UO˚fŏ,?rrMϟR0_a +ʥVF5ZݡF%f4 bZ)qc*z%>Z,eJt@tr7yЖb$gZCB֫քQŠ"vwip$WKqN~O-# 4H^`YH[D,aj0>3;jYDl0bG K^'Y-HHj^qrYFVM];GOƇz?Hcٜъt~( ~ŹLh$7X%0;W>d|z-H9v¨V=#&q%AdӁ+a84LOVy ֈW(L^'ȕcl%!LB+**53εH#J5{yWL~\?͙*SϝZXjwߍϤȺ:.NuGv1=O>ZQRmO$i]sM.5xY6K=CW2ڙ@@aa h= +FJhmfd S-ܙ~p De ش2 [ 9Y5D@Zk` $"b"-f J%xHy'-!-T IU1Ƨz,[O{l%RHz~ +i8БwOۑ0ߦPC=LaܶjR4 *: Ai Of H O=={Xq!V]ߏdzwӽX \C{w\T]ZDB X*¢ رKm@&睄X$om뀶Fr?wگ=*SpJLW>-dC6zM!b$ޣ@Y]2 ^&e/ +endstream +endobj + +1032 0 obj +2686 +endobj + +148 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +1033 0 obj +<> +stream +xZ]۸}_G'jEG] ,vQbEƖm5Jr_!R$EɊf=^j!& wy0@b4Mdi(s(@Wq8TJB#Ε]c fD8LfDă,)2 0$R ++ Y8[q9y{HdemIoj1%+(>H{q 2K#ae2!^ 6R|q 2(b#9tb*X*IJe$jciT,ȍ?Fe ütK/'CAŤX$atn6X üt2#Cezoѻ.z.uGs B eM~""fg1S>I/b#0p!P%E +k ^[2η)|W d,iYs)XՐ<*gC0;KLr=,gro ato%üIq6|EEaH0VCYߦE̔+~N1BlCJuW>Mi͐lGU']MmkjgE S[VNΌeT3yˀ +R2~Ri,dl* -(d^b",BLrl l]הOG |Bt2 DZ0tC\VL 6}>YmZN՗>,p&"~O-]˭f^WYt׾+~_̻{Q:ܫŚT"F%,_\)&HL8ByP\1G(ng}R^&f eFoX,{B:]R`ާiwyᶕSL3YW m݁Ur>٨Kʹz C)@2`mWW"_MhxY}>HH\E2e~GQ>us6|,`Z5jaXt{ǐ'+'>/wDf FYb cA` E/*XC #b+̙ 8"$Wq5Y4qy]e{dY MAIjY U)U imuHta:MwC\K*OϱOD3Ew_E2/Ew399lgھ[[OuLB^`6u"cSc0nFuufnMu'V~\} +0+JAױJ^mJ  PbaX ۡ@=Pf%o4@vѲnseᾢ^_cSHb@̪Rke>>\[m1_6jcp6u EwНۚr}cx1"Wfw,`8UPa.9Mȳh?1ThuYC s4҃ ++NU.1'e(-:ۋKB}JdzGQK25QG!Bd ˲.Iv E%gL2R2Jdp`5)1ԡq"UiI0<Ai)k:kv M`袥g3D,sq,0P,ui|~kטm mn%GqtY5;8 Wq%C%|˖n`A}̋)p +<>p%kr+B sH _'e$(t%_s Kf]R'g&͹ӉԐhqLSoI 7v0M >gH °لkRC"ǤlфpLf9q<䭾t4&?_d)hBK,ZU:/zb.BIWH@'?38qI&+F[ў|cEg߇mdå$Y?#V__DZ<ٝJq93(V/],Oh"e"'xw߽aU/{!=}ZʿQ3+u> +endstream +endobj + +1034 0 obj +2577 +endobj + +149 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +1035 0 obj +<> +stream +xZr}ẈRs.g+VrM"WIDcPp$I0"~VFjE=J>OaWϖ_xV\!dfne9,L,79gB!ތ&||+2L rd="!gcX92ZKsmU"Ɗz!Y泧)͘ANRKǏp~EH˜\6b.KXec crS8~\y$ac1b5ZHo"7rja/͌2w\XxwD⹌4AFt0EĈ0CyE0e364c !4#F[' BYi~c

    fGF)kb:ARʋL崬q󨮵-L]@DeB 0vDψe"B 1e*+ 2U^fSeb"gĈ2#y 17d0TMkC~D!y,a 1 IevBD }Fah Zr(N>%  `T2WMXB"bD:Ax0^ )" +ӌ1Ќ&b2o Eu;=nbм8-keIC 00bP3E^IJ\۔1$y5b1` ˺4-8Yy,m(&Ka԰ +#G%b.Nmy1'jʐ#p$#P;GRp^*F#S2T aJj:C k01TB_0ʔH #o߾mg,C[4w}sj~};v%u'/;$qqz+Rm{tOKSf[?uٱԬ_Tu}j׎ B|״-e}h'V}[/j~>UV[mZcҏ]̛znW[ϻUm/{#/y]_j fיȤf+Y tFp@*t ;F&R!EH]A0؞L)'UjV@z\=֌ϑlx͂?y9Ӫem|nӮ?>xln^.{!u5e;F"]]-XmzG]9A +AeZ< 'QCC/9)8zsBP61kI$E[!݇$RG"Է⚫xܼ._$cy!q+ŵCĭUq !yqJVfa_ -.߯JPŠKG#ZPp"ZPyuGfG3%}jXbč hg} ڝ].ߝQL0x+W\H@GRG;ԝ#9< F.'"PoiKH[ taJwLq- +j 2Bɶi |ЅF;(8t;vd$$Si9J Di !@٥KH8zͩΦ}#Q'jK /=F^/ԍ MM6^mWRгԑ&ӸuA]#9 oݟst;M_f%Nvφ3mA0D~ۘ&RL ԟ|Po_@n,_FEa CGIJv >׾vź}6 \W&ǯY4%T$z[?kmQ9t7la +`^|ݭ/! i/뇋f@yĵ~ޱϾCC#vu561'` +endstream +endobj + +1036 0 obj +2340 +endobj + +150 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +1037 0 obj +<> +stream +xZMs7W(c|rRkERESCY~833@EgU~xh"*O6|j%fi&̀J[n002ʸ6 *5"1BhLvm@yOH}17$1Sy#&@bFQFe⢯~;~JiƌE rZ"? HX0KW9tAf +  XaR"?;f)EX@ +{zSJKoϖ媪6Le%WI*f2agJf6 Ҥh&,&a=Cduw!{I9cU1Pc| +B‹X*=C2V0F65f)\XDr"5a5yϐRoe7eU2aj+M^ V:!̈́e$EcȄI0UZ$LJ3f2aQgN.d[0165 c,OX(*<¨8{Br"3Fp;d''ƘsW(b)=CJVZ!Q]+S2e*kϑ>hC + ˔I鋼'$Ɛ)S@&Τ x&,S&ag{D]`BHctOʒb")PyQu`02zGPLtBwH0dM3#HN!*yC!#ǿ?g$>3 ztHVax-lap>|HA2x0@\qlƲ_=|h3D]=,篛?/Vv6kǾ7Xw r-/PȲ52[ + Y%<`Е!^/у| hÏ=qm40] +3D$_gɻU!"Y5bY(b)=CTt<@Ff3=+N4hwJ +Mmv+G' 8쀄WG ڔF(wڔQ}g]Kq>^\ ]LOZx\kyȭ'Y\SiB㇎Ih6EۯV%ۯls:UXNW^ +1/ǘӥwC:yi M + +7[(f +.ZH+[M?& 9_6ҍ}nOneTfeIER$N:;d5,gR0ZaͩCYa?R `Gt 63:ЌhQIH {нCs% +!쬬:E~{4mfa0|`\?Gʳ|иSDFOj_z^ Sk9ѵy_z~&A ɤtWSխMs=2ƶN4RS/!Oadžł4VLvJZY [m1r` pJ\Sswk < n3La۟ b2oV{+hk90kS_TmU"L&l+b +,y~J1Dd1KFl3KE,eg܈] =عɻx~>;%NN}ifw Pƺ|WEW}.= Ut] +Hi$ gR MM`r MB SD=Ct1/%Lw((ֈ(  (=˝Iq1bdRd)lc@ָèo5}NAd&0ET l5'rQٿ0KyuVqnd@ofc>zW.|P@QZ|y? a wVt*K9h*$M vPub nͣm~xvl5a[5`0]]C ,-׶݌.T&+YGx^r9DZ/VZ{+rIE-Sqd~(wl` +|:C6*A +&8NH~`jD=21mQ8!CDhwCL|!na>n({咈'tyOd2\i<ܡ'_4›?Sg +mi~55y3!ÈvjXݱ LUY4P;@ .<^fO+ r?.:\ +̯3p{BF%- +endstream +endobj + +1038 0 obj +2644 +endobj + +151 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +1039 0 obj +<> +stream +xXMs6Whw;LmLO9K.DIl)Cg]rC(=>,[|02#UƆOf|*)FbiŹUFI"H+!aQ #KBdscFdRa`rʲkĔ c1'I` 5d +Zl̳G\G _U3+1PQ8DS؈$RYڄ}BbF,Q,`%3,OHPqF f5. h$Ӓlv2 owھ'?WNcGq]})ﺢN8U!&nTRM:Uf Խ|PZ8Pk*C_;̂J6M̛LҎ2ƿ>"CYRYIjJQ]X\<}(;Il:!%!Y0}kg*\LIxB%8V&Sv;lv - +0\n`v熊>` VeoJ[+^$hNҕ$|ٕ\IR]I?nZ/^pE[Eb^p-T_ZǟkNύK1M~1P3_0f8iyxbF8Rƅ3zi3}LÎGdx2 T9 P-nЌ/]x=ʠ|Jo u$[VCow졯EK.Ѻy}2pӐpO!E8pt史;z7 HM_$tw( r0apeF Q+>fD+/Ě +E1jd`!ׄ#CTG 1x934k!sM/1Br9/ c`˫pI/|8ؚn-r!_ +#ݱ x"橆 ]/T+jd5Ź#.o➓ͱqļ|N9hI^Ⱦi:Mz4~:}.8^?VYT͗}6ƨ%?u^U_@9m_l0֧/r{ s<|ؖrKT|z0d(=?P< +3JP錌*oiѿL%eaIAe톸U]PԠD?:`?̲m )A@S~!b[`I8}AƫߊV*3Cw;?6mG~?r ,@mB=JOF +endstream +endobj + +1040 0 obj +1427 +endobj + +152 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +1041 0 obj +<> +stream +xZKo#W^c{= !VnJ0V9W`ZGBr\3.UY*)Rxѽiճ?ͤT_u%Ƌ~U։LY' +)uYC~)K3D*%2(@"X2]jQ"zq9DbeY(z 4QVzޥ葥SbRF>$(A0zEKO.(Ie (ӥWJ^rz Cb}DQ ?b*%1%VAi^+LАu*+Gf*th^e 3,+zO$nB*2HkFf8$9fFYY=׉3ыeEF8=5Eg'A'f^IX/cEYUj̘V^eI^GY:zO$owO~#+0D1WVOϳC?n0FYxsCA "wU,wf.Pj0)ِLF!&7F{ z`U)ʻDL)UX&=.y}iԁT3kgT9ePIL*TSm4\H 0b,@=h@4.xe*4!`}եD 6U¶T=jRx)s\"wÑiƌqƔiپeU4)ҨPaP94D cǕLOd2$U2h8&ʂ%^j3bnrK6nl6*&n9mKMd6 'ٮ@ LT\*0|Xtm]u ӴQ'0僀D:x?5@ջl 1Oـ_rl+vQśM;ψ@C<3#z>#LJ>[7ߊ)MН{Ǣl<& SSb+]_JfrYps2[䉥3 rǭRl4ޡt|&+e簒[dYi V[' l!L=_Nj +3<݂8Fڂs{=E-%/m ɅbgQY%X6^YYV YRtrb߷Wb_~mVeSrSox+Hk逸@?@XB{R(ϖn,(+}aNB+@7NuZZA,f:GBڅDfzdLBf Cz!T8AyŹl(Zƨ 6r5}% J:w iGqx~?'#(QOo}};ERi=\k__{S4bwtz9lr g>|^֛z7ojl7MLӽzzu:8d]mܳ,Vz[=[bft&U!'M/ah͑Ő8>_gm@"we" ұ|41 +\WcQHǽs?7bnq$pk-zz`/b:|+ns}|ͽ9I:!-@xP-N`nާIe9("Ml'v2:=;Jś۱(9b*-5+[I$}]Z?$JT.$EFg+ Jܧ* MHD]poJnhon]׹ZI}5U"RO=7ީgo*W覵 + +~ٕ%5ͯ>_ReqA?u w*HSi*Ȍy ;px)UZ4z_Uxޠks]qWuo3ʨylM7, C&dO=.WTݗc]WI>?kX&jobs7TO|R>zwu]]mVb}}>,o{|Nlrz+`qà_D +endstream +endobj + +1042 0 obj +2198 +endobj + +153 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +1043 0 obj +<> +stream +xZKsFWQrrlRTY{&A 6IЎ_lP$lzz@YO6|j%Pl3!dakeLUua~%{'53!TQiHFe>ӵ=vU@ u}=#1n;ZY6Dd}m,{1BYNu#iq|g[ÕҜ21Ijh@*DD ȌeQL{F(c%L圱 2=X:j'hϚE]Zֺa`vY,$:X.婹Pj9lM;5ݮݰ]3Q ֠RPᆮ4'aTx8N_p Xݰ%Œ;I7`Sm1޳-}~bnhS?<:+ɦnb~.JU||hݶ[mmwwpR$`*(LWSTBWP<+y w߸otmJ bwWVXfiSHZZ࿆C71 +F*aPRQ5%ٸ2 % jp-H(H7DX#PėD (U()_-2ĥ_knޚ(+y6 ײ;i óx9hqԼ!$SPp'AѮAL܀ =++5}f;4y8xa;ta{tK>طmK#Flp`č'q-F$oqj0|j(jɀu]7= C^* 'Ju5"0- + +Jv1bqe+- $A*/Aޫ"_yJy aiVz6 ""w3*rB0夲 !׃}<}XT;y _4&ެ'N@nlA~}ICnUtOƻL_t4 ScY|#JI0Y^*jψȺ"ϕ`"FvO,ې5ۚ5{V&MKU,IK2YT?#!}wb- b}r1=X1Ѝ4=8-n)JG@q•QE|Bօ@U.*7`4HEE%a2ŢXT hL=J+I{F^|d>Z,Emsm>A>d~h6?K2>Wm+2Om*#o89ޟG~Jzwv/],YO`>/8x^% ?pxwXᆭ~NVm ^w9K?הPW9U5?O vt:S*Rۓ%]( w^MuF̏$:Apÿoӯ{k?{oMӱ;+)gkZQk +endstream +endobj + +1044 0 obj +2669 +endobj + +154 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +1045 0 obj +<> +stream +xYr+zL9ppɪtf(5U +"Ac5D5{эF7YRݧ=?]d~S +4b݂&YJ%L`' +q3;``&ZiJI*%"15qj!3=*҄!dMGdJ2Jy1p)9Zs;j=ڳvVPPgr5Ul'.9$*Eٟ)0$)<^}DB)1 ZcZ+H1b#y={ƆcR2ʸv}DPTJ Fa.z,HLG:$&~*Ucbz7  dX $s cYOd~UD|Fy h3DzF/]P.X<ӳH؀9 }J WcYO*#z,(ky=$ߞ5emX"Ӳ\$ۇJ(jLLMH ǂO/ b̳+=oD=q<1q=@tމԍ[TKb)氠=ӳH"<'5۬WL=ۭؠG|lk qzCΏ-E_y1MEs^]QnT\۟78 HMgp_x` 3z:IF]ɾ:r;:դ< ݮ 7y oꟊUG6eUoH p1 )HU~.GֳÂnw#aMǪ#m ]Ō~va[d{R,i+߮hD|C"x'2Y tPʦJa벃U`:rw,u ~M =Pdv37>=x~?]h\7[S +^]ޑ?}ﲍ*P?D H]5#*UQM4ЂOťKy\ Lݰʨ +~Vsˁ˝ 57!Xaab:fc^v!`R"BS.mm.>lE\ܥTtg?b$P~!3o\mtt}t*uVc_]6q֍_Z_ߙa<-Jo~}֐.GVM99ʟVͮ/#X혹?vHgKTJAчCUkʮju]|ԄC[*?^[lcm/e]wmUڶ{Plf +] UP 9TTPD4-?;6.q- PRYd]>2$C$k8'l  H%3ȓR@ÃV'لi)ڎc3\Zl޶I2H &&fK+1xGh. +׼:%W$!0`<( 2``ɷIDG5`C$ 2fwDWKĢpT(R~uifÝOƍUH$ !i V)Q“vQ +I J +af} wmz"SGm `Ń8 2+/ܺ}uZc2by@}R `wlgg + +>R vJEoMy;?Şg):ʾ;p8isuv.oE?wU~DVU޶US?5ݯ7ok8~{Vx2a3~Xep7V=?SˀqQ=@5`.d"33v#ц . ^`<6z=^xzUDcCY=)ߜ6ܿ 1{ X.Yv۱M_<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +1047 0 obj +<> +stream +xZn}W4q0}ora _Jb̹`ȱV$ic"y˙UUerVQIw)ph~/j(/gҸ*)Wo2LB+M c(_1xdu&+}uʂYɪ:aOHr*@cZI؃ɆΒΒGB3D4Zn;GF4bO\r s?e$b^XY/̈́=!yG,b i<2lĂGK^  c)xL*ke +%2(-&D!)1nT4="Y#%fbzE a+`:T,4LJf! Y#%fIJy-{ebN"12A1_>X=C,X_ +zI4bDcYYG,yro_`xVnMBW̤:˜Nt1bYbF,WdU8"Ɯ9=lHe,d=CDzGы;Xt1#'I /b8#{d XqgNbgoEd]D#x3do_5VZ˚ac{FfT 9bYbF,WdA-EJf! Y#%fIJy-{ebN"1&Ҩi<2DzX,Ȟ!YG,`p.RY3h&$b:b|[ O9&`1mJ%7wgoPTQy([R&$:+\U*){%Lz8_ |TRH;r󏳫kGU{gXG;/{l4s2<45yl}=ݺx3(+wPqݑlfMYvhwۺkِq \?~ w݆<Zsk1ՄLFC/!c㡶kzP:=}S"3hQpamU3 WfozgnT"MX^e $Ƃss,dn "ܘ<MI%c`›Ju)cn^ʾ" e1J,a(/{2J ! CYdqHqT! րu/F,-KU]~ +Y6Z~n*SPfks;ncgEy푡I~?ABIu9#JC5tQ,fEHY1WS57NJݷs7Y7[0bn=ÌO}}B͛9A-S-tRAölz|Gc/uwl+1oLV635WW7E 4D/,xZ/w|8ہ|/B@@ wŹ>.kO.>~$h'GֵUuO,nAF7MUp,J QP?& [mT gV~TdOI\tz.`%K \ր+zgF#{B9ךyXZ7^@kVt9n7k |'Ud_vwh '5?v%zw̱W)ٙ]X%U 6v\}sC֣[4ܧVGmfk_Oۡ<F =Ӫ]!xh6/yŴ?Z.; wWG˽m;`1pn1Ve=L.3JWqdTdM.Z4п}ѐߨ֜}<(ʼCJ!\ytg$~].g1d(_oc.e@}Z|OtP~nu7eL=y=ڧ&}كx<ëP_]p{DFs)pnVg֐uOpZ_E!ہRU<B;%Db]1q&'Gp#@@x^<6:ּTt4 /5\m^Q/;FGQUU=f?6>˂ ^0j&l϶:e4ej6kqp'>z:ZuOE6O@1>k/)| +endstream +endobj + +1048 0 obj +2633 +endobj + +156 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [1049 0 R 1050 0 R]>> +endobj + +1049 0 obj +<> +endobj + +1050 0 obj +<> +endobj + +1051 0 obj +<> +stream +x]n0 ~ +'@dEC)c;RH}xI|!HI`>\JU$`r#dzJH.!+ +~BٔGHnxCkbh0tya%MUؿyZܗ7$ٴ6u!yr@Ay>m<8&`5ŴrL9)zV,5WH>g̦yi‹jo\YiLMKL\(Zw]4b'Z;SMQ ^:"҂B|,g+ܪ{U}{I^1Ibdd?|Y#y$4"#h..3z?1.yxC>!(M|nj6#T3opv@#H.쎹,$J> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +1053 0 obj +<> +stream +xVMs6WrGE ۷d\7ΡLCg|IHBCOHL}09۷$?8nKkA:ܴbsu< 4㌤Y@HR|Ҩ~qa^M /IƢB$ir} x`%|~17cs9Q6Đ$1$="Ø.v@dqt^xAkPZ7`O'8H%Ў-8|_wwъģzկh='T> uИ8㙟4s#;i-~϶{WYn.h͙D̺+pHb)n`}L}q.#~Y +/1 ۵ (sB<p0 IFN:yP:/DcX@K'G-fjm~J t>]gjp,!I G4s +endstream +endobj + +1054 0 obj +1063 +endobj + +158 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [1055 0 R 1056 0 R]>> +endobj + +1055 0 obj +<>>> +endobj + +1056 0 obj +<>>> +endobj + +1057 0 obj +<> +stream +x]m_1UEI4_\\I(JX|ϼi 3$G\tU& 8ƴ!ǘ&T)E1K%9){4ψiro핊|TֳMHOaAדI(izSm_fj+r7o*"/&]p?LrO\4`C5 +$[%?%{6r7 1,k?9U ܿ*dI*r2l%#i;NE>l;2Qr+-KL!u٥0Wt_ MҊmZ/YQUh'ӂP擂u 2B+.J0גVZx|0EVM,O:0ZZc=qśIr{O7w lvvvwlٵ5C¯75Ϳ>Ԑo|8frz=ͪowlˌv[ؽ4&JG"Լ`:Z0vTV[z}Osf:{22S\AUZណ7&V.td(hMeGYdC,#|b9gt#YG!;)gb7 QVَ(`xN^Y +7ͪl{rL]Dֽ8 *c)}M{JPlߓ٣̗B[W1X8he:hC2<6Sr6.ormŞ56\*4\IashQ3_ >Gk>p\i8 9p1{ϳarY7 -Ai*tf?,|50I/ Pqj oq>$مTV$9bFkޝyרl "H! +IZO,eG<90kl|'#h.<^ara*wD@[ +$?,If L4Fl色)aJ! 1Ue!z]| WՆ29b#^ө +z]$R}C@HGj|.P4Z vyc0DO;".ereU,GAH,0au~BTGC_fL9@sQ8s-1 kOHRuj'!*kkQ9TJҮґ&ĔwGoKB|ÏyO6/]?q?H + p[~\U0X҅D٧J>m5\m :W>Ps,зr|Kgm>?!2oK|[)?4ɕŒ s+xRrƭ5W)\%+;y!Q9Q~Bӊ+\٠"lȅ+w5yr\ v#:go4!ho3Qr _ hRm#)2dLtwVU|dO@Z3b9>2 01Ǚeh{)e) J(׮ rI'B(G*F!K5,t/.ZG]^Tn{:[ٗp+mcjc\fcFsDL:(Xe6 }ON5C銒]_LVBQ1?{ &tZp)|LLR23؎U*A2k¼9Fc֮4<{հ/8 +oU:}jeˏ? 9d?ThN'B D2!ZE9CaH= 2606V AJ?VwoJ;c0a`6*AVkJfFc>gF`,aĩ4ԨKNoGQ#m#$o,=)n,a[/bC%`WP}%`(3Z^PM:|"0ZVàK)aaZ:g ԫ(||yB1vE L^EӱYd9QzduV; +8, _3ʍM= JߵH0\J J9c]V r 86,6RvJըPaH$` g(8*`I0 +Adz0Hdr0%{ю0<,1FB]4lj ƫzp%ØcRH-XXQA* +;|U㓇 gxXD_0 +FO0;ґBJpu0y(D 诪XSoA4צi0cXNa/35"6Afe#Ѷ4cH= M?4PtLHS]*<9> <;!@;C%-h8 ISײ| x\ qU_ >G")7x,$t#GIN/V#Sbk a9\ &>ưg! Ą HtZ99oABƣt _o!L3tИ3 \DI46c2M~S0_TOG"|QYD"1U^Sj~inY6=KX c({j /1p!s$ݰ]Iȟogh [I_}o~]f~m6lVׯK\~lכ]6oj׮v ؾoo~ZͬݏCsX$cvgx4y[ }lX`vXvpv@CnꟻB?g7r3FY޶B3͚-_5ݵ`-M?~ڼ䀲Yygt(7pĞnmRg_7-z/dݦna3#n7;4ٶ:n"XC CNym/$7P$<eKsyu;7:&3 ݵw_4?zBRwۛqb7놅Y'>4[b@jx^.׿$~KmgP͎Γƌ@޶g +{c_|R +i~i-Ɏ9@u7=pEk+ywMrKo>˻7̧ma5D@-1~ +d2zbzPwrN1֕ynNb$ +̹K+t,vaQ`Яn9KMx7$b~}cyi_LA7t"ӗ@4~I;|qSHDpQ4oK;|!1{tƿJ +5+mniAAt\(O Uyf9w + e;oBT + O|Y*M~vJsY> +/XObject <> +/ProcSet [/PDF /Text /ImageC] +/ExtGState <>>> +/Pattern <> +/ColorSpace <>>> +/Group <>>> +endobj + +1059 0 obj +<> +stream +xZ_ק㹸nAki:HeiNJ+1ߧ3\rHV>ωKp89Õ8f  _vO3!de<+˝`vAm*fLhorLVX΄PU5"zD,f#l X] dAn W M!q'5IB34",3Y(bFU=ÕҌ-Fh HHxY, Z! PKWpϐb+,F5hTX@ + -4"&RƛO6Uؤ*)8%z +'H)HtB23&a^=CT0J{Lk\ +LRd $33aY`,pOHdZa3G[X0S)Qob"bH<(9{d XaA*F֨KX&& wrrr䒽[ξLw?xeaǾo?ӪaOݮew+6ߵ=ȴX`[zPuz_Ҿuq]}w|D3y-HWmUq}h#g p0:"}rY<& +jDjH=P 0NT0l2LUCS0aWL唱,qWzJ2Dx^${B\\!scn=i䋯nT I61ev<Yxw/VBR*mU ƗVN*9H:ҐkPDKJ$]+*rOI"\a{tP!6ɚ\45qOٮ:Ze(ܚxڭDPI +驝sd=Y83n[(2b?C tW3[vXBv~rS hġe?Rv;JbRBTYAa!Q +N@C4N!Nz ݥT{B()3,D\CT&8sS<'h%iMrv$~5lQ.y$ l=&I+RigDNc"u$ T5^3% o!A4~&_RC;ZL+ub%v#!Ή,]| caz +'`+0bsa#rRh;҂P;tl* %@x]8TVMsw|H6~W`r)@S;&xiSh<~zkNsY]#Gvi"x#{ I>7B0YM=&R.3'1]CTF䄠-ZH ;&Esd6'oX@=O(Ի=MJBSS5}5R( vDNc0K4*ӤKs"N9MOmwU>'0:|e"\#|Y( @yV a\N7cB,>"rRޚ1)Ԧk#M.-GX¢t)ڌɴ_tXG`fC 1p{ƥ5iA}n&4'z8gGd ?1rtʇ t2sq% A ߎy+kWW~|Mՠszy|Wtqػ?{h۵a.Kl#a˼|v{ +uZHqᆴq0뵟?a::]Y`r[Կ}xc%{| *l>z-v7Q/ +815 (w4^~qv∯>iT  0o(W"z4XT L|?UUiݖWew~#7 "Ppb)ޤXuBF _xIzdzevXwpK~khѾnjM݄xD/묕lLsM 9Ƌ8? Z}#?I_@V3iU[>`w?t}5ح?FYr]Y!" l@#S`1 kyI$Eh"ct 8mRONN[OCGz#/,*J o>[:-^=zg"t(—[(YxA +Pj/3Ju3jÞ S@'@'>JMP1~͓{I^R#Bhdݛ9^-^b!W*'C뾝/q/ Uqҕ~ iedKW??z]Vq9ozRѯuh7%xFѠɍ/oߴ%@97m,9̑ޥGKĩH_|D +endstream +endobj + +1060 0 obj +3166 +endobj + +160 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +1061 0 obj +<> +stream +xYmo6_C;b:nqh(+K>Inyw鐒(QSŀLᐜPL= Tݿv K+cDj10P9E7,"R!t\ʁlW¨ZT0f}BQ.3D)M`ŌFA{3(U5ЊU(&'59N|ע$#h>(I/1O!i.J`RG' b=-B,$&;|z.JczJXOsZ:hPzp%f% Cw[(wUGTZBڦE)j!C^WU#nwRm~@ 󔖭ljk}]9]媦{uPWqۢm˿y %j顮v,c{'E  v@^>aU@&[˄E&sgC+?1F?oEr!4n@s:'<$5 YaU(-Qsv1aA0&Ktu"'D`q(x*@iF۪(ͫr) IΕ:rk^Rcpjxt)ow9TYe}FEg ֯0pgN¼u%-bI~  A]qdRmU?/W?kΪ7(2Gw(JE,`nJEAk0*P=j:oƠphHh%ˤAN|GnX8wboBGZJ'>w +DP b LEqA/G(N NTFqi₃н'(âc/enxH{Q /\X_Z! +'΄ +3cㄉ89FK |Fҩ(Wd.J\FO(LCу1 ueo۵+l3?&= K9^1ui&An/1)6$Ep-0$ @Ч^qY&3J x^WqE.w,K\.GՉ1 +}t%M*rrhv4'sR2iW mPDM"8䉢؟tk՗Z"W)<=.giL$K9Ջ9\`ji"03} s*u㊘#׃<68rX13K@fRb3vmqhW\xqw +ŰW{ onQ6-z+eon`5':اxkVm{[4?ݤ'P6vGnLԑЖP? +endstream +endobj + +1062 0 obj +2001 +endobj + +161 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +1063 0 obj +<> +stream +xZKoHW ~c۲q`=X,0DJd+ 3gwĺ'-X]H YU>`~}7\¶W3h&[_r{ǂ&Y5*Esye9S}7m@-'~$=S $+ЄރMIAz3ِ(Y56QEGY4Zo;5ztҕ_HYUXpXT 4ҴD$yi*RF,Ъ%"K't!B0J@-yqxǒ&Gƥ[K-UM^PċzeY+2ϓ "rTZ$%LQNRúoQ;!jH%u'jԝREJDK=;HE@Ƚi9UT I(8E0k%i ղ];y{7;ߛ[viC4DG%XYtΤJ +eԜJT4ªW˂#&2P:,@,o3^#=5 5W\gtP*OVTPQ(eFTX'ym I1ڼ$p"Fi))w匲.q$~k+e +,x~&xmCR7piq?4w&# )ȑ\mpnجjxm ?/@pa8?I-Фp?/a6?AEyh><@2J,ӈ#w`wT JD^fA}Л(s-6\yǐ2֒Gk'}Cl~95FlIFu#9~~l~{j`m4h0I// '6 +j|~rp (n~GyPk;M%=m1-p +endstream +endobj + +1064 0 obj +2440 +endobj + +162 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [1065 0 R 1066 0 R]>> +endobj + +1065 0 obj +<>>> +endobj + +1066 0 obj +<>>> +endobj + +1067 0 obj +<> +stream +xX[o}_1R!0$KjMd9Kay}f8얉ZW:~]m2O< +' ~fM_L,Js ̼8I8&O\,7aAy)@"ߜ +1HY|R/,; "b~d],( "ݺ`bjzxd1'dt=RG=X%p 2 O"f7b#//ᡃɉtq"f17b3WDD4br Y,xm;)nArI{q|w ٰvT#+́v+; ~f۪9طdU+T3ӻd7wdb/f.Uc۪^jU^$a뇼d E[R~'KX5mq8|mA|)}IӰa`tve,|qƺ݆ǡfPUyq@P|sœ,,͒ԋxSIYK3`AeXꅑ,=NcsjaF :ce=Z/Hfe-MR#>"_L2<.  ?.jSn?8OK<4Y|'؞m;P[T)q aNEIbψ9~, lg]jbE9oS:(r2ho' މ*@u*Eq@L`bb dUh- YGQ"{xFƁȒ9G;<3S60V+;RhNGt\ʁ JCO"#vxsD %;;g]#kUJ4U:z[XP +tQWo2`VUr>cOMԱW|ne!}^$Lko%ΣmG=Tx@ )XG 4J:"Վ\+=pɉ" =2 +endstream +endobj + +1068 0 obj +2092 +endobj + +163 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +1069 0 obj +<> +stream +xYr+z)4- Tɦ(5Uɕ7ifY&)OD*Q}O=𔎟ZƇƞ=L ]T˂c>I,qT1&JrӻlpHDǢXIdP?{%{>u'y,yPe^L c#|qz1氘1 IBYkLLsH̘âXIi}_R$`c(kDWIOZ%)SmDx bXMHDǢO//=B p*6x$cQbz,l!zJ|N JRʚ c=rXEe1_^zD؄1I*!BY26"F,*kyۻ{'+xAlcgvl]tP,=e]YYͪ)a\SZZsy4/-z]wY!k[U]슕qSY, +o\.m7ݺ'c{j{bze^=vul:RX7+`i6/5iM*w+G UiTPvӶzג,fuזX"+cy%rX z`"؎UMmY" +}[]UgT}uޒnoyB#D5u?kaIU"kY$BF;H2Mn`$O`bHn u{Xi?X'b_ M W^/3+P3z7  +HӠiKi)rS Xьs&LR 2n͈= +ړΡ+0Aa $+`:^:r_lpdy[Y#{$wBDHL.3uql.(ǢP:2QSW-?+AcC34@ź( :g<[4rQ_U(:֮CE]DziVlҹ zkLHc=ָu\.Λ AûWY"{-o \5)er=<8"1uk 0%X7KAeHQS.RKgWcw=컁%׭]U+J^cQCF*KePFf psk FkzƸ@Y}E$>Dy"p1K1`FNbq{~GRTSziD7p0i!$B_ +;}_8mǯ;IpYwIgJ( e}*kM)k8}2df\jDpgFQ5ݤ2^)U<+d6rWDΤ^"C*JtXFt>,hJcj/_>rdFZn%CBip(BLLϒﶽ2?<q`>_U:zh~8jtF@;lq몶9Bev@?\ Ў@9&þ|f;K1XԏCBE,_AAi;k_,*hKe,zW>HNlNթޚ+5h?8sD߳#RC{^\]n~6M\fG-nGd_hhA]70UJD['|BN_Nῌ2\LY>^)b=p?Ozy9Y,U%IOv{bgWoLL&"d:>'3W!bzyP@*:,;\?p> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [1071 0 R]>> +endobj + +1071 0 obj +<>>> +endobj + +1072 0 obj +<> +stream +xZr)液K1-mdK:xm C^`в3Oz`Ar϶JEh/O|?EVٕnz5&oŞ̋zAkV&.KRW ͮ-+RXRź^kUlr$lx:[ (lUu +2Ic…AxnN/QՖ$rloI>۪ŮwQ\Pi"UPZn+d_ڌ ^qmF/ ;tU@I-*h btIl֡Ȳ(tڽͻ+fWˢl\VjA2"TmAˤ.oyȱ<01ō21)p~:~̔pi 0MFWOt«™g܉O);wzC?h]M* <*p8F E*Tr^$HhʻxY#tUU]{.W[ mZ#2/ZJ6MnkI^i_>KK^T7J*xF>醐CTڄF|3_w[d>2zhl5v֍v-r|EU>G9sh[JmKVJ9%&RdƘ3Ql$PEp PcPaE3i<; $lPFp 2qcsj`\ '[gC_F*nv{ތHQ4+*`3kz@Y-ߍ6hϬXD".ȱ1XnR~2d*_Ιāb]* +6.^܊ }BopvxOnՇc8*x@TgO)2zõX\LA0{ѬLPC5G Oj'ӡ"? FA7c S~NX0-z* 8%[ s"2fX[ Sl1ۅl1g ~B(S2U0E +&aV3R)ib BT+ۗ B 5 +b@$J[cL ; f &*%`e%:: 6ra dc lqK,Yc`.cFݟ%p,TYIV%cb BGX)M'YR` M1UBb u%(a&5;lqK,Yc`.cyxID8CЌ*168#>m+%<@, .dbj1 +bO H8;PETL:TSwYؐRx4fZ +-G:dW+u_j~\5~ \ pt&vk˼ɝ͓- ˮ K0kLī?{D|1({0wϪ $~^+~ C@Klᄨ?QM +endstream +endobj + +1073 0 obj +2328 +endobj + +165 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +1074 0 obj +<> +stream +xZn}Wl4&i+).g8&93)o,9ɣjt}tW)tw%r7gIY +8I6]Ʉg:eˤP5̍Lk3TYG\SZ&*M1J  F=xds[1og鸶<z٩<&0Wb2ϖc#+cde`c[xc*?cYxb1kǼ՞=Bzx{J!TId4|Ҵ.ƲDZaJQ~H"Ä hcL%az3c0=̲Gv\XO{^ yL%E)D8de.=f,k#$by 3Sñ&cr ǂՎ=Bz $'N$4S}qOg/g|޼?z3L~E,KKڱ9݅p?m׳jƾn;6]m =SK@[j!Y d77MuK3[.3]N΁2QRLi%`}%5!reXq0D~✩DßL8؎rI +ciLajḂrӄL3OV/KV&*U&TzEFf8>sCb̀BY{wCwmoǪmءk#kF6vڳеѰC5nW®Äm7߱'ZwY7 SE +CDDSa"RFC6[4` +0)uqvc\St}b +nI:]yT؃Cba:,QŒq"L%JJ":Όۮfm} ;mT8I۟܏f?/=(dE҆ͷ *ECF,00 +<ʳ$6c XaّϬ(eKEE)_, +LD)^+uiD(Z|#!EY%EQ0RFd4&DY}W(\%\&̎B#!X=((Logȋ(:T2YZP_unF:{{LuОTqVkͣLv~ZPT}$+nsU&愸?K+(dQ`ak7J99zD.q1B9waw{!W+E V;yyk=+Rb28a[JB.z`ճΗJ;\8r CnD.CpXV&UFYa!f]B^CE^&j/8ZOWzRF%na{Y~DZoQB`V|۟OXPRgVi6ÀCEK(^=/JA][Pϵmj!>VmS'{$Ɍ[c7Lk}@aG8PzLjzfju@>רhw n;5~n]7Kܬg C~zZ{w/>͚}q`fcڇՕd[k_~.fi@MW#ο~N h!d֫撿wLa^/aΕvfk6Z]+l;QO?Ov!cO.8_LDj}xJw;4;VbeO>-DQöM5oа*au|A}.f+Wl6Ձ7]ߛ>;EfRNq҃]$xim7"H)FB 4-01P(<ZbZ,cӨP0E V;7zwkE{䇘oy5m{T67;҃)Qf9,Yء;tM?=8 %phvC +C$YdU]JJˬKBUVbTAo&#LⰣ{@drv (gg=8\~V{d/nhW|˅'|OgAt=aU?<#PY0 5Q_$98SҞ=E%5SO ʝB|گ_G;yQ@PPY\dv_&p~˳oMe%Ј4!Ji=T{`TKVSG\3_0iiLv 5"&Fe?*մ*dd!=D:Sn .оv?M0U nF3YVNt (q-ܸtnP +endstream +endobj + +1075 0 obj +2924 +endobj + +166 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [1076 0 R 1077 0 R 1078 0 R 1079 0 R]>> +endobj + +1076 0 obj +<>>> +endobj + +1077 0 obj +<>>> +endobj + +1078 0 obj +<>>> +endobj + +1079 0 obj +<>>> +endobj + +1080 0 obj +<> +stream +xYn+jidqKE@<dIK%JTH_fsRE:Yf }sϭ*E{87CoRބC88 +N6YCp<H!s Dif*tk_kD'8i؏v܋v7a= oAaL"D JWh\ +:jv1@YF:|N[*|ϩR7[͛;ա4=l4+L UH>#;t=׋м> QǴG= +4==jB N)q2Rb..xz9*phHlU%p#Eo,}+}3Q &FtyE<5 @~lr*2MBBS~e#3Fz8C5#W6KCWR-!*8!+2NB5WBq cQs;5 +SW$G1S3/2RW 4c|#=wsh~Sfc_qdz;pWC<~ +i}J3aanW622_G~CiN^n>x$Tkd:Mwgs3m Wҹ_j_::%z9c͓;_b#Տzz_Eح۔gsMЖ0Z +>\S~[+m-9kxWKg[m˲*۱_eⷚ]Ul>*}^6CS|7yVmؾη-[,ٳ/,CU쫭[`>TƇE3ڑr} h@[%Ĩ4fӷuJ[9zEmٸmSG˞9Hk$I0aH6b7m/ȷy;4ZSuqsHSLO ˊdٶ:^(6D2UnEװ]V55?V3:e]Y RV|E:*Zۚ|lBq|@C2b[vgхT#V5@aW42htD+L;qB(wH8mc8l2+ɲݮȗYWùa9"Z)客du_Կ_B=vJb;?i{nVn1e{ A<3U$qeQ^> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [1082 0 R 1083 0 R]>> +endobj + +1082 0 obj +<>>> +endobj + +1083 0 obj +<>>> +endobj + +1084 0 obj +<> +stream +xXr6}W1$,L3铧u> )$?.D(R\k%[p#Gl:!۸1#eP*(BJ yt_-sb+@=kDÉzת"+6ؠ&ʩӇE; +-bU U"%TEyNNUDXomN"oU{27. +pӡH@P!_ecT@r !7GzX1)m֞qqz8petG'l!RC#փw=Pjy*R#@g;YONdsЧ5'M)o> ҂{L^|&K. #??_;81(g0W%&so2&C1'ȒT$1UPv1sgy틴Fu^B)hm->U/v2*p}*AA5s׶|bv&RH\m?NA̺ͫAz,VY5@!--ۭ+);<֠J* -*IU~<|\UU'D%det  /ء́ķPsU.)Zq9Q!)lN[ 哭a@`Ԩ~_ VUw:Uߨ| j[?UyJ!}p/" +endstream +endobj + +1085 0 obj +1394 +endobj + +168 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +1086 0 obj +<> +stream +xuVM6Wm')%{d'Tr %q2(-XX_M{ 6E8e5M)MYƩ ‹835aA悈s^ N0(8=dFe,!y321 QsZwە>%2MC؋7>K r*$ <^lx2=9a0ä!0[,b| S`n1>קyJDJ=׮Gd+NX7"tSA#ʔ[J*[ c$#嘆(r|g ` +hأ=#v@iðu8M ; OɁN R݇SE^-HνUêMX>N5Xʗ B,z=g:9 Տ+_޽#3N5V CMKI _IO,\7YDIQkhGw~/^Ou8/_|Kl48BFüJ~ 'q^(VZ7Ct{ig|B DmɡE +endstream +endobj + +1087 0 obj +991 +endobj + +169 0 obj +<> +/ProcSet [/PDF /Text]>> +/Group <>>> +endobj + +1088 0 obj +<> +stream +xWM6WVpYKAQ Ai" @.Dʢ!QP$o {& g޼19nhxǧ|\HƗl?o"Lؕ<Kb7q~QdLM8U߼ dS.ʌEzgf&?և5ڕ~Anl*xƃX$`ɫs'CѮk ZӒ^ʛ∳lCL`bieNBpDY0eM4yPV4ט\Kړ} ӵ#wnՀ`Ky5m#ޗ+-E ;CY{DۯHkƕgӮ` +}e}{w$57Fu6!3 +05}ׯ@DdT2r rXLN6;S덵ecrggh>l ^/dߝl $La:ZJ\JWAWEšvocK׎4Q8}0-@<{$GOmiO6AIZkeUٺU,=L4;P!7Z +:]#:T;H_C`>4텢ô<[o՞\oY/ho+<-ȡ)(*zIa»#~~AEkP21S{/$b0n#m:?y<5f'YP`HO 9xˇRI[ UrCo= Ԩ4ܫ!8i~@7>5tEf.&݇ƙ +^Y3{BF"BDE\c49(ʔ.!g\7d2ZkkkD_D3VXC(fkZT#3:ˆ]a%̾j3(ͷN8xCAIpx>NH)&Q9?+%$z<*Pi,dӪ(Y<24ߗce- K6 *fV׽o~W3*Aa}SR^ XW<*<%70-GB#Pd'}嬭\yi6_Zn~AT{j͗ގ34l1|[sVwA|fk](ð9gߕUn'D̖!sO] ⠢aޛ]hCj"ơT.tto}|Ct7j|U(ߚ2g?Ơ˹6"׈96' +c-WKi|_")xa[2*{v]0MG\zh@f\w- O.a #L3p[U-|o{)[a +?XӪ޷{[%8'T^\M41IJoEՓ&RALFܜ_X ^dBܾ7w=&e—wgHws+QVt#ɻ2i +#q?WdJ +endstream +endobj + +1089 0 obj +1574 +endobj + +170 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [1090 0 R]>> +endobj + +1090 0 obj +<>>> +endobj + +1091 0 obj +<> +stream +xYKsFWQR@**ɲ琤VC1@P/sn`^Vل>|nS~SɸO%29-Dټ@gTKXM1M6p.i"fs8ڨ\` `L0U "#$ hRQrI"73juXy,Z{:|zw +}鱀))Q䳕^z! 9 fق=Ay,Ẍ́@xvQЌ/=搅y,Zdor"2Lolw%-@#Ս%erLƾ;2ӉtTqǑr$Oݹْn<,iˏ}5 +0Bc[쀄PBwc-*kc^wǪ9o Cj Ggӂ-F4GKv-SQ"3* oҴF1 ( D#R̫Tqj +#&OYLU="&ry ,犛+`\٥WE<\AWW( V+f.lVH4'XgĈJ^1u~X2j8_xȜ1R1AnɩkYn W%dБ)zvvմu +nPM&b 3\5*me* X/%K0! ʳGG.>.]0G+1 +ieɿ6 +[Hv"mMRtgRXv87@],"bn^}CEx(2 0j!Jү Ek8Sx(2\1 uWy1L2ٙ+QLԕ"- +;Ձ="\dYpa[//ᙔ[wܳ<>aJ"!aӽ&ˍ@u6@ \hA-`06\ _;r+Rz#*${8(Z %_ ;e[uk%A OW$q(2CRQ7K~8MYAًMf(x%].D^efIb^/ex@i> NjU~Ih)4ŋw"F\h^0sy!<{]~(+΅ ;LOV߮yLKj~RK7ڹCܔԔuףrM4-Ό>bPbpfb^W[ +| +Yu5 F$ncO<6 }LW$Bϫ[I׀a, +X:'HzGYis%Z?1_>פ麏=q,Hu(mv+,=4 `oBz2}8! +i^w; MH>·c*DkǵXW=ھlVeĴ;@c$Ĉ"GaDkiKzT8@UY2sl d! 뱱d8C{ *9ut"4*ij>5Cݞm0!DNɢ9S[Kzh7V:_ +H@g͡u\{<][)W?x|ߌ04TϹ}*WG*'ѦӮXQ->#Dd BrՀjÃ%ۜv|K[|?1yqT-Ҝ4 dpUsYD;qW=\1\Pd)owoG8O~GleHa_hk%x> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [1093 0 R]>> +endobj + +1093 0 obj +<>>> +endobj + +1094 0 obj +<> +stream +xYێG}+щq/*6R,?GݍX,XgRLt5Lxeu;YVQG&6t*o}s'۟'J_ҕaMkbT%wQ'2A+4%J%mTi%t:@f+]Dt.IBޗ \`Lc$z8cQ\l7,H\Im?{c\`{~$H棄VkeweA;IX+CEVֻG)f ZgEeuHp͖_lF {Gyx9ArZ H06V L?:ԗ]_bE# =aAq \NHT%x !BUR߄cRGE%77*-*)9WBPrAAMrEofU9}FOfRS)`S%$/ î72`0dmw=(7$y27FU2T-R[G0p=ZLȏ2%}A_R#^ˍho7fR qZw<2f`ޤH+u:5c ;jm| /C_3S;t*˥CG,A\0.igAV~P ne}A{B:(Kjإ>& >]\%35O-GIA)Y "< mwpľᖰIBk; (GHKaDٗ;ywjψGqK +] ( W =N `30k"%(G: Gg)8!q3WB)zǹ2 #%V++'}faQfI4` +Jީ`Ql3ITp\aq"H +V^ g3:_jZ4nײ0څi#Q,5- KUʫ&V[C_<ŊUCJVoYsjrVߘ#tM qM _?`GMUDhո&xň{dh& 'hqh! ʇ\wh?oifB9f@㶈<,"qwFDȴ&vk 3+|1d8'_aP9irwoR Oe&-Ԕ 45-4Uyko*ݛpڽȸM +ilKh#_n'5]6az>wd>KJ.59n|[.뇟D8D6}?iLrZ_ĕ9bԙ 4$<Շ<ԛd^_ 8pL3dM#d{> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +1096 0 obj +<> +stream +xYnF}Wtޜ0-)HhYYH&7y1Kݧԭ)VQ#o{J;~9֓L +m+*!švТrZJ]9 Zi)aLTVJ/aL5d5Nd;lГ$谚lo_c +G6!JVgF$TA\NA&>AtRIBe-szCjRikOt "iexBIY1UDJdِoO[|;BSu@$DUNy lƨ/=ˌ/Lb+UO6&GʾFy6΁;>*-!rJE.,qYSc{:~B !RB3@y%r{)9}azߦXqL!wH(,=h Kw "kHb.@h~$ISIzS<)7ل [PC=FlV~v7x4W +v~toEI_Cڬ|g齐%8CqMĊ{_&o%IӖ-<[ E~)PE[ٽ_}!Aq/b*R.l&*\CTQA/&ZlX~sޏ8XJ򠍅q` ԁw~JvZhUDL飈U ds()0,ÔP` Kh+|+ ^W{%ODj QCĽ%]&͐agygo. +ˋ`Ktgc޷+Sؕϖ`4r>; +]JaSNβ/d{w/ ':~ޯ?v) a\$߼] +?8մEVUS}EBP),*f:L~Vc2^bU |P1+Y*lť_g2[աg B&(Sw ]vU!HVk&ɢ KVLbVzi)Ο6I ye85thrܯǬ"8g6KQ_nMbB +Yk0lLƭ z$f,c6=2uH&]ɢ3Zѓd4Y1uAvs/{MOuWZDmoK}"T Ejy"jdЫ/Þ^yy×zu>UG_<%_=-d_5Y>izs!BϺo7ۉs~>63Ъ0&yt9AR|L ps|~Z j [ $\7=hbۯ|.$=n7/&2(aǍ=C6[o=B\If~ ҹ&2aW"ueL> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [1098 0 R 1099 0 R 1100 0 R]>> +endobj + +1098 0 obj +<>>> +endobj + +1099 0 obj +<>>> +endobj + +1100 0 obj +<>>> +endobj + +1101 0 obj +<> +stream +xXr6}WQmq!28Ӧi=w2})ȢC*Ig!@a.Ab/g (?rұ&OP×Ƭ?H3 t#J~E)D/TI)DHp&+:bgP/$HTfA#g,(*("IQ!FW\FTH0jkĔp>wTɤ} +saB넕) ({u\Sgس'8ellL\Ė$26 cfTl*>!c#36ap'UA 0фL=$W+6@*S|Ȕ/5iLn7ׂnW4{rhmQ'ruZEBfC;RD*Sew>k{ +hʣTs<8w}$yVtx EEg]MY^Eut;CEL4RrӶvv$#[H?moy}0.뎘-Lcs`h(Ah{C;d,PRñkɄ1!Hv4*fF.|#-l/2!#\=í;S1n>սc3l=+`d}xnAy֑ñݑSWf8Jݐ˗N/;ܙOXW0Z@~gc?jZgQ0>G1\W,`[6A+&,E{I:ׯ *I%L%tͯ_q&DRdSi{/b< r\pqp\m}LYAKwf_F}ٹ)uU4]7O[kg9Oѐ6(:I0S4>9nʸ4óh][׶06v<=VSalϻzWuu>kϱY^-9DSv-ͳ,Aѥե=vԮS\uhYehiyؕ&Êm)EnsK%' 1c|c@MvoU(*3? +endstream +endobj + +1102 0 obj +1695 +endobj + +174 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +1103 0 obj +<> +stream +xMo0s,WTZZ!TӬw74mUa;Bܽ$zywRQo@/6QLR i9RPDprD (HHɂ42HӅGDk&4Y]Ԝ#y4X96W=npO8yu?ܳL.#nƗ±U*Rswlb +.б:*rlک{$Ljk5o δ8Ty.M&ţO,MӢ2u4p֡վX/4*ɶ7 +endstream +endobj + +1104 0 obj +771 +endobj + +175 0 obj +<> +/XObject <> +/ProcSet [/PDF /Text /ImageC]>> +/Group <>>> +endobj + +1106 0 obj +<> +stream +xXێ6}Wq[,X^⽴)`(K#[ INCCIȫMh1yfpf86 fI 񡱋 FsUyErIYp.sFM$5ʽϨܛ ˁq naD0wbfi¹C̰s׌H\abJ'{@!*$Z}ǪEcd#{]v +uX>)b#2Ql\ 4IXX$U&wxvb#2QlĜb>"Ũ={LiY E$S!)TpJ5!b XHC!*Ű߱L aF<$1 =3e]Rw*˥eۆq)(c)P="bK FZ>UlD&XRQ{~{^ _t&`zݣksFWnr ~^\?aCjՒ&m>r~WL)-5= \D»~_4W >>8Gtc3C.Q=W0v?(pP Lz'kۡS=fh@ɯ[lxjW .TZW7Rfh6)wYK)FFFTߪ@3Kx v+-To8G;޴I7݇`=xӥu˨rVMa}* 48 MīTF]"׶2"A{7g~8ἇtҐU]={$%"n[ˎ_UyAe&(ɍ𡇘 +endstream +endobj + +1107 0 obj +1522 +endobj + +176 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +1108 0 obj +<> +stream +xXrS('ZJjw%m]\)4]92y>$@r!Mڿ36Ǡ6٤IJNU)>9vJY"4,EID@hʒRRj77ZAVj<-  /iJoap6}Hߑ͸??:}C?on2ey.YdP -xR?3IҟrϪ]}SIs"gII\=J'@iԞ𵩕lՖ<\&k[t +t= :20}7n$MPjW:gyiK2ʄ ,͑BZ.&4 0UԣM\3B3L(h`4sr-68 +f[ XGPJ z [*x:]y|{WYeߐ9X/QIApeg2.XN,Q7W\*Z$˵JK)NStZ ?wc!RZbѲY!CveX _=}az;xTÛ:5zR-SBmQ=_Ȓ2/cV"ZeiF+ccuPƱrj4XCAMRkm_H2II!ZwgV9M%q\Myg՜*`^XkƦj@c~"d_n| '$ 55qZKg糼b4ת;)<bijozY~P4k@jI;f1 cvT\H0+WeӵX|εJo;XjS`SkC˜aL6`vC5 zھ^ǜ4{oFOQ -;m%Ǯh| x㮰=KA]Dy)u&'6(r/bij/*ש,zM0%[˅&8Ss }r'vDBTO/I>.>E 69>!hIhodzYh~* +22,DMM7k~Bx4.X j7X.7kQb#G[v^l=djv] ;`[A{򀚡9ށ +o@e8Ƌo]JŵnZϢ |vӥy +]y4asQ䙉\Oپ<6-@2}|<۠_LIm^3D?[rz#'LfI!yi+S~aoɍ⚠Hx}tgA&f-h{ w9w!`il 2 +endstream +endobj + +1109 0 obj +2095 +endobj + +177 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [1110 0 R 1111 0 R 1112 0 R 1113 0 R]>> +endobj + +1110 0 obj +<>>> +endobj + +1111 0 obj +<>>> +endobj + +1112 0 obj +<>>> +endobj + +1113 0 obj +<>>> +endobj + +1114 0 obj +<> +stream +xYn}WQ fba@(oLKuϴ0>3SݼT۱nFGCahiG<]4jTůΚ^HK8HjL6:'cqa2gfryev•0L tiB)̜fYCB s^k s(aLΐ&qzߩKwXjYYGDP)X˜3͙KW,cΆbkvXDfEK%d2mm\mmns[JKCT;`0m妨03 +3c2;CtJ SǼl֥0se a2gfƘd!!q}?Frme b6ه)f}2͙KW,c֔%gEdXĘ3VN Zǥ}嶦t;9ե0iqQ>trc\^!p% KnI3fj*,kH9c03$ q 7KwX`Ŧ!K)2͙KW,cL1[gd2{9+`2~s;'Nj˗Cm:о7{Aߣϧ/r4,/^ ϭ?nۮF6}8!NIةiɍh,+wfwݵo卺s`N޿[&꟝w^;[Hr9nA|c0DɨYoWvLtЋtO VubڵoGU(auly}.9Zq^ͦh$extz2~U׉~ӵÕ[Tb{+Z\!j/A~zxEA|bmnZæݯfAPa^m7$im&Aۡ]Buہ<͇jJb1,]ph?U?-mƱ9{}x3[[c=EB6fܽ%^4Rufٍ^v":fnZ0Wn"9keo<4kdLX۵V4~sniyhY f; s`[P,W5,M6c"+5wJ[W;ofqgs-n]%q!u8֪I.w C.Y$z`p<^`xjw'DR`rPD aݯY+z9Al^ XbrҦ %Pyث!Whp19ݿm,!^=kb" + Kd}Q!p% -}az=g(tU֐ty C3JX:3J\rR`ҳUvbqkTt([:JƜm^R?ZEKmG,q}|>VbS +'r*Vvy +ҝjЃϊٻy& +}apn9F%v̕0EX0ktn*&DaXf,g$o/BOyG2DGs(īYWʰh0a8 cա!z\ៃh7[s;bB;k/%Zn= o)j3~짻:~&mq3!^Azm57 Hy_n-h$I6;~QD6&7 ^5dPL}D@O1QSDT8Lm]g<o\ z)&g MN< Rt5D)zMX'O eL#A9D\P竦L6+Ci}$Q^]|CU^4C=>Me~~`e\uFfDD:=$޷v׊Pсq/cݵ'=SQ\ĿݴQ|SB)i +endstream +endobj + +1115 0 obj +2210 +endobj + +178 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [1116 0 R]>> +endobj + +1116 0 obj +<>>> +endobj + +1117 0 obj +<> +stream +xVnF}WG0&' +X^- +H̙%4gΜ(fd0 odݰBAǐ+Tv{D{,9Ked^ Ťh_V>b^$JDoHkq@(o.y\7E9c=U( +hn*^k(Db(Gg}'GwdWյSgSuw@ #<K"񤼢,\n<-8f*]\30hf#\]-|&8 eAь=DoPAݍ0Sw#ҎbkQ0S + a5 S $eGdΈ0qCUwUYj_$>7|!W,W( +մ˹p%ÿо"C.Jxe #3bW0|m`- +endstream +endobj + +1118 0 obj +980 +endobj + +179 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +1119 0 obj +<> +stream +xXn6+t +dGI.ECϨFSIǟEc(n7^{f.m SO2<9P`oj8UF`DI4l B(zRbJD +Xjeq;e!5K07DQϿ*~7lѢ#tGғtK.goǮC}|r׌h7#Xu6&rabw!)80!gjM=pMUCk[tM.a>Ox!̇\ }^ر,rgGCvmkU͌ܚ LǶuTu]foadWF}a͸Nҗwh^8ݦH E[AUVbKΩL7˰Dp뒈;] ~&&H|7G„BOsW8. H]p#WX[D Ƭ3DF5$r%](SeCB"ŚH%,e3Fo:ZJvRV,aRTdX@e 90ZgHX%̍*QbwyV̐3$(2JX:gȺތNۯ_=$Ěj۳^tG=ʕv^)Oehd S~nz>)lPG4OUD(xR9 +jC [LvB5LvsQBlxЦoaḦ́Nȍ\[Ov:4fljwm YW4jbظ&5Wlrnb"6L1ˉa.o"U=CJQߢ۳犅RF KY' YY2{mA ,M={e+𹯡Wd)g˥oϜGGCgPG/ <8e4(%7 ;Ȟ!0k@/V sJ&lPG(s6JF"=APdxrFavJDJdT2;)\AKXXAȐ,`r|# X~NJqe=&0bHday2SL& +c7jj?_/U*Ȧ`f?P"oS~bPZnKsy6ڽ*p3[9%Qg \pd<^߶fihYMnA >cZN ?V\k* +endstream +endobj + +1120 0 obj +1385 +endobj + +180 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [1121 0 R]>> +endobj + +1121 0 obj +<>>> +endobj + +1122 0 obj +<> +stream +xnF|=:r/ @4AP -J2$Ogtȹ4"'Grۄ am7?eW7Up.j/W7qN.~Mv:6nX7[iâOݰeSzƮ~ +W|%%kaoWl;Ovb?;/ͺb=ճad [DkkhM\JY='EG]+6ɦ6ERxL$JfF`^jۙz&qB#eT7.5 YTX+ŽaרNNZk63>3;$* ~"ER8K ]B=Xdcb9&"Tv FuBϛhd˚V>ViJ(ߵYnd"*$n7.¤NE 2T7 +Ga H֊l#d5b 3L{i:y߱\xSVicK:XpkAI±9 o.zvLc:Յ!îQ1;S#\jkd-,w-mؗ(dy Xܘx7ش~5`ym3af$JR'De` +L$&b")QX"# vꙤO^Y1d:X0M KǚǚbrC ) t,2V.LTώTq̤rG宓:!cvN.raq\xnX mrٶaI2m8Hnw~꿿=q23 K5޿~'& +1/\{XQ/h%,p.)^G6Mn`a\Mim?lswbb@qXRcaa?@} +endstream +endobj + +1123 0 obj +1634 +endobj + +181 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [1124 0 R 1125 0 R 1126 0 R]>> +endobj + +1124 0 obj +<>>> +endobj + +1125 0 obj +<>>> +endobj + +1126 0 obj +<>>> +endobj + +1127 0 obj +<> +stream +xXn6}WI޹ +8Eb3[Ne|P?%J&' J9gg8e,GG_*?z +*(0DX.˩u W &Jcj H@uk"2IX(zL:7`#1xAbJ@z>^CG+G}F=cOq=yޗ":a<#ıdE,di =4IXXk!o5 ŌzϺgO3,9K3*P1X%l1vkGHR1P*@ T*\0~]=3bil]Юm&J+fC*MrL3@!()>HN1S>cu1fCs+-U^Ӊ))Ure) ch-&$W)):D?q1xųFo La"HDzHT#:Z}8,HS0ڐz(*DR.DXc{F $̲`M+p`æ +{l[ai~d@SK,;vappxb +GkE2#bXWroyTu=~Xꌑ5, {{_~ݕ$!n|]K T,6 8%4҄^Uayu֋WX/WLحoTq|: Yg`eF%Ů~T !0Ttr{ih?Fd3=u]ԫ͚B~Se +Ā7!en?QYFq\SmF GužZYm蚴iƘ(JcuEnu. +Q(J1QԢ"?[Ol(KR8|af*F[ ԯƏ+wZqwEE~)\-N ncgͩE~==m:-=Tuqn.O-,2›:K_dCob7ɯ[aj2mk ` +endstream +endobj + +1128 0 obj +1269 +endobj + +182 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [1129 0 R 1130 0 R 1131 0 R 1132 0 R 1133 0 R 1134 0 R 1135 0 R 1136 0 R 1137 0 R 1138 0 R 1139 0 R]>> +endobj + +1129 0 obj +<> +endobj + +1130 0 obj +<> +endobj + +1131 0 obj +<> +endobj + +1132 0 obj +<> +endobj + +1133 0 obj +<> +endobj + +1134 0 obj +<> +endobj + +1135 0 obj +<> +endobj + +1136 0 obj +<> +endobj + +1137 0 obj +<> +endobj + +1138 0 obj +<> +endobj + +1139 0 obj +<> +endobj + +1140 0 obj +<> +stream +xU˒4+z옺̽E,5lG(,Zrq`C6uGZDnWE[~yI|Y(./ow*U>Z䠻1~9$wI2KCGQUAҊFplv=g2 $9m^yF2<1=W7 q)Aқ_]IXǡf#XƁ5g6ZZhx+Facᖢ+IQxJ fBr^ę@`{xR B;aѰob$}L NZqNiŸL,5V&MIšTZ2c,cZ]+h)^iBT0[q鄬LHRh^T"p5gyJ \#-gs)|06~) W̒L$iNk+w?Zf.: KdtiEf5tX\#PO!v'9@]QM2AV+7-ʻ|;ͬ4!3 xn{hB+<8/N,s$I[o%|^.zJKz;m$}}/;%z笁^t=,≶J=tJ5YJ#?s=~j~ڨqSlz&U$Wŀ`9n ).k|/i|qs^.ׁh[Q>̀UMFXئ9_Oua^o"Mj&CIݤ]m]_>=c {7|xqDU+!tq#p栐 ߨ h{0a8iոSvYߌiȊ/~ӢZ +endstream +endobj + +1141 0 obj +915 +endobj + +183 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +1142 0 obj +<> +stream +xWn6+)V|bc;iEN5/GѴq$%)6MO-w Hd0|q)Q˕q>xJ2@)'P* )'XXN x K ĘAc(P sby )5`u2 +XT=Bڹ$[=I<91^%wH ʢ9KERH\ ;X8Ήe9#󞸢Nr:oW+96K GUp%:V6k!doE%% ~KnV)d8rG^TjB6 +oQ-IiR!Ey%(J1ndW&s*JEB@PGmnHffMszdrZI%jI&)q%nG7$[܆|N9R" ʼM c9oGjW¶]g|}˺ӁjjE}\H}_bW>:"^_f@0McNiPئMC.ɒ^wnݶЁ3 +K, +wwϦmQ :74ݥ/'V}M]nbd1bSㅍ)̰(4;GeZ>zqzZؕf jaL@p}vrcۗecXmUl;,&KSW̾N +?%QoxwrKm}~ S"{[Ż?^Fl˦ĊWp]l8OTE^/~,x"SiJaEJ> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +1144 0 obj +<> +stream +xXn6+L 7`dO[M?@i[lzdҒhR;:r|=WGH C!ꮂMi''2,ݟt7wm\~Q<`c$nB#cW S# :aQ<֕ٝJ&uHԱs(D$RU^8m0VpWyJL%Z&b*HgBeabZ:X鄵!^ԇt+n! *e +CE8ņ cdD`}<햰$-x +`K8[wP7"5 G佼@)#aN81&k0& +)L}F$焍`eر/5qDꪸHaFt`QJq)Q;_o(@9 +~cЋL>< 0 %'.}(?;mS;_vwUkw[j^ZXW#-5綬S?6}~)mnܫz[TWؖJ틸;<-XV5HeZJ,wLvWhb +|)죨JFk|BcI1`4a}T~@TQ& +%o5pZ{ "U{zɕNFR!)\8]?X:p;G d;j 'z~Oo,5Ѳ?%ZeܙRu Yˢqc5z)n: +~YFyNB>éSnL+V iU;ꄇ~\Ôd0tUVvk˴hjvձ1BuĴg>5m[blfѢ +6߀W$-uD-]Yg>_vi +endstream +endobj + +1145 0 obj +1581 +endobj + +185 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +1146 0 obj +<> +stream +x]oW))*(Z$MS$EںڱlOv>n3z(/ei !s^+ 'V]3@VtgBCF^VJi/Fҧ0VkW]k#3bIJG)xL"mfn-9E[dԞ.mG50YZmW%#f%kDqY}^Rb9X"!R,Jbll@@1fXfAG}8okK,*1+Yst z|z{aƼ¦l#{,iQo" 3f8:]b1ktZ{OtOQe La0+Yst c]7^T$(V6PkK EceJvmX"b0+Yst z{=V=8g.#{V:Fͣ@D0f=̠RL{,9LۚyT^C&P AdV@<Ǻ=oP\bJ6^Cy7zX*ְ_dwH "EϤR*SҞomX"bdV@׫dx/8b,HOG}@6AdVz%3r`Ƀ2pjVͣ`-0aV@,Ǻ=oLRXf©!歺b{b`w`VŘb\|jK YɚYyA9.y8xr6k''5yf @^8I!VcQe La0+Yst -Ǻ=oLRXR%'51oe)T1~!1T*Ms.C{bT%ìdс,Z MfGIѝ$Q`G`6̰{@BߪI&n>ӨL2,g2JEbu4ƘHX"ba0+}сbUef+f|X"bdс,Z MfG+{CpjСG}@6AdVz%3r`իN Oo7AO`-0aV@4Ǻ=oPRXfNF +ejK '( LIc9W̒sT * YɚY{^zq&)/WEŷc^M~9b;ՈovB'ú]]}_Ķ<?^]'C}F:164~%ݮ?>~e]^gqźߋ4fsz^8p~qil޴m|:q:?n7;)7'Ahq+n8c*urur +c + +ZDgnBAiç8'v(ϻEkO,{ٯ &և tYߋŧ͙~+3'0ʌ͸ J`Qe LfS2grҍTUaeMٸg n.Zm[g\5 mhANN0>|bz~{9Ўjq]ԧ#FLC۔mV)a'6q'n[j,@>O#WT痒6Be yR?YJzjHi%?T![PJ(OJm{?ۈ]Nj0߈L7uVULS?sOaZE}t!.jXNFH>> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +1148 0 obj +<> +stream +x[r)f٥ +*ۛr*ImJ EB"$e=P(o`N>h˭ot` POrhqhϮ9 ~NnΤT啯F QnTMm$cU-R1&"jҢLBg&u 3!̬g}f~E\- I| dyF=:CZO7vo콂1d]"?f%c )KXW((}a=#fkIcu]2ERDQd!e}y]k)\3AruV(9uO}wrjkTK8g+@rf9v̀lLX33zӧg~bo-]բoE?o[4@ <|us6^.ݺ=bg;޴aAmzi4a|Ȱ^ b0,6{1,n +/Nso;,7 4UiD -ϟjg6LUF膶HS*JP\ wrjYD5զ4wv%>{! r{\"04'+ѷcڊCwmwT3]bs忊=>l94Oی~Rj^MĄZ7VNĤБT%`H8bzңLB at <^qMȓ$3Rg[m!6&|mzݤt$"#"M>FKI˽3F| c`zے%,F` M28ǭg1g 1ɻzݠuC("Ҥ:!4\`^vh[]Imˁ&5'u(CtiLWibMR:Cl <1,uW.EMKȼH{!im% +7A͌Q3ƨԟӆa1J7i:CcqÊֱj ư9cX;EMNS +z?ħaqbWo,FaYq-Rd(o r*GhiP*YgB(d 3+[>;QSTF፴,Fݜ1°ulf1Fca l!18ca9fXc؄8c؄("j5B(v$ +bvޟsBg0 +u+ yi;`CRh=#yc@,Y%rf_sHlH{)i4zXưA1Z3c3c!&.b1Ĩ:9g ⌡_iRd'\B?~unj[Bh KIej>} i`M(R4M'5$Jd,@0uLCNkNiRdRҢsKhjr3ƨcT1&x [c 1bX:VkC("Ҥ:!OԹ}buC:eor#S[Ne1Xa +NRH@!f":kIv`B;b"&i1x#Өrs\陱OtS3LAfAFc +CǸu\0v.GEM3<^t.gV`2߶Sw<,`^WI[> + C-yeR4fEj5&)\f$/c1,NG>%_YRD91\F፴5u=g0,G(--/X^g +4x fKXbXdJ` g FF[ !ORx߶b+6맧8;}%b\=oD@T.ZbUFxm% Bǔ"ȧAޥC`bDxpBr]5y~捵gXSA3^-3}3E)0nuLTmhBNi;3Ev +! g`_!ޠfT&26lɧ3~Zz,jԩ/3q#?ҥҐ S4P~n/zv+ zIm}9eTxv+vtq}vI9pl Xv0,mv$l5kISI9|2pˤnyrunwuj0HL\3QUM!x'Fu6/b*^C?@O<qXw.|el +Ra^;Oǫ 'l?Wp!╶*=7f(n)æI#3 ڑ,4C&C NiO}<l9i_;L@{?JNSq͏]?NTr眒Lq͟mj;5a盕2/4&Ox`*ϧ?k:._ +zX;l)H d!>J3kұCD_ FDEMV4xcErYXZŗu͗cx t0KKXaRQ )3:Cֿ{":ij k=J>>d'E1b,;̧lbŕ]w<_gU6餌R7,)aOk4vb@cȥ[f5܃  B/@C4ko=Zn=)\:W&l"#` 'bu0ƙB}hu1!t D kގ\ +#$G]OWxSM(g#Ͳb^z=y.D\Ţ]܅|RfWSB_)ŃYXOuh6aQt%)\Ot-6&<"&HʯB;bx*gK1mhWUhЭZя5V̈́쫲MˈY)]/64Рl)at?qCQ'ȓ?,fʞ+|㧃=,vx.U{p!LX&3:Fsg +endstream +endobj + +1149 0 obj +3263 +endobj + +187 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [1150 0 R 1151 0 R 1152 0 R 1153 0 R 1154 0 R 1155 0 R 1156 0 R 1157 0 R 1158 0 R 1159 0 R 1160 0 R 1161 0 R 1162 0 R 1163 0 R 1164 0 R 1165 0 R 1166 0 R 1167 0 R 1168 0 R 1169 0 R]>> +endobj + +1150 0 obj +<> +endobj + +1151 0 obj +<> +endobj + +1152 0 obj +<> +endobj + +1153 0 obj +<> +endobj + +1154 0 obj +<> +endobj + +1155 0 obj +<> +endobj + +1156 0 obj +<> +endobj + +1157 0 obj +<> +endobj + +1158 0 obj +<> +endobj + +1159 0 obj +<> +endobj + +1160 0 obj +<> +endobj + +1161 0 obj +<> +endobj + +1162 0 obj +<> +endobj + +1163 0 obj +<> +endobj + +1164 0 obj +<> +endobj + +1165 0 obj +<> +endobj + +1166 0 obj +<> +endobj + +1167 0 obj +<> +endobj + +1168 0 obj +<> +endobj + +1169 0 obj +<> +endobj + +1170 0 obj +<> +stream +xZێ6}Wm;D;Yj#[.bQmc?asU:u(.=,, +:}S +㿴v|OË !LL+M c"˥o͘ +k<\eFav$ /)O1':]iO8\WDD _Q4Z'UojX\L\V:$6)D1Q(8Ƹ)#*FKwzez~ĂĂ" %`<(~>F먪^`5xGHD()3K,>bw=B (7dpϜ倕6uJ,.}dz>YX3wodL |sô\Y-%Zʔiaw哭SZ"S2/bY廪=JVyV&*R7)˱əmb%/,)nf<+yH/Vbyw0rjT*,ⷾV/?mo_7"'8VsW'ˀ֥V_n~'򐰓ʳӯu ѩD2qi%YTl߯CߴUYjOivcGz'͚˾$l]K-·- +44B/;ɩ܂\(hUX =A`0.їrt#$R|b3B3Aq>3`(Sb*D) `0\IR|2hIL)Z &@opUh߯jpO|X1c!Tf( \"-yhvhe=nmgIeGےon*ۑuӞrݖwݑo'Ϩ{7]k׶ٓ _ 9 +Qpt?ӎIfUWOKfC?=H9*_:&g$=422 !rsEiPbM_U%ѺTK<.fG̰̕L !QWX~3tlk1nUX_"'oU7v;ߐuܝ=zOLqvtd>a']&l+;OLFEOqsĴ,1U+xG4XȾ;g :i GL1IZaY⍃R֑R/`q #)|&*PT +*&@op3^5TD^犡+.Cvb~xn;-+u/['֒\ߛS:ܯyַz{A΂ɈKAU +j\@?׫2$4Ήף(l7en֏ǓqPĥ+,?AlJuqOd9ږnV~>c{"ѨH,WҝM󻑔5IEpM|ѽo݋}%}Y25)1Ș(kO-vX]RaNnlv]O6՗[':A>n㝿Kzc,u=;f5,{s\0T+=(8?J˰O)G +endstream +endobj + +1171 0 obj +1944 +endobj + +188 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [1172 0 R 1173 0 R 1174 0 R 1175 0 R 1176 0 R 1177 0 R 1178 0 R 1179 0 R 1180 0 R 1181 0 R 1182 0 R 1183 0 R 1184 0 R 1185 0 R 1186 0 R 1187 0 R 1188 0 R 1189 0 R 1190 0 R 1191 0 R 1192 0 R 1193 0 R 1194 0 R 1195 0 R 1196 0 R 1197 0 R 1198 0 R 1199 0 R 1200 0 R 1201 0 R 1202 0 R 1203 0 R 1204 0 R 1205 0 R 1206 0 R 1207 0 R 1208 0 R]>> +endobj + +1172 0 obj +<> +endobj + +1173 0 obj +<> +endobj + +1174 0 obj +<> +endobj + +1175 0 obj +<> +endobj + +1176 0 obj +<> +endobj + +1177 0 obj +<> +endobj + +1178 0 obj +<> +endobj + +1179 0 obj +<> +endobj + +1180 0 obj +<> +endobj + +1181 0 obj +<> +endobj + +1182 0 obj +<> +endobj + +1183 0 obj +<> +endobj + +1184 0 obj +<> +endobj + +1185 0 obj +<> +endobj + +1186 0 obj +<> +endobj + +1187 0 obj +<> +endobj + +1188 0 obj +<> +endobj + +1189 0 obj +<> +endobj + +1190 0 obj +<> +endobj + +1191 0 obj +<> +endobj + +1192 0 obj +<> +endobj + +1193 0 obj +<> +endobj + +1194 0 obj +<> +endobj + +1195 0 obj +<> +endobj + +1196 0 obj +<> +endobj + +1197 0 obj +<> +endobj + +1198 0 obj +<>>> +endobj + +1199 0 obj +<> +endobj + +1200 0 obj +<> +endobj + +1201 0 obj +<> +endobj + +1202 0 obj +<> +endobj + +1203 0 obj +<>>> +endobj + +1204 0 obj +<>>> +endobj + +1205 0 obj +<> +endobj + +1206 0 obj +<> +endobj + +1207 0 obj +<> +endobj + +1208 0 obj +<> +endobj + +1209 0 obj +<> +stream +xYˎ6+*ߔ@4h&nmV#[$;ȫ+كIbX8{t1yyȰd{S +j;Y=$KtDyc,ɨ1RzDtSqL@V:,MY6bGR(?qFIN9@0#צS/5T?wz>@1^#W, 4aJ3`GR,`s녦^X2RyBEA|Q폧wEeXd1Tr0*~$?'?|:,Gp1j'(H=٦h1oȶj;bۺ]Kڊ4֒bEޒEu(d^3ɏYՖ_ 馰u^/6"/ %m$'bgV$|.vk޻k}e7[j*T[{弴ۼ-dnqdYfMK򲬎E]zPANy]]x2.-֎ڑj?}/)JKn {5N}zOX.GuFD+ܿMMaua"I}Y +HsL)\DȮY#" +߀AyT +U Kƍ`#@1x^ R#C(=WƚiWn'uQAP`P5#d8|OxX'E e _h~|p vD:L4}c=y~9ȕo]ʶ7."uO})I mF0sXʂB1P`D ``G0 ƺY[@14 +rU;BDGV=9\[F #n3H1;<=j=-{+bG2^ՐR !یP&Qff qd1ۡ3&HLL I}UzțCNi~(eә9;D%*qz[X$К~(I*UG6v;iV̨ᰘdv *Ƕ7_@Q Y+ ;Bx0qsGIhO(`Z_Dvck`"ߣSZF~իjX1W#``/!(=WƚƔjWLG.dcV%#d<2M|ć.rzmwC[OJ{K>K颠tW%\v MH/yɦDC/EPIi4v_݋0 QEJ|S Qp炔dqI٪8RÑ˪iB~"s.K, ad/kD]wͻ*(l}R_ ZΙLp"ȸa9S.Hu_E9_.,څ&i׷N>aI= +68+شdmwnv NA1nq|Wl-YU5YV-%;3hGkM8MIe77 +endstream +endobj + +1210 0 obj +1641 +endobj + +189 0 obj +<> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <> +/Annots [1211 0 R 1212 0 R 1213 0 R 1214 0 R 1215 0 R 1216 0 R 1217 0 R 1218 0 R 1219 0 R 1220 0 R 1221 0 R 1222 0 R 1223 0 R 1224 0 R 1225 0 R 1226 0 R]>> +endobj + +1211 0 obj +<> +endobj + +1212 0 obj +<> +endobj + +1213 0 obj +<> +endobj + +1214 0 obj +<> +endobj + +1215 0 obj +<> +endobj + +1216 0 obj +<> +endobj + +1217 0 obj +<> +endobj + +1218 0 obj +<> +endobj + +1219 0 obj +<> +endobj + +1220 0 obj +<> +endobj + +1221 0 obj +<> +endobj + +1222 0 obj +<> +endobj + +1223 0 obj +<> +endobj + +1224 0 obj +<> +endobj + +1225 0 obj +<>>> +endobj + +1226 0 obj +<>>> +endobj + +1227 0 obj +<> +stream +xXێ}W80},fvew5#`6I>o{zr*<~ɮ=ۆk͞ Ozx&`!*Ubf@ 9 YGߓcUA9j+B;?Q%ݵ((B9P:v|֝/gR5drNt7<ۑ (_O_==;ABŇ创PsSF[ +LI߹RTQy(PI.R, y~+W2ip'|+  Ԑ7Yp8+SPdWt(O'z$%}Cdےkd|c_>Xյ$nvOm7K26տGOwUК%wTc~)@K ړDweC| ؁HղG~*7ȴG+.\v+/ w\v&`*uٔ*`rrҚ6N[nF7\-EqӪȾ )Z001q!ţ %d3bY;C,S"gK\ '_ ^ƨz,,MbjD5&U j%7:,)ࣿ,*ݓ7p6Tù5Qs'rëb)KC8R,!%Zjt̺Rꀘh)h'qYl + "6 >A QZ3D"bBLEK!RCBRkRQ–{Բ7}˦C|exrw6whpFC]w +z]S'εǶۗj'8k7||W{7P +ġUoI+g5|XԳL;X;CS7j`nJk907T2u.Z~jB 9V}_Mf,ati~UaM?Zvq롚?^Ǣ?|x5wcyY;Mcnw_)]׾@sb_u~70Aʪ1.4 =X2 aw^\YL^ab"8o+hF; L  > +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +1229 0 obj +<> +stream +xX[6~t1Uě(i.,h:oYmȒ!J?=G$EQ}$|C}\vEjeSp zwǎRH d +se<䠢 ocRB)Or!ҟqHEv Ya<& ,I$0vWǢ9QIK^wO2yG +6,]g!9 T,0Jb(c3`Y"XBΘCVsfGg~؃(VTd_?Y-96&]?aoW{n$\7ő͑j]c쉳zN6y%KxH3~40]1wq?4IYפiRLB |Ȭ;R&Uhr&Lq% @Qa!4U Ͳ4{@ȵ`0\ERO$ܞ +>x_=BD Q{(7sUy* THN˧]޳)!myS/4"RRI9\7 };E~õժ-JQK(M%qd,\סFb'֨YfA^ǡ򼮿`-qwɗ! EQ H<`-`@c,{@آ[0Hrn̵- Mz>nhz)NR^6>fv??'`Wx-Z|DliJd7*&ņ iԕX~OXJUdja~xzۚ=ΝjB ;<M3@ R> +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +1231 0 obj +<> +stream +xTn0+#D( +4MS$&@%VLE%geɁ`ˣ wgw)  h *I!` p"pRFdD.$U\ +a`Tz:(ꏇjs}ӳJTaǷ+o5/Ԑ:}ƷnRcp%}\y( kgwINJNJ׭vAW蛭jk4Ux ήޣ$ef+L^;eRo74v lBZ_V(,S0F_ԥ<+ݑYD%Ë'l;8jO?$d@l]_2/jv<׶D/o$jh<5Jv%Cr]8=M}a}+DM{Ee6K:@1,$$V8I[DFIWh \1d a?8ƣ?TtQ죨Ƙ[0X056qѨ:aD\F03GMw,:b&2)}k{ZM* +I Pϓm L%[ + !W˅f\p| Z8[yllSôKCeu;l$϶ > +/ProcSet [/PDF /Text] +/ColorSpace <>>> +/Group <>>> +endobj + +1233 0 obj +<> +stream +zzzvvv +endstream +endobj + +1234 0 obj +<> +stream +vvvggg +endstream +endobj + +1235 0 obj +<> +stream +gggPPP +endstream +endobj + +1236 0 obj +<> +stream +PPP000 +endstream +endobj + +1237 0 obj +<> +stream +000 +endstream +endobj + +1238 0 obj +<> +stream + +endstream +endobj + +1239 0 obj +<> +stream + +endstream +endobj + +1240 0 obj +<> +endobj + +945 0 obj +<> +/Matrix [0.3225 0.0000 0.0000 -0.3225 112.5000 723.0000]>> +endobj + +1241 0 obj +<> +stream + +endstream +endobj + +1242 0 obj +<> +stream + +endstream +endobj + +1243 0 obj +<> +stream +  +endstream +endobj + +1244 0 obj +<> +stream +333 +endstream +endobj + +1245 0 obj +<> +stream +333PPP +endstream +endobj + +1246 0 obj +<> +stream +PPPttt +endstream +endobj + +1247 0 obj +<> +stream +tttzzz +endstream +endobj + +1248 0 obj +<> +endobj + +946 0 obj +<> +/Matrix [0.3225 0.0000 0.0000 -0.3225 112.5000 723.0000]>> +endobj + +1249 0 obj +<> +stream +x %DAK\ؐ +endstream +endobj + +1250 0 obj +300 +endobj + +1105 0 obj +<> +stream +x TY̙sy?;TwuY]ZetԔJt Z*U%j/. +ȾI"ɞh$f`X +h"DDF&d$s`_7"7~0\0\<E\<E\<E\<EpUXzY/FyDfqǔB'-\G1ZEsJ9{755=z!CngQzQFe휼RNIYY*COt/ёlaϗrhgqq^QY;' +(((pYc rYG3e=V?ֆ7TzXm'f9j*ix)_؍_~m|is 7mW.DX츑Q|^&doGj:dOyONZ.v/Lmἒv-]2}"Gc΀$V&6cN6 mQ+]Qvi(i%o ݗQQ:;6={[֓ UkzJ}:d+ [%^5=HٍoΫw +szOǟ%hmәw^cF]FtX}7&B?$e$Lb͵vz,c &yihg$t'LMTr<2 s{EY;[UÜ(yJ?Β{%>; @{V;YDtO ~Ji(i%Gu#us"sVG{_$J RZ(n==_v8?Q?͌?PkL?ai[KǦȳ.teb;;iJ"SGzY.H'јmi-4mR=ǭx%O ~6.Rz vi +x'4xϋ~_`V95:e]F_ zwLiA`(=l{agNGR!1c?ZІ~,U;>3~̀ZZY{ALg޽%EܷO{#{Ttdwo5>7+az?㔍9ѮjzBҟuyv`Spp|un܈GPz ^,y skee|C%&Zq^YE8;F=j>炗P9rK6qZOP #C:>mӹmvA|2a1<_<G3g$yA"ZJC_{^zL])IVWّG V"kpWRYstBgŀtDO^J<ėP)SWvtl]q['*aBYen$Y8TGy?uVH-^e6dL} jQqP~, KzT ]S m-a 5X7]9H!6#^4zQly׵/g0>l<'U°Una|L9DkT\RYGv,yr:K  e+Z.e9܉Õ%yl5XN4=Jź9ugzI%LpHp_M7>&ζ5;<@(OYc3pχ{rPOP拢i~'8Ef"E3ծ ڵT;A)2v2tRkpc2\[D/#G)P*ݓY罽Cx뱸}c0{?JJ{>r9])Tlc]ڟq+;{ ;O?4(_$/߲x s[mɓJ8toAYyt㹉vf@\l&C/*#-ll +?LԎ, 3N玣 }O&,B9Uv”5hp=Iʰ Vmo:0LneWU?WA@HeDӈCsklrމAYKo/䨎d]stg+TS4f%t<̓; ;,̇'U(BޮiioFD:Mm,& +3m?_T 'QZժ?̎hMw.Zcgi ߛ&H[=.4y8'38ʵds.˭(m8O?ԏ %BzZ%I:uڭxg ے,TxY{<я5؋=ƭ!נB + Mަf F]4lCU f[ݗbZzv +mdΎkb@nv}Mn\o2uyێ +T|ȭ[ &dlwi?M[pF t)toBM4Srt[DT?G!Ze'~*y;s+/`2 o/uD<ΦO,4;V\qSFD)&pqc%^1׵[qM}*I6aT|{x>BI5a\mi9D)핚a5-ӻl5H uuůjjjT*U=7~Chy0=ҋ'\ռѳ(0&_-eHrEȶ3~Ca}lLi\l( 0[B?@\$H$μ67_>veɵ%]=}DR"!!ž1ns#`.b,?CcofU8L<=ܶjCOxrp?bxەay닆Z/SϭI义Cb|tAڿl*yeG~E8jPjUJ$dVKސ=C:CY8T\$/T{\:C°aLez|!)VK}r{w#Ӊ yc#R{!xye(~G7zj`r-=AW#\9Dbk{͸¡5H׿Q1B$OPk[{Ɲmֶټw?{\MN#gs9.xw:c<\JXhɆG{+be/8QSwN-:YרL UˊɽLi4F6q cWo<Ю_ߌ/lfs:ۤi sa&d<7nЁֆDUtlɣf55t kSByRrO9xAqVZ xvU/=h#PFSSx-˱U囙3l2Y! W&jZKH4u:åhJdNBs8DY'ųKd,K17DUjd{4j%װ3#(p`RpOK8?G+m?!y*+y4X%äHv +R6uy2A, Z#-2I$Cd:]KsK} kaZBBK穽oNrkh8NW~ý=6"{D|tX/{甅tMYF/CVkoAQXbbӀl~Ofmrݑ/F 7i.Fh#.gkg .| Yc:FbZ-&~+~u}j%,\1Q9^:mz,_F_>gQzQFe^JX<10hFe4痼[x tgm?` ^2s.9yܽWCttkײݻ!yJƏDnٜw6heT+j SG y y y y yN'y-fzYlwgSVɓS`ttX+Ё`tᄒ7:?)_*$_=umJP=TRT&F,˚Z9R"0pV[}Ve<4~\dU'='Kg.%åӁ͠L915UOf|xw.)Y%oܢkQ[֫U+fw~6S:T˯q;7$i~*$^YekѽU%" +.8,`dm]ִ3`LZUpBp@X]$1RdjԘ I2: NM%G%m5k֦d؈ #p&.yr;ސ%=^VO>+'S}WMk"$S%l"J\Bm9S + M-fٲxų8VU/lCMJBDiL^XщC$L^%abWi| q!shʬt`sGc^1Jwj;EׅF ,<&Z}2+ \ar +ӂ7;lDbXTǗ}*$;sk QI-LZ T-<݉,T + g rF\<E\<E(&q0}Հd@@ HH$@ HH$@ HHPdl5qសD5UgoO9s\ +2nmcFG䗧\L_حS7ĵ蘮Ms + ;տT7ysOpze&yy 3~`C=ag6 n(@dc7TdؐLdPn#`' y y +$,ypKJa"yfΰ/WUC[HI!;$|:NVQ!1c Y;Dgp6@@Gy׌e I"S{/(hL1>"IiE +x˺{ +÷ˣHLˬ +ʶǯwJoF9}]C>K8m_+ZL /XM$}&p |/O>9]فݑ_>mep6uzu_Zz!j膡Υo6ݒ{CC˸MۜĶ6,_9~e9}xEst,U<`X&OWHHPDt$*gjɓyJ0Ʀ%yr<i%Q}BMJ}z0Xvz*}-!6%y;'H=b.Ów*K6|i1H\2}v@!/"adaAVR&[[e^f|X"/M> @GaW e. Ejby(7CKE+csOGk GJJ Xol8^YJ}DYĩ~EC+ 6d&3D˖XY(_6%OFZ\FM̥f#eWUz'Kk +OFGt`-R'_h#3,C>Eh5-5װǫiHeWT| -}[|u{{KK{ k7ʣkd+K*1%%-&ӠI\S#iڵ-%l(y}{/ e䙵P9>1f|E(+, + y yJ^RM;) 'y򼘵ޡ-zl`}1ڈVZ]^d%ZApKHw7'_qȷNt3>dB@TWC&|h2 +KxW:ɑl׊{HS ö/\КeeUk>mc_rQ$$o`$qݛ?=t'C5J=U: .(o 6!,Vr@~+ {調Ր\^%ǡN ]50[HT@|S1A0mhP y܁484 yO癹ŃBǽVDB yQ1{FLbW<V3\AZ+1 +HH0n&o5`Z(SJ;#5o&MOiNklY<7HPii̋|aSW`q!XȄ`G.!72'-V+ xi4=X+;? _ZdSBѬI`seF 6;HH +6EdQ6~8kܲ5?qCu[ο'~#mN&)?I5 ~Ɖs<.jM9u]w!=廾$*pm''yO9!Wq1c)XJC8t4Vu~$*zta= ZEOA&+w/Y9<-`"8C 2xـ9eYv + 5;{3ow8 %lwK VsL<::ZtOÂ]ui7) Za`O^) y y?6_ߛ?6Vq@^󇶯\qR% B#<H6$ B? w_5`@$p@$p@$p@$p@WÃJeEED"Gtn3ִݩ <ՀΝ;eeeO<' J^uVߖ_ڽ"3|Hj@]yypXe5݊k+۵>) /wO~:ʀ^ #p^ӑno$%K_miLw2`@WCffpǒXn[Ӎ>n$Q'3ݯ <4q.{{Φ +v拃QqB*)ܱ +T"MGL&?D>ɪMM*')!) $JY @,B~eD1*/}EAF)21l M+շ\+<ٵ:{$]ys +l  H/<\;0djjpǗQQ/t Ȇv{{ m/'zI'@Fɓ*U'E*|tUk)S)H^T-R)؟, Blr5Ȃc訅,/H89}v^z 5M.]ӭ7Я>;m~7$OͦxR OȔU/%eftcqQeHP=&Exa]X/fj\vlYC'fk)*ܞtW W[e}$ +"dq4%FD.gxR3>0K2(ԓyJS(s0]mi~d(UQM3x1Yl<.[-[=}TH89փwf)3LR>Ao_$a*ŽY<WsQRjKŏU]E M%oЁM ~`PUvwo J$Fe6Ym$.ڼǹ'XLq;㶼nmr?2HEYYlQ5o3VA8DPWhs!zC z^&y4#)ST$;q4JfN$ 2?㓙A$O4y%lJ! 0ZY”'^0,9G9cM$Z!&ko?⢹KcM%JH:7(oބM ádYģC~ y),Y#9W[$3dX #.z U(w#5xcH<$@46HʒJ AdYr$VK}&),I^NJ$oI8᤻xhnV:4*!`Qj٭-kw.6 ܍.#v^9Y+%,|wy ]G假S C +V7ޟ*nB(#x9xa8DÞ`CIK\xfX÷ɦ;'c=o7=6%O ^.&'yV&cvݦ@쀆 =*ü܁ڏ7(klpnd(*6YS*C 2u'ׇ{^?܋6Cnc=W~u0/ чRri^=pb1pr~/dC;#;~Ɲ!~yy,u+C!77yizq~0 o|zop $LIIIaapX3~t6W HjP(?pX| gO5f_[ m{XξvZttEK<WR1<>8ܝ`^%HT*RsE0/$ y y y@_E!0 y@_ЕYU77)izֶ:Q5Ӭ𝪩ZE6>'{*7z>~F鬖VeaP^3VU^ORZXcvVyޤjYw[㡢akk5E^TA}g]U}hBcIi2سZ)WUuI5;ʳ9 +ziç/smUkjБ}OIuzʳpKJJ( {6<<"ҝ(#%OFsQ*j_J,/>)آo*LP'Uݠim}UK2uڭ:ԫWEmvvVU}۳:4@:8لQ6uv<WA&^·2߄CkXd ״uv>m9<*ф,Nu$G?F9>D콇 ,J'YCD6O;u@ld2:䤴F󤵳UJi'::+;Vk!yf\4 nlcC &[ijkdxWQGgG +7N]ka$$ρ$`-jyqO*Xn٤X\^27UVV *W+2N~w trriU }ۓǝHz{tZ܇nwY4zu񵞧RQlKFY,5s^;Q'db krYEo!P"y \ѷvVnARy̭FkBNFrMdJ-{ƳƁMݳOڰu/Zq66qEj!͒UOBKZnj뭄+R?dȜa$$ρMc>6 /l)-[7ܝo/} <l "nMPϟWsöjjggմu4ϺP7VzT4m ; y y/eYYB{*wǼH+⋨nj+9}CUn|LFܢ;b|$yaO\*!ʳd4RUMϩ=/)[?;e} +?=zF1kMCc^&wܳ^>W$[`D7:cSH"W^lR[e*GFUJÇ $|V:($$ot0ԪxycJɲRLJ/)`|k`f!gY<$Oɩ܂b$k,(Bᯄ}¢6bpi +8&yUIӔKSHjQUs j3iޖ 1Sdl5s漵{~CZ}rlv?c"}6𽫧p;nw 85n_&;J$)"+jk2Hl3 g:qLb(E7 ^˸ɾ)Hz7!PIpY@}z0.*ҋScD?I#9s84/8.ZJ<g$/+$'8ї'XIl 'IJ* +4(0NC?FK + +WdĒɻ2 +^_|~ +HlMl-2U_zkEYBf.^ݲyyJ5K-v9FB + M>=؏ Nn^OK %OV%o+Z\0Wzјb𤃖"9A,gHonr5rS&bSK)?d)")%aX oǩX7A`Vʳ}% H".H".H".H".H".H"y{|T7/vGB#\Y򐜭SX3|C+d0:peCA5239L{!~<3';[{l$'n-K ?+Ⲓ[:Mx mhGzd^OcR/2Y>x9= 71&:c̡ 0rqYFCJ:3~Wʽ:G+dG"YV@!&x*yCZJ޼'㻕 +AX!c$oVH. NIvR:,,=sN7Jb7iַCoޖ1o/B*|WϤ_>\$QRrouZI @ɣ_T,yII^]q kUבͺ wԕ?|so +g|/qo|i.y u_*gpk,HޛoE&J+ʻEwkq7?T\MGu[.{W.DzSփ]X6'T-ج87JHe(2z7%ok&V+y(T; I'7hP@\ř1ffX~5Hڅ%lGZV_/{+}q>hcJv8³H^:(OC<8,λMOJSR^e$09j+oV&e%K +j]hHH.$.%%&%n!9r[*I>_Q4w.R3~=7og ii.ϦeUVVfD Q Ȯ(y8ۘ׷_/,:_?<<_EOG&f@JGy㫰to_pxtW6Eǽ@gRb BY[Eƅ.,:^+nPI-yev2$ƕ%ecJ\n ЉRn,*N-Xn{ϔ kʒ~t8w\h絭WFF:\\(/ǃj+ÏaҕGނ `(&q0}Հd@@ HH$P+..NNNvG8~  y$oI˲qqqyyy?W`}@ HȒ<\NYfffssN_i>D2; y$odI^ZZZBȬe-u~uư> +z;c%;$ +--MJJzi 3d,>8v/=))7/rgLprN϶wZ$ ̼w=!cѡ )Ef #wEFV7L(ݚ w*nZd[`$y(vC~sZ2}ѾK֟.ŕ͉>%97 +/$mrK~molx.:XѾtE9k+.ZVç Y-?pKW +?,;'M?|˰~$ ɋ"3d,x2wJ˿Px;$1K]LN?7O_!h/Ѿ_a%·/5X:OI$١ۦ=C + +B y $y7nܰ_p`N27, ?__yy&NХ|mjq;t!o5ffL)ɶH*CxdnNF~4"*yuƸ׶;V4z& y#H=Q⹑{AKW.PyǍџ>#Fr\o|Fss{n~oX' +Q'o\mo.@ Hj{N+2CeHxAKō4?ڿbnw9ɣQgf_qd^cVg&/w]=QM& y#H򪪪rss?!cѡ "[qbRO얇aY o IJȔܖ;jH^13JI0$@F!$IEENvBW9Tpb˛cfEfwqJ}$]?^7 yPɫ}TThűBm=w_Ɂjŕg.9gW+_R]A y#K +E^^5JD_!dfZJ o*rcߺs-ڳU1ieH6Y&jv7(}eUF5 y$oI ===AM\ <l7B%0$E!0 y y yVl` X 7ʀ HH$@ HH$@ HH$SIw.AKgss6M5hamoc`Sӊ|3~|̎hI$9Z`Ci#M5}Q}k#P\M)@M^q訩6Puj:g^) yDvB/Ro>zPօS[.ʓe։ɓ(Kq=`XoL$Ovx,7x|ퟍ\];&Rc6=*9/V9PL~wE{"Qi'( +iw3V/PXoؓGwboW?'зYEs l`sMt`.{.C*fl/?wš55WP`x,Io|ڿu5|=J'p7+q] oIB_ L+: +t!vB>\ 4\,lP,A@?whqdd5?J/9O[r{Yik=uy`E ,o #(_;K_[ %r|q\͝ 7e\6'mHS^1sQxɳt-^Tȷqr-:o^2CqtMƙy\%\w:W\smWym0s> G9'yj6 l2zx'dJ0.gx]D^v/8} ✣D)BRF_&6a)₷#uYtѡH_|n@F^hwJTNLY"Y=ojY^X/D*KgJʓ ϱ;nen1C5{;):k,΢} *Nag$؜Zqg(UVOGL/̋!Y7DCR=W3J[Zq<.sJeq/{q1WL߄MPjgĕTDMCH&>X6udNWSr3~y`zɃGs-$ꉛ1hZe.ix [DUdf錷[qukZtJ1jƓR4P)SLboQ9HېMdtRK'AU ydI2!3)Gs1D˖XY>>{J '3梐 +>27aKd(w8A vN8Z@1*6BX\ + GB%C[dRx6!KPʔ2H76j +OFjIm='zZ ݔA:#bOP(&ZFӉ1~1yuvmKme B+^7u _! -chI%otQ _r-:o2iGX|ն% Ā R$gF9O>`@ƈ<}}HH l:I +|OIգ <`IÛ57C^g~Usyt7q%KQ㦔-t`U);m{C^ rg4ej.0(Кʈ>gEe%kykq{mnF))]Yrm caeGiD緡GDn$;A ygI24.uҺ,TYD08v%ɤq_#y$Ocב9C ȯMqRVU_|L\}*Lt 8^"Ia~ DmQe*a̦q:%gM5ǭw%Ir"-gH%/eUWb}_t"o 7q@/)JA5x3˸g~K/y8zD٨(Bp;[n-TҘ)_<\ˢ\3lMNOisEkRykzp1Ku07^mDRmxMrȟf d[OaiZc̺FeJ^m.^E[w$Ќ>TQen$ N4Mi,Qyxs4=K+hɴ#|Q >X+׊/*1 r4F6q P]]Zx5{8C'(bfn/űsjnň;/ya N0vE!OUG|Hajɉ!E'3IEL^rXv>n\<[_[|HaR7ݟl2aE䩓}-CT%o l +J׃ؗdSȬ!O >{z\$cP(ڻR^Ň ȣqf\K"6].7մXDoe5@/>r'tO*_btydC +Z jٛ9oeBslfǽs\bZa~}P:>ZEO9w'S F43&c&θŋJtY.ך016^Zlvx21O뙌oA9(yV&c}_S(Xd8O&*ܭ6gh]-f]{{K]+ WgqVko}rki;:괘+9/>IO~)> 5Hy54KE2j4U5H}MaNF JY1YYθ?/.Yxܹů($һ1o[[jL5+T#KW]'\㜀j?^hBMAEo4&ڱs_TE}/]s楓W,;Nk Wr=WZ:$$otM@@F"nW <E\<E\<E\<E\<E\<E\<E\<E\<E\<E\<Ep.Sdl5s֤Ar&:_N_3wY{ +/?lɓ7ݷI3RI#lȚ<,[3"X:+xI)V +F&H$eg8YY89GчKcIom J$Hۙ]4d=)&ʛ8qP%zk=7>>n;R> a$Ov PZ]~y"o*UkOKLPY5,oq"yDG_]ŋ޸zz,.Uֲ7KWoXgb}sm 4vZ;Vў +)`.qڵ˼fϞ&VgXN\o_|KeMm-5uޚ̋f^QSvoZK{ +}4Ua6䯛=L6mR.g♜ռm)J/˦͞=Hf~J>A'X<>z2x5Z[se_T֧ygb0P٬/ }rjZ4mA6dn[L5M&p9ċp5g2N\d#$Uh}bOH$ª䬎1h5{yҔdr93l"v:.#x٢ş+sZ|Tlk${'UPz) q ܌93,&~w/KDmk:*MaTv.Je |~w4-w<+IƜAh| +* rY`'$\BS>Kj'ge칪J{kꊘ=*77}IE$"Rdٳ8~?9Ac_!cm-©*o3뫆 {gV,T[M"~fB/tY:[{:H(Z%LH:2p3iS1cG{oY*uhXaMN%?FZHEyY1a%61 [3%T%6^^_HIRhZbm\3&%*L~v| b?qs$צOg:O_$/K;3ҔqsƤ/1j>5}ϯWak<5ޟޜH]6ɣ&,z9Oo˳4iwŋm X-ִٟlk?`<uyr9ꊂ)5GX%dB4hʜ)wZt&q + nϘ<06׍ ԫ:UPo6^̅kՑ+CZ[fƝ +)q{^b{,}!^aFuQ]|ӹխ J4VE;WyIFUqNfffip[A7%AqPA7%AqPA7%AqPA7%AqPA7%AqP򀚚88BAF7瓼NiwD92n̢2IQ+ZV 9RQUłyR,yLpI!TN +\ *bEW&mw;IRZ &yT Չk AF<\~&[srMM/:!.5,6eQӖ +jEun?+N4dkI!K%h,hiՆm +/ߕk_oU //Ӑ+_sOP <&g"Ri[]IHrBޟpT/\2 m%ѣG[sb2fTix[ ^ JF%O*^ +mr1iuRiF]`@zLܜӨ!0QM"(|ҋ*ea_2(y, +QAoDGjZ; /͂ v-bؚ`YxL v1ͥI{'thJnCLТH X0}dupr 1[dfF~K8mϑZaP qjAJ^FFƓ'O\<0ckNyPpF^j5"qbmf5o8-W("]ɶ;eQsҙ91+:R +Y0cD|_ iJeiytfn%R1$>FN2g*JNz e1˄_nPǬK)3'1b=!H`4+UP~WJvN'_V A(l{+[Kv{qp+\D:? +:ʡp9rJΔtrTP^P$v:^X#pPȄP0QU +g츔Qii5zoyL7. n+yYYYK[s +V1Eī{caUL#yQ +N@XR8{Iu&sN?6e":n+yUUU---H5\s^ F- {@4=)LаAVO' zuN.(D; ^&nM~rrL5_? +9t$oи+#*Φk&WrofgyR + :*_cҔ$'gkLEI'Zꚮ%jqIv؀9µ\*~pꢓs=&nm>_;K g>"cC_gadlඒT^^.03R|嶚DJfl&/(ѨBfN`RtlRI9g%3ndF&<=sg*.|\69dN MUJbsy '#̯T){6k҆FfxIȕjF +(um4!"SEf;S`R ZӨKH.2&QZ|.?&SVNؖD +}duQ?E(~L[JqJS!.:i~@Ȧ4^iZLcv pWEaЂ\Ps$EG/pL-F %M'.Fΰ<\*zlASCB|/khb{ݗ샣 +Z pgkmmQ N `^;'KKUVjSMMƞ_>|1mrʃd-+De;3B3UvX.8ޥã$(:J[];g(ْ%ɌƢ8O[~* +zbhˣ M5(wk5ꄞNJ +pZvoWbyA#Lt 9\ή>ԥґcEm֒ZMmdK'RI3:&uK>BNd~pFwri߂/WX?5Kguї\QTf鿳HΠn7nېZ?!Qx$~%%n_#U֛g{pѭ"=/[!|]O8<;1˨m=xc͵'fZVDZExp6͜Iy"z0 lvL3u2ՉkB]䑿~XnY~~l'DfKk&1@+sɳ HKɓh+/gm{/T="y t{N2a;qO~Gaꆣ1V얯H'-RU"/_r%&Jg+yrWDŽ=7y{MizR~5\l۔|}Jݷɛ̽L8I[NV +>%^6l~РQRʋt~6݇%r!3N*mXUƁ2^tiYL򦳼R;+ oI/>AΥ8-ͼCu8HgCF$|yFu[Io}mW>̦AwT$mQĶ?ZH?V]7gH)vAʂKtS'f: kf'yi>5ߛBrNl <ޒ=,= K&8?Z =dl(y <LJ~}]Ɖ&8!CTc35) Lgl.Vi8/%mS\$Nsy=0% tXM{Gd"01?ew;t9|Щ-rw;bb%ߝTJzN*Hto^_V ldzst]5[di{P +;Z;$&޼Aȶo?2,0 +A3`Qpr#aGUj5\Aגo}Ʀ/z ^wO^h*\ٌiIJjtrl!<  zC޺(5!w}*P" +U]}nCnUD ]&ZӎB/Ooko8x,9\|(,V{Ҽљ_eiG`~syeU{Ҥ?5@}~f5#K7F(PnG~>5Kx .duhliij T f@cF?'KN+((HKKA[ +[HS`0mD~T@hz7|G* hhpgɃQ%''b<W-$)08'3*ǀf@cF?';K^aa!xsNׄS`fًb-)EK;/^6l8-ڽRٴ400\5cE\yuwZXu/" y h Dq_Vjunn.0?x`M/m;^ଊ'O?5wr|ԵKcKD ==|Ge)+ ?=#L*ct1@c^%"ⶒW\\`v>>KZ& 9- +Cqr{9 h\]?Iqj v'K@=.X؝v8}I-thU];4w ;n<3tE msc}_᪡xgsf;&~dhU_.<3s3' ?ijrh=’l2U[0? &2sᬚHSѥPVР +Z2\Ʒ*j7+!0&>h{ɣ.z)t72+sC;dZ;DlTVs:*i2~k5Jf&A}32%vAe1R%64" N$|C\7xN$*{ܷL}c6sh`Gcvy$O" sඒW$X3N.7ayzT'%CtdRYۉ>59HNg╝=TtvRYlYǤIe0%ot44q?uДmf50\HD|9ya\vB¢$"]?U8;i yiPlp6*q6D,S WwU~ ].MvI3dw!e_sWHS9h[JR3J4mBи +g_T}p>PIQ9W-N׸%<vKJ4% yԭvU K:"{(yp[r]X(j8yvD.4E}X'r|_eM50,O^J6:նZ8UdGUgXn]4.x~uQ ɑY6=&nS7k5Z&TG6m +$8L$<^*;im<َI۸&&4@w]w_f7I_1͖gW~*6"w>UL8P+ȩ2P3&SÇ i{]6+t=\\jAqސ=<yq.6Xf$O[#a`Au5 N7:ߕk+;i fNggΜ̶|۝s g D2^gN ֖ +% +eEZk?SakTwQj1.\lJhnY\lªvG]|Kj/æpv1YkmKWJ^D1uM&&WN%aw6;K%)l(y2UUU"y`B0ϨTUZ{% +x74$ i?tl?g G<&BiRtIj#Jə_'|Y8)MOʯn>G"Mkvx);59tJMJ<zy^ qH84`,5}^BNQnifVd6] 7t']`fԍpd'y] y%(y2p[kjj*//t7g03QM1FTTsA"͕dE`u Uzz+Ԧ sX] URQ_$3YۜJ]N\Ѩ +,hI0BG2VZQ,'%yfy8j<fu:g7ɋ {NXyJT)@$^\,+$;\X09CM Y UNbzugUdXzj!_+h{M6rObS̆ +€6FYjDdp3\­i=OEA#rX@KJ?!AL*nR$~,.M];żץ+*n@Cw֊ +5I_ِ5KOMcc&s13d*mDyZFd s4]:!<4A֩:So ok _'a'CJ:%ұNw,H47@%AFZxΝђ<̓ddAC1n2 +G* "AF<q=q>*@(v"@CA<AM@CA<AM@CA<AM@CA<AM@CA<AM@CA<AM@CA<AM@CA<AM@CA<AM@CA܄&y^fϚ(Zm,/@ަqqq5:]ݵ=\) 2R9❜isHf{ 'y崈 +oYΥ;[}`$kN߼u^o}(Ԙa'y|RBSi{}UۇHG_tlJAdIR3IJ+\_)=}.G;@F:f\hekZR!}gaP[#$o.]b6kEEA9dgk|`S,y5 7L~7" EɣudMf]E0Bq̨ӵ$N8Jjl9y2oXy:! eJ ,(y  (y  (y  (y  (y 8r-РT*Jym^OI?X^(y#w7nܨGg͵'3q5]sͲ"OV<.iJw7 Ȉ2ݲ2= z2ʓyF{z!!({( #giJ}Y{ѷ ̽|S, }ǡJHqqh"2X@|o*9`OF{z!Y3rv-֜= +?P|zڛ.HI[Gt;]OT fٌIk(96pKgݫߠ,Xz /1f'}Tgڶz۶5[xoqH+ҥ}ߖa\_X~J+䘾QzafuR3s}aL^n%0_dS5dd;2p6Mϳ\RPP/4S~.^U~n۟AT9~ܺFǗ^x5V~gŸ7CxY;JN@2)s:!^߿uߡ_ ,Z5 Oy!Pm|uXg[ dso3=ƇHFd\ a yvOm3DSa萜 y&<=1s'G}&,JjuH'ʵHJӺLp9ZdfH qlJӓkY$A~ +Έ Θ{¿~Leo?9j1ɻxHK8)BJI-G!ޘm.9Tfwҧ.:qWA17W$U47]5,y2.*fuOX/750LⱫOYz*cyrH甄/Y72O;csky25׽-!yRm37fέ@K-[}tH?Ń.$w )6FcZu$I,yoGnaaGsu6?f,}=_ۊsOu,y\C#My!{W$3} +P*aށ_q~]ޡem_8O鼅K^)"JKJSSuulZY;EH,RqEA̶*ysGA%|%?"W RdLxc+2] 2hj8e4H\QeBb"z(8~t0N͹3+sOϑqI)kHJ-,ν:!(I,ym]smkћi>*yF9>< +l>Mm:'Ð~4EqV$qS<բJ4)8P+$VOze=xIYoux<(6\i~p= +̼+796$pERTmI59xOUK[uN.c<?+xukv3g;C2#sO_z?[Lx)[x5U_n$Ɍ;v,Ϋ'YF~g:>44EIi%4'Qjɉ:Qר8 6;wT4g eg'<:MYkm*-n,RW7lP^e^Q2_)3ik|2( B ym+[WqP :eؓ&89ZJFPK{Wͧ9f7H^?co s8!YQӈ{9֥C l:i)MOg3ǝ6!ghq}Q{;/ҥ/*\xҸ!םV /DG'VT5KqcN &Hjt?HH^wdUWO[}.'ˈ C_`_Y@;K!gIxgPD]!DRgOޯ &S`)/ gU&'gB`ܨJX +G*\/8Դx uL[iDW.Hſ?;x!wMM̲ry^M1ܔubl]ng'6RAٳVlzngMy>]39`DkIxf$.] BFV6%',0 >`kD}v6m%AG"z1-4uY:;U]9X? ):A\dg  Gc-}zQ> +stream +x %QKl#H  +endstream +endobj + +1253 0 obj +297 +endobj + +1020 0 obj +<> +stream +x Tg_sy9=sgn&ɢ&1s% +3nhLTt%3*n\X"(T7i&4TP?KUuuM7M@Szz{\. €. €. €. Wk;eu/ӹg49O(6ȉm|fq W%kr + J;.ۃ}ƶBV7Ί=1]C= iJuC\]sɡ峹ydvia6UJS;mj-D/:d{>.)CskM]Ԭd 2e}ptF/_tYcu~~]TbGtLYnAֆcQu{oe +|_KXBo(E\#[NJcN܎Sv\ɼ]ww5y Ƽ0E[xp.g`<avrlly62̸f>,hlv{xt(aKF>l0 ] @ΔgpbVQ^!q÷6? 0kg *-0JO3%!|tbg" )܉#J;hgGiDp-{[$ V(>]Z OofWo;ani5G36'!硫L/)<-I@O yٚc@L&t8PD%f;#%ʥRA}MoKN^>/Q|];?R^d[~h>W,w|}Ǵ(Z-~ʌaPjhޖ+&}@騗9ݧ紟U=Xw}/кs{G|jï ס0n >P%[؋R@O%Z,In-@CC GV5Umu/󓕂%atd[ )3" E-x4uVN/4znQ ݝ;~1p]٠L mzl`~;PKɪ򢰶ģߏ6&:ȣ^s7?]cS%};9Wǿi̟.ȐgV#;mJoJYڡ?!6N}UގEPSnWqzœD6)xƊ\sϼmy,hXog +%G@mΆa.+\<0NF!n>8",3u #,UT '} wf7OHRY=CgfMW{k.wVSYeUb脂^dli2<9TjfٕJ;wd[QP>\^QjPs}a}:R-xBWICM`,_}܁QߦH +̗P¬˜ _ɞz ܭw:ϡ;5tݝ%z.|7z!)k4liUsunxݯQڮ.R;nX,PG-mְyg@LGV׈s?v Hz027O3ClN<'18^1AngFye\rKlT#*sj(sn 1n=L6ڧl*sG~-꼝XӡH,n~ F&RAtR)nn[W&*i2Te$)ub-<7[)6~L:)onF~CsP<&Jeh~/u:nuaZzF/O>k ֠aBG3onpbTiH2ٳ\K6 +BHy_7([ +kH}5{VϒF>sx-+뱾o#Up5/ xg%:K|KxXQGhNK@.Φ5B\_n9Hټ"p%;ƯEĒirCµmt-!#?[_m5 {^O^bmk>የQ} YD4o6X5v3|fSBElhòC]Lq6ּ<9SUp T8lZ/K+iJKKSr}ڬ.?ʀJN3zqc/\^Wɋ7rtyrfבcR?mT1xc/\^WɋbzjNNΝ;wVx*>QX g+^j(.Y;'ŀTiX€. €.  I!9 s1$9566b28Cm@gdpaBgzX3%H);dۤg, Z8)ox0f8>tJwt඄ap-D&H%;Ǒ %2R)T +ȈeYcC \ ggQw) ;ۃS>r{F\wSsYrbRK$#q4\rWgщ3E"V{SQ[6Ud37Qy:T˯ۃB~3D'SH#|h=W/[+#K Nڐ5nx2ڢL2gʁ,|+˿E|3bEUid*u,N檯-mB9oswwxc +~>.K"g΄3ɜG|V\=GGf/tg$YSm,\Bm9yw8v11IEsEM>8%dRbT)G#&,AT8S K+ak!`%M0NTKoEIN9\$iL^LdH2w0b200Ct~P94~R2{/r) AKu]Lٽ{Mt[BMʎ_ȵq1?s` +2$FPxƺ:pNxA`tw$ǗA4q HZ2V~UGc9SD|g$|y 2g +f].~K{qce2 B!I«s.Ψ9 s 20 s 20 s%I }Ր( +Ȝk 92d96* s 0|@ +Ȝk 92ڌ'.kPOV2adNS;mj-D/:d{>s|hxcJ0?Cm="2e}|^|5 27R7R𠿚&ܘ7v:T&2-0JO3Sk<]%]xc3o;æ1rB'2Nf9\Y\^z{{>|2\~\om!evAh0d sDa#rpk5hi!dѵ (7w8Iu%9UYBe=Ė#M_E펈F'.:XZ]O\Ee8fep-(s|wB]X.2\׋w-i-sڻq{f-@0yQWV]ә%:9 sh@yI+2 +Ì?y|}De]l/8r~'@:(jKYi~h#mR20b`0Ά,y}pM/% Z*sw}&.bleuFXzHVb|5&n#.eDQ C3̾stmFDv&թՅHGyΊL,BLzil6)m‡ק"gp[B I H&P2sl!DS>a:CdK6,JIDVސRÐ9]%] ]]]]sa%d)>_crU$+[~B}E2ڌ%WCXzr2'Ϗ]6mq8d 'Ւx7PØ'zsǴ-׶FT l9W+|W]Gsa>87.ᙬy44$wB;/'\fV>UR|dѵq T +eo*5 +V͹/jZ1joknnk((.[4ʰ25Ӳ.-k6 s 0|\DRx-ۛv8 96q `Dstm$qjȀ. €. €. €. €#GccRH$98:ϑmxE?9֑^yѝpFqo.//G3L]y _QˇeW{.}^1d9WQQ,]~wy I]xwo#G+Cd9$}`$~׋@bzx{~eȀ#GVVobcIvi$@"6 +ut2d^NSIv,A+Ōu&vv36]֏o#RIUȤl`<*įag(2 Z#$s Z4Tzzobce痵 %Dӟ,- sEǁKq;9+2Wޘ0B#v'ì-VN!]0̇2--71YnAh~}Sg?I=(@:>x <7LAeÃhCR /OLNR G0o|yӼ P"bf~ݴžz"jQWCd.;9{jd9Q:$fc?.mJmޗG&GvvFRPObCm:rMee*Y͍g ,T'C#ߙ9A ?ܜi뷌@/s!£?1ݔaیM9qB2D~gGD2 # \iEժnqe~oaw e1YcS +7:l#懚 Lf /oƪ=d!A^訅g*.89~zNiuM6C׫]6  ^T"<}"$~tޱ`rVVĎ 3>{ŎuZZrւIl<}m|bnŇl6!QY!qiEb am5$RHB, sS$#%((j^t)+- + $2=Dڄ926+YiFU;40y~my{{+p#J'p F$fFQuN(s#ݨb +Ԝ72D6F#xWPm$z:h2ʯ>h3KG- Z,XH m^6ic,[.ce?`B_4Y6 +YĢ|@2M7 shaS9pr> +BȆ Ց>bG sV%Xd'|" 2D9=nQ7ۯMaٚ@2plb{YzaLdW**U'aT5g{^ +R&M(7A0oi x;mИ>DŽ$Ϳٽoi^BKف$O䇐EXz[ʂc GӜ#9̱F2GOr&MCkk8X,xs[ժ(m*V]Mp:IL?R\`"(|D!f{xJL }8 iauxEwVڶePiI}oQQ zliwQR189B~m>*=F1bW̍J{fnn{e0.X{a9uqyza;bJE&<'*Oү/9G˳w)XT B\4B rE 9#O?JU6 #4b?M6F6{ 89o}!PؘׯW>ԣi`ˍ s V&c6}@쐆=4ߡd:HiP& sȐkTU"d2NΫ^;ԏݠ>+E/X3R2J(%xⅣj]e_ʿ$_/D*Ǡ?xWpמ<yyy/b_׋Ҁ^n?w}Ң"GX^@c_1UsʐFBQPP?;n ? mI\.z8hllsNNNիWcbb.\QGz!E1cx9ѝpF$v*JTs +E0ݗ 9\9\9$qjȀt: 9G> sXdѵVstmF) O 5iҌ +_1`9GfJ?{nCh{4Odh;2U@]QO)̛d96!~[UỐ<3Hl g AWus;}"I>YR3YcKF2fjR'/Nҵ)eP{VWC[}ժ'}#P4Zkٶ6fi({u_>33} Om6tH8# sͨG,s~0#qI^2x|2>-IlSY8[ E.ƪ5 3@-Yɜ:'GZrCn|$ݽbuP{R#m&2]Si]4[mkV+SkTl[]4XB}))pɽ;l96UgF& V&{6LN`*.cm 5Ծ:~=e/)g´,{sH&rZ>GfeBojwodX-ET'-2&H#0}@r+؉F9Gf#9y~iˏymM~iJSY*ˋڽr7jɬ:? 2GY1Г?7կQWW7#g lqA6t*XukWlmQU+MͩZZj$)G?kkCV=}哟Q:`L s}kh?PkQ*j)U7C-Dӯ_S ZZjjKxn_kd-fHYjut'''m@:ZyO:ոήIJگږO>,G-[] m?j)Ђ,N]duI/*R踇:;M-_YO^ٴ>zO$8Zw[ +aՑg2wMZ m+u<}},_ڧ Һ{E{R][~M+Κ!nOA? [hjKW~Vn^dѵdp jy=pO*am촸q\ +7]^^OkY8%([*@Yk@BCBc}Z iW;^&uӱGRQlsE,2SNNHdM?Wdse o˹kgv( xgrkȹ&T7k"ckl'>}Ky+Naʠ%κX"5uYkGRhIMmpEj{l6㳒p@]QOzTCnвV~ rEo_;y;<ߤ; +T-g:#^ ]dmn4?͂ ad-RBJ;m}x")%SO,.` s52vδ<3S;5;qt8Rkjpu̍Yhu{H.6A>}GSKMu#Bݬ<ɮnAv +Ec3mj˭Xe89GP)XU$*X/bF׍* BlxXlNJ,M IS؛kW>~`qD 2W)PbCåK<N}OF6EvܚƆ.{1xsdAn͗ԴIN6so=kk2>REYrssF*PgQIW`[m0dMBw,oUgd4V,U4 Rie^C٤Rk0d/} +s-(kU7gDvi6 +cJU-=P(}@4 6[ gPmʔ +p@]`<}t:*c:ζ^Ix;lVgwu*A鄊VkŤe< ZR/oBOEV2)0*stm5O;4(25 {@J{wƭtB. Ȝk G\wkKV *%˲Ju-8B dѵBVstm$qjȀ. €. €. €. €. €. €. €. €.\Ek<'ҌN|^Ys'\sS8 ]X pGH`A9Ul "JdqGX;T +ʂw *Y+l&pq +8 s)NӘIΤZQUc j3iX 1Sdnv9sޚݻV}).bݞd6AYU9? +I3|wϧ;'VJ먈Z/ qpRAR'cD%|:a7ǛFyÃ$ uSQ@M6jUbA!b+Fq3/DpI$ .ZG9gd._OQ)s*{ 'CJ*O 4-N7?FO ͯP'dzd4n)e~$m(d9gdsRl:x{`%$j-HK9IO=}6juEncb+XfdC\/daniq/u:WVƜ(07iQ}$igr53AmTt̮gd%dv&+8+ sktz1n;Xꂊ,Gh3{u<_fWEW[0[lt+tȜPevQ(8̩ժDÆ_N{x-L/: )b CRe ~ko;Y2V%Sx7Ɇ,idcX3oXR +o͙Edy{d2dpa@dpa@dpa@dpa@dpa@楕m =ϓ( E:\=y emޖ?s m(B.#`^6C2?NbiPӀ".dJl25K'V:dft2ϕ2%;OVמmled墜ul%/#/VqnO6J̌韽1;ϕ2?K_nrO~}z`P̥3yT2- mU̟zR}v!3dl8)˜!4Rx m2 +0zydn޹ ~܊z +@!cÑdeo/ߗRV֋tP Xng{ 0ud07+c%C+/\KS8ܓxR.8[(`kۊr7.FWhWܜ]T^fK($dYd$js5dmuՏ3I럙܂= 32QI*8'{sc^_%*ZѷK!N2~ddA mҠem䦉V0*Èx7ɮAUF,s3^t6@C.a\r!IF)rPpv&^P 2~dd 瞨V0NO裕%(9u I1h<β¦+x߁g?c08,)bJٛU^ͅpeʎQUJP0Hǯw^m BqֆƧޠ$ܐԔ_ +󩷤CK ymkT߬θs#|92y#:7WUU凄,(̡֬Pjc^v,Ԋ_ry s/̩zxdUTKql/X5YYd96Vx`%2,Ad/]~PYoo5L*F":PXwZY:UOM;3fN(xq}16$62U@]+r*2l*HFŋR/l1/Uלʿ}'Pקp2G3eľ^]CfFƯƗDy+md96V<"dE'n Ҳ*i[V7(-ē)ѷc~Ӓ*Iyd96* s 0|D!W 9\9L @Pw: G[Cd%]2!@aHa)Kz0sQPV@^r:E-pte+ s/9bs98; s 0d@9G2 sȜk 9ldѵ 2CƩdږE]葟PR8/SSt.^&1/# s#WN4iX]gUϝfv +cMRIځ +T"P3/s=l_(rxog܆YjNt˷æ1-iwon  vF{6w;]''1Ym=MbKyܖ)qy7~Max +b3ǭ":6K//@/v_l_awqh"bG|vyг3R*2q Rb\7чѥϙjzʜ*J={OsM,Z1{K6"ip&]=:TpGwپ/sNR {ٚ"kkNGW{Ku{/Erky<_N72̮׹BS߬#נsľBaQET$2;` +ASOLNR4`6u)b=1?aΒqf^A}dmQ:惫C o,`uc9mLI!6Hr}KڝAvFkjwI2!@cHbi2$29}enu+C*FE@u,4xm5,U5,vE"VC%!&G)v ڭ,h3;i֞ *<; +!&;dۦ#רd9er>6{U4zcŜJ)mG#-F/spR+ki("ۢotzb +b{{B9+qF+ =ߢf:Z0S <v_ޞ{ jA2w U]FO+]Q5t:LCik<;dSZʶkqFk[ޟbٴ^ΤpW"v%kx^D==l +jP"4vW̻;L,ڲ+;]s6;++4WOC\n+ juF/-$d7,Q7Q sԗ\)CcFZ< +p*ⰼ5lpܗ^93o +3d&nG(#zd_]w8UQ p2w4%}F9$:=9,\-^CjGn<pʲȻZzg&w:02_A7uNFmSZը?<,._Fz?0<7*@Fl*x?("1K"8AEQ+PKYi~X5&y>bLbzz$suE-?*??DH9Eq|6hB*W.:%["|rͯzE(!빻$A_InXC,g~/A%%~$q T^9l1>㘷I,Pq,Ӝ38Uj-;Q5zA!~evW+>7[f6^YH=t9+"Vy;nM "K pl0`K*#dJeI(XCx줨^~~d6AEG&LR3۷בugPADbfqJ)Sea,mQPbTVG}Z>lf27h +"7uKPԻ;/Cϣ9o {hMaI;lR2Wpfg5/y7*aDpE#O{CC;=! X^>~ڣ,iUbՋg]1(=Vβ2VV/ܦ2wZB˃ؕuAH09>ZTaEH0K2:[g#;ܸrNxw><\6؂X!GZcI̖)7r'$2U?sp=J[XMgi* Z|yy&j5`Ds7i\;n/*s5g.F}g+ nJ(k4mJ$67mt7g}N2W"9e=+`=no'RLjV0R2/גznإŎ0Gˣ[&27D,BVGx[2G[ヌ63Y3ںQQ +;5]i8Rك25WٕJd΃$s d[Ѫ *42%2M}1hfP.Ae/;)\ả𵶆%["vCNW=&>B딦rn$yoɕRq\ew ,TPGM&6o*63t̜BajEz,ӟ_1r\哦+t X9D>/}2 |m}^3TtZrc +7'l,ZS]#U$rE+x&R7 +ynaQE2҄Nr.&_ES] x DS-~@F);PKD@2'ڪ|4~\Idnrk,sjc Os*X3$QܰɁԁr,58eδZ5/sBIoa%*' %N.A 퇇;hy4BE*Fd^ +cz} utR͑/YЮ<2mo Cztt dՍH;Zhm}^9 o;B~CXۤ*#;vkQRnZ^KaEe,*wĨV[O-=̙om=zos3K7B,ИuyLIdzg(da$rď1&2g4%(xtE +:U>zAq'8ۤ.ˌ̈ RY@F'LΖJYXeeHbk{xJL }8ߒ̩OgUא~x/^ʪJ!N旗Ky: V}^5atw߿j/DX.0KȜ:,0Z]qi=o}WV"^JP ?N,kMm,أD9俒MX ETYJ$^A2j`5xAهH +k/c٦Y +CTw|)^umsЎռe+'MG9sH.!_X!hWdW6ӏX}ު0֨Y>4u?7J-"oyN$?z߅cgUQ0k'778eUyҎ38yc%Ľ5w^n3:Iˌ ypA޻@Eu5w{ƽ}F}:Ohk޽m#Ngߏ(bQCTHy +Ż +*BQ$AŨ2r9ZV@La5p\|?79 )lL/p׳-YA,q =f4jKãZ&sM[0Ar47Yf.y &j[TqH~KjĥސIܒL] c|s Xm7JfKڄKfkK??_-q +L/B,k8,6 +(YΌAy2g[Jt>2i؟(ڶ T#YD/,5X!۲-yVqN +AQj&2jt7[,,*a'ɜ]oN$s +tiP;(xYg],oln.cz:%YDы\\㓴1^!Z"ܚfKd([&(/>ӷsQ,i 's n27< zeK[L:Ɋ2P#+Sqԛc62DkY*Nsi¾FZHEEyq%60b G3NdP#L[S[ƆM[B7Rg&b\0& 'Lf|qbbz qgldEޙ6<]&q9rҎQLHWdF^,l4ԟ'q# }xr#9̆f!#x,Dƺ \66iK%ƻ{o" d+ssUor#+ym"Bjx\YT9=wnصk[wOIYo:yUPu9yK7lHպ + >pƍ铙4c}*7o ,h#񮙍Q6..HYܩr7$lҥKE$D2?X~,sG!7Y>) vc5VĒJKs3&ˠϤBf3݊Oxƍ9 yml/+}{E`]lgzjqlՕp:b{l CydSd}x9/WTsRA<9+j +b#LH+j~! 77\>- 2 1(s 2 1(s 2 1(s 2 1(s 2 1+sEEEiii(po!BA9FSRRUSS-.-$-0puAdNLgϞ RB"0suKA1dǏ:nYdՄ,Z %iSvNiMڼ| +K!<%sJ4`^ǥ´1^{DOË;Ʀvmw /-%sCk؜SWbWX +Agtt6G9E@3wBE3W SxR GhNgd؜\e0]ٟ2Tp.aLmfqkBdҌɜ5|S Y6dVeѺޔĐA>d_hmܶq..޴_!~WM*7;c LhJ:^V$=hvPrZnɁ 4^^AG\NNt306ԕ,dJNN&#'Rէoi۟"&Q5 i&pv2?arY^ȢSg&{\WA>&n:#ɲAx~egJȯI3BSI%L^O&fTy +CK.BlI:e~r8Hboo3UR9T jx19!^S^ ZvC%%syyysRk(/987];3ZULd{`@k"eZj@'⩺>W(}7_e,)JAƋDyB 蓉 +a6T7^d6>e=UAu`0 ȘQ2'J:csN.h)iㅦ)w"Rb!*#^Vz[2i9βcgMO[FTl&Rr;kp)+Z^a!و"shKAwikO{yA3%suuu9P[PcNx- +nH٧՜uXAϩN-xB< <v\]{rEqk_ 2$Ud Uủ V .#_|8Ɓ9;-kVի\R^7:!s,$WT╈&B!^S֦V6a& -s +$ٲf +*L(@*§.T\' y꛶2›YYAdQ2VHE66mB00 ̛u[A05G +;niBUiȢ`N@ksBQeIyS0j xRV" ԍ3Z %ky"8I:j O\WWWMM ]و6ZɩժIꞳ@IKtV;d'p /&sFtUWWwvvBPB"yO7["x1Ri>.zbC}fx _ 2NXCA<9AčACA9AčXkll,**JKK;G x n 2xi4o)po!nۈ  &sZd2={=h{Ay)4+--ǎ nYdՄ q$[>>Rm߈g4kqtמ_w|OX NT(!b(S*؜~ca')Y^2^ҳEG{sxkrt4tV*;{GQUx̕wtt q 0csNzBA;{-N0L T{ކw Y= :n um)Ag(Ǫ9'w(S!YS,#GV&n]ETr.@k:A·f-A6ioptvQ9X:C؜#16bz<9;4㻾'&@]Ŗ9[*4nhJ:5i"%s' ڔ {:eQ=DcI G$q74U')iݢ%B|B3XCUA Сt2%>]185P>.2 9[X͝ ȢAiQP;;f EKN΍ @t!nƸ0nIgO;7 J.#Ȩ(Ɂ.8#s` МzVVTJYʁ0Q%Ȼ0kMtF*eEo'#lb>u3r* 9k^l~BhT% +離 1,JisXbf]dO̕UZ +Vߴ)= $jidy'2UJ3NcŎuBؐ\ ,+*sb(TWtBucN[&T\U ~QQAۈOVJuhY^B!00RN\dET~9 .ɯ%2 *-ɀSdW5j>2ii(,- D9;3s*TCw9X->!lzAFG\^^2机5Ij0`򚼵H١VУ~紖 +X# *NP) KAziݭGNfs*Q/{]Ju37&^ksl nt4Ul;;Vө2E3oC]^t:LZXSk_Z-.)Yg(B^ɴ?gtI4VJ.*cSە9&I4CtvCc=ҝZMo'/ d9Tz%sRo."Q&k2e]^i%0mdpg = %ӠD舷Z'D7;$jXKAI`άfzgˎA/DT@:e~\nΚKR+XEȡj= ++%:e/Q.k|Eas`<2GC L9g+SԼ! :-w`,;M8G\]]]gg32f`li6ǜHk^!N-& .l&(RܫӅ!VYJ L% SWo3t[emSV" m%wtUl?~V7;St̠VVZ@.{C~ʥl;UEZZ`(̵ֿ,]Y<|v]lj/xso;e{M)Tm B7&8r]):0}nA%sv `fq㶠THOp\RHSX@嗤*EQILMN-T2Yt,]Sd7q,[Ņ 3q އPymԢ ŵ +y`2SdMUT)*u TT1:7ZM#{rd2h*O0g˚U +,)Ji|/:Pʳ lO%2gw=YUT%~P2g /X Kc豈h^d( (rykkdrqp "m(LWoIߘ)ni$-0ljZMAlV 8D+(Q1Ce"md ʹ&^DiiSݢ)`wfsC#˷Cω.+~QHA{{ns6вuj|ÄG/MjDrfnʴak~<* 欑Wx4(s0d:$ָg̈\,W};f{{{O;MX8u9ByZW~hY Q}S;mqH|/h}4}UZ%A/%69% W¿I?iI[ [Q(sȈ@suoagw1kۺGe_ w l~o[`{#e!@^^t# 'bd;leuIXCٓ3E>miktg2\qqLm>_ ΍y;Of`lix)[I}B3䘕mrA9kueyiU|Q {|NUovV>0ݢgs7E/=hvPrZdɁ di2=OYHOȷ@O%o >o@TAzx +5|\ ޅ4垜-n9+3¹Z_J4QEG2 ÿD?"MjSp 9bv|zF ZFeUv,*LtF*eE#丩A^S&T 'emF8ei%I'砑;inD +TV +'{^;{(؜ر7aF<<]8p}MULdec.HO].MzߪSr'|pN]W5n%9]t\:bGpVۛ4G 6n߷E3̩ok+K9$ө>-T45Q?6hUUű2.06Jd *ZQE`wrQ DzrդjJ/pO 'ktu*B<9Wfd.bd;B=e-;H]PZmCΩQڡ1mUQD ,hi0ZbN&z2 ԧ +$'Mot"|:4V2wT|89":w%lZyIDVIPNÇ=|F&F[PA9_cBuaŗz7){$h^n +;Ͷ-=OiJ(*fOjlƏPߑ_J$Kbo} o̝[Fݽ0r"]GW4v]Tc#Ȩ=IsdsN AiP[+JjllUπeս7'HM}Z-1b&>TvΩj": +)Ǝ䎕urX y鮘yρ=U'2:N.NHi~<.Wɚd.haѲ^m'5-Gɓ ,:.t8/s3+P +p-Om*md*s>YW t_JJԖ|I&״U\s&d߭Gnśav,˜;e>ǧje:P| /|@+åtWj"c@suoj /8jsOWv-(`S>D,e=Nj?񚴷WUfדC1\P[~/?I;klT9a#1AsB).<4;D\CCuLtl?:2(Y36nͭmT{-qnzK^QDdn6kvG%Sͻ`̙|Pd޴ϹN&Pw;HdA TҜ9;ZZw:.=~x&u:iB6U÷ xJB+tCG'F "ʜ{3 ӱ&O6PJuU\\t8+1"ٗ/'8IR)DMa^S&o͖5Ea&PhȯI4;toh&"xd<{dEȐ(#'%۷o+3J VMs $=>)WWGl!n2_I۷{^E?@suogj?N]Ÿzi6'-Ha M1 tx ʼbKm xRVbnf#5Tڈ'8uyEpT=uQ dbT8L0 q*H 7'q6SzOHѐM$iZZgl¦[qoI ok9'M%aC :,*OQQL)āiA޼$[?{4TƜ6^~]~Ml +a*@Ky[UHϪzqW?MtV*zҋ͓4/ne)_RŴʜ{3|h\=:QFG2ȤmxcNlz_yj9LL +rՒr϶aDs0&bbwv[nzl-!ʜ{O7[;-~]Gy%앏fJHݿ, d2ތ aMc<@oç;nJX>9"6l4Eqʜ{,sP\dG!\=W9AčACAƢsv!.ƍzSV̀Ƹz<ĭ@h4%%%YYY5550|K x p \F'ĥ]~7<Bh4 n$}}}&po!nvgȁOKd̀Ƹz<ĭ4+--c-03/Z%C]>]ڤͫ/ɻQWY-|eYptzU*>sߋNT(6֦l[‹|z<4 GɜR,,,YeC:f f'JUQ٧].sN /yr\] 5/"18?*zf먄C[@L6icNّ{MݻU_s~oGy$|wNNU9gsz{oHgm[gYUifs.L![ ;WkIW4?j449sb@l:Vm! #TTv;azV6l:.7 Nb@+ھs6]+ܝoomS? # x@90cq^v~\hhl?h¤QLYry%`'7zd$6"a+WuwMUryi̖sW9^S֦WU* dʔwW`3R,+z;$mY U2i9fu8TW{s4yYmu]N * ;*,sr̪聳Nfݴj9=o̜ +UO'OVJq!TEtv` N0*ڱUW|(}wv-zouʮo}U*{G"u(s(s^X,f 8ED)4Cy&rc_eG0O]Nn&eGV\i>9/z]PrQɭiynɽ&o-RvUj#]LV2Nk;epm<9A۸%;N?L4`׶rCI/_.3-_e ɋ +DZ+۴?gcNz1`"nP\LP* 1zC_^PotwFС!ȋãdN*u:h Ƣ !^S-񍪆TvD&h OeC]%Y'(ׄHaI[~ی"Pg9fM9i[Ҕ‡ssvcn"'Rt^!.ڭvnpt&j*s4v eA\G\]]]gg32f`,d(>ZR(Whȑ_ uIgwV&n:AQɠJ*t2{LR~jW %7 +;S: u2T٩IRZqNВQy],JdnNa_ l{vfO欼94{s>6q<84`<%}SAnQǓnͩcN0Wd4 u`Ƞe_2p`%s s(s2(koo~8yփ`fǗt)[kQCD;j6k*&[PMwY昀[DK8iJ%/DV.Pv;2 2"LRd&S=, (0BVDV٨R-`OHtx0Tkt nҜT埅bI,9!sĭCQ :ĸҧ.$mT)Nf)C,j-kV)*Nyl%U 듷JZ-(0.WgEp{u㋒9wwNO+H[OH]Z2w oߦk{wn:nn!OG [[[M&5-03sxEA4\Iδ4/`$ytdф) ؘYz۱gnDIwdȵ#2kB# 74QW,qk.>+f$8+t[bg>RCm (!P@wxӝ7g0giPmpGȚN4Q)znN%pF1U<[]7TuN\oGuuu*+G$/&unu^^"eA~GCY(4/ѯYmuC#|NFxw-9[ů|Nũ+r!üY#cOl&EAF#sVΜ9Q_»QqRge_`]T3͝]bz%آǗsUgj^ÜLj8o{} κ’KmD#ƗaI]#&%D~N~ +C\WMIIIC,/L;-IL޾j.HfkV`_3L.}QY%|4Ay~ƃ\|-}4!h!{R#܌JêpmMWy^kSȍl߷|s2NldN/eW&ebccj,dv#CmoYҨ4_JMfOAb\H`&]$`mQq2gIHA𮸕\;|6'Iz^oe^ާ)B9V2!%o.w<|%i]|9ȫ8ylz˞" 9Т爥C\i)LRu"me ʸmݏ]Y˅FTä~lo'tѨJ吝]eAK*vר/"Z6PfAdEi#{)5/b 4K_zKc6'FZq, 2Zƕ! ؂2 1(s 2 1(s 2 1(s 2 1(s 2 1(sƍ:U.WUUU" ?X.`B}Svo\= (Phכ#Dg'ksu9~jZ'3ҡ! ZZZ\A1cuiu/z4nu6yIE߹zz!! \~WDd4D^O>b/]d>᯹i񅿹zz!!rWDd,0xLr~\gzz!++ +v/˝/{ϗq7VO]HE욹9qE܊9;S=eUWqumJii_L}m}2_=}}l=vpɁqȇ'Iko_'<uBkt_0~B.trMߚ. +ews3/o֦692זK$r4.҈L6EjBߔQEL/>s2sHII-鿘 e- pqiV;/{b.RO},/ Q_?! Xjԧ)VwN̽XAGu ֖k\pfgq(#&kvJ+d7{m&*:&'|·'{OD |TтlIKRl҉Z-'smh]ӧ_AXMj2^Y7dn85 R@洤bF¨3"#'ӏO#>1fqΈdnh9pF$sZ؝Ju}Qη`ӹFN޶oKdBf17Vh47u,yɾĝ.:FeO8;+/[54]@bkOKYz"gt TD.[/ +o+ccWu +u#7eG^rΗ ]>|KlHK-Hm'2[ټN"O0HXL^+M\W[nhB>bfٖm)L\R=Հ 5F2>?b4K {dg~c +X(c׾_rqpnUA OtDן/rJ2R2beΨ)erA5%qO疖 LD,"K2B}$lRKe,(WsIe8! +yyβեpayy`|sEה@&Jje %:YZ^x BHaXfㅷZnPCRH*hH2DJ+ok@ΆKܣW{(jSqgJ0qB!WXZMk1U7-Cy%8Ybtl9(6Rn|}kP`!fH(C-_}%y,hxui$~݌+[@L3)ӽohvCʜ?`6O R_aOk##r_:$oM^i +oL ϐs2wF*:1SM|YinӴ΁\ +3ů3R|%otՕYF r*]>-sr/%\N&X(Ԋ7Xl j5%xȜ# Go̍dp,8U& r#۲=聱~#ӯ R@4ѣ`6@rM%-OKkaAf*sӧncM,27dlɔ)M$ ǁ~U}Ԗq;7?xpF4󻸧׏bM?fS ;śP^ieBR&/MܖY-z'U +IWtĚ9{B'T_B +:ʛo[|ʺcYVkdmna {S(Quؑ1*0o%EAHi>=ӵw a=Ӄ޶`=50{2BLUԄ([MLHר&q9d#_0)}w'9ZFr,l?l!Uo\&#(oc,.J|Fډg~Yq)g?>p "̽X+M"_fu-M/P{S-Y'krّvg2.MCV '@fLG|%[X<1SNJޥ~پ7g6#Vys4GPSC2]O089#f6EVr>ZX:577%Zq*/J:N.́Ѩ$:.YtYQ@WPO%Ͳ̣o ks]efmA]=Yծn) +>mW8^+S?k7~˺}2j.Wo͹p-%Ü?%}V!{Ym}{|P[PMaxuKKrom?NȜK\8/w)ӂ j7۲܉'OS?ZN?㯟їU >?24@Tƭç +#8aSI!"kc-JNFcWu +b|W[A*no<%nQ;06l.03gB62 +Ci+~aX^ݒ^Ls?[z$U&i❖T'pKRnZ{xƌֳZYdşmt3l/mQw9(ܿGlڞ?YX9wf?#kQV;`aL2> +stream +x1 g_ +endstream +endobj + +1256 0 obj +317 +endobj + +951 0 obj +<> +stream +x{Y{nLOO4t s(Ur,ɲ,+9gccir9c,gal!l`W!JyT]O$?Bm_@Eݫh0 S*Hlkk?xxA`rϟ޽xD Z劊 +x@μk׮V @ PqWW#bL~.{~gplNUxճ?U욓ZwVF "Ç^h__CJPW +#CƁHCPAIdESA?24qFCB}X/OU1݌͌"oä'/qѝNT=F.PzvKqKSX4#B;j.dԶ@cVbGku)̊ ΝJ<:`tp;g\v3&ht{rrr;=Ks^7Ko5v33׬_[t:V[^s%넺S^}C#1͌ s9ۢE@ζ/\C'rqޚ>ɷ+ +=/Y#jC}!HFc!Qmv\* ݅5·F6U,[[jkWw-2ٛ\:yh'Vl}9p'c +Bi;zcr\mlv%fꪓ)jxV=pʍ'j@8# 1@:rxז@ZAsyjc#cƆ.s@whw~x~*l$!ݜiz\M TGc[~sCdw|tD(sn,o{W摶@oƍK{knT߬sƻшY 1}lmnlm35{:7.TfXUBL{>%]"nr{7v]ёp UgU9~@a{j!wkqR,XirlGhKJ| SbHN*]ixp~[R!wJ77tP^wK2]L(_iUCz|"7&J+=wbvrkvTȫ4:2P+i|˶Cf<4<| 售;6>X}dtoݻ|\,쯪GlЕKxu􎌍u޻p +';W'0<[dl RNNn=NsrDJ^962<42x]-?vsF*_mU \ N 7׵ut77ܩ ر*[%Х:jx(ܷH6<Y]8}=>J!-=u9&(Yo}9+ c}2lt~rx`9D.?b1T{Ʊ>|{-Koީ;(نzo]>|Cjh N>HCT=|p}'NijdZo_Wa1|MM͝cG< B Uݮmj\ pc͓Ǐ;~fMC8 k^}3D-R,yT>q;Ҽ}סxvZla@Ҩ7Qoo%mMո /k3TbK&B0^?Xe(yzף-uחgUlz}A ^.bj9 %#wE ['8 x{@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ pw#7|3wyW_}b@ f_|aFAA5g?P|F$vd1ٌFf> EܬeBӚ(9~KO9@LjM&I@::^ђ5&Js\QMdNkQAYm_;rDglSCMh@lV6jYL&3Rh/، GB:zŜ(h,6aO [jlKpd4(1)'B&Ӓ$Zo90RNp%Kq#Xa9Xy-lkmunq;qU-: i-߼ܑ2.+oU ܻWwxj1uew߸ܸqC;mFh䝖><촴4؍ہ\ ~ |f)FF@ wC}*J?uԦQn9q}0 [f1yn0|/t&o׉+F.z܈&MW:EyIE8^΋LJGUwl\.3cq5c^v֕YI +c`eeۆt#D_hա#Lhۑsgmi('2qʅs<MIm(w'$ Vݵ:$ I{ꮽ]Yw_w +lnjnnmں̕l?r~tt4RqU2m: hvjPI\qHw(t0Lb[Oo':;Nz{Vcgv~r o + -H"*hdB_;G) +H,&&HM"Ov6]1I*t2?dj׉; lurtƷ޽{Q!OZ#r2񒌿kFKJh\u D$[rr}gݛu-5ti}n-%&$Nliz$vFO%EQY XKtr/8jިSwYعGDɪԖ;FnZ-Lb2l;µڱ%[xpK(&&ۜf:i~J\j8p טo7w ޻zڠ"rA*=,$./+{{ʼVM.I$,6@u#[$1FJ_~ukS:*'ppG%B$[3i)<WO&/!/ ͓r&R%} Syptlltps'`3Ql, &|l_`gaA Gw㰘)Y=V1v<ۗXӷZZnYL&Kի1O)bKR34vd[)F3fQ'cOa'u[ C;*I$嘌xңc7`RT&IBs626X{`P{,É1edp_oy|q*$-wh=,{/dD@}`/*ݸy˶rir\"->ϨU!Wl߹cWy] F###GجŞy*}^/HG\6 z1jv5썹s"'#/ K֮[WPKb̉~5X,F-84WJ(rmڴy/2}Z%n*d^VD?f(X^,'/}+uFIRH>:H,C)HUn~Qy2; +))Zuoݻi-[(沸;N Wdʛ`p5c7UdL&Gᾖ 7x0ԑMћm66аo61M0ߨRW_}(btk|'WhlZ]}ƍ;JSM# GV؄-|vjzbZܷjN5%KK^9w̟fgWbU0Ao2ohBP0A/ 8GAY @ek8wFgfg~jC9*RR>o%xh)pE'32ÝMhB>Ï> 2r 2s=g-C Nf2o0ο?!xAN~}f??|x@N~}fAП .B ɯόr2|!t! g9yּ|Ŀ {P#'#=bvja M3{zgb 瀜<ÁU]k7ͅߢ M3sj+R~>38;?p!4&82mϺJFNg8p}3TiJ4:jΫuO3^W>*n)X|8&EoN?d{1x] +Ǥ`d|?ʼ:/#F*5Nk}R|t:E"QZZ^}pLzi9yj-'1".;))0XDOZHgi)1GT.}VgW??`JOw8lPBbE Ijdd紂cR"'O#ɯ LWϣĜTi {ޠ +´@ٵ;]]Ɔ{O[ Z sPO-|i\"[PV%4ѥ t<&×|U|& Xȶ=!IJ+5:UwjF9./xJU4q0':?yO%Ϗ>Ƈ`T='>J9yAN~%lșwܹsܭ>X'易*5%8䤢hUK +JW?rNQH<:pB>JReR)NKERB9lX2J\24">L\IAV +R.`pӅ6iDLi-9tPe# Pi'd"?(#PժxlSr"ś{ [- yf^ف};fVp9"LahI,._T*DzKɘR6bFv㭋a ,XpBƧΕ*5r4J\d͛7߰^^͖k7n޲4ϢM6d2LH)؍x j16^dw,dB8ʚVi+ +%#Eov=y|CyjZzyyBiݲzJe\rU7UTj5X|e/8}Oٷc]!-)+uf;{Ba˓F]Rk]}_*Jxζ}ʓ+<\m j9!UvTVVX\oL.+_OSU:CriYE7Mkv<];kKYa~lZ*.7Qyqed?kɓ'*H `"9p;p :-b2`W \ZZZ*&x"[udΡ~|YgwɤW57]?"VVkr"{/VU8dE?omi v_-ǯ5k!If.<8*XV kj^iҨ4:ƶp8l>{]=j/VOUVF֮z%͗nwžkhru*ڒZ]l>Sy)VSSh{O۠ p-7>{1%ƞ7`6nݵ*6mr[ :v[gOOOwgၾ+e2ܝųjouX'Z) ^`0ѕՌjhh/رh7P!'O#ɯŖVnpHNb0蚔_O\%23wMWLM]Ã{wo^YwldϺBZbS~7;RuIt֮[7OtɄ\C=)W;Je\Rlm=Pm=t)Ӕl);0pvf A(toTd82{m`o Km˺*˥k c&w!oB>1jRm~N& 'n4v_uZR)^nOoCz> +/*}vT(?so vQ%pޚ>k &=?E@G"N.[;sZcލEcL vW m.rwKw+\!#rЯnohh B.]?a+ 'lGrrCo5u@V>S9݂ Xlb]n!P|-ŀ+ e&ѤI2ݍeFjYm#JJ GzJS{`K Bd^نPOے]o3`2g% 6[Pmm]GLZNj5<48k-&}]s췶5blTJu &]᫰%"W}ihngom?ˤ)SX7욜`0dz;IT< 'n'Ɲ !-{A}"C}]M`M/y`{i64]:$P,2F*uY7nZ~m~NI% BaҲT%FgrR +9ü1--URT'LɎTehX Ee+V,{tjvgjC2T(*́B pJUPTfPcқK+*3S nx}ȕꌜ+f;pRJc((-//7u^@PŸ-S<炫e5Pg0RSoJGbCb$)Ԇ++r&u@lZv},H,ENF_JשwtSLnU0)'7uYedI;b19|j1>vC,6dCz{β ⸷@С~/槼KEl> ?Z0}Y,>YyϮ۾l|@"82j.'Jy\2G61/"pBi9 i4 +FɌ?y)4AilzLw"'O3_oe M3tj˛Q<= '| N$MhY0ṙ2X\Mh G[`P?d~15r2x݃9@_A@ /fFNF {P#'#=bv5' Mher+&4 Mɯr2Є74!'hBЄ + ' MhzCr+̎/X SSgo?O~8?>Ru>p|_Cӗ :bڇvck:#I>zVp|}'_,R)s,xΝ ۇSǟ|٧%38?_Q_͝?wgOE}gGN)HS?}O/?5Λ?>stsͣN/-XoӿFǭi PA:a} lW_moSwӻ-V_?ۂ|Q|o_O{u5#cp_UʡӻB0YyƬt2Y !<ܼ̀b@U$,sa~δ_Fg.\>ꫯKwƙW&% w~ܹ_o_5/͛٧~|)46ҙ/>3M/3ϙ̟7˯d~XE~HEΛ;:8/̝7/| ;yX cO |;>0@̧5Λż/蛯EO/9sEzf~ȮbDzF,Yx "SЗM} }/>4_|w?,aP/Ϣ?.qQ%JókԚ'xp_O]o|_E6Q0/[w24*Jp|ҥK(Bt~O?dId…?M_hIE 4F'r~.pFdZH#HEiLZX|`0! G:GY6Ft񒥉|`q̥KO\DRDE \$!)?1a)rx$ZwDPIY"Q5ku?jDb"P12D7jzEJǤ,: SapR!'d-^#.u*qѢh,.Oa2 &.^*9sL'pAEBDž4>c?뀽r2"9AI +B7% q[Hg:D_qH'i&JC.4& ,@,#e2z%K`4zV-Kp9">H\f1b0.'Ƒ4AөƷ_6>7,_*Ob6!߁\sѻ=\ N'sE̼[f1 0qzZI2(bqZit)5VU)NӞ,Hs٭FMhIKKY"Ngj֜wZwpq4 "WӼF5EyZZŨT?DRh1|aS^GKvZoRu>Zhv_=Oloǖ>i_$1cE*Njr"b5cZ VY dlu2mKJJrfY. yBYӊ <9y92͗2rvG;)X#_tdd|lw MuJ?3(?I7T| WPl7(L-)..gy⬀7%ŕWXZ\#LP!vxx D]Sz}V@KJ] 2іiTA;BI$b,X{<~*KoHdi#$ Oj"Zk :L$IeJo Fw{}T"yI6M(q< +c,,y)pJJgg$$TAN?'+C,_UT"٠j3,z5bB J\"%_UF&0 2Z W~//tL2Ȅ3XHRӼ 2H3gR($;=>C,=I|ف8^~2Z#_q 0S[M +Apq|R(+[AX +'oah+0+ VD)RPjDlQ'3.dwq~VٖTKlz9[$+S|^$,%5EV-@oI-.#%+Jj!ZL`0R9B-S@(W, HE<ȷ: d :B gz>M7N)6N,%3nR +7~O.`?914-ݛl PBV'z] & ,%/ k'pIFLL{f>p>F$ɊrHtN2RߪD ;Bm:!K1Ua)үd/..-M6iUv ^ȑWcRg9YBYDz~ٲer<&c9yzN~ ތv? ҂L +DN^qMdr6WqQIa^jJ}AQq^NnNNNnn~QA. ٳ9u 'N,F7?#ܗ6ءN 7 L( 1'G?)N~)^HrB;d®8C)rw{!Ĥ2*-Y0)P(I0Tz L'LJtvpI*5n?'3nK%/#˕lKR4p_ uahX-̬lFy\X&OIMv;mPR/`+BC3L:5AP z%p2uI(d0%g8Y :Q2\$ʵ֬ ɑ)4L0j>}BjLuʨ=p6Mes0B޺ΐPsW,'G+\./d(DNvfL,ODdfp9"ɩa:/ ."dqE^aIY͢c6\ƺdt vՐ`8l8'89#sƘ99>ÄZO89' ]0S)il#a: OK,^,9y)f@dDŽy2hÑ( E%K,7D2&;;!oV^fϦ/"+srf D"Sܾ wf~v.PaO p؁ K4_V-~nfRR6hixBnvN-MHcBä/Y+C9  4II!ψ8Yۺhl5cΡnbKwFA6^>^Ma.y˓wD6Oeѓ/YL `MaJziɥ:NVp|Qvgv:++Qh{SlprV~1̖)).&]r.%EB +M>L,OG98is9힒.S," ,.,F,# +Rua?oi׌{ω˓ȭ㌼χ/(&N +32ss N.,(ˁ+0SI̜<6NAL 9P5/++ /Xlꍿ¢LL$ڼ

    ~/qfreBT*HTli54:$$)' <:-||T-f3T":ڌڈj9^ HB7FDaa? &f5ȉ5 +.9'+#rOpBӛM&ZAݜ Fɠb[24MPGRbС'v P(`c[+Tx#)W @}6a|tߩ5:$ H`2JyngXd'!'#^d )J6 ZRߡHRVOB6 +8Sk4ZsU\vRR)B~*/}TI8BT<.͑ŰZ 9)hZ5C/EOb.O} VWqA.@@acq.'d_FMqbK&/z\;I{*tHBqisPG"8~vĈ&iͧ+<IIpd<] '3"r[HP(.?ôc鍉ŏBه0%@NDE_2uxVMEw=Pf \ϳFгԶ(>z1c@NF r2@b怜@ 3d9 '#9@ f1s@NF r2@b֜Ι3g.@ Fo s27V;@ @ @ @ @&lN3Y,& 3l6۲  l SX{رÇ/+ g6`tIU`kZAO"༌X n\mx˷GF= .Y g ʺ/Idj(љ[+kq8%eV$f01C(PT9[u49,9@PZd# #R/g=HoI;;ٝj#9g18`3=?[-NI{}4VuUuۿ.UWѳ^k*)PQH\^lBRBlAYe9W*,&] Ob3p1e`hJjj\T(#[R)|y.%"HChJx"eb.1!N& }PDn>|9.J&I#4~Ԇc{V%=o/1Mg?pJF~ܠJS[,6dYǺ9Le?wk$2Y:cv[[].+*_}o۳2LNs*; +AP( A*{/^zZ#BC[_<(M 6ϻjr)F]؜VCłJ6!1:W^8xXkhܮxO ՁjoU-|4|01_~ rφx8&{azd){2D8YͿ^؞ xݐ ֢bklSr5ر) +*x61Ci<@fuOmlwq[5G 73 _Y`\}o I 1@=j2oD*8$D&$2:gҍBu_XJ>7Zzd.VőVBS4m[zD'O6(>N +6/6B {w; (y<4nΗݭn6\4Lɮtf-7e1oLJXW=n.UKxyʕnY-;y6vY #I$ܳt-wfVœ;w'׍ƕQ {A 28(J Iz61D)FPfUmw㩙qA + @@@BZW.ӊG]3SχoRTVay]yuNy@ d E0?˞f[5έi8CO0iDj85`T&yCGCB[F{[2 +\W-@>E. qJH|{}x/\-??]ʋlr9m<Ϡ(vy(!dp ?]-?ο7_|W_}{@Np[~_ +hD{NX^s?~.Y.e-'cN') 8/7l//_7,ȏ:byAu}7W>Y!tVw:q@'_,>rA 4ϵ\/ ts-K|Pwy+lK[ȏ:bzy/*s*!GAGym:-קrs@>2:p/Ca^,KR?= oV[ }U`TqQZƩl$6T4r|g7ql" %fR@>&t:0G5y:-/8QK䯾/R + +z h4V "c4n`RFy BNͩv͑2CRPQ$"~RyLA>\G@\Ӛ@Qm7(t;DcĦ޺Ġ5 JЕnn-%+яPQT;Yy3l +~HUN賱ʇ8%j\.f.<Wuct~Ċ޾4(@+b#FGǽؔX'nV!"88'+N% Գ\ѐ1Dbʯ}AAkmpsps 8 8O.5NYdlnCY(fp2/|Eoj*ׯHdP)Mc})ѩG'G"2pն_;<612n]Dq¼qajpՑ΁[[lt2HX(gp9;IeK vWG]z:932+kJoT,x=N[kN>υ\b.cոZ2SZ~8vil{KJShnnQcjU$>x1155'#!I1:gfk+s2 s8*ƧfǟŅNNs[t >'vDcȅƥ NL]RaLANSSMy \37wLUuH9:ZDb6؃% o~]+"6w/P;;;`X,>תqҎubq\tLbRRx!=;齹(<}Nf0 g ˄ű;g{mᩓitkLSE446f&5?WIQS'$j]J4qka1A,6\(eȾZ_;0[ +(ܶuqK-^7'S18da׾0_ܾȚi?r즅*=?4:bbE۵v4\S(y-!7/9gZXHɫ>v[luܦ~GPk׸\.4zbyiT +b!P+v}fv 3b>tgZҍ +c'TE@TIWNoYg;kSɮe1z]eDyȏXnL(87ؐDAnt9)ݖސ{dӢRA陓 +`rL"'dUrdr??[eaM20/ܹ~8y5",<:::6&F"$ݸpΜ0r0q}~sM{}xf4oKa./*6^)fW8>h{+,*,X/":'2/99Iu>E=G c䒴 $qޅM~5-Bd'qѱɳC'N_;saA0(fo2*}lȱݶX/Y=>rw>( +0[;9q@baQatgN/ ⊉]%]J(L+!nvu6Ue Pe\NФw?((MCΝ`N67Ǔm|BBrꗂL&aۼ5'Or<Ѳ%\]/\̚n=حԘRe+J&N*mLɄ<lNxҍrӶb$z'vռW S.ͲbXjK?/AﵱЃWA2f@{}%Z",n:j9پ:oe}Uk.F+B789&eL W'?Yo8Y1:B`緬dor{sSfDG*3w;;lOru*V=^wطVK}~YDEEd҆W\V~vT0c5w &a(; C(4klg֪[!Bղ4[JBQY[ff~RϕE魵q :Dέ뭦=EPH|mϿ{+Ej)& B?w@T >_S:KqR8,6O.t=O(It0 O K`+j2.-=!&E?1P6WKK8,1D]jr|$Rq'Ƀ"zۃxNF/#p/ɵ'F(EK&QMV[=g~cꯍIY߳mkĬxsep2S(dl&\BT"C!bL$y\$T%bX,fPD\|t( +@%QiVa8 +B#`sSÂ\6,T&%.Be'%$)e": )NgG蒒Â5\6*mDjN. +]N!U եhUR`E8=N%D +Л&ɒoʕo *,q;ewJX& sodg%Uj +>q2o9o7%\|_(trdr98 M:#yq_t(@$Q)|{OQp)|U1k'6 @PamgiD#`T8v"7_w?_X'oGI + \f7y)z>:?f{o(ޛ \Nϐg;` t$NIſ[Ǐj*J>]|Z|;|d>' Z&{P(PXd&?U>Ww}@~i/N@>m \*/ %t2rNX.ܖȥ:bp[B'C + 8 + + +X?_!:¡RT_|ů~|e%~ p +(7/t{Npp ro?|5y@'_POg~w M&ϥ]~L|GyAq>~reS[[(=*uZLW3S +n4=8oTNA}&dat'^3lZ{"c?RX!~N -BiʎNf-Q\I "16ArB vO ?%+Op'K$k}x jɘg\b O+z@^n~{˗}ͥT24iXǻXIÈ^bO#щqi$!O(n|6X19f )[ +qlvQ_p?#f N>icu@'&G!rP̂Ņh1L'W)-nphq~2JL>Nn Eϊ@>̓b|fpݖ>tzQ"8mnN#k,[9LjY*) Z)3qԉ2=FM:uH$UzPyɧV|5 ^18£)D 7 +F&gfFөzf{9 pE,QAyPwBP[^[WR_159(5FC\(Q5m=]5ѹys6d!Ƒ׷<!myx+=!#G]ss}OAdȒNԔ8 Ey6ʦəl*#gVKn1HX17??6ܗ&f.nTWܫiAQ"دM_q*?93;ln8YPQWcǗ6#yi6NL!Qj/OOz~N@U!1禛kZZoӛȝPm;\1O3ŇkH>N&7W +I7Kv.FOW{RFP[@~"m탎ާZYiF'@+n ++:d2|BwWSW:A9? 8zpxGw޷ǞugB2K1t+FI9k։LZ:̛ZʐLn^7f<|cߟn`r*UT"6aXi4;gz;9HdΆR4-7" e혷k۞:\_n&ޘ[ѡ#?5% XlYQx#Q,M (x|{+O5T'lKх*e *k:aٌY\=>NUyV2؝ c181k4[wW"ńvg;*(RHQ7+7By]aw[PN Je|Q{Lbf$.AO2ew-1H@;ϺLe9 'ˏl6W6@']%Q- + ';r!SCeESsݮ{Y1<E>Al*?oNFIY {:>o(F_#lJQq((ur[MJ8c &ݶ9IWN>v[Hd$0iz2 +$$y=e:ynydmmxwKdd˗GOj +(3#fZ*Fo;'۪P?NZN^س'8ۻ`0D +j"܇𘯍ɲ=Z/q߱7TkC-ou26UFFDFK*p3r3nZ{!8qK,V|.nlS6Z]@⟞[c29(YdhnMNL*si8SѠ7 A2YtGͽ'NBȴziחgVQbQ`l?^Cw[~wfkL2`py-NV&iH [ #Bnnm Aɰ-a0xe.?Xӛv+>kT7lea-J$EzaM W?v,f`w8צ3}d4+<غd=eo379Dyy~jekϺ-uXYZo(Y 4o$_!mZ`{f2p2]buL۷B,ͤ`!dlfήbe޳:ęfv7JXY2|Naoy퉓tX"4wYlT*a# JcFĤ"ByNgHظ(Ya(NQtX"&HEvGtpKUD{&@*{^c$ )ÓJͅɉOJXBb_EH/AOU * W)l v@4M2 Ja"ڻ=Y @"C8 S^:_( yF( Tra&QkT.W"x|cb N;Y + $5 ,{jYR$D:] + /N +yV p:&[Ȥ1cI]uVjSSuOGD`VhxlB|4͔C㣹 P % +mJZjxhn D*YBXdsYb +/s,TByzERIS%t&[ JHH a3!~U@7Ƃo.;*[$ލOd@Ͻ>򎞁3~3q#/D;K,)ߕ{ļ+O6vz}IѨ¼O~0wda1I8M;lVXɅ+l.L<3][Cb&ffoɰ7+}G_}ՙڅ|0SO)eգHW{ǀq>&'2pkﮩTz|ZfzB$P(d$.jǫ$>Nx?GM8y}a!1B}vsQRDdr"zZxx.h nkZ8ڋUKP hґeⳇl1u$*/p>>sԹMl\x1a`(Fe2itvzӺ>ťrD/zۚYlq>m<Fe5Lٺp2A2YNZߝƧ!QŎ(e0$i~}hiwy r?urpyt,2=ӛq ͸cߋQ_99J@`8ȋR g 9RZhs;J#S H$J~S?%}/fǟ,m_7E dw%Pߣ#Ó6k߲ΕN_] +0*HJiit5E)Hlzijjhz6<#-60*j#[v?>kcB;S(nJf]1MHB}}JCC$6ӡᾮPE̸h' ط1DLAv/a{ @v=}i V d ӷq*/DhK )Ohgd} zċ(@|;h<NLjOp일]8ɳo=`3yY@ 4v}^Qi1Ї =h:"|J |N !''OrF + @~F @ d<@'C :@.ryN@ t2\! @ O8@'/~|ʀs}1]v? ɬT*B!K@HH +8{9 䋾.;ɟ j>4!$OAAA?5a:8YV;<ڋFH![8^KPsNKU!r ä +{j#ϧ>Pqll,JLL/oP2;q %O+1|f7@Yzd/!z (KWE涧K`WyzWj4IW;r‘f^OsZ@& rhdBnn^BL(YI^[SxOqqqZNJJ +|]t N.X L|E"(^-B?2el\BzU!ZkwJR"X <ַҼx3oySmޟ%L5&& N7~OR:xO*ر,{{{fjDDĉMj4Ylͤ`cնlvp8jh>S=1ƽ̤ߩN}bwozd0Y6C8ؕsX +?^'VjBS6'w<8Nc0dl@<>L'"T:* +Ď*6gFФ +H$̮x<äxbJNE T.?Xz{vn2VL6TJR0*ʉX!wU.ȳg *5TJyp-}l-J ʭxʤ,G4>;@A +@4:n.Si3sJJ4Jilfޞ8U+ݩA0f r@TKSsA$RJE=> +ĠbjNzWq"FzY[{ +!}`Wdpf&$$~$\$ OB\B's^RReTtJdW:Y,YihLx B^+5d]m].3gx|GON܊  + +,0"daa14HOd +fF*05k Z*EČiXN +(W%u}svut8$0֍t? ̐㋋sd??`D`9)vWUYMEC Q%@&]e_ԑH`kMprum\AJtւU₊wZ)$I`сl]4oyT_U|bfaif|zr$uZ_]]ioX@»S]Ce|dn^ilMQىk 5 쁑b>r+汨T | \[4v5¨{ᶚ +{a|WYhYۚw-]:"ee4=[YH$ōIv8wu":PTO ۫.gkUA.{vMo6l wKYXZ|10tګSIcsybh$8(bnF,n\sϚZ- (2`vΕ%X!+|&{ܫo?pZJb"I +g2lvɻtbό=n n[p[OG>\ݞ*DQE;{V>3:4:rt`-.SjG֌du@ Pɑ-5A*emׄI^WS j`mW+ܾd[ۛ?xY[T'** +{;::fhkϭeee2I,C'/8+{&:/v˗t>D ݲ]ֶ2.'+8_2fnɵ/_l-϶ ۶6g.]%q/ͶG-.FSF-mc}M&(veGOO$>U{y W/ &G}E9!xEFhr)CGfW_~gZ+X۷=~c +=:$\vqdi'J+*!)B/fzzv5={Iɬ{U z= z :Ix-M|= aig7u'Oyt~3Onixq4rSMΘM Xsߎצ:£W1:Mbæ۳#m8 + Qf O駷σ표ݻh`ɕH,Wb2x+2/Jc +?onot!ӌã=U +Wit{m]CCorj#J܍7f&یeRW?Ă8D##ny{ E5v?zJTdӦqBu\O__O_?`PI&C;GLJkv8H'0ʩ}j{zd,Uc'RBAQGtE SkP_{635|dẆUV 7[:6#c1LNh{}^Td <87 E7~9jUfp` +foK#hxdbd64xb/{޿6KeǟI!(&|e`i`rGGǸF/|K3ZoLWw>i:O&%dVź-l2!]G&f'Zm9xK +|yflų'f"=[zY+8 {oF_Txvu<,am9vg.#VNwl\ᦷs}}ю1693aL6՞;;Ҡ 98=>:Gjld@[n?tf|znnfjaL*\ud `lIبg#R)P +,S{xx'uZÎWwk`+0 +C*l/z /74>}HT%F)QT;6L긯* +SC] ֛=?' & f9sd<}tDIDOrh|ԁ)P&,Y`r^ &k+1+58[w޹u驉{RxӋp\~2уcbSO^okczd@1JdziO&pezDes;mm7J'gdtd{)$K<}SS6'drh5@wlͮ׽}ma.>" +\V̏f<^p^oh޺j腮I;&s\nkd,&͡n*7qd=\**-6nJ8O3~3Ħ-]9;42۴J1QYf2ݿpX"rD"6W='/y݉] QFy%P#6^ + =#7/) +S +`Doeغͷo&炌Mv:&{*$fWG71 h;AhumzØMG<l51zY{13;ŧeq8ji2s}1vSp7`)mbl8y +:(4=ޛt jihOuh711O rƷNL4tt'oN?.8ERM^j+`UcsM'v*qWݏ/f޼}LdəLy=:]V26jzBaӴ6\L9RM +/pbz<‖1 # 4 +7&s?ٽd)՞@lټmw.V*P_jۍM=fBm8}ߤb-?zG=-]&X,{w?>OPdy¡M57L MC^l~7;TeF,FיlXHazۧFC Lrl ~99):sxm& HiT-&3*R!! + d$ˣRm=C7V* #͇FF#3 .U:SӃWOֹ]ÓC#lzlG[g&&Ɔf|wL&W-_9I]ӓV#p81UЮCjzvIg~^T"7ȃC#v1VU=08?dp5derTISk?֠V ,GMӓ#[Pn7ܢLW_LOwj ǮhAvPk{lKXow/_uq9m>HzU`˵9o>mζ{ _tLM N g!S*(#ג^J۽jU-腑F3ZL&)*8;4Ccpך$΂ɉWn2Or ft~kNt/ _"L| 9Ƈ]>E ߘ>#Klp2PxtE!`6\ft؅eOLoFcC{6KXn9rpRNeyb2P 6F$AjC0 FT  +J~S3Zh*(Q)PTֆ"D"YpHT?WbcV'̄jw㱈^kMX,bԂsLH V7J%Gb6VttP45*: adZ cFh-lZ˴NL  |05pV1ڏVa#0tcS`Z&#/~ +* OXY~6Mab:>SԉO_E`Ig&d|ͅ. dh:j.焬8}>SHqL^K}3_DŽZf,&Ck-L^?" i#fE3_~iO3-Z֍h&ӢEdZhZ?L-ZG4iѢEkf2-ZhLE#ɴhѢ~D3-Z֏h&&r趥EW _h}.>A@ټ?+Ds{Cqկlu<;T֯h&A 6V0/ +e٪1ާOv@,BdJߗ};,vF ] >XT(B2(H Xm+/?05"(D,v $Mh,*E3y +Lf~h"D0sW{jX&r۸O$QmXjE+Ɍf$KTS ׉JRk/z!YMdl.rl*Io\@$O.n+5ڼTLJM#RKd\6/d<`hPr5ā._n<7O@$4$ _B+ȧIe.GL|sӢ!!2^X:[9ͤY@~bXT0҂*dT$X^).Ɍ +Ub&CL_uuuF2Lm6L, S@uI%>$<|*C1٨JJUdxBB&R r3MD h,⯸bᒖ\nPLoōO,V5fH$&/z"D`2Q^dxUXDȵT\ xbN1b+5`# J9\.#x2|dvl Z2&s>j-.j9T*c2-S@@Jqc(-DG2s +IE2۟$҆B]AP,ɠ?nk4 +SJG"j2|%>jK"Sx<r̀V>bsBeѨYBL<L%S"$^k ^Crd'd"|`,OV|c[5K6W,d3U᠝x{cK@ox] MQL&(:܉D*55#`8XhH/K4׿}Ǚ ^p[=|&v:*ǖ*4\1IZ-faԩy\4;v#2}L\nMS/]-NpkJŐI阏 V8s!qHP~ZL֙}"y>1 d2k/st* r,q;3쏧#>TlseLVh ıZ-oP? y)L7N0h/泸Xf!L ld`dW (ȈeaCo+E`4N'R!_fr.(7h7H$֓&xGm:CsO.I1i:`WJ4&p+N F-8Pf jpf/%0_X4p¦u/>jI + U!>]L q%Lds/&~20Xٰ C2K6T]1k[\hE3yK*/ "@.V2$PX($*ktDtɀE3=B6) 5fWuBp4Y]"דnQ*(q T,/ ”riV)oFʗ39M0QC`Ig +Յ b1DeJ%Qt12hTT!np4q7PU*-YO&[gvkACy.iya(%*LYT"&{ł j*:}R>G'SK\l\IPM&_JǫJAZXO2RX3a XU|:De0R \,z2Ml +9A#HZBbQe/}K4׿(&oܸr*4dpU>d3%">qwfľ\c3p,峛,DEBI&L*<ӘUt:c3`;ib{cr9|bG$BO$ B!yB/st(LTSesG*$H%+B>2)RJq"&D*GzdlwYȑt<,ƒiQKyj@ubUH,ϤpHod2MT$uXtľ HhАLESYUL6X=DD +PrUz_rl.Wy,}|(]h\>#Y3Y=k6KLձB1HmWlX DF5**%~'+"" +E7W +D3yKFJ)/mޏ=fao֊'6̯~"V3~΃#>L^;;Nf6dIK,>Y߬,BdbANSQp_0񾠵E3yKk.Z \S+dZ>SC#dZhZ?L-ZG4iѢEkf2-ZhLE#ɴhѢ~D3-Z֏h&ӢEdZhZ?Uh-~3 fZ^4 +}/yV,Ì[Z[| !!Bo~ĉcZ?~p:KEd8m6c5:.KTL3kt}Ν;Hٳg*NjYCfR+ +Rɭ6Ekj]uL}L&j5_ T9C`\3b2e2u:h,h<ڇV5%ŌJL&WylBRs8 RCE3-׸@1-UV24:R3{:c2_Nh0|Lj#U> K dq +%48`P:c"WTT0CBj.&rvk̓z9 G0ɸF ?%LvBj,߂S1/e|/#D,fswb' +rdR pE[^qYmі1`|h8ˢ1Y  H\./o?xtwIb%M?* 6 Lkd +z;Vቶvtܖh[wzimGkb.NO0ob "hb"ոPWaВ&Mdz@jL Rѓxtn <`pWb}ãCCC=]}p866vāSAcgV봚#$F suF*HK?%TCy[Y+é0 LB@VU/F)GQ*~d.%P_}j섑ᡁ7/E {+i\'OPNw+C,ֆ}(w&^iۙw_>n:ɭdpby>DĖ1c7}~ٳ4}>Lk`qثRheG2"8@vh !alNyp&S~GF;-$\d=621^o{t~O5C$IAL&S(R1ﶛ +QQ  +rF`13 6W@WՐ ?T8~eUĮ%bTBd0(qH eөt/?R.j~}N`O^Re=''?]SSukm8PuVk_w-۶m䚆~}=T拼hoZjwQRj{Nc/G/xN  Ka_,A`Ѫp2۱g.JB>Ś4ᲂw-b j : lD"Wv^"0zo Fq`c;u&G޾̖߳3v޿\LfknĎbX"HWU/xPHX.? ER#J& W~;D3LkNSd$Jv+ÑHBEЯ0Bd'nBk G 9{Ft;TRB.i}R̋&9lVL޲+ux|9hSwf ;:n^:isGOX0D o/۞["z:^xL&|ī·wnܼl bxMgJ֒Ą4*pO6`AU7_tkkuzr}NW*MOU((T˷^D"X,5Z2u8ɹ {JwspHM fwN oMRjA/xʑ`& 3Dh+mOn47n[/WmeVTÙw{{ZoE6 ˷wuuuv_-RV2w8򪳧ɽtеm޾ͷ"N5LܸqW/o\ɑR7C>OU?8[pLcoڤ6.ܸ v:N쭑 +W^mj={tìD/vvn}R{ǹgmwO\P"&lb|A-_Onlz)kFۃ4?O_-gf&ROhdymGΝ9sݽ\ڴ*]Nnb֞[-=ϯL=vyAV;'Ğkr[`_(A;kRO,?y|Ť gdL&IƝUiwn;S{z|rt:b8­=##;Z݅g8u̙=%9:vynv'5LLxQGOۣvtݿhRiJCcӓk|:J!vTBծ@|voWT[/nzqǮKzpuRAW}\jtMMݾrv&4:OFoܩ4^)-L˾jjjjBB_z`1č[2@~q'zRC/%D}90#^v'6n~訯;z`lvvc CoM5է<|n2md 3w k&37lDwo]R]}{?tn'kӷwm|әnFW9ڇ?R(m>t`19n8uPaU|̅Kz W~䩙ƣ;75Ef v>;14lҏ?-[j=mkk bsX[N>9e!Ҝ=737q$]] ߿;w=u33#A.>h9%e12SLZ,KV9[GvUJ l+pSSs`njh7Z^7רu#=Ye˳3$QQ‚S'wP U/m_ɕz\ձKwۂFppo+(Ptk|ЪPj FǍg=mj5* 7_ LBX/-3Y ӊ?E0yL+JH-nLN w6Mbw{=^q{\.Q.tfw7'%b)sE_0ri4jc4;E VOv?r=^æRb[΍Y  v=uc p~KǛ}J M{=Ʃ*#*R۠}>߲h0{y'O[m>*!\.za3+NOftPoO/v~ePML9٬s*7t5_s62Ҧ]WMZs֣}}=[Ck3t͛N߿7w,[vdM[}}=]ݽWx"ol +Y3!04ؿ7難v O̼{A+n LKɚ* _(f=Oxs*4yxf']I-_\KXlzt`<339d0~J&_lmm:cU zzZ.b*ky2+QL^v_ѩ[<* )`GJ0U5GiyߙU|.r|vzbGѾHkbž4\XPo_o>6;;-I5J$I$* |tQ)PҝmwTbE9\ы:_ЫUdדwBM5]\XћnDSbVZl@$M#3(nvk `l"Yo({\<"$Oz|. mj,O\y]Þ4Ԛsɶg`2tR&7^z9e#.?GRLGzdփKlJ qmӝelO4="a2*?Ha/YP#NCgo7CE?kRc(^J! ԍ FWlܻևW:fGU01}q`{9:,ue|0`d_= Xi3.Gz[]j Ql?vۙ]ي ysBTpk}3g{|F0NFJ"^xfzu|ҡͨ\jD&VGrq`Z=Zqa^І)I$5[?d*S* 'k|UiBuN!UcSo_>Jx +KpGl80T7v?n|X$*ÈxxO_n~ӛ1a63hžSߍLo>|Q=~~75^}sGJa&[tN5jwxlߪU]vjxߖ \ǤrŀU%Tv靓o7(ld&7Uq?n%LnlI1Wan=xt]kmf\3+޿,b&XݹSow\!kzr6-I85Xv74󇇇}"&K/q~֦܎c`g֭'/F_;ՈTi|`K(o=؝ԮgC0`GZ\`{vˋ RNZL>{‘mxUf2G+\;{Ɂ㭯S]}AǮ>{⣆3ך'H81&W~P]y>=20':_O7,z!+Gq$R%k$43oGc0z! Z`f@l0)AeR>@aLGb5BuODo`J]vq?3qt$_|%Uh0fab3\%UJcp9mL$/92Z\)I +Í=m7g +ÙdspG +,o׈!8&a +/_*_IUg!W3!,_Y(0L[|uQ2P-2 3kK0šW{l-6C&.YjYV-r;·_RFv>d*ee)&/}.e>_kUpdjCqQZG?^~^h*p^mgTjk}38231+ȯe&/)NofQj.L>p詯ɴVbrm-(VzpA=Nkp\ټc۷:1J}7b1TZRpMD=*fW-> ɷFhL' sW4 Ec|y\P#(ֺo?t%u.`hAEZ/tQ^;)eDHkJ}[Ϸ/ Zj- 9-{ei3m6?҃4iѢEkf2-ZhLE#ɴhѢ~D3-Z֏h&ӢEdZhZ?L-ZGi}RDH}Q>mO_o}~si}:/\|ɴhѢEdZhZ?L-ZG4iѢEkf2-ZhLE#ɴhѢ~D3-Z֏h&ӢEdZhZ?Z'L|Jyd-Zb٬ +"e1&C +A $296dOրGkR1Qo~oYKvЗ岘L61?#.d2!3Y8\6wkHp獱2I~q'p=0Y |w+** NRQOa2/g2;hZ*}N;a>cQIz.V4zm(&xm6c59NX^J ”JX-蒡gD\O6[㊞o<4*O0"dh*J&H;6ȇ8lP,0P +@H +TW/r|U.H@E Mz`P(&3 '.GCl:ٴͨs?|HZ~au+q"4'#!n6jydɿ~Fϖۊ,fWYȟ$rQ\._ Id A\dWVv_(&FѼ Ri4`r<)=\hU[~/4ѷo#LHߖ|`1*=ź8ZL6o DI8,{rb|ph䶸R=zr~bnz'`3%rܺ {^Bw܅pY6[<{lbblxxxtttllvoYVrcD&|<v*ZL& B8\.|D$P_(ZS*Zu/p4xІ4&LZ/$%CÑb\0(aJ+{Ί-$GfMPM)7p9B28JMFVkHT3O@E8TB|\l)$&Z`r,;,s|깅Da~@"+"SfRITHZ?ɝe&40YVZR-e2SeOO\cdr98 -R!KrD,"vOM͇I&D%X8L,:2̎,d.l&kX2w +Jgʕ%Riypf'Y۷T! @%,L*1%SչrY,,rD. w&uw>xb#}c3]1EùىEy˵מv>a@R1\^Lşdogň*]|. C./Fb|&:+u'pdR6Dۂ^Jҩx̤áyrE Te±^%d:_,jqW @UX(p# +>M%*C8@%"6mU &ñRk0|% R lvW2vX.qHktFbR?TC2TU/ X:NƢrj̮tyRL2ѫ1hCXd: +x +\ Fk,6GГ '3I +xkD$wzi"80.f2oUK%vyQ#}~3t0wsP:Lɦ'c=Uf|Ӧ,bl2.5Zp1ŒM{@MŽgN +΍m[w޼s>d5>tɃ%4A1Uaeش“6GXqޞRQYzP߳vuQWwwCWdw}G:uX&`XH)KvD<3'|UA4855TnER>(|mVH)5R˨偪d1qmqBUAA0u*[_gdrŠ,Ǵb EsHjsMӄ8|$e2-}nђbRuM1:j Ylq,UaNQȥEoqHo4BQ %b*"VO*Nl6[,+f +@(WAAoszKݨb1Yj(@>q:BuR.&dB*1ɼ<+˥2 $b2ZBa1ڜ~*9'rp nP*U/X4wtlÉ|:N8pi R)Qrw[u<믂>M$(00h5 \2V&F LWpMOGNxfŦó~jvt W337^rǘ !\ΡW48"Aux3*`dC7n`4CˑMfnu3Y"|'~1N1!`\|=YF';8&WT(R4 `Uf+8ݡldv峄ir. +`rUHD+ J]2\] %½ nMAՆD* nd2R!h6UWBMX# `\;l+ӈXĆcɨp|]HGkj6? fz"J_&2ELE|67m:@W .ÅCbIZlFBղͤ^%&399&)59j9swwV{y9=e:瞙x&L*lI^$R)RUrw۲e˶lImEVj.3|{%LQ,,BA! r\ίʉ+ɒM?E"{\6R}cdxۭ}U@Z66qXhM/;@fA l+G)w0- +Rͱ 5/^9F'Gϼ\gKg{\jSҋ(v„@K3XBuc Gok1ّ}GzǧgG>,qlKi8nL)p[ / ;'o߾N\p$+zLdv ' #T'C">&pqS$Db`xrrQN2AdxEC*_;;x^F!tdp$ݶ<8 M:RNf/2ep0g1 uyYu2Rm(S:)";Y`i1A6bIUX,gmE&s4I'u +"B% +rBSa| i{{nvuW>K8\njbkN1N8#Q\ui +I'[aMrlbEYp,[\NH$e)l=pcm7Ytpr-dy<47ai P,DʌT'_}:(`d y]h=pr]P-FOOO:4wܑg/"0&[8g2hiLatƂ^ZiɷeHӬ׬csPhɞPE9Yc̉b9 &HfΖEjSn<NykC5$?|>̐lI>[Y>+'uLtxၮRFugfƦ&\ ZKpjӳgS3]wmZ9'r-=/tt @Rky464^0 +}QP3ISꋺFNm̬"wöޞgkzt(6܍a"s$ufdžoV}\CcĎ^[wdEE~h E B/n`*A&f|M'G6$=P1O]xK$BB,R/1`bD$-m|D'S)o^d`6%dɵU.)m1|xRlPvՖzG'O%F9\YDuCqq6_( yk*`]2/ьe19|-WEroר|'~8pu#ߌZ{nKN0Tf\"J[[Rj 8aTDYN%SsWk @j fKY.%_Z(/"XḿK"Kpᘡ6&YQ7Y=|BxY!#ҲUuUd +o.]<\]T7eekb5z#y[LF=0Vg28Β(5Fog?Nh@~=2No.IG1HMJiL 6ٚYSrRk9zRQcg|{#@B֡']:TX|oMJn yYI"K>w>@NF~YCEN]{Gr4pBD@Mi4Ցр_?a۶m9|% +r2_whe_?7l<@-Q!>!NE ro`@ 97? dXw w2N!  @|' xI9⠓7q2o&7r2dP0S`4 +N<|W?Cؔ/Iw~ 4>c&2ކOԒi2C={#JY +1ӟm۶!;HA>X1'"opuTr5[\./˦ON|B3w2~9qa'~R'XGpmP*9yf3HY"W y;$9ٚ_Zq;jslFj5Q('}J +r +{9kXr6#77h4LM+~PHpʝob1?rc,6˹&RK%5BZ'D?Ddk8S(U2'֐ID_ ''a/ad?8GtKȎ{[$do$g&ںa ? +'i""W4 H4-5h~WOm"vB1x,,O]I>D6_jݜėxHunmy9VkZ_Tmao(ռ,Z4oܛi'{UpbF.R&NzcR}:^NHk^#"[р L;v2LDH c5++c.r_`^V;W!w6Z1q#id [xN+ђXzFbͩ]>A}9~qnHCQˮ +N_'uprN|?a߲&?MI Vƨy! X"@:KQzGbא8&os䥾PEGu?sx">VX[" \M*an8堝PP'R7eo18Y6\T*;̎//!blDJ~}c&&Q 89KBI{b&K(q<8('BbT$Z&_zًן02\eWDmuO^z1P+"˖j[^~z8L=b~8[| !ĦNN$8:(DawdLH\%!k i"IsmHĪJ_06%) Ro0t|.Ul6G,8KJtJYNaq,b[\8xr=G(s<_ (-q$6_t㱘-./tv;2!U(9{L`ʋ^",u+|^pf7SqE6Òe*q +,& yYשJa)ӮCUbhzg1h`>0!qWV.Jd*x }[2lꂪ +>JDm#N=eWV1>ޱe"ZYMZ6"6k+rXV|OQN'%pJgvȜ%E쬬"+{(_DV)ca-炟;ؚ_>808\A>Ö/H}panJQ'$;{O"Vd1)}dx/޾rp嵺uf݇۞ < gdDkW8{rmYcg{z;-='htTqZ@w^_G<<q+Ξ85>r3˵K+ ӻ]VZ&M-xҐpu#]{<+62>TE8Muqt2^D^Nc2g)DzPd:cJ"|Ke6zd=y s*D !{kfG.1+/| +:Uc#1f474q + Hb>AجfΐKs958z9@]bEq{^%(֙?f]¹uZe#pLd|0ҮTŗx4j+-cep jsz㑀Kݾ/()TmcP~"{_YFTB(^97,OByE",)Jl^eP#69`8.[&=\yшA! 4 .,9VWBkVL:O1Gben{>lZU-r"o0ZܢxըI לlυ@Q1¶p:uwKC<9z=G/V$\3=,`LG"&dwK/V/}udiNcp|lw_4xeqzn&mpreyezժ3YLK|POsGGLJ::/&l7IJ)-q_~'CqN +:%8'+r)n0MNM_ R1 +gZ y|\y{Y,e+JM0Ċ:sn4z#J*$E@(V`!ٹvw,z@&_% .h +).2 d".d(<\<w`fh +8j[9++1|G<Jm8Y5B+LUSe|.OcE9ɐhYI 7*%hDfbrƣ Uaj4[`2j5h$< 'x\VEO\]>E\f!TVB e.<Temx FR+j)ZMdb7 |PbLZc[!ञdv{ِ'Rq + =;W NJsL 7:p%ba"YjB*MdZ`0a/ur*!$~b`xN* G,ɷZFƻr^.{tn?\U +3itZ =H8'c=ƣF=8srrgb[AtߙKF:e2Y'z +6KpՆ{j}bR(n5ޫZŅO;>[x6uj_7 +Nt2l׻O]5no / z#ypEXdaL, ujvJwZՕ*8Y,${5:;P24P$ M.opWyyqٻ=HXN.1(B w%bu č Uϒ W녈Ԟa1*cdz`DG`w谖x(Hz:ΊA?[%&8S}oHɡhV +^HD+AMZ7 gX*qI'G~E 'l\(WCO,CL4Wp@8$%WlnD:+􆢎#8䚴 B #7:pYzb!.9{nlVbUfpQ+RJ'Ԑ,9d2OP'׶T,vh_s.Ե u"6MA'qd')'Ŋrw`h|C3&K,t:rrOǽKK.U.>M8g3U;oqt!oA'stL'{go2tY/9\#QK۞iӪ;T*9#ԫ\IM"Xd\ '>jR\k΍á@8/ ڄ!NN$ꓩ!ɺ&;[ j"@糙2eTH2YD\F){ԠƗ(pRTTNV +cN.F.>pY DI'uL'f&n|zC xAeZuQdNH$e)l=pcm7Ytpr-d/j͍vl 2#k4 + BQ2<}O,uL atʕY(P<{tdHٓ)O^:8^agpzi=KgOeѮF!j]ur>YKeИj$[pN8O7.,)Es p!1*YۘmЪ7QX,βX$77n:Q-mҾ:rUQ+JY%PuXجWy\L}b\*SD,-$S%6>r8JRN<7BHV6䕕s %!kL lP' : W\ 1yBY +'xN߬ mq2ğd(RVZX3]sxvW sIB> Yw)5fߧ-E2RB.uKxZӫsj`0 ┾:S~ Ks0P WU Zw9Y S|^,[B!U!Šۄߧa[x"p@PpKrROl-R5[LZ(].!ry|r/ҭ'#יYs24EUJ0W"Y:%p벋H6["%۶mӄ/fHq2Sn 0;R}g8l&)w $}"ZFF==4>77㶦!?z:;779:p'"Fɍo7MMOM] d2wb/ɀ?#SWcUN%dV? ZFpPwkN~qΝ;˯(Br L%()'J21ћF@ Ew525I I$bG뗐]`$xxPMvIpaK$"U$SV_y3#l'˺UdJ("3FbuKǼCJ6+%bX]M"Sܔ7|R\?']71<| tc7tjBj&K{%L@E2 >jG`Wi6ݳ\#G{s>W$ ; Em%x' Q5>K:9Aʦ ˯5HҀ@MhEE+\h!z'KVBsv6Eɔj1l y {D/pX ,MQ/ ߴc5,$OKI|譑Nl:x{L郳%'sÊmT5ۏup]M_O"6NF˩ogyv+E=YrLItk6=C?8fS~f @ :~S '#[t@NF 8$M@lqIgv2Ѐs@Nu4_7h@/k@Nu4_7h@/k@NuS;M}d2@@ n N0 //p,ۿۿ{70_(޵,wݶmKq2_w;~J'g.r򯏟8 O>/ر;wF!*..sӿRSH͖ p+8H$}YZZ&ztdV5;`0@p&apT͘B4:cc?+lL8kyD ~*0 +$_%?!qXhor?O0OVVh4L,t:믿^V'bg3ϟ?{|Hd#6eOzb뿈ɦU6}듍38)4؇g+]_hܘ1He+8 p2_\\o^\\t/\ݣ]k |ucINA*Kd2 +lpy>M~C6K~'uŪAP܃c, 8BMOz: Jiqs#CvP7+#ccu 2톈_ZLvqnܹxl78h9Е8(\F uҢҾ}FLCCW_}3tzv߫KNW-Xt8a[XzvK{ܙզѧ=tƮh_CtX(͖L;/VF3{*XwG LO>',oU~3Sd,](x~//=#` ͯc'gٵK ' scQ 8[A(۷={vnnntth4F?-'oYx>?=3t݅#.`ךGʂNGi{t+yȡxt&B3wƻm:Νif{xnC>Wn2=- Zg]3+,ύzmi_ =_TZ r&b2E]6&iihCU[ub͖L={p4NH@Vp2DdRΝ;߿Z6_>{=N.h-Ic7u?q(-<\yr=`3e 3}b6 +]6hD,C7̌{=M*+utI#do<_Z^Ymw;i+ѹ}LN೙>*cCÃUtr2xd!D"_2NҘǯ5~x$f?h1I9L b$[bdff`+whfGOW4?Rp3 E嗕{c5/FL&GwutL/)ppb6X/zxNgZggKsT4}xQ# cZ-q&$cB!H d&N3pΗe,N%E㋯^>y.ߒ¥8aOvkl ;U8wp%꽧Ez./0%kV֡+/^;Ƞ988=_q\Й/byJB[4axFkY2ٕ7''&6{l t񮮞ɉAN M0ZUqP@L,|jWM1Y#W:$ܬ`(HY]ya +4y;LO*3lgq^AN茟/-ķ,n>_u2d55Dæ'˔fI)NpJޠ & #Uܝ{`R uFR.fO&,L&R)cV_\'s׊o@J9NH2>!;ADrlR +5 a03rOPwcoϱV#|c k~wWb; +N%L9%y|.#Z @X{@ M'#9@ u@NF r2@lb뀜@ [d: '#9@ ?/!bs@?w@ {U Nꫯ? @ T I,h@?@ @ @ @ @ g7L&k`L ŏ%}G+՗/|H^qWT-fX . L&9lUg+g1 î;uM Lx| 1Fqɀ8 +bt +V2q&2ei|xƀXc%&Q2@E#*L>ZJf!e*t5s"T +l0?vT@ ?=o}nu,8mz2p|Bm__;A8! 8,-漒c';y-׀HS;(0ㄸ1a1/r .8YCO=K-2L[ˎ~["inBO3Rٜ"+?p}wty ߽ )}=x"\srK\YbYΑ-g٘vēg'v{hk! f-,u ^9&PXLN=qVM,^>NˠU/MLM,,)E.,.NMu5jdbS\o[Xy0O#3w'G&&'V*tfrc @ ~( ̟T\.O?ݶm[``1|{<K/^}=QaNս^pLm+_߽|OUbi@Ob.xD(\uad0]wg)L[W+gv0MW|rFj[y>y4J3 LZ >L@ ~J&hsT*aL&K~nucL\bjm\~zey'mC #z f&-OV_Ys~ɵK+-DYA' '_>&`o;yVL6gGW +oCJH9Y{p\1x Fpq}pO5qt+"\îQ=aZfz&) !L)32o^ҊG_?wHy\*kH',3'zl٪LguR d>dW勗KG#6ZF6ttnaIν9tGNF ?*[Ʉa\_oo_ʼnrO`<[VV; YnL ݽ{odYwu9xu_zo:4a望u#s/n,-M޻8pEJXo=Ϧ;99@qFcX,CN!bPq s.9}2Tjq01g#ke|-g+?zȞk%@8ϨZ\4:L]s/9X0 +!3gNQI:-q 6}^xfb8awV6F}yQNfwk< r3 0!I06'cɑx8Y]Ly$'$C-3>:ElM=U@]'\PqTՀ@ 5'GB#-oeANF r2@lb뀜@ [d: '#9@ [?s(EjNNx`dRh4Ǒo-d'|_~_?_|̌@ ~ l)'{+wƍG=~ݻǎD۶mi@"Nb@___/}{_+B +,F15onn|ISSS]]]GGX,_P@ +Nϟ?p;HXիWV_ZM\a [ eco֎,ѵqC8X*+5P+' W +N#`0r[G"^֭c233?2iGXd/ M{TrI<ܠ:%?LS;yIa,W8I !s `~8F ?UI8ܢ`oa+ț9e,!(//okk{ꪪݻܜ ZEK$*DFLRUU / ̄Xga[ j +N1\e$.p.LlϹ{MX[ZQ֒Jf),ԺtIX꟫xJoIW/1otOZ7!%dbP>ɤ`4!=sZܗǠ:Z]dæocRC=wJ L؛uIo/?1k1YL@e +׮cL6ocnPI)6|]' i $B~wh|}陞sl&ߐ2U 8grFRk׫.DdE"N>q!;vxP5@Z=O +z- &}|X2TJpp& 8a}kKp s>sO?N:c1jBIgX-b1Db1CI|6٥ K" $"H !5R+B:D"MIY1&]Y-ъIY`#8DIK%^[]bB$jlGLL%zYd9 Ě}%zBwe3nWp΍<*ԪǁM6JCL71?Rd(76d$JGf8Fckbl.5'§jĦdK@b08*:؏l IH.ݼi42ʥsy]c0BHK$%,dX,!8wp~5pBNOL7$e^XZy+Ϟi$]g{T9 x=}yafx_4:W>ULir'zRw`ok.-.^+J\L_zs~`{1Rk7p/3L_v؝}5ygJ-,QÓњ3}+z]Սݝw٢}SC'eTs9<=;XGgR%1 I;9%+z:5%zzyÅVl> +&K;}Ssh a@r}xF1?z>?ۡQDgf&=&CQR.hŃlW>R,v\>5Ԣ!'^?u~<|w`oY;<[Nfr5c+E{w5uM^?&(64ՇJm\8JJMKcFwЋ'bc/ޞv_dwWM y}./0s榆bԳg3wM?~,T9wv:<ّH1z]Bl'嵵ߡyH$w^P4I=Er]#o\+wMLFm:G9>7W7%|3m]j[H}fG]=kn۹#-xp[79}$l<:[T2t@o'`]'Pw['JAKP'ovXG'GAEMGs#=F\ni~$ĈM+ɓRHE +NNpE۷$h40pee%n6?dE1=##=#3zzn8yoQqsO>{decbnƓ7:/Ls2CovՂtcM"ͨ:S6\B{Hխ:>\q2o7zVM?Yi࡛O΁x&Rpr+2=;Q@Ye9 +QaXo]C{ǽ\uQpGc,"+'{;zD< q i@]k"oGƦr֜LV$#gg_>_y=`VXÃRNԷ>˦Lu28{ػ#Q~~8..'"ۿn̖%P{!/6`M)F&ysNt6_ˤ%/bl͇ýˣ-CU\q~iQ!3zԞ̝ md"jNA`]>EkNc=ZLLMѣW{\H+k[<,/=:y'&w㧮v5h*nu9<NtxxZZى,u̿;Nv8{{6e{Ok$W=mo,+/뙘>sam812uOnJqD>:y"tAl'cT*Aׯ_Pƍ𣩩+í\/OnrId"$PF3* ׋m\) ދq<}3I4}!3g73JX'{^L9x̤\=5Т Dgl +$^] j85}sGfmNέ25d6]hZvw<,y`idxac2\<3[]#OJ +N_o~B婞iCs3M$U\kThd4paϢ989P&PS33ugˋ*'^];W!3F:FXٽdx@u.8tc@yps?(hsʧ_^>\e2zƟ=8OQM]ԃ3wWN.=679o=_hP |Mv's$̻Cg~\e˫|5>ߵ޻Lmx82:-֎loyHPKʤRqgujnܹ =sMxf?HWKCˊ";FA$?bC)o>uN(H7v=ҽ'=lmYSw*՝ml].71 ߺtg t޷*3֎Ta>7-A>.,6['Ov/^X]]M򆀠ZK֮[*Xs5K$&)J"Z̹R$Euh4-IEbEʔLCaz|55e>X}Bu,M,㥐K2b?TrX)"UəZY C 4j$+s +Lfq FG,W=?C@^B9LIQVew;챆xFCf&ARLCRȤ1eJ4bb$'=IdZ>qskox^"k<7ox<@W[qn|?JG!g}N/Nz,ב$R&bp yH$IjZͯnaod(jVڂ'V|222 -q\hnW?py2(`k<^N;"<;;ۊtB֗A*JT( +$$P(H8ⷵ<Ŀf1q8& 25~;N[v"s2 ׺%-MSLsrrq2c%r{mHzs2HuMoEN$Un7Pt2'!IaYvݩ&⧂-Gnܮ9O~5-»iiiLx +4{ F: '1LdlKI  dМyDZT6,SC߮^*9yɫdXg^Vx\)ǔe˙'j8޴ػ=kdL #zXn7oApsa'oq +`XZ^ؾ7 8N5֎?7i?uw Gd2A&+M4$iioY]? JY))U+4Ja0 ڊDˇ99@y%۫`(DEB> 3S(VE\-\>˫4jڨ"~¦ XPPyyy dxx5I0ܽ-N0#brk!Ls3RذHJB7CPFC)NIU덖S,Kz>a.l.҂\&e VQjS]"H^AT(}JAr;dX  1FZ犅˛"!2%uj7Xݵre8k5lfAOiCƕ1Yfk83nɑ $+ 2%$R0T!VrMF|>s.IyL!{ViKdtx@x)eҡNJѐ2+S JѤʺ +d˶[6agGI?~F.9'_H`d\/bT(}zy2H' DŒA+HP(u0O&u1(DQg_} +@1tq saM*v {d\޺5B%!2h2b 8 M'1FG3u=٬›ٞմZ1[k:]ASӴ>kFT+ ~nyܛWs&$J+)0Y/]AC4wmuI)H|ּlM?_vsjn~jlpmP$yn~~fjjhp~Aq& 977?;=#BIit{N^mqW&7O2>=vUGc9's_<F^b V Jʊ ̔tDʕx eBʕT~Q PTR;fɇ4[OoدȘ\W&%2&TUYZ)YB魪"T"J, +xP5w-'[Ȅ` y<Hៜsd[PVf|Rz+V_Qҙɩv7;\&9FZ:{gf'?djSwfLJVZ:Z fg^-(61v%q'syM)V5ګkʂfW!d2њS^4j(DJ̥F +gq;&_O& +vaqQ[\]- TXLaK%2rEyYlqKyh?Pm5ZCqIe5zFrNN"d}\.!HaK :ٸ|!:S5: +,\=תWT{\ 7_;P]@o~Ѿwjztnir@]Uٹ3`ZZUqrȗ D#./8D֠Qӡ^-N(CFz|hwd[F>Vv툨N4a6n}# on Q&O@3--UFPgƎLL4:p~qipYk|ea7e' =ZZ?x^Ihow>a$ICGǂ좪K 4g:G<٦OWr +աKǺs y^M:%3,Q&]e2`))幔fAjlD,p5Z%^ eE +_Ͷ)W\P&7%\JW_ ׃OMO -͙jr {1ɑ["D|}077y^{/$nKa;cs7cdx +ffhtj:<.ea^ίTR'.7L Uyr;c}&KMK3* f '^?q_|j]KOOe_DU8!CMӇ.7 x`)z^Xc7\;Q+b. !ұߑA펓aRpNFwFp7K&F>{~PV:b;YM t_CBnNjͿZ:h$E(3';M gMtڒ}0A<}t|A,;Q\}hzah wƟyo/4=kv$9|yn2C:z쵩]yQs`XoUμwp}*<ҙK܊.4Y%%f xy3+7Tf8~= dj p:6ڭ9bJE8 +C(}Z`Yxk 6'sY +X $]LZ- 4htF[ "Z?y7Vy EUχƇ?XW(oZT|{j/ߤ=ʹء0~=;;yoo˽f dG[Z(*ʆiȏAŌ^ &۳ȓ{ܽҩ=>pt}:c QNH$P?;9̑ծEM\-]-SRx4;/eJW_sK~-?@đ+m..^i}=q NẊO>X?>㓠!'39 J +-A*+*^R&vOmm]IQ`56Z+**mZ*dZg,  E_6)TڲBB*Q5eUf34P"j:TiYͶ` E|p_䪈x<9ꯣG]YDRbpnd@. s"o#~tQP$U\{lvXd?~`_UsdKyV{/^WRޟr5A}wpV Ͼz*U8P[>y>;;73331>V~:|pdblO )qhժO\lk(UT~پ'=#G[R79޽jTy>n-Iz]Do,',=CS p\5_1N?}t4?Ġ~yMr +-Oz;4:-$Pf#kw u:6& +Z 4X`4[F*~=sX,j*f*.ʆ`߃L8Mj34h +Mp}@;pIEfd U:l]nyVbZPk&44urYtM,S 5gԕhL)fbxD C!3T0`])wkxYLjY1YUsrd -.垰"mqr0P`$I6 aQŪNo2 zF#l2fkK2Kt.! l&dU Qd%a0[].3ceyjwS0!}i'CP?D5;?CF2 +Bp@D* ՚OkdX @ r>95Dv#na}ZYW}c3Ond(FG<[9n;Ngd!X|$s&VcͲhq XP@0GOɛSV $' 8aN Q͞?ȖH"dwx]Z'#89;ys| ^ pKq_ldmQF_99KI%9Gu'D%a8^zv~ɓ^[ݣ I2\5JfW[CES Lmvݩ_|Hr,cGYR0wo`v0)B|dNN oPۢwt>Eܻx\\pgsrT6ukCAW A$y@!#$(dA <A2 HBFI .8EAղ Bػ ɰB; CBػ IBFIW:A`A$y.'Aօ6F.d1 6CBػ IBFI6-8An +c+ H;B{ i-NF!#l 2li AJJZdNF#$Nzz_|AQNKD[WAOΫ6vKurBAIMMO !! +endstream +endobj + +1257 0 obj +87456 +endobj + +1258 0 obj +<> +stream +xu@UYySDPV%  4A ,JAJi0Ɖosν\T:s<8~^g?\pQ .\'&?GgLI-/1_ 9\W<(#͟`BEO ̟?oBD !1x + +JJ*())(,Y C7čўߋP0Z~9&zz::ZeK() o m!4a0C2` /g`dfaecgȰܐ6m\6f(fHy2kJ a!!~>\,L7Ͳ6 +F6ΚL3y W@HDt"yy9Yi) բ"B+8X!m*%q'KMqLAEMK(s]-!%+Fy5 M-mm mm-M kJI[ hR/,EUk֪imjfˑn'=2< Ղ+i.5_k~~_{g[)fFǽã%g?0|իׯzW/_LPSQ8+5!Fp FjR+8 a!$B׼)M"pf`[!$&N{ҧus12@ODȏcG{ښʊrcox95QZ6\ u9 C,AJKH{^>o="etL|+ԷXST^<> !y; +/DC"8=9>`t6V<{X_:fo}(H8bRGnBs]ϡx!?JNik1RB(B*Js/gS10~(ȹw #c};M7n{`_w{s]e1`q![sÍb,˩)-r_wNL_ s^XP@ڋV{a^0RfdTT߲;Rڦ1q>X'D]qsܽc# b$N% a1B5^t/XE* {11.pRYm`f{/f\rVay ?|ūDMbblda]+󰭹ZULtH)"HI"%i)$_Ỳy/P^ 30qpr JHyy9Y3TL\aϥщK/@8Ì CIȺ 3)&Wk98$$ed֐JAA^NVFZPR1x߾[ 濧LJlؐ@w[cUI^ڽ~.vi(J + 98,FǕ:Zu]V)T;š/, /i9Eu5ut6JGG[KS]m:EY)U+yWpqrpr_chqaIu-}CDΟylᾮgYI1/y0V98=5%k0s$$ , +`ef V磞 +gXIbf5^j:l502%^fa-56UBq \%!R1GWoƧT7 glM%y7ϝp6ޤ*Z,# '҈#) .$-%<<\ʕȴpyWPDLJNqM 2ٳ3᠝=6f;M tr֩o24/$AFAE3`c$t 7a] 2䂇˞[Hq`Y-)v&RtLHyJANVFz!Hiq|;BצgbX)&-^s. }s=᎔x +r?z;6hijjmbkqKcf?jlLo‡@XW<~[mZ*b"|+ŤTյuLܹk9512غYGc07~'PkaX_ŤT6hm71{173kj/s>^GmXnbc#A7j[:Gq}V8>º,?-ƕ36)IK(UwNs=`=L7k+iRLnj32r +S vu<~+o܎>!>>nLtC.9ua'{\y/QֈuO+pG ΟtڳK:5-]f6흏?uiB']86߮IcJ>Nxz#[S5=vO5^w{x +JMNJu+ZХ ==|._S\Є(k4_Mozu;띆[7nj|'NǪNC :ynf͵r<ȭ?5fW5^:[Mw9ߊ k2s>AK*IV{=)|^lMW/_~'.)1z k;kJr_>{+ss vNGݽ}/^E:EJN^sp~z̪?rTXk阇υ+7"&0_ +sC̒ =JKNeDe_/W}f+ q.&P,cdZl'}/ވOL-xkZZې>Rr/XcXʙʺpo5M@C=m I7/9w2|Aʣ̒0HM pzJR"- /us1٤*+ +P/[`W5YI-# +ղ*[L,m]NxG{WTVU70n;;{GOf=-aik./Al VNeƚ{wB.x١ P/]RM[I)Yw9|#xT6}ã7ox"{_bo3%g5l`XB\QU 1T$Pv5Ֆf=~};7ʬ\BGh?¿1^M{ܼBn&vzxSEj/~kwa= N-hz|tl;~Qi%-ۭy]=mjG@ae!^Xi32k]'aQaowWXaPx>^<ϑ7Hp0o "eX-!W#bʺfȷQv~ןHh^:3/ #kE xmf5/+׈870۱RXTBzn1ly~;Rx|k.߀h \?0$b%rU?Ly锓 "L4?zP%OTFE[ SrF™|bwMts7~d)~, ]-O2XCNaԾZE/4*)X,hBPy{ݓ@/GMJyiޱM/cW6Ξa1ɹ%5٫P抜l[/%@opbD Ao4r* nj~Y]k7m5)w.5ѐXt!dEYYY?0bV + pP|&*B + Kn6;v7(y. ! ʜ}5V^%/Ҧ!%ĈR/P4T6|hLJ4aw߳7Nڙ+IKHʼ?`M:j*!۬'w^eșƎ~4Y)WO޾EkZj!6|vm[6jWp~YOHHCUfuvbNY}{?uwWk =`@OWw6y#ıvv[N\-]g=e9$n6=q?odh6ԝ 7/wgenjjn{sM!H:B?q!G} U%99 M(iYwk;~GE5z_gS"\gu7W>N s򈳃lBSi!¯_wcjmcԌ\2YxF<~=4.dr8+1*슟YWCޛݍsz2ɶM$'clʛvtxANyC\d#a AkAW\ ?0C!r2SЫN< +`z"5۬ѐf^)akqŵm}qӅ ֕d&߿MzgTSUe%EsғGߺt#zCg=}vX붘;z]L~\3 1t uQ^fzjJJjzfN{s5 vhmij#IN|Ԭ't2Ed( 4L+DL^H.k4zb2}‚BU @GtO-p '-tro1槟UwPLZQM+8w~pw{KC]MuuMm}cK+|?3t4TB'W¬'qa^8=r Ca o$۞𿙘[=4z\d&6lokmmkG0C!@lO-ެ'عCa40ol`ֳt }T\nܻE CãgnG7q{ߙhEɕӆi4JJ۞W 1ܻ?( 5|1XƉ?ޟ~G1ɬ'oW=iCR/yFN)X$np!109 ExW@z-5Hg=]:zd/;#l:8/^),a#x:6Wbd=&.b27YO.¾t,98Q0)9zƤ?CzK'a=.{ +6鬧k[n}+YSbcw OȩhC"F&a=̷zgSEQvJ _w}+h(g5j`>rdjaM[sw5δ +s׃Jj}ez!%=ǁy?j؟!E` -uCeaF'- jN&U;ZtSXNsQ$=׿Ko #.MUOBN:Zj) p0P|U;ZvV)n2u,k{.t(LWKMinr̵ Vb K~Ex$!˴Z='>7L55`wk]Y^Jl@m~tF2 +ZV~`}` 79!^mw.ت&'uф]HVY;&^i*^;ql <㑄lrNyb3J2̝>>QĄ?nsZIAT/ +jBB&'4>9 ×[Pw&֑##3Mwkg\,6+&s3ǡd'DD8xo$Pގf 5"/"?4<$CN<<·Y'h߯'-y埝!oDo됡!]`.ϊv %C "]Nx;}45+7C %[o.?첰fd2jn%Ok&! @[ߣ[׉2^NZCHVh|nmy y)Y{ma-{׃3H6o4"?֏&3f!=I> 6Hy ,gSڸ;)5xL{8-I[cdɤB[d)3z= ӁY;N܄B,8 ;_?4 E蘹%uL;YЉ#7aK\? h܋)p I(j[9t+1oJnFn'F{>pnZFvI%m|MGg/K_Өs[_TFEK٠ȇ卝ؘp4 S0WXlYŵ#2Mf{ʹ8D5vq:y>vBfQUs>=Ei 4ȹYU7Z8@7uNM\?|㣤 )sK*oٱ안⪦~l<䤩s~Gms9 EA/K4#;HŴlr~Z~iMKg~5琻,&e4-'j9Mg.$eUַvNGP'M܌~z)<SP۲so{iyMC'_Oh NgPXsJ 63#/E'eV?8h!yYQBJZ]\[4pn4 +YaBVS=Y?RJHƖұp K*kZ98|'QAE!sMp~\[ԛ[XJE/4*)IU#п&3!'dp.˼|GH>DG/@8{$疠{&S*NM9aT3%dȐh$.յvMB_{±G̅hi"J&.AIeň mCc +Mz;+.b\gHJF6t|zAec{0tnUX% !GO98z*4y + ieec 6H 4Hog +M"tG]ؠNHC2a4 V wtz`t?#kCi^Mƚ&7Hl[XFu~aw +Г8hڎ !>.z$ C?K8%U6u=_WHW`KpvmQna^59_؁Tbd,B' J $7ouʅ+Vʩ[r')tMޚjT kV!ü{nu[/H*kAb {Fy;[J /_C捤c fޭ}oXܣ'5/5\]_u}Z ++h>81rȪ N-x=4749 N2-ۗ=6`hHӳK{\ӀEx9 Lޝrnu9xx!l Byx1߰̒:MA3j3#qYTaJc& nW`TJAճ zM  +Z&.D$7v īYГ y#hZ~h/44ig'mpA5l|rؾ:JU-c4A.&<9 SnzZv7.uRB3F1 +^1NaH׵<_$g@O ۛmfiOHW+RF`1=xs r[lˉ~t|x*^V:̻g0ojFn5:;z^J-!< _!=>߁lmF} y7iY$Y:{^vyޯs/Ƈ+ S6FJ  ?Xn*zUd[Uz)\ sn 5TjkMCQB ᴛzÄLbV~7 M@x\]}ޝ[Ћ?8_j^tfe;Lr߱_w&VsAOMshO^$Аm+IDr1#u2|4TKЄ dQX&\}xr0~߃&QІIʛ{& ?&;;ʲ"O4ݢ*^8^chC+)ll@G}IFܵk+ה?vI[ҡg˭uNc/r4$mAF߮:C k.7Pvn5Yg ?=ǚ+rD\pg)IE>w.{ܵQi5 -O'" uϡvx4~È`߰sM j|5E7l]x|8+-'7~? ;ANTw|:̾gx=xɏ#BPF]=` d3u|5^G jؐ*Gm#`Ԛ=xm",F+ewI{@"9'ˌ =beR/`{Hp8"tu6# vGߥHO\w-ӒFz+rX0zK 6Zo3Ty 5uyp'2[cJIjɏ$t&-kg\,9(>;E?U~lJ<=֏GF"5-Js~#uݽg11HBᮆG1`ޡ%/vԟ7ANyS87,.Yq!p*'d>ZXwd -}Ϟ&\?{d+'!E5~/7ߛ,cmՏ#|Zo]'i7iD&C]iQO#۬O%M)$gyփv|^9 +I'6+= YAv:~ +ix6#SR?\K~q% Iy\و 0QۮyfZ;Cq䣯i,)-"A:a8>U4at-="V53M_{OehZ;qщC5kSC@\I%uG8krд32WxFƏ^P2ilaT1u)">oxk<'M{';j9$ETL\B*50 mCc5X,RԿ_LE-,_^3|>O6WdLJ8mRi/@qM-}50Z a rERs2-1,j#k' עfW7wA:2zG^B7YspBzނ%(jemC+!YO` +>]X/oLÄzd}i,$ ,N(Bv[s(ޖʜagYnQ=\펟z>D OFтuBM2kKHQ/FPQjj{ʭO[^s*@{maLk +qS-D`_) ۉ٥um}#[D ;9="s#6K oe}2==ie"˷+[mT֡u ֐I~5W޸ fE3-a.E94 {e9yP2%- Ϫ5؋y8qbV{]`og-k~!hcB +ļJ +'=Wjn ~s ]HA̳ZQgW=s96$޵OaH[ꭓgf'=o!%+fsG"z|?='BGվ]Cs&Z +Lp<ׄ4֒nr! 6G΅g6x9:fH ў_vlB$f˴'/Jڂ/s%kǽ$u5aH|RЏFbOc׵}D4\_ v5U%ݾ`y?_k/e0zMϥr|xwZL0:OӇ(},.e Vdcx>67)#lw(}uH̛M@j Dsoq}e9n]t0S x _%";)5knDƊއl 4E҅4,!(cS5wYЅ Ml|rؾ:J :Gwx)覧iw]'%HM=5THV$0o +BnzdEMǦ+\+(6k݅` +Gx8Z˯eüBzj`˙kp n_{O9[jc_y A_g}7"1w[кݻq锋5¯ !sÂ|^A#h/:ʒL4"=K x'c_bp_{ceAz| +ZERj_ڻIR˨rTZ12_0Po[C8F6٨"%LGx/Sy+Q2]4Dv֕  t1ƾz&!-I{H㳊qΖ0Og`4 cz4Гχzۛd'E;Y@/Y0ov@-r#=Z_Qp' +Cme"YH {.``\S׃ZJBpE~znDoЀn,zs飶f4%f4~F6"r RneyݹEMA x6A]oI8zV_Y06Y7kMr9hf4~5@w[cuIP# ʈ3P4~?aFgyd 3  =;%Exh(͟eФ5'vkNۯ^L@-uOrRo\:jgiQU^LbAOՑ;nFiC|U[p~χQŹ Qaθު,-P`խ}x4жGۛG1m-6WMd_fzm6G·.kšxF Vg`G{ښjα7/x١,87"$uTS]W"S +[{ =q_oa~`񬱦In:@GUA\87J^ce6t q_("dHy|txss}UiaN>'\[)Is,o`ߴ|*<=b?I" e26hnoi(L8ZlTZĹ1Me\"rꆻ wxJ{;]H$(W/'1kpNOsi7[zZ%Dx9m@i qM;NG$d!Cja&&ِPGiCeEycn^>~[U$Ws2 o^),aו;I hP@_߁I'.|bRlkA1g>{z{͍TH +p1- +ohC2dJ>2voxP {>O$zȷd=u BytR\_SY`tp:y;=5r&F.gPٴZl|_z׿[ʎ=SR!x4ζgM U)se_GYߤ"/r!v$aY p~-c0a2:>4>1 Y 'ԟs}/'F{:Z[je''ܽ0yu65ڢ^IV\ p7j8HCI*:Qymp~m:ojPW=$O=LFGO|MXOB.h#ͫ1 P(}R (?u=1LmT_ Z 6+Ɔf[F# īoB94ht $+BpB!_@hŪgp]~0!.vDՀsOu:| ' #, ޡPS-Ck'πwSuQX/H +{OGksC]mmm}cK[Wxf53" '^C{Kw6Tf&ݏy=jaG[Yk*a>nv(xNƍ& 5eP6vI)nz>ܗr*@ z:Z꫁U4>IY-ocW`?04*`4l)/aAy{q>dzey"+8XLxj +Q;F%fU6&p -:,kZR(+'b<6w3yhGSUqn!/r?~nC'g* +ySCMi4e-C+nO/inAB5~Ӿ((C}]g&,22*&>15q)d݇??3>+X3򣆺.$ǜQ`潰oEQfRLDlXm7ܪVQNr53fߝMj*$oawrʺ4^쏡 .s a5V>xw'<$+AnDK΄[Q/? +'OJ+k;zi{PwKuQfo7=LlR[$/-Jy"DΜI3?|?4~z^S^G`B{ +0+hk)+|we?S^g/\ YWHn7ge0Z񬡪hSSRe?.;G(Y%ѾڒΟtiEGc","ʴ|gLXhV}UiAVjb|lTT݄좧w+r"κ[تv +N6$*IPc38Wɩn4;u!VCh-CArxȈ wvHeޏ |^Kӝ;vYs8q|HGO009ハ_S_ vXqfׂ]YT586Sߐ [ bCϻ0ܸ^QF\TRYF5 \3 jlP;Jieͭ8\ XT5v '^@)#A{e`~瑃6 6hn52}`zxӺ涮a3)чd!wC=`y(΃AU:{Z䃬YPgcY2c3#RRlLD=%rk6l2=tk>{R^]@ׯcF^ۋu rg -g܏ +{])QX` ڝ` ?clSyd@(7=k{-aW !Ie J)Q] 4%y9Xia,/^0XF%JFESoaBoML)M70pOLLNsFLɉ x&u;;}NOsq=ՔCTTTLRNYm>5!9O>&1x@y]hԄ!zuocia!ИԂYl_N!7Qfef"e4#PK2KȫjoiX|#G9U ͭ=}C## +02.z;[;GBc{ uՔdDyW +(m@Yr3&!%3IYU]cK{'|FF< .l[j- Zgv}G}.\ y7!9=+GKk[; ;z{hVEiqA^VÄ;Hϡ{̌펰†-f/ḼQ~96Pu/=r"\XH2YRF:8%™9 5 wYw8{104VdLć)iY923R&ޏxsomjZΰ@n X/Xh %yTp>w986x3s Tע8H3j= 8|O< +ض:U`#(n`}'(&ZԄi +=-O'߹io,JGIƔ!z"kAQIy5=]V:=q#cCw76:͈}N8oҰY~y.\J\%Vcv=vܽC d9y B4y9Y)܋;ژlP`eb``bPپ/lͶBA];wd0m`Xzb5 +270IO/\)$8(ʥ z{t=|p zgPh?cB (!J6}+ab=HJNI{0GiIFݹ,oO6f&6i[# |xO$Ҫz`RV5B;7Nܨ$˂L1@CԘ#`,*!VM[ws=]s;y봷iS'ݎqq@g*g3Kza&yV]}&kVX! 5͛[pjIyյ6m302پc.SLvnbdMOwJ2WbwvBip-RLJNqV,tp>|8@qagv[4O\-=Xh7_ᮑV9ot:uvbNY=bo{[kKGۛn^+)||o1[6εOPd44ut6"P۠Vi8]ŎQ,!AN!@-cyWIH+۠y+]DBckKs۶l,i_I`Ӌ/r^iOPü0|}4'/g+}598jtiB1S3s` @0sr +\%&!%-+'/ت‚ܜ,L Ύbz>g$D( i5lڼU3 P0ߺEWGKc,dlT7\HLJ~DE.%6_rFc%Bb +ʥԴtY9V  $"",$$dz; +-H>lj,6? x[BC=ue߱IERcΙ~{!B{Ʌ!7}C~0}@yBc$@P_ CvL$Zʲb܆'/ᄎ +_Nt?-Cλ0ݬ*-DC9QL6 +J*~9?t41g(Ƒ |DACx;%cnu)=+*u}Kw:E|u[aX]0:+X&@↼PPPRRA-B~Wxg݃hKD&DA3pl ;f j/\yHWv3|ht铬Ȑnͷ!fpSH y_D?-X02 ޝ3~c? 5H()[HA! P; J$N +^GZH[֕<;+b6oVf̹Q܀$h<? t>N?H DX!yq^K>VƛTV@s<>i +WnM/E +g`mu)JA6"-?bozo"=[Յ[qIX9{kGwoo8tG2+D"jHMef4m)R+4ulj\kD|El}3~^]ŃWwEv>/HzT. +;`u.Ӆ*Ysg߀rB3=?!^]+LU RNq!_ߺ =XR%kjV Njg\y5ivhbdHN~%F 6:l.#8Œ'#Sguaa jL9lC'?c`ċ0#2t8{frtlR5Vk0漢y6AV]N~iWS6v=]=P$R#o`pp]{wțUKKHL~j]?6Mwǁq$'>)53W(*^wUjwh+omU[Sy0'#%L~&NZ{֥r̜"q%kD +T$NOǘa贫Y]aFw@13iy¢bQ YgOr,-$Ӯ'|mz  8v^w$hwnNs.Œ;]@8;/(8$,>΍+/aGE0B|= '?aF쎈pg+3C4{ 9|g+DNdW7kz5Dw4H"+"ZJbJE>Gmv 9A[M["^+BXәDV {l(JDMq "aDѐxyW4g0c(0kJǗ6h'm Y¶.rW x +endstream +endobj + +1259 0 obj +23038 +endobj + +944 0 obj +<> +stream +x}KoWu~ZO3[2-ƒ<K$ԃV;W Y/Jn@ 2y)C]X$T|ڵk&l&l&lvw/v8oݝeM6dl'Ml/cusdM6upN1G? {#2M6dmHכy><^V{okCVw9uB&l7e0+\툚?F?G?z >g3ɅeM;IklblM=lXj/|Q#K*~L/wvrJ˝':hQ3F ̍]̓2h<g)@Ǯ27;I5>&4. +lv;v+ =~36H׿3WDg~ OUzt&9mr1:fnUZkxe2707376w1w4w7bM6푊dZE;.ϗYYI̅*ss3qQ;Q5nGߙjX/̎3;I?~q@U\6d-mTbWiiVmQc aC0H/X~$i҆۬B.qfEgLj*776w1w4w)Úa fN]5;l +rO\5N"&l[64fVTlO?yO0K*w zAT\BM @e3.q;r&ef{Qm +m ws!\U6D. <&>T a{sOͿ6;`v\ev=fWw ]-T?5)GsZP*..lmωAٞ3Z:X&=]$E-Ԝzs83==G!Epd6VKl=Jafmva^-[REM$D:Ute3EKk@Ay<_X&ܙԕ%0/#C;MQ*=D gy )#p &VnQP_j|wGƒA} լҮc&A^zr;)HieH۹Q e͐QE%(D)%%pׂk疽[)&YB9eoN:FS>Ju4HNHM]H{5^`ÒTZO'biCb ʗOu."K]x i:$RbWûk[MJ%:k@OO]ADIG$r5. V̋FES.l7wH׎eQX8+ ɑ\7~dovH{KmXpG*`.+ErO;f!r @ܗʛܓct*J [=w:20{PUjM +4"(*©z?LENLle^j o +jĔ/P 69/6NJ(=whk>NQd7TSgF*΋7Ru*sbox gK<&TQ`sćckwnr\˧ck)&4.-.! `bl9еjy, 6ׇ' G) ɥ<A)_"LrJh5~PC&h @'Pc.PP0A;_h*[̗ӊdOMN{&J|͊gi2?P!x=w\[zbim/RQ~*ƾvFI <>qc@gd1l>ɵ;v/.ݖ-pqͺgklؐqY.Ԕa8H'tZO)񟀳a.Fxv'Jjx[٤@ +f}Cb@G90oܜ^fpfOO8Wh0fiAɶۦb|?)vƮ CdNښWe865Z< u c]P#b \;3`]arM1䯐)`~&@٣agm¢hPyC=0%Lh-ǩaJ'$MvK≡~lרwWhC`1W'p=a8tt eLܔ8- iAґ.VmCd-lQoU!n_8ҋֆo!5n`ǞapF@8a+@!Dq~ZBU5銾\~2]*{7|p\);\Zִ:onF-ȵ;i<,,]Zȳȭ8;bu3Y;*k2$rpfxfPȏx'n - ϹwS ׃<>}Ky"l7y$bGFG[Tgkk|)ByQgh MY` +m +WFJD4`WiѕP~:* gMdL`} 'Ђ;nJ *X!NsKmm󳎲p엩`5hPh\ԃwObI !¿ݘR.yi܎!xCBKsN<$$LC;!sEq8@2$j"^\niW-3pDoS¥[@r2ޘwk2E8320ެ  q{uOk>qC F0gQ +3A+}pp/txfJFqܛ(ݸfe;j4iux YUOܴI4 g9FE%2CӚgIJ;1]IXQdM3ք4a%mЋOXTTZd utyrxrg&襠y +):W m3X) \z," >ja'ǔ\ep3uv0`3hHXOR sin s)'!eP&۵o_pIL)m-U(-O~댘K>/ C0"f10ycl }[q){$kӅ =/[16P4.ѱ/x!hy}Q1ig'7߭ٹ-}Mu4jדo^hgɦxfE#n`iV(vМ>^w-OiN ;NF!U2k}o69܊"۵nkL76EQ6`L@4(DH8;p{Ңm!Jz@`oc\XE\9F ک+ u#M5)a|TS9Tn o_SX/zv pS:91{Lτ381V'tc $d~5 TD ~j#蛣v]rlمg;J^.i}`'|.[ߖZreNk;4m&'{}|=-Ci[7FvRO= +[Xt{҂X!6=w}l6 y-UޝP²{݆n":Xlױ 3vltҷMm %~A `(c[ҳdXX'c Xz L[2n| {DqW%ŒF,O2Gfm4,D V 41ϚƁQjjEebiT;hlVУEMQA݌HKI +)V3eN-> Ȧ0z;!JwLڞsn_7(= )rsE{xH&<Kݧ>!m:mLI4~tr!C/.](}mv_F!L[{1AvCk\gu.9p!p>vy.I%Pi$Ž C/.87\HRj]7ў^ P +*{lFG} Wew +^.lCUگ@R]VK.;]Cv]ҿ7&6Hkk9\w#9MFd u[:9xv@¹gÖo%DoQ/\,D2ˁ =]ڨB{f ^Je߭y;WmppK@ n/(Qs /}m6$mg{1jgkUzWy{`Mߨy~r_xnՒ8cl cuM::)@YI8<5Mr,ih-ߑ jLxo=-}Sxo1 +۟ƽC۪H +d+? nN>`2Baǯ35Ar$nZfͷ !E?lDݬs/Cc0cOo~zvHvaa,E_ϸsHJ~bUK~7{;AH/!G뢷ym(a釿YeXэ\Wȝ](W5<' gx ǚ"kx\$ k QsWH>xxI{ކoʼn?ò9H,2 SzlvgN4)_~\OdR7[''-8pg/S0NVrOHU, +m}+#l"jL$39 b74vcEZOrp=[=O8Do>p@?I`BOɳU3v{|DBLI3C!{F XsFDo70{y[J~#?gVڠ_ ߗ; u2э mir|+lS9FCZ+y% aUrS}A3>RVy"<%r$(_Z(Lw=ǛqܚFZo k%ЅP bEJ=}WTf-CKdM!LK)ek[Hݮ(}ἯTU3>PKp=:zxk>ry{cM%L6׾ k d7w'z7)W[~+[Wv nи59X߲>E %A0.,3)պS*!rMo֍%m\M~u" #|>~feOf]} pB7y u?3Խ _ƅ뱎dtxYXN?. #' 'M{Ι)13lfum2% +&L*ojc0jʏOQVhTo n=X.u6_7/XGl˾U!{oj}Pd>u'a^=n7y>8d ]% +K4 +Qj[b +op>YgTh{2B&!&ωlZ6[%t.8Hosa+x`?C^yϨ90zֺq=[0J?/ؕmBio8%+L݌k'~ BDMLT˜;psΓެ_ -1S aAVw|\`~]8C"vk►}Vfjᇨ[x[pPDQ%<"? +hN>S05~-(?."joy/^J̜G;u}M ݃{0]|ih ]$60laTi,. +r;SqYj>MN:O? 6M)N e~4O-0fRSRХ6{}O@Anfq/l9f*IuK/ySLUlxf{Gqobtrgo"--?~-37iR W8  \xl5аt +K]PЫlG'c +rPC/^bm~YCr + 1B'l +<ɋ1yϜiL96g'$w+8ek%Kjg +aInX Jf'Svo#̽j:i B45S(w ̱)qj efA{\j0:)~EC=f)W;K9⡜9\y.V>JsKϒg]Ó?f*'~Sa"-lFI5#k fs]f ݌ Nge>&zxe}.ve|XW<ކ#.3vJ~ɂqIdp8TI4-45%RT?hBNu8pX+it12dN4M_dB{BS ]<-{g[u2z?g[KĖޝ Bgq-U#sLѪ`r"j5 +$lW/AN9.ܗrWxP<4xb%chZ|IJws:c)-\*4J6F- 3AL,K?Fq) ~/,ݑ(iIxU˲(`j"姬M)#4B3q8ᦰ5?»Z sX cVx4̴5 c\[ x8ϥ>@֊ 9־^} t3T3BV|fJ *eFυ?pDL,"2%G͘w#sլC;p.(;Da͓`_sVfs^(>k'hoP@p9I;L3\NBLI,m1ln8*)E;^q>Ч%uԓFmJLۑI[ +1\;9o R`pP^/'sh[sLF~J1!psT]6B=T:;X~JCoOUظk߆ W0[ޟpL \An,|DoS{-;]`,½~7T(ޮƣw6hx;}ܿ0*JmFp ӢrewL$uo kOs?pګ> 5}wqNW=[6AH1>ѿE8Rq:P= bv*}NZ]h-) +=뱃Tn(RD7%/R3"THZ4i@IQ)yROA0eFU=-!`u'T^4'/F:Pf˅=ډ5h&_GPWG>[+)L n`(nS .r16shR;iO󋛅ʹҮ%`G/mzY{P/2T}T۷&skӪ%ìk|wM{'@a|k79?]Əw +M +vgrkrg=}ƑH2ӧuVI|] ԎrOo2ʝ' 8)^kU )t>*f& +qf+Zz7 ʰAdWmT]֔.<χl>5FGƒm:(5khG/IESQC8k4,0)_˜Xz~ޞo|D3> N_}]\+ IpQ$@ʼP<R E3!'.| &UMJUQl/}2`WԢ4KܝJ +oH-(׮C>_YX=0.uv2e7:EsF-R'3t Lpj!ɋ`ON6;^i>f d` h[ \X {ݯ8$s?7Vdžy?m\O;'9X ]%hmr/:{)[C=0+$橜튰Uvʵ@ TFq эoc_Dƕ0m}حω0m;kRnŒa8C5V_MRt/W joI:v&Rx <ĥbMÐ7&ph n}J3U9nȼ0_%c/b @6 ) /"4=_ ŀR4=Q + F;( .b#f"5$|nM&3Ξ.CӴtKf_y.eL6Le.!FL{N](_l!{SՊ:9`uIА/x9O +; ,c,4dgB؜bvU^P0i۷o'òlRa(fU^_ n|5~a3 nB.nٓj($,ItNI6BܶL/z6 @.^i5B@ >tH#qh{6>MQǯ&F'~yMFF QnefL"kwGYr\V ;𛭟8,YgݸX`9nUϋ TVAV#NuvXNfRL5|$h5Xsb9‘(5@/tVN\/`'#(E`Y%pVWTChx/=?5OnCÉe{6~"y֩i )y&tTp2o/U@ !e<{R0P2nTlL1WUP?7O]kQ!p]9+wP6@ 6l$ypZ?~%%|w?'][{pr>U  x>uă\ Ou!$p'4*,/&YY<%'YՃIHOF?]4PTt1 )›v7dS +u([*kV:a;@ ppDP)waݍ͟U`Myr{kUO(WxZwT"r΢[(S{MRSH 3Y4;x="FRFDwI;' F5P$ɱ&t}{ xɛ~"Z7,(nk84(n>By2(ut=rێ-n'Ϣ*EV#2k'p) G=o +[1T :V2h1Xm'a9Ye{#M.O?ao@pQDDl + +o bY^Mkd3k|R4xO ˴|:) LziY[qYx|=(M n4Ejc3+܂&\>x= !"ο?.@螝*CmR:Sp+Iv~)6n&;AEJA|ZЩ î7Rw=X qkle4gޡpK s@ >nt{z +4턒>ըf{a{*J;ْ(\:%$>WE7B U^Pl7xRԪ]̔GreʷD)rט$,jnjMO'tjI)E0ۂa%]T8_ TD76N柬d#uT݆ͱ#fj GݣwK@ l-̶yhrQ 9Ie!ۏo8!=5_ԭ4,B_Ko7.\.oE-[L/ $rYNwI'೚aW#>yJǡAoFyhYXVE̾r6T?x_ۯ@M˹Nq8MYpѐD:y,J AxZKjjlRx8͝+UN'2E8!J@X+3W~A Yd c5!{Ljn0oa`)ߧ6ݰۜJRyˑkD--ֺ1yYO ll29`kAS3;R M&a7B<%J7h"NՍ+(q usw;GAn@p}tpDgU6j +6g W0ل+] j&&* +TJmX?n@p *lq`c/p tzx*Bn#Ř^4ܱ֍^n@pNݞ;v&'qv +L >(Ѭ!n&Px9nOFMJh--n)3LV:KaQ!L{Mbm*gZKI\xb(Mf0λ@JnSJkP@ }ۉa+, ::Cc3u`Χ.giRU5LW8DYw-~:īgu u ǀIZXm1OwJYާy=ާ# syv޻B*-d֝*j A@DygaZL@k0լˉ^Uo\G_P|gPރ`{sZwDMSP@ 5@Q4aVN4UC&BջJr{m`xNPx+8dIj!`2K^k. ۯڪ6V8ZT+=RxJߩNL'E ;ۥ]#:L^B^M^pUCǴvxW b+CXٍDVٛNWpb,GEZ$+!7>0TB  녷pߞA-3Ķƪ{T0f*ֺ?9u8 &8}*pSI$uHo_ ,@ U|`(Qv(.1m֎>)kÜijO/}6|}nz9ѿR# +5hɕt"z DxKi}tCsŊ neV/ܛNO&W8˔ystC0Vpr"(S:(8n { _ 29T@]gtL>}5̽q0o3Q¥:hl`x @ xp;&^-),x ~睵{m3ynj_)Rcs:-#Kf XHOs>0DN7'l ԇKURB޳N?1uodosH!Q^ Q><&}΢O_ n<\lNϕSpjT|>tN_Gy|ao;hI} +S4 pR[ l]h[2|İ* iw wW׭hV|2udod[[ \'^IM4L\9S{v"ԽMJn1kᆺ'z`H8\x~R.#`p<'Dk7zvRwI4mrR3s" +JOYg"{Rݥ ukєgF~o@pEp:]Ѩ6Uj./{z[f-]wq!8c%%FT^Ö^;UՏ!DMj|u{ > ~f};O^>7HaN74 ^ {K@ ++*Xxxy7ڥxM{:ON~/\K@p >ʑoSۼAK~ 5ug㢳k'/<>:D20(iJ+;f<0B]-8c~~^x6 >}l;I4S(; }])"+ a!j}I;4E<BS†59˼NeVW̱ۊ'l|vvm'`*>C8 i} M)%ٕH?[2lc'C +PeYl(\=ҷ:jvtk(氂v,S]٧΢*v;[ l1p]/l`Zv< S6Ii~֣2O|牾 +$c1{2*Vi>QHiT](;?,ۑ[ lJWlYKߎ)v _un})il:V}^I߮N$:~SIWõKn@DWv_ۍ`|}0Ly'W<]M氒{j>2aR~ -[I ڧ* T^Oa c?r;O0-94UwfM[CpI$nKB`PvQ2 sUiH%Ygo4J ts.&e1[lJgZU'&ݪ[)'9;!GI;VdS 0\8k 6ZjZGW8kY? +fvM)^p4;oY/18R'Fºωbn!^+jE9a~0{=f}RWLЇ: X6Edp@pS1HTLMxsoc-{ _ |4{d-(/{OAo  +R& Ppe'9vjMt7u4n2w9LspW;i@ F7)Bkm'eHћ1EB&k4ze\V^f²l'/ [熰w W-.; +\D)\:oL ǽC \ \'TNd\rwhQe>ZVkTgt1~m < %]kAF#p+u +G$zG,NbNf>IW) HǫYELTyP!s8<,,cF$_I@ 8ل9CQUf͸zuNp'9/4pAAOV>MP@ ziDAP6Uw%9 -4N<= ȿsH"bL4SpF'b'pR~ E(8qKv9Doh?^O@]Df}qY\ '1 ?KW3of2xڹKP`o;˨$->'›KJ;ry&5K&)VdM7Vl*py*:pDop/ ޿t +39'bڨb IYl_N6N}>ml*4zژV5 +'.!ao@pu\xPEYOn_o =&H(elΒn m9`r@,)ˆ0iRE".Xmlnz}QSͨhjhK#@ BG)CW=;7vY`%( ,+mX#Ybo +26w2AxN"e { ㇾ AM68-j`AK+!`ɋG['Tbah7.eDm@y raBܖi +oTv[uW/ ]ȗU*^B,g(p 0-^֪8?أ3T'| Ks*19Xq 5I*å~ z@ ;S4Nf2)R )݌Dlw}I6٫ޘ3D7I7 \흻N +o@.e3o|ne +( FU=XT=yRaͭ&\xlV61taN1RC̜ҫBw,?C+<=_.CecݍR&Yhwhr`/ـqzR &4`$rx5 +o!p@)A0KR<ӵ{JְXy|oL4-jU٬'$0.zas{&moi%˴P|)h&!T ju m,z=ͱiGxpW¥0{Su._Pap..Eh AѩLp.jr$[4Og\= œtr-UH-> ‘2*(#'h<`XIVYYjTP3LVlsmMh@vGPKLw]7ФD |$Jۯ9;s޶-);I0_LP3aCf&M"=TIW2wS"O no%L$wSn\ +06Q+=xk&6M̳K]}S`X +DJn@(- nM +8~W/cMR̈́6wbo=0UMӄNjpRj_@">t+u*SPw1U'*_!{{gs=kjܩYc6/ C V΃HK%H;i4cOJٻj efb4{}OG?o6ޮ1x/@O" +{;0ݚ°P .;XM+\8#oM&L݊{zM-M&oJ%\3~-f8Φ boE|s0 +{ ;tcG7ex1w QUvtv{1uD-&@ jx$.K2'P>N{N-³`ß_Cvn[ \Bގ5 kwNF@PW +3uondrKnIω@ +vB(5`PrUHt!hb0gUO˔wϥ[ |n.켶4`/9QLAMZ +Swe7.lԽ#}.Rަvk7F9y)۶j0SOhB[TK^n]M>+{Q24jO/}6;Mx +O2l2WW[d6]7{;ǐCв|vA9˽Y7z7r>o@Tlgo-eS4fxޏ.Ӑt6YLʗ_;}:X `c Hߠ@pvTl"c0/@}#00Ǯ6X44O0ZK(좗@ycVu8Ta{Q@I26@KXwbtS-[z;(@o4ul)x_*ߍc&>.&mKԝ( Q(iCDUwGbvBuo {nnᒤo2Raēv M"P` BBVc83]qր n^25œfK&__Q-ZhQy$}{S-p|Fighqo_p  +pїٖU~QjX%-P=WHぽa^hJqՎԓg0Ւ &k™'4y钼Cuf:Ou%.|눱URN-߸|ߝ9IyHcsWgBw 2Wj +*Ӆ)G)" +uvɨXb6\k_T叞|`]OlLǵDon3}w ;ԫ tx3 G&SkA%7L欹Sj,z-8(l<{.WjvՒ; 6+P ]BɃ +`=vh<[q!ߔ nU (7zGIѼT7D_ǡ]a>;>իrR Ar[*W+QKߟϿ<>ja~.VtKJ[W|Kߑ.,o %LAڶuQ]Du6'?ԙTP> ~=Y4/F{PrZxkFߙ~koRS݂]Rzr4}>`4~l=H07/ _\F_.y6N8iGf2.2~|ҳ2`ΏT]Ƞ ]% +XzyY3*ars%'PJK6Zty^#@+~b7w*:vmrYTfezR6͐Çw ,cƧO̜ӛiNƗwj$TrI;N-^w9Dܭ#-o[5_a-%{nv'' +XoM ;<[t=^]_ y{.3rkk!=]&: \DƔ/`KX'$T14zjڶ1,iJ(32fo w^SA}dHfUfT"%mVpީgL\|mAk6##َbv Hag,֮gM] ~/{0<2A)EWkjrg5<ٱZ_!XԤݑj%FQMާy!/ 'Gl ^fST"%m|b{s[wSW=G?v3}}Ym7_ /B:4qDcÆ2Ԗ\';_ س.]䎐Hk軜wٔls 0!͸e,Jn<5w|evu,C/1|@zz20t]h\D ؅jQEe25߲p!2\"Vweӗ.~}}J^<*ՈtQ/[q˛`biC):ZVj%)]9p56H%k>YcМ7u~۾ގx[lfw_ Ggiُ HMX2稆҅_Rs߲ܞFwEDO Hʈ,5z|R0+<}_U{4]ҹ +|KI[ZCU[2| M%}7 ')1vvӑ]}bxC4_=+Xy[Jޜ~'$07=|0]dSh\}{SeؤA0t1_Ҩ\R_ efS}+;>nx\p`WU ^bx;;x~Ewе8(6kmʶfptb }ÝemEZĸF_@h[RhЃ CtگsNi;~!SEُ2#<^ğN5+&-`cBbovL}B4TH[ls}{yH)gա4Ԑo6lpq?a4v:de@@Z|hQ z{Ml%PVHeG8дEsuKdS RGbާC%8 +/zCuNMh%N2Lm +#闥ZS+"yjYRDžC;x7 T!oF&Qm2Z8P$&]oAT@{}﯏6I$:5q ,/GL{sq n?ن@f0G 7Em @ePt]S0`4p$MH]qhs \Q:9@EP3 +רJv yGqG4pKJA9z- Vהz)>)YϋՍ[Ͻ"I'ɸW\ߏ(({= z@IuHJuzMnk텪E}Ce~}fOcbfjnZ)$?!޻o\BT ÛL2_OkeW#Wfೲ z >۶';{%y*b͗lq-VcMMg_}ZWOoV?_y vZ$|7RP|S^%!BRU+zV)X6)0PiD e~<~'p]l͉Uck)$M^3͇^lS+C6O<፞.ӎ.=.xxcov9V\!&X&zPò6![u4cшx Ƒhu"'Lf/)$ #B0lr/Τ}@@#oqi|_APȀU+WVS,*؅W:<-G+~rLJ|X!.kkr|SݞS#E0ιڲ]mMa^6mI3<:#9q vE9GխDJ/p?j=.{$k4 @Φ fdєnpJ)&F䓽(lslxTB9YFxhg"Ӷrxd׏)0N) #C2p9ǖ`!c`Foc0GlE!asmGbU12C':tYkKRʉjV @M SόɐLaҴeCҴ`':Q5VjEu9)54(PI>rҠrUv!}9_I#ky θ6iŞ[m03SwށOWEj6M_$7oW gz -JHwic"Џ*\JܑKn,"ÿhC e71WwdMpAOzGUYUlF&iDf~+@yR*Q[qp4$ +xJKcN\K[lCmO"P^5^ qTOCEBm|uXrMcrq +)th"WSwqs{‘Ӑ6ы>.F_Ka6E$o!b2TRl.DqY;E0EEhvl5peB୕%)SCFIU5Y[gιUHJ% +F|HZ}$]0AemȎh1-v =2ϾU+ވ5 ]\NDdYBfS +rC &%qh%GG(Z^[r;FN|=,_6=r W i5 +or ߔw + $閧;UpڈTI9Q-%n0ʱJOZt9q*R3 Z:mVWz2;-&P2P44}ɿ?f}hQ*za,^EݍsZaU$#> ^<: M 'tvچYIFLjXx:]؀ ͪ1@Vӈuru܏16PiZL =ЄIˉP{ۤK_ӹb\: +YD8*x3ptD Qxl Z)!K!z~$F[&/ob[*N0ylL!:zeCol~}ơEmuMӔGhVd; kK +nKqp$ؐe@WR*hUVYB0|֖3W3SN ܤzUΓ̺ p +n9p#s"+,^Dڈ%2X=1Y7{ctY8r"|)}3b+TQB^I%CRxp?e?֘Hu +Me/Ld.(|N8J ,YN7z֮%%:<~TILT hCعuwn<|1('A_S#_fon0`.. qD(4JQ0dQ蚽&ô %`ť Jێm'.hLtgTY&^Y4P6JwuQ5:#[nVZ|NdL?И4B|hjm]3i<13eZ5wpDކQ-sk*J4Z ï/%+f\4E6ɠ̸lAaMdtL-jy 5~-3M+qn۬)'1Zۂ۟>PILoKB]z^|_|EfLbQR(EoUhV*("AI0ё82Kpڬx_iS+pAV!X_d2[~鰰7N8|}|uG# ^Β2ջXK:Ƀ3JdIyqi-~mtaHz|ml[ +=!J)a0VD J)ʚj8u`}_}A17;NBANJ5mz5N8!_6bv)*~й,Ns)=]NQyN 1)2GIctiC+ZncY<qrɔ8&?z-m1@2laNݲH/^E.U\ "!2i?YI?KWwųo2}IJ-2000  ˿^թt22Jr5* )1Zw^Jx(lhK)f+Z(XuM(./sr]HɼWj\M6e^'38nv?>5a+\J<+\k]zh*ENJ4`;-Au jL 1z#mN@{ڴˠ:Y"7B؟ǤsqZ]`*\s8٬ܽ>u:44*Ly/{0)xgx'_J_O qd׌U@^aaѼZv*,[ıbbFic/H*wl̷6bIKmN\vmLO/XH=5D[2'c#r/mm#T6LU̧" ǨnŽ_:?d Z ].ד{gחOҽs;t]Jn߭`0N8Rf"HlWsըV0aZڅ;\$<#C]1FtLtnRg +N%XChIjmЛ[1)0&)ƕ~_t[:7K4wo{*[^Ѡ8`]׉R%8|mu8'j0.~y$VDžLwp h(rE˃훲r5Sx~;Tݣ!*[:qb'1r~wr~CҕvrhA Mm)b˿х/*&h-I`bޤަty˕p恜eކKciSzi zЏ-쁖B/bBi@{=Sɬ@|*u+0"CtCxUƏ18y-d 3[Q'؋/?RM öj%.RA)WeCװK0ymYZ +݌ާCaz|$nLd0?BZ!MG\R&.KTS秨'>-+A>w'R,wZqԌ6bY[ӵ8\)bE(k( Ǿ3g^ɜ9N. zp2҈ m9s_DZGFC}jE-_.ZqhxĤan{OdNke*K؅TqXǎ%6фCȒQSmPIF\ Z9Kx;Vs0HNw7r98^=܁חO0< ڀ1= u;o:l61\Ԍ#m4*銨)\|j!N^naQ/焮}=$I(mAqfdsg./xCd5Īͻ+E @!~_ h_e2Ux//O2 6x=1|b`CdBt9e۫.ʽoIzF!ǙGt0<됐n[+ tCˊn6f@6'=ٶUsu 7N^dˣ? pev:O~fGS&K2[#;\C} L!3KƙlWiCda3}7dqD_:1+n}D?_paF&K4S Cu`QЄl#4<,# \1S鞷1q-KAcyDᡈl&5;ttB *Yo:k&y @)+gPB6ǧ! &?+#XAyy;?f/tG_\AQQbRq\JFWx2 ;B9}mjZ.&?uƨn>5Ey=ũt*UH&RНY$0j+b~;>; BB-of'xNK0- +i-7j\p&!dG^-ZHpF㫗Ct?)ĮsEx䷈d}D8cX~Aw*F3Xl0s>d:?k( ^ Sb<^U2!8w0;muC|G^I}Tr?=@-)8%m)~\D@n0£.%A;qyҴ]{keT{T0:W,GHbP/fIj{ڛ +Pj!Dtrw^y_W7WIa_bC] %b 0x[PWOg3/ROr-`hƝzQ@n^fn'blDsw!P@IGãjfAL2tׇ~{ +-Q3pv|a޶a`#Iתؠުs3ǁT`|ƾK\Fҵ= ro;aJ ' V=D`Bw2;zV4 !&40pts ʉXܩxw6uԱ+#Nh +e[cD@bg!f]Vݵydh~C'mJ7НW^yk ,tɝ\ x'dPhn=\,;U\*lQwdB1|S eWRط+CB4Ə1b^НW^yY(O>xRAneB [yۆQY33{*Y/rx>{-5tss5H*-f7"J|儣Q)YNӯ ;'6e]^qS$vE&}N=YfnՋpX hxܥw䢋!Ӛ9}KKj6cR+f3rdAͲOzB}Qx+eھhM/vW? |ڜfܱNMo y>̅v3'œ څ6"m',\cVI'-zDZr +݁PW^y,7C(2R=Y>e;p6.XC{f~ýA4c]]A;Ԋ t#H-wZ[T*ЕűPM> kK>E7Ƽ+n%ep7 \BnCԝVp 6aQa#z[/?zdŃ/ +с}<#6σrfJ"wa +>WK+|*J+s Bʭ@?KG^¡I|r頕b8<.F.~,T[]nv9}q_3#| jI:O!c~{#"B}+^r C:T !`v_Ì~Qg=W- C5k ,z1sNTZb j}Xn]bu }^}sUvrnRI^y5z>a}plj+h]@oFAa 8lz?>WK:,c.nOyW^^᡻<mzc?ooA}7۽cGyW^r^'BFfmHnn z%3>~47AG+^vD$gø 7ǖ yW^bh| A/p}3yW^,-A/4$#v^y_+Y=+++d?_hA +endstream +endobj + +1260 0 obj +37793 +endobj + +1261 0 obj +<> +stream +xw@m_3̔i/ HCEB"eJl+Ҧ"Y<(Bs}xyz=<8\p7ig4m\gg _G h7QF~偄"#O9sΝ;o޼$3"9NH|~ ))!B~KIp!ł" Zp} ?㧤ZDMCKGGz% +p( 8d g`bfae~h@`, 8(0 )Q102sr.'JLLTDXH1/'; 3#-"ʅQ L׆kbBCr -=#3'7b!aQqI)Y9yE%eeLJ +r2RBy99ؘiiQRYY8D_*bjm]=5tuWk\$ &"HO/05\|bK5ViYk`dbjqfKK-@6]JC]MYa7+/"RQA J+Xo`l;vkg=vljl֪j2B1.71+ ,XOPlڊպk M-n߹]N~ &*"p™S.ݹuZm Uiq!>NVF|aa 5P,X}[@TJ^u}G\=\ +yAĔܼ¢LEy9ٙi)܏ tlj-kV+J/"pLf69!#725Fv;v=}R;Sӳrr+,.-ohjnimk~P_[]UQVZ\iVzr|l佐NvܵPw*rnS~6k$P0p.Y"LSN'x_~7̧E+k[::{z1twuv676T?/ ^Hmo2[TBhxv0|Ó#' 1s +IʩiX89y)VxL|JVnAIYUmCS x=}/^~=<<(ׯ_ ,45Vf"\zA;MFʲ ,v0rO8́%VT4 !UYgyÑF%e<-(-kjiEٿ}=$~-Yloi./-J {!rEį%~ټp%?NO Q4ʀQi;!ݏO~V\VUD??Da, :ښK +r2FtVV/fRϽ{=3E}'p@9He2-vV6^z <~A?Aq@`(~r8/+Qԝ ߳.woٰf(bXy(|* qs\ @LVe{ HZ 0??!"wo:Zk+JSE9}q6b H~dDFhf{YGx $@%!bdRXci;я -= @?Oa@P  y[^'fRIZ !͛F9XyὬD@'bRq ('25A\C4@%5 =#=68888x%hXw#aʓ|?޿}eOGK}ēw݁l[(%@G-j2H il&eW¬= aO +; 'Pe@ 1Qaa!!aQ i9 M;yݍI|VZU߂20& +G(@x5䠹iڣsN;6V]*!p26+̋if(,ݹ6Ocz4@:fV,(,&d5c6*+]onۅ7#s+@>@`G`4Dۛj^d' x-ƺ+dą;PNFfnNvV&h$kJ; 20 mBRJVZ=FO Quu&l IaYMS{O?dC`Z*Kr߸t昃FrҒKHJI.NZ0/H 1a<\h/+ҹ`I' "!TQU}%x M> Ó vp>*ҪQ@>H@@?x5\[Vx{Y \cbezLUI^VJBD\@=;6#kbHҿ#*ţg&14p ϋ]9vO`ff́ё޽qJV^qym "|zK2߻~Y?{2eyyy9zsMS]QF\b޿#*:9x`Of=Ox9{ѱ~xIzZPRQ֍dN(@vΖ򢜴7oܼ}74,"2 +xPj^7]ta'sMk(? ,*LsJZ p +(z{\v+42QxO> '9yIqa< O㶮>bV8u @04X '=QltdDDDTt̃ljɈ!~fyC6R_"쀆1?0 $.\k-x;S3s +K_9Vs CE%'```L(zyaޓLSRR3<}Z"ļ>JONs#1][6R[DK`O.9!3 YL`=w"bӟOs!@Deb$%i<Q^X\v6(-*}q'1'F:\tT 'ŀkS]5anfZ?WsҀ*}m{0PR^؆%N'?;Fư2+xP[V8"m5i!.&f<R <t 7C@b𰷫o(}֠FtcCEQvBuvm)Fj?MjS$P2q`w $=^#}Ğom +9/A=eh*~uj%l059b6i!2mͻz^ A@j oЃIi# `}%9/:lYR^' XJ0!5H (j1Ft/6)+Eu#v3i=d;7O"]8brYa.$& ;*l#@zK*[v?o&r«Aq㰀sGv.g1'_\n`opm3/f +B0*ʌ{〵 I2 + $V1p_07gAgSeAzM &q2.B?ANбp .QZn'.܉I.$On8 +&} eyQ6Q\Jώ/qt?DͻťT5`bȿ#`Po[ǡW=[FΎ/q dX <ҪZF[=s9$qf>7/{Z2vٻIOMJI.3p2 +|J6ގI~RTQd~3B(^t6%E=&  Sƚ2׼!ư:`Q1rtpajniuSG bx0 L kKn_:a$"<ԋ>;ey̞KHZUdWPأg/j[F3@"H ^v7WD].Og5oHR0w"v~IFV'.G<.lh) p#X xĪ׽, %DƘ25oPѱ+Z+8"!%  $=bkij"a8\>mzŒZQ69_ (jz baƃ~27Z3, L\B2ls301AЛx4W t6ܿyq۷Xl47߸Y._F\#A@L +:sޣ"+̠4'1'tۻa, y$ă0)P4ھ!3x? / |I77d'\捃]EBfn+ 8 I/oNCy:+$?s#ߕOgLl7;3-b?b<V۸ 1!GGplZFңаfLpQA^NF>; JZv:Iim[K<'aAc$Q&MMAFB #{ަ>@TnmN.߉,n~Ce!fǻ/$Ңgn\H_k}AH2}.oOͯhxC0!a hi*Kr78ilުe2p#dTr;Kfb emS##ARL@X + |: k޼NqڳdreY tQ΋hEVZs(&8 ï p0G_X\-yw;h=o4)_0pH/[wHLzAe3H +@fC01uïcrҚ7}ιuڽ|=MvC𹠈2xRI +K&B1?9ޏ3kRFܾwy:+dF +ԐSHvVSH<E<)}8\>歴if{7O27RWX"GX5EQJ9u#& +ߠ_gg׼W?IK smk5UZ5L 8H,yi/v[]̤}N;ei-Y+`_gasafq Y>Xk޺[ˋݏZjrS7k +@(xǡsA)*@< S(k = 2V<\9vv5JR¼Ȭݹ6V Vfۥ;KiljR_W{s 3)64g VY̴Ȑ_'595f ÞעS Zz^ +#B7An^'n5]./)Bhғ~k,.ߍM q~ DՖƅ߸|ڕ *1LvrT BKWY:w-: Z?xEjȞ7df~V;^nvo^*+>ك2W\Yg^W+xLS=o}O¯_:}n8?'b@ l;p&0*`8%_ o]tq6[BARy21 +Mw0n{E/Ⴏ✔lZJi  դF  7;Wqag¯ڳyǀޞ +]@fC1ŵ@`E+/Qߙ{iH s#'eZ!aϝ]o@[Ⱦc\=w~*0R!U-CoYtpBui^{]U߾;&`BZ6A@<7)0૿E~ƣ /WG+c-)AN&jIԉT v;~7xn8s42kw 3>`jeI~dGNdWֵ?u%01a*əՉvEx@y"Fȋ vK uҕ;^f u6U =Z 4p/a:QTA|f C =LWUJHDK'>h&2z0#kd9 뛭ԉhYR10 < 8Ġ"?-r4 NitHy BCHNsn߻ xrH| +8ue@Mfs +˯6%Bҳ־WUҌ!&V:L3/P +8E7ڝL(` :r=m3f@-gQEM#R k>#.$5řB.3Re·0r)Z8Dն"Y>λM59:1 =/ptG( HȪW-ϒ¯ߤ, FȩQ N EiAgo]&`@$rS@6BC`g}iփ 1X\+'=ʞ9dR!NwHvS@B6#Ab{͵Dk(`Op +MXbV]` ,IțIiE8d%$1+θ j = + +fhK#sL 2^#!HvuŬ4_">KXnюO0ѭvkb`*z:{oi6x#:V%ܽTSNM,=]@E#Yx%4! ^@VBþ֪+'6j+r1PM 0_@-$kytO6<ÿ#Qy&V$ (T;uN\vI@>Bκkgg:R xUVmwMܞS@6BH& ,)P0ʪjm; X->ꐜ4H8HCFm7 X_\N]dqO{qM]4R$ 4W> oٿ\*"r J*Xcfr>򆎾Wo9  MB^KX% +yuly>LVVߩKfE;TL +;akZ^rH^hh琻Op֞A|: )_U7V96xEdմ;UP^ x%3)(xAxEenrpS\ЎC@j +Ru=Sk^rK:z_BJ#yAr1"|&/ B@`c7m~BS@N"HїC%"|G&d׷vzOpLإbsEn]_@ 9XyD0|CW6=RHOdl>%- 2褜DH\8bm{ǿG@jy ietMw8u)~7h@B૊1n[l  k3"cHA)(z?~р<5iQNkT$/@P0p,Q2پOHt5- /|*,9D FaIciL&=MOu%}hR2C^Qy -.^95L5҉$; c +&.aYu}  B:Ԧ8>pq I +@fhـ.2HZ~ͧf +6>w7.kY lM \vw [NތM˯h! s:v # .|v]@JMo:!y Jz߆޷E_m4,b&;Ky^;=y +C6(:zTRC!8]06N|w18ʄc᧘вI(k>v!8:5dX!jdl3PcH *SxzWCr^w̅8.IND7$|V'惌֞oCr1 xq8ԉT>M E +V`Ʈ#LkZ,F?D@)ìX>Jj^; w!wo_"T$x YvT B LyV{<p4͋H@Dv鍙R0+뀬XAv):d. +@nXUxf? H8]PfՁ3̈́p\ߡt?ލ: + +2[LQl͇Yq%8,lkV."TQ憬_ o!pz7Q]u + V.N"^"0^սM~ ڪRhR0cH|@\^\1d*xחܺ~` i@R0uq5N+3VAA_GCy~Zm?6fzdE@fH9nR2F% ++" Ew>|RV:a͖}g+x󲧵9-:{r9Q^VzsM +ƤLEl9nxyq[+@٪S}=eOKUazM[֯TccX_AU^ -fW+ICf<;WK17٨&%HMֈ[HZ)ǀ̄\zz 9nAg:5 +OWq/rݤ"r! R '(d 0U :lέOS/:HCVnPfuR +Pв h<}։S@~" ?/Ea)cV~_yEcK}ry) 5j fG)": I^v(f>?6"St8[_GO,=$9lte&. >5*<_A\ΈV=p& _JšJ2(ufYg!Ț!|2i +&v0b 3]~>sÕ3^ %m]GGW6u 1`T 2k-.ݎ*icyЌ_I`4JA_[uArvD8&tLbH-"aflZ~Ec'q Cݫ֪gIOؚh ̞OI'ݸ&ר"7ᮯnB;H̀Tuv>UT܅c@.Br>fc! _NH'1 ?.n1 ]ox0akdQƄy,.^"1~0E8.+ɈL֪-~b1a>=b EMmG&1`P F_sQL@R%ZVNnףrJkZ^x\;.: +`Lu< +j&NA)U N܈NzZZ38!t}β DF|oKHZMg!s_`dI[}EZ [XfnŦ7vo(tWzɧ;XxDd:}n\fQuK -ŊP8`s>Y@E+t=G=#f fIܭlLLP(г!7c [{-fKd|@}S/Ǡŀbb &HQn9:;N Շ9XH~[Z@s)9s/fpxyv-6 j @#dP֤´蠳 K Mlg0zW 1Gbp +f1 r]vۤ,oabdDJAUk+1##3ƅ;W·R06fSWÓq +fϒ=]&ٔV@BfW#Dm#Œ +:Jvm(ʹ[+p5GO ߤ3sEس\x ,M< x%U!Ex8SEس^Wwv '.KР Ʉ[=3S@+:{pR sq3U|$ ZV;sCٲpFG9eM)$j*K<`RP&.u +QGBr]|&Kf>PokMQ惛.j~;[5IHDKIr_`l +p +f0޽n)yytF=5iAو0_;.L$֖>M rۼnRnIH  Pp V(=soxpjJAƃO G(/v?`&#Rܷx$?;!Lt `='! /Rbn^r?c 'd +Fvp#FLrlT.{iLF $&%oD7ڝlb)j[~lרˊbIQ@!,gfSBRW]-5vm_Tj&%F&U&}<~Z܃waP_gsu @VȉS-39Igl2+ wE#q6߅hRMU9I7/@h '%)@(/}xɲuV:mZ h0PQu @@`r( ZtG@C OFAWk]YA>ؘ#Nj G(F{O&U!-|zDyqa.af9IX$6!#<=C4 e1✔ػ]Mԗp0 01O`t ^ڠ +1֕Lt-F^Q# O АcE4V? +qv/L 'Bb%tGO^4tb/B0xd-uOczea"-J?%`+]^W- d#C9;ZT\" `xb ~ M݃op3"2@#wޭ&%L X2Q ?7Z+Kܼbj5YL &$$вKۺ?<)0>)2Ya$`>GLW*I 1,?g aS6} Н-"G!vm6V M\lxpmAyc}E4'|h(H'vTdDa4TA !Eխ8S#6d`eYfRlg]l6QacS<8BC!Y`ܯ>y^އaB`6B@oW[S-` +ax nn3GnF "fmh|T lm)GpÎMQ#`Bm[Eયtpt!.> PP]V9o24`*Ja2grJ=.@myӌ|θسt 4fOq4@1@̀]@JUo|hDz P$qLX7`@[]AJdf@%t#{q &E0F7}/r3E߻~PbL==|Hx-0^@S]U]>ؾ=V u5eyؙ@id?P H)"j!`=]-u%O  9vqV:*K%x9GJx{!C(|7h&hmn.Hy lNKu+|, 0+h {y=vvAGw5vTS)O#-dh2 Lyq~D us'۳}ju%YZ* ~ |bpdBvQec{SgOH SD@m?ɴ +F[ڛj+J sRb"ݼv缇'f4)J/fgG `3zvGWи`hv0y|z-лO3@e_g -NMxz+S·[̍VK q2QSR@`@ty;9E`v0yO~jhhիo޾c89(av1|y~vr\@]mmif #!FFaQ6jwͨǙϫ p]QMVH?8@@>%ΏAWR"aMxAG۝,LׯPSdcԆ0'F3b OpԜWH7~#WX(:Z[[:z'y "ߓ}G0q)(f@PQxN9l6\(DT H:0 0 1R^ef 2V50|ۏԨuѮOUUu-]}t&10!_I>1:03>߹@M@OKc$@DF:`: ap .Q7p̥O +jۺU9r6u(Y^^~aɋڦ&uԡ&@t1!ïyaaNgqa^.=͢ca@/.ceA Ӟ6AAA">fx_R^uI(@ g zZkJ_:f5Jr"y8٘ @60#P)0qʪj۸ikwc2J*U^#JHr1?F'i GED?O-zQU\qI.ޏO~Cc+ h8񝇄;ScPWSS]S(SF…gp~ :˖sB`I 09`bR\cy1'eUnH[vAd`?v+ra]%SswWoF=OJ|yYyEUuMMmP=&ZUU=/-.at=\9j^wƛ;v[a딠56;6tzPW[]Y @\tkW|vˤ9a39 |$_GP\Vy 8r>u/ƝظI)9O YӜԤGwCx"֛7C+ K+54ߺwc%(5 42tѧ{QZRT4;=%k~Ϟr9zng}>L{VV>5ݠ-f )mU Wɋ nmϞ3z3K=>s%ͻa1SR3H &:2AW}/9^“4W@t OaXK>+(*4TA`:UeIVFZrbwo]>{A=6;w;vpaz~yCTvCYy]f:*&o,@+(&%Bkf+}N{z߸ynhXDdTt} kttTdDX7o^z0x0́O?%)!a{C_:s]VLL̷8xߍ(nw4"oW{˵ek 3;z bQg7{y^r? 0((&W.z{?w}{vlݴp.4RS.Xb! +' +u L7[qqe- 3Ǐ ~-e gOذ^Okʕ ?pI|[P+ 3޹h y6j!, 3!-)#JGpFP]\N{x>C'\]=t`;odj^+Wlhw9s̝7r-pLq]{ ]{j뀆{#3b:B3']`Pg\UQnV㞁ak7qPgSeQ֣{g٘,។]&BXPRCSR[h;lvwptt`v͎,-7}vW'3o0zf6 C`Q'=x.f:~}/"O;j4t,WRLXXXl;g䵛"}Iآ(+>,Mka<ĵ "#cY7nliifM6]$/Czh+LBYH(,_e]v> p?LwﴶڲyZ]r8xEeTVmw1[w +>w]mo,~tr(fOZi~O@HTBJFNAIEM}Uut֐HOOWG[k+Tdu4u@U3:*(km0۸ya^;Ln]`~Քdąy9X`+ 6Xw5Gb,Sbp8SC"r a>pjZzFf6.B"bRҲKUH TVFJRBLDH`1/7|c]"~u!s!lƪzSR! Wi,_(Tz8rhXTk7x$WmF0"4!o1( /`cefj}$mhY%R2KU! 5Mӗ^"!.*,|iU|"S) 1g=M#{;\T 0:<"T4t L,l\\<$`gcea~ O h\sk¢Ke@?xPӑ[*>}/7;+ 4*9AZkU98򴤲{zې?-J"-kJ MY!H,,0300B1aB@OOG "G $ԸyDDF0!AsB ut:fҪZWnE'fb}o0$ yͳF[ۊ@LKII(͚5b 14wa…TPB> >ys@'CdЀ'@DM}:(~Ac +|ǥJۺ_~vHw+:[lq[K*:?CR𑈖;p@|$1Ws`] +J$`<_k7} M]O^  kG8fOnXO5q1:>ɃpYR,h+ri6QyHI8YA2t<}FάYoR|畛Q%uHmcVVvQ7x8@[rA~p,; ( #_F0SAMgc}Du7l{ڽؤgXHcV;Ѧ귄7++KeݶYlLK5e; ff 73e:3߷eX,TMpWBd痢h망X[=fE]ei~vplRt4qEMο33Y`[0H+7nbGƖmz5VVVEG췛TV}x&v!5=+f}g|n/K=H'$ݝH[丨A>g Y驧rſ\i:X+< +*:fb2*Mp=v䗔U64uVt8vv e|ϺEًyS *;208h,ߪYޒ):mVSZbLP,(.df} Y`(iY)@ AL1_~n{سYn&s ߗWHZ͓4\`zblx &+\NGl>{66ƌR ) j: 7Ofs#U/--u603-\R͊eRP~%4,9vGznabj̧~oOg͚ +=?b2#>{xH> +stream +xQnܺDў߃8 ݖIju*8;xo&w Չ,+L.F:\VB}R3opwPtu.>)r]X}:ԅ?Rn{ΝշxB]P uMK}m G]wWM݅|pyJ? q;.V _.Su^WN!QC ՟RR3K՟ RШ .vPbu GՏ8^+,~Yva1VUx]v=Ƿ\.[_nĻ慨9ꚼO+sgm^QwnЭ8Fݦ˫pVVu]I}++]JשwjqVdN}RO0P`uRr`Fu7U7VuPWEQtShS7Y\TDVW8V,W1vPw16QQ7Ol.lձnՁiil'QnoC쿥 .Zԕ:+_ln.\ +:OuU/<nzP'pw|`Qc"K=1^7uMo5xSgz K=` XYԃ`fQEE` 0so0s`0s`9`0 0Xs`E`0<E`0 99` _xg,Eaxg 0X?"0Xw_xgxxgxYO΁EؘEX-0`Kǫs`6Xd,N,ρE"l9<"9:|,Θ"9k9o,Z,E` "Q` "0X~ -QXE` E0 +  E0 + E0 +K ,QE`l,Õ`fv"iY("0$`&T-QE΁QJ=o xS/u X~C#:u$7U'HnթN]Rgp/uFZ]}:![W7w9ns\]O\]OYϩYϩV]OV]OV]OS3SOS3S3P]/cM믫M?R`uT&:?@!.?F".?F""?L$?R% +?X' +?^(>E*z>K+b>Q-J>W.2¾B1ꪾH3ꞾN4꒾T6ԑ̨F:tb̥nX?,>M<R_ StW}Kե;8שwNWJ[8E]pVV0u!*G}I Os[aS|K]wQ_ꎼ|"COԏB@[_ +xEjԕG0V?(`1uiq}[/N]K̢n#P?CWs#կ \P?R +uӰ;8K.~˹FO".uAWpsIQ P뫉 ÿDb>fR!(sH98V]{ +AQ_u!aB][}=յngu%NW+\Zݻ3oP;xPq\Vnԩ̫nIns,.#YP]ϩ?WpwVOG +endstream +endobj + +1263 0 obj +2565 +endobj + +1264 0 obj +<> +stream +x$g +endstream +endobj + +1265 0 obj +15 +endobj + +937 0 obj +<> +stream +x[KQo)+EA|Ph[jRې '3&\f--B$ĦI+&_fV3%Al^gyIrBfK$x6Mٽ0C8dYL&߃jShW͛KWuNV'ˍGaՂoϼ+>^PBCѵ!(^SK"QQAȝFʜ*Sw&r'R\!? Xŗ&GG%B +#`0@7PsGugxaY?G_ +G@6R8CsYش 䧞7\yZ{?Bnl@sYt0PGDIз϶Y+^v5;,<@7?>:)'Ì/Q $67i /O$I¦!M=kw;fP܉Ve#8RT*jVPzh#pWQ E;TM> +stream +x}PTU| +% +(Fhja29`:DX)P͠i8HQ(j žۏ[?{y} C<;Xc&Maeh~tTHVf_P%ʓnF#Yć G\=<~-ͻh3@tDŽe ^vN2"[2n4%n46aE5fCBnK"¹Y)pi`x#xOO9dE[DHst_ }z/!x@/PΨW6,dϱw1@2xF濪ՄfV܉ۜDBs,bf`[lgt`){o: +LTF1.pV3suG;P6JMTb6#oRXy_i B}Џy̯F6y1@X8S 7ÑOMR}"LՓibtti8͕o>TfŴX\זz$/oGi{/-`QߠEX]ſ|X/ 6  r +endstream +endobj + +1268 0 obj +1539 +endobj + +934 0 obj +<> +stream +xZyLgb@ۢx" +^BQ1I%Iw1Yӵ&d]Y, 0|sq3 G9dy2O>?r 37~vqqzLWqڵq~ +2A`ƍ7_^AQiYERa 2 !~ɩ#Gp!:55,B eʒ2?wccb;VPPh||tt4NT5U5.]>|؜'OLOR1*N6w(Uw +4 2C*h +Fh27utZz##]g%n(`Q' 6(T:jv9#.^/ڵ+%%eǎ۷o +d Za_ߴiXCݻwܹȄtYIkjjR8 TsSs308t:o߾|&''#;@BiӦ%A|ŸZۨT!;66>88! (R:_sm۰/6k3)Jk4a`C L6ۃ~̌N ]>R>0 #qtj֭yyyd0@ LzLkW144<11q…4hr YPF* Z-7o[|% LLmojjfEFF0@Bza*stp Qhji.@zz:Ro4A`&>:ZXXZEk|}>Ɣ &CLV)xn JnÇ  hXn'i~V>- +k!g?4LA+s?m~ll+!4ya cF^<#קh!0هhNb؍Ɓ\xJyQ'D|]d4AU*ԩ{tkhD& BШuI>PIH<ά<`(FAon)IMzMղe:e>u͜8q"ypCJ@D !S@UHl={`Ǒv.nQO0j⋂baFkeYۊNAbEHţnٲE6Ul ظq_\%Ԟ{ yh}}W^q\xazv:]J4b/16bGKhGS@&Q{1]0Gy|I X-Bm!EFV8e}]oѓLrlڣD3i(di_s,Ŀ+9#b:Zj:z*'Go_~xx)qaX;z2(^X{T2^N7M4>mL" |Dw"qd ԫZmcUVVqbbV62ҺaffN>`JqD 2)6] ȧxJ|bd$+-Mh4-5ocjkYfTmmݱbŊvBZxT,W Ͱrh aZb +%8 rA;+alWTל>qW_-%Lzkssr֭[? +Vtt4 +/ X2IJb`4эHơUA^f/8p!3!=]ŲM<0W LL-.T$%V,G$_`˳Xb8&1#\"իWtHavvuz,)͙p(ͦ'JJU"pM#w#Hoq@'yA[Fb C9 ʺO?U|,&嗕aaFkܹs!HhGU GjOG(oWTr/$uC(+^}U 6YZjX +^R *}PB~{MƎpmb޼2[DQ ]$1x©] NרTU;VaC!T, /C_}5441Ҹjժ96 L +V(4:/-OI +WpiU>`oQs]aÆL +ظqEN?* ++*z"y 7l7Î}hxO&/^ Y|֭Iĩgqq`T\\|yA`gzH/^"鬵( 3އH`4\λH'C*MH$&|?sf:~FRA-/j74r(u*VXU[ylNAhXd&RZY0C wNWJF`.WNNR *JQ<LJڻgE_ŇF0M ӽn`vY&~OAnn`nYZWN=? x(.)ѵVZ\V_\<õk.[,t{ +endstream +endobj + +1269 0 obj +2778 +endobj + +1270 0 obj +<> +stream +x1 gox ڥy +endstream +endobj + +1271 0 obj +232 +endobj + +766 0 obj +<> +stream +xXY?ݴwvv3r +"a41g ĀdPA$AP@A97iDctq{>ZUz뜷ϷSڰaCLtLRRJJjbTXpt|B腽\OMMI4"##3WaWܤ|:σkO{!_ ,cb/XTPB>A4LND$KDbg q)m*)*78Ps(!7%!@㎎&QE׾wCWaD"A|:vjge ,فo ;4dXLQF`5o% H :4Iztp`LNNdB:?&ܹ!|brR'<."Y<8 0*v1Ke2T*F)34] ЩT`9l:Q)L:M"+:pa9-HYVֱx#?ڷ#y,SQid%ܪU]9o b72Ȯ#_l'H޵GkY;*|5JU_ֆahV!~UOکjvb߸vq,]L'R|(~e֐c I8TUMC5VԣM>g*R^ C]| +$,Կ/sّ,EltqEvznb1Y!a7.,iu&"OGd#tuwz +[\PE8tBkEk/]=ZT[rM 532eR[UYQ/qQ{:4$Xo? W{JX>ZsSk+嬐+cQ}=7=:^w݌vYw';/uaLfqBH("9ò&_{ ?K>jmỦm6:[-BTXtd JɈ:^4:o=;# qt kɞG_@/+EaT6!!{ɂ7S#\rtrBpvc+p p$*r +q|2 ;tN{j1  Ug“ʩqXϺ ,ϤZ NLG`f]\ozu2u[3/t8s=U٧CnqJH{dT)xᅃȊ:ⴛngðFڧpO"<xK5gޤYVPl,}*|%^>1{yڥ9/Hb^!B角N 8PWUՃx#NUn[+x3<)&'FڞhuG=zB]UoBFܗ ]<5О52FJ,3_QQe7D 6b۽Jynݜ¢3kKȡ&E V/DDLP_#9ڛa!v7FkvO\2hp-α8Eș\bGzuyr~:pz +:X}szfYN5_|5`Vai^} 1=h,~F#~Meb/=|Dٌ=X~(r3# +͏ XzAlĬ/LkS Sebv}7eJXZ! 9;(bB9^_%}^'g=megc[-տ[ۯjzikQ6=]|@d܁6x1JT@rT;D.E. =AQ$_̫JaiU_,6@^"_|P;R m."& эs9dzZ$( pυRRVHd^Ѡ~涜uBӬ"y;6θԳ)TH(@3'p;bVw;E X?EhөJ&!A@,l[NQ;1QAl_hlH;_/[CHdP^[Q/>7'y9|.OZ=Ok=mhdlbfd`nc(]@:7@uiewO[ZvrNH<`$_ņCXX>둒 .61߿F[l!Ƴg[i8"!"Hĥkd> d0FNr*slgB*by3coշ5v?SzgC H%C7fmYNʱu3#yw}owmS3c ΄d?Κjd-fg21k}M~uK6—2 Jޕ}܅6nB WM3P6$d{.2qmH;s+2hҕy,r,r:w&qI ͮ|4``ḏMz{]Ndq&\ABB 42S/+Yںv_8Ѥ׃>kmnK:,mLR;[tFNЯ'CJ@% DX)E,*@ *KTI>Ջ*J&t 4ƌDG!Hit:$75uQW!QWb)/27r+FI g\WY3 Og"WPڛQdP Me AgϟX @ yl +Kc0"`f +$϶c蜥JN͉C--]n +?Vm%:xw\x06aZg FGDwЙV(6d]|v%ٞ7/a#W :}vs_b"JdL:?H<ېzɳLȘɫrOj@Gɳ}7Mnɥ"\| 74ݺW  $F1yd@E~Z:Ausrh\g 7э, + jr?'æ>\=FmdaIcta/eMe||Vy]7!:Afɳ్=xLfyb1g[O +B᧖g1| L WJ.ܑϸ%b +&W(߿@P0@8X djDCMwW~{p\a6@3gc:ȿvռ3o3COQ]:PWWAVGi獼nE!To'skҬB +XZ"X*z];W!7|, >m-o<,Gui]3EmV)]"#[[H}ÊDrB&I$'CC1($6q ;s)̖vs|)vE]ٺ} e2yP2&nʂ= }cX}7hk0liYVΝr"Ka#V;w /ﻜה]f-&H^ѷmWG+np~>F++N"GU;4k"l'M-mD +$hf\oz4!͐[!}5T;#&&5 ykʋ32S{Ř^7gP{kcBRp']k %5vtERGs,ncfh^֕wI&jׯ*xtpf6ڢ(Ɉ{[ ds{VIq] wEBJH.E <,R:\!P-=1E<@TX%$_wsiO!O$Ɵ(#)G6(dB5 )B\VeBwв Ϊ*f=E v51w\{ #B"*<_diiUMyY194H$ +2'cNT4".Y[{omgo qÄ=_|oH|r}U*Uww7JgksC}#sb\^jegbb|cuSぅӦk0%1[.=vZ3OA@O=47*;ĶFr..fYK;G$-6;߭A1 7S-9Vb]A34]##_} wA`B,n}}}G|?3,x "ՠ4gZ1`iŰcudʑBİ/,X(Hķw0_TpcT*Pd2) i˕2>i4y˪ >|,Xm!Y>Z >|O9 Oc|Vy::`D<|LTU*J)OJ2Igo)͟<1+/ai1{ؗIxypuJD+ +'2>S`t!/T'{yTfTefv{VMe|:ni3y"컗/wW50Dwidܷ >X_`lyS*Oac`梴&6G?htx-36FU|g{7wHptp2DOe|Nn"H(SnVwЅptpZK&2>S3뻼x<xD׷H$4l+ʑ<)x73[:(hilēhɐ௓HeX-|oٽ |ּWa4}:ϲku/'2>S><;1n 'W&2>S4yL&6NQd˧;l(c3F$o`Ǡ= {!lOo-x)g4, H K#bptld 'Po|7QIDL%QAw dĢilJoɳ=o^JT"`߰2}/SI޾st---,9k}[J}ƲU S?_k^Gl?mK4ec{_?}1M*'{qp)e$=e"N}ya Y*/X_~ːJ^]Xf{ + 6==akiajcUnGސ7q7q}N86Țwub[d7A0Z_oz[󼎭 ][(.|R:8{`rNIaikOEGL&(4qJ! +ecQBc &S"{x!F]H)-mFS)%6F$/J*p"JdrdT% +$# XD DV%HTer$~KE؃:&j|![-<.{g*p`,[qiGׄ籸|.G +!- 9luڋpĨsk4-uÂKJY8fEbfRp_seGve1`M +QrHNƋr) |'lP*Sp]p PHE|.[$\~ٍI5Ydڽ3 vH…8\Foz^Հ\rT& +L6)#-e%U giÁu02 9Fzi o^L6Vgtvq[qlos?6|`\UQqV$_ gns@poWK__wsmdѰaBYKvtd\[rLg}J +=ݔ&vn9`t3J ,mJ jSNf{;\.8֮ﵾfC.K&J..e93?ih5m^'lWe5E7/7[s}D2ˡ~xH֒oro~2ƧEv*sjmpFgBgG["Rܬ;cNf|y7/oh>3Xqyͷ?r;}os͈zlρb尪1?񐅙\5Zl95qۈ9=W,iʸ~dIy7Gjg=m<\I{Cc_`[NMO}3VPE-)%ž;j8fQ:9zg-y~0>urZ|JNMΙ{ xCug\{]7 HA:{v8m:sAJQ?,rbbϩc̬Q_,_^FFƖ9]-.β6:}q6 +$϶cCC |W 4IH"1_ftp7U)Yǵv0[)+m_t $3q;#L"<=VѢ~>XY1*%tPm\Bqq{O*ks/ 9ʢ2 q#`;ŸLCg1?:݇++nߝWh}X{6OBq+^SMs?{L>=/x0}:%cL?͌vޒ?%q* 1y>' k{E*F|q}ݭ~,H Cڪ =xμ>N}OBpKp]ٖ{bqQWW\ +LK^ݙlf,r8l!4_`'M4ݘR& bqn*/ɜfn / i=Xo _`pC%ָq3>i_z o?8 Y!lV˖Aʊ<7ɬlMPir~eQ ].JZoķk{ܣcR;ǻTt|weUcX0廟R]Y,v9|HzpmG]l{WLd6-/OK|,P{H~d6nH­jijZ嶿~yA;w^a9Y6s2YppO3Ĕz2Dņoٰ&E:H 8ąY8Xv .rÎ0خ?E Q5t{kU`nuGCRqNvqgҳl }p0ϡɳ|'ּ)akh,#/,Re=Q$tn`s:xM,[904q5:X|GF N:,ԕwIِgHG'WN'V@- x32&758@Iȇa$%߉79'5+}]LRI{o;}gdz/5-ܹW*B\K7^/ɭoI49wn/#kV7m8;mB' +%TKX8X){r.{{&>!][G!tAPmRZ_|"E+]H{&By54֝Z[ .ylnSM]Qٟrz &Zm(m4x0EnD +W&M[U_/l0 ȗц*=,f70gEn@$v*g;uiòx{["PC';S,|2:a\ u4u U%;ZW 4><;hO)q/bb 7?R݋J ?a]ת}9H)yxiꟶ9eʻ9:D4Z^XF]*Z7G353T?w=[::{$@ cg+{᠗e|3\gGcqя]՝7D+Y;$"6] 9{OeWKGM/= %VOa +gutu_eŅOB 5=aJRk,+[-;y#7VEp(k?,]zN~*"J AJgC_ohJNZ5נPٛK1s ҷx\2I}3V]WI(pT< " 5_ 9]<0Έ"*4)Cz]ybǩ')g>zzsۢq)QqZ;j᫱GfJyz)m.6N| +ZS/}H}tgA +p0 ˇK, &^߲$Gz;c ۰3Z_Ԍa>H}5;$LӘ|UXkh"-+8̰qS5:R:x#KΆ5C +H"IygRHB!Cw` zMOc}a`j\./[4aY"?w +*gWo˧ UfFj͸{;Q|Or8r괒>ZO嶬`3% +Ӟzmz9PnYCl=5揈"Jgݴ z$c߮v8r2Vk};)vs/}kYI[f |PuqOo/}TxL&]8CTf-7?x'-<2{9I: "Zfŏ +ٰ 4$<Ɉi3?gRhg8/b6NK~8TRgj1F燠clSO$!P~՛w3Gs"J߸8ώf{J8Ht⹳\OX!ђL-dXlreU-φ+#cMc"cdQTv-G.< ?}_1gחSfjOsIdʕ +Pf7=HhYmZK.qڣj,FƜF +$t u#0*YUiZ:Na=sI}+;u3'6C.mu1Ds;@8>$E4kJ;p-nJhk;m7t=9m l1R‹;3緰 Nw9z;5ɀ}HX8oJ)}c3S-M6|{c:hW+?Udhh(ɳ8􁾖A[ͳzlGt.9JTr)rRJ"!,bTT2{`r8$ +}Dx' +O$R?TJz2)"Rp&?0D{JTnH D XU}aћGcDH +ABDQj)%C$l/ R*ඏP1pPjN4U&H72]Sv+d +Y|#`o[y;CģbI?pQX"H9zԯ .1_PWTg`H$BiLPȽLzF(_2?F.Sj{E7A@;lxʳ &ݏjxYщ50ٌgA;6Le| yh H$ryB ƧP /MN:Iv^'3wnÃZo5&&&&&1k6cĆY@A:Z_ɡtxVSN?sNX0 1 i-3[յ4&ɪ)J'<۽) rv%_s&)tnxLu0:>u+D>` +'s^)4Bt@ g{Cy"P, -1͚ԢߘgJK jlx73pI)a3NMG95@Ag{ҙqQ;&2>S><۫EMe|g^?.d s-3X*% ./X!+L|f G?{tLU"P,F3![O$ߏIi|ه$ tv1h,#1 +=5O$C l 2~]YKZ9BGA >lCC[v0EK4:WS8D_`'T>y,Jz6, !>LGW~^o^>5` n//nxU2 VΎr^q*®'A .oڝ^7k~2u7hgⓚv""FRHRJ"3D"JxG4&bJN\6K^W%pɣRHTP)bbP@LI;{hyW:e3FR㖆FFIa çNX2Kl8^5U8tx$NJ|9-B\%wrwǮ>()~n>C{:?m%+y#O䵨j{wdæ|%$a[߃Wif^W +W=]8{0,Z3JɿiihlhecR#![/aӷd,AEL &D\x5jd#obtM9J#X7Y~JXTezȴvZ6=|iZ;Zչ1su\E9<# !J FH[n-+)b|*Y&=%$XKhS2*H`a4Z2hUgPl +`Y懢(g.'b =B&|^oo$woZ&81T:. {)G1yupX"|--R <|8%ZĐ*K?sC DXznF8UKں8 ([̏AaK{m>ߣc:hJ0"zĵs3 "%Qx_/ '蠼.ԥL$4<3J|l +SzfV>qюe|x[uܡl-ә|v!IEK)]JҬ*5'$_7_ƴ=/O\  t?zB S:!8"w~]s>oFl2~kqZhx)NiXmgZO9Y3ES,,':xϳ .+gn-sL'(Hbc`I8:&iav~`,~x;)s2Zӟvљ?{VE}=ϻa:&rP̣c9(,%AQ $s· ̮>wW׿n,w}Jnێ~ n@ 8QU|!iZXMnf+nv[c>O)eB%~BcxJU0b lzؼLNtַ eC{orNKg$C<.g'tP!Z{qt\zS$M'~=6vmH +_48v9/82y_qjmquFSHnjrc{C333ccѩnR잿[LkٞcUy_%k<-Qqccڋ.̀zrO8{Q`H-B"2AǏ@~hrJo.1=8ͣ #%'FJa$?e|@:x9,/$&MXta_i$K>dFLg:HBt0&0E'ۮzw 2J}jumC71<0:O5+^X +{f+L7lX’~6 uBNN/3ݢ~?1s5?YT?xݥ߁T /Wq[8Ny\#kcaQ]`k nB" 7dPm\^wg BG"XHht2mN)ß2Pލ=QGNuAEٞ2 >t]wILF&DRH"iP(P)dG~KRC4=\ \տ{%3 >MbHF$_#v@HB&Hr$Xo) #EP9p(/kF$TnH\Too\U+2PHXB( 2%(~N Gș7-8`CgclƀqŬ8\-h(JIlK>Z-t>i5^P&?tԨs[yω76 KU6?.i`5ǍoƴeW GZLTmVAGh3\od5ƒVjJ*ƽN9ݼS|'vTu&;;pϢv}eԑ)Mn/3F#.VE~ﱳ-HR[?qPS _yY"_ߚ-(+d菥 `tHhΙliuu>9AqGXsе;AS hrkBR.l,/)5Tbp:W;vZJvDRO{ZǗ(RE:OڛȬ%`PX_Q\V\N4J1q-`[u F$!gqxBͪeY| +$B|mSk}[H:_4f(VuûZhBdɸ-ՙ;)־6V&ǡPZjmpI8D˥8<_EϴC Ph+C)HM15@"rHvA8 N¡l4 +6#U,oN%C%L:`vaЮ>O8*e"BScșUީ+PFO>x Tm A3d}V"I=+nŮ8H#`>zN +[֘bPW]=H*Ǯ߶a-:!o#+9U{wlxt4 vԳ3pp޶|S{g~H>9KWi9叏찴s?zQ _snxvl߻j^^80~{X3z.0eۨ*XŔ]qeH^w쭵'ץpQKF]߳}Y1,zyfV+FKk-ۏkTO<crO}AOx˛~)Y֐}1_EW_ٵl4xxjƛ8yoZ뽷d(A+ɾxfڣbvvYnPpYZ[/9w~tx{{[]<Ìf@h+|V||]$og}g{bSRO2~ѝ?3*N#gˆBbK6_O\ue҇xdskڹbLۀlQӄ;\Y'=dd cSں]YhI?`ԟc6ۘLJo\zwB)_߬ۓGa68Kp~w>AK n_HR35я S^{ z%\qtBɈ~%8ԃ+dyUӧ<-k~5IAQpŞws&˗Z4*IP#LRケ8y^wd9V|񭧽bYJU YQn/;FhmF8R[ Qss,uf/J%c_Efn޼tәhWQ +݁? 2bܘ>5"owr -Xf^1źȽiC(b]u3ęN2q}l YOZuscJonJ;7~ḟ_6Qus> P밤w-6D|FxQ7>>C !T+aK +ח{ǿ(d +Eqx-報avޯT8llsOa L v>GХ뿙T󜿿E5'}C9Nvة]gP}'<0Ǭwih1f|%N3TP^K{r-y&"Im'`JAQ)M,z݄1O%0\uX<O rI,k$8qn/1޲?/!_+[]g$cOb1D2jbsii~+nH$RK#xn:݀!gE;>'o=eߡ +T§56Vm-nqk=1ID+:҄=3,%혊6-#pʣ&ZCn#J2?Q :i''I-avqaa >eɅ]gFɇ1-T0( + |=Ҫiym;K"f]=8%U: e˸ Bs+ +* 'wǴPڛZ1Dbl-3"*.+}nī#;ӶfI?#tؠ} +?g1 {bշ 6%ۇӓ=E^D>6;YۥGJ{q^X6Fi-OXMڪ{ͮgVxx/?>{9>*k=S=qž$(QUON)}LuCu9|χ'~yXY|T:z8C].:~z~y +AwG-O:,/etT7.-9?x3j1#ʡAP +PTt*ϫ!N_|10blѡ *ysw/vTya}F~\gޙxT+%M)sqʕkFGDFZNCuQ[Np#*??z*6='~mVXJ$Ϋyo [LhorY δbU.֫cp+챤]F6x##/_8wjΌF*5iS۰eG+vpW)A>Q`ldf렢"dOhVYvtӼK_zd(v~\aؼ*"^[?eׂ_ fou Mzspsլ'߹}BA Z9l閧^Q>fo^@|FnA:ļvѣu͌6>|nԂ+OzqΜw&1upj@ͨkdRN:~{tYz9*:K/ܫfahc`Gp*\̪"MmQhD?K&3Bv12+@?419[ǟ( $ >֟Gl|T `lRLQK(&:]X֣]3t=Мyjb}:"|霍(rf'+؋fF*޻#23WovӾugFQ-=}&#ᮠcкY?S+M p>0h" +'֥p@[~`"#/֘yjDW9unz-tpbr5sor3j{h4QkA1$S7så*,z˼|k^_ݙV&>fGsH$"ЙxFiq%k+ 5 4K=?=/ wk>AK wЕ4G^rɋzcɒ!!ZHkdà "hS<1~0 ?1ʹCo<){Yރɫ~Q*Я)3Ξ =CB5a`rz&ŕ A}'M "#w9L ڜEX\>knEl֎.pϯTJ#DswWz 7x3 ͍`Դ8'4z*]|s̊/LLB\ P ]PKmMOcլj)?{Ҧ]}(zAƛaG:7?\.HuÇsV:ޝw̾n0\6q Qy|B5!f :7xoeqKgH;oy-(.bj_O[ VM.Ov5L>rU𪔩ذ';!!gb9I;[::_]pA G`t]E=:A-ej23jas{= +IG8l:ItS_2ŹqtՖs"Ma8]-sHc S&vq"Z= Tuo[ru) 514-@o,vsPp +xҳ$x^-{qY)H%k$'Si\> ĺέ +  ^Z_nE1P>g1q3idE:i~JfH}||,ut6nu~Dn#/T=s:xl^e湓F\o B +[tJj-evV6P)uiR`7˘[^@rJ *!08Үk/wSr)nh5Ȗ)c]7|lːG,q= jۿ[*\GtVUp$bDK]K/'`ߏ`"vOJn'xy +MSXag& +baFF]++ζ뷰ZznWsL+!?gj6kay+Uo>,\}N031;z'ݬnHt^@8k;y2셷 KM f'-K-ķ]) :mT4/W=vfj Olus4M{3םJ&gZCytF]+mBZN+Th]7ygY +CT+V[:WZ)5;n^΀V~(zep2JZrQF%+~qdFcsS|H 7/26XGR +z܊!\Ys"64Y8 ɉdaafd`8~DZQ + O;onހh_OU6PM׬O7!zBJiɑkEE)FiqRj!eӪƦNךL+NB N- 1pR]'%f{fY[nl;\6V~+lY_fo9cYztu]x-]߶I-n.jbQqdq4 6fY[[;:X,?wfF+=3ɞyMX}2*VW fy2mre5w^(/3Π®75Ue3 +0S@o̢h~(yCRj8zZjɃ+;X6*6cp$_U4dΝRjgc N1y22U: ɽnn̅kP]tlǞu3,S>6WZU󍓝t\dUhk=EyK:(ݴ[Nv3k$b?@RpLӶ%CWz"R)1xj1Fg)- Jh1(E<%P+,: BgwA&gX|GPMH؟~t3^1TI*[0B.8 W&liyk \1LkS"6NRq,>P9*M\p6;.:AjO>C2>pB̢y}P9,J%Xw ]w}C.P~t9]F%ۋ=&mTj6#xmZBfid\,n)Bh`pq 㪹|Ju*|H13]_dۣ16rXkaPRŐ +{pNtRK^y"S0|Qq:(O߃Gb$PF$$̏8|hd\RO{ψ/J3 +3))BX('Bhl]-tq'Ү]~zb&: > Hcsm-T4z6xcIUCQ`Hq~|AACI:AWtPg۫H(9:(lVH6{FJ1sA'>7tQ΁;7MYCϲ8|PHv7T?]tDtmgXT|Qzye7;Dy+D%r=WwoنHDR)O"G_O@I|Qquk_N?*x^^wiD7*~+&' ^J@ d1(D4o|n:h_íB EžAcP4uJ~F { o>CFF(M,tpdccfԍYiobdt~wuY@Qƀ75i+߻F忄J.΋8:e(W9o fmq/jYMуG.$sٶfHCbxo> )t24^t"Ք'`?]:ZzXA!)mB5Gomi$)zTLK[G[BlkmmI"%{W!c;i,f,h4J  +?0R;t@cv72yp4J Sj[D4[Fuw'Β)e| +U_׃˥aryLLSSwR2IV17[[:{$*˛AF w6Z{kk є21qHIl)$"D$<[DW) d*>@$v[e5农;>qG"HzCvzKGשڄ]W/v>y¦w2^HKg_Ϫ뀂 1nLPY3{bwoVmijy'KjnD؎߯'胯uP 9tk=^7k`V-E\?Rk=$H.H] {?nel8fi +,^|rĤM^MmԖ=HB]-bU aeЈȰ'M^h9j~xh"Ar&%"_uI)7q˥r,lX +i9jjR9iÞapx +-]{ +< =|߻Zi^W$R.w ߓWUC዇"Xo|i0 +(%Ⴛ[8ȍHٷ2 !:P9cc ՚tn|W[%05glp-Y-4s@h[F2((<@$jƳ[e5k$>%|jZnߺv-Z|ns'PI ga)p~Jr`Z{Z )$M-l3E7 t0__eoyƵcn?1®WVxpy\Ձ$*%Et>^#j–˘UϻptqΨ>dw9{XPhZ _ڵeGX:G)?cm{7"Ẏu m,퟼|a6h]ay\R+UٵxMKaYMhnA.uo#K "Y# +֞8PUs/=%O*=;I'WO\0cĄEKPf]:+qZA[>r .rV71Ϩ|%kh4Z( +YUg̃acV-V dJIۺjO|XؗpjҦ^.E+fev_cae>R fN0773_t֢ː=j;]aQ %HH \7 g&.i7ڒHRNˬ}}JƺgO* {~HQr?8Q<чW8h&|:r 'h̗_Tu9Y||9:R:hÜ,hAg[:O;wx\.Mzbؾ> +3Fg;xQq-.]]](|l+i g;22?psh ( =jɔ6qr0' /}팭Sn5XaTB]KzI"w!2&HBoɌKڰ$wns%$A0' /8iQǞl BGecvĭ܆ F"L +_9Y|la. K(Uت[ =fAAdE8._(s(Ҕ<]!:Ђ?r|PժbD t +uq"aqYI뤊Vnb8oyom:u$/HSR^lL&3 +p{D? A sy7TM(j#"!dE StÜ,h sr8Hzl6|at[:hB~كuoڏ!::z'4g#9"P(?24mH>8mh5Z#:ølbfNݹNJ`YƇiϊBՇP/ATi9`\T[fDd"îkcylԓ'o A)QC\8h=VXA464w^ʠfp +{+4JLiweϩZP>j|&S Q=~pgE\~K}-k ^VVC >L4׷b=He|T,X̌O.+nk)^'zDކJ;+̞d?ڶآVJI ;woAgٿuӖc۝\BӪ"TtЌ)^Ύ6#2Iݤ6Mo}`gty(OR%nʻug&2j{J]6vrxZ%څM(Jˎ_޺`HH1fDŽ~l<ޫˆA A~ :xzȋvMut#k"\_9Y]g=v$3Oq Kk^C#+.qt<4!l&ùl7eKa~O{8-mkT2Lc2BI]?9UutkE6#@[b*Bz_;ҵ~H_9Ʊ'QI,qiALb8¡EB{<{pGJ.P;bceR\!ufNA9ℳɆ}ywON1̺ȍ$e=^ a3|3M%+X=;߯_*~OmbkINN?-YQd hY gٺ/Z~9R>ѨS1^sѲ#O>Rxی/>i;':EublVUh?{/6FICSmo*ĘDU$rq6ϓyDW9&θE]^4z'"H""߉5bG 㻅3l7&䬷'[=2 +QZxhYWR֊ێDit% +:#мQ옓 ۻ|<摡]ʾc憙]3"c$G, R +ޗ_)f3cltx(f}T(?4J7;n,,n]|~ A@:o!-3Z]獿tw;[Wn=rB/$@^ds?/SpZ\fruT;& Nfa 3sg攓Eb16glU([$iK1&:I""lo_lJޱzK39b,Pm׷yۚ@y96BX3X"X/7x<Úilj&̃?Nfaɳo/&ZR*UϞX檆vR.B&j(JOhL]Z\6JP~*=  g{>69d#GOQzO&F&;ni?xBLZ1n>$?jú devՊ;~R*HON>to/97{%:NW=_"' ˳mojr|NZWkeٝ1Y G +0;5Ί+>|ⓔW*-u&':h;AS39ކ9) ii 9)᮹M2 +ʳ22DYhy tPT)[ꔦ9791|SVj{MkRw*VE%eDP[YG$Kco_*53Ht @e`HX)egW~]TPBh$5Je%'kKJoy.<ۡ{Ub@(mQydP ҫ /-wsKmRQ[yK~=mu|)_=2{҅󦜸"TZ: ^c[0Cu滵WlYu|"P+87~ٲ6$ڴ+m?iΆ+|ٯaM)W~|uUT Ql&.pM_ +QB\>tźKNZ$Q6,ɲMNFVzp^ drnRR!nɤB OJ̧R}rtT")rV͆hG_m +ΎWVhwį1.|wdXu/\mu++łoF#!VƝ:ch =kkz)OSQ0)5+YDG,Ѓcli ˎ|N8|sЇҫcFf4b'N'-(s޿aν:62.ix3K0{|SJp)5"s-KU&tdݺyz6:뱓rT{K5Ag +HA/-'|ߢ{T槶_2p2<|cZoT]'3E9ell|3Vv2Wδ#Hgʈm{YVD{4a)m=loH*yWYJD(:?z\F}[6DW7X2,69#O+,p~xST&P3\gO8JACŧYPh'[>W+b.}rQ#+,lPԞkdyUvDUP`yw_eŖ3M'2K(9<{ĬܼC[~b'F-&o+X5hdW7V`5UknՄB!8;|`݊iah|cgEG7y!y+Z8i^ ƟqO)*e O9" 6;~_PZqYqnOQ3A9']6{Ńr\zijku!ԊN\Hj*Iuчe d#1+$n~!ji˗YdTYZf\EǕGݼuRzE+0n;Úr 0PPfsmzpAn֠twt"uwPT|\M#TO2ԏ˴~5y?ɌyuD>>jT&| Bx,0A=fz|a2D!dfn`M x(<6{׉ԬC] ;Gmi#=s 7 kyZ|~K(ˬLg34o0yDu1] Y`X޳q +_*{׸Yg|~jC~۩*<{ 7 kygUv.aҾJZym"+ @֋A;\ќ%etŃjZ*F_%`z^wP P62nʬ{D"!}kd2[P(p8\ߚ<.(ÕWlbHb=lxZ.faM?E|@ry@>yuܷl5l?C4vY.?`5/?pt6tI<ۜZ4vWMtӃW螩xVAi]Ul·&vXU@Hb})=VӜr)l I^ɳ-+QI1=| +^ESՃI$Cc({5*Dc3klɀzu?R$GFE%Ց!g;/?RKX +p`&_ptw)7/?r[o]4*>Tԃֆͥ,|!;Zys^ZΦW$wV)2˗5*Rs=:jQO[IQq~aEG0 nZ.)$jmTkjdjS#%ԝY߻gDW5URY&Ud4QĦF*_wKO#[jIBR^n=K\XE' |'09r;!+Zl {ئ/Tbzn\\ t~ +\Pn^TK9ΎqN&Ie{K +Bⓓ|+Z()>,Ivk=b3$JRH4pt q *h gGfVh4-L_匜2]Hoʵ0~h%BMA^!QQ])S-Ѣ8:BĊ r + p hb BK8Jzlx9[xs#Hox`d,z8fMޱ)s"Rl|iNPUM@.^iyLI~upnPNC +:ZG5Z}GltɓbژZN hZk;Gg[+#\Dك˳qi罘ԨxY16>54oknu\%7͏Hp032vvvrqt-jBt+FL\yM;'* 6 1l/"?TyQZ.%2,=C 쬋9!),jYE.7[4T?yf!*>V< +[j:5Xy&c_ԆlX\V]ӨѠO u +="dtbWTP,4Q| +:nB d5:ZwMVz;%ƭbmj] >9,H$BR9JsnQVօ'2 y"UQ+Q\|s-5LXB13L 94R#HgKjr o4vC`BL;R!zu+{Gq/Pqa`[FP@ĩk,>R˼Ƀ*J,QկԠ:&#Q9T%ZT w O),Lxd׮v71[R* p -kh.hK[Y[K䩕R +$->OU5yN- )6 819U5**鍦ZK}ZZC,xػ٭!n1YUxTIkδvϫljmNO/ q0Ź'5ULPjTOت7(JQlc؍-ʉlp[|" +[[K +r JYMwDaE5ԭ;tKV"Q + +}|#Z#,<*t9ڿ{BӍ5s3~>AaDTW'gcoC()> xX,GCo +pvv ,gig Jy[enGd[X@_QJ`=wZP<+.wMnzBL6,6%S,N(hE>h\[twz&u5B&9+8==g;JL6jJ*}X€$b!c^ + PEMg[ihrCBQKyӢ06]xpN|A[Zx9yzr&[e[(` NƐC!>. !>J\I˳la=")%;& .nz`J ;O剮iu}֘kS<*zB֜W|<5AMN+Xy=l!p̃wꞩuw0鍵K6=M5\.mm oz>·^֬V_h4B$!< ԃpq[aQG G|_>Oz=x 7 kPZQz UM8&'Ń1ofa K021!gfY16rdq 8"փY`Xz߷6IMڄƮ.R{B`cBx0< ԃNv6&iIdRH(j={kyAn`y-x8zM K*A;ӬgN s,Iμh[GY`XzҢÒ"^0w#w:XPo.)MH, +n-'* +kx0 <8PBP*j4J%r9C A2Yd­޷NHu{ +&[2|{ (z=x>F xϠiWWӧ?~~Ō Tk 7P^YuR<בpצuWxXD>H$"طy{=xb>()nԞ[]^׍>u}B" +C+bdd;<۶9V&kKd|"?bCAf[s.1>l/\pDWT*ҋ=o𫿅FT m^yoe8>Ʌ_ +t<,a.z}QU,r]$}dJMgCF'5 jEk .Dyͅ#?]k薉SlttŖ-5bSP߼rO1GѨl\=⛸sR묶V)J9m'_9U}{+X]Me> @ߠt*hUySX;jm-XQ +G>RWe4;Q"4jJ("Qɤ" m@z%W -w'ͽ2F !L3Mmo/J7B&KW\M 7_H"\(P)AFt7Riii۷oyfIID" :Mމ8t厪']hv{K}Fa8]vFIz壿9ƒheԃSgL]Dܺ[gvȴY62T <ϣL.cK ۽~ch+_m^ržO]"D2sO N}yCIp>|k`HEv= (sr eDR]rkzkdfq*EsgퟄcJDsg^gf0$1ҢKqz󫈄Z +QE}>q!M4~)ɴζ)//~`yWvyOI9)ʾ~mR =%zI0~wۙD4jfSn 0۽yQrN{kW*>aOM3ҞII.G[\I#*YO_V-^]ކ[6?z,A Q~Ξ֞L\tvl7ol"yE' +^^'JP05kq[~7n\q,i4l\c֯߀^h݊EYw1.X4C)H7™*)t[nT9~ĨU~VF}<<#ejH?YO> 7 k^ϳEOԳ /rf< 7 kzl /E|@$_L`4<ԃwVdu3ޥ|XRJIz5x(XU+-M +s'.<ߢ+bAnyl:fBE W,3:Rݾm6A/+̃&WY`Xz&ݔtvz_ԍo"Ç-6,GMp+hՎۜO_!5ƞY' zZzζ㒵EŮ>70L3wB+Q xEMrGs9)2$%hr&y6$2' QxٍAn֠4}3-&+ն +XO+8A.Aw3̃7Y`Xz5X]w\6da>^ɃnA`l?G ryHI 7 ktyy|> +|A=覒SgQʨ-͍S|KҖw<˻uWN]GoC^_m߶y)J)}/(PA rC4DաQtnBޢ5(jyGKs|^CF}+T2WURڦ:;jێ"+% +) =vDIAO*_QcGسgMӟB> +(àYݽ֘#SEܓK-"fscH~1U*i𼜨ܬ4zWifC%. j*!3<-E6p[AtF_g`?*}1#7ۓ@lEɈiNC8|@7[$&!z"6SH/rzjg|"S༹3 @ kVZϘf*Q2r˹߇(ѸLo'f&O_?)gNxU A/VR~!H7jZ 1kn%5;j)뱣Sh=FBh}^ܥdkBkʳj  + lE8+uMv씹jfO5#*(ݩaccMz%T~gQzz5+/]NFU־;_碿CпsMҴ=G"kG=Pc{4?L~2#ihL񵃦k}MkQ٩QWY@`p'-͘o[Zyn S$ENxC%HDxB)3 + d++kܽN/OYC~[orb6sy0r5++kr:UMhABsˡ[OljCD5a5U-m-Pi/Z/sE{Wc|bŃGv-oڊА\X~QyyJykMyLr WԎrZzGËwlOa_TGLj8Dކ+sxAiwaFSKwFg)JTCm.Y!<(<֎;drzB⒒+Rve߮7xsJCT490cF/8if8VD%fWuo4y0vӇ͚YDG$[gs^iUjݟl\bM1ܮNڊdS'Y˼Swג6NO +?3yG= spԴbQȻ8vBdn#ΑoEkãZS͖Lٵ +|3c)'JX?(F;!;bC[*x|2BE-;s+B.iWؠ}u_(8&C("AIJ%=2W9:H &zRV}eNO.h7_ 5T4-y4ekh4gS4+cOYى%}B] A_WV΋/~#u،р3=xsWJ~69b._23e)W(\#d]a"%]SFrj4Ӷf&A:_փ  DVh3+X4 ms8둁9_zwZAz(yWN<zDU`Wi23eʦibH1^ +-E5ǎGc+O8h0!y];3w E37ev֏UTp6_̤qcnj\|ejYFC{/ڟ=SCGKpFOSq,ZAIo4z>Ƽ&DKN;}[~ƌ/3=1 M߲0YHƧ'WJC;Sj6sGX )4Ii깻" (Prv.Ir +頧ۏ!=x}Wwi/!"}%["o[Rc/z!M?Ԣk )y)?[+u$E"B6 [?{Ϸs{',1?|>q\ԃ;2-݈֮Y;XaNH BA(ygWKPj|=6 +5)# 9;-$ iW{*Y\:W:^궶?Z7ջ>>v^TI +i#ū̥H}h+B,Ɩ_uOR5HWcbjuKBKQe?wcTJIUcktѡc3oj!k0Ɵ2T},yI)O|3Lz0 GfVO&8tփ*ύ6_çQu7?"{'d5/w<94]~~q{׉[.xxnMhBACyDAWNiez{`4_Y@!%atHȳuwkqNu0[<1;cˡ3 +gд§~?'aQbs~rtҭٕC?MX={YqK;+:֖)8r&f s~SYٝi{g&^nFO]O*))|A&"j+D_7y٭'.?2 e:mMqִS]T +*b@@nk|oQq{[rY/]=8=m߃J2.e|O6(zQڒb|xrSxp׮_, j'j}MA_ܜr1()B.%!VL3k6ZzWil2qN!!Nl;[|1ۖdyŊ7n:-czY];6ٽ~ۙ䆺c7-]bU烦 ++Oںew +\Pp~勶SOjA_NSJ_l DT4!]wH~Wbo-~~DqHaiDGHG{hv +׈B%7݉#0M~~ER -z @hB 7 -`?ش zSw޳ nnlOAn"chw15T]BB.Rێֻ}OٻGOIh/JH}֕2l[7,fnyzNջiyutnVʺ髧ލfSZCϫ62zvuLhǖ@#;gg;PxTDd_^N>vNbV +Mub7>mg*FwSsyQ(Pc>S;Eõ_-KB=(- ܊o.Sm5_Q_N~_)~ݎ_oMkCǯkeHk^~kI}BҦBe W__oRp^[ZB&eF7Q2By/]hh*/mC;;i$|^P@N%4$׏/B O E܄W_jrFitRWU@ &y)\׭,]c5crW_ރ5|,,{b}<N@=K3НztK +KőT* 0A=hooiz~15k۹Ӟy!xzTഹ}%{^gx]]K(| =j< PTZ>gI /yo*po`:uۄ} }{DΆX#SpA`zCMmdpjo[%>fջ\N _hY%-r9Ox\@EUO xzח/DBOfb nYQ$؎ןtHrnůEjƗSgHc!6v .jF&Cftdby“K{P̠di`fs>3~ .l-̭~xjp+~WDձF?9QN}9,7?4*<-^I*cC#b]>@G_KWqUtwǔRT,J?rpe7n`y,ӍoM3E"4m%~OKj=eƙg}cA#?3lgx:LMEy0U +MN?bfbFgk[}͇IBI7^͎3m‚# t~^u{N%zC~4jC>Sm/6F}sK(|_dRI{ܤolK #}B ovO^@y6Kc5BU3GMyyf׳x;W|~'}TډRs7tLohnjl~%tu5r; BԡQ)B=\|#3N3ksh:T3Ë́Y_Yk=u~>>ZeBG=o1akt yKx};oΡfL_+e48r$\ZoScb=(a1t&LAeFi=nWTgԝ1^.8ZGLTWhQ{w[z\tzO$FqerrF|Trq\-a=≴tg Mmz^%}lk)U"H׃A/϶ 6G<<>_ xB o^8!9X)R,E2 ^Au!06y| &]T3IBS(bCt::76!y9uy7|Dk{>l"C)`8̏t/>^wA91lksז='+4":fmg6?_hpnL;[fU7Dm_M9܏:[fAm}C\j6\5ed46+^cm(5[p.x ?J9_[Ei+7]5Q9H&y> +stream +x U5' +endstream +endobj + +1274 0 obj +127 +endobj + +511 0 obj +<> +stream +x흯{h,22..VEEE0T`b01̅a鄄uNM1|}dR$c{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDFm{BDÙ,ey8r\`a iW8GM.ˮHa im0VE@BE߯g9[ͳg_(26~hųE$,(S +Ha i~l80n+$43 _&ug{m(wa i:y.o6nW'](2O311bGcYxFچiN:^"KWiVYq9!_w:OdEto|8Fe^v+fun/a i'~3F蟵:j$W:]%l.j= +^ g{Ax]ĈZ^ +V (2O *_OC#8 ?P=&cVKD/iL[vI_=l[v<ﻮ]_ּOt0(hin*UˮǷ= el\q?q(2/[wxAx;֑ׄRKz}uQdABEak4H7ƣi:*]Z okdt83Zw6kpύ{ak|ѓ`!t L+a_H<)lw+cL쿬r`>q3ts/6\h߽wCW>BۓM>F3?qۻ'~!E"[9QrPk_uw[u#<-l?U7ctQNjx^^ٿ!f~Ip1lͦ3 :;/iXzig.[Sߤ٪m5]՟ʏO]p[D+:&lgVܷ*Ͱ.PP$f#Ox~b?e˶O`n"ܱh0E^s]V^R[Pp]ՖR[t;z!g}NN{BDF^Ip'Ddl >~3x~!E"#C:ȏtȟ6BoQߧa3PO7Qmm՛sCR$2r ?4]a*Мl/37fN|_q6¶ϩ9c_H1дmixEȼw_󷁙sDR$2r ?4a{ٴ˾aھ!3: +ja/Hd~hqfC>n7I«MgW`mS'r^"ci r]zTF >~Sx~!E"#CFއuxݍs,4o/Hd~hZǏޡۻmS)r^"cikSc˛{[i0n>~Sx~!E"#CڍP.8fCt>ݜ9c_H1̻#/[K2cW(e5f#lo/Hd~hZٖ ֏`5u3f?3 ȘW,ZkS'r^"ciAV$^ef[ cQrW>3ڶw>/}Po/Hd~h:FM.8j7Z`KcVdm/}D?vZ'5<;"{ )9Uv"78Y]ޮ8k ~~?x~!E"#CcEeGA4 *e'eo/Hd~hj$nySf: {e1f:`u7BR$2r Vqx x\^V}Xyg;n N{BDFpEݞ Ҙ)֣d#{ )9Ϻj~nՈ/Hd^>75ہYe>7:rr^"cx]8vY I|w { )9WA}X7`3p/Hd^ $uf޼6!{ )9q-;<8x↳$ߡQx~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"#6x~!E"?,. +endstream +endobj + +1275 0 obj +5636 +endobj + +508 0 obj +<> +endobj + +1276 0 obj +<> +endobj + +1277 0 obj +<> +stream +xy`Tս8~νw;{&&I2!B AEEŒnX-.ZIj.V%`GmZmkQiy-sLX}{~>7#th{_v`3 %?Bpnzx}o#6_T[Bhǯ]{oy3k|Cy~=ו"hB ]>P|zxP<1s>"N "R/ -Mo!2]ԁق6B( CH~^p{o>SKgUנեr#E(N +G7Q+FNڋ h ~q(栧Q`;.ZIToiGȎ!Bw@+ jCMx Bz.Ix8rې +zV?/!3tFAS! +~tvA3AshmA :v{ߣr]=} #ޏƙ ۦڃdC3%h-~-UJ.(} +I2#5諰oSoX +Y~zօG7n}V):kp `Z@ˠn'z<:p//OrS-%kV}Qp7zq q~:Um0 qtXOp5\e>l-(=]EDԈh3݈ +: ʨT7N0Ez }~4[0Ka|)1~ 3e_gիT&Ɏ%JVվ4z p aFo339p}y {';k>-@@Y'X?c;!Ɵ #aVblmesCܳ/UTkU +k>3RWDОqQ +QMBthzz >@8c +~-@ݝ>v{5[1\UL=´1̝̕p=`b>`zv+; !qWR5Wu)uJ+tvbzw7Sh=jꡩ~_Z^㏢4H(w > 3Ы@A`@Rk-σk!^ 2VpFa|;?HG`nOoCpG9~3,@s3Y3mc:E̥p]lkbnzy9¼Z(fײ.W7p \3{ 6*jWmT=zy~5?+BNExS(QV߇ye7gUV&= ';چRv{S4+_U5'fy ؀݋JY /e>Uܗaf3PgnW} 3cogo/TOTO0?A2w1C?fbA=\^) +[`g1wjM ;68s2;h R ]<0~} +/`t[77;1cif[O͘9 `LhZ;PZD?3BUo8*Bc^GM݅jQQyR/ɠ1|5b-PKm+ ;Z B7b0kUq^(S?{ڀ 8?ZqFOx5Vr) yx|j.R t+yy77(CaWZ<5tUa{wi=hM髥J4JQ=ڦe\hk_{nEzN ?KhgKϑ #+)t-\vM]+uCKOX66zRPF~ՓpW09oqJWv#^Ti5yFSe3T:QE#PP}^tحI2:F- +cR~y4?sI> +^P?*CQmF~L-Jr%fԜNay +!#ek7v/i {өQܶ>ng jF*2t/51 O67]3ʮ%0%sF7rB涞mzΫdݱcT^}c%_\M$uudDyzF95Fc}#4_/F7~\5n!5ADUEo?<%k+%|T"I% ӣhu5 v8 chx@!Cݰk{ {2Ë{yGJ6;2R3<]s0Fع?dol]K]W;+k۵\\]%\Vj^@ҕ=TюpUs`S]>3H_\aLi ;FW /+&Oc96%/ϸ(t;X0cܱCsQ];:rǎkJ²qa{v OoX=ю{{aq6f SKVP{i~3m{ =4 UuS@ 1 +Kc{E$byKP '_/CΤqd%ҙ慓ͨYjrAS{9tVf**)H!|th{)E`vflp& ~7ɩh19]9:)R,d[\$wuma7Yo< 9u |<C̿?[mk/_"DӜ<xѥ7CO}C}6dq؉Ӏ<=XgsCN'ch +@EHA>U ѵB/cZ1,:)f +9Vq3G>UYdB sK\Ħ"Yddu;%j &O̎"sH&nu}mcc@9`QBoȕW~F& S_X/84uEXi\i[mW{CƄϿ?F@yܪ9LHh{!aT7OL{s9cYd1OIf1OT7"*nf:#PN3#=i& [ac{y&Ê% cq 37xIN LM2 d1Cp09^5b .Y. +jFsp@#Fj.dm86IK=9OvYAJhIR=p!YacӾ;b[٠m;|y?|C9q_JT'6-jU5ݱʭ$4\l=Az ʮFԮWb:lbV1sNXÛhQd9׉( hnE¼ZyQt xPjŻٽ,Î+NBˈ^4F^2\Ct D䘖br irT4QٖIrfIrW4ԇ-l +\fzr<9gz_1~W'אx+MR}͍/߉~Ql5U \<+zHẌtS_&2{~t-?gwOnފw[/?9̽Ϭ~S=s-7y2<ƪQ:(81dB߇`0w@5(YP`ccȈ(B,Y"ibOl'ݺ1 GQ/i@w-xNR?Z <OX/;h~%K^oBE|c4Ͽ(k\!-6^)m s ;ۤmv1^tn2-OO]&P|~Wmxvc#LV&Q%2IVӀ ÎayM11~+'*/>DȂ-j; A11H1ȊpAd>{o8/1#6C&"pmŒN$M`iۤ[5 G\_rzqP +Hh zB1 ɿX7ln~7.-pq3_}kQ<Q3enܽXr`j 3_ f~*#a3l?L2u!aVcl7ٿ}ֱe{YUVL0AƃQ4vUUyY<ƼwД4ƶܩ߭gclVZsc\+=ׄcr+@VͲPa3˜SRC@a'ye3g&(Am^[LGy:t6D*5}2 Hv,<*` glV3<­ja_z#wpK/L=ny;[fCۧ|ol/#O[>ϣg_K_kxrd?+}R בa\qw#9%#+7M#רsԥMgonӲ~^zNޥgא9qyӽRjMR*ɀ_g0:ym13F"3̒y0'I2ytifc>Q61&6V:HDc +v7l w)jwky9)Hb*WY^DA ,$Ԥ> $f uOcmԐPsTۙ͡އ`Wɦb#T*)\ڈc3|yak (C܇ ,ݩmu@륌uٓۧnѮW[67Z,{_0w_kj:ߟƿ_™`AQ}E˔pB EJ$;͏*f̻IUnQ  )ݻŏX%' CV 8Y3HhgH$3x5 jRrGg nOxM.Q:t4Ȋ[dN AfOt3P:3D=a/M6OUbHbBX+4Xd뀼4/_O275r2crI١RwrKbfҘ\ô"QccevFu,gjW֟ϱ\ЌЌ:n"^ eesP!T +Zӆz1a!gc\)6:qJ\yRI-8'v"FOȑf"@q,$yVO\;dǃ' ٔK`'!XO.0Y`nEK-ͦt&+@; +$Q#! HJhs%s#C%K>"ph ߧ6/cVX!67xL3CG +倌rHA^x +&f9d⚃b#Vk(jh.ھ +$gPT_X!J`/X +`r=Gm:M+dIW{?(LDkʩhW+[>$`fi3p7AվTfw^{K@Ay8rW_y]q)S+FUUpF*noWUwޫ}U!!1'}U-Ea&lU2 [r܊{rrVKe036t1]XLZhmx"7>\ BOW2q¶#(Ʀ?h¤4a +X487pxѪX/qWuzWDP-ݢHP0 S^Tl0$&;y19!\kA` ola~mvס5CK}{ҺnsS`ױHk/|y_iNˁD" b,˹r\ Y[T\BZX='xORRRwoՅ+ Vh=Vn5 ,#dwΎW\jrtу63  x=GJG:U3$u.ƓU5lHXn<:Ê5db3aٴasDlm ;_9SU: J Ȱ(#gr\;qvV1}AeP1,ہ), BlKULRס!YMZWT2. WuUD&iAྶE^{Ji}x(Q_Eu\XH^0 43%¦:?Sx,6}6j{nƻ>=]Ό|.+nRCS|_^pۛ4:A Xm{.ۺxV]׭W\GSZ@a_ce)_wVpĶ14ngZ4WѰ-[BOl!Z(M"]cf3N@7FHMm[Wh,)ђHD*)jT|$4An't:n;ipJQМPpLEd3g']qĎӢ1ㄅzZ:Ƽ@qi! kNoE݅S}f{2© T v=Ii5AFyK3O;4o +;who35-LX͙D: ҕ*mQGn*Hn@ЯceݠtαJB[\\dέ}>z 8׬430bL`i3i:NŸսD%o4Q4D9%z: GqT"/0mH@@6TlFP EYViw Xh2" %3͓C@l93yOlLMM2-:z !E10VY^-jDE|/2[3TE/j2.fņM|W9)nSM xA@JȞ-f"ς3yf +yrDCb s`D'蔵E^nmQ[PEb )z_yFy|NP_P6nFNUl|i +EL#3|ΟxKZ1&fGw| Y0J:[5MԢ9qjܴş~g\nj-W6 +UG'gnjb>>-&&][F_X{)>LW{IJTJN)<աx*H)Hٵ2!2eJ?Q*;(Q )/`&%Yt{+FB*R@`+ 7w4vBeɣV|>B7Z;2;G@ +Fh%  l&Ax>pw +DWvH:# 2@- LT`| X+"l2 I@DsGa{F~Tf:x6\)nhUrDh~O9)UrrNSΩiN16UtɦnJ +.z{{-rncexÆm+Ll?|?סG_܆VIKngfd[#^'Ҩ"؛U$#V;*'%ECԎbb&j0S/Tek#Q!c8=<9k[OHe4Ncҫ:F{D>*yJ>to+ZNMwI?~/Qf#튱s9;;uG9Mo #nq hZ-@TI2^p/+*%?7E$W0xQHcwJ2|W'ǰl4I8BJ8Ńl}p{-Z%PlUBbP-{/E~`OrahI[KA6XyH*Αx>񱚯@AVlâb,"$LЍXw1Fѹk.v1"k!j* /ũqw;?E))7vv؜לDP̰KR27=`+$~x@ov= h +WQt;𢪁U\3Tğ3!U˫rU{`Uȣ^.ʰAَ@JQL9v:FbՂ[jrl7tqt4^Yz"&a2GPkmw&@))91$OJA#P +S|iC1$ā7Cg&ȁ;)!xsiZ]+#ĠkX5(VǖGzwߋ + e4hŋ Rqvx +/^hA|w/+L t|ŗd{ђb;ڼTJN*uG=oƁ>)kS4 ` 5>sb7mǝD2Eer)6ЧpWq9i'#=VR +Q!=cH1RLKcZ5jpGᮂ;xji(ԣɗ∝!% =ThZ+KKxݰ'o&(Y!1NI_ eʖ5[-X' 8H8H0Ӕ@/H$&utcCkS]I'B̢l x3ۨT4 7pH#78xM򸻱q)X i5*P:i~i~8X ּ0zDg b$i\ΈzDG5بּ4HE(@N4OHson.?e"^xzdfe|pħ%( _eesr\#DDNGTr;($Y[qcS9Nq8Jc%rA,C hwKg +Y3" +$R-NGJ褖w;1dĹyکr:EⲘ +&s/(,,຾=uzƌwմNeL܇ؔ_)!WS{3̊4JYQbs Q;.SH2he[˖5hJ+4T,5NߴA'+NdcRƯR{4CлVP K-5& +&$,,Js4׺e3uOHqCYFچOh=1 %9a +xK !zG]K{^BP;Ys.'D_GDIH/*rc5$5P )wr Lsc@52+,u1ѰP)&D$D; M4ZTBgGM:n d< DpA16$2Hc460 ̾pEkd‘ Z(-d^ {zǘA3NrYT9j9jo aZ+ +羯:/":>EtA/6CrAIL  P1꧝e@ȹb)"nR7byA^S?s2#p5 1UUS KҮ-nyFlM2m0ƪ7kY-S7, 49(T"ӥPVR SH3cT¥t(Ys(%QE$aB2$E"%I{G͛s;wscޘ&LF|-cRNR$c M됑KU![ @nQL37kn6l~zWUS{%SeQCbڪw \1b1篹፭o|?ZRf/U''qck`7{̽S٣kqTdBXK̠^fj 2Y\HfJ-2u2hZ^tW>{"UI3gG)Z?2QC}//)F +# $ Jp/rF^šc-=HVC`k43`tn-FZ2ɠx&C*GehhgT܉ʑj@53y*i+gZftV6]Ŵ%u>77))3pVdf UBa.ƜbTH44#_3٫a5 rwp 1 +J q[W Uf5({rHZ95HD)d-z1bhAqVA^5ڌ/Q, $a|Z_`Q &: v:w.ڱzgW:]S!nIa3jõK6ZZe#lq-k7c[mԇQll`朆Sl7\rő^49 \N{ TSHSqgW f@O*h^Bbu]/p;Q ٰ(95ƫ:N B@;ņ0.nVoU3jH)8AO +L1Ng?=i;=fLQa8Akq" +rk4jU0$%,@n_c|&P)d<, %JO|wbY:58TqW3%"2\țE -q΄p[#6-gϚJv\>5Rvkⲩy b#v*3K,ˆ)/5\/: +/u + VBLqq)GꌄՒzc ƍAΜT-*IU,ƸZpݸ=ff-j9* 1D})po,ӻsQ4E7gTLuPeRkTS1h0Ǐ73Y un@e͸Dx]m+LjHcZc#⥗P\)l(bJ[tZ{u+cIDTASI ƺ1,+ۀDp,r,[wRsߏ|Қ[R}ϤoM;m=nOoUx&kaڭfJxRԻ4_95'UEuknJܔtxo^]B?,D6nT^72th'!9k9cF*?>dk"$޽V{,,#3frgrZ&~8bdc^qݮL@bjwqVL(Q-uM#"$(q_o1  CzV,d H֪k{˞}CCyFV(Y[Ȓ&PoEc$TLTXi /qQ\nf7[~6xwN@IS|~>PK.lv/t n\ݱ\_)hsAWM:֙$;/_=?Xtڭ7F+q Na1ȃ'}g|hzhuTM,XeI edsB |T#kA5xVLV8͐r|ı +{wC<}r9'4]j鄋Xy@F]e󬘾NPwk=XEE8UyU ,e%#2@p-'ƥұik>lZu5x ôvv^ds}vv7^[_[E3d6bX={0kUF {?XVϏv d`oX-x؂ɿ[NXNZxK\RCCG-&6m Ӹ:[d`VG=5ck~}?ꪂLLO>v$~1oU׭Yl گpF4IerǩGDh媊ݶ"pJPMFl73V ( Nޗ2hv(eM)Z{Or +NJu"QZREzR)Tг M-TrkkŘL!O˶ۘ&1g6cZg!U[  ,81qF\^h*hYD"4Usdm'vŢA($2FjQ؀F169L.wlXaF-l.֋4&+GmӨ뜤Cx&E#S#KN=6@'v1h SJpKa.nmI^U\>0ٽ]|l~#\Dɹ +̼\Cj5ryGLpp3C@ˆ% !{QԨ=Z +sZ+5Y-f%2MȤe'%OK4=U.hBkmCI6GKv7&sYp5s4vG<"Vz7hKFjќWWܯH@úR4_:$pЊć|VLo pO:w;ϸ'H<(& uV2N +9"#n$&K5]#Zr } qX b +ܸ̑pٯ|@N *<0&q'l?!jCy[ީSGUS-@4&sSUY]XCrRӭ[w;v;Wvq<Čqгʳ*? ID3tfXg-KKU} ^>>^eowb=>f۝: XQvȞjn)Kj|otWBV#?] @>p:p6` o5ʮy|٪mB\l<== dIUŞW$r`RROF)tz[+|Ң6ńTw['WRF.* +#e<5Y=u`bSDKS#63ivՕ۪KMgUZ5 /T-a=Uϓo>'VQ,*X𔖽}c<=OҖzWҷ. +KllXIXai{"5 +c90!,s4T;Յ&fi3PB'l==?ⅺϢXEc֐}]Mhs.͍K=-K}x**5g;Ɲ2ww>:.v=(9$ XV:mEw,XCi8kvYt$PBљ-nk2c+i6=ܬ(/knnX0ݾd<lKˋv{iuXI{=gC=n%655"ڻZh^oTFE)miQJ.sQES. +\bGIpuN';*t R-SrZRin9Z[h>), MH7ZBuXHm:)|DI|ױZU~뫿yغ-UFx:C]%]a+X@DׅAIWMXqlO#FΘAL[V~sY,_L/y6[bR$ϩ(nӳ+OFƵhog.GQ[l΁D=6(l\NdNȜ,|P(QS2Tڢ D{ ˢsU\%%qvDžSYX r4P8+N@Y4%W,3zO/=#BRehDB~#1Q^p > x]w:w[bo{N;.ҷ?,{MXU"͛UaYrՎ=~qz|--Xw:՗VmBnBzLnIc/U=跍w}#TySƚd}E?>Cc|W&A.F]Я"@ox&K$ːZn~TG. `$ɀtM"CЕB&mMyϡB &ĴM# +RkB dN-!/[KHE!so'64x>@Ḧ́8! sBnm!KC!$,!=1BV;x}5#_ FD0Y.WD*|rNEwZVJ0R[y4w$ѶakmQ}hXRGH~/u1`-Qے͌A_m$y|]jWE5͊kjv9vU0KVG_# Iyyz$1Fcl*=ۇMyE2ۖ +$3Ȋpbl&5jYӷJeSn 5ΗScLzc6pfJ]Zc]rz;FNYIeCl" OpzLNC3&s#ٱT2z''>:S#䞍SI9N@ֱT&=WpߝJdѦH:'oIs$oLCȣɱ-,ۆwtC;c`b+FsCȚMC0 +@Ӑ+AX,!S9euȌu͇Xǒjy5_7S(%"8BC#ĕ H粣<Ƃ kZcZ >0 N?Yˇ5Z|D!OOyo7n{UkeR*;6/\}ðqeZWݪ 8zU #N^۲(z3/m;ƴ5#<\WK5o'}+S R[{x_&ş: 0 +@H|>igyo? uG⋅JqabYHenhnL~/b\SPB *C/Ly}4{3NJ$4OM;#=#O(9 |pp#iq2X=L"(0 ¯A~W;I-~\|~L|/} j/"~-9PDrhӐW>@/ϗ1SˀF!p!tLŏüI"\ +5G*ܑ.~" nwTmĝ ى4a "ĝgq V; ~ lT4i;)nD)wUdrlaXvf䔹ISsT +ڋA{̀N,x vDҸ0.ZrJ^,H i F7wEY67^>-(aMD=d`lmbWyn56=`=`[O[ZyiY9^64^zèa=JXolmƭVd7(1\?@o `'΁ RY@HagR;v^i^z5jf0 LRv!eCʆ Vg7QC \vQ|n;=-.d +NkF*Fo9/D"m4@''!e|zx-/c\8ҋh֦eXrv5 `*w縼G?L Z̭[-yq5g` 0 +8ЉkZ\-<''`6L"8Δ8MvP1`_3㸍coxl\foF&nmm6x 5&ql`9Kkljl[kl7հ|0wmB)V/Jl%BnRNs\q%;1amh! T\,ny{BAigiy.ձ4[ Q˅؇#&fEK ZP +(~<郅>O UBɞ-0A&Z0jB`L%|:V˧⤂7xy+]INWFj95<Q?^xTzio?K 9UNS4]UNMP +N )iAVǤ#Mғ=]? }γVtAPiV -^uf;vXEPc(,nZ=cREtaiwU>n@> O-Hs1k`\e|Fc(󌥦Tl*2YL&3 &b*e׎ůR +j1CV +$`]B4_EwM//ʛz߿fO#NSҷdR?N( {%;ソvO r+.RVr3zKuz _quElWUᮕk_Gs++{ qa8.2ҿ8svϚZaf$3"̌)n0Lk;;&kkUgRf 7ڤefB5r_^am]dyrGL!E M$?$;Cy21x S'<do`&c㱉ؑ>뇸T@mvvvZS͚cԊ9&ŧ?Kfs!( P/Y^KE[xhɷ w/Dl:]Vb=[t\bd%h4Q+תv#.B[ݎ7%'xK#yN>LL}?^pg3$fr@K3,[љS`)_r& +endstream +endobj + +1278 0 obj +24015 +endobj + +509 0 obj +<> +endobj + +1279 0 obj +<> +endobj + +1280 0 obj +<> +stream +x{{x[WG/Kdɲ$zY$˲$[vǏ<Y'%Me[ؖkI:%%4Pb +}smzz a 3^9$}:kz-PBH(V?0>?%3zM?Ok}r~j?APE205srR?#$Trc_I('ѡWܿܭAܿ +U3$Q==BH¢*LH,\r6.$L6i!dȞ/_~jc~%LjH +J)!Zʍ +sj;=^RW#~ PS8mnm]=6:6XIf]HvJ0{#iDMش1/BB;.S.@W0@ .yzn:P8t^Q?w{H<+6qV"yo4}E2uP'(%s8,ss ++|#{F1`?7p=܀sFz{JYA%}ΞsgB\Dl~;zqhF!I +R2ARv -[ 2׆g-v];$ Wy-BZ G!\v~[\a;da;ϓqܹr"QЗ K ~c"``k|(9Dj;t#U5F1<&z&|D8' _ ,d[k(~Q`Fj\* *:$FVN f(u26^_clm6Fno޿]u]橩1.Eh!elZ/=K.& $RBg6HTj/Bs,x,Nǎ}ǾI[7q pMs8+-6m h,ڳ*bG9BUevԞoɋt^JI0xqD;u +=dQ7UEUUƻϝWWKd"SKcq /]XXV_lXgi$p0 -YmKy+-6vm8{G{iolVl# %'w`BI]qgse䖢 a)zXa)zXa)zXҰ1V/oF{A a5(5_3,z_Yh@]qF4WWwn;ɋC#^K(ls:|:t3X}oxT/]ˣ(`(i̬6-F_;">NK@+::}r⡇бZ]x @)[b'QMQ Q Q Q Q Q Q ejH O/xz ^<O/xz ^U*e邅VdBޔ̂݊.gM̊'X*^jR/g* fOgG,mӟTM깜jٝrlۚhh|6GE I|],`,c\.d 2 ÅBp!c1\.d 21\. +ͫUj#2/հ\ +Z5Pܘ]y@ؗۢ~@gk|{b o;AaMk;'DG`̖ " &Om} UInGiCS,#k.3}rfjVkWXV,󝻣WK_m_iޓ{ןѵ7f.'n:}ݡӣ!>ʑG##̶ ڢ %rt,aф!7(驪ӓ <ӄG6Gа,gYfSLap6bce[l-@>aS]{0JYh%`Xh%`Xh%`X`XAD-ޗZ!9:m[oVMی?9p]&;F  +V:gsqUvw)Xlk:>2hU2R2$"G`]aмJxW5mi٘XWH~,V5w {-2>'Sk^H~޷N 헑)cOw_Gw`u v.3:"OVxa)7/-ո񀄟ZdST bukN}^#?z~+P%I##9ڼYA8 K&@P ܫFh󆩿XYA +- hKtTh}QyS_oA˫=`TkMF`MUE'[R#g,{@֤S٬6{..Ѫ +TSi)W;2_m$_c睬ȅt)^}b>EbA#}4O=dkbbWS}amV9œNDe%Eʍj~,ٽ,xX5ZZ/3Zjom.*C\kzhgඉ#U]XW+9qNɴp.aFRX)_+.JeY>fcQׂG +9oMZlqډꁥjgx0}[+nQL:w/ X%L"Fx k[{+-6vm8{G{ioۜ +6*\Ejx J +ل9(M.cdm}B]Nr(V~ej͆tm,V2>ץz'd/;]ް~P+N שGѸySPo uX`/8|%~t0жm +#.?.Hߢ:)(y>;7wXjLn?EuV8X-(Rkg,d +n+F|া%nhz:-~!mo{ /ئ[KKőo*v仜J̨RFs5obyF.Bt:1`ZXl˙E\4Is+Nal1EWcڲԶ2Wgt+l5\siSIrMnFrXĒHaCD:0d@>"\ڋZdJY %CEw.Y]\XX].or2Ԑmiv4Tkm&[ߨXUֆk/-áڨ/Z3\a[ +_ M L+|ak~>W5;Q4EeK!ohglGww w]#'z{S~pJyw yVymrk*VKCLr^vvmC;F;v7G> hsK +b>b[_Z"tȵ/]"g\^IUiWmԩ/sF濿$vp8:G{#5GS[dE^w~|ZR;þ`T@M(aTZ bjB^~lJ>GZKr`-+UC1KxkwEQ:z8gѮ;]ulCsEYud姅MX +{43H1)vA^oC1ߘ}LF- _Й PG{jiPuu)}v# [.G".GQ<=BhDvq9ŹȾ[؏H4aeQՆo|l.Z3B㖃M p0eveC`p"~tS_9ZZOfQOoyu'~Sw|.?ǧ;~T]u?0 +$ +tn]"3 Ϭ.A}h{tOC ԯx?;Y&=㫯)e.B!z18IUՉg{1j]50Zqt~|_Ezx&JJ] >7 Q;瀌ϼLvnBD!4f'D(!О#DEB4BJ D{+!:Ⱥ')ET)CC6J +ѯ/B w_cHH?vJl+A[)4`VdتR=AH ٻ~Ls?oqF\" #&!|u V s k ^ Q4\J[8Cd?+Ŕ~`kBEᄇw( + 4bKUDIդBi pJu4QK[|q+'KXR#V[FP.JR4!jbU˴XT]L[%C@Z%ÜB:՘L_^Nj8]崑L\M˜`ങt%V9~T)|]e־2i{Wܒ?Ή9>[gvɹ ݙNΧ@-$Nóc[̂edz&̥&㚶ff|r.ʆ͸eŅT6p<5OĉT:9)3`2Nϥ009IdDr!%NbxznJl29ʊ3\2̢Ίs|^O-NIqk*=K-Lāc,oNׄT:2hs89͋ Dz|Ed9dPY$ $M4zDlxI3T[ѱut$_C~\0C3cFg %N~{lA9&_̠%ї⼯ׄ7S3gE/#, wtM,cST~prgd] #'[o{~9jd6 ^ a5[fȒ^e/K9s>dt3J]٧QPvHo}uz:alIՏw~ +e'Fbm7!|h|TtlL6!0rJ7Ip#&~( DzYa[ƤRH+k +l*M0Few |Zb'oDWA&vP ?%/( +endstream +endobj + +1281 0 obj +8959 +endobj + +510 0 obj +<> +endobj + +1282 0 obj +<> +endobj + +1283 0 obj +<> +stream +x{{t[ǝ܋%$pAIx Eć)"eQ I&@=yxlc[q$=6Ijuͮ7muocv:6Ik;$e;ûݹs3w4!z Qlj~=z5'3ϟΧ+5-/_MBV...sSB˅O_B2*,!([W+\O{+ -PGx"}!2Cpi!z^21m"pf퇶ȐY!;\QTa)EpYxit8".(7 +frD'Wf;favv(%si=<-4RE+ԉ'<8204+O?;VꝑE?u conI *#dN$sBAaK56ZnA[*DEPGOA\ׇ9U("Eڍ\뛚b|no^,Jqm8H-à(1L lt7݄j%EV(DׇY_|;(/ԟTc3 -n@~Ÿ{ F6nQY"Eϡ<(ϢRfElƫ$S;l,3}tʫP۬ @s(lT3 +47(Z{s/ku3'-񮞓Cgr'RWǏGlX"n5 96-[kONNựWq'~9bKG$`t:hPT6\} 273 it~LPg*iJW-Fijiiiiii՛Pi4n?'naL6gI));-T=Ւhhl&Ɔ:JO\;22z;G#'B+nw{gpEcqKY‘dϡHt$je c>lT3g>3 |f3g>3 c]@q2=@B <$lievHJrx>,Y5p6iXf>FKs3e|R+jVr*4y:40'2#pHOw̎`(HyoX<O:SI;_}٘8T;=<f,y 7cWy(1Q|uG}=^*U_D~e|܃H)t:u.; +ΒpNJ:gzɿ|+/WpG1"z0VUfUZ,, , , , , , ,87`.RZ<]bRQSpO\̳,CS|{sXxSneO><_uP`00EY'#_GV@P䟯]4W2\XB4" Ui|eg"y|!nTN;o޸C%JlܹRnM v &Hl]PˣS@#FajFajFajƚjF=AZU:EX4ei"t`^434>+-,՞Neud%m}3#Wp4:&=)d.Leon<3~KdOӡ _뱧%MMs>&a`&wc=L7)ii0dt@Fdt@Fdt@Fdt@Fdt@Fdt@Fdt5dt@FG"]PcLPPBP\`Wh'{Ym[]JyRɌF +:o3,oP|ܴzBpF sVbaxmB.r1-TF[S-TF BeP-TF BeP-TF BePx``?EFZ1 qrD(WS!ݹ?:{mw)sVJ`(u{Ѕ'Tf 4.C\ߓ,N]MM$ݜ4G5dr/9E/{HߵU888t ϟݝǓG$ȿJr5~\yDLרY+K"2el-h@Q]e=W!t"ĝ} +_En'_<7ÐQ u:^)uBe9Zzڝ3| +;C]L^I&h=Έ,&}Nە#h\vdFSā^hW@n]b!-d/yfM+⺔̷7ṇn=LE#k/]!3Lݴ\Ms0Lr}ٹ:w|xyܬw13m֘9/tq=W=}mL3xFKI9'qlDBh~{_E~gm [d5Kt5&ЕLҁI:0I&$t`LҁI:0I4eٰmqm$Ŷ IcS \/x B{P^}/Ծj ԾjOd`䨜^{Q?[߭fsl?XITt'DsF +ŝj͑n)7l |zAk)*/3jm3rb/g5[ಹFA[sCo ~^`6?oKi_ЪQ[< +iOx l- +X<5*vw@vsljk-r0Ҙ$zw&FbT71PZ'6o 򜪺<~81dњzo>r%,hdM*{Y`cwyN0 9<'`syN0YcsJ9E~#XٙT cn6Kd҉F{njy2גֻ>.jsv}֬h'KM,֭UvD;oF&!,qEs(< ֈ5f!̐ a~D9oE i=_ZJSD?_ܑr7ve&!\tAwz"1ҏWƟ6Mݛ=ɜ/^X|b_멉Ԙ?h_ "6F&zУ(TO80 ppppp_ p\\G]+s,oDvBP3Cm5#6=^6KH#KA< ~σy?A< ~?b֌5]w#NK%Uu]GQ-ȗ-]6W\Wgu;F69hnP) ζ;3Ս$gWz3:]QV_t^GˢosQw}=ݞl=s?r#-F'U9 `?!=KҎ i߭ƌ *)333333333sm1c1F.MelM X6&`,elM X6IgdԱ{2{MEq1F:w,Vo<<ӘKǏtSٓZO&7t|41I=|'>^{Iwݞr}c9{iXz™nKOTF+},A$(m'EZ[`aPåZ}IdZZzZP7x7Rbs(9Ϗt3ɷ-U,zr Nխ|x@:<ϧu{Ԭg" +Xsto*/Yޅ +WhHuM%30%TSs֓F5Ɋ\ysҗ'r_yqWkBñ[7%622XXrt<?{T6i z &B]ii3:Ylg_(3 ks޷FSwx7}Uꯕ4(So#IuϪmnB}M!mࣤ|t=|Q+/GCy8d.xaugm->g;l#1j.1[/3AMf9ffM2ڼl+* f#!fc*]Ƭ5R[QZ+YmōrElo](L4k 0q9Q\+U.`o\=,6b,+|ӮpaeE/׊rL%,nʅsV;\KJ~eXX/-j~~V@BJA,+q=o6kKbOO|, ke<^)Kb,γFxdQ(ÅBalac!ml߷/CltNF9ʪV"FPXeP,/RsP\,ʕ+%:_+/66pyXY.mV +ցFYDVq}V 5"V02m?EG]~γҚEy6>?**q ޫۉs}@:Hj5<6 )LtdL}D x=!\ +endstream +endobj + +1284 0 obj +7970 +endobj + +514 0 obj +<> +endobj + +1285 0 obj +<> +endobj + +1286 0 obj +<> +stream +x| x[u@ @A '"7)$EZ$eHM IYVM4-in6ɦ7qVIGRƵv6&_46:yG3e5~~>Ν{f?y\J)'C k6> U wm5࿉?c)! K_ +tW9<$]Y?ƕ㸿fIcH ߶6{B} +tg]Cfi#~&?鍇+!kpD kk% QATh+tzCd[lvt5<-V_? #X<_Ovt{z94zcc'mo\>7:yO5&(k e /eB|I'(ݙtIRJs.š%z7 ^8O01Y|P< /^RKtӎK36=39J&G<8 w :2|%E{/;ХƦ/=5XABMqjԹ F#I91ԃ?2%rZ(CirԳ@=f!7z|z5qh_R2XҲbze\H_GJ7Wu3V\_BBM4|{oa> ~Fm\Ö[_GõnzԹiZpo%R{oP(*o(R9HPQ5I Z1 c(p!U(9WC`41,Q=#'X(Y/" ^ 0HK4- nI q)@|*jUfyHTuCY\m[6c^O k9eIU(j}q9]L%1@?6(Q2 +W NĻFc/EBPH\H^cBk5)k 5)APUI#uqr9{kj>i>;#%# ><%ÅEAjw'T(H i']TW~M YAUפk܈kW9jS$i+ia? AR j%A#PttqS(d();R{NVnW~=: ivpZw]ݣ"!Ĉuc8}U~-o LRoav62@1n@w= z $SlRlb )6HA Rlb Ŗby<0Cxa! <0CX,%))HIAJ +RR %))HIAJ +RRrC8e2Ű4,KqǕB] ƻW8W%mm2w M`Xq9,S'7xnR`uKy I/$0C׿wPKi64F-V\M-13>iHg{ +ǠܮZnbIlA3$ܬv;i h V2R£HRIJ I $)$%@HRIJ I $)HRIJt;JV%Qw(/J =V?7]wof n' +Y +RGس,u9+ylbׇif៹HgQ/vdѺ5gXDHf^>H~ty~t?:G~t#b #,K2$ˢPYw+/%,m76RObzլRok?Om?xz'fzzNR'<ɱ1=vpl1Q M.BZb,Y,D00t +@M³/@+Jޅ)m 'tZ& :- :-Nˠ2 :-Nˠ2 :-Nˠ2贌I'$V* !fB=@1iDu +#VĥhtFְ6Tw8 Ը?1i/=a{3NpLϨ#p |8R4p;mhЭxe@z>i M^B]h t.4Ѕ@B]h t9R==CIkQ(7/7r(7r(7r(7r(7r(7r(7zw +:֤ +={XUҁ=3(f ++ƞtsMWIޅ6yeݤpW[ͲRRMo&#)螎g==}ބ?:k36\WTJaqPN[}l<{P048S{[LZ} X@_*0Ǚ&{Fie@#fDۭ&Mv1\W^s3BO>DL<(.:- iU,''<`i9X<-y9/Gry9}^αEiE\V^A_<دJIϲIiԡt}˦ JԞ8j#}N%n {}=hMhJ1n[:n[Ih]]=zt596p2^cG:flչc77 ƨwM1A?}#{ۆ&=n/$v҇\Agl=lAe2Px`k7-IxPWbfQ,E1(f̒I,Drtu_;G;MdÒ|KΎg'vD!r-vɰ4.uqGu[K{,Tl$_my{&TOX )WDEtZBck@ vꞡ;;oi}pT(0nkYjKE Mo'QkO;<ֶ9D;4Hdb#g:'kUC}qc1w2vitE"TO#F}p̏QL뱯} 2YtEw(e=RVkj~yP4e@@A]=bekynU,\f8e`ϝ@M~I'=kG0D.yU'R RGWO=986ǭ#Kmֺ==VIs%yo !VIYߕ6Oaodkf]K|.(Ll0h9MoNZ&9~}9-:载j<;F5yֹt;׺+R0^`-ˤ;ʂfk[2E􅾭yl .AK]O|6Y[Ƃ?yd'?4&xӽ*cߙG$ӍUQ<义4FMZuMl+s>W[vnu152Rvͷqu>b0:yjD4RJaSΝݹ/ж=l=OC(A*P鉴֬Dz2? Gs#Ga(Lﳾ@zA Ty\ +ᛦU1?֧etlVf}3q^aZ#h}\o봷t.-itW#zP+=2+s+,3~Vȯo*|c#2i0v_b[76Xsd͵ڼ5ška͵ZXs-\ k5ška͵ZXsd͋w]vcx龾)k:z۽SS֚t,3Lfb+]]+ݽrEi9P{NbU*T]bZBUh +-V*X;Wcc\!vp]&)$S"\+reL5 ;yfi}*r3 g~t[Hzi&0b +.Fxqл;_hJ7=$G: qesc w [g>$1cu^#4ȡ楔t`ʭ0"pw|_|Onl]ԓ:ғz[>KOJz_ij%Xa}M4Xct27ۑdݷvFuDka~1Sd'BU-.3)~Pw$h ~z;$+H 8/ Ut*  hH!wH;$ x0Ov01OгUrkWIc$2 An(/¹T7;&¹T%ҹTa HmuC1k[rdP3(MV@w4u\!~&ÀC~ 'A'@ˠ O+-u5 'q#ccE.2y&c[ a' ;ifk ' [W]}c 3~S1fr7`%l51|M +SZh$[ th~ mVyQcuY:MI#{a!qGL~ِ&T7E4dP\Eo ɡL_`>=Mx$l t9+᳝ӒϦ-—cűj_#]Mu,cɄ2*4h{mE@Iur{j::Q()}=GF%=hzfG?ˎKKܸW@ \$R8r@}r@~ _0}$#J^Tr7Hmz8X@lb~cvݰLsö͍QDhDMCmj5=tJhmgo©3;Z.~Pkkؼ?:wtGJMѨr%܃v1lN˰uTܕ :1_'{˜- Q^1 x^.C) % %֨$IsޡUkvP:Y߉~wÎplwjJ8r/L#Vʓ]vv}mܓڛkyJM3QΔZTL+)픎({A{u~-Weݰ2g(.ahj;_|ʐ&&K>T)[O;g.qFZQYj'syF38fIFVJ5N~^aϊI pk/^+B +.e_{CUbev|(Gv"48|GjS/ŎEH8|}H5}Qcn^xahԘd+sD04xe}E+[*[Ryêmb5e Gf|/|$fR=kLs:G"rd6B!i?l m!`3l6Cf !`3lfzq5H>,b鶺,GSnzz.,|DG[=z< .і +MhnqV S +g9wGG5n.@KUeSwv0e66Tj+KJM@Jx t%Zo |ͿažaT}bJ9L5)r`\k4(zɩi]C1T˂GGsiՔ*UoT9԰{R$&sBq?l$`tΆqX\쁒`nGr@tcp@m ~:|[>;]sOA8/ l Cn_2(k'裹Qb0O/k}rYܫ_*OvC}_2.Cj%϶Kjۓ2Pvb_^*G$::ZɫX0|b%C*vXK{oҲWҦ+kֹJ]_:]CMJJ]k9!La|?/M(nvDw5TIʭƾQzo./|slvgwҒ83j9c6"r%XoX | C0º(32nEF&Ŧ,:x \YU4[JKfeYU z"FH^dSخ +A/\a6ՠM M=πݳ7ڮpzN>]X2JJ͑|,fBjjͯє%ke-̷颖<)DvРmcP&Tlf/?{fKqBRXNHqBR'8! )NHq8!řf{8 デ|p>x8<tհU| esϱfr<vy |.lpޓyg&*yh{$Rfs?!^OgHy+yEto]*|gH?}3( NfT*HD^ -R}[^dRٔi{7>{ICX H-G':Uj[_AiڲE,ŋ۰,9DiJ9.z)EmسW-3U~^醖'oVM3׶ }Z{ڑḑLWFP,o^mI9u/Q_-fCU@l}P+bD~DnZ?W5("OaG/Grv3(avWqyX5{{H2o 蟒5GZp;3HPOiqv#?D>/\&P 39#19*| +O_&GQ&£H󑣊e2#OQHcWč<;D>RήHFBnB-iɀ|mdWڌ|}psw",?gztAvR N115yz̲q}+ϩ42ES nBԸW !\5+@xA~-hnUO l?BXMVBLxnB^3c Z$Ē" k$i!6!v$D?BkD\& (!xͨ_ oЫxE|?@ۄЮ0A#!!$z !3>CHGNܧP߅BunF[{P~/ُ|A@Ay =Cag3=+{ofQ Ⱦk~+ +彮 ےA [-qn^zcBꍉ|oJogţsb(.N1 ڂѶ`x|B*Ktd3ϴ^߼ϯdVx?>XΠ]Luq};63[Lv{aV. k+s+73dב{٭b=)Loe3ٽ7F%lm+[ٳwQjKy @<]C$GD LL`( nɣ7fXBA +uo}^.7@e(u}nkYom y6m.'k/5nmg,F4MC,[m`f [lootϟ/K(J_-Ngo-r7V76`\n]<ǘvZ,oC+kkhC؆BѬ<@c+M9hrlE̺DsyJo`.pD$dVp)($姇yYHRrY6b߀D=ΒapNmť- jwo" ogTV R}ӽm;<]\h$:.&mV40- ?OZ8'h*OB%8R6nI: emeO-[ӼL [rx}C 3|$ mVk,۱W$eun}\z9Ouc\Ɛub6}\\B>u؟s9Hz8c5[-ܔ_.XŴm۲T]Bx& +M=>,}I!exaD&g>e}ccuc,{c~5rf/p_Լ"I^BEҦ )G]M?9ǎ$K<%C1>祿[1C T!{7Vb'F<񿼺/-7*I=[ee3xv +endstream +endobj + +1287 0 obj +12677 +endobj + +542 0 obj +<> +endobj + +1288 0 obj +<> +endobj + +1289 0 obj +<> +stream +xͽy|[u/>b#  $ /p'HWBQ-E%n")ˊH)i׼痗&yhql&ؿ$c^R;]M"̹Iɖ߯_̝;wsΜ9sfX&; ˟y IƔ[~8X %9<㋌ =sx}H)B;?/2vo8鳖e:29>i}Y:1=2̲A;ނ÷Ψr'I𽍱gϳ: &fns}7'o30S Fx%-=Úeg;r\|OPI8RZV^*}U&Z[7465wtvu[ӻa?ߦ|.&X7+gn96cmlR9[(9X9tqH&Q:D5P,r7&HFv-Yo(ʟ Wf?Wv*Y aJc{ ,l/[$|01ZMI\I+Z~[M9pV<` jGv[l,`}sAjrhRR Lnmfd2kȃi#v0J.cB_ 5 @>RHM6A2+@1[JOuTZwκ6{ˁ?>K23JµY^=v̱^rwC}}Í6W@šoV/g"U_'3,HK 3HJdڧ܋r"r[5rhPOcļ fR0| J_9y8ǞXn2(.,8H`$j@9(RSQds*)Ta:a:0a:0a:>I`@= 0F!P/KN @ r(gd!f ^ !M(1E! Sx֎\yN6D`Q(@l\XQtrPEeJahLo@ +bB*̖jZ*Vo,(U KY,pjk׮-(74t9+J<ޚMe][{pYtNX\y_~@Q8ʗ)g OW׬{ ` @8@<΁My|9j' ld# PÕ IP.8c̃vARE++彬c1/&5g'23#BJ8e0 wBr4C[B*N70rCa`| +iH5RTm*lʬZܺ3^3/S׾=7o w++@UC~Y+_:-G2ֹ|hsa[=)P/iL]hUq ʊtkLBPCo&N.4fnHaH 6@29gpU`.2/*/sk S}mcO%"b%)LlH= +M]K$'5CUOFh,n o +,!6lƠظg}e\憥Ϫ?t;ۣhKHicV Am'Le>1F& rhX$VdM'N#7ENk()sK͢EMAH0iʾ4n}DSvJD@!M 0wKH=^OP$ $6Ew&fd +P,9Lj@eh%1+ n1piv(w|A/+'Y/Y/Y/Y/Y/'Y/Y/^lv +k8lBV#VN#K+ꮎh:w]Iok4v||x,[no:X_7^׼=n]ۓHmQ{@MhnV7JX`"K.s>C xf]iTġěq8 + C8P"δp.CAXc@k;6p44WU0TU +*[+d3ϳV8N +`F@pt6uB)4R`' dt:-eiqHBhTX$Ƞ) R0! < φuN h患QhؔDEr0!1g5yѺ[=}#ʋjl;41OÉr1,O~Y7TmIϧp˴H$EWqT +ר[t'C8JU{ZB7rNNm4ݓܾL%(. zgAHp9!): $)B D#1ѠΪ5q [N_ʖymK(O4 KKKвRi7H )ԐQeZ'{fa,%nnB ^Bm9#s#~$PΟSMg钙. |RGޥV?KRη 钉r<\]zU*ҡҍֹ$xQT )`,f!!vQXk u!۳4\An 2(+b}B +K}=#E;0NM. %;EvuR[I@ϸj?.$E3hNyⵟ34|;Jc(L}@+`ҎdMg:kbMZ +]j]j$]jD华b}#R(fY84spp'- +re37Aץ?w?/rvg88r|nQm9#lG9` 3[Wt +òBWXZ?טt e)*EtŌ\3 +0@$ K &,M8D1`is=hAA`=h|bn5l|:5Ҽ\U]`f`{ݧڎXgV~m.Dn-ogk=cm=-8<= irE ai;g$GN u9ABr[j[un1y4LJoT)0 9 |N6+rT+~t%%n_mZͷo}i,һaoD0&|xS\4vRchC4Yr)F© 劋#5H1kUu6ҟ+KcOOmMg[K-kSD1CW~t~; K߃.~T~+p]f%(+#2)H>C 17>tdp\>)[ACR<2y$J&1nV)B0 AM˵ `KS)r<(lGگIwrz?%"2[*BbRy,'( Vt[t[mR(;i)z zLKκQ]Ooo|(&m(*ѝ͕ڴx(TU |{L薫:~8M 7ID I(bY"ז9 ^lR +:0deһt DeJnQ! _V| +նƬ7C=y6a1e~)s*i0+2r$jbPy6`6`6`6`6`6J_]qjGLqv e;H^k57k;k%s+~7OҢ[}qrLEdlv3 וӀf2͏*]%QI~AZ˪`I/LK`7 /0lpFfYf*a!MOk ",> 3z=E$b)ҳ~GMen!94p)'.rtJk"PIYE ,0ɱ@[-bZ"e4h*F_8zKj r7*4_ o3^ܟp:߇Om%6z~ ̉i@(tE3X\U^Vj1Wޥv(t;סDZhYP-*} dR@蓳 -{U.$⚠`R ]$C9FhlH8N1CrJ $~:H~4ED!oRЛ8m82 fظ2;ALu*sY7!EJI!%"1̲4ԓeVk4+?$AE{C[2 qzHl$-,׈^%yn+lҗ4D{hhBʥJ>䨂48ep13.?/0>nZy̵*/R#`9Q"ײB?q 9"zX /]9me9 Z~N$ 7ĉŠۼ(+ؗsToV=)$94x' O.]2 ڀ}< +}psl'((_WV" _iVùC.8.8i/CM`Qp!50aepɌ#ePy ^h=ryQJE^;vtz/@ka J dR MYY&YY#h`b7u PK,W HDpW2-VШ>~tWy`e懽T\*yeNC޼\+-={ˎ4`Z @K;+S6an@d1$}rXaz&Ub4@xBB# m[WjaU jX}/:+30H8а;__fb2vhLr'r@7ZĈ| ӅyZ"W 9oWI. wLƊ ?nժ^[_cPl;vc{ʝi܆ XxI]8뾰Ҥ/L2RGI E':X1gS夓M D@7F ON w&M015؃Q1a-E:]0JATD f)skcmN6pfk[/[0%[MbVP'0MLLDS'h 'ҷ(g@Sj)5ДPQM#v~ q$qN`|#ЀlMpZ>]58 y(W2~ uᲖPv;n٫n6l\0vW=5accOMc۲-'!  Tۢ~H1p݋?Zн"xX(nۧL~Ư40 _EiOjnDHL]rzvG#_>0V7rt/S ԙ$m<Խ ,yv~ I?>C"Fwtc2hz4y):$pш@V.6p?"_>49{VNMIs "sM*5><#r6Pj6A鲗ny9.^]B YsHC2pbWWMt +:^«%%ŘE/b[z7!p +wxLL n[a&8ԿJ:@?m[.#ޜܹ-~_%h)7R;V,]P@ֹ> +$ 7 +USWdн:׺d8B|* +r?X ~ +F&n\,C*Y_r t9A|@0N"-{u{g} !7wbM sk> 3V< PȿPyjO/߅m4b(yzԷ +.e&wvk.XV+ҽ*XPFo7p>Oz&I4 $oX&$uqpaHYDt|9[DLZ*e @Ky;v$HVŜ+:1n![jHWb^%DżO/Ǖ|*1pŃ.坅:xJ`m5:A7),1lO{p '20i4G`BEYȻB\ ўiBt%Ct $!Qk4eSܨByY݁Yi +n,fig[O䄝}@3|.PBRil 'byV<P9?E&BVN.\[<@GJ0$Vp)GBXl +` ]5dR[-; &&`%&R^@W/^L|XH`YkJ|iٸJ2O'@̃ <`0Oo +3֓N#`dRxq0qk1H]GR#Gsgͥ)rSY5ݾm\F OrB ڦp\4hvsY+6Re lTTm]?#>ZuVCSij{([d [4iZcd@ݰ PJnˣGyh pO* .&丑0EWC*/H;jN,h$r- T[,hVʆiQ[|uוڃ%ui٧Fw]n,5*ͭ:GSXC-c[*7Dbi \T0+I`]D;#XVPD$[U1.U#pޢ8JJea\ fk>/E\1#;wXaf y쏴"sÓgl'm@!SLv jqmUׁ*I_vMykQ0Ý7U`.:pغQoT%Z6]JR,UCdv >`.5fz3E*ډ9?Cf8idf+_/$irdRAiMtTBhI )RR1=`Fl3p+U5 +###\?=kmN9_3P}ܣ.6\(m(9BV KR7jaQT"_RvDzeZ"֕Jꊶ=J75ll¤_sIC'=)cݺJ:)kIMv3).p 鶐E"i͂&fAdAdAdqJ(}1A<WsXaqgUSEm{j2܁ҀrWL- +!pɢ\R' rw7SN(I`P`tx̐qyz Kf|.L~݅ !m$h`A@l$h6B!0');kjjjSjjjjwcVf{87˃r`khWV X<,"ۺ+`K vScv:{%ڳp}yOe;}SO׶hŖCM7o,/ܸ4u܎ ڣ(}xeV|`NpPkBFSvaڡ?ԟ;iم~pρ/ Z۬<4FcEՁYCٽ{+퍠c s$xoȳb{^ yhH$$JwE |Q9bnk39Y^rL]X}6s vq=kiU)2rH y(Junbi毇8jπ#jM;?uQ0?OaL%ZWW=]Hݰf%wDH +dʬ^z@3׻M*rm"8_Q%ik @BjW$:u;^1vAwN jo)۲oYZOgBJѧ]޺  ]q}w]VpȷC }m(;Lf.7wD@+Gj.\&"M5 SDeϹ[P$jB4V&M<4x`4@y&M&*牂Ƞ|Ɲ%U(Lʄ!W(o޾w [g#2sV5mrY啥7/=Tc%-=74~̘>;zv]=3hJ=|1Cv|!hc9WyW'Ԃ+kSZQvsvJ ^֯cxpS5姭 f೵ >#.ܭvBj.5;+w!ZwkeA7!a0ts9ndƮh[+ƠnUs͵O=v4Oެ5nfYKKwW:qݭjKQU.ϮWLcPGyZ'1=wB$|Vmw>*370Hx`FpF>CAg`LrFL"|З>KD} A&؞ M3nUvH9)(vORhhnNIT6Y4lW'fZCoMZC(1EusӫoRڰt;H8x[Gcry$ǼkbFA r5>GcWSMEeuLOfQ,kUU)ՐWw巕_ }wRO=,w7qT-wNCΑU$HefG,:[l'!p P2VKA^)B9$mt }H Ja$2 9AM^$'0#&|͙hmsNU$LIf9w\Ϩ܈b?,!ٶn#'pAyV^-zN*n#p]:G čh<ڐћ%RyԴ:,j֚²έZֈdZk83X[T^Z]S+5ټL%8)olp{EYr +D~}4]Zզ-4_U8SOPkD|SB:j h揶̇&yV]wiw `ġ=|`u;33!gUߪRM<0뜂tŰ[5:uV?[U=*~)]x*?@7gM9DL$]cJx] wBOFki, UQ];*ׄMĘi{=MzR).tRH?8c܆Z?W m!xk\ElYnN +CK;ԏrjZSz +"S솖k*Ч^ 'ity(Jњ"+yasIe`UH(dH|;)J}/ױBȜ4*՚վ ?!BzlN@: x~.&J#Z8 E?6Ƨ~B]mzwJP4V:O!҂ÿ9;q~_8}>=ca9@'䩿"b&~38H_ odYG9)uʩ$q?if* G_)5ʙ"5ϒSJRrޡ3T3U2^ Wg~|?鵑bAR#(UWrz'"4op@s0opArC[I%q(e;\`zr,z1u.u-DB *Ǭ +3+%$V`;NŰpz'lHKUiV`˅))KW^ĈfAՔ,p{%I1^M"}:þGǚJ]PD[r_SJr@\)UY9K9ҡzET) T+n'CeNPL\ B2xךvWh=\Z<$H(7 >GoiC,#t^4~~*PLwP\DX·k +nI؏9ԏ_+(~ne3D^O/gH$':|fIr qx.EIsH}:0!3k:0+iKAKCzd{R +Wʗ~4.5+ߩPr-ЦS6Z}oi7'D8D-%>H8"-'wqGX*le*&Ys@y}vF~z2y<ɢoSmp}c^Y6){8,)X9/Wz:p݅ђ$\Ea ]zsq a"J7A"$ˮ5hЏgRmDk 0*YE$ҡĵxL'B@ySkiIB:gÿ`#?{]W_'tV&3<aEi߸r{2?OYl7ZŽ{UD P+YRRR>$ Rļb,Pg?0~H7BV7C~ò p +l{(' }ipGY~p{UrT::Gx4Cy lc +ҿB=: c z(ễ h9nGpLSm8$Cc̔/Kd,1+١c^b,'c_C~݌i =z"$(=X,X[šM𽥒v]̦BHІ2wuv3vAnzC}2q3<u'FQHO3yxn9A[9?r-]VoHmM`1 7ߗ\[ g0Ilf,- Aәp^ %f{5)gS_]be%VYiXb6c0ܦ/K TEӠ$NgNO%`6ӯ$\$df^JK3{$1~N1f4p iqlmGy>ߺm58pylOqs/̱s9~c7/5wloq\8MLj34?70<; IFOL +$FG#SlbxtD"0}b~3Fcӳ#Sy ;O$ƆGs8V1>95;~<|@]4 TGC|jz l<2p U=2=Y螘[ s[ՁGҹó |>8?/)|S —NV&GύLLAgxmĭ3ЌT`xsxbCk*(?857 ljL+o]M[#ؾ1|zPbpb63{b﷩@Jhĉ[б#)|#'8CS0|=1;>7:>2?>=5'b^:my| +(|urZ4PFObnT`iIdg5#$%nHHlM\ںh4Q +VPWEZ +ZE4y Et񹹲a!(ӇQc'xcs@O98 GƑ) z9 +k9^YmsCb< +q ě0>35,R43=5 +z&r l35> +endobj + +1291 0 obj +<> +endobj + +1292 0 obj +<> +stream +x`TU0|ι}^RN&eI# )@H IHD " +;0$PQ[,o,b[twL; }sS)y9g0BȀ gê⥫ :BڰSIꖶ-[zUY0,[a141,oo|wϷW 4jhp9dڙ 4\ih}zz +ҽ׷1I̛MRÊw8HFn[Dt+B omMm A?y!̣UF !APA FYXmvo\MEn?3GeC壱G>G;h>Vh?OgHZBmc2lZ+ 4߅mH<u_Jk&zd Vg!I% ``2\yȏh݀@]!3ܼ;hID5Ch5a~̸ٻEO)/ qٜF?ѿ<\e#0 +CuRt9`t<쌞 o/\-؃SpfDRB ɿ ·y9ʼ||Nb׳`ԇh]aV*Vnރ1A {! pKRLJQ$~ CjI=~ؙj(GwFG7we`8Ofj=_;G '__?s|el.qx&eoWn|wͳEg4=1I"$ddFvQ4|&_[Ĥ2)"Yl`63>_c>bYX?3d3٫'ط/pz&vcc2?/o#F%,6 W +D$P7paYCϢN3CVlbhs7]KJI"Nx-^:CCxz8i'YAֳf|0ۇ;wX+ogւZ B;zUhGϣ{yu߅R$4OkCF_wXp?uF3b@q:R^FW2y = 2/'%x C'd"Weܻ}ӹ@,%6/phs-7ABh2iE0#RvF*P3գs=2!+js+d_??AEE2ݬR= + J~M.5 ] +Th:IB+8A#[P:3{ÉᲱcJG*).Y7"7';+3LKMI$_bB|v9v"MF^'bYSRIY4!u] +dUӥԩՔ5PsjXVJQiVRPޘP"xjQΪp +j P*'(]N\|GEh^W(oee:=z\5qU:LhQuy*< t]LJE}cY.\X҅! +*W˻N]5jehvȣh>}Kʎ,{sc9|= %A+Ƞt!BǪYk#0&+jxfT匿z]$@kˬj-%q("u@c-2P2z]j9?U,ՅCqV>uN`JŎnʋbP#11j)P4QmbSW)1"@jV*IZX_CR ņ5*4<=zXz ;0J]cnXY%ȝ;*J厺-Kq.a}nu7n|MMUtI8Д?HQ7> @yD1GZ;$PW:]>WZWC0"o[R E0~B +{ +T+fbC0ϑ6s,f1$O`;2&" $w&_x;4]{QY}!W>,֒lJCeE(k۱(_`0k(xsd3Ӄ +(sD=-HĈ, !B!w +c  T[ ¹>\Y[K +1y5fJҮz˺7zU?~y+aoB NkE9gGڊTLGE3<`D|Et,*hkCodnNŽ넭`Ymxhq8k$UA3e|ٳ,%*]2-aǨ)ĭW4H⣰b,2ep~qdB%Z6׺ .'N[ +PJ" +*)yWtF=)e=Nofbi~RI@:}~8$FE86oFR)fx>OiMy;_y􋖧.\wo D dB•"^NX^4 /9I6fD(` MdcT0IȆ@J#I@1H4VR~ƟD,|ҥKMuk!_O=sO&sG;:˼j6Drif+.H&I\lȡrqGqhoϭ")@MFnJf&ᑭӍz\ZP5KxX mQ7Po*O((||&= y,@94u2* +ȶB"?(//.w=ptWv}FJwbo{oF?W/Q((ˌtcxKI{Y!p\O90Ê,˧1b+A3$9EJ@sj-IgFp:='Jh4(Tİ~NHG<#dJNXxQڄYȠЊ6U mٽ*;`#5ET`Q5` 4,lRṳ%]C⇢0I0s =.a'2L!O~Y:sN~sRkzd:u1Y:a7ҦNѵ_ !i[وæUƄĐ a"Ӥrg=)W@oG;*e$/C A_zI "? b;LLB/2D"2cî$oF谮 PYD0}O@SAyqm LM2R E~gJZE&RiUZi6fb\yن諷FO{?pß |/ܱ7>u}N{{<}3Mb>Brć)$ k4~!QP,Xy# l%V"dG8`_D` UeUx@h05TY.%`L qlT1S>g|8ɿ/?}>iwo/UQQ Òa qS=jq8( Cy3>u(l !DZI2~/ʅ{o"`an? 5"^P")Dߤ80^N^+\s<\g04Fc=c4^ou(Bv=YhL Tgh+qc/ϰﶳzg ]zY ko.6at 8~r D-՟&crӂq >/|GgՏ5?r-a_4EVp~A8&%tðec9t%Jݜd8A˥XD.Fcv!iBW8L%6q[6YJ"\T:K|nuXϻdD@*nk@d} 1ŔP E(_T} Z8TC`̀N<}}%Z}y,ywOPH4=l<_v'Y ~pp5UvEQ5?Æ.%Z0ӏ_iHa\nR.ŅLP$Rl}7nC/Ѱ{D +}ra/h/p!&a="&0RXIxժ;̰&a{ @fb1rMXSg( vA8.[9XLN73{vء d$A``Xz$$>QS0(/-9}>d#QkImIvوk6V"őǫZfXo '92r2~&_Ƿ[xo'A|AAzYFeEͣn_9ƽ{OiK.)^';1p§75'uv j>b7F kқޫl'xZ~Z #)45A/)q޸DgʖT.hJ.OqɻėQSb2CLg< ΓaKEJ_I 'MjaX-N윕56Pcz3SdV&|lraU2^B40,ST!PI +$nw9lKnٶ2=0y wtc+D?p7GkW]nճ;/r{ݿ++؋0xmkN1zu@tdu +?hH"=DZNw+I/Lvbh4Pj3)T꒶:~ +$T2@brr (o.GS$_/OJ|W0cy+Tv~vD]ߡM <G9F0u^+>43}Qq_K&-_ӻal~.n&q'e`t;_b+a28'Qkbwb"((h)Ƞ4M WBP,3R!fiaƏ@¬٨#JQ NHpb<2dބ6e(\+1[۬!=RJ:j ޺xJ|n<ɉ;x&>B)9K!\߹um!KI+RB*! ȂTY݆BAZ6@-lgv"ӏ\u|Dއ5\|׷Њ޴p_̈́/[:s~/?[]_ugCEIq;[f0 ?haխ{O@՝ٽ8R3yQ5G`_^}KT0 +TXrQ8b8mVhzCTGTObfp'֏E~,as` Do9CxOxZp$K4Y.t4;~3ŲN끌HPȲJAPأ2$T"3>BM^|?6~'OԪx d^/ġ2t6if@̉|"|]'o{-=ٷF: `lj+\{ٙ0i5W󛪞F9axQtIhxQgَ4M + +tS)qav#aP kcufX<޸8wF&Qփi;ZNH4%&&Jp .Ht8ɥq$:F!n]-+ˀG8#䗔x9;G㞒nل=$'>#ygіr%4_ ۆGvyTGqIrr.s&f՘Fjj֩jb`I@B#Dƚ=9?|gI` +> {-\L;Mo7=PɌsg}ǁO5X9qxri*z:^3D\<&D05iz{\@ճ>9V)aʈ伦ZރWk{󌼋 'fY2..d#tن|xjq&ҀHYayr§[rRR&:;:~̀H L|2l0c*X1b}>^3%ZQ|N|Yxj;&~P=R.@dUo>F/ W[^-jk\J}7Ϸib!vA͟a &u O'༣v3nzL󾬌U{^x"}f?߻8|$i `ﺭ7vՀk's֕0eqz5ꮳEqN{TIțMs89LT˲V^X=Vp.6ߘoF&DLS +jc +@] ;1P4Tڙp ?{;0~3xū-\_]}sr|⹽Oܾ}+PJ+C{Y.&xfCx$8Mt!h]8u:nӕ:)m6+n (' f#zjyռ̚#8_VT%8NANkzRx ԵH(EՅU "HDo{e_jZ$CKljzu͓}'+3[my7.|U$t8S/⣾bb&]ú=D@G=/zT&Sλ"ZycsJq(n,xʹ*>3p]S 9R +Y6?LMNGHJM m4UJJG;5ހVbF,vn?vٕ/.[okjD\}EIlUo_sOg<ܳo7l߳O;c3p—Cۇv΍SV:85v:0a"a;dl lvSpHNg5Nes!#.鵝 mxZC,^1AS;,Z""pQm@Qz\]*I|!>w>wꆊƎ,_Mx9Ν7K=cFF/b +JB88J8jDl_ P##.6nɥrGk Xp/2].4O@E7|g-y<lI]qmqb0!)GB͍Drj#zt:@xYDm;t2=mPwbbm5vp)Y8~Wi"I>-j"\;QEEC8(1lmvT7QOO Z{ߟߵ'Ck_#uBMת=+_2v9]gԃ3xO?|=dΪYa~UwM*&M}lT >#p8W17-2aSSճ&bA܄ QnJ(ZPmvXcr[FV60.6Y1B. gy nyHFеFC5vbT>p%k8p5[)v\\[ہjۇh\ bh4ZtUG%L)c17̻־U; /y9Z ;$Y=pNX)=J7S\0C"-1>)G+=!%q,@%LBv@qsdu5Aha%Yڠ¾67kCZ-r WeIeelxlꙚ!Њr8>G]VMHSSYhkT4<;ķ!)Ԏ ~) E'|podcS3Jz#]7t\pan!{ {{;{''H,63>Ǻu\t5sƎЂlPdyD#z'|;:27 <8V$z}`avv(N ]xPF][ճCpH6pY cQ/p| p_(1]օSF݃&fšʂv(P2LB?_S`*qgut4_p'ίv-%g)OP)?WmrOp'~N 

    +LyKMgNL#|Sgҁ0Lz!XK:~ NHL B3)f5`4Îm6{ UfDeF;a,Y26Њї 'V2>9>DaQd]QIc(sOBv>& 8@7M1^!*C` v +p4iom5Y= \uFYk+*+zf676l7<;?t}%Oh }1dTEd$W,&K]\ҦULʐ!&e"8e4BU!' 2DaPB}\<']8OmC}AWzc}! R{ݪ~ajH I6.`|AC~?mʼn+nn;zcru_Ʀ_ոs.#-9?V`F?fLHA# XsZN~ڒ9L}c~|_ǗsS^kݘx}.ެpVNJ{$BRKT3EC]Qa,S_K_[qtw먎%ߞy;Gpy/y~ϭwmذpYwh3; gA~c87ؼ̍rUU.6ElY&zz}- {ܩb< /yя$lJЬ/3-Ad/.otOCXڮJVzMPRS{mK9[K# +Z,)m~] j[ jcTӘ;`:pCڛf~e'x:}ꊺM37O}ѯL$3y]xnf +3UX€7ynM`#tK}^hTbKDE|V~Ó]|3"XlDvC1h$uMA#O}{$ZڌLYb7ee%uᗞ;Ox9{T[;kWs8P} ]7]n;"G_Y?[O\ooVc93۶c+o;Θ,̚ѹ&*$X4_f$B2 obd&bAci; MrzhkK׫CmyI.͗Umq\:並V5m1%nr6:5RĘޮ_. z~A< 9;f@˚}Sr)YiڴIFFS|M2wGfK;zE룰[wNb2=o1zJNՃ \\ޯ?`d+ z&ÐO +XŠgŮdlJ8 /]@r$wL"jS ,9|[ Sv\4a:W[ `YPst{ʢm#͹űC gڑ_rУrzvyGs~}rJo g{ݲY]8m++[*ddlN|myys͸}…WF )mMwOfe1#>bћ;'pH\Z2DH\S4bC I *K$F]=q=6taow@euROsdAd1tkEۑ_$2bW®fu'J(f`E`3iމˢwms*I0-@WkTn>u|6lu"ܢ{ytEZ]a9reux`v8=v'Xr;=D f9ND).>h1q8o9U]]ggzHAG7ˮ⼺bo:eڪ/=?D}RSn@ֆT4x@ީge<鶤-GoN8mOߙPwNwHS_ͼ)`m=4F1T†kÃIL(l&kan"N$޴uU#Q `f fZ.LpRj(K}O7K:*v![5EE/jj~ykY0 7Ǧ=Y|_QB{9xYglo5\iƽ{_OtLS/P,b ztnN*S[yދL6]Sjm7xv4";izryՖ8ғƞS:=5CoDsa '>۫~hD6^4wW+Z*08+.8K+}Iնk\lbC6&fdI^{Ѿ<dIzqS65K\tU;խ_g:KnT7cSn-Ö GޢY x)xGr[ d2Dt`y&ǬY! \34^נd HlN$}! cQatdQ c[ZH(&E@xTiXTC=Ȣ?t'4G.unKW@("0naיyA~t<6$)=MKO^e:b/93W6tdK/6(M&aa1r` h 2cu:ub ßIW-Fɽ9gs@թ>Jb?1/5GfO*Zb;*$n,J,u{ۂL%7E>"{ }\SUWO"" q+ywwk~e!B={o8[.]\ϟ |oO-KO@yPu$°:R DH T݆YGGbײxnQn~{g!F| z A P p=F.g\mB<(,WF/ nw;-eQKo\g`[y]{xM9[uI#FH !VLxCȶ!lr!O!mG(J! BI%g 燐D(mD(32,h/sAh򠏂isXK~);bjP)ZtBA`ve +j9wD >tjT,1m,r/c01ybBgl 7` Fr\ r\} &`r+c0 1CfP 摉{& {-` Ulx}2ЗIx>+œy VaG`‚_ix1/Ua) 5/n5Xÿk` _5k +]7dzȷ`)bT ̢x)[M/JSb0lx&ii %m^65LVaڇС?i*T?4_Ïc0+e`0_L۹Xv`*ic*R Caq!K2/Ð! C0.g +&0hmoC`C~Z#J﯄x6-;j5q^ a#p3M:4nF iԐzZ+!W&oձ((z + +BNg)>-H6`f~6ZlV]OFhu:G_jڢc]>B'9 (,tt/VxZUObQQZOXO{FiZ:9~ 54CO> /|?ǟ(#3LXߞև +|J/|e/b<2&gLa{" C\.X>E GcOFe|$< +`iw ۝{V$B +ySV苈_o__|^xwj",ڗ!;|apE-Z(5K 2e2U@ᄌ|aߵ,<1_/ۧvu-Hc4,I7(vvvovvv +G +s9;E؝ E(& DQEV$"N+v^ҐUaАhMA]6f*:gUU|j&j UbUd=1BVǨ 1ҞBGPE3ՇE4|;嶱=c;a@PM.0KdxCYs |ygM,DS2L* Tt&@^@^_?efCf)dy86#"BMh5 :j +0 +endstream +endobj + +1293 0 obj +16846 +endobj + +544 0 obj +<> +endobj + +1294 0 obj +<> +endobj + +1295 0 obj +<> +stream +xy`TE0^Uv:Y:BDrYh7 I – &3"MTFGQG\gFS18{}iܪ9v0BH2gqM_Wy!lU?>0enHt44;7E7Jߊd ;k~7e F݉Fb3'| +ow)|F)d!5q3ooSlP!|;sx~|V/zvvF;V`-6G< [Q 0w9$ D  fr5yO=ҹWĕr\j# >y7)+v)V(蔷+utCMb .)/RX} |ۋ:!x `f^r:[(`+Xxٚ"2ύ4mA&?pJN9Í⪸:[E׹s+ϧa>gKGOO3)>4ba)K9@9D9A9QYܪ<|SU :-<+H""~j8›jA2˅d0.ad;Lscq+K? +{\[WcDJ`?p:˝J~'z`"Or (0zk«RGq) Sp>#.*>Br ݏky.TWO ي%B`ïz~3Dݰ9UCW]5Xi,7FPS|-ZCByn|>*3A> z`(7j9c/x>AƯ-'!L!h€A Ŀfğ@%{P`]cc7FQ$#}f.Lv/,\ QAɨ,%pwhltfGqd_|$=&Ɵ͏/BQ;(#@( fTG&[X=a+`Al-s<|ꔡrِkJ*X\TX߿_^>p(#4r:6lNQFR4\ѣ` TJP5>Qu)CϹ?)'z==(>RyP:sDRv1x,1Xp 7H#(ʣ#\^=ۧ E4ZE}138#HEEQWp]A F'L^>Tɍs(8,j.h8&* *4R= Cڗ{|Nͮj53GJ:):V^pt Oػm.wKrRt[41^Yy$LX1YQN ӚRTyA5ƽ9&y.6O D<ʚ}VyҊ.Yr]'whJ vt@]OXw +UL,+ +^ HA@ D nWh-P>^YDQEH JA^]SB7OzX Sp4PQ>:I0(JPmM<@ @ |GfEmĵf{ڑjrPD{`ӥIVL*>- E-çsc3{:Ӌ(cN +`idT+5M.Vt[rA_u}t9X0Sflެ X-18MGTHS'*ʆU=I(w nAi5AI n>D^$/nn,N1Ng-xAdiD6MN0^=" 27HTRo`f*XJ)C"+ЏHS65h tZ0J \4 $ TVI;`ڝ8#⥪KĮR\\ҿ_AQ*(3 (>xj%Su7¼ +NB)M ;}ƿ\UC';|)MʛKSY +Ow;ud*d^ h thʋD" ;<$Б>j:Hkќ ӘD1~^ &&Zuru)Iʅ9Ej +rLҸQx@y,y[x[ݳScDojAj%0{HdM2qU8VTYi +vM$B0=3lLb8.|cDza 抻^j[V]WEGYA;|5@OGW$Gd8_4"A:ӷg9o9܅zx_7NDpepZSwzjFѧd|^ޗUdzӅY)K0"ΣT sIY._D$&J,ޮ/oM<$"q־TºAzwzB0/daG0 qQNg㝇E˙J,Son%5HDrRNڔ-a0_zqv7a<!ظ'mۉٗRXTg]T%VʜpPz& +iMb;Yp0ECJD%Q0=<5{]]0jֶtnXP'έu[쳷_ۜn޺j|[׭2v}}u<'h7Qqtuc1_xNh9%ҁx+WrGc|A<]I I>Ph4& 5_JӉeRN*EmFBI""pLAz9`[ ڏ)KTLJ/J(KJ6 2F !n.-(p|ZZ)}dN֖&p. em+4)[ę0{^~#Vg;xvP۽c%$°?=4>kBkyWoHY `RFuGD'@2`d5½"ms}'-/ֽQ-NCSS=Ɓtl4`ԃٰ@ lE=gT|@]i BdB):3%$m(.BF|/0vÁ_TQ dm …P1tnjK@^ͪK ]yx]O 7˿ͩ}] + +~a׋WޯzԀ+Dz(N1W.R؏`^ӷp(ώh?x,•Aр׀2$xxMc/u/SkLӻT8Y-E8A`6pĺ*ql7f~a Mt:P#(::02o_s'(|fOF̋LSXFT/} vm}m?y W"*)Hc R  <cJ'u\i%icvR\8/TT\dk׆?}OWxߪj6W:@~jvnN릗-tv䦅$Ѣ˖tD:XƎ[̓HQ@vE#1v;[B{{Fǥ6bֿǥ){bVRbjnBM8.*Ls)KAKZz^иcǿXx㝱| 篿}M6y=yd?`s;ޟ{b8n5g+?vSR,IhgJOɢuIM19Mmh8&`H^'M:5)VNDgjS}=DEtv941.^=Ϧ=\8=.o_-/v tmq{Ⱦ}d}]+LzI| !S7&$Tr]0.AZȦmTOwP5m%l"mWz[z)pUeB +33Mec26K{j&08|yk+3gkk]޾{xrɘ54b;PױOc=9>̢;P A&B)ϕbאRkNU2JD'xL,E6ҡSNqN]y)!6Q-4 +]dBECZȌ׎6Ű2`e:'-]P2<4YvC`Zk+9BsW5gwsoI#12 L1vh#d4*ȑ8ZJia<e#FgXIn!(üØOl0ލ<䑎9_Y-"$Β](}.gC/Nʪ.y +uBT9 Kбxdyb)@`zFF&.6@>6YJalMp9rWc_7_HIm촢i럎9El[o_}<{bOO]_wS>ժo2pU5r濳v;.qCok=LOgߋ#ԟ]Ͽw}lky-'s2]x _M '[ 촏<ɏi>I\UDO;ڜx6vViĢ6R2ds$5?tMg'kXЦ7x' SJ:By*AP*^p9N"h5:^$[;'x8G 9UkLfS$kqU);`4 I,#gR2nݧᒻ׿|퉽8lK3;vē='`נG5S +JW8w%ĭ-dm"nɂX +]SPtX4|S jR vk {$=AqxOlОOonc#ՙF 0;Hڔ0>pf(C8Wf5s3/u<(N(x-g% ְL +Ϲ!ٱb~`1Ju/ 0zn aUCN}ZٍtZ$%\+BWXMԁ C̨sT,(f( +H3 +yCٗS9&n Y5vf;c|Oxo`/o8=776n~mc'iwm5(nY#VTؤdԌ +ZJN억ϨV5UXKlLڔM *9*ɂ%l`F,/R$UV&KjJeW)5ϻ"eT&EsCƒ*\ n}ܵjx-W\'|:|7S]έ3- +zx0 3!9JC7b1wU/ܒ?S?M\S@&ƌczD)!LP A/c6ᛏ>R5sGbpx˚4~/`Eʚq:?]Si[l`H:2όJ"&8);5 a+@bR^MR%ٱd`'F{ر;4)tizХ8kMmpeojD7c10 XWX?~h|qԞoTؕϹWڏ"RN.几,TLȹj:ǥwdsrJlŞA9Trsmo~n-+p=uu$t_lgFر2nlyPES)wܜ$Z~t4Ued>LQ{Sqb^F#?`un&Q <]͠{j-.MW]3: !SZ)/7(` S{ 0u8چ!gz^1@B@ݩ^I#0wX`(v{=-Z&b!=UcS" pSLHQS4VwpB`9Ai :q=:et³pA5+Ң%gnQH?u>03qGiMqkY zwFH5MΦ;*.kbؼ7& ~z4M V"EBQߟ-6AR{)8McU*tcF"|q[룴%)y~2c8 m^ XcΌ3Z,jemM'l<-Q3y\N"SHiBy SۊM1R-Bxށ" eZLi0cT6SVUwXW;;!bS`oTUrE3 *R5e.`z&gu<Ѽo&9G©w/{wK=8[Oľ[|߱wz˧@OurɘgaXFP#}*^^ 6^vd^RW2?У: wLLvT[!?.>֩.R-P,5OjtvG3269##袪aYt]hԢ腥gTL?{`ڈc$3f4q3\eVbLIIL*{ +O$ZJB/6ʮKg*.?J6ě*#L:lO7W/gƾm=u- weeiufNaTn?\ i)ǬbR)LQJE)/TBFToX}HrSy 'd2UT%_|'hsJDTLVeYn8;܍s}/J{n> " a}V56\\z[xG_s:Wm$b4ۭȼ##܃#X^$xvTL\Yt*8(7"|tI v bV1{s(.c rF"#Ā>BdUERB)ZEp䔂 +,$Qm ``p>s֮S>F>'m߾m٘F>=iaͿՌ\a 4 Wk +k6d- +4WZ6l hXӎNSNf9&s[\ܑڑ))99չmg3? |* N#kQDP?v ^QSi춂P&tq`!;m>PN2`jѣLчdZCZsP:ՈC(ݟqxx7~cq<tLbnJ[c:{pü_#mFW$5@[d\/vKp>[ _H89Mp(9h@0sC ܽ᭫79 xYK|ѕOԽ_2 M,rJQ=`zz:>>V"_ݨnSoOVWl,%O8݂x )Gy^8_ % \|V&S o3Ƨ4Op3 +9K )vD$U57EʦOh?| {澃=kI60M,pj]@} fHQ7IĈd  o,TSgJUXjWBz }457qK5g +aeHU" T+JaR_xPm[{ͬ(8'TUpVBJT +χBax&$g" ߉Z(B^$f3WW6H|"xx\d's23Ngf3b&8rFbK#2^bM@Rd"NRTJ9'[W_#jT`G AKԜ m!r8܆663q2gbeώ{t&OX ʔR/%i*Y m`3 /՚pvx顲!IE0uQh'O+)[leGNHf:QTBD\t+Ix`$eBlr~aY-af-u %Mt{h`{P;X~-'yjp_wLvwܬ=؝I~h֠{゚/_>᡻Mj٢ %vqZ.r-OUn)0 +? qwƝv3X5zΐdZfUhU*L0*̪jQ2SZfh1ӎsRsS yI;Qq'Hdrɔ|ga'%l2^)Čj#I)7ʺ~6IQiN{QcN>~jZQ9E⍏.}zQӑpt˓|cWw KG>r&PQ\xA{7B"B!k0+5.(ajP'ԫT {\0W˝33Փ*s}sbV\l^luބmjAASi4/4ʰfxaly_ɂɀW*ȀxכPJKF#!t2@;3gSC^F_*'!ꀠn:Bz(s媪^L}5豥DXkx(R^o=lwuj߸}Ă3Z?n>N‚6PЌ|x|N#^#V|_mimjc:uJ zqc}7||祸d1b+#Dٽ4D,ؽ-22h5՚6 /1JrA'=;r /;b {Ԋ-B#é+ ,^0{`*p* p0JzG-)jYK=&6>>,Xz[X'[[o8qKb?1fPNk'Juzŗ&<8ςEB~8?˷ڤRzIG +kFMU[H?J=VwJ_uv%%99<ĿKĪK=KH|ua fEQTGԗpahM=9Mg>B?!̧[SȘ^J}z]s_jWC!S 9S5S=S3S;S7S@@@@@@4f323dTjkõY֌_iݓu=x͓) #d%d +S@F +H V6Jf2C: 6^7M!\uƻfNjps~Vq=_lE,c"3R`DT`*ĸ̴Ei$kSz$}"[(yo_ߍ.,̧3SrŹ$zKwbDW']9tzGNv9w +|Gq9IY~[>ɧ LXVAP.@boEHF&F<5<;Inϥ(WdilR闤D(%&F"M/l!B&R&FLsZ *ah-"'%Rg)=X2.:Uƃ2!{_L'zQ_'Yv-ꥠG]"~f8/)*PPE=7hubJeo^(?t`ݓW??յԯZ`yZ˫O.lqMʿvQ+7sN98Mh2 +9cP9͈Mr"z>.ͅ5CvQ1jF1c9q\]^lT))ygeTy\yF)(@u2q,0kYn'lOODH Ey,@N<`ܟC ݥKiDw)UUNB$H|܁F4wwBꞃ~STRQW98= yfV\W94. YkiK"7/F=/r/pX疎v +mlG:bf[506oYhL㳺\v2?V9>B!E(Kg UW`* +TQd yİYoTuG?d߸퇽D WCEVW(>toAS!T +i$wn,H5=+#K(Ay#P\iMr$ +0H+hm6)AAKfC[πm4D_|!n hv%Bi~nBz;BƧ2A? l"d9"{o 5B3/!L>7|Fheu ^5@Z;y 5*EEJ01D!Ӑ B͎cZrMî(L&a݈nM<9ȇH2`UV؞U>h3Iͥ'O=|Q(> T,IS,Mu! f{1\vg@S|TXԀ@jE+P#WӼY2-&A<:(2kPEmZ +P |AzJ?;$ْ_BE0r?,́ho@sa^c;7{l?5Zkal5 ?u 1qT+) M]%f^yl=D6fuճ}+~SzMlznb=$i90RZ&Q?c6g'c/F}3-SK;Wkp/ѝ$K%?ZI 5WQ.))?V跔IWОC}wK ̯6,ih]X' ohnlhioXWh4~iR]K]ھCkMtQMsARJVKE}inhiۚzn웿ՍEZkj4/ǵIKVhVZZ7/khYӰtIks}]K4HOh~Ҥ0˸9մJj`95䚥KjaR K5+-u"܆%RkT[Ҹ`QRcs=T΁:(kZƺtW,9!jjii>, P/hi-DJ-aɢRV}Tx6ݫrvֽ N5(fi[Lq\6ܴdQCMHIlCK[ںeg~ݢƫ1tp&5 X\sSmJ"Z!n:w1H;|>$5<9eC:4 <|2Q2H mt W}E7?b9 7El=ȍ,@gYX%KPpxٞI}6pT( uKGCPN~)1yE!Xɛ0H4R5FH@o6j HQHe$rF ɐ&@R30M'9j'" `#+_'/5V +ʓv B;{D(E(]A^؟aLJ!σTiU!y_ht @mAY{Yxh^ -f,?i&zň8FH1٤2ubo}GjrيҀےPx:\8@®WEB%OCù@:{R'oAozoשN au=su] oAj(B/kK4W?)彩(ԉє8N{oBe;++ӾYfb*9dѭ*8-z_ѧ*UVDE\_,qqCh=7dDeeE'! SL!IK{(/C Z@?XZגQ>b_FP z9>coC'Y6':uz˺`7.^f]%/.8So|< DsfAޱl36[ͩLbzVFDGH晴ypp>4|}3GM(,j{* MҹFBs1mE*sӹFɣ\ThXr?j_=avqc-`BHeTCM}J@h &-xWIjSp.mY#ZZR'H\3hh)P[Mj;}r丞֩ɎNɒ=n#Gcه[QK%UL! +$0Rxh nI\v$|=R$EkL PGX+ /mhL +endstream +endobj + +1296 0 obj +17582 +endobj + +576 0 obj +<> +endobj + +1297 0 obj +<> +endobj + +1298 0 obj +<> +stream +x]j0 ໟPmBBa?JjXl8l5tC§H2.KkM#8A:栀J%ڨFVn"k>Srag$<4ct)f`iAjA¿(ömSez*Ę߇QN䅂 .kC9^DH<?7%z_eGWȳ+i}<-ZnCqF{Psiv{3܅/% +endstream +endobj + +1300 0 obj +274 +endobj + +1299 0 obj +<> +stream +xVMl~KGRekI+iEHUF0cJZYB$ i+zQM&FaF:AEF %iP>H(^Z-PU.eM%̛y3;@ &믍ʲ +O͜Nkw +8&3fӄ'fk/6ayfJdeӳpk׊Y?OO[.UkcN%@5@yw 0<٘㥘LV-jYU6E`Xa;$VSVBG,H̞XDMXJ%Hx'ѳ(d=)uKAOzyk5E~JߕWɯzv+'gd+.I; Zu;KZO4Q^sҎVNQH}NRoV+RϹMHAL#"jDm&BGSGE +('~ك݊eS/v浹ܵks|?M}^k|~ 9_@\mt0jDElȽM1E[}ZP򃶺@eCnn)D*AA7lIO)͜J^"u؈óFO* +q.-r<)zPFpRؔL3)B:kd#?SpSJߍl*>K㵃zCuEfN囹Dt=EhNa;(>i9!rn, pDtcW#m'ΓoAyL x,X&nryش)n#G?w.o81uF eiIgؤ 5Cx/b[>bZu\gJ3r ]rxZ[::Z7${/oSQ,TЭYFXAv7.MdDFQ}2Rq8l:)ܒuzki\/Gd-5%^?t]ĐNlLÆesq$!Nf]&nd1ΝB4NQ2l#P 9r{MM&E\ݺpcq.-˶sg Ǐ/ YasS%T +7 n1Wle {:vgq//4;E9痩F^v~[R@/dؿm~>M e_u:~q`j|?u@G#审Ʉ{[k7=,1_%~x.{v: 29`s9䲃~`?l lp"g+RL@8?zp<vJ8!~X@ *9`DB[pvr88xOBLA og@ "L`)! `&* l lK峕SS5`ጡ=S(NRvguUQ5*g TB{8̱J0- 9ZEf%4ZP`8uzPGY#=<ÈGώ;::t#_mc̫*zKjF߲8fTӥvbN~ɇ] N4+1:z,UTgQðIl+t&kLtEPZca8RĖrfQIJZmjר㓥 +DZ0a*/jZ2=v )jFItYoԴ|Y-Zƥxr#sv3`V+%Լ=t!RdO93dj$ +endstream +endobj + +1301 0 obj +2146 +endobj + +577 0 obj +<> +endobj + +1302 0 obj +<> +endobj + +1303 0 obj +<> +stream +x]͊0ὯBbs4(SM{-g m"w_)t +IAS>~qylNyq]?sos9_}ZOE^>oKn,{W\7o|w?s?\Ӻ>Mӟ|ppm}o5rxl~?wu ӌmMuzb_Uy9yh浞ף~=ZU:-V6tbG;w'tޡݰݠ3Ew켶~/{~O=_ ~/{~O=_+́~9Я0@W +s_a+́~9Я0@WWo o o o o0 op +op +9鏛T#JSp*N?©GaV#Y+~?¯GҟWFO ~?o'џ7FO ~?o' P͓ٛwaJ c5o󼎼mnS$ _ +S| +endstream +endobj + +1305 0 obj +601 +endobj + +1304 0 obj +<> +stream +x|y\TGoխ4k/ (;DQ +*b1nр'1JceQL\QcECIwކ`&}ٞuV:u::ua"bjcˠ}eH:(8}'f ½}aJy`__^@-n +.E |8)cONFz_?M^2W4iL9UL/E-J4~о_B0ba#BXdQR5Z`4->~րP suqGDv=9%GZzό^xf>үրك:#Fؘ9Oț8O:-Srn:> <>p3 ^thwmC*ԌkU`MA;fa+\[PA\0 +]0Neh4@ q먒Cd͢/\RKIy2n1? סs + yF +Äa0PCTEo(g>d?mE;I2^ OTY8vpq9H{YLT#T>I|!(vC-Ixa0szψlj\gLn&QK  Ⴥz!Uu?==xx[?Tʁ"jO~z7{Rcjci+}iZzLRE9xcn~Pր@*DG~xhJhGH52ǕXXޑ(rWx0m}n`TN!|q{r;rsY:Ƈ3fA4Gvԓ9#rK{;GͅVIẼ0+d6tI*ף;t0}: +~_V4 #qoG.g0p9]N3mfS$uϡZ/"$d?x DU.$ Ӆ ->f4; x:~E$/?ֈhFl>Si +jw0jN> jqjHP'MI]xo]6#+m>qi3bUb0DجF"ś.X3Z-k7PܻM74|MusbJ8{xـ|ad8"نXNIMNTm@}sESOO=qѝ{a^?Ȃ_?cخzgr}_N۶}f{D - +B6X/2j(J-_d+*(( h tE@vzc }^_};@\A4n]]<~( +@@%@j: &( =^ىNd삡-Dh!kXZ"E`-kXL^3 à0(; à0(;RՂ6 ;hڰ6HPFkAp0ꞗ  +3EW#1L^|S8\a=%)*ۀ+,G`?? + 5{Ȱ5 =ccYE.|tCZӰƳ0&&5 ϰ=5c);O'h!<5sJ* X%$`̙90gL 3s&`ΤG X-EJAgX]\rwK*[jUYm-k_oc_\M-\@rrS mwL-8S Ԃcj1ZpL-8S Ԃ .Wϗ\) T ҉Zhƕ4[l(%Ȍ*r #=A^H86 2m!(%N%7̙Sso,:Nd᝕x'q_KX>g󰼂725g6"HЀES3 +f,z7F=Z D٠f"?Ng:z&t._]2jh7z:%yp,&_-m]@?N\'ZΖ?SW +rh-m^Fen7$%7-e^ J("GAOLeF%xF6j5F`FQ#بl6j5F`Fу`bjDfVI+| +>iOZ'VI+| +>imI+U^vX,++3,>P}׊ù۷XK P?Хi,ūSY}o+)/Y_OЏ ˸o@g'd g]+N%1!7@B;Y6t/:SZO zc=#BcL֪Nl*^4L2ZP{,ʟ%d9%/,{'ߑZ^;pLw;RhPd.7mshF8 C&Mr 4vW_ $`iu56[l_ '桗Gl&޼Bo9$&v6u`. KVk&+<.Gj*S;̆a}nSkKK5(I(X, M.x#r&cU(+}6=n|ݜO}]wzy-+W]+;莠W7?x^7f|Ń{za>ٚ(dOGܼg +Q"0d@&N0[QnvWnTmB{+(/Z::"t:BT[l5{t]،j_pxyޘ6͝ݥn:ݎ?z} t\ϖ,=rӏgie^F"0MȦZ ̴2Ͳ ޑg]DbfX$8+7o\s86??-\UTN? kn zZLvb%ߏ-aŖ ++s;~<|Ǭ^}v4ҕ} 0Fj?_>wP rӠȍ,[% -M4*  rn&R50(U('BF P2AJN%{%q'H`>: PQ Pڛ3`e ;ӫC:n9{vUx.kv=Cl`Gz8'Vעjj$$)@\9NL1.,MWl:Mcp?zsx8Càm,Y#bFQ}et,jmlǽݺ9um?Qg:)nMk~[fTt0o( B$:䡹t('QL1@zAI7hv%;#N/hЉQoȴmոMfrʙ LIlwMd|u)t]2l-_RXޓv칕,&)O>2'))uO} +jk2Eq?OBܿa[WN%6 uoNn۵ 'I/Nk={+|I_3Xu +|QUYk%%^h7ˇ`^.g L,aY4hAt7ϓ{iүB:txRCǩrUAܰ5T !hFT <P鈲P$zKgKIp!\eqqcU9|nPZ6p%0CNb"h1J +Wl2@ 'c1GE%q -sCܘ4pnks|/ xtlJxl# hAfܵxyi\k|Y.thbKz9=YlGlIEHWXv$0ךH+g:Y#U ;01l&zpMݽ/Zoӽ|5Ȩ;RtezmJ&^2J80OhK['{օ 2"G]m$~UƚK- +n=]ާS[f͚mkvֶ8ѯw4Яq ΦKi)~ +kp)-gBy AQ\mB[L#!QÌl$_fJ:dZq}> +Ɖ+oTe:ﻇ9SB\ۙ-eew}y?v+Xg!QYY;d6W?y4&X@! !f9njfO&vhl$Y'\3źզv sZB?5k]9A!h,݄'I#?ƒԾZ^0E!fb Dޜ૱Ce51s D2AIc'lQ򡧜KP7˰9#Ow販ƵwB˛6V?ý[ h!.ӫWA'O/3h6M$nej6;}9ڌ@/*sMMK(<8͐+Gyk5q910-c[4 IvZ ^ sr{KkY?([iXeLeOL-p$|f11d[l"G`\cE`wK9If,7%c.quҲ2f=?E{fd 0m->={>Ȓ*PxbCAnvw 2Εٖժ;mAna{wsuBԽ(wd_С~5QVaNTRIp:n@SӪtZZآPJkh2?:)&/̐&ډkHC=4q֪ 7MTEp]2Nt*]]Fq\ˏƋ㥑mn@WB%EZ9)ʺVSo K|(UMr=r*scN`© +TD~Dౄ 2$l{ Y5?N$?Ϩ"nsɶ)sY\҃1䢸lw,CeNsrIx[4G\Rkk忝]`9s !X[gfvN` wV#󙠂^7=;޳Ap@d,͹uK\?*E^ yt|d݁8qK{L7?[ ڿ:sҭyw|?qGc]norwEvAtx׫G7s~ۢ(2FZěuc9n9tF *,rۡ]-5z4zw3fjb zۛ46 ;arZNZkm@m`m!w$7Rv='ˋg녿.u|@7J_yO?՛'?PN^.鉹?uH]%)""FLܬw`9/5{tjRaTWî2 @'AY0DyUr ]wN`9,G0$UkV_lmۗۧ؆./6_9ddl^~cGm`at qQ'HW?bBG+B6v&zG`[ծI=/#i+ݘmXzu־iQQOnM왫={3,9, Iы|* C#N<fv I)(ƿd\CClM7NMFk֒s#l5~NK~BaB<ޜ)1伯2ġD#}17\CW ?(kï]O0]bT/Uosxz~>^im٫*bՉioҰaG=s3䃺LX/ + p>R ި5]h((;5#D Ӕ;NY*87u(^IW4f ѷfČq\将]FDljb)WW+̙>[ikH'tXT8}̸M +`  P"X07k0'Aze'^FJ̊PH}3XYА{+{mzm⤩WnB"{G?Έ+e _wV~I A>xV+x\:ѫOhM$oAt 1{ T~bj2l'GU,Z挼h@;lj(0ZkO o}Eܒr9K8p1_Ucw,_ƾW^{UVe_oY![%`㭀ĔQݻWcQ`6Z 5GK 9ʟ T\w!EMrXnU@XO@1H +PE!RIzBNRUH+JH!_(J%dP"H!4/0Jk}[st\[߂@ʬTKHyD+?д֓g<ΌKoOm?yƛaa诞QK(4Xt|4$!Q5Tfj04ccۚѪ)،kC`g{B/ūxm>>} 'BX*JեRm222222yrĝ7Or/ZS;9kxi^~9ϐi蕶/m\v'MϠ?k~?v렜{+,BǰbG,~[ihD77g3|wɕ?nxwЏ?vzF: 鈏| 8@oGtwӋ`!oOM(8b͆rX.X| %bˀLXX|,hd[,S(^.3xۄLdv vQ֕6ަ8z=_ aT@h5 d,`U V%``8 sA,'@rI^UZ;P.B:XQ8ʅ ]ŮKKR41MJReYA1Xmn:WHL4"nDz6ƨ X#Pk(.J245\PYƭ % +~f&֞,X_vOտlk$r۶):tYԢ=J$0 /c+b=kj fn35y9-q*!&/rhù[dHqHA&ǏѨ`jhD0 ?f@4Z>#Im߶5whn @gg@,Y cZOՠg:V @фlF4A]!3MF=NZTlCW{=,cӜ2TaOy"2,@}!Ümζ5,)Jd +Le#@쀩a'l)1a} ߦmb?u 4̫;B?ÚQ_PHak7P1QRHU2H5䨦dJ^bX;$1m˹UUmSv^#nYxXS"_c*(gpɧ![ +{w,/'!\<P^uϲKn(''>XE3[.(zrӘrFz$غscX+r_:nZ~U1z^1$n afv$_%*cV^7{׾NTP`gc=,LKW.$<*kpI=m[2m}zusE'.oyɣwn`BVp.\Mw؄}+ã`mޣĔT>Cstkl"s?xߙ,8+2W|%YslT{,@j +/"gqũ݋ey礨nD>n̸ |ڰШz nUțfR eq>B?skV @P# Aȟ@>h6 +2,Vu޺Jo}9*5PD@n]޶ǁ{@E'@]|z.~Y撼Fz c@˼t&A[^yhTx&\cd4P=Ȑ׋@zsFyWaؿ o "^ |T-LV0~@s^!-@Ptv1K u@ d}an鎐Y|kgП?\9@P`4Tm :P(gG wkaـ}àOq_w d &"2,]O7XAQ K4 }ƀNb! ?aZbO`PreCL +;&;Fϛ?hY靆3p MHqQQG=X!ZCdTAMrÕP7 9P.Bw)r>Cy! O@i*:zj5BҐszp&|O>*r-%'Gɻߦ(9FQJޡ;K֑ƿ)pdE@D2Qdr2G}0Ja(%CdPv0(d?b@J݀|wYH*G2#H̾F!L28w}=mGG'x ӀKᮏN-ё> {S DudP3S +N'=I*%)1B +%ɃI `$Ja"% 8!8(X{D1$cFBfVQB%ݠe77ʥ ])$p#qg +( 30J8b}0A6JB) ݆P H( $+pf?k">ǗXJ0rs&1A&31)3tH z`;=N!z>^&:f[ DCڟLDD"%/!08rpPE!Dp/ۀo '/n> +endstream +endobj + +1306 0 obj +13136 +endobj + +583 0 obj +<> +endobj + +1307 0 obj +<> +endobj + +1308 0 obj +<> +stream +xzy\Ts}evfDA$M(.# +8,*Dp{0MCZ5ן!Gb1 }Mlb?kbbhLf1p}ϝA{=|@@-@oXTURR~7 @V6?; "L2Bz38Z5VQ%˂Ps ϖbn=C7(3W6*c?7Qxnx :K2a!֫G-ɅRzp~q{Hgam᪙  Št( :O|RA_wO_&{z2",nmqE诧1v/Z@\LP$f5f73Pѱ5aKr<:+[Ijn3eY۬NO=šCnlix=?'[~^Oɫ9lě?WN "!n-Y&<##}y^w$0[/xlnVF&1*y8ɑ,Yq$G|-" +Xӳ ~$+K6?[|z}wwJ箾cw'JiV5LDS< :]9v-´ g +ԼtYv7v[K( a7%1%pVT$Zܤb7rF'!\DjY+YZA^ = +\ҒBLW0q +a{f~}}!${ٯ#b͍ĹQuxFpwc[8ABфF +B.BJ&O <i .@sED@TI#&#E@XB;!!O LjCRīl[-f3DY1D؜$)9i͗_}_%)U,^bT,I!>/d#dkZ ٠oN3m>3YRE5FQhTШQF +D6UῦER!$/iD{Ϸ>ʲ0ɨ8x Iq$z%( +`^mi24ڪQPZԻi0S}) +wF}nQUfřN#;rƑI! ++/m +?䘰Z;ubS}]̂ωiWZ乛&UC"S`ς+fp}<)8F d"W@p2cnQݨ67 B#T7EksX+a)bcHwnHK:НswWz`_!MاI-\XU@uk8L8]pڒ!h[2D`YQW㮍ֶjj rut$5C#27uoˠ +Jz _q$f n 䇡♮jPZZbD^J>R fβxt&~lҡ\ϕ X'TH*t\c %G/oث_|Cwo(WųN:Ru>[\~ > Q N^bؒtm]jsn҃'IiAХ'P-% &_?PIsjF~˟Hppu-lѶ[A:4CC{(",;+dcr/X?ކag*{#7Uvi`]1m3?-hmg>yהQׇ&}Y; +XӛhdMδ5! +V^vDgqE婳HH"< +I<e VW/\G{|ϩtv$ +wuGFe){:tyM 5l7:#g0i9#lN"tSO6sSSĆq?wX3ÇtF!@QTD&-]Jb"~?k/Q :I"{T浱}⢯;TRJFHK2),0N|ϫ b`ZlfTkw>q)H]zb [ o߲#ݔ;RE*qzEJ ;OD hȞ'ʻ~-ז7r #I qjQIeê5QG1Fp9F@4*Fm %Y65toa3ؕ̎_, &v$L*1'ߔu7CJYx7#V\SCqd El2Ѡgk.#q)Ix~prK,Bsw-<ܦggz/_>x6xѬ_=ve+Ll㻏?Ǟf[L,Wm1BymW(C"@тU"-Q-Gy-k Ŗ!Ϙ'%OG;ɶEpkq܊z vB^:@2rqyoܼ~_#RzI^aؑP +h>c LJFFm]sU:ƪ#J< \-^X<Yi>;/Lgojtvd"S~.*/pUR( EI"5!C6Ϣr8XtxI1Y +);Sޓmof``/fpɸjFmZN#:0*bV,)?/7pK?cg'o_XYG? #&S.5fWYSl&(yicl|N +%ymr<_<q.%T.KҺt>s"}QX_/ޗ0^=^3^;^7^?2:>bm=H(<5ʤp]q#5W˫W{륭[ͳZ3wv@X0ޙvG@F1Æ 27Y6KYʇX'5kp_8v"5k:uS"t! +H ;!XXq` +b\}Bwp ~b"c٫XrJ8披por ǩ:1ʯD"C&G"PEJCվ.Y{!2{f9NU)F5Zѐ>PI5I鶄f(mp2Z-ڞUcGԴ 㒖UG+bCu{&X^0AOjV v[SdB0^kt 1*0!a('dž R]4'EIѦR)cZ泧9RbSRSR\C݉"2$<ݗ=>,?4Ҳx=U%,^2u{>Y?ű7`Dv3Ԗ@Ψ1wbMڿeM #Sڇjm r=<Fkcb hYZ\: +b/{v(\mNKv=a*6: [6ɯBfr3J ޼+$ʎ_…M +8TTу{@>[qO*^E~ߪ% +̯$Ȥ>~1 e-Js$AkYQ/σ9tX(w [^8KRvU,^;],ҤDՈDie/%Z4AO@"j*.Z:]Zo 1ݖ[7&ӷ] A ?`ӒH Bhcu $'SdTH +U+MͰEzqxwOSKV ԭ#k>_-g!!{ :a/s=ȷLd~$[ -eBРZHD5۲LKn˿θS)[54TTU\sgDhm&{ؑ#d@xB,tpɎ銟nr00M`2 2 8Gz :tUf:\,dDӾG.#Nu^0H(]'{5f{Nr)k`=D4xl"Z K)M_:k͐q$D${QJǫ!17nҧi_\m/׿\vC-욣pyp+<21IGDE!j} XQjx"D'1D ?rr\傏[œd8ä礓88xI%Ǜw6?XrWeSOU7ngS_m;s`=⡃gw=QCOJh1m;rk/H調PUU,nxOx|!&b{ >+ +> P6cF؍aB+;О0<GJ~{# Ё0#7a4B'0ya@B +''c +goc-b_Z cu(w1FpqN݁p@EE" f~#6Ff8M8f}-uXkEm#7"8pލ YcQWh3ivk]b8Hr7fzFI5) H amM-Z#ᶌm/m|؈7U+фZr7 u0JXna;kj*\O ]Sn#]M%+T/vM, ~w +&V67ԕTLX̕ԻV[^fbͲ2ѮLzFYf49<#{xfƭYedw+]%u%eU%uK]50rqIÊ;kj]70*P%PHe42{58Z}z- +řjl5@\p+#pfb^W(]]0[uv!T+"Rܿpח`;8p>Dه [Kq14;.j*a1Qrsӑ(gIWcYs\`?fKWެ5rYU+t)2k]c+8WʰBW!h1ύ|=("N2z}}:?A_c~llYJF_E葧 ґi=0OO*AjLC`=/t. R] tҾ~џ]{'m{i{$}џ0m+7Km6aݹ,f"^tVFl.[ZyEts@|K7m4IFN3ڊZe]RFEis];Akt5.XM*FW2Po nyTtZʹ&VWZV$UU-J. K%YrVnxi X\F+pxZne.bђfZ2:4ltJZUѹ~:ٳtl33R~;9,tfz-{4F2zϔv:%}uNn"I4/I'x?gchF;tR消w1gdCG"q##iH){*eFD,gFJ2ә4pHyIq(=OHítxhĴTfi]`/uQJ5.r +{d4HubT:DҤH))zJQ4cCbm?uFHqԅ4!&%Dx|3K4Fc#|pЈQ):FhR( 4/Fڨs*u :G;P[B6:,שg~j2HfjĞ!u&IOu&qJ/aUqBUzjD,$YK.8.JXtDb;֣7%SRE6$_ý!? +endstream +endobj + +1309 0 obj +8565 +endobj + +588 0 obj +<> +endobj + +1310 0 obj +<> +endobj + +1311 0 obj +<> +stream +xzy|Tof2{&M^B@HA(LF! dX@P$` +.jPCX\H ZZƷ_V[ +d{ޛAy{ys:Xtd܉5ceAW8;>g/5}}iign, +7|tm;4 qtvݸuA={#^R[ߠ2HNl[/cwD[ymE-{ǝ*lCz̏"S7tDߝ^Z0Mf Xlv?SU2A6,),u* Ђ>µG` +XWҧ'HHa^GH>Ȃ$p J>2 ͔> +%f'夗@>"zS̊dFpC̅y:v|nN_+DJH KnGnޢj5N~$#0LeL=bQ9Vb5܁%:JApj&Q@9 *JUQszf3~$UTDk^5ru|}HM1d$kH?9L~CN?W4!ju@RLO}% 0<+loßE~6ikXnܱAx)#HHLH#8I%Gj"҂Ԭ$k҇4HK9Jj3zzziJq/ʑebܓf`N'*{m$<Go0=;t>ԏP+;0<'$Sc4a&1RE%R>h-Dye2POQ 8zvNr:>GM>Fp'J. ?*7';+3#=mԔ$)' + xtmqVd4uZT,CS2ʤ:1RdR)S2TuE*'()h⍘~\-L B($1Z$oFRF W +̤( =6|>|B,s.*N, w-)+(FMf @+UXeATZtI\VySuYRCAczqe WTbleԳ9dt]X ]_#/aN:Ҡ!gfF<9:. S=Ț}5506ǰ"vJ.6M6VfY\l\_&Zf J@*{A4YZԳ% ¬n_@.{TK`G/=Ƒ̌ >@Ir=\h_*x`=m5i*H@oqг`ᯆ (xYlI{L'7zTɦ/@-68~pqYHZґHm&1AQj|f|6 +7nS : U'tu6WYsuu%kFZh|e<2@=z!? z@ [p8OVR3#͇P~Xr/Gi׈=b\\j$+5zjxS k<@Mxg<S3,ͰX'FpSfVT\S KkpSJ^Bzjq(zU3Fs<. Yf8EMOOZROG6hmXG BdLehO!Y5Ԅi*(1k|̯T^°^ +~ V*/E\ UӇ L_ [nHbq>nN} X4 58]wpJ_e:!)Wl)([k~՗rɳI%\c¿'s;$m-0Ȋ-Ꮦmi dfҷeS89\KѮPz_!C<0P<''ɓԗYۮRфaJ,,˱ 9F/tYW7pU!0HDBGաv¡!TbGE96l \yfd47ўӏ+s_ܒv˥M}})fR|0/q S% ԼR h4ø%h uz`mklW^!'lӶُQ^e $yն8kB:‚@Y.,{6D?g[ Ԛ- +/L?</>e)v7ͷ +cyNIQ@JD䉘Ĕ{v/5~~^xxZ|6X =~}Y<8uDǣ 슍#h5O, [66,t%;7ML=&oL }L-,<$VgוΟ_ZRGBot+ꛅ8XZifL;v6{هt {^a{Dp~U!~~rsLf5s. +L&m(roMHKЬVxo2 Z KS!DrnY=O{mM!r̯Y2d MT6" +Bo*˺w :/~B%(C@PҝV> +q㢻bymdS[S' #30-x.r4ldv_P+0z5 t2o;veX +`r&˜VY-%bm &cg}w' MZj?B f:/7eoWf9Βne|KIx6!ܜ3_ڵ0uN"IB%#PJ"(t@ 40$kawR +mFKC͏Y|\x8]`޳f˛/}Zg/>;(G*0Ou=}^8د>Y'ZشN+ƺ4gPZ".` +l/ѕ],q+bbrd)ݲjqgK⽄O%OY*kHQRI).±(.IE*}ڸ֯$7_26sO +FutZ'ͫYuNkI9\pr%TUd:MpxdM0\p]ifsٿm/B%JKY+IM%q9u[9}B>}9vFmmPGo`vuAIi(4^a0)*QZ㶲6܂lU + 7h˜.s1tyi9IS,EWkbh::4/瑥N +ӿ#)TT23?箋+GvQ?k[rHx(n#Oy6>3>.U fV([gP) R)h>TX:h 8M`Fj>I.楤Λ2>wP\TEv# zA] +d{m\1{e5:MI-Kӕ\NQ1ɹ'#eLFb5FiIRw;L++=+Iu::M;^^Ek$'y44r7TQ%{V &)fBҊ*D폟S1Ik<P8pp +WRs5\e充]]&vB&Pf*6Gq^RD~tڗ>}}M |,ܮKyLmpn?tuB[K[FoIǢ`"Ŷ0ب.tNhm^5v;(@9f ]9DMO68}.1Xou&+Zs%ka*78&@op<1iPTzxÝQ}iW,gj@'ǩqw?9=?a8a:a>n=w~qg!r'Os,oTN1MMn-&Yt︚"iġN: ])08ƢxX,'JLSc +}'t!|>#bg[hT +G"}}^=yWyE.Ǒc_R2=Z^g?>t\x,%ns1`$**ZM.DQ0Ϳ4SfMva&Pʿ +rD!rl!rDQb˿ +Vư'We.QNfhM@k^Ei4@(hAV,[^y +cЈ L~ F52J*h^ů,G=~;5gn;v ߪ.HHRG%fC6ɦGNPOЌI#4&6JIo3ۥRZB#P9>IմFmT^5\nt!FG8 +aeqo)4k͆fc@C[׭6t;B`/ 7uoS*Da\9ǣ.)#!0H#\:ԖL0fbnWZ3cpm̬?b~6T|O)|vV5>T.%%鱸r*>ICHe۵TGj9.ᥦdS)cԡ:;qWۥ^a?'֏/Xxs+S'4Sy76=yvQaRRvVqee뽇t{sܕ~kl`Vi`]r4\u(? ?Z'GޱR߬R" +F (^j4;ԏi5Ɣgbt-D K71Ř'1S9ovѼ(cƚQ?e Srޯdj/oyWTp7FM{'eni~;R5K TĴCnj7i.V p'طٿi}uKl>D-dFcdߢjh KT)cZh,DT*s:ZMh4Jΰ0%t ÅZӇ?Jq;ڛ E_~'I'x<^)?W> 復RqN򼲿b8ye`?{74E30j`#ЛFCAiz/4s=͜fmj 40ibatEdi0є0maBY4x3Zo +/fgVeq:``Lk2.,ʫêcxY +c &_(S9+!J_Ԙ+>R}8yy̑/Wx,\yBժP_<0^;To~.5 `r˽keb,+܉Q,ݱ>,7p.aم=9ZmBFfz1Wr@jhhW{@c=V]ufq3, +w.\CULxl9T^ +[QƾLB1A?`qމ*Da"LpfZe(QTUT:j6;aa +9+NyYMJ +lFXCeت|qʳ0~vk*2+tҹ2(cw9rrƉږĩd8uigGs. +:ɝ+aqΊ΀\kge1ܴLl](No]VUх |#(6tV4SZebɢKXzkVYΥ+ ج@qTNn^fQChMHa{IkKK2v[E/o q|Xصmo X Va)̂4A'B7c߃ |󫜳9\#nfn\:I`riL3׏2noxN//_>/Q~_vUf=d/ޚ%oD=1g0D6Dg'_/H<^G: ,g0 ,4{ E>;QMMkN'\ryPKx Kd+Q'/ð~ Gb +G @! +d_ǧB)kz8<3l'IY?I~$x u'e9D33IZ $rH8+H_LJgJ4F؉=Y8/<ѠTGǤQ)$O' zi, Z͎>?%:^!U%RǞɒ20!DQhg\BT"xaSTq3^?[r9\o:כ&pq7^kxW ODž"gr SwFM(_E?$<'ƕՕ:0TEm*v[sӿ9ɴGPK1, +D>JN6Gz^y#7:6:&8J"ޚiGg? ȓe)w]e~zGi54\lA\h @?&HxI)/O$/o_PVOGDLgF!^A$D/)(H +DN)(&61])^ L?qՒwFuRYK]pS"gpM([*RJ]ÂEr]%Ro*OJֲ9ˤҚY3nXk㵵f~d3ɪ䵲gIΒjjg)k5ϞnlvEO +endstream +endobj + +1312 0 obj +7879 +endobj + +912 0 obj +<> +endobj + +1313 0 obj +<> +endobj + +1314 0 obj +<> +stream +xzy|TEpխ[v$;NYI!-B aGd!, KH@q 8 F3bqP} +I坺 ?o9[Ns,Ս0BH#@EmYqcbe땾&BSckEC_h(j* a5Сۥh'6|S*@=9-[U/Dh0D%eU?G_-o[A(=/Nh|;Èa ?,T5ZE!d@FLf,V#qDH^F!'TOBﻨ>;݇Ρh+څJ<^L (e!8:QP F}4Z."z+gB +:#TNO]N(OoP9 COK6ك?RwӁ_To$R#6/Q&h!zFmIxX~TmR@ b)lK#<:(̠STc5G} +\n #I 3H,hpV\܎vH&ZՑ| c%Z܌#HR].;?V;-gMIvui]a]iEw.t^g4YZiEscCXǖC"tCS'fZџ0V}(?0 2o. kR] p)41 5%5V7S2rkRKR,Zς"w9P*.#x! U ^ҧNvuiEӋ;N5Nwq16@) "B4P1.TeKqw߲Źju`#T;6OS{Nq{@g1g~,P.NmP )}`d׋gtk]2O]L.i5^]#9)~n< \# +L32F RR2lX[v N*FfTCsH2? +A!#`A@M))TðhRΥlW|DZml83m{o]sC~;[MH8i;[%*pJ&gXݹn+I,/٘,ߍ_,7OʏìK'^/r޹ Y<|({W?l:]*Q"A843?sopiUNs@z-ޅ5.b7=>&Dө_3A'8H=Ǥ?Œ}++CGh-*#1ua" YDYrq8"8Q?˺@8|[ضWlj{WPMѰ{z2ހp[<sgH֫q6gT)@|PI*LazS mE\٠+ ӅM>~2-<;kJsc$Հ=9CS(Ȓ=xRâXnwW]+L}k͉S{L~lXؚgxpvV/xʯflC5V='EU\-6~ eF4J+eEl깘ɽ|ё8{!3vہބKTl+AEq8˚92'3+6|;v.8A' L(eJD`r+j2]K:ʵJ:**FUR9:pJ8mO34 +yJ +ȚeZۀV XlZ#j0uY\:We&-E +E[a+5qإiCTgFQ D"-6*ݢ\UO3t̊1 *^wPc݆1]cۚ.?ǺfV y#{c#{=oQPFn_7ݻ߷9[_5.QC:"@(B: (0L ÙVla 'ނBջF8guS@%GfS5T@rzk4-E@˿$Ńב:wB * S3ى4%{x/&xX1(XZ+ejDɖHi0`!c԰S~oJ!h r%=p/Z17VO=_vy_IǴLmzԩǶ/N9w~*9Q1Z;xFΜ>tOٲ׃7wϻTNjTESTiZ)XIw;=AOq fo>wϫn){8{u]g!軧º GG_O@E SIf^P.lAaL8C~&rKBAghY1]lkmK#*x-Z*VxUb8Si1ȖA!?~k%ZCP~jQp $dk-ٞ SH#Ah$x^ Bk^nAqX=$ccqPg_lJ̜'?(߰쳚+߮򽢍UxV=O{ۈ} JzjN2$۱G;0?!#?V侕pT YS/aYTc:uTP(eܤ_Vdw=C(+|C~?m؆Լe(ȹP:_vhj4('bzj0f5 >E{ Qf-m%ߒVh'#H6G%)NNdGiɘKf豨52E|uOP$r29I ]l׷=4v!tC?#ljʂvl@<' &籚p!%?IԼpM^ {WYYjBl8):V=o,wߓ}0)ivWM $xq/b6 HǢ{Xqww/1|K43;) +(OI9V\<㣚i>^>F nmT"#(nY<j|x-QUM֭v-(Ylct1(\Z['$Ӎ)ڔ>dXuݛ3 \`';N>!r~֬ϗ__R4Vm2c~ZPmؽxY\Oˁb3>)ţʬbOKXRK\щ +#])I= 'sqAեLT&FCuN#uںȺ:g]t]2*o+)jh:*X_Z8#}Iڽ2acZގ%_55Զ ր?򵢅$rGkf<>;w~{fC&LjW3Ӆٳ}-ٷF;Y1O[uaڲ6d=dPT 2%R\sm44p tA#0 A+-Ml0Q9L&p\ !{q5 0'Sa!݇$ JbvK 9=n +@g˷ z' /鳎mlʷ5W-#D.~kz]u~"-f* 6Q| a +4VNus;B#뒘뀇w6j1\ӳ$>i'|)Br +7pL"/<AiͤUf1x2@yʭ&hѢE5ŔAb)8Qhù<⾜Om~eO/>>tӸ!>*jFtY+VU mU$E4Lp IW>;J3l-\i6)x8_dىq¸lT0LgdĹnUU%fKYcؐQoD/ieI-`X +.\4h*Z۸S8"Y.磸uxge=NƾƥShgT$p ¨EsC 7^;®Ub--dSBk|k%N=ܨ xm(N OӥtEM#,^0aĥvloT &w ^B}AaRn^\z,olgO.Hil5g 4=y:R_(l"b { ʖ:n5~ٻN,-1jr4l^(sf;x6ີKV@R{ա%/7٫b:#EĪaJh&<&&]}w`^3&G2c]y~ܰb͆ {>~o vʳ'Zai*5cP:Gz<!6EbM -JLg!N勱cZ4UxiMĉFt"I`x:-AG/|Ӎ>6}M?pZ {kwT~1}SڐزmIiQ6钕k +&=K׭+)*i#g@^>GJjS'FTj|$2 +&m VͲ֬i,`Zel'_T.Ш`.pMb{Z}(p&0hթ{V,=^GI aQO."\u]>,\"B$UaؒR5إsee,' ť}ˍ66R p#${RxDo/FŸX(N^‚h5^-4W'w ]Ѷ8{\ӑ\( p=#<h<^0r\ M +]?13wwn~Q}zizWwfnmQlX5eT.. +ϟx4ή*{η@*c(FDF SM:gG TusV,lO7$ZEG4zj4جb+ YIff}z37[Un5 aK`Jh38GT(Et/Fg ޤN ]f_ֶps.w'>]Z-7?⮻?-ھlǽIs>̎>1↸Lpc_sK؍jt`D$N_3U)F%ĉq`e")}\y\UU@"ln0IPx:F+!%"RQ*t*ZBwf^[ݡO~ٯs-*g2b!x,`R0|]ݮt}G@>X?AtS"|_O*:8uk8$YDeɧ"5 ;A,IUƯLZqVTkCxټ C3xX{5" +=[g7 [q7|AYn/( ܇WfcĦyjdUkj L&Ȩܭpud(LeG~Sp+Fyf쫉S&ힳ@ڳ̽Z&\?5|C>d@HJ&BxwX؍GtwŠnbM7rY?8{QKzC^~T8go/?j uO'{30~#D5cI< p@i  ( +BN(l[P &ɇu h(1MvswPgPX@3}GCq`F=H`0`G@!ӵ`}gBS_qA:F;z3*B*Zo=&ՙN?_cKT:<^}+Tˡ!^)}G}p/8€޿,# +#0nrSS#/0I>`}F3wy7yH7#eWW9~\|X1}zKX19_J$/͠/^!G3FgbyXy(}'}U?$U?1v1<(|:v^!OG;SȓIFwO^F('줽<#A1#{UFUnF~ȮB3M ';N0#;v\F"2ZHe:*vrBeΛCK{t2/ed#=(KJ`FH2 5K +nF +9Lg22L32jM$w22eFF파`6F|y3o'>$\F1s =Jbd#dhWH*4Rm$EG3l#IhNȈIY$# 4B\h\%5hdhDEg:IDRI"^CN^ΈXaʈoa hͣi'1‚FF D $=#:xW(hM8EB04BLDLW8 ؊S߹?pB +endstream +endobj + +1315 0 obj +8848 +endobj + +924 0 obj +<> +endobj + +1316 0 obj +<> +endobj + +1317 0 obj +<> +stream +x]Mj0 >$Ӕ.BLȢ?4[I mgWV)tazO~H=zc:qkN։cuV|Y!oK¹sMKNȷh0Z7Sݯ!.A! 4EW5#H;C}#y[@.0\P4EBs׫w0oIYn2>sIRTK^-^c-Z/&x +endstream +endobj + +1319 0 obj +247 +endobj + +1318 0 obj +<> +stream +xV]lU>vv[ڲEAQ+QK--$<> >B4&*Pb@L| F&$@ bb;;R03{Ιs|; + +lўq*a| @|S1HD08{/Po{ <7e5B CS)_P@dumg8lMc;zF-{,;8>6952H F(q2AׇB +[1b@Q s뙣xcQpqsDnvnoV{뚽5)x y9Eb>\#@fo^2Iȵo6WRMu<тz;#%3 S?$PLFuD^ׅ#@`q { +Dn^֕AC^aE,СLi@F(H6!.PeHݦz[Ξ/Mĵ(٧o%dzɣԅ |j/9 :#[?2ú%ĸf; vLIk,[֒M3M\r+\;#gע2-OZģ}"GS5xꎶ}Y\,mؐ i|VP.5>\5Rݹ[WJ\]O_A?J8ۼ?`Y3$ 5fά9WM'"XeC%TUk,D<.WTF Yqb/hyz3|̥ZI3.喉ZO#.UU0י:tEWӓޞ7Ϳ'^7 ϩ҅q9-7/:_;DC +> 8IRd8$lBJߝvr>{w˨03y)hp 9 +E,A|2v!*RnY?39| A9=533/p؎t(<c00C0܏pdO,m4O@yO#۱71X#xe~qFهk [`#)،~k1 4N4ad#}ޅquo bK➳cvshhu:SkO/D!F1v}߼ ;{B3je_[g;#{a=VF3.d sBOzm+3m.kwc y+{m^)e +endstream +endobj + +1320 0 obj +1548 +endobj + +1321 0 obj +<> +endobj + +xref +0 1322 +0000000000 65535 f +0000000016 00000 n +0000040819 00000 n +0000045363 00000 n +0000046162 00000 n +0000047595 00000 n +0000052637 00000 n +0000057980 00000 n +0000061561 00000 n +0000064832 00000 n +0000067975 00000 n +0000070068 00000 n +0000071950 00000 n +0000075383 00000 n +0000077067 00000 n +0000079334 00000 n +0000082661 00000 n +0000085696 00000 n +0000088487 00000 n +0000089888 00000 n +0000091332 00000 n +0000093881 00000 n +0000096587 00000 n +0000099752 00000 n +0000102172 00000 n +0000104058 00000 n +0000105551 00000 n +0000107025 00000 n +0000109408 00000 n +0000111274 00000 n +0000113227 00000 n +0000114724 00000 n +0000116605 00000 n +0000119490 00000 n +0000121918 00000 n +0000123325 00000 n +0000125359 00000 n +0000126965 00000 n +0000128806 00000 n +0000131872 00000 n +0000134700 00000 n +0000137118 00000 n +0000140473 00000 n +0000143156 00000 n +0000145905 00000 n +0000148862 00000 n +0000151967 00000 n +0000153328 00000 n +0000155747 00000 n +0000158110 00000 n +0000160274 00000 n +0000163047 00000 n +0000165316 00000 n +0000167757 00000 n +0000169651 00000 n +0000172189 00000 n +0000174350 00000 n +0000176126 00000 n +0000177417 00000 n +0000179430 00000 n +0000180473 00000 n +0000182644 00000 n +0000186246 00000 n +0000188907 00000 n +0000192108 00000 n +0000192730 00000 n +0000194780 00000 n +0000195812 00000 n +0000198188 00000 n +0000199671 00000 n +0000201833 00000 n +0000204206 00000 n +0000206878 00000 n +0000208320 00000 n +0000210130 00000 n +0000213409 00000 n +0000216148 00000 n +0000220009 00000 n +0000221860 00000 n +0000224037 00000 n +0000226753 00000 n +0000229177 00000 n +0000231290 00000 n +0000234113 00000 n +0000235834 00000 n +0000238735 00000 n +0000240477 00000 n +0000242547 00000 n +0000244722 00000 n +0000247588 00000 n +0000249901 00000 n +0000252390 00000 n +0000254755 00000 n +0000258894 00000 n +0000262278 00000 n +0000264639 00000 n +0000267504 00000 n +0000270046 00000 n +0000272168 00000 n +0000274452 00000 n +0000277531 00000 n +0000280204 00000 n +0000283220 00000 n +0000286965 00000 n +0000289880 00000 n +0000293116 00000 n +0000295142 00000 n +0000297722 00000 n +0000300607 00000 n +0000303964 00000 n +0000306906 00000 n +0000310350 00000 n +0000312816 00000 n +0000313924 00000 n +0000316327 00000 n +0000319253 00000 n +0000324902 00000 n +0000327575 00000 n +0000328278 00000 n +0000329861 00000 n +0000332957 00000 n +0000335217 00000 n +0000337814 00000 n +0000339904 00000 n +0000342030 00000 n +0000344371 00000 n +0000346829 00000 n +0000347951 00000 n +0000350371 00000 n +0000352928 00000 n +0000356621 00000 n +0000358835 00000 n +0000361288 00000 n +0000363830 00000 n +0000364895 00000 n +0000367235 00000 n +0000370157 00000 n +0000372378 00000 n +0000374660 00000 n +0000376859 00000 n +0000379233 00000 n +0000380098 00000 n +0000383003 00000 n +0000385023 00000 n +0000386029 00000 n +0000388117 00000 n +0000390247 00000 n +0000393202 00000 n +0000396313 00000 n +0000399291 00000 n +0000402069 00000 n +0000405139 00000 n +0000406968 00000 n +0000409568 00000 n +0000412639 00000 n +0000415264 00000 n +0000418335 00000 n +0000419529 00000 n +0000420981 00000 n +0000427625 00000 n +0000431325 00000 n +0000433727 00000 n +0000436581 00000 n +0000439525 00000 n +0000442106 00000 n +0000445036 00000 n +0000448411 00000 n +0000451544 00000 n +0000453766 00000 n +0000455169 00000 n +0000457084 00000 n +0000459769 00000 n +0000461895 00000 n +0000464370 00000 n +0000467039 00000 n +0000468222 00000 n +0000470155 00000 n +0000472663 00000 n +0000476038 00000 n +0000477600 00000 n +0000479386 00000 n +0000481668 00000 n +0000483989 00000 n +0000486929 00000 n +0000488671 00000 n +0000490665 00000 n +0000493481 00000 n +0000497157 00000 n +0000502484 00000 n +0000510214 00000 n +0000515067 00000 n +0000517318 00000 n +0000518498 00000 n +0000040752 00000 n +0000000082 00000 n +0000000171 00000 n +0000000274 00000 n +0000002794 00000 n +0000003316 00000 n +0000003690 00000 n +0000003850 00000 n +0000003978 00000 n +0000004917 00000 n +0000005904 00000 n +0000006624 00000 n +0000007859 00000 n +0000009033 00000 n +0000011296 00000 n +0000011654 00000 n +0000012399 00000 n +0000013587 00000 n +0000013965 00000 n +0000014730 00000 n +0000016401 00000 n +0000016654 00000 n +0000017306 00000 n +0000019547 00000 n +0000020557 00000 n +0000021760 00000 n +0000022001 00000 n +0000023302 00000 n +0000024178 00000 n +0000024666 00000 n +0000024904 00000 n +0000025148 00000 n +0000025788 00000 n +0000027226 00000 n +0000027712 00000 n +0000028084 00000 n +0000028596 00000 n +0000029214 00000 n +0000029734 00000 n +0000030104 00000 n +0000031775 00000 n +0000033648 00000 n +0000034558 00000 n +0000035062 00000 n +0000035445 00000 n +0000036084 00000 n +0000036989 00000 n +0000037265 00000 n +0000038940 00000 n +0000039093 00000 n +0000040608 00000 n +0000001056 00000 n +0000001198 00000 n +0000001327 00000 n +0000001451 00000 n +0000001569 00000 n +0000001687 00000 n +0000001825 00000 n +0000001945 00000 n +0000002089 00000 n +0000002221 00000 n +0000002339 00000 n +0000002455 00000 n +0000002567 00000 n +0000002686 00000 n +0000000394 00000 n +0000000504 00000 n +0000000624 00000 n +0000000745 00000 n +0000000909 00000 n +0000002991 00000 n +0000003089 00000 n +0000003211 00000 n +0000003470 00000 n +0000003578 00000 n +0000004089 00000 n +0000004193 00000 n +0000004317 00000 n +0000004437 00000 n +0000004556 00000 n +0000004701 00000 n +0000004818 00000 n +0000005076 00000 n +0000005198 00000 n +0000005312 00000 n +0000005434 00000 n +0000005550 00000 n +0000005675 00000 n +0000005791 00000 n +0000006063 00000 n +0000006163 00000 n +0000006282 00000 n +0000006410 00000 n +0000006522 00000 n +0000006816 00000 n +0000006923 00000 n +0000007043 00000 n +0000007176 00000 n +0000007302 00000 n +0000007445 00000 n +0000007585 00000 n +0000008022 00000 n +0000008124 00000 n +0000008256 00000 n +0000008382 00000 n +0000008525 00000 n +0000008644 00000 n +0000008771 00000 n +0000008911 00000 n +0000009200 00000 n +0000009313 00000 n +0000009436 00000 n +0000009551 00000 n +0000009676 00000 n +0000009823 00000 n +0000009949 00000 n +0000010076 00000 n +0000010190 00000 n +0000010311 00000 n +0000010434 00000 n +0000010775 00000 n +0000010937 00000 n +0000011062 00000 n +0000011198 00000 n +0000010642 00000 n +0000010546 00000 n +0000011444 00000 n +0000011545 00000 n +0000011801 00000 n +0000011905 00000 n +0000012022 00000 n +0000012251 00000 n +0000012139 00000 n +0000012546 00000 n +0000012675 00000 n +0000012810 00000 n +0000012958 00000 n +0000013073 00000 n +0000013192 00000 n +0000013334 00000 n +0000013471 00000 n +0000013746 00000 n +0000013855 00000 n +0000014120 00000 n +0000014230 00000 n +0000014353 00000 n +0000014485 00000 n +0000014611 00000 n +0000014883 00000 n +0000015004 00000 n +0000015134 00000 n +0000015285 00000 n +0000015420 00000 n +0000015559 00000 n +0000015682 00000 n +0000015806 00000 n +0000015919 00000 n +0000016036 00000 n +0000016165 00000 n +0000016292 00000 n +0000016564 00000 n +0000016812 00000 n +0000016920 00000 n +0000017049 00000 n +0000017175 00000 n +0000017466 00000 n +0000017564 00000 n +0000017681 00000 n +0000017796 00000 n +0000017925 00000 n +0000018051 00000 n +0000018260 00000 n +0000018728 00000 n +0000018898 00000 n +0000019022 00000 n +0000019155 00000 n +0000019318 00000 n +0000019443 00000 n +0000018177 00000 n +0000018423 00000 n +0000018520 00000 n +0000018631 00000 n +0000019728 00000 n +0000019837 00000 n +0000019954 00000 n +0000020073 00000 n +0000020212 00000 n +0000020326 00000 n +0000020441 00000 n +0000020703 00000 n +0000020815 00000 n +0000020946 00000 n +0000021166 00000 n +0000021329 00000 n +0000021496 00000 n +0000021635 00000 n +0000021908 00000 n +0000022151 00000 n +0000022253 00000 n +0000022363 00000 n +0000022508 00000 n +0000022638 00000 n +0000022751 00000 n +0000022908 00000 n +0000023051 00000 n +0000023173 00000 n +0000023450 00000 n +0000023558 00000 n +0000023677 00000 n +0000023814 00000 n +0000023949 00000 n +0000024079 00000 n +0000024326 00000 n +0000024439 00000 n +0000024565 00000 n +0000024815 00000 n +0000025059 00000 n +0000025297 00000 n +0000025411 00000 n +0000025541 00000 n +0000025661 00000 n +0000025936 00000 n +0000026038 00000 n +0000026155 00000 n +0000026267 00000 n +0000026376 00000 n +0000026499 00000 n +0000026630 00000 n +0000026748 00000 n +0000026869 00000 n +0000026991 00000 n +0000027109 00000 n +0000027377 00000 n +0000027488 00000 n +0000027604 00000 n +0000027861 00000 n +0000027977 00000 n +0000028246 00000 n +0000028359 00000 n +0000028484 00000 n +0000028752 00000 n +0000028867 00000 n +0000029002 00000 n +0000029115 00000 n +0000029376 00000 n +0000029492 00000 n +0000029630 00000 n +0000029892 00000 n +0000029996 00000 n +0000030253 00000 n +0000030356 00000 n +0000030465 00000 n +0000030586 00000 n +0000030754 00000 n +0000030938 00000 n +0000031080 00000 n +0000031220 00000 n +0000031385 00000 n +0000031526 00000 n +0000031651 00000 n +0000031934 00000 n +0000032054 00000 n +0000032175 00000 n +0000032464 00000 n +0000032613 00000 n +0000032752 00000 n +0000032919 00000 n +0000033069 00000 n +0000033236 00000 n +0000033386 00000 n +0000033547 00000 n +0000033817 00000 n +0000033920 00000 n +0000034052 00000 n +0000034179 00000 n +0000034318 00000 n +0000034449 00000 n +0000034721 00000 n +0000034832 00000 n +0000034952 00000 n +0000035219 00000 n +0000035327 00000 n +0000035612 00000 n +0000035726 00000 n +0000035846 00000 n +0000035975 00000 n +0000036695 00000 n +0000036849 00000 n +0000036253 00000 n +0000036359 00000 n +0000036474 00000 n +0000036594 00000 n +0000037153 00000 n +0000037423 00000 n +0000037570 00000 n +0000037775 00000 n +0000037924 00000 n +0000038085 00000 n +0000038290 00000 n +0000038439 00000 n +0000038600 00000 n +0000038805 00000 n +0000039441 00000 n +0000040456 00000 n +0000039212 00000 n +0000039325 00000 n +0000039594 00000 n +0000039833 00000 n +0000039954 00000 n +0000040080 00000 n +0000040281 00000 n +0000042287 00000 n +0000042659 00000 n +0000042681 00000 n +0000045340 00000 n +0000850737 00000 n +0000875775 00000 n +0000885824 00000 n +0000844877 00000 n +0000045667 00000 n +0000046140 00000 n +0000894847 00000 n +0000046361 00000 n +0000047572 00000 n +0000048100 00000 n +0000048237 00000 n +0000048375 00000 n +0000048513 00000 n +0000048651 00000 n +0000048789 00000 n +0000048927 00000 n +0000049065 00000 n +0000049203 00000 n +0000049341 00000 n +0000049479 00000 n +0000049617 00000 n +0000049755 00000 n +0000049893 00000 n +0000050031 00000 n +0000050169 00000 n +0000050307 00000 n +0000050445 00000 n +0000050583 00000 n +0000050721 00000 n +0000050859 00000 n +0000050997 00000 n +0000051135 00000 n +0000051272 00000 n +0000051408 00000 n +0000908657 00000 n +0000926552 00000 n +0000944453 00000 n +0000051545 00000 n +0000052615 00000 n +0000053058 00000 n +0000053197 00000 n +0000053336 00000 n +0000053475 00000 n +0000053614 00000 n +0000053753 00000 n +0000053892 00000 n +0000054031 00000 n +0000054170 00000 n +0000054309 00000 n +0000054448 00000 n +0000054587 00000 n +0000054726 00000 n +0000054865 00000 n +0000055004 00000 n +0000055143 00000 n +0000055282 00000 n +0000055421 00000 n +0000055560 00000 n +0000055699 00000 n +0000055838 00000 n +0000055977 00000 n +0000056116 00000 n +0000057957 00000 n +0000058349 00000 n +0000058525 00000 n +0000058725 00000 n +0000058863 00000 n +0000059001 00000 n +0000963050 00000 n +0000966089 00000 n +0000059165 00000 n +0000061538 00000 n +0000061915 00000 n +0000062087 00000 n +0000062259 00000 n +0000980789 00000 n +0000062493 00000 n +0000064809 00000 n +0000065166 00000 n +0000065335 00000 n +0000990401 00000 n +0000065567 00000 n +0000067952 00000 n +0000068289 00000 n +0000068425 00000 n +0000070045 00000 n +0000070364 00000 n +0000071927 00000 n +0000072222 00000 n +0000075360 00000 n +0000075709 00000 n +0000075907 00000 n +0000077044 00000 n +0000077303 00000 n +0000079311 00000 n +0000079664 00000 n +0000079802 00000 n +0000079940 00000 n +0000080078 00000 n +0000082638 00000 n +0000082991 00000 n +0000083129 00000 n +0000083267 00000 n +0000083405 00000 n +0000085673 00000 n +0000086034 00000 n +0000086206 00000 n +0000086393 00000 n +0000086574 00000 n +0000086713 00000 n +0000088464 00000 n +0000088837 00000 n +0000088975 00000 n +0000089152 00000 n +0000089290 00000 n +0000089427 00000 n +0000089866 00000 n +0000090124 00000 n +0000091309 00000 n +0000091650 00000 n +0000091836 00000 n +0000092044 00000 n +0000092181 00000 n +0000093858 00000 n +0000094211 00000 n +0000094349 00000 n +0000094527 00000 n +0000094698 00000 n +0000096564 00000 n +0000096929 00000 n +0000097145 00000 n +0000097345 00000 n +0000097517 00000 n +0000097713 00000 n +0000097909 00000 n +0000098081 00000 n +0000099729 00000 n +0000100062 00000 n +0000100250 00000 n +0000100421 00000 n +0000102149 00000 n +0000102420 00000 n +0000104035 00000 n +0000104294 00000 n +0000105528 00000 n +0000105881 00000 n +0000106057 00000 n +0000106245 00000 n +0000106429 00000 n +0000107003 00000 n +0000107355 00000 n +0000107526 00000 n +0000107717 00000 n +0000107908 00000 n +0000109385 00000 n +0000109754 00000 n +0000109892 00000 n +0000110030 00000 n +0000110169 00000 n +0000110308 00000 n +0000110445 00000 n +0000111252 00000 n +0000111576 00000 n +0000111715 00000 n +0000113204 00000 n +0000113523 00000 n +0000114701 00000 n +0000115026 00000 n +0000115231 00000 n +0000116582 00000 n +0000116951 00000 n +0000117119 00000 n +0000117284 00000 n +0000117463 00000 n +0000117648 00000 n +0000117833 00000 n +0000119467 00000 n +0000119792 00000 n +0000119957 00000 n +0000121895 00000 n +0000122244 00000 n +0000122412 00000 n +0000123303 00000 n +0000123639 00000 n +0000123887 00000 n +0000125336 00000 n +0000125583 00000 n +0000126942 00000 n +0000127189 00000 n +0000128783 00000 n +0000129108 00000 n +0000129287 00000 n +0000131849 00000 n +0000132206 00000 n +0000132388 00000 n +0000132526 00000 n +0000134677 00000 n +0000134996 00000 n +0000137095 00000 n +0000137448 00000 n +0000137615 00000 n +0000137780 00000 n +0000137918 00000 n +0000140450 00000 n +0000140819 00000 n +0000141044 00000 n +0000141270 00000 n +0000143133 00000 n +0000143452 00000 n +0000145882 00000 n +0000146259 00000 n +0000146440 00000 n +0000146622 00000 n +0000146804 00000 n +0000148839 00000 n +0000149192 00000 n +0000149401 00000 n +0000149568 00000 n +0000149733 00000 n +0000151944 00000 n +0000152289 00000 n +0000152480 00000 n +0000152661 00000 n +0000153306 00000 n +0000153618 00000 n +0000153843 00000 n +0000155724 00000 n +0000156055 00000 n +0000158087 00000 n +0000158406 00000 n +0000160251 00000 n +0000160620 00000 n +0000160836 00000 n +0000161010 00000 n +0000163024 00000 n +0000163343 00000 n +0000165293 00000 n +0000165630 00000 n +0000165863 00000 n +0000167734 00000 n +0000168077 00000 n +0000169628 00000 n +0000169993 00000 n +0000170131 00000 n +0000170270 00000 n +0000170409 00000 n +0000172166 00000 n +0000172497 00000 n +0000174327 00000 n +0000174664 00000 n +0000174880 00000 n +0000176103 00000 n +0000176434 00000 n +0000177395 00000 n +0000177677 00000 n +0000179407 00000 n +0000179751 00000 n +0000180451 00000 n +0000787076 00000 n +0000180790 00000 n +0000182621 00000 n +0000182978 00000 n +0000183170 00000 n +0000183375 00000 n +0000186223 00000 n +0000186555 00000 n +0000188884 00000 n +0000189246 00000 n +0000189461 00000 n +0000192085 00000 n +0000192417 00000 n +0000192708 00000 n +0000192942 00000 n +0000194757 00000 n +0000195088 00000 n +0000195790 00000 n +0000196048 00000 n +0000198165 00000 n +0000198538 00000 n +0000198737 00000 n +0000198936 00000 n +0000199120 00000 n +0000199257 00000 n +0000199649 00000 n +0000199973 00000 n +0000200180 00000 n +0000201810 00000 n +0000202147 00000 n +0000202395 00000 n +0000204183 00000 n +0000204540 00000 n +0000204788 00000 n +0000205036 00000 n +0000206855 00000 n +0000207138 00000 n +0000208297 00000 n +0000208628 00000 n +0000210107 00000 n +0000210444 00000 n +0000210607 00000 n +0000213386 00000 n +0000213735 00000 n +0000213914 00000 n +0000216125 00000 n +0000216444 00000 n +0000219986 00000 n +0000220306 00000 n +0000221837 00000 n +0000222174 00000 n +0000222353 00000 n +0000224014 00000 n +0000224345 00000 n +0000226730 00000 n +0000227061 00000 n +0000229154 00000 n +0000229485 00000 n +0000231267 00000 n +0000231598 00000 n +0000234090 00000 n +0000234421 00000 n +0000235811 00000 n +0000236142 00000 n +0000238712 00000 n +0000239043 00000 n +0000240454 00000 n +0000240785 00000 n +0000242524 00000 n +0000242856 00000 n +0000244699 00000 n +0000245049 00000 n +0000245274 00000 n +0000247565 00000 n +0000247908 00000 n +0000249878 00000 n +0000250221 00000 n +0000252367 00000 n +0000252725 00000 n +0000252864 00000 n +0000253003 00000 n +0000254732 00000 n +0000255150 00000 n +0000255287 00000 n +0000255425 00000 n +0000255563 00000 n +0000255701 00000 n +0000255839 00000 n +0000255977 00000 n +0000256115 00000 n +0000256253 00000 n +0000256391 00000 n +0000256529 00000 n +0000256667 00000 n +0000258871 00000 n +0000259301 00000 n +0000259439 00000 n +0000259577 00000 n +0000259714 00000 n +0000259852 00000 n +0000259990 00000 n +0000260128 00000 n +0000260266 00000 n +0000260404 00000 n +0000260542 00000 n +0000260680 00000 n +0000260818 00000 n +0000262255 00000 n +0000262592 00000 n +0000262730 00000 n +0000264616 00000 n +0000264965 00000 n +0000265166 00000 n +0000267481 00000 n +0000267824 00000 n +0000270023 00000 n +0000270376 00000 n +0000270515 00000 n +0000270653 00000 n +0000270791 00000 n +0000272145 00000 n +0000272506 00000 n +0000272644 00000 n +0000274429 00000 n +0000274790 00000 n +0000274929 00000 n +0000277508 00000 n +0000277852 00000 n +0000280181 00000 n +0000280525 00000 n +0000283197 00000 n +0000283563 00000 n +0000283751 00000 n +0000283941 00000 n +0000284131 00000 n +0000286942 00000 n +0000287262 00000 n +0000289857 00000 n +0000290189 00000 n +0000293093 00000 n +0000293425 00000 n +0000295119 00000 n +0000295439 00000 n +0000297699 00000 n +0000298083 00000 n +0000298250 00000 n +0000999251 00000 n +0000298445 00000 n +0000300584 00000 n +0000300904 00000 n +0000303941 00000 n +0000304286 00000 n +0000306883 00000 n +0000307274 00000 n +0000307469 00000 n +0000307662 00000 n +0000307895 00000 n +0000310327 00000 n +0001009142 00000 n +0000310661 00000 n +0000312793 00000 n +0000313138 00000 n +0000313902 00000 n +0000314227 00000 n +0000314365 00000 n +0000316304 00000 n +0000316708 00000 n +0000316875 00000 n +0000783643 00000 n +0000317041 00000 n +0000319230 00000 n +0000781145 00000 n +0000319620 00000 n +0000324879 00000 n +0000325354 00000 n +0000325572 00000 n +0000325790 00000 n +0000778144 00000 n +0000716527 00000 n +0000519969 00000 n +0000521422 00000 n +0000325979 00000 n +0000327552 00000 n +0000327886 00000 n +0000328256 00000 n +0000605606 00000 n +0000328536 00000 n +0000329838 00000 n +0000330188 00000 n +0000330409 00000 n +0000332934 00000 n +0000333266 00000 n +0000335194 00000 n +0000335526 00000 n +0000337791 00000 n +0000338161 00000 n +0000338299 00000 n +0000338438 00000 n +0000339881 00000 n +0000340219 00000 n +0000340357 00000 n +0000342007 00000 n +0000342345 00000 n +0000342484 00000 n +0000344348 00000 n +0000344668 00000 n +0000346806 00000 n +0000347144 00000 n +0000347414 00000 n +0000347929 00000 n +0000348188 00000 n +0000350348 00000 n +0000350692 00000 n +0000352905 00000 n +0000353271 00000 n +0000353436 00000 n +0000353574 00000 n +0000353748 00000 n +0000356598 00000 n +0000356924 00000 n +0000357112 00000 n +0000358812 00000 n +0000359150 00000 n +0000359338 00000 n +0000361265 00000 n +0000361610 00000 n +0000363807 00000 n +0000364128 00000 n +0000364873 00000 n +0000365192 00000 n +0000367212 00000 n +0000367570 00000 n +0000367764 00000 n +0000367958 00000 n +0000370133 00000 n +0000370455 00000 n +0000372354 00000 n +0000372689 00000 n +0000374636 00000 n +0000374959 00000 n +0000376835 00000 n +0000377169 00000 n +0000379209 00000 n +0000379555 00000 n +0000380075 00000 n +0000380403 00000 n +0000380567 00000 n +0000382979 00000 n +0000383313 00000 n +0000384999 00000 n +0000385361 00000 n +0000385501 00000 n +0000385641 00000 n +0000386006 00000 n +0000564395 00000 n +0000386289 00000 n +0000388093 00000 n +0000388458 00000 n +0000388639 00000 n +0000390223 00000 n +0000390595 00000 n +0000390788 00000 n +0000390981 00000 n +0000391169 00000 n +0000393178 00000 n +0000393524 00000 n +0000396289 00000 n +0000396611 00000 n +0000399267 00000 n +0000399626 00000 n +0000402045 00000 n +0000402392 00000 n +0000405115 00000 n +0000405438 00000 n +0000406944 00000 n +0000407267 00000 n +0000409544 00000 n +0000409867 00000 n +0000412615 00000 n +0000412937 00000 n +0000415240 00000 n +0000415599 00000 n +0000418311 00000 n +0000418661 00000 n +0000418800 00000 n +0000418939 00000 n +0000419506 00000 n +0000419815 00000 n +0000420957 00000 n +0000421307 00000 n +0000421500 00000 n +0000421693 00000 n +0000427601 00000 n +0000428056 00000 n +0000431301 00000 n +0000431623 00000 n +0000433703 00000 n +0000434038 00000 n +0000436557 00000 n +0000436919 00000 n +0000437112 00000 n +0000437330 00000 n +0000439501 00000 n +0000439835 00000 n +0000442082 00000 n +0000442423 00000 n +0000442605 00000 n +0000445012 00000 n +0000445384 00000 n +0000448387 00000 n +0000448767 00000 n +0000448960 00000 n +0000449203 00000 n +0000449391 00000 n +0000449583 00000 n +0000451520 00000 n +0000451883 00000 n +0000452076 00000 n +0000452269 00000 n +0000453742 00000 n +0000454076 00000 n +0000455146 00000 n +0000455407 00000 n +0000457060 00000 n +0000457413 00000 n +0000457581 00000 n +0000459745 00000 n +0000460086 00000 n +0000460322 00000 n +0000461871 00000 n +0000462181 00000 n +0000464346 00000 n +0000464731 00000 n +0000464906 00000 n +0000465073 00000 n +0000465241 00000 n +0000467015 00000 n +0000467349 00000 n +0000468199 00000 n +0000522192 00000 n +0000468530 00000 n +0000470131 00000 n +0000470465 00000 n +0000472639 00000 n +0000473019 00000 n +0000473199 00000 n +0000473379 00000 n +0000473559 00000 n +0000473725 00000 n +0000476014 00000 n +0000476355 00000 n +0000476518 00000 n +0000477577 00000 n +0000477898 00000 n +0000479362 00000 n +0000479727 00000 n +0000479931 00000 n +0000481644 00000 n +0000482015 00000 n +0000482214 00000 n +0000482418 00000 n +0000482617 00000 n +0000483965 00000 n +0000484384 00000 n +0000484523 00000 n +0000484662 00000 n +0000484800 00000 n +0000484939 00000 n +0000485078 00000 n +0000485217 00000 n +0000485356 00000 n +0000485495 00000 n +0000485634 00000 n +0000485773 00000 n +0000485912 00000 n +0000486906 00000 n +0000487227 00000 n +0000488647 00000 n +0000488981 00000 n +0000490641 00000 n +0000490963 00000 n +0000493457 00000 n +0000493791 00000 n +0000497133 00000 n +0000497657 00000 n +0000497795 00000 n +0000497933 00000 n +0000498071 00000 n +0000498210 00000 n +0000498349 00000 n +0000498488 00000 n +0000498627 00000 n +0000498766 00000 n +0000498905 00000 n +0000499044 00000 n +0000499183 00000 n +0000499322 00000 n +0000499461 00000 n +0000499599 00000 n +0000499738 00000 n +0000499877 00000 n +0000500017 00000 n +0000500157 00000 n +0000500297 00000 n +0000500437 00000 n +0000502460 00000 n +0000503113 00000 n +0000503252 00000 n +0000503391 00000 n +0000503530 00000 n +0000503669 00000 n +0000503808 00000 n +0000503947 00000 n +0000504086 00000 n +0000504226 00000 n +0000504366 00000 n +0000504506 00000 n +0000504646 00000 n +0000504785 00000 n +0000504925 00000 n +0000505064 00000 n +0000505203 00000 n +0000505343 00000 n +0000505483 00000 n +0000505623 00000 n +0000505763 00000 n +0000505903 00000 n +0000506042 00000 n +0000506181 00000 n +0000506320 00000 n +0000506459 00000 n +0000506598 00000 n +0000506737 00000 n +0000506942 00000 n +0000507082 00000 n +0000507222 00000 n +0000507362 00000 n +0000507502 00000 n +0000507706 00000 n +0000507910 00000 n +0000508050 00000 n +0000508190 00000 n +0000508330 00000 n +0000508470 00000 n +0000510190 00000 n +0000510666 00000 n +0000510806 00000 n +0000510946 00000 n +0000511086 00000 n +0000511226 00000 n +0000511366 00000 n +0000511506 00000 n +0000511646 00000 n +0000511786 00000 n +0000511926 00000 n +0000512066 00000 n +0000512206 00000 n +0000512346 00000 n +0000512486 00000 n +0000512626 00000 n +0000512832 00000 n +0000513038 00000 n +0000515043 00000 n +0000515377 00000 n +0000517294 00000 n +0000517616 00000 n +0000518475 00000 n +0000518784 00000 n +0000518919 00000 n +0000519054 00000 n +0000519189 00000 n +0000519324 00000 n +0000519459 00000 n +0000519594 00000 n +0000519729 00000 n +0000520237 00000 n +0000520372 00000 n +0000520507 00000 n +0000520642 00000 n +0000520777 00000 n +0000520912 00000 n +0000521047 00000 n +0000521182 00000 n +0000521692 00000 n +0000522169 00000 n +0000563873 00000 n +0000563898 00000 n +0000564372 00000 n +0000605064 00000 n +0000605089 00000 n +0000605583 00000 n +0000693262 00000 n +0000693287 00000 n +0000716502 00000 n +0000754520 00000 n +0000754545 00000 n +0000778119 00000 n +0000780909 00000 n +0000780933 00000 n +0000781123 00000 n +0000781881 00000 n +0000781904 00000 n +0000783619 00000 n +0000786620 00000 n +0000786644 00000 n +0000787053 00000 n +0000844525 00000 n +0000844550 00000 n +0000844854 00000 n +0000850713 00000 n +0000851439 00000 n +0000851641 00000 n +0000875750 00000 n +0000876544 00000 n +0000876747 00000 n +0000885800 00000 n +0000886553 00000 n +0000886759 00000 n +0000894823 00000 n +0000895664 00000 n +0000895861 00000 n +0000908632 00000 n +0000909434 00000 n +0000909638 00000 n +0000926527 00000 n +0000927288 00000 n +0000927488 00000 n +0000944428 00000 n +0000945157 00000 n +0000945349 00000 n +0000963025 00000 n +0000963262 00000 n +0000963450 00000 n +0000963826 00000 n +0000963803 00000 n +0000966065 00000 n +0000966635 00000 n +0000966831 00000 n +0000967534 00000 n +0000967511 00000 n +0000980764 00000 n +0000981524 00000 n +0000981718 00000 n +0000990377 00000 n +0000991066 00000 n +0000991254 00000 n +0000999227 00000 n +0000999978 00000 n +0001000176 00000 n +0001009118 00000 n +0001009346 00000 n +0001009554 00000 n +0001009903 00000 n +0001009880 00000 n +0001011544 00000 n +0001011568 00000 n + +trailer +< <8C8D5D67F99E42C1B65FC0D80BCB6253>]>> +startxref +1011692 +%%EOF diff --git a/public/pdf/product1.pdf b/public/pdf/product1.pdf new file mode 100644 index 0000000..9b39f5f Binary files /dev/null and b/public/pdf/product1.pdf differ diff --git a/public/pdf/product2.pdf b/public/pdf/product2.pdf new file mode 100644 index 0000000..e7c0962 Binary files /dev/null and b/public/pdf/product2.pdf differ diff --git a/public/pdfconfigs/config_mydoc_pdf.yml b/public/pdfconfigs/config_mydoc_pdf.yml new file mode 100644 index 0000000..3a61d05 --- /dev/null +++ b/public/pdfconfigs/config_mydoc_pdf.yml @@ -0,0 +1,20 @@ +destination: _site/ +url: "http://127.0.0.1:4010" +baseurl: "/mydoc-pdf" +port: 4010 +output: pdf +product: mydoc +print_title: Jekyll theme for documentation — mydoc product +print_subtitle: version 6.0 +output: pdf +defaults: + - + scope: + path: "" + type: "pages" + values: + layout: "page_print" + comments: true + search: true + +pdf_sidebar: mydoc_sidebar diff --git a/public/pdfconfigs/config_product1_pdf.yml b/public/pdfconfigs/config_product1_pdf.yml new file mode 100644 index 0000000..04ba870 --- /dev/null +++ b/public/pdfconfigs/config_product1_pdf.yml @@ -0,0 +1,20 @@ +destination: _site/ +url: "http://127.0.0.1:4011" +baseurl: "/product1-pdf" +port: 4011 +output: pdf +product: product1 +print_title: Product 1 documentation +print_subtitle: version 1.0 +output: pdf +defaults: + - + scope: + path: "" + type: "pages" + values: + layout: "page_print" + comments: true + search: true + +pdf_sidebar: product1_sidebar diff --git a/public/pdfconfigs/config_product2_pdf.yml b/public/pdfconfigs/config_product2_pdf.yml new file mode 100644 index 0000000..725537d --- /dev/null +++ b/public/pdfconfigs/config_product2_pdf.yml @@ -0,0 +1,20 @@ +destination: _site/ +url: "http://127.0.0.1:4012" +baseurl: "/product2-pdf" +port: 4012 +output: pdf +product: product2 +print_title: Product 2 documentation +print_subtitle: version 1.0 +output: pdf +defaults: + - + scope: + path: "" + type: "pages" + values: + layout: "page_print" + comments: true + search: true + +pdf_sidebar: product2_sidebar diff --git a/public/pdfconfigs/prince-list.txt b/public/pdfconfigs/prince-list.txt new file mode 100644 index 0000000..5a31132 --- /dev/null +++ b/public/pdfconfigs/prince-list.txt @@ -0,0 +1,7 @@ + + + + + + + diff --git a/public/redirects.json b/public/redirects.json new file mode 100644 index 0000000..a5ebfb2 --- /dev/null +++ b/public/redirects.json @@ -0,0 +1 @@ +{"/merlin6":"https://hpce.pages.psi.ch/merlin6/introduction.html","/merlin6/index.html":"https://hpce.pages.psi.ch/merlin6/introduction.html","/merlin7":"https://hpce.pages.psi.ch/merlin7/introduction.html","/merlin7/index.html":"https://hpce.pages.psi.ch/merlin7/introduction.html","/merlin7/data-directories.html":"https://hpce.pages.psi.ch/merlin7/storage.html","/merlin6/data-directories.html":"https://hpce.pages.psi.ch/merlin6/storage.html"} \ No newline at end of file diff --git a/public/search.json b/public/search.json new file mode 100644 index 0000000..b5d5f4a --- /dev/null +++ b/public/search.json @@ -0,0 +1,1188 @@ +[ + + + + +{ +"title": "Accessing Interactive Nodes", +"tags": "", +"keywords": "How to, HowTo, access, accessing, nomachine, ssh", +"url": "/merlin7/interactive.html", +"summary": "" +} +, + + + +{ +"title": "Accessing Interactive Nodes", +"tags": "", +"keywords": "How to, HowTo, access, accessing, nomachine, ssh", +"url": "/merlin6/interactive.html", +"summary": "" +} +, + + + +{ +"title": "Accessing Slurm Cluster", +"tags": "", +"keywords": "slurm, batch system, merlin5, merlin7, gmerlin7, cpu, gpu", +"url": "/merlin7/slurm-access.html", +"summary": "" +} +, + + + +{ +"title": "Accessing Slurm Cluster", +"tags": "", +"keywords": "slurm, batch system, merlin5, merlin6, gmerlin6, cpu, gpu", +"url": "/merlin6/slurm-access.html", +"summary": "" +} +, + + + +{ +"title": "ANSYS / CFX", +"tags": "", +"keywords": "software, ansys, cfx5, cfx, slurm, interactive, rsm, batch job", +"url": "/merlin6/ansys-cfx.html", +"summary": "This document describes how to run ANSYS/CFX in the Merlin6 cluster" +} +, + + + +{ +"title": "ANSYS / Fluent", +"tags": "", +"keywords": "software, ansys, fluent, slurm, interactive, rsm, batch job", +"url": "/merlin6/ansys-fluent.html", +"summary": "This document describes how to run ANSYS/Fluent in the Merlin6 cluster" +} +, + + + +{ +"title": "ANSYS HFSS / ElectroMagnetics", +"tags": "", +"keywords": "software, ansys, ansysEM, em, slurm, hfss, interactive, rsm, batch job", +"url": "/merlin6/ansys-hfss.html", +"summary": "This document describes how to run ANSYS HFSS (ElectroMagnetics) in the Merlin6 cluster" +} +, + + + +{ +"title": "ANSYS / MAPDL", +"tags": "", +"keywords": "software, ansys, mapdl, slurm, apdl, interactive, rsm, batch job", +"url": "/merlin6/ansys-mapdl.html", +"summary": "This document describes how to run ANSYS/Mechanical APDL in the Merlin6 cluster" +} +, + + + +{ +"title": "ANSYS RSM (Remote Resolve Manager)", +"tags": "", +"keywords": "software, ansys, rsm, slurm, interactive, rsm, windows", +"url": "/merlin7/ansys-rsm.html", +"summary": "This document describes how to use the ANSYS Remote Resolve Manager service in the Merlin7 cluster" +} +, + + + +{ +"title": "ANSYS RSM (Remote Resolve Manager)", +"tags": "", +"keywords": "software, ansys, rsm, slurm, interactive, rsm, windows", +"url": "/merlin6/ansys-rsm.html", +"summary": "This document describes how to use the ANSYS Remote Resolve Manager service in the Merlin6 cluster" +} +, + + + +{ +"title": "ANSYS", +"tags": "", +"keywords": "software, ansys, slurm, interactive, rsm, pmodules, overlay, overlays", +"url": "/merlin6/ansys.html", +"summary": "This document describes how to load and use ANSYS in the Merlin6 cluster" +} +, + + + +{ +"title": "ANSYS", +"tags": "", +"keywords": "software, ansys, slurm, interactive, rsm, pmodules, overlay, overlays", +"url": "/merlin7/ansys.html", +"summary": "This document describes how to load and use ANSYS in the Merlin7 cluster" +} +, + + + +{ +"title": "Archive & PSI Data Catalog", +"tags": "", +"keywords": "linux, archive, data catalog, archiving, lts, tape, long term storage, ingestion, datacatalog", +"url": "/merlin7/archive.html", +"summary": "This document describes how to use the PSI Data Catalog for archiving Merlin7 data." +} +, + + + +{ +"title": "Archive & PSI Data Catalog", +"tags": "", +"keywords": "linux, archive, data catalog, archiving, lts, tape, long term storage, ingestion, datacatalog", +"url": "/merlin6/archive.html", +"summary": "This document describes how to use the PSI Data Catalog for archiving Merlin6 data." +} +, + + + +{ +"title": "Introduction", +"tags": "", +"keywords": "", +"url": "/gmerlin6/cluster-introduction.html", +"summary": "" +} +, + + + +{ +"title": "Cluster 'merlin5'", +"tags": "", +"keywords": "", +"url": "/merlin5/cluster-introduction.html", +"summary": "" +} +, + + + +{ +"title": "Introduction", +"tags": "", +"keywords": "", +"url": "/merlin6/cluster-introduction.html", +"summary": "" +} +, + + + +{ +"title": "Code Of Conduct", +"tags": "", +"keywords": "code of conduct, rules, principle, policy, policies, administrator, backup", +"url": "/merlin6/code-of-conduct.html", +"summary": "" +} +, + + + +{ +"title": "Code Of Conduct", +"tags": "", +"keywords": "code of conduct, rules, principle, policy, policies, administrator, backup", +"url": "/merlin7/code-of-conduct.html", +"summary": "" +} +, + + + +{ +"title": "Connecting from a Linux Client", +"tags": "", +"keywords": "linux, connecting, client, configuration, SSH, X11", +"url": "/merlin6/connect-from-linux.html", +"summary": "This document describes a recommended setup for a Linux client." +} +, + + + +{ +"title": "Connecting from a Linux Client", +"tags": "", +"keywords": "linux, connecting, client, configuration, SSH, X11", +"url": "/merlin7/connect-from-linux.html", +"summary": "This document describes a recommended setup for a Linux client." +} +, + + + +{ +"title": "Connecting from a MacOS Client", +"tags": "", +"keywords": "MacOS, mac os, mac, connecting, client, configuration, SSH, X11", +"url": "/merlin7/connect-from-macos.html", +"summary": "This document describes a recommended setup for a MacOS client." +} +, + + + +{ +"title": "Connecting from a MacOS Client", +"tags": "", +"keywords": "MacOS, mac os, mac, connecting, client, configuration, SSH, X11", +"url": "/merlin6/connect-from-macos.html", +"summary": "This document describes a recommended setup for a MacOS client." +} +, + + + +{ +"title": "Connecting from a Windows Client", +"tags": "", +"keywords": "microsoft, mocosoft, windows, putty, xming, connecting, client, configuration, SSH, X11", +"url": "/merlin6/connect-from-windows.html", +"summary": "This document describes a recommended setup for a Windows client." +} +, + + + +{ +"title": "Connecting from a Windows Client", +"tags": "", +"keywords": "microsoft, mocosoft, windows, putty, xming, connecting, client, configuration, SSH, X11", +"url": "/merlin7/connect-from-windows.html", +"summary": "This document describes a recommended setup for a Windows client." +} +, + + + +{ +"title": "Contact", +"tags": "", +"keywords": "contact, support, snow, service now, mailing list, mailing, email, mail, merlin-admins@lists.psi.ch, merlin-users@lists.psi.ch, merlin users", +"url": "/merlin7/contact.html", +"summary": "" +} +, + + + +{ +"title": "Contact", +"tags": "", +"keywords": "contact, support, snow, service now, mailing list, mailing, email, mail, merlin-admins@lists.psi.ch, merlin-users@lists.psi.ch, merlin users", +"url": "/merlin6/contact.html", +"summary": "" +} +, + + + +{ +"title": "Cray Programming Environment", +"tags": "", +"keywords": "cray, module", +"url": "/merlin7/cray-module-env.html", +"summary": "This document describes how to use the Cray Programming Environment on Merlin7." +} +, + + + +{ +"title": "Downtimes", +"tags": "", +"keywords": "", +"url": "/merlin6/downtimes.html", +"summary": "" +} +, + + + +{ +"title": "FAQ", +"tags": "", +"keywords": "faq, frequently asked questions, support", +"url": "/merlin6/faq.html", +"summary": "" +} +, + + + + + +{ +"title": "GOTHIC", +"tags": "", +"keywords": "software, gothic, slurm, interactive, batch job", +"url": "/merlin6/gothic.html", +"summary": "This document describes how to run Gothic in the Merlin cluster" +} +, + + + +{ +"title": "GROMACS", +"tags": "", +"keywords": "GROMACS software, compile", +"url": "/merlin7/gromacs.html", +"summary": "GROMACS (GROningen Machine for Chemical Simulations) is a versatile and widely-used open source package to perform molecular dynamics" +} +, + + + +{ +"title": "Hardware And Software Description", +"tags": "", +"keywords": "", +"url": "/merlin5/hardware-and-software.html", +"summary": "" +} +, + + + +{ +"title": "Hardware And Software Description", +"tags": "", +"keywords": "", +"url": "/merlin6/hardware-and-software.html", +"summary": "" +} +, + + + +{ +"title": "Hardware And Software Description", +"tags": "", +"keywords": "", +"url": "/gmerlin6/hardware-and-software.html", +"summary": "" +} +, + + + +{ +"title": "Intel MPI Support", +"tags": "", +"keywords": "software, impi, slurm", +"url": "/merlin6/impi.html", +"summary": "This document describes how to use Intel MPI in the Merlin6 cluster" +} +, + + + +{ +"title": "", +"tags": "", +"keywords": "sample homepage", +"url": "/index.html", +"summary": "" +} +, + + + +{ +"title": "PSI HPC@CSCS", +"tags": "", +"keywords": "", +"url": "/CSCS/index.html", +"summary": "" +} +, + + + +{ +"title": "Running Interactive Jobs", +"tags": "", +"keywords": "interactive, X11, X, srun, salloc, job, jobs, slurm, nomachine, nx", +"url": "/merlin6/interactive-jobs.html", +"summary": "This document describes how to run interactive jobs as well as X based software." +} +, + + + +{ +"title": "Running Interactive Jobs", +"tags": "", +"keywords": "interactive, X11, X, srun, salloc, job, jobs, slurm, nomachine, nx", +"url": "/merlin7/interactive-jobs.html", +"summary": "This document describes how to run interactive jobs as well as X based software." +} +, + + + +{ +"title": "Introduction", +"tags": "", +"keywords": "introduction, home, welcome, architecture, design", +"url": "/merlin6/introduction.html", +"summary": "" +} +, + + + +{ +"title": "Introduction", +"tags": "", +"keywords": "introduction, home, welcome, architecture, design", +"url": "/merlin7/introduction.html", +"summary": "" +} +, + + + +{ +"title": "IPPL", +"tags": "", +"keywords": "IPPL software, compile", +"url": "/merlin7/ippl.html", +"summary": "Independent Parallel Particle Layer (IPPL) is a performance portable C++ library for Particle-Mesh methods" +} +, + + + +{ +"title": "Jupyter examples on merlin6", +"tags": "", +"keywords": "", +"url": "/merlin6/jupyter-examples.html", +"summary": "" +} +, + + + +{ +"title": "Jupyter Extensions", +"tags": "", +"keywords": "", +"url": "/merlin6/jupyter-extensions.html", +"summary": "" +} +, + + + +{ +"title": "Jupyterhub Troubleshooting", +"tags": "", +"keywords": "", +"url": "/merlin6/jupyterhub-trouble.html", +"summary": "" +} +, + + + +{ +"title": "Jupyterhub on Merlin", +"tags": "", +"keywords": "", +"url": "/merlin6/jupyterhub.html", +"summary": "" +} +, + + + +{ +"title": "Jupyterlab User interface", +"tags": "", +"keywords": "", +"url": "/merlin6/jupyterlab.html", +"summary": "" +} +, + + + +{ +"title": "Jupytext - efficient editing", +"tags": "", +"keywords": "", +"url": "/merlin6/jupytext.html", +"summary": "" +} +, + + + +{ +"title": "Kerberos and AFS authentication", +"tags": "", +"keywords": "kerberos, AFS, kinit, klist, keytab, tickets, connecting, client, configuration, slurm", +"url": "/merlin6/kerberos.html", +"summary": "This document describes how to use Kerberos." +} +, + + + +{ +"title": "Kerberos and AFS authentication", +"tags": "", +"keywords": "kerberos, AFS, kinit, klist, keytab, tickets, connecting, client, configuration, slurm", +"url": "/merlin7/kerberos.html", +"summary": "This document describes how to use Kerberos." +} +, + + + +{ +"title": "Known Problems", +"tags": "", +"keywords": "known problems, troubleshooting, illegal instructions, paraview, ansys, shell, opengl, mesa, vglrun, module: command not found, error", +"url": "/merlin6/known-problems.html", +"summary": "" +} +, + + + +{ +"title": "Using merlin_rmount", +"tags": "", +"keywords": "transferring data, data transfer, rsync, dav, webdav, sftp, ftp, smb, cifs, copy data, copying, mount, file, folder, sharing", +"url": "/merlin7/merlin-rmount.html", +"summary": "" +} +, + + + +{ +"title": "Using merlin_rmount", +"tags": "", +"keywords": "transferring data, data transfer, rsync, dav, webdav, sftp, ftp, smb, cifs, copy data, copying, mount, file, folder, sharing", +"url": "/merlin6/merlin-rmount.html", +"summary": "" +} +, + + + +{ +"title": "Slurm cluster 'merlin7'", +"tags": "", +"keywords": "configuration, partitions, node definition", +"url": "/merlin7/merlin7-configuration.html", +"summary": "This document describes a summary of the Merlin7 configuration." +} +, + + + +{ +"title": "Merlin7 Tools", +"tags": "", +"keywords": "merlin_quotas", +"url": "/merlin7/tools.html", +"summary": "" +} +, + + + +{ +"title": "Migration From Merlin5", +"tags": "", +"keywords": "merlin5, merlin6, migration, rsync, archive, archiving, lts, long-term storage", +"url": "/merlin6/migrating.html", +"summary": "" +} +, + + + +{ +"title": "", +"tags": "", +"keywords": "merlin6, merlin7, migration, fpsync, rsync", +"url": "/merlin7/migrating.html", +"summary": "" +} +, + + + +{ +"title": "Monitoring", +"tags": "", +"keywords": "monitoring, jobs, slurm, job status, squeue, sinfo, sacct", +"url": "/merlin6/monitoring.html", +"summary": "" +} +, + + + +{ +"title": "News", +"tags": "", +"keywords": "news, blog, updates, release notes, announcements", +"url": "/news.html", +"summary": "" +} +, + + + +{ +"title": "News", +"tags": "", +"keywords": "news, blog, updates, release notes, announcements", +"url": "/news_archive.html", +"summary": "" +} +, + + + +{ +"title": "Remote Desktop Access", +"tags": "", +"keywords": "NX, nomachine, remote desktop access, login node, merlin-l-001, merlin-l-002, merlin-nx-01, merlin-nx-02, merlin-nx, rem-acc, vpn", +"url": "/merlin6/nomachine.html", +"summary": "" +} +, + + + +{ +"title": "Remote Desktop Access to Merlin7", +"tags": "", +"keywords": "NX, NoMachine, remote desktop access, login node, login001, login002, merlin7-nx-01, merlin7-nx, nx.psi.ch, VPN, browser access", +"url": "/merlin7/nomachine.html", +"summary": "" +} +, + + + +{ +"title": "OPAL-X", +"tags": "", +"keywords": "OPAL-X software, compile", +"url": "/merlin7/opal-x.html", +"summary": "OPAL (Object Oriented Particle Accelerator Library) is an open source C++ framework for general particle accelerator simulations including 3D space charge, short range wake fields and particle matter interaction." +} +, + + + +{ +"title": "OpenMPI Support", +"tags": "", +"keywords": "software, openmpi, slurm", +"url": "/merlin6/openmpi.html", +"summary": "This document describes how to use OpenMPI in the Merlin6 cluster" +} +, + + + +{ +"title": "OpenMPI Support", +"tags": "", +"keywords": "software, openmpi, slurm", +"url": "/merlin7/openmpi.html", +"summary": "This document describes how to use OpenMPI in the Merlin7 cluster" +} +, + + + +{ +"title": "Running Paraview", +"tags": "", +"keywords": "software, paraview, mesa, OpenGL, interactive", +"url": "/merlin6/paraview.html", +"summary": "This document describes how to run ParaView in the Merlin6 cluster" +} +, + + + +{ +"title": "Past Downtimes", +"tags": "", +"keywords": "", +"url": "/merlin6/past-downtimes.html", +"summary": "" +} +, + + + +{ +"title": "PSI Modules", +"tags": "", +"keywords": "Pmodules, software, stable, unstable, deprecated, overlay, overlays, release stage, module, package, packages, library, libraries", +"url": "/merlin7/pmodules.html", +"summary": "" +} +, + + + + + +{ +"title": "Python", +"tags": "", +"keywords": "pythonanacondacondajupyternumpy", +"url": "/merlin6/python.html", +"summary": "Running Python on Merlin" +} +, + + + +{ +"title": "Quantum Espresso", +"tags": "", +"keywords": "Quantum Espresso software, compile", +"url": "/merlin7/quantum-espresso.html", +"summary": "Quantum Espresso code for electronic-structure calculations and materials modeling at the nanoscale" +} +, + + + +{ +"title": "Requesting Merlin Accounts", +"tags": "", +"keywords": "registration, register, account, merlin5, merlin6, snow, service now", +"url": "/merlin6/request-account.html", +"summary": "" +} +, + + + +{ +"title": "Requesting Merlin Accounts", +"tags": "", +"keywords": "registration, register, account, merlin5, merlin7, snow, service now", +"url": "/merlin7/request-account.html", +"summary": "" +} +, + + + +{ +"title": "Requesting a Merlin Project", +"tags": "", +"keywords": "merlin project, project, snow, service now", +"url": "/merlin7/request-project.html", +"summary": "" +} +, + + + +{ +"title": "Requesting a Merlin Project", +"tags": "", +"keywords": "merlin project, project, snow, service now", +"url": "/merlin6/request-project.html", +"summary": "" +} +, + + + +{ +"title": "Running Slurm Scripts", +"tags": "", +"keywords": "batch script, slurm, sbatch, srun, jobs, job, submit, submission, array jobs, array, squeue, sinfo, scancel, packed jobs, short jobs, very short jobs, multithread, rules, no-multithread, HT", +"url": "/merlin6/running-jobs.html", +"summary": "This document describes how to run batch scripts in Slurm." +} +, + + + + + +{ +"title": "Testing Jekyll environment", +"tags": "", +"keywords": "", +"url": "/siteinfo.html", +"summary": "" +} +, + + + + + +{ +"title": "Slurm Basic Commands", +"tags": "", +"keywords": "sinfo, squeue, sbatch, srun, salloc, scancel, sview, seff, sjstat, sacct, basic commands, slurm commands, cluster", +"url": "/merlin6/slurm-basics.html", +"summary": "" +} +, + + + +{ +"title": "Slurm Configuration", +"tags": "", +"keywords": "configuration, partitions, node definition", +"url": "/merlin5/slurm-configuration.html", +"summary": "This document describes a summary of the Merlin5 Slurm configuration." +} +, + + + +{ +"title": "Slurm Configuration", +"tags": "", +"keywords": "configuration, partitions, node definition", +"url": "/merlin6/slurm-configuration.html", +"summary": "This document describes a summary of the Merlin6 configuration." +} +, + + + +{ +"title": "Slurm merlin7 Configuration", +"tags": "", +"keywords": "configuration, partitions, node definition", +"url": "/merlin7/slurm-configuration.html", +"summary": "This document describes a summary of the Merlin7 Slurm CPU-based configuration." +} +, + + + +{ +"title": "Slurm cluster 'gmerlin6'", +"tags": "", +"keywords": "configuration, partitions, node definition, gmerlin6", +"url": "/gmerlin6/slurm-configuration.html", +"summary": "This document describes a summary of the Slurm 'configuration." +} +, + + + +{ +"title": "Slurm Examples", +"tags": "", +"keywords": "slurm example, template, examples, templates, running jobs, sbatch, single core based jobs, HT, multithread, no-multithread, mpi, openmp, packed jobs, hands-on, array jobs, gpu", +"url": "/merlin6/slurm-examples.html", +"summary": "This document shows different template examples for running jobs in the Merlin cluster." +} +, + + + +{ +"title": "Slurm Examples", +"tags": "", +"keywords": "slurm example, template, examples, templates, running jobs, sbatch, single core based jobs, HT, multithread, no-multithread, mpi, openmp, packed jobs, hands-on, array jobs, gpu", +"url": "/merlin7/slurm-examples.html", +"summary": "This document shows different template examples for running jobs in the Merlin cluster." +} +, + + + +{ +"title": "Software repositories", +"tags": "", +"keywords": "modules, software, stable, unstable, deprecated, spack, repository, repositories", +"url": "/merlin7/software-repositories.html", +"summary": "This page contains information about the different software repositories" +} +, + + + +{ +"title": "Spack", +"tags": "", +"keywords": "spack, python, software, compile", +"url": "/merlin7/spack.html", +"summary": "Spack the HPC package manager documentation" +} +, + + + +{ +"title": "Configuring SSH Keys in Merlin", +"tags": "", +"keywords": "linux, connecting, client, configuration, SSH, Keys, SSH-Keys, RSA, authorization, authentication", +"url": "/merlin6/ssh-keys.html", +"summary": "This document describes how to deploy SSH Keys in Merlin." +} +, + + + +{ +"title": "Configuring SSH Keys in Merlin", +"tags": "", +"keywords": "linux, connecting, client, configuration, SSH, Keys, SSH-Keys, RSA, authorization, authentication", +"url": "/merlin7/ssh-keys.html", +"summary": "This document describes how to deploy SSH Keys in Merlin." +} +, + + + +{ +"title": "Merlin7 Storage", +"tags": "", +"keywords": "storage, /data/user, /data/software, /data/project, /scratch, /data/scratch/shared, quota, export, user, project, scratch, data, data/scratch/shared, merlin_quotas", +"url": "/merlin7/storage.html", +"summary": "" +} +, + + + +{ +"title": "Merlin6 Storage", +"tags": "", +"keywords": "storage, /data/user, /data/software, /data/project, /scratch, /shared-scratch, quota, export, user, project, scratch, data, shared-scratch, merlin_quotas", +"url": "/merlin6/storage.html", +"summary": "" +} +, + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +{ +"title": "Transferring Data", +"tags": "", +"keywords": "transferring data, data transfer, rsync, winscp, copy data, copying, sftp, import, export, hopx, vpn", +"url": "/merlin6/transfer-data.html", +"summary": "" +} +, + + + +{ +"title": "Transferring Data betweem PSI and CSCS", +"tags": "", +"keywords": "CSCS, data-transfer", +"url": "/CSCS/transfer-data.html", +"summary": "This Document shows the procedure for transferring data between CSCS and PSI" +} +, + + + +{ +"title": "Transferring Data", +"tags": "", +"keywords": "transferring data, data transfer, rsync, winscp, copy data, copying, sftp, import, export, hop, vpn", +"url": "/merlin7/transfer-data.html", +"summary": "" +} +, + + + +{ +"title": "Troubleshooting", +"tags": "", +"keywords": "troubleshooting, problems, faq, known problems", +"url": "/merlin6/troubleshooting.html", +"summary": "" +} +, + + + +{ +"title": "Using PModules", +"tags": "", +"keywords": "Pmodules, software, stable, unstable, deprecated, overlay, overlays, release stage, module, package, packages, library, libraries", +"url": "/merlin6/using-modules.html", +"summary": "" +} +, + + + +{ +"title": "", +"tags": "", +"keywords": "", +"url": "/merlin6", +"summary": "" +} +, + + + +{ +"title": "", +"tags": "", +"keywords": "", +"url": "/merlin6/index.html", +"summary": "" +} +, + + + +{ +"title": "", +"tags": "", +"keywords": "", +"url": "/merlin7", +"summary": "" +} +, + + + +{ +"title": "", +"tags": "", +"keywords": "", +"url": "/merlin7/index.html", +"summary": "" +} +, + + + +{ +"title": "", +"tags": "", +"keywords": "", +"url": "/merlin7/data-directories.html", +"summary": "" +} +, + + + +{ +"title": "", +"tags": "", +"keywords": "", +"url": "/merlin6/data-directories.html", +"summary": "" +} +, + + + +{ +"title": "", +"tags": "", +"keywords": "", +"url": "/redirects.json", +"summary": "" +} +, + + + + + +{ +"title": "Merlin7 in preproduction", +"tags": "newsgetting_started", +"keywords": "", +"url": "20240807merlin7-preprod-docs.html", +"summary": "More pages will be coming soon." +} +, + + +{ +"title": "Merlin 6 documentation available", +"tags": "newsgetting_started", +"keywords": "", +"url": "20190612launching-merlin6-docs.html", +"summary": "More pages will be coming soon." +} + + + +] diff --git a/public/siteinfo.html b/public/siteinfo.html new file mode 100644 index 0000000..2d66961 --- /dev/null +++ b/public/siteinfo.html @@ -0,0 +1,492 @@ + + + + + + + + +Testing Jekyll environment | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Testing Jekyll environment

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    Site

    + +

    Some information about this jekyll site (for debugging):

    + +
      +
    • site.port: 4001
    • +
    • site.host: 127.0.0.1
    • +
    • site.url: https://hpce.pages.psi.ch
    • +
    • site.baseurl: /
    • +
    + + + +

    Link processing in Jekyll

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    CodeResultBaseurl
    [Normal link to source](/pages/merlin6/01-Quick-Start-Guide/introduction.md)Normal link to source
    [Normal link to result](/merlin6/introduction.html)Normal link to result
    [Invalid Escaped link to source]({{"/pages/merlin6/01-Quick-Start-Guide/introduction.md"}})Invalid Escaped link to source❌❗
    [Escaped link to result]({{"/merlin6/introduction.html"}})Escaped link to result
    [Reference link to source](srcRef)Reference link to source
    [Reference link to result](dstRef)Reference link to result
    [Liquid Link]({% link pages/merlin6/01-Quick-Start-Guide/introduction.md %})Liquid Link
    ![PSI Logo](/images/psi-logo.png)PSI Logo
    ![Escaped PSI Logo]({{ "/images/psi-logo.png" }})PSI Logo from liquid
    {% include inline_image.html file="psi-logo.png" alt="Included PSI Logo" %}Included PSI Logo 
      
    {{ "/pages/merlin6/01-Quick-Start-Guide/introduction.md" | relative_url }}/pages/merlin6/01-Quick-Start-Guide/introduction.md✅❗
    {{ "/merlin6/introduction.html" | relative_url }}/merlin6/introduction.html
    {% link pages/merlin6/01-Quick-Start-Guide/introduction.md %}/merlin6/introduction.html
    + +

    Key:

    +
      +
    • ✅ Baseurl gets prepended to the URL
    • +
    • ❌ No baseurl in URL
    • +
    • ❗ Source not expected to be converted to the result URL
    • +
    + +

    Conclusions:

    + +
      +
    • Markdown links that refer to source files are replaced by the +baseurl + permalink
    • +
    • This happens for both normal links and images
    • +
    • Workarounds +
        +
      • Link to permalink directly (for pages/posts)
      • +
      • Can use {{"path"}} pattern to disable expansion
      • +
      +
    • +
    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/sitemap.xml b/public/sitemap.xml new file mode 100644 index 0000000..de00734 --- /dev/null +++ b/public/sitemap.xml @@ -0,0 +1,671 @@ + + + + + + https://hpce.pages.psi.ch/2024/08/07/merlin7-preprod-docs.html + + + + + + https://hpce.pages.psi.ch/2019/06/12/launching-merlin6-docs.html + + + + + + + + + + + https://hpce.pages.psi.ch/merlin7/interactive.html + + + + + + https://hpce.pages.psi.ch/merlin6/interactive.html + + + + + + https://hpce.pages.psi.ch/merlin7/slurm-access.html + + + + + + https://hpce.pages.psi.ch/merlin6/slurm-access.html + + + + + + https://hpce.pages.psi.ch/merlin6/ansys-cfx.html + + + + + + https://hpce.pages.psi.ch/merlin6/ansys-fluent.html + + + + + + https://hpce.pages.psi.ch/merlin6/ansys-hfss.html + + + + + + https://hpce.pages.psi.ch/merlin6/ansys-mapdl.html + + + + + + https://hpce.pages.psi.ch/merlin7/ansys-rsm.html + + + + + + https://hpce.pages.psi.ch/merlin6/ansys-rsm.html + + + + + + https://hpce.pages.psi.ch/merlin6/ansys.html + + + + + + https://hpce.pages.psi.ch/merlin7/ansys.html + + + + + + https://hpce.pages.psi.ch/merlin7/archive.html + + + + + + https://hpce.pages.psi.ch/merlin6/archive.html + + + + + + https://hpce.pages.psi.ch/gmerlin6/cluster-introduction.html + + + + + + https://hpce.pages.psi.ch/merlin5/cluster-introduction.html + + + + + + https://hpce.pages.psi.ch/merlin6/cluster-introduction.html + + + + + + https://hpce.pages.psi.ch/merlin6/code-of-conduct.html + + + + + + https://hpce.pages.psi.ch/merlin7/code-of-conduct.html + + + + + + https://hpce.pages.psi.ch/merlin6/connect-from-linux.html + + + + + + https://hpce.pages.psi.ch/merlin7/connect-from-linux.html + + + + + + https://hpce.pages.psi.ch/merlin7/connect-from-macos.html + + + + + + https://hpce.pages.psi.ch/merlin6/connect-from-macos.html + + + + + + https://hpce.pages.psi.ch/merlin6/connect-from-windows.html + + + + + + https://hpce.pages.psi.ch/merlin7/connect-from-windows.html + + + + + + https://hpce.pages.psi.ch/merlin7/contact.html + + + + + + https://hpce.pages.psi.ch/merlin6/contact.html + + + + + + https://hpce.pages.psi.ch/merlin7/cray-module-env.html + + + + + + https://hpce.pages.psi.ch/merlin6/downtimes.html + + + + + + https://hpce.pages.psi.ch/merlin6/faq.html + + + + + + + + https://hpce.pages.psi.ch/merlin6/gothic.html + + + + + + https://hpce.pages.psi.ch/merlin7/gromacs.html + + + + + + https://hpce.pages.psi.ch/merlin5/hardware-and-software.html + + + + + + https://hpce.pages.psi.ch/merlin6/hardware-and-software.html + + + + + + https://hpce.pages.psi.ch/gmerlin6/hardware-and-software.html + + + + + + https://hpce.pages.psi.ch/merlin6/impi.html + + + + + + https://hpce.pages.psi.ch/index.html + + + + + + https://hpce.pages.psi.ch/CSCS/index.html + + + + + + https://hpce.pages.psi.ch/merlin6/interactive-jobs.html + + + + + + https://hpce.pages.psi.ch/merlin7/interactive-jobs.html + + + + + + https://hpce.pages.psi.ch/merlin6/introduction.html + + + + + + https://hpce.pages.psi.ch/merlin7/introduction.html + + + + + + https://hpce.pages.psi.ch/merlin7/ippl.html + + + + + + https://hpce.pages.psi.ch/merlin6/jupyter-examples.html + + + + + + https://hpce.pages.psi.ch/merlin6/jupyter-extensions.html + + + + + + https://hpce.pages.psi.ch/merlin6/jupyterhub-trouble.html + + + + + + https://hpce.pages.psi.ch/merlin6/jupyterhub.html + + + + + + https://hpce.pages.psi.ch/merlin6/jupyterlab.html + + + + + + https://hpce.pages.psi.ch/merlin6/jupytext.html + + + + + + https://hpce.pages.psi.ch/merlin6/kerberos.html + + + + + + https://hpce.pages.psi.ch/merlin7/kerberos.html + + + + + + https://hpce.pages.psi.ch/merlin6/known-problems.html + + + + + + https://hpce.pages.psi.ch/merlin7/merlin-rmount.html + + + + + + https://hpce.pages.psi.ch/merlin6/merlin-rmount.html + + + + + + https://hpce.pages.psi.ch/merlin7/merlin7-configuration.html + + + + + + https://hpce.pages.psi.ch/merlin7/tools.html + + + + + + https://hpce.pages.psi.ch/merlin6/migrating.html + + + + + + https://hpce.pages.psi.ch/merlin7/migrating.html + + + + + + https://hpce.pages.psi.ch/merlin6/monitoring.html + + + + + + https://hpce.pages.psi.ch/news.html + + + + + + https://hpce.pages.psi.ch/news_archive.html + + + + + + https://hpce.pages.psi.ch/merlin6/nomachine.html + + + + + + https://hpce.pages.psi.ch/merlin7/nomachine.html + + + + + + https://hpce.pages.psi.ch/merlin7/opal-x.html + + + + + + https://hpce.pages.psi.ch/merlin6/openmpi.html + + + + + + https://hpce.pages.psi.ch/merlin7/openmpi.html + + + + + + https://hpce.pages.psi.ch/merlin6/paraview.html + + + + + + https://hpce.pages.psi.ch/merlin6/past-downtimes.html + + + + + + https://hpce.pages.psi.ch/merlin7/pmodules.html + + + + + + + + https://hpce.pages.psi.ch/merlin6/python.html + + + + + + https://hpce.pages.psi.ch/merlin7/quantum-espresso.html + + + + + + https://hpce.pages.psi.ch/merlin6/request-account.html + + + + + + https://hpce.pages.psi.ch/merlin7/request-account.html + + + + + + https://hpce.pages.psi.ch/merlin7/request-project.html + + + + + + https://hpce.pages.psi.ch/merlin6/request-project.html + + + + + + https://hpce.pages.psi.ch/merlin6/running-jobs.html + + + + + + + + https://hpce.pages.psi.ch/siteinfo.html + + + + + + + + https://hpce.pages.psi.ch/merlin6/slurm-basics.html + + + + + + https://hpce.pages.psi.ch/merlin5/slurm-configuration.html + + + + + + https://hpce.pages.psi.ch/merlin6/slurm-configuration.html + + + + + + https://hpce.pages.psi.ch/merlin7/slurm-configuration.html + + + + + + https://hpce.pages.psi.ch/gmerlin6/slurm-configuration.html + + + + + + https://hpce.pages.psi.ch/merlin6/slurm-examples.html + + + + + + https://hpce.pages.psi.ch/merlin7/slurm-examples.html + + + + + + https://hpce.pages.psi.ch/merlin7/software-repositories.html + + + + + + https://hpce.pages.psi.ch/merlin7/spack.html + + + + + + https://hpce.pages.psi.ch/merlin6/ssh-keys.html + + + + + + https://hpce.pages.psi.ch/merlin7/ssh-keys.html + + + + + + https://hpce.pages.psi.ch/merlin7/storage.html + + + + + + https://hpce.pages.psi.ch/merlin6/storage.html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://hpce.pages.psi.ch/merlin6/transfer-data.html + + + + + + https://hpce.pages.psi.ch/CSCS/transfer-data.html + + + + + + https://hpce.pages.psi.ch/merlin7/transfer-data.html + + + + + + https://hpce.pages.psi.ch/merlin6/troubleshooting.html + + + + + + https://hpce.pages.psi.ch/merlin6/using-modules.html + + + + + + https://hpce.pages.psi.ch/merlin6 + + + + + + https://hpce.pages.psi.ch/merlin6/index.html + + + + + + https://hpce.pages.psi.ch/merlin7 + + + + + + https://hpce.pages.psi.ch/merlin7/index.html + + + + + + https://hpce.pages.psi.ch/merlin7/data-directories.html + + + + + + https://hpce.pages.psi.ch/merlin6/data-directories.html + + + + + + https://hpce.pages.psi.ch/redirects.json + + + + \ No newline at end of file diff --git a/public/tag_collaboration.html b/public/tag_collaboration.html new file mode 100644 index 0000000..16f4d42 --- /dev/null +++ b/public/tag_collaboration.html @@ -0,0 +1,595 @@ + + + + + + + + +Collaboration pages | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Collaboration pages

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    The following pages and posts are tagged with

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TitleTypeExcerpt
    + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/tag_content_types.html b/public/tag_content_types.html new file mode 100644 index 0000000..c23f316 --- /dev/null +++ b/public/tag_content_types.html @@ -0,0 +1,595 @@ + + + + + + + + +Content types pages | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Content types pages

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    The following pages and posts are tagged with

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TitleTypeExcerpt
    + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/tag_formatting.html b/public/tag_formatting.html new file mode 100644 index 0000000..c2ff916 --- /dev/null +++ b/public/tag_formatting.html @@ -0,0 +1,595 @@ + + + + + + + + +Formatting pages | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Formatting pages

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    The following pages and posts are tagged with

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TitleTypeExcerpt
    + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/tag_getting_started.html b/public/tag_getting_started.html new file mode 100644 index 0000000..138dd5e --- /dev/null +++ b/public/tag_getting_started.html @@ -0,0 +1,607 @@ + + + + + + + + +Getting started pages | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Getting started pages

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    The following pages and posts are tagged with

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TitleTypeExcerpt
    Merlin7 in preproductionPost More pages will be coming soon.
    Merlin 6 documentation availablePost More pages will be coming soon.
    + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/tag_mobile.html b/public/tag_mobile.html new file mode 100644 index 0000000..a0f1496 --- /dev/null +++ b/public/tag_mobile.html @@ -0,0 +1,595 @@ + + + + + + + + +Mobile Pages | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Mobile Pages

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    The following pages and posts are tagged with

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TitleTypeExcerpt
    + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/tag_navigation.html b/public/tag_navigation.html new file mode 100644 index 0000000..76cb355 --- /dev/null +++ b/public/tag_navigation.html @@ -0,0 +1,595 @@ + + + + + + + + +Navigation pages | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Navigation pages

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    The following pages and posts are tagged with

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TitleTypeExcerpt
    + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/tag_news.html b/public/tag_news.html new file mode 100644 index 0000000..30f5abf --- /dev/null +++ b/public/tag_news.html @@ -0,0 +1,607 @@ + + + + + + + + +News | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    News

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    The following pages and posts are tagged with

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TitleTypeExcerpt
    Merlin7 in preproductionPost More pages will be coming soon.
    Merlin 6 documentation availablePost More pages will be coming soon.
    + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/tag_publishing.html b/public/tag_publishing.html new file mode 100644 index 0000000..f37ea0f --- /dev/null +++ b/public/tag_publishing.html @@ -0,0 +1,595 @@ + + + + + + + + +Publishing pages | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Publishing pages

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    The following pages and posts are tagged with

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TitleTypeExcerpt
    + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/tag_single_sourcing.html b/public/tag_single_sourcing.html new file mode 100644 index 0000000..6669c33 --- /dev/null +++ b/public/tag_single_sourcing.html @@ -0,0 +1,595 @@ + + + + + + + + +Single sourcing pages | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Single sourcing pages

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    The following pages and posts are tagged with

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TitleTypeExcerpt
    + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/tag_special_layouts.html b/public/tag_special_layouts.html new file mode 100644 index 0000000..b913ef0 --- /dev/null +++ b/public/tag_special_layouts.html @@ -0,0 +1,595 @@ + + + + + + + + +Special layout pages | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Special layout pages

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    The following pages and posts are tagged with

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TitleTypeExcerpt
    + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/tag_troubleshooting.html b/public/tag_troubleshooting.html new file mode 100644 index 0000000..7d36ac4 --- /dev/null +++ b/public/tag_troubleshooting.html @@ -0,0 +1,595 @@ + + + + + + + + +Troubleshooting pages | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Troubleshooting pages

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    The following pages and posts are tagged with

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TitleTypeExcerpt
    + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/titlepage.html/index.html b/public/titlepage.html/index.html new file mode 100644 index 0000000..60872fd --- /dev/null +++ b/public/titlepage.html/index.html @@ -0,0 +1,392 @@ + + + + + + + + + | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    +
    + + + +
    + + + + + + + + +
    + + + + + + +
    +
    +
    +
    Last generated: June 18, 2025
    +
    + +
    + PSI Logo +
    + +
    +

    © 2025 Paul Scherrer Institute, CSD/HPC and Emerging Technologies Group. This is a boilerplate copyright statement... All rights reserved. No part of this publication may be reproduced, distributed, or transmitted in any form or by any means, including photocopying, recording, or other electronic or mechanical methods, without the prior written permission of the publisher, except in the case of brief quotations embodied in critical reviews and certain other noncommercial uses permitted by copyright law. +

    + +
    + +
    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/tocpage.html/index.html b/public/tocpage.html/index.html new file mode 100644 index 0000000..4882c80 --- /dev/null +++ b/public/tocpage.html/index.html @@ -0,0 +1,385 @@ + + + + + + + + + | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    +
    + + + +
    + + + + + + + + +
    + + + + + + + + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/public/tooltips.html b/public/tooltips.html new file mode 100644 index 0000000..127052e --- /dev/null +++ b/public/tooltips.html @@ -0,0 +1,74 @@ + + + Tooltip Demo + + + + + + + + + + + +

    Tooltip Demo

    + +

    This page is purposely separated out from the rest of theme so you can see the bare minimum code to add to a page, without all the other theme's code getting in the way.

    + +

    Content in the tooltips (actually "popovers" according to Bootstrap lingo) can be pulled in dynamically by placing the JSON file on a remote host.

    + + + + + +

    Basketball

    + +

    Baseball

    + +

    Football

    + +

    Soccer

    diff --git a/public/tooltips.json b/public/tooltips.json new file mode 100644 index 0000000..73773c9 --- /dev/null +++ b/public/tooltips.json @@ -0,0 +1,29 @@ +{ +"entries": +[ + +{ +"doc_id": "baseball", +"body": "Baseball is considered America's pasttime sport, though that may be more of a historical term than a current one. There's a lot more excitement about football than baseball. A baseball game is somewhat of a snooze to watch, for the most part." +} , + +{ +"doc_id": "basketball", +"body": "Basketball is a sport involving two teams of five players each competing to put a ball through a small circular rim 10 feet above the ground. Basketball requires players to be in top physical condition, since they spend most of the game running back and forth along a 94-foot-long floor." +} , + +{ +"doc_id": "football", +"body": "No doubt the most fun sport to watch, football also manages to accrue the most injuries with the players. From concussions to blown knees, football players have short sport lives." +} , + +{ +"doc_id": "soccer", +"body": "If there's one sport that dominates the world landscape, it's soccer. However, US soccer fans are few and far between. Apart from the popularity of soccer during the World Cup, most people don't even know the name of the professional soccer organization in their area." +} + +] +} + + + diff --git a/public/var/build.sh b/public/var/build.sh new file mode 100644 index 0000000..137b92c --- /dev/null +++ b/public/var/build.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +apt-get update && \ +apt-get install -y libfontconfig zip npm git apt-transport-https ca-certificates curl openssl && \ +npm i -g npm && \ +npm cache clean -f && \ +npm install -g n && \ +n stable && \ +node --version && \ +npm --version && \ +bundle install \ No newline at end of file diff --git a/redirects.json b/redirects.json new file mode 100644 index 0000000..a5ebfb2 --- /dev/null +++ b/redirects.json @@ -0,0 +1 @@ +{"/merlin6":"https://hpce.pages.psi.ch/merlin6/introduction.html","/merlin6/index.html":"https://hpce.pages.psi.ch/merlin6/introduction.html","/merlin7":"https://hpce.pages.psi.ch/merlin7/introduction.html","/merlin7/index.html":"https://hpce.pages.psi.ch/merlin7/introduction.html","/merlin7/data-directories.html":"https://hpce.pages.psi.ch/merlin7/storage.html","/merlin6/data-directories.html":"https://hpce.pages.psi.ch/merlin6/storage.html"} \ No newline at end of file diff --git a/search.json b/search.json new file mode 100644 index 0000000..b5d5f4a --- /dev/null +++ b/search.json @@ -0,0 +1,1188 @@ +[ + + + + +{ +"title": "Accessing Interactive Nodes", +"tags": "", +"keywords": "How to, HowTo, access, accessing, nomachine, ssh", +"url": "/merlin7/interactive.html", +"summary": "" +} +, + + + +{ +"title": "Accessing Interactive Nodes", +"tags": "", +"keywords": "How to, HowTo, access, accessing, nomachine, ssh", +"url": "/merlin6/interactive.html", +"summary": "" +} +, + + + +{ +"title": "Accessing Slurm Cluster", +"tags": "", +"keywords": "slurm, batch system, merlin5, merlin7, gmerlin7, cpu, gpu", +"url": "/merlin7/slurm-access.html", +"summary": "" +} +, + + + +{ +"title": "Accessing Slurm Cluster", +"tags": "", +"keywords": "slurm, batch system, merlin5, merlin6, gmerlin6, cpu, gpu", +"url": "/merlin6/slurm-access.html", +"summary": "" +} +, + + + +{ +"title": "ANSYS / CFX", +"tags": "", +"keywords": "software, ansys, cfx5, cfx, slurm, interactive, rsm, batch job", +"url": "/merlin6/ansys-cfx.html", +"summary": "This document describes how to run ANSYS/CFX in the Merlin6 cluster" +} +, + + + +{ +"title": "ANSYS / Fluent", +"tags": "", +"keywords": "software, ansys, fluent, slurm, interactive, rsm, batch job", +"url": "/merlin6/ansys-fluent.html", +"summary": "This document describes how to run ANSYS/Fluent in the Merlin6 cluster" +} +, + + + +{ +"title": "ANSYS HFSS / ElectroMagnetics", +"tags": "", +"keywords": "software, ansys, ansysEM, em, slurm, hfss, interactive, rsm, batch job", +"url": "/merlin6/ansys-hfss.html", +"summary": "This document describes how to run ANSYS HFSS (ElectroMagnetics) in the Merlin6 cluster" +} +, + + + +{ +"title": "ANSYS / MAPDL", +"tags": "", +"keywords": "software, ansys, mapdl, slurm, apdl, interactive, rsm, batch job", +"url": "/merlin6/ansys-mapdl.html", +"summary": "This document describes how to run ANSYS/Mechanical APDL in the Merlin6 cluster" +} +, + + + +{ +"title": "ANSYS RSM (Remote Resolve Manager)", +"tags": "", +"keywords": "software, ansys, rsm, slurm, interactive, rsm, windows", +"url": "/merlin7/ansys-rsm.html", +"summary": "This document describes how to use the ANSYS Remote Resolve Manager service in the Merlin7 cluster" +} +, + + + +{ +"title": "ANSYS RSM (Remote Resolve Manager)", +"tags": "", +"keywords": "software, ansys, rsm, slurm, interactive, rsm, windows", +"url": "/merlin6/ansys-rsm.html", +"summary": "This document describes how to use the ANSYS Remote Resolve Manager service in the Merlin6 cluster" +} +, + + + +{ +"title": "ANSYS", +"tags": "", +"keywords": "software, ansys, slurm, interactive, rsm, pmodules, overlay, overlays", +"url": "/merlin6/ansys.html", +"summary": "This document describes how to load and use ANSYS in the Merlin6 cluster" +} +, + + + +{ +"title": "ANSYS", +"tags": "", +"keywords": "software, ansys, slurm, interactive, rsm, pmodules, overlay, overlays", +"url": "/merlin7/ansys.html", +"summary": "This document describes how to load and use ANSYS in the Merlin7 cluster" +} +, + + + +{ +"title": "Archive & PSI Data Catalog", +"tags": "", +"keywords": "linux, archive, data catalog, archiving, lts, tape, long term storage, ingestion, datacatalog", +"url": "/merlin7/archive.html", +"summary": "This document describes how to use the PSI Data Catalog for archiving Merlin7 data." +} +, + + + +{ +"title": "Archive & PSI Data Catalog", +"tags": "", +"keywords": "linux, archive, data catalog, archiving, lts, tape, long term storage, ingestion, datacatalog", +"url": "/merlin6/archive.html", +"summary": "This document describes how to use the PSI Data Catalog for archiving Merlin6 data." +} +, + + + +{ +"title": "Introduction", +"tags": "", +"keywords": "", +"url": "/gmerlin6/cluster-introduction.html", +"summary": "" +} +, + + + +{ +"title": "Cluster 'merlin5'", +"tags": "", +"keywords": "", +"url": "/merlin5/cluster-introduction.html", +"summary": "" +} +, + + + +{ +"title": "Introduction", +"tags": "", +"keywords": "", +"url": "/merlin6/cluster-introduction.html", +"summary": "" +} +, + + + +{ +"title": "Code Of Conduct", +"tags": "", +"keywords": "code of conduct, rules, principle, policy, policies, administrator, backup", +"url": "/merlin6/code-of-conduct.html", +"summary": "" +} +, + + + +{ +"title": "Code Of Conduct", +"tags": "", +"keywords": "code of conduct, rules, principle, policy, policies, administrator, backup", +"url": "/merlin7/code-of-conduct.html", +"summary": "" +} +, + + + +{ +"title": "Connecting from a Linux Client", +"tags": "", +"keywords": "linux, connecting, client, configuration, SSH, X11", +"url": "/merlin6/connect-from-linux.html", +"summary": "This document describes a recommended setup for a Linux client." +} +, + + + +{ +"title": "Connecting from a Linux Client", +"tags": "", +"keywords": "linux, connecting, client, configuration, SSH, X11", +"url": "/merlin7/connect-from-linux.html", +"summary": "This document describes a recommended setup for a Linux client." +} +, + + + +{ +"title": "Connecting from a MacOS Client", +"tags": "", +"keywords": "MacOS, mac os, mac, connecting, client, configuration, SSH, X11", +"url": "/merlin7/connect-from-macos.html", +"summary": "This document describes a recommended setup for a MacOS client." +} +, + + + +{ +"title": "Connecting from a MacOS Client", +"tags": "", +"keywords": "MacOS, mac os, mac, connecting, client, configuration, SSH, X11", +"url": "/merlin6/connect-from-macos.html", +"summary": "This document describes a recommended setup for a MacOS client." +} +, + + + +{ +"title": "Connecting from a Windows Client", +"tags": "", +"keywords": "microsoft, mocosoft, windows, putty, xming, connecting, client, configuration, SSH, X11", +"url": "/merlin6/connect-from-windows.html", +"summary": "This document describes a recommended setup for a Windows client." +} +, + + + +{ +"title": "Connecting from a Windows Client", +"tags": "", +"keywords": "microsoft, mocosoft, windows, putty, xming, connecting, client, configuration, SSH, X11", +"url": "/merlin7/connect-from-windows.html", +"summary": "This document describes a recommended setup for a Windows client." +} +, + + + +{ +"title": "Contact", +"tags": "", +"keywords": "contact, support, snow, service now, mailing list, mailing, email, mail, merlin-admins@lists.psi.ch, merlin-users@lists.psi.ch, merlin users", +"url": "/merlin7/contact.html", +"summary": "" +} +, + + + +{ +"title": "Contact", +"tags": "", +"keywords": "contact, support, snow, service now, mailing list, mailing, email, mail, merlin-admins@lists.psi.ch, merlin-users@lists.psi.ch, merlin users", +"url": "/merlin6/contact.html", +"summary": "" +} +, + + + +{ +"title": "Cray Programming Environment", +"tags": "", +"keywords": "cray, module", +"url": "/merlin7/cray-module-env.html", +"summary": "This document describes how to use the Cray Programming Environment on Merlin7." +} +, + + + +{ +"title": "Downtimes", +"tags": "", +"keywords": "", +"url": "/merlin6/downtimes.html", +"summary": "" +} +, + + + +{ +"title": "FAQ", +"tags": "", +"keywords": "faq, frequently asked questions, support", +"url": "/merlin6/faq.html", +"summary": "" +} +, + + + + + +{ +"title": "GOTHIC", +"tags": "", +"keywords": "software, gothic, slurm, interactive, batch job", +"url": "/merlin6/gothic.html", +"summary": "This document describes how to run Gothic in the Merlin cluster" +} +, + + + +{ +"title": "GROMACS", +"tags": "", +"keywords": "GROMACS software, compile", +"url": "/merlin7/gromacs.html", +"summary": "GROMACS (GROningen Machine for Chemical Simulations) is a versatile and widely-used open source package to perform molecular dynamics" +} +, + + + +{ +"title": "Hardware And Software Description", +"tags": "", +"keywords": "", +"url": "/merlin5/hardware-and-software.html", +"summary": "" +} +, + + + +{ +"title": "Hardware And Software Description", +"tags": "", +"keywords": "", +"url": "/merlin6/hardware-and-software.html", +"summary": "" +} +, + + + +{ +"title": "Hardware And Software Description", +"tags": "", +"keywords": "", +"url": "/gmerlin6/hardware-and-software.html", +"summary": "" +} +, + + + +{ +"title": "Intel MPI Support", +"tags": "", +"keywords": "software, impi, slurm", +"url": "/merlin6/impi.html", +"summary": "This document describes how to use Intel MPI in the Merlin6 cluster" +} +, + + + +{ +"title": "", +"tags": "", +"keywords": "sample homepage", +"url": "/index.html", +"summary": "" +} +, + + + +{ +"title": "PSI HPC@CSCS", +"tags": "", +"keywords": "", +"url": "/CSCS/index.html", +"summary": "" +} +, + + + +{ +"title": "Running Interactive Jobs", +"tags": "", +"keywords": "interactive, X11, X, srun, salloc, job, jobs, slurm, nomachine, nx", +"url": "/merlin6/interactive-jobs.html", +"summary": "This document describes how to run interactive jobs as well as X based software." +} +, + + + +{ +"title": "Running Interactive Jobs", +"tags": "", +"keywords": "interactive, X11, X, srun, salloc, job, jobs, slurm, nomachine, nx", +"url": "/merlin7/interactive-jobs.html", +"summary": "This document describes how to run interactive jobs as well as X based software." +} +, + + + +{ +"title": "Introduction", +"tags": "", +"keywords": "introduction, home, welcome, architecture, design", +"url": "/merlin6/introduction.html", +"summary": "" +} +, + + + +{ +"title": "Introduction", +"tags": "", +"keywords": "introduction, home, welcome, architecture, design", +"url": "/merlin7/introduction.html", +"summary": "" +} +, + + + +{ +"title": "IPPL", +"tags": "", +"keywords": "IPPL software, compile", +"url": "/merlin7/ippl.html", +"summary": "Independent Parallel Particle Layer (IPPL) is a performance portable C++ library for Particle-Mesh methods" +} +, + + + +{ +"title": "Jupyter examples on merlin6", +"tags": "", +"keywords": "", +"url": "/merlin6/jupyter-examples.html", +"summary": "" +} +, + + + +{ +"title": "Jupyter Extensions", +"tags": "", +"keywords": "", +"url": "/merlin6/jupyter-extensions.html", +"summary": "" +} +, + + + +{ +"title": "Jupyterhub Troubleshooting", +"tags": "", +"keywords": "", +"url": "/merlin6/jupyterhub-trouble.html", +"summary": "" +} +, + + + +{ +"title": "Jupyterhub on Merlin", +"tags": "", +"keywords": "", +"url": "/merlin6/jupyterhub.html", +"summary": "" +} +, + + + +{ +"title": "Jupyterlab User interface", +"tags": "", +"keywords": "", +"url": "/merlin6/jupyterlab.html", +"summary": "" +} +, + + + +{ +"title": "Jupytext - efficient editing", +"tags": "", +"keywords": "", +"url": "/merlin6/jupytext.html", +"summary": "" +} +, + + + +{ +"title": "Kerberos and AFS authentication", +"tags": "", +"keywords": "kerberos, AFS, kinit, klist, keytab, tickets, connecting, client, configuration, slurm", +"url": "/merlin6/kerberos.html", +"summary": "This document describes how to use Kerberos." +} +, + + + +{ +"title": "Kerberos and AFS authentication", +"tags": "", +"keywords": "kerberos, AFS, kinit, klist, keytab, tickets, connecting, client, configuration, slurm", +"url": "/merlin7/kerberos.html", +"summary": "This document describes how to use Kerberos." +} +, + + + +{ +"title": "Known Problems", +"tags": "", +"keywords": "known problems, troubleshooting, illegal instructions, paraview, ansys, shell, opengl, mesa, vglrun, module: command not found, error", +"url": "/merlin6/known-problems.html", +"summary": "" +} +, + + + +{ +"title": "Using merlin_rmount", +"tags": "", +"keywords": "transferring data, data transfer, rsync, dav, webdav, sftp, ftp, smb, cifs, copy data, copying, mount, file, folder, sharing", +"url": "/merlin7/merlin-rmount.html", +"summary": "" +} +, + + + +{ +"title": "Using merlin_rmount", +"tags": "", +"keywords": "transferring data, data transfer, rsync, dav, webdav, sftp, ftp, smb, cifs, copy data, copying, mount, file, folder, sharing", +"url": "/merlin6/merlin-rmount.html", +"summary": "" +} +, + + + +{ +"title": "Slurm cluster 'merlin7'", +"tags": "", +"keywords": "configuration, partitions, node definition", +"url": "/merlin7/merlin7-configuration.html", +"summary": "This document describes a summary of the Merlin7 configuration." +} +, + + + +{ +"title": "Merlin7 Tools", +"tags": "", +"keywords": "merlin_quotas", +"url": "/merlin7/tools.html", +"summary": "" +} +, + + + +{ +"title": "Migration From Merlin5", +"tags": "", +"keywords": "merlin5, merlin6, migration, rsync, archive, archiving, lts, long-term storage", +"url": "/merlin6/migrating.html", +"summary": "" +} +, + + + +{ +"title": "", +"tags": "", +"keywords": "merlin6, merlin7, migration, fpsync, rsync", +"url": "/merlin7/migrating.html", +"summary": "" +} +, + + + +{ +"title": "Monitoring", +"tags": "", +"keywords": "monitoring, jobs, slurm, job status, squeue, sinfo, sacct", +"url": "/merlin6/monitoring.html", +"summary": "" +} +, + + + +{ +"title": "News", +"tags": "", +"keywords": "news, blog, updates, release notes, announcements", +"url": "/news.html", +"summary": "" +} +, + + + +{ +"title": "News", +"tags": "", +"keywords": "news, blog, updates, release notes, announcements", +"url": "/news_archive.html", +"summary": "" +} +, + + + +{ +"title": "Remote Desktop Access", +"tags": "", +"keywords": "NX, nomachine, remote desktop access, login node, merlin-l-001, merlin-l-002, merlin-nx-01, merlin-nx-02, merlin-nx, rem-acc, vpn", +"url": "/merlin6/nomachine.html", +"summary": "" +} +, + + + +{ +"title": "Remote Desktop Access to Merlin7", +"tags": "", +"keywords": "NX, NoMachine, remote desktop access, login node, login001, login002, merlin7-nx-01, merlin7-nx, nx.psi.ch, VPN, browser access", +"url": "/merlin7/nomachine.html", +"summary": "" +} +, + + + +{ +"title": "OPAL-X", +"tags": "", +"keywords": "OPAL-X software, compile", +"url": "/merlin7/opal-x.html", +"summary": "OPAL (Object Oriented Particle Accelerator Library) is an open source C++ framework for general particle accelerator simulations including 3D space charge, short range wake fields and particle matter interaction." +} +, + + + +{ +"title": "OpenMPI Support", +"tags": "", +"keywords": "software, openmpi, slurm", +"url": "/merlin6/openmpi.html", +"summary": "This document describes how to use OpenMPI in the Merlin6 cluster" +} +, + + + +{ +"title": "OpenMPI Support", +"tags": "", +"keywords": "software, openmpi, slurm", +"url": "/merlin7/openmpi.html", +"summary": "This document describes how to use OpenMPI in the Merlin7 cluster" +} +, + + + +{ +"title": "Running Paraview", +"tags": "", +"keywords": "software, paraview, mesa, OpenGL, interactive", +"url": "/merlin6/paraview.html", +"summary": "This document describes how to run ParaView in the Merlin6 cluster" +} +, + + + +{ +"title": "Past Downtimes", +"tags": "", +"keywords": "", +"url": "/merlin6/past-downtimes.html", +"summary": "" +} +, + + + +{ +"title": "PSI Modules", +"tags": "", +"keywords": "Pmodules, software, stable, unstable, deprecated, overlay, overlays, release stage, module, package, packages, library, libraries", +"url": "/merlin7/pmodules.html", +"summary": "" +} +, + + + + + +{ +"title": "Python", +"tags": "", +"keywords": "pythonanacondacondajupyternumpy", +"url": "/merlin6/python.html", +"summary": "Running Python on Merlin" +} +, + + + +{ +"title": "Quantum Espresso", +"tags": "", +"keywords": "Quantum Espresso software, compile", +"url": "/merlin7/quantum-espresso.html", +"summary": "Quantum Espresso code for electronic-structure calculations and materials modeling at the nanoscale" +} +, + + + +{ +"title": "Requesting Merlin Accounts", +"tags": "", +"keywords": "registration, register, account, merlin5, merlin6, snow, service now", +"url": "/merlin6/request-account.html", +"summary": "" +} +, + + + +{ +"title": "Requesting Merlin Accounts", +"tags": "", +"keywords": "registration, register, account, merlin5, merlin7, snow, service now", +"url": "/merlin7/request-account.html", +"summary": "" +} +, + + + +{ +"title": "Requesting a Merlin Project", +"tags": "", +"keywords": "merlin project, project, snow, service now", +"url": "/merlin7/request-project.html", +"summary": "" +} +, + + + +{ +"title": "Requesting a Merlin Project", +"tags": "", +"keywords": "merlin project, project, snow, service now", +"url": "/merlin6/request-project.html", +"summary": "" +} +, + + + +{ +"title": "Running Slurm Scripts", +"tags": "", +"keywords": "batch script, slurm, sbatch, srun, jobs, job, submit, submission, array jobs, array, squeue, sinfo, scancel, packed jobs, short jobs, very short jobs, multithread, rules, no-multithread, HT", +"url": "/merlin6/running-jobs.html", +"summary": "This document describes how to run batch scripts in Slurm." +} +, + + + + + +{ +"title": "Testing Jekyll environment", +"tags": "", +"keywords": "", +"url": "/siteinfo.html", +"summary": "" +} +, + + + + + +{ +"title": "Slurm Basic Commands", +"tags": "", +"keywords": "sinfo, squeue, sbatch, srun, salloc, scancel, sview, seff, sjstat, sacct, basic commands, slurm commands, cluster", +"url": "/merlin6/slurm-basics.html", +"summary": "" +} +, + + + +{ +"title": "Slurm Configuration", +"tags": "", +"keywords": "configuration, partitions, node definition", +"url": "/merlin5/slurm-configuration.html", +"summary": "This document describes a summary of the Merlin5 Slurm configuration." +} +, + + + +{ +"title": "Slurm Configuration", +"tags": "", +"keywords": "configuration, partitions, node definition", +"url": "/merlin6/slurm-configuration.html", +"summary": "This document describes a summary of the Merlin6 configuration." +} +, + + + +{ +"title": "Slurm merlin7 Configuration", +"tags": "", +"keywords": "configuration, partitions, node definition", +"url": "/merlin7/slurm-configuration.html", +"summary": "This document describes a summary of the Merlin7 Slurm CPU-based configuration." +} +, + + + +{ +"title": "Slurm cluster 'gmerlin6'", +"tags": "", +"keywords": "configuration, partitions, node definition, gmerlin6", +"url": "/gmerlin6/slurm-configuration.html", +"summary": "This document describes a summary of the Slurm 'configuration." +} +, + + + +{ +"title": "Slurm Examples", +"tags": "", +"keywords": "slurm example, template, examples, templates, running jobs, sbatch, single core based jobs, HT, multithread, no-multithread, mpi, openmp, packed jobs, hands-on, array jobs, gpu", +"url": "/merlin6/slurm-examples.html", +"summary": "This document shows different template examples for running jobs in the Merlin cluster." +} +, + + + +{ +"title": "Slurm Examples", +"tags": "", +"keywords": "slurm example, template, examples, templates, running jobs, sbatch, single core based jobs, HT, multithread, no-multithread, mpi, openmp, packed jobs, hands-on, array jobs, gpu", +"url": "/merlin7/slurm-examples.html", +"summary": "This document shows different template examples for running jobs in the Merlin cluster." +} +, + + + +{ +"title": "Software repositories", +"tags": "", +"keywords": "modules, software, stable, unstable, deprecated, spack, repository, repositories", +"url": "/merlin7/software-repositories.html", +"summary": "This page contains information about the different software repositories" +} +, + + + +{ +"title": "Spack", +"tags": "", +"keywords": "spack, python, software, compile", +"url": "/merlin7/spack.html", +"summary": "Spack the HPC package manager documentation" +} +, + + + +{ +"title": "Configuring SSH Keys in Merlin", +"tags": "", +"keywords": "linux, connecting, client, configuration, SSH, Keys, SSH-Keys, RSA, authorization, authentication", +"url": "/merlin6/ssh-keys.html", +"summary": "This document describes how to deploy SSH Keys in Merlin." +} +, + + + +{ +"title": "Configuring SSH Keys in Merlin", +"tags": "", +"keywords": "linux, connecting, client, configuration, SSH, Keys, SSH-Keys, RSA, authorization, authentication", +"url": "/merlin7/ssh-keys.html", +"summary": "This document describes how to deploy SSH Keys in Merlin." +} +, + + + +{ +"title": "Merlin7 Storage", +"tags": "", +"keywords": "storage, /data/user, /data/software, /data/project, /scratch, /data/scratch/shared, quota, export, user, project, scratch, data, data/scratch/shared, merlin_quotas", +"url": "/merlin7/storage.html", +"summary": "" +} +, + + + +{ +"title": "Merlin6 Storage", +"tags": "", +"keywords": "storage, /data/user, /data/software, /data/project, /scratch, /shared-scratch, quota, export, user, project, scratch, data, shared-scratch, merlin_quotas", +"url": "/merlin6/storage.html", +"summary": "" +} +, + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +{ +"title": "Transferring Data", +"tags": "", +"keywords": "transferring data, data transfer, rsync, winscp, copy data, copying, sftp, import, export, hopx, vpn", +"url": "/merlin6/transfer-data.html", +"summary": "" +} +, + + + +{ +"title": "Transferring Data betweem PSI and CSCS", +"tags": "", +"keywords": "CSCS, data-transfer", +"url": "/CSCS/transfer-data.html", +"summary": "This Document shows the procedure for transferring data between CSCS and PSI" +} +, + + + +{ +"title": "Transferring Data", +"tags": "", +"keywords": "transferring data, data transfer, rsync, winscp, copy data, copying, sftp, import, export, hop, vpn", +"url": "/merlin7/transfer-data.html", +"summary": "" +} +, + + + +{ +"title": "Troubleshooting", +"tags": "", +"keywords": "troubleshooting, problems, faq, known problems", +"url": "/merlin6/troubleshooting.html", +"summary": "" +} +, + + + +{ +"title": "Using PModules", +"tags": "", +"keywords": "Pmodules, software, stable, unstable, deprecated, overlay, overlays, release stage, module, package, packages, library, libraries", +"url": "/merlin6/using-modules.html", +"summary": "" +} +, + + + +{ +"title": "", +"tags": "", +"keywords": "", +"url": "/merlin6", +"summary": "" +} +, + + + +{ +"title": "", +"tags": "", +"keywords": "", +"url": "/merlin6/index.html", +"summary": "" +} +, + + + +{ +"title": "", +"tags": "", +"keywords": "", +"url": "/merlin7", +"summary": "" +} +, + + + +{ +"title": "", +"tags": "", +"keywords": "", +"url": "/merlin7/index.html", +"summary": "" +} +, + + + +{ +"title": "", +"tags": "", +"keywords": "", +"url": "/merlin7/data-directories.html", +"summary": "" +} +, + + + +{ +"title": "", +"tags": "", +"keywords": "", +"url": "/merlin6/data-directories.html", +"summary": "" +} +, + + + +{ +"title": "", +"tags": "", +"keywords": "", +"url": "/redirects.json", +"summary": "" +} +, + + + + + +{ +"title": "Merlin7 in preproduction", +"tags": "newsgetting_started", +"keywords": "", +"url": "20240807merlin7-preprod-docs.html", +"summary": "More pages will be coming soon." +} +, + + +{ +"title": "Merlin 6 documentation available", +"tags": "newsgetting_started", +"keywords": "", +"url": "20190612launching-merlin6-docs.html", +"summary": "More pages will be coming soon." +} + + + +] diff --git a/siteinfo.html b/siteinfo.html new file mode 100644 index 0000000..2d66961 --- /dev/null +++ b/siteinfo.html @@ -0,0 +1,492 @@ + + + + + + + + +Testing Jekyll environment | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Testing Jekyll environment

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    Site

    + +

    Some information about this jekyll site (for debugging):

    + +
      +
    • site.port: 4001
    • +
    • site.host: 127.0.0.1
    • +
    • site.url: https://hpce.pages.psi.ch
    • +
    • site.baseurl: /
    • +
    + + + +

    Link processing in Jekyll

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    CodeResultBaseurl
    [Normal link to source](/pages/merlin6/01-Quick-Start-Guide/introduction.md)Normal link to source
    [Normal link to result](/merlin6/introduction.html)Normal link to result
    [Invalid Escaped link to source]({{"/pages/merlin6/01-Quick-Start-Guide/introduction.md"}})Invalid Escaped link to source❌❗
    [Escaped link to result]({{"/merlin6/introduction.html"}})Escaped link to result
    [Reference link to source](srcRef)Reference link to source
    [Reference link to result](dstRef)Reference link to result
    [Liquid Link]({% link pages/merlin6/01-Quick-Start-Guide/introduction.md %})Liquid Link
    ![PSI Logo](/images/psi-logo.png)PSI Logo
    ![Escaped PSI Logo]({{ "/images/psi-logo.png" }})PSI Logo from liquid
    {% include inline_image.html file="psi-logo.png" alt="Included PSI Logo" %}Included PSI Logo 
      
    {{ "/pages/merlin6/01-Quick-Start-Guide/introduction.md" | relative_url }}/pages/merlin6/01-Quick-Start-Guide/introduction.md✅❗
    {{ "/merlin6/introduction.html" | relative_url }}/merlin6/introduction.html
    {% link pages/merlin6/01-Quick-Start-Guide/introduction.md %}/merlin6/introduction.html
    + +

    Key:

    +
      +
    • ✅ Baseurl gets prepended to the URL
    • +
    • ❌ No baseurl in URL
    • +
    • ❗ Source not expected to be converted to the result URL
    • +
    + +

    Conclusions:

    + +
      +
    • Markdown links that refer to source files are replaced by the +baseurl + permalink
    • +
    • This happens for both normal links and images
    • +
    • Workarounds +
        +
      • Link to permalink directly (for pages/posts)
      • +
      • Can use {{"path"}} pattern to disable expansion
      • +
      +
    • +
    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 0000000..de00734 --- /dev/null +++ b/sitemap.xml @@ -0,0 +1,671 @@ + + + + + + https://hpce.pages.psi.ch/2024/08/07/merlin7-preprod-docs.html + + + + + + https://hpce.pages.psi.ch/2019/06/12/launching-merlin6-docs.html + + + + + + + + + + + https://hpce.pages.psi.ch/merlin7/interactive.html + + + + + + https://hpce.pages.psi.ch/merlin6/interactive.html + + + + + + https://hpce.pages.psi.ch/merlin7/slurm-access.html + + + + + + https://hpce.pages.psi.ch/merlin6/slurm-access.html + + + + + + https://hpce.pages.psi.ch/merlin6/ansys-cfx.html + + + + + + https://hpce.pages.psi.ch/merlin6/ansys-fluent.html + + + + + + https://hpce.pages.psi.ch/merlin6/ansys-hfss.html + + + + + + https://hpce.pages.psi.ch/merlin6/ansys-mapdl.html + + + + + + https://hpce.pages.psi.ch/merlin7/ansys-rsm.html + + + + + + https://hpce.pages.psi.ch/merlin6/ansys-rsm.html + + + + + + https://hpce.pages.psi.ch/merlin6/ansys.html + + + + + + https://hpce.pages.psi.ch/merlin7/ansys.html + + + + + + https://hpce.pages.psi.ch/merlin7/archive.html + + + + + + https://hpce.pages.psi.ch/merlin6/archive.html + + + + + + https://hpce.pages.psi.ch/gmerlin6/cluster-introduction.html + + + + + + https://hpce.pages.psi.ch/merlin5/cluster-introduction.html + + + + + + https://hpce.pages.psi.ch/merlin6/cluster-introduction.html + + + + + + https://hpce.pages.psi.ch/merlin6/code-of-conduct.html + + + + + + https://hpce.pages.psi.ch/merlin7/code-of-conduct.html + + + + + + https://hpce.pages.psi.ch/merlin6/connect-from-linux.html + + + + + + https://hpce.pages.psi.ch/merlin7/connect-from-linux.html + + + + + + https://hpce.pages.psi.ch/merlin7/connect-from-macos.html + + + + + + https://hpce.pages.psi.ch/merlin6/connect-from-macos.html + + + + + + https://hpce.pages.psi.ch/merlin6/connect-from-windows.html + + + + + + https://hpce.pages.psi.ch/merlin7/connect-from-windows.html + + + + + + https://hpce.pages.psi.ch/merlin7/contact.html + + + + + + https://hpce.pages.psi.ch/merlin6/contact.html + + + + + + https://hpce.pages.psi.ch/merlin7/cray-module-env.html + + + + + + https://hpce.pages.psi.ch/merlin6/downtimes.html + + + + + + https://hpce.pages.psi.ch/merlin6/faq.html + + + + + + + + https://hpce.pages.psi.ch/merlin6/gothic.html + + + + + + https://hpce.pages.psi.ch/merlin7/gromacs.html + + + + + + https://hpce.pages.psi.ch/merlin5/hardware-and-software.html + + + + + + https://hpce.pages.psi.ch/merlin6/hardware-and-software.html + + + + + + https://hpce.pages.psi.ch/gmerlin6/hardware-and-software.html + + + + + + https://hpce.pages.psi.ch/merlin6/impi.html + + + + + + https://hpce.pages.psi.ch/index.html + + + + + + https://hpce.pages.psi.ch/CSCS/index.html + + + + + + https://hpce.pages.psi.ch/merlin6/interactive-jobs.html + + + + + + https://hpce.pages.psi.ch/merlin7/interactive-jobs.html + + + + + + https://hpce.pages.psi.ch/merlin6/introduction.html + + + + + + https://hpce.pages.psi.ch/merlin7/introduction.html + + + + + + https://hpce.pages.psi.ch/merlin7/ippl.html + + + + + + https://hpce.pages.psi.ch/merlin6/jupyter-examples.html + + + + + + https://hpce.pages.psi.ch/merlin6/jupyter-extensions.html + + + + + + https://hpce.pages.psi.ch/merlin6/jupyterhub-trouble.html + + + + + + https://hpce.pages.psi.ch/merlin6/jupyterhub.html + + + + + + https://hpce.pages.psi.ch/merlin6/jupyterlab.html + + + + + + https://hpce.pages.psi.ch/merlin6/jupytext.html + + + + + + https://hpce.pages.psi.ch/merlin6/kerberos.html + + + + + + https://hpce.pages.psi.ch/merlin7/kerberos.html + + + + + + https://hpce.pages.psi.ch/merlin6/known-problems.html + + + + + + https://hpce.pages.psi.ch/merlin7/merlin-rmount.html + + + + + + https://hpce.pages.psi.ch/merlin6/merlin-rmount.html + + + + + + https://hpce.pages.psi.ch/merlin7/merlin7-configuration.html + + + + + + https://hpce.pages.psi.ch/merlin7/tools.html + + + + + + https://hpce.pages.psi.ch/merlin6/migrating.html + + + + + + https://hpce.pages.psi.ch/merlin7/migrating.html + + + + + + https://hpce.pages.psi.ch/merlin6/monitoring.html + + + + + + https://hpce.pages.psi.ch/news.html + + + + + + https://hpce.pages.psi.ch/news_archive.html + + + + + + https://hpce.pages.psi.ch/merlin6/nomachine.html + + + + + + https://hpce.pages.psi.ch/merlin7/nomachine.html + + + + + + https://hpce.pages.psi.ch/merlin7/opal-x.html + + + + + + https://hpce.pages.psi.ch/merlin6/openmpi.html + + + + + + https://hpce.pages.psi.ch/merlin7/openmpi.html + + + + + + https://hpce.pages.psi.ch/merlin6/paraview.html + + + + + + https://hpce.pages.psi.ch/merlin6/past-downtimes.html + + + + + + https://hpce.pages.psi.ch/merlin7/pmodules.html + + + + + + + + https://hpce.pages.psi.ch/merlin6/python.html + + + + + + https://hpce.pages.psi.ch/merlin7/quantum-espresso.html + + + + + + https://hpce.pages.psi.ch/merlin6/request-account.html + + + + + + https://hpce.pages.psi.ch/merlin7/request-account.html + + + + + + https://hpce.pages.psi.ch/merlin7/request-project.html + + + + + + https://hpce.pages.psi.ch/merlin6/request-project.html + + + + + + https://hpce.pages.psi.ch/merlin6/running-jobs.html + + + + + + + + https://hpce.pages.psi.ch/siteinfo.html + + + + + + + + https://hpce.pages.psi.ch/merlin6/slurm-basics.html + + + + + + https://hpce.pages.psi.ch/merlin5/slurm-configuration.html + + + + + + https://hpce.pages.psi.ch/merlin6/slurm-configuration.html + + + + + + https://hpce.pages.psi.ch/merlin7/slurm-configuration.html + + + + + + https://hpce.pages.psi.ch/gmerlin6/slurm-configuration.html + + + + + + https://hpce.pages.psi.ch/merlin6/slurm-examples.html + + + + + + https://hpce.pages.psi.ch/merlin7/slurm-examples.html + + + + + + https://hpce.pages.psi.ch/merlin7/software-repositories.html + + + + + + https://hpce.pages.psi.ch/merlin7/spack.html + + + + + + https://hpce.pages.psi.ch/merlin6/ssh-keys.html + + + + + + https://hpce.pages.psi.ch/merlin7/ssh-keys.html + + + + + + https://hpce.pages.psi.ch/merlin7/storage.html + + + + + + https://hpce.pages.psi.ch/merlin6/storage.html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + https://hpce.pages.psi.ch/merlin6/transfer-data.html + + + + + + https://hpce.pages.psi.ch/CSCS/transfer-data.html + + + + + + https://hpce.pages.psi.ch/merlin7/transfer-data.html + + + + + + https://hpce.pages.psi.ch/merlin6/troubleshooting.html + + + + + + https://hpce.pages.psi.ch/merlin6/using-modules.html + + + + + + https://hpce.pages.psi.ch/merlin6 + + + + + + https://hpce.pages.psi.ch/merlin6/index.html + + + + + + https://hpce.pages.psi.ch/merlin7 + + + + + + https://hpce.pages.psi.ch/merlin7/index.html + + + + + + https://hpce.pages.psi.ch/merlin7/data-directories.html + + + + + + https://hpce.pages.psi.ch/merlin6/data-directories.html + + + + + + https://hpce.pages.psi.ch/redirects.json + + + + \ No newline at end of file diff --git a/tag_collaboration.html b/tag_collaboration.html new file mode 100644 index 0000000..16f4d42 --- /dev/null +++ b/tag_collaboration.html @@ -0,0 +1,595 @@ + + + + + + + + +Collaboration pages | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Collaboration pages

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    The following pages and posts are tagged with

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TitleTypeExcerpt
    + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/tag_content_types.html b/tag_content_types.html new file mode 100644 index 0000000..c23f316 --- /dev/null +++ b/tag_content_types.html @@ -0,0 +1,595 @@ + + + + + + + + +Content types pages | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Content types pages

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    The following pages and posts are tagged with

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TitleTypeExcerpt
    + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/tag_formatting.html b/tag_formatting.html new file mode 100644 index 0000000..c2ff916 --- /dev/null +++ b/tag_formatting.html @@ -0,0 +1,595 @@ + + + + + + + + +Formatting pages | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Formatting pages

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    The following pages and posts are tagged with

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TitleTypeExcerpt
    + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/tag_getting_started.html b/tag_getting_started.html new file mode 100644 index 0000000..138dd5e --- /dev/null +++ b/tag_getting_started.html @@ -0,0 +1,607 @@ + + + + + + + + +Getting started pages | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Getting started pages

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    The following pages and posts are tagged with

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TitleTypeExcerpt
    Merlin7 in preproductionPost More pages will be coming soon.
    Merlin 6 documentation availablePost More pages will be coming soon.
    + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/tag_mobile.html b/tag_mobile.html new file mode 100644 index 0000000..a0f1496 --- /dev/null +++ b/tag_mobile.html @@ -0,0 +1,595 @@ + + + + + + + + +Mobile Pages | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Mobile Pages

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    The following pages and posts are tagged with

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TitleTypeExcerpt
    + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/tag_navigation.html b/tag_navigation.html new file mode 100644 index 0000000..76cb355 --- /dev/null +++ b/tag_navigation.html @@ -0,0 +1,595 @@ + + + + + + + + +Navigation pages | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Navigation pages

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    The following pages and posts are tagged with

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TitleTypeExcerpt
    + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/tag_news.html b/tag_news.html new file mode 100644 index 0000000..30f5abf --- /dev/null +++ b/tag_news.html @@ -0,0 +1,607 @@ + + + + + + + + +News | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    News

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    The following pages and posts are tagged with

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TitleTypeExcerpt
    Merlin7 in preproductionPost More pages will be coming soon.
    Merlin 6 documentation availablePost More pages will be coming soon.
    + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/tag_publishing.html b/tag_publishing.html new file mode 100644 index 0000000..f37ea0f --- /dev/null +++ b/tag_publishing.html @@ -0,0 +1,595 @@ + + + + + + + + +Publishing pages | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Publishing pages

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    The following pages and posts are tagged with

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TitleTypeExcerpt
    + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/tag_single_sourcing.html b/tag_single_sourcing.html new file mode 100644 index 0000000..6669c33 --- /dev/null +++ b/tag_single_sourcing.html @@ -0,0 +1,595 @@ + + + + + + + + +Single sourcing pages | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Single sourcing pages

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    The following pages and posts are tagged with

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TitleTypeExcerpt
    + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/tag_special_layouts.html b/tag_special_layouts.html new file mode 100644 index 0000000..b913ef0 --- /dev/null +++ b/tag_special_layouts.html @@ -0,0 +1,595 @@ + + + + + + + + +Special layout pages | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Special layout pages

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    The following pages and posts are tagged with

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TitleTypeExcerpt
    + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/tag_troubleshooting.html b/tag_troubleshooting.html new file mode 100644 index 0000000..7d36ac4 --- /dev/null +++ b/tag_troubleshooting.html @@ -0,0 +1,595 @@ + + + + + + + + +Troubleshooting pages | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    Troubleshooting pages

    +
    + + + +
    + + + + + + + + +
    + + + + + + +

    The following pages and posts are tagged with

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TitleTypeExcerpt
    + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/titlepage.html/index.html b/titlepage.html/index.html new file mode 100644 index 0000000..60872fd --- /dev/null +++ b/titlepage.html/index.html @@ -0,0 +1,392 @@ + + + + + + + + + | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    +
    + + + +
    + + + + + + + + +
    + + + + + + +
    +
    +
    +
    Last generated: June 18, 2025
    +
    + +
    + PSI Logo +
    + +
    +

    © 2025 Paul Scherrer Institute, CSD/HPC and Emerging Technologies Group. This is a boilerplate copyright statement... All rights reserved. No part of this publication may be reproduced, distributed, or transmitted in any form or by any means, including photocopying, recording, or other electronic or mechanical methods, without the prior written permission of the publisher, except in the case of brief quotations embodied in critical reviews and certain other noncommercial uses permitted by copyright law. +

    + +
    + +
    + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/tocpage.html/index.html b/tocpage.html/index.html new file mode 100644 index 0000000..4882c80 --- /dev/null +++ b/tocpage.html/index.html @@ -0,0 +1,385 @@ + + + + + + + + + | HPC and Emerging Technologies Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + +
    + + + + +
    +
    +

    +
    + + + +
    + + + + + + + + +
    + + + + + + + + + + +
    + +
    + + + + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + +
    + +
    + + + + diff --git a/tooltips.html b/tooltips.html new file mode 100644 index 0000000..127052e --- /dev/null +++ b/tooltips.html @@ -0,0 +1,74 @@ + + + Tooltip Demo + + + + + + + + + + + +

    Tooltip Demo

    + +

    This page is purposely separated out from the rest of theme so you can see the bare minimum code to add to a page, without all the other theme's code getting in the way.

    + +

    Content in the tooltips (actually "popovers" according to Bootstrap lingo) can be pulled in dynamically by placing the JSON file on a remote host.

    + + + + + +

    Basketball

    + +

    Baseball

    + +

    Football

    + +

    Soccer

    diff --git a/tooltips.json b/tooltips.json new file mode 100644 index 0000000..73773c9 --- /dev/null +++ b/tooltips.json @@ -0,0 +1,29 @@ +{ +"entries": +[ + +{ +"doc_id": "baseball", +"body": "Baseball is considered America's pasttime sport, though that may be more of a historical term than a current one. There's a lot more excitement about football than baseball. A baseball game is somewhat of a snooze to watch, for the most part." +} , + +{ +"doc_id": "basketball", +"body": "Basketball is a sport involving two teams of five players each competing to put a ball through a small circular rim 10 feet above the ground. Basketball requires players to be in top physical condition, since they spend most of the game running back and forth along a 94-foot-long floor." +} , + +{ +"doc_id": "football", +"body": "No doubt the most fun sport to watch, football also manages to accrue the most injuries with the players. From concussions to blown knees, football players have short sport lives." +} , + +{ +"doc_id": "soccer", +"body": "If there's one sport that dominates the world landscape, it's soccer. However, US soccer fans are few and far between. Apart from the popularity of soccer during the World Cup, most people don't even know the name of the professional soccer organization in their area." +} + +] +} + + + diff --git a/var/build.sh b/var/build.sh new file mode 100644 index 0000000..137b92c --- /dev/null +++ b/var/build.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +apt-get update && \ +apt-get install -y libfontconfig zip npm git apt-transport-https ca-certificates curl openssl && \ +npm i -g npm && \ +npm cache clean -f && \ +npm install -g n && \ +n stable && \ +node --version && \ +npm --version && \ +bundle install \ No newline at end of file