From 7322d7107a0bf047ca1250739247109b80e09fea Mon Sep 17 00:00:00 2001 From: "1029559041@qq.com" <1029559041@qq.com> Date: Mon, 17 Dec 2018 18:53:57 +0800 Subject: [PATCH] update --- PixivSearch/aliyun/photo/AliyunPhoto.py | 140 + PixivSearch/baidu/downLoadBduImg.py | 118 + PixivSearch/dao/Comment.py | 119 + PixivSearch/dao/bangumi.py | 185 + PixivSearch/logging.conf | 33 + PixivSearch/model/config.py | 43 + PixivSearch/model/migrations/0001_initial.py | 57 + PixivSearch/pixiv/pixiv.py | 138 + PixivSearch/settings.py | 141 + PixivSearch/static/js/jquery-3.2.1.min.js | 4 + PixivSearch/templates/addConfig.html | 27 + PixivSearch/templates/index.html | 107 + PixivSearch/thrift/QueryComment/Client.py | 23 + .../thrift/QueryComment/QueryComment-remote | 131 + .../thrift/QueryComment/QueryComment.py | 660 + PixivSearch/thrift/QueryComment/Server.py | 48 + PixivSearch/thrift/QueryComment/constants.py | 14 + PixivSearch/thrift/QueryComment/ttypes.py | 18 + PixivSearch/thrift/task/Server.py | 22 + PixivSearch/thrift/task/TSDM-remote | 124 + PixivSearch/thrift/task/TSDM.py | 366 + PixivSearch/thrift/task/constants.py | 14 + PixivSearch/thrift/task/ttypes.py | 18 + PixivSearch/urls.py | 27 + PixivSearch/util/Util.py | 10 + PixivSearch/view.py | 101 + PixivSearch/wsgi.py | 16 + README.md | 1 + init/get-pip.py | 20890 ++++++++++++++++ init/packages.txt | 18 + manage.py | 22 + mydatabase | Bin 0 -> 151552 bytes root.ini | 5 + root.py | 13 + start.sh | 2 + 35 files changed, 23655 insertions(+) create mode 100644 PixivSearch/aliyun/photo/AliyunPhoto.py create mode 100644 PixivSearch/baidu/downLoadBduImg.py create mode 100644 PixivSearch/dao/Comment.py create mode 100644 PixivSearch/dao/bangumi.py create mode 100644 PixivSearch/logging.conf create mode 100644 PixivSearch/model/config.py create mode 100644 PixivSearch/model/migrations/0001_initial.py create mode 100644 PixivSearch/pixiv/pixiv.py create mode 100644 PixivSearch/settings.py create mode 100644 PixivSearch/static/js/jquery-3.2.1.min.js create mode 100644 PixivSearch/templates/addConfig.html create mode 100644 PixivSearch/templates/index.html create mode 100644 PixivSearch/thrift/QueryComment/Client.py create mode 100644 PixivSearch/thrift/QueryComment/QueryComment-remote create mode 100644 PixivSearch/thrift/QueryComment/QueryComment.py create mode 100644 PixivSearch/thrift/QueryComment/Server.py create mode 100644 PixivSearch/thrift/QueryComment/constants.py create mode 100644 PixivSearch/thrift/QueryComment/ttypes.py create mode 100644 PixivSearch/thrift/task/Server.py create mode 100644 PixivSearch/thrift/task/TSDM-remote create mode 100644 PixivSearch/thrift/task/TSDM.py create mode 100644 PixivSearch/thrift/task/constants.py create mode 100644 PixivSearch/thrift/task/ttypes.py create mode 100644 PixivSearch/urls.py create mode 100644 PixivSearch/util/Util.py create mode 100644 PixivSearch/view.py create mode 100644 PixivSearch/wsgi.py create mode 100644 README.md create mode 100644 init/get-pip.py create mode 100644 init/packages.txt create mode 100644 manage.py create mode 100644 mydatabase create mode 100644 root.ini create mode 100644 root.py create mode 100644 start.sh diff --git a/PixivSearch/aliyun/photo/AliyunPhoto.py b/PixivSearch/aliyun/photo/AliyunPhoto.py new file mode 100644 index 0000000..80954dc --- /dev/null +++ b/PixivSearch/aliyun/photo/AliyunPhoto.py @@ -0,0 +1,140 @@ +import hashlib +import json +import os +import time + +import aliyunsdkcore +import oss2 as oss2 +from aliyunsdkcloudphoto.request.v20170711 import ListPhotoStoresRequest, FetchLibrariesRequest, \ + CreateTransactionRequest, CreatePhotoRequest, EditPhotosRequest, GetPublicAccessUrlsRequest, ListPhotosRequest, \ + DeletePhotosRequest, InactivatePhotosRequest, GetLibraryRequest +from aliyunsdkcore.auth.credentials import RamRoleArnCredential +from aliyunsdkcore.client import AcsClient +from aliyunsdkcore.profile import region_provider +from aliyunsdkcore.request import CommonRequest + +region_id = 'cn-shanghai' +ak = 'LTAIWzPnmkJs2qpL' +secret = 'LIIq3HumctXPp0WT8c06yDiFbKKiVe' +region_provider.add_endpoint('Oss', region_id, 'oss-cn-shanghai.aliyuncs.com') +region_provider.add_endpoint('CloudPhoto', region_id, 'cloudphoto.cn-shanghai.aliyuncs.com') +aliyunsdkcore.request.set_default_protocol_type("https") + + +class MyClient(AcsClient): + + def __init__(self, arn, sessionName): + super().__init__(region_id=region_id, credential=RamRoleArnCredential(ak, secret, arn, sessionName)) + self.StoreName = None + + def get_md5_01(self, file_path): + md5 = None + if os.path.isfile(file_path): + f = open(file_path, 'rb') + md5_obj = hashlib.md5() + md5_obj.update(f.read()) + hash_code = md5_obj.hexdigest() + f.close() + md5 = str(hash_code).lower() + return md5 + + def do_action_with_exception(self, acs_request): + return json.loads(super().do_action_with_exception(acs_request).decode()) + + def showOption(self, options, key, desc): + choose = [] + for index, option in enumerate(options): + choose.append(option[key]) + print('{index}:{name}'.format(index=index + 1, name=option[key])) + return choose[(int)(input('输入{desc}\n'.format(desc=desc))) - 1] + + def listPhotoStores(self): + request = ListPhotoStoresRequest.ListPhotoStoresRequest() + response = self.do_action_with_exception(request) + print('PhotoStores:') + photoStores = response['PhotoStores'] + self.StoreName = self.showOption(photoStores, 'Name', 'StoreName') + + def listLibraries(self): + request = FetchLibrariesRequest.FetchLibrariesRequest() + request.set_StoreName(self.StoreName) + response = self.do_action_with_exception(request) + self.Libraries = response['Libraries'] + + def uploadPhoto(self): + if self.StoreName is None: + self.listPhotoStores() + request = CreateTransactionRequest.CreateTransactionRequest() + filePath = input('输入上传文件路径\n').replace('\\', '/') + fileName = filePath.split('/')[-1] + request.set_Size(os.path.getsize(filePath)) + request.set_Ext(fileName[-fileName[::-1].index('.'):]) + request.set_Md5(self.get_md5_01(filePath)) + request.set_StoreName(self.StoreName) + response = self.do_action_with_exception(request) + print(response) + Upload = response['Transaction']['Upload'] + FileId = Upload['FileId'] + SessionId = Upload['SessionId'] + Bucket = Upload['Bucket'] + OssEndpoint = Upload['OssEndpoint'] + ObjectKey = Upload['ObjectKey'] + + auth = oss2.StsAuth(self._signer._session_credential[0], self._signer._session_credential[1], + self._signer._session_credential[2]) + bucket = oss2.Bucket(auth, OssEndpoint, Bucket) + with open(filePath, 'rb') as fileobj: + result = bucket.put_object(ObjectKey, fileobj) + print('文件上传状态{status}'.format(status=result.status)) + + request = CreatePhotoRequest.CreatePhotoRequest() + request.set_FileId(FileId) + request.set_PhotoTitle(fileName) + request.set_SessionId(SessionId) + request.set_StoreName(self.StoreName) + request.set_UploadType('manual') + response = self.do_action_with_exception(request) + print(response) + + def listPhotos(self): + if self.StoreName == None: + self.listPhotoStores() + request = ListPhotosRequest.ListPhotosRequest() + request.set_StoreName(self.StoreName) + request.set_State('all') + response = self.do_action_with_exception(request) + print(response) + return response['Photos'] + + def getPhoto(self): + return self.showOption(self.listPhotos(), 'IdStr', '照片Id') + + def sharePhoto(self): + IdStr = self.getPhoto() + request = EditPhotosRequest.EditPhotosRequest() + request.set_PhotoIds([IdStr]) + request.set_StoreName(self.StoreName) + request.set_ShareExpireTime((int(round(time.time())) + 60 * 60) * 1000) + response = self.do_action_with_exception(request) + print(response) + + request = GetPublicAccessUrlsRequest.GetPublicAccessUrlsRequest() + request.set_DomainType('OSS') + request.set_PhotoIds([IdStr]) + request.set_StoreName(self.StoreName) + request.set_ZoomType('style/2') + response = self.do_action_with_exception(request) + print(response) + + +def client(arn, sessionName): + ram_role_arn_credential = RamRoleArnCredential('LTAIWzPnmkJs2qpL', 'LIIq3HumctXPp0WT8c06yDiFbKKiVe', + arn, sessionName) + return AcsClient(region_id='cn-shanghai', credential=ram_role_arn_credential) + + +if __name__ == '__main__': + + myClient = MyClient('acs:ram::1098806312754985:role/aliyunosstokengeneratorrole', 'pqh001') + myClient.listPhotoStores() + myClient.sharePhoto() diff --git a/PixivSearch/baidu/downLoadBduImg.py b/PixivSearch/baidu/downLoadBduImg.py new file mode 100644 index 0000000..03b1edc --- /dev/null +++ b/PixivSearch/baidu/downLoadBduImg.py @@ -0,0 +1,118 @@ +import json +import os +import re +from concurrent import futures +from datetime import datetime + +import requests + + +def get_cookies(): + _cookies = {} + array = "BDqhfp=fate%26%26NaN%26%260%26%261; BIDUPSID=8689C23BFD1526702A4EF173F3A809DD; BDRCVFR[dG2JNJb_ajR]=mk3SLVN4HKm; userFrom=null; BAIDUID=8689C23BFD152670722FAAEB4DDC55FA:FG=1; BDRCVFR[-pGxjrCMryR]=mk3SLVN4HKm".split( + ';') + for row in array: + k, v = row.strip().split('=', 1) + _cookies[k] = v + return _cookies + + +# 图片保存路径 +savePath = None +threadNum = 10 +startTime = None + + +def getBaiduImage(word): + global startTime, savePath + params = [] + startTime = datetime.now() + start = threadNum + i = 0 + filepath = None + savePath = r'{savePath}/{word}'.format(savePath=savePath, word=word) + if not os.path.exists(savePath): + os.makedirs(savePath) + while True: + try: + url = r"https://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result&queryWord={" \ + r"queryWord}&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=0&word={" \ + r"word}&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&pn={pn}&rn={rn}&gsm=3c&1523890541764= " + url = url.format(queryWord=word, word=word, pn=start, rn=threadNum) + print('request url:%s' % url) + req = requests.get(url) + if req.status_code == 200: + req.encoding = 'utf-8' + obj = json.loads(req.text.replace('\\\'', '')) + if len(obj['data']) == 1: + break + for img in obj['data']: + if 'fromPageTitle' in img: + print('图片:%s\t添加到下载队列' % img['fromPageTitleEnc']) + if 'replaceUrl' in img: + url = img['replaceUrl'][0]['ObjURL'] + params.append((url, i)) + i += 1 + if not filepath is None and os.path.exists(filepath): + os.remove(filepath) + filepath = r'{savePath}/图片下载队列填充:{i}'.format(savePath=savePath, word=word, i=i) + file = open(filepath, 'w') + file.close() + start += threadNum + except BaseException as e: + print(repr(e)) + if not filepath is None and os.path.exists(filepath): + os.remove(filepath) + executors = futures.ThreadPoolExecutor(threadNum) + try: + with executors as executor: + executor.map(downImage, params) + except BaseException as e: + print(repr(e)) + + +def downImage(params): + try: + url = params[0] + index = params[1] + print(r'开始下载图片{url}'.format(url=url)) + imgurl = requests.get(url, headers={"Referer": "image.baidu.com"}) + if imgurl.status_code == 200: + format = url[-url[::-1].index('.'):] + imgPath = r'{savePath}/fate_{index}.{format}'.format(savePath=savePath, + index=index, + format=format) + f = open(imgPath, 'wb') + f.write(imgurl.content) + f.close() + print(r'图片{url}成功下载到{imgPath}'.format(url=url, imgPath=imgPath)) + except BaseException as e: + print(repr(e)) + + +if __name__ == '__main__': + # str = '' + # while True: + # str = input('输入要下载图片的关键字,输入 exit 退出程序\n') + # if not str == 'exit': + # while True: + # savePath = input('输入图片存放目录:例如 E:/图片,注意目录之间使用正斜杠隔开"/"\n') + # if re.fullmatch(r"[a-zA-z]:(/[\u4e00-\u9fa5_a-zA-Z0-9]+)+", savePath) is None: + # print(r'图片目录{savePath}不合法请重新输入'.format(savePath=savePath)) + # else: + # break + # getBaiduImage(str) + # print(r'使用{threadNum}线程成功下载{count}张图片到目录{path}下,耗时:{second}'.format(threadNum=threadNum, + # count=len(os.listdir(savePath)), + # path=savePath, + # second=datetime.now() - startTime)) + # flag = False + # else: + # print('exit') + # break + req = requests.post('https://gifmaker.develophelper.com/gif/make', {'tplid': 1, + 'content': '好啊##$@?$?@$##就算你是一流工程师##$@?$?@$##就算你出报告再完美##$@?$?@$##我叫你改报告你就要改##$@?$?@$##毕竟我是客户##$@?$?@$##客户了不起啊##$@?$?@$##sorry 客户真的了不起##$@?$?@$##以后叫他天天改报告##$@?$?@$##天天改 天天改'}) + if req.status_code==200: + response = json.loads(req.content.decode()) + if 'd' in response: + print(response['d']) diff --git a/PixivSearch/dao/Comment.py b/PixivSearch/dao/Comment.py new file mode 100644 index 0000000..2a9f5c7 --- /dev/null +++ b/PixivSearch/dao/Comment.py @@ -0,0 +1,119 @@ +import json +import os +import shutil +import threading +from concurrent import futures + +import requests +from lxml import etree + + +class Comment: + lock = threading.Lock() # 多线程全局资源锁 + + def __init__(self, keywords_=None) -> None: + super().__init__() + self.obj = {'data': {}, 'flag': False} + self.keywords = keywords_ + + # 获取番剧合集弹幕排行榜 + def getCommentSort(self, cids): + + urls = [] + for cid in cids: + urls.extend(getCidUrls(cid)) + with futures.ThreadPoolExecutor(32) as executor: + executor.map(self.count, urls) + for index, data in enumerate( + sorted(self.obj["data"].items(), key=lambda d: d[1], reverse=True)[ + :50]): + print('{index}:{data}'.format(index=index + 1, data=data)) + + # 获取番剧合集弹幕排行榜 + def count(self, url, desc=None): + bytes = requests.get(url).content + comment_selector = etree.HTML(bytes) + if not desc is None: + print(desc) + print("url=%s" % url) + for comment in comment_selector.xpath('//i//d/text()'): + if comment in self.obj["data"]: + with self.lock: + self.obj["data"][comment] = self.obj["data"][comment] + 1 + else: + with self.lock: + self.obj["data"][comment] = 1 + if not self.obj["flag"]: + for keyword in self.keywords: + if keyword in comment: + self.obj["flag"] = True + + +# 根据cid获取历史弹幕地址 +def getCidUrls(cid): + urls = [] + url = "https://comment.bilibili.com/rolldate,%d" % cid + req = requests.get(url) + if len(req.text) > 0: + for i in json.loads(req.text): + urls.append("https://comment.bilibili.com/dmroll,%s,%d" % (i['timestamp'], cid)) + else: + urls.append("https://comment.bilibili.com/%d.xml" % cid) + return urls + + +# 下载弹幕 +def downloadXml(path, cid, size=None, histroy=True): + dlist = set() + flag = None + if histroy: + flag = parseXml(getCidUrls(cid), dlist, size) + else: + parseXml("https://comment.bilibili.com/%d.xml" % cid, dlist, size) + if size is None or (histroy and not size is None and flag): + if os.path.exists(path): + shutil.rmtree(path) + os.makedirs(path) + f = open('{path}/{cid}.xml'.format(path=path, cid=cid), 'wb') + f.write(b'') + for i in dlist: + f.write(('\r\n' + i).encode()) + f.write(b'\r\n') + f.close() + + +def xml(url): + bytes = requests.get(url).content + return etree.HTML(bytes) + + +def parseXml(urls, dlist, size=None): + if isinstance(urls, str): + urls = [urls] + if not size is None: + size = float(size.strip('%')) / 100.0 + for url in urls: + comment_selector = xml(url) + list = comment_selector.xpath('//i//d/text()') + maxlimit = int(comment_selector.xpath('//i//maxlimit/text()')[0]) + + if len(list) > 0: + print('弹幕数:{list},最大弹幕数:{maxlimit},弹幕池填充:{p}'.format(list=len(list), maxlimit=maxlimit, + p='%.2f%%' % (len(list) / maxlimit * 100))) + for element in comment_selector.xpath('//i//d'): + if len(element.xpath("text()")) > 0: + fstr = '{content}'.format(p=str(element.xpath("@p")[0]), + content=str(element.xpath("text()")[0])) + dlist.add(fstr) + + currentSize = len(dlist) / maxlimit + print('填充率:{l}'.format(l='%.2f%%' % (currentSize * 100))) + if not size is None and currentSize >= size: + return True + return False + + +if __name__ == '__main__': + cids = [7636499, 7636501, 7636500, 7636503, 7636504, 7636502, 7636509, 7636508, 7636506, 7636507, 7636505] + + downloadXml('F:/ABC',12026697,histroy=False) diff --git a/PixivSearch/dao/bangumi.py b/PixivSearch/dao/bangumi.py new file mode 100644 index 0000000..63a63a4 --- /dev/null +++ b/PixivSearch/dao/bangumi.py @@ -0,0 +1,185 @@ +import _thread +import json +import math +import os +from concurrent import futures +from queue import Queue + +import django +import requests +from bs4 import BeautifulSoup + +from PixivSearch.settings import logger + +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "PixivSearch.settings") +django.setup() +from PixivSearch.model.config import mediaInfo, stat + +current_mediaInfo = None + +isStop = None + + +def stop_(): + global isStop + isStop = True + + +def save(params): + if isStop: + return + logger.info(params) + bangumi_id = params[0] + season_id = params[1] + media_id = params[2] + + url = "https://www.bilibili.com/bangumi/media/md%d" % media_id + try: + req = requests.get(url, timeout=10) + except BaseException as e: + logger.error(repr(e)) + save(params) + logger.info("request_url=%s,status_code=%d" % (url, req.status_code)) + if req.status_code == 200: + json_obj = getJsonText(req, 3) + try: + if 'mediaInfo' in json_obj and 'stat' in json_obj['mediaInfo'] and 'chn_name' in json_obj['mediaInfo']: + stat_info = json_obj['mediaInfo']['stat'] + print(stat_info) + mediaInfo(bangumi_id=bangumi_id, season_id=season_id, media_id=media_id, + chn_name=json_obj['mediaInfo']['chn_name']).save() + global current_mediaInfo + current_mediaInfo = mediaInfo.objects.get(pk=season_id) + stat(id=season_id, danmakus=int(stat_info['danmakus']), favorites=stat_info['favorites'], + views=stat_info['views']).save() + except BaseException as e: + logger.error(repr(e)) + + +def getJsonText(req, index): + tag = BeautifulSoup(req.text, 'lxml') + script = tag.select("script")[index].text + json_str = script[script.index("=") + 1:script.index("function") - 2] + return json.loads(json_str) + + +def get_(): + global current_mediaInfo + return current_mediaInfo + + +page_size = 10 +queue = Queue(page_size) + + +def listen(): + while True: + ids = queue.get() + try: + executors = futures.ThreadPoolExecutor(page_size) + with executors as executor: + executor.map(save, ids) + logger.info('结束爬虫') + except BaseException as e: + logger.error(repr(e)) + + +_thread.start_new_thread(listen, ()) + +#遍历所有专题视频收藏数信息 +def getIds(): + seasonIdList = [] + page = 1 + pages = None + name = 'seasonListCallback' + global isStop + isStop = False + while isStop == False and (pages is None or page <= pages): + + url = 'https://bangumi.bilibili.com/web_api/season/index_global?page=%d&page_size=%d' % (page, page_size) + logger.info(url) + try: + req = requests.get(url, timeout=10) + if req.status_code == 200: + json_obj = json.loads(req.text) + if 'result' in json_obj and 'list' in json_obj['result']: + bangumiList = json_obj['result']['list'] + ids = [] + for bangumi in bangumiList: + if isStop: + break + if 'season_id' in bangumi: + season_id = int(bangumi['season_id']) + if season_id in seasonIdList: + continue + url = 'https://bangumi.bilibili.com/jsonp/seasoninfo/%d.ver?callback=%s&jsonp=jsonp' % ( + season_id, name) + logger.info(url) + req = requests.get(url, timeout=10) + if req.status_code == 200: + child_json_obj = json.loads( + req.text.replace('seasonListCallback(', '').replace(');', '')) + if 'result' in child_json_obj and 'bangumi_id' in child_json_obj['result']: + bangumi_id = int(child_json_obj['result']['bangumi_id']) + if 'media' in child_json_obj['result']: + media_id = int(child_json_obj['result']['media']['media_id']) + ids.append((bangumi_id, season_id, media_id)) + seasonIdList.append(season_id) + if pages is None and 'count' in json_obj['result']: + pages = int(math.ceil(int(json_obj['result']['count']) / page_size)) + page = page + 1 + logger.info('获取id数量%d' % len(ids)) + queue.put(ids) + except BaseException as e: + logger.error(repr(e)) + continue + +#根据aid获取cid +def getCid(aid, type=None): + while True and aid > 0: + url = "https://api.bilibili.com/x/web-interface/archive/stat?aid=%d" % aid + print(url) + req = requests.get(url) + code = json.loads(req.text)["code"] + if code == 0: + req = requests.get("https://www.bilibili.com/video/av%d" % aid) + if req.status_code == 200: + json_obj = getJsonText(req, 9) + if "videoData" in json_obj and "pages" in json_obj['videoData'] and len( + json_obj['videoData']['pages']) > 0 and "cid" in json_obj['videoData']['pages'][0]: + cid = json_obj['videoData']['pages'][0]['cid'] + print('cid=%s' % cid) + return cid + if type is None: + break + else: + if type: + aid = aid - 1 + else: + aid = aid + 1 + +#根据aid获取cid +def getCids(aid): + s = {"min": getCid(aid, True), "max": getCid(aid, False)} + return s + +#获取专题所有cid +def episodeIdToCid(episode_id): + cids = [] + url = "https://www.bilibili.com/bangumi/play/ep%d" % episode_id + print("url=%s" % url) + req = requests.get(url) + json_obj = getJsonText(req, 8) + if "epList" in json_obj: + for i in json_obj["epList"]: + cids.append(i['cid']) + return cids + + + +if __name__ == '__main__': + # print(getCids(29416)) + + req=requests.post('https://api.bilibili.com/x/v2/history/shadow/set','') + # obj = loadData([34807341], []) + diff --git a/PixivSearch/logging.conf b/PixivSearch/logging.conf new file mode 100644 index 0000000..33e9fcb --- /dev/null +++ b/PixivSearch/logging.conf @@ -0,0 +1,33 @@ +[loggers] +keys=root,main + +[handlers] +keys=consoleHandler,fileHandler + +[formatters] +keys=fmt + +[logger_root] +level=DEBUG +handlers=consoleHandler + +[logger_main] +level=DEBUG +qualname=file +handlers=fileHandler + +[handler_consoleHandler] +class=StreamHandler +level=INFO +formatter=fmt +args=(sys.stdout,) + +[handler_fileHandler] +class=FileHandler +level=DEBUG +formatter=fmt +args=('pixiv.log','a','utf-8',False) + +[formatter_fmt] +format=%(asctime)s - %(name)s - %(levelname)s - %(module)s:line:%(lineno)d - %(message)s +datefmt=%Y-%m-%d %H:%M:%S \ No newline at end of file diff --git a/PixivSearch/model/config.py b/PixivSearch/model/config.py new file mode 100644 index 0000000..315d937 --- /dev/null +++ b/PixivSearch/model/config.py @@ -0,0 +1,43 @@ +from django.db import models + + +class param(models.Model): + param_name = models.CharField(max_length=10, primary_key=True) + param_value = models.CharField(max_length=128) + + +class stat(models.Model): + id = models.IntegerField(primary_key=True) + danmakus = models.IntegerField() + favorites = models.IntegerField() + views = models.IntegerField() + + # def json(self): + # return bangumi_stat(self['danmakus'],self['favorites'],self['views']) + + +class mediaInfo(models.Model): + bangumi_id = models.IntegerField() + season_id = models.IntegerField(primary_key=True) + media_id = models.IntegerField() + chn_name = models.CharField(max_length=128) + + def __str__(self) -> str: + i = {'media_id': self.id, 'chn_name': self.chn_name} + return i + + +class bangumi_list(models.Model): + season_id = models.IntegerField(primary_key=True) + badge = models.CharField(max_length=128) + brief = models.CharField(max_length=128) + copyright = models.CharField(max_length=128) + cover = models.CharField(max_length=128) + favorites = models.IntegerField() + is_finish = models.IntegerField() + newest_ep_index = models.IntegerField() + pub_time = models.DateTimeField() + season_status = models.IntegerField() + title = models.CharField(max_length=128) + total_count = models.IntegerField() + trailer_aid = models.IntegerField() diff --git a/PixivSearch/model/migrations/0001_initial.py b/PixivSearch/model/migrations/0001_initial.py new file mode 100644 index 0000000..807f4da --- /dev/null +++ b/PixivSearch/model/migrations/0001_initial.py @@ -0,0 +1,57 @@ +# Generated by Django 2.0 on 2018-03-24 17:02 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='bangumi_list', + fields=[ + ('season_id', models.IntegerField(primary_key=True, serialize=False)), + ('badge', models.CharField(max_length=128)), + ('brief', models.CharField(max_length=128)), + ('copyright', models.CharField(max_length=128)), + ('cover', models.CharField(max_length=128)), + ('favorites', models.IntegerField()), + ('is_finish', models.IntegerField()), + ('newest_ep_index', models.IntegerField()), + ('pub_time', models.DateTimeField()), + ('season_status', models.IntegerField()), + ('title', models.CharField(max_length=128)), + ('total_count', models.IntegerField()), + ('trailer_aid', models.IntegerField()), + ], + ), + migrations.CreateModel( + name='mediaInfo', + fields=[ + ('bangumi_id', models.IntegerField(primary_key=True, serialize=False)), + ('season_id', models.IntegerField()), + ('media_id', models.IntegerField()), + ('chn_name', models.CharField(max_length=128)), + ], + ), + migrations.CreateModel( + name='param', + fields=[ + ('param_name', models.CharField(max_length=10, primary_key=True, serialize=False)), + ('param_value', models.CharField(max_length=128)), + ], + ), + migrations.CreateModel( + name='stat', + fields=[ + ('id', models.IntegerField(primary_key=True, serialize=False)), + ('danmakus', models.IntegerField()), + ('favorites', models.IntegerField()), + ('views', models.IntegerField()), + ], + ), + ] diff --git a/PixivSearch/pixiv/pixiv.py b/PixivSearch/pixiv/pixiv.py new file mode 100644 index 0000000..e4c74b6 --- /dev/null +++ b/PixivSearch/pixiv/pixiv.py @@ -0,0 +1,138 @@ +#!/usr/bin/env python +# coding:utf-8 +import json +import os +import sys +import threading +from concurrent import futures +from datetime import datetime + +import requests +from bs4 import BeautifulSoup + +import root +from PixivSearch.model import config +from PixivSearch.settings import logger +from PixivSearch.util import Util + + +headers = { + 'X-Requested-With': 'XMLHttpRequest', + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) ' + 'Chrome/56.0.2924.87 Safari/537.36' +} + +lock = threading.Lock() # 多线程全局资源锁 +total = 1 + + +def get_cookies(): + _cookies = {} + array = config.param.objects.get(param_name='pixiv_cookie').param_value.split(';') + for row in array: + k, v = row.strip().split('=', 1) + _cookies[k] = v + return _cookies + + +def crawl(url): + global total + req = requests.get(url, headers=headers, cookies=get_cookies()).text + tag = BeautifulSoup(req, 'lxml').select('#js-mount-point-search-result-list')[0].attrs['data-items'] + imageNodes = json.loads(tag) + for imageNode in imageNodes: + with lock: + nodes.append(imageNode) + + +def get_urls(search, page): + fmt = 'https://www.pixiv.net/search.php?word={}&order=date_d&p={}' + return [fmt.format(search, p) for p in range(1, page)] + + +def get_Img(params): + params[1]['imgUrl'] = 'https://i.pximg.net/img-original/img/' + params[1]['url'][-46:-15] + + headers['referer'] = 'https://www.pixiv.net/member_illust.php?mode=medium&illust_id=' + params[1]['illustId'] + + suffix = ".jpg" + logger.info('开始下载图片:%s%s' % (params[1]['imgUrl'], suffix)) + + s = requests.get(params[1]['imgUrl'] + suffix, headers=headers, cookies=get_cookies()) + if (s.status_code == 404): + suffix = '.png' + s = requests.get(params[1]['imgUrl'] + suffix, headers=headers, cookies=get_cookies()) + if (s.status_code == 404): + logger.error('无法下载图片:%s' % (params[1]['illustTitle'])) + return + + logger.info('下载图片:"%s"到%s' % ( + params[1]['illustTitle'], os.getcwd().replace('\\', '/') + '/' + imgPath + params[1]['illustId'] + suffix)) + f = open(imgPath + params[1]['illustId'] + suffix, 'wb') # 写入多媒体文件要 b 这个参数 + f.write(s.content) # 多媒体文件要是用conctent + f.close() + + params[1]['localName'] = params[1]['illustId'] + suffix + logger.info('排行第%d名,收藏数%d,标题:%s,标签:%s,(%s)前投稿,链接:%s' % ( + params[0], params[1]['bookmarkCount'], params[1]['illustTitle'], ','.join(params[1]['tags']), '', + params[1]['imgUrl'])) + +fsize = '' + + +def get_nodes(param): + global nodes, fsize, imgPath + nodes = [] + start = datetime.now() + urls = get_urls(param[1], int(param[2]) + 1) + logger.info('开始从P站获取图片数据') + with futures.ThreadPoolExecutor(32) as executor: + executor.map(crawl, urls) + + # for url in urls: + # crawl(url) + + length = len(nodes) + logger.info('获取到%d张图片' % (length)) + logger.info('对图片收藏数进行排序') + nodes = sorted(nodes, key=lambda v: v.get('bookmarkCount'), reverse=True)[:int(param[3])] # 按star数降序排序 + if (param[4] != None and param[4] == 'img'): + imgPath = root.getConfigValue('imgPath') + if not os.path.exists(imgPath): + os.makedirs(imgPath) + for file in os.listdir(imgPath): + os.remove(imgPath + file) + nodes_tup = [] + start_d = datetime.now() + for index, img in enumerate(nodes): + nodes_tup.append((index + 1, img)) + # get_Img((index+1,img)) + + with futures.ThreadPoolExecutor(32) as executor: + executor.map(get_Img, nodes_tup) + print('下载图片花费时间:%s' % (datetime.now() - start_d)) + logger.info('%s张图片下载完毕' % (len(os.listdir(imgPath)))) + + baseZipPath=root.getConfigValue('baseZipPath') + if not os.path.exists(baseZipPath): + os.makedirs(baseZipPath) + zipPath = baseZipPath+ param[1] + '.zip' + logger.info('图片打包到:%s' % (zipPath)) + Util.zip(imgPath, zipPath) + fsize = str(round(os.path.getsize(zipPath) / float(1024 * 1024), 2)) + 'MB' + logger.info('图包大小:%s' % (fsize)) + + tip = '从%d张图片中筛选出收藏数前%s的图片,处理耗时:%s' % (length, param[3], datetime.now() - start) + logger.info(tip) + return [nodes, tip, fsize] + + +if __name__ == "__main__": + if (len(sys.argv)) == 5 and sys.argv[2].isdigit() and sys.argv[3].isdigit(): + try: + get_nodes(sys.argv) + except BaseException as e: + repr(e) + + else: + logger.error('参数不合法') diff --git a/PixivSearch/settings.py b/PixivSearch/settings.py new file mode 100644 index 0000000..c1164a7 --- /dev/null +++ b/PixivSearch/settings.py @@ -0,0 +1,141 @@ +""" +Django settings for PixivSearch project. + +Generated by 'django-admin startproject' using Django 1.11.7. + +For more information on this file, see +https://docs.djangoproject.com/en/1.11/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/1.11/ref/settings/ +""" +import logging.config +import os + +# Build paths inside the project like this: os.path.join(BASE_DIR, ...) +BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/1.11/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = 'dh3^+=iugoo*+p_ea4u3dh&b!_zlgs8*m9kc+#*f2eozglsqjh' + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +ALLOWED_HOSTS = ['*'] + + +# Application definition + +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + 'PixivSearch.model' +] + +MIDDLEWARE = [ + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', +] + +ROOT_URLCONF = 'PixivSearch.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [os.path.join(os.path.dirname(__file__), 'templates').replace('\\','/')], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, + }, +] + +WSGI_APPLICATION = 'PixivSearch.wsgi.application' + + +# Database +# https://docs.djangoproject.com/en/1.11/ref/settings/#databases + +# DATABASES = { +# 'default': { +# 'ENGINE': 'django.db.backends.mysql', +# 'NAME': 'bangumi', +# 'USER': 'root', +# 'PASSWORD': '', +# 'HOST': '184.170.212.72', +# # 'HOST': 'sukura.top', +# 'PORT': '3306', +# } +# } + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': 'mydatabase', + } +} + + +# Password validation +# https://docs.djangoproject.com/en/1.11/ref/settings/#auth-password-validators + +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, +] + + +# Internationalization +# https://docs.djangoproject.com/en/1.11/topics/i18n/ + +LANGUAGE_CODE = 'en-us' + +TIME_ZONE = 'Asia/Shanghai' + +USE_I18N = True + +USE_L10N = True + +USE_TZ = False + + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/1.11/howto/static-files/ + +STATIC_URL = '/static/' +STATICFILES_DIRS = [ + os.path.join(os.path.dirname(__file__), 'static').replace('\\', '/'), +] + +configPath = '%s/logging.conf' % os.path.dirname(__file__).replace('\\', '/') +logging.config.fileConfig(configPath) +logger = logging.getLogger('file') + diff --git a/PixivSearch/static/js/jquery-3.2.1.min.js b/PixivSearch/static/js/jquery-3.2.1.min.js new file mode 100644 index 0000000..644d35e --- /dev/null +++ b/PixivSearch/static/js/jquery-3.2.1.min.js @@ -0,0 +1,4 @@ +/*! jQuery v3.2.1 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.2.1",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null==a?f.call(this):a<0?this[a+this.length]:this[a]},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(a<0?b:0);return this.pushStack(c>=0&&c0&&b-1 in a)}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0&&("form"in a||"label"in a)},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"form"in b?b.parentNode&&b.disabled===!1?"label"in b?"label"in b.parentNode?b.parentNode.disabled===a:b.disabled===a:b.isDisabled===a||b.isDisabled!==!a&&ea(b)===a:b.disabled===a:"label"in b&&b.disabled===a}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}}):(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c,d,e,f=b.getElementById(a);if(f){if(c=f.getAttributeNode("id"),c&&c.value===a)return[f];e=b.getElementsByName(a),d=0;while(f=e[d++])if(c=f.getAttributeNode("id"),c&&c.value===a)return[f]}return[]}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:!b||(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;d-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,c,e){var f,i,j,k,l,m="function"==typeof a&&a,n=!e&&g(a=m.selector||a);if(c=c||[],1===n.length){if(i=n[0]=n[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&9===b.nodeType&&p&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(_,aa),b)||[])[0],!b)return c;m&&(b=b.parentNode),a=a.slice(i.shift().value.length)}f=V.needsContext.test(a)?0:i.length;while(f--){if(j=i[f],d.relative[k=j.type])break;if((l=d.find[k])&&(e=l(j.matches[0].replace(_,aa),$.test(i[0].type)&&qa(b.parentNode)||b))){if(i.splice(f,1),a=e.length&&sa(i),!a)return G.apply(c,e),c;break}}}return(m||h(a,n))(e,b,!p,c,!b||$.test(a)&&qa(b.parentNode)||b),c},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext;function B(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()}var C=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,D=/^.[^:#\[\.,]*$/;function E(a,b,c){return r.isFunction(b)?r.grep(a,function(a,d){return!!b.call(a,d,a)!==c}):b.nodeType?r.grep(a,function(a){return a===b!==c}):"string"!=typeof b?r.grep(a,function(a){return i.call(b,a)>-1!==c}):D.test(b)?r.filter(b,a,c):(b=r.filter(b,a),r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType}))}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;b1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(E(this,a||[],!1))},not:function(a){return this.pushStack(E(this,a||[],!0))},is:function(a){return!!E(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var F,G=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,H=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||F,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:G.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),C.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};H.prototype=r.fn,F=r(d);var I=/^(?:parents|prev(?:Until|All))/,J={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;a-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function K(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return K(a,"nextSibling")},prev:function(a){return K(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return B(a,"iframe")?a.contentDocument:(B(a,"template")&&(a=a.content||a),r.merge([],a.childNodes))}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(J[a]||r.uniqueSort(e),I.test(a)&&e.reverse()),this.pushStack(e)}});var L=/[^\x20\t\r\n\f]+/g;function M(a){var b={};return r.each(a.match(L)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?M(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=e||a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function N(a){return a}function O(a){throw a}function P(a,b,c,d){var e;try{a&&r.isFunction(e=a.promise)?e.call(a).done(b).fail(c):a&&r.isFunction(e=a.then)?e.call(a,b,c):b.apply(void 0,[a].slice(d))}catch(a){c.apply(void 0,[a])}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(b=f&&(d!==O&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:N,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:N)),c[2][3].add(g(0,a,r.isFunction(d)?d:O))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(b<=1&&(P(a,g.done(h(c)).resolve,g.reject,!b),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)P(e[c],h(c),g.reject);return g.promise()}});var Q=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&Q.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},r.readyException=function(b){a.setTimeout(function(){throw b})};var R=r.Deferred();r.fn.ready=function(a){return R.then(a)["catch"](function(a){r.readyException(a)}),this},r.extend({isReady:!1,readyWait:1,ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||R.resolveWith(d,[r]))}}),r.ready.then=R.then;function S(){d.removeEventListener("DOMContentLoaded",S), +a.removeEventListener("load",S),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",S),a.addEventListener("load",S));var T=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)T(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h1,null,!0)},removeData:function(a){return this.each(function(){X.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=W.get(a,b),c&&(!d||Array.isArray(c)?d=W.access(a,b,r.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return W.get(a,c)||W.access(a,c,{empty:r.Callbacks("once memory").add(function(){W.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length\x20\t\r\n\f]+)/i,la=/^$|\/(?:java|ecma)script/i,ma={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};ma.optgroup=ma.option,ma.tbody=ma.tfoot=ma.colgroup=ma.caption=ma.thead,ma.th=ma.td;function na(a,b){var c;return c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[],void 0===b||b&&B(a,b)?r.merge([a],c):c}function oa(a,b){for(var c=0,d=a.length;c-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=na(l.appendChild(f),"script"),j&&oa(g),c){k=0;while(f=g[k++])la.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var ra=d.documentElement,sa=/^key/,ta=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ua=/^([^.]*)(?:\.(.+)|)/;function va(){return!0}function wa(){return!1}function xa(){try{return d.activeElement}catch(a){}}function ya(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)ya(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=wa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(ra,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(L)||[""],j=b.length;while(j--)h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.hasData(a)&&W.get(a);if(q&&(i=q.events)){b=(b||"").match(L)||[""],j=b.length;while(j--)if(h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&W.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(W.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c=1))for(;j!==this;j=j.parentNode||this)if(1===j.nodeType&&("click"!==a.type||j.disabled!==!0)){for(f=[],g={},c=0;c-1:r.find(e,this,null,[j]).length),g[e]&&f.push(d);f.length&&h.push({elem:j,handlers:f})}return j=this,i\x20\t\r\n\f]*)[^>]*)\/>/gi,Aa=/\s*$/g;function Ea(a,b){return B(a,"table")&&B(11!==b.nodeType?b:b.firstChild,"tr")?r(">tbody",a)[0]||a:a}function Fa(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function Ga(a){var b=Ca.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ha(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(W.hasData(a)&&(f=W.access(a),g=W.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;c1&&"string"==typeof q&&!o.checkClone&&Ba.test(q))return a.each(function(e){var f=a.eq(e);s&&(b[0]=q.call(this,e,f.html())),Ja(f,b,c,d)});if(m&&(e=qa(b,a[0].ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(na(e,"script"),Fa),i=h.length;l")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=na(h),f=na(a),d=0,e=f.length;d0&&oa(g,!i&&na(a,"script")),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a[f]);f++)if(U(c)){if(b=c[W.expando]){if(b.events)for(d in b.events)e[d]?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[W.expando]=void 0}c[X.expando]&&(c[X.expando]=void 0)}}}),r.fn.extend({detach:function(a){return Ka(this,a,!0)},remove:function(a){return Ka(this,a)},text:function(a){return T(this,function(a){return void 0===a?r.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.appendChild(a)}})},prepend:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(r.cleanData(na(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return r.clone(this,a,b)})},html:function(a){return T(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!Aa.test(a)&&!ma[(ka.exec(a)||["",""])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;c1)}});function _a(a,b,c,d,e){return new _a.prototype.init(a,b,c,d,e)}r.Tween=_a,_a.prototype={constructor:_a,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||r.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(r.cssNumber[c]?"":"px")},cur:function(){var a=_a.propHooks[this.prop];return a&&a.get?a.get(this):_a.propHooks._default.get(this)},run:function(a){var b,c=_a.propHooks[this.prop];return this.options.duration?this.pos=b=r.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):_a.propHooks._default.set(this),this}},_a.prototype.init.prototype=_a.prototype,_a.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=r.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){r.fx.step[a.prop]?r.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[r.cssProps[a.prop]]&&!r.cssHooks[a.prop]?a.elem[a.prop]=a.now:r.style(a.elem,a.prop,a.now+a.unit)}}},_a.propHooks.scrollTop=_a.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},r.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},r.fx=_a.prototype.init,r.fx.step={};var ab,bb,cb=/^(?:toggle|show|hide)$/,db=/queueHooks$/;function eb(){bb&&(d.hidden===!1&&a.requestAnimationFrame?a.requestAnimationFrame(eb):a.setTimeout(eb,r.fx.interval),r.fx.tick())}function fb(){return a.setTimeout(function(){ab=void 0}),ab=r.now()}function gb(a,b){var c,d=0,e={height:a};for(b=b?1:0;d<4;d+=2-b)c=ca[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function hb(a,b,c){for(var d,e=(kb.tweeners[b]||[]).concat(kb.tweeners["*"]),f=0,g=e.length;f1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?lb:void 0)),void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b), +null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&B(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(L);if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c)}}),lb={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=mb[b]||r.find.attr;mb[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=mb[g],mb[g]=e,e=null!=c(a,b,d)?g:null,mb[g]=f),e}});var nb=/^(?:input|select|textarea|button)$/i,ob=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return T(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):nb.test(a.nodeName)||ob.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});function pb(a){var b=a.match(L)||[];return b.join(" ")}function qb(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,qb(this)))});if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=qb(c),d=1===c.nodeType&&" "+pb(e)+" "){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=pb(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,qb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=qb(c),d=1===c.nodeType&&" "+pb(e)+" "){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=pb(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,qb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(L)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=qb(this),b&&W.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":W.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+pb(qb(c))+" ").indexOf(b)>-1)return!0;return!1}});var rb=/\r/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":Array.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(rb,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:pb(r.text(a))}},select:{get:function(a){var b,c,d,e=a.options,f=a.selectedIndex,g="select-one"===a.type,h=g?null:[],i=g?f+1:e.length;for(d=f<0?i:g?f:0;d-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){if(Array.isArray(b))return a.checked=r.inArray(r(a).val(),b)>-1}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var sb=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!sb.test(p+r.event.triggered)&&(p.indexOf(".")>-1&&(q=p.split("."),p=q.shift(),q.sort()),k=p.indexOf(":")<0&&"on"+p,b=b[r.expando]?b:new r.Event(p,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,sb.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(W.get(h,"events")||{})[b.type]&&W.get(h,"handle"),m&&m.apply(h,c),m=k&&h[k],m&&m.apply&&U(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!U(e)||k&&r.isFunction(e[p])&&!r.isWindow(e)&&(i=e[k],i&&(e[k]=null),r.event.triggered=p,e[p](),r.event.triggered=void 0,i&&(e[k]=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];if(c)return r.event.trigger(a,b,c,!0)}}),r.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(a,b){r.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),r.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),o.focusin="onfocusin"in a,o.focusin||r.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=W.access(d,b);e||d.addEventListener(a,c,!0),W.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=W.access(d,b)-1;e?W.access(d,b,e):(d.removeEventListener(a,c,!0),W.remove(d,b))}}});var tb=a.location,ub=r.now(),vb=/\?/;r.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(d){c=void 0}return c&&!c.getElementsByTagName("parsererror").length||r.error("Invalid XML: "+b),c};var wb=/\[\]$/,xb=/\r?\n/g,yb=/^(?:submit|button|image|reset|file)$/i,zb=/^(?:input|select|textarea|keygen)/i;function Ab(a,b,c,d){var e;if(Array.isArray(b))r.each(b,function(b,e){c||wb.test(a)?d(a,e):Ab(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==r.type(b))d(a,b);else for(e in b)Ab(a+"["+e+"]",b[e],c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(Array.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)Ab(c,a[c],b,e);return d.join("&")},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,"elements");return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(":disabled")&&zb.test(this.nodeName)&&!yb.test(a)&&(this.checked||!ja.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:Array.isArray(c)?r.map(c,function(a){return{name:b.name,value:a.replace(xb,"\r\n")}}):{name:b.name,value:c.replace(xb,"\r\n")}}).get()}});var Bb=/%20/g,Cb=/#.*$/,Db=/([?&])_=[^&]*/,Eb=/^(.*?):[ \t]*([^\r\n]*)$/gm,Fb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Gb=/^(?:GET|HEAD)$/,Hb=/^\/\//,Ib={},Jb={},Kb="*/".concat("*"),Lb=d.createElement("a");Lb.href=tb.href;function Mb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(L)||[];if(r.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Nb(a,b,c,d){var e={},f=a===Jb;function g(h){var i;return e[h]=!0,r.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Ob(a,b){var c,d,e=r.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&r.extend(!0,a,d),a}function Pb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}if(f)return f!==i[0]&&i.unshift(f),c[f]}function Qb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}r.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:tb.href,type:"GET",isLocal:Fb.test(tb.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Kb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":r.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Ob(Ob(a,r.ajaxSettings),b):Ob(r.ajaxSettings,a)},ajaxPrefilter:Mb(Ib),ajaxTransport:Mb(Jb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m,n,o=r.ajaxSetup({},c),p=o.context||o,q=o.context&&(p.nodeType||p.jquery)?r(p):r.event,s=r.Deferred(),t=r.Callbacks("once memory"),u=o.statusCode||{},v={},w={},x="canceled",y={readyState:0,getResponseHeader:function(a){var b;if(k){if(!h){h={};while(b=Eb.exec(g))h[b[1].toLowerCase()]=b[2]}b=h[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return k?g:null},setRequestHeader:function(a,b){return null==k&&(a=w[a.toLowerCase()]=w[a.toLowerCase()]||a,v[a]=b),this},overrideMimeType:function(a){return null==k&&(o.mimeType=a),this},statusCode:function(a){var b;if(a)if(k)y.always(a[y.status]);else for(b in a)u[b]=[u[b],a[b]];return this},abort:function(a){var b=a||x;return e&&e.abort(b),A(0,b),this}};if(s.promise(y),o.url=((b||o.url||tb.href)+"").replace(Hb,tb.protocol+"//"),o.type=c.method||c.type||o.method||o.type,o.dataTypes=(o.dataType||"*").toLowerCase().match(L)||[""],null==o.crossDomain){j=d.createElement("a");try{j.href=o.url,j.href=j.href,o.crossDomain=Lb.protocol+"//"+Lb.host!=j.protocol+"//"+j.host}catch(z){o.crossDomain=!0}}if(o.data&&o.processData&&"string"!=typeof o.data&&(o.data=r.param(o.data,o.traditional)),Nb(Ib,o,c,y),k)return y;l=r.event&&o.global,l&&0===r.active++&&r.event.trigger("ajaxStart"),o.type=o.type.toUpperCase(),o.hasContent=!Gb.test(o.type),f=o.url.replace(Cb,""),o.hasContent?o.data&&o.processData&&0===(o.contentType||"").indexOf("application/x-www-form-urlencoded")&&(o.data=o.data.replace(Bb,"+")):(n=o.url.slice(f.length),o.data&&(f+=(vb.test(f)?"&":"?")+o.data,delete o.data),o.cache===!1&&(f=f.replace(Db,"$1"),n=(vb.test(f)?"&":"?")+"_="+ub++ +n),o.url=f+n),o.ifModified&&(r.lastModified[f]&&y.setRequestHeader("If-Modified-Since",r.lastModified[f]),r.etag[f]&&y.setRequestHeader("If-None-Match",r.etag[f])),(o.data&&o.hasContent&&o.contentType!==!1||c.contentType)&&y.setRequestHeader("Content-Type",o.contentType),y.setRequestHeader("Accept",o.dataTypes[0]&&o.accepts[o.dataTypes[0]]?o.accepts[o.dataTypes[0]]+("*"!==o.dataTypes[0]?", "+Kb+"; q=0.01":""):o.accepts["*"]);for(m in o.headers)y.setRequestHeader(m,o.headers[m]);if(o.beforeSend&&(o.beforeSend.call(p,y,o)===!1||k))return y.abort();if(x="abort",t.add(o.complete),y.done(o.success),y.fail(o.error),e=Nb(Jb,o,c,y)){if(y.readyState=1,l&&q.trigger("ajaxSend",[y,o]),k)return y;o.async&&o.timeout>0&&(i=a.setTimeout(function(){y.abort("timeout")},o.timeout));try{k=!1,e.send(v,A)}catch(z){if(k)throw z;A(-1,z)}}else A(-1,"No Transport");function A(b,c,d,h){var j,m,n,v,w,x=c;k||(k=!0,i&&a.clearTimeout(i),e=void 0,g=h||"",y.readyState=b>0?4:0,j=b>=200&&b<300||304===b,d&&(v=Pb(o,y,d)),v=Qb(o,v,y,j),j?(o.ifModified&&(w=y.getResponseHeader("Last-Modified"),w&&(r.lastModified[f]=w),w=y.getResponseHeader("etag"),w&&(r.etag[f]=w)),204===b||"HEAD"===o.type?x="nocontent":304===b?x="notmodified":(x=v.state,m=v.data,n=v.error,j=!n)):(n=x,!b&&x||(x="error",b<0&&(b=0))),y.status=b,y.statusText=(c||x)+"",j?s.resolveWith(p,[m,x,y]):s.rejectWith(p,[y,x,n]),y.statusCode(u),u=void 0,l&&q.trigger(j?"ajaxSuccess":"ajaxError",[y,o,j?m:n]),t.fireWith(p,[y,x]),l&&(q.trigger("ajaxComplete",[y,o]),--r.active||r.event.trigger("ajaxStop")))}return y},getJSON:function(a,b,c){return r.get(a,b,c,"json")},getScript:function(a,b){return r.get(a,void 0,b,"script")}}),r.each(["get","post"],function(a,b){r[b]=function(a,c,d,e){return r.isFunction(c)&&(e=e||d,d=c,c=void 0),r.ajax(r.extend({url:a,type:b,dataType:e,data:c,success:d},r.isPlainObject(a)&&a))}}),r._evalUrl=function(a){return r.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},r.fn.extend({wrapAll:function(a){var b;return this[0]&&(r.isFunction(a)&&(a=a.call(this[0])),b=r(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return r.isFunction(a)?this.each(function(b){r(this).wrapInner(a.call(this,b))}):this.each(function(){var b=r(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=r.isFunction(a);return this.each(function(c){r(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){r(this).replaceWith(this.childNodes)}),this}}),r.expr.pseudos.hidden=function(a){return!r.expr.pseudos.visible(a)},r.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},r.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var Rb={0:200,1223:204},Sb=r.ajaxSettings.xhr();o.cors=!!Sb&&"withCredentials"in Sb,o.ajax=Sb=!!Sb,r.ajaxTransport(function(b){var c,d;if(o.cors||Sb&&!b.crossDomain)return{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(Rb[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(i){if(c)throw i}},abort:function(){c&&c()}}}),r.ajaxPrefilter(function(a){a.crossDomain&&(a.contents.script=!1)}),r.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return r.globalEval(a),a}}}),r.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),r.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=r(" + + + +
+ {% csrf_token %} + + +
+ + +
+
+ + \ No newline at end of file diff --git a/PixivSearch/templates/index.html b/PixivSearch/templates/index.html new file mode 100644 index 0000000..b2a9ad6 --- /dev/null +++ b/PixivSearch/templates/index.html @@ -0,0 +1,107 @@ + + + + {% load staticfiles %} + + + + + + + + + + +
+ {% csrf_token %} + +
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+
+ + +
+
+ +
+ + + {% if download %} + 图包提取(文件大小:{{ size }}) + {% endif %} +
+ + +
+ +
+

