From 00d70c636a1ba3524eb52967dab7d15c6392fac1 Mon Sep 17 00:00:00 2001 From: "Wang.Luo" <1593775941@qq.com> Date: Fri, 25 Jul 2025 00:03:40 +0800 Subject: [PATCH] =?UTF-8?q?feat(spider):=20=E6=B7=BB=E5=8A=A0=E7=88=B1?= =?UTF-8?q?=E7=9C=8B=E7=9F=AD=E5=89=A7=E5=92=8C=E9=94=A6=E9=B2=A4=E7=9F=AD?= =?UTF-8?q?=E5=89=A7=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增爱看短剧和锦鲤短剧两个短剧平台的接口实现 - 更新 api.json 配置,添加新接口的信息 - 优化了短剧内容的获取和解析逻辑 --- XBPQ/免费影视.json | 20 +++ XBPQ/明星影视.json | 51 ++++++++ XBPQ/麦田影视.json | 38 ++++++ api.json | 55 ++++++-- json/lj.json | 2 +- py/爱看短剧.py | 311 ++++++++------------------------------------- py/锦鲤短剧.py | 147 +++++++++++++++++++++ spider.jar | Bin 1941888 -> 1941888 bytes 8 files changed, 356 insertions(+), 268 deletions(-) create mode 100644 XBPQ/免费影视.json create mode 100644 XBPQ/明星影视.json create mode 100644 XBPQ/麦田影视.json create mode 100644 py/锦鲤短剧.py diff --git a/XBPQ/免费影视.json b/XBPQ/免费影视.json new file mode 100644 index 0000000..68b8b00 --- /dev/null +++ b/XBPQ/免费影视.json @@ -0,0 +1,20 @@ +{ + "站名": "", + "主页url": "https://www.freeok.ac", + "请求头": "User-Agent$MOBILE_UA", + "编码": "UTF-8", + "数组": "", + "图片": "data-original=\"&&\"", + "标题": "", + "链接": "href=\"&&\"", + "副标题": "", + "线路数组": "module-tab-item&&", + "线路标题": "data-dropdown-value=\"&&\"", + "播放数组": "", + "播放标题": "", + "跳转播放链接": "urlDecode(Base64(var player_*url\":\"&&\"))", + "搜索url": "https://www.freeok.ac/vodsearch/-------------.html?wd={wd}", + "简介": "
&&
", + "分类url": "https://www.freeok.ac/type/{cateId}.html", + "分类": "电影$1#连续剧$2#动漫$3#综艺$4#短剧$24" +} \ No newline at end of file diff --git a/XBPQ/明星影视.json b/XBPQ/明星影视.json new file mode 100644 index 0000000..b1c548d --- /dev/null +++ b/XBPQ/明星影视.json @@ -0,0 +1,51 @@ +{ + "作者": "", + "站名": "明星影院", + "请求头": "User-Agent$MOBILE_UA", + "编码": "UTF-8", + "图片代理": "", + "直接播放": "0", + "播放请求头": "", + "过滤词": "", + "主页url": "https://mxvod.com", + "首页": "120", + "起始页": "1", + "分类url": "https://mxvod.com/vodshow/{cateId}-{area}-{by}-{class}-{lang}-{letter}---{catePg}---{year}.html", + "分类": "电影$dianying#电视剧$dianshiju#综艺$zongyi#动漫$dongman#短剧$duanju", + "二次截取": "module-items\"&&id=\"page", + "数组": "lazyloaded&&/a>", + "标题": "title=*>&&<", + "图片": "data-src=\"&&\"", + "副标题": "class\">&&<", + "链接": "href=\"&&\"[替换:vodplay>>voddetail#-1-1.html>>.html]", + "影片年代": "-----------*.html\">&&", + "影片地区": "video:area\" content=\"&&\"", + "影片类型": "video:class\" content=\"&&\"", + "状态": "tag-link-red\">&&", + "导演": "导演:&&", + "主演": "主演:&&\">", + "简介": "vod_content\"&&", + "线路数组": "data-dropdown&&/small>", + "线路标题": "value=\"&&\"+【共+&&<+集】", + "播放数组": "id=\"sort-item&&", + "播放列表": "", + "播放标题": "&&<", + "播放链接": "href=\"&&\"", + "跳转播放链接": "var player_*\"url\":\"&&\"", + "搜索请求头": "User-Agent$MOBILE_UA", + "搜索url": "https://mxvod.com/vodsearch/{wd}----------{pg}---.html", + "搜索模式": "1", + "搜索数组": "lazyload\"&&/a>", + "搜索标题": "title=\"&&\"", + "搜索图片": "data-src=\"&&\"", + "搜索副标题": "title=*>&&<", + "搜索链接": "href=\"&&\"", + "筛选": "1", + "类型": "动作片$dongzuopian#喜剧片$xijupian#爱情片$aiqingpian#科幻片$kehuanpian#恐怖片$kongbupian#战争片$zhanzhengpian#剧情片$juqingpian#动画片$donghuapian#悬疑片$xuanyi#纪录片$jilupian#奇幻片$qihuanpian#灾难片$zainanpian||国产剧$guochanju#欧美剧$oumeiju#日剧$riju#韩剧$hanju#港台剧$gangtai#海外剧$haiwai||大陆综艺$daluzongyi#港台综艺$gangtaizongyi#欧美综艺$oumeizongyi#日韩综艺$rihanzongyi#海外综艺$haiwaizongyi||国产动漫$guochandongman#日韩动漫$rihandongman#欧美动漫$oumeidongman#海外动漫$haiwaidongman||空", + "剧情": "喜剧&爱情&恐怖&动作&科幻&剧情&战争&警匪&犯罪&动画&奇幻&武侠&冒险&枪战&恐怖&悬疑&惊悚&经典&青春&文艺&微电影&古装&历史&运动&农村&儿童&网络电影||古装&战争&青春偶像&喜剧&家庭&犯罪&动作&奇幻&剧情&历史&经典&乡村&情景&商战&网剧&其他||选秀&情感&访谈&播报&旅游&音乐&美食&纪实&曲艺&生活&游戏互动&财经&求职||情感&科幻&热血&推理&搞笑&冒险&萝莉&校园&动作&机战&运动&战争&少年&少女&社会&原创&亲子&益智&励志&其他||古装&虐恋&逆袭&神豪&重生&复仇&穿越&甜宠&强者&萌宝&其它", + "年份": "1990-2025", + "年份值": "*", + "语言值": "*", + "排序": "时间&人气&评分", + "排序值": "time&hits&score" +} \ No newline at end of file diff --git a/XBPQ/麦田影视.json b/XBPQ/麦田影视.json new file mode 100644 index 0000000..bd2404a --- /dev/null +++ b/XBPQ/麦田影视.json @@ -0,0 +1,38 @@ +{ + "站名": "麦田appXBPQ", + "规则作者": "啦啦啦", + "请求头": "User-Agent$MOBILE_UA", + "编码": "UTF-8", + "主页url": "http://172.247.31.147:25321/mtys.php/v6/index_video", + "分类url": "http://172.247.31.147:25321/mtys.php/v6/video?pg={catePg}&tid={cateId}&class={class}&area={area}&lang={lang}&year={year}&order={by};;mr", + "分类": "电影&电视剧&综艺&动漫&少儿&短剧&直播", + "分类值": "1&2&3&4&25&26&30", + "数组": "{&&}", + "图片": "vod_pic\":\"&&\"", + "标题": "vod_name\":\"&&\"", + "副标题": "vod_remarks\":\"&&\"", + "链接": "http://172.247.31.147:25321/mtys.php/v6/video_detail?id=+vod_id\":&&,", + "线路二次截取": "vod_url_with_player\":\\[{&&}\\][替换:\"name\":\">>\"name\":\"题]", + "线路数组": "\"name\":\"&&,", + "线路标题": "题&&\"", + "播放二次截取": "vod_url_with_player\":\\[{&&}\\]", + "播放数组": "url\":&&,[替换:\">>接表题#$>>题接#\\#>>接表表题]", + "播放列表": "表&&表", + "播放标题": "题&&题", + "播放链接": "urlDecode(接&&接)", + "解析": "PD源$http://172.247.31.148:25320/jx.php?url=#NB源$https://api.nbyjson.top:7788/api/?key=ws9Lz1EtqfU09AzZKl&url=#ZB源$http://27.25.159.14:6699/api/mgapp.php?url=", + "影片类型": "vod_class\":\"&&\"", + "影片年代": "vod_year\":\"&&\"", + "影片地区": "vod_area\":\"&&\"", + "导演": "vod_director\":\"&&\"", + "主演": "vod_actor\":\"&&\"", + "简介": "vod_content\":\"&&\"", + "搜索url": "http://172.247.31.147:25321/mtys.php/v6/search?pg={pg}&tid=0&text={wd}", + "搜索模式": "1", + "搜索二次截取": "data\":\\[&&\\]", + "搜索数组": "{&&}", + "搜索图片": "vod_pic\":\"&&\"", + "搜索标题": "vod_name\":\"&&\"", + "搜索副标题": "vod_remarks\":\"&&\"", + "搜索链接": "http://172.247.31.147:25321/mtys.php/v6/video_detail?id=+vod_id\":&&," +} \ No newline at end of file diff --git a/api.json b/api.json index 8b31531..7385066 100644 --- a/api.json +++ b/api.json @@ -134,15 +134,15 @@ } }, { - "key": "APP4K", + "key": "蓝光", "name": "蓝光|APP", "type": 3, "quickSearch": 1, "api": "csp_AppGet", "ext": { - "url": "http://59.153.167.186", - "dataKey": "SDSFET23215FDSF2", - "dataIv": "SDSFET23215FDSF2", + "url": "http://122.228.193.2:9654", + "dataKey": "ca94b06ca3c7d80e", + "dataIv": "ca94b06ca3c7d80e", "deviceId": "", "version": "119" } @@ -356,7 +356,8 @@ "quickSearch": 1, "api": "csp_AppGet", "ext": { - "url": "https://www.guahd.com", + "url": "", + "site": "https://www.guahd.com/1.txt", "dataKey": "f2A7D4B9E8C16531", "dataIv": "f2A7D4B9E8C16531", "deviceId": "", @@ -1037,11 +1038,26 @@ "playerType": 2 }, { - "key": "短剧网", - "name": "短剧网|短剧", + "key": "爱看短剧", + "name": "爱看|短剧", "type": 3, - "api": "csp_HBPQ", - "ext": "./XBPQ/短剧网.json" + "api": "./py/爱看短剧.py", + "searchable": 1, + "changeable": 1, + "quickSearch": 1, + "filterable": 1, + "playerType": 2 + }, + { + "key": "锦鲤短剧", + "name": "锦鲤|短剧", + "type": 3, + "api": "./py/锦鲤短剧.py", + "searchable": 1, + "changeable": 1, + "quickSearch": 1, + "filterable": 1, + "playerType": 2 }, { "comment": "自定义接口开始", @@ -1645,6 +1661,20 @@ "quickSearch": 1, "filterable": 1 }, + { + "key": "明星影视", + "name": "明星|影视", + "type": 3, + "api": "csp_HBPQ", + "ext": "./XBPQ/明星影视.json" + }, + { + "key": "麦田影视", + "name": "麦田|影视", + "type": 3, + "api": "csp_HBPQ", + "ext": "./XBPQ/麦田影视.json" + }, { "key": "海纳影视", "name": "海纳|影视", @@ -1652,6 +1682,13 @@ "api": "csp_HBPQ", "ext": "./XBPQ/海纳影视.json" }, + { + "key": "免费影视", + "name": "免费|影视", + "type": 3, + "api": "csp_HBPQ", + "ext": "./XBPQ/免费影视.json" + }, { "key": "面包影视", "name": "面包|影视", diff --git a/json/lj.json b/json/lj.json index 26f1ab8..108cdc5 100644 --- a/json/lj.json +++ b/json/lj.json @@ -30,5 +30,5 @@ "type_id": "42317879720298" } ], - "Cookie": "JSESSIONID=E1DB8AC0F708B4E282B9998F371F9E3B; cms_token=2e714955704148f99268eaa976de09ce; cms_accessToken=6272a9e68faa49c4a73c684df0c44eee; cms_refreshToken=4908d2845de044d7bcde237f66092415" + "Cookie": "cms_token=91643744d93a42f98e15b6784f0bd310; JSESSIONID=D92622710E6342FD11574AC11CF9DFC6; cms_accessToken=7dab23285f764ee3a0b8d84abdff2fe1; cms_refreshToken=2f4d43120dcc4c258c80d0a1cd2df559" } \ No newline at end of file diff --git a/py/爱看短剧.py b/py/爱看短剧.py index 638f407..b447431 100644 --- a/py/爱看短剧.py +++ b/py/爱看短剧.py @@ -1,29 +1,14 @@ # -*- coding: utf-8 -*- # by @嗷呜 -import base64 -import binascii import json -import random import sys -import time -import uuid -from base64 import b64decode, b64encode -from Crypto.Cipher import AES -from Crypto.Hash import MD5 -from Crypto.Util.Padding import unpad, pad +from pyquery import PyQuery as pq sys.path.append('..') from base.spider import Spider - class Spider(Spider): def init(self, extend=""): - self.ut = False - # self.did, self.ntid =self.getdid() - self.did, self.ntid = 'e59eb2465f61b9ca','65a0de19b3a2ec93fa479ad6' - self.token, self.uid = self.gettoken() - self.phost, self.phz,self.mphost=self.getpic() - # self.phost, self.phz,self.mphost = ('https://dbtp.tgydy.com','.log','https://dplay.nbzsmc.com') pass def getName(self): @@ -38,238 +23,34 @@ class Spider(Spider): def destroy(self): pass - host='http://192.151.245.34:8089' + host='http://www.toule.top' - def md5(self, text): - h = MD5.new() - h.update(text.encode('utf-8')) - return h.hexdigest() - - def uuid(self): - return str(uuid.uuid4()) - - def getdid(self): - did = self.random_str(16) - ntid = self.random_str(24) - return did, ntid - # try: - # if self.getCache('did'): - # return self.getCache('did'), self.getCache('ntid') - # else: - # self.setCache('did', did) - # self.setCache('ntid', ntid) - # return did, ntid - # except Exception as e: - # self.setCache('did', did) - # self.setCache('ntid', ntid) - # return did, ntid - - def aes(self, text, bool=True): - key = b64decode('c0k4N1RfKTY1U1cjJERFRA==') - iv = b64decode('VzIjQWRDVkdZSGFzSEdEVA==') - if bool: - cipher = AES.new(key, AES.MODE_CBC, iv) - ct_bytes = cipher.encrypt(pad(text.encode("utf-8"), AES.block_size)) - ct = b64encode(ct_bytes).decode("utf-8") - return ct - else: - cipher = AES.new(key, AES.MODE_CBC, iv) - pt = unpad(cipher.decrypt(b64decode(text)), AES.block_size) - ptt=json.loads(pt.decode("utf-8")) - return ptt - - def random_str(self,length=24): - hex_chars = '0123456789abcdef' - return ''.join(random.choice(hex_chars) for _ in range(length)) - - def gettoken(self): - params={"deviceId":self.did,"deviceModel":"8848钛晶手机","devicePlatform":"1","tenantId":self.ntid} - data=self.getdata('/supports/anonyLogin',params) - self.ut=True - return data['data']['token'], data['data']['userId'] - - def getdata(self,path,params=None): - t = int(time.time()*1000) - n=self.md5(f'{self.uuid()}{t}') - if params: - ct=self.aes(json.dumps(params)) - else: - ct=f'{t}{n}' - s=self.md5(f'{ct}8j@78m.367HGDF') - headers = { - 'User-Agent': 'okhttp-okgo/jeasonlzy', - 'Connection': 'Keep-Alive', - 'Accept-Language': 'zh-CN,zh;q=0.8', - 'tenantId': self.ntid, - 'n': n, - 't': str(int(t/1000)), - 's': s, - } - if self.ut: - headers['ta-token'] = self.token - headers['userId'] = self.uid - if params: - params={'ct':ct} - response = self.post(f'{self.host}{path}', headers=headers, json=params).text - else: - response = self.fetch(f'{self.host}{path}', headers=headers).text - data=self.aes(response[1:-1],False) - return data - - def getpic(self): - try: - at = int(time.time() * 1000) - t=str(int(at/ 1000)) - n = self.md5(f'{self.uuid()}{at}') - headers = { - 'Host': '192.151.245.34:8089', - 'User-Agent': 'okhttp-okgo/jeasonlzy', - 'Connection': 'Keep-Alive', - 'Accept-Language': 'zh-CN,zh;q=0.8', - 'tenantId': self.ntid, - 'userId': self.uid, - 'ta-token': self.token, - 'n': n, - 't': t, - 's': self.md5(f'{t}{n}8j@78m.367HGDF') - } - params = { - 'tenantId': self.ntid, - } - response = self.fetch(f'{self.host}/supports/configs', params=params, headers=headers).text - data=self.aes(response[1:-1],False) - config = { - 'image_cdn': '', - 'image_cdn_path': '', - 'cdn-domain': '' - } - for item in data.get('data', []): - name = item.get('name') - records = item.get('records', []) - - if name in config and records: - value = records[0].get('value', '') - if name == 'cdn-domain': - value = value.split('#')[0] - config[name] = value - - return config['image_cdn'], config['image_cdn_path'], config['cdn-domain'] - - except Exception as e: - print(f"Error in getpic: {e}") - return 'https://dbtp.tgydy.com', '.log', 'https://dplay.nbzsmc.com' - - def getlist(self,data): - vod=[] - for i in data: - vod.append({ - 'vod_id': f'{i.get("movieId")}@{i.get("entryNum")}', - 'vod_name': i.get('title'), - 'vod_pic': f'{self.getProxyUrl()}&path={i.get("thumbnail")}', - 'vod_year': i.get('score'), - 'vod_remarks': f'{i.get("entryNum")}集' - }) - return vod + headers = { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36', + 'Referer':f'{host}/', + 'Origin':host + } def homeContent(self, filter): - data=self.getdata('/movies/classifies') + data=self.getpq() result = {} - cateManual = { - "榜单": "ranking/getTodayHotRank", - "专辑": "getTMovieFolderPage", - "剧场": "getClassMoviePage2", - "演员": "follow/getRecommendActorPage", - } classes = [] - for k in cateManual: + for k in data('.swiper-wrapper .swiper-slide').items(): classes.append({ - 'type_name': k, - 'type_id': cateManual[k] + 'type_name': k.text(), + 'type_id': k.text() }) - filters = {} - if data.get('data'): - filters["getClassMoviePage2"] = [ - { - "key": "type", - "name": "分类", - "value": [ - {"n": item["name"], "v": item["classifyId"]} - for item in data["data"] - ] - } - ] - filters["ranking/getTodayHotRank"] = [ - { - "key": "type", - "name": "榜单", - "value": [ - {"n": "播放榜", "v": "getWeekHotPlayRank"}, - {"n": "高赞榜", "v": "getWeekStarRank"}, - {"n": "追剧榜", "v": "getSubTMoviePage"}, - {"n": "高分榜", "v": "ranking/getScoreRank"} - ] - } - ] - filters["follow/getRecommendActorPage"] = [ - { - "key": "type", - "name": "性别", - "value": [ - {"n": "男", "v": "0"}, - {"n": "女", "v": "1"} - ] - } - ] result['class'] = classes - result['filters'] = filters + result['list'] = self.getlist(data('.container.items ul li')) return result def homeVideoContent(self): - params = {"pageNo":"1","pageSize":"30","platform":"1","deviceId":self.did,"tenantId":self.ntid} - data=self.getdata('/news/getRecommendTMoviePage',params) - vod=self.getlist(data['data']['records']) - return {'list':vod} + pass def categoryContent(self, tid, pg, filter, extend): - params={} - path = f'/news/{tid}' - if tid=='getClassMoviePage2': - parama={"pageNo":pg,"pageSize":"30","orderFlag":"0","haveActor":"-1","classifyId":extend.get('type','-1'),"tagId":""} - elif 'rank' in tid: - path=f'/news/{extend.get("type") or tid}' - parama={"pageNo":pg,"pageSize":"30"} - elif 'follow' in tid: - parama={"pageNo":pg,"pageSize":"20"} - if extend.get('type'): - path=f'/news/getActorPage' - parama={"pageNo":pg,"pageSize":"50","sex":extend.get('type')} - elif tid=='getTMovieFolderPage': - parama={"pageNo":pg,"pageSize":"20"} - elif '@' in tid: - path='/news/getActorTMoviePage' - parama={"id":tid.split('@')[0],"pageNo":pg,"pageSize":"30"} - params['platform'] = '1' - params['deviceId'] = self.did - params['tenantId'] = self.ntid - data=self.getdata(path,parama) - vods=[] - if 'follow' in tid: - for i in data['data']['records']: - vods.append({ - 'vod_id': f'{i.get("id")}@', - 'vod_name': i.get('name'), - 'vod_pic': i.get('avatar'), - 'vod_tag': 'folder', - 'vod_remarks': f'作品{i.get("movieNum")}', - 'style': {"type": "oval"} - }) - else: - vdata=data['data']['records'] - if tid=='getTMovieFolderPage': - vdata=[j for i in data['data']['records'] for j in i['movieList']] - vods=self.getlist(vdata) + data=self.getpq(f"/index.php/vod/show/class/{tid}/id/1/page/{pg}.html") result = {} - result['list'] = vods + result['list'] = self.getlist(data('.container.items ul li')) result['page'] = pg result['pagecount'] = 9999 result['limit'] = 90 @@ -277,38 +58,52 @@ class Spider(Spider): return result def detailContent(self, ids): - ids=ids[0].split('@') - params = {"pageNo": "1", "pageSize": ids[1], "movieId": ids[0], "platform": "1", "deviceId": self.did, "tenantId": self.ntid} - data = self.getdata('/news/getEntryPage', params) - print(data) - plist=[f'第{i.get("entryNum")}集${i.get("mp4PlayAddress") or i.get("playAddress")}' for i in data['data']['records']] + data=self.getpq(ids[0]) + v=data('.container.detail-content') vod = { + 'vod_remarks': v('.items-tags a').text(), + 'vod_content': v('.text-content .detail').text(), 'vod_play_from': '爱看短剧', - 'vod_play_url': '#'.join(plist), + 'vod_play_url': '#'.join([f"{i.text()}${i('a').attr('href')}" for i in data('.swiper-wrapper .swiper-slide').items()]) } return {'list':[vod]} def searchContent(self, key, quick, pg="1"): - params = {"pageNo": pg, "pageSize": "20", "keyWord": key, "orderFlag": "0", "platform": "1", "deviceId": self.did, "tenantId": self.ntid} - data = self.getdata('/news/searchTMoviePage', params) - vod = self.getlist(data['data']['records']) - return {'list':vod,'page':pg} + data=self.getpq(f"/index.php/vod/search/page/{pg}/wd/{key}.html") + return {'list':self.getlist(data('.container.items ul li')),'page':pg} def playerContent(self, flag, id, vipFlags): - return {'parse': 0, 'url': f'{self.mphost}{id}', 'header': {'User-Agent':'Dalvik/2.1.0 (Linux; U; Android 11; M2012K10C Build/RP1A.200720.011)'}} + data=self.getpq(id) + try: + jstr=data('.player-content script').eq(0).text() + jt=json.loads(jstr.split('=',1)[-1]) + p,url=0,jt['url'] + except Exception as e: + print(f"获取播放地址失败: {e}") + p,url=1,f'{self.host}{id}' + return {'parse': p, 'url': url, 'header': self.headers} def localProxy(self, param): - type=param.get('path').split('.')[-1] - data=self.fetch(f'{self.phost}{param.get("path")}{self.phz}',headers={'User-Agent':'Dalvik/2.1.0 (Linux; U; Android 11; M2012K10C Build/RP1A.200720.011)'}) - def decrypt(encrypted_text): - try: - key = base64.urlsafe_b64decode("iM41VipvCFtToAFFRExEXw==") - iv = base64.urlsafe_b64decode("0AXRTXzmMSrlRSemWb4sVQ==") - cipher = AES.new(key, AES.MODE_CBC, iv) - decrypted_padded = cipher.decrypt(encrypted_text) - decrypted_data = unpad(decrypted_padded, AES.block_size) - return decrypted_data - except (binascii.Error, ValueError): - return None - return [200, f'image/{type}', decrypt(data.content)] + pass + def liveContent(self, url): + pass + + def getpq(self, path=''): + data=self.fetch(f"{self.host}{path}",headers=self.headers).text + try: + return pq(data) + except Exception as e: + print(f"{str(e)}") + return pq(data.encode('utf-8')) + + def getlist(self,data): + videos = [] + for i in data.items(): + videos.append({ + 'vod_id': i('.image-line').attr('href'), + 'vod_name': i('img').attr('alt'), + 'vod_pic': i('img').attr('src'), + 'vod_remarks': i('.remarks.light').text() + }) + return videos \ No newline at end of file diff --git a/py/锦鲤短剧.py b/py/锦鲤短剧.py new file mode 100644 index 0000000..b3a2dbc --- /dev/null +++ b/py/锦鲤短剧.py @@ -0,0 +1,147 @@ +from base.spider import Spider +import re,sys,json +sys.path.append('..') + +class Spider(Spider): + api_host = 'https://api.jinlidj.com' + origin = 'https://www.jinlidj.com' + api_path = '/api/search' + headers = { + 'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36", + 'Content-Type': "application/json", + 'accept-language': "zh-CN,zh;q=0.9", + 'cache-control': "no-cache", + 'origin': origin, + 'pragma': "no-cache", + 'priority': "u=1, i", + 'referer': origin+'/', + 'sec-ch-ua': "\"Not)A;Brand\";v=\"8\", \"Chromium\";v=\"138\", \"Google Chrome\";v=\"138\"", + 'sec-ch-ua-mobile': "?0", + 'sec-ch-ua-platform': "\"Windows\"", + 'sec-fetch-dest': "empty", + 'sec-fetch-mode': "cors", + 'sec-fetch-site': "same-site" + } + + def homeContent(self, filter): + return {'class': [{'type_id': 1, 'type_name': '情感关系'}, {'type_id': 2, 'type_name': '成长逆袭'}, {'type_id': 3, 'type_name': '奇幻异能'}, {'type_id': 4, 'type_name': '战斗热血'}, {'type_id': 5, 'type_name': '伦理现实'}, {'type_id': 6, 'type_name': '时空穿越'}, {'type_id': 7, 'type_name': '权谋身份'}]} + + def homeVideoContent(self): + payload = { + "page": 1, + "limit": 24, + "type_id": "", + "year": "", + "keyword": "" + } + response = self.post(f"{self.api_host}{self.api_path}", data=json.dumps(payload), headers=self.headers).json() + data = response['data'] + videos = [] + for i in data['list']: + videos.append({ + 'vod_id': i.get('vod_id'), + 'vod_name': i.get('vod_name'), + 'vod_class': i.get('vod_class'), + 'vod_pic': i.get('vod_pic'), + 'vod_year': i.get('vod_year'), + 'vod_remarks': i.get('vod_total')+'集', + 'vod_score': i.get('vod_score') + }) + return {'list': videos} + + def detailContent(self, ids): + response = self.post(f'{self.api_host}/api/detail/{ids[0]}', data=json.dumps({}), headers=self.headers).json() + data = response['data'] + videos = [] + vod_play_url = '' + for name,url in data['player'].items(): + vod_play_url += f'{name}${url}#' + vod_play_url.rstrip('#') + videos.append({ + 'vod_id': data.get('vod_id'), + 'vod_name': data.get('vod_name'), + 'vod_content': data.get('vod_blurb'), + 'vod_remarks': '集数:' + data.get('vod_total'), + "vod_director": data.get('vod_director'), + "vod_actor": data.get('vod_actor'), + 'vod_year': data.get('vod_year'), + 'vod_area': data.get('vod_area'), + 'vod_play_from': '锦鲤短剧', + 'vod_play_url': vod_play_url + }) + return {'list': videos} + + def searchContent(self, key, quick, pg="1"): + payload = { + "page": pg, + "limit": 24, + "type_id": "", + "keyword": key + } + response = self.post(f'{self.api_host}{self.api_path}', data=json.dumps(payload), headers=self.headers).json() + data = response['data'] + videos = [] + for i in data['list']: + videos.append({ + "vod_id": i['vod_id'], + "vod_name": i['vod_name'], + "vod_class": i['vod_class'], + "vod_pic": i['vod_pic'], + 'vod_year': i.get('vod_year'), + "vod_remarks": i['vod_total'] + '集' + }) + return {'list': videos, 'page': pg, 'total': data['total'], 'limit': 24} + + def categoryContent(self, tid, pg, filter, extend): + payload = { + "page": pg, + "limit": 24, + "type_id": tid, + "year": "", + "keyword": "" + } + response = self.post(f'{self.api_host}{self.api_path}', data=json.dumps(payload), headers=self.headers).json() + data = response['data'] + videos = [] + for i in data['list']: + videos.append({ + 'vod_id': i.get('vod_id'), + 'vod_name': i.get('vod_name'), + 'vod_class': i.get('vod_class'), + 'vod_pic': i.get('vod_pic'), + 'vod_remarks': i.get('vod_total')+'集', + 'vod_year': i.get('vod_year'), + 'vod_score': i.get('vod_score') + }) + return {'list': videos} + + def playerContent(self, flag, id, vipflags): + parse = 0 + header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36'} + try: + response = self.fetch(id, headers=self.headers).text + match = re.search(r'let\s+data\s*=\s*(\{[^}]*http[^}]*\});', response, re.IGNORECASE) + data = match.group(1) + data2 = json.loads(data) + url = data2['url'] + except Exception: + url, parse, header = id, 1, self.headers + return {'parse': parse, 'url': url,'header': header} + + def init(self, extend=''): + pass + + def getName(self): + pass + + def isVideoFormat(self, url): + pass + + def manualVideoCheck(self): + pass + + def destroy(self): + pass + + def localProxy(self, param): + pass diff --git a/spider.jar b/spider.jar index d05876810e5999f7c1571bdaaa9d0e53e588cc31..10c4aad2d5a8a6cdff5c79d0e37de8f5eb8ba30a 100644 GIT binary patch literal 1941888 zcmX_HbzGC}_coA_l4f*n#HbB{!2s!QR7!F*iiFZAHM&NQlmOBw!Vt`nB$DQhO;H?ljdlWufgz6yUNX2} z@HRR!56{W2R`gc%?=+0JUG0rJ)$>5NX0UaOM{Vz|C|7UxBLNw2>f4u4*)-;(6kHkL z+n*p3ijs2d(w+{jC>=dS2_#2oFC4D+Ue9kh&o+;XvG$(ywymYNQ5gz>d3R7hoGHD) zw;^s1PolZtJHV|Jl8M6p!&|UPfPOnDS+qyW-Ps(DW}*~_+V>{}Hkm@|+X@~fdbS7V zKe)U;e}yl1zCU3?!h*}|(pZc&DaRshD!vMe5`2-0^Svjb?GJ7%kE)%h3v3#ep9@Yx zb-ly*>9!ZoBobToM<=n|OcadM7c|Yi8BFT#ipJK#OPa6TLk>@JcGbT>;F*Gw6oro$ z6JViWbV9e-`yZdROu%gkKTtJmEM?kYHw;24qsKoV-57U+q0X)hVv zIJoF01O=jvBVNKv6S{?lxk#*LpnmYJ9Eyp$#hq$<9Nk(>ouGt1FStGLN9}J1&c=S% zYr%0Xfrs21o7xOC;pX20$M2QMmt;DL9*1pfUyW?PzfQHBOcNn#>}Qfbc^Yd6c>U z94y)Bv?c`I7V5?MBSL?!5)bE5z Ww39RKIhcuw8u-F zwCBSUPgw+_4JB3O%k2d6x>`Vb=h5wjDwtD{0I`8p{U}?s8~oknBpc9n^e+s*zBni; zIrN}wFgnUUD8O`h^F)Q~){77rw&59 LjF4^k?MTBWyKRbNk|T7<>2Kr%B>WXknf2? zZ|k !IHo=P&jY+-_T^ zOs_(4TzV`E?{F9S*k!W71M7dofI^UIA4|gXtJvW4!!~Vm82i76U=O_Q|Mv4KeiB0$ zu+HS`H^yMa;0p3KvK>CHQ{>0?I#=Y>J;6`kUu_o868nlm8y~J{X6= zjk-5*W7d qX%o#@O0)#~2tvy{b=gI-cUK|J(IX7G6HR;m?ChXMcL4 z9S*%Ey=g&0@cioYGpQR2SQ=Hb&)eH`tOgh@n2Fv?cu{}1$a`086=MBEpNutQF34{> zTf7XsYDwl3_nlDuwwGesk19N2@Vs1;hKC>&oTmgf=>ev?Im zWg@*2*gC3zibnw;x^>_!i-eokL{>deXiBK35>13wRx1Hf0z;cE3T>!h>r|(pYhwFD zV+?~n{iwUam4|F7v?_y_I2UcH1U$cnUV(1~F%KDmnsJZoKgn}%gD0pmc%D}_QXX`w z7WSC$)oC-m!@r=Au0u65n>HQlCQCL#+z7NPt!iFZZSv}bd##_{30{iAL_0&obtx 9Ep7m7W?KCRcI7vOpK(U35bo4pTl%?{C z*!ez{Gy`rGpZExGGCGs6;UqTV_rCsu0^b_rm&aCIstTo|RQ@+g|Ev^vu=(qM9~_^! z^C^#V=z6xnutST#>52tsaLHsQ#YjA|y|_K`X7HR%l22i9Manoy^4;ceuq+0Z9)jj! za1}2ye0f#QDle{CB#ZbF&t1)p=Xrt&eic)#q+>sP$NHZZi~nA<+|Ni|za`hP_LHZ; z)P1V}64O>#X`Z4xgJYM$kUD|6L_X^uq) 1tIAVtQ4b{ZttKMbkE%392;H-|;C4$w}J8|n2K z?)*h`nssCe69cc7A_xj`Q_u%TI~SBx>wU;yur+cH_#@K$b=1sXIwC}53#FZfu0vA^ zQP~gv )WI}x;|Zml^wli9_$%J@a&n&yIh z(x+}xKjb9A9KUu(4tH#8F%!SVx5m*`xuxa6(oeUhsr;&G;L5e&R57_fap!iq$cSQX z)}$TC8H}NNS~inkEefBvIDN0tp!nMEE#2CiAQ$85I1r!sl;isbsVV3xG&Lb*#YSp6 z??RcFTX)Ke=;(Ao7oT{FAPccZj2}Bl*T<$yRcVzgfM4g<>PuNsH=fSrX4*%03$tj^ zsmiA(bdx^mvS Uu)em#Nooh{QwiE+ z-8vmsSldXWU20%2Pg%XBb!+~C%0I>WPzzj%!PA+ntzFSyuUNEVtGP$0Kj&&ZJ+aJo zYu>mxvXoBSQ~jSLM3w%(B!pf0pClBKxB>^(`vY}4DKL`?992n}W?SrnLZ)3s&iD0{ z2S@;CbZhsjHS%jAW1ZT>-+1uobh_t2?xD>O?W-p(De1b=oGj7i;*qe*b+MDh9?L>m zC{c`#@(5A@8lZlXN1^|D<@{g$Y0cO;LG?T&`_QFH^RHn2?0;N+Id6VY2NuJ|!d?r6 z7r~}2M!G@KlT|HZ L!r zpAZ8CTA&xzIQQ_i&pF?|r>sD> $zMlYYjQ_p3R>ED$Dj~Lcl@pt` zP3Q0@uEiY{)U|Ae+L9nd$ ~#(eDOX? zL3y?uqVZo+-G!t(uY`+-6sH}!3JlXWLBHhJNr$NP@lvj}W_Nh-L`4{Xdw7yb%J5eE zj %Bz|iXDrKV-)~xV@wNScueP59o9EUjU)CPF`&o19T~iM^ixB}& zGez%nAG<7u?tSG1NM8RI=H>H)oCV;GgTx-yEZH^)njj49ZX6V(0h|aiw4AWF@CC{Z zVduPt9=;iL)9xyrJ@2MX2`uaJqWBG+7z1^5dzOE#kJ!^$)S0oaE8!mPNyb3u1DVd> z{ju!>wckPcFNilE#&&p0MTMIddYz;WWq7eE8@+SVWEs42?RMNA=SivqgE#+mqa|xW zoAMs$DnqKnyv@VO(xfsmE&s1I?EKh~*owTG%rNB=c*RZNsUK5TytiTbmj`k?%G 1-?QxYIB Ee%dEPDU_vcK#xa4pMU3H({ ze
z@2g<{W`^v${C_gT?mB3GxHwMHgU_)`XQ6fJd}IHmYav*%_3m|>q@_PZFth_Pp324U zk`V|nPHY@Bq4XJZtJ>7MsH#~wt2PgXdC1@{&Si9Y-bpwuu6gC$s?BV|-&Zg9vye2n zPWodUV7)AS$5D6pb4+K-zbK-_cstEUK?G5NH94Hb-0Mqhu)wp}>AXjjJU9CSm<~$9 zJn-QFUjQU_^SN_92+$5UrYEK>fU2LKd zb*Gx4JarX7!n1{d+P~Fz^S*#i%)e1!=f7l`5DVRaR_z>uH#SH4fQ2D<)CK?Q5#NN8 znVj5!6;(-P)t#mh`RBJw6-#$7{K1$kOPBpUORO_=g=+sr@tglB;xWN(bUJDNj~;l@ z#P;tg1}X t)g-7yR zqw-hmANJL_hHm`pPDFh@^VcMpZ=m^~N$}76^Z%Iy=Ogc*{2Pz4mS6shN2Vre&n@7X z_R|)Ve|~P@$onvI9wxAV>p$95+3sr6(ku)vob))!_@4}0KgsxmUFMNc?aHZtmkqLr zyyXA`6ouG($;!V@2*~^q%~udX^$F%QBhvD3@Dm=={O@7p*@SDR?hs~NxU;&?TiUsh zOm?onU?bDMY79(q{})##FkQ2g_KXm*9zK@SY)YuNz;G%Txjd1z!&?<#%jeQ0mH)Kd zL!@ xR4eB-s`b%b)#b6S;Y(p(r$69lC z(COPZf1*B>Hj_aEuv7j>S@A3eiq(IN#>ojf{gWmO)N1Lo8Di@J&K {Wb_yzbcw=3$Q z_QZexn`b>oae(4t9sjqC_@Yal uISC@*r_+V z`&q{`5(a1tVT&x>il755?&hMfnfYro_Vac__N*Ie3>ww{)i2^ s0cdj`u@V*g-=1O#%o8gMJu|GID#Z+LQA zsJCo#gkF{lsu<1S!9g~%eH$ZT?qA >e;Q>A|n7Z=dvhid`ZpOe=k2w{%TeB+|*t0Y51F#2t9-P*7T^_V;kqjVTtFI z`=R%`G%tfjjR`Ci;EW_aw{VJg_wR@P?&LHB4XWPCt1?9Gu~{*=a}*glD8i27(?UG~ zV^h1({aYp&K+JU`2d6jIxqx+kzX2sH95w4EWP;G^#=y*39ONs;ogjLW eenv!*{2Y<}Y@-sr~wa7Dh$hE@KRO?g~Oxq5RV# #=soP)nS&u9AX_goU?POEL{Aa9d5$UFA{N6(2aZ_J4ou`ZD?Fp!tMl@LXwAY5M^r zu%yE%*VWCz=&U`=?qjEHY6eenGOh1Fk?b`bZ1baL)*V6W4<{24d@GU>3z3iqaQKJ* z^V84ZV~s|N^eUs$!5!btjXm^R(CK2Ig`)CnW%51@$ynb#%+m9W{G%_x7Lbs*IaAah zuXFyFRh|!LaE3B*d+oFVuxsCPU_#$9+t%_b?2_rQFC&!el+N4r8O48|d+Va;$-dL6 zjbd&uZ3`u8GVPZ&tN#PYy}@e&IZuk_&Dek14Ftt6Ejb=1lQP`SUr*Ux*T}CEo%t{r zLeX{P{ew7Jwx#!FRf_6%1E9Vi$7O#`_f`0nm%qLhlmK5B@&*J~UT_Tp=AV0nZhahq zV;la*g^tdF+7z1Og$fN&e9d#fm#Rlyh955Z*D&y73C;p}zKvi0v;6vJ0n5)zqk)e9 z^9#^DtGrvL?&{v*BT=HWrCxXsO=craYyL)E8gNjC0a0K>4G={;UAiB9+VdP3TqPml zI)w^L`;Ep?KuhCIq|kxgZ*#rvOXJ-2?S(f7SYYNZ`=VEUwG?OUO`t{LI_Q1BkwDuA zk}<`-cV*cE Y7l)60Q#H=QF^+GGE;qH&qIXb1hV_6}r0B z$37RFn!^2sF~1(+VLz%+k>~!rXCv(4G`bh+rCAhi(uVNEGw0W_sDsAOJr6=B*Oo}@ z%+{;H=ld@&VNNu^^s?6ho)^waAjiF8se$1p_mGHrZg|f@HYOAWmi{n;sK9u|E!gDv zb$Bz-e=z0?G H+%E)ys>Ky)1o{^`^=6x;{nF5kW9p!o*_3=r3BAP=|UW z$L0q?&N1M8)&JFLOFT9Rzy)rtLVqS z^V7Y9ZY!bJZJy%Fua-XOx`KYTZ3K5$F(<03o3IUqq%rI~P8eeFrb`Yt9A)$~i*S%H z?h1fpCGu{hR7#rIpecehU3y30FD0kOm(guyfHk(`^|fC1Cw5Tw^Q9g=f`sAKm$1xo zB&qyyWG=8XQc)58-XC}AFZ)c~CbgCyAR!xfLsDIuuGpN&r*7 _P;u-IbD8p zU|I5`VwIc@(BJhfq@d+SMdc}by;LT*E`uYYS5!MJDopebstmwwg*8awErC0$YQ~c( zw=z71Uv<9acV-oM#C(i)SA4*{Zr^+B$w7Q=)QwV2Ut<^2?Zjl%hX!ik1Iq89#3Iy( zFR#;h4!r~#!bg*74h6n~-U45mOAcw? NV$E2v~HEJ{Z&15EssXk;{tbP~t73mqn^_5M$(U9L^s$hx1gU=?# zO~4TWeDlrQz_eqdi47`OeGH@Y6)L~-t+2n3Fzg @Wg7XCwg!F zyf;;)refaFe(rDZ4-drJ@0!k~^{6MmXzt(R#Go)lX)y(d&)+$NO@d8C>3n??#R?~b zK{8$Bmx{qJ7Uk0Gx=5 SS6MFiC40qfJ5_+C?Q@WD}L<}T?{gG#^p#SI*ngptIvMhg?w$?SboPinO;JxfA# zT*I;8V3QV`!=CJoqx_%5@d7!^G>6a!^ivrgK&RB8oB4sV1@bem-%Qf2=yAKXVgl>6 zmJ)S7vGTD+aE_YGiqS=Dpk4L>(57S{7L)3Rq(9Ew`ThGNgmNKLK8FSGB?)rcV6xcA z75z1w{-?7!Jnx0C8I49Y#A*PB1>r?gzwU}--3d?0!xIWnNA%BG>XyuXne>^`SQO zvjCJ@)KU5lk(R)P8>Y_}&3F-BRKWl)RH=uTy3CKA%?i%)UtDLgAij{5noc3R4=ATu}>iP(Bt)@b8iiF$AkYA9% z{01 Sar;Jn)g! - z3hqK%#Pf^;bNG@QXJFAYLDGS=|NMa9u4tYbmGhj7q_#vLg^4A!3i1;~up_k=sym5< zHNGn9>ozrWUT1W;WUeN%spUcq2V6c6Cb|I8yoXPZ)SnixEmKZt4nB;ir(L^U2zpBe z-1f(a;}n1Iqr{nVt>}qsu;c6o=?(h)RmO#x^g!-0KVam6OFI3m6@!;z5Z+UgcOHND zZfm6?tP6MbR^GU1@U^L^h?2hi6;CNPeRZChvas+ xpeu3Oa4^_$bY1V0$Qq~Czvki1I5k*;{^=dIGB;FzU)GfT5@SBz_ znbY30=C`vREs8gmg!IjH4@lcK$eQ^W`7f|(U5}hDx*Fik^#g%3f_36FQ3v670!1on zxIG&U?>IMH;NLXAw}u@vo@>urFC#(iiH*WuwlxZ^rd|T{_9FsJ2g)xZ9@g90ptrk? zXkNloTJfaozlZ{Ivy^Lf0>CiHy&jSyxGhJKDWoiv5F7`+b-U;X)oUpM;s)rK0o~}{ z#e&A6N3(S-X1;?zLPap2qs=v`S;y?a3I+Cf50=zsFaFXGy_I}qK6_wbq^p1N8PY(( zdChaw2D?35cQ$kDid^-k0aAK?+@8`?UzqC3{z%2>$%5bgy9}N{Tad+;>UP#IygNiW zyyr>y9w;b)#53sf{`%%1^C>~R;xQyJ+L*7j)3EpC+ZAPSYup>j4{yI5=Sv0<11o$t z%SRxluKZYHU~TfH5tX?dttI7MEUkWf$(!)%R_8IA=waimydAUFI?;anUWIdJhv%2v z&cNphmn)*i1UCD)V^>wQ%r?@m9eQ)B;i@g+>J=ni*nQym=?yw{<4Arv*P@4LIok`M z6*sG{`3^Kh8?e%J_O{Esqc=OsdCEPkTMsLr7i+0ZPVD*T*8{HB0eC45(Qm`~0n>PR z>0CzxM5oxCwW$pJUF}3&&azN_b?&{x>laoAH@{|oCzgsNS{8T)xYGPU41u29&MaNr zU_mU5XiiX&a#mT!id7eK4 zvOmyd8D7{{=;1_S()wpG*Sgy@;-PikdmmFcHOm<7P)mkx>_*t#wq#Ajs7o1HDl8ng z&QG}zACZNztyVJg(c@j1!OCq~C? a#y^0#N?Rk#=wqtFpIS@v`Y0_B*au*)>RG`08ITiMmU-m8(NcKo^+vt(B3own z(DL#7rfv#jM+M`%;7m4Da6uID)KXAbaKf_K-ImCxx`$X+DA_j!R}4C>$o}59OFZZW z=%4j#M3JnnLSpMF&Z)2^ZTz&C#XKaH7uW%$Afi3d5_{cOm-poX&?krk=D%{w`PPBK zlec;0@1&kZq|b$JnCQ#LVWBI^OhKuAg6WKMHWj0` ?3;@6qUDet%Xk#lXO=T8T({#s@F zoqJ&OT`oyNUsB4t6y33Q{^eA%9H@^Q3@@cB%o}h}I)KoO5LI7vPOPgB=DGvPmyxbP zI)>Yjp$0p6?pkZ=&0UnHZ`mrc2)D+9&|nLpu<74$m_##g^`7bR1bPs$SH;?sKJgLd z2)8Rth`XKv@yCL4)`h{gHJoN!BRtQ8?%OyKnYuKu|IV-blXxJJ2aKBXnGsM|P-?R` zB+6)=y{Jovutd<9uq?wQUNUBM*wYZ)V*wPz*$mXhcKgA|U%<^n(xZUnnH_6<7MS9k zwyoxQ=4)uO04v;-n^kVjaFwJ%j2aPc=NTa9-+y4QVtBew{n)2JDwGWGS&>G|mst(8 zVqCi3UJj1+g+8 N}ziIgt>eBBftcX75#VcfT$CX`GMqzXDy(KubDJsJZXQSjV(Vlt3SL>Fetdl)?V z_Mu{_D5VyxrV7sL*BY{@bM!`V>_&i9Nt$hgf=ooE;hNpV-ESd@?NoY?K*ly$>TVze zA?Q>*isemfc};By_FlxP{~hxn=X%&Xy7j17cj2+)Bp3U!FS~1E-d)D74_X@yrK^hv zw3XV5{E_O0_v)Zmn}!`b#4$Y#kSwY~3hzgwbrtV$zm_k)!^6?$iaMZPRJ}qGFaXM& zjOdT>8r)=rx{LE3C9pY>IOD1!IWB}}anaQ=WzsfqweGG93hd+Mzwj)PMI-k(`nmP^ zLhSHQ1Kb6NJKx?Bpb(X}OQ&aR6=ZzJh7VCfqDQ%vM()ZDT@!h&OJDPAfl-LjAJGJP z{R2^YLob@9vK7AT$JyjJ@0gp+Z}7~NWQA5K|4dnpiggu`p6`<+>=SQa#?vQSCaKPn z8JDWX)r$?0QAb6K%g2Qn+Zy4=TYW_Xti#B;9Bpdl5xBO6SmH^?1JO^L!!Jx%3`jX| zji28xUat))Oh4^U7k#Im>1z>24J#2mPMybl3!5A#iDBjkt`R~q)u=LAMS+>pi?%hg zkGF6Q(c`pWSa~MUdE1~e0W53Q=eS1k>156eUmZ1#TFB2-H>#jh{L|V!2)UD>b1^el zM~b5QWir({dc<`Io`i*>)FpSx>;PlTc>G)*k)Ew(GV{?-4g5%28 zyQLd(j-g&EHpPS5tVUkaKM(}OliSI|J@0= Ulzmw~-DSSt?3eOjATUVR OJ>drirZP-=< Mcy|fYYl5OycJ7|pEE9Y(S9HvjpJWo$4ZtIsf(KpQ!bG^}+o6%QGP2{*tD|$?& z{s8X(L67J7p0y5p6}Q}U&I=zsN7c!43F>|R8Z6ENDwMRoNOY+vUM1A1)HP|{aF~vh zJ#^<@R*365?Q?kER>XEX&L51=mv$D)zwX #0)r=Z`mB<>t7jkx1I`zn z7FG7g=K`nWo*b^2^tjV5!!WI bW3awRh*<-9Ra#erRp84sI&OA;o zOaH{k-T;h?8mXzyq(4n@V~5-0dFI+PZKp@pG`foHAW4$Ol2VolUZEuVo>c>{yelwA z1a5gzeA)VE;lplo6V<7_xQtau;Xbb<->Ou$%z=z2T@A}>Xe}gxd(Z;vMxTsZ0e2Pd zR3a^WA5Pw%3$4-=P4xz}YpyyU>0H>zv%c4(2evDWOLg=y$7njd=jBqBE8y=VudHKf z>r~CQ46j!op}$}UrJjf6yg4cjs4&i_@w3hjJI+`&^;Fe}Dw0hR!_qN)@JykOw13_x}5>WF>n6)7=-Ad=+am$#ZI_|4O zRSAy|=RDw5QyE}PI|W0!&Dj>FuoEC%zI4M?3Gc3PQHppvhj8~OZ$}lqi##y=1WCQg z2gFX-n1}!4^6LB=)y(ixa|XAIA;(F;n4O5SM2mSvlkSZYifrzo*O@<4=Sl}O23>^p zox#dATd|D#4)J(rU3g)oU0>wg+d1@$qF<=Li(mG|tLaXb3!4Jm{y|HsVPwrE_~vXo zP--&z4E~7j;~J1ps L(lmgZHT(vXABmG_ryVhLv_+b!&4!_L(5-!ZBT9?RmDcEFFU{n+T4f4>Z~A`jo!i zuDD0H s{nE>vnqj#Y&+Sr@J)DWheVYt`hj)_GQ7W@t~1wQ%;srILRk-t{Xy$Cn# z`DYt_NoqRhwkquY7i_QlTuWvQ-#Y9CuB*Q%BI#xK$j9gbA+UUr%ZCATCM&r?L>1!Z zQOf5-;gVLompJdd8BbC8K#1Bu<-xXfbT>B*6!Wk{0i@RZ;?161Q3yORepg`vxCUCU zh$(&Dcz>XJ{xVYz@W6LGiA$*^TeNH)taXn&9msyHZrytH3zHRqH=&&2#!0Wz2a*jc z|BdVV_$q-MkxS{;_i&iWB^;8~hA8I`KH!3WiM|(zB8p2 avJS(ZI^1k6nuo%HG-*-wgOlI;~I`9m$3@Fn^-TxZwaa`*I>E*Y|X;-wqZXJ9dn z8{&$I><_guT$EOFp&Pg8lh!HjrwvJK;PNlzH8@l(70(hzEGb_`yoz+hr|4Ivqd0G# zy<#o5=oI#>R+#k0vcEQX>QueOn^v3m9nJPIu1TrFRqp1B<^Bag7}M7J8`xoaL|qEg zGKO3@mqRvMZ76%ZGx5h!b7#*r3Wgc>ejTW9UYaeV45uFvNX3zl*o}G7^}N8e{bUj^ z>NW39{3Z1M_=&tLPfvZFx(Ofb+ZoxjnyITtW#5$16Z-Fyb<`vhA %35ci0<1)P2&ayflDmD%N*f$FikP|DN z!AD)hf{Cmr#KgoL^h0SjBdkmz*wy(D Q z$jFqBqP7+0;yLcTc(ddRS)kL^5h^mWW7N^v6*9f$%PvU-#BX0FxRsKVg>|r;noG(3 zBI&XiuuP 6>gfytii@q5CRkPk`5y$f0V)(8E{5WU+! &d8xIBf5`Ju!EmF@-vAWbhn)Y(&U zNHi`Cm?&pwr5u!t;K_K-v_w#YG%#`rGBnmPEs>Y1k+l0I-9^_&KIBF}P?@eFFN@E+ zK@DFbM499qHetd!Ryy5wT Mg8)JG=UFkoyR4SjU^={+luZ>5VfO zW!%IyR@=(UK_N*7VK=EplQ~LUj(b5!izlt$5;gpst!!H@{ynga81Rx*%3^71;9x5! z0HS499S<*LS8}`<%cp78CHS@i#4{v|dY(CwYeEK@16moF`ZbLOD0+)pK_RX}>XhFJ zrOE1+A@j>@wE51n-%n4&)UO)>FwHBo$3(mC{nJfLib`ySz6GcYGXCjF(DDyndj_}8 z^#w?snHoWePW4MGfBlK=JzaO$=T~X%EvohMYcWPv9}`MQ7ZhkRhwhSPpt)ZSn3}&g z&K@%>10-pZ-_&TvpQO%o6?7xy&m1V (TSBbp%Lhn7K;Cm0Au7 zL^v_NlN;hLsikGQv}9RQ!zF5(G9|TmM`_;a{#cs!kSlf3ml16dTzbt9VqzWRocpbs zw1?u!AaqlF&eY&JGb(#{SOK|1hbH~(A5{eXY9v%^NM4=Z>5?dgQ+iD7WI4oN5~lhy z-Wi&8@Nn)+H@iXlfXhba(}pk{2ewXCP<}iM?7@eu`2! l@sxt3muggPO6!XIBWXx@Z$XASSbQRkut<%)M! zz`0XUXC^qw!?f)QpK7^MA`72-B^t#hnpMd7e$3EPS`>`^C2Xo?PY8|_L+XE}GYQYQ znLSqW9gQVF$hQS}E`-8jkcAAENm`#VtQyc9=*l;glwCm- GX7DKEhA3PF|o%$;Rai$qFM-;O8IU2aQaRy z*Q_BGgY=F$47@KiZ6mBhOhY`TV91GmP|KOQy)pVd6IZmCbC&GPx0`&QLQ-ViM~K7J zg704+_Tv#NF175`iEsgx>pZD>h*s+7g&X21qb!Z4O3n-}+=H~~5X14b$ADkPK6BuW zYw7pFy??rIk|8fuB^gfFPggCGq$ZQzX`2dr7#X59+l;2*zElM$AbnCN{KHZU6p@MC z2W^RvpNjZuI?=7mIq(#4W#MAF0W}H>l&8$A=*F3OCCK!E0%#TJ-XBft04V>>LE6mb zQ`wt!+RSgoqHCt!6%};&+pf-^U5)rIvl-Y#BM@$Xw)5S~F@M;k*{>wYc`N=x@r?CE z8JRCmrg*i(zU{k0uh>I?e3&EsvadifU&-GylT=;U_0W}#z1C;a?4RrfrC|>?s}kQF zPXeMv5`b_A5Fw4U9v9E66i{kfV(y^@oBH+VH~JyIh5SCp+{Qv5(DQ`LD_FN`5qgei ze-5l9KB4ao)^lXIV%fEM-U{iT=a6mbb7FleZCfUkV`(T)$g#^0ir}`eu3$Y^fHF|v z{O&mbzL3|V=|>yPGqMF0H7Ya@$(banxp-$qKaxl?8qg;h?-5uc!+SY)Yvb8|L=uPw zJqMmE79GHlo&2Xu$^l^uKTTrSq{_J05AtV89RaoM#@*hK0q&2_4KNo}E7c{nY5+QE zXmYIR7=k&oU_ED+B;W|da-i^^DbomE+>-HGQ8T>1Ej=eu7(#In1LRr6+*(kI7ZfKL zu(jHpvyZ{Uq2(4V`|qW~3fz=-(UqLv=zI4852Ee8bj=Mppo-fEiI$-1QWeFgI$cVu zv0THI!AsR*Me1CQNvh6%(M+YQ#b%GMv;LxQ2pe%;DCl#{v>3dX8UTRzE(K-DV>)aI z2o|cLO4Z7$^oCH9XU@$0OgzzoGYd*1;djHE$`vjG$h}z53(ajPQPx^iQh6V4=y9{| z=AFXv+)GM}x Naw^$28LWo61*J&6*3Ht<$j?>OT_T0@Hw<< z%M~AFw~;PuE@k%Lzn88 AunPxK$6MkSzFRtTpvxB$dX3=RBJj-XpPq4{}ynzw9gAQ@aIXLF+gU41(a zYz@gy^4pdg64M7+x-&}+FW#Gn6w>k;>aTr_-&6aTGjb4h8m3R$Mc<_s;Y_64^5N=T zSlZcXWXZ#TPC+wH#75Y#QS7$j_(8$k7d-}E(4N`YK49~&l6!1cBXiZGBXox=S6q*y z1pf>~rLVdIH7!GmEUZ6mm$^Z=g3@ZdKnc|S+ImjxURvB)eX%X%@Ena+fPJnHYgJ36 zsmZ*|;;e)fd!N!Sp4_AdII*{>9Gox*f=H6l)X!XGH3ztojxh9VdcP!YfxR~ST~*12 zt)f7c;z(}z7R#@nVsoZx&4EDgAphotr(Z|-(OJXeb1N~e8oEk6i7G%WY}{f K%I+qi%=X?283J DO0!&)bN4w_j#R zp>eE)nm;V1Fc;tAsOPpWUeR_1kB*^1_8#N{dR4~vIy!Erk`>6N1T?=as<6Q}G;F|a zxv~$N$~oWD_d;*Kin+tYRy=szx477;(DdKoqM1r7Wa zIyu0z%;mIA8pE%Di{Y99FIc_B{2qzVjY*sc9 o(fT0zAPz14X{dkQdW}LwR;fl*m9B%z6&&vWY0pXw86e!isUcpQ6o8$;d50by zQZ1gw{fw&sL;)(dmVW(LaIIhDp7FPvsu(XGfS#zc(iMx&%eNZ QPt9ul;FjP=a&^_a-O*jg=pATe~lOO%cWi?%$o#*YUV$7fhU zxBGh-Dvy*ac2v)qVcQZUsFy{Y2<+uIBzlvJ{5QmJ0+ETekLfaDTI6lce4P11q%%>5WWSEMgm4Ronkm>iZq} z@jTyrwF>~`iJ#xsv1Wb2MsP_DDTuyz%IQ%S)e?E7K+tQ?@0{8wa^5}=as!<52i@$) zOt 3=!u0IG65DCHvc_pGQ|yOyQ#L*?SgySx49bE~4t%nEn+ub&M4AiG1mJ}X z!bSXZKsTrXg1*4br|Pl>GQjE$g7@*|tkLwt0?`oj>0$!GB9L%+G@dcC(r2V0S;BgdVEN3I(^~8MWq9OX>SH#*B9Z)dvNB=T zv6NXoN1AO*v;nAE!%HmYH|Dv4Sdfz1HuJc}2e1|~cM!|$h9ZIW{Mv+_A%3F_fU# z1X@hI9+j||I0DgEtf(y_-|>f9N^X3hS|c0$q9UJn5Elw%+jM-NEYYe16zP)qxq!q1 z*i=a~3+#r%{v~|++#qIxCV=MKE$)l-=zTpG8n7^AWPXT7XCUH``xbDsV`f (nh^pY3k?F@{%Gjlq7=mEtTWBiMfztj&S2RMpZ!u=2B9kcb5n(&-7Ca5#JoJ* z{4mz2)BPqf=%ceIvzI`gIZM8SptxVbp~hFUN`c6b)C;2mhKa}5husH>ckKUY(6c9d z`UMSi4>QLBOVtxGO6-oFZmL#}J^*ptUZ4n2K)jHyt5LU+F9tNP3yeqAlRAOC>%s`e z>7kabudJSr#`@BCNiDsKzr_VQw*fo}(jBBH!(l&KJ!CDqY>!%>y?_=e|N3c-zi6!Q zk)bU1BkTBK+98HK*_r*QpE*bQ qS6e z-ucO$qsp{MMeiJt0h-T6-YnO4+)i%*l#+G<{810T_NB*WWtXM@YC4))Q5aZHjVGW3 ztBB7x#3-pNT^D_i91n#iR5D-nLXw3Bhc;K^!(q@d57ov3We# VuGqE zWq7|PXhS_($mV)vBw!T7@W?oiNUEA&n50H{eO1lv?O3#}+Gv_Pk!14sWJe~-1kMur zA@+yrLZH6R{QAMQxiRT|Wk9?Wf+Jc_B(vu#7!9}>MfT;NzbrRmFR+@}SWPn7SdXg& zBE*s5EYp}|mYUI_em7m;sPMJ%1CDI2Y=K9k52}Ig5}*s&K$Hrk&~m=`PEL);(mCsg z{ppQ}%chAsk4E$T &M0@qP>PFI&fk|hYMUwV8w$V10kempt?j6iL1 zrT5F5XmOrT=B&K*=U3AfxTe8rHJWjEhdWjr+z0{1*AF6qmX-h_f3utmD*OV!)gwV) zMi+ow6g2l`?DLf5KCj$f+v%T 0pF)ueM*qe$q&Wzjl0F;T(}yG%?vUIuCk;rS00uTU~ARE=cj4` z5G2-n-S9$!x4l9gVu9lgiG0-_-|q)>`iJ`y%Yi?$XXXcCobWC#zBO`y6M!6sU7+^H zv7)UUE1nv%)R64l+?eO&9FTH^G04-^G0OFvsDP};SIS zX zX=oF#-K1U{%WhWtnAO%T77G>t{CyURUnC&<2!nokSH~#TN~)Y1^uuL=RwPhHRih~S zIw&py+K)DF6RbTXe_x*@_gKk{kiV}l?K!zza*H#&@`A%TLRi(IiU!R-*M>)GnO_Y+ z4fjERBkKqea^6-b`%~XTmjD#OLW}WkWP@6+3Uy4JS&UFN!|EW@%*){C!(j00J$=6) z55;f$(8l$%C3y!F(|RRR>ReqLdn5zy{%`J~B{2<>f{0%hF$QVx{rl&mh ($pmXzpvMn_UedTZNCs(|p z@|SgAK9cr!QReN(5Rvx>4HSaqm3BXu9xJdVWy{^tbNf@!Lh~}n0R`_cEkd8E$}Ryl zD4)WQz`e%uI+8j5?mvl1z<(1%j2>NkVw6|?Xgq;shcouNo-2*6Mb~XGtpl{^l#q=G zAS0N{AXNq=UiC!F&+CuI2h`6vW2DBALw5pfcJGy+doSHpcWt1(^V|J?FYix|lt5qr zP0afxkuomoOBH_#dl;I7v*3I@fAeq1?+v*4Hpmp*z%>mg;GVyKzL4L+0h&IxsTl*( z8(E974SxxRE;VsR)$cg|Ar6#Kfi&*r&o2}1fIUDe5|DL-InY!zc~JhyD8Xu?g5-Ns zjilmv7fM4s C*M&Va0Vg&5ha+8&+QNB5KYi%- zUce)8+tJ=pck75Rn;@=%QvJTvV{V^SHQD==!+=NtSA6;C)-xx`cUo9Fw}Ay2^8RpZ z1OA)*C}ThcRdcVesF~lFd_bomUO> 425ai zzu#jS|Mx(yOyDZ9*OPg{7^A~Ek@VLmBMnm{*MWTiV*e*s1Py)vZt-Y>+>CA>(A*&a zPc4$x51X?EEiV8;=~CPctT|RRe9P&3`M|R<0SqS(I*gnk+cScB!%|6Il|+i0+?~Kj zJAa#8U#jc3$-6jiH>3^&PoZ?q?772|vHb7^%s6IOfcXVA*c9NA?o+5soj rvsm)pxOy!BPRq;|JRyBd{(r~f0H%#P}71Q4$#S_1l?~s zH{_5HOZtz7nu~aTJrZCkABItcAD9Iy*>Pd(qSpkJ<+&RdoV)Q~P8aY+l92DWE4`Is zM}Uevg|9rpg%rrs{+YnlnDedD|F lOBQv;dz)ILV@0qbAtmCS(% zIa2@lg0@Xf2hkbi!1|htaQ++Dfd$T8e%M2o_w8tr`?-? sn2)q=sCIt9_t#-Q`>@ z380B1^Yqt2_A!8H-$6O{Dc1@*&r>h}6T%?Co_q4&79VtWZ(Ih_YVx#56&VQbizs+> z?cWwH=ROBu=V|>sn?i)x6V7`wB*2rwG978dOn|<*Ns1W5$84Fva=~+jVhynpurK4) zJ~#ZfCaDMv%!#3n0@+vrdtnLE?|mt5M5@|YQUs|hpixl3N3|r1zN!oG%IN~-bhV9| zpLylk 8S!7%*C^HuFSZ39wl}_%R!JX$;uxzj30m z8s#9}LOuu|FJsRqu+EEI;PzDBwwFx+`D&CzBvo^DeN~VAP$K_(vXcPJqFdl|L(Vs* z1*!tTYnB}^RsNyQr%vc;oCacWi54J|=`_Sr Drpyp}>kK-Q&>Td8jAy$gU@f6ur zmmQ?a&s`2!T@w%*eP*r==MN69$N`FYwxY5NdpduD4F~y$F!S4wsj>>tOf(r<64vLd z1IB$ea4Toa;k~U?RRFWFC!gOY^Qw+0(Y3BiptTO5T$Hr8D=lE?gaACfj=WO%+d}6{ zZZ!%jf3`$-M|xEzNiBPNZEubkGvILNMc2p1J>5USI3~!L=L41?FsM)gBoI5G$NSI) z5bXRvvA~oVU`pzMWs~#;5VOHT0;y@<%=2vlXdHn?iyIsR-Y&8r0Y?wcV3Z&wrh`=F z1djo^oZ@kQMGdNp2`)^gzk^&K2-)#}?ViiiyoCG)m$0?}xGBIOC0HAk3+KETpuGSG zlTkFoJ9+jq>n0WNBb|wIkoDC;*`o6MihtW@1z?|nyaEH+TVx@kMvR+Jm)jFmkN~%7 zfo%>}Cj$f;lE0qXKX(v-cVr2z)9-X~UE?AM#G!zwZ~M#BNGZTP#d(0$)B>$*q+xxz zqn?A#H63oS-aNmrIF{A{^sh||&hN78d^eJu$D^pkuY%_xM!@Jitx*5vK dHit2!DXw&Y4cYS22KMfgu>abGF@9rfmG^ z%xTTwLw!Dj+=KS1{aGq?b*fi!*KQh }Q*9tWDSOj5?g9iY9G5+btxue#hY&;N`fg#p8Oy`WPZy z8Q @C{^aC1y4N9y>L#rE{VfJxu~?F@&SfEI`nkpu;h#%}2L2t? zd%8*@kL4y|3V@9Fl$!Uj+PVgE}5)-c`xes`CT$NTi^Q8-0xv%9U1>ZMqe#M zuWrV$E{DtC@=NXs3e%$<4g7cYm-tmJhKzAD-Ug$wqt7rxlX+vBcbD&O)LbAp&9RzT zCMo=wDFfAXdplkfK?-P@kfQzk4`9MA3nDZx*ycj*^|jwM!U>E!ciSO=M&@1dxPEmd zk!rD?mc$<|1!FTk;ZQ9XmJ09|12szdmp?!6H0kPw=Dt@{d`@`>o?uS*;o2-lxK|>j z^h@Wxd)vf)ay^Gur^*I?D(gE<95XlQ1-345()ZN>qI4Nvmbz8V3Hn7pk{zLq_(Xlg zyxpq_eM7+y`ZMZ^U|@hf*;!=n7ias+=)tvuXsE7TZ$tjB_xE7307RpW K?Mqsclzh*|<=(9GA5kwc0@&V=tE1K2c1+QMH#%1RC!u-FTR zYqY^zbi*s1)?uBF%{W ?I4t)F~?oa>5B=w2ZW62j=@)h}L zrZ!hbmy+A1njSZFr^ZwA=)1um O(jEWXXT=8G;x{>O@Lu(H{^X zvwQp@Wk!Y2b1c0%utxc5|F 4jx6>+G#ZF zAkk>q4TztlE=+juYaIwnHIML0N70b|^-zfRXSZQN0rB*$As5gE7$GBrrFuXAR6`)^ zCwt3X$4ee3Z)(vA8l=XIeY%z<3ofzZg{$D@740vROr3py*!+?j`NeTU*Qv$xi#b#d zZJGE6_F_Rg7Z!gsZLM5qpzv1WQG$>oVbRxNJDZOkh((5t?+!q**?`oQS^+YkK2iXi z(N(o|mfE%$ATvlmfiD;TK$dFO_E0vJ0b23_;c++XvF_v4`a5rN0-OaOWWDWq-Ly9` zGk&b(#wqs$%UMft 2{m~v7B}+t)iV#{8N5?OPXy(#;@obJ*d+pQ ^M z^a@}a5w|Oqnmx}xC6@i>-~qjmBQTCZN#2ZTOOj?t)bdK-bQt>0@dse-#Aok^OcRYW z6>4utmek0;kUZ~H{VDjhUuF*{YZ+QobEn_MW_Wi-1MWEn{t)#PboT5Tq7*S}PN5qZ z`q hUC#Qw(_)MG# z Afi8q{7l{)ch$7 zPmsl@#~cqCOOQ&(AyXyH$_0WvI{m;}`24Ks7uyD-NJD&}GxeTniIjfMFU5~!@_d$b zkpxUM<*kfd;%NlO?6#_<3*-Y`3Bc {jtB6g`8lx)=!C6Y)}L@X{?_9m=N)W|MccHTyt zV6JQ PBS30HvfqRx7o*F8n8j@CUJfv(RGZ~&N0o4O)&=0GCL#Z#(OWw!P zz`lGizC0u=Gt dvRAeYpINZBtw>dH<=Y-?xSGc27tt!L5O) kjA0$FrwdU%Yeo+^&ePdo*F-gSF@1k1n9Bnm63e~u!lw7RSvllAU2o`+ zGrJrANzSC3o(t<_xQ~ysj2Av9%jQ=K1Wj!-7(G!Y8BX5?Iur=upUZk?k#$aG9IrzP zH+GhTdL?4i0o05Pi1i+v39eNYJQPQe7mNfn!w{r%R{I0`5qH0fpw4}!Q@6FtO~_5S zNKPYn6S!v{LtvR`1wJas+l{qm;MI)H{QZq8uxJ{LL^z&JiG=e$L6RlvvJxsccTZBf zv8HO>Atbe_sS`3j){7I_+)`Sk8zI)S=g2xpPs<PEmx-(#J; a`n?X2W_xl}C2BMcSj`iou?kFX5u@Lm$j zgAXn1(!5Mp7jh-B+mfDpne7rb7%b#QC}`Q^*|tpl`DHGvW#4_7ml>r81^UOGuFWrV ze2!7R-fqMS_~JW1UCBeg_C=h||3Qq;Qe|4YqzUP@V_GKQh4grwE|H%3<-(2!;bQ?c zRd;R>No0a)dv*}I49Eg9lV&jNqN|w2n>f=4NiF$NR0|X$RbuLVC>I+8@%nk4MAN9J zErniu1FvoRc4t5u>>kcupt*~c(Sa!h`|-N8B)vn%y_y*epD~1>w*MeEd6;Onz%H;Y zmiCM9R!H&_vkH0XT5VxZ)3~=26-rm#`xm7aNJ=pL4BJxr?mCi%<59Uy3-l#b(mw9G z3RB|`mqSWY0~ZM8w>j>t=*Yeuk1lCd6TLqkmj{n&+o@1~A@N|6uAhxa^3fzcN^Evs zKUOj-qg(lEu}tBcgh(QYkI*KLWm7VBE9?USk3<4FK7Jr zz}rD^`XC4N1Ig~;6yALqX4!j{b^?x_k>Pmb {i)|O8Xk9-$u=rUgZ*XqjdDYgX-E8;aF%%$0iz5ZsG1AQ(sh=q%W1|r zo@O;f(sk-SYesqZCu;t@3P)%_JF=kaP9@bO`W_lEtB;unhCDTj|LEb@&+uQG3|eov z*;Zb;v#Jq%|6^9(in{ONFNqf)^CEVZZxQ`sxJch^ANxyQmA;p;b-+(UEYrBP$9 oXn2+22Jr zmRL{$qWk{JSiX^qP%T0MlZ3e1p)P1=h1qxUCnhOt6J QjhtE-3_i-jU~E;3Lx`S`nB1uG5;P-?ZthqN={6j!Yip@1?fU z_Sf;FHiup128TRaN*G%*idqUxW;*{}qxNlRS7TH4RUZ${Q2Ad>BjXtc|4@|hijF4D z?tFLozlk4O8e23K@S L;;b9fBK`r1o-+k2?s^tJpFgbAta^)oyr9Ev2m^E7 zB5W+^vRM)@6}9|ulcph`JFI6itji>KOL(pUK@Co~KE;=?T69@OI5YqF`avUN!A)lC zO3~NO+s#{o;1D14PfYN=h9bqEF04oR=!;AkLo)w-P9`iE06 JUgPe9tB(JbHvx=Q$YKTX?w^^SZ!@Zv8(5`{8YV3K0dd_8b%CvG zIq-bVkZb{{#;qsD#S9abG_UJa@2nY@5=mkF8MX)vaa1YrLLR9q`e6?hU8^n9k+DLV zrYh$3)ekVJp{D%Sg<^PyNMIG?w^bEG+j83Xt6hVwH|-8bOU>y&c#%3^i>B}VLFz*1 z`-`WGzT@9&?0ycK#z!v>3Vkh55^Y$8+{UP!XO7Zy+ZVko2GgE7DKdWPH#{EViExm# z{(_Q;z{)l^Mi(EWMea4mz5nT?9O?HU`gnky4ECskX;Cy47L|oqkcx!GM#>FBPO(rA zLYpISVzHoKkLK0+YuMO$k^TBCxJ&~j5%50DmiQ!oEq0ObCYMbgmD}`UsTMESSITj> zBtAvPX4(t}*^FGB>DQmp vMZqEzu2g2wYXWz zCCIlgrJ2O^)#^w;F^w*qD3=MU)m2;@e-H~b;4GQfE-4o`9Dh_TRRIxp*A^`KZfP|h z+uT&4$Q+WoysE`(TP7(w7E>Qsp`f@jpu1Bp8y-?%zM`vqxGiuoB;_HgqnK()@nh1( ztFz8>oOA %OF8*&8KmPfW@4vVN`TDP_ zvG4qR`!5S2HX7pfmH!kv{zHiF{jaU^VkMGgL$ban+jCWfB#pKXD Q^sb{%rn~b8w+ 5Bleg z{ojWUVgEOQm;X7I{^!wo{=Wq#o>w0K)?}F1GW$O_KL0;M@+Ic~ZoHF7(7%cX`FD;V z9ye53YOWjp;xZh~ukpBPS~!ZJX{w|i`6cw+L)Cg}w1f=Ww;fnXDf+SCKfJ{IkFKW$ z|E0 +QvI@>j(hwK{4z}uOTOq| _?h#+#Kk`fem<;tjjf> Y(AwzmcUH_X5(h{#DHM|B6k{Y3ct|VDh^G01COko0A@3Z6_uG zN3_Gb!KeenI6ip<9|ak5VcEuKo?B1%Z&1$#B4{xnaC=)(`DJd n)l`I4LN6 zIX_?^`!AvQMPOI|Zb0yE+5cCz`TuK}{i})cpHrXxt!hx?* {>n-`LUPSF2+(l-D9%mWxJzp6UfZ-@JfGzpxXMb@lGwS>VC z<}Z>XN(D12 (@lHyE(jb zkq~RNS^XWpoEoB_awW~kcOs@UBgX!=FC`9#U#O+_t`*B|qB2B%^bkoNXW!&BPa>7k zRk$Tx#=K`R%eJO1|GT*myD4IS+rnH?pPPtxKMf6!#L$B
BcvCc= ~w-^wwYr=R6Dj-=yecM$5btiR))BA)@j7&~aeW!xty_F3} zMNza 3D!SN?%M?Q&5M=wS$rV@ms)2B8+AJ^S8aMQ-hsLU-b>0nWWrtm;9r8~`) zhsrYfZ;B$cuy=?}!xf5UU%wFOz%zvL-HKdzXvX52%H8MOHByIbpf_=P<>2z SD=8eT;Y>(K5Ma&Xrz>X(34W`V1n)Cw21>f(q4xT zXtQEV>u4{i^^?-4(GW}A<~;PYuw+jgp-ZssmXDMdhDV$k?ACN5cbY5*lvbu`2Tojv z@??0?UePuRa=~s%mAzu-ezr1%%U+>YPfBm0Yfze-S3ftEn)ZcYLY_daMzZ=|IoqvS z$lNL1Y ~^E%6xQ;nUTvVk&%U`$nAX{fQ9?7S?mduFIl{dr4md> zRYh;h{pgzyxl+9}+hJc^M*)<{;ZZ*X zvR*>#_sFn+E=dx-ZP zcm#Zd`4(o{=uTGk`UF^ (g91|E*cDjA74@B5*C`Fe?@G^)$B=#Mzl- zg9mpCY*CI}sp!-W9c1|g`ZkUS)^s;8aa#x;h^Ro)zAja`tNf&tSE;uas>mlwm!}Ci z)Y01sqrk2#Zml4>QKOo!Ucog1uOc#9pq|@_Wy5@$BYzYxwB9 ?^%Q~=h#u_ znP U;VgVpL$SP)dcedz$jhRSQHX93 zro_A}hct5dx4JCuRYc7GXn!5djoM5b{Lu~9-s^5q!}q5p+}lX&dkn7E_BtNcM5DfF zr^IqrJFL?IucJbMbHO9t!;6R?&QDq=dhn-%qubUK=&p_fGZM6JcFkKu^>t;MH*-+5 z Gdu88!MkYiL)tCSby#$>(X= ziQ71ZSCHAP2%j(Q4)V^&rELH)cn@d9Yv=gg&tl4;sL>zqoDEV9m&?#eD)2n})8Os7 z@KDNW4P@u3TJc6lv#|)Z-K4Qdf$Ur)cHng9Qg5?c`VqnUPQtYIl5^xC;VyAEWNPw5 zExK84j;MFH0xrjwA7{J~=wI$@Jln=?tc=q1KJrEkT0XVzLv{{yM-USqF;nbFqDH;y zYs1`)l%zz`aF>vMt7Zl)gDWi&xA5yt-Cp=!|I}VjXM{rc m4+KzuS2vFot3`fJ%q5!)$@@bDV($;pt%Vh2YQ#+ zH1UD0OOZm8X=z(o_R}K^ho2S@KdrO(d%PxpwipEZ7B99}7;3g}7x!OWfY4x9f&wM> zQzr57t!C-P8Hez4Wn&RqR^MzdUp;K?$nymoSC=PHNXeC`Ryny`?v4gc YiuiGS)R1D8Dp8w~#HG_mY7(cVrlD*XB7 zH8sfnyU93mmEzYb#e9=#%OhzW`7f@lsUeNRQX|OLyf5RH nMlL6cqjajN5K|fFIZT4rk-%;rSz>;Uokm)9-{K3 zc$c }@aH5sEghef9h12W`v~b&imJDtQsy_%%Rx| z$kKahu!_jBGr<>ODvnIxUsKlKbwu ;`ik(qKEb z7^tzYyeOw-lHWY1S;oLTDq6xoNQ6;+@}QsaU}iGUrmf`No91!yJf3#byF<$yee8(< zJ86=2D_q%W4G(`A_RD=iy7L;mt68n6EBan9VR(E1uJACjjcYCvUOM?Qd=ctsczD*g zri#3kdN7+UzSX8bv6NbN(jL86fjA8>FQs+XY26%!qN^5m1yrjinhPYVnp1GNn; N# =f{HhD$8 0^6 zW2$!6Ovvb|uD=MCGO=wT %Nyu`kW`x%NH@u)vhL3~v7v&D~AXwK>`* zn4Qt7*2g%_1*M5JSW~Y|%JxfLiW9ih7xU*rb)hbOWyPtMCSK;*f)>8hy-2e?wG#uC zGrLOxlWf7{Q$I7fEnY-9tx~>bZIAn`ERy!QYx0%aq+WTLpOG?Z;HW3w-i|XmJY^{J zK2cHtc03_;1vB4LZewri2wZdXIKhh-b?Y8a^GPH=4anq@9A3j>8oP&t5=I)Q`rwm> z2}iowc}#lV3WB wHRx2PtaN)(i^&5VdL#ne!`b`#DA*| u+a>m7&I5(=!SGkry)vkQ*CK!a_BG +3; zC)Kj^$xW5W%fv{nj|SPHeIpd=ud3@i96^lLEH&rZp0TO35wJBpwPR`Dq{32IngnI~ z*j{gfs~g!u`9xVZy>1}Juk?<*w=|u+nVq$~u-2knynul2c||Y2XYZFKJbKGdw{4;l zd6#5uh9Y~8;ruI)45dqqb%{F3y}Fj2a&&wqEymX_s6(x`v5XIhE{>iwcwL*Nh62 z>hFs>Hcw9@#;c_p65-9#&k|rw&85SIAtIhk%PV-^Coq-f2}nu+co}0r#rEnMwrVSs z*_?Ry#XxQgD>n=`^Nnf(DJ` ?;(?GViTiDNv#@VVw z9uiHXui}o`BIz-NDzucl;T_{e9%Txc6TvoyPdlE(;^0EJG!pyr_Y; zTbEE3GyD hRzZ*5f)}PjgG(~v1X(8U#ysG(}vU21$5VW{j zcJjF+!rIO7Iis;bJ>z<`{3g-#>9rjPpY%y$xYx^d^v}9UFNMaMl937 lXr~`+U_L<;9gs2SG@jF zC6|`8DN4Jf6}Bnjd4{sLlO;Mz45&XSObN& Rq(MbtyYMv7w`&1*f1kDb8BXrj_Ifw7_BvuXk8O&*~+2;IW(|8FP48jo^NHk z+ME(leeim=0aU=Z$av~A_ 6De z12Ppei{1jfbIK5E8_k;N@M5ywJw2lco{g?~Ine`I<7FGM)8(k`P>~I5@KI@k!fu{3 zB9{V|5Ov||kgst+Rf-WRXy%EufTkC |NnG!i{=a#D_{J33PDh!7>8 zLPFivPQi~)-iH{~XuMn>RKbI
mF-`SK0Xt5 *3nizw{Fn35uzlQd)J@k+A?O_AuVLu(?4~|VOWm0lsc4P zT@8YNMh9|(V|La^qGI&vPV$?Sw)X2M8V4N*uT5UG7}Ut6rOs)B2uCl08kKZ@6$Xdi zenHSTtNg|MY(DJjC6wJ26fw~>+2unqK6B4I_Z4d;rTV*~Wa0>Y+OAK~U&oB9uux+5 zqoDvGf^18oQk z&18$D_CC5*KLPXJIa(T6{=&yw>IA$h6@)toNFvK$R^AL{jWoD{Dr@el;a<&+4Kr4e zs{!BHXh{MZ*zB%j1fy*v(4Q8V?r{1nLS-Y0>98x7d`}{MUakkJv_bmc5aCm2>YR`Y za=AEv_)c5!j`hOxR4x=NKq(M>+kS;g(XA*Y^MT^~a|)<}h0Pj8noYqc+h!XRiYsUB z+z~QcEFsxR&$SU1eCF}W?Wwrc1BD>{=u==-mXMw4h0%69ch==82t{d)CPX-b$CuTY z@iqNP+X48!CgTlbw$X^m7K0t|yG4sVd)$Xmw&1n!%?_0aLAl&F3rYaIx6M&*KGZ}8 zFR2}E5}c&rG7sKa8;ejz&N5&zhhjW*%llEs5g %aWlheX{pcI<&We)ZB|JLh<2&P L%xxZmvL?7#?gPeVK$FJ=+0o=vU z_BP?Jc@K=UU|hBmw-%E6oNVm{+1j(zAAyOmf|&$7>q$xQtB9R IgL zaSq?UNlh> pslsYSeB#TzuUwGV zH`nJ?EV~;vE3#sJ#HLKkv a7)#L9A`jJYfofv%J|Iy{&&WOvDzaWzcc`W1NR(XzK|DDJjx&FC-asd5G|K!N@ zpGr4@_4rBi@c4+y69lq;?Eu@RK%wp3+$ZhToGzJ4I^=h_hpV}sb+YCh&0!A&n;hRv7VYnvLGG;^fA@nmx8 Scx~s-42Y4r+==2Kx8EMRmVAyB%e17fAIZvJZ}bBJwUNE_BtB4K@Au{ zsy-yIgbC!X)uUQDp0J+f8;zIL6VW97vvhOm8s>~<%n#o2{E>jO47X>j?~4pxM{dCG zaM_KRd9eY`kiOSw(ns !DorFLyd(VT=V#ZE7 zy;eK3<5>*8a{0qSTizCY_eb84iECX74C@%ICTQ1`p4jYtmXD%bu(coxISUv|FqM4k zz9Tv2oCvx6E|f`CfVkQ`qm~Jz=o8 jmv>S};l}2nj9hKXGZ4c6|jFheGUJ zSQPTZn!3pKD-OZW*I)2((Y4Ce-I_T 3YovUK2Baaq3~5>QYt#Be(M1(pYkvEV0vZP?P%s>f@6^%(*}8u#0@^q-u`P z=mKjzN9boUr+`kPhqp)mNeT0km;;s^=Q#TuOKnycDgR+tjeVzwIY0HiM$sC(f?;-; z(VL4Dld(=5lJ$~t=N;k%SSN;kOUZAmPmL9u)Ejr>VRp!sXl!|whzk9In}%G@CBet^ z<(UCuf&oW9r;S?ErxU!#-a-1QgVL1D3++MKQ-(&VZLq>ktz&+L (F9N@4`m4l~PL1038F^96UfePUWY4X4!dkhgYe#$w5}moSk@>fB9Yw#l zF=_wx6;^Fa1s-Nr+mfosFDF%hBxXBjsXq6p$2I@D8`TqS?&{>WIUe~6qEMk!MyZz& ze3D?*9H6=Nrnl`LgTu0 c{E!K zUWE|xEWM4Ln3yNZ-^wf-uCePnW*N&KdmZ(ppt~sn+l9y3K9>z=lHdwZo_SHw4Z>xz zdM3PW*Jj_0k-j=EF0Z2&o-AH;`uy{CXPyF7MRTav4LS=Xjp}WB;(d4gMT{`yk5Rt1 zIDKg}J;-00E4GAmi*Z)D*kaHPbs3j?QyDA}gT2}}uezgs_~WQ*tOrrv$(zyn1}1b+ z1WSAJB2eA>VQvvhY)RRyr67Im>vy8K)1g8^fLc&$|6{AfwG??XSM{vFFOC{gaAi{? zK9Z-&z3BcGQAVc95+=li=M{LnD7UN$FIUaMHx*B&JJ)Ny9}#!M%~}i&!<*|rf~WiP z^;(uXx#&dNw=bg}l8vPl&fZ~FRM2erjdAUyD{zZMt;(pWYcy)^UjpgV(cgyt8x*q2 z3Z@%;fDsfp;DNAs4gbC*)V1% Qm(z||2ujAm-vqt}#dveIx9x|mJp;{3 zkv$Yjrxt#KI{z}`m;5`JqOPMZ&iJQKjmRor4b(d66H#AyOz^eU5lBB+${GaMdOz@Q zmcK{*i{9;!SG|>f zJ@Tk_l%xe13%={w;#xa3VyRrK=z_cwoRBaA QLJiUOb=A1;5DJqG3J0n6k=DjY5Oj7jCq5nJ1_^Eo*0cuSvtzT>4^mD zpoh{NMs!jls=e+7>?xQ%Fe@JvUvR8ge^CN{ng3bfK}>T6wfkw)w`w)f4Qp8wwRMGY z%ld=jX+3$ohzrk#I@d#(47IV}zWo_iv{)Urmv- nW&G^RIb@}2C k%Vpi;3`3q{g$eD3F`EA_3_a#H$ zrI%ycH`dq;r5z=)k0aLF6=A}me@q8hkt4B=Zv*TuDF0Ld7z{lAe<301`(XT4j&8th zx0`&uncZnQnv>)OfFNTs#p#OOJ>{PwPb4J6ZjHvE?`F;9iRK}_Q=jA-+br;WQv2jJ z-f9kE+{(BerfI(#R4^GdPmnIqXA4UxYM({k1f0juZkD%eB755e#zkj$*Z@}|o=8c$ z`G)*$5#*bnC~IA03ent$2-iT*3j;qKdfVHt#`yZqfv66LzCTxG)Fkn{H*(FqXlKR) zzqtLJP#PEMOn-77Qb!fAR{d=B3&9qCF3hGt+p9U~iL@l9fIU4Yb=B{dg6`aru#1d= zkgHJpCA4g?*}&hTRWio`{*vMT#M`l@q@pQI#+|Us1c0-3awIhV$M+iI->YOC?C)^? z1Ww{UL!#dp(~a!Gk^kNpTM2nEUJSf!xU;D`=4_ccrl7`^fk&|MMKEw78X{}pups-< zIJe4X*UC2IfEj+f&5M?wu(IF`yw-HBQXI6DsA{}LhV^4G<*P?Lii|S=ub8oLUm!N{ zzVYV*t`w&pd%Fu+o|_u8!?-+_I%~>9Z 7a~iU7 X-zn&Jo6zHg zne{- uFkMZcTjc~XkoRU-^)DW z6QR<}Kr6ui)c-h18o*zI6I<6=`@+Qw2uL=yi#1E7HyqaHkE6&uO5N05LNOR8xT1@U zi*fM-=|+58o%2Xtk2#t1a+ioL@!>)Z*+2682K&~&La8_00-vrEBVN999c+A^&N{NV zXI%&Jh}8Dtrmoc8SG?G>Ks`G1wD)b1hEZpA0kY*_qgfzRS^LPEnVQ0vPLdhL{$n7x zqy8h#w@uqB|3G~8;E`s5_A8(f5u77)gAe+`@*%?FERcQTRY&?Ch|1doeR5uRYq8lD z?CpGv+NIDdn{wkT@J&4;{BpqUY@8Y4AME^ dpn=H@k-bh-UerD^*RmccKXMcvH+(kvQ%5dfT6qy sxS?q{5doo82<@^&G!JGAp7yB|Vv<{R_} EM?I_i%^ zF80pp`M1Vf?YBtZB`u%06%T?1mBDIl9or{z<=Zbp<(`LgELo4!H~~-h?`W<4(}a&m zX)qhVR-FjQ+fFhiM#dp+>hJ8T#Mb=lzr`v}7BCI$D{o)3fb p zjy0@wi-?^HDRSe6Zorj2q+h0TzIZ2ByI5W4SL~RAkr~d&ik4Nix%FncZ=n1@;{G_< z`)8-Yh=7^eE{dav!CdTL;Gu86y_Hsdr1}winpL>rliJ5HGtHK+26kgHC71>7Cj5f* zvW2B W@Lk{;Z$=T z(Mwm1c^fBF`j4cV7c%v9X8y0ZJ%h yW4XVrm|RiIOh5&f((52+{iIx_LI { z7{lQ)((dQ7My0U`jNVrW&s$~x{ |9gE*7R|U4 z+PdW<`F6f I-KWRv2ffrd| zS1JtjJjxeBI@UoR_sGPmdD<%{vEr+_eMx5>ygmPX{DQ%&Bjxs&v2_XVpg)qL<}Zmi zCO+R%H?B-QxZ|40;?i$IQ}&>4N9JvHY#fG~wA+T(tV?-{26!7_MRnC{Wjsh4`GBzo zNWSMMMt7cwFtfv(-iJl-PbrWhgM&%)`)C! 2Hxae>f}vw&Rm~t z;1x8c7=Qb+=dy`9es5H)N3ZuO_BL*K(8<+&61lDbDpJKMXk?ArbUjhh^QoR;amW#K zNnwp07O_CfAg>rQa@hv|+*t^dC2FB{GNC1SWHfDFLe;}SfGf&hMt9xbeUQON{O};f zn6bllAmBZJ<#2Lvc6Kd4;@&;Rgq1o;RU*8~s=k<7f{h{;AAeb&Y-!%^v)KAbC)`VW z^&_)1wM)s{Q)=Cu6q!~#D+C@)F#gWI{bB)QRoo){6-Wpx&pv?@bLmLz=P{#*4615z z%yqA6`?vQ36kK>-d>pGzyGlee2^u439m_C3->gh7S`*5O$KL&yFjOTPL%mhdBBTc^ zOdK|Uraf$fyzFH#GGf&i?Pw<+h~l%9cU}jpHEPI}v?UfLht!M_fgkc!$-T8|%%ND< zcOHWZ?vkf^wLb^aV8adzyr7Xq*Qi@|O#@6qE`P#3$h`ehT?fViF`L)f3TZhoEsZjw z3I^1|q9wf~0~@A-$Ccc5+yrjXgpYKW3|v}V0@cG#qWD|2u(9>9dcUtgAEdPvG%7H$2rLQTSS~VzT<^QvH7N`FzBFmO#iWg>D3_daa>hIN*CTbDt=ta3n zDO(ii0R=v$kgaD)=pt}BH~L&Lff=Z~)G&ye&J_ #&>D+JqFuC*2? z<`Dj`ojFU7T%Ko=Z-0A1OH7lJ3F80u!jodddqCAazN#n$J{W1g_3h4r$@-o5X2h8n z -r z;M2WUQ6nW^_qsF @X@RI(eD~!A(80<+20lDaEm9 zW^ewyn3}=2PE<1onG1S@Oh{+-jL_URs$>K3DpmEi7+}|9k7I~p !lOcHd1I6o%|2tJli^(7p{TYWZg4(j4bzn<;$-weQ$r39*!ThG(B% z0JG$~l_{3$9cIvzAFQWV%_L25 gya(`qgK z!KcCX#Kbh4qg6EN;QMw-wp=$|!ET=-463uwPg6R~sw4T5m>J5JCE4?l66QN9G<4t3 zy5!y%Dm(G*MmLf!e3UtEGVk7`wSK2^(=@3-n -@snj=Ei zt*ADmAUEo&(ORRMJjDi>!a>Hv>>@W2$E!OP@He66?^^Kqdv>4Z!)}$^wCDY(V$( |fD4JXxxNuD8aeSG@VT z>66l2e^jYxj{|)xBYa%+8tk2#M?LEigdcq#6;G({ i#erL9--vK91Ux~ z*@WiBy$WqkX}%;DW>dQP?rU5nrsBBSt$bdg9H4J@eqUz9uAlpB?dJR{_nr7*n2SWp z^y09kZ$wb^*v6ny$*x6E!D~9SV)&O?KHT*l!@gLY0?ebpi9eS+wr=Tre z$4B?`!}(2q)chbnMi@*xggx(7#x RiZ^n=8_ZGW|z1I2oa=;&(CQ=b&ubhN&Pc}e4 zok<=S=wei5sf3v3TR#k!v?MYIddoj0e=$YJ(J+<4$5mNF`qPf}uCUqlU9qojK^o=R zvx4LiONp!*o1TT@!O?7ex=k_TYC5cHW@G!wS3$$vr9`t(#~A~#Go8OFV^I`5F}?hz zIm Cq@J8hp z#IEaLDGmQf!5?VPq>W2ysvX9*Mc`B<2;sT5pevk=6~mrOx5O5PEW&z=0P4w4D6re} z4a( ahkovKWkXf5SdCrz zYK=N4LB!1R=MSx(6)`nkGfd!;MU`Fk9*cy9TZ7F12K{5}+)4@49a9BPl~e0Z&)e{l z($$!z?cIXzAQxxbmO<+r6F2P;_q_xwH89cfPVI`=EintXltK%MuhrD|(0TDDvy(w` z9Dm;E!_5kEy-Cl_aM0(g(70ljX+X(!cc4w_YQfoUu$;ztQ=jF}alPFNlSI7dhC*oh ztWR{iLRx-!?6$QrXXO2I#h=tVth`-fVAH%*m3J|?e%rc*a384Kr$6X+s|?`q!e9_& zf*}`+jY_E82bYw?-(U!qRh2U&QSD;yxaGC7Ftep8TGRFIgwO$gPA0M31U2j2&*dTQ zR&&Pf%CKFq4z3}oJiM&kNnRs2vugRSn^dks8NAz6)V%cQ;`uaaYPvwb)&8#wO}C6q ze0!cWp?NE*f8FJh+skeCVwGbAY66}hel)7s<*Hn>?rg6;aM0SWdZ4wH-}teL?T$O^ z_bPB$xjX2%Wl(LJR_iD>Gh$BC!=5k>!^yhjUqUHp^QGkMf+IZNRA>e+el&g>T5OUl zLNX&&yIZKH79Yt0rsw=JS5u2taq67bT$TRwR|6l++2?MJSh;=Y4BV#w6Sv`>o{K39 zeD$GrMu>Bv)@tYQ#m1yn#mR%oG=U+jFsdIP=DVE7JFJW$y4xlouQR#oXo-EQZPm>9 z4No=IvPoGgt7LQjbup&6f@;>ppJ+*14ciK%4Q3b-rfk7_y$S_KF5*+%xhB35;!P-V zOU$zV6t`_*ud+4yTc`V@J-gzgNHL=_Q;)gV_uXE2>;u`FfLYbZ)~P$D&smBWWM4R0 zO~pxN1wqp?^Y-Abnp5^=77>mkwcJg&q^#tdDc^VbdMi$@Gs}@0($LwJn-QNT>@o{5 zl`
kEnnzsPQ})@fHp5y=ZTxH~t!4{H z%v(M^51LTs^ok5+e@S!tBcIw`xj3X=$LH4H3x%jk@~l};w>zJdNm#K}^>m0&R+ 7j4TK*`o9rBwB$3=0YJvptXpoM$Mzb&rj2vf?<)gIgBCMK8>Dt&}jLacCo zDrF5$#!JS-COZzz^9TcTk7wT|+)S%&&4bD@_on7Nr=?zt42Uf|ZdJmY Zv6F~sckQ+S7T!1tWVAP7IQ&va*~t7_BI?8 zcFyedEgA5Ax5PNDz6Vq7nKvA&7sS=x$Hh4hO(|KnbtX4!^)LouZk68~(rxWB%3I%N zr93jMK7>zERP5(8J{|m6l8?PUge(gi9K>*l!pBLf-EHP4F~gHrI2%ULVqmM^J*9!( zLKtCvi-Z8HIpo8@5@{>)U!uk;Yr|BCsU{h2P~5E^xM_@jam@u 1tOZ%kEnI055Xd|FQ#j2Z z5 8i>>GmYk*ZO2nPX z9`{ENtwXVuqZ32ZfJu(xg*#%;`S{XL6hkauvqsCQOP%Oqy+?jql|F=+6@i!HW>$Ap zn{G*1N<+442f0LPAd{VPQpfSM=VTv9JxoTPAc=L?#(vz+tX$cKzSLZ*EG8XnlSIWn z>6&}c&NNv)C_nz0&TSrwxZ4Q(;Wn*QI-%ju>62FBpU{A=aJxFiuWCLwVaDmPQ5NV` z9@mGZWl>~iBe&K5*_TO<4n27>;w!{3&%d^tfqD9^?0bGqCKi%^kl41(|9VOA1 9gMXIY^PS;FL zA3!>lVNP1xP}6!_g~>FuT9^e`A00)kw9l>GR5=*Nxd$dS8q6 }Yi;cW@+eg*Q~* zZM-8RrLNp&*6TfBm2XYGOKd!^E_LmVH*~4$wNKzE!X&qaYd3?+A%ic8CV0bbBd55> zL$Vin^zuphT|Z3J#H@3>laMnPDKXQae 7h8n~VCx@um(*(?m>83=2%0)Vp0I6`qggUGZB%-&Rv^1^e9A{Z9>Tpv&x zV6_F_7i^NU`r%X^8YB)ZIl?EtxgI3btN R@Ss(+wR`rd0Pw>ECP|b zF#nGBMvc~_V}6S@UvUUCIi3W4-0mYKgu3oVh0cr~XDVm_Lo5#5G&Mi1`b+~joYr&d zwS#X#)7mpnq9m6^i8lig37sA-io7KEfl`w4&PfEcF})JXV<2uRUyD^gv|n^TyxPs? zq95oEYclIe)O`SXRR(EFnj{g`mCbvcwYEdVD3|n)?M>Q3PfdT}){LLO1znJ0&==)k zof_pBUGp%^m1z>VNuk!ttw$s&)~6IC4?N>gG3ry9#`>Zh+LVWXy%9sOUDD?(8=Yp~ z=Dz|*35<5U6P?KT9W>{2tD=Ea!EvbiISDrneO $ot{q-|UL6|Y(>dP~ z8aHZ!`66Sn*fh_1su2sK%H6)zPXS8O2SMYcCfARSrX^6Xcs&7`G*8a$oHjjxn_VgP z&3$8kEs#looAuJ91 ?_c~`NRyuOO| z>Hv2jRP`BvrQITT aRh5Ia>hfRek=U@ z5lhN|iSPK8K(tK$a(TXwKr~Wnx}y2X6q))o@cA>eMOE_IsYL_p&PG)2w$img2&|LU zM4&~n;%7S-&>j$0XM~%KPeW8#?t?$I;~Q*nAww3t%hqTvlfaWp_qr2g_q#I(`DZK# zY4NIuyhh*L<2z3*1kli%VJfe|TPOMS=?2-RoisH|Udz(aus$)gW#MR=>%-9K(B96- zcEsZog~OaW cYtMB znR=kqyUzN|xbW=|Te;fOa{r%KInP&FA|FebW8wnclU4u4dW9$&kF@{wRYV)2t)qfo z&&(Ki?O%zik*2Rqnuu)g#wvNH*d|?#YCUOW7-I*@dhuR}fn2YjsO}5@PDh{kPf% z@rM?qpY_u!YQ*qyii~oT8-|g1h5Yu;RNIAcZP{VG2i3UM%{bpD=aat^eCS&N6v9)z z%vNUNFQQLg@7Z=-Ru7D5G6O`8KO-l0x*MdXRhN{X 5=s&I8WQKzz zdvb+Fx0k9~0m2^Jk962`qN*)-)TIJHJx8Bq3A8yWOz`>m!l@)GaGKuu;K2!z> fgy(4bErQ9+(KUUlup`Nwu zUyD>|{(2>A*^+fDu(aqZ+?juZm=t33Y56`YVGFST7?Sp5!2ju_%Adri$g*!w3bXZ> z()cEB(fXd*xVl8IPcrzT0{)d0O-0)tY-Rfi8sg<*a1&u8ugJv<(a^kuE!xIr9;Pqa zZRz?-Dp+q&yECKN&sH}iR9mrVi*Myi2`EY tj986$4$k zI<)S6Q+XpSztoG(;gNKNL=lQV?KE$AG!UR*0|dR+yCnCVc+~~~H^;K;wGa)gb*w9u z)ENM_?Z;%Ma=ZNAdvh5F1KGt_0d}0<@-gMxhj{@;$S2du9TUs|6vqS+y}A;ddu%vI zZtF^g`d=PGS~Y7TIip Agc&Ns z%Ym;~^GhOv)Zt z2wQgL`NR6@QUx+Gbznz3QG`u3XkhTtCm2V&%}Duc%LiK3k<9lOY&L*QVxdj-Uh^I? z8!Xe5?BbcU(ZLojZwrsPwiI+*b^n(lDi0218*}7Je6NOe6gA7}Bsk$A7IvKF>X=Gj z3CsQSJ+6ly6kTw<;&iXR#xvM2()rJ$R1NIkY(Jit`iwKDUeiphqewCM_>p%(w~sG- zZjw(t8-NQPvG_%d;q;U^b_KknI87HgJJ2S5>R{6jI9{3`5rgR_iVY?kc+ z>95mmO{oPzGGIZ6T+w}G7o=Ib2IP|$2i$Oo@hSBBmwLZlb(${10r63?>|A&*+w+oo zZP|iMU*OjguqKLXX=gLz#OBQ#Yq7#w3MK&>S_) S3kv{T{wUmX@%wd%R z7HNE}V~7cM?9*pQko|!M&jV##-Fl3?0TByG5uiiPj<1luoyf9>oqi A3!NG%9z^h2gfXN#_oE`1$XTe&61MsSTVL{rGwms5i!52dmXAt#*6=$>mC+ z`?;6xw3bI2QMuw+VB21T@$TFG_gwLa!285|S|#wBua!a_hLkJan2Y}Km;nef4KYJ~ zo_XZ+cni)a0d1XHUCXfZ{Nh4%iRk9Gv7a7$T^Mu=)L4jr9P%|dRQO46W0=I}I^%{) z14>(eRe!8-JW!!7_^M*%*Pe_Iz~)3vH8}*#fGqb3&66u}U5<7#L9NlRpJkcl2?o@$ z)=AX~{Jr!N^5@K-#9!GT6wWi9V>-)pKITlr$Cfib7nfb%!?!^7;~s6~COI0~J;K=# z(VU6CP}t&70%Q%SpB=*nCX;an^}&l+m)Zd|>fd|m{srMY20q4U=lued{ObgJNO@1o zRm!EI(6NwNysub>=Y))kO~Rdycf5e~l*zA;SBkj9-n~8`1uA%i5sf5`bvBsG!423; zqasDrO&tYo3a>eO=ho-O*k 8<;zgF4vGsSl($R&N3!W=w16oQ3F+DEhx7T4 zDpMXYp 9N(Mexwog0m1R>MpK9%LZ;6M*T6 z%d~+H;cxO_T!o80hwp}3*bh_$88?fhp0&$R!rnFNr`74petqo=XwlXIw`-#HACTKM z9ri#OZ`Uplpe|B&&e0q`Q8M!BE@hC+Ev{+A)g#}we_5o2suH+d=7^QQZbmu?T3h$e zanknUe0Q&?IY=it2x?pRk54!1Q}FIYO$wfSX`(Uqhp(`2IXohJpYY;#vP6RRE#kN6 zpqeON>s3m6YsCHCKYFwOrq@M!KZMAww=1{DZM1XyIq< uObeglb0W&Mdp+Hnrh#XgbGm+t;?+RIwvCAQ4Fm> zbeHu+t3$KQi8jWF81o0tx}5Gf1c*zlv~4c0VcM1((IKFG#Q2Q3R0G+`b)IPS=bn%; zBoYZ~KGv|N7@Lcu|2Mp~{aXdje~f&|h#W)y+na0_`gn8T#xY88eD`5-!z H?o*Ii>YK>s6L9@eiYSEE9q(2mRUAF1rEOeudm9VbX4}!HB z9qx5g;j9NsZi6DXA0bYp_edIOl6Eb|w_V^U47f`=+ekWd3_L?;{lGZyniF^X5rgR$ zq;Y`Zq1~l6LJwujKO_{sA{8cv-++z(B@_x`Zcp( 3J zKbs1>@&B=x5Bb&MF(!Dysj$nm@XH&0>H^Nb;Z>r>D1lFKwVQnZ5 PtgO`g~<-~;x!!gWXK 3{wqB^ z+4o9;apu-tNP+q`UU+y-7fTW*hTYr^yh#Bt6JFmuHoOEI_#< r08KPu xeYxv)_>E{B%xOrf=6-7c3S;`2Z$3clqdB4JJ! z{=?}3uZ+2!H~9FM|HJkPLM?q4I+(h|E;(4g(Z9#_?_RmR^u!yIRo}bFiN0h^gA1 zy3+s9N|&!eB<}dEQ5IV1*J}`wJNQ2ol~(%M`I9rD)c>#nd`f1$0fgMhz42(Ej$G8o z`bR