From 80851208710c6149d46f2525dd21f903d8e943e2 Mon Sep 17 00:00:00 2001 From: Boris Date: Tue, 21 Sep 2021 18:40:55 +0200 Subject: [PATCH] [ENH] Add content filters (tags, station, and PIN status) --- www/boris/ajouter_video_youtube.sh | 89 +----- www/boris/conf.php | 20 ++ www/boris/functions.php | 137 +++++++-- www/boris/get_PIN.sh | 7 + www/boris/get_astrxbian_index.sh | 15 +- www/boris/get_xzuid.sh | 6 + www/boris/inc/header.php | 6 +- www/boris/menu.php | 18 ++ www/boris/styles/astroport/9gag_logo.png | 1 + www/boris/styles/astroport/decoration.css | 121 +++++++- .../styles/astroport/font-awesome/address-book.svg | 1 + www/boris/styles/astroport/font-awesome/anchor.svg | 1 + .../styles/astroport/font-awesome/arrow-down.svg | 1 + www/boris/styles/astroport/font-awesome/bars.svg | 1 + www/boris/styles/astroport/font-awesome/book.svg | 1 + .../styles/astroport/font-awesome/bookmark.svg | 1 + .../styles/astroport/font-awesome/bullhorn.svg | 1 + www/boris/styles/astroport/font-awesome/cloud.svg | 1 + www/boris/styles/astroport/font-awesome/film.svg | 1 + .../astroport/font-awesome/film.white.90x90.png | Bin 0 -> 1290 bytes .../styles/astroport/font-awesome/film.white.png | Bin 0 -> 1658 bytes .../styles/astroport/font-awesome/film.white.svg | 1 + www/boris/styles/astroport/font-awesome/hdd.svg | 1 + www/boris/styles/astroport/font-awesome/laptop.svg | 1 + .../styles/astroport/font-awesome/play-circle.svg | 1 + www/boris/styles/astroport/font-awesome/play.svg | 1 + www/boris/styles/astroport/font-awesome/qrcode.svg | 1 + www/boris/styles/astroport/font-awesome/save.svg | 1 + .../astroport/font-awesome/share-alt-square.svg | 1 + .../styles/astroport/font-awesome/share-alt.svg | 1 + .../styles/astroport/font-awesome/share-square.svg | 1 + www/boris/styles/astroport/font-awesome/share.svg | 1 + .../styles/astroport/font-awesome/sliders-h.svg | 1 + www/boris/styles/astroport/font-awesome/tag.svg | 1 + www/boris/styles/astroport/font-awesome/tags.svg | 1 + www/boris/styles/astroport/font-awesome/tv.svg | 1 + www/boris/styles/astroport/font-awesome/unlink.svg | 1 + www/boris/styles/astroport/font-awesome/upload.svg | 1 + .../styles/astroport/font-awesome/user-alt.svg | 1 + .../astroport/font-awesome/user-astronaut.svg | 1 + .../styles/astroport/font-awesome/user-friends.svg | 1 + .../styles/astroport/font-awesome/user-tag.svg | 1 + www/boris/styles/astroport/font-awesome/user.svg | 1 + www/boris/styles/astroport/font-awesome/wallet.svg | 1 + www/boris/styles/astroport/font-awesome/wrench.svg | 1 + www/boris/styles/crowdbunker/decoration.css | 2 +- www/boris/styles/default/9gag_logo.png | Bin 0 -> 70325 bytes .../styles/default/font-awesome/address-book.svg | 1 + www/boris/styles/default/font-awesome/anchor.svg | 1 + .../styles/default/font-awesome/arrow-down.svg | 1 + www/boris/styles/default/font-awesome/bars.svg | 1 + www/boris/styles/default/font-awesome/book.svg | 1 + www/boris/styles/default/font-awesome/bookmark.svg | 1 + www/boris/styles/default/font-awesome/bullhorn.svg | 1 + www/boris/styles/default/font-awesome/cloud.svg | 1 + www/boris/styles/default/font-awesome/film.svg | 1 + .../styles/default/font-awesome/film.white.svg | 1 + www/boris/styles/default/font-awesome/hdd.svg | 1 + www/boris/styles/default/font-awesome/laptop.svg | 1 + .../styles/default/font-awesome/play-circle.svg | 1 + www/boris/styles/default/font-awesome/play.svg | 1 + www/boris/styles/default/font-awesome/qrcode.svg | 1 + www/boris/styles/default/font-awesome/save.svg | 1 + .../default/font-awesome/share-alt-square.svg | 1 + .../styles/default/font-awesome/share-alt.svg | 1 + .../styles/default/font-awesome/share-square.svg | 1 + www/boris/styles/default/font-awesome/share.svg | 1 + .../styles/default/font-awesome/sliders-h.svg | 1 + www/boris/styles/default/font-awesome/tag.svg | 1 + www/boris/styles/default/font-awesome/tags.svg | 1 + www/boris/styles/default/font-awesome/tv.svg | 1 + www/boris/styles/default/font-awesome/unlink.svg | 1 + www/boris/styles/default/font-awesome/upload.svg | 1 + www/boris/styles/default/font-awesome/user-alt.svg | 1 + .../styles/default/font-awesome/user-astronaut.svg | 1 + .../styles/default/font-awesome/user-friends.svg | 1 + www/boris/styles/default/font-awesome/user-tag.svg | 1 + www/boris/styles/default/font-awesome/user.svg | 1 + www/boris/styles/default/font-awesome/wallet.svg | 1 + www/boris/styles/default/font-awesome/wrench.svg | 1 + www/boris/styles/default/layout.css | 123 +++++++- www/boris/swarm_files.php | 10 +- www/boris/youtube.php | 314 ++++++++++++++++++--- www/boris/youtube_add_video_aux.php | 4 +- www/boris/youtube_watch.php | 1 - 85 files changed, 774 insertions(+), 166 deletions(-) create mode 100755 www/boris/get_PIN.sh create mode 100755 www/boris/get_xzuid.sh create mode 100644 www/boris/menu.php create mode 120000 www/boris/styles/astroport/9gag_logo.png create mode 120000 www/boris/styles/astroport/font-awesome/address-book.svg create mode 120000 www/boris/styles/astroport/font-awesome/anchor.svg create mode 120000 www/boris/styles/astroport/font-awesome/arrow-down.svg create mode 120000 www/boris/styles/astroport/font-awesome/bars.svg create mode 120000 www/boris/styles/astroport/font-awesome/book.svg create mode 120000 www/boris/styles/astroport/font-awesome/bookmark.svg create mode 120000 www/boris/styles/astroport/font-awesome/bullhorn.svg create mode 120000 www/boris/styles/astroport/font-awesome/cloud.svg create mode 120000 www/boris/styles/astroport/font-awesome/film.svg create mode 100644 www/boris/styles/astroport/font-awesome/film.white.90x90.png create mode 100644 www/boris/styles/astroport/font-awesome/film.white.png create mode 120000 www/boris/styles/astroport/font-awesome/film.white.svg create mode 100755 www/boris/styles/astroport/font-awesome/hdd.svg create mode 120000 www/boris/styles/astroport/font-awesome/laptop.svg create mode 120000 www/boris/styles/astroport/font-awesome/play-circle.svg create mode 120000 www/boris/styles/astroport/font-awesome/play.svg create mode 120000 www/boris/styles/astroport/font-awesome/qrcode.svg create mode 120000 www/boris/styles/astroport/font-awesome/save.svg create mode 120000 www/boris/styles/astroport/font-awesome/share-alt-square.svg create mode 120000 www/boris/styles/astroport/font-awesome/share-alt.svg create mode 120000 www/boris/styles/astroport/font-awesome/share-square.svg create mode 120000 www/boris/styles/astroport/font-awesome/share.svg create mode 120000 www/boris/styles/astroport/font-awesome/sliders-h.svg create mode 120000 www/boris/styles/astroport/font-awesome/tag.svg create mode 120000 www/boris/styles/astroport/font-awesome/tags.svg create mode 120000 www/boris/styles/astroport/font-awesome/tv.svg create mode 120000 www/boris/styles/astroport/font-awesome/unlink.svg create mode 120000 www/boris/styles/astroport/font-awesome/upload.svg create mode 120000 www/boris/styles/astroport/font-awesome/user-alt.svg create mode 120000 www/boris/styles/astroport/font-awesome/user-astronaut.svg create mode 120000 www/boris/styles/astroport/font-awesome/user-friends.svg create mode 120000 www/boris/styles/astroport/font-awesome/user-tag.svg create mode 120000 www/boris/styles/astroport/font-awesome/user.svg create mode 120000 www/boris/styles/astroport/font-awesome/wallet.svg create mode 120000 www/boris/styles/astroport/font-awesome/wrench.svg create mode 100644 www/boris/styles/default/9gag_logo.png create mode 100755 www/boris/styles/default/font-awesome/address-book.svg create mode 100755 www/boris/styles/default/font-awesome/anchor.svg create mode 100755 www/boris/styles/default/font-awesome/arrow-down.svg create mode 100755 www/boris/styles/default/font-awesome/bars.svg create mode 100755 www/boris/styles/default/font-awesome/book.svg create mode 100755 www/boris/styles/default/font-awesome/bookmark.svg create mode 100755 www/boris/styles/default/font-awesome/bullhorn.svg create mode 100755 www/boris/styles/default/font-awesome/cloud.svg create mode 100755 www/boris/styles/default/font-awesome/film.svg create mode 100755 www/boris/styles/default/font-awesome/film.white.svg create mode 100755 www/boris/styles/default/font-awesome/hdd.svg create mode 100755 www/boris/styles/default/font-awesome/laptop.svg create mode 100755 www/boris/styles/default/font-awesome/play-circle.svg create mode 100755 www/boris/styles/default/font-awesome/play.svg create mode 100755 www/boris/styles/default/font-awesome/qrcode.svg create mode 100755 www/boris/styles/default/font-awesome/save.svg create mode 100755 www/boris/styles/default/font-awesome/share-alt-square.svg create mode 100755 www/boris/styles/default/font-awesome/share-alt.svg create mode 100755 www/boris/styles/default/font-awesome/share-square.svg create mode 100755 www/boris/styles/default/font-awesome/share.svg create mode 100755 www/boris/styles/default/font-awesome/sliders-h.svg create mode 100755 www/boris/styles/default/font-awesome/tag.svg create mode 100755 www/boris/styles/default/font-awesome/tags.svg create mode 100755 www/boris/styles/default/font-awesome/tv.svg create mode 100755 www/boris/styles/default/font-awesome/unlink.svg create mode 100755 www/boris/styles/default/font-awesome/upload.svg create mode 100755 www/boris/styles/default/font-awesome/user-alt.svg create mode 100755 www/boris/styles/default/font-awesome/user-astronaut.svg create mode 100755 www/boris/styles/default/font-awesome/user-friends.svg create mode 100755 www/boris/styles/default/font-awesome/user-tag.svg create mode 100755 www/boris/styles/default/font-awesome/user.svg create mode 100755 www/boris/styles/default/font-awesome/wallet.svg create mode 100755 www/boris/styles/default/font-awesome/wrench.svg diff --git a/www/boris/ajouter_video_youtube.sh b/www/boris/ajouter_video_youtube.sh index 0351278..efe2ee6 100755 --- a/www/boris/ajouter_video_youtube.sh +++ b/www/boris/ajouter_video_youtube.sh @@ -1,90 +1,3 @@ #!/bin/bash -######################################################################## -# Author: Fred (support@qo-op.com) -# Version: 0.1 -# License: AGPL-3.0 (https://choosealicense.com/licenses/agpl-3.0/) -######################################################################## -# SCRIPT INTERACTIF POUR AJOUTER UN FICHIER à ASTROPORT/KODI -# -# 1. CAT: film, serie, anime -# 2. TMDB: ID de la fiche sur https://www.themoviedb.org/ -# 3. TITLE: Titre de la vidéo -# 4. YEAR: Année de la vidéo -# 5. RES: Résolution 1080p, 4K, SD, 720, HD -# 6. SAISON: Pour les séries et animes, c'est le numéro de saison. -# Pour un film, le champ SAISON est utilisé pour renseigner la Saga -# 7. GENRES: Action, Aventure, Fantastique, Animation, etc (choix multiple). -# 8. GROUPES: Permet de regrouper des films. (choix multiple) -# -# https://github.com/Kodi-vStream/venom-xbmc-addons/wiki/Voir-et-partager-sa-biblioth%C3%A8que-priv%C3%A9e#d%C3%A9clarer-des-films -######################################################################## -YOU=$(ps auxf --sort=+utime | grep -w ipfs | grep -v -E 'color=auto|grep' | tail -n 1 | cut -d " " -f 1) && [[ ! $YOU ]] && echo "ipfs NOT RUNNING. EXIT" && exit 1 -HOME=/home/$YOU -######################################################################## -MY_PATH="`dirname \"$0\"`" # relative -MY_PATH="`( cd \"$MY_PATH\" && pwd )`" # absolutized and normalized -ME="${0##*/}" -######################################################################## - -######################################################################## -IPFSNODEID=$(ipfs id -f='\n') -[[ -f ~/.zen/ipfs/.$IPFSNODEID/G1SSB/_g1.gchange_title ]] && XZUID=$(cat ~/.zen/ipfs/.$IPFSNODEID/G1SSB/_g1.gchange_title) || XZUID=$(cat /etc/hostname) - - -######################################################################## -# CASE ## YOUTUBE -######################################################################## - -#YTURL=$(zenity --entry --width 300 --title "Lien ou identifiant à copier" --text "Indiquez le lien (URL) ou l'ID de la vidéo" --entry-text="") -YTURL=$1 -[[ $YTURL == "" ]] && exit 1 - -# Create TEMP directory to copy $YID_$TITLE.$FILE_EXT -YTEMP="/tmp/$(date -u +%s%N | cut -b1-13)" -mkdir -p ${YTEMP} - -# youtube-dl $YTURL -echo "VIDEO $YTURL" -/usr/local/bin/youtube-dl -f '[height=720]/best' \ ---write-info-json --write-annotations \ ---no-mtime -o "${YTEMP}/%(id)s_%(title)s.%(ext)s" $YTURL - -# Get filename, extract ID, make destination dir and move copy. -YFILE=$(ls -t ${YTEMP} | head -n 1) -FILE_NAME="$(basename "${YFILE}")" -FILE_EXT="${FILE_NAME##*.}" - -YID=$(echo "${FILE_NAME}" | cut -d "_" -f 1) -YNAME=$(echo "${FILE_NAME}" | cut -d "_" -f 2-) -TMDB="${YID}" - -FILE_PATH="$HOME/astroport/youtube/$YID" -echo "Creating directory $FILE_PATH" -mkdir -p -v --mode=775 $FILE_PATH || echo "Directory creation failed :-(" -echo "Moving files there..." -mv -f ${YTEMP}/* ${FILE_PATH}/ - -## CORRECT PARAMETERS to Make Kodi compatible YASTRXBIAN FILE -TITLE="${YNAME%.*}" -GENRES="[Youtube]" -GROUPES="_IPNSKEY_" -FILE_RES=$(ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of csv=s=x:p=0 "${FILE_PATH}/${FILE_NAME}" | cut -d "x" -f 2) -RES=${FILE_RES%?}0p - -## CREATE "~/astroport/${CAT}/${TMDB}/ajouter_video.txt" (with film CAT !!!) -URLENCODE_FILE_NAME=$(echo ${FILE_NAME} | jq -Rr @uri) -echo "film;${TMDB};${YEAR};${TITLE};${SAISON};${GENRES};${GROUPES};${RES};/ipfs/_IPFSREPFILEID_/$URLENCODE_FILE_NAME" > ~/astroport/youtube/${TMDB}/ajouter_video.txt -# _IPFSREPFILEID_ is replaced later - -rm -Rf ${YTEMP} - - -######################################################################## -# ADD $FILE to IPFS / ASTROPORT / KODI -######################################################################## -./new_youtube_video_in_astroport.sh "$HOME/astroport/youtube/${TMDB}/" "${FILE_NAME}" > /tmp/youtube_${TMDB}.log 2>&1 -######################################################################## -######################################################################## - -exit 0 +../../ajouter_video.sh $1 1 diff --git a/www/boris/conf.php b/www/boris/conf.php index e086028..a4a412e 100644 --- a/www/boris/conf.php +++ b/www/boris/conf.php @@ -1,10 +1,23 @@ '; var_dump($output); echo ''; - $ipfsNodeId = $output[0]; - $indexHTML = file_get_contents('http://' . HOST . '/ipns/' . $ipnsHash . '/index.html'); + $indexHTML = @file_get_contents('http://' . HOST . '/ipns/' . $ipnsHash . '/index.html'); - // $indexHTML = file_get_contents('http://' . HOST . '/ipns/' . $ipfsNodeId . '/.' . $ipfsNodeId . '/KEY/'); - - - - $re = '!/ipns/[^/]+/([^/]+)/!isU'; - - preg_match($re, $indexHTML, $matches); - - $ipnsHiddenHash = $matches[1]; - - $indexHTML = file_get_contents('http://' . HOST . '/ipns/' . $ipnsHash . '/' . $ipnsHiddenHash . '/video.json'); - - if (isset($indexHTML)) { - - return json_decode($indexHTML); - } + if (empty($indexHTML)) { + + return []; + + } else { + + // $indexHTML = @file_get_contents('http://' . HOST . '/ipns/' . $ipfsNodeId . '/.' . $ipfsNodeId . '/KEY/'); + + $re = '!/ipns/[^/]+/([^/]+)/!isU'; + + preg_match($re, $indexHTML, $matches); + + $ipnsHiddenHash = $matches[1]; + + $indexHTML = @file_get_contents('http://' . HOST . '/ipns/' . $ipnsHash . '/' . $ipnsHiddenHash . '/video.json'); + + if (empty($indexHTML)) { + + return []; + + } else { + + return json_decode($indexHTML); + } + } } + + +function getTagsListFromTagStr ($str) { + + if (substr($str, 0, 1) == "[") { + + $str = substr($str, 1); + $str = substr($str, 0, -1); + + preg_match_all('/"([^"]+)"/isU', $str, $matches, PREG_PATTERN_ORDER); + $tags = $matches[1]; + + } else { + + $tags = explode('|', $str); + } + + if ((count($tags) == 1) and empty($tags[0])) { + + return array(); + + } else { + + return $tags; + } +} + +function separateTags ($tags, $stations) { + + return [ + array_diff($tags, $stations), + array_intersect($tags, $stations) + ]; + +} + +function isStation ($tag) { + + global $stations; + + return in_array($tag, $stations); +} + +function buildRequestedURI ($uri, $params, $escapeHTML = false) { + + $URL = $uri; + $first = true; + + foreach ($params as $k => $v) { + + if ($first) { + + $URL .= '?'; + $first = false; + + } else { + + if ($escapeHTML) { + + $URL .= '&'; + + } else { + + $URL .= '&'; + } + } + + $URL .= $k . '=' . htmlspecialchars($v); + } + + return $URL; +} + +function handleVideoID ($videoID) { + + preg_match('/^((?P([a-zA-Z0-9-]+\.)?[a-zA-Z0-9-]+\.[a-zA-Z0-9-]+)_)?(?P.+)$/is', $videoID, $matches); + + $ndd = empty($matches['ndd']) ? 'www.youtube.com' : strrev($matches['ndd']); + $id = $matches['id']; + + return [ + $ndd, + $id + ]; +} + +function canReadVideoFormat ($mimeType) { + + return ($mimeType == 'video/mp4'); +} diff --git a/www/boris/get_PIN.sh b/www/boris/get_PIN.sh new file mode 100755 index 0000000..cee68aa --- /dev/null +++ b/www/boris/get_PIN.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +YOU=$(ps auxf --sort=+utime | grep -w ipfs | grep -v -E 'color=auto|grep' | tail -n 1 | cut -d " " -f 1) && [[ ! $YOU ]] && echo "ipfs NOT RUNNING. EXIT" && exit 1 + +ls /home/$YOU/.zen/PIN | cat + + diff --git a/www/boris/get_astrxbian_index.sh b/www/boris/get_astrxbian_index.sh index c31e7c5..017b39f 100755 --- a/www/boris/get_astrxbian_index.sh +++ b/www/boris/get_astrxbian_index.sh @@ -5,10 +5,17 @@ # License: AGPL-3.0 (https://choosealicense.com/licenses/agpl-3.0/) ######################################################################## PREFIX="$1" -FILTER="$2" [[ $PREFIX == "" ]] && PREFIX="*" +FILTER="$2" YOU=$(ps auxf --sort=+utime | grep -w ipfs | grep -v -E 'color=auto|grep' | tail -n 1 | cut -d " " -f 1) && [[ ! $YOU ]] && echo "ipfs NOT RUNNING. EXIT" && exit 1 -# Filter no ipns link -[[ ! $FILTER ]] && cat /home/$YOU/.zen/{ipfs,ipfs_swarm}/.*/astroport/kodi/vstream/${PREFIX}ASTRXBIAN | grep -Ev "];;" | sort | uniq | tail -n +2 && exit 0 -cat /home/$YOU/.zen/{ipfs,ipfs_swarm}/.*/astroport/kodi/vstream/${PREFIX}ASTRXBIAN | grep -Ev "];;" | grep "$FILTER" | sort | uniq | tail -n +2 +if [[ ! $FILTER ]]; then + # We use `grep -Ev "];;` to filter out videos without an ipns link + MY_VIDEOS=`cat /home/$YOU/.zen/ipfs/.*/astroport/kodi/vstream/${PREFIX}ASTRXBIAN | grep -Ev "];;" | tail -n +2` + SWARM_VIDEOS=`cat /home/$YOU/.zen/ipfs_swarm/.*/astroport/kodi/vstream/${PREFIX}ASTRXBIAN | grep -Ev "];;" | tail -n +2` + (echo "$SWARM_VIDEOS" && echo "$MY_VIDEOS") | tac +else + MY_VIDEOS=`cat /home/$YOU/.zen/ipfs/.*/astroport/kodi/vstream/${PREFIX}ASTRXBIAN | grep -Ev "];;" | tail -n +2 | grep "$FILTER"` + SWARM_VIDEOS=`cat /home/$YOU/.zen/ipfs_swarm/.*/astroport/kodi/vstream/${PREFIX}ASTRXBIAN | grep -Ev "];;" | tail -n +2 | grep "$FILTER"` + (echo "$SWARM_VIDEOS" && echo "$MY_VIDEOS") | tac +fi diff --git a/www/boris/get_xzuid.sh b/www/boris/get_xzuid.sh new file mode 100755 index 0000000..02bc224 --- /dev/null +++ b/www/boris/get_xzuid.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +YOU=$(ps auxf --sort=+utime | grep -w ipfs | grep -v -E 'color=auto|grep' | tail -n 1 | cut -d " " -f 1) && [[ ! $YOU ]] && echo "ipfs NOT RUNNING. EXIT" && exit 1 + +cat /home/$YOU/.zen/ipfs/.12D*/_xbian.zuid + diff --git a/www/boris/inc/header.php b/www/boris/inc/header.php index e232883..4131c23 100644 --- a/www/boris/inc/header.php +++ b/www/boris/inc/header.php @@ -1,15 +1,17 @@ - Astroport "<?php echo STATION_NAME; ?> + Astroport "<?php echo STATION_NAME; ?>" - +
diff --git a/www/boris/menu.php b/www/boris/menu.php new file mode 100644 index 0000000..9f48e08 --- /dev/null +++ b/www/boris/menu.php @@ -0,0 +1,18 @@ +id() . '
'; + + +$videosList = array(); +exec("/bin/bash -c './get_astrxbian_index.sh'", $videos); +// exec("/bin/bash -c './get_youtube_videos.sh'", $videos); +// echo file_get_contents("http://youtube2.com/ipns/12D3KooWHLLohhFqwTs3Ccego51w1Q2WUQ8JmhSMWtsZnQpMigHY/.12D3KooWHLLohhFqwTs3Ccego51w1Q2WUQ8JmhSMWtsZnQpMigHY/FASTRXBIAN"); + +// echo shell_exec('whoami'); // Pour savoir quel utilisateur système exécute les scripts PHP + +$videos = array_reverse($videos); diff --git a/www/boris/styles/astroport/9gag_logo.png b/www/boris/styles/astroport/9gag_logo.png new file mode 120000 index 0000000..5697e13 --- /dev/null +++ b/www/boris/styles/astroport/9gag_logo.png @@ -0,0 +1 @@ +../default/9gag_logo.png \ No newline at end of file diff --git a/www/boris/styles/astroport/decoration.css b/www/boris/styles/astroport/decoration.css index b51a66f..8c0176c 100644 --- a/www/boris/styles/astroport/decoration.css +++ b/www/boris/styles/astroport/decoration.css @@ -1,9 +1,16 @@ :root { --rouge: hsl(0, 98.8%, 33.5%); + --rouge-fonce: hsl(0, 75%, 33.5%); + + --noir-complet: black; --noir-fonce: hsl(0, 30%, 2.1%); --noir-moyen: hsl(0, 15%, 3.1%); --noir-clair: hsl(0, 5%, 7.1%); + + --blanc: hsla(0, 0%, 100%, 1); + --blanc-fort: hsla(0, 0%, 100%, 0.75); + --blanc-semi-transparent: hsla(0, 0%, 100%, 0.25); } @@ -31,7 +38,90 @@ header span { color: white; } -#videosList li { +#pinFilter ul li a { + + background-color: var(--blanc); +} + +#pinFilter ul li.selected a { + + background-color: var(--rouge); +} + + +ul#tagsList, +ul#narrowingTags { + + list-style: none; + margin-left: 0; + padding-left: 0; +} + +ul#tagsList li, +ul#narrowingTags li { + + display: inline-block; +} + +ul#tagsList a, +ul#tagsList a:visited { + + text-decoration: none; + color: var(--rouge-fonce); +} + +#narrowingTags a, +#narrowingTags a:visited { + + text-decoration: none; + color: inherit; +} + +#narrowingTags li { + + border-radius: 1rem; +} + +#narrowingTags li.selected { + + background-color: var(--rouge-fonce); + color: var(--blanc); + border: 0.125rem solid var(--noir-clair); +} + +#tagsList, +#narrowingTags { + + display: flex; + flex-direction: row; + flex-wrap: wrap; +} + +#tagsList li.station, +#narrowingTags li.station { + + order: 1; +} + +#tagsList li.station, +#narrowingTags li.station { + + background-image: url("logo.png"); + background-repeat: no-repeat; + background-position: left middle; + background-size: contain; + padding-left: 2em; + order: 1; +} + +#narrowingTags li.selectable { + + background-color: var(--noir-fonce); + color: var(--rouge-fonce); + border: 0.125rem solid var(--noir-clair); +} + +#videosList > li { background: var(--noir-clair); border-color: var(--rouge); @@ -45,6 +135,35 @@ header span { color: white; font-weight: bold; text-decoration: none; + word-break: break-all; +} + +#videosList .thumbnail { + + background-color: var(--noir-complet); +} + +#videosList > li ul.tags li a, +#videosList > li ul.tags li a:visited { + + text-decoration: none; +} + +#videosList > li ul.tags li.selectable a, +#videosList > li ul.tags li.selectable a:visited { + + color: var(--blanc-semi-transparent); +} + +#videosList > li ul.tags li.selectable a:hover { + + color: var(--blanc-fort); +} + +#videosList > li ul.tags li.selected a, +#videosList > li ul.tags li.selected a:visited { + + color: var(--blanc-fort); } article { diff --git a/www/boris/styles/astroport/font-awesome/address-book.svg b/www/boris/styles/astroport/font-awesome/address-book.svg new file mode 120000 index 0000000..5faeceb --- /dev/null +++ b/www/boris/styles/astroport/font-awesome/address-book.svg @@ -0,0 +1 @@ +../../default/font-awesome/address-book.svg \ No newline at end of file diff --git a/www/boris/styles/astroport/font-awesome/anchor.svg b/www/boris/styles/astroport/font-awesome/anchor.svg new file mode 120000 index 0000000..3abe343 --- /dev/null +++ b/www/boris/styles/astroport/font-awesome/anchor.svg @@ -0,0 +1 @@ +../../default/font-awesome/anchor.svg \ No newline at end of file diff --git a/www/boris/styles/astroport/font-awesome/arrow-down.svg b/www/boris/styles/astroport/font-awesome/arrow-down.svg new file mode 120000 index 0000000..cd7668c --- /dev/null +++ b/www/boris/styles/astroport/font-awesome/arrow-down.svg @@ -0,0 +1 @@ +../../default/font-awesome/arrow-down.svg \ No newline at end of file diff --git a/www/boris/styles/astroport/font-awesome/bars.svg b/www/boris/styles/astroport/font-awesome/bars.svg new file mode 120000 index 0000000..340d9df --- /dev/null +++ b/www/boris/styles/astroport/font-awesome/bars.svg @@ -0,0 +1 @@ +../../default/font-awesome/bars.svg \ No newline at end of file diff --git a/www/boris/styles/astroport/font-awesome/book.svg b/www/boris/styles/astroport/font-awesome/book.svg new file mode 120000 index 0000000..cdaac5b --- /dev/null +++ b/www/boris/styles/astroport/font-awesome/book.svg @@ -0,0 +1 @@ +../../default/font-awesome/book.svg \ No newline at end of file diff --git a/www/boris/styles/astroport/font-awesome/bookmark.svg b/www/boris/styles/astroport/font-awesome/bookmark.svg new file mode 120000 index 0000000..ff0da29 --- /dev/null +++ b/www/boris/styles/astroport/font-awesome/bookmark.svg @@ -0,0 +1 @@ +../../default/font-awesome/bookmark.svg \ No newline at end of file diff --git a/www/boris/styles/astroport/font-awesome/bullhorn.svg b/www/boris/styles/astroport/font-awesome/bullhorn.svg new file mode 120000 index 0000000..ebe3194 --- /dev/null +++ b/www/boris/styles/astroport/font-awesome/bullhorn.svg @@ -0,0 +1 @@ +../../default/font-awesome/bullhorn.svg \ No newline at end of file diff --git a/www/boris/styles/astroport/font-awesome/cloud.svg b/www/boris/styles/astroport/font-awesome/cloud.svg new file mode 120000 index 0000000..9419ced --- /dev/null +++ b/www/boris/styles/astroport/font-awesome/cloud.svg @@ -0,0 +1 @@ +../../default/font-awesome/cloud.svg \ No newline at end of file diff --git a/www/boris/styles/astroport/font-awesome/film.svg b/www/boris/styles/astroport/font-awesome/film.svg new file mode 120000 index 0000000..b1e1a1a --- /dev/null +++ b/www/boris/styles/astroport/font-awesome/film.svg @@ -0,0 +1 @@ +../../default/font-awesome/film.svg \ No newline at end of file diff --git a/www/boris/styles/astroport/font-awesome/film.white.90x90.png b/www/boris/styles/astroport/font-awesome/film.white.90x90.png new file mode 100644 index 0000000000000000000000000000000000000000..631a324446acaa6dd5c32826c585967b74444d49 GIT binary patch literal 1290 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 literal 0 HcmV?d00001 diff --git a/www/boris/styles/astroport/font-awesome/film.white.svg b/www/boris/styles/astroport/font-awesome/film.white.svg new file mode 120000 index 0000000..f9ac018 --- /dev/null +++ b/www/boris/styles/astroport/font-awesome/film.white.svg @@ -0,0 +1 @@ +../../default/font-awesome/film.white.svg \ No newline at end of file diff --git a/www/boris/styles/astroport/font-awesome/hdd.svg b/www/boris/styles/astroport/font-awesome/hdd.svg new file mode 100755 index 0000000..cead9cf --- /dev/null +++ b/www/boris/styles/astroport/font-awesome/hdd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/www/boris/styles/astroport/font-awesome/laptop.svg b/www/boris/styles/astroport/font-awesome/laptop.svg new file mode 120000 index 0000000..79c545e --- /dev/null +++ b/www/boris/styles/astroport/font-awesome/laptop.svg @@ -0,0 +1 @@ +../../default/font-awesome/laptop.svg \ No newline at end of file diff --git a/www/boris/styles/astroport/font-awesome/play-circle.svg b/www/boris/styles/astroport/font-awesome/play-circle.svg new file mode 120000 index 0000000..c632edf --- /dev/null +++ b/www/boris/styles/astroport/font-awesome/play-circle.svg @@ -0,0 +1 @@ +../../default/font-awesome/play-circle.svg \ No newline at end of file diff --git a/www/boris/styles/astroport/font-awesome/play.svg b/www/boris/styles/astroport/font-awesome/play.svg new file mode 120000 index 0000000..4df8f07 --- /dev/null +++ b/www/boris/styles/astroport/font-awesome/play.svg @@ -0,0 +1 @@ +../../default/font-awesome/play.svg \ No newline at end of file diff --git a/www/boris/styles/astroport/font-awesome/qrcode.svg b/www/boris/styles/astroport/font-awesome/qrcode.svg new file mode 120000 index 0000000..a980d47 --- /dev/null +++ b/www/boris/styles/astroport/font-awesome/qrcode.svg @@ -0,0 +1 @@ +../../default/font-awesome/qrcode.svg \ No newline at end of file diff --git a/www/boris/styles/astroport/font-awesome/save.svg b/www/boris/styles/astroport/font-awesome/save.svg new file mode 120000 index 0000000..695b989 --- /dev/null +++ b/www/boris/styles/astroport/font-awesome/save.svg @@ -0,0 +1 @@ +../../default/font-awesome/save.svg \ No newline at end of file diff --git a/www/boris/styles/astroport/font-awesome/share-alt-square.svg b/www/boris/styles/astroport/font-awesome/share-alt-square.svg new file mode 120000 index 0000000..18f89f6 --- /dev/null +++ b/www/boris/styles/astroport/font-awesome/share-alt-square.svg @@ -0,0 +1 @@ +../../default/font-awesome/share-alt-square.svg \ No newline at end of file diff --git a/www/boris/styles/astroport/font-awesome/share-alt.svg b/www/boris/styles/astroport/font-awesome/share-alt.svg new file mode 120000 index 0000000..bbe051d --- /dev/null +++ b/www/boris/styles/astroport/font-awesome/share-alt.svg @@ -0,0 +1 @@ +../../default/font-awesome/share-alt.svg \ No newline at end of file diff --git a/www/boris/styles/astroport/font-awesome/share-square.svg b/www/boris/styles/astroport/font-awesome/share-square.svg new file mode 120000 index 0000000..9fbde50 --- /dev/null +++ b/www/boris/styles/astroport/font-awesome/share-square.svg @@ -0,0 +1 @@ +../../default/font-awesome/share-square.svg \ No newline at end of file diff --git a/www/boris/styles/astroport/font-awesome/share.svg b/www/boris/styles/astroport/font-awesome/share.svg new file mode 120000 index 0000000..78f7434 --- /dev/null +++ b/www/boris/styles/astroport/font-awesome/share.svg @@ -0,0 +1 @@ +../../default/font-awesome/share.svg \ No newline at end of file diff --git a/www/boris/styles/astroport/font-awesome/sliders-h.svg b/www/boris/styles/astroport/font-awesome/sliders-h.svg new file mode 120000 index 0000000..06f6151 --- /dev/null +++ b/www/boris/styles/astroport/font-awesome/sliders-h.svg @@ -0,0 +1 @@ +../../default/font-awesome/sliders-h.svg \ No newline at end of file diff --git a/www/boris/styles/astroport/font-awesome/tag.svg b/www/boris/styles/astroport/font-awesome/tag.svg new file mode 120000 index 0000000..b5ab4cc --- /dev/null +++ b/www/boris/styles/astroport/font-awesome/tag.svg @@ -0,0 +1 @@ +../../default/font-awesome/tag.svg \ No newline at end of file diff --git a/www/boris/styles/astroport/font-awesome/tags.svg b/www/boris/styles/astroport/font-awesome/tags.svg new file mode 120000 index 0000000..3101859 --- /dev/null +++ b/www/boris/styles/astroport/font-awesome/tags.svg @@ -0,0 +1 @@ +../../default/font-awesome/tags.svg \ No newline at end of file diff --git a/www/boris/styles/astroport/font-awesome/tv.svg b/www/boris/styles/astroport/font-awesome/tv.svg new file mode 120000 index 0000000..ad8ce43 --- /dev/null +++ b/www/boris/styles/astroport/font-awesome/tv.svg @@ -0,0 +1 @@ +../../default/font-awesome/tv.svg \ No newline at end of file diff --git a/www/boris/styles/astroport/font-awesome/unlink.svg b/www/boris/styles/astroport/font-awesome/unlink.svg new file mode 120000 index 0000000..e87dc7e --- /dev/null +++ b/www/boris/styles/astroport/font-awesome/unlink.svg @@ -0,0 +1 @@ +../../default/font-awesome/unlink.svg \ No newline at end of file diff --git a/www/boris/styles/astroport/font-awesome/upload.svg b/www/boris/styles/astroport/font-awesome/upload.svg new file mode 120000 index 0000000..fefa5ef --- /dev/null +++ b/www/boris/styles/astroport/font-awesome/upload.svg @@ -0,0 +1 @@ +../../default/font-awesome/upload.svg \ No newline at end of file diff --git a/www/boris/styles/astroport/font-awesome/user-alt.svg b/www/boris/styles/astroport/font-awesome/user-alt.svg new file mode 120000 index 0000000..e3ea154 --- /dev/null +++ b/www/boris/styles/astroport/font-awesome/user-alt.svg @@ -0,0 +1 @@ +../../default/font-awesome/user-alt.svg \ No newline at end of file diff --git a/www/boris/styles/astroport/font-awesome/user-astronaut.svg b/www/boris/styles/astroport/font-awesome/user-astronaut.svg new file mode 120000 index 0000000..4547c06 --- /dev/null +++ b/www/boris/styles/astroport/font-awesome/user-astronaut.svg @@ -0,0 +1 @@ +../../default/font-awesome/user-astronaut.svg \ No newline at end of file diff --git a/www/boris/styles/astroport/font-awesome/user-friends.svg b/www/boris/styles/astroport/font-awesome/user-friends.svg new file mode 120000 index 0000000..a55e162 --- /dev/null +++ b/www/boris/styles/astroport/font-awesome/user-friends.svg @@ -0,0 +1 @@ +../../default/font-awesome/user-friends.svg \ No newline at end of file diff --git a/www/boris/styles/astroport/font-awesome/user-tag.svg b/www/boris/styles/astroport/font-awesome/user-tag.svg new file mode 120000 index 0000000..f523e33 --- /dev/null +++ b/www/boris/styles/astroport/font-awesome/user-tag.svg @@ -0,0 +1 @@ +../../default/font-awesome/user-tag.svg \ No newline at end of file diff --git a/www/boris/styles/astroport/font-awesome/user.svg b/www/boris/styles/astroport/font-awesome/user.svg new file mode 120000 index 0000000..69b3c6d --- /dev/null +++ b/www/boris/styles/astroport/font-awesome/user.svg @@ -0,0 +1 @@ +../../default/font-awesome/user.svg \ No newline at end of file diff --git a/www/boris/styles/astroport/font-awesome/wallet.svg b/www/boris/styles/astroport/font-awesome/wallet.svg new file mode 120000 index 0000000..661c4d8 --- /dev/null +++ b/www/boris/styles/astroport/font-awesome/wallet.svg @@ -0,0 +1 @@ +../../default/font-awesome/wallet.svg \ No newline at end of file diff --git a/www/boris/styles/astroport/font-awesome/wrench.svg b/www/boris/styles/astroport/font-awesome/wrench.svg new file mode 120000 index 0000000..b44dc89 --- /dev/null +++ b/www/boris/styles/astroport/font-awesome/wrench.svg @@ -0,0 +1 @@ +../../default/font-awesome/wrench.svg \ No newline at end of file diff --git a/www/boris/styles/crowdbunker/decoration.css b/www/boris/styles/crowdbunker/decoration.css index 9b5a31e..05054a2 100644 --- a/www/boris/styles/crowdbunker/decoration.css +++ b/www/boris/styles/crowdbunker/decoration.css @@ -46,7 +46,7 @@ header .usp strong { } -#videosList li { +#videosList > li { background: var(--canard); border-color: var(--pink); diff --git a/www/boris/styles/default/9gag_logo.png b/www/boris/styles/default/9gag_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..3f2b2476b6205aa8ea7ed9d3d8e7823cc5c9a786 GIT binary patch literal 70325 zcmeFaXH=AD7d1R~jRiYVq{N1W5<#U%vx1@$D=5u^Vg(eC&Wsu*ND#0g(rs8lR6y!r zK|qnF(mM)6?+ksueQr#iB`Yg8uvfAmQF%?-sjcK9)JpSI>2mVo{j6d!V##gbsHU$b(%tzUgH`}b1o)7352 z&+ka@({>oOE%RY)fU1>wb>sBsw+v@rzPG&~NN~t~=BBwves|r}H%#!;dG(_e+$jR9 zaYx>4ocm5_gxiwisWPLUTk|7hpZsDSA@}%PPMy$|@+uV)C+`@5*~52VPF& z_xAARGrHqS=Y00TnCRD@)A~!>2Y<_AT^~E#>f7(NG)4{nj6Vo4f)uv_6!SD72N7vl- z9oTDcZ=ZT$+Twuj6EVnwfP z;6QswVD~%Sgr@^nyHxPOveLQrY)VBZ(Xzf3oO)~&-;R?Sfark#?ZK};T}%);g!iA8AT`GOHY|IXU@a(C6;0a za!Zz+c%5}i)7VO#{Hag>q6OTGQ~Lo{JkaFS|NdNik!6Nz%S$0=i_V1J z#$NH&=9n=jn3;#vpl#L1HMMTp z=FR!(U0WJVD-%x-^N6n$ZF*rZ80Z%qW_Hj*P3aZ$#L%ZNk~X5M_U%couC5}J zGcw*4L>$dk$GinCv8DZu=~ox)2F$W2lk}4<(ZHPc7};kyl(g|}O6;nizL$xu-?ZA? zM`yFYvNg}mxUXVcprEfhOx>yHIXjK{^d$1->$;)QRX2vIcfAyv@Ypc+RDY&^)w3y* zoBKZYmI?;86-Jp0%m=qc_W}owkQist{nb10MQ>v)d+CxTEs;lRG99M>Cg00%5(Fv~ zTYao^?yD5%p5iURz$`*%MSvzvTzi}*6iFc!cERq4&s21ulYeSf95Wsd8mm%V$kvwa z|B!hWkChqN4x@E&%elMBcOVzRcV3ut$3wwBp7f{t+d?LkIQKTFcfS%&XwEfF_nR?; zS%kj(4819%T$l5>H%W-y_4;h1QlRf$jQsgE4TlMA=xSwQK(GxQ}{Ew-qQ34D2lUd zTT{`Uw8!MwvHG5nKBvvww|bXBPe-#;63Ky7|FZSn`OKV+hLji^uV)0t8X2gL1Ju4N2rrc zv2||ByQ_-@CwbBawz6@}uQJTyJ92zdQ&Yz?i@Rs<6tb%y(~cUo-FOWf;s?$Y5h?WC zmOVYr6sb;Aq13VMfQMQSZ`rrcGdbl&*)>_?fj(Vs&u7iZWBIMuYM%!4e-800i83#J ztx#fHDIz4QY?YL`AB(A{*Jq=SpTeJV9_x#%ovP21HIAt^P^soikFZ7@sC(YC4TgRgF5{xj3!OnrRvI=8Q!qIBCnTBmK>wyiKdcu-~r zzFjRN$nWg;Sxv5843AYwvg7chY+96cU5*QKfphaUeKVgQXUvFp$}CoVqN-_xN}Y*XqaNih`hudTGczFtSYxK@wb^M6QfFKn4O?RV9~x&4-hsJe4sjd!Dx@v?TY>2ccg=g&7&JozQ1 z26kb{#AU`E3>*i)Dey~7U1%X&(9aha7Zr^+<4HHWq@|}1e3=s1^(G6JUuQmpnTW6u z;||^jI%+>BC-gU%3;HRB)?NzcC%!*H*04A2VR81Md-}L$L{Q*#TI0 zNwxN1p%1V*!GWfdv$3H~jvj3GdaYOUIHSw=-MZ;z?<)Mu?3eim-_Bk&;Wtg!YZoO> z74K4(lFyN=^P1zgt6t+o%;y>Ju58v9IX%PRjG@`cnUA!sB<2pea>;(oOZ`ROoRya> z)@!w{U>~xHEiAAfqPE`IBe`^RhM@JeaA2uJrF$?LE6-pYS$AKEbAQjW$Hv@&Wj5*S zhg(})@2Esz*t%`oGrfTMl z&!0ceMfqZ!Nnv(#ZKurR)|r z*#x~DY)w_BDn@SbqY-WNT+Wy&^XuUrn>MUl_jXyZe$d0i=H}|HKoy@=THZ{FvbM6a z{T-jrbe}=tEGB$0qQ+}rP)ARHf7SUtUz#|H-k&~wYOey&%8dl1t6Lp~&s#YE$b3Hd z_uqfN44BpzdgjcTtSwVJekdMRtQ8j-d8+!?F;iqzEy@z-1ye9njB;#1hS5-%?3Ppk z^jzrN*VS@Yr^!zwqrB+C0aMfJ&pA0p?GB`Cjx-cqIRXJ(L*WEmeml4M z)!1-+UEQiEjhlxsi|2b@p0SxOYoxMV%wq+*k*v(5!AZQ(mWlq7a!p$Qh~>$XZ`U>Y zt)94P(GT+(M>yL{QQP<)`-MGd%qp|*~W z`V{5S*fH6+jP=OOm6dI37%#HiPYmdEQ?NdV8yX+qUv_51*b-}T*i2B}&$L%oLsq*? zP~DARaOcay-OHEowgP2G@=>sCkd>7c*z*X^4k!XUJfUS)Ox$fhKfl5WVk&t@ zKipV$;PBzY(!po($u3LAbgbl}qobE0fGR5;$_(~AiAJ&alOxpE3*WX=!QaQ6&thDJa-%oVr$Z6`$p=>*Umblm@$P#}4ZqG&#T0Ww5Iopl#y+3k6MOc6s*nY0;dKXO0{`Y*$_GB5tOK@=AJebc@K06TLITjJbEoa4<6U`4?_} zLil2D*VWZsh5+%>9GL6Q;OA#Dvq|94Y}UF>k1xo~w5a{KqWZ06(6-cf?`HN_`I=8C z2KZjw-^({2H#jzCE1H!y0Ug`GIcu^)bOMjAiefp6wb;h(#cV!PJ$}5Qp&^x-zVZrY zRHX=h{Vv|d&fT6Xsx@?}?ui0M&v|;H@~sFH|Evx&mYk7E5f|J_lgxqzDegD#nexOq zVGlw>Lyr`_II;T3kt0v>ZSd`NX5`|1Lg9K+YT!2-#*ZKWVZ?|L-CixTc=Mk=eY%d@ z-&uH;*q9Am=l&ZoNIbNhal}5?mdfNN{n%5-Pa=j#U^UW1zE3}Dd&x9@yLkvEI!aqx zyEG#`U2KX|tIa&lubD+feL4O7($d{qx1Lh|Z!V}6jTsf>=9-(6 z)9Cl}-dA@55U+iA|gUKzN^CR zz>FC)Bv+4u0sF}^3tyZKdTaMH?D@8{Bge-qv>K~nlU-8cZ2R)eh*972PBODoe%j24 z^k+~Me5@ap(2%Z_*!>x4v)7?1ULgS}*e{dFi|Pv$E_u_lv$J}B$1!lE#gm>e1NbU&r9?(XggfV^PGN~OdR)8412r#n>p z+w?r%_3W;cs%rm6o&-J`_KMO@(EFJvss}dtE?)-7esNs!P>rb(QBmRsPxicwWrC*R zRc0(FM+%AcWt|@{Qj+rF!w0vU3+5px35vt_CwG=u=Ni_0{rc5dh!SS=T1xpGnK{dr zMOb&Ye*G$MnjW`gx?6`(@vubW&rI~jXpF3Z>(er+E)H~IzG3oRoj{|Gwm^a7p540( znz0a$KS{c|x!HWUzN9h-Z@KMq5v$&Hl(ET>cHngfJ74(<#tE#K3*KYYV2cxfkOSDX&irvYu3l}a-V&ca@ z$Zd*EEcPPMl}=!S!W`SPG)23+yGwujy_!}0E@U#S4C>`N97JKi&;BWZ&+z_4V&;*_WU4Zs50jcRr}7J!Mef6(pgrG0o~Itxoxkz=&%vcf!{SdJ zU}kaDl4jABy)RtPu_Vr}5U8r8y~f|NQi&yOKmY?gs6h;WoR3}giqh`%7HnndEUE=~%H$%6)t3SSoDU{lm^SU)xpPr#wtQNFcR7lESLyKj zifBy-?%K6g9XB^KGg}}fmF59!xBBVd3m#7T2gZWr;q>wGdtaabIBe8}I0QbH;|@_# zQO#>oySB=+2l~R90K#@96Yi4#J8Z35#ES8$s;Y`=nEPx|}9uZJBO6{PT=+97VA~pP>f}=0VeqYnR@etnM)6uU>ir@0n|>}rlY!}?adUOqMWR( z@~kni`~_tBbMO7M`ur??BwSx$UArw)@BG?0gp(e0|9%bCY~16hQ*vF*@Ol{)=JVH) zjdH;7duRA5wY}Ao%2CI{Tdis-C@AosGJoTXcF>*Pzfv%hnZ-QdiIRFJ`Y(>ZAo6`h z&ZE{Q@mB-?q>f2qusk}DbiSNBk$#% z$JZ7FIQP_uJ~PcoP@C>%NN_dA%l7#3hIAkdHo8;%u zpWi-5mOj8hR4X~+^lZUV3q@N_U={2BkzAfz)nvyJ)<|SC^Oel{9-*?z`W}Xbv5#lp zUhjlF6N)6uV!fcM>o@Gg+OkqS$fE~O|Bj)A51hvCBZ?@NnA==+DU!I3WtsDsnsW0oCOzd z-n(<>Yy7Tf2Sue9Et)Axv2L;L%cGntC ztDk7M92DNLdGqFpQ{Jz_>ojsdWo4Z(DSvgYH_)*)H5|cDED39Bw~xN0%_Q&1-VSc} z2lLKq*y!4X{xN9Ap>Qwhc42q9cxR7PW;;~7^hz;~jH6R8HzUI5?c7>GIxD+-ROQPE4ii76^$ruRn`* zmc$8vKvDlD$LbZya3Lp4%7MHG%medo-@O|tW1JA@Se53Z@OEGL0Bz{Ny?>TD8oK*w zd1QGnM~Oe`0f)H!XKCr(!cI&QwT&iz4g zoSo&jsvWoyq;Im+h5L;Ib`}UpO>F2DH)~SmL^|lni1eX#Vu(hB0Q_>L2YgA12dFd!2tipjKBMP zk+}_=`J?W&N8QU6!>*LgT49LLsdT*Hxvz+bNH2wVPWl@Pd2ED|N!DmbWS3J`BAl5X zf`~mwN3~=7hbcNLC-gCst<2Joqm`Vvb_-Q^Ibp_v-OkPf*B4yax*C<9!2-}z<|UxJ zkE5j#twwO=*DB*{Ls_1ge_*IuO>rlyMe6DT5tNK9t)Ee>~ z=2GRQrH9T|QPjZ?H?F8T^%zXSEP^g8?l3Sg=qNiYR287+6l2N*8TW#z0_Xbulk<}Y zcxT^4;>;wDYFC_XOP;MtW7}k;C<^r&uXz7bHnOZveNVCppTVkf%w(s#C85LGB05%B zCT_NplHDQNHktWGhKBK#=_{JzYRg`p^`T@^<|qe`%zR8e+@4(SfHlFj7}`<8qST6t z3d6spo-#*b&N8K8%Z~;W;E)4${<;_Wy=zVtnyn-?i=F{zqlgcX{yh>cH@TqF0$s~S(Jp-P^nFFnIJlIDp_*^ zLueQp{S$$3)=c$C)(J(=F}JONcK^Y&b;*$dSt;GWfB!N1ZnA+Gl{*SYHd)s|EV^_F%fV8YT)ldg5^m-l0+zh3 zVvfx(9|ZQ-o1R4wlA$^drP@xQKeYqzt{jDwLFH#EksZaDss6g<*1FGTC2`S95OB6r z1W@DJstlY!7Aiq-{u&V(dG|aVh{JtLgAX~CwN}`_i_aGD<55TfKy{2pU6JVh5fwxU zRS?ssO>+l%1eZ=?9=L+!IFKfvaV!wvxg%V!{w7V=PlVX3AAb0ur?Dh{#R@Y2J{=m6 zvj5?acN?5L^G#(p=;&~nU8zpWfA{X4|7A&?gwTWpXALsst~nG*{NMgIX-+LN`<>UA zU_#Cmmc)=Zl`WO14GO_oIhh~R*VhLz2@L_PW}?BrxuV71i09Aa+R%1Xc(gmB_8M8< z+~xH4mviUMv+gS!rJgsCx8K8EYr}?_M0RkVd|x_DzD!mx0XnWLcG=OKb{@J0;NB5W zx2Ipj29=_^S8(cUNp>QV(^HRj*5DV$iQ)g<65lf876RA*%2R2Lqt%i5?O(`uq%Mo^ z=&HC1p(@Q3=-O@zXU}X*-!n_z=v&Tru z3cs3Rhz_)47MlS%L;5t;d$Q)i4ZJDSNrZp;XUBvS`T@3O!cqkOPj#9|r$MjI?U_peOI zLNFmr{m)*%ZQDl?u=2-crKRJUU~Wi62q)t>(&r91ulSW~*G}1ydv(pKKn7YNx$(M1 z&FNvIWX1q~Yg7}OEi<3F?8x>8v|~lko!2~vxpHL7x1Tt1;xihy*ByG=YXT@>^5TkE zLs@0=R10iJK^+4?^d2Q1%W7}@52%@ZZ`@D|fTXHZPpWFmB*b+u!VG;rf5p~e9!dLz z30!h4v92|Ievze4-yLtGcZ5SVstNOyal1RCxbbz~+`g|IC>0hn0o875SZHX;iNCQv zRujl}KxN$gD+|1i$|%lQ9>MX@8S)21$ zm_|GmeSjz;ScNE6GPS*SK&hTVmo8r}BwQxyq1u`E+wI%8UsCc5l2`mLh6__EAu;4T z0vM2+DJ1?D!#QJr_qK+prU{gkz9*M_nAv8AGjZI`GDL(v9e zhBMsL%j-mIlCZH*j1;H+l|!8&;?!yfu0$~z97-~#;9&aU##PX1H>mjFFoj#@rrRMQfe^&4UAuR0 zxin(<1mcEVgZ_!gIbrEooy_rR5Rvr0Iycq@2}_8F9Bbh-f708HLH=iK_u8`CTa5MyS#32)KJi*jXT@~lY%{Y0iG{LFR28Ggb z6%29nElujTh^jd%MxwIOr6P6}INIhUqV_Y-p)if;YY$N`MmkLM#nN&qge00C{jTHC zO&KI~ugL7~(@f9uxl>)@=IJ!!t&Wjo@;O&_H(IuomG4uvG z>eYyU8j_bUUCQok|ESY+{jcdTG1}(42;OYW3@9ZEon^xewcdIT3PQ#SS=GkCBA;KJ zs5}pL!i3g1k@jh!fm6q4iZo)>9brnU7iGKOzk7FTvya??FJSECs6RN^VH;Zer~9>i zP;i-vu}kc|<7_Y9&%|wNQ%cMtXgO31A)MWsDruwAnYVuq(CJ8qe^K@T<)eT;_rSA1 zg0|LD1Om?3M?pblHiAxb!L+qQq$Y?eqfa?ZUw(pw)h4`@^fQ_C+KY6EXK$Kv<#9j ziWWNL8rt0P_V#A0B5-KvQbV!p5($=WpaI}NbFlA>0jV)G{ojIK&_m)099OPBKTatU zjfyDr%v)zmo&cAz8Kh;P0m|mknvWqKe-PZ6JG#UZfatcN;C=rrLrwn_2!FA_5+(jF zoF3*~ffF{NBhv>R?rJ#YLbL~1nLEf`o0U}BGgl90KtO3G1EP4Nzz25t_u^O^Q%V!O zG_rMe(s$06sQZbat1~8R_`mgEmvCw-ToB#Z|2ZG!502UFc?t^rrU|0TSBMq)Gj2{J8LXl zZQ;V2ONe}PBXe?cVl>6rZG-Ye;79MDbqleZSs&WIVsdDDrO z^3G{fryBH;jPXK7TU{7;pvOjg!-k7a4M&aJgc4b!NovuIGIoNLQJn2D6)_LOIf~*m z^{A-M@^6+3-80Zlw^gUY3`W3msoPRAZl8a-};85QqLOP4N#a96FDA zgta&CpSU@)YUasHtvb6x;pz9wye69KN6_%d(dS}y+2;-zerys!j~;w zTJMkESpnV}susvjAFoipg`s5>F}Fq(Gk&Nxx!_Cs)IlqQ>vrmkHNq^5O9 z6cD8_1iICmp`m6LJn%F(@vX}r8OBB`gMx`%aN!bo8_&FdZ2&ggF$4ZdTKe(V5cU3= zbo2m9U}`roBgP4bq`$E@Z7&t&xV=ul1PK+ zX}j71nYRtx67N5B=*W>;>LzF%gL8^QV|q&*nt$~fQ#_LQ2RjU0LzDR45wvK}LgXk5 zGh}_I4pF0a4DY#FLU&aGGVEROqmcOEg&>_xQ0|AadqUVVooYYbHwt!0_)R_9LrreF z+X2*z66OAnA3Z8k!dZnnl)j^g59m$sKlSgl4nviOHrZnJfy{K~4Dy>bMj`!!X`*Zz4%4Dv8j_SX`Pwv3G z6cBV>(ZgB8X_{yLjntg14+&Z)*hnEZ4hNh+XEvss5JqdAu^?tXWJ|}Wi+mdLy;-}S znymjD*(ecC1~`@)-TgkM0r_eUo%MctQp+Wn=!UMvGFpQB$o0ijWA4az#d3RN6>=Zz z+nh?|4550P!(h4Cri5oO%TCKNtQUK*zlkH{{~?2fxlmWIIwR1y4JhX4jQ5f1{LIxt zJHR)oi)7!@6tX!qWVE!AzJ9Fbt6#@>lm6`zvYrN?D%|wghoLbK8VS+vwMies8@_wP zh7G6Gpqf&Elf)VGuBSf&Ya8M%t-q5&_YjH&QjUw;28g)>67wjt!*B#ql<~X-8lc_B zf9Z8h)`yRD!{g2;w7eDZb}_5j0M*Jx@@1?eAHE!yGfLtfXxr6jwAq?M!oR<=#a4>i z4E?l_mNE+$-me^mqXV7nfoisx7ZQacvy|ZTdVy(6`d*Ed{e4_<_Eo1!ky2aB;u!1W zkR@bw!04!#`1g9+N*3^-%^Farx28kJkaAvW2oVZ%wp2LT0deI)*e^W;57t51}n2YcSdZ2fTRsg(<(EvvD4b9!EideAV5CqN_o>U4hx3qTk< zEC(l)SWm}=e}&@Bpd$8Cq&S9-x6;r1-~K)YespV9)ZCkWeSHexl5$J9Y&Lp$qZ@fy zx575vSbEV_)b9d+{Tp4XtWK|0xPw~tkwNsyYNTvh^mrzR{8QqoR(QbM z@YEsH9ZeJ-O*2W2q2BjeeU^Uo$*^KJu9MM=9ueb#Zo>?v@tc`A0EI0lclg; z$pf%v!Id9653~geZPeBlLE8uJNKIjYHYWibCG|&}^jPk9y&=N>31|aO$cKUM1PYR% zw*TBGUUM|X@*wAMrM4rbRa?^wZf=VY!oGX3`SGigEy@`>IZ)8Xen(8!LnL82vWMpH zATVbvsRPE``&;Y$!cDRNC0D3cV=AEU6Q8Mk-l9lzRFM34BJa5bdl^x}T+hE!e}A;q z=SI@XsG`XwkHxYwzap^uuq-!@3rhDaiR8Y8vJW_y6bWgnkvI(J#n0FbPl@@PZan9A zR|o3U702>F(`^5d72IUh-opy}dmij~Xy4IT?63waHQ9&}iFdVB$~wSCUCzP%(q*xF zR+hSk);o&L*}a8C) z;q(7ZLI|!)O-WJgCT*84C@`SCY%l|!c?E@qLehFq%KQlxxF=VJBl#poqqgRl&Hw*N z2@yC?vu8hePAHJAoahLh1ISHv%GdrczmwJZtw1{9twROLHE$@0SV(<6q+p3~r1qs! zyPkgGBP*rgGyvqbtNAB0RQYj{M?OC&fje7?i*hpmrua^Ghgcp;3y#^If5<@FL|Lm2 z%PwAA=nOPrB!FETPE|hNSf|r?i>-=P+(WCVuOg-%eX60r@LLk7C>jkKna20ZzO&x0 z2Px#Cl$6vg(Y0H`m|_z$hK3u8Cn`Ac4t%3YG3VZ#poS2MeCtrw0rE^V_=_%KEA5LL z?Thf=DlbZ?ODUl~1{ZDy&A?!BFrj!=MNDH%T?x8l{=mgnKLEvsq1-d6|JEgHPC|YT za!Y;x-ofGZ`SGSBC(N?lPqu}LnD55%s-p;8{A6%U=vtiyhzBj9iWM|i2a$9bke$Y> zqeP@aDcEX_mk%RCEYJh!F6K9!trUZZ>@iB0REQ!MVtivB-+KD=WUnf}NWS8=kov4y z$|DCt2%(~UyrvF1EO-9Ad4>p6Oz;}Sw0x+g!>NLXw{o~dp!ypSZ-S#`HmEN;u0cdZ z>Mhp>ctY>pjXsxJfh&#BvK_egj}p22+HltQN@`99k^yJ)F=Cm~81XoN=k8r2FhfiL z>numP-Sbk%x%KjrLGe(+Z&V`}BiigY?k&hATAmXV6Y~IpQ^>jQag+>I3w=uDhpW(2 zEa4)_RQ*vL*oHv0xtOx_wO3Lw#>ZrcLRn z*ajSZb%4^fYzk;S4N1>`%>??8Pc#Ymf`QU3ViOH{(-nOoa?xJ7>9*mYjL`xsg!#H05c3~ z*FWU0u8$)lBOM{FSY2uhvSD?U#vw?56?-ei1uq;s>+=>Ib>i$_HQ1#g%majOag?^b3M%fs(9`jb!N>BRAV$<;4GV8B*nnn% z#=fIRj@T2u(~uWqeRMNCP-{4%#tYWJrv`Cpgf(}x=D)z-A-Ox9UQcKIP1~vj872M0 zHJwWB2AZxxWgt}H@g^`_L-Eomkul>g?pZKn+1EGuOBC}8hJI?J*lp|i``2yE_u1&F_cA3BNy*$|LkU;i8_YKrbq2ok{`Fz3g8&js{J=)gVx*RxT zPnK^jk7rvaD`=IqDTU5>7aG?o>n8A6KMTR?C5;^#A}rAm&zS9{WrScnJqjwxxQ_Z~ z8KKHhT+YFvvu*jBqa^%`&}Mqa?h+D|zs3;}l16wQpOra8;vC#!vY$r&5`yXN%XC^?fuv>L{LW6bnK1mP=U@r9Q%Gl& z&{=Sl)LYMpPj)M55cESF=gaQUWk=LO<^O(lvc_`zDj(AxW3U*9z!&5&3&9^4Xc7!q zLGC*Rr`i`IoNC;C@4jZXz?e6hm10Hb#8wbRw;xSVV?YSbT4^k^ASbXtKTuj=E@JcGgo>(Rs&b?RL~wcuq_{e#hg&vT2RwJtX3HE#q}7oMTTwrRvNPD<7kw0V<;p%1`TXC?Y!%u%*zRbz3Rt^Lt;lpf4~`FToL)J{Z~E zS>dy>xtHfv@`?siB)1zE*;0&ZT(gJ#C=v!F2~`8Js{SL zozX1OSvz}@z;ZPD_`%o)7EA6IIUm0xNPD|+$HW78W$XkW~s8T5}RJ z!fb=tUN4-{zX;gzaOd%UoWPF9L8Rud#R*Ohke%&+g!4>0*=)AX+{rDe+N`Q`Li}MG zM-&lkf0#Sj^$>3)>uI(><`4?Zb%t!vM6QOb;2DfAR}RiRd;(S5^a`V5q$#X{pGTn| z%vrirQPH*v;sb6@X68h6r58aea(kVwZf+$c+6Bt79?p!co5jsQ_+?4BZ`9E-?!lc2 z&AyN*stU^(PiFahYv~2xHx}`Na^JB+D zV{Bat$$7fYrcH*-aiS;J?e>pkZB0b~rfU)8aE_;NT67MMnf!)g6YRT&9!}ns8bM}d zO^dr`cFTG=vYZ=#K1*U5v+~pP{8!kFL>Zob)!RF_v!mlU!sl&|HM6}?a&Of&Fo<(J zCEouLbUlmZ=1L<>9J+q~i>2Rm@umqmF{E6Z4P)-07NsEb&8!Yz24!IW=<(>$VRR2jdl% zFAo4*Dt3l0K^h}WQ;70NfB@}|*On?MG@%phb_(fUbGDZcvu8dj zu-&Z^J{!+(X6@NqT*Kq>5Czt*M>Gh4ldPYsvHJzI`0sG_!e_{Uoer6pydj}z;;@qx z2fA7>_4oIy;@HJ4fSo_$K(mVVHTD@9NKQp>S?t-nEA zJBn-wg+!wTyoSZGs$h)rD0Z_MCn;=0kashn@ic}B?ok7B_zZE`V}IBr_$b(BDrG=uyi8=z>{CF>ApCqw%yps$hjAdMU`o;YbFQ#!p~M=>B({8GDdp_ zPbN|CKn9MBHvtzm`QxIP$;zW8e#JF55zv&EIKVy!0F~G{=A3v|d+y|_uPliXWGtMu zHLYLYo1)$vh($L>1=kZjU2Y|$p^WnAO(X~yX@qvurs7yrI`XS$g=Zv2TuQyIV>is? zw-q*xbF={HcXYt_71G6HAmxH#bIKw*sV3QOY}oSDUX`mz|*xfLjgs^$ONpgl`oAniXOx61we zc|49@zGlYM!i?$nVlbPgsQ2)f%#5KWi*? z`hwtV20M0q4#27LFmfM3oQDyr9p_WxPV`44Z^mimHXxfWiM33~Pgm0D!DSOA*#r;3 zEzV%ZefPv)0<&9U$g>sI+Vy_JZgb%!j|!s9jr$=KZpoq>h<0Lik5$*$4z3JKqrkUV zNsx!vR@s3f5zmLTN5Pbzr4HjmG7rOxk;rl&B)9|rC>O=C3mJ#!@nviDajSkfrR#5wUE_>T70~FB_{d z{YIfCB2{l@N=iyT13xU|W{hA!(#>EImRxaJS(y)xJUTnVHS!SfF5p9HT%sXcp`y$s zvyO!zp9lsPi|kk89-@>sg9Uf&*x^tDp&vaX6-UVpamW|dYM|c+fDinw&jK&4UpKQj zkIKlHhkI$wRZ}|oMN0=dxUZGc4X*k8%fVA%=^+FbP)faT zz|lE7C@2h~DN>=|J|0OtpDg7`P}~*>@TIQ5eECwITEd?REnr$d5EGODss3`PE11dn z1_VUXVREU_WG<(XGR7CPJkzn~GW}48c5Nb?L8JT_c1fcO3z8R&Gpc|szGP*bdd4f$ zd@~yT1Qo(uTQVgdIBop%=S%sJP!Xyzqg|0$femD_+R8UWL#}(`L^uuzZk;dY;XO;y zLIOSfNU!qpy^Mvuvzs#ZkF295LKy^ynziDBgMV7SY}tY8S)3~XorQ4_b7B;yv8XkP zakE&r&lA4zoXjK-L4T6~Gq~Fbn2aKL6sJCSFfrP;A^yAL8J0#BuqtP2^Fs4IOAz>S z5r7^JRGAOFO;=)#J%W^&icen3cWT#RQoYZ6$`)M@s!pYkg}F~GC{nXWVo#Z4F45TE$GV?FW&j+1!Xg}qfqr%h$DtBEW(eHdOd@P9sz1s@0eWt0vqIS=NM2-Hwln3p9dC(AnHTwx8Wp~Q-9 z1_mnNck`{$pjn1fe-Vt4rhO%EyN&ZR<@-^u*>@x+Ci4UQiU3PYR z_LQYTymkb`fnBj!3z@N|`Jx51i4-RRxR@sX86wV0Y^h0Tw13;_)2DY}#~e^uFSVKi zYjR??*iM&3DG;HRSV3;rh^oSsp17D%@28XA=qD>gC83Ednb4kKsc$QOm*l#%t017V z3j+n+fqdlk{*U$P-Ke`T?@p$oo4$SNOhapMusygpknXdJl!YDFREv~$y-lITM9Y=? zP-f90dlg`W`AF!9R1%9B2(uDmXfve~6>FGP$3bXgT(qEJ3-#tUe}8{NIM8AQG8XG6 z=F>l|g&dI&mH()DV0R2*h_SeRgmX^Vecff~s8xa0qL_91iOC0RZYBIUta+KVx^45G zW4QUq9^yA2v}C3H=;V)6Wo4x>6d1craWaoJ`U7o*mWZ95od~W%_^JwxAiEl^pIHDM ziGBGvCw3KUD-R2aL2zP89A`#!IOO?rt7Lui_#Ih=g$@tEuTnqflN~SEPwMOADwkpnNxn>QyPUFUhKmhl|vkt^bz`{!diQ>Lxbv$oja#v(oe1*%X?C8 zZ)|Lwf!mzkCxfDec?`d_asFyamd4IO)RgpZOUya8Jjzl{PHyYZv6hWalyWNV_QJ4C zt{z$%(~3J-I$#cG!Iu{iHhk*E?6JP|7%WV_grsD$Wi~5&BbGH#Ox;-p1czg1O-P`T zx}sv21;W9`C^YZg!s0s%+HWj7TFV^lOdC~7nC0nim{bGYpcWev3S4*})Al)pJHG_t_Dk{;JEhImTwPHxNe^D zw_MVhb@~`x(xpvaYkI0WjsdM2F^oZUd0&GLy~kEX?IWzt-`Cec-D;x7qDT5sjq6}Z zI_Bo)xDcr3BEItWW>i$?%|NX&5Ug2q&8@5*E<)m=;(-5oAS1i+A>$o5&K3eCYF!L8 zeOqZ%EViGpHhEGIt`^b8{Z1%egGu}Cjfz0!H*6fbM@cuc7{G{pm_`m)ro9Lykm!#; z>J=j?p}D>k>9EXro4)=Ei-v+_%zK3r@yV?cGndJaeDa&hbF@VXc0NY>2spI#1}=_j z-bE=OAHk;)lg<)Z4D{I zdAM*ywmLFe(5U%GVOJ2CK3ISj9<-0}RefeQxAlySO5Wn88oLY}R4&cOj^6m<$$Bw ztR6MQ=Kxe3X9?W!O9j2`FpL;C63{Sw8I&r;Ika^5NnU1f9&9s(Zps6D!)Zr`o!*2{ z)zMjKZvK>p^yFt|NYj6Ty;RY~yAgjyOxYRGzZ~2Ry-=7@{7iqu@R>1VIPKmHA^R;amRRVClTqV}0eCO0yY&!9wU|=lE!7lar6e@A;+78a1?)F)eNy4`W zd90<|jEsyN2y#(IN6m8?tM#d;9M^eX8+_{*@@UThu>uGSq{KXQP~Py@+}dLKlV>>- z3&?bO>6X4t@QK^IL2CccMLpl1w6x5{ovP2xkl|m+XQ+HcDzvpg2{eU-X=*rKv5s-2 z8YaU_44XP_n(6?0Fvl8DDNvc&fzb=U|L`Hc6yZVCBiWQ0y~#*QL!7ipk8$!>WX6nz zP=Pj4pVdEeWukbeFuO(A96CzprKpBM9g_23B;V1fTBt~P11YeisHg~7u8WPQTYgb`H=3u9PfTwk2JI;`$aD>&Qda&?AxPJa=)P)0casAa)<(fi`?XohRtq3SQMZMFssy*DbdU>8h(E$nUs^bpSO`*Tp0v6E_ zf)VN#6yruipE07teJb)z z165)5&Mi0vR^WU2@-t9bm}DCjbyX{EZ20?eabc((Zhgu?Tf%@&3}K>^-Ph@gsX4xI zMk|VkCTY2Tu!Dp@aEg)Gk3T9}LVH)#dui|ScFI=?fMlEgxorz3=%jKda2V>Y4SOdpy zIU1LSA+Id+q_*-i#npmTgu{hJOgM7)}@(21S zaEj}-8jCYkpG?FR<&Foad_fD|$Pn4Ymf=L0uVdBU8s-`Lw;)0XzM(TrbAfLZL(tRI zgTvb!7)Na01!J4&Nnf>tpcK00xfBf@(20-2`Yb|d!wHeMxZm^;>i@J zBh2Q|W7|tmtv65=*O`@S0)c3>E#Oxh$SILQa}FRIbVnI2A^P>pmq$)ipP z*?VoFGwkaLbmC~p!@*7=SqKwRvVUhrM%5$YTOp{FbQ}Qa2@*d1C*C2@hW3A`o2?M4 zERO6;H%*onvst>dS;K}6d$?l7idb|;oig2?fBf{x>LBhmt*uYDTgfaMQwiUW&S<#B z2P)(25^5;rs>4qu^>^>yi~)BA3BQD#rY@VZq8&5_{4Za>9%qO%jViK|aZ6%7jE-ZE zt#D2>)(mZzKvE0ixt0Hhf+ntFC{fm~msmo%lp?hrFtawc?{ zuw-(KOVUrc^s$kUA?|&6`Uczvi*>*3+&q>^5ViNrLDmA@Yy?{+;l73{xN#FEgdW2t z<908XyQ@ce#nb)Lf&SO8zo4|L2lU8Xx2JImu!2Km@$+;LSBDRE&2$f?R$Gmf&+{9@uweAX?`WP67(@i- z-4<7G>hONd{)qVP?11mGR7W06@WC-VEygmYQ?yGtNq(=1OfN!6kB_3Y?;yHG-mCbY zVg&Fv2dLybH5Ns?gF1ri(ymS)LVfXvkfp1%&=G~JG({-41i%J+am7Z7Id00i2n+$W zp&Ao!I2v%0J(I$r`nd7Vr&!Y%7^~zeMsk=ZF+CmEHu4+0y1Ej<4LkrwMuB1mw|z32 ztVVS0t*kT9?!KKrf4-U-5gait-5qG%Ob{AB-d`0r3v}X06gp{mOky$_?Ai~^#sMBz zeDyXiv4p$YK!?~(o`3NaivnH*%A&QR%6@Z_&&^n&NNu!OwHkJosBTQgZ z8B{}nM@XLSmD0+j&1MPgE=Shn|Bwf!Kg02=yKF*OF5AaJ^2O03UE*j@)+ymAkxGp4w%xyckS zWp%{uCroB`p9CvJh7sr_Iw{!U=?5SxFcp1NZvd$<>;!9T63t*YrKG#pAUINAuB>eT z5Y8ky)7}2=;U93crn&-wH3KBJIa9c>?*D(3op)GOXBO_aF~%esF?J;au~#r^L_kV3 z_QKeL9izl9sGulCPGXBe1;rW#R8+)9tRUU7fDN!Wnt}o%MFHt>e`^EA%*?&dbMwc{ zqry3Re`S?-z3W{9Yad!G8#ER}6e8(2z*u+{-K~)=LpqNaJ!UV-Kj0QxA#^myS-q`l zc5gAl)mGP4LU0`ZFzVb7Wu%7(pmUB2!uuinA#Y3@ur&Zy$56J1T=#&Jx?w&pK||?lqJW@s z-^bHT{KjO(iR#QfC&8#yNau6XZIMBAotd3|68WP<)g&teB}r^CN>~tLunZ-GhdP!$ zTH^E>@V!@N_^jJmo10plnl`!G@LY{`pQX(FLB4LZ3Ig z2P9kjLG|jK`yFZ;udAzD6WsQ(Mxe@Qr5IHxi|3K_XkKlArptv^zpX9&%S9ql`ChVl z>Nl4UIFCCF#+M}Nwt%SOaj6q`@P<}H?0ZA%f} zv{ER+3nj>*^X=4zoRTmBiN$zW2QT^AmB?$cdI(}VVAn04p2ZKe`Qs-xbMvN6%>*B; zIemf`ljl1Q(D8-#U#KEIN?w$hmrXOpyi8moh#{%-1A_iO2ii&4?+A=pA56h&-D~9S zhIcsOTc;YYYW?zTS%y@3h`3v`PJ&E@3q&QTMJ&87qu_r<22m|vDG@Wo&LD)m7EL~y zjHH0_M2h$^!vI0E5T|_&m&@^z_?3es)&Ib3&8#DZ*BPWbN;1{+s-x6fu0He}dFXRC z+zDq%)Hy8Ku_TMW$8`6RJJU{Qv|M`sh$dGBls@5WHL{WQWFxnL_}sX>LF*Cm>FNTZ ze7TloRfhf3m0&@hPUuT2RLus8X`^~`X`@VYs|c(rOq0!%__+9osuI*-Zi)qE1jg9$ zlO`2Ec2R$`N&ux8WA!)H_}^g0G-rwbVJ%%ZC@rhS(upJ7!$can$clz+HHlAwccYh37v<5;~44hpjCIGy*Gq9RC(NvVd<|LZizZwM} zYa^!DpOiN3GoZ-c@dC62RYq48>n1l$tfTC)9ZvGBSx2+;;qx+j;_0Lw?<=jV3ayi^ zFE0CKG>*MRcmmAv`x~~fw#op;uuM9{uE-zqgjE)G@E4&cXclp{;J{TwE-k`83Rx3g z=jP_(%&x0Gl9)!~1kL1+57f_#7M+lChy2$-GR72pl5QRA^9y$1ANWr*_?rB!)?ez# zA?2@PF)!uaYaXPBntfaUrvB{R$sa=-d6Fi{C#Yo^O?`Z`{HeNB>N1$UmOq|x=d?vV z`tXnP>4$!=`RZF@96Se7^#?K-Y!~)+h*gIs7qwM;LmnbI+)SNKn>RPF+Uu5YH;aat zKb}b~ab`qEuNf<9Amdx@*&t>`fIxd7ds<04$RoPJ%q+W0MPt<+4k!hbA)}eRX znlGqQzu;GuYR8&EwVQQ|`^SG4rQ!=dPhThKeUL3i4QOTD{8_{p8Vx z+50{jYEZMMz1%PqN^c1WSd!f~cSruH3={B6)36WRwTfJ~szhi2?y7%b%Y=GrvA%R~ zWXaynBz?zg_E{}bTYN^n*{Ei7$H|K8HMo`SXAT9FZIrcB2I$F0_jo57<3cYe6XKwD z%|B|%Y13;^LAkw{thclJox828c_+%5U*)TJLUS5~ zZyGz(bsE^HQ6nEU5hM0EC9l|GqtyBV{GRrK!l+iO*-N#uHOU4BR`;6aD>suT92`@< z*-?>VB>wvScDA2gVo2d^^-1@1|0wFSNTZ=AP%VX*=f_1-3McxLSDmz7zP32BmX^2g zSq&?XBO*0ECC{1A^AX(L0_X(QtEL$&tEMrZ=iuOQ6%tI%>bk2GfU0BA0)#-~%}gID zK*@jk5&~)rUOuq0P8+gm&A+P-o}WANQ>Y125|;ne>YirR z_dozYSFh?YN35T6E0m>xxw8*sB8OXBb8AxaWyvS?`k&Mh4#H3BKQ9rs)6JVV7edy( zie^(EDRd}}hd>90@91~Hgbh;R&`ShrIg?=@%Oj~6P>Wj?@{MF?q2N}R56srnu3_57 zd?wHJ>2jfM;r4+J@!tDOtdB{QJtdYAM>JW35-EZD4I=Ah}ODBpKy*|G}-db3`4DQ z0pu~ChSU@%KBKSnWTkEP0V%14$4R%=Q~Trc7p5YDd}RnE9H~cY0@bUusc(?SjGun$CzswF zQbE+LWvtsJpe}pib-B_|(mmpu$Ge32gt6*1Yn=_N@HhdNl}L%X6hMU*$Fh4a?93Oa zl4fG5lVnvTcvcQ=!zwA0pUVs+8){9-iy)%IjZ8csM|g6^YJ?&jp=XZ5l2-`->Bx%> zoxCDsX;nX>cbr=KgBC4XoC@O3c^boocli%yZ=L}QAZ+gHGiDf)T_df>`G5Ipt9cksF%0J-lJVAu&r@5jA!tqtSMb-A#8<&K|80v-%Pgvi!6 zaj34q#GcpGBf_cmLHT!+>ImUd)Ra|wNGy4t&}<>uoVwA&I;#Ywf3RB(?&pr~UCCefVC*9`$RCC_+^-mc~z9Q?^SY1_j0R^pKsRve~?AGS@Xvw`a zS2J>;m4pbCd5+M4l&!uF=?n@|U6a6w%Q2n#5Ngz_RVCRnF>HeHfjv6{ zfM1b|H67D?+Rtw`V
  • Sjltb8Bt7J$n6PtDh1E&3_Jl#EE+i@BuJpst?yl2#qLG@i*Uq589e^57@8<6caoEn$0NQe4FaKXIp4{ac?PII-n~D1;j?k~)pj+n z>a1hX4-=CeE34v+j_&SKe{huh+LdE(clz?q?)`2f)Bbug`pAP(PZxFTlX-6MdhaLU z?Q;^pO3H|h9hQ^xsaau{p8g=@@M-{VCsnH}UtMPA^`&|4z4-U(QnE zN|KA`uYS^R@n)UkZyI?--=1+Leblu&vF^D=Un%475e{TZ<4NQRKM~r z?8jGfZxhy0jlMy`5P0#T(Vj8>^~E@jAJlC}$T{AN9`Oh%=1x(W`^!Z5O3AqkAJ>#B z&_=L)bz04)vs+o6PH4j%`MzJjpAL`f>YH0fvG}ayGi``qX%AfsXmvOi7#JseCCZM3 zdxc$w&dgpKQ}L`2<>$EkeME!=Y7eM9--pl-uw1 zh}wD5WJdc~5#=wZC)MBZhBUK*JgLwWnu0a7mBoFAsL|c&_?h;6Z_8FdE zS9YsoF-JWw+lueI78ubhZ1He7HGq|Fc(wD`gx7HHTgyNyO`NKZ@3jg4P@P9 zH`C!934J#mkGPOkx)o033o(PGEw&iOv-OFSCr3AAyw8`3UJb&?uxk$LH&X6Ce&IsD z)1>D!xJr8V1Q;g1v<((vEl)p}p2E7U^J;6huwO$ZMv=3TwqM%GxAN{wipB-p7pdo8 z+y>}amr|}D&?cnw(2{k`h&&?#LCUhn(y%%a_t~BMjoxUFJ)m{Pg77^H9iigY@+|*Ov!O=q6}}i>Nv&xozwqLL9#%&8rcp{Fr9om4CL#h*6kg*s!Bh%>&cmgTzHQa?bYA)ICL;R@W z(}+#8FCb6oa@}w;f>K&SykN1Xk_V0&jqOa77Actn1HUSIr&=WGWGIWVB$|8vC0W%z zkqjtd5|GL)y^o8jkL;@#B<8D-{dTZ@iY5VF1N`Jug0!7nmsyt?&HX*ssFhu&*ksIG z!-o$ZbmS#-zi4}9dVV9v+G`QBTNmACk87!Ke-T-b)%;S-IqD!=co#2l-ib7sG*B(s zMb(no+(&Bi9HIPX7U>=bU#}@QFZY67a#BC4M-vIy>4RZ+9M#=f3eDAo=H=TP-@RML zX9thhB^BwxOj7T6|KUTOwmLdF!l+GC z504D%w4OS3Z>u(K{uC~_vb&8~ov5|Is*|-nqIV^Qd8{@fM|hG+v+`VmZjV#49I`Gd zVe&`|S=(Men=RKh&3)xsu$6tV+2CMo`WK|=hr}MihY$Y(aILw1jc_%lq59L$`RR&j z5IeSVfIeN`UJS?f?S~NfI!^n6|At1hW?h|ScJNb0&$&3K85Pr4z!TQ*qUvf*kmu>d z^E5pk6jU^cQz}f$8ao0WCwhR&rNl6gh$}Sy1ON`cxlDA>o&}rgO3%m!b>$P(vv=m- zSZ{*w?^woVxB6(Am&fz@ z37$C_8S|!6k$xZ{hy+z~Srt|9Oo-rX#7S1sYHpM$TiWS*QXn)y`5dxHUZ35@r*Je^+jH;rpm$iAz zmNAj5bWQ&p)oE(Y6|X$%LG-=1hrYhg9Wf#!4!cxhi$}FttznHiZI&x_65wiv_+?8= z5A6NqBcY*XF=(d5GBD2Q&Z9?G>Wrb3d{M|(ykus}u0)z=u!J@nsZ;v~oIGh-Dm#KQ z_bggZJGBg4vfW29rfO{U(lyM4x9{=7$98v~BAxYPO1AQ+1`r6c@M_aK^%kYxS%O z-@n&!V+y-5;sD1CriV;u7P8^G!Rxj;n8L5+%z2LAqH7-UMvWynrq&cbW18cvb-BiE z_h1#;lM8C8=AxCBSQx#|oTADow!(@tGwP>I2dAUN*Fa?J2u`128lmY7!XkXtA);KhYu9kw+}{Iv1Ed6g}$43{hyiSVXCPwT`=Dg)Jx8~;?E^wgB|;F8B) z-l0NYp}qPI@PKe~l$Ag{OLS>9X4`->mcjpVitywH!NlZh63Y_23?e+&c;d zazLO2h&$(53lZcT;ziI3^!|0o7b&)6EINTa>ItqughS@IvFeH~lBgYVfBhL@lO_nz z0dV2~TROy}(J148oD=}Ym0cXPTv`Nv*ifZ%6Trj*sF5rvI( zqR7NYnpsm;3=Y3c#MeW$X2Eqq4Dwm?$hVyDR4ASS-3c%gB3zxHNyHh>$j9THMzj^E8Z=f9E%%h@I&pI+TR z_wMbELaDnrOiV$lDqjjdUow{KGi%(}r7&!kA>+KeRVz_gzhzsla-8(9BR|GdAQ^vr!U+**mP=k2w) zWSut9Ll}7$`GZq`#~ge^ujUe~DV?JHbNnPxF7FB+@*%_^DT&^t+Kk;J)F)}0!Ny4g zjw{trEB4?-@A72k1(vaEf5_U2hO;tiu=<(`15v|65Ue(kgaLoD``tL%aI9>Rb%_)w z{-o?Z84_T-!G2@*59)MfmRU}H&8WQQ&Djc12jjN%Dm_gxGafaaQ=Tnr1y3&Ww7>t{ z)#`~35CtHm@$RyWUWF8y3KyaIn?fJW4JOD{(f9oMt-nD8i=Dv)R6tA^&X?$h=n*Kvj`Nun{SdMtDe(KF%wY!R9LtfD(VFGH5VxZ(k@#-zVZ-LH$9x|jUkgv9!J=y)!Ck5|0g z41C~S$xw;g-vuQ(EgUWHrc|mk(xN)#W#TKt3D5_v(0)QE`59tDCw5#i(-LaXQ5~Mw z@6TrqSI-ED1PDgVxWvT7p*L>cj9dJ-uj>Rl$>#=Nl{M@21$+JEWo^hKGLbt(ZXDeO zekP%{c$BCPg{^@N*V_K}Ki%4RtAE_H-Dwi@oMS6~wgtv~2oQZ*d>v*WQ;ivdoz+9} z&1r!Vz+rCCmSb0C35r99%v(86QtCiXwa@3JoLsU;+rB&b&BD3Ys8JtgW&^*4OSE$k!VV&c#Z zRWF^82Ix(COjG)a5&rk?NPeM=sy-mi3Z0AY(46?|zsQ*FmjK_lB#3QFHS{dTFv|P) zAr(0-6&slxq|E$7qOav3*PsDk7v0&@`=2>8O_S~d@F%B=VizpfC1d^xMz@>b1nwqF6tsNx`fRxEQ z&#q0h2%W5ud8-bclw~qdN6{=zH8XCV_g3;tN>Y8q8;%Ru9@kqhn%o{K5+&~oa{(=S zok|#*K4!V2qi$CN19LhsUi}E5h#TTdm-(t6^~G~D3(kF(A+N* z2fb%0te{3cY2y*yk|hH3WKW~+s{nxB@3jG47?&Itz;7X2iTk+#(SK)8Jk-nu>P2aM zt2U;_-jL_`AAz?wTNVq7+5;A>n;<7%6Z^LL%3D#4R7lZciTpiyV!#Xn*ZNY`GIY>N zwF4+o(HI=aPr7L9sZk68grU?-fx-DN?_C9+t{^U3n4bVS}ha)y%%r#Thb292n*qc)?FsmUt zaj0*zQ#EPx2~O%Ue5vZHlpqz7j5_qf%xQ%Q^8_yK=x#OR=m(6Aji{M3tQj8dTJWY1 zeTbzZZ(|30NgMXk#p+|8@P&8?#cO9-#`DAD0&WTtP)RcUW;1Yys1M>qRP0{y@+r&s zVN*vu0#S0<-{DG~s0oPi-W85T%jy+wo#SV@NfMrXG)f&rUW6t>kau~eJ!%N3=O650 zwp!2~@yZDl^E_ZB8mQ+-*`p=|dYxTM%}T*!6NW}M$aE-uE!i1%H~g;;R)14V_1TTG z0Z?v=&T4c``dabmfODrk+7hBz|Mb&}lY*F0;&&3TQfZ}*&{B@9mAIYwy$-I?QbGwv zZyyx;u(mT^geYN|m9cjt4x8euhQqyn3HGQ=2fFwWopd93&{4VbN>dq^q(p5`H7lLl z#+H%Clo(?r=<%$9#gv%`)ibsGOu|qRHX0U!w^M#Y$Y2}e+8QAFn5|ikGhMRXy=vEj?1y4rvG)Kf_ zhTwF;&UcPxbyqyUP;YPX_W#JK||wtoL#)&toGC1rg1ex?g4zRv~Jmcg|*_@cPA zITxo&Tq1KIRtvzx`cmoP2R%2d2RN^D0=UM?Gf6`wHr~TB`5~=s@$v%}qgkZxvBrFM z@1&uY{`cyF8Z1Ie)E)f3x}{%pT}{4}p!wT40IKB}F=E_@3Q7Gs<*hU2jxG_wc5n>; zMd2Q+$y8^Hf_WU^=L8Cot87)0fPYV-8I0Pr3tE<{1oJ z&L>6Ls25uk+6!I7@B;^ao{i9`+%p`$RpjHt{Qyhr$-KLzbxI0k+m~1vVqDVD9F2 zaaa_U3m~Op#Ye31Gy3M4= z_th|XXrDxEzf!IaEmK;}#g7U%C{dRl+{HYB078&Xq3^5t(8HDeuxpC?dAobn078{- zTnqlIMl-nS6Z!7(d(@@xGzldKCWNOaRVC)GcC-eb3M=$wwT@Szdgrqb_;Q&%v^0~=5k+~6Nr$|StTxY3Jw;8{B zfr!C#Frf(FtqFKTs(6?=SCi&vG}8QQT)+f07L?+(o#jv{nwbNbA5xRp0ka(%*R`&( zjm5{#1NKPj7r3)C>a=E%yK6E}{O>L(sB1x_NyZ5wA{{7Yee2{&Ebn zma3&yG@fcD<%AlVGF|=cmxAtocq44mM{96zzKQ~oQz@l`y=E_t04}~>26$+F^g?h`{lqpEo2GRnhOj1pU*l|Cec=-O7ivp{L?@8 zYvm_xd$(`lUUKtOrL~&;%e#GwqpGfEv3C+<{QX(1Lhtr%HX|>l+4sMH-ahr(S01;S z9Qt8bd@KL~hxp}uOYyj7HUFQ_)GGelKC`~lEvjqLsrU~j`tT5Z=w@Mx)Z}7vq?p0< z_d}*O&+%+cOTL}oN8cfP{^4M8R%9r==EDxMhzFYLb^bVkmb2MiU{n=yk(Gx^vvQpY z=lOMDlbVb`*4ul`hL6w2OyY$B{Te714{LW*4F^4&GG6?V(MM18&$a*OmWyUo(+tl# zcaBDmsC6OLPk{W;-{}gHSkEQ!f+}wvd(HPzP!k6?< zP045!Q}52v`KPT9~<}IzyW6(tKcBw2$XIcn1v!@uY z-;iQiq%RUbBm0{a;*fa}Y^ptB*wog<)B=rY zEF~xD_59$Sc_F|V*(5g=%-C3f$hJeS3OojJznhxePU!;?dURr=O69R3Y&MeeqGL z?P%*8g0^rak8%JB(2mr`OdZSO_Q9$iB!NgGy(u^Ck+*(yvIbmb3CGbsaIzs zh?1DecQtI;vZd8J+g}5^w5doiDEmY)TO%GJW_NvEm%l=3fQiXT47K7T%ML89OwD0% z&iI2o!_m{Hm%5S9ZO-?tuSCt28F;32xKz@U)f1|)8b&EOV%RjH{baK^Hw#Un-jvIJ zZ!ABHn(Zq@c5Z5ym6f>_LQxK~O!NIp>9qrjeIjFN7F5u~c92DV*6Qtrk)&H1`7Dza zS%aiM>GWPh{kdxwFmh^AiKr8Y2_@w2;gNCDikLMCe=XTvD}j>6P>eFF7!OY=+O?gG71Bd3%$~=fpzC*oG4hlbVFyt{&5Z z^BnQ+i_I(Fdfe=sV#5g=)n7Kz_a4bc5>#^xq+8c}F;|y>!IHCF~@TOJV`D-HH+&TkhJq zlfh5+CUj-A$a#F)?==}!w2Y>ZhWIF(0@PM3yeSYDgrV%TabDjxDTe zBEZacV&;qeNI$h!zn<^MGUkjs!JRqg@1LFoXQg94SGiH!PYGigNwCV5J`U#Y#jc|J zNUgQbY$qXnab332#Fg@~pGa%1pXU6uOPkHHPtW`^@&y&Mbefq2r^Q^$aC+^6boFJLhsH!6%5@F@MAe9>`35CVH@vqj5#hE|5ZIZ5=7-m0%<}AL@F9}tn*|4I zWyu*3Mcs$=Hud~)do`g=KMEd3jin2=|8fMity!ew+6)dm-QU5oA0F2psmm#*{rf+z zxNWyOU%FE@Z}ZZ;EF;WoZRF`mi&R`#^>~`DbM71*+>%v#Mjhs_gD6{!&hS~Z-Pbp= zz$Ce3%uAFHw#clfNR>zVg}~zpTq>I5E8aY(Ta>-i++yU_-{rpXGVL-j_v!iWPww68 zv+!6V3(s;b^w6PDC?+ob)*gFd^F?{b+`JijhjhY;RTz+5pE=RKulD|;Xu784R_5e3 zLZi*?9Q3RoJ2ctTJY?>+JwC%aNL8U@bisa4^jx7^>P_Mr0^9I%#nc^%|d$NCjRQ)5Z`!ZK?g9_z~A*9S6 zB3tkBRFwO}NI~%fbI}r;tXA=>lP04MIv!dwy>u0Pk&9weD2EOBt=Aa3i&SguCPxV% zQIusZz$%{s|CZVLWM5QW*Qg=t3pRGYI*!D-447~OBDHCC?``bUo`b`JG=jvJ!<^j! zFubVyXW;g!V* z5sh7iSG;84^1Okmd{)ACx()q+nhKFIIt`z8@unZ!-4pp}i&GM*jOq<5!%CdF6T`tu zs!c|5-8JF-DMZobaPV(fItFtg2!P2DH!12xFu@8`Qe-T(!8fb!bQoKgONQ=ke zZlf1AKg{)WMY$%xpq{&_Tre40cL$T|>=6eIY2&F}A07dz97DYw9w%o)R+a)6xPM(PS+0EuxTUB zkXD5S1-EcUR?9ebj|4(}G8b`wfBLvrE~*WpnrC|jzcfoiY6~1|KwAfIo{6fY~7sNT+b}6_s^eR!0X5(8?b$phPFu>5EVR?J3A;-kz=9f0wGVWVap+Ib>^QzRM?J zvXPi&=5H_4)7{FSE)495q@tlKOR3#H>B}qrbo3h0hBr?2TQg|SXfN+}t6P^Yt)8Bp zYstK4`x%ob?=fu5Dc>m(`>6d?g4RfvQ`Oy(1|5mwK#$K@AzHLe;>>r9KOQRGkHULd z;#eEx1qSBcI5K)~6Ua|K5+FqBzB@;2z^9K<)CrJ6Sui$zP)3VRyI8C9;+N(@r*K7C z=BJ{iR zh*ysNo*Np2kdv{a*lry9T$wuUDCf^tl!a%LW}F0kj>`|%BbL&SSjCatKQ*Xl{rdHt zgE)hP)n^A9ZgnQ8xcH_lxvFwD%&MWP`Qdw`s#H-=6CC1s?81Fti;1ByEyP zu>ICjLP+69E@}4Q)!4=W)S)=>5SsqgV^KKvI>&5$k$c{-64iNjGCVvP&us3BVgbj0v z`2QdfTZ8|p5=WDE(BH@D*laXo(vZ72CNZT-P3kRWz&xWx_=uI_3B)D%X^p%-OEtq8 zZ{GA!k2R@N7hW*!HyA3@p?BMrUAJ6)<`{on&0oux_%-Nf$yQ{ec+>o0*u~2b8TuuL z5(ZH=NfssCe(3l&iS1m z+l_6z@y9t-bwekjq$G3et{;O1azWlo)Iy#tsYM zK{AKhC}{T?j84CY61)*H-6ycUH^}gZE@B(F0@giv8@s7uVY!68zSe;~Y7GOGvwZQqqa}0Voh>;yxsnFf)5|pQJh0{P|WP5xl%h$e9VB@ zw~|5bwbN4zX^M@^5B9vr)v@hM1ZM7-GtEi$3tMB(#gFdwgx;i6uIb*6ImvWeL;w^B z$-@n@J_`K7SC4Xg!bgT((E2W4fWW>s#sUMjTQvnq;*9C`3+r(s@ zX$xwPFrJ3Q$3p*RT%7fL;?1JB5(zS-^j}s4*`l!J?^9a!B(y5ySe8j#YVzK-9U5=5 zuvp!%JU*t&+ICZZ+uGjo{LUTsb(?K|w&FnD9FLIbls&0AMva!d-gn;bq5YA{p9@Z8 zkNL_kcHf>)TQ~k>$BG`mHucmUyl(%FA15^af{)r1JzAjEkGt;Sx zZRT6G^kQIHMMUI-_=gYQKcwf`xF=%I689_n)5Qau(p~p(4=C5E91>qwVp{*fW~osf z>G1FW5}gU12v(*L%iWoc_xy9nrdCT=LR2UeVLZ>hdriKDi1+ynx(5-Mxv5xqT$p+3 zx6w>Eu%kM;dO!>Jmm6|^ZT6ru(t38t6)m&i1r==kgz8UJG$+wJo+ksW`2RwN2oq(pUD!VYK8 z^|c0acFc31&eH_jHww2x1)`XChmNGB=jLP7{gUaR`l2JNB=wY1bqJTZTs9O`@gA0ISR*+%+_|7is=r;n>1`7O zu~Bi_HmOGojH**T>k)j^&t&6;C=$(sMBp)WY+9_*q4oQ)BP+=O+~I}>aAGT57(`mi zGTDYs?OO7kRs`)OqD5(izz8`yt;XLD8+Cfi&E9Nmy&E>ZI4R(2M z1xHfG0z_S9O$(lr9tCk+R)@=x0`kqsl*}?jh%dp1%p&ZiG3pz~*k8@torIkA6k**m z+Or?A<=)8uSrpy4eLI^H`^kli7WL=?-%M<@lH%p^^H<8WCM0jCDcP64f4@RLqAPca zoRO<#o)jjRjFl{YZB{v8C38}n$|>sdN9j6Swy1azuaj~x^ySW}Z8#ChPO=QFN2q-x z7hAbX68zmI4G1^;<;M1FoK6>`poC>32XT6$ed}+K7ukIGu1lhpl6Wcks1h}}&$6_b zL6lTaRKZ*O9?3Pkff+jc)7!A2X$&si#K?;L^)ktif_qeYpIKLazpU$~bL;l)!c~pw zr*z_Z_CIrVNiRqC{*Bx7*i}6on#OmxVVqmSx-K>KnGu2o3P~GFED{D=5D|ij(uoK+Ms`s_Xfhk$`tsQf__ZD~m%b<{j3T z4o#u$=k3_U*lP>m=p#`3LKc4U>323Uo(thg-&W1Q#?@alb@qGs@TDYICbM zu&WaaZgdZ9mj3G17R+JZs^%?PjCq2~PoZcZLU<$n!KR{Oypi1Gq+3~b&<5?eI@`wg zcy*?Y;vmD7^8(QLGQpr{!AJcp#J*9%Ojoe_7ea@pKKpq6xpU`E0eYAY#_W|u>o_kO zM8WtvA%*E52hGGmEBc+}bE<}q9GT_x=5%yFRHEMeNaAUdZV~9|<74Ik*lGxCIl`V% zjM5Y0`9^XnKitYv`KKd?4}T>`dG5%O`OD3DEJjgj+|rTjOPoA?y0;HH&dk5mxPOb{ zkkHsW@TC0`ow82)B{39tE6=d)dULC3r>mrdQzvi%w|d-G-$Qkjv5eG3`+Ni7)m}QF zQ)7)hznmo}ft0WAaZt3<_u0b#YI@`PUSZv%ST!fGgWMA-RBxaW9t^M&S$myZq}9OG6C*%aB%VZ813KL zqRJiAQS{cixTL!<;-)DCh(O?0&qH@50zqUl(i-nFU2Fkco!GI~-C#oP)fnZPy=KN` z5~BUifbe?t&;mP;3gbi2zedZ_ze&kQ0LqA3i7*6prxBDN;f<^x04Tl2BTgl&N*&wm zrTRL<1XIkoin)gNdv`3_j2;J%+M%rO(}^Da0w&u{bV3^Pkv|rKpf$z)PvhmUb42!M zv+8p>g}?LRigNuHS2BD8eU)2SM@Q-hD`)eM@p9r5J-;2)$qqrRH*A+-Lm7NcSBUv9 zSRCDKx_m3oKbq0KO|{Qaf`dP@zVSDw!L2NNPo3%fg$wVq2$mevzuE8n%m1*RQM%X= zV|xs2WCO=o*D457c}6Amn<)iNYCZ944$vUTY5u%>#_d_BA8W)WP`@dA73&?!e7dOU z7Ck2Yl?g%TwyYl+nTTpewY0IQuhG%R6_*osbf)X7pvxb<8L@Hb4`QOzGG=BwE@iRI zctyrubARIhir|)Hg0jFMjPK5_?XMpy7HSdhSc*iODa~@SKgFs1w{7(_MjC8|4dftg zk#{X&c6UE%&QdHa0a-LU^QbGUYb3gaUZt=uCt~9cGKZ)OzuZEB58-L}RmxUNMJd6|V4c4l=1b8KBPPDbS1PV4vW+jsmYpsx9l-=_*M z&XslY$puDRjNgcVPY+2~QhAAVae8tphb@x%+S3 z6z5Zn{+fwXjOVwa-K=MH_;5*xt`f2)a%>&F;nT%_a|A*Q5x4Z&?&T$K822zpl;t@6 zYQQn6$4+3a4w0KSZBl)bNZ=E;CUusf9u{`8-W~ePjMAiHz^7IrIj$uK(s8(@r7obZ z#~56Xvomp|3F~xyA>`v{l%$FX5Y-@*za)y3VW=H8S|%9fhAl}?XgY*@Qxk?B4hFWl zhhY!N*oGd9+Y665FTsX>kDK6c%%YH~jpyRqLRcb~9=Dh$CUO@IE>^Uq~s8n_NU z!T*kFwXHjCO42}%g{KT!Z>-@r%MWmfzLx8MPPG9{>dwJ(O>_CMRs4d5^2SI(X?<*8Ue>O%e4bBD9FrwX;e zY%H}Vr>}b77eDLgB)5Bg!`62RgNq&Tin^Rr$A$D!J%UD^D`v<-i{h=uwlD3WC)p%t zg9Ia8Y_euXfF_@Go9-IYRU~t_%inA3FBFq1*+K#A6> z2*X0Yr}01>*GthTcS~eI%lV}USl>S2tk-a};?#?kaj6I7 zYw5=Do}oBSLzzu}`06QYo!ZhCb4j+?*VosL5k!Z6>wYSDmYam5GWGlh%EZ>R0&4ER zYM!ISiwZ?vb11B-@3yudIwOb@ODTJ;OO#_VBCDxKw7)Ksy{=f7U$tI@W!o74L%jAc zbLRL|Q2d+m=<(y-Q;8qj4BmS66HN+D45CgK*x3DGOv`Rc{Ae~jj&2Hb*KCw5BKx&) zFO-~j0dSIA8Dfe?L5!jd++h1_l3okKbp2_;Z?_KBxi|pGLG+h?KiGx9-nf+Zvamv0 z_;;;Xv0@IlT;n6{IxT+y)I2~f%CLFMmdTA*wfjO7MTQ^&d2wRAD_7F zX3wusD0F}M>eZOf$w*r|(8stqEbCNgCmmBKhnbA~&FIM*EcqJFY7ia&cTftp{wAcJ zX1n7uLXD|vIWQH?E~5jp_xpc{P3~y5uQRL@4Q`M7QC|Cv*@Dw_z`C8ZiTzUALBP~D zUy>5_1y!3<5Ozuhrs{gq8iOQ3SZCp=%#XF2(#1+r2dbcaGyf#iBH{&4O(^R)| zkE*vfxXul~Xj}JydK~F|9n(l>K=Gf97G83xggq}s7So@|AlG3AV&0*759sQCX3&G`j5`N_P-x>S!js z&|RlA9yWUP?ej#ie!@j5M2bYt$G9nD_^Ys!C$r;eTrUONKmBQAPWa%l+tpb}?_qd^uYR^T=;b0p zuW1=Af+wlLjU5Bk*3X?YXNy1@#N?>>xNrR)P>3}lfEK?&al>RsR5y3ea9NGZvXn0&|;6=|Ju#YL?W>B=t?KXJPuagkZso3pzl(U$dX zx$jg!z!NF$&`9BswsuP$rP578?r$*`h1bl>FPopF_7!zo#o3S)8F|J6S_82EEv=!s^enI-s~Ru?c%=XQyNBlA$*nT0ubGKoX(K&n&P;mjyw>*H?_qo_ugDl`{SQD`LHu9PE2a88-=36c?fOWz?f2 z9a%URvG%{rTuWQ^P(IJT&yNPV8W@oGt%8)&j{?;^nSZ%-*HHc-3>4W6ukES<; zsbef9{diYgN4&ebl`pL;Umnq|DvnOY`8RB#tbI6k{P?qrL7X1>8rgU1?$GeM9oSp_ zho`2O{XkY;et*ee-V+K(9BOXW7AOwEIICG-z zr8qy`HpZVR!F}b^4k9^apTlT?1PA(iEn$qnlv9Q+#_GOAqj!F>dt|Zue2IRv5-%U_ zBL)w3o4_R8r~c-HU3ykuA{_FfXm7`)Co&RBwolRTDeoUll%pfVab&XK{H+Ej>wJE~ z&o9+csI_q?rkr0eE~AD1DF8j1UdrAa!HSM1>=7)SMI8$#rxO3UBo{$MS63!*32|57 zln-t^cxur=Ssi4Fa&tB@nHOgb2pv6l0&??lR?~P^P_(_h;f@XuCsO!s$nu{rl zEMtUua>~SGrsD;7Lqaf2$0K^AUzgV+j7B6OmQ03nToJ1?N`k5mTC6}`fP|k~GZ;x& zS1>A$ata0{RDSeFC@jYeE;|1%v9B;c4b2MT2gyZQPtvI&@8+srX8f8*8#l(xZiilW zSeAC1wAU1SVK*yE-3=mk<2I5Hs)qj*?>3s+MJr?jTqb9${&r=e}=nuLr_qC0ZW<18goP}#Xv%iAH+yaZMRibDABHxuqO+OkyrDO z4Q}=VR93+bzZi7%Xhvy9QL>3*u>=5aZ%%OPmaj!?B!h3WSSIXk>zMsNtl1(1Jxzc- z&UN|YZuPCDL|-Yg=pK;vDs4w(?40n3HyQ6%&o<9Dw2|>KrM#XfE ztid=&aVJkkk0%p9J6zV5fa{qZLQUmRUl`TfGoaJ|PY|s*HIhBsfv0!N5`C)YtcrDm z#7``4n4s(yG#|Y25sIj<)@>PHZ@mAQ#P9_Vj*VwD#``tK%C@Ud2)yn71miyh6kUh7 zPvaxx2bW)n$g+h-So{nSdFPO^+oiU2e+5jqSFCnMcxPXiGkv!X3%=y~bwlWs+0>ey zQjhGl4f$5kSZ77=kAp`M!ijF{n6Py+#3{Holpdv$l{g2lP#-s++*4ma;@i@S^oGjk zM@Zuxt1`_i{LeDwq|zy4XHq+f0aYt?p4&UUsr%J;Y=W3XL@$#okRXo#Y5aKm#p(yk zrX}X^{Z9+ykZjsWdi;Xj6baXphKUaMe#e43+GOnXc_aTERQYDEd1w!TKlyF)6UHG& z`>uMm$57ZbcS+M%wf|CymwX~>Fs;#dN(|ld4YhSwru@1Q%x7lJG3);}$gM2s8H!gU zC}U?O#I)=M52G$M(u)05DzNIxG|!b_&HZ-n*fG75=@AXZV;AVlAOP0Yr@6i5 zrCt6wgKfew_?jn|b9-}Fp@(d@M7QEBq$^)UBd%sKTDz~LsvQ_a_3jl#TA%YvQ-_dB zYTQLeY+4gQPd7K{CbxZN)YWT^dTZM4XSSgybHN^?*Vzv52huiOST)nDXgk=9qtylp z5KBN$WKgcKqArQo7vGh1TRw4|W8(5hS#abB+5({9Qxwm4A>v@EtR$D7l4?)TMI)9c`i&+|Q{^k_Px^HCP|bv-56hF!AgwdS+0jNd~h%SOoK z9viAAsN#>E(ZH_=YA-KwBdkq7K>%?Hq4R0eespElX?UMv^Y4Qe7IO~VO#1(QpqQRDAdi7k ztMee`TKf*`AdmXFY*UBLaA53Q-#?kVf&9D0dI?&*sR2B5fF?1T<80d1+m}zu*N0QSvrnM3MEFhKcV6$PRy0q(!b_%xgc*q^szEHLeq)pW0Rt44z+Z@+60(1&=iR& zKQt7buFR}s5xC+Es|7(nZ%u%|rEhGbw)xQwwfnt^5nWM7N(m#|+bshn-G?$?;X;nd z#aHC>B^W@(Y_r>s)Ta%$4!gqOf{|4DJVh|RC3Xka;h}S@1s`W2c1r1f!%{8hy~-zXXnu%l!1i9S2eaLPPG| zn!|8(TVt`6h|dF;)m5BMNH%pZ(yi*C%sq32AWlupV#G+v{T_Z)w#}baRiFBeTCzhc zpuQj;O}xqDvNkkq-DK*yd3QGR-upYhgFhPIy;-wn=OXg{-M|i0xZ{I6A@L}x%yO#; z94e~bcGEVQy9q5oocc>@qL&S>`D!WF_hB1cxV_Kl>`aoLF&lBEf8t6rCUzRLuQ-Y5 zbjzl1jP81^R6b=HB2G#$Q7SU~6CBG|adbm*HI^#UkyD(nq#PH8gd~xX_}9dVJKWaP zQNo4mp0VTO;McT*R)%y?tA2^A(!ISX0W6EWrQ1uOcDjXfx^?Z^b@RcPtR;0mN62`e zu&`&iA)z`FUhE?wqF6Xe5|y!oeEihyn>V|=lxF%rqQ$DIL}>GCOTS(p>Y8z7=A*cv z;7S)OWmb@sCfcVODbKx=DJieV26#1S(POvmfchX)miW5xBq~c&1fHUd{2@LehJ5>; zWFhe)2dlKwG|iK{7!uG(xG$U2TqjJq%S%Vp1mQty$|K( zeA*&)@Q8rL^Ia37qrltbQU!omhA+ITHV6V)MYqM?x+IXc*FW)WW^7_&UY=W35orj| zKsoe@^oEW@gsNg9ch_2ObP#Y~j+o;S?p)Iy(ghF++N3YFy;>>|WW--NEZcryN(iF- z$FMQl!W131j&h-9J53sHFLbNk>INlKZ9P1;*)LM!I4}CymPGS>iX>cw92vC#CJ*2` zKNq-f2*8sPyj}dm2yH;Zd=i)U%>-qvs5~okfNw0I#kAo*vxV$B0)Ik+EceD4riwgSbO~%eCW>*QqldYN4Wlt@6 zK5+{f<}ye@iD1=5mI!8-3zVl^mj+~w8#kKb>z+xQP!59A{i082V05nUgfFNA2qMpRfmgi3gZjWmu6? z-@N~fns`p*b46al;JNr%mn*-2{YYTcsobt0b@GX%a76jea;wr`zTDi8jc{2i1n%NL z{wG#V>FH2Drm0W@nk!7tYSfTGEPlMuVMDId9CI<3|9N6g_?9KHx)LA*JAa0`Op}y_o`M*Zh&2d}2&|$Mw2)?PhqIjXw?s)gRbIa3 zHiI}jcVv?-0__(-CC!5W{H1I_;!X7ojV1ILqd)nK%|e3j;jogHDu+q01SwhDWU`w*{}i!Mj{L|n_34_l>Az&=GxE>kAyn%NF(Ze*o5Jd zQ+i&x=Am0v3HAL?k?__eJtrzK0hfF*7ex#tP|`5qzCww;_D&bvEk4DOJ6t( zs@NOqmIU&O#!arQH`=l{@{X;L^iF!fosP2ETPmJDis<)}0?w1wU^Qwdg2l0{H*XSz zt96=P-9J~Hw}nAGA(Xu!7e_!|tNx@?ELy_KxZ#-VNr-`7fK1R;W~#|wYYc?lAMf5! zXF%{T;BH@0iJ#JJaHcHJ{#_$K;N!siiV`kK@&1;7{%4r2>^HNm@kP=Tv96Pe0ETAG4o4*_(6U0B6Y_NcJ0}->b<{tMdm_uA*#}N zayq22M(yN`kCQLg8%*@@E*>|#f|-R0jnP44Ijz*P$znj45^$nk17wX`%0B8{9Yu43 zqXF>H6Eb+JUUYohJS2Uv=RxKRZAyShE`)k2uik(3$ol(v@%saXT{)GZtLDO~SFRu7 zm_$W8#scjt0axYzcRfM$;!kB~PfyV4Q0kFVWkd1Y8)>2^z3q|)sL#BehtN>o$&076 z*HOkSx`!S9oP0&@0-?89hT^p=2UI?!eKk(2Rj-+|iUcul71(?|N*luHF%q z{tl~VJt%1O4A;VmLaIvXa}ha-sC4OX9n*y-qev-R2=FAwAjOjC);LW5im-8v_~^V< zs%U^gkItR_{TPTdm2nXFNw~$nM(Hj=DPChBDtJ-5Ry>$!l|7wyfJ$U??uw0R46#6o zvZA!Eq;%g)Ca5jFCy|gkmdcqNHd->B^7N{5UrVGNU#Kp)V457%yd6FN(<13DhxjxA zGX4lzQ)}TuDH%UWmED-Lu&(pf+=Ec;$m;#WP5<$XRKKVwEj1u9Z;aj~%xQpi!R zA7Bhe5#4}e2xJnDKP7HUQJ}jUK#f3oz2}8}*g$g_+ow2m0X90;@OCYP)TGBtwAw!|m zQpbKaecZTZgVGpYU}5Pnhx&9NWX<$H=~jKYVT));2>P%;dN*yZxq`%=m1tU^m8f*} zrA$SfMWZv9J2w^3&sPiXL-7>3=#{}_&)Gis@@V3+w29e7Bdz2-#-~o0IC1oK@icg7 zlrNsj`OmY%ylxqQO1U-;MPJhY_XV0Jr~IGlB6yyrmN|i90`WE%3cJb>G5~U-n)12A%ycvMz)k- z`@`{AA-8;gko394XBA{U%1skcoj&GWB)C$ewXmbuzPw-~HKG60-j&DIoObaaL&jEv z5DoFlQeKs{Y_}Lxw!$@Lq6M!aOHo91b#2XvB*q}rWuj$Jwkf5$_EB_2w9$gJ3*Az; z?fsq;@5ejizxSW_kNU^`_}%;bp65L0InP3V}U6*;o%fFlXTmNa8`G@e+aGuAm>lMZ#l2|CmkdS6h42K-1T%uJu0p!*Np+1Jl2 zA84$tQNW1P&PjE7XZ2EO2{ZpLYNpo1Ef@pyxhv4>MVTy|wi5$}Uj7*WT;yILQlShN z%$VaMNn8ot>~=`#xV@QP%MyIae}$vU0DmK^!1V%j<13Ti-RcqFR2tP(s)7f!x+7ga zC+RxL*VwCL+SG^$!kFH$;7F{*T1+T|b)5To5KYkKb{pP)@o(bFssY?ONm<=d#0w8? z;muE?I3r0lxlRGqxAFG-vNW>4je9Yv=1LTiO9;6^m*d;pPbkn9O=U z9zse1Bm|h!;cxP&wg&*KctTmag8fw70X3*&Co+W{3a>jZx0Nu676Wpu#wZ&4uZIVz ziVeQ}CD;N*J7Bpa)xSI8MmyhPfJmcOenAw4_NTj>L92r7*legf3i4ZYMLI_uUSyVR zVh?9MW1ZY71_RUKZxYBeiY^K?GatSg*((W={h+z-ru~2T00QU?T4<{$z+XHK&S{y) zcye+;B)6HX-N z%rw$aZ}uShZ=X`I13pa^NtmX~$c=lGfLvyE$m}_siqo))URk_!hJW9U(YTP)Kw=9! zew~8U6lwp`8xmzIDL-`d8iw<0I`B+1YB2xbK1y7vm@&ReZyv9`XuVFOHnLC1e-+xD ze?*X0sQ;s!)5CWFBwvY2>f}4A5(%z>$RUEXBeO&BJo%ZrNnK%zxAJrhxh;@gGXD>H z3?Rf7lQcQMI>SDRFa3v&blE;kLG`x3iFoBS9>SSt;HUM;dlL)oJS2qJWWNplc>l5% z2*9r+W_8grl9}LI)43SPxeu1c-) zu0gLnSx^?_qcC?T&F=XA)#tA|W}uH~{YZEL^Ym4{1e1=`q*&Tx2oYfD*(C;x$jeZH z=3?P${N&(Ze)0hPKPU^$NYopE8Emwo-ICwy4l+s?YpNo+68UdltvP&q*GI7v4)8j}-e!PJnze1-^*9qms7B{Ek z=n205nC)C&k_-;99l@XSXsU1YJ8(CXR-%E8VmbYKm><1d(-CER6sXx~jO>MMv_ZK* zCrWcRjnio(Ruz+6_&$`Tti{v~G@~aocA|LXhxqvT5E$y01Jtd}`SpW#(~x_IVKYj1 z@auJ%;N4asu|;tn{*)yEj<%nk*H$jONblME1FvA&*fC?2dB7Ou93HWFQy}_vlzIRH zXiEswK4|oHiN9;X-+h68WY-AlX^V)#;i2z>?4|m=p737u+c*6^|z2 z67GyO%}}E)HyiN{ZF!IpyaJ6r4KH;x&^}trj;Ukw58|7#w?z}=(RBzDObn*H*sXB5qI*EiZIX^VyhwETGPp*Ql7NCO!bx^cN3z3F1 zkrqL0SEs?j^aslOxX+Cc2hr$*4$+>;`V-5T** zA1_uRp535Asm-unlFo8H<|@~=L;`6Kv|SJXo_{fyf8p94C*{cvqLTa`om*k<^`Z5} z=0mK4y)DyXgl`r6D5B-j4s>N`$EU$Hh{t>EPR9X@IXXS>t8^Wn>W=Sds#?0#J*2?A z{}yz1G+IOTo4%r=6imG?-D$lJ`yZgjxFL>ULw%^_!PlCS&eq3To_FQvKYL#cX!3_I z)k;s*OXkQ-t2LE&Oa4vY$)3s!!vx+YX*7cJ*ZG>S3>Jf$I08fSwfTefR0vmkI;5Z7E!z$G%wvoG&Q=PT)3eSEtGE` zOll}JG#qv~W!&CvioWDE42~;}{QXQK07>Vj>tJuKt#}68k%U}xZpqaRcVUzm>K&T- z5+ZO|Zo$o;LXuDx!90gf-!NYq-8vd6&esx<)13hPeAR(p_9S-D+R7U=Lyd{BGxmkw zaJy&GOTY60aPBO&-1jc(Bl(=OOHi2-z&1A{BjX3KsvuO)O6I6N7DWX)Mt2$;^BDbX-*N zVrc+PZ9Nhj2_@3OKpS;bdP0=preuZ)-+*y^&d0}ltwF!XU0{dm(#I#N5c;ingyu@F zYj6mm`#ST^_O&)RJRCu~yESCl{a|po`E;?DY@Zn6i3{i8TG&odA#LUbc}X`qPRsunOS=XRX*Al>*eDOKYL8+5tl+9Ac zq;n2n(%qzbc;ygxcW_JDSu00aSE#9}c`k~wYrM=`kja z6IhC+AH~g8kq60l5_i;xN2gr21tycIFq6>rCX@mwmN6Rids~b3%r;c@(wd?IcrJc9 zD#r0LO84_J?tV$^TFbT}sxql=2O5|iL%ECWSEm9ns7#AUBpih=J&;sWw7fcU_|Nnv%q0(N{f;2juh*=Ki(W)R)*x!s{quu1q$#n9IttEMx814(#j%` zX(Q4CCl}rBZGZfGmWAmp^j_+L)b*q*l#~EjSOwYyhN0eQXKlwaTrySAcL~d?w0@CYBD@sc0z>j$G#}hFl6tx#c@z5;SLpSV= z3wj4it2b1`YR~lo!`h-HPBM-kesQ;D$1cDFuHwKpl$2v1)yA;GN@PrIEhQ9UE!-YG z{7COZwHfBWpEH1(v%`H|1&_Vk!7-W=jiFBPPvt~`CilpPsu&I<2inglUctiUKu*@9 z?$(BIbTx(KDWJx>6$vG0T9gOtv1|N6ZR@e9geYmEg25%Ic2RpDdW1dpTV#KF{&;sJ zF|5U%|I8i1G(qb8f;=!n8qiRX-o7E-NAKa$$MyB$TA`_8=8uG6l@+V zbMw2`bnS<$f<0MXmf8#;_0GBnd}&q5P(k<24xUtZ;FL?mP_!{IeC}QKpc!3CJURPZ zR+>fIB^y$neWmPJ(Q&ub!Kjl~mI^m>zhSCin?(^~b&9N8k$=yd=V(*Fb97FHVi)in zDQH$BY~z$Ur{|a4KUEnq@-EVFuQkH<4R(W>aH)mDY6pqJW)Bdtlf@7}GQhS#Xjx^WYC&DgRBz5{8E~V!d&3sUrDoDD9D7P; z1tPLuLn&!K9842Rk0wR)tJgxSo&jKGj$&)gr3w^2cIhcmxK3PG)G&#u>siFqt-Xb? zvgs0lDpH|s)ad$8&l`PfA9^!wp~MPDij+U#+g%vM%ApW4@~^s3QP6v|s72aY`DMBw zgb=^BtVF8GTow6v+3zu>T+#kY|K+o>2#T|GmjLZW81a^WJ|C(B4d5!6^?6n312 znst$dfybPSzLv$_PUiQiDsSRkPAK%8Z_vZ z6@0J%$L_nJlGbNrqUSzv*VG4Ad7Gi%>MaB9BEj7x;H>M`ov(Ss_j?+FA4ST<+ zu>tzHT@u;=djz|sj?e2xC&giN3nBK3vdlxMrR5})6@MF}XsQpJSOmw|F^bq8^t7Ql zm`o-lf*`b~_*nspcT|*+I;6`Km9Y~+&@87sl!2E0y~;1N=tM$`;fmi0(o8x;{Hf(? zppUw&w9=;m?6{y$f+dSS`eebzJbf}_6OKL!2YAx-Y5%m=AzNwL%0#WFhonKP*l3lP ztrrEIgw`9fRW*RZ)v6k_ss{fLs)5`m#tEG+@VC7t%r0~cf7E9)lK%71f0X!{ \ No newline at end of file diff --git a/www/boris/styles/default/font-awesome/anchor.svg b/www/boris/styles/default/font-awesome/anchor.svg new file mode 100755 index 0000000..792266b --- /dev/null +++ b/www/boris/styles/default/font-awesome/anchor.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/www/boris/styles/default/font-awesome/arrow-down.svg b/www/boris/styles/default/font-awesome/arrow-down.svg new file mode 100755 index 0000000..61b4db7 --- /dev/null +++ b/www/boris/styles/default/font-awesome/arrow-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/www/boris/styles/default/font-awesome/bars.svg b/www/boris/styles/default/font-awesome/bars.svg new file mode 100755 index 0000000..87d79f9 --- /dev/null +++ b/www/boris/styles/default/font-awesome/bars.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/www/boris/styles/default/font-awesome/book.svg b/www/boris/styles/default/font-awesome/book.svg new file mode 100755 index 0000000..d27fdae --- /dev/null +++ b/www/boris/styles/default/font-awesome/book.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/www/boris/styles/default/font-awesome/bookmark.svg b/www/boris/styles/default/font-awesome/bookmark.svg new file mode 100755 index 0000000..d1c8e4a --- /dev/null +++ b/www/boris/styles/default/font-awesome/bookmark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/www/boris/styles/default/font-awesome/bullhorn.svg b/www/boris/styles/default/font-awesome/bullhorn.svg new file mode 100755 index 0000000..9c86370 --- /dev/null +++ b/www/boris/styles/default/font-awesome/bullhorn.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/www/boris/styles/default/font-awesome/cloud.svg b/www/boris/styles/default/font-awesome/cloud.svg new file mode 100755 index 0000000..38d2dc5 --- /dev/null +++ b/www/boris/styles/default/font-awesome/cloud.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/www/boris/styles/default/font-awesome/film.svg b/www/boris/styles/default/font-awesome/film.svg new file mode 100755 index 0000000..f120aee --- /dev/null +++ b/www/boris/styles/default/font-awesome/film.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/www/boris/styles/default/font-awesome/film.white.svg b/www/boris/styles/default/font-awesome/film.white.svg new file mode 100755 index 0000000..10f1e9c --- /dev/null +++ b/www/boris/styles/default/font-awesome/film.white.svg @@ -0,0 +1 @@ + diff --git a/www/boris/styles/default/font-awesome/hdd.svg b/www/boris/styles/default/font-awesome/hdd.svg new file mode 100755 index 0000000..cead9cf --- /dev/null +++ b/www/boris/styles/default/font-awesome/hdd.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/www/boris/styles/default/font-awesome/laptop.svg b/www/boris/styles/default/font-awesome/laptop.svg new file mode 100755 index 0000000..b68aab3 --- /dev/null +++ b/www/boris/styles/default/font-awesome/laptop.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/www/boris/styles/default/font-awesome/play-circle.svg b/www/boris/styles/default/font-awesome/play-circle.svg new file mode 100755 index 0000000..ea10397 --- /dev/null +++ b/www/boris/styles/default/font-awesome/play-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/www/boris/styles/default/font-awesome/play.svg b/www/boris/styles/default/font-awesome/play.svg new file mode 100755 index 0000000..d7fa87f --- /dev/null +++ b/www/boris/styles/default/font-awesome/play.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/www/boris/styles/default/font-awesome/qrcode.svg b/www/boris/styles/default/font-awesome/qrcode.svg new file mode 100755 index 0000000..c92fa7c --- /dev/null +++ b/www/boris/styles/default/font-awesome/qrcode.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/www/boris/styles/default/font-awesome/save.svg b/www/boris/styles/default/font-awesome/save.svg new file mode 100755 index 0000000..44298e3 --- /dev/null +++ b/www/boris/styles/default/font-awesome/save.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/www/boris/styles/default/font-awesome/share-alt-square.svg b/www/boris/styles/default/font-awesome/share-alt-square.svg new file mode 100755 index 0000000..7d48e45 --- /dev/null +++ b/www/boris/styles/default/font-awesome/share-alt-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/www/boris/styles/default/font-awesome/share-alt.svg b/www/boris/styles/default/font-awesome/share-alt.svg new file mode 100755 index 0000000..2f3151d --- /dev/null +++ b/www/boris/styles/default/font-awesome/share-alt.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/www/boris/styles/default/font-awesome/share-square.svg b/www/boris/styles/default/font-awesome/share-square.svg new file mode 100755 index 0000000..f66404d --- /dev/null +++ b/www/boris/styles/default/font-awesome/share-square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/www/boris/styles/default/font-awesome/share.svg b/www/boris/styles/default/font-awesome/share.svg new file mode 100755 index 0000000..e7e262b --- /dev/null +++ b/www/boris/styles/default/font-awesome/share.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/www/boris/styles/default/font-awesome/sliders-h.svg b/www/boris/styles/default/font-awesome/sliders-h.svg new file mode 100755 index 0000000..e5d7fd7 --- /dev/null +++ b/www/boris/styles/default/font-awesome/sliders-h.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/www/boris/styles/default/font-awesome/tag.svg b/www/boris/styles/default/font-awesome/tag.svg new file mode 100755 index 0000000..6793a2e --- /dev/null +++ b/www/boris/styles/default/font-awesome/tag.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/www/boris/styles/default/font-awesome/tags.svg b/www/boris/styles/default/font-awesome/tags.svg new file mode 100755 index 0000000..192075b --- /dev/null +++ b/www/boris/styles/default/font-awesome/tags.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/www/boris/styles/default/font-awesome/tv.svg b/www/boris/styles/default/font-awesome/tv.svg new file mode 100755 index 0000000..4e33e61 --- /dev/null +++ b/www/boris/styles/default/font-awesome/tv.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/www/boris/styles/default/font-awesome/unlink.svg b/www/boris/styles/default/font-awesome/unlink.svg new file mode 100755 index 0000000..8cba9f8 --- /dev/null +++ b/www/boris/styles/default/font-awesome/unlink.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/www/boris/styles/default/font-awesome/upload.svg b/www/boris/styles/default/font-awesome/upload.svg new file mode 100755 index 0000000..1c880b5 --- /dev/null +++ b/www/boris/styles/default/font-awesome/upload.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/www/boris/styles/default/font-awesome/user-alt.svg b/www/boris/styles/default/font-awesome/user-alt.svg new file mode 100755 index 0000000..024cb44 --- /dev/null +++ b/www/boris/styles/default/font-awesome/user-alt.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/www/boris/styles/default/font-awesome/user-astronaut.svg b/www/boris/styles/default/font-awesome/user-astronaut.svg new file mode 100755 index 0000000..631f168 --- /dev/null +++ b/www/boris/styles/default/font-awesome/user-astronaut.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/www/boris/styles/default/font-awesome/user-friends.svg b/www/boris/styles/default/font-awesome/user-friends.svg new file mode 100755 index 0000000..2e43c59 --- /dev/null +++ b/www/boris/styles/default/font-awesome/user-friends.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/www/boris/styles/default/font-awesome/user-tag.svg b/www/boris/styles/default/font-awesome/user-tag.svg new file mode 100755 index 0000000..ec1a1e7 --- /dev/null +++ b/www/boris/styles/default/font-awesome/user-tag.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/www/boris/styles/default/font-awesome/user.svg b/www/boris/styles/default/font-awesome/user.svg new file mode 100755 index 0000000..591873a --- /dev/null +++ b/www/boris/styles/default/font-awesome/user.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/www/boris/styles/default/font-awesome/wallet.svg b/www/boris/styles/default/font-awesome/wallet.svg new file mode 100755 index 0000000..f584229 --- /dev/null +++ b/www/boris/styles/default/font-awesome/wallet.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/www/boris/styles/default/font-awesome/wrench.svg b/www/boris/styles/default/font-awesome/wrench.svg new file mode 100755 index 0000000..378cf6c --- /dev/null +++ b/www/boris/styles/default/font-awesome/wrench.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/www/boris/styles/default/layout.css b/www/boris/styles/default/layout.css index 8337363..2ee23dc 100644 --- a/www/boris/styles/default/layout.css +++ b/www/boris/styles/default/layout.css @@ -1,4 +1,3 @@ - body { margin: 0; @@ -42,6 +41,87 @@ main { margin: auto; } +body.home main { + + display: grid; + grid-gap: 1rem 1rem; + grid-auto-flow: row; + grid-template-columns: 998px auto; + grid-template-areas: "c m"; +} + +body.home main > #menu { + + grid-area: m; +} + +body.home main > ul#videosList { + + grid-area: c; +} + + +aside#menu > div { + + position: sticky; + top: 2rem; +} + +#pinFilter ul { + + margin: 0; + padding: 0; + list-style: none; + font-size: 3rem; + display: flex; +} + +#pinFilter ul li a span { + + display: none; +} + +#pinFilter ul li a { + + display: inline-block; + height: 3rem; + width: 3rem; + border: 1px solid red; + background-repeat: no-repeat; +} + +#pinFilter ul li#filter_pinned a { + + background-image: url("font-awesome/hdd.svg"); + background-position: center center; + background-size: 2.5rem; +} + +#pinFilter ul li#filter_notpinned a { + + background-image: url("font-awesome/cloud.svg"); + background-position: center center; + background-size: 2.5rem; +} + +#pinFilter ul li#filter_both a { + + background-image: url("font-awesome/hdd.svg"), + url("font-awesome/cloud.svg"); + background-position: bottom 0.25rem left 0.25rem, + top 0.25rem right 0.25rem; + background-size: 1.75rem, + 1.75rem; + +} + +#tagsList li, +#narrowingTags li { + + padding: 0.125rem 0.5rem; + margin: 0.25rem 0.25rem; +} + #videosList { display: grid; @@ -53,20 +133,59 @@ main { margin: 0; padding: 0; justify-content: center; + align-content: start } -#videosList li { +#videosList > li { border-radius: 0.25rem; border-width: 1px; overflow: hidden; } +#videosList .thumbnail { + + text-align: center; + height: 180px; + margin-top: 0; + display: flex; + justify-content: center; + align-items: center; +} + +#videosList .thumbnail img { + + max-height: 180px; + width: auto; +} + #videosList .video-title { padding: 0.5rem 1rem; } +#videosList > li ul.tags { + + padding: 0; + margin: 0; + list-style: none; +} + +#videosList > li ul.tags li { + + display: inline-block; +} + +#videosList > li ul.tags li:after { + + content: ", "; +} + +#videosList > li ul.tags li:last-of-type:after { + + content: ""; +} + article { border-radius: 0.25rem; diff --git a/www/boris/swarm_files.php b/www/boris/swarm_files.php index c6b2af2..b2e871c 100644 --- a/www/boris/swarm_files.php +++ b/www/boris/swarm_files.php @@ -54,9 +54,7 @@ foreach ($swarm as $peer) { foreach ($videos as $v) { list($a, $b, $c, $videoName, $e, $g, $h, $m, $videoURI) = explode(";", $v); - - - $videoURL = /* 'http://'. HOST. */ $videoURI; + $mimeType = guessTypeFromFilename($videoURL); if ($mimeType == 'video/mp4') { @@ -64,12 +62,12 @@ foreach ($swarm as $peer) { echo '
  • - ' . $videoName . '
    + ' . $videoName . '
    ('. $mimeType . ')
  • '; diff --git a/www/boris/youtube.php b/www/boris/youtube.php index 95fc63b..a7e608d 100644 --- a/www/boris/youtube.php +++ b/www/boris/youtube.php @@ -8,47 +8,101 @@ require_once('functions.php'); // echo 'IPFS id : ' . $ipfs->id() . '
    '; + +$uriParams = []; + $videosList = array(); -exec("/bin/bash -c './get_astrxbian_index.sh'", $videos); +$search = isset($_GET['search']) ? urldecode($_GET['search']) : ""; +exec("/bin/bash -c './get_astrxbian_index.sh \"*\" \"". $search . "\"'", $videos); +exec("/bin/bash -c './get_PIN.sh'", $pinnedVideos); +$videos = array_unique($videos); + // exec("/bin/bash -c './get_youtube_videos.sh'", $videos); // echo file_get_contents("http://youtube2.com/ipns/12D3KooWHLLohhFqwTs3Ccego51w1Q2WUQ8JmhSMWtsZnQpMigHY/.12D3KooWHLLohhFqwTs3Ccego51w1Q2WUQ8JmhSMWtsZnQpMigHY/FASTRXBIAN"); // echo shell_exec('whoami'); // Pour savoir quel utilisateur système exécute les scripts PHP +// echo '
    '; var_dump($videos); echo '
    '; exit; -$videos = array_reverse($videos); $i = 0; +$div = 9; +$r = rand(0, ($div - 1)); +$j = 0; +$tagsMenu = array(); +$narrowingTags = array(); +$show = isset($_GET['show']) ? $_GET['show'] : 'pinned'; + +if (isset($_GET['tags']) and !empty($_GET['tags'])) { + + $tagFilter = explode('|', $_GET['tags']); + +} else { + + $tagFilter = array(); +} foreach ($videos as $v) { - - ++$i; - if ($i > 10) { - break; - } - list($contentType, $videoID, $year, $videoName, $saison, $tags, $ipnsHash, $definition, $videoURI) = explode(";", $v); + list($contentType, $videoID, $year, $filename, $saison, $tagsStr, $ipnsHash, $definition, $videoURI) = explode(";", $v); + + list($videoSource, $videoID) = handleVideoID($videoID); + + $ipfsHash = preg_replace('!^/ipfs/([^/]+)/.*$!isU', '$1', $videoURI); $mimeType = guessTypeFromFilename($videoURI); - $duration = NULL; - $thumbURL = ''; - if ($mimeType == 'video/mp4') { + $videoTags = getTagsListFromTagStr($tagsStr); + + if (canReadVideoFormat($mimeType)) { - switch ($contentType) { + $tagsMenu = array_merge($tagsMenu, $videoTags); + } + + $keepVideo = true; + $keepVideo = ($keepVideo and canReadVideoFormat($mimeType)); + $keepVideo = ($keepVideo and (in_array($ipfsHash, $pinnedVideos) or ($show != 'pinned'))); + $keepVideo = ($keepVideo and (!in_array($ipfsHash, $pinnedVideos) or ($show != 'notpinned'))); + $keepVideo = ($keepVideo and (empty($tagFilter) or (array_intersect($tagFilter, $videoTags) == $tagFilter))); + + if ($keepVideo) { + + $narrowingTags = array_merge($narrowingTags, $videoTags); + + /* + ++$i; + if ($i % $div != $r) { + continue; + } + + ++$j; + if ($j > 9) { + break; + } + */ + + $duration = NULL; + $thumbURL = ''; + $videoTitle = NULL; + + if (($contentType == 'youtube') and ($videoSource == 'www.youtube.com')) { + + $thumbURL = sprintf(YOUTUBE_THUMB, $videoID); - case 'youtube': - $thumbURL = sprintf(YOUTUBE_THUMB, $videoID); - - $json = getVideoJson($ipnsHash); + // $json = getVideoJson($ipnsHash); + + if (!empty($json)) { // echo '
    '; var_dump($json); echo '
    '; - $videoName = $json->title; + $videoTitle = $json->title; $duration = $json->duration; - - break; + } + + } elseif (($contentType == 'youtube') and ($videoSource == '9gag.com')) { - case 'film': - $thumbURL = 'styles/astroport/logo.png'; - break; + $thumbURL = 'styles/'. THEME .'/9gag_logo.png'; + + } else { + + $thumbURL = 'styles/'. THEME .'/font-awesome/film.white.90x90.png'; } $videosList[] = [ @@ -56,45 +110,229 @@ foreach ($videos as $v) { 'thumbURL' => $thumbURL, 'category' => $contentType, 'mime' => $mimeType, - 'eco' => '/ipns/' . $ipnsHash, + 'tags' => $videoTags, + 'ipnsHash' => $ipnsHash, 'uri' => $videoURI, - 'name' => $videoName, - 'youtubeID' => $videoID + 'title' => $videoTitle, + 'filename' => $filename, + 'videoId' => $videoID, + 'videoSource' => $videoSource ]; } - } +$tagsMenu = array_unique($tagsMenu); +$narrowingTags = empty($narrowingTags) ? $tagFilter : array_unique($narrowingTags); + $home = true; include('inc/header.php'); +echo ' +'; + // echo '
    '; var_dump($videosList); echo '
    '; -echo '
      '; + +echo ' +
        '; foreach ($videosList as $video) { echo '
      • '; + + $displayTitle = isset($video['title']) ? $video['title'] : $video['filename']; - $href = 'youtube_watch.php?uri='. $video['uri'] . '&name='. urlencode($video['name']) .'&mime='. $video['mime']; - + $href = 'youtube_watch.php?uri='. $video['uri'] . '&name='. urlencode($displayTitle) .'&mime='. $video['mime']; + echo ' - - - '. $video['name'] . ' - - -

        - '. formatDuration($video['duration']) . ' +

        + + '. $displayTitle  . ' +

        + '; + + if (isset($video['duration'])) { + + echo ' +

        + '. formatDuration($video['duration']) . ' +

        '; + } + + echo '

        - ' . $video['name'] . ' + ' . $displayTitle . ' -

        '; +

        + +
          '; + + foreach ($video['tags'] as $tag) { + + $tagArray = array($tag); + + if (!in_array($tag, $tagFilter)) { + + $selectedTag = false; + $tagQueryArray = array_merge($tagFilter, $tagArray); + + } else { + + $selectedTag = true; + $tagQueryArray = array_diff($tagFilter, $tagArray); + } + + $classes = $selectedTag ? ' selected' : 'selectable'; + + if (!empty($tagQueryArray)) { + + $uriParams['tags'] = implode('|', $tagQueryArray); + } + + $uriParams['show'] = $show; + + echo ' +
        • + + ' . $tag .' + +
        • '; + } + + echo ' +
        '; echo '
      • '; } diff --git a/www/boris/youtube_add_video_aux.php b/www/boris/youtube_add_video_aux.php index 44a7024..594637e 100644 --- a/www/boris/youtube_add_video_aux.php +++ b/www/boris/youtube_add_video_aux.php @@ -1,7 +1,7 @@