{{ msg }}

+
+
    + {% for imageNode in imageNodes %} +
  1. +
    +

    标题:{{ imageNode.illustTitle }},画师:{{ imageNode.userName }},收藏数:{{ imageNode.bookmarkCount }} +

    + {% if imageNode.localName %} + + {% endif %} +
    +
  2. + {% empty %} +

    {{ tip }}

    + {% endfor %} + +
+ + \ No newline at end of file diff --git a/PixivSearch/thrift/QueryComment/Client.py b/PixivSearch/thrift/QueryComment/Client.py new file mode 100644 index 0000000..9abc8e7 --- /dev/null +++ b/PixivSearch/thrift/QueryComment/Client.py @@ -0,0 +1,23 @@ +from thrift.protocol import TBinaryProtocol +from thrift.transport import TSocket, TTransport + +from PixivSearch.thrift.QueryComment.QueryComment import Client + +if __name__ == '__main__': + + socket = TSocket.TSocket('sukura.top', 2233) + + # Buffering is critical. Raw sockets are very slow + transport = TTransport.TFramedTransport(socket) + + if not transport.isOpen(): + transport.open() + + # Wrap in a protocol + protocol = TBinaryProtocol.TBinaryProtocol(transport) + + # Create a client to use the protocol encoder + client = Client(protocol) + + cids = [7636499, 7636501, 7636500, 7636503, 7636504, 7636502, 7636509, 7636508, 7636506, 7636507, 7636505] + print(client.commentSumMap(cids)) \ No newline at end of file diff --git a/PixivSearch/thrift/QueryComment/QueryComment-remote b/PixivSearch/thrift/QueryComment/QueryComment-remote new file mode 100644 index 0000000..a76303e --- /dev/null +++ b/PixivSearch/thrift/QueryComment/QueryComment-remote @@ -0,0 +1,131 @@ +#!/usr/bin/env python +# +# Autogenerated by Thrift Compiler (0.11.0) +# +# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING +# +# options string: py +# + +import sys +import pprint +if sys.version_info[0] > 2: + from urllib.parse import urlparse +else: + from urlparse import urlparse +from thrift.transport import TTransport, TSocket, TSSLSocket, THttpClient +from thrift.protocol.TBinaryProtocol import TBinaryProtocol + +from QueryComment import QueryComment +from QueryComment.ttypes import * + +if len(sys.argv) <= 1 or sys.argv[1] == '--help': + print('') + print('Usage: ' + sys.argv[0] + ' [-h host[:port]] [-u url] [-f[ramed]] [-s[sl]] [-novalidate] [-ca_certs certs] [-keyfile keyfile] [-certfile certfile] function [arg1 [arg2...]]') + print('') + print('Functions:') + print(' i32 commentSum(i32 cid)') + print(' commentSumList( cids)') + print(' string download( cids, string fileName)') + print('') + sys.exit(0) + +pp = pprint.PrettyPrinter(indent=2) +host = 'localhost' +port = 9090 +uri = '' +framed = False +ssl = False +validate = True +ca_certs = None +keyfile = None +certfile = None +http = False +argi = 1 + +if sys.argv[argi] == '-h': + parts = sys.argv[argi + 1].split(':') + host = parts[0] + if len(parts) > 1: + port = int(parts[1]) + argi += 2 + +if sys.argv[argi] == '-u': + url = urlparse(sys.argv[argi + 1]) + parts = url[1].split(':') + host = parts[0] + if len(parts) > 1: + port = int(parts[1]) + else: + port = 80 + uri = url[2] + if url[4]: + uri += '?%s' % url[4] + http = True + argi += 2 + +if sys.argv[argi] == '-f' or sys.argv[argi] == '-framed': + framed = True + argi += 1 + +if sys.argv[argi] == '-s' or sys.argv[argi] == '-ssl': + ssl = True + argi += 1 + +if sys.argv[argi] == '-novalidate': + validate = False + argi += 1 + +if sys.argv[argi] == '-ca_certs': + ca_certs = sys.argv[argi+1] + argi += 2 + +if sys.argv[argi] == '-keyfile': + keyfile = sys.argv[argi+1] + argi += 2 + +if sys.argv[argi] == '-certfile': + certfile = sys.argv[argi+1] + argi += 2 + +cmd = sys.argv[argi] +args = sys.argv[argi + 1:] + +if http: + transport = THttpClient.THttpClient(host, port, uri) +else: + if ssl: + socket = TSSLSocket.TSSLSocket(host, port, validate=validate, ca_certs=ca_certs, keyfile=keyfile, certfile=certfile) + else: + socket = TSocket.TSocket(host, port) + if framed: + transport = TTransport.TFramedTransport(socket) + else: + transport = TTransport.TBufferedTransport(socket) +protocol = TBinaryProtocol(transport) +client = QueryComment.Client(protocol) +transport.open() + +if cmd == 'commentSum': + if len(args) != 1: + print('commentSum requires 1 args') + sys.exit(1) + pp.pprint(client.commentSum(eval(args[0]),)) + +elif cmd == 'commentSumList': + if len(args) != 1: + print('commentSumList requires 1 args') + sys.exit(1) + pp.pprint(client.commentSumList(eval(args[0]),)) + +elif cmd == 'download': + if len(args) != 2: + print('download requires 2 args') + sys.exit(1) + pp.pprint(client.download(eval(args[0]), args[1],)) + +else: + print('Unrecognized method %s' % cmd) + sys.exit(1) + +transport.close() diff --git a/PixivSearch/thrift/QueryComment/QueryComment.py b/PixivSearch/thrift/QueryComment/QueryComment.py new file mode 100644 index 0000000..9b4bffb --- /dev/null +++ b/PixivSearch/thrift/QueryComment/QueryComment.py @@ -0,0 +1,660 @@ +# +# Autogenerated by Thrift Compiler (0.11.0) +# +# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING +# +# options string: py +# + +from thrift.Thrift import TType, TMessageType, TFrozenDict, TException, TApplicationException +from thrift.protocol.TProtocol import TProtocolException +from thrift.TRecursive import fix_spec + +import sys +import logging +from .ttypes import * +from thrift.Thrift import TProcessor +from thrift.transport import TTransport +all_structs = [] + + +class Iface(object): + def commentSum(self, cid): + """ + 查询单个cid弹幕数 + + + Parameters: + - cid + """ + pass + + def commentSumList(self, cids): + """ + * 批量查询多个cid弹幕数 + * + + Parameters: + - cids + """ + pass + + def download(self, cids, fileName): + """ + * 批量下载弹幕 + * + + Parameters: + - cids + - fileName + """ + pass + + +class Client(Iface): + def __init__(self, iprot, oprot=None): + self._iprot = self._oprot = iprot + if oprot is not None: + self._oprot = oprot + self._seqid = 0 + + def commentSum(self, cid): + """ + 查询单个cid弹幕数 + + + Parameters: + - cid + """ + self.send_commentSum(cid) + return self.recv_commentSum() + + def send_commentSum(self, cid): + self._oprot.writeMessageBegin('commentSum', TMessageType.CALL, self._seqid) + args = commentSum_args() + args.cid = cid + args.write(self._oprot) + self._oprot.writeMessageEnd() + self._oprot.trans.flush() + + def recv_commentSum(self): + iprot = self._iprot + (fname, mtype, rseqid) = iprot.readMessageBegin() + if mtype == TMessageType.EXCEPTION: + x = TApplicationException() + x.read(iprot) + iprot.readMessageEnd() + raise x + result = commentSum_result() + result.read(iprot) + iprot.readMessageEnd() + if result.success is not None: + return result.success + raise TApplicationException(TApplicationException.MISSING_RESULT, "commentSum failed: unknown result") + + def commentSumList(self, cids): + """ + * 批量查询多个cid弹幕数 + * + + Parameters: + - cids + """ + self.send_commentSumList(cids) + return self.recv_commentSumList() + + def send_commentSumList(self, cids): + self._oprot.writeMessageBegin('commentSumList', TMessageType.CALL, self._seqid) + args = commentSumList_args() + args.cids = cids + args.write(self._oprot) + self._oprot.writeMessageEnd() + self._oprot.trans.flush() + + def recv_commentSumList(self): + iprot = self._iprot + (fname, mtype, rseqid) = iprot.readMessageBegin() + if mtype == TMessageType.EXCEPTION: + x = TApplicationException() + x.read(iprot) + iprot.readMessageEnd() + raise x + result = commentSumList_result() + result.read(iprot) + iprot.readMessageEnd() + if result.success is not None: + return result.success + raise TApplicationException(TApplicationException.MISSING_RESULT, "commentSumList failed: unknown result") + + def download(self, cids, fileName): + """ + * 批量下载弹幕 + * + + Parameters: + - cids + - fileName + """ + self.send_download(cids, fileName) + return self.recv_download() + + def send_download(self, cids, fileName): + self._oprot.writeMessageBegin('download', TMessageType.CALL, self._seqid) + args = download_args() + args.cids = cids + args.fileName = fileName + args.write(self._oprot) + self._oprot.writeMessageEnd() + self._oprot.trans.flush() + + def recv_download(self): + iprot = self._iprot + (fname, mtype, rseqid) = iprot.readMessageBegin() + if mtype == TMessageType.EXCEPTION: + x = TApplicationException() + x.read(iprot) + iprot.readMessageEnd() + raise x + result = download_result() + result.read(iprot) + iprot.readMessageEnd() + if result.success is not None: + return result.success + raise TApplicationException(TApplicationException.MISSING_RESULT, "download failed: unknown result") + + +class Processor(Iface, TProcessor): + def __init__(self, handler): + self._handler = handler + self._processMap = {} + self._processMap["commentSum"] = Processor.process_commentSum + self._processMap["commentSumList"] = Processor.process_commentSumList + self._processMap["download"] = Processor.process_download + + def process(self, iprot, oprot): + (name, type, seqid) = iprot.readMessageBegin() + if name not in self._processMap: + iprot.skip(TType.STRUCT) + iprot.readMessageEnd() + x = TApplicationException(TApplicationException.UNKNOWN_METHOD, 'Unknown function %s' % (name)) + oprot.writeMessageBegin(name, TMessageType.EXCEPTION, seqid) + x.write(oprot) + oprot.writeMessageEnd() + oprot.trans.flush() + return + else: + self._processMap[name](self, seqid, iprot, oprot) + return True + + def process_commentSum(self, seqid, iprot, oprot): + args = commentSum_args() + args.read(iprot) + iprot.readMessageEnd() + result = commentSum_result() + try: + result.success = self._handler.commentSum(args.cid) + msg_type = TMessageType.REPLY + except TTransport.TTransportException: + raise + except TApplicationException as ex: + logging.exception('TApplication exception in handler') + msg_type = TMessageType.EXCEPTION + result = ex + except Exception: + logging.exception('Unexpected exception in handler') + msg_type = TMessageType.EXCEPTION + result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error') + oprot.writeMessageBegin("commentSum", msg_type, seqid) + result.write(oprot) + oprot.writeMessageEnd() + oprot.trans.flush() + + def process_commentSumList(self, seqid, iprot, oprot): + args = commentSumList_args() + args.read(iprot) + iprot.readMessageEnd() + result = commentSumList_result() + try: + result.success = self._handler.commentSumList(args.cids) + msg_type = TMessageType.REPLY + except TTransport.TTransportException: + raise + except TApplicationException as ex: + logging.exception('TApplication exception in handler') + msg_type = TMessageType.EXCEPTION + result = ex + except Exception: + logging.exception('Unexpected exception in handler') + msg_type = TMessageType.EXCEPTION + result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error') + oprot.writeMessageBegin("commentSumList", msg_type, seqid) + result.write(oprot) + oprot.writeMessageEnd() + oprot.trans.flush() + + def process_download(self, seqid, iprot, oprot): + args = download_args() + args.read(iprot) + iprot.readMessageEnd() + result = download_result() + try: + result.success = self._handler.download(args.cids, args.fileName) + msg_type = TMessageType.REPLY + except TTransport.TTransportException: + raise + except TApplicationException as ex: + logging.exception('TApplication exception in handler') + msg_type = TMessageType.EXCEPTION + result = ex + except Exception: + logging.exception('Unexpected exception in handler') + msg_type = TMessageType.EXCEPTION + result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error') + oprot.writeMessageBegin("download", msg_type, seqid) + result.write(oprot) + oprot.writeMessageEnd() + oprot.trans.flush() + +# HELPER FUNCTIONS AND STRUCTURES + + +class commentSum_args(object): + """ + Attributes: + - cid + """ + + + def __init__(self, cid=None,): + self.cid = cid + + def read(self, iprot): + if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: + iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec]) + return + iprot.readStructBegin() + while True: + (fname, ftype, fid) = iprot.readFieldBegin() + if ftype == TType.STOP: + break + if fid == 1: + if ftype == TType.I32: + self.cid = iprot.readI32() + else: + iprot.skip(ftype) + else: + iprot.skip(ftype) + iprot.readFieldEnd() + iprot.readStructEnd() + + def write(self, oprot): + if oprot._fast_encode is not None and self.thrift_spec is not None: + oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec])) + return + oprot.writeStructBegin('commentSum_args') + if self.cid is not None: + oprot.writeFieldBegin('cid', TType.I32, 1) + oprot.writeI32(self.cid) + oprot.writeFieldEnd() + oprot.writeFieldStop() + oprot.writeStructEnd() + + def validate(self): + return + + def __repr__(self): + L = ['%s=%r' % (key, value) + for key, value in self.__dict__.items()] + return '%s(%s)' % (self.__class__.__name__, ', '.join(L)) + + def __eq__(self, other): + return isinstance(other, self.__class__) and self.__dict__ == other.__dict__ + + def __ne__(self, other): + return not (self == other) +all_structs.append(commentSum_args) +commentSum_args.thrift_spec = ( + None, # 0 + (1, TType.I32, 'cid', None, None, ), # 1 +) + + +class commentSum_result(object): + """ + Attributes: + - success + """ + + + def __init__(self, success=None,): + self.success = success + + def read(self, iprot): + if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: + iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec]) + return + iprot.readStructBegin() + while True: + (fname, ftype, fid) = iprot.readFieldBegin() + if ftype == TType.STOP: + break + if fid == 0: + if ftype == TType.I32: + self.success = iprot.readI32() + else: + iprot.skip(ftype) + else: + iprot.skip(ftype) + iprot.readFieldEnd() + iprot.readStructEnd() + + def write(self, oprot): + if oprot._fast_encode is not None and self.thrift_spec is not None: + oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec])) + return + oprot.writeStructBegin('commentSum_result') + if self.success is not None: + oprot.writeFieldBegin('success', TType.I32, 0) + oprot.writeI32(self.success) + oprot.writeFieldEnd() + oprot.writeFieldStop() + oprot.writeStructEnd() + + def validate(self): + return + + def __repr__(self): + L = ['%s=%r' % (key, value) + for key, value in self.__dict__.items()] + return '%s(%s)' % (self.__class__.__name__, ', '.join(L)) + + def __eq__(self, other): + return isinstance(other, self.__class__) and self.__dict__ == other.__dict__ + + def __ne__(self, other): + return not (self == other) +all_structs.append(commentSum_result) +commentSum_result.thrift_spec = ( + (0, TType.I32, 'success', None, None, ), # 0 +) + + +class commentSumList_args(object): + """ + Attributes: + - cids + """ + + + def __init__(self, cids=None,): + self.cids = cids + + def read(self, iprot): + if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: + iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec]) + return + iprot.readStructBegin() + while True: + (fname, ftype, fid) = iprot.readFieldBegin() + if ftype == TType.STOP: + break + if fid == 1: + if ftype == TType.LIST: + self.cids = [] + (_etype3, _size0) = iprot.readListBegin() + for _i4 in range(_size0): + _elem5 = iprot.readI32() + self.cids.append(_elem5) + iprot.readListEnd() + else: + iprot.skip(ftype) + else: + iprot.skip(ftype) + iprot.readFieldEnd() + iprot.readStructEnd() + + def write(self, oprot): + if oprot._fast_encode is not None and self.thrift_spec is not None: + oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec])) + return + oprot.writeStructBegin('commentSumList_args') + if self.cids is not None: + oprot.writeFieldBegin('cids', TType.LIST, 1) + oprot.writeListBegin(TType.I32, len(self.cids)) + for iter6 in self.cids: + oprot.writeI32(iter6) + oprot.writeListEnd() + oprot.writeFieldEnd() + oprot.writeFieldStop() + oprot.writeStructEnd() + + def validate(self): + return + + def __repr__(self): + L = ['%s=%r' % (key, value) + for key, value in self.__dict__.items()] + return '%s(%s)' % (self.__class__.__name__, ', '.join(L)) + + def __eq__(self, other): + return isinstance(other, self.__class__) and self.__dict__ == other.__dict__ + + def __ne__(self, other): + return not (self == other) +all_structs.append(commentSumList_args) +commentSumList_args.thrift_spec = ( + None, # 0 + (1, TType.LIST, 'cids', (TType.I32, None, False), None, ), # 1 +) + + +class commentSumList_result(object): + """ + Attributes: + - success + """ + + + def __init__(self, success=None,): + self.success = success + + def read(self, iprot): + if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: + iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec]) + return + iprot.readStructBegin() + while True: + (fname, ftype, fid) = iprot.readFieldBegin() + if ftype == TType.STOP: + break + if fid == 0: + if ftype == TType.LIST: + self.success = [] + (_etype10, _size7) = iprot.readListBegin() + for _i11 in range(_size7): + _elem12 = iprot.readI32() + self.success.append(_elem12) + iprot.readListEnd() + else: + iprot.skip(ftype) + else: + iprot.skip(ftype) + iprot.readFieldEnd() + iprot.readStructEnd() + + def write(self, oprot): + if oprot._fast_encode is not None and self.thrift_spec is not None: + oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec])) + return + oprot.writeStructBegin('commentSumList_result') + if self.success is not None: + oprot.writeFieldBegin('success', TType.LIST, 0) + oprot.writeListBegin(TType.I32, len(self.success)) + for iter13 in self.success: + oprot.writeI32(iter13) + oprot.writeListEnd() + oprot.writeFieldEnd() + oprot.writeFieldStop() + oprot.writeStructEnd() + + def validate(self): + return + + def __repr__(self): + L = ['%s=%r' % (key, value) + for key, value in self.__dict__.items()] + return '%s(%s)' % (self.__class__.__name__, ', '.join(L)) + + def __eq__(self, other): + return isinstance(other, self.__class__) and self.__dict__ == other.__dict__ + + def __ne__(self, other): + return not (self == other) +all_structs.append(commentSumList_result) +commentSumList_result.thrift_spec = ( + (0, TType.LIST, 'success', (TType.I32, None, False), None, ), # 0 +) + + +class download_args(object): + """ + Attributes: + - cids + - fileName + """ + + + def __init__(self, cids=None, fileName=None,): + self.cids = cids + self.fileName = fileName + + def read(self, iprot): + if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: + iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec]) + return + iprot.readStructBegin() + while True: + (fname, ftype, fid) = iprot.readFieldBegin() + if ftype == TType.STOP: + break + if fid == 1: + if ftype == TType.LIST: + self.cids = [] + (_etype17, _size14) = iprot.readListBegin() + for _i18 in range(_size14): + _elem19 = iprot.readI32() + self.cids.append(_elem19) + iprot.readListEnd() + else: + iprot.skip(ftype) + elif fid == 2: + if ftype == TType.STRING: + self.fileName = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString() + else: + iprot.skip(ftype) + else: + iprot.skip(ftype) + iprot.readFieldEnd() + iprot.readStructEnd() + + def write(self, oprot): + if oprot._fast_encode is not None and self.thrift_spec is not None: + oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec])) + return + oprot.writeStructBegin('download_args') + if self.cids is not None: + oprot.writeFieldBegin('cids', TType.LIST, 1) + oprot.writeListBegin(TType.I32, len(self.cids)) + for iter20 in self.cids: + oprot.writeI32(iter20) + oprot.writeListEnd() + oprot.writeFieldEnd() + if self.fileName is not None: + oprot.writeFieldBegin('fileName', TType.STRING, 2) + oprot.writeString(self.fileName.encode('utf-8') if sys.version_info[0] == 2 else self.fileName) + oprot.writeFieldEnd() + oprot.writeFieldStop() + oprot.writeStructEnd() + + def validate(self): + return + + def __repr__(self): + L = ['%s=%r' % (key, value) + for key, value in self.__dict__.items()] + return '%s(%s)' % (self.__class__.__name__, ', '.join(L)) + + def __eq__(self, other): + return isinstance(other, self.__class__) and self.__dict__ == other.__dict__ + + def __ne__(self, other): + return not (self == other) +all_structs.append(download_args) +download_args.thrift_spec = ( + None, # 0 + (1, TType.LIST, 'cids', (TType.I32, None, False), None, ), # 1 + (2, TType.STRING, 'fileName', 'UTF8', None, ), # 2 +) + + +class download_result(object): + """ + Attributes: + - success + """ + + + def __init__(self, success=None,): + self.success = success + + def read(self, iprot): + if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: + iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec]) + return + iprot.readStructBegin() + while True: + (fname, ftype, fid) = iprot.readFieldBegin() + if ftype == TType.STOP: + break + if fid == 0: + if ftype == TType.STRING: + self.success = iprot.readString().decode('utf-8') if sys.version_info[0] == 2 else iprot.readString() + else: + iprot.skip(ftype) + else: + iprot.skip(ftype) + iprot.readFieldEnd() + iprot.readStructEnd() + + def write(self, oprot): + if oprot._fast_encode is not None and self.thrift_spec is not None: + oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec])) + return + oprot.writeStructBegin('download_result') + if self.success is not None: + oprot.writeFieldBegin('success', TType.STRING, 0) + oprot.writeString(self.success.encode('utf-8') if sys.version_info[0] == 2 else self.success) + oprot.writeFieldEnd() + oprot.writeFieldStop() + oprot.writeStructEnd() + + def validate(self): + return + + def __repr__(self): + L = ['%s=%r' % (key, value) + for key, value in self.__dict__.items()] + return '%s(%s)' % (self.__class__.__name__, ', '.join(L)) + + def __eq__(self, other): + return isinstance(other, self.__class__) and self.__dict__ == other.__dict__ + + def __ne__(self, other): + return not (self == other) +all_structs.append(download_result) +download_result.thrift_spec = ( + (0, TType.STRING, 'success', 'UTF8', None, ), # 0 +) +fix_spec(all_structs) +del all_structs + diff --git a/PixivSearch/thrift/QueryComment/Server.py b/PixivSearch/thrift/QueryComment/Server.py new file mode 100644 index 0000000..d3d6d14 --- /dev/null +++ b/PixivSearch/thrift/QueryComment/Server.py @@ -0,0 +1,48 @@ +import os +import sys + +from thrift.server.TNonblockingServer import TNonblockingServer +from thrift.transport import TSocket + +sys.path.append('/root/PixivSearch') +from PixivSearch.util import Util +from PixivSearch.dao.Comment import xml, downloadXml +from PixivSearch.thrift.QueryComment import QueryComment +from PixivSearch.thrift.QueryComment.QueryComment import Iface + +commentPath = '/root/PixivSearch/PixivSearch/thrift/tmpFile/comment' +#commentPath='/home/hua/下载/comment' + +class Server(Iface): + def commentSumList(self, cids): + result = [] + for cid in cids: + comment_selector = xml('https://comment.bilibili.com/{cid}.xml'.format(cid=cid)) + length = len(comment_selector.xpath('//i//d/text()')) + print('cid:{cid},弹幕数:{length}'.format(cid=cid, length=length)) + result.append(length) + return result + + def commentSum(self, cid): + return self.commentSumList([cid])[0]; + + def download(self, cids, fileName): + path = '{commentPath}/{fileName}'.format(commentPath=commentPath, fileName=fileName) + for cid in cids: + downloadXml(path, cid, + histroy=False) + zipFile = '{commentPath}/{fileName}.zip'.format(commentPath=commentPath,fileName=fileName) + print(zipFile) + Util.zip(path, zipFile) + if os.path.isfile(zipFile): + print('压缩包成功生成到{zipFile}'.format(zipFile=zipFile)) + return zipFile + else: + return None + + +if __name__ == '__main__': + socket = TSocket.TServerSocket(port=2233) + processor = QueryComment.Processor(Server()) + server = TNonblockingServer(processor, socket) + server.serve() diff --git a/PixivSearch/thrift/QueryComment/constants.py b/PixivSearch/thrift/QueryComment/constants.py new file mode 100644 index 0000000..0c217ce --- /dev/null +++ b/PixivSearch/thrift/QueryComment/constants.py @@ -0,0 +1,14 @@ +# +# Autogenerated by Thrift Compiler (0.11.0) +# +# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING +# +# options string: py +# + +from thrift.Thrift import TType, TMessageType, TFrozenDict, TException, TApplicationException +from thrift.protocol.TProtocol import TProtocolException +from thrift.TRecursive import fix_spec + +import sys +from .ttypes import * diff --git a/PixivSearch/thrift/QueryComment/ttypes.py b/PixivSearch/thrift/QueryComment/ttypes.py new file mode 100644 index 0000000..9fb0f57 --- /dev/null +++ b/PixivSearch/thrift/QueryComment/ttypes.py @@ -0,0 +1,18 @@ +# +# Autogenerated by Thrift Compiler (0.11.0) +# +# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING +# +# options string: py +# + +from thrift.Thrift import TType, TMessageType, TFrozenDict, TException, TApplicationException +from thrift.protocol.TProtocol import TProtocolException +from thrift.TRecursive import fix_spec + +import sys + +from thrift.transport import TTransport +all_structs = [] +fix_spec(all_structs) +del all_structs diff --git a/PixivSearch/thrift/task/Server.py b/PixivSearch/thrift/task/Server.py new file mode 100644 index 0000000..c804b0a --- /dev/null +++ b/PixivSearch/thrift/task/Server.py @@ -0,0 +1,22 @@ +import sys + +from thrift.server.TNonblockingServer import TNonblockingServer +from thrift.transport import TSocket + +sys.path.append('/root/PixivSearch') +from PixivSearch.thrift.task import TSDM +from PixivSearch.thrift.task.TSDM import Iface + + +class Server(Iface): + def qiandao(self): + return False + + def word(self): + return True + +if __name__ == '__main__': + socket = TSocket.TServerSocket(port=2233) + processor = TSDM.Processor(Server()) + server = TNonblockingServer(processor, socket) + server.serve() \ No newline at end of file diff --git a/PixivSearch/thrift/task/TSDM-remote b/PixivSearch/thrift/task/TSDM-remote new file mode 100644 index 0000000..c06ca34 --- /dev/null +++ b/PixivSearch/thrift/task/TSDM-remote @@ -0,0 +1,124 @@ +#!/usr/bin/env python +# +# Autogenerated by Thrift Compiler (0.11.0) +# +# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING +# +# options string: py +# + +import sys +import pprint +if sys.version_info[0] > 2: + from urllib.parse import urlparse +else: + from urlparse import urlparse +from thrift.transport import TTransport, TSocket, TSSLSocket, THttpClient +from thrift.protocol.TBinaryProtocol import TBinaryProtocol + +from core.thrift.task import TSDM +from core.thrift.task.ttypes import * + +if len(sys.argv) <= 1 or sys.argv[1] == '--help': + print('') + print('Usage: ' + sys.argv[0] + ' [-h host[:port]] [-u url] [-f[ramed]] [-s[sl]] [-novalidate] [-ca_certs certs] [-keyfile keyfile] [-certfile certfile] function [arg1 [arg2...]]') + print('') + print('Functions:') + print(' bool qiandao()') + print(' bool word()') + print('') + sys.exit(0) + +pp = pprint.PrettyPrinter(indent=2) +host = 'localhost' +port = 9090 +uri = '' +framed = False +ssl = False +validate = True +ca_certs = None +keyfile = None +certfile = None +http = False +argi = 1 + +if sys.argv[argi] == '-h': + parts = sys.argv[argi + 1].split(':') + host = parts[0] + if len(parts) > 1: + port = int(parts[1]) + argi += 2 + +if sys.argv[argi] == '-u': + url = urlparse(sys.argv[argi + 1]) + parts = url[1].split(':') + host = parts[0] + if len(parts) > 1: + port = int(parts[1]) + else: + port = 80 + uri = url[2] + if url[4]: + uri += '?%s' % url[4] + http = True + argi += 2 + +if sys.argv[argi] == '-f' or sys.argv[argi] == '-framed': + framed = True + argi += 1 + +if sys.argv[argi] == '-s' or sys.argv[argi] == '-ssl': + ssl = True + argi += 1 + +if sys.argv[argi] == '-novalidate': + validate = False + argi += 1 + +if sys.argv[argi] == '-ca_certs': + ca_certs = sys.argv[argi+1] + argi += 2 + +if sys.argv[argi] == '-keyfile': + keyfile = sys.argv[argi+1] + argi += 2 + +if sys.argv[argi] == '-certfile': + certfile = sys.argv[argi+1] + argi += 2 + +cmd = sys.argv[argi] +args = sys.argv[argi + 1:] + +if http: + transport = THttpClient.THttpClient(host, port, uri) +else: + if ssl: + socket = TSSLSocket.TSSLSocket(host, port, validate=validate, ca_certs=ca_certs, keyfile=keyfile, certfile=certfile) + else: + socket = TSocket.TSocket(host, port) + if framed: + transport = TTransport.TFramedTransport(socket) + else: + transport = TTransport.TBufferedTransport(socket) +protocol = TBinaryProtocol(transport) +client = TSDM.Client(protocol) +transport.open() + +if cmd == 'qiandao': + if len(args) != 0: + print('qiandao requires 0 args') + sys.exit(1) + pp.pprint(client.qiandao()) + +elif cmd == 'word': + if len(args) != 0: + print('word requires 0 args') + sys.exit(1) + pp.pprint(client.word()) + +else: + print('Unrecognized method %s' % cmd) + sys.exit(1) + +transport.close() diff --git a/PixivSearch/thrift/task/TSDM.py b/PixivSearch/thrift/task/TSDM.py new file mode 100644 index 0000000..7768372 --- /dev/null +++ b/PixivSearch/thrift/task/TSDM.py @@ -0,0 +1,366 @@ +# +# Autogenerated by Thrift Compiler (0.11.0) +# +# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING +# +# options string: py +# + +from thrift.Thrift import TType, TMessageType, TFrozenDict, TException, TApplicationException +from thrift.protocol.TProtocol import TProtocolException +from thrift.TRecursive import fix_spec + +import sys +import logging +from .ttypes import * +from thrift.Thrift import TProcessor +from thrift.transport import TTransport +all_structs = [] + + +class Iface(object): + def qiandao(self): + pass + + def word(self): + pass + + +class Client(Iface): + def __init__(self, iprot, oprot=None): + self._iprot = self._oprot = iprot + if oprot is not None: + self._oprot = oprot + self._seqid = 0 + + def qiandao(self): + self.send_qiandao() + return self.recv_qiandao() + + def send_qiandao(self): + self._oprot.writeMessageBegin('qiandao', TMessageType.CALL, self._seqid) + args = qiandao_args() + args.write(self._oprot) + self._oprot.writeMessageEnd() + self._oprot.trans.flush() + + def recv_qiandao(self): + iprot = self._iprot + (fname, mtype, rseqid) = iprot.readMessageBegin() + if mtype == TMessageType.EXCEPTION: + x = TApplicationException() + x.read(iprot) + iprot.readMessageEnd() + raise x + result = qiandao_result() + result.read(iprot) + iprot.readMessageEnd() + if result.success is not None: + return result.success + raise TApplicationException(TApplicationException.MISSING_RESULT, "qiandao failed: unknown result") + + def word(self): + self.send_word() + return self.recv_word() + + def send_word(self): + self._oprot.writeMessageBegin('word', TMessageType.CALL, self._seqid) + args = word_args() + args.write(self._oprot) + self._oprot.writeMessageEnd() + self._oprot.trans.flush() + + def recv_word(self): + iprot = self._iprot + (fname, mtype, rseqid) = iprot.readMessageBegin() + if mtype == TMessageType.EXCEPTION: + x = TApplicationException() + x.read(iprot) + iprot.readMessageEnd() + raise x + result = word_result() + result.read(iprot) + iprot.readMessageEnd() + if result.success is not None: + return result.success + raise TApplicationException(TApplicationException.MISSING_RESULT, "word failed: unknown result") + + +class Processor(Iface, TProcessor): + def __init__(self, handler): + self._handler = handler + self._processMap = {} + self._processMap["qiandao"] = Processor.process_qiandao + self._processMap["word"] = Processor.process_word + + def process(self, iprot, oprot): + (name, type, seqid) = iprot.readMessageBegin() + if name not in self._processMap: + iprot.skip(TType.STRUCT) + iprot.readMessageEnd() + x = TApplicationException(TApplicationException.UNKNOWN_METHOD, 'Unknown function %s' % (name)) + oprot.writeMessageBegin(name, TMessageType.EXCEPTION, seqid) + x.write(oprot) + oprot.writeMessageEnd() + oprot.trans.flush() + return + else: + self._processMap[name](self, seqid, iprot, oprot) + return True + + def process_qiandao(self, seqid, iprot, oprot): + args = qiandao_args() + args.read(iprot) + iprot.readMessageEnd() + result = qiandao_result() + try: + result.success = self._handler.qiandao() + msg_type = TMessageType.REPLY + except TTransport.TTransportException: + raise + except TApplicationException as ex: + logging.exception('TApplication exception in handler') + msg_type = TMessageType.EXCEPTION + result = ex + except Exception: + logging.exception('Unexpected exception in handler') + msg_type = TMessageType.EXCEPTION + result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error') + oprot.writeMessageBegin("qiandao", msg_type, seqid) + result.write(oprot) + oprot.writeMessageEnd() + oprot.trans.flush() + + def process_word(self, seqid, iprot, oprot): + args = word_args() + args.read(iprot) + iprot.readMessageEnd() + result = word_result() + try: + result.success = self._handler.word() + msg_type = TMessageType.REPLY + except TTransport.TTransportException: + raise + except TApplicationException as ex: + logging.exception('TApplication exception in handler') + msg_type = TMessageType.EXCEPTION + result = ex + except Exception: + logging.exception('Unexpected exception in handler') + msg_type = TMessageType.EXCEPTION + result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error') + oprot.writeMessageBegin("word", msg_type, seqid) + result.write(oprot) + oprot.writeMessageEnd() + oprot.trans.flush() + +# HELPER FUNCTIONS AND STRUCTURES + + +class qiandao_args(object): + + + def read(self, iprot): + if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: + iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec]) + return + iprot.readStructBegin() + while True: + (fname, ftype, fid) = iprot.readFieldBegin() + if ftype == TType.STOP: + break + else: + iprot.skip(ftype) + iprot.readFieldEnd() + iprot.readStructEnd() + + def write(self, oprot): + if oprot._fast_encode is not None and self.thrift_spec is not None: + oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec])) + return + oprot.writeStructBegin('qiandao_args') + oprot.writeFieldStop() + oprot.writeStructEnd() + + def validate(self): + return + + def __repr__(self): + L = ['%s=%r' % (key, value) + for key, value in self.__dict__.items()] + return '%s(%s)' % (self.__class__.__name__, ', '.join(L)) + + def __eq__(self, other): + return isinstance(other, self.__class__) and self.__dict__ == other.__dict__ + + def __ne__(self, other): + return not (self == other) +all_structs.append(qiandao_args) +qiandao_args.thrift_spec = ( +) + + +class qiandao_result(object): + """ + Attributes: + - success + """ + + + def __init__(self, success=None,): + self.success = success + + def read(self, iprot): + if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: + iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec]) + return + iprot.readStructBegin() + while True: + (fname, ftype, fid) = iprot.readFieldBegin() + if ftype == TType.STOP: + break + if fid == 0: + if ftype == TType.BOOL: + self.success = iprot.readBool() + else: + iprot.skip(ftype) + else: + iprot.skip(ftype) + iprot.readFieldEnd() + iprot.readStructEnd() + + def write(self, oprot): + if oprot._fast_encode is not None and self.thrift_spec is not None: + oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec])) + return + oprot.writeStructBegin('qiandao_result') + if self.success is not None: + oprot.writeFieldBegin('success', TType.BOOL, 0) + oprot.writeBool(self.success) + oprot.writeFieldEnd() + oprot.writeFieldStop() + oprot.writeStructEnd() + + def validate(self): + return + + def __repr__(self): + L = ['%s=%r' % (key, value) + for key, value in self.__dict__.items()] + return '%s(%s)' % (self.__class__.__name__, ', '.join(L)) + + def __eq__(self, other): + return isinstance(other, self.__class__) and self.__dict__ == other.__dict__ + + def __ne__(self, other): + return not (self == other) +all_structs.append(qiandao_result) +qiandao_result.thrift_spec = ( + (0, TType.BOOL, 'success', None, None, ), # 0 +) + + +class word_args(object): + + + def read(self, iprot): + if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: + iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec]) + return + iprot.readStructBegin() + while True: + (fname, ftype, fid) = iprot.readFieldBegin() + if ftype == TType.STOP: + break + else: + iprot.skip(ftype) + iprot.readFieldEnd() + iprot.readStructEnd() + + def write(self, oprot): + if oprot._fast_encode is not None and self.thrift_spec is not None: + oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec])) + return + oprot.writeStructBegin('word_args') + oprot.writeFieldStop() + oprot.writeStructEnd() + + def validate(self): + return + + def __repr__(self): + L = ['%s=%r' % (key, value) + for key, value in self.__dict__.items()] + return '%s(%s)' % (self.__class__.__name__, ', '.join(L)) + + def __eq__(self, other): + return isinstance(other, self.__class__) and self.__dict__ == other.__dict__ + + def __ne__(self, other): + return not (self == other) +all_structs.append(word_args) +word_args.thrift_spec = ( +) + + +class word_result(object): + """ + Attributes: + - success + """ + + + def __init__(self, success=None,): + self.success = success + + def read(self, iprot): + if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None: + iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec]) + return + iprot.readStructBegin() + while True: + (fname, ftype, fid) = iprot.readFieldBegin() + if ftype == TType.STOP: + break + if fid == 0: + if ftype == TType.BOOL: + self.success = iprot.readBool() + else: + iprot.skip(ftype) + else: + iprot.skip(ftype) + iprot.readFieldEnd() + iprot.readStructEnd() + + def write(self, oprot): + if oprot._fast_encode is not None and self.thrift_spec is not None: + oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec])) + return + oprot.writeStructBegin('word_result') + if self.success is not None: + oprot.writeFieldBegin('success', TType.BOOL, 0) + oprot.writeBool(self.success) + oprot.writeFieldEnd() + oprot.writeFieldStop() + oprot.writeStructEnd() + + def validate(self): + return + + def __repr__(self): + L = ['%s=%r' % (key, value) + for key, value in self.__dict__.items()] + return '%s(%s)' % (self.__class__.__name__, ', '.join(L)) + + def __eq__(self, other): + return isinstance(other, self.__class__) and self.__dict__ == other.__dict__ + + def __ne__(self, other): + return not (self == other) +all_structs.append(word_result) +word_result.thrift_spec = ( + (0, TType.BOOL, 'success', None, None, ), # 0 +) +fix_spec(all_structs) +del all_structs + diff --git a/PixivSearch/thrift/task/constants.py b/PixivSearch/thrift/task/constants.py new file mode 100644 index 0000000..0c217ce --- /dev/null +++ b/PixivSearch/thrift/task/constants.py @@ -0,0 +1,14 @@ +# +# Autogenerated by Thrift Compiler (0.11.0) +# +# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING +# +# options string: py +# + +from thrift.Thrift import TType, TMessageType, TFrozenDict, TException, TApplicationException +from thrift.protocol.TProtocol import TProtocolException +from thrift.TRecursive import fix_spec + +import sys +from .ttypes import * diff --git a/PixivSearch/thrift/task/ttypes.py b/PixivSearch/thrift/task/ttypes.py new file mode 100644 index 0000000..9fb0f57 --- /dev/null +++ b/PixivSearch/thrift/task/ttypes.py @@ -0,0 +1,18 @@ +# +# Autogenerated by Thrift Compiler (0.11.0) +# +# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING +# +# options string: py +# + +from thrift.Thrift import TType, TMessageType, TFrozenDict, TException, TApplicationException +from thrift.protocol.TProtocol import TProtocolException +from thrift.TRecursive import fix_spec + +import sys + +from thrift.transport import TTransport +all_structs = [] +fix_spec(all_structs) +del all_structs diff --git a/PixivSearch/urls.py b/PixivSearch/urls.py new file mode 100644 index 0000000..097ce68 --- /dev/null +++ b/PixivSearch/urls.py @@ -0,0 +1,27 @@ +"""PixivSearch URL Configuration + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/1.11/topics/http/urls/ +Examples: +Function views + 1. Add an import: from my_app import views + 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') +Class-based views + 1. Add an import: from other_app.views import Home + 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') +Including another URLconf + 1. Import the include() function: from django.conf.urls import url, include + 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) +""" +from django.conf.urls import url +from PixivSearch.view import search, index, download, saveConfig, get, start, stop + +urlpatterns = [ + url(r'^$', index), + url(r'^pixiv/search', search), + url(r'^pixiv/download', download), + url(r'^tsdm', saveConfig), + url(r'^bangumi/get', get), + url(r'^bangumi/start', start), + url(r'^bangumi/stop', stop) +] diff --git a/PixivSearch/util/Util.py b/PixivSearch/util/Util.py new file mode 100644 index 0000000..d69b89a --- /dev/null +++ b/PixivSearch/util/Util.py @@ -0,0 +1,10 @@ +import os +import zipfile + + +def zip(inputFile, outFile): + f = zipfile.ZipFile(outFile, 'w', zipfile.ZIP_DEFLATED) + for dirpath, dirnames, filenames in os.walk(inputFile): + for filename in filenames: + f.write(os.path.join(dirpath, filename), filename) + f.close() \ No newline at end of file diff --git a/PixivSearch/view.py b/PixivSearch/view.py new file mode 100644 index 0000000..841ce8d --- /dev/null +++ b/PixivSearch/view.py @@ -0,0 +1,101 @@ +# coding=utf-8 +import _thread +import os + +import django +from django.http import Http404, StreamingHttpResponse, HttpResponse +from django.shortcuts import render + +import root +from PixivSearch.dao.bangumi import get_, stop_, getIds +from PixivSearch.pixiv.pixiv import get_nodes +from PixivSearch.settings import logger + +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "PixivSearch.settings") +django.setup() # 添加的代码 + +from PixivSearch.model import config + + +def search(request): + word = 'R-18' + pageSize = 10 + order = 10 + type = 'text' + + if request.POST.get('word') != '' and request.POST.get('word') is not None: + word = request.POST.get('word') + if request.POST.get('pageSize') != '' and request.POST.get('pageSize') is not None: + pageSize = int(request.POST.get('pageSize')) + if request.POST.get('order') != '' and request.POST.get('order') is not None: + order = int(request.POST.get('order')) + if request.POST.get('type') != '' and request.POST.get('type') is not None: + type = request.POST.get('type') + + try: + logger.info("word:%s,pageSize:%d,order:%d,type:%s", word, pageSize, order, type) + array = get_nodes([0, word, pageSize, order, type]) + if len(array[0]) > 0: + if request.POST.get('type') == 'img': + nodes = {'imageNodes': array[0], 'msg': array[1], 'download': word + '.zip', 'size': array[2], + 'word': word, 'pageSize': pageSize, 'order': order, 'type': type, + 'imgPath': root.getConfigValue('imgPath'), + 'baseZipPath': root.getConfigValue('baseZipPath')} + else: + nodes = {'imageNodes': array[0], 'msg': array[1], 'word': word, 'pageSize': pageSize, 'order': order, + 'type': type} + else: + nodes = {'tip': '没有返回结果'} + return render(request, 'index.html', nodes) + except ValueError: + raise Http404() + + +def index(request): + return render(request, 'index.html', {'tip': '输入参数进行搜索'}) + + +def download(request): + # do something... + def file_iterator(file_name, chunk_size=512): + with open(file_name) as f: + while True: + c = f.read(chunk_size) + if c: + yield c + else: + break + + fileName = os.path.join(os.path.dirname(__file__), 'static/download/').replace('\\', '/') + request.GET.get( + 'fileName').encode('utf-8') + response = StreamingHttpResponse(file_iterator(fileName)) + response['Content-Type'] = 'application/octet-stream' + response['Content-Disposition'] = 'attachment;filename="{0}"'.format(request.GET.get('fileName').encode('utf-8')) + return response + + +def saveConfig(request): + if 'GET' == request.method and request.GET.get('param_name'): + p = config.param.objects.get(param_name=request.GET.get('param_name')) + return render(request, 'addConfig.html', p.__dict__) + elif 'POST' == request.method and request.POST.get('param_name') and request.POST.get('param_value'): + p = config.param(param_name=request.POST.get('param_name'), param_value=request.POST.get('param_value')) + p.save() + return render(request, 'addConfig.html', p.__dict__) + else: + return render(request, 'addConfig.html') + + +def get(request): + return HttpResponse(str(get_().__str__())) + + +# 测试方法 +def start(request): + _thread.start_new_thread(getIds, ()) + return HttpResponse("start success") + + +def stop(request): + stop_() + return HttpResponse("stop success") diff --git a/PixivSearch/wsgi.py b/PixivSearch/wsgi.py new file mode 100644 index 0000000..5179913 --- /dev/null +++ b/PixivSearch/wsgi.py @@ -0,0 +1,16 @@ +""" +WSGI config for PixivSearch project. + +It exposes the WSGI callable as a model-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/1.11/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "PixivSearch.settings") + +application = get_wsgi_application() diff --git a/README.md b/README.md new file mode 100644 index 0000000..e97e17e --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# PixivSearch diff --git a/init/get-pip.py b/init/get-pip.py new file mode 100644 index 0000000..f7e025b --- /dev/null +++ b/init/get-pip.py @@ -0,0 +1,20890 @@ +#!/usr/bin/env python +# +# Hi There! +# You may be wondering what this giant blob of binary data here is, you might +# even be worried that we're up to something nefarious (good for you for being +# paranoid!). This is a base85 encoding of a zip file, this zip file contains +# an entire copy of pip (version 18.1). +# +# Pip is a thing that installs packages, pip itself is a package that someone +# might want to install, especially if they're looking to run this get-pip.py +# script. Pip has a lot of code to deal with the security of installing +# packages, various edge cases on various platforms, and other such sort of +# "tribal knowledge" that has been encoded in its code base. Because of this +# we basically include an entire copy of pip inside this blob. We do this +# because the alternatives are attempt to implement a "minipip" that probably +# doesn't do things correctly and has weird edge cases, or compress pip itself +# down into a single file. +# +# If you're wondering how this is created, it is using an invoke task located +# in tasks/generate.py called "installer". It can be invoked by using +# ``invoke generate.installer``. + +import os.path +import pkgutil +import shutil +import sys +import struct +import tempfile + +# Useful for very coarse version differentiation. +PY2 = sys.version_info[0] == 2 +PY3 = sys.version_info[0] == 3 + +if PY3: + iterbytes = iter +else: + def iterbytes(buf): + return (ord(byte) for byte in buf) + +try: + from base64 import b85decode +except ImportError: + _b85alphabet = (b"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" + b"abcdefghijklmnopqrstuvwxyz!#$%&()*+-;<=>?@^_`{|}~") + + def b85decode(b): + _b85dec = [None] * 256 + for i, c in enumerate(iterbytes(_b85alphabet)): + _b85dec[c] = i + + padding = (-len(b)) % 5 + b = b + b'~' * padding + out = [] + packI = struct.Struct('!I').pack + for i in range(0, len(b), 5): + chunk = b[i:i + 5] + acc = 0 + try: + for c in iterbytes(chunk): + acc = acc * 85 + _b85dec[c] + except TypeError: + for j, c in enumerate(iterbytes(chunk)): + if _b85dec[c] is None: + raise ValueError( + 'bad base85 character at position %d' % (i + j) + ) + raise + try: + out.append(packI(acc)) + except struct.error: + raise ValueError('base85 overflow in hunk starting at byte %d' + % i) + + result = b''.join(out) + if padding: + result = result[:-padding] + return result + + +def bootstrap(tmpdir=None): + # Import pip so we can use it to install pip and maybe setuptools too + import pip._internal + from pip._internal.commands.install import InstallCommand + from pip._internal.req.constructors import install_req_from_line + + # Wrapper to provide default certificate with the lowest priority + class CertInstallCommand(InstallCommand): + def parse_args(self, args): + # If cert isn't specified in config or environment, we provide our + # own certificate through defaults. + # This allows user to specify custom cert anywhere one likes: + # config, environment variable or argv. + if not self.parser.get_default_values().cert: + self.parser.defaults["cert"] = cert_path # calculated below + return super(CertInstallCommand, self).parse_args(args) + + pip._internal.commands_dict["install"] = CertInstallCommand + + implicit_pip = True + implicit_setuptools = True + implicit_wheel = True + + # Check if the user has requested us not to install setuptools + if "--no-setuptools" in sys.argv or os.environ.get("PIP_NO_SETUPTOOLS"): + args = [x for x in sys.argv[1:] if x != "--no-setuptools"] + implicit_setuptools = False + else: + args = sys.argv[1:] + + # Check if the user has requested us not to install wheel + if "--no-wheel" in args or os.environ.get("PIP_NO_WHEEL"): + args = [x for x in args if x != "--no-wheel"] + implicit_wheel = False + + # We only want to implicitly install setuptools and wheel if they don't + # already exist on the target platform. + if implicit_setuptools: + try: + import setuptools # noqa + implicit_setuptools = False + except ImportError: + pass + if implicit_wheel: + try: + import wheel # noqa + implicit_wheel = False + except ImportError: + pass + + # We want to support people passing things like 'pip<8' to get-pip.py which + # will let them install a specific version. However because of the dreaded + # DoubleRequirement error if any of the args look like they might be a + # specific for one of our packages, then we'll turn off the implicit + # install of them. + for arg in args: + try: + req = install_req_from_line(arg) + except Exception: + continue + + if implicit_pip and req.name == "pip": + implicit_pip = False + elif implicit_setuptools and req.name == "setuptools": + implicit_setuptools = False + elif implicit_wheel and req.name == "wheel": + implicit_wheel = False + + # Add any implicit installations to the end of our args + if implicit_pip: + args += ["pip"] + if implicit_setuptools: + args += ["setuptools"] + if implicit_wheel: + args += ["wheel"] + + # Add our default arguments + args = ["install", "--upgrade", "--force-reinstall"] + args + + delete_tmpdir = False + try: + # Create a temporary directory to act as a working directory if we were + # not given one. + if tmpdir is None: + tmpdir = tempfile.mkdtemp() + delete_tmpdir = True + + # We need to extract the SSL certificates from requests so that they + # can be passed to --cert + cert_path = os.path.join(tmpdir, "cacert.pem") + with open(cert_path, "wb") as cert: + cert.write(pkgutil.get_data("pip._vendor.certifi", "cacert.pem")) + + # Execute the included pip and use it to install the latest pip and + # setuptools from PyPI + sys.exit(pip._internal.main(args)) + finally: + # Remove our temporary directory + if delete_tmpdir and tmpdir: + shutil.rmtree(tmpdir, ignore_errors=True) + + +def main(): + tmpdir = None + try: + # Create a temporary working directory + tmpdir = tempfile.mkdtemp() + + # Unpack the zipfile into the temporary directory + pip_zip = os.path.join(tmpdir, "pip.zip") + with open(pip_zip, "wb") as fp: + fp.write(b85decode(DATA.replace(b"\n", b""))) + + # Add the zipfile to sys.path so that we can import it + sys.path.insert(0, pip_zip) + + # Run the bootstrap + bootstrap(tmpdir=tmpdir) + finally: + # Clean up our temporary working directory + if tmpdir: + shutil.rmtree(tmpdir, ignore_errors=True) + + +DATA = b""" +P)h>@6aWAK2mtz7MNKHyDoGar000#L000jF003}la4%n9X>MtBUtcb8d5e!POD!tS%+HIDSFlx3GPKY +$RN?{vP)h>@6aWAK2mn@%6-{RUPvb`c003_S000jF003}la4%n9ZDDC{Utcb8d0kO4Zo@DP-1Q0q8SE +6P(>Xwfj$MoHf@(`KQCU(&8g71HO0ki&o<#cYNZz>|C(zo>JZGyl;FMx!FrO6t%vRrOrPh9=?L}8oY6 +ou)77Hd@$a4r7F5rryfn~JTAHWO)@Mv!(a4fto86JiEF(QHSJ}y)-GntEpbmcJyNSL0Vx@Gi7c>xAuL +EgIxovfWq|0NvR`+SC`IVq5DSMEVyuc5y>N3AD=LF+DESFFQK3yL&bIL-tGT-b6~%(tWCE +QA8qFLP)h +>@6aWAK2moz9Cry9Ls@xU@001=$000>P003}la4%nJZggdGZeeUMUtei%X>?y-E^v93R&8(FHW2=X;*U%xw2l%3W6Py<0o>h8I>=Z-x4>3Qeu^QF|!Q +E#E$`?b;8%9;(7<*M_Y#j*ssX^r(Dmd>coV;T2Z)}Jd=35ADU(@5Q2r#EE2I)jML=NjONY)o=yYXtEu$-H-Gm-+BOZ^V00~A@_@kKt#R;YX;F~+>#O^V-@pfx`4TJ9IRvvJI8Va8$ENdb=f@y)O)kTy&U +t8+keW`k*)triwXqw@TIWQ=kz7M_vb;F0?i!j7(S-7Gp6Bo5KH^^zo&aORv1X*lG^JbqW95$me^UWr1EIfHXq4`LdDSpD&es)c0d0{c?@ty3Hc(J&hK$ZiPWF4^1J3J>a+v&hWqhTYeyG5WE3o5CpwFvEw@~~LkFz386U{r5e*A&IOo5 +glkyvV%WUuHnR)b&nfu^@0APOhvqHj1>uxeS%VxIKecYh*q$>yoiqF)e27)LV8cBCmLs6hwJXk{g)MV +N?sdlX?`KCX>b8{nah0m;YWpEUxcv%iDk6{&n>Lzr*x#Hl0rCZxxO5Z}2(&zDupXy@%jJeSNC$fYAq> +A4NQYyG2-xpPC9e81#l*q~HH66p>@4)ZUc6Q~5YM>IM3OmS$8@DOrflo62ljh1?FqU_YGV_cS*&PRdq +TM^x(7!mcF64JG-cUi>t4UD}tmto$j3ZyWVqwjoKUq&qLwAV@RH(s*R$Q?fK5l4QeOu|Z3DltR&1>Xy +_W+*K30fW8W0hj#vfiE^!DWgg-Mk;Y2K*CC~Bp6L4Om@^0L%oL-*^L$Hp63$H8_QC^E1&|0BcdG# +r`CYFq(VH5ayV^IMv)Jrk*&_=ww@PY?VHr}NNjwA_A}U4G0`qZ+-E4cVc~$Q~DCxb}H8&>VNj!)I+x* +Q_BXC(`{$he+)_-6v(QTShtNb#UW|uIcPa$5xvj5uBJ#_I$6S0&F-zJo`DvWf@HaK3A^%&@I2dyxcgBA +1b!mE^Xp15#g_bXCq#b^nsot7HA6I#QaPzAC^X6s(=jTt7)PFrB>VR|x0|=3iULGwaoN7(?O=X2!Gpq +W~d{cE)S9&}NCBM>Da&U+1T+josYx2=GlbN}X!QL}^Dy>no9nYr`jku1{$G)^w>L+vNLt?|nT+;iM`l +6oaql=5Q8F2;^PsS0725e__!U?l4A4IbM08mQ<1QY-O00;o(NhVF71Wwxx1^@uP5&!@i0001RX>c!JX +>N37a&BR4FJg6RY-C?$Zgwtkd97F5j@vd6efL)o?gJ%M5|YW}M +LH@ln)Qytt&9dP+GU{tMhFdf4O_`4PwXipLQ9kjunyh6xQb +7r76pHXmlwP1Lm!(M5~EZQiO1>0vb+qvh~)#!Kd0>LUKq_Mc~#^r_fWu=rMMGe(=;$pZd*xo +(QA_S)>w@V5uo*p)zSgSD0LZLU`%qSau7BWe@6RPpzW!bPeC!2t-;n>PLYVx*Bi(K7Zf+y0bIPH;>sk +gUC8(WfB)k44UgE3k`SKba-n>Q_s`om?{2<>AQdJd2CRjP2siIOeZ2ng@$Kz(kJAISUQ11WkKvCHTw2 +b=mIa7KA;VV9TF9U@z<8yMIHr|`tvK=-44Td$NS}bg7(Zf%Oq3TwjXzfyZkI{Ed7 +Cl07L_Fhe0}bCyUy2xzT1iGu0}EkJKi-OTq9h`&c9}Zs0OUPthJ> +FQ8j>==ixy9h9fHP4)0-4sexMVym?BpMssK_w9aJo}lDm2XJWNv05M*NgnmT6#8SxRq%-+iq9xzzwoe +>W892Z1e-)EK+%fzo!E#{$oV%fZ;obz-VgxX*36h2wyrnH9CfKH-#|$A;CX`668ynhz$~;zSa7QzMGe +1_Hzi!^;6X*>RFpIKCB*YetJn1eKi*qvtWdhu0=^OE&nv>yl@DPa6asjhq{?Jx;SY2YNw~=^eS`ZX^% +;Q36NEYnyFKOh_K@F@iacvUF>u(qkNpoy4e*+chZor1{6OR58VSL*C9Ekv9pnG!K};annuXQswS2;(? +7?e={f3h;+T(VgnQh_zezF1|j=t7@l8Wzx?#;*x9 +1sY>Ru-muiyQ?-*m>Q^+}n;|B;*wLXzbYG8Q(}>+GgJ;py12>pq*fEqA7_Z+EV0CTKhcTh +>25f!KZ()Twx{7 +~h4!VlQGMtQ?wXuSevwT28u>9Pkm5eP^ZCAf!7%Nf7y=w2nLHkC%t7eDo>B4aAet``$RuwDo@EW`R?7t0WM4?W1|0|6X{Ig`4o>xZ}(N{$e_5^T4|hi{sB-+0|XQR000O8m +=Y&V01c=~j|cz&tr`FT761SMaA|NaUukZ1WpZv|Y%gPBV`ybAaCx;@O^@3+621FZ5YC~cg`>;{*&G_^ +!_G`+H$Wx>Bw6IpXb7}K+f2)(mXzA@1oPkLRZ$<5Y-f|*SsxlLs#vTqzIvtQa`}@ic1rvrjohleGR

xw*8~^i^ay-y{L7a<&Vmg)@8LU9wbR+ZKEqMI@v-RYjhzi{hP +{-+^cx2HjQ#dR#|Bern0i^ch$1l<&Di-SDh2z+fr3NtF(FOcf7&>=S10}A#GTAH%;%3a>ksC +}K6+Vy)r;Q43mRMA*>Jh$zzQ>yBvUzhz61)C{lhf;kzz>5% +z7`*_-&u=HZ$yLt`BgUG0Ihr3eLQNd2y_KIKr6y9|g^c6&rB85-16A0SxalV*e3bd{Z2lA{(|yxRaGK{T> +CiQI8t~ZSS4Mg&#R(!x;YX8;|@0jW=J-v``gQvSR=lyUlI&Cv(i9e{7DBToERQOHb_OlR)q>E^#IABSdW;^w{ +)LZ47B)w4e1}{59$Nu9jN&+uy2R{r~EMdLGn&BQ}>quJ#p=z@KK=xAMhJtskq2SR@->xT;&_{qczk#L{C?GWfA{?Q#rW{z`sMiW^7{UM^wz1Sbtb4fK^{|T^jQ^S&PoJk6xdIMK#mwM#8piT~#?8wkYJSw!Xa_l*TGK|cV +<~T6{u;0Ai*A+E0~z4DeOQQK0VJgSUv1|=azqC +lnD{cRMvi<>vC%uo#iVUOju>Hr5Uo_n0h?D&i3rlkp#G-tOQf +9K)4SMluBO=)@7tn@FU{=h&@L&X-_HEUX+|kYhy{oK!ppM**eK@GuX#nYH>&I>)LQ)m;Wo)9mk7LJSO +Y_ip47{|i;GAApN`S$5An~BfwEH!dkUJY}8i^^=Blk#5qawA;p}G@0c{ko+>H?S-{@tof+-BQMWY0SA +h*@%Je^Z9}eqWY!WFSbH;Rhl*A-+t+1?0AX%B64C+)qVMb@@>t=MW4|XI>!^~X|8ceneAD7g5eCv4;tKM +^QcZEv1>81{bw9`3h?2IFNP5BL`!=Mdw;$LFc{vC~BWMIVdqOKm|0`1*+VkW*0wC$_P`F_niKK()}Z^ +HMTWIQIFNOryd+^3;am2?HPY1QOKM|Svt3`j_ynpByjr`w;1AGtOeK!!;GeDR18&ODQ@*gaEC@omSB@ +#!bCWMTq9w^W~VT-YRCMNv+pdg)9bRh{KcQ(){CL!!yu0}=$>SZ`w*sV;4JzLuLa9K5EgbDX-Ej2b?aoIHf@D|Rw_ +K8fB^KX2&g&e-Sy_6vo`LSV4LWGQir1LziMo3OWh$Lp=bNz?P8;yZ~jas^k;CO{tIZ#fu@NIce)=`Pw +3!fb7y)uo`atG?VRuZULH2Vi^$}Q%zAP_uAekr3VK&x0G +ybcZJFkO=Z@llZ<>QsVSQ3%UA5cpJ1QY-O00;m}qC`y<&3B1a4*&qWGXMY{0001RX>c!JX>N37a&BR4 +FJo_RW@%@2a$$67Z*DGddCgjTkJ~m9|KFd2ryy7v=T(|sakv`T!=>paU1YOaWRtXo&rrD*ZL^Uj9VxH +Z7v#I&%#f5wNp_MxfHQ)uEs?|FJbv>aqbPb>7E8I>DqhR7U>jcWmDq@)W?IzSYBahjH-gndZDdjAw$xT(Nn&st!=c4_!S^-J-v(%#z&R~_SlJrg#S*e(Pr{#U`T>=l2O?fA@8)Z1ExY9!Tv}6IIE_j}Z +`-P~G-DXM*du1$8*SS)qnuO1uf&8DA+dR7}>+i&6$up5nM&qG1aE}8^j?u%+yx|tdD_-8*U3ieg=0z-daFd5N!Y0V1WJxAR{9eEo +C!^oR4OFVfdM;$&&y!+5Vc*L|Jz*EX0KY|nTuKeUuf +*=nzJi~xNO?S;us7Q(7c_S~qCcnK)X&ZWYe>4Ufrpzlu(RexM)P0DB7;eGsW`&l(S+$*!2)QhM +AMpVvJ&+rJ&V&6ohMCU)aU`bdiCaf%3kvQtzcVi{G=qN?-{Ra@S$xDPfHMh+VEWdSD@n{1@P`nELqyT +Ai6Pmrjg|X6r`Af*8)%M^q{kU%pVnei1V00=2OVO-cGF@)fLa-QYMyj$PJOUR(yBRw +|^q0t-(H}799qe+PC{g8nA>xztWWr8PPs|KZJ&n>eSG7ijiBC@9<+M?&M{D-=bdK97i+s;2C6*x4yad +Yt32B<303B6fKx|~>kx30GCpKUXDTwN*K+sxd@MGR3mgp*%bsQz2(Z@zpZ$LBeLB}MS0LnCK4KR)?k& +MicGx8DR$Zv1XU!O&wTm{7J=K*_*Ms-t(gbobGXVEGzZ+ULUg3;|kGaL4!%#8KEJHL8&7 +NHya)ZQ7-XXl=#0^&3)n1s{F+paIJ)2FYlo?SdopIuy@yW#1(C$DJ=pfquAhx<#sL-+?l>k-Omk%Qnv +7>vu?Um;{z`GdLq0PX|h{Rr0;XJY*GT9tROY0WssHE{4HSQB~zUo5~r5g>q;A%s7|=wjm^QF^nMni=L +`(47Fo18ZujKe@gD4f2}R;1rrgF34eoLSu-)arPEG;F+d%bzLe!nl~Y~7g}Wvk66?aA&kZe2Age2b*n +`_vpfec(rgLN#({GYh=2krM0#BMwuF`NizA1uxh34vXqf0eU~zZAoy1X0aJ@%q8b#nz8)k_PNRsGT+A +QNWH~R--$gBoiji^elio=>gd +Rqa;1eONK3rmcXWrwRJz#JF{0{LlSDKbz31^M($9S4*QPYZO?QcDoaT6fObO +``JPqj3Ti;CwfH9S`@0kUGJ3XH6|1cA_Z`TZu8+|l%V2x-KR%1CoD>SEoBjJcohR6L+tMIJDZ+9o{z` +9`QelH7fLyCdIUi>UmMM#;=kjW_pPHcuG;hL#?n;H +V3@?b|pI`^%?=-+$~zalU;q&#-bvT_9hS)`a|QIy7o0j`xs9|wJ`MP5b0CchI4j-h{tpQ&2~se&D@WzZZN+hy_nQ$Mrjm=%t<$an$PDQwrnYKk +gE?L{{XJ&EAa#QV2_1OnL!8?nJ1#zyruKWEwxC7c1tKWgjIcn0u;ogUw6S2Bj^CW61IA2mQSa%C2}A? +sgK7#Kp`vzJ{kg&N5fkVKtXATn7CU=SBZF9m#N4g6FR!{#(|qu%Ci2NGAiS(NX|sYwOp-*t|27J5(?L +STee!64DKG2I#qW81>z6x7-c_U{|>eqT?v3C2ypb%q%gA9<{(8>^WKk|0Qfb)DPm)3Qj;pcdcLwbAl=njHhg5ecl +t))3BqWP9ZVjTe7nE_Yo+xx*6ce+z0}>$}4`RzpGQCDLLy6n4V2l84F~8<_qRj;SjA@CnYr-m58Xq(N +kqM{IAjbzb}-Mf-r&)|IM8P +t?8j-dn-dr=XCZXW$@V}5u0!X~*l_he1)g2}iUWmsHnlAVtm>G9buH;F68Q5B3DkgYVUy)!;`k%I?f= +h&UkhwJl5ml6D`(qz^oKSXi!L{!UL!!Cv1d?YiLQBnk!d3bCOSY?iR}un)5LaAs48MG!~PCzyElK3Ez +5zKni^uEM|9)>T=xkLF-xL#ESXLttu<*1-3>>p+EEnWRQ0|`#12d$BBA>6Piz@>0oMqtU;Ff;hx>q&p +e4!sq!9Ow^V1T2DmI$j)MZ8C8;2ev+a?7ak>P8w#=a%GPpF3;bPb5+b1){@3)o+O?a!}n@e@6R@+F7V +$aIUDz@cm=v$MzZgk9%?Yt%XQe8C_&yWOsms7K1%PbTtDBdiyH0j0hyg}>p}XBS(gC|x?;fRNRm=^Aq +D-xp%BlNw-D1CZUSC6v7BEhn;AmT~l>k|v2O*+UKW<#NF59_)bk_L$yPea{00ng)^LJ7mZPK%Y%^>dgxRtvpmkr?uwn=-fYD%kXoS|_qf%LEuTXierh4&9aNJ)M!EC?D#k6h@w+Nry=*{(n^pgsv>&* +_OAcXFiTXVdRc| +k#>DZ?G1o__!xTECmIXA0^tsiu&N9=j004$bmpG@+j7E8@+`Aood0PpgF*TGOM^sEsdg_IqdIMapl{& +6nl-(y`RuFdV@OiZ*bFcs6L-Zn&*y`9WK6r~`O(dLSAWt?O#koocw-(79CDBtQNK#SR +(xnhFfJGZjw;tk>E}`S0j&TUZ3ptBPJT~YK +?dShwF4p1$n}K~#BkGbZF6#sr?FXYPS9^{fFa=(guyKCWKiQSFc4p+O6zbp01&3V>B_cFXYxQ?dFG)W +DqsSU1tJaPvyJ!RN)`dlzyO=Xhe&_sIPuk-MV$CC0*gk6`PDqUG-u(#Ul1 +h_%#$74nXRz>UsvDlg9c#spEwkPha#3dDdx8HCwC@b7H$t#=T~~Vg=+O$2uI+8IC^wI)eZ?PDvU()7- +U|Kbn{WUAx6i3|hHm)`BP4LI%i=6TAmbA6`q-ns4jTQKI`MhdH69GqVPJ2xeuWrAu3?Ypr@F+ +1jG0_o(w)Fah@5}8Yr{|#2i>Qi5W9~@q6X{k8gjwylL?>`hWaMmmfa)_+yeZ|C-EQb2Gx5IouWu4i+1 +X8$iP@;6+ndaq8*>YHe8-?0HTr4nGw2aT7tWgPw;P(gzPBK2cy?xka@N0v){Y$`2}rS|;hrMbd&fU68 +P)A;MRCztEhw-U0$_M0-&KYljUOin%6Xu1q=`8My3pI+&k=nS0tDu6;a~sTOh1F+?`qVGNQafY4j8Cw +SHb(!a7OiQxaiyIsM&c1^FF+;xI>kY@!wYx&~yCp_#MJb&VBB?@eK!N$!kQ^-L)@qrX@Me`0}Ox{ys? ++X)!=FUe@W)M6qh2f;!+>JU`h_y=)xu{KwE(5h?EG;>I|{aWu!lG4>jPOP!HADU|^n6f;+ +`0o$B<&+#fnrW*Ei$kp;*mDBy%C#zhI9Vv^^!r! +q}}jqAbMDA9PSb=C;x7Gwyi@N?ghU@O01G%icW?RA9OgST|JMnl^#I=R=pqyO`=TYpz4hy4T0&oruyq +T006nM{eHu)r!0I1)*L-ePjzAyt_zibjmN?6tAvK@0<$wqG*qZbzkKzO5w0I75O+xfXesg3=A8%mZn`0dGRltT`zbfwLvn_N7K5 +Svz*!Y&r$0Oh-N(;XhR3-6PLK3>^gmEb0|XQR000O836Bj;QXCNB?IZvI6oLQ%82|tPaA|NaUukZ1Wp +Zv|Y%gSQcW!KNVPr0FdF?&@bKAI;zx%JiDU%Vkl^G{(XXo5;?^3U~@m)5_#NOTZTpvS;ki?oIRf4pwO +>=+yy$=8cKuUI!`UvH|q5$Q}-Mcc@PzaJdv=ksN5KFW2P +7jfImdm_cny>48Et~B|+P0Pbv???BpCf(MK! +-!z-!a=HGDs->uO*CGlMu~6fF2Zq)KYErsCD*<-46Yb|BhjWxBtF&j^D1!l!(WkM{IlSD7sA@TYIzT% +NtTOio|@_~u`ei}Qawn~L{RZK_fYOxOZZP2J9s$2vfO#5r^-Ro>*c^1FQA?CDQ@COSS#O4-!&1ZQ^eM +7()>d3G%R^uz1-?@q;Ok;}3Xxe{dsoLs{H(?(_@F9osO3O=VwRHb-v^!(eyqi+wNe>)X-t9%YbQUHzr +?p9lI2P?HKt6GX?C8;-dYgV~IrH?W28&K@Fo9F$ys5kRu&RB^j1m;-7-P1p2rZr$TX{{vU&5slM{`l^ +ikPZO-U<=@(>aWT9|T)R|d7&dW^RoBr>%@6LzX5{ +JgJoL3nLIx9%qrh>uX;otz=35N%9*2uN#hQj3r*0@xYKi9W|`s46fEUb)a#~}@EZETV%|3lr!6-yCN1XlV6uBcN;d7Lsj5O +HvoGr5bi%OBrezJ2@pBDr{V{=;qnuuwEH)A16%f0x&C-cmxr9K3pYkzBsMfbS7L)?yOhO#~=Ve} +g6ou3Q3*ug16*NZSO}9&pW=sjmOVxk_NekEdb`|0KZmxSaTvxB|Y@+ptSo&sQM*2{85LHH4WaMPA+n9 +h?<5g8>X|+hF%`&+VtpcHuE`bQqgeg24 +jp*O^z*}`GQUMAN_gO7Bu)xp|zn~Jqu7bM8UdJqLQW*QAMS5iTz8)Qmk0V3?K8%1lMpH4;TLGRBx0tP +wB%iuzk2c$8#ci}r74s9*I+{3*ft?Du2E0gI;+QV|gh3z#<#%%-YD_*IFt;vfidW${*H;YrTAZAS@## +B)IzF~gc6BlYfPTBDM^I$(xUoU7Z=Hdm6Ubx$x!GFk=H;RSo1~CnyA<+P7SwT(!#;I-;$N>Dpg9Qc>i +E~!wkIeX`Gs&ki(sR86#uo#%g7t+3V1fUpP&R5_h>Hl2I(;UJktJ4xT;UYX@woYkoY55A?kl&xzFpW> +~Y(F6JBNq(8`%su)FI<-Q~?H8iA~9??;mkkzI}r=t^)oI<)93t&IWe +dVcLmM)6C&i8N&#!2%!iY;--i5NR7Mkj95j +GHi=}PRL?dnj;6Hwvbo-+Zq7Pil!OwuMd-wxbF#Qo=cB{PXjc_%ZZ(1LSZE1mMGbij>ZNTAFMdI#T_# +SJEC;92@JsPwO#xWFiduTmqlEO@F+tI{wM!&yfZiT4zTQhdO$BbOfmd5BK^|r>s^%bt+^`~dO=eqaxC +-D&@GoMB=o7$0w#|i$g+hf@B1pgOj?RujkdJ8y#Pnd$Wt4^ZP6nXP_G=aw;p^_W9RVSBqEA>uAn`vI8 +N{JtUCGzj8b()tp?hu)H1gtUJL111bK;XPdk_fcyVk*FESZ~mPVz3?E@O5n8B0reVK@%ALuBtN>ksm* +~zT|lfH$utx?Fi$bjn +4yKha~x{5`J8y@^Ku3HW1Xg!UAX`*$E6J?yPj-OwPUx|oOn@ +-@fe(~b?+9Se`7^Z;H6tIUsUqC8tFs8CfZzWk76iH!_76KZ`$ilGhdf8|bxXXx^xxqw4xR<8vz<7w9- +8XeQZ#)d_GGH)BlL$7d!Knlw8gW-c7?g1L`aAa_gn>edGk)YPaF2JerDD}j;Vq4t0`IX985k-JqY0R= +_u#S4i=jqvrsh!>R +r*t>qG|1MoYsM>H~xMpK?X_fMd|Gmh2~(7h9ST|+DO)MhHa`R3*>t(R)z8pA(hyt4qwk-}P}GZZ8qf> +Ye-KqnBswBo?5cWFri=&!9qHH@huMS!Mt)h<^=Z`hk{T3BE%gWxkXrJ7bH7&;UGaDoFL2g{%*r#1&Z& +WJ6=erG^Yz=hR9=YFe7C^Y4_1_leyJ{}0fS2B-4;X%a#a|<=cy8uHJjwx)Yy9c=6zC96L*fuXWEvStj +4WOqAtVr=x1j47o*Y0PXz=`$0(deDoonqwS+wIPsI3nTU1!2JHC7YG`JXsLzZf_P3Z*uhLDAp)+*ou( +UMkmdns`Dj!@YtY~b98MGcd!hqJ5jYYPSN9JN6pr<)ld}8p_H++`Cy^-p#H-;y)$Mn2GgvE$OF90GBf +OM$~x-al@ebdmk=KYH2U=}Rrsx)WV}ea +aF{bF>$`0jmj>JiqEIY#mA&wzQ6}z4i$0n4p=SK0E^xsC!5IUbl)h)MJ9$>!PO_`DqkdvB@+@u0#NNG +8vLR1HEzV3G3aErkzH%R{84+jNtDtbQUpk(u=N1PRnY|WMqaZhB#%qK4F+mzLuaL^f&M|^2Jtvnaf%~ +_h|q^^*)!1UU`Ohv(hrni6lpQ*g$k@E;Jd)XyWfQSBIR47e`0_YqoqH$Q@uCW;cHb3LS__5!A?_*^Q{ +9?{6nB*HxA;a?&(TE?zrz;HSxmP=?`>HLlJS8FRUA*o*Q&X(^ +RZhV!J$&c{m(g3;q{zOX$=dSK$^8F=7%IqFYfCDRO()+a-G-sod*GmK6dg~Ll2Yjo^kG~M0$wJev-3f +kMLQr@WF;dQE-!yh!opuHiU-}F;p9Xe})fdfkeaCqz4DBO=I2#ZQdBNb81(}Mwn%oS_YhBlYC3zV{Z^ +denITUHR+PeJbCrJ&jZuw&8h!Ui_04eDtjjYgKYvV=F1?Vbi?w8X%o&R>ajx+QRE{LIiy!<1c)rWC9? +W>3+q>XH|`y!LNU_7B>Xs@;H~@#e%v>?F1@!rq=j$K)tZ26(C^GbClxshb0`4=^Sgrl`Z181}UT3rK? +r)=bQ{o%Jl!Tuc`xTJg%&UpE6x`p2SQbnV>p!PbU>l;i;miy(F0(huMkX!R$F2!92zci)UKt*oj? ++}*n!8x>3~rmNe?-ETv`mWT;Uoyu&@^s0S$?wT7q>6ghc{%Lu!LJ%stb3#&!}DUkY*7EY`rH{?5Df7H +0fZjggOXkflBHgmWGBq0vP2@^C6mdv83u6$ss#1X5@cWU+Y1mfip?XQ5=h&XuAv0R%|%=BP^QAV@4Q0 +LWhoavoKiRa3F8THH?T6yc+>5{IwEqDYtVs4t~_Li_Ir{MLqeyCWa$2=e~nUp;-A9M>Z49>->e@fB`l +jIKPihlxFb-<+sK+MzOKe(csot*W-jNSweDA66TW>jHcR0~Rbf_vmLWTK5PSoL5h-nC@D6N46wuY83f +YoWG?HlQ2dBu4Ybp2p9+4g)R7Cg)HZiLkE&Oa|~ymBAr;4c615gnN19h$$u8=2KZ@CvF#-wSlma +s#oIR)K)@=%SV$3C7zFKiK0N5C4rfbr?s`^)6b+c#(9pi!D&J7u+yM(|y}xsariBU=Qj9~k7c%h}Ukk +2XYsi)wH{0RX>>H`N9stMn9{_M?tnn6v$c^lW4T+?K^PWs_B`C68c`b$rEPhZswn573+vHngkU2 +dxv=C*xp0Rmox|5lhqCpEJX^X +VBn-#Wp01L&ZzcC5wiH0=|?Yx)bw@1Hb;limQEI`E~;(SgrXf4xHbw1Gd;ON5B!{3Xy6xR#|MHk~-Rt +<@>x^6eRK3Y|4jNpTz>y8R9fEi?+76C92dL15E(up;USX~VQ8<3)cX9l4vScNgH*Rm2R@*PUI09wt9+ +{6O}I3hC|oF?Qr*#i$4zFeojz@#pI-S7S42tAJ9zW7!gJ_zQtsM_p%Si!(z=8(;zs^_u*KkeiSaGD~G +rU)PZ_w99m=`y5+TBpdU>k7O-WEw1tg@56LZ0^ukS)`ywG8-Kiy+y0)j5pV&M&BJ(@Omw4Q&I@q^){a +eOogMsAju*{J$rH#zxb_FITIvIOwuO7Y)_(voz3!K%{z-NSmuRn=2$_`QF9ez_pEZjkuIFcdD?P9h&A +DDTI3ng+<}bL0M%!NVh7y;$Ky;%8(I^D{V8Bp?e3tdVRAiHuBy^^cpY#^WUxJe4@yivNgy0;2HII&Cj +hj_?>%M&y-x4K72Q;P9cPC99UER;8#4TG;(ynFoYnfUSj +Yw**R1MN=Y7E@GsfUOiZLmg{s4#u~*=JgGq{h-4aI4TxG)82Q1!Eny9mpy_F*-rZjM+%SxKr}MwQR3E +xJlWZtTZfqV#SUcgQ2-F94%$o&g3}EEToCu4?2-w%2585Zhh|aHHr2$Sl_|HK>|)jIiq9utlgTyd7sk +J%E%v5G%FDoP8pr?!&9v1UQ)OZde6|@}4LY=zNb8}NPqtWP(ve8bBP +N||CC*J!VZdcT?m=Rlaq#v-xS9yIkC3vKBV~Ii!3=L=cJV)FuieKGNey=hWfWE_ +9r#Wmf%zKd6>1&HoZ=oiFLY2Ue&keSjxRG1R>cSGYi2Jb^>+!~2yi)TUot^?QmMBm-YYActcoolKM7H +P$(4|&R%%0j}ZU~>p%erbe(ep_R`vZlCt0g1TmP+FbIVRoR(Y|N;;a~UKEukGFmy9QYBhCcto&M^p+3 +|a4H90x*6ia#*V5P$9DP%u*(jER2$biMT2k5DYIs|EB`L)O4jDs5flsq5gM$QP2kH?f}ettdF4*!9@y +eZPTjK+WY3m#Q@HujTEb`3E@s=#4hC0UKY>Sq6IGv76n$HZ=xPKIFE}>_82}-#P{ca`r+&tOb#R-`8t8_$3LA>*4u}I#=T-Vo!$dBM3*3 +8?;sk?&zn3m*IC7wH09uh8`7eb0c9Ae<+z@WCupZE{23T=d*U7|j26HwX%=aYG)KVR4kw`>wRgs+6u_ +fg3?StRMJ>uPjq?;M03rZCaYT$Wb*)mk0OsJJlQ)zgjbTS^09I6w|2@Ke{&!OCe@FNe+#t~8d~z_r;b +He@-$YmG;V;*dzx>^HV=c#L(jrP*TkU1EO#{X?G9y(nVZA|7RW~34@*C7$AQ~LujXR+vf0>$kAtapY_ +i3Rk$E={lcENr>y7uIyQRmzPKwq)E0|p>c;0JRqZUN7+0QYvTVmeGoos>C`=F~|bv-){qP@uOG&!To} +mnBVHco1SHGDUF$;w($d(K0t4uBrA-=&c+Jp}$)vrafwU`Of@=^g+b+^FJG@6!+X_5*6^)C)GD*C#X>qFZcc3$hj^xjrP!& +_Q>3n-BnFGmIehPBr(oIiljugtxukgZ|0Y2>&+~#-i1;!nYWiK`sUDjm91LS6Sjbr;d}bb46EgguZR3uxP$iV#xLj_=t(D{tO78zPW0IiFj~_k>TYinnjN1jz&oGvY~&5`&U$MSnaiqV +yaU8Wt$lRT;T3}hM_H&mk%o9Hm7aKXxvA8?cwdf|%d@%^K;ZPpC+N)rqrh14b5r0q)uX#KyNVSpa-!GWrtDXj+M!G^(f;J0 +MsLx}-Jo0w;hu8ie&!s$K5@V5aLfwI+=|!Dg_L{Rn}c2kLjQh%mI4iFhxnUog6^kPR?n0{8RQS^8bG*aN~GdgGihrQO0Q9E;^ +I`DP~!Uie4Olaf$+qV@z7rhswuf#{YQgwSi!8xtHQDvgz;0hKO3xCev@sOgOh<1SN>TliFQrg~@3VXE +w%{SH`v*xJB2ALAs&pv4^pDAsACbHjJL5L#6mO16P&S?49@2SGCcH?JKDr|_P&j0AW*2xdsa4uq4oxh +yi4+g+51t%8>g-)bP8J99cDFB+h1T4%ImhZG;EW`6}8?xO=D16CBZUVm)XElyo{sKa_aY%wl085SfY| +Mt$(s!gog2HGU_Sn;@Sro&Tz{B|(%M5bCyH)t^sAMf7SeIpXRp8ivNYM<1;amr7q)FBRib~X^KZ9vQD +Ss0E5F=PgJ7dN<;$gx)0oM6UR7JC%*Y-|l2%^aNKuKS%L*SHL_>s~Zn&cq_cj!k9d*HOo7iytJa}lf2pGde~-C(pA>>>45q!w3=vb`$u`tjdvfz?v* +kcdm)Yx5c8=eS4P6hwx`3v&6N92ik`E;|;O%5hW4>H2>cR7h`gC#0Nq8q+5ahlz#>rEC_(H`Z$|rO$< +5Wa8z@ov3TkMa<8u&zzjN$a}43$;s0j%zjW-Uk2;i31hfrBFVV7dterw`%mi*+D=E%9jaK+8QC%>s-vsaS#Nm=RwNxDV#QJbE&7{09Jq^J+J^kYG#T1bfX +MTBHX$7}O`b>TK|j@28E2DK+ipzmI5XKs3Bu2$-{p4xii2fE?la(=;kRbhhOls=7jRd;tb__DG)a;+* +Cpy&%r%j0}rAbn4Tf?Nk<+;E(>|D#?>kRhoOTzC4K@;{4S)bTUr8Yab(E!t6wkG@|UCxh66wq)#o01l +=L2gu)mFokpaR%FbzHub>mi_^y`!WZ~%+i6gRgK+rq +5@f@7XOe1H#do@se2HLev8JRtDX$CH^CL3_cISk(9~uewrhN@g4+o8sw&TNq5K;qg +PoITwy@U);uH(H2g`_Bhlg7KA2N&3f$+s*Dn9Uc$~ViL@^us%o!ao)6I!RSbEz11!2(C|16vob2*mI7 +F>Y&UG?nhp1y?)K04m+_Wkw2!rs%GR*%kwix<9tXh>gXS08&(s3Rn*LDgdg{6&2Mu@*~|JcEj&rNAf9 +iMs*csy(8F_z9_tsLJ*aeL +Wy(`nDoHiPtPe~spK^{oc?Ra*DUHSS(*8|qERU>{<_$E(@TP_a&c1}~ANLe<2}?DuL>K--+6ec;~dOS +?|dmbV>0AVoiz&L50&EN?5MHZ2z2#9+?=G?mcTj`r10EY9L(eC*tomTzq9c<||eJj>+mvt{0ZjNDY}8 +Q-pa$XBu*;?1ZxdDE3f==FM2HS(Afh47!gG6GoYr?dBe78kGI{*23l_cQ1!vZA6gcDjb0FNf5C9PMH< +m>|!A(s=L>__fyQA94vl1iDX4%qQY!Oo!!-IU5ZNUl4yIa=Z~hL@QhhVh=NS%nun57gE}@EkKP`JHr} +CAjc+s2K0IcItS?g?8Wnc{H+xf4=VDW64!(IIMGA8h&G{M)R;cUn=O}0Q=0@ULGXtHIAno0Vqg`>bQDk9bC;bsyOOdHs>$&3EL}3* +<|#JqPGvCN-0a=HD~#xOUlPiS7$=#}=cSFrGd#Ui;|~1e0ImzeJvfe|QPJkk%OfpD!C|q)mK{4#bn#x +;QisrNiTkcoQh2IrYL0f>Yu}Ptm2K(V|EyAd3K;Yw7p)$w?i#xA^!$T&5jV~q4!v@p?$)u7WA{R_@v# +`wb!D(X<4?X9)1?bM`oy4W^rp@Rj4rlvn&tv>~zxU#&vgxCO&oK +fz2w_(_u7Vv1}?py4%?3mX%CHMy}eZv0wQ1w%#GviBLEr7YXUJn=}wx~H5*<~-b=ZAZ(AtkPSPSQTq2mtd!2Wc4LEjuIqwaPQngWINFE(M3MQBdyUnw*5b&#Wbd9^0-f*hs| +syD7jC4(M~pa7S{z5VfhVBt=?z>^Mm1ULtMgPGzvT{{fnN0+%+QKe7hX&+R)6zpefu|B1H)nFEPE8HN +Sa}JHD7?*!Q%who}xW6oBJzwIjj2v{F%PZ@e>qr2&&eQ=Ox+h+ZqtA!d+Y(3SSIrFD*17E`7Jarv>-hp1&Xp)dhmhGDLKF~OuKbaq!}d~Y8XVt1#5^Ic`w`1e3TyRlMeg) +KzNXzi%Vc7Q%Ac4s%7=l(t+BiJ3$bz%4Ai14q|e$E9mPKYwh6!~(m7Y4A1drx<}{DZM}Zd9$HZ4d3u9-$&_|0XqjLpN!oL +dOiI=aBj~dWe3+Mu`SenIY%AnRL13W&2Y2zt95&qSThiP)|(^21c_=`x}ru~I^>qG4qWz;id)#|5{5+ +?mTr}fW6)iey^7P^EjSHtPWjwIQ?H;jfF&MLVA?Mv?E%?aSo&EQoA60*h=&VF2Mb0YM0Izm +q5Q6E(pI$QwSht(B?e%5Tl(oVYQobNN@(|!QYZVvm4mp{vK9nNP}Z3v26;Yk-Mt@2uzbc$EiMlRZ-Fj +3y#Wg!fTN_6PD1unJbJD@Q7w9GMTs0rt?48`5U?KNC(Ox(4t+OhfR07dRF-ER>Kk7g7(e9WD3Ejb6H{g} +N1p<9)%hyZK;z)wzGKjj_bB#y6AyY4dprkUT{~#A%YYw)u(o@Uh%|^jOoR=vbZczRV{xI4QBn3g8bq+ +kvA#)LE3Zs^vAPkdzZdb&j|#8FM!8O->K}fX!35#U(*6XU!83Du>_gXSH+JfVdO)0`GZgYB%NqUX`7+ +m@Bg2mdI(HPcI`qSbs{Zg{_;`zdqf9AAq#;I_(P`c5V(d{BOH{(jxi+RFKI6-CH;>2kJErEFW=8KIs4 +Xuv7a8cpG`#Bw!hOO-2Ry}_%)w}MS;xy?dQd!ke}z}NH^GQDl}xwM|HFyBF(5?6MEUGA>@SJ9_c1&c0 +kXh@U@?5sS$3bVVTz;?x=MtxI(TOjTvFuvyO-vNsld$fF@9>(T9cBJeE-HFan)i;TI-ZXANyk;%0 +T2*+pS6aOQ73NiqIRS!a=Spc!^TyaHi>jqx8_@?N6(7JRpWNms?JvL@G=^5CpY(Zrk*ss%oOjsyVjxv +DWyOm~Qu>!X+kXnBG{=kSmK{9oG*F_(wS?Z-E^~&NW0E~#91s6?r<8X9=bb`Y$Mxp>kRK{3#lP`8%L9 +iY4?IyPO+{!dU#0|XQR000O8OQ +J+gN^&3)p9=s0!y*6x8vpV?GE^v9(S=(+KITC&MR}dNmk^s49= +lY<99~{SygUxN7%REd50@Y1P9CwpF&2G!uApgFnitMW-+k<^t0ddr7vZ`3DI(3R1jYgOEvC2zrjT4nq +i6}RPt=1b`l_Hn%tz4_oXmqkFY$g_qRaI7nS}cUla$A%_E}c!QQZ4-Ri65s+Rg~7It{xU|q&73LhU9# +?n~6f@O4g%uokxp1WfEINPT$vaNC^IA?&RboPNj3=z0NO-!WNUp@A^HaU(Uw!giyKkRs{K7O^zOmSU;Iilm6r3I`ExwZq6l{Z;8gWy+LY^*8O$?n +w48RNZ2^83Wo?S9Id>k*@+c&h*TRDb**@=T=`jHf;H!9p=7cP%2jf}%U$i|Mv2V2QdIeAX-^YbDskr} +3A=*!kSRhtA-!l8qigwnJ7jWUvrL-D)ZXc$tYoUpoxqYMf{|yD7TN;#e?QFm{js_;D^y(CV%N{HJDKX_w~bOMg^iJ!dMI +GRcv7oU4g#7H^)t*>IpK@)VjmLM8S6#%Bwb6l;R)^`8E>kz)H$ND8SaC^#L9`nQf%M{j(}x}--ajYK#P5H!Gi06vQhEH$@9^PiQ5filbTuO9_Z3oT1XYKGIoLkAR +lBoPX3InhH5V$fMWP_O9#5-`Qx~jq3%gpxR4PneA0{1%Gtrf_Sg`LGi;hK&RrN|BEZQIirw4|p`;r$M +Ep4)!OxYGis(ZGyGxf?(?5isjs-O|$FJ>J5X|99) +utSroq2p9!NpwDn+rSZZVHaa|5Ixh1DG*U+^HlC=A$K4%7NJ^d?BY%Um3NH>)e<(;o^k^azttx3N;D}!Eu4#wSaJx1 +PWi=ni9dy2uYt;mpU%sPFazJUYZT?u5%j@Ixx%7&CpzTF1tf!w7&gP!#S$9@;x^{`)W|7!xsG`q@(xi +amw-bhi&T?qdSMB}fh})=h5Sg)!Si_BCI{#3ATg-k_}q}fRVZNvg_y`x&#S1FVGY6OK{tJP_7!K3aP+)G?b5_7K!%iy3+;Wt{#Wfny<2HNJ9MO@XAZt1v&Z)*FYKMY?QPGDqp$}u2xLN>yZU +JT+dBgKmYNybmB_N`<6;5GqBMj4Q+NTI1BXLGjPABOvdvk4XdU +EsURgsNDk8C|Y!aWv`ee24Z>&l2w9XoVp#-I6GZRVq_hsA!93_q+11WC1^zi0sY~=a$~(XQbIw6A6#H +kG=p&ssrip?o=!#=lB9%s;!6fgfh(QrQ}h}w8r`E_Y>$E|TVyU^nAch}?yxY%U#CGD0oL=;wA1VaF8Q +fQ|8G3`!{6~FQQP_V-yilUhU|vk%qVNz(-tUlxiK+O+mPT`-!C^%-dVvkG=Jcul +Gn*)OuU{68ANQ6v&b--z&k~%?`f(PC>$=fF>Vng7Vq3Q-rsqn@ctCmY3x>A^U +p3K?tx2sUC&(h+=sUa_$dWO&Z7FSB0^X1$fi^SU@H>dD*x9PsZ(AL`8pxx*iBV2wIhU76OkS->0QNKC +UJ#uQmDN4}4V@(oTQ;Lf%EP9HU^E(R#D +sIGzVMAJ5?B&Mpdb)G4b0H&bY45Kfk+q_3?6Xeg5IPttPd*J5-21of^{bN4^7*U?0VF3I>0Dx_P~iQX +sT77oxGifVGBUG +z1alM)fL~19d&rf76pQ^c;JQkb`@0;G5&8lHr=72$D8vamp&!$#F?o#6F)J^I-?LKt-q<9h=RRV6DJP +I;>&Fs5G8&6inNuw9ng+^AuEP&)hsPui8(5=slJ(J7&S&rx%+~pEgXZevSDQy0gPYrdv(`odH{f%T=s +b6e&~(xCjC9LYoJ#%X&o2qC(Z)FF`-`OVF#MZl0o6H5lq$9v +@#NE>esxq|=ip4s}$^DIcF=v@QNUWG!tqMqV%l>(K1! +pT&)Wcn2L1%v$)Z$h~yowsbx^vEyb1-Aj{nh*QbAO*cUSEE=6z|V3{&oKH@`HHsPP~2hQM@_-cyTT8P +EdT}_p6(CZ}|D<^536c-CVx8eEadkaHpiI)+Ge%#=u`Yv5( +M$v9dN$ix?!ty-o{&JW^wJ+n9J9zxa%Lk?7P_f#Dr{RU;c;ZbWk?WU4SKJ_fgxAU%YIdK7Vyu=5q5lT +b*Yp8O*^t*>^ejjz`{XX|V&-^%K`kA!!MQk%TO*?D)E%NZ?euvzAZ(8McID4IaDCpWi-2)~m);l=T>6 +0%Jw}|)o{A6hPWj)btZyMobOW&9haZ3X`Io2uIVkKUq9c4r;p(Y>4!7^*cXm5s%`9v&; +Ro8&>5z3@!F*I#Uoa>%6BYZ~#nH@J{Of7F0W5RK^Lgf0F%LqqA4rqb>vFEs@h6&2J{WX>5W34M>GI3< +2}B4551~gKcl;#Yn@FD~$Utd +AY8ecgc-d2!HJu)hrS>4dHvW*(a6>TeP3?pa9bZB7aWxHObi5q_13d&z1{OAMsrO+IO!jUN_OGel@6f +NBaBun4>#Ce5H76!Aj!|3#)&_R!PQB#1MzI*MUWrmCdpBLZ+jF{yyRcQ7ytUYecw{_6^@?CRVgJXT+StMH7GT-hox9u9HXC=1(uDQ +KLLul=ULQn}Ut@U-~cE61?O8`>#A3I`alTddOOLH(p@41g2H>lQEF11&Tlk*(1t|uiv6kgd72>o3t|8 +RZ#!YmqPb8nBOt8qwqm}(HHae+ZWT<=dT#T(7je>bg{SnF!}4Zz6|f&Sx@2gA>03bku+V!RHlz5*+f`h?eFy8@=Mx%GtzA4IFMRmT(nt +T~GRrL1o_SG~h%4PmBSEJGBWK~z&C{0)UW?$!N8Wr1JRX0&KSJh_Umm&C3rrN^fcI3{f>`9Xj1ow+CgtU +vnrB%;qBsrPS%b}u${o-GfrO4VeUT<%U!CLvt5)iU3xgl2zPENLYgjC9W#x_fDE9s#hb>TTAfi>hquYGa^$$yZ;>#UoGiqBjpg4jgH_ +Dau>Z^fi4CHQnXA-#-6cligSf-{ehd2@-mQ7ei;o6}xP?taGJ?A6VwQI$toE%v0vlv3|5XvK`U*%O<6 +(!;fqWweb1n#k-eZz54bdz4*_oi#M0AzJ5dec=^rSw_m@zy7QArUT;eGn&!cEpS4~B-c^a)N)$me?SVPF|tL!!}BS!D#n*Qcv6>Vr$Mb#=&`GRyzR +MiCyP(|@&o}ZDtZgyu+pU#UW*&Lpp{=Gh2{`uvEp~WNIRHJD$`nCL-O!W=^y{Sl&0*lbi)91fWp5ecz +pM`Fpot-{CecrvbqSbA>dsCIUzVRqhYE4oo$~Je|LFs`c`XRdKqX_ze_wt(PrkOCIwegy-#VJevG@Ve +hWxk41EE}w8a3>UI%<@gqk|2hkoN+g#s{fQXQM1mYm(p~0MNL6gT)Qbq5=SBz6}TshzPfnvg%Q9|^nj +v>n=oNz-VpIbpiU!dQXi%?Y1z$|029)#w1-GnyG_vmEt!~Nr6Cc|V_il67-OcuNjziY9|dWl-IuTa^D +h@?ks@Y@?y|ZBdZe%MyIIqZ&z-iJQe;$Mo##+g?X5Z|`=pG<;}gBE)Q<4fG)mSa$AxOdU}=3k0fHIkZk9n|#IK6XsG2xMRrBDOb}J3Bp0$oNytho_MiUCZb;KipOIGRo?kJ^1V_8tdN1BMVK>2T= +~BAVk4_&L#Sr2se%&5x<>I-aorO(TnsYL}f&i8-4roQgf)Hf;0vf%Q~Pn(B4dR*Ddjgut1zxlh*$vA>OMSbyv{5O4CV1%!DTI$+|Gtt^sxY;S?r+V!~>zZ9TP0HYwAPW$x53zW&+IbwgHWMo-LtQfMQ=m`UunD4Tyxy +MH#n#e&RR9$CZSH!g1+%Zlq)n4E5?h6{7vPAq<{^YsUdR@R`#(y6xQ|11S%;_vR+p0-y1vUarh}n6o* +VGJD0++!Z)yJduNNcpVSkbw?j=)h8N0!W<{|p3iTjgc=9)F$=j#+Zq-CEkd?66Oc9{G%98Q((+(Vy&` +uNtuT0`BB{wJAV<+aiNlJD^ij4|J%u$PHu=sQOILsKmsWq_L;Rt8iO$cXF%TSM74~RS!6<9iNudbS*m +q+9`#J7{xnq2pOggMYI&DdwH;K;;=%zLqOo_4D~Z +dZQb?SitEUokb(Nv`2m3e-!;SCqjeFcbPEZoF-?vIcVl5WwpqNHQ_)bw077ljP45hv)Y#&1EF5_ByCqA80-8n{=g$596S +)jP_Pb(=bGrJ(`TfW%YEalvld7}v;akt=xV(ufpnk=X*A|El|-T+^132*DQFS91%MbTGBL`7OGLN}cl +if0iGk3ZD6}fz6a=7%0lUpU&Pc|bKjXpBltVa{)r?^xBp_l$BNPCm8X#&kK1su60YcIeasor`h`4zG4 +3VtZl2eBzyjm5Dh*vBTc99Xw!own$24iB0xX!S817H?pF5VC=2xXd>sqOY}dxS^Cttd)zD;QRdz(Z)N +YnoiBUo>)u^rwp}BF>#ltE$`_0wAh#LAcU9wCs=snvshbZL1oVjYJ)o2Z`Tl)I1fdtm#%j(6Nd?0es=Hzhm;EAE@TLs|=YC*(7I7X0;4jA +i(2tUD)g2#Fb4mMDe=qt;-2wW%@x0wS)8@cR05$!Yf#ggcoazkPblTGIEKJR#C5!@VtdT;;%O=`Xnv+ +fpinyvMWHU%jwHag)(!&tYt6G~rQ{pGa-h?)_E7IOirDVD7oz9eEpqHe^T5DG()6X{A!~)z#Ho +_Oalf(9M=6$9zs|s5Pqt(*%5bki4QUgm3QcG!>3~nC&1hjCmbd~qViY|N6U}ycMeD8FHxKLstCN=L9?_^4q~|JVzYD +BFp80~*vWmRWTU^cmMtHU{pDQR|GW?bZ`*TB*)_jxi(Er<9n=mA!7wd=!dq}nVACr#E7wfX1@vz*0aK +oe;gT{cILf<16ZWfbbf7EFnWjkVyU0oo0jR9+=fxr@f;V=VrTr_DKt9-MXGTJG()d?pAKa~m5AR0;bZ +=JJBQRiP~M5=(F($u6O^JR)SpW1 +=x=NVLh!SW9D1CFy2|TxPBwgf5Ih}WM`V0S^lzXcJcdYG0dvOQPY3z4=!GBukA#CD{(%XpASH=E{eXu +VFYa7t**HR5?Q56^nlGZKks#b&A$z9;EVbXjI_!ayBm;9#%Owu_hRi@5xfY293aYPGk&sm7P`uO|IL~ +z5=?aDv2`-y%01LBKw6AOSsSd<8+a&s$F4lKsNKCasU34rfJ2Zv~9XTfhbzf{)KeJ`0ai*pU)GSI^$> +h3);cz!>fXqGZioqH{eL52BI@`Y3!CC|G<3?qd?oO}=;^2rClFA@$FrONNPM+)gfp)@wsi$? +B&HeL$>RamldLmHaX_X4E8!9Du{seE&o`sQw9qTQ(*I +HOT+Dn^Qf8JWxgrqr!M>qW84qyYQQFBB@~Sfgn=NZ0j^tlZ92nD$P6Hjt9 +$l|(W-a?*8cDtbv3ro&G+gMJRr$FuXr^}GnUQkjAk{Hq&-b3DI&HSm+S|vtGhG5FS%*^QRK9AaqcA4& +pX-`qQuj#F$0+jEN@kPQEf9MHEmFW!%O)VaTUpVi8f>X$-z2a;IQ>CeVin@n3^o9$-J76Ep{1(8qKOP>1wk_FYi`Zs^B{MTt+vh&&LCcOt5WL>+O`CO5%Oo=UonD5lKk8` +cRyS^Nsl_#Uz@)2L;J|>s&8_j@ofBzq!<1csTp$v0Ed*>WcCvRBe7^!>65$+4#z(dYglz1aj9me*D~6 +OZr1Opz@}}C_qvnfmbXs%PeDQC?e5HT>MQGG>U#+^anZSI(rj4r2QlgWL`qY?=OSVc7dLYSSEK6MM&Z +c7+^AtM2-9AZ6-I=g0OMfJ_-D|&~hfqzGNIn1;uRCEZz&5J0Z?wJEZZ;T8>N3xwfBZPo$|*+GLBgq+;BZ +3~Mx5zljzu_;;C67H_>`OUhCF1nJbWbbaCjWu)iH#P4wsC+EA@li{iL1SY`N@-dL4Y|t~*h8(c8D9=ZypC!)&_c;`Q{@c^fet#^!8#GtRqHc` ++YZ&nlNKOBm?E9+h#UJ2k=h**DkUE&6bG{3FQrh$2;c%~bS_X+qbN4%4k;WNVNuii!gn2)Hc& +ER%c2I0g1=Q1GlVHifnc|M-xq}1ruPl?-M&#av0_qEQijG}Asi4v8aMp#p<@GpR!l1PXgGuJGpMAdoy +uQn)b*uov3YW{2iH55B28T^8cpi=&#pP$-&TGEbL3XWc_jn*glj*TXx=lPFQ}!koy@ZnAAQA)vSAv~U +_0(x4+mO<)k&|%ZOp4A61`$dSwfXnIb%Tqr5q;M$gFr$r?<%SY2##}$1_MguS$n)G0`48U?=ZmeOl3axA +{R^VfMy=j{8zqx4?|yEQOTL=o}L>BLbhT^TnHgoU8(T?;FmX=)ws>lZ`5N3Z;laoXVP0+(fSD;B)Np@P4OynM2GvAf$=Q4yQ?Er%&hY+*HT&L<1LSh=mrJl=mk(GLVX4 +zcrS18$oax@i&R_!Hw%jrX0;P=$M!Tw5K#D)yI7J{pKX +GiYG_^Vx2TKFkI)*48@@&jnO|e)9uqhfa_1<;Igg&Xrn_A+iLn+)Xs1m6Ze1Z#Rgzi=ZBX(WOX%rb_$ +ChYVG4A6b`@5~oy%?HD0D~Omu`YqcX!l)lzXgfMU9ir6O_fUL=H!Xu~_~Mh&dXUcyz*|2{QbGd#{Aqe +0t;U$E5nB3r*swAAPF}x;BgN9=J|>Xvl*tCusupb4&P0<{vdW34e|2@qfqPEuT!{OFs%gi<>^4Loy8)0)){}rk&=)EWUhgurjZ#!ApLaY8})p;OwQir`FABdqP|#Pi)vpsTG?VBFU+rqtHfk)YGdOe8WgF6(t +#p%lWI>aOAm~0isp&zpyHG{Fyb9mNff{02nX9@G@Hfh(2JNqYRg--DbrHRj^tbujyN)@_1=*uvUg;5> +L)$iX(i2OC|;;`TJ83oUSrcpDtnq*YYn|20MTNY7c>CK_cAt=LMd?+^=BBCUq*bn5inUQ$u1F|4 +RYPJo5dXK6#Z`hXS93FaT;_7W|;p#!OLk31iMgqMs)p`vt7nl!`>A*`1mcyHtM->oGn2)9c +_}Y&RJ6W(s9yFt$*5*Ls3D1;;WbQJ@ID*R`oXcz_#ZKAZ-$01_c_JlZ#_&qnYXZN8L&4P>1FY)grREiv3rI>(lO$qyRW51Lp!z%jOHz`OL1d=a>sO0Dy +X!VkwGAF?Ss}ES#e7;~=z84#+IH?8gVcRUul<4Of)xNBiGvO@Q&m=Uhm;UG4h>!HWpUQ@Gt7DYl@$k(i#M6h`eZR=qhulJOD{bU%YMr#hi(r;2bkIE5@o!th^v +*9Wk+M6$^62pPQbGKkWPL&u*jUGC(ZU}qp{#mb6|(Pf2aEXSa=8}+pg`!h{)Cw*Ok)M9+9;Kq%wr_1w +K4PD00TY#+bBK>+}K}$mC-=2EnB(7(@qJP2zRC&8eG1wP$-yTI#JSWapWROm2YMG6nZ+(SyV&7?J^RD +MR6+vBO<<5D$Mmo9Us>cz}=9xSLJt+Q$#O*^hp44#9CCkXvrEs-5IAmnp;E;O+i?0PG#ZlQq$%c%)1O +wC&_;TSQo**t`ovHdU&qKSFw^mhvA4O_t}REy=Y|q{2?T7J-2>$hunY5gsD`wK#dP5c>mz-`?Wk-CBh`qICYtt$v33B(;9-;saOg(%5^$)j02J}581h68OW=hf)7OFI7wITd<%r4$t! +EBW@B7D0sc8sv2fk4IxZYQEm>Phb?3>J5q4&fNAmOdeen0KeyD!sR70G_AC1889(J6i!R$(&&DsjfLl +9l$l=Kz7cC%bV`j1^L;M(?xHh$?~PQuI;4ruv&R^F0(K!<~)LTz;Nn{_io!qQ{fc>+R2Z1`fj1EHV!E +IaSt4i|2l;xUg{l|LultAO`y{ue%;e!uu#BF0Bc~Ds4>FbJ%;brl=;iCLsE|@9>(p6yui<2bFl|xzaj +U@HV7*cMN$Uk9QqI$-sB;oN5c4g-2oP{j+)IFs~KR?FlI9ldgce>xnm;wrdSls=3tKD5LBGX-UW0Jm$ +mdNH$70M9+ifRj1Pn+LMKwMExe8m^xTQ|9X#W*U5$ED?WFicww!A^R`J&pg9DT5vi_v6=)zC6T>juk9 +6p^Kt7a!8q9w-+FD}0?{n8L9Ee>^x>+%p7^E^M5bjd7uvm8-vu0R2RE2uqf*dY +ks=&wL{h6Tsnw*DON__h4O5I&#(5@b?qjHw5~Vsn1CoA +enb7fejMZShXs5&NzD@eP7$nTR)GqZV6W)sT{0F;;|6*ox?Coe{i2b`F0yvhI!=u7MwxZ)#TE^+vBPU +xA@;A4~L0Mj!a0VKIsUiCmw`j95m@TFHZ5W_FU-7G}`ZO>TKEZT(0Va7(8$nxKKg@YLHj-R7;8rK59k +@sMe8q=NwGIXN*ZF)FhgdJ(FjxVP}F8x*M<~pMTmmKvrJ`4@rduc;sZ&Hs%v_JbZ7?s?>m^N25zRMgj +Tyo;BDt2H}%Sh8!6^duVTK0qE#JcMW%rAwtjg;Y1A3{?Zba3I>B^ZR>_)Pd3-PWGG1GSZRA)MUOZwIN +mQN+gPxg5i(eE84Mw~-?2$5afhkNX31$bc?ekVY~e)DS1?pe?Qd_0Sxt@4;0eVo6x9~y1i(pst}Iy&- +`U+)LKF_JB6vuk_~0czgHKM*34jwzDA5~(R8#HrraF$}xTwPz_)s7h+n@dx9;Y%9JtCaL|WnzhNr`nWb1 +Z-qQ6o#iQs2@>WwM5kBOyomMEvdEGqI<&~PZ!BpP!iy`Xq(0n@MOs4)?4mmN%?S#5*AD}Xhm$jOy`H;TA{*-V?!J+talC*kGrreagSgag4#o}-$ +-YwdDV3W8Qes#O_~L1b$CMotHwDYRkWq)N;c%^VJTg@(yGPBDjN5p#q0;P$1FTnlYoT;ZF|IQ3a{b7Z +cg{}kB7;RABVXP%;rt(L(hL4G_-iET+|oR{(;GOQ?+)Ad+3FZd}2%}Y<|o}%s{8i7M62}tt9_qZU@;4 +?9@jm%wVCC3csa2ga6;p`+ZFUE7ir;&rO;$8pZySV-G@$Vqod6I`9W8%8#5qI=<)>8n-7aL^1IPEWXMzMQKFxWZZjHC!NsCKN&Xm&L7nO6J!T&1q%~C}i{*v%pD +lsYO<93sw8%WXT06N6>wyiVg^SN&-e1MO_K2~!=h`HDeHV*`vagK}A3ZRaZ(6|@TG|86BI1rY`hhvcE +oj9k{xPyhnMMI{Ohk=3q@%I2mU8<|CI!!)uNocY69sHk(tuCaVmY>P5u8MoZCx$d5M>*7G56na +VVg+t9#H{3kT7dkC8e6EkF8w>M8JM}~7Jn-2-gjH$|xeiyJ0dN0Mo?eT=4SRan;m7r2H>7#OJvmd|i* +7m-ZbO^y$%i;FZupcWH?zw86FN8JgIx{5+_!zNK|e-L1pRP)4}~CTXz`&(2)XYNfCPHVf=3@Qh +&5H=!mVU#JjcxO>z13%Z199p;!dn99ciiI{%og1UtzYKCE(-|R#!`RBC(8HNV`qQ9?g{8<-Uz*1=)o8 +S7rI7k-)_gUnLUZ2ooQc;u(;3s93H|*w&RRi9_N}!lP86d$wWVI-%9jP85Vh(+%ru29ky@apclu%)Oc +X*D2VzQ1KehdN_{+iHZr20H&weM8z(;$yTFkG$N9y;#lDYE;+W&K4DPGI$KMU;z2hUGKcoOYw8d~>2l +>&l76Qj?@6(V1qaGN!9(_McFMHg03{pJJvu@jc60U=R6+MW%y23%ZV$1Sd3CU)!8n)5<9QUx-Y&e7az +wNpF8RIGJndYr~V7AX4R!8L*LlzJ76fyKt0rJ|Yc?cv-Q85@JBKkx^{6!y +EYF31SJxGh=qc{6mbspVyNfH4R_u|qx0tSx_(Mo@NePl0*Hv^D{Pd150PF>1gifh@|+n`!Tg*$@N3*g6uj@K{p}p$tN3(?7As7@X>lEo?pqG9DTu^dxEEV +BVJE*x*-8ihNdlRwPa51^L2ji#Yp1!+3bgBvwuyK>nD?0`|B4^W^`c;hb?(!-VsG!(%b!J$`bXj7GZl4&A&66eHZ>R2 +DO!tZnA^FB-|F$(16y(N3PIWKPZ)n085`X$2pbn=$P@QxM6bM{=9YqWo5WmRHtF&0~VLUpXp@B1} +=+pe-af+DqY;1sgRy0gBL$fXFQgN6^jw#nC@nq35Q&M$^?f0myjm}+a*-fiYqS0(*Ck}U~(i|g@&NIc)>v&l$_;7V6plwA!d+Gq_ixAMf_ +Th==<;g9Zmk@`|l$@D5UH|N%RRniV;AjXIos3q8FtDxd-HPnM9%4$eE+>CmCW3VWYPrePlqRf58>HX+Ag?{TjTUP>(r`}#Do8rH^?t0IkFQ-iYDtj3e0}laP5S +!Pn?I-TF1o3d_x~-1!7qRHWcu{%-_Ae(L-Ocx`rUW`GrKl6f|&=LJXeap;E9dDWVd{d3U+nrIJ#naug +Q*myu^q6zOpHoJVj&rkNoXB1z%eq%F<{ZI+dM>a(HW<-_?cLK>hgnvnZC-3K$AUde5*a(`4KpLrcqEM +Gz!gG+>UzOsO%^JbIAjH;*@DBrG$nQKRwW$B& +2IIXtb{hQw~xJ;S0fy3m!neOF(L=YG>(OO3j}zWXm=H3OP5=)i%YyMsBG-RpLY655$@`ewVKAfEg9zR +cAk+vTynIFV?FX);_gDyiglJCGszH0t=B=Phhn&zENN6DEHt$K{RXBJ4!tAhrQtvjK`mg12U6J3dAlh +eT#dl(sld;$WVfoV6y70Ve91w>?_;+5t-3_HFQ3YzB*h@s`-Ebf3_;NqZZ2lzm{%S$4Xw=+eeMfv|`V +InzMmo?}SXv6$BUosX8`?T86RfAYUjO9KQH000080Od(0O(NR3d6fwO0HYWH02%-Q0B~t=FJEbHbY*g +GVQepKZ)0I}X>V?GE^v9hSX*=3x)FZouR!GoN~uLP?esjTB@@Ttu#{Xq$st%6KicmuB)}$*i)e@>$0*G)-~((sg +N!ojYiSh=&eZ8b>kW%(^RN!t&J1e%IdOlGWG9K6vnmfpOQLrx9w|PW)9PB+jpy+?4I{_@aP@#6Bi2JI +8|D4{9R$+5aTf|#sWbU+4(ndcm7oXEN=WsB6d+}MEwbLb}nC4l +2D^t9WN0@muiK6K3;{D=kk$yP;{3A3!ESAgjzbv2^$MN5zt6OEoT9s1ZKlUJ(gM|iDkmwjl;wBXhK<@L&!x5NrY!d@hcF3?1#7u3U{V48m5d5mN(X^)QxUx0$&EhBU*tl +b*~Yfgf?5{(m6_hJxVnioz=f94lbPp7s+SSRg54K70&kAo)eBs-N*xJio9Bo7gF+>snUh*4U|tckzTs +-!7u|e$%fTN_e^BCmAsbh?u6TRJBQ)s({YDGOo!=S>2D1fcPwN;wy1w8mt*W${17#%Cyf4dzy(}|5Uu +oN-Kp1c4nun1Yw5uVBF-><##Yq6(Il(fpaY?O_Mvh<=EC95qn6E6HlG3GDaKAJS+7^HY-7il{26znkI;bSfjC%{&|; +8Z+mcmH|fF?_9kW%+y_&i~wAMlag+O4j6o9*PdZ1K`VYCRow!^sh%LRP6LA4oKzrs--WVe*CwAK +05m&l6L+1?D_|fWlpA*=OxG(I_AB84o#E`u2bnj_Mv9D_{PL_K+LyZ8KyXDW*o9 +=&*_u$MO`T6FOEP7`WrTCtloFv( +N~qpCSKIjv2)R|0-$|EfvjJ@N-v3e7Hqy?1|Ht3`Fzakg{VB6kRpr_cpQhxLg*{s17IhM)rh1MGn1s$ +@Tj3>sOQbE@@PyoXSe%u%ct6593^eadhIirMo+C-A6{_UH`F&)8>% +Ha0)gt0gK4SN!;yC^l(Ew`+Wu&(Px&x0Fg;@$10sWk2FreFI5)0apbcVF-*jCa=xHo) +H|T3^`G0=PG`5Zi)dn<9eWoCf&1U^nWmT=D16UnufZywDk+r%6zxKZh{|8ZUZ9klEZ?UVu@U=plpA}? +KBYl5xDwQY`KPjB=keniPP=bM?)eYHg!3Qa^S{A{hW{IIlK&SvArWhna}}hCielDSGo#X|q_EEc30+5 +3WTpsNW^G`D@?qPM*kI|rw3M#c)UUJmYDFn~_Fix7jO~zlF1{(TzCpvROPQbnW1V{?5x`o?^TvdbcRl +~%hQeA5A9i$1sG#Y0?t1<@e4j13LhNRapEw@z;ril`Ed~fvl)Pre1E77MaD=4Ckk-bTkV@9jPY$ipz& +LRJCWS|2Xm3l{o5Ke1@Ct&S+Pi?ac;=LVjOfpu*9S;nzeO#zTE}{F$OmV#l$V^D +4ekHek>zmB@1wc69!;kx!wHIMzTS*(zJ>0o4KL4_@nQ!YB&LtuvSi!f5c(Ef>ru*vi^H&dbb(qJvzcez +Er~^ofv=;0fhZ4!9giLfwg8mznfK7DU0qrzmoUT?77o;)fwR%AG!(~t3)PLLb~iua$T9rLejOEz9-sfgxFBG)6NA +0lqN7TNd&hir$Aun7%I+JS-H#h_7(XhvbB>fAs-|4C%V1W6?&vyhL!`a(bR^nW7tJ5d!^{M`h>}bg0f +V(a@<<|0|h@_!C@V@?EFR(tyd^ug0S^!;16-M0;v#G_7IvzY+8T}r0uO6FGz-DwanOwiVIRxZb@6aWAK2moVNGffl)=M)$Y003Po000{R003}la4%nJZggdGZeeUMaAj~bGBtEzXLBxad97M +|bK5o&|6iX1Cr^gdgr*;IoSdh=8`p7D&7`rXNv`R+9v(zO5@L$v@nKt+$#=iq1weuiIZp4?CJ{kkv5z +121&zn!HzE-^F9qXC#O~Almfg#8#jY-{*wNt&cAl;?Udp+QWw~J=__FZFj=05d=)Gvo +tRmpBHIdl_F5jqmdquWKmY7j0+$CHluO6T*_o=9nhH0{p^{RWGCqSf7EQM(ti +?EbwQW%~t^GM_(dM(3-pG;%P*E9r9g-pp(WNK@@lcASfUSa}S}f#)C`Ka`N#yL* +$mYYuw>0JkLBiLdtI22-q{TzP^Kca)$y1P&$jex`x#RlJCxQD%)cg$t4y+nQVnG`#1q63Icj3?EWW?Z +8<{R||Ke+(AB#pBCfn_vVJcJ@E+3fNn&(oaof{7ExcG#>aD#3OR_Fo>=M2)6>{Nj$kd>#8}E?&A~;;~ +<=q?Bv%o0>G~vhprXge3x>&vOJx>}vJ_RKKd3_)6SKfMkT)j>TFeB}bDoR3O0*SI7lh@q(9S?t+{ibF +xjg3GPHrCXvY^bta8QvJKJ#T{~IkDA8k}04sfiJHIG-UKR*{*ZIuv`0)DAn=R|vDZCA1=?txs^{#~&d +LQcdT3zaer7(O%;rjaO=twJ|QIlQ>n{+@hw$zoRQCf~CMzKj+HVXk49g~rypvOiKYZu4yKc_Nr*F1BJ +GWS~S*S2vdlZh>`nJ^%-wWcdOs^6Zm8_Qe4$_g~Xz$C0H1d|DiM3|F`0GX^@3AUC=niH*_x_bER3%i5 +oBm-erWtkNxdwWZOOf|D!|qvdyKG=LknOubxKN9n5>5k8d9P%J>L*_gyoSGYt +U2Qmr3c``UJBtuv`Tp`K#F%yxN-3MN7{7d*!obj%)||F86-9dg +$Ep-Nr>m_VWB24BDIgS!PIW>+OpA_-=N7`T8PwKl|s!H`qZJ*O&@7+Zl)9D@1JVb2(G+I6QMi#)dWSY_e` +W-~SZ>02uy3Nt!-yEf4EZYckAvm}E;!F6C7#*sGV?n1R97mz@O!gYK+Xn`|nMt1ecKtxj%D67QB+~kf +@yP-f9L0%>3(SzyX9C*@vTcHpjQON%g9u5zVULL)g9v{85+?Yx1`hF~}^1581tdu$TGMOGCzp+fJhv4 +DWad3R(SZPHsRg8EJi&}X_yH4`kOla0s%*{nCz=1Yi6bHd0SHdEfF4!+;=a=t4fmgYDd-?k>7w9O8yW3Zg_ImkCC8o|N&1r7@IMuq#(vL#CBG1q&;PBS{I1!<9^gZ +$%Q~*JFWaUV{DV)EkBrEb9dXB%M;~#RgnHRzqeUXtt(z%En6XV*>G3446;D$XHHa9XC;uFl&>|vhdGP +g=OQBr2_&FM2!#&z%O6b|Bgw3YLQi5RzDrw)H>6G@32pwJ^{UTdM6stKpK;YBoaxu(NHg{80*VNVfEw +#2r4lYK{OlYPf*Mbn;tS4GjPlDbeZ!tbM*?uBWK4)H0LeSo}6GE&Wcr9#fb3OhNDctH^njS3lt1-T}4 +N%uFVUK;($_khX}H4p>?ALk;iC%+e4@s+8uysYo2Uq?m-ahrU=yQTErc82@ER6J>m)(W}u#3kZF%0dA +q)_PBqn9kZH6v>a`gA+Dqks;@}Pq7|vG$@>xt|GvFHRFYxF$9J6&ARk7&z33NB3nc3ZDo~E(ey!Ho`& +}t>PGonfT1dp9Tnj+^_Dd@R{ho8`XRgk~nh_r}s^z%!{HeF7<2b`i-4~+qrzt +UZ5u`^vgs4h2N^Gx3zuz6~7afL;;PukY>KH%MRtSsdFO=SCwX}mTV4aubshSkP7WlR2gap(5VPOTu#E +ciV*!vP(!B2Cum7!D{!n!c_$KP??v!3P6n6A60(&lC!=$m8-gNQ9@vB-z40l#zER4gP^lR!NU)ArIMg +!R+cdpJj^RWhdprX-6{^;Qrb9qfOla%qLny$qkWg5}zzf_-EUo67x|kM;e=l!kCL+oGG+*xF)86I#;M +2}OYH}rREO=hn(GG$#wxD9vOAKrljKBrw5ZeNl5Z0oDeSe?rvRP8*a7IE<4)|;%iQk@h)SGyG +d333YZiNKmEMax3X(!iw#eyEe;F2X=Wl1^KNMLAxacG16l7Js`sU+ofL3FQqQm(M;QRtzVx-v~+8EAY +m?FPG{V`(4K)X@%WV?}E%AncPOkbMf?7(B@is~CsU#LoE{xYF_$ej9VdyBsV%$SQ>#88 +#K~)GT${oD8Q@w6*C>11b0Hw8Du4v99v}nm(pr63*53saVkCBXs_cVlT$fAY~(wMB_4=UhYT8b0)0T0 +z2<2t7Om>1yg0E&{|f_|t!jer`T^-tco2Z}I_t98;ke#9G5xXM$&aREv+>mkR(;4wqzD*?Mbdd55<&x +y?no^S{)lUJc)MwA8mAzOQZVMK3_9`d5n&CD>P@>_5o#w|74!WIGeBi)e;op#=3x@)!ro3I~FnR~ELj +(iIlNYkG}==5Cb@kK`?C +e+Wj_4UKzUFL1{TjtwbS<>sEsrYBZ&1KvO^k7-VmHqq?%G$2Ip>}e{a@6DSY4w36@exuXyZ|SI=6W~V +$U>}2561nZ9e!w`bwx9|5jp=CijY_`1*H&##)Qr)n|Hi2jiD8__rs^`aHchj#qdLEFP1rxh`rLys)0a{{c_s*5m|I7oW`?3;;Gd3{sc9K+(!Cs1EI) +_PMy_gt*McMC1wa(~r+)*fJ=I*=#f<6+;@|ZGeGg&u-)%w`*ZU{?H%I~=8Y)wy3Tcd9xS$LPulULL4q +pA+y$)>l(QvDQ>H}e?>x6MHpGT2v7MKo~#}2WBY6fS1$6DNMAKA8rRDs +|jbc*7PR2X+=vO)y3*cv{Sn@^?nx%hFyx&*y3ph|GKMUY^QZr5=*TgNcc4Bst9GzrkGgT5}6OSWIfiY +WT8gpaiE2!g}#cT?xaVcRJZb~MfXew&x*QBXVLDjvkUC*J32*lg0L!tQqEOJ36$gNjP5x*=w5@^tGU5 +nyAeSIh#%_cTY_$()o^Oyg7Q9tLkO!UZK>LAck|g%-~sDkGX+bY#3{A;+`s?jF~v~M((bg@2-I#-UBP +{$0Q!7hc4+16=$Lv8us>G>AH+suJc?sx3yFA>TdVh)r`5+Jg=|6!M$$CW*FI(W3~7uV}hTObY +(G+q?_9EDc#GN*b<@t(9OYuH7ZuoOm+B8@&cKU5~C%Ac`KW+aeZ)d) +Ab3o58g0H(>}p;%mkdNf7m_O7Tqt-^Z?B`-FLqB6*12RzwN89*6kGXIpjdBvvPwz-8e(D_uw)8mimWH +Fh&!MdnVYf{-5#AMJ7C#0&>eJ1tTD9CPy(B`B$?JavtGs02tXu1H*!ZLWK$vZO*U{LHgUHVUNu#{3+h +QD+$>Rp}C#?os70@`zRjG&JLVSM|+$d{2|E_kkL9rs3L($c$lX}v1@?QfK{(`3A3LuDWhNbP+rk10w& ++j?J&c`x?19oDP?G%6f~IhY(R?yvVZ)^Wo;14Gd#h5-WL7oqa*2l`@2!`h?wTe)DRib?c!JX>N37a&BR4FK~Hqa&Ky7V{|TXdCgegk +J~m3e$QVaxDOWtiGgh>Rs_g~4ZUFp6kX94*h5hmicKf#Ig)3|NsYt(?<4iYmYt;QcAa~yv3;$fG@SoC)MMcVuXtMkSvQ%x*ZhE7R^@?fnH5L-mKr4Bj!Pf# +BBb3xZ<3Vb}>zdQU`?gi>VzDTpV!6v|s2Wv>+q00FqiUQcD?^dJ4lpWZq{J#wL$uL^ +Zr-%R!JC)Og=~8GBR`ETHYB3Uz=JK!qh#}4HTjhP-cUHX`txI8&%l!F;%&s-0M4iExf@@z~`F=tWbtR +6V(7Hs(wUq`>$6eAVdpCkcOS%u7wB)w!{Qq!vU!7P?ZW2@gVY7GuJQ^%vKZW5NSyAju(&Ef2-RjM_-Er6pxG}BEq#C77MSizzA +dt`vRG+vBB*+f$AVnqE(Wt4uWZ@XZsh6XY3EQMV`nAi%e)r-f~(t>7Zg$d?_Bv!zTk_pV%L>au()*?3 +AenmKr*62Q`{hO1C9j3%I~&v`nUQfJPrMf8h9#G}!P!zFn9kc1^G0M3VCk2VN`vaG+D9y3)#1MfAj)M%#qGm-Fe|T0sr%NXGn`t1BdSnAi_8H*6HhD^(~1%r%_ +lNK^4DhgP(9NEp!UBy&$rWN3*r7|@IcgS6s}M!a^z8}^AN0?aC=1+Fb&*!z%|BdW6y3TXo-A4phz?e973m!=Z~@bEpBvV-f0(TyQcd+lO~z$EC=bo&+tO`8l;+3;=CC`uHN%paQL5I +%7CUvb>tsV#%p3$ykYaWA!`rqhZ2YkB4&(WXViEJir!gnjqEMlS5V--ky8g+af2-N0ac8mL#eHzdR7OsrAhln;xQPPg$sG^UF0= +Z@!3q3n?yzRRAADOy7F*5c$ZA-{)oQ&^K#t{hGu^cL7QFkSjk)>gp%w~uyIvOH1t(3M)gNs;9mi;3$% +b`dm01~SwS+A1%f)(xL2Ai=DYB~^){E;?#X^B{Qcs&6s4b%HCx4!^@rr!e;j^M~n7#bK*xavli+<1zA +{Ok2!8}=Sf0?v-}*G$mQ6L^pzUutEGhSt&1CEAHBa(%ph_(^ZCdzrlgB7I_q61%Tl81#zS!D7%6K~uw +>6xl&eJz_rAVHfoyoR@A_@!ZOQx2RnCU5D>PEexWrE(Ca|vBy$oeaQQ4*4#0lno8Z +9$J+uqnW2FamezrEEgCcj1oE?JE&VC|%fe*sWS0|XQR000O8m=Y&Vbqd>F=??$^3N-)#7ytkOaA|NaU +ukZ1WpZv|Y%g+Ub8l>RWiD`eom*{><2I81?q9+6AZr_ID|f(t8lZ8QO*Xgydy_#jxeJg43N6vL(z57? +a(9fy{`Y;VNJ=C{_jJw(dTfa-7VGt?BC}jBzf>31)vBv*;#*~OdmS3xEfyb7O4QSi*ZdMKC@K6*H*{<$$qNU^N-b>FIR$)!-gSL$LJH=>sqS@Ya|AuttOJgL5KYO +r$M@1h+~d>6c@Xh5Tk-^}vR^k#qnu3fzq&rN5RV*L!Z6s-V;YwQb)?|UWd;UswYX0co@7mMb6(fuG=e +LObZadGJN8GCJ8hyW}b;ojHkAg}FELjrb8GpK&hx*bPUC)q%4{1WOZ%BI7RPPWA;fN|`aIscn7!~d$@ +;LW?1Si61QnE|>`*u|HP8Tw|=8h@{cuk7CbTbk3~`(F3KSF>em-*@JEA?m9Ba2rm#bELP6O^zu@w}4K +u$h8_k#Ix2|7D~J?X&QaW%?D$xDV*4*$3x(F$vw{wZ==yzVY0E-|N6O`bc~81HB876Uy%9*DgG33;t3%7 +cQYtIjAGN1AG4GQekMn+=?YR{H{6dh+|dLlR@tc);5RRj$SVRWhueZMG28NLs_nkY7bk41a*@+DiaN(_g*i5GHo+PTw(1Tbj8t3L>CbWdzgU0o8>}9R +IIBrgr^nsf|!(P?2r}nTZ#w~Bgfv^bp_>2_AUz$^7WWJbIp%GqiP=)^*53pjyYx^aB>4c59?%PEDjd= +gf$G^W7A5REt&-&Wd0m404Kfw4ucEi)%;7qAsKS{g-G8dD1$a7eU@9*#af3H0ti_OgbU1ytaB3S1uGhggKFLT50nUEVmp +-1^F3vH$ILH%!0mx654tk60!QOa=Fsk9^3YzX$g@~L~tbl+uMZS3-LeNu&JE_S^>UCZbfZG!HjK;!pj +N3o?};YhONOfW#~I^NVdgAU#^s8%C_kq*BcIs#zn=-W{SOnFyMZQ^EbO=4J#*DU;=7;X$V$!f+&gMc2 +Sf41|i;A@sB@`FIne`>j}J=ii<$rfhBOUvmWhXo6_FI`WX6K{2;>)%A^7DXgwQ8ADg3Gx+xKMQ`h0_v +zg6}pIAjro1>~3&*rS*A-M|#LDf(CHV{=IFBC-Am=Ks33^N!Lljj0Bd>x?f#*`k$IA}R#)SwZJqqYiokaan1FdF(r +YN*QI1q;|WP{=U@R3YCB_>^NHZjtJ?a))e0)L97u#2nR_5GSd`8J(OfZ5o(xTXHXoBHZ7VtY+Icp<(2 +!}Ce;;J`nG#hay`Iy9nD#Uqr(>tnp?@g5kLI!!&~tkGB5%;a0oV?I3h<0mpdkH*$Uk}HkS$MPTC?Ry2 +r8NzMyF&jd+kSCx?mzk-U)J#%Z=BYA~wuvt21oQV+^ZSJ6=Wio&X+>FjhQ$1%^Z+aS&iwmfe-n2xL}e +T5Zyljs$2iNpg|tCK>&+q(nM2uE~V;Zs8_-WfB_&AF2Vwu>}D(jD|jj4P&TcOjL=Cl9xq`txxQ$PQ|# +3h}O+bj~e2!Fa+R&H|nzb4pSYA$;~znt- +V^kokk+drb&)uml}erdd6Z^-~j)A`8c19w_QW~ +24{sJ@C#rm!B`97^>&^lsMk*t1E)Q$iuM)mN%jaMx=2Gv}uy&H%^ZeNqe=6J&Kv +y!&WJGu3CvT8?pmD|XC;wl8QHcWEYpK3ua5Sz9cZnkIWNf$zVg)xK-cZ?Hb6gpKZ&&o!h$X$A+LMLDk +nCw3wMWdf=?^(RT1~p82MP*f2lOsK&Kp;A^Y?qi5vH1!V8I}z6Pgrv$DjmCm4}@E?(C~$p{CsI@R;iB +nyT`n7(_xw^K4}Zr%MO?gm4Bjo$5HMaAjisk%>mmF^@kylJ_W_!u2dHjrwlq_311H!>NAw6d&s9WE)q +V|CZ8#i@1Ozq5Q?ug6P$sUiPHa_NYxa=G5yyor4x&O0s8-IHl6@Q+Lii4osvSmyJR5qr^{TuhC^iv{d%y`0Y+uRnn8Q{AO9X&n@ +i0b+XFhNudr4&IMZh+yTM_*Y?x(!KD;1XvtTet+HEi&99RniPGV_CMr(UfTkm*riLBM*qVgiXc&$+Vh +R!ASN0t%Hf{d*V(q=(xFjat(U1p*#9nvmH0Hw2_p%*l03a&iAzFoF({4r}Flooot9sA6> ++!>{}~@#&gp#NIlT03+zMEalLJNi6+dGN3IzyPDgAF&JP`EcPH&G^6*-A0>uvUj3Q#J86E!8>pk4>CJ +_5X)hgL3Ds0I0r8rz+HMHVE(!p;LZkFuL6-w+l+=>>Gs}|cZ=Y4+v?LUG^m&YTOF&8EMN$iLsiP^De- +sx_aR#$Jt`ptj-b%rcog=v3#6=r?CJ6YkCXI)d>kakl?qnRPVKV`ZuX?Jy;ogPHp8#g;C$_%9KkdqV! +f;cOJqAO})t`dI@e-Vxi_jw0U-A%j+YMQlt=o5Bdv)#N^lvh(|E7nk-*m+xF8?s+FZ&!JG;xn`2Y(76 +E-h>qo$IB@C1VAC|E@lt3UhY+VaE;^<8$^(r^pdXu=^%h{dX1!sU?STL`e09zEv2LsZpDqNj|xV`-G^ +sa_}YUn-+uQ!2T%BIFjwz6Sgn2b-b~dA-2u>*vK=38skcd@$+j!6xSh>1kY|scP27POtD|mtF^iA8F8rJAw5%$cX*OU0fu=MmG%f +BccUtkTZY~(v6%<4q>i1v_m>nNqT37ealw6zhxEEe3aZ0j_Ob`>fPC2Yk3%P;r*W;WOH;|Nlt;MpmW7 +B%mX4hs`Hd6ueVm$zb-uNP#fRkgd_tNI5|u;j@A14&OR4Z4~s17EZg(?r5?>mWr=-8SUGz2^~7Z1OT;t1ZsFvi-8g#bz}n)MJjaHCyH$6< +dl|g`mkwkavhVEJEdPG%`a+z6L1DU$Qo4geZn87^C_QWGUNZ4xz88b&Mcfe059R4KxX$YEzRXJ&&t*> +<|FCjqHwMD*JFMc^jSJUL+WK}@ttJxS-;HO?sK2jc2)eU>9je=Rwh_lDWp%%4TG1-y(!yrZn}5kJhLR +XqS*0E&YtekCmfJI1T7p71TALlyeMCvwdiy +~<;2P-p|L}uV;M){hzsBS0}K!JKZptEmac>PUW5blP_S;>0%!cV8&QSI?6d)W;t%#cYP7@XG9i74~ +Rd-C_)py9K;(M_HXrJ1x>op|Md%y@+9TTav6I=dNTPhSLIuZO7?AIp#X +4bqxj%ylD5;4Cu7%%t}gMT=~5F#lueA`sX(^ieEc!JX>N37a&BR4FL!8VWo#~Rd9^)ja~sEz-}x&h;Hh?D0jr1YT#6T3CChZo +iX^H;DRGM8Z5F_Q*bvx7_CX49{NJx%^V(fNlJ5>xwus%Co}Qkbo_R>-9*@@*=BtYMae(vm1@wHd&J#jR4fLDmN-kmu=HlI!#r+A;{URF4t|NQ~r +K*B+uvNdadV8UKX``wAtos4LH~*^_}^1mDQ_tJ~Lm}<;@KsXTFwovdx;6`C4i7SG{VR+`@wiHumqG9r +!-03IJB~9A;UqfB%iazpd7Fw$$nD_uuGZUM@5@(wi(_!m-!|DzJ+5)k}zlXZ&k8`~xHZYyzBL$yx=Ee+PomEv +?P2kZT%xLjfWW^tWQE*}t^}eW?i8a5O9F2#@S(o!{V3;@OZ_*#mUY@->OJ6;I`{%Q_>5u0x&t5-&bv9 +ABAVk)*p06~FH4K@WB*KsedR{Da(WLNnf0s>O&qHir#nx%v&bCzvEK*P4!4|jEBCVT6*)|iUVYaZn7C +F$P(%B-NuiE0aK8RYan|9ljB}{}iwO#kKckkc4ySR9HnO^>M{%SvfMsKz_r0Mt$zW +rv#@-`@N!eeu)Ti$AAt-@kr+{`yb*d$zghRc>{W)&Qr#os};Kz?=~22v#`a5BVG@_7YZcqArNXfS=W| +D$0LmC+f#<9zQucBDt38kBvH2QF6apM@L70IeU9~e(^eeaq;TS^LOXpzdVDN@so*qJU%))!i9!Ce`-W +fa-*A<^ej$kucawATj(V$5K65Wcf&-@fCF!9*pR1B)F1z-o<1Hk;vhTU!U9!=im~-X0b}1Zt1-!B?5f +%tCnW+fsaM(4Z+{<;QRZU*6`<06M=ux-ynRex?{oNq?@MLPhYj8v)ce<*9bAUsa<<;YB^+)x!n|iSZ?0@;yeuv``r!$M_iC)*b ++cqlnJshz*I#E&7>lpc1(^@&SfHu%-qQ3g7SeqFv^N%SX7qqB8M{U>HT&v^XZFkM8EO_;gfA+~`GO80}d7{PWN1?b(Zqw?7ca=^DVU*Q(HZp_)?7wBkix7y`<%oa8 +k^^>IANkvyf4!Yvb{F?<^1(4<29CiIX#L@&&#SnDDSklHo})PT>73BR7y& +r4!4$YHs`2z!a#NKp$VJ2hxZ(8F$1h|F$3JHC{-ewbi_e6R1-AO@PiJQ@qcO1-z3gu%oEq`EAzr@;eq +=k)R$Z6(aE@9*KFkU*Kkjp?M!3$?yq?M;oTvsCaWp&-eteeozVnu6)`5+jg6>xBwlMJq&OT8!-MN6`# +ZX6ogyrZp@<9Lc>jaMo5uxu^IcT7@T9hz>nVx5Dt<|nGqXI}lTVJb)&1NtH|GW`L4*Q{F*aV +gsZKLABtZ11Mic2zt8!fWx>>1}c<+qj5srN}ReKv-t&x}n7cD|qY(jJ6?C6YLt@T-%d)0s0Loz_89elwtd#P0zy^`48Vv5X7dZ6E5686 +~)oCNAJ>}4&hX;+;G=Pwphd-JiA%`s_`U=(1iti1a<~4BhN(a^IXgEfGa1f#w&zeh|O^X6kAtr7YnWh +FwGqBjdObie8(ak2o53(=HCD>omh +@%gWo)#*ykv70@g@S2dm>ikAdP7U0+e7@)cIF`j~YY|Zqgr(AQ3@9k2m#AN|p< +UpD8H7@kL(fV_f2QbRFwap3eA2OL(ArBIcIk}dtp4R!&~iozOF`2c%y|bmG}iY4su2>*%7W@Cn#l94G +MiCOrcXeMKU54M(WM;ha2asG?tfjaWBCjm{I&$tdV-sbJ?f@m9)FM6g+B +U~V8P>2iaVaF~o=5+gjp+byaYxK9CDIeaDxwc+WsD5v; +j%5<6<*R9NBY2 +IZLrs+#$<5Jd6(HhL_FR&VE!J(N|LIIzqGfeThRsB+%8fq7Z9E~%nExC$lD0cB+fUI*!i|f*Z|R(af` +bko0~gme|9A)-ZFV`j%t8`mXM>BYAC(Y_GJ)n0st$;NFC_507{b1PKHMWr6CwisPiTPu6B^+EycwB4! +g`+-R +#RMqkC*d#=cKSoV|n12$Zs$Qmp-%KUKqDb~|?brk%)8%sxK)d%&S%BAm$_-9f4O8V@)@ZBsxL3=G>e%5Olo&{ +5wfjl|5 +r@=gVWGhZ=YhdYaYlo-^4^L|{)4GyTuCXJ72;7D;!;mXXAOMXJXSG<;&DZ5@rrmlkDAWQX5lx*5#wb7 +p^YOtfMPEGfxtJz_AF~%=vng4}$Bh%^#eCf^bVP)6YLZwwa7wi^6nzufUhGW0&(^nsR)^6MH5Q&|X^} +=L&90MmUqpu9Buy?_&!(eOnx`#*dl3mC2WM7ro6s&|rhGC6r4$UQ1&1r51cmxgsA66gAVu3SOo7y(xe +GP=-4IEBc@TY|XMdXy&jQu1D5570_~*=k&@o4r(X0lB-8)?CzpJ#*!k)4GceZ>E8 +s$Ij?b^GfsC0H(+~``3!zf)2m{EpSJ;$8*-9W_n%Tk1;}1fEuFft~y8(rWt_5F&5{9Cs#gqheM23Q=<#qMpu>+E!dRx5I +ppcz)>-4DN{;u5GDhK?uOijq;>(vtw5u~tR_GmUar7I?n{beaZIaNCpQVJyxSc{I_er!-c?n$H(-wg_ +MCSGu-Xa~yxG@7JaGxfoMvY{4QGJEls21e8!gaPW@0z6;BzvY1_0H&&8(!TW!`X*o(R{SX`S~e4UHbK`n{_%7yx;ce}6|(-&?qhx4`o{qf(!%$`qF)mBf*Ef~b`=P}1F|7UzXk?aHLi +2*?eXq-2-a8)AuJje!vh;I}tWvKZ*Kpy~QA>hFCrbWApMy6ifC!;WcGL547IEA&{cckDnai}h{*lxU4CDnQ0;SasRpUjyhiEXOfR)ZjX(27zFJO;~~IHc_J%f +sGFEBEI*Ob1-pWgp{xWJ&V2&LgPVdoCEu}6(0gHQQsX-TbjbJ*uod2d-k!HxUy%PWpmuNZlU1O&*{aV +_ss6|2!@|6Myl$XobSF1u@8~Rf$2{Frfl8hGClwK{pDN#>!04f@xNZY`)Lr~FeZTRd<6q|E8-zHumsN +F@8<;x;mE|Nr1YMTz}KxRlVXh35OLe@3#U<_^evp +3>PPC&F|UO3ZvZhS#}>`xLpV=U4o(fS56CH9!470r*IpBP8AS9s$qES>#b|>PRib?|N@y2hIiOIhncCxKaGd +JtQlk`xH%Qwu!<-tUXy!GH}j$s{T$B!%q_x +r)v)JBLIdpgq5oUQ5C0?UhbI?K!@J-Rvzy4cybYPIZ5-u{wI9?L{fq?E7En6{ebmH*FSS;yrrFjfj~? +9s$G0Eh}RIEk}l5A~Fkz +-JvjgAEiw9&J2u_HyS9>RT=H?wwrtDB^(ZWw*JD8f^C^!2xoya`xrFxNQhrJaFXZ}W<5F-Fj(ZU|JiM +s;ncVv`5pfDmY1J>p9-e(GZkB7zV6kmi^9W((qL=Vx58W&e@YKu|z!-kXv{57V%|XOqR?3-ksF4*D^s +7c|-Y7PH#szY+Uy9{r|nUq7;kSc>PI#KbWE8q+rRLdX&`d5+@8RhdUz_7gdJK*1IP&5R#UQGln| +e;dY`PFyjJa(BD(_oUBU9#2EEKIfM)=CF;e}lEK|a;w)>ThAtirK*C^K-4Kwvx +TXs^=F$rtY-zg5@*+*;WW$7*th%|wixZR)4yQ<5MX{{y2jG(XXaD|y>eBexf1qa({_{GGEfg^QoA^PD +G#gXiosAO1KHTbgo~=3E2OT$*muNK)w3@BNmg^iCTa-v21F>=vt*pA`q*x=N(VfBBhjEQ#Eji>k85nG +gP6Yvm8T{mp$G50?qQ{1$s~TB6Mq#4q6k$G1{*!Vy+#QW$1)Pnq+uMfv>%IC@PTxEmL1D^5s&aJ^qy;Fgl3@$6him`J-k4wkl!IBh +4+rDzrvO#yKS1bfB-uMGbQY#9kTbPm{+mx +S8Z#maqL2@4OIP;It)@Ssvl*TEipr+;xtpE{u9-kj)D-_k9?%_hTnFZaB5u&fLgQ18&q7IReVoBVIh< ++&t0A#D}5DugPl*8^J7>ATUmXjq$zc3*NRu9-$3@ECzO?VGEVAkIHP0ySzeIkuL5g0_av`my9-m{%k52u&VN{&U}-QLP{5(~SLF*WIede3&kK)}5i2VZnjZU=g*Luq-oiEC@z{|Y7{uQc6K` +?pNiFQ-W)`*Xv5gTkC8kUfMr%+`C_iA8@wGc*`kFIX@j0R}2{P{GzN=AgEU_DlF)i@AEN^KWWrh0t-_ +KrOzJGg$*Ih5(ygR>mefjslD@oYg0Hp*NsgKB2oJU4*jAxJ^nf>i7=tgy71!k7LAy2b)BW+U`t)2+1)G*3UD**_kPt3Hwv^#vCFyuOW04^@38WIZ=LFZsQ2 +vz#&Z`d}_(TlC*oh3?7eqlOLH(RF^H>$+?8%6)!>}JD*};(t{l|v`YkJT_W%v72X%xhr*}*A>g37w#6x-fn{ob}vA*6j)@O`kngWOEwH8a3Y(Y7I7(b^%@75~LeR_y}$JtH@jM+dH0WaFaK!!>toUA3LdiL +lzuWNw*Efj$CvQ3(7|;iYX=ngZQrP=$5Bx~VpyVcEg0xG>MdG8Acn{&t^gE91PmumF`SC`WA$>m$`WL +*F7oCuI>(}6IFW26t-IDHH`x&a@*|pyehg;5HU%q?(^5xlEiL+1zk1y?;;88DkSnU1H5R!Ml+&-g_jV +D%v=W-2mh6lrkLZC~W7=!OU`1a3Es;$W?^4^Ce^fH%GIGMaaUuoo!+hJ;OzNSyc&+j!vKwEHv!C=(`r +k{=f4HQVQoje4P^bdosz0_YU4M3|6T@(Hi+hM|8N6TWG@|W0w4co$l3iCm1nz{LqBeA?U#Y2W-qVSrX +K~Ag2Q=1=8_CU3#Ll<0$BGz!jT45lBzj>qJFZ_Cc1(7~$WW>{@rkfYc~4{;-q40+`CoI7g|D!PHX% +`@bZ>bE6oypcY5EuEW1_2rL8%71ceE|*Iw!N6AY7Oz$0WG$Pv;w+^zC|qZXmj!tsWVO_I9B`1QY=8zI +smKv8x3KB1wr2E`BfbVu6Prt*ZpK+!U{Y8{I+6l#na%2pP?k)Hu3gQ*B|mJ=YzJ$9%sWZ(6(8-eGPm_ +fxO;RTNM(x=y-<7hEsi8hCr1Zi34TadAgUG#>Yy?9zr+cPjLy&P=_pUiQ9UgJHhX^V<|}6M(`o%VC6F +EWjqpi}qU0HKkX^)(|K0WU$V)I(kkLI8UcKgJQa +X4A!&005S~tH4c!%g1{}^QeuZ7q*;;Ojv_KyJq~f*d)@eJTX& +zn^)B>Mey9wU9#* +IHF9fwu)2{eZuHeNkK{2|J))S)cOMp4|2@6N_s{6*c4w*~(bsI2yDu2iqi+_}2P|9nZ?7iOn2I8K;?) +#KIuZinKNN=sH85||G_Lh}$yaAOnN97vVGui8EQHl!MH1d5h_d23f; +JO7EqjV$%fJW1iT5v`+V-28i19B#f*FXN8oR}xyKJLt^t2_8u!@Gk>698iLw8?G;LD1W77up3TWwhUi +UPoh3{|LLot{LtKFAj9W{k3O6coTN?==z*f>=n)sXgZTj+}d1%rArBG-RBgfNgb4iz)$>fqIMJYFD|t +4k)y}~O?pcE&NiZ%lK~Ev&iX=|>KUP~jLabR6 +;I(=Kr=v~0f0L3G+Mojop@I+%;6=zawUq$|#Q|AT8s_&Sk?nv{nGrKb`kT84_SW!$MaC?!&h7Wz1`Rd +Fmhqyr}ec(HK0nr_BV28o2&%BbYWqM}%o%`(3Y)=zlA71<^A-$M5*eIS*&&IYxk@9~`ZWNz2naTcn;G ++X%MtaXzFLyilAIHub-0v%I5y{aD`qhMb0AqF`&6&;97o_b{hn^Ye0+5a<@WO}o*Tw~pz7#oihDl#jP +)i@;6xT98lj{*s7s;+iH&rL{Ow41k_2!&D9OWh<^=@>j=fxs1&O~8s9mE7!2=db~W3MjDDe@$J#j$sp6gvY5 +el-~-ReL>)o`VAgo}V4#a34_%k$KfN`Q5eqG=M0GU4e%ZECyM}YwkWmIWo>>AV1Wh$@(>q}{JfWDa)e +1x=;h>H2SOCf_W8Aw1T@czQS&mKKpR`@*t&~PXcS~7ek#?8bAHO+!qrQFehfbAHypGCq*Tr4ebI4WOX +k9IR&@Y=WG&YaBL>hF)?f-Zrb$^bB7R4X*i`R$d8I-GzZ($FdNo|@{`Aq6mDn`ZB^2MuhRCtP23 +cp`mYS>QYJKfFO)l`xZd9*l$Og9my`DS*Hs?Gwn2F?=b;_t))R$N+kW3f=${52ry`!zhSJi3(R7T{d) +660`cvx?y%|yQ)-KML00ROa<0;>x~bg;2yVN)zIbs0@h*jw +|6{KCXIUuGwMTS2e42c3Yc7F<2d!+J!lFk|O3^;XPJZ;Rf$M7FgCzOA;g=L+EU6Y+V_UWyK<^7U=vY; +RWklOG=jq&5h@%D})Q9%H7Iw(X=JAWZrQ(bV}g!%_lCHpKjfa!fW-ARK+f2gh^4|7_ug@JIbKJ+%~!vPKAs4K-C*$>B*J)|Cjc0HO-x#tvmj{McT4u=>N?42 +KSh#l~Wn%^%@eJ=aFfH_)jd_@Pbiyw^qg~s4P=cqy9eNr~5q +&k%~p-5b@KtTS<#hwRVgzybvvgLh=H$o*;eb4Yx*WI(5vV)2)QHAo!b3p}aGGCu +W9)+BuC_dy2ZL<7fXJq;e27n6;!hI!Epi0Pp^FwzgEu%~Ffc%6NU?Wt_k-*o7T_}&1ZRF~=RDYktElm@=- +k}hVWEqws-PEN(>`ynezoWjWXqtAA^TCt(_xc~4Iu%(d&Juj92IZ%{w-vR}T(@{zH801n~rsIhomd2m +ulOA-~_L~mopgNR>=ND}CPZII7HYR@Pm)A~g5r+-52Loo&f+Bzk`FD~SBrzAR3BI2@j_LL*WfrYVx-U +#M>gboOuvBr&PD4{Kfh(~dfVR;<#ep(`uEjgLPO;Ej0Z_6RYA;kFbxNoz;q(9?m?1hj(HFU(s>!nqPZ +layytkX^^G;c{x@M=YT;SmTid65^pJ)@kSI;%Ihj!Vt2lH&Bb>Vj<)o~uL1I+d4VY*!36nZ>Ta@?3VHD&dds*FvtPfBR +uw#c8PQ5Ugx!-b__(9ZEdJf4i^EpI~_w;*-l8R8=S~dDG`eHVq;U9ZHwHrI}w5KF1e#BJw?W`~{tBh@sJIc)#GzgNo3WI!_hV^(Nh5H-v2x764^>;5** +;>H&=1r4qtGvgJU;p#P)h>@6aWAK2ms|tCQZ(F>NIEo004vl0012T003}la4%nJZggdGZeeUMV{B?y-E^v7zj4=)aAq)h2Ua=xY9+Z5*2j*g(u@U%+{60u&XGW8Ae%;5Qa?!~sZb4#VCrB0EFl0Q} +=Dm|us2D>mcs44G$x6X>>&hwToYDjDk1RCNe`g_Xd-X+iUN8?xA3g)?KDyUid8HpvO9KQH000080Ap4 +&P4MNwn_33|0K*pm03!eZ0B~t=FJEbHbY*gGVQepBY-ulHb#!lIZ*6dFWprt8ZZ2?nomk&*+cpq>_g} +%e50X$vUHjGTWVvXZD>p- +96IR7g^^ikE!fR8%ou6IM%AR25y5hZD*3hBc%g&GU3JolYkcwr{vlgg2@wgrwcGba(P3CzFlfdjcBLj +Ma*Yx~S5!V(GqMb*AM6vC~UI3q><;WK@{%_eH&yos@mf)~r-BvZX4MExZzp$}#y?u}Y?UCQGLQMLLf` +jZ}g?wCF0BKUvd_4-bu#`Gmj)5M0+voX9N)-DJashY{f$f_@ONjL7!E8i`n;+SF;#|F6g=UPsD_Q^Gc ++MO=1;#P^c7qQqDfa+i5)Y*lrceKcVkII>d=t$VLI>RyG2?x^uhxv8*ok6vYmDu>-DP; +e!z9N6)U+^5-8qcCPy`UQ^?ut&YV=VZ_Oq-OekQ5ChHqk|5O3k`)yx3rXiB+R>_sd`*ydkUN3GaiwIj +u;RUX?bQjg;s`nOHo3TL1$9O$UP9HKJi@{9lNw#Q;|E+ +j>Xb$+;-c;@tQ(tgDa;W{9+=w2(N)yDlLWAg*%LzIn`yJoT~&!Ow(C_$$Z--(Kr|2+m(Ul;D%NObysl +1*d(qM)w7}YmBIzSN`JPo}qLFrEjyY_dLfxOM3Y(qEzB3K4Mj(OV`nJ18reu_hG_*&cQ%6DAI*vHq?<^(4i}0Mt)BG`nJQ#u=Y(;?S{|H${?JyA`3gg^ +$k4?rU(htLC=qp9CobSK`Zxf%QUra$NZE?^d{XPp__~=hfdE^m>6y1``Zvc2kU}w31lYqu52wv>aUT8Y>rPb^0ESR|wiPC +@I#1=1){dVH($6aBRrW0d#&>85{;fs9l4v)V`aI#p;%Zn}W_eC6G!J*XFz#@``gPv_I&H(1=mK +LFdubJyj3}fp`@4DIVn*ymTeR5#oynB!nLS0r=>=KlWWYx+c@EjwhM}lho{LTB#>$$l{WC8dk1(ZE8jb8p` +B>c3*_n!Q=s3juuaB9EXC@PHX?Mgc24O-Unc>nu!}njan?Ekp{J9e~7km6%5 +xX>9-lwDg7-~2iry330P*tN7K(h@8Rt{un@il*8@vO3J!^9Xw@mwG=8 +f!g#IApRNZ7{et{;U`4m9|yV+hWVu%LGxXJNgcPo#Vm~ +pIApigXaA|NaUukZ1WpZv|Y%gPMX)j`7b7fy+Z*6U1Ze%WSdDR+gZ`(NXyMG1YBCx#Y7`wpUmjFhuP1 +3EgtrO(Y+oC84TB2=kWl>8~Nqvj{_nVXR +Xk^g!+%*BQE)vTk4GCN_k_|-Wh%ufC1PJnWe8hqnOBC>`gt^R>$%)+MX~KY&Qn=zM6)VOQ!=G_^Q`@y +KIl=sWhu%z6@}rdVEH`Fh2J^dXMitcp^pI0Ep6rDlM#XI+%j-w5wGq08M!Yr2It&f@C~bSqhIs9d?nS +M86Y+rO^?ynhM7v!RAyX`RA0^5(~L~$uegIGj9!-N=cB+vVb$@U< +`odmaY|l5VF!QE0JdxLeqTssgs!(h4!?gHWboIWHb!$ +cq1gR;P`sQX^IG=#F6uP!y3V&xB#?oX>`@a&Uzs=fO=ZoXEM~z*-+-S3>bUFHF=5p@%;Rv(^&-eyHttf<{G|@cYfHgvxMQtrCk~;=ob&#W<9)aMW%_?3K%l_nyAceVon1ujnFz|kIq +REM#kQ0)4GfJkj8Vw~i?V)XaYy{jVV`tLGWLZXc072`>4fysrJt*AMvyJz?*AQ(}B|HHOMQJ8eN_&7_ +W&q`HTZk{C=GKyM$zl=75XlceG*X_nXwSTDX`*+s$} +BllR)wvNJqDZ3iZ?Fuz4|!X=RRf6Kv<%nsyv!jTwpRI{!Jhacs<>q%lfxy+Bu<5hL~-;-7u$_>#kgv$ +lz}cQOW{aS^WJ6$afz>N)b}CKnW`#&k}?X8v#WFkM3om==JuFA9YAO%F$LKW2RhCO1pCim0x|CK)gjKX!y2RNww4;WAsSN_1N$;oxN9ra% +$nHajw?P7V{?nx`bxdV$!W6!6%RMvT-zyaLu+s7Ekg34O@MAvnM<|kD9bK{U}z4wjV;L=SXej`y6&zn +uFlAvI$+|4DhO=~&QU@MiS~hwRvX3AI`2R4;MdoqFgw(<;u`8&Lm)wQ@0SC+_de^K|OW7F(1X;)*El=xh)ePCfCbr=q%}Sb$x#~`H1DmPm?Gq{#ihL;}nr-Qm#B)8JPX>gB#ezOqp_(K%G +3W@`sD2o?g9{%Z;J8T;Ii@|qzFPkF_VNr2GxwI?RJ<;5!GVwwN4STMdW85d{AhctM!P_aUjiUZK}Z0H{~8IjD@Ut8Fs5^z#*9t?rS~Z6-6 +MPH|~*r>buG-QoAxsHlH}Br=kT&0RV}o#|iVfYH-*r%m6)<;0RX!*_-FdOa#EAla%F-1#WsP!Zim$rR&0f+3^1G +l-?jt=WC(5H>(0}4B)nE``t!rItoMZg?SF&;&>T=q7!%!0xoWrG?~4emX%J=_r^Sd-~8p>c*t2O~ACM +uR*J9EFz9kGa^~@TI;$3BIy=TSjCbN5)RXwTt>7#b=$#l>!xG{e +-jJ#>5!G133gY;RA{0~fABHeQ+B(t{7kY$Am?~ao}FDB_d*ZI3M_So2=dR+X$)kwt-+%RABoZ1mYC&% +JZLe>?6hMPzbZAeAfD?WrDNgwSWjNoDdx+mAu7q|&8)Lo37EW=VvBi^q= +9IT+l-N<>LTbP!|-e)Ji2g~vbOS>5d)=dhe{{O;e3g$?aZ=MEPo|tFOJ0jU}9kFEt_&WB~{}+-Ni1$J*m168-M +yQPWbOjzjE?)P|X;UKIw>Rm}q}VVY`_lgMjz4BKr#Jwyl7AmKlsP%Gf#VsAr1xq8gkH_*JsBMiw*b~Pfg;Vh +|2m02efwF{+FUBy|ukc2$|RwxGzfO0SdOlmzwT7(^p8awQ$&CU*`72w$t~ +}b+?wtSMP)h>@6aWAK2mqK8Cr!raCn*^g000b30018V003}la4%nJZggdGZeeUMV{B(gS)mtl5W`REd*MoZ7s5-iBb~3z5Va+e2@|;D|XiP +0=GaNiy{vX&o>Vb9R$HhuVtkcqA2UM$hDC9LaeHyDfMV{vsR+4(mYAaOo_Fslt{Ix3$akkG*|7IB2Uy +*%$r*LEidZ7i8R->%(2rL45lktoyBd>1Q~t4d}qy!t*(0O!0`RgUvdX?c2GG}$5#>rp8+V$XmhaZ>qu2o(`_bhXegNJ32WyL*U4TM-Iov!j|Gzx%>%c|IjI9@h&Q>i!>>832ITFALBvZhusKaWPH{a#i%E +MN1uWs@g$QDoW-U$JSLfH)@$2&+FQ?)i;b;H8Lf(ydAW$ZX?dl`-kSMbh1L&;S +Y=9u=RaI0&BeEiq-hlVl=U4IB>DlY^_~pgbROl*+%L;_yVQBcKSg1@#%c9!IItH@VRgqaxKTzu#H|`m +o<_q;;2VHJ2FNXRybqZbAQm<8u>-EjmySK06*QeL7 JRBuZZLo?{jFPFc>u)MQ>#8>a%zP)(+>hY +0HYDay4dKKUNatYIn(&Ye*cLgw4?MuMs^GE)XSaZs`*s9izNHu +XD33*b1~`*@z_vPzX6Puf1#f=Bpe+&1ICkR=5b9c7{cWhs_cY!;0|u7O{)FJ?1Z_RJDE^npEt4orr&2 +R0cx*tRH~q8m$YGj*r3ldq;NkclV$u%tS!l&-5ZakQru{aRK)z>^6o$J+=6gYA_)DjMlOEd98qQ(6b_Gx8jd@%x2sP<(Fd%pzp$$_5SK(&`}Tv6rB${T2gN +7HFUXCl|~1<``)a0_l=yVyNzJ;Gqr)Rf_y5!2Mb7lNxrsmk!M>#$McP2Kyf^oir>RypyqM-2aBMlr7R +T2ND3k}rDH>E05IN}yyt}f}TxcLZvH-CZ4# +Bn9fVj{kNwEPOl!2s+rb-m`uTlsl+h7!1X1Y{Kx=a(JL=c#1)SxX182~dtRZ89(lBGmI3aOs`}AO0Vi7PN&~cVQiZOt6ra+eTpd9DuXC_h +L8Y{yePw(6J`xxg+E{_9iR~>s(9%3A!bp~M$0z>-@rol076$JFDXr?DF+P{v9lTkldSLTj +W#zc1S8qwe46s0DrGwU5>+D`U`bvq50w%?^ORhqE#4R(v=G~w5i@OllK8~h6HWH +dpQf`C;WW1tGLEo@~VG+D$Ln(xB_MAr5V91H>vK;WSgfDZvnQ&){@hfw^&p2)$m<5zIi5W%QDSO$QBvC&CDdTt{-!DUt$qmS|$W7Ig}7UlbzW@&a6525P +%^0cgXhn}@p{`>B)-t|1h!&@K=d%(2j70+J|W%=aVqQ%hOw+o!D4_9$|WTH6_sZ0aGchg2Noi2|ZMIQ +_;rQBMyex8IOIsou;8+ +uS?pqVL@iW_LVCBR1unazI`@+|@u+%|N)x#qUJ(FfcND7`2JTGo!DLDFo?(`T_s`rck{z&g5Xt~42qN +)cd4FNE2st@38di6Y?+s3%3JC^2K7xg#tA>A|^kvE$;ZXlP!POoIL#xOiryvODIu#k1FHf8Nbb%7Q3R +@T|tKm@xh?D(eGFGd&+axXTj258sl33sSf;!(lx##C6s?yFCS=Pn__YYfGKX}U;m6)ynM++7+>2i6lU +;O^q|ZCb`A{=mpe!^28F?AMu7!JXLNko|_Q2uir1ENSq?%zZJV;T{Pd!Q;;ewVzJkSt;dCz+Y;B&00G +)c@dN0;x%@5_Q*P}`!$_X;E_gFDY@7(n9j1!W(;@6aKkQVz>D){b>0qm2>fTg#D`F$IHmY;j~{dVkl{ +xcJ`>`D)7Cq8>0Y$*w}S|4)=MKV{F;|72Ntf6`#YpytS9$rovf!~oK7g&0N?H>X^DU56Pes%)_W``bF +d(!WjG9XONpuusTOwegvDv-OGdj!MB6iYtpmv@`(MNE@l?#4e37XktxvKP#4vseden0O%MQW;F~$t)Q +_;V^{!uVwfsk?g3TuHVNMOz(0~-#`mJ*+mGka(vT+>%p=^d{AR#Co)-aC-c61j~IEg& +U+~8rLaT+B=N;StDl`0FJf`8}qQ{WReL%cjW2i#e~uhoXUbAtpYEFZ!($Ej>3 +at{IQlBwTBbNq}7#-TM`~HYGkWmfXkO1YvlpdLl&fC%wCH#WS*E==Qs&+OH%}E_(YQ`K0eVTio9b0R_ +-L7C_7;n5s7Q&TYIi+h*vd~B-qL6c!M2tMB&|HzXP +YpMn)W@kbS$cLtnmde5+T(4&9gg3`eb3j$_AuuJaX^}Fkvx2JE;gQsZd8(H0QeFRQKiF%%RDqus6%Py +MLTBNmD6hH{fv#up<{qJN32CYv%q*=ZduWxQHuU*<4i7T}!V3=HD68(AfE$)F5+)1~Y`z=e`fgPtAHt +UA5{CYdh$6$YI5;Hi@=_t9T3LAorS_&qun}G%NQTy$j8yr;5gq5=!vZI_1w7;yKs3Lv!4A1NYHVEy@*#5hI-@N$i6hRyNY{0gUTe48z0qa`OfZB;E;SU>#2&h8U7+gx_AEU!cf(2&uijw*V6Q*% +%-wj-A=cV}R>>90n6izy`qpReAhld_aFFw$8zt6zh_n+DN`&-&7iK(X_({@dkhF$fQ8w|W`T}pd6j!| +MuEVEE_L3LrpD8!?98|Gs8^e0xbKB{n7EPxO13ug8sk&X8)8XHHb?!=r*6gjWmGVj!RP%r3^S`+-fo%Vg8~bRs~v +b7cW1+eVzh@&@CY9ZeYhAH%ZwxOwxEh**zD+H)2~?&fklL>MzDO~mW?Fr&N2Cc#M#KLSmN0%v>O}739 +a3@zVo@MW`A24JbE#_t9GAXM4gh2&m*Ls@_iODHMKqeu439l?_V#bmsSq3OD}~((2U~v#ZX*-J|vqxS +?oi5Og7uHmILQTrkj6sy3KvMbPHy1lS~zVmWz!X}$r0qAOTmh@aTIi)Z4 +7WSO5T&~|3`L%q9R_xVV`Rn%J?5uw1?I+W~BqP1$yOm>hF)z%Q?SYR4|?FoKhdyQ4Jf{5^|aANl#Ee6OZuoB6dRLvXBGgazNGxNY~^Be|jByd&_9dEpu_3L +lUw6Mo6yt!NM`-O1_xbJuN6V5}gTJAqG@N;tCU&jmo`8$Y}h$3Z)+l*hg_?h5$4+xsCFfGHq(qaYVQQ +_;M(#nZ=4@&|?2$Auin2FlAgqd9B1sHH!*x7On%k1{E33_7KjuDyPe5pJbnH!bi%{KQr{xevHn{s#RWG)AJXGQC +ZLreIPkO)x@{>EsHJ7nYg01Cla7hqFkuBh}7mSJm77YZvhtGa|60|NdfuKX-Zu~$Jk^13&-pd-cqkGx +F-Zd&uXoIf1DY?L9vrZy7v5>XIE&2=GOk+_6SGm!<{YYY!+mrD0DZWI~dMMe8FfCFM*R%m1R9AfP3

)5Et25K(op+qZRM>)X$a5m?)P;cjJm+xsG2hu(59FHe_1`<0>j%(t7EpEhk^+jWRuF;7~CN-@4o=_%?BtjHH~HZ2`mO8tw$8AcS-X|NO +t&8w$2m#n=ewl%=<7=la>nKZCAGCshi2@RMhauAWhL{h1359PvMcNkoBSyYcS>bT2s4E$z0a3(D!#U +jRk77$~8#b4VjCRCCYV1J#|xVv>8xG^&&>DX{mr>FtoK@GmMJV7qsn&*Qoe<}WhcADvTry5deb_w5Lxfwa0FM(UbF3O}T5`2kJ~AvOHKD+rOjmbc8N)N@rs*40ayy(ws^(r%mj}%$a8 +-zTa9%UT_}ZJr=6iz%mJqS2@uPw&Ml}Zcs9XI*^rsaMi`X7$SEzOO +W#L*{uEx-EqKab@+S*R$ALh;2gB*V9fr5Ka3paWU&*DM}gg+YXH#?ckX{zj8xe8FMw7y9w}$F1O?B=e +;YZ{CSHj2L261b)P*{+PM*;o~G?DH=1Qa6?U~?YG6)#i+rNc#ZveA}Sxk14J+!D4Gpj{4N%VZ8p?46wU+@w=Me$$rg;)NpD0{#TH5AWaLo{VzWy +nDkEGOi2bOeq#JuKhedVPqY0cc(NG=MNGyKF33{wnSkYup9Q;V5?#KZ(s1`Lysi>^}|7GJ-vF-u+HjQ +TeUz3K2G6_kSmExpOQSg!FdHizGR1K>kcAu|1bq7?Pp0|l0wq8E8Uabw{1$~&pHVrmJSnmQa|A>- +ze;1-ePUyA2kn%f|nSKrBScE3uXLw*q+D3TCqWh5ox(M7Qyu7QmUGwg})$X0S59KxZKXgDh`nt!gSal +EfK2z61H-6ly>2^)mU@n?;4UgR2=sI}!9~?kVA)|ASsVeuWE24LgI!&I-TL!f{8O6r}AAb;D>ExD=qd +#nM`y*`i%gLX>+_s3?rG-~r-DAYUC0kc$>oI4rfU#S`{{v7<0|XQR000O8MO|VRCb2axQRrjaF@IdpPU((Ya#kkAi~d#DQO;)TJ)W{g)V72cEibX5jkwn`oH$n@NM+KM<;a{E7Qzqv0)P2gv^JcMd%K +6hOU&+d%g*D;IsGhu)d<5+5+^RrK!4aUu3M8A!KoP7aNkl_InT;aXWP4qpNzZa@%f_?eLmxir)1-D$r(EfioptEyQ< +Rg->VlJG-3WIQ0C@xXTWzGUGw3|-jQTyiVSwJ#99q)xdvOh8IKNc58od{yeX@%fXMSL(_)XBONjIAq; +%#uHH2fC^s3|c7^r5gR^yPbgu%@uC__G*++4S8tYeg7&0ghO_zFJg5gkmUJWAJQFn1H&_v*pKOr}YR^ +AA!OzZG5oH)v`te9-ldSXKZ<+N^|pg1oYGgPUbX_?j-e{dYeaqQEmCO88j#DDDmj^)v6sO{Z;q(u`$O +*R0M%C8mjv3w&A!nt(thz=+lM3ogPr}4S3ibRbIhdn-CrqrLheD;OG#}>ScO!0WL#V3?-Gn^+C{kWwaNioU7<{rYhbZj+^63W2ZjhWg)`$il^nQpZo_F)OzYFHtZLs2SyK(XQg89>LsK$1yo_G2HVXnDaO`W+;%?65%ZdT7J0`aR!r%bpWa +sJeTkpgScL+;dHCz-B+anhL<#cQGM5@=_nnyNOTI)%B|za!&r#Z+hIs +*%O8tENHEq+r-Ol5G%LKE(TTvXLYh6_%_SuciP7_NyuMbsGk$~0)K+@9@rKhxF+=-mAhJB_Ds+hti3e +625~SH{P)jRG)f@4YkCgU6p{fvTR~D2vGb+H9Y|C#h`Fv)SOb+7WLEfdW)9+@7j~t0ikli)N +4CR%^nt{f4B;`3^-pKex((z9W84p^ZP%ncYbPj%9bW>WsWpd1~^)lh23;3W9h}O(AD(f@Ba)*EfTH+# +4dxjY8-LHCWW|%4pj{g-fTj5QnQdZfKKdGV4jlyeifpky??T$;AvG-auE->4lGn)tp|M-ZGV=IU#FeC +f@j$p4Kne`hqKv?>ei*5sKLAK}9D1@jC*6T&g5V_8-BWT9d3hFj|8DUG%%BKxoj)Et1Pil3W=XRT68} +pEN$(Z~c)Zo3BkWIlWVK&)nJO`va-I8o=(y(L2;omLON5&e<#AFuGk{y?jc}|E +>rJhkENKjw1*~4oEx|8H<^97l2$O{FkfaOgMa)lLzP^s_b;6q$Ztx9XM1cs}zZGi2>9)T>*D#1$BODa +b1K*6r6pxiWCii!y6T_HWu0_+j09lVSkh+d`&>b5k;+U_Hvp45~#$tZ^LQ_(G}&?;}R)-|O{A`(_9_Q +?E94-rdkg99@&>h(W0SW#rll8MZ07FCTc~uV9wA;dUwC77XR58Zw$XPpt^~`k&C=HBp5p*+zqBPF>Sq6 +z?PynN6~o*a=sRHBH-In!fX_hLP8rE8WVbc_lSz4pL;i7q+6aF-JRJ1HVp=)@pwGQT(})=yyF$HeVDY26W8dzezfRZuVpM#LK)s_v!eTF0H2_m52*V9gI^FBC3fx&MN@2|zwd_8g|ie +iX^VZfDN$wT6~ueD*ww?`<5?s;m`Z$(tc?Xv(N!mZs>%EZfz;woDJ`~4-TL^=|ZbWljNZa$n$zLbFLTbIs;O+57Pc;&hvYwoxd4UUn}AOU-Fx`lUtY$`U^!hs&lYhRkMNpL9%(X| +ql8BQXyrC(mI$$JXbeH3n11=tf^PNaTUz#nXk$#FkbN +B)xwD9Bm+wH_Ko$JtLn4fDLRO-EBSxF;)!Pz(L=T^9H6}Qw>a1V^xXd`5sja&%ry +hFCf-jnYGghfS(b*Z%hlWTYVxX98^RBjS)K`yqQ7a<{AxJ-L~7OlehR;en9pU=c6YOGA0;DTqnw&jBV +Elk}cP>>;fGp?^lx*gnYc|*dmTE%fsZ1Da1WXhpd)xI=NVlt>6f!ZkXC7a^|&ry72?|kZ!9mVE)Zn1r +?D(UA2wV!W%C8JA-tbLq6-i2gHr@OMv_=TIhR)xu~>3N6ZZ`(zr_7c +Zs2*!AsXMGV)g7Tj!7s#Z>FKyrS +b02VJOg84X6RoCLhy1OSacZFDt;u;~MsnQ&8FCGlzA5p~BVsz#QTX(#USYuj1DOeg!;6o{JNSeIM_8A +Z~=eG93i%yTLSVOMu+ZzNRpoheO1B7~{jqYa%$Ux8nzW{v02VNlH7%?l{MMO3(0Zva4Z8{j>XTIPJw| +TTr)-(Z7C0VXz$MCY%KJ5^9;A0`WM$cWAOq#m?xN!2n?xayS_aE2Qhc-UX%XIJD-c|7iIB_3GxqHQwx +ow->jh{&00iDd!PsPNKi6nDc+KV%aAy!Q+i}#AQ$|h6Qtcl=nSLde(TZ(JjH6yeY!x_+`KDTd#{QT#Pyf+1z-m={4F(E; +G8ZdVn=4Kh}Gb4?~v@?6$3)uDT`<&Jxaqo;!0gK0G;B)Moxw}MPiJx#f8fkO^W-I%3;IbPVVT*Bv#!% +_~yqRYMWbWs(;r7(l`?am0en;GOuoR8QJ+5G1pRerUVdI|g;E?U?Rp9wR-_dEUWmg;PL4v}MiaAxp!Rk}iUO+7NSAR#yQ<1Hwv%(5TW-lk_ +Gf5s2YSavC*!IC{4FD#L0f_I4A^d<;br@g*H$0TO>}9|z_Hf+;?{j5CtzfC +!vyT3U!c3$5{gv{ebe@@)`@-Y)JbcIJ!f6yq=33J9He0l?w~g*G%q;DH)Pjjv=@LB{6V3U0iFfcgSlf +oVuvdSNH1Tnh9&Uc@uh59Hx6Iu4+5mSO$q})tV?9ERVz|;r94Eyc3?^lt)Zo(RL80ld_3854tMC4LmJ +)lo9Ud_jzg>Lq??jdp7cT+JV_KSNVRu5s04p)tI1Uwuig#k_Wg}*{qlhn!WSH(3FJGAw$S7#G%IvjxY +I@NCc>iCqry@69%_QK~Dij)J8Et$_wEqE6O9KQH000080Od(0P1~$@_I&^V0Gt2-03iSX0B~t=FJEbH +bY*gGVQepBY-ulZbYXOLb6;a`WMy+MaCtq8K?=e!5JmTMiX1^(w=QZEF<56L$;9QL(1Kuz#N_@K#O~g +IpEu<+E0L*|nnw}!oZl%Ib$@))tCmrI8^Ckl8}HR#ZNNB3ZlNtOo{?@Sf73v;E^s#(jDi&8NQ`?y-E^v8`RZVZ(Fbuu>R|xGT1~Q`sb}Eol)~?02qS)FEMGzROO(#NS$ +&+NH*|7gU>dRjXFz4WiG~WyPNGfM%XUPLCUg-`#4D734W# +bt9D_^hHbF8pyq!_&7voITHqypgfB__Rw%JOo|9!cb>Hm`VU@IY}YC}rWiQqu$1y3xTIwy_z>(l*h&H +Xf{46v)*RfP>U~7r;&~PZc++9HWBj~&$CqBL-E?FX^lB34OA6fP2Zd~3%8et4u$7A7$&r_Lm6 +Oq-kgJM#RU5l9dpo!JwS*2VU3771#1oCIy1+{?oa@Id471#*SFW}Px;rU`}@25k4eI+6Yi^o;K#9!8E +hAq`s$@AyI&}oVHJqdxVKe7lq&^9&!YJRo;8bg;OCabekG5X2I1!)4Du? +Q^nsKW75-hG4Z#__p(ALOzg;WYKL90-=FD0ug&R*hTSmJ_9+?bjgybHB2!;!4qSH|T5RIJa(#uPB*AA +)f?L8DhVqC{!es4-2ihywhB6_eMSi|vVigwPv`-k{R7#dYbM>wD^~Rh8E%IQ%-qYT~#pZ51n5Nt*lx +P)h>@6aWAK2ms|tCQa^#Y!B4|004Fc0018V003}la4%nJZggdGZeeUMV{dJ3VQyq|FJowBV{0yOd96} +Si`*~_z57>)fn^d1VS6p~wAa#OFT)T#j*__J*s0}gnSZ~sC&_yDqf5)0KpaKy>FG&&oSY9}T;FTk3(< +Ku!lb9V(KevB($vc6`XmV(<;GFk7W5VKaQ%D>;wJPmXlJQb1FG{1DFpCIp=OfmEPHGSLj}sC44B87NX +v{Aq%qi5q7)*kL=WFqxpj}>dx{lJW95iV!&yQZNdynE%A&DY-sRUMV7J@-M6bIGZ2Yj4CK%)+0=GJG1 +1E#f;)J$Et29#0$ixtfv5tLeWuHPbF`Q#-3c%guT@MF0B`1#S51LtvzeM(a>);kF3Jr#Y9e--r{ipAvmJqGcCL8!GcCv+0Y4sp&)Q?WSMX=hY5+}OU3i{Yy{q12$Q4v;hgBx`aDR +M_{J_0z4xj4aqB7n#rQG|AlAq=3AU9`6v>};$ngd+id|msL_K(IgVf9Wce{)%P>&^gM@vgrf!|W}5*@ +9>YZ&UK_cRw7QygQ@K8zr`Tw!AT=cmhyM0|XQR000O8bvGjnF<%y7g+6d6#ORH_n;Qs7xx2nFGTEYeCbYQG()-j_SsEEW5ro<&$ +XPNFeNUIvusiitc-gDB;}Lns-IiYyEBxWT=$pQlVJ#Zwt%TtE^n6fYW05oZh3pX`Wq +H7nM|DDGy%}ii +otu@yJo~a$M<0!)})AcOMoWOg-~S|6Og~-Yh25m-g%9`Tb!6cXvJ8!DF~pjUAFQvn=gLBqdcI8H*u8m!q_Z!W5nh5o2NWt0NOE +jKRN*tav1d@)H(ix;w$O0YH|&PI8xC&$GZjGDW^>agtl>=;HnriX)YR|JV1@n($Y6rCQp6Fpby?RWdA +K`lUk!c=eG?d9LeBpo2Ryu^r}}Vjv6EqXx@W$a4uk2j3rnD+1HjGeI&3IOL?~5v_31*HeP$TaabS6(W +Lh%$~4`I^M7XExJDB-2&JiPePb@Cm19X?5q>jI5>_IrJlQ7VbPwSLfik2QiYHVZvnd-ZpH-wfm#t{&W3PZpYU +v2dl*$zpd(HPA473p>*Ll9*|M`9};Sn(T$U%&^}&=QS!~W;i!kxBlyI2vU7hhs&&NL;v*97!tZw9By3k4-QYEe#r9ew$^8+6CruJTt80|zJ!0+s2z +@k{xgcgS%T>SN`Z*CcUeCOq7i^ysj2sdH$n8~+AI*-E-(z+M +DsoghtB^Xm2AMo4z*Owgb1DmS8U9HyWDJ6n>lc!JX>N37a&BR4FJo_QZDDR?b1!3WZf0p`b#h^JX>V> +WaCyC1ZExE)5dQ98!Ko-L4YttkqcIKGQm-qJwMEi&9}Gi~E!yTHQvxX^4TAjl-SI^dCECd_bp8<8;@y +$=!si|`>{ykeCPlg5GrpfN{j-$zn`}0fD7RF~$z&(WBdJ≀OKB@T`cp1&cSCr0KRi9y6X3qjsTxo> +Gx@RyPuqaw@IL^6Ki-)r?%QicJR>=6sP}v*C!Lo&^)8X +guo{Vff76fCzFUk#kb;1-+lsJB_n~lkmTy$>>ChG;cgukRdP?BwHc1K+sBrF9{{-OkWPh>^ +6Y{zIGwT5WUz|a!@DlylBQeqsIspKH&Rt@5?An&PGy32|N)*xlMWm!#ga?k1m!SJ;566LRrJdPwvsU2 +^)lDNUgb2eM04?Dt3PD!~V^LZnwn8DM86C*pHWBy4dD5<~_&1WPdcTChxR&)X2@TTNP%4@Ipl7MB{Av +=Oo!A}!woWKUQGxiNKB4hFiM#Mdn6lN?6ax8NQyRFSbR#lXPIi+8h>VeDGGj1MQb2;5*O;N|TcC_ml1 +SrX=UhP!9Ya|v`qJ*sWYph|i`WdaxOSOxBS*yxvWT!^>bcj^#KO(*W?*xs0=stelcmph+7AK +VO1TS)ix5cfsG*^(C?RRE29T-B`F{PtJ5@;wAjtakD1s@c>H*KkKfFG)ss}P-F=&TMo>43TT??LlV1H +7y8#j=+E5W>Aqs +owrwoieQgd&s|bt;z(1BxZnIqBg#zdr>x3_-5vMA9bK48gB4NYXF!G(C7fTQ&1rRJ|3N=2MFxJLYv0# +sX|uiIvC(?wNfRtA%Lz_qsBlGaNNovA42dQNXSk?8VNn;Ku)2zl~g}cr$Ib*p?gK%QJ`f<#;M6;J7j< +X!-2Sh&()i?dIt=}hGpSQt?64#kuQe9M+$u$sEjsD!pElw@e9y>SBhgC#Q4bSG3Es`62yO(3~~eXkmj +MCEs7#X*!?AF-3YE3a_6F%J+U76oxeY@?ZH!ZQn49W^#*%g1_;?xhtE3-In5=Ki~9pb7Gh|f;rUW?kq +6|mt!6DAhH=ZFG@-s>nJQ~(Zdayu+&DySxpD}yu7V^qu0ncNs+?xJW@fe|W~Ln1r=qCYe@pp+4ib7M! +!$NAeMuf(kxTFr2qCBUZlKRMZHEZBfnc&MkgFyp8nJzmLePNH*Rzd7Ir=_MjO(EQBlnPdju +KP{tSbIGgHF>S0t7T&_mfBk+AP6PUje)1s;WDj7Nf4pLfFHF*`cBo-Q;4qw=&5U81@IES?S7+r_}|FU +CKhmK)%j58&vA)=*PW&Xs@&D2zpFdtfs5RqE=NJ}3!%GVYcaEU5n*W!Gy5-$e!o!gkZR(4m_X{RW#4R +)!}{#W5g9(4+wcfMHdzyueioyJIh=pgaD$jcrI$a69!F!ZVCRHvq)}QXC5PAxHBK*m%jC9x|Ee%*^>6 +f@E5z2h|v`Va%2nIT+uSVenceuLVrfne4e>X~{F|$7CfZy};w@3azY_FK;`D(jFu}JVrBWI0WN8?+0r +S#%p$o((@~yxy$f4AX^8>O37+RemdJwWZwaIm0ikZc1Kf3FYI~J5xM^qe|@y~XTY;?J*zMFFIlroc%N +CfxdIt8Afs*c`o(WR$f`__P`eElK0*6ura)xm2ZifMA1Q%sf4Z&9O0-` +x$z+XLO+rrWG2!j(A$=(UV{eNXEG2ilw8@$YrePjJB +Lqk!~&do~ +6)@pfRmkvzBx*22-=S=xVMoZ-mh4RXWrMyy?ASpW$&cZhy7?eNNKtp~>R<>bFLX +0*;0@C#6z_AgQ~xc>l9O9KQH000080Od(0O;3lkSnmb^0CE`s03rYY0B~t=FJEbHbY*gGVQepBZ*6U1 +Ze(*WWN&wFY;R#?E^v9BSj~>xHW0r1DF_FF<-k^ZUPQShC>kIrf@aanV!_Z7Wiu<2DoL&DK7D5>N~R> +rv1?%07CAGV-*1L0wK@_?%f>dEQ%c0KR@xG_GpcGVr|t7%;nyp*-wV0#9+g=vN|aEGI;BEdt|hC|yb_ +(D{8*^k3MI`9VY*|6(_9^oOcov2pZxDeXny3CX?YSYS=flEnZpqj4*Uu!uR8jVTQIG}yhnqEN45&i%MLaPz&qXP?HmPU+>*F_4YxM&xA&sv +3^)D)CRliesQw1LpC=K$D%5q{$dGc}DI?r!=`ZP^vByIITSZntG5%m5wH(~rfT%)Z9F~x+xO7266Vt?t0(L0X8G?1$LjE<+ +1%%Ta{sDqP#hYZkzLhHs-yLkbMpOkN$sIgW(Sq0aoU*Ufj#Yl+9!5B7CnUu64jv_|^Zi`Vo=UFo=QBF +L@09zj&nwR4{b@iC%pCYVp2li}7HH^>-I)t*3JGYJuG1s)RqlQhKdWuA+Q9#9!HvEAf+!&E77{bM*fz +S=W*`e`vK~gM;~fwjxn-|R1I=U$pn)}&%@ovMqp=qcwhz3jvt&8#d{Cu|ya)OZ>2iJH`H2fczk}CG== +%4B>TC~6QW#E*_xFvAFf3FKA^Jew$jEkL5LVX@I+P3Oj_iedcDmQ9sfWQ1RdEs=&Ct^hGhrMwTu0p*? +1K>aZ-)o|x(T#f-^14VV0~#8x{el*|D +F +22jx%fqLR~=yc#vumna4xV~^XCk84KQKU#)%biR>9Ju1PCGBp4=!h1w0Fq_}dF@m3xg>CB%;B;NdLSa +UmC_VyL(ZxJ(8P7L!AQ%L71=1&fAlC7zGNS+lRl;qommZJV>I8vqkdN6K71yCaIn*W +J&qMLxdS!e@MM78!dx@H!vgc3CoBTu-Cn-<0WL7`nG)aewsbkzJ|?A!tU?w(n)5J{Ttsdsh}~XmK`&9 +(2Hr4u}(nw~tG22^QmQqpL?YES7#f&Ky)>7FOgfA@VN^+Yq%s<8kR?nRP#|rCfGH=FRtJ{IpJY&~(My +fb=|H%i6F;9_T%uiBmCf8@S20|G8X}oME0% +<@t|O6J8Rr9UW8BNJx{fVVdugyom}warxzhhm8`x6M}>C4xUvbJBSya=AKe7j)G;O8JTn^B;_ +8fzcce{C-OJo0I9PMr=!vry{{c`-0|XQR000O8m=Y&VMlqB}GXwwty9@vTAOHXWaA|NaUukZ1WpZv|Y +%gPPZEaz0WOFZOa%E+DWiD`erB_Xl+cprr>sJs40?Auh>Dhozn`}|EK#I0$4{1Qq(nw}akt|8A*Ddnj +J0vArvK1t|5n#(4&IjL{;gD{O>IkJx?|K8265eTL9AP`FMDKvcagq#jd$LK=cpJ@iLAi8bBojr&sy&R +xf9?Uqy_YPi3SR7(1zM@DW3nEt?&EODq*FBrTQtga%%PohMv2kxAxQ6|aLHO}FwAi!(Srf__q@(HS~B +S!$9T9v&D^MMT`l;I>O+eZym|Wv{pF`0ej_FMFGbrlC#eP3Yp0a3epGYo4BsJ#esuJdq@R)`sRXl@Jc +Q5##wOWPuyWZ&@!%OR!5Kt4%ssn4mqKFvyr{@Mbkj|1wOpye$vlcTz1g-)t(SVT(N#CG1k +d{0C2*e^RoK&U;Q_Mn3)&W9GBSUGB^%lLNaMU5>l{Ts+ACwN{ejF!kk7&%v+dmsZ3?)=ckv(9YMK9S3 +p4|5JYplHjlK{r7a&jwMNBA`~SkGK?M`>n3G rrnUIGI~)g!<1(=>vRNW>;tkft*?wx7Tr5$ksJfa +Wa$B%E{6Gq_vxa}tjq#b^Y$iCvhj>5C@TR3Q9eM{1U3_DG>M1{l`;L{qz=Vqe +C!UV?@V0umvXcxr8^7@P^BJBe*(5JMd%3S};=_7s#x0N|X}sE#BNxK+g0PSTr +$RE)Tawa&)Aaegh{%gj6%&h;EX|B;Sf}u0aHhYmrIC>bCM+x=|FMaU=aC!NGXe4uv0+2qGfP^bc1&Q9 +3M^7lDFp68((QSAu>Uy^z +t%h?#_&!etxIL1<<$g@r$0jT=zV)~H@*-{*6jlcUP?ayX@iV>BoJ%$b~1SGS&We&Io5m#w{jd|hY__Y +E3vW#!~TmJLzjg^kwSF#Ici)gMIx*k=yHP5O+G}rPQbFSni`3**DpoOQi(jdAlGtSTLINq|6m-=iq3aG#G +&UGg#EhoQk7gGAKx%hftoa0?jT+AjZa^^HosXxw;Pw+h;<}bUunAY!eaSEW)^rA?)(kv35;ZDo0305`^_{z%$?-?1^fOV +X4B;PIRByf@?Nj2;PNop;^OTHjeOv)zUj)^E%6tec*PG;;<~G?t7v7WoiG|EbBtVNlcUp<-jN|X +(I(aa0{%_bciy5?3wCk2-tTYs|8nq7NJ~S0C-8@>uebY8_t)&^>h7i@clZ0-FCXLL +`tJ1@qp-~q!2oYrGkEoY%mQ05q+V##9^B_>D;QIJME%Mv%Noh8B{!H!;#Z_^xyuMX7Z(@ti`EGxCOoQ +2bccUZH(Zj5HxInW9n%cr5oi|i_s9%L!xcFI@fKS0B-}u@+vqM7x*PcAg@F;2v!oLeh|{FiXrF*Pevl +9&35C*1q?)Y~3KWoC9^&QE;%!I+O`FN+o_y1j6I$6HG#tI9vtH>ocy~WSv!&4G-K77IwoC#i$059p$``qv3h8Wt6Ekjn8@;3e;z +2b-nPrl`Oh3_qwy*4QLm{%(RHm9re*LIshiw11H>b*6DH{sMew+`ia5xnDGx_aHoE64zHs&j0Pxs8sA +gwkV|?1)wns<5#+*{nQgen^h~)It@j6w7BiP25;86gvluOG2^UXg?KisioDN>86-Q!_>uf+4DPFmjFGQn$YPo|V0_RAnUU7GT-*fgwnf(P&O9KQH000080 +Od(0O@UoR8Px#*073)+03HAU0B~t=FJEbHbY*gGVQepBZ*6U1Ze(*WXk~10E^v8uQ%!H%Fbuu>R}dKj +J3waaJS@8e1-f&#Q&0$sP1{;+Nh77E{`ZqVG)|R^0BkLp8h*^spE1Ec#MBSy$360iP} +SN5dkOz}6~1q%-vZ`0c}&K9i4~C78Dm@R!A$SngQS}0R}ANop>v<;O^ijU3b%(EonY0eR#Kc2CkvmW{ +)2otUmy+i<113QD%XHEqXZ7SP4wPQov1X|~hP637v?z-_yJUswxDJSO>h-HO*M%N7Ti&FwUE05 +_P(jz&Y~6q6%cZp#b~f!~e?jPthYqE73+D*E(?L=(uKt58g|Cq2e~r>vVBOsSqR7MAjq@V*W^i-GG*i +kgg+&v?e6kzDJOBR!P)h>@6aWAK2mq-WCrv2NH7A4<001vi001EX003}la4%nJZggdGZeeUMV{dJ3VQ +yq|FKKRbbYX04E^v9xJYAF9Hj?l2D{ykTL~SH`bC0etRnB;};;P*4lxKW-m`rgY5t6v3NSYvLte5-k* +WCa}fCMy>*SR{DlaUB?qtV}J0NOUyfu-rTYr96IDa#La)wGPSWmR;oNY(eNEB#(HO<9>QMYY@I<<5Mq +YSHkvYWnZee3JXF&5Nroj#brd%^NAqNOzxZZ$IAL-KD?Y{C0b#`qX(Hr%$5Hs>XDyKkw2;$f|2LLfYN +(vK39qi+IB~`yT7>dm)NzeBO7QR7>YQvo|vR +t+(ADK$v*Fh}VQ{J>4FGTs2mQ}hdsx>cssFcJJR}7Gw&plJ|3v?qoVeaL&$TzK*!xoCV5uh2u!{b}k( +)bWG;)@63PP9vA2-xMIOQ1bpycEED{4Z@AzWFQ~53+mJ;s*vhd9rAxuimc2;&_`ELLOx+4lc85-tN=t +xjY4X$mPaW3{grn+bjni*ooG#Tx4K9jRdYPsaxGtt=P0FAWac_dZ@B|n=3s?;oox(w)QLo8ly%Bl4~5 +vP;d|5LDc|n)f|0b&uD{=L6UmH46oYe_?9Tstl-`Xll3%HO6cc`aD4cCo`t +lm&=suAAqI&Q1bf;kD_-*lQSk#~!pFeq=v+`S>$?&_Y=e+gE-6IF19DR*i#9P5N69J*))K^|X<;1b== +Jpm0QsHhv1`CoNIL{ig4Xd?EnZfx#cF_=LV_P86VsS1Qgb@ioI=>7G;#Vf>OCTT&VefOhi! +5*Xx)3jo&^O{UU$yfk{D0K~iv@gkS|L?vleua_k2`8Uh?YO`CYev0K>oZd+5|nN+p-r$olNuwEEg>JC +qVRb%;pY&qVt!d!O7ZvF4=Pq&}G$vE2;|)PDp%(?14NCx|28C3LQM+^`g@weS-9Fwd(3!!!v_KFhpvCK_AGD47kgV5VP29D#Mv!f6VTWHKZg(ab* +AVhO*S+%@U*D>vy-e@88|Od;P~BdK~!YL-o7LVqzBE31QQfRhzEoI+24jk3Zerd`y3NcX#8(hTXOuP6 +X@?6QITHA`4%Y)%Os=7GkK6EZIA%3G +HUSXkE-`FhFL;LwKrv90P=0h}oU8mOEpE{e!MX0!9-(i(GZj2@Q+ +Gudn|bu*t-Ak)s=uk7Bo^E}P`la3OoLnar@hWMZz5Cj1jih$L31JlKe +FQu3O^G@z15{n-vp6;6|((VHR*cy`(;AsLz>3{?ULlCp!htSh9Spn1T%BMI(523>f9AtyUQr +M?Al5o*$G8%XcLZx$3pUJ6+W&4Rtzmz8?q+32acte%evbO*Ab02$NpCI4e8PR8(pOk*P{pFIzUL0Fuk +9=#$m6hu4KS{r!S*RjttmJYSHr)oN26YFLNNyh51`LYa9)JM#k@$9fN7zIcDFpiHW%YcsSOqUy-86)9F*Mv +;hh-jQqyBxK9%@-Ex&nt=o +or`QQh8?7;-MsF#qat(q}QV0rlhLv)XYWin1GVaaIRQZ?-1(JOqr*5VRwGifLWxP9 +1f)j=e4_QM1Zvcsa;T_9QRaMYl@VGl+VpkS^etc3i;iX{v5Ncx>C!Y!r+joIwe(AuO^)i{->#+sN&HR ++&-O7!1p2eU1Z^!{1D@N{*fPcr&G1>ozvM+={)9o%i2zOVb*1#{)BO`(7XIlAhXk!bu>VWUt65$sluQYazV5MT`Qh#A0z4tCMa+3HueE%+{;O|=uBsrX-rkY1okqJ|IAJ3ajrk&C +bnN-al`FgRSV+e@Y_BC*Y5$y5l{uF>TRjoCBT6I%u{!K1Y>ANLHHUmM+pU2op*Yd_zWh3FGDB1@H`C8 +V&EXy}v4={Q>}c^*=-}>tz^pRB}yR3+ms85m@G#*rpngTEIHg +8AcMD`WTj#k#S-^glSWXmuUSvp>{812IjGpGO<2~0i1PU&s*p13E)vhAQ`_nF>!Z?B(dVO{XUF9uMq4 +i-H?+^+g?O8+7=k&8a2O&u3x!~5%moxP>@dBp!x+KQ4NU0?`@3Qnj^W<$Pos#{oJFmVG|&LBSd?|k&H +%-A(+^{JDNeKnSTZW3SVJLVG^4h!=XxAFoDuXY*ofItRSEKwdFm!m}$z6v7ni%!kk+SLOkq+M>#w +me6XC|1(Cb?pzL3dbNsINI~%&%_%ObU~!sxVrX1r@F8XD9z +nG`VWC!ptTWgG@5LT}C1sdjCW%}L!DP3 +xE3*p;Iw2CUe<`BbPs`s5S?B8(r&(9sZJUG4A5>}>x?I(h;Ta^lTbp7OsG_&VZd1`8pjeA)$Le_PcZk?i<{4SSN7YOY`4v5YeSt@GT4=PH|@(kdYiX& +FX#*In&7x$pM!WPvVNgeeb{4!3KBh{@g*~@gp>EDlMs9iF-x2MiS_v;hHx%MWNxRFo}L&%A(wtg*nEY +>_z8j_yuQ13V{UMs9;xQiAC3(P{nh|}3Fw6t5$0?j|EtPN>MnyZy$1nVnxvir4UAF=Cmv{=^J~j +DT&X>d2>1c)*!#y$D_Q6`77;g2AA4oW!sbC@2kZNIuMA-x|eqDiYI4Ri?IGQrz&Qu~ +OX>)c3f>vTMq7KN?fS_vAM$bT{-l&h&cRvlzchfd)dw^j5V@8B)Rr%K!k +cmGYxdc1(4cDmO$B}bjHIXSi-)7rNg?hHrvPI2GK}S@ +qprhM^W2f*}F3A*Xmr<>=yniPT^xG{P`@HRZjKlU|NtpP9L5LntXQP)iohCiGamJVp|Kw4!Mx8eNo;a +Ole1c!m#eS3f=m$Tp8Th~cmJD0@JnQV-d-UptWoO+-6FdxAn8k-Vn^$Im(2-1alSA0H=qE&KZmiqe?f +>8tgg`wU}r&V5L#X +4Y!X15N_7rJg{Xv8fM7X|cJ1Ff8wRZ{&Fh(Q=RJ#Rn%ej<}?;<_hYS?Rv5S#^8XHxQ;Ri7=+ +H~KTQbuPQ>kP?XD5h%|Hu8!Tf9YyRdC59BsVPU>OyauF={Zs2&1Uzp)r)`AH<*^Yr&|Z$9Cm86c?=dJ +=ma+4}W#j9K>y1P8=}1V8Js?nKcL%hYqpU0}3g9F}k@R_P-&+)+dsl3FZF6iO95Ese;2v`QD?-R-u8f&o +nYW;YMb@$=)Dq##mAbMT+Fj);Or%C^#rYcwk2^2f%l<}^=w5J?o|tB4wCOG8mXdb;= +x`s(E*>y>u1+=YuU2iVfB}FlxumWsWzliQ38b0&;t^7g_kL)z7LO(?5)l1A)p`Ga>Wa(YA*^u+c;Au +FnNudB#er)Yql+&j9Pzb9;XF*7#F*?Qn;~C3UTI8VTvX3^=F;u?IB1aP5{|7XV|)SCo5dh`tx?*~%w{ +UNp?-@PZynXqg8iVB3*AxU~uZ03av;03HAU0B~t=FJEbHbY*gGVQepBZ* +6U1Ze(*WY-w|JE^v9x8f}l;w)wk%1>qo&l=*Z?y9U?+F0cj78X#DQE!daCL8T?yr<^QmBz0$}=zrhy@ +I@je+IN?>z=R-Ylh6A*DQ^YelcL!6su!#%NWJg4P=szIZ+gWF^L??f>z^fW-RFkyc6Ga3EVf9atGm3o +XKlrWBO>d=Y%hn!e9!NhbWmUFu4s6>V^aB~>Q*t)(k3sP+JTn)ig&8!tvmskZ>VHN$@hEORu1c(`5Hr +EhmskB6W||&;39@mw-q}$;D6Hcj_%ldT#Q2Zs%~VyuVv{_(glI1s--GwS+J^BbkndE*)dpXrJ_y4ssi +^#z3H`Rt3`I2cBe%EH#i19A+cDXlb9fD=dB#}KkBu#C|bG)pJ$83qHL&?`Du~TrTxrgd +l^Q#BgVF1#4x~S15Atc6scs*c12!Mu><8^y}Em_hA<>MFrR0v6+!SU +AFzGA#efIlTYz{HWI_1ceV;?*w9+3ylXTd`C%NFs3jV*~y{af!D_I5mv_zbBA{B>pR-$JU08o^sGg%pW78qyCjLG9#ml);~r@N1Z@yer6>I^gJOOBV@x%+Wg)Urpb +q`NyPhFsGc^gy(j9HDsoFD*)@Da8{kqh36WfJ(sHHKmm~o#E2@ESju)}~%0~91`aueuvB5Rpg!ti +B&Nte>*yoE3%9@atTd_aJ0b|x|$@?#P2|08Tj&9+HbkoQ+3V&Q7>c66;WJgn`H^J%D$D$aJ#(aHAF82 +y4}ZQ+6u4Hpz;=x}U$G7*H`bOl?C@<=#YobBy}B@zVL(5vG;c94qB@(2gcT>qm~8*S@bU +_^k)P;+%XmLeV&&^8nphEjLz8*3BCZNNRS`qp$`^EQ3mRE0HCvDFj29r~>Bj$JPriNZ@PfZh~1PM(Ck6AUL2I +$B*5B(#IZ--#MG6^Fd4rRkyeh>}OC2?mF;HauN~CPwl_Q@3|=?Myu`g-#xoSbO?}ao9Bcp@9Dj=pnX+ +jD%q=1cyMyA-=ffQjK82YKQvo`ze5sjCH}<{+-nq^sDIGsTXk+_uN)*-BvzKx!5ka-7aJ<#7;(BTtJZb;B?KHg(G?XsBZf3y4GwLL)!lE=fbGj4l0}(HT2KP*%GaT*VAk*>KX^D*GfHfZJxG!U*9b}AjOlZHMK2F_-KF +dL4m|{KDCaf25u0Dx}VINq>#Qz-pYFc2f!)}0e2?ibW0p?sS42-$Li6V;z7~suCyXEqn7p%3AQf_hV1 +WCR(tGZ%WZgoJs33VFW^8c;Vdi@-wf@pYLF(`_~9XpzUQt2p=ua_eb#-c-oM9@~WT=7Vd!@8#6tsx<; +hh39tmQC&ZOLw=^c=*?2jHZDlO%_WWlCs=?9o0W$`Ns`0wl6TnbvRJ9nRke=+I1T98{cnTYUt4TS +UH{?mMek2-dE)!4UpEq`d|S0y-Q!4y!{n2_jwE0G@G!p&4W05T|>QGqDHB=bhJxg_|!Apc@`* +-pH{E($mk>w5U66(7IhjZpv`r8j@9$OB$(t7KkFZ|uBToYFO98dtaEEwsv>%{Dh!XGR^?WKR!iNO2y% +(FfeIwk{iy3%t25qMm}v$^l^L6cbVMX|M3KowyqZW(LhHn0JxA?D%7;Iw=ePgcVfyZ^i(pYZG +g|EgN3BY{zr;4x6@TM}p$3aMYW>ZWxG*euO_W&|}S-N+XPo=fq +6)c+>I6IsJMftd#?5u!=#_(EX;OT8t|@9hf^{{niD%`2dA0dNJztDDUnIhm7GOOP?!F^n57PD{{-Ish +S2EX%rUuu^H#g3_6hTnVgutr=r`7x2vzHsUB4bj}3>D*!OGlCLYJOf#Xn-E?>&^`lTf4OPMWKb1yue^ +BTp*q$S|;aGvX@lPe-rRGxs}6Ai2HF{49_X6FR}LPorwJ(ebe+fBLz&L0`SAm;i-R{xUt_@Wgh +PH;_^=7Z3^=0E0YLT;xv_$Ybc_db1)+vNTiTo_47%2Zt+?TqNWbIatZE%##Jv;hr`+8%C0+eG9Po@)k +Wes0VAVe!U>?^=sqpo^t`lZpq(k^<%$rySGYp^6K((2g6yv$xFV!?2aA1?CS2ama=E^^4quHy?LQOKiqV+9&xz`gIM(m&Jqgt_{Du`P?Jz3`3#BMun+VzvHmH*0I|s_`9f?_IvSdrJ&(kP#A9av1w>@$Az}yvET +eo8u!TB7AKx`nJW*;W}(RyY;c5_}2=}8iuT*o^)h+Tiul-ljs?UH- +?^SN!-vO&OtffLg7xJa6E8vhk*bE1U-@rzdg`?S-EQAvc +W|fOZ7Di+HHlDy>?yErzKmb}O+7mECX&h?5o$I=JZZ-9$OJ$0F)TfCb%(T&SX+Y9;rH)(-!_h7RJlI-8ht@~js3+q +QYPkn-si{U(Jr}(J9T&5nGT}xvHjqT-#|C;oulju_?VR*KP)h>@6aWAK2ms|tCQT0j!|Iy`004Lr001 +BW003}la4%nJZggdGZeeUMV{dJ3VQyq|FLPyKa${&NaCxm*ZExE)5dQ98K{N;?rLvIj1qFh+K$m7%fi +wwf2P@zO0wd8j7nxE?Dz;bjzweGBsW-Rihbe$9lXnmA9v<(GS;=xs(sWhpTCy}Hd|Q=L6Z)viqSh>Je +orQLyeQXeF4pd+Iw<$5*_qePZSMEo|#mD?)9itj8N6Qq;__4LT+vsR~O{dhwG1bm*leGOlZOt5heI2;FD^W6E288R7`E)9WVg +)r}I~@r{}MyuU^Mwx8d0almM-HcAEp)F~ZlPl#J*NGuo)8H{AIV$tw1Sn7r(hpKfGOB{&_V||G2%sc^8xU{pID=e0~fhFL +$CSsbBAoSD%dW3rU3BH`zO85@*=gdELZ>h~ncx(YWagqh0oZFZ7N)77TR11tWHQMLsuYEkIX=mMUmaKrb9!W +7lg(&g*UCmYzWRh%~r{IiAXl`D>tI$i}6HIv!!{^k5Oc3`bA=>pUI5x9onm$uG3+_K&kCaxlF7ynUNv +cD|(^?jNkqs-VS@1iYLjwAwTmg-G1IPcaA(6Z{@f%twa%x|qAe!|3GucW)yu+uq4yJ2a)>U{O_bG^4; +$ZG7V0f64+a0$=Hk&@6v$N|Mb{MYUo}Fz{sh8Ms@ZD@p`dI +TKPZd*GC_@K^<04CN& +=hU+{jlLDrFEI+XIAyB#!J30?@>sPvGWz0X4qhN|UCXpfgbDC8I@gAhel+G+^5fm5{#}*-vmyb!wY7Aa2cDRe!$w2 +1B1(k=Z8*KcZI~vI@((S*PdAc`!ndAFHBLm0Ol!J+Si{ac2L8^>n4||@c^J-deiv0NWianJlh6_eLEu +K_5g&I_WhwR_SOG_E`@#1#$}84kkG1v4luMMowSC}2{O_2jb?*^u=NHCm!mL-FsllhF;6=7eJaBiv5U +i3E$K4{;u_)b+tv-JKIV$wUd-#wd*g#WN*IoQh2)tQHG?gT?CCm|NKF$3cZ7N?Y%axwK1#4SXzjBVts +kMy`hI>0ii{#eKcxF2GqR=oaM|OaU?S{9eMDZ`p+2V|f}LU5k{Od_Fa?FEpK%5!%+DF*Um7Z*1<;U9S +e|wc>#|Cqq5B6eQl{-}8Z~oTy4R#+SIQ?S;E>Gq!~cGyu{#X{FIK>XNog{UuBR~~7$gt@D4f*+wvFum2I@2H2t-y(o +W2;lFGgk#TMlAog}`KRQBU)(LFrPp4-JI5<@SIXwb0&UgJMI8`J(Rgu?@?N&!I@r(M+k%vB$&5a +3~ja3<CMsB{??%){k*y5+@{otj#q55yz~W!rI>DhJ~bK5rQS1jM;d5Tzu$a@cw4Lcz +b<)_3nZoZc!JX>N37a&BR4 +FJo_QZDDR?b1!pfZ+9+mdCgegZ{s!+e%D_?cu`0yY+;{`y1gKq^nz}87fE_AhM_VNZL^joRg{v;75(2 +kGbAO_lAYbR%R_8Y^9|?6$Ki~(O?6~xy6xJo5oyZgv96ky@h4RkT`N-k90X>)sCGM9?(Acwf-Nc#M=p +z`=8Y1KRdFjs{zb2_cdUJ_#gfTgSv4Zipjy^R`Yg)4>M`|Umo`FGU6Tnll7bDg1IPW7u9bzdsEn6YDK +lQk|B1BZM{fgJwxTI{kz|ETp12ZeRvnML%q{v_Kc0iAmbaY(P%ionZ|?6u-_O~@Z`ap14-Y|rQ2{qsH +ay8rv>$0LO39!!je{V_3a%7;*jF!R&&Yhn%Yeb(Y&N4$lwh*lR?U&OvMM1PRR_T?1%pr>A%gH0>?#V8 +GaVD5l7O&}dl2f{8ssI|TeADx>jijR7m}AP!#uIQ;5nG9^(WreXe{^?nSh5m~eOEWtj;*U +2ZBrZegE8SpmL!Q4QyqBLyrQl%?o7C#chn>S9{kx!_=Ma)gPO;t6WYaGY=N<|lx>#)0plKCKA=MbjD=(_K?_b +@YDj2O%B;-*lykxyk>WVGNz9%PlLbmR6UZ`TCS3FT5$?j6@-wq9yxM2so7tNcAjp!ML?pa}nIYPlfio +${GO$tJEj4fAME0h;q31;4Kss2&jT}C3utVQ_Hs$Nf{9+J~h8?pbDf0>Sx~3Ij8ui6!Mh`NJ39@_AHv +GN{N2iJjcto{VE+i +WZr_Z&7-JOun99_jYsez)(cA^vwZ$TvN;ri$#?SI=4D;09uvyO#{*zFeRsICk-D9zyDy!u6JuxG{o`k +R)J{xvG~Zj|JuY7W4?REgFhtc9;f7fDnnz{@{iQ+kXyutTkxMUkgfWYz?f0AvUe8EhfQCg=@BXK{T!S +ODg3wDE^s4>7v{GtFu*zZtx+rv^gc*C_;tOWMqH#;+}*$+eZVsrQ8}53E$r3t!CUAH>$V@MEYw7nB^* +VTGf3GpPBy|Arh%smiU`C%6Lp7f0ZC&Rc%E4q=jtB2;D~!Y$?}EcgIxcR;ES4%tqQs%%{(Mb_rwZGI)i(BL(>){JgmPbo=?+Q +#c@l;PM`#Y@txr5Q26x@b3Fdu^;R4)R-!}_T)mm7TkrmjJ^Bx@Obs{q +IPp+I%(lN{tN$`7Q<1~m^{b?>Uq_+#n3TVb$brAZ4c*V#^p;fi8w<2``pua06-LsU_gci> +Jld|S|fjL(J41a#b|sk0dY3#i9%4M!40@FI32e}}Vpb%0VO55k?bp%KCUH5a^KFS6Z3Ggb>~y!6;N6f +zn|q3+x@Wx4~C9Z=f>N?Nf; +p>arbhyokh8h$M_CTT@Fl_oNMbQtbrWyCg1FviKW&%CM^|Jsyp0w+_1IOmqnUOEI?U13a%>5?V*piZE +)C$vPeX}X&eZMKn?nuqJZ@81Du`(LJoxn==BYQtN-_cw$TPzkchp^^%1zXc1-Ic<5aO$gR1oQL>XSlV +Wu)}WLMVfB-Y>R)&Qrm~G?M_Lr%B~oFZd2N8aqc?L)lZ;g$-YywIqeWnOZ`Vz5+gVS!l^J}dlPA_SE&}hGDdm9q`9I7&?fzbPQEpEoZ(Qp1`4ky +UkDJReFl@#QfxL!?cA1?1D)**t0Ek&o*Tf^>n^DUf=f(_7KiCSKhBp!)Vyx>js35nDayRFv}P(%#U0rS55E_P)h>@6aWAK2mqK8Cr#PWM92IC005H<001K +Z003}la4%nJZggdGZeeUMV{dJ3VQyq|FLiEdZgX^DY-}!Yd8JlMkK;BBzUNmE0S2}g9%0Xe^p>iyQJqKLKks&R&} +(JO_yu)kENeyiDo#?LSm&j3Bd`?OXjuv+|3a=sgLA0V9<3INl}fUsaL7y3G(uM+`b+<~1;IZ{Y`rvka +`mHjUMMAk@CR#+-GW*CW7KbjC66TNq{RlcckcjLNnX6|N^k7sP4?abo(C9LQsb6^NC#`AD<{X+cq~09 +y&l?_O4dYDh@8{kRT8CFx7+PXC7grb^x$paBOUJ9(+=p`@AvUOsX<>1bZi%YAV(k_6;UC01Kp(87&m2 +t)g1;uX>-*u<5*aH>Ww|Z&(s=FN$2}YkEofUtMq3$9NL>d8x0P9*Ru9DDjW_uT+gyRM|%JY#RcJrXG$ +Bifd;*(gcl*!3W>&ss3nB(P)kLQu1En)-q;Yn7D=G+4d#rhEoS_Mk3ZwRQx!EY^@Y??e3CT7U{RN3VXx0LIAQ?5p6Mv +{RD|h9eM`+j#u|!Jw&8@yCY0(P(*Ni5)^mEpw^a39uH_?zjz$!6npK;W?7teF&@gweP#X(0)@o^+ICj +9)v$;^A!q~EGpY4{>$Ej%}io270z*Q_&xjr{{Cm760(g4n<^gsKCQ|d_Cm2e)YEk@KtCsPnyQ8t4pzkwB^w1{renTBW-E!Tg +Krkht)tpZ?|HRT)6qiqLP^lWD*4d6BLQQm^M+r$4yd>+^~R#yrX<1!N9)wbYj8g@_P*j!>|(fQ+w}Y= +f8qLW4#|r)er;!?k%V-(eizwhEcxAZG&pDphZzL4;Aj`plc9Y#<2x+EhcpJ~fX)$a&8J{)A2xkB>XZ6 +DOW=W)b?Kv^h$k%mw9%Uj(YL;(tTT&>H+mHe*doNV4{fv}ZvlMceb#;}9J>hBp-VS9V$$KQ@MqffeJ$ +A}->!q`$o?=6r=v_$Hirw^qj3Xo{e$#3_zWMv@o=vq+V0Yo8Vj$&(x=((Urc!JX>N37a&BR4FJo_QZDDR?b1!#jWo2wGaCx0sUys{141dq35K;_rI>)!i; +!yWtTMHBzhGHwQheKf~Hl1jvSgs@|&9@)*$BrD!xyu4v&X!1uB7dYvPzxuaWo=flMuTi9&q`YEp%?Yf9)SO5Mxvyg^@Qc +260K&UQ8R?umMSPpaX8SX>bd@c?;VqHfJXo3W@6m%qXZ|r=kvrLr4%wHUnCrv=+v(r+ToZW(So +E_P}WLlsf36kU))SofQ0W6j=w?A5Szb3OIkjIj4*z6GjV40;W5z9zD7wq&A7@m9NMB{!!lp-9c=-n7V +;cpI~muG{A}%qYb*>tg8OdYy@ToC*$mrMKKuHkqHmF1otL +6KTWau%H=^1`l&!AS)zG!--@1C=eT1joy8o@`N=-n3{$x&tHSKy_;QL|ubaL?e=Eb)=0p1fnL5&{hcA +MI2hjadU2EC2D;#fT%iY1_6zICah7Ka-NY-sNq4FY0wnSoe~9L#9L|3l$9veBiU=+s>g>1JBDtg6;he +0jEM(m9yryY^n=?=U@l};pu1KJ!PSTSm+YO}iId~VSLi`Eup*rTx4&)0lrEeK7YPJ@XlN8-omk%+N=s +t}^(NE8+7RQhso0TK9p#RyH@0z`eK1}}K&;&AcBoTEL_WBdke^y9cI3$?f^Xz~;7_7jC|S)wejr(v&2 +VhwhzX&=INV}*+5oO|EEU0te-Z7Zll)}{E=t^L&(c!8zs2+3Bh|=$7>Ebks1A{iXhHKhcsmn1!%uLXt +sGYcHRf*CFkKXh0$!)&EtNZj*4wwwCm%LWJf^KA3^Rj1Uazx(J!D)AjF^)P+=D{J41LzWPbo55*$3Qi +GE7>;ZBDBczc+SE8_X}ObVN`gm~)4UVmf=kXgN}uuVRcf?YPc`%F0gS{CIi~yv>v4$ex(G1bL67A5t? +UZ2g)PVDKd5vx)AiPmI}eeOY&X(=L}2E^9=wWevJKS-+Y`H2i!&7amiX$X>~J<++ +Uw?Twp^y3G=JZZ+q+_%toeXuhJYNzki^^Ohff;K_$ce%HBBHpvDInp@7GGOsI}ud?R9b8Z`O}8BGUH6zEZ{nb)RK0W6W$; +X#)!_yK90z6@Q{!K{O42Zc5%&fCnaQByhk|-j`=b;G(tXI~GjJI+px;?nS2YbZp8PlMnH9Zz@HU4Wo; +IaZbJiwIynH572#x6nm=nphh4>#o$MOdIl^9`V3xDv6G@}#|{X?&`Pj0W1HHu7+VYlGP=)T9);ky9xw +Py8fdq^hpjiq`ci?&uJOf(*E=;CTLtAum?!s8J{P_y_W9O@K;lUz7Q~9lSnz3V6&(FWe(smV1`mU&xG +-E~)Fg1PC3qa!(se3X1>0_ytUjB}XU=y^30PA9q)hpeuCjjxYm&uOGFWBWWhd4eK|`L7d*o!2sV17I#O*f +^H=hzLDXV;G_c2a)cEzFAd|XUc2)A=|ShVgj;L7?Sf(B0!he+lM%=pN@C*E>A#ALey)Fw8v~Z-CIEG +=CAT0YvlQd7hzDP~e{|6vJ#1sk=tR?M~7P3e%!!*q!sG78`};SM_;g%BbayoeEi+`1NP@OH29IA-r`P +JRg~RQP5QnaxLp>`bBYm7f|J2v5LJxZsCb!!+L(8IEZS7Z+#Pi{e5h5mEmT9`^I0Zxr>V^$!Xi4cK+I +R9@%}?9Dq$;1+r0he-*%e$Aahc)3O6eq4$Fh7 +wnLQsm{tgkwB@%;qLD2xvNM6K~1uRc;vY%DI-jYYTIAjBb5R*6w+b`ae)h0|XQR000O836Bj;d&wyNI +{*LxKL7v#AOHXWaA|NaUukZ1WpZv|Y%gtZWMyn~FJE72ZfSI1UoLQYQ&LiLR47PH&Q45ERVc|wEKx|# +&nrpH%qv#N%}+_qDTW9Zr4|&W7N_QwC;)M0NoH!X9+#4m5*GkaO9KQH000080Od(0O^i?4{V@Rm0ObM +z03iSX0B~t=FJEbHbY*gGVQepLZ)9a`b1!3IZe(d>VRU6KaCwc9!D_=W42JJ{3eBekj2~buJFKTMcG( +LAktoHhV;k8mD`W3IH;dC4a+nT@!1{hkzeaWwcwLPi}anR0!p1k7-9yt(T_)EIwwW +`KdLEA`d(WrCOCaB2`WJ1Q@==y?zhJ%}u0KMxko#3iB7y`W75YZTnN%4So&;v%Q_mJkXf)qlC5AsZbY +z%t}Xpe2ZJDS}LKRmxk)O|X?3qSd*XW6B01xYTDMrCTb$_H*4traF`F!VH?n|}IZ4wVyZJ)xZu=EzwuW*#%wp)qG^Ti +F3*u@2*542OBjNsSo`p*1n=qC;{d*m`8SWQQO9KQH000080GJXdP0n?vm=6O00GbE@044wc0B~t=FJE +bHbY*gGVQepLZ)9a`b1!CZa&2LBUt@1>baHQOE^v9RRZEN8Fc7}yR}AhU4mE~e1A&%8p_lej=%Ey$wI +_*MMRFy1vuVhG?~LRqc9PvfsSnMTp@U?+w)88RYKp<%J}6^N$n36s6ZcP9>8O$*(3_!IA4yertR3qF@w)u5 +t1u*oDVCm&j%o;u$eE@54;6O!z2jsXBF4#*@kb$TMwZj^|5R5|~z^)@CODUvm!kGbZMH4yn5sQ;gL@L +;;K%C71Hj0{*eJqoqy!KqkzGK1{YM1cmPQ<@0u0aT8R1l){sMi%3D;|`Q?y&kq?p1^xONL(Z!wz+}hZ +SdDEAY6I&0@PH>ES^G)LX1Ji;t9-1F&m|Uzj6|>OCzQZL+?zACPb?m$`@9vWS1plFoS;sGd7$7W +8`Eu#&FoV0p-@cIG)NQ4dd~&DC#u#Wwyzs5h5;%5cG?OLWt_tD3|q)Zd|LgVj%gJb}6W4hcxGHroEM> +)hKp-=%p643A%65myc5SGz~$z4TjsA7~E6qqEYQTtwK4k=8LSRRn`c@GVo-Q{c=J!b)wNIUAdTOQplH +7vTe%&d#Z0ybEI!edezFb_>}G7HN5#gF@6PKX|Zh2n_}YV?-BOW1YYD;`9``H@Dbf1YTar^Jt^JcM*Cijee3;064_~CP_Opg;qLcP7}CBGJT8a348j(*gWq| +B2=VnGG7du+vU=!XrOs?-uAA+;*_nZEK>w7-u3iP3zdL#8uNrX8Xwfpqvm~k8 +8g{jV~&>Ke^9)J`&VwmRib~qztQjsP9CH7k#Fo?!dK|84_l1?%=ws*88}zh*XyPrmwUFD{Q*!*0|XQR +000O8k-8;afb$-OiAfZj5l-Wdl(acgXkC9=uiuLMaJcGK3w!N~7DNl)rh7$DkM)hG0ANEO+0HG~sVH74im5$q +5{Vu&UYf+3j0_4J=*S>p^598B|R-ton^crL>60~;=%Gmx{{Y+f-YB=k&RZb+D*V0;TPg_CWO01a78V4 +4O+k^@LZF<9Zom94>N%t(&B +vF@7O8=c7@i?#kTbAZ^LMt-F3OOEKUdEW9Gfk>tY8I@|gU8gZq#rD{dpdl4P}~7WV7io}}`gInw +iPr{-57z3=je+qcg(NHRk1gYN?|whGU)GJ8YfpA)d4svol`>gnrLe*jQR0|XQR000O8)VnM>>wqmlYl*sh?zvZzEX#$|kPF40a-x$ND;Ff4&DK(6kh44p +A1RN83{WP>#3NNfA=8wtpc2lBR1}DUayhi`U46zim7JtOEVeuqByKfz5^52m;+S}$S*n7Jsi;;^dCD| +>(g&nPOjA|M|4w&55k=!mks&MkhCMMprn^ljO=~6l5*jPBS(Fl`;EM5kcMQvWH3R%RIy$ +sfi6KQbu+|7%ljxpoDE!7_`s653Xe_1h{^qJinAwMzt|3HXOoySXXu9@ISbc~@MpbCQmTv{8KBnlQU} +!STcRCT=u2ytv!1@^h+7HzNh&AYhB8(D+j40NCiAD@sfSX8UQ3)6)yhgjF(MM!lX~Gc(wSK*Qb9HTe# +Xw5hfWQ_@WGxCF`yeDJEg9bg4a&fuKKwf?jMlj(7#n;vs2^`CozrWp^AR$tNlY|>HKQroQ8|qmKF0&H +aQ*W&oWHyX;5K0jGO~jeZKYwg!;~4I)0)<4NvnrLG}2lXni@ny$ar4*s>#MTEfG@{p$tM+Mla6JgIY1wL_%HsdP<``4-pHkywk|^3uuB8heD}JYg=JSYRw +rD@bIhZDJY|j^I^Yf};?;@r95@*TX!MQOV`$DEg{cOUR2PzibE3etc|o%$${21!;tvsUNaWrj4kadrq +z!8~RuX60ez0mL-}56 +3U=P-N+T`0K^p7oIa6$qvrY`;6!)L1gR4&|;t{kx??@B+f%Fbg4Z$wd@`;ShLc>Mv5YL=e3inSj9M#B +Q50aId8kN&$~T}eAxdfGXF;)5~7klzgtbm#bd_&6aKeYyfi=O-`JnU#nPQShT +(kr*G$@mz9hr>}(I_Ukh=Up!sd;QTKGRB#OV|&tnMQ{FD^i(3Y_QW55lNkkQ8btaA~j!@NA +4H-xWzyyREZzn+@GpKO!sK2T<|IVB@7BW%txx&var`3H)*S4sb>i%>)ldDUMtgAEV}eiI1~xF_asJox +kS5kDmkN8I~(*v`T&MtBUtcb8c>@4YO9KQH0000809K6^O(KX^<0u9I07(-703iSX0B~t= +FJEbHbY*gGVQepNaAk5~bZKvHb1!3PWn*hDaCx;?ZExE)5dQ98K{y{G6{@iT`;@`MhNRtsu4&P90}9U +&Xo<2pOQK3r3B02JeRrfNQZG(hU<*(*A$iXo@18q8S}vD=(vs&?b5RpfkeoHF&RLytrtt5EW=FbbYO! +1{7mGrQie#cJS%wCR@Tw6~lbTj6*KJd>?o7j*Rr&x(Largo;a$PXw?H&bL_#)~4@@e^HT-@lZFM0*kl;nm3X(}iHA}l*OBFB_i|lC{J$rV1q;jv~tF9zae| +AM+9dZUl`C@;TO`SJE9(%CnTp|<^)>rH|fcPX1`p;hj7`zyOT#%lyTwf}eyulgRGrnq}&z31nKFl$g{jz0~T|mO% +Dk_gmBJ~h*NWWPyZ?s|$v}|F%ZtZsz;Pg3tnFCi%;bZyN$a>^XcD5b1+aBh7KIDF|Atalu#CN{Mg)pxKNf__B10J +K!!4{)+~eP2}m0`SXC8DqgiE!gj0X10)qikm@9iqZi6=K+F)39JQPLaLG)Ur{^wZx_AF$7dmv}*P?0Qa}jlp02z?`2{lsEYL`v=Ii?9f1Kt6bjs(9*45>=7=NS<&83@$?H2r8?-KzT=RAng5;DrQ5yGM +PafdLY^Z944R3;&f3mjoi)G#@_9sLQ-oubNhaJV4I7K^uI2ckL83l8?wsr7oCPj5P#5i;n{cqrx5;sw +c;pusaR)jec-AuSL#_6DEnO&~?zgrVDNRM<4>*3ioS4n3O`QxED=mopy@BM;^#G%k$|sedH`-Te^Y+1 +EiI~Un%Ng&iQ47 +RyA6+_~mG3vtx=k5Wf?f9n|eODD4Dg@h?zI0|XQR000O8OQJ+gGJME)2nzrJ(kK7`A^-pYaA|NaUukZ +1WpZv|Y%gzcWpZJ3X>V?GFJ^LOWqM^UaCyaAdym^T6931qqz;D8n`d^jLTfC5dfNOEm)n}x +uYXfM06sF2j|Iz_+x&5(MKdfA)eaB7q2F*BSQ4u3O4dMCw!B+0JQm1Idm_@NY16MCyeUTK!t=f$FapN +c$Zspg_k&8uAO_q^CQkD~n`*g)o>EpC8ynsq3#DnEQ+#RpM%X0#6sN$X +WtD0nTjp><;Nn&U==CW<=7eQj)7zY_hM#g?u+<`(8pP1?oHYZy{MVZ|uik!0-n|;*FwToJR!Wu{0~)s +G70agC4qT=9bn9yV +9oLu+u=+H-2tA@E@GwAH`DU4@sZl)ssI>_x(5BAYo)N(X+wZplQsBoEs?ri)g!pjY2uIHHj0Ec)xl{q +UG_)={P>VWS^2eWpS(sU7p%dcW?P}n{xvP%M=P`9Fsl9WiSIeXCKv=Y3+iNL4v%-Pn*nl2dG(PJ?o%% +B|GTC@pARkA5Uo(qD@gtQ5#P(2)6z+>p9PMpWX)Aj78?MqE2u)(fKV7!h?2)OQq;g(w1zF-V|LC|CyKwE&fx)adxw5u@&m+ +b}N3EhFr}HNYu6rvSSQvNfuJV<}Lr9uQC$!~Ia@nwL3qq&d1Of(Z~S2SFYgDHuoveeM}6A?%=VAYunF +4T=LI!O$>LJ-Dl#u(p8!YaWsi_@C}6H>zO0hQG+y +v};G6bnm^K`T35wqUY^CbvwWDT)&@t<;^LMInAp=AO1ZO`)=+DnM ++oJ!g0;226Y4zcL9~FvM6J85@C<9#P;W@;SQACjcm(2QVs&fhR@RX?`U2@D$=W4V_e2~Pk$)Kqnu6ipLPg?|lK?OZqL?UmEh0dPSWA +RLpVosqU@TOo+@y5y_h&B%e?t}9;a6bDr<%_XDRaSm>A)VAEa_N=)%fsrTLp#HUdHyX5<_Lcay{hl@_vFB!|poQO%rXPW5 +rJHJBY5qc{s?RR^1cO(%hOGfch#!5Z@UGO4QLPE+6u}!r)!PPn5gp9x3gN +qCD0ibsWy`p%;MCCck%mqL;=y!W0fzMj7d_iJ?X{pZGA{6O=HDOi=zS0A@IJ=|uLJ +Z;F6iK`eCWHNN?c5wgToWNTShB0cu9h*CUg2oq-vuGBJG^a`pce6rqi(5XmGPrl0B)s4{Nx=L0ZdFeW +cymR%P4rY8jAOT+8OUI>(3W^xNalkr#Bevqd);mrZCm+1K{J-w39z>|6kw%3z#o6}SVCJGe$2j!zOD= +6B!lW}j4XWd?Z>S9&oCH{e;QXEn7$KP=N01=D)%bs_W#lxGKSgn8|?8pZdoq7T=EjeuXM9JhMQ9aWLD +O|aKg(GRud&opBAm8;l5-$aexRd*$1pItSy+QFrcwOgD9HY*mN+()gE_i%`(^$p<;x?xDfJ?QpLjN1- +(`HZ)i3Y8-}QZZD%^KJ4_xq(s@YRGby;W2RBNl?$M09fchsrMuEsU8raQN{4L~bm?XQrTGjlOk~S +^16WV22nl8`dMrg*GtSar|NIUhm+f4)>qn+e!Ex1=OV#0sTXPx*`ff;NUK(SFHodFE8H{byScOOwlu5 +>nwMm8VW(bp`@y4y#qoHR4-Sk?0|Wgqpg$7iIDr+?&xA%;-@b&I_UPgGX|k^zy?LKQYfy4Ja#cF%rQn +cA!n%F#A;Isj4J@C=c}*CnQ8=Qd&?{!>K#RnR6kCl9dp;<0i4c%aPl-5cat_<~1G;jt(^Z+gl; +Pc3S5T3(!eB&iK5;!pL&_hzdF`AFl?bi4qSo^h?D90&BmB+>9>Njq|xm{uKtEJdr?S-OoV;SXlkbzKX +Fas0wnR?=N7H$|F06Sj)_}iOTphSxwtsc0KfW?3R+e>1LdE1V<*DwC;x&({?Q1|MIr +O7X(0aUIUp!nFBP(24ZcPZm*Y*JkRm`Et3M=hZ{m>SH=G5C!T300B&=dj{VA_f9>HbR2tjm)%Wp>8Hr +q}if#XX_5FAMqv>xd08F!(`WqKQwp9>=YIpQ<_odnZ!p(KE&rs9Fo9X@>;0_U{A&mD@RAqSeC9S>{75 +s6j{zRPa@a=@qnUbuf+3%CO^FX|99>XExcgkSGoBF{|=;92n|A$pOhSQ1GCH!RJKGRSGZPD0N1UoqqCj+rYm&^_gd1ipMwNzR{t8t<*Ww}J{I)`2A)laUi%u6Z^$)v=)f1 +<;1g0W{tHk`0|XQR000O8sTn6t0iX>NRuBLH$Tt80BLDyZaA|NaUukZ1WpZv|Y%gzcWpZJ3X>V?GFK} +{YaA9&~E^v9xTkDV8HWL5tzk+ZO*ap1XOM$}y3+!DVNzmY$2a;`bKvAf)MBD7@Rgqf9{p)XLNJ^wc?Q +W9$a7NLtByu>M=WmAWa=CohiiWpBG0t+SbSrnAmUYGUb<1R>G%pH{FBZ$?atvCqqPlaFzsDCZsyo@%RVgYRo0Qk5 +s;GJH=ByVCep02mY}2kSw)pp67NUQ+%ar-Ms~Vo&+P~W()pgo%ecUcKv4zB^Of)D86)yE$wj$GYd;Ym +Ce&p)-bEUclzl(g!%!@`=6+XT41p1vl^NKnHiS?i6ho$eB;?(GF~w^ntXxPyFWm)$ +-*fqtE*g+1zfQgQXhd2m?PjF-xUIFo1Ne_xRSAVG{G$cUr?ZNwU;7KcV~DedYqk(LKLi!)h!L;AdTwc +erlGNt5)c)t*+R240y`mNq`wD{hehWSWMh5jXUg-UgC%w5#Y}dVz1PP=T1KKO%!$tvIo1&`-cQPh&Yc +B`H1g*BI<#q7K^OlN{yLc8_5rOdP0?+A4GY2Kj8`iS3TrW56l +Zn>u@+_~ZlY@rEzfb75}V|nMGvA9EeDlzFdj5h&{S7lXjuwis1fLqnFJrU%cB*c*z6W@x3F!-b7RcBU +>FAZ0YZW0^i+36?xr949W5)2#qUswv=-QMUL!Rv&_Ox4k_5p6XSrLe=K)1skV|WMCt&js@Ngu0yJD-n +M$y2OHej=>3ZZ%$@G?{&>FJJ3(%K4y0P?wDm1PvfayrWFh{GI-TqxP%=t00}1^xcX;S?BZ6RfoD)xZl +?J6$-UV>^&-$YxCbz3d&4K?TSV+JpiN0zzCtHU?{qs(5pcnLt=DM)KUx>&CM%J=BVHckK7UcQt6b6q@ +H;^C5sNjO6w#g|IAjny!^7_LR#vgL~t<1cTN!ei$ZE+%*&Sm@Hav4p4t@q5?Nk*L7W(XyAgci(nK%xK +x6@sr9R}DM+{?r(8+&6I^LCEZhLHNkN$Dgo7_0BI#SH1!dkTKBVjbtOY`*=&CO+izbhzbEYFtN*-yadp(XQCF9j2QdC_hv4M0 +IXCW@B_;zdHK%wSV3g&Od=7Ge%Uaz)NAP1mvh`! +iINL~U0zOMbTj6F-(Pl(Dv>1|D(tn0F1YY?Tx@B?eBO)%q|gna-vgV2l7k5*v9!~T;5z* +Di&tlf<8?Ez46+KA@w&;CLB9Bq2xt34zVD)b51si7?~fQ^e4qHSaTuqBG&BQk!rNa9{Plt$N+h1Qz~< +|LMj)L&?7bIu5Q0)uGnM75nvTD}^xn$ek`pO!O*iNDg+8?d2Ye+xdK*c}T#$5@|bN0HrLO}L=fzKWys +CesEMB0{qtL!l9!&6r&~bjp{hR+1BMEBHPYIZ4nKURHbobO6H|IS_i^QpzikJ2sPMY7|l2%wIe*o-Um%M=@qCtbD;&^ +Sfu-Q!ax`{*&092_s901eoYd>tb?~sT@t5cgFORhopDuwz&VTIzQaN_{Lz}F@5AtQU$;@5`lAg#V1Ov +?uIc2a41{UC4ngILgTK=rO`$e1V9X66s7(bC}KRL5Xy2UuLCJ3ieOAO)g@N>T@7|{PcF%-v<0lw~OSm_A^hzEI7X<3+33(_TTvm+Ej$|e{DAE#DoEugll6ZUEk0J0KW +%o}IFfB|acfl!lKf5ViVi$YM(=gH{^QAieF#QQLgGGf3 +5s0=C|U>b1%K4?>7`(t$N5o@sIfi>inUb(#sG6k3 +u*jE00*;f&mkNY6rr01Ce`oW~*M@t7PPDzH@^d{6}8`uar$Iz2jr$U!O$&ub6udqpssf?ps(0OhuoE* +wu^A!aH;)3S!`&n3!fv2J=tye#glT+fBSpB$ud+z$)t7*P9HSna}Jp(dED`2lEgBn&v)?%xtY88h +UPlMiaL^6}Q=p_dUgc%mX71dRcd_5pGG(0e+C`HN0Cf_J8qn~ZLey0vVrkjFs|czn--P3BUj^`|gfi-ytuXqpLd!vsgDHEbDC>SEyb +LYGniv7E)w{MvU1Jae)ow#2;=eq-O)WMc^+OGtg8evBrp4@rQg3fKu2^rz)!et=nnE8^+gWK*4m~+k2 +byQe+gs1w&9uH_PgNk<2(|M2rXV<~%$Pt27)`CStZNm9%gVI;!0Q?)95r@S0se!gOak}Ybat*Swwz-G +U#ZtmT`aV)bZGIcLtL{N(S+2^O)Z5u+=Q4d)axq+e4Nmwfg?<{>`+tn&nz4s(UDaKHU+ay6-e?UP2~* +hWrB8CPZ*!)vWV=@KYUC^-)!%O+Hfao9lPea6J;xaXFQz2J>XGgNWf~=N|*Z8?Dw!6_WRdPnFee3Naa +g7b<0*%2|>-h+Qecw1=Q$4;Y?7)JZw%J8uTz=m>eJ|FEN<1yd$;pnW7ED;)N6A*y`B&soEs$1{DGS%# +bMLEh1945K^RV1Ufbm4vj(NGjtNdazU-C^g#KO=cl>zDWzxgx*Ix8t~t5r*O+27J{O8ponI0Dud>bBs +UJNSJ16{E>F9hi{{W-qff59KxK#(J>=;$Hw+}0t&tYWDMhO2|(@dX)yMrD7#ZwQ8gs?vTiYj?XkqcGd +h#7)QA!=Qw`fs*!m@)HSvk#QAf{?p*p?3Frr20uk4o}KCqwP{{)lh)Q%RwdA2K-Ob~GB7}HQ`e1njZX +$t~fg|^cw&Aws7A-=V$2!Y{Z2uTUc16Z~ZTADMoy+_65GFYRE5OQa!IGZlc0MfYtciMM_kuNLZ4PlJ^ +2pu?1aGUNzfOjB?w>=67Pv#7d>ptmKb%YEO!8~v$^RabWsSfvI)@WLh6okJy&90|`k8TinS8ohi(-iM +7=RCaDJ-2Hji^@I45p<`zl?PezBJH89`vS|G3pw$1pD=e}Cj@|8VIReu|Fw08Dxt8(F{sQ?vY`f}L)T +y-0@8Qc5`#A$djbTM`fO~KjA@3JG;JTC1mOhxbAa!fRuXb1{gzTumlBc57*7pk_8p`GF|`5uIyVP&cy +)PsiH=IbAXou1Lc_%VD>Dc9&M0Td@SVNAQIal97B`}f^J7fFzeBYiB|>|J$wW}|u-0v-w7o$j^tDxck +W76NlaSII%Y20ScLjyz#i6cq#{pW1J5Gol5u=nMgw#=%s9Af{XU{Xtq4tp8M1JZTg6r0|lw6MyDk%5P +wj>C=pj{f_aX*-{{tjD|mHK3F1dxfDgo00GU464}s;XWI!4DtUp`H4ED47q@Tq&3X84cblj#W +Q6cumHo(*9SX1QUZh9kosKyO$+=5BZT*D1dTg<(?@IWo0|9W?JXIDwW!_nX(!}x4;ocn1|^h6+*_+Qg +SVV3*_Q5>X9O}pORFhKAE%Cr1zZ{NkS_PD1Ccnz?3f;TkGn+WE>ADv2@W10I-3T&|-NNC#Sc5TbKK6i ++Twix+RgaxURT0E-j&7v3n`u28sb2>O_wnO{By$agR+4k27n!aB?xj&6@!agqtFcS2P-%=<2%UZ^dC` +Lce!SS|5OepB9cDFm>oL}SySIjuMneK`M)S!zFR4JO43q!b82m<(+iDzgbg#_ +UW9i$+27IcE6@m?pfCyLCgR5kn=S$=aEkDhEf@s%6)2k&Vk!{oIEZ_^rrUMC;>HclbTD*vu +&*sGK*2DU6$mQ0{cb-6114Fy{b@0${>!YGwixWQrLo)V~mPeFoco+yr9p66&@`UUZDgXQMBk-{Jq{(C +UsCc$;uK?tauX+$sxGQq*t%3s6e~1QY-O00;n9jTKE^!x}Av0ssIl2mk;b0001RX>c!JX>N37a&BR4F +LGsZFJE72ZfSI1UoLQYtybHPn=lZ4_g7d{RUkrqK%_jjQl&n%eOs+82L^E0*sL$f=I=Y^7FftOQtKCE +`^?Ol;~Ahdx}l7f-gyIzQPH&8ILc2}OYea7YeI&7sjEt;ijXqcWd>fEP}XrNN6T;h@&~+nVW0u!W>^b +u#LWOdVU8(66=U=){`cS721pf;KcRUn?>E+K?5q=eZW=@X$iqGj|brO}#ql=j +#)iGUx{W|cUD3a7YBo(Tywz+j|-Pga5Z-tEPVDc+#S2{J06q-z(k)1#j0bgWw^w6ZC!q(1R!eT&adR8@Yaw9mn81H}S>abvdDbA2tu2m^T?ko%L53BpSoBEW|SM5<X^y{)hfU;?qchhvqj}s9qrUH}P0+ +H}wlRH|Z66Jt_ZP9@Er-_8FWnSwbcMII_Of6GtN(;`kNR#Wb^pRccW#;}?Y2Z?*5^3@_Vojm@+lPj_y +s6L(K#I)q;z848aNB>?X6^1p3u*`TpupFY_y2i1PvEOzUk6)dt8+s|4x%R9 +h~$Tn1k@eLZ*p@kaCyBNU2ojD@m;@ySl5*VuXRlyT?qZiT~Gt*A;_iegY6Tz5_ea +zR@9NwI-8>Zy)#2fA|Y+{J60Z=N*qMp^0t&U+e*c5Yu)my`Y3+sN=1 +92W=F0{*=d$b*i~KLN~MF~(_XN$5S;CWf+x+|J#XQc&;n5%M8P;a@XvrX-*@#RliOwVy8J2vE!XTIkH +{9FI51upOm|HqRSR?r!3t57Id1`LD-DS3S`7>!ULu`WTn90$?@WX(QTJDAv`5P(Z#e_@=DN_ +C%Y2i7BC5gGCUngf0iy;Bc{n;B|{MH-dE<$csvgC%W@f+3w4lHD!bQh9oQTiggaOvT(R +vGw0)&kh$y>ipjz|gg$Vk#ScnJwPp=IXD+v{9LgFrTk|R@TUOn0xNA!wb0~G*p9ASwOng&`tSA?6b<77Tz~d4Gc!wC6` +8U17U{0m3!5Mf*f1xJNetk@LlB@Jfs3cTLnS-WzNfV)%W8fQSr!Mf +5sG8%0=U6ClWbT{9>qyVaS#NB*s=^lUD;&f3pk*T&^Y27qJMznN`S|;`94zN&rxy}NB4JkKi@w*T-`s +!zYC3h#RP56!;v3lEsRla*}-7KAF{++W&_+I*(upI(VKXHneF}2;)Y1{3?^I%Xj_T4Q}qO5ZSmUs`cj +Sh2ULN*I0P>8Obx-A_4~|mO^AK192vTX`0wtb9^B2E{qy5{XTh@LEc7&_aX#AmYmUAMaoCLsBT;>