From f1fac282034f2a796a1678ec36a6948e883f391e Mon Sep 17 00:00:00 2001 From: OzzieIsaacs Date: Thu, 30 Nov 2017 16:49:46 +0100 Subject: [PATCH] Improved error handling for renaming authors and titles (changes related to filesystem and not only to database) --- cps/book_formats.py | 7 +- cps/db.py | 14 +- cps/epub.py | 4 +- cps/fb2.py | 5 +- cps/helper.py | 118 ++++--- cps/translations/de/LC_MESSAGES/messages.mo | Bin 302739 -> 303031 bytes cps/translations/de/LC_MESSAGES/messages.po | 212 ++++++------ cps/translations/es/LC_MESSAGES/messages.po | 204 +++++------ cps/translations/fr/LC_MESSAGES/messages.po | 204 +++++------ cps/translations/it/LC_MESSAGES/messages.po | 204 +++++------ cps/translations/nl/LC_MESSAGES/messages.po | 204 +++++------ cps/translations/pl/LC_MESSAGES/messages.po | 204 +++++------ cps/translations/ru/LC_MESSAGES/messages.po | 204 +++++------ .../zh_Hans_CN/LC_MESSAGES/messages.po | 204 +++++------ cps/ub.py | 22 +- cps/uploader.py | 6 +- cps/web.py | 325 +++++++++--------- messages.pot | 204 +++++------ 18 files changed, 1235 insertions(+), 1110 deletions(-) diff --git a/cps/book_formats.py b/cps/book_formats.py index 5acbc4c4..5cff0232 100644 --- a/cps/book_formats.py +++ b/cps/book_formats.py @@ -49,8 +49,8 @@ def process(tmp_file_path, original_file_name, original_file_extension): meta = epub.get_epub_info(tmp_file_path, original_file_name, original_file_extension) if ".FB2" == original_file_extension.upper() and use_fb2_meta is True: meta = fb2.get_fb2_info(tmp_file_path, original_file_extension) - except Exception as e: - logger.warning('cannot parse metadata, using default: %s', e) + except Exception as ex: + logger.warning('cannot parse metadata, using default: %s', ex) if meta and meta.title.strip() and meta.author.strip(): return meta @@ -111,6 +111,7 @@ def pdf_preview(tmp_file_path, tmp_dir): img.save(filename=os.path.join(tmp_dir, cover_file_name)) return cover_file_name + def get_versions(): if not use_generic_pdf_cover: IVersion=ImageVersion.MAGICK_VERSION @@ -120,4 +121,4 @@ def get_versions(): PVersion=PyPdfVersion else: PVersion=_(u'not installed') - return {'ImageVersion':IVersion,'PyPdfVersion':PVersion} + return {'ImageVersion': IVersion, 'PyPdfVersion': PVersion} diff --git a/cps/db.py b/cps/db.py index 7428eba1..1c274baa 100755 --- a/cps/db.py +++ b/cps/db.py @@ -26,12 +26,15 @@ def title_sort(title): title = title.replace(prep, '') + ', ' + prep return title.strip() + def lcase(s): return s.lower() + def ucase(s): return s.upper() + Base = declarative_base() books_authors_link = Table('books_authors_link', Base.metadata, @@ -64,6 +67,7 @@ books_publishers_link = Table('books_publishers_link', Base.metadata, Column('publisher', Integer, ForeignKey('publishers.id'), primary_key=True) ) + class Identifiers(Base): __tablename__ = 'identifiers' @@ -197,6 +201,7 @@ class Languages(Base): def __repr__(self): return u"".format(self.lang_code) + class Publishers(Base): __tablename__ = 'publishers' @@ -204,7 +209,7 @@ class Publishers(Base): name = Column(String) sort = Column(String) - def __init__(self, name,sort): + def __init__(self, name, sort): self.name = name self.sort = sort @@ -212,7 +217,6 @@ class Publishers(Base): return u"".format(self.name, self.sort) - class Data(Base): __tablename__ = 'data' @@ -260,7 +264,7 @@ class Books(Base): identifiers = relationship('Identifiers', backref='books') def __init__(self, title, sort, author_sort, timestamp, pubdate, series_index, last_modified, path, has_cover, - authors, tags, languages = None): + authors, tags, languages=None): self.title = title self.sort = sort self.author_sort = author_sort @@ -300,7 +304,7 @@ def setup_db(): global session global cc_classes - if config.config_calibre_dir is None or config.config_calibre_dir == u'': + if config.config_calibre_dir is None or config.config_calibre_dir == u'': content = ub.session.query(ub.Settings).first() content.config_calibre_dir = None content.db_configured = False @@ -309,7 +313,7 @@ def setup_db(): return False dbpath = os.path.join(config.config_calibre_dir, "metadata.db") - engine = create_engine('sqlite:///'+ dbpath, echo=False, isolation_level="SERIALIZABLE") + engine = create_engine('sqlite:///' + dbpath, echo=False, isolation_level="SERIALIZABLE") try: conn = engine.connect() except Exception: diff --git a/cps/epub.py b/cps/epub.py index dd9ad28b..10665576 100644 --- a/cps/epub.py +++ b/cps/epub.py @@ -12,7 +12,7 @@ def extractCover(zipFile, coverFile, coverpath, tmp_file_name): if coverFile is None: return None else: - zipCoverPath = os.path.join(coverpath , coverFile).replace('\\','/') + zipCoverPath = os.path.join(coverpath, coverFile).replace('\\', '/') cf = zipFile.read(zipCoverPath) prefix = os.path.splitext(tmp_file_name)[0] tmp_cover_name = prefix + '.' + os.path.basename(zipCoverPath) @@ -93,7 +93,7 @@ def get_epub_info(tmp_file_path, original_file_name, original_file_extension): coversection = tree.xpath("/pkg:package/pkg:manifest/pkg:item[@id='"+meta_cover[0]+"']/@href", namespaces=ns) if len(coversection) > 0: filetype = coversection[0].rsplit('.', 1)[-1] - if filetype == "xhtml" or filetype == "html": #if cover is (x)html format + if filetype == "xhtml" or filetype == "html": # if cover is (x)html format markup = epubZip.read(os.path.join(coverpath, coversection[0])) markupTree = etree.fromstring(markup) # no matter xhtml or html with no namespace diff --git a/cps/fb2.py b/cps/fb2.py index 65d44848..262a084f 100644 --- a/cps/fb2.py +++ b/cps/fb2.py @@ -3,10 +3,7 @@ from lxml import etree import uploader -#try: -# from io import StringIO -#except ImportError: -# import StringIO + def get_fb2_info(tmp_file_path, original_file_extension): diff --git a/cps/helper.py b/cps/helper.py index 2a85f8fc..efb88203 100755 --- a/cps/helper.py +++ b/cps/helper.py @@ -45,7 +45,7 @@ import web try: import unidecode use_unidecode = True -except Exception as e: +except ImportError: use_unidecode = False # Global variables @@ -55,6 +55,7 @@ updater_thread = None RET_SUCCESS = 1 RET_FAIL = 0 + def update_download(book_id, user_id): check = ub.session.query(ub.Downloads).filter(ub.Downloads.user_id == user_id).filter(ub.Downloads.book_id == book_id).first() @@ -101,7 +102,7 @@ def make_mobi(book_id, calibrepath): if nextline != "\r\n": # Format of error message (kindlegen translates its output texts): # Error(prcgen):E23006: Language not recognized in metadata.The dc:Language field is mandatory.Aborting. - conv_error=re.search(".*\(.*\):(E\d+):\s(.*)",nextline) + conv_error = re.search(".*\(.*\):(E\d+):\s(.*)", nextline) # If error occoures, log in every case if conv_error: error_message = _(u"Kindlegen failed with Error %(error)s. Message: %(message)s", @@ -123,7 +124,7 @@ def make_mobi(book_id, calibrepath): else: app.logger.info("make_mobi: kindlegen failed with error while converting book") if not error_message: - error_message='kindlegen failed, no excecution permissions' + error_message = 'kindlegen failed, no excecution permissions' return error_message, RET_FAIL else: error_message = "make_mobi: epub not found: %s.epub" % file_path @@ -182,9 +183,9 @@ def send_raw_email(kindle_mail, msg): smtplib.stderr = org_stderr - except (socket.error, smtplib.SMTPRecipientsRefused, smtplib.SMTPException) as e: + except (socket.error, smtplib.SMTPRecipientsRefused, smtplib.SMTPException) as ex: app.logger.error(traceback.print_exc()) - return _("Failed to send mail: %s" % str(e)) + return _("Failed to send mail: %s" % str(ex)) return None @@ -230,8 +231,8 @@ def send_mail(book_id, kindle_mail, calibrepath): if resultCode == RET_SUCCESS: msg.attach(get_attachment(data)) else: - app.logger.error = (data) - return data #_("Could not convert epub to mobi") + app.logger.error = data + return data # _("Could not convert epub to mobi") elif 'pdf' in formats: msg.attach(get_attachment(formats['pdf'])) else: @@ -255,7 +256,7 @@ def get_attachment(file_path): return attachment except IOError: traceback.print_exc() - app.logger.error = (u'The requested file could not be read. Maybe wrong permissions?') + app.logger.error = u'The requested file could not be read. Maybe wrong permissions?' return None @@ -268,18 +269,18 @@ def get_valid_filename(value, replace_whitespace=True): value = value[:-1]+u'_' value = value.replace("/", "_").replace(":", "_").strip('\0') if use_unidecode: - value=(unidecode.unidecode(value)).strip() + value = (unidecode.unidecode(value)).strip() else: - value=value.replace(u'§',u'SS') - value=value.replace(u'ß',u'ss') + value = value.replace(u'§', u'SS') + value = value.replace(u'ß', u'ss') value = unicodedata.normalize('NFKD', value) re_slugify = re.compile('[\W\s-]', re.UNICODE) - if isinstance(value, str): #Python3 str, Python2 unicode + if isinstance(value, str): # Python3 str, Python2 unicode value = re_slugify.sub('', value).strip() else: value = unicode(re_slugify.sub('', value).strip()) if replace_whitespace: - #*+:\"/<>? are replaced by _ + # *+:\"/<>? are replaced by _ value = re.sub(r'[\*\+:\\\"/<>\?]+', u'_', value, flags=re.U) # pipe has to be replaced with comma value = re.sub(r'[\|]+', u',', value, flags=re.U) @@ -289,48 +290,66 @@ def get_valid_filename(value, replace_whitespace=True): return value + def get_sorted_author(value): - regexes = ["^(JR|SR)\.?$","^I{1,3}\.?$","^IV\.?$"] + regexes = ["^(JR|SR)\.?$", "^I{1,3}\.?$", "^IV\.?$"] combined = "(" + ")|(".join(regexes) + ")" - value = value.split(" ") - if re.match(combined, value[-1].upper()): - value2 = value[-2] + ", " + " ".join(value[:-2]) + " " + value[-1] - else: - value2 = value[-1] + ", " + " ".join(value[:-1]) + try: + value = value.split(" ") + if re.match(combined, value[-1].upper()): + value2 = value[-2] + ", " + " ".join(value[:-2]) + " " + value[-1] + else: + value2 = value[-1] + ", " + " ".join(value[:-1]) + except Exception: + logging.getLogger('cps.web').error("Sorting author " + str(value) + "failed") + value2 = value return value2 + def delete_book(book, calibrepath): - path = os.path.join(calibrepath, book.path)#.replace('/',os.path.sep)).replace('\\',os.path.sep) + path = os.path.join(calibrepath, book.path) # .replace('/',os.path.sep)).replace('\\',os.path.sep) shutil.rmtree(path, ignore_errors=True) + +# ToDo: Implement delete book on gdrive def delete_book_gdrive(book): pass + def update_dir_stucture(book_id, calibrepath): - db.session.connection().connection.connection.create_function("title_sort", 1, db.title_sort) - book = db.session.query(db.Books).filter(db.Books.id == book_id).first() - path = os.path.join(calibrepath, book.path) + localbook = db.session.query(db.Books).filter(db.Books.id == book_id).first() + path = os.path.join(calibrepath, localbook.path) - authordir = book.path.split('/')[0] - new_authordir = get_valid_filename(book.authors[0].name) - titledir = book.path.split('/')[1] - new_titledir = get_valid_filename(book.title) + " (" + str(book_id) + ")" + authordir = localbook.path.split('/')[0] + new_authordir = get_valid_filename(localbook.authors[0].name) - if titledir != new_titledir: - new_title_path = os.path.join(os.path.dirname(path), new_titledir) - os.rename(path, new_title_path) - path = new_title_path - book.path = book.path.split('/')[0] + '/' + new_titledir + titledir = localbook.path.split('/')[1] + new_titledir = get_valid_filename(localbook.title) + " (" + str(book_id) + ")" + if titledir != new_titledir: + try: + new_title_path = os.path.join(os.path.dirname(path), new_titledir) + os.renames(path, new_title_path) + path = new_title_path + localbook.path = localbook.path.split('/')[0] + '/' + new_titledir + except OSError as ex: + logging.getLogger('cps.web').error("Rename title from: " + path + " to " + new_title_path) + logging.getLogger('cps.web').error(ex, exc_info=True) + return _('Rename title from: "%s" to "%s" failed with error: %s' % (path, new_title_path, str(ex))) if authordir != new_authordir: - new_author_path = os.path.join(os.path.join(calibrepath, new_authordir), os.path.basename(path)) - os.renames(path, new_author_path) - book.path = new_authordir + '/' + book.path.split('/')[1] - db.session.commit() + try: + new_author_path = os.path.join(os.path.join(calibrepath, new_authordir), os.path.basename(path)) + os.renames(path, new_author_path) + localbook.path = new_authordir + '/' + localbook.path.split('/')[1] + except OSError as ex: + logging.getLogger('cps.web').error("Rename author from: " + path + " to " + new_author_path) + logging.getLogger('cps.web').error(ex, exc_info=True) + return _('Rename author from: "%s" to "%s" failed with error: %s' % (path, new_title_path, str(ex))) + return False def update_dir_structure_gdrive(book_id): - db.session.connection().connection.connection.create_function("title_sort", 1, db.title_sort) + error = False book = db.session.query(db.Books).filter(db.Books.id == book_id).first() authordir = book.path.split('/')[0] @@ -340,24 +359,24 @@ def update_dir_structure_gdrive(book_id): if titledir != new_titledir: print (titledir) - gFile=gd.getFileFromEbooksFolder(web.Gdrive.Instance().drive,os.path.dirname(book.path),titledir) - gFile['title']= new_titledir + gFile = gd.getFileFromEbooksFolder(web.Gdrive.Instance().drive, os.path.dirname(book.path), titledir) + gFile['title'] = new_titledir gFile.Upload() book.path = book.path.split('/')[0] + '/' + new_titledir if authordir != new_authordir: - gFile=gd.getFileFromEbooksFolder(web.Gdrive.Instance().drive,None,authordir) + gFile = gd.getFileFromEbooksFolder(web.Gdrive.Instance().drive, None, authordir) gFile['title'] = new_authordir gFile.Upload() book.path = new_authordir + '/' + book.path.split('/')[1] + return error - db.session.commit() class Updater(threading.Thread): def __init__(self): threading.Thread.__init__(self) - self.status=0 + self.status = 0 def run(self): global global_task @@ -370,7 +389,7 @@ class Updater(threading.Thread): tmp_dir = gettempdir() z.extractall(tmp_dir) self.status = 4 - self.update_source(os.path.join(tmp_dir,os.path.splitext(fname)[0]),ub.config.get_main_dir) + self.update_source(os.path.join(tmp_dir, os.path.splitext(fname)[0]), ub.config.get_main_dir) self.status = 5 global_task = 0 db.session.close() @@ -391,8 +410,8 @@ class Updater(threading.Thread): return self.status @classmethod - def file_to_list(self, file): - return [x.strip() for x in open(file, 'r') if not x.startswith('#EXT')] + def file_to_list(self, filelist): + return [x.strip() for x in open(filelist, 'r') if not x.startswith('#EXT')] @classmethod def one_minus_two(self, one, two): @@ -401,8 +420,8 @@ class Updater(threading.Thread): @classmethod def reduce_dirs(self, delete_files, new_list): new_delete = [] - for file in delete_files: - parts = file.split(os.sep) + for filename in delete_files: + parts = filename.split(os.sep) sub = '' for part in parts: sub = os.path.join(sub, part) @@ -460,8 +479,8 @@ class Updater(threading.Thread): if change_permissions: try: os.chown(dst_file, permission.st_uid, permission.st_gid) - except Exception as e: - e = sys.exc_info() + except Exception: + # ex = sys.exc_info() old_permissions = os.stat(dst_file) logging.getLogger('cps.web').debug('Fail change permissions of ' + str(dst_file) + '. Before: ' + str(old_permissions.st_uid) + ':' + str(old_permissions.st_gid) + ' After: ' @@ -508,4 +527,3 @@ class Updater(threading.Thread): except Exception: logging.getLogger('cps.web').debug("Could not remove:" + item_path) shutil.rmtree(source, ignore_errors=True) - diff --git a/cps/translations/de/LC_MESSAGES/messages.mo b/cps/translations/de/LC_MESSAGES/messages.mo index 9474ea9a162fb4d87d44c65acc8fc788f075ee95..d19f5e449639ade4125949586cdf8ec738073b98 100644 GIT binary patch delta 129616 zcmYJ+dE8c0`@iwKLK31#h9*f$M2RG#BvU;|A!HshBtsI_6-tOQq!1-UhA2}a88TEd zg_0>kD9RK{^gE7gf4;BZ^Ur&)>0IYpd+mK)_g#5zf2rp5mur^3thvD*75wj*`V|#B z;Nxp8{r~^9TV1JQ3yS;WM%XoW$C{K+!j17FtcF+MhIkFy|9Y&7qi_Qp8}C8-l`1B3 zu^9~yzDQ}5RR2S{vI5tE3w?N~zM*FoZmrE5D z2Xo;HjzCv%EY`qYu@4$>aJ&``czqm+RVa^6`q6fcSc(Q!AVeH6L_W6&MEJM9mmxA4*UESmT$=q-QmuS%uz#9vTh!0*tl zUx7~iPptfRkx(_XeseV8tp{M-Zco`aC zNW2bfQ@#l+;{)g|cnF=~QFO&mp*u4pz82p``+Za{^Zb3zgIT4HXrCpdJ53 zC)n_xB9Urn{~B?txGmbh9y;;PDYrlq+9w`>E~pc3;PZb(Dvm+}^hmjv9Vnlf`rc@u zi&K9E)~7rO-MM?w@lT)=Jcst5iN=|YCN>A{_W_pdu$T*1{uMfKIok0T^wh3F4`GdU z#jV;YwnF=NKm#6{@=@sF?SbB^Gtu!^q4V5=?&#g?c>bMeJQW6d7=2u(pdT)8pijjo z=&An!x5wYn32OXXOk5XTVPiB-GxSXD5!<72y2f5;zdrx+{2TbPRFu#_!{UwT4vj)5 z9D^qOAiAw?e~7#7oj`y6&mjcwExd>ga3;D+n2a7;ErfUyQX1JG_f{lppIyO zBhW-nM7slb}_kxLNA|IkV z^C>#vcX2tI@G5koztDwL@Rrbx(DqH^R=64OAHMZeE(dBBTc88>ifz$>2coC`cRt$hQZ&w>v|o#UijG7VGS0Hk|NUHeFP}sMyoe5*o$_3Cq7PDDhz9x+ z?Y9CA_$!*o->I)ssdD)#s)ml=0gc}f9oG~~PTYbEpU3^u&^~sGN1y?YPPs=s2~Fg5 zG=YoIewU~HD)dZUjh?aF<3#kk=985wm&*5iJ{4}+=V*q@&NiEv31(_N6*^9SO>dTu3BtSpW7={uT}E+O{7Vup)c20GvsS@t-qyx zJ$lY-RH!zDS~Rnp(Lm$T z#2!ldNi^_ubmCbl&rW$BI_^Dm+#>Xhe1(3Q`wNX#On&Dn(fVSv^ z)FB>=PIxw&!1-wZOX3yixWVXz*P&lxrExMvA)rx>yq7ybi$L)e1+TGDDKM1|&$DsXsV9AMkap6kONkboW z!pqSCLsA}!_8*B(FcuATZ`voN{z2Pw& zXU6kV-#6v{Xy8F;qSvKRC@`jrhE3S^V?-+MMSGqfTxLc!#uv6-LAoG?gPUga`Iv+hGSD*uir#v=3geLkd zy0Y0=P8dDqAI4?qir2*dVwKH`gf>POPy;vc`LDx;TUa+XMibf%&A2T(;0Sa@$Ho)m z>F9*L(SCi=`?v33o@&R4+7vKB>Q|2G73}52eCPN1*rU4z&L6I1vprIZjLc3+T94Q~x%)ppVcA zm!|$VG|_+11y7)Hrj6Pae|L1kR%pU) z(VaLFJ#;PuI9p5@F+C%2hae|r+ywf;g@LU-=c~A6#q(n<(kEcHbE1q zh4$YL-GLp^IL*VwnX4NKm;o~bw`o{g^XLNwqN=n4m;_wYJ&g4^TWXupZ^;W!0N^l5bB*=XDaXq+!< z@%%e*ITiW~x}rbP2`jcL&c?>*)35_tzZ;rBYjj*YbfOMvKL*{gp6CM4K>MAG#_5CZ zOld2ge^2MlRG8Ua>F{8DHuZ0!6MujPT8t*JB=yVC1XiLG{D)3lW9!1L&~e+Maq6RQ z#3m&!476)Hv`o28%I(nsol@?CuB;n6?j$tvGt%BC^_Qi56*~Uvcth%MMaP%Ma$%<9 z;{$1!9G^rpe=g2M1HOhPGB5QX#>H6PnYb+ejNbD<(D^FWF2^ZVY{Z3uHb)0;6YHS^ z8lx+0iJp!9(eHGf(|!ti3ok$uy8?H@A?Tr-gf8HjlwUw^)m+@z=YMfJER8?Jm1w4a zq`U^5V12B*O}^`)^*f^r**)cb&;_+e;~bLuBhWL_4L9@oKhq1m1kH2^8tA%|N5wnh zI5hCYlqbh0(7?~cH&VY4?f*HN$T#SY{(vQaMEX4)s?{kPwm=7LA9qA=MN@R8d#C;Y zG*Blr@uOl7wEszH|K6#;7+qNZv=6Dn^Iv}asBpr&&;j?w$!OrIXy(tQ{9@W)P5oRn z@Vn?|$0DqUKgNx>EfQ*i-uu1Kg&({v&%Zyj^`ycCE<+QzDqf3DJR;>=(0+HKiA_lR zq|`qer=|UQbi!Haj=YQB>d(+y^<#+(GhT}Z+;qEQ!kXxcwn0yQ1GK#vn!p}tV*8}N zUFtied|3P++OK=cJ<;)}qEAQZ94>sEE=MOEiB32c9XK&QgeLG9+HV@VQ!m8V(2wtV zaS3`h{y^ibMw9k%n(SGlx{1JLDKaDHU9bA|8 zjdm#FY>FmO3r%cWtmgCImo}Th~ z=uTXO_8SmOXun}~dH&145~0EX52Aq|Nyn+__#8U%tkl1S-lBKVaUY-o7sfBq{>#$7 zD)oP)ejS?7hV}COzk0o*q9!`94jQl_no!fYN9y-M1GJBw;t^>-8jW)TI{tL@J{rCi*NK0c43D|!Xp`Zv&fxB#2r7q}~KSif?`F1RN)!=C6w!_dQZQ@j&BTMwd- z`3vX^Z$ZkXpSbXlZP1{YxK^x#CQvu!X6TAr;7-^YT~SZ8-+5>P{o`OP-(z$qZccej z9FHulRPj(MrlA35#8=Sg`7QK4@NxVeO?VC3f8&OQHPD@_jjnY2lv|;Rw?X?KfR68k z)&2ZGHVvnur}Z3k%PvM&FdSXMsCXyVr92T0_%gZ!Z^jQ({}uYnt?$vpx*SbpCAzRb zu>AYK$~zXB*N9u89k)djsE-b4lJ?f<#BJk2X#YcFS9IL5@g#HsXQq51+P@!`|1QK; zTo~}`G+d7k7>NcN8z-dwVYL60_zb#pFQQxj20HEwbZ5RpPy26ZzbcK2v$I(vo_`0_ zrNS+0jRxKqJ;ev6{z&xR9+md)=n76s`E+!`-e|vzQ@%XygVFxO(1b>yXW-68rDCFo z)9`dUzJdmN6Mg*NPW?hO!OzhNze#xo`ZWBO`pP>M<2OP3*FbM!ZFDDgLKA3R;=;@h zMgtxmk3lo-nesX4z>CmC3SPLDuExLeuaaVK!ZPI=ia?48&51w+w{N5os>Saikrq7zR-Cwdg!@)yw^n~TQz1nsv3tNHwY%Y_N7ELZR+6zD{i zb}pUp zupV96hE0k?x*58HZDRwpy$O2wTBN=`8t0I-AB84-eCkh2`Ft$@{{J#AT*;s`T!RJ} zk@6kr#N*K|ofMx=`>W^z=Aj9FjJ~qJh^x|GX_umXQ}hkH)h;~$4roS&0a~J4v_Cr0 z@mM|!=#C6P6Dy%Bx&ck>ws;pB?>_YXF*)UD(D%zsbo?u5ym`Cu{2SnXD$HmR8sKMi zg4JmIf9MWv*tBTh1g)=$2HFwpb0HQ6Z#oFbibo#W3y((Z&K=_^?RZ_TRMUZC+dX;ycC^a zFdFdslt-ogE_5p&L{~ByJ?&G`iC&E#pz*#&6Z{E{yBZz0zL5LBYf(`Hop2j;K)u)m zUC|zC-y5B1e>6}Rw10PW>wBRSUy%C#=x59jG=V$OarfgEKL3xV;YBpS8|Z`|rhYMc zHoie8T9f+9&5J;rq7!Zv>!a_1W@x;9Q{Ndql*gpp%d*dZZ!TO>zcdU(Grc9{yU~G@ z;xu%Emr|aOCh$qh-^5ku+4%=u@y5Fqw|Wb7L5;EGbGjcF+6Dbp>?!D(xHRSKQ@$ro zL%+7anf5Qx$M#qBENr@aamebT6Yqmg*d9%&JGy|=cjx(cz{RP!2A%j;G@*y$^Ju?$ zDSwvo&*&-s4-LF!i=tmWbjMnt6YYn#AC4w;T4FfaasHso#+oV@Om_0 z)jf-y+7#V^t|~TXSy8SE31Aiza?E`gq?NC!_tJ$C^I>^SE$=FVG3TK@<2M-Qv|~Vr$U}E43<4 z^(N>&-xlrH99_ts=!E;Chx9OXTo3f!e@e;&u+)Z%Yq)U0i)eti(Fs3H`BU^UT8d8e zE4r0`qVJ2!dleJaM$3&--Usb>FuK5_(Dz0UbO$foi|5}L!!RlwI1U@(lj-mw`qyz* zpqW=~T|6ZX(Ex2zJ|>=z_8W@6kjBRuXq=C*0sfNuE%)a6_ZNlD_bxgdfd)PYeH=^i z&eTss1I879?FZ+TU{EMi=k-1o6viFOX}}HC%hM3 z(L?Czei=OzbJ2-EK?8o7@-j4mpHg43Z{>=YQ{U;R+X`nJqyR`34R61Nu1r zmGXvdi&MQ7npgvLq9!TthQ`|qUD*C;yw0gV67Am|%b))zdO^iGX}A;(JOB+e1WoLQ z)ZdH-7>(Y`yU|-S2|bLnQvMiCd?gxh9r{^PWxry_>R|cL|C({(1TD~xtQa%NZcP2XST(p0`v=2ge=$djppT9Sx;Z`)z81!9zPwJmf{Y&T@ZFXFQK29rA zu4rGhZ-q{<3p#NNG|_!h-wvIpqxF9NAI60%?}~o-9EWcGMX4Wv4!8!rr`M-^J9^LW zLhtcpbi!xQ1ZJY+W~1@urv1aTe}?6s|Ce%M0xPfy{(;SKhXadpXEe}7=t}ybTYP28 zgVBkvMNjt#^ibY~J|&N)erD?Dp||q019|=(u!0Kj)f#lbMh6uE>YyE)qFcRh%3aZw z_d+MS5FIx->T#DYK0r6Tiz|C39X5;O)2| zE=I?Hg`Tyaa1+1(ui?UbvcbVcLoM{sHHdql6CQ{@|A(Nz|L=)Tcm;X}u0?O*IJEzy z_*k44r^lDD{O5nOxiF)5&=q}(u6PN0=zc&~^a~pJFZA*I7wuQ6Q_;Q&THZ2l7aO68 zHb>*{gO#uymVf>~fD2b}6#96ai%v8+4n-5VG2V)P;kXl>a2lHE3+N8KmhyabXFozG z{s!IIAJDV#cPE~IS6=;)qM{D^KG+paU|%$F`;{bze*}x)VfiUItk|hd(8Ihr+J9$s!Zv8) z`=bl&Sgz;!?~;mR(%~d@%TGsd!P#lQ5DnBHJ$wVP1KxlgaXub^TO3~W`yV>tv9V|B zPetROh2_8h+nWow<`Q(mL1>0U(VZBHu5b+c{eA*^dY?lln49+ZQvL)@^h-4EH|U{U ziSEo=G;Yl!c>X;^+i~GNYKBg&jJx4iaq}aKjN4&z>W@WVJXfO$-i?mC4-NQmd>ox{8oKgX zaUQzBg=peSj^z2b;u|X5iJ#C3)}a$@-KB7Qv|mGX>zbjrpk?fY20R{3YaoeR_56j>Gck+UUrsykmcXYx%Kj<2Gpe-66UU!wzlOZ(q(JsM!6V~Y0b=+f(FB^J{q{uXYkLgOzZVCk;?Q*XUpyWScv{-eMgv`lzJU6n2@XN;^>t|fThe|< z%J-r3OhWrVp8BVb;rTbvbSez|S~|{4`2%#o;5q-r@Ko{}^x{w)Y+*i?w-iq_l zo%kT_rBApp!!J|ueab&$1M2@oAIEKuEmqbTJ#4Mf`VQ#IkBXIlr)bC2H%1d^h9=fB z^=-=X{O_NN4(ZSt4b%l)LC=)WLbvh~^xpSJ173x0>DA~?UXSj~t!V!V@j(#T#6>qR-I7@iR8UHR!#s+oO0v?ST$F3Z39AG~lJ^xGT}buR{~O9o_P=X#a`m z;e0Z_j3r+n?{Q(rW$222LAUJBl>bZn2FDfko1;5Z8%>~L>UW8IpgYk9jdxJ&oc1p0 zxbDaC{2S<`RGbt0pf93+=qq?68t5T3vB%>x=tMKofN!LJe*6d>_j$@oQ(lhl$S=q7 z{Cn{q6$aS!_+l$-q2>DM&g_id%RSJoZJqXg&DzB&#^@7c}qUUc9Tbb{y5{@OAVoeT<%!@6m6|>(HI9b3(CzM(Frb6D|zU z0$piqbmi^iA+bw57TvKEQ|^t9?;9^iCmM(*Ivl-)x1@bC`o-i4e3SNH&>dTs_L?UZ{kF&Q-~Zi- z3%>#FiUvF)9gag2I~ASyJT$SsY43+7GB^%P{Y_~9JJ78km+}NG?{vyfo|Mo3XVWk< z4R4|=o*x&XD_e>NSb6SV&pDc3<4S}*RN_R;}d_!)2ry26vuvv4Mw$k5c^fKGHv z%45(K-kbVI;*;pDdp6});+tsy`RF{KAUjs7SdtFkq{EMB=Bv>J{*9GSDc%QF(e~}p zK#gKEG{HU7zEA4g$3xIt(IxFYa6`ZU_u``bT$U?%F44gKQXYuDh^|3@(=jIPQ_%#c zqyLSFndk(IQ@=Fj@6ogI3mW$i^j7?X z`t)pve#-5c`om(^*bU1Ih`rGGXO_5d;`7nW`=Jxu8poh385bW+{gn6=I(|C3ldqx^ zy@9U$ZFFbfMdN%Lzd>(d=_fAC1a!iw=(rgv&r10%WZqK6{NkeGLp1YG(ZFA&yc`Yi3p(-YwEv54dDSzEiR+^i z?v5s~54x~J(Q*Gv`8YIQuX35^{|qji_&l^@-;}RFw{$Q%;2Jcs;c34$j!pZ$Xae`6 z6F(N8LgUOx`6V>o>z0|nVlEdZ@P0ZhL=*WUP{TRL{UtW$Du2kjAk|!4LCjZub~6xp*!{-`eOMS+v3kD?{aSOHGMC1 z;?C&8x}fioj<&An5 z{Wp!Z(74-SEkFMoaA5*_l`F^;JzS@u9WOx>x+3MP(FBI0D;t^mJJE^9qdWHy+HYFw zpGV`p65qt~&;Rq&VJZ4WV>$Yv@?Yw=KCif!b&4Y9o~zdp!Hv)0am2`S9IW7bW69qpy*d0ovO=)~uu6ZA>BKe}^+;xKgF&1oNvCUAGk52O93p#7f3^7sFl zsd&{28s?xK-$4`mIOQer`?v}X^jG{ZZg^2Kep57ot zQ~oz@(6?x>js~iU2HGapMR%?dI)2yGw@&?jDR+#A_2v2Zp8t;uJu#kx9>z=2fP>K$ zT!%hBqtHYrrTuYqr=CF*dkszOEwtY|ss9L#w>b4*ms0UV{3Q*4r@S7Wxa!5lz%61O zbfO06M2*n|c10JmFS-Mr(DDC6Cq6!&iargcbGa};e=OfibimMfGdge#+HZX7A4Ff( zQ{pRVzYpVQXq<1*$NMLA!gc5ywE89G?-8Yn9l5Y#FZ6LcqG+f%CG{7h&;Rx41oxpU zn~WZ|r_e7Xv(bq@Mi=rOn($94|AvlRgT8>OTxvX?|EgR#phm2XW?mN!uyg90r@mFn z?b6;c<-^bfk4pJ?biz~6mG?$((G_U?>(uZ6qquP3ooTo)K7tN>3SHT&=so`cO?Y9- zU!=Sgjq@X#_^;?8{tHc{@?}N)rs(*su>9Zu+CCMH(xDj|pk>N!(1{OBeW%nPfv%)m z$|s@E`--h#0yKaBQ& z7M<{Q^iaK>@_Q*SL=*WGP53Kx+;Vi>ni3bTyyEg=1=Y|2TcQKD!TQ(`&G;a6YrCQe zosH#$(H*)bj!yeSXq@NJ9eM@rKL<^q^idiXa+`7XhlG0c)U%ZX4^P z0UO8Wsc(hl7ZSRVPUr&8LKe>7|0^yku0uPHLK7L6@9=)YU;^sd8JyX#eT~UAZuna<1dJTGuZc6zMG{6Kj(JAQ4pHKVC z=tAbE{$n)m=P55m$Nz{meE$DRhpGdLj+>!@YoUSbq4%zF+ILI26`I(7Xrc$B6L&=? z?1_#$HJ+RLzA0ah<-h+sm~aw_(keh zpb7qp9@2l%IGbIW&;PBjEGF6xO`rkVp-F6!_I*;`A5FLunpoG^4V~!tcsd&Af_NGF z_zjFBuH^Z5g?Ce7=J%n8y=*)NldJ8T?C%gik;97Ktu16=nE$w&42hg2-0?YqjDAT!c zz{}`X&5iG)2`xe=UWR`8T#4??27?Q?MCI*8|x}VX3 zzop|^^o3E0$F%%LL?`&a|7?%{eBW{YGhQd!3r(nP?1)b2U-PrQTRb84rQyzvUb`!b-qf@>!-iIbQ8IAKaI(|mVuc3*|LHoUjzF|K#0avs#{*895 zJft|~)o?$`+hBPGXy6mjojV_1#n76CHo5?SB5BlZK1X74<_`a2>kEBd~nv z(tanp(nruh)6oQG#Wz#`E_w?-PI(C$cUj6Su>9x$zolXgI#I>7#g=b?{%BSU9oP(g z<+g|iqZ6Ni9Z`FE?HroxrXh_9dn-%7{#(Kp`5 zXn>{YW3&<*;hMD99a_X`h9 zuawV3cjN*zfdMHGN8^n~ytY9b*%8p60P-xt`~*4Hss#e>@m{438*x;Kh{s(^5VcP4L3h z_d^2@O#3ydAD;S=X#dfvzX#pH2eAD8|EV;*7U#zI(TeJD~bw2tS4M4YkSlVwxCme^qHzuMJ zPC{4wC>rl6G~SG~zZT!RKHvZ6r{V*2z{29~KhcT*MH8!XL$Tr-==l2R zr{d1&_$;SpM(-Kh1?JeI5-s3(a&68t8+xFHZdubfO>PDs+ebL?@_nQ?a94$DPmw zTBUq2`c!qp^6&pn@pd$kyU+y2qdPb$?a!eT&rJFCn|c1N zn3swL=)h0nlGHCl6Z#3AV0B!Z_Vs9-4M!H^H$%%?p^5I0`W;i>H1&IyxG>;8sc4sS zhmQN?>ya)6qZ|pb1}sPIN8$c-zc8=ZA1kQ*Tpo#QD zCmw{xxf)&Zbt&JB-h$iEc;nH;9!KLnRpP<{FQO}dEgj~kenHBM(LhVE5w1W3*0{a+ zT3#28(>k_8&p=1C-!W*yr^a*9L`r>AaXFgNU^LM1)Q?0vj*0iA{{EC7O?fIh?s;^J zUrzhH)W44=uqfpvMSH1Y85d6c6S{?~<61QH^=aR1baA+9qtE-!=!E;A;|@S4?uf?g zicWZ3%BP_H&qWt>5tcvy`*C5%E71VgpdD{c{b=;o+=Kq;^bi{0#k9YQPB<4mR14Dn z9U5l^n&5Bouhg$opZ_X%6ahCu6WJo=I%wc}sc(XwffndbI{TrC{12U|JDTW8=!9pd zd_LN*9~$o}be^GD{`vo=G~6EVLAQPqx}vAiEq@aYyeQ?*(TRUf{U7Lu&>HkTu+f;} z5Y|S=HAZ*18Tyx8T94uRFW)OFe2k7mGd&T_@HBKlZ*-!|;#FwCYtS7TjwXCN`j=NH zqH$)SJMudEi;QR*pHX4jS*BxDZ|FlC*z=#`&R?ioei6 z>(GfS-&1s`7VDt(P2%q8)6hEQ4p?3pI`PqHyq+naiYC@Obs#6oP!?bzG%W%qAR^7jzat0gC;%+%Rm1=#)Si(MYsATG|=1V z?}k4{&%m$fQ&9E3Vx`-lNi!X#WGyt?!C1+OI_W4?!oo5nb7B@ve9udbS=$cXS5Ye;&GHr3GBLvL$GMAJD+7QeJ~* zT=76La3i$5dCFU%<99$`wT;m@d!Q5VgYMvAXadKf{mw-aDOFs`g^$Bk=)jTaV{}K# z6VZ$($EopobmCXgadT6CKQ2bcEk#$l98Kh}xZ#5?gy*jo7jEsg=zx0Y4(uHFKqqL6 zPIyo}Ja$9JorI1%6WyUcslN;zHxP|8EZ$_j&;RXQcxvxKx9ssa3;oo3AKkidQ(lb* zsy3+zyal?lZBuT7E@%&Qt6QV}4@A#YXLN^qV9CIzbK%67qKOPcZ^<2TGCJTz^f7%4 z?f+HEzo9Fv{!pf%FT^?M zEn0}iTZJy@KXidrCl`s=Kocx&$AuF%Kv%k3%6p}J5PA;}P5GF3Lh4UN6FU#xk*m=O zZ$c-y106puTst_#Zk!y+?|~o5a1)TX_)L z{}A*rcSR3#uhd^02VnX6zd9Ae(ac7nD;a|Zn27Gsv^Wb*@a?oOLbv*RG_gP9dNj_) zj~2JA78<`Hn&2*2e*X7J!@lSa9Efh+;i*3g9dKOAr=Sy^jeeY7gr1S1=nhOk$3KWZ zC6A)xXT>+;yIB7FzYDoAvoFzs-=QC$E6{;e9xGN{9bM@*Xuq9fb2OorXq^30-vP^K z2R*dMpgVFZ`u;fovHbi$hzbW@hX%SCUCEf#k4ydi=nLyHbY(NqTk(GCKSvY)Ipqx> zFYbM9^r>i?atHJ*b$^`a-$4DS@MHD{EGK}ja7@bgpgS=sw&!zq)bVYBVXJt{! z-=cB;jO);aRi0AJSGB~271hxRwm=iAgKk-KG(g*UAbJZ9!5y(XI{u2Z4~o~K3EqIl zy(RT`#_{O5(u28p1Rd~1Iy{^5iz&Z`?#!H&Kfv-zQ~nmcx69GMtI>FCW2GmG^2V_S zvM~Pt-?(t=cR(|3fCkEH#)ux`aU=Vy=7OS<3^xyCrsn{ zx8rl^I3InLev2lw9&O+1sba;=&{MuAy5e?d;11}P9)qs<#CQhU@BFl1jPAgdsV|js zF$}$zBhY}ip)0)~4frIMzp7u@zQ zwjCF)>_l{;zG$XbV*|V$UEwq6-+r5qu5>xN<^Q7NHhaFPuZQl~o+%%Q-r{a(+}`M8 ze%13l|E_#&8XiLfy@XEiE_ztLMo;as_;dUNJ@x;f{i@6;4&BCR|IN|*tahHs$*7NQw0MF;+d4p@sOSm}l0aoPw?a1%7)E#kIl{~cq~xCa_ECvHmnnADGp_s2)#RP;SC9f@D6c##WF>FemqKSMMB z9-U}q%735}{evFH4PPt{ZC!MyTB3)m1C|$n_CF6z{4%uP0BnReU~QlODO`B3UPmW< z4?Tn*qc5IiY5xOFY(2V#8_g_sXmfN$+n@{B9(_EUpa~s_jyoovfQ~;E%isUc^@56v z(TuM|6B>#R9F_Jl=t?G_JN97eUqlmsJ>_}mxDU~ZK1CB-ijH5I_TRDm`~S6E*s;<} zMWAYE#~Ns$ty10|O|U`go1rV+Gxdj~i5!dWNKbTpFLXg?rM)j2=kk|${_QY?3MU+n z4!kMlThPSrK>OXB`Um49X@4R&@R8`mN1+Qj4jp$AdTUQd7jk~QG+tHW!hzSK8QqwMJL0`@ zQk;SYem1^{j(;`fIcQ?eKvy^%9e+z4gT}olZj=)Wb}uQpm=7u}ggY2U3}&-34s3-3)EbZZVoci?Dr#iyVFEpvCZlm4L;Fp`^1uI|k%n1T(C|8%>D>4sI`J3i#NVR* zentcSmiE8V9a)d=VD(pv{&mp$hG_k6u`QPW`@fx2(Jh{e9-0eN9ujXxcjj*N-cLq% zY&tr@9CU(@;@9XxR;K;$)Nk-w5ogQSc>Wz&p9%-=ik91;@9=}s!_qUJg(lD!?LRn< zK*!yg_6OrrXq;EjI1AClzefB2;=jwWVI36)t~$GD*czRnA-cld(SGgG6&;S=f@9Hu zC&Y8nTh%`fj>FJ6H=$qQ?nOVurkA*ItKUOEES91j|3Eu#_2MYLVRI8Y@dN00#p!5* z^RXE&Lr?pbZx)AcYxHo|Lw95+^wjT~aw}v9OBHR4i;DK>fP>@VsXr>^?kS&$209hp z`g75(?2kSjqtG~aqW5?_y0Ax6{|cJWo8>ak|2wJp5MAk~Q=&k64_Un=MUReJB|2Q)Zeb5OnPx-2puSF-iKJ_D09ux0D z$K9Xu!|36if*#rzQvU|JLvN@25jM8sQ!dQx8+70bbl~5y%IyuuZ(shG!j0z?J$H|L zV|k5eik;#SsXsd9<5TX1K4)j8{?gPBK$kEi4om%wXxv-p@TTx4jHSYqC#K`0>F^}F zglAKJDebe-1m~pwz0`k<#`_da=v(wO{T3_DEyitu_SBAocbap43b(Kp8J=uLVE-H~bW1$0HT(R2R+ zx-;LS6RbiLU!D3jXxvKk3O9N=utic?a5Df-5^ z0e!y4qvM}NC!UFJ@vGx{cm0p7>g5fL-GrXrR{U1ntp4 zhopQgmcPQFfzMBUe{^RC$D!zs-WYGk^1l?mhYKfsAPtkz9heqppn+aZ`&(!t@1uV& zW)U{VHE5#s=NIFfq6zJZ*6$xXqvMap@=prKb72Cfp%a~rZuJFd$02bzx>FMdK|;=ld1QzbX8a3kR-4x2Wb*zPlXvjhz5E*9jBpzrlSL1iEqVs)BZ6U=Swus zx2gXL9k)8JL*rL@w{YWkdH$VXGb-#@8!gvG1MQrSyQ3e}t zi8uJ5uo{;Crts!m7;x(})I$R|icM4BBIUi%&xp3@A?t*0`AO*e;Ouw>`W@;<^l;vf z#+@Et!t&?;Y%Ux)A6>zh=xO~99q?o7SD`ETGv$9`Jpr?H6xDz_CRm$zqtv>>tpnK|jqC43eO}KBo0-bLN zy0BYHT$s^4Xn_0Cfe*(g(8uUmbfVYL1m>fGKaO9Z@mZcj_$kd+}xHtr(W_1azLMXuKK7!b=se z6c-h5#`$ppI^Yv@z}M)+KcxN_bfs%jU*+SXUv+dxYoh(@pl7QAdTU#ui64OFe<{?F z3j-aQh8`)Ohz2?fJ(TC8i42NE(Rcp{^fv($(Ej(M6HiWgDmvkF==c}W!~L4=ynia* z^aAIjD_(%!qtDQR-=kalQ~Vd*>dhAx0qe${(8INB+z);3k3jpMn)-{-giBa{{;%P} zLpB0U8E@+!Y#flrC<90&l+jSAozZGrL zp*@;F$9Ndp{y%g;kCe|qcj!E{|K;eG4@7rtC_3&2bgOSk{pi%+h4#O15zoIJCR1@R zK8_xeU(pHHp%ZWXNm0Kw`i5%|cSk2`hsNoMCeRt(!6VTGd!_wMbSKY6cjl537Y4Wr zo$wkovyo_^F=&8saU$C9VKkAa(f+TdeQtaYy>%a>alVZ|qVugp6E3ah!T@W~i7G8F ztcniY49&D=>bFPxH%z%Hde2*+6Lv>gj{VWNgNkyg;+iyEA4kT~@oqGM z`_NnQNXpNp{bh6|Z=i|HMZcIKdI)?Gz<+i zGUYqae&bXBAUeTg=x4#x=nl_D<9rmCpm9pebMY&B@BU7C!!L_7u_=1*YNH8khfdfi z<)$gOM7O#PI??{R(1D zeiKdb?X-WC_RrCTzd_^vi1z!VT+j3WFBg76sIsK6c5E8kp|U=5Ol(>=soYA@+nw;fuTEc89IIl zx--MjxFd^lsbVx2-urvefK$@p8FZo-(1cz?Cwd1BxF~*(j{6$z_X9f7@8}BGq5U`e zwm6J6(Zm{J6@UKUEfssBKkx64-s2O{1kT1iun)Gv3246$(LZBZh2;spD<-aqCbWIr z5ly^l+FPOh+u6?i6$ho^P%9`Ojc(ELDfdDjzq8QHuSB2c>(D?qqFX*H-iyA_9z!3$ zSt-Ah@>gj5RapL;!mCs9FS>PAmK7OqiY8PWeS_6S1Mi7GmItGc>6zF7OYy$=D%yW3 zdW%=1w`9Zbiv`vGKHvX$rJ^kjEpZ>b5Z(Go=+;e%)6o^bimv$0)PIED`!CUt-5*n~ z{6kT{8M@*+=z{8@3vK)Z&%YDwPK6V;NrwZ|p)4C*4nhN87jH&aIvU-P zyU`t+gwFG5oPmxn&EdiUAD{ykrNdJ6DfkuLf&bzr%Zq-s(QysY37W*_Xu^AJZ>-I=42aixk2xiHWr=tNhb9fziVBpPUR%H!fhbOry9ruz=uYW)8={>iA283`>- ziO{ejGNNHrMxv0StO$|l7R6T~A*3XQB%?$~R%Rk2WK?F^B+4lHJ)ie^{r-BKYrU`c zb)9pa`~G~2rlJYVKofov?LQAqWPZx;#gEbcpJVy_f5U|j(|2ehYtRJNrCj;PB2YCn z@U|)Mgzi{_)Hg@Rw?-3dllH?>J_fy|-D5v2pa09eprM4G^J~$}$Hyt?voRgrx);zN zE!d(c; zZ#^`@eb9tDV?#U*{TLsC_8*_}EUZs?KAP}PX;FV|=wI|0?(l2z$KEZ_1s;ROKO2oV>{rge4dc^sHoB5U z=so;Cu0n6g+PLA$V#3YPhiPjxks9c@+UT><7=4!ZLi@Er`yGtliX%!~7`O+zg5GGy ze(1pS&;ggGeJJ{r4@dirLC4>YPCPMAML#2Ep#7de`#lq1ilzBn81OxGqGf2H<>~NC zT$A?oXrdecR`lNtonV`kw@2ISq`o1#kftfOM0aLiYJ*OEaLOH0J{q0yMD&*RjOU_H_Ym|J-h?JR1$__9L>Kt-ADn+1-lf6`mZA6Z zTXbdX(E(emF06+RY=KUA5IXK?bcH9Px8hVR-%>QefvLX?Jr$+YU$dI??||#m;pQ~l zfv)`SlqaJTJQ!!hr{jxgoHx*M@1PTZkn*ST^Y~5LzyJSCexZ#YM$I=mhOk?t}*Jimtd9x&wXC zeiz0;Xre>naJ2u8Xd<_w6W@i7n;fTN`S<@1moNC@fKK>)%5S297R67{fS;p*R-jw^ zW6EpLEnSO_+xV}-&Cmq4jys@ncDC&K--QeRa@L;cQ-2h?qMq?gG{6A##d0Znt8PXU zxeXmR4!!5o&|~}*dP?3v6I+ZX{3ROiCoG@;Khp3I8ffFci$L39+{AUbd`dP}ZJ`37{N+tKk8 z(5-(M-TFD`LKdL?-c9>QDSv~;`=OMI-_cC}j+NFHvboW->TljSd)vzKX}9@9>AwZ$>Yryciw#6Pm#4xE5VV zrFBL9CTQYY#u}-wU6e}|4Y)AVUC|6%qg#0x`dzLox}x*Zeixw=4n_M9Px;n34xR8G zG|mI)cgQEuIE&H5mtgt76kg7S1Aa`0RVn|8u4FwrapixDr+sTQP#rXp2I$9jQ#9~_ zXuS4l0!N|!Pez}O)6gBh5X+zcL%49FVexu2z?gU^I?+Ax{y07DGgE##KA-wm(Bruv z<&V*MK1btyizPe!%!OO|51Q#F>x*-`Mcfe`*cg2#nxhFGp8C#cz~fTxk@nuPKN|l6 zbmb+q|Mly0{zp^c7LP-p&il{_pFk&?8(&WSn<>AKCj1GykY%a=5uI>V+AIB6#Hox< zyg3@b`hT2%C)gZ1di#68fJ?UVNQX#Y+rcR?3)0=m^b(OY&F`sy8uCOQ)B zSDL_u0j8i6O+zQ1nflr2gmckbv;YnC5gO<#Y>0oL<94W2#HoXp8>1_2hECWjvBAZjbKN#pw8Jdp_mY(1-1<)GtME)$)}8i0jZqH`=g>vjy63TP*+i zUjr`6Pd%FHUMU}nzVkcB-sl&Q%g~jMK?6-o`Dye`_%0gf8?1+G(9e+VH!A9PL*usH zXv0#u<8f5DG&18Bj2WeWy)*N!2h9%R^GU{MO&c1N7x2UVE5P(op?VqUR!hlN1)@olu~h0 zD$YPBI0qd#F!h(B0qpM!=znOxJJWto%2VT`Xd+L>XVD2?it|%ndXEbOEk-9;mWFT9 z0Y9gHHJbVQl&e-Q#%+yGR1Y(HHj&0F#?a}zhqVt`EJlv&<)3`7|AN0JRjjntU z+HpwASEGTiLj#SDccSC(MIXAU=&5)H?f+(cKYkj&!t&?;4_r9m%D5Vx_#bqlN>z&X zP0@G$mgozpe%v#*MaOkUccL4*@^j)P=(rO4w_{x`Xx69d3iZ;@hDM>Rif24|G63G@(n-r}zqV;EiY^ zx1x!SkCV`G_oMwEM^C}a@k8{X{Wk6YpyM~&teB^?RW7zi?@b+SgiTU^RO*jI6X}Tt zI0H?nAG(znr2gVK7+uIvbleEE|ERRzTGW>+?o5Y?=z#muVLF=7jI=+426zGO_j=kF zrhPGbua~C%TQt#M&;)-^`=6<=RLxt#=YM4`9JqD4g71Rp#EsF3_K16<57B|>y*mn> z;AAwh)6o9?;sA8zgV26gp#6rSzplR?xA*7&sa*Kby?_o_h<5w{eb|n>=&!_bL4qxZgB>ieQ^)br4f<-zDPa%0L9k>{U>h6^*Cjjrt3I3EqXI4(n<-sNbb zE75Ul&_vdv{WsjA*uhQFovn_x*G9)TO8cH$aQ+Rj9~Ig*4TquwJEH?nKnM0pdw=w) z9*C}Z1e(wtXaaY~`%*t0jXx7TwzJV&yl@NF?*xmfa3?-TC;l3({}~Oq8Xd3>-Jy-Q zEVi~f+OIC!-UJ=LXUhAh{m|5RLgO8eCVWaM6}@BsG+cl_6NBOibfVkRJ^_96O-5Jt zRO;u(d1xYUpyS?8`O~z26H7njVkO#f4Z0KS(ZCyQRb*TRZQml+KzE`}+INdB-rK9u6^>2&L+HJplk!{W1WQt0j($k3M#oj# zx^QPS{@!T+_VF03>G|)@g~#KqR?}wh}cBwxq9v4qWC+?l{IcP!yQ@$Kc zXc)Saqpi{?o!}2N-rAHa zZClh=jazP;^IwAs1J*$YG)7mtTROH*{Q)T-g7)u_au>9J_modZcd}m`jP@THZ;5x6 zxNrrN(TD3{G|)^mkvZs!Uqt&YNd1TLGxQdGiLQ7xdVJTVT(MnIUj>b~1sZ2tbe>Wj zE}WnVx^*p5ZkuukbinZ`pPKSHDPNNEF!UK3g|75YG@(gxDw^1%=y80!uv9TG9o|QG z;FFY>rMx`lAJ7&2mhzwIMC;L&RIX7>xFy=JM#{C&xDDbiX#d@@{C^7Dn+vzF1Nw2> zv)sTBpXdwa+ITk_=m~UX&!7{%nDT3ALT{rJe3<%WXusuY|1tiKn|l7&a$(@g+ZS8C z8Cu>B_rM*|2|LCvXu$61t?Pw8Z2eQd934Lb-SUy>t-UGrccE|Cd$4@|A5X;%M9* zU&f~R8}5ZW?NAIn3f+z%1FGu74fUfj6bSM8oZ~5jsl}}fxq7D}}v_@BQB>D%A$D%vXE%iOojQgT1 zJ3IA*(20h|5%C6e;#<*i6VQd+oAOjF|M$NSbK%6Z(2vDu%MF}kbY&l)iF_S@PWzwe zxb^6`%C(A9P!mmXm)Ht@mJUXD?r1dOu2}y2zbB=lH=1dG8}NK|;!9H=hE6y#-hu|Y zE8d&>2hj;SaY}xdz&=cC3#k z+9d6Jq<-&|+n@;@f*$KmXaYwg^OP#Ob7A0KMMXv5cn%u)LiEFBaJ(M9r{m&uG@<9v z#OI+CzJadry|gby=lKea`+d2d&)?s;u;UtZ>o?fB2(&rcu{t`zPH2F7Xul>Yw?O;t zhdx8?(1-FkH1U4%GBm;ep>b})^7$W|hKXso4}ChPqk-q8{muAp>OYFh(1cc?Tl*V2 z!CG{}4eA%=s^~(tMEh-v4N&~fup|2CTF`{+EM z73EUJ*IXF*Cp6$1bc@!a0sc$-rj3g7wrHTbDer;?Y>CEc6Aw@QF)5#j?#$`vJZE9~ z@Bf_3gfef9NgPzDY5lKKccsF`8g&G?9bQz@5+qbVYxgei|C*3N(@1 z(D>uf1n+6W`M2RgDqO)MXl75MTmB3hU_tyku0<25zDp6PHkv?VtcSa!agRp(bxXNt z%DvH7^trom{+;kDD$Hy+x}uS2{q1OgyV8Ci`c8i+&Os-B6MZ(`L*pz%Z{0U(UmG`Q zTC{J1#^18Ug)6U)X1o)+;(BP{ed9r~J=*UmbPKzp<4;ce8EHQ|r~Vx@fe+CHmZ4AkinRZSK06!lS|q#`x}fdQ9j%3o z+qI%G7iQ8N9ncExco4eM_UJ^NZhh&y>g7MKK7$%Z^h?k4(Ytv`dR`xIK_iThlhASZ z$LZ)yGgE##<>%3HucrKF+TYui$JOsJi_`FF8ooqR{5Iv4=%%kh1O0OdA z@~v?^`jkvT$IXg!(0N`eapAlth%G9q$6I>gs?p92+9Xh@i z`jpj2ccwWSXJ7Q;C>_j&nRP-Z?uzA=qa9CAd;gR#Nc&}RC>nS;8t0}s7QJN?(72P( zxYOceNc>X8lj-mr8t64N(7SOlI&c}5-vDUlYtfZe-n~e48+6=`X#btjoobTy-Oxl@ zrTxHiJs%f`rlJ#?K$nzHMkhEO4Rl`W2ci>QhQ3ov=xG^)PH;cEbC06&W}^wc7+*{K zTUh>e)dy+#9KDyz(SfVbfa_A;xOowH%eXz-uP&NUQ#8>%Q{OuE2cZeIPy5m6r%E?0 ze_Wl;g&Foo0}Vg}4MMkiNZPMW`weJfx1xb2pou>epF-okg2sC@zK6#B7)@wtbI!jL zEKkMCbo?vj|Ih(d_9y~Yi`$?NS50(+T4=xqDK|qCXn`iUFFH^Al)J=J_u%|H!Ff~| zU?6(WFHiYeG|)})HZ;&(SiaZjxJS{K^=$MZeFyzExgzcB&~Y2>S?tu7=sdMbx!5HQ ztjQtp`YiD)9Hp({QU%Za1Uz(91|6=*^u(taa4?iO_1ooN4iQeT?Jg4;SXuu`$EA%VOcj#9CiSEG0dld=RLi_I=o1pP`M|PxC(JB=Op~t8_y0RW< zLZ_mCSlci4*QEY`Xy7sEitj)J-;?$SQvVp*??p9}BJ`)OE;2K)xy zs-MsRYtp_BecCr{QMeU)FKeSa&=eiF50-Cb>=?VnQ?UHk)%tqDfOF7^FGMpPocf_? z#>3ITqtZSWo!~BX+>|&SO=uPx_XV`yt8roK7i0Oy)umiG!Pn@-KcE4BP5IB1*Ts!m z7X7QC6I4h0?|@FUbJ}-}dtqJb_eFQEJ2t?+EjjCg;aX^XfoxuTdtF%ezC1L%Mm=ogH+X|4aCi^ge;j@uPo zP|JNe|Nf_h`%>YSca6Q!fM=rabO#!wylcuWQr-{k-ws{T5$LmVY|3Y%;|HL>IT(cA;#<)8 z6JqH;E_}!yj?beH*SqMzFVP+NH}zZXpT7ly_S+j>=@Dq0Q&WFo%2%UtZcF`)_!6=s zrHc2taDo-+z56>Iwrx{vStIl}{`;X@do(&x&o}_x+F|G$Z!FsXe)M;$bI?Q=qyLJ_ zcjzBwR5`%JIRA~x7i=Zk&=dW$ks&Eh#CnwHqTlhBqJK2822Hr;fyKC%XnPkl(X-Ko z4Mr2ZAx=UQd;+&){)+irnEB`EfM3xSZqT-<-xdwn5Up<+5059JHmRl)p>+FX+R#I`!+(Q?=1S zMZB%h_%+aYI~~ONcMI!NVaEf}atAb_KIqCWLhs=<@wU|8kG>b4jPuZO@1(p89sgro zi^kdP;KEu5mx>p|?o_zqz0l0|L08f?^+%weUPqeT-aop3aI z>n5Rb9!K8`^GjTq@nZB=tUy=v13JN<=mhKHhV6>_P0@t6M9=ef=(AHBeTDCd#%+U6 z)DfFucWjEoaaSxo%7rWa1P%BVI^a9>S2JtU{x_P)28R^qc@u0vxe=N`2Q*F>bRj*^ zr@R;Lf)}CVC&Vepe5Hzqii?UFcs;-RpN($i!G{$CI>&D47WP0VIv0HiFF_M8#Sv&i zqtG3^HQt%_yU_(s!M2|NnQ2&wZrvJmV5P&01S+EwY#ytl3GRSS)Cldrdu)Nm*#}MZ z5VT*X*e&%ZWBKR*K3sUu2cQqj6==X4<1J_ccf`BVz*ExxaGV)uqy3*nCw?jQ^HW}k z-inW~{Q18$4PT)He?SvjiM~SrMIWXe+ZPizMfMu{%MYc(Ej0-6afu5vTb7ES&@Eeq2L2NbQ02%X@YZNzHPL>x;?C&#Z;XB%?}vUL=z_*S3ypUP zdTU3dT)HI}lhKZkqv!TT^i%6YbS2-TD_fQF-{^`q=ujlMY1|g=R|ie75!!Fplv|)H z->0xtabP+eiVp0Qa@Ul5paV`%`K*-BPx)dr;UV$nwBL_TJU!)E=mMWXpN-dXE6@K& zT=>v@8-GV9{4Z|Yv3O^1hQ1N&qqm?DIzdx3@x9QU+Bdd~9npT>Qa%~I1%0sm4_jQA zh9PL6;phaT&_qU~TRAq~74Jb4zYl#zW}p+zLF3Ge^W(c{oW*F|C0PFb-&b7tsq{lS zRO(a&s*DEO0v)&=HozUxEo_TUcoZ7&c(nh?X#d{mj+}+|yCCJu(1eF|%J=_KsThMM zG9EonkE2iR+vvl%6rJcdbfQ1eKI{o1=?(JD>@b z>T_YkE@)*BUm%B|iF8lW)*a!WLDb#%*XroKt)o1uyAneu)qw?%K|5xAx2 zzdIM+`+m3!UX2}bI-0;5bZ6F~6IMC4uo{~1*62h#p#AH|UDDn>?v3tbTQp8*>;3-U zg$oCs6i>B*a$j`C=b;l^iVnOAO=tw#?`E{$ooJlNX@3yi>RIu{_%?bAKgII-U%`a~ ze?bHOfljmzow!n$BG9I2zwOa`TpLZKA=-ZrbZc9sd^j4fBRZ}tI&pXOIQHq1^WQHW z&W{(P0WVLv6i1*d8igisC))3xwBLuGl84Zz{?)hy8&Uopz12H(Eq1JBSI)nI4y3{i z4?|bn5zV|?$|s`}^+~xuI&L7kqQPkY5%ESe&RFyqPDH=R%tTMs+vp4H>ryUO$12^5 zh8@tKR-2&#I-*Z`&$OS5ZuL+!@M!duOheFI(T59m&8bX?JYC-nQlZfJe!FfM#^ zos0%LCtjEODRCB>@yqDMAI25vPrZMliEed#vBCye{vv`-)CFzthsGI#+)DmoTQ1!C zyU@Usum#SuSO?WoAQPy7SG5g=&jfSZEuFgX^B4d`=ifNTP*+n z|IjpaK+o|}@kBJS)6qZ!* z@96PbkFIdD?!~9r*66)!gzmt;=!EUj1UjMpyTN}wmbVCR9O!;)Q|2gOc7o%}5Py5xWzX9!c3%bDZXo6GGTV0yX zg#lhhZ^itS-$DnzpYmtu1YgGQu@U9p(D%mnCl`Ol(-Mu>4V~a5bljQfsW>0q*-?e1 zikrD`qOs^xIT2m)tkge;26zn}xG?RD(4AVE_HWQz@DsYyf6!NLze~~a!_e`!qT?o`iB0Rp`FFshRJfJ1 z(XD*}t$!6A@OIiiNd3~3m!muO3p#FXtaNH|3#-KHXhL<-{!LTAcPSNzpc5VwPfY!( zXy9|vL9$nbUXo6>9$t}8=3%wd0aC4l3u6#DS@;A`H zOV9+qMpyh}T!T(j>5O7QRnY!hq5ZeV@+m<3H9dp#Z^ItxxDUD$ZPCC-paZ(5{gik{ z>d!_4U7Y&M(Rjn+^=OlJMc;Bzd%>| z9s2P8iB7!9nT1=R*Z%isUkb77z@&MNMC4Rk=g*aRKW9KBU-&}X9q`m_)WzU1^_; z_Afn{4l~h-pGPNr6CLng`~(gBB^vnKlz&S5s?`632L2CSY1OlfAHjBvtO141LzVK@<1`H}~iN zO6L@Bwk^?&8=!$(qXFBXD>@j0eN%r<$^+wNXuqK;Ut`(xe?1o- zkDJhE;BIunC(sF>LkGSd-$E075AC-Y-Kj6)cj!aBGOow+X*suuvpt%4EiC{2zXqvj z8uvse+y_nU0CZcQ8s~_(0Jow>7I1FAN~3K5j4=7XyA9y z0Ux0Om!K1Wllq_0{=dh+(0>2MjRzFBU~{zJ_Go)8Bu=TKAs0@tJ33*@l=m+>R2+;B z=#cs@XulIv-z)WJ#&hGqv|olMd=)zGdh|VTGj8VjpTvb*`*3^)y~nSi881ek-X-X9 z{0{fQRdLq~ioaUX8=Fvn6FSjs^xi)g7oa=*3HtYp)?hu)|F#zv4Xx3qw<|hvA9QE> zqX`a3{S~Pnh7GB|4o&!BwBK`R0&m9m;>YMte2(tucUb=Cs#bF0!|`_-HX2wYPz?>V zHM)|TXo8L7zUZmwi1s@vo`&w&S?EeHLKid!UC{05d=mz8{yjcZsqmi6!E)y4R=Ns9ZeDy7-I@1OURL750W0E9XrNUo|BbHbKQvI) ziwn0x$JIpp*NKhLgmy!J^SKW?t}D909_TGR3*Dj8U@p9e*PtIhx1d`z4GsJVn(-5< ze-YiGSJFNoP2}B_KSC#5iuPNc@(*cWh4%j&Nr->0o(mJGc1bbOPH3i0(2lLpK>MRB zJ1F%X(FBi0CpYmC6FwsKM`QW({{${v>B;GEddmImK>hjgqSRj& zhsNRP1S8P}j7|MSbo_njj!uiS(FMPZ<-h;)0Tv6m$jC(FvbH z`@fv_H_&nKqKPd=6IzP)Ux6-YWy)*QzVQ&_bN;vB!j3h{75vnj@-Aqg7U-+A4f-39 z6L2p)8yztT8FBcP4FEw?#EdC{U0ve>L21Nbi#ko0hO*S z+!S3=b+mm4bmDsG_&w47`=Yn39XjzbsqcXvzcbJTuDp`-@4)M*Fyql_n1lv+2%Yfh z)IX2jiZ{@SzE1s5Xq+|ZgzMubLyH~Q7LC^cZQl!h`VSb&`M2W8RCGgEbZR;dKr_8O z<>BbS(Q!Pw#ZyzBjmDdo^4swf^b{;d6J3Sg>VHaH_|xx}B;vhm6!$?Nk`8Fco+%GZ z`Pw)hJuNfR{yMrtpP@Ut2Ho;1R~3ovjJEHFF0^z67fyU4I${5muSDO7qfUFowa zzlkQcEal(Pg;W_<1g?$7+Z`R(4xQ)NwD(4KqEs=kxTv^1UX5<~$aow2uuVj__I~u4 zn33{q^p?DY-s88?{-2>+{Z-08#NW{O$6w`k&fmXW7;xjO3pYc*bZ#AYMYr-$bj8PE zd8g2=yb>LMCz{Aa^ws=Od=5?MU9{igxYT;j|JPiY(GO|(HLkV;^=sn>*A!3vCg@IV zgSOX3$2UxUQ*;Mgp58aWChZoPp*68@1(fZwn=lt(Wg%ci(2I_)Nd=fhGX(^wNCVC0_ z=DQsI0b?k-vI*$c-=Ff+=z?BCCtiTg^HKbEILE^Qe^KE*-E2g$vbwPmnm{vj;{DKx z+M+8s0^QC(HBiA7qWkeB9i;phK{SRa4GdbsU%#SfRQ(T+XP zj4wj_--`Z4qsP#3@1^`l+H3r;xHT=X9_`1X<1a)%4aZJ)qYvXbXukpI>9{_QM&ph}-+ zGn&XQXkvSziL^!o?vFm@9a26KUE!JN_<`s|gHtY{@vcP^8;!=BkotRXWc?0!hzeg2 zGthv~qV=z%f!{_0eSjvmH1%Ji{k}uT|AHRRztK<6EpIBGp(bei0ce~f&}Zz}5*I#v z{n5;>KqnZ6PCNpg;083nEolF{(OWYkJ{?~~lzJ@C*8MuS1Vl&6|sOyP|RSKoe*g_eT?Mhvnb@AHjt$h~v?R zrD)g`9k>k|XnXX- zqISyr$Ai%X+M_#gJo<|5oBF}2{~sFvPITgX;?&eXc1zCxY$}|1F1nJJ(1+?xbn927 zekGdN-{?L4FXc^dEfU%a-J!bZgw4O^!vAGG5j zwBL2;x8OTcei*$KbJ2ba&~Zyr{srBE|IoxLk1ZCm1rn!J(Toc_9E`5$2y_cOqg&h^ zUGW*{O8cYz&x;qwA?SC(tI__G(0C7|eR}F2N8>z=<$tbXE*DPtdO9pZ@6jjmYjnb& z;~!}MwJBG*y_j$dbi!@X{yU(zv>y6%LQ`}H4#URS*>=zWMO--G3N-U;QobGycysE< zraV67N$9u-;v=bl0v$IexZHb-KaP|PDel8p2a5k z8TwFecxUnO)kJUMu4sa-;{NgA*#6F(|ISo6pes7@Dd>v&qboiiy?2+QD=MLZuSNUa zfc6`c_PbKPH$D_+p$nahj(goemAH5dJvIx`6@7uOsOq?4!rJJ-hAHn6_eMXw4nz|; z1x>Usx}ft?z7*ZrQtEF)zo3-vUN(>W zqsOa#+B>2L(q=5qAR#7<;m#8(^7skK8XgJi%vKX?e|*R z7oa=xe#)Pv{1rOx$FiKi-?(t#pJ`YZHyB@RVO2D-ZP1B!KohK;awGI1ZHo5W58dj6 z(YVK;{f|Rm$)}|KZ1wyPPQ(A=?dZV!(0e!y-QroPe*sjExN;1?$pZ8n(wAt$tI_#NRVNi0ZjT16g$8Jhd*kl04>qAZ9{0hQu>r0{6Rdl0 zF|HB1;@#q2=*ss-6FoE@U0A9(i3@K*A9Q8?(5Lf4^vCI|(FrER$>@$fhz6X2Zt1ge z0UGZ!G?CBIxZlK|Q@^HM=KQVY!U;B-T&!SI^fYW8>*8UQcgMCk5S?%)8u%r2C*Dl? z7xZVlKhZ7TYD#hZ>Z1Kyp@|)c<-h-T2p4Yok!av!(&1Dr?+kit`l0;>rhRbQhoU=j zHM)?I@#fUuj!rlcjWY#3EstQyd%2Dax3blJ#l1QReY!iN4^4k;j8~$+>$wkI+3RS+ zAEmq^<<)4sjqfkow~F=91?`D`*tNQ!^Y2Cbbm)%W^M2`YHTt5t4NYV^y3!Zo>uA7t z(4AS7@~7yEm!S{e*XZe3iS}EEj@$5oQn6)K9w-KE9=AbXsoSFy?ilN%19wFyXpU}q zOEl5_&a2>j=QzQg@MMQ8BRnyK7{2L4Eiy=5FPM!+P_D)cqKZ1 zZQ3iQ77tlvw0=u;+_q@qJE95HL7#na)B3J&gu_8SS_r<@eDEK8;_*73j)-LML8{zCZp! zZ^32{7IAh$7g9eq!}8z%X~l&J9E?tIcg5k*#DVb9jzt5VfUe+-l+Q=EatM0wuR;S3N8^k{S2zZZKOXJ> zP<#wcK(s;A!#S3V6^oPuLDW8fyY!{&u4@ZyjDD>gG z15I!$n$UFgRy~RKd%2X0chEQAXK2UOXvY7cnQruOvBGNTGqMd@zZ1GM4bTLdr@nPO z5bb|BxtW4Di|>5< zp||XK0YDS@7GN+&kJQH6)Cw>(@O$*Vu zpP>u+_A%CPhQCtbO8-Icaitl>G29H@%G&6F=4imZ(Le{K+zH)@$^W^OMtlNhudY(LmQ>1H1`c(c@`<5uJEGn$QRF6Lj3NxIF%ZCh$9YOV*(;q75D| z%9YWDma3(q1{$bV8XBa2cXZ;Gu`L?70~(+!I_?y7YtKLvKPTnEaag=QjzJPDRgB}p zt-A-^s_E#xd%EaQ@kU&TPVfOb;SzKwzE1hO_$#{7HE4qWpz$}FRV2O@x+6Q3<^0u6 zMI&^AW+}HsC)f}D6lcyv4g4crSI*C*xvX&;dCrD#G|s^|aubQp{N{C+pO z!e`L0+b^d5>(u{Z8w6`_y+sC+wc`>F7LXKFRs_X}vHFC3K?U=zvk^ zoAI{PPeBuXD9%Xz?D$-K1s%Tt-H8w4Cuv`XE_}HY+VN*J@ESC;b?DPuWp?f*n#lI( z${NR(XrP19SMZVO_+IGv{wZICet8{=zEQ`Zr>r!Y3p0EieFmOFAC6~J|2n!OZ>78l z-La3+iB`nl&15?lyy@0N0N$OXlfwz99 z*s<-=gzBRAv?=icY@>y8^{oe&#IPoR%3Uq>N(7@NHd@CAY9D1uJ zru_l*IL<&PeiI%437Wv?XaXzIaet%pRhq;3H(=E{MaAamz-`fczhlac(1)`b+J6r; zu~uns8xKo+M|8qt(22UoQ_(nQrhN7s&c6XKOvNBHfh$wK1`RYaJMKc-w!dbXIbO57X`SUql^`kl~3cSZv?PI<4i?~RT-0DT4y zMvv*SDfdEe&G~4YE766PuFl2(&;U1~TXqZDaa`&rq5~$U{=w8gg05&LdT(DtcWfd0 zqFRiO`v#5wL(0Dty`voLeNY9U8D!$_>#KG(!XKpZbH*z(=6{JE6}; zx0HLP+&AR`@lq^*|1WXjiif9R6uN?2Q$Hc~Q_wA)j_%Aesec~*a`_tiid}|21HYlq zz`y91(jA^F65kWOMSElU{I}=AfXAfaICMw)pn(RYJOo|gwP^pF(5=4}?e`$=jZdWf zBRcV)=#Fjie6cgzqT}jd$q$W|To||m`tv{+bVYs9owyPWaBaLH-h%Gjo#-3xo|Gr2 zeHt3~v6P=m`*ZP?=Q;ldSU`oDzK>4)J(@_R7m63ic4z{P(S&wOxivbz4SLTHNquK@ z;;!gU_CWjfP5rqkU;IL;2t0%ef5I7-4inIa@jf)6+2|H8MDOXRXuvh-ME{}*Zv0~5 zX6P;28a)Ly(0kqheTG`5zFjE|N25=7FZ5|X4-I@F8elLQ@LF`@QRrvFEoi^#X`dCJ zMiYK6<@sp8g(-i8CS3X~7hj?if1C1;=+pcgI`Kv?6$3UwZ^4$aCOU3sbb>~4_q4Z0 z6K;!6czD`7VM9OvyK&*C++}Fsv2kLYir(89=mc|8o`-(uyoK)Eiqx-0C;Shcu=2dZ zYUnN42K`W~U#{o#wo-zl%Skfmfje|4R8kbVVD#T(})Nt`Yi>?TS7-`(k

E@*p&UE8=i;2X09FUFc3s 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 bbM(0*hxQ)bVBoprM$W_L4Y;Igvt9llo?HA_ delta 129342 zcmYJ+dE8c0`@iwKl$1y%l2S@CR3e2+GDU`DNTL!-h~kklc8MZGl#mRG43*3&ArUe} znLBRm4D<8fFOPe%KnhShK=R>2YRVx(WGViXsf z&~PR0iZ`JHU&b1^1Rc0M^`D>id(rbv%AwU z!v@L^r91~s@M(0VFXE>7X6jd>6MU8W?^9lf#@*nLqP+&Xkj-#QtcN8Bw&KDG+s2M) z$NkX&2V+er%c6-Rc=w51&WlzmLZIqQr$;`&%k1|5Y^9 zK|3}@SJDOzcp$o^z0m{)peq}UE?^jzZ$TW5_PY*E@FsNSx29aWJ00#v13Z)tvs3>} z$}gn68146V${(b>GUYGO1$`U;O8bU?7ZcY+$8U}-uvF223lGH(=!<3#^pqbQk3k3Y zkEh}ml+VPG|W9gQ;$O>8>a?@=t-VICK*{5f>sYiP$e(Nnt|J%m4? zx2np&g>}*XP0@fmq}&EQyzS9jbpSg41azLW(H*_;U!H#_8cBtLu0$V~ap;H3z35}| zBzo#!!L9Kfbb=qyiPxbkth%miuW=j*Gxgdzp2G49&;YNbekq#B zvb2AT-pgOnz<;7!zb^GP|10V@Lldi)@-{`eRMCtJPj5@~9_@`=;o)%*`n_Njn#kkm z&OC)q_)>fgO?W9f(fjB^K8;_d{oD8}Zo>Pg;$JQdRD;)v)*7F*Pv3J>2&@tlc2)u>zY<$70!JddvR?etiQ zp7S5j59amgb5Uo5%H>zoj%fKn^xfA7?SD?nm!hfMgzn9K=&NrwHo(_6U~g<#lMcV3 zDQ-}u2vj#VMF;MR2J9A(M_=B9(TPW;etgPzp?m%ay4O#o{W)w&`K>CYVkPUTa3>m6 zE$&(e^jP&mZ^jwuO*=Q`i_k(RiI(Bn8IcF1nJB z(2PGv&%zI}@;1SNJS? zk6uJyT}#sbA-bZ~XuzM)2`j1><2FJQ-4xyOZP9za8``fuI!|YGp$B2fhVEQA;j!p| z{wWVY2Mj?I8-ez}B<*8Te?8joCN$wGXo54*70*K_T!h|=H_&)*R_FQm;=NR?Kqpug zzrkjde@5SBThu7FbQd&WS9HR|(Q&=er{W~^9$yegq6uD(o{ekK1y8NP^KYP;R2bk< zbl|*{pT%P>1G>@;H!dcsi%!rG9lt#qw^iH?UHBfQbl5u;2gE~C z-y`K-=nDFxiJqGJA#oUb>n=nm8kzdbQ@#p4%-5j{n2aub~J>`$bMd*r`$4}yFG@-B11^kfuKhYgrSC;3$>Lx`-o1hstKnLuM2G~7zjQgPz zc0>DhN5}O-PyK1=xDi;s73hSQqy4WzclJi>nZM#zE*x-oI?S+v@?-HSbjuc^1DD2S z=#G38*Pw^)7qtJn)YsUwC~twrZ5DUNk{#P}Vc;%kB3C1v^{1o#{}(Sn z6Sx$;Wmlu|uS0L;ZE*%VZtkW$|7P?o6(+DK4X>m3_#Jd>zeEH4f%dCft8ioVGoyBF zh9=w&JyV_01iGjG1a#s7XrhB_@%(#_&P&6EaTFS8Y@Cq#ThW1crTzglvDxT^3se6# zn&?O90zX4vWM89aWRuN`_zg>3m_T!Mr8}W3>X`E3XrO*^0QwxCfd)Pg{eEx>y0RP4 z1Sh9F4ed7*UC?7_0#B!0dW{Pccn1yq0XpGobl}%1|AapGf1v$0tzAr57frYUx)UwY zL)ih{`mU)zI-Z2Sf`=lBmntsj!T`6VVJ4cuvuFY@qKUm8-%tH2bVc8wEB__+f1^84 zxlR$MCfctK+HdQWn_>+=|99rX0qxVFOFSrcM-%9oa(^_jL2+o>N2L8SG~QKdpBQgL z7d9>B8MvX(|D&mR(hADYp&7r74tNtiT<@WQzeE%IG421L<0{oHZox)z3-n%Zhqkvx zZ(WC!_rdb-M!Irgz{AlAk3(13550${q5;m07oz<}#Vg}DG|`FZ#M98YkD+nqqvKwS zZ`S4ccSY|};e?-}hvO^sY4|twn`~YrP!A2z5S^$gI&L>~$2y=Z+#l_CFdC;jdN@x+ z59e8EVi#=A^KXaI>3CBb?n47ViUyj8?!bc7FG3Sof{yZhVHI-q&Vtjf-kG>4zJcEJchLzyL*smj#`zu@SE~4?}OgM!_a`o;da;`J#=Hx1>BhOt>~?qflfRx?F-BD{JoNjC1|Ga zro0@TU}ao`1$;Q{d|tm^aMp9=$>Y6T9B z=f#WAz@t(g8?QqH-x%*r{T#IaGiV|&pl9Y4^e3cu(*8A;Z1^!1|HR7mi>Kb9XqG~NaE^Z9=%6%HJW1|E-QesjvVrTwnd z&p-n|gno9+#clA__!XK^wXKSKzd5?{?a&|DI-m(0vlY+36Q4kZo`Oz1IOVg`@q9F~ zQrgF){^~d(?YE$ZZ3>#eL+Cw!8ogDoq6vS9#{2gF0{%>eEBXUH^%V_@4mHqBH$xNK zGW88p-!$bN<1T2wb}4s2$9F-Wj)Tyr=~#5W(hx43a0EJVRJ;Ps@EWw^1ayaPjd!D8 zJZ8oP=-GG|jk6M+_;WPQ+LV8aevN>wx%vRQFAmvD>T6Fu>;z_3%a#O zp#A!yhigE}XQSgrpz$t=V^Tj3tN8gpkqh6=x1fP;Plsu72D+k$Q=X09%ctUEbO%?Y z{Yx~?w<-UECiWNFuWG~MFxJA2eEyqr;egiY%G#k59Du%Xdd4%+TX8wMvTLz1-hdvq z$Ix4_08RL{xD<{5Zu}^&!t&?;*IXFzM>Npy=(p7k8Wj_^Km)Wv`|W{Fus6E3`=xvc zy22ySe!b&~XupBzg3dz6k8Z^CZ{VxaaeO-7jIMM_>hDKy(Szu~N6~m0!`=(biTDI|J;b@-+_NpVZch;6dkI^&CvQS(EyEO^SE=`cSYmug-);^`X1;O zd!x7X^mrlq^juTo!WB(LxBg!A9zKRGa6aygU*HZ{yK&`;ov;Hs(LnTYof*$Z-*ltV z=loXmjrUl}ucK$|b9CO)FS+;=O<-NhHJTJFu7%rCUk_bT2ejWIXac=rKXj)CqC0U` z%ERMGbYWMdJOLSBs+e3{R7^#m=ljuDuy^lULWnh z4LZI#x>LKSz6+Lr|921Yqb@yY(`9SYJcW z%o22A@1o;Yp^5*XKL5XRVaLDF1pY$@RBKvvtcOnAAa0BH-yya}$L$_Fp$j-5<-^hb zJ>v;zypyo}cOy>Y!U03jKqF!a9e5==U|hTrea>$~xBgyq+UW~5j?bNSA$A6RdAJAL)JGv89wkr~- zhsNCwjki-N7rUXEc1Zakbl?$a=KaxuL(wfgFXjImKZdf2k3$o_1)bndG_m{9@w3wY zSjwe&TzKynpdDXH!yECPxE!5eCEEX+)c=Bx`wLyb`nYlPVgdEh_8rk%+Zr9e8xpTn z(UA*(*VDDAsOXKZU;vu&;CN0Pfv)TlH1HU7r>;h~{5EvQW}tDNMEfm3ckV?rfhFZK z&)@r8IMHWuP5iFhfnO}31J5C;hp3H>-2B*V$XyB3PmX3)N(|#Aaf|+Q-PoS^t`EhC5KTG?!=o|LelxyrzjIXl; z&%ayLhzcj#6U%1--I3mCVke@Bo{lE=zjy(fz@_MpjZOJR^swEIj-QIgn~9Ep1Wjn} z4m|$`c!LTjSe6c-pj-3>+Wt-Ie?|lSh4%jsO?;yr3%5Wg+zxGTjgH?V_4}mUE#)Ii zT-fmh^b5fN^f9^sJv3LK0jHx|{utVSKDv@cXhLtGhwdFLziQFnq^wJQ?VXC9-5H&y zGa9dSG#5_L4-I%)%0tuP0(2`!qbnJUp7!zRM0dqU(SXmR3BHcTU51WZ8P~)gkooxe zp9=@9kJWZARS z9gjxKr=@&xoPfT$?o0c8^s#*l-O_K-!?zBdc+1wsgpJXJ+Mx^B5AAx?{C=DJI$)ZQlt^XphwIlX7=-$B*5G=iiI| zRCuq?K)3c>^h}IQc{CdEdi2oUj*gp&PB0ritk1+3(D%n{XUJD&pADyTPn#lHPZ-p$lRM9>S2ch?{J38_4 z=)i&KmJdb)UJyrNOUhTFiOfO!J%^54g2sCn9rr1^!(XNR7jDS>6_s`?25yAq7Y-Vr z5&Gt9hTftU=*ss&Z_U9eACD$*3Yz#?=<|Jk9Er{FSK9Hw#CY7qZ4k09?~7raqZE^a-WoYMsN@HqN+9~YyUuR$M^O6`gO4bbv#@ldqi0Q7}4GEPS0%*H18X6k=Je@|GmebK&i zd!BzYJBSJcpBT?a>nEh+40NKG&=svjSMqzxHTNjSH$(e%LK8R^?e{-)%g4rBQa`&I=-E!_@1YG(qF-jLciA zXvc+tIusQZ`=Oa16uZZsY43xs@FX;$bJ6GeGBmM?XuQcO-<9(HXxxX<19ycOuD>uPkz{zMb2(XohM3(LR% ztILHGG(ZP7K?k%zw{owzZ|sH!IuaY>v8f-P`jO~PT#m*Yho1f$(RuDc7dW#c&%ay# z5ETZT9~YtnUye)Afy+|<2z`!Mp@AxOD*9KAHPOWDqC2)V8h`uL?~IOX+llAjd$I== zZvFn~VLA*=pfB1!0Ns(Z(|#Ema3UJ$mXvQt$K8b{JRQ9y4`CC027PmWjK=+@#D$su zjt*Rp2Clky5uirgEN+1&*bv>hR_M4+=t}oT19wL!IzH`#;t+Jc^J3|eG>k#-*|jO( z9PdEy-92bxv(cTJm-dD6RW$IMDSv?WTbc4#@dtFrelOZf6@PPK;0-z#E7=ImycRlf zLo{$pwBPRN*6x+^K4`!L&~XQ&{d=apFS{)cnnyZYiZ+){4fD-`-h zn-=GykJI9mKaIbl6Ku3kF>x(4(Jj&XhG@dgQokd*Gp%t;pZ`6$aO;mqLvM7z$>=>j zE#-63dwv0WkH?}by%C-0c68h{G~SG~Kc4od(TNwv#aL=V#k*YWg#V)D7F~)!N1!X| ziEi=nDfdGsJ_SA9gV95I0s53&o%-8TKNG!`Pp5t{daIUq;rVyKm+AOtI#%De*y^p& zfvwS%cSa{V939s$<+ITp7=3L4<7I1J73qLi;h z6TA+c@W#|nM(^oV^c&EO)W3+nnir?M79Ia{{4R!Wp#ga{IRL;oASv>LZyn+(=ap*!_XC7gzms-H1qN3gg3|A(5GW6 zI>7_+u{aMM{~UVQUPt>cM{mjJ<$9jKU%2p)RUA;b89HGT^!eW&{r!IjG{AA_88`*K zhZmv!$HZ&mgg7bQf%czlOFkY4bKyk&;s7*(GvYbu7moAM1SX(~-iog1?v!Vt zTRR(__yu%lUqR2p2k6Szru^rDJpaBxHtt#^uoW7(amp>wK&{Y$yTyIb9XTxRJqqrI! zw>JKSj{76!e`Dp+LB$qsgl1L;ooFjGU?X&3b95_rLIZa|cdkp?yQBS&MsL9h@r-x@ z+J7v125v^UsK%i@|4y_O7Y1$`cR&NSMt7tw8n^?NSCaZ}=-2Qb=++NK1CK&? zY<#=}jW-ir=)-8-d57}+x8mYCD)f6aKXl>|Xd;)O^Nmh>=|(PG$z=52+<|tyKOG)Q`{U@ubJ2hc;!CMtj86Ct8s`Jt z8&~13*yM;Jv7^xVCm`RZOBE+`;R;5ehiMG@Vz~$XuD1X^TyLWHcvb3uKv!DPqqyhQ z(TVG!2{uN@HII9sEANJWGwNNg=lQ>Y3%B|j^zcnVS2`y?i|)`OH1pR|ehXdkGBmLd z;~F%9U(s=Yr@S8RU**Wc>d5)$FA#F!gtg;V=)i5!0nO2XJE8A`Ht2*0p({Ej^#jlZ zFGAy8hK{=$jWZs7I&MPy-GwDj|8y?g>gUk`Z>PftaU~ky%e1dWxBjQp|DF2((8Q}A zRU}Xy?N=L}utD55?r;?Ax5F;!xF4cOVJ%$j^2WA&B_ zCira1rI%Cj1~#GLJ@j$>16^6wV~WF853O&CuDng$7oGShG@;|rgib+sYB2g3o|pD3 z(ZhQ~(O#;!GYvE1?4qG!L3|Yr@J`ylKv(!98t6Cli%I34MSWE?ff{IHby8nHHi}Kl z?L2=ixG+#FbOjw!J`kPgDD>XLqEZ{hXvPW1ip zFxqbsmjC|Gn_ReM@1ZOFBpp6a{rBk3{EjA2saMf|qqrHm6ZO&Y+r}1YZ-tI)hsNoY z@=qq>#8t4i%v1{Xv=tQ@pfOZB*L zWsT$Zu~pn1-MWq`cS8g8h{vK6^+6LIgx@mcVsah&;<_7+_b9T^QpJMeqGBo9 zaV2^denFpxn#UK9O=EP$?a&0e#>3Ewk3w(d3FwLkp*uDhP4HZFp(D|ikHJm-{onOm z7dNVrkb~K@BX@3}9`BUh7;DxlmiN0u7r2Xgk4;rURpW^+pF_!<^ z2s?9Opgqvcx}Xyuf+p4@?LE-|{o=sXpNaNA58e8UQZ8Y6t5d!n9e-2mZ|}qN@4)-0 zaK*FYTr{DD>9`mjxD4Ie73i(_JmsI`-?4JvqF)Vk0d>$@wPkD(_vp*>ZvqEVp@*Xr z9F0zR0vh1tln0^xhM+4QhOY2@^wwO4CVm~-Z&JJ?PDA_8Ncr&+7fvt_{S%2v z7R4p;Jv8tq@$>ji+J8*>PjtoWF7jfr#u{8 z;U%fRDqfG?x|>p-8t+5<&q61965X){X@8+;FIBwCg)3c#Ch&1wg}x8gr2QW>&;}6+yc#b>(p->cZj>7 z3A9K1?-LJ5dpC4vdZ7J|L*t!VnYWQQpb7pMe?uRiztK;* z+9wz7JI2~|u zbZZ|%<2)5#Kv(`cn#j9o0;P|*@HGE{eoAeAO3}~?O{^O_usb^OvFJVSj~?2y(X&!Q zCmfHCo1F5LlND=I2pLj$~tPP{DbAER5o2A%jnbiz#s6bWpJ zPOt+yZkLqzK;v~zd4F`r4#8@E{`W}5ap;!zLkFCUCN?PT=fn|dzXVO-GIZi=;tgn= z$tmA~#=9rw8E68JSZ4l;Ib4|W{B(FJ9bS)bqX9oi`wBF%)##3VhdvEe2NsEJhJGR0 zGUb-&gl*$qXuN%}LWPTmKI_VU<&h(_a^jvjsYFgOr<~ z3)&9-w!8~^%l18$=ih(_r=kZMuooKO)YPAe20j<l=4+*LKDz&x2Aq7x)amU z2_H=TY;^oH2C!jK8s0!NU6u}?rv4lBp8kw(eYHVFzb(0k`clPsF3fNi8sLfebbKC7@MZK3w+{sO#8R-m(>4_eymrV zo);a~_4#kbg@|;|1~cBQ28Vczo8x1p#kfjQB2eT4cIj9fZn3k=sj(Vo{cW(W7#A1{Zc;|J=_=uti6Yh;p*dHB#D*8QOD7wSfp||kf zv_CwU=iiP`rr~)sz~Xdx3my0&x}`s%0sccLtbS&Z_-5$1dgvB!jh?BU(%uoBr%UXH z9>$|eT=+PgimueMJ8@;a7M*AUx&ybM6Wt!~M*B~X526!2hK_q0JxdEy{s5h4B|5IO zCKunP!%yf0f5!Fbp{jCLv9it4fz8kz*#SK}?a^`jr@dS3jwXI|%DvEdeUPW7RBGh_1k0l`EQ*L?a{5;8x3%1 zJTmq|1NDsq&{IAb{cyS%edkX=ckV%S#dFYjPpABR%8Q2b{2TCfDqQ(HX!+y#d0dMI z`WX%MM_h;Q+y-YC<2Odz>!I~qr`#;=h`z9Pi5<`8`M2UADtw0@jSlRGuHaPk@fnIH zHYV-YqC0gXn%Ldw#P_599!&jgG~T?_KcDg|@y${iK1jt%bmBEB{}}&7C#pE7n5Zh6 zz{cnTwnBHXIXZq9bmBc@7xZa37)`VnnrNvn7Y-N@&q4~#8{b=-6JuXf~`#m0? zM&rDI9nXpDj$4ktfL5dN)};N1vOIskb7AJ|&;T2rTLi3$*4ItBA==(7zD#pYlR9(5q-- zZ=r|yeKe6(Y5x`-|7*(sq`bkfJpVPgFhCtNV10DrCaG_p`km30v`x7a`n(^2-m?Da zMCZp6mcJRHw{8L&|86wS%watLUOY~P1D{EU7tnjW7)|VBbVaMtL--vUsN%e0+(u}> zT4;SebODXh-V}W^?uaJR9^L7K&dc+EY&xEd-m}xuTQDN!E71Wrp^4su9;ydYemLbh zXd+Lc2|tI9dkr1899{6IXrf=2xNyKv=zu@4F;*I0WV|i9wXM;Fx}wkfvFHw+9EYX- z3N+5m=mb;I{?pL}W~csX^wyMKNW+p;EKB)QG{71(;16h`f5rdMfK^8n)6_{Yn)>xiFK9ii(OW;tl9Mn}Xi62U7n`d?oeoqG#d@^yB-_lxv<} zjBkwI(w6A0=#X+ZEdTxAUR-!s`l2g68O`*}l+Qy0l+Z-Sp)0>7?RTOpo{{<|(4BZD z<%Q_@SJ7Mee%jZl&;NH^82A@7@OpIXt6oq9+5|1vMHAZ^O>{eS;@0Sd9ngMV;=!r! zk@B(V_~M zwUmqYXyA@$!2Quo4@r9u^o7$i^}SPnV#)*1@n>K&{2%(*-JJS|Qa>m4AENV=e&)hV z{z4~QAFEtkte^(Eg1YE{MycN}wn8UvA3LM{x~Bc`)E}Gre&{>{i}q5*;4}8HepS)LHcq(?mjC>(e))pm zT%<$$xHme{0r4>O794|4cpN&xDd-NJh9>mCw4Wa@N6*4_XuL^i|2wh#`@b1pQ1J-5 z;<;$YMd+8$CFst49)C*xdUV|8BMY}iCu)i&vUAG2ro982@V+T`#qyv39nOUVddCyf zVIaEVGgCeronS<~6kW+xXu=cGIJd>S&;;*C7xobPRLw^dd1EBczXRV+#}CmL#%EZ5 zBcc)KTb84MZmz5l5m=!5DP>gg7bQ5vQREmu95mF*LI$(Jfwx?!e3F1WVBY z@1dXTE76_#5ADCfsABv^=)`r<`uga-Z-g$OB^tLA(yvr;KyguV2s%*@bU-g`j;E&n zTJ(FsL^RMn=#I_Ca>7_nI4(thPw+k(_ruhGhW7uuT;}uldoIlQ_xNu*RKBd}SPczO zGuA~XYLND(==c_?Z4dGX4v6}Lkt-U~fs z`=W^*j*dS8UBDSBpNsap42^dkx>FO;g-pIYpZ`;-aNzyv_z3#Odjbux5Pgi6U^85v z_H}5W8l#KEYNP$PO1U{YVXN2{jk8zU4;Y=t>@X^PK953Iaw>Yr&O`t0#~AeEbQ-$i zr_qF8MJISW^&g<)zeMBxhW4vIrbw_3+P^_;QsTlDY>#$qg>G^Cbm*M&0qBk#h9=NE zEDJm+a#{1C;A3_JtjW41JzJ+e_ z8gznx&_h=F%ED^sL^Wfb)YnJ*H!92Xw;dNgW;>@tr*zmi<%7`#4^MqhG;p7^pPc$Z zsUL#&AC~%y(H*=T-RT=rf4BPl&q&21Xvev6QRk6?*T!PW>-v;J?rvs6MuE zQ*>NibjP+zd6(D@%isSya^Y6*haRp&(Z{Gay7dFo{y#L}Md%A^6guG;bj4SrTYCc< zZ*to2j`zn|@zJq){^wBP!1-vP7ts~Ip8EIDi9bdYTaB*xhqV8PekyKwRWW`mG{J3C zZjQ!pg~r((eGhcFis#>e2U4L&#=hxrI=TbH(3OrtC%OW?Rg=-c)6u{Wqbq*`jrT0t z?=|#{El2x*gZBTal#4&mj_c4JsCjkq`Mx>YaeFjiOLT%g(H+_s?SCj5_~?|6N5`F< z@@eQo&PM0C1npnCmJ7FHB069S+VLKAf=AJnKaKW#4oze+n#lX{Q?%dLXut1M{}&pk z@-;>Ln&`xJigKx9t28u5?^$y+(2lWn+S{Um_CovZj|Msj-GT1$SahrVq2G{(#!+b8 ziReOa!Sa9qZweQ#WI7t?(R7%X`UU7juf(P34!ws?uo~Uc-(r<(iv;ST_1mFORaZhQ$;J(y9ijJFu?%*@% z4lcs-@Bd#*#oK70_s|SKLIcrKdA1?aeu=njra`_1UYx2Jqh$}>}bY#h(O1D~Wq z7o=ekn$YX$1k2)wXKXeNZ zLlZsRdSCCb1qmuu;lw&_wo3c^@?4gU~Z` zSjv6SekY}T8k)#iaX310DeYq>@cf(E)oHjf4Y#5L??e-uj(&rA1l{6A=%M=nO=JZc z__MeseuusZe?b?t9_?TIhNAx#H}L%1p&=D+WsBGjO<@0c7@9~=bmG2fpp(!QpPKSn z=q>mk8gC?;*tKZ98_@o@p$oseln%4f@L0<8&_D~Y87@Wx{($}9_MSEKR1!Sd(-kE!?*4ZPk4taejz25O-{>1>S-+y$Me9hzt-bi%GFABy(tiN-qt zjW+-tcV_C(#qz)Zy_gHPehj*ziRhN!hX$UT@-t|FH&XvD`XRI&y;WbLhw%5bSG~Eo zMK#dB2(J}D^G?A0hr(zJA@VV$;ULA$TnS$=f zJ?Jko9!mX7aWNX_t(4!pndje$S5Tp!qZ5CNPV@`9!v9iVb5b!;T{O^EX#Z_eZl3m? zQf?F5q5V3a zt+aoD#`zSTr}Skienjud@94_@j{l{-$}L5}8t86 zW1phFRB=i=oEFbQ1N;x&`t#8Zt54Lei543;&MHo zze~9=(0k~_pP*awIhw%t=*0h|z4GLu-$rO6o1*>eroIt+3!0(hTB5hME&3GfhmJeJ zdO!dBr^8S*k&)=YE6_tY4jnKV-H9n^qBGEb563y^r{jF|#kCY2_c?mYzDE21fsS8~ z<$wQI<<_F1My!plpg#KI*%nQ#UECYp!UJ(z?1moV!RWYA=mb}z?}hOxPesSwm-5V8 zdH&7t5h`5i6X>CO9-Z)QG~*BBXK4Sg&@KNi{((+h>9)LZ(8TMZadt%G?~0Dw8|{D4 zZ9M-5>_LSS^+X5sK{FqK-n(Jwy}KM;+3oRebo_KQ;Dd1vy3z${e*um2O3Lq}aaNSL zaNNl8D)Ym|Fq%L}Iw?Y$cgig34`qgYtG)|Ay_eMWePs1j75t``j*8BWFl!oWgKlxmR zp5Arny{dg@VNwaF zdIsJ?w`>i%(mzt(U}{lc7oD(KY!mlJcjOTCMbta>L*hl~*%&*O=idbGqQaFvj86C* zTK^`R$R{cPiUzKHS21yIwEs5f*0)Ai*cHpS0KK)n)7~HLe}2ki?Kw^BNELRYpQdbo~6 z1N2P$@#uj5XrMFDmHjVX5HCd!*OlmwPDcCBL~qq&=)xAD<4dn_Vc?~ySdJc+Ptk#2 zru==%zoG&DML&$HPAdX!hEBXCx`R8S3G9LPI~a|3H2O50fFw|=7{Y~z>%5|(ViekO zY#bkNK_{MyW=(s*;oPqJo)SrtU!i%xC&;PYv;1u-vegxgR7gJt_2KpKe z{3E)uzf!JtZ?U4y(5g6_zi>lzf|_yj)Hh7IDSB&mDsf?ez0#p8`WbK-`V-6`^j?pQ*T!4pbo3U@ zK?5#D7xW35z#261AJ7Ec&yT!dy-vv$V5H#>f=!9pY z6P$;RzbNG~=#E~49=;pmG^AgtVm24vn`h%|Xy)%>WBdf2U_F{>wHZkmy_egf{kKOC zb8GZ4cTWA0u{WCFNhuG)^6&qKa^XsbqX9;t6HSOy&;%by`&@LZUq%yqFRn!6e1+b! zU(l6Tnpq^c5!!zY#zPPJL4>pB;1u zc0+fh3;O;z6dl(W9e3&jJpWdlMTILFo`#Fk@iO$#T!XIcb~Ld^QvVE^_!}vIf!_Py z(Wj#NtfJf$JxlG-I6cu%+0$p``9F&aS2!F^=wfsW$D}+C&G_cj-+`{^Ui7TYP5DJM z&Ui^l)4#Dy9CiEdfV2a5m=ViWWhY>!Q`9UAbswD*mtpb4Ii20lCW z=f{!gxY6+{w14Tkbhs%Mx21eHx)ak=eiX|qP5DLi-oAzgUWNwzFn$)lia($`^Eq zRzLr{bK$@f(XAPT4j7CE8Wt}^6S_2BiT1k=O?(m>=k~PUlllkHevhE>=B0fBmjC>J zQ98Vl4)3A=<%1RIgulmi=(pD@j}(C##3pFJ?a>5UrM?}SSjUvRpyRuuJJ{zDo_~Mf zI42F`&<~esDL;iCx;N3M=V(3M_>2D~19(@jDT(KK|z2UDJd_InN;_X_$rE<^i$n)a{JiGE7?&y*`3FX~Ix zxG>{Q(TO%kGu|d0n#G;az`Lg00evy;n{p2{POp^vqKA0^8t*hT!L!g?a6XcFsp2{= zTW z-|cC52o3ZiI^hRspf%_%`WFpY^NHf{G(snAhmJcKeLwU;`<;hQbVa-c?LQOkKOYb7XyZs=ov0=n`M zslVn)o__<~L4^}MgdUdX(Nnu9z7gL=PyI(|zt!lW`zr0Af1YcA~gLpuDL z@;~U7R?IIZsDZAuHd?5MMuz_j;3`yZS3{^)#z=JWhJ@XS=4jb?UU zI$o0c(ebLZUl(siC!7-RMH8Bp_Q%l2>?t&%S5tmB<<;|f{tfUw75W<*;9vA(weqvY zi>Vg6f~IJ~Ez$mM(3R|gj_ZWp~C!pg_K@&Qol!o)-C2>p~hX%eW-i8La zE9L2EVh^D!eG+|>zMS%h=;8hvy>)-1d{-OFOOHDE4?1wsaw&0cNXoXiu<^5f>~(bd1%Ll@nv+t>*%R|C$2;j zSc~@m3GMfL>erz=v%zyk`zC1rI_RybkDK}PM-wjGfnCuR?}K(c0u9&`O{`BG7>A&N zMxY6l(6ccb{f7r*(Ky$j{U)IOCZ~RiWk3J#;lfO3#K+Nz=c5z9hz@)M4fuB2KR|b6 zCAx!a(f)s?zS8qW{U)&i+P_80ZL#FQE?jtM4o^e>cow=d7ozumEP9wGp@F8O<7da` z(Si<=tTYEV07I1X&)VLKtBtn zqH*S+i9e6_e>3$f(706b;ZAUC~bHE!Z6mxK}(Fy;Z$pzc>)x zsWZ{9aF?JTVw2FFei;2`w6Mg59p6PeevyX%u>7ihvG~fg6Z%!GGy0vb586H=?c>on z_oV)bxCEVOP1^rL(L#lvZy%q8>8jA=ngiBjgkJPitUPvik;HXCgpZ1cSIkbF6h=DjBaHwbmF1t z#OI^;cqDoTu1@__G=ck4elX?7aSNaSr_%5in&JECJzr7oz~??1U>!P9m6wZzYM|vh zu|C>w8+0d|qlvdqduKH60jckf<>&v{RGeT19Zo?5pO*R|DG!eqqx~*R`AYQgjzbUa zt*O5k-Ju6ko}KbjXkss5I|nZ2!hs*e)#>nk{2g7{dNg3wiIt{oUH<0K{FNfrozWh< zro3m$ozVyFz|!!_KLiaXL_8k)%T z)IXg1C(wXTp$WZ+o~F0sXXv;e(SCoRTTsz4# zcSHAhuavvS!_k!<6OT`Q|2PPZGX#BOoQo!O1-c^>O1ZcdUC}i3+&_x$%**HmOVP}i zrG7aY__O$BTpNEx`~Q~mU+6;Cqj9UgmN&;HT=-L6GxSZdPa2L!-x#N(Z<3K{fSb^X zZ%4QIF7%D^0J?ye&R(64EsHDA z30B9i(DC1;{r8mDp>a0!U+_9$(}9XJGiDu$y8j6)x{ z8`1H%r2Z~6{&aNQgQZDvBjoTOq}Vv{C_nKOVLE$OZlU?Dt?Ww^vAe9^)=rv#??jdeSI{M?NYxJdUkd}6WI?< z;F!1blf!XTIA8#J3(i0@|6j@%#mmtTn`_V=x;OQYpou?;#+i?fe*wMcucL8SpyNJA z`~C1X&%dYqH!8HsJH^1dXt^P}^*f^zv`c*lbSt}|fqTT`&6LCH|@Fle0>+!v`e;U6+C;k!b|1TPEgLjK~HPJ*iN9#*l zabd@%aYuCGHfYB^Q{Efhkpt21#mAtxVqnT8G~jqN-eh#;Q{#PcR(uTUU#fVL3kN)p zPW(#IQ1K?Z(&edNjrLoM2L3tqf1-!0Vp(x->!OKogC^7rjngvq?NjcE<=-40$c3l! zP;`R6aRB=6AB?_8O6bIwp^1)7c|1Dd&FJ{s(9?Z)+V6|A(1adCZ_(3O{>kBGF5J@B zW@GZJ`tVpWb}*;Mi+2Cy5Nyma^QF_+@d?v zVFo(!!*Nd9=c6y2m*Yxwft+6JzCx$ z-J(O%@mO@r`=DDr0PS}=8u;wg4@><8X#Y#oJ{Aw4d@cI?zlFwM@jlPL6MvP4-_SQ) z#Rr9(q7yYlCu)W!&;s4UmgtH)r~LqQCl5w<<|uUh3Fw3;qlpbc;|woxVStO`D7531 zXd)BQ0e7W+Mtm5(bx)vyUW~7z6D~m$UWSfej?VL0T!W4)eaD5F{+xz?&;gZ}7XzxJ z_q-N5VGH!BXpc^G2pagv*b5EZH|3M#X>mv#R>=QzAQvWZDS9ieO8MrZL&crwO72Ay znSuV!m^4}adgbOn}65Yz=xlW0 z1?a$0=ogdg& z33NaM?vHNiq47wxUoUjxKJgTE+!<(M=caxHn!rdjp=(#<^Zzy~oM2`;J{ISpfu2K8 z{j1m*KSo!uF6~=gkp6}lcxo|6YLAP?B*aMyTBs9TO(ZFZL;i)g7 zXX6Sqkz3Inn2PqFp7Nt{Uh1D$zyH6+g%i9JKTLUmpVR&aI$_19#VyLOC3rcmO)_VDz4zg9g4h^`qjI z=tSetaW|o#p0}qw9X*5(r~C>UZz&r8!_P`Z#iyxQi#{elrQ>=mzfxBffwx4rv{`J4 z25N^U(lO=z(S*9C+#}^G1}v|JngMQ0=Q7Vm}Se>u>Vi#Akr$F^8PJ3fy7AJRGn&vpvGNy1;?>di zx@iA~XuoY!zeCEqqC2#wWuO1fT=@7Mh-P{``bs_(4Ri*&-YnDi+)4d}=%konRQcBNw7O zHU^#O>Npu4KOOD=DB6E++83fvLFp|n+<{NxH)zM-(Sen|DJG~EYoZC)MibjAHbHM; z3v_38MH4$5jr0F#y6=E3$NrDwcO(%-iDadnQAT#MlhCkAWTs@4$VhV8QA9?fWLC0M zMo~g#G-RYud5p{yp)$(v{l3o6@1N&&9_xF2kK;Vf^SbW)#&ZHXPZzXb_oAMEbBGHA z^(!hW2E^;p6%0ZH-Gyd+AKL#hG?DQsPl&Ig{og>Jq8aE}dKXRPQ#66ab3@V#A+{`s!$a+Gt|iq3sP*Zh_v@{bO4+UYB?#`c(8l=Nq6t|2J~s;TVE$ z-NWd&;@8l}YcBdC`X3r#J^Gl{T3*-?J*@kn{X3wa0q3A+;%fA4-4>s~rj*~nk{y5G z!jIpIUy2E~K@-{y8{(np=lFSO{{boAgY_woM-!ft_NC~SuSOHDyrOu2Y>UowAR4FB z3Z8!h^rFHQ+#biGTR9!w!ujadFGP1}3HliRh5p&Q=E`D)Ezk+tq4Ca6{Q$JzaC9LP z(OdZ5N}hi&KBB^V@33qWvC-kH+z6yb0($)6h6G z(_WgFi%-*GDVpiBlz&DiSe5dcw69Nn<=={xY=ZWyh3-rp^m%W9-pUr}p*;jWlpT?? zQK~qT3lBp-G{EiH0EeNOzJ%V>Y1jl8U_)GouBiU1VqCM>98F+vbVpjFiL^=k3FwY= z#`5p~x|c8bm_;YN1P$CD&HOs_u-%0Q9*-WbNofChSU#L_N&E(Vihe{VT!-HCO@A-? zZ-wRW|8=?WacO`~xTg(x7#g@8x-%Wo04Jj>J2UM)Q-5*FSE5@y5Z&_I<3nhi=g{~Q zv1G;Tsdy8e@O?DE{P-n$npdFDbEQ9ugttbY`-bQW_f7o~=mee6Th|p`SYNdN_3@rR zc>WzYh6*Qq5gqs@y2AI-Tk#Qk4?n~5;Y|I{=u@yN^{Z3=Z`|TWCv2)r_kLRG{&yRi3d9FZTK-Z!RzqiDNfgg?I z;FXQbQ<-O}FZz^mf5 zXaYCI+tD4oH|3G&ht1>Ysh^G}Ha~ubj{h3#`1$`67vAFy*A|Ivj1Jrkz31Db&+#tk zQ*scRSUWV~lhA-?qKWoQ{l#dUtI#;NrhPa%eiWAf%YkFl@Em$7C!t&SCOW~~)GtC4 zSeE)f(0>1=zS>_!;JUFPy0gvEetVuZzf#3_TsYxx=zujTSNXT7-wd6wCK_m4^gCk{G*CM< z@eXL5E@=NV(tcjb7oZF2ize6~H)H;ao47F0Ff_n$^mBU@8u$e?;AAv`>1h9X=-K!f z-QsW2@hi}Y{)qpg<14Q#tcLchsXqU8Qn6z?G)#HdxM%A3Lm$u9DIbeYbOIW%Yue93 zck*I1(QDAh@A`NLI_?21c_<#`!VF(c!y9P8cT%34_62b9&S%2%QN|4n&=^~Dx% zh91ss&(Ds2q<(1X??Z3l zNc2`c5nqb4*7N+E;X*3>IQkCnJ^WlyEUWOTr^lxLt@_8z*`^U+)OIeJfjLla$x_N&2L!|_|A6K#)9 z+%Wac(D_=RPeG|Q7X~^84RkU##GdHD+tEP7Qhoqk>1cGqaVbBS_E*ps*X#VR?bFeO z-a+S?i;n-SD3>a}=EBEn1v=5c=}@^+k-+BY%4?zlw@6CSK~B ziUH`ro6w1dpl4thI&gfPfDW9DPVhE5ZVtM0AEVCla?*@i!L+ z+Mr5dH8j9h=%K5NJ{7y6i5wh{ipR&3(Q)0-3D1q^qZ40@&eJdT1F`(~zZtjTd{F5aeXwACMoZZCcYQCLkGszSpNP0;a<>i44Qez zlut$josJGXC-pthi7!rhK)fN|hK{={4v(YI$Ne$%GvqZa`P_b#4nLqPT!C)YS}gy( zU$qFhb=)3ZQGK-EE@*;#$NkcN5W1iv&=*wO*cn|wkE%TX2I@zJhvgb{!dv4*X#0!k z`(O&1;5+D3^I`l7P2e|lC;vphZ2pT*TxXLaktS%o-D1m4c>djiR#bS8Pe3QSARVqm zS6E8@t>_lshi>t6=sSKAx}rDYTr|!XXhJ`rhj=AAu42<7kt!uF+@k8S7CNvFI-n8y z6zm(@qF+?Hru|}c{I%#rH^#we;=`~JKA8IHsecDeq%@xk1AK~Z%@^oaev|s|<8pL@ z-_U_;(f;exUZq-5UoCEl_TL7LzayGZgS794j4xH}#f2RYOozkLp&fd!JEpxW8t7~^ z!5(S9AocywThTxDH>Erjo%jKCp2y;Ntl{_n7r5}=O-Cn~hpy~nbifz!Yjov5qWxB) z{r*6IJ^wFyhU#us9J;;G{)eIcjz-T~2lTV$JoWqkbzFE_N1`2HK_`9#z4xYHH&qW9JLKEqY4!8o{!hz^5 zxh3s)q2ouS{c&{sGjT%dUq;8hfyR9g9rxkpJpTq>OogX<8M@-NXhNG-FA~@yZiCkE zh)&cH-STE=oWsxw+Mzpf0y^<2sXq%{(D`WpKGk{t-J+|gaBFW#$Gg+vK{UYQDLKJI4f-PbF|I`u-MCbv7+3>+^VLRIwoB?;#C_024nhYWmGbdv z?;N|ubJ2di(4FXu#=RU(`0BKmuFu77=uQkvhlk_X_$<0*lh8m@(G|ay_IJ@8`~ZD5 ze}N|aGkRE|fi=ur8FlzJn@2mp<6!!-P&j4Ec7&g8CRfz*P#hku2r}hI?+~W zdtG#=c22oPEuMe3XkRMITa6}iOv)#shw3ymKumnl4w#+tC+Jpw5tpO=*Ts#tD$1Lq3#g4gB|D*U8ls8pjxKm_ zv|sB|8rsJ8=q)%2&GdZq`R$YPW$|h>;Pq&rLFh!o&k72Q*D0Xk7% zbS3>$e*?PG+fu$04Lm%KMEgI2zG%jyJNP>KaXUZt-=Xi5zv32K=lO5Kg)K zAAlxwC^|vg)OSMrbxHdfu?M>Kz0m~wqg#D#%C}+*%6FjiO;tbtXK-P_*=T?d(ZjYl z@iRm%%Y75{SKJ>9Hc;f`oRd!PaLK_@&2UEz^w?}$!xG8*{w)OSbw z^+H#AIU46WwBIdg{GnL>{r^2&*zv(~1z(xaj?bWnXcBrT-$66~BL0j9{s&E@(#}Pq zRnht_(fV!B!?`0Gcb~K$tbYCmGw7g@=jnRpAM|Wnw*e>neV)u9 zuSRd>^(hao&-3rfhEZYQ5$FmZONS>@em>=w;_K)se;eI_chJCd&^QawiNB2Bqy1K* zJNpOP|G)aBVx?6Z6yF1CU?m#1M?36@CfEcG&^+~fqlvac6FEHXZBl=1>N~}gQ-3NN z?@Tmak5Vo!MDNih=)||69q&XZ8XiZb{xS5Fk5BzeXu#J}o{sLotklm#U+o{GJMa~{ zQ>Eox_`~69G(h!+MMEvLyaRf#>!SnrN&TT{qDP?#7TsWXH+F|!{13w4EL(vJ2M?YLnK>J;Y-h#fk7Y@V*_yQX56EuM@(1rYnK7PNa ze$&SE^ZBpCg@JZL1MiCNz@G5{bY+L3iL{Fy(1}h$S9lsa?##6JMB`nA-r`HqTQC^y ze;=0r{htT8FvBO&L|#M#PeWHQ6a59{$7rCHXd)XoDJIwqO|T|fza5%LJ#?a`=qr9V zbbRZ0N)w)cD|%C50=J-n?m`oI0PEo+Xy7-|ezQ`ZpYj6q75ybT;qU0m*Pshpm-zwx9@$$4^gHC({y7F7lgomOFya$c@ zbbK*RE^%SU>FCO5q54IqlJeK+L_eYl|C0K3=!z;gD<;|$eaCN^a(%SDS;{TY zohj{`hQrYW+M)?`LQngtX}=UbJXfI!--xd0R`izKiH>^!o#;`t|2VYYi|Dw?=seSq zex-_cQZY9jJ}nw5zCZ_lh2GmA(1HKPjdm#lR*$vNiR;82(eVva-ZkYt(M0wympRr4 zr^AuxH=1_k2A=nO_WYq%`M-~GE;Vj?FLda|>2WE#_Wmi~nDStBFYZNC9)+ehCgrEm z)F!3=HMIYmX#Dq5KW`VF50Bv|>F^ag@W+&Yjcd^f_=|lxP?cC6JtbSC;~K}^(TQ53 z6CaTBVQ9i_(0Cno<@xa9x2FA0^qAd;?$o2`gioWVVtg_GIXM!(UDy~8U-w+3<{%$m(QD~x%r~b**zle^Toc1@-PnB7z{{&5NF&gJsh^K4 z(&4Xk_z&I6D$R>PHPFm=h`XQx_d^379FIf;AB!f`5#50zcA%XvHbh7tGO^> zDc+18t|91vJJEo{Qyz`>AA_#+X>_8=DbI)>VfoggX(%NYR>a-ph_)@fE%NM zHb-}$4mxmW^kv-)J*0=D-zHB@dmnV%mFQ00fKGI09GUuYXxvFDPi?{TZ^ipmn8?TI zia*10=ICKrhW1;DCbTx~6?+upHbTc$L;KfE{r2ci)R!bJo1+7_ zjys|WHAW}c3r%GIcv$M&#g1tFQ_zXKq4CbK?DKy?D*D7L(E%lNf?HC5J37(5X@4j_ zfjd$EG`e%Mu>meZ7xXV0ugcy4wxL@KqsDwcAOU%qYxIQpE%=95}hCsF)UKp&8FZ6Iqz@QZ#|@Q~xu%l2zyg>(Q;Ryl)YAGqk)Vx`1ub z{ta+TKmS{#!(r%F9)td9ab~;(P2l=?E1JNa=!Ey66Fh((x<})4=)zt@C!UU;rT5YC z3$XnAvCp`$*B0zik^Wj(Du6MQ?WA| zzY*HMC3?0Fu_2I`dZX=y(jJ&fn4zAyS%U77NY=mfW+@rI&1cpuvD zg_K`M6IzJn|7XqbxbPmXjvF6Rthf&PUT7NkK?fe5awl|W&WOFyIM>EI(H(dMUGWoW zVo#w9nQ%zH|4*U9Pp|3exDZ{*5_G`V=n8&J`=6=*2c2+(LyLP_3ysqVeJ`{^6K;nl zaw@u@ZfN`q4lNZE^r6Cuu1Lc`G~*l47sjpV;kgTahd+)6eh!^zD(;H2u^FzxU2x~a zij^LR#yc79e;WF`m|mrHxCl+)a`dse1{>fAG=bOAEt`R^WG?#Heuz!+J9K=F!wa`Y zC)^=6z}xuEe=~F^CmvDsE4`76S?FUi7oF%!^br1l23i%@q6w`>x3J2Qh1Jl0Tc9i4 z8e3z-)Srv)TrYH7KP2H&MgMfTF5ZG>csn}L2z0wFt<7{*#AEM9sr>Xx9O>7PNc>ag>tI?*2 zyA|5ME|xrO`=p^0nt5mRkez`BIw$QHptt4{G~sLF5cHlui1vRHUBC>V`z zd^G;THa!1Ud_jeW?dvowM+5wdu3$Bqah0Qs06U`ro1)|PL?=Ed9)XTO7EP>E%4ecG zaUL4?f}?r<4RAFTCUO&+*^qR+Gv13n{|}%a$IqZ2E;G;xK1T!ofZp4+DR0!asIQIo zYlJ?wd!rv(ZA)CZlGD)y&P(|sbVZk=2@Z^d(0;?vm5f09J(ThobmdRQ7t;PRI&NCZ zGgB_j<-!4Q|s~)}Zm%WBI?2 zu|d0HE33xMV@)*kZO}js(1~_O1ML%A#Us#L(hgl=2ekjm=mNW?y5T~9y-wibVoi%`+bx0&uGGbpySr3T>01{k?QEv)CkL;|A%tn zY3zs&=#EZw0UD?;`q?l5{XTyO8eklnz+32+&QAFQG|nQl|I)Y?eTr%xSIpPwIG+FA zsW^ZN4@*yUC0C(uzU$CHL(s=-7`ii$q6xo{@(i@!$LP4vQvMd*sh{FX^p^gC9#;PQ zG{p+4A789!8??h-=nk|-S9lbfSbH?!DdGwExX$|J%`o?o0hhG_l9fIM1T* zkC#eZn91yP_zX?pTQtD0Xu#Fz!2i&RHf~>(tD^~Rjn;36p8opijR3WEz6r})isdbhBh&t99FOkg1T@YYsh@$4n-f1u{UY4N&;S2% z;RHXS1Aj*oT8k#IVaH-;s-b~uqwU+FTirPB9S=os;qmDBQ_*o}r`!{rrw^9@`#Al$ zFwj7><6!h&-i1zdKRVzsbZf_@{3<%ZRCL@-bmH0QEnJxTFXC76do-$)8R{WtA9fSZ*XGqlbEYP zRCH*JX1p&NsBJtI{i*l@G|?N;6%NPp7ZEgp8EO9ljk5y1l@%u!TfaFPw-)Y&4Y47X zI&r~Y;HP)?8U zWBLDC?-MSZXj%Lv{)q-&hX$^U_4E2*D$YQF!^qQU|5(Fs362P{P=_#O@POWOZT{eNh`jk*>IS4R`9i{9&I==gon zFSo5yJ_H?iR4Enh(Fsn9r(+|^-O(4vVDxbsiw2y9PA~@@_Zj+Be1&f9`ncg~#Y9!n zL%Aioz{aUB?ZJfs4nPMUmJV&ut?HQe&gd;T6TLMTqc5WVXd-u_D;kAPFa{m}JR0}q z_!_!^=|y{~VpbaFrs1Qap<+?WU!sARp^2_Y{p$EHdh0egy_l#9IzhFRw?rSmtxt{0mpmb=1uA~zh;0$!)?kQi4uK2Q)Z;N-LE4>eW-bbN_@R`(4MJJwt#{URC zBVS?-pZ^u9SRXgpj&%MygXiwCRB>Ir2YLf<(Sf~VKlC169dAJsx*P33D)r-2ehE$Ft@wWGKRScw-@so|VIs@o zax~-L(e{7i24@!aRnh)i#yV&MJE6C%8JfuM=*}F7o`GY~ah=hG&M0x=1U=GlQ5r6b z1JD3BqW$iUBhalM9bZ5behckC8%^Nz)PIjo{A=phptq=0`K+R0leh&MXq#9Mowymg z!WOAN0A11H=&A3R`m@mfz0ei*!G?Gxn%F4x);*0RP^x%^3s>?w`VOC$^4DmfKjPo$ zb6jzDv9fCD<5&k>S#vbOeNsLIO`r|Bp!R42om1|C<=_AHNku<&!hz_(8&e*FK6b;< zEgO$c_#FD__!2tqU36vhu)Ou?4t*d0MEh@ePT|(LrO$seE?oIRXy6WL0;ixWJ|p%* zC+df;=xVh8jcEVDSbhr7exp+V7~1bCble0q?i4J4{?AN@58|h2pe1Oa?^FK^I?*5T zUo=qVbBhUTpyRei$JImoH%_^E$}Q1^TAj=DZ-*mNaV(nQ321=R(8G0h>ieP-UY+)v z(Lh7ct-d=xg5K-r(moZvbu&_aFU~)=R0Lc|g%f@qe?afyigf%ZZqU8xw@Ivl2Cj`x zST{C96Wt$;a|9Z{V>|`jsnbj8&;vaKm!TgXgV3EBf$qp7Xn^tPjy#|CH`4wNn#g># z-vTtw7wFC`M-S)UXkt~)E80t2=Au5@us1q!YcxHm{fX#GPeUKu3($$LiPxj! zZb9SRj=mA^MdOT!4;S+Ptj&c3o<#>tO!+l*egqT^S_HL3p( z9lueJBGJv_mRSDxW410|@ckW4q+#3z4Y&uI$o}X`4~uQk{>P#dbV9ed3wqDHqqnLr z8s~cSp5KP{zej!kALPOTkD~YLIke;J=+Abu(!K(Oc4>XOYleXnB7$ zfuqp{bVkRWg(iMJmVf^5&4nxLmxli6R+rELgV8tO-6=nX27EE)*U%NcjmCLD^&g;z za3Q+DAJ7H9e5HNxNFL1rv1FsUyKI66kX{6^hdBe;*;ovZ=?5qKKd#7 zKlF#w)#yB1Tu>xX+Bz3IqR(mLly^Zp?iKe(6KjpG;E32R?VZpGJEIBoMDKM!^u=}q zn(%Nm?vqHoQpIyzxT1+zKK1D^3!P{VI`PM;UzGZ#DKCpZqy2tMd3DPFqEADm3yU+b z1v+07EdTy*4=x;dU_1oP@JO^{JM>1 zb)Wy|xo~Typ%cwV11v%Vd>NOaEBP5s;BT~F)r*S5RRb+=hmNa{#%mh)KquZm9*mrS zzQb|hz&7Z>6Ul_lmFPzF37mwri=ztbzg8O3wY>iHE4tfhNK@%PjuR{~MIo=-ci4R`P`VIIf z6`tC0Xy8fcgp1PgD>U#A@fUP!SEc=LG=WOJi+G#GnrOc|=#S_1&^QO9i5*_z!UT>% zJ9a=P?wtCw&;dQ-g=oJ^;#KI@UYGX4slOAAb3YpY5p=?_DL8G7&ch^^5rJ`VjwW-qLVgHrz_dU$7|JGv0dfB##|g&BUGhLz<8 zzU5*=>iYNYeU7g5J2YVBON)EG2|8g7^uw$!dP{c4a^mPtABpAvK4yC^%(y4I zf}wu?NXk9JFcd}1pY+_ zRKBd}SQA~zHfZMc(f-Y13v}E*@nCdkj!L-`+W*veCK~6wlrOrB=ie1yN`-+2#2eFL z2s&U`9DyeEF#56k6gqAuy282WE&Lqaq2=f;T#bGK*{EN!L))Wq>y@}L<0fg?8{MM) z(xDZ)f+JEs2A!}Y+OJE>-O_#@+W#Unp-a&O{(qjKseds2O5?aN(6i{uUQEMOG{d*i z3ExloBlKzbEcHL3<5!{M*PuJF!R5t@w?g~xitcnPG~Q82|5C;ATzERWq~Uxtz$Iwr zH=rvThHmNoDL;w^8i!8&Jeu&7)W3-)_8vNZUfMrN`HONppTA#~FL;d7@N@hvu0bbQ zhpwRN6-B@;(FwLew|e{73|;ZQX+Ii$Dvm?PcSPfziZ%WG@1BY)(G}c)W_(+`Gv0@; zcqBUUu;e-`e7FIzAY=#cl8V$4) z?t~4|TXQ7(f;kaQqzC#X^9uCOYj@#p_&oY?z8H=BM_hkpp8u*>6)UTbu4HR8q59}b znxX?+pc5UC`eRbxG3Bmk!e^)cf|UEkf#^bRNqNXsJpTs1mkJ$?bW6^tmBD#}jl(=v!uSLHm-+`|DQ8b}( z=)@DSe7fVCXux;TdpngMOSog%DvNm6*~U<)Zdo!Jt>bw;*=`JaN(=;Idli!!#!~cIzf#A z#RS`;6E{Q?+8s@(CHlF4AbRUMqj7qsegJwaN1$ImpGFg&j^*$Fv$-(ff^r4-I32!2 zxAHeM@So^C-sqa*Ol*VRx~6Er{m=vtM-x95-GP&1w|E{p-^Ez`{oe~J2BIsvB^_=@ zC%y*_^f=n@Y4p%dLMMJJ^>fk3?^85^U(s=Yqlb8dfkk~Sbo>rje*Sk&!=C7^I0&8S zl+>Sz2I_@Q*f(B-?!X{4;PBKxfu8>7Q+_SwS?Gd3O8wUZdH&7xmsG4t#|^G60#rvQ zsGD*#G=Y6mJ~SSOJ_TLSM9)L-^~LB) zQ1tY+M<+Nr=XZuvGC77jEUt=!)OL@>Zc+{VN)v+6_e_ zTcXeN4sj1Op(D_K?PAB&pMoaTE%oQb^ULjg{`M|k@Q+%er~VprCvHytU1)&&Q$Gsb z!g1)&bs`+voa#nx_&PFx#ZNxjrJMgz8tt#EJ3 zN20gpD)da;gyln+`iIeRPoon~OnC;H@Ek08Pd`q@S7@d`pl`lk(C`1hp)0F#Q?d1R z(DJV6idv!*w?-#ACU!+{)rIISy%t^A-EqWCJpU#znhGa=1`Rv`UD*_Li)W#M7GOC+ zwBIl2gsagw8{b^i*G4~HcTBl8wx@hFx>Li^of&&G&!JoKTq<5dAG4|GL?5GxEJ7#v z7JbpIO8LK(H@~ImR~JpJF?z~dpr8M3u|9UkdN>Fh;*%vV>^K+A_&an!l|jWnXjC5^ zcx1{w(e~TWTQdgh;oIo=Z_!V~%C{C1?2LXDYm@SM*og9Av|s53F8n8&=EjxSgz}cR z6~75N0B!GvPEbN0%ZJf7-xPF$Ptbn9qZ8B~T)g29LT}xP=o#pNF8FHXaW7Te!-avK zL=V$j=oZe23(&*36z%sldWimw8w@D|S4H1|+oQL%dE5t$+X}tsZP0k_vHbVH6VlK* zo{7Hmd!hrcMGxVv=*0JtkcvHL`jdw4)vm?>Op1|_I|NkTx27DGh z<*%pwKDxrs&;ZNOiI%6l3Jv%dn%D++6f3KN)^COO-vNC;G(h7uPyK;+Y?#0QQ{jN4 z(abuc6P}cgr=bDPMjy|M(2vg>(9etq)BZdfX9{}A-bN4KVsy(_qVfMgVU!_N< z+yy-gXQQXP5BhiwK?6R726_xlU~GIAO?VPIehT`2co#h*-=h=%fh1but4tA~DjK*3 z8epqfH`YTFXpC;%{^-OD*2N4yN}cOAMjgW{d#dgi~M3-8(Jas@A<_&j>= zUPcp}h3?esw0{!6Km&iB@=s{L-%|cNRvK39SXH!rGc5o6f3>+V!@B6!?2N8(cQkM- zbik45&K!>>bRv2Sx}YmR9qr#M?S0X>SEPPm>TgEl491cl0(Yh2**FnRU^2P`@1pPS zMX6t&`hU;~s@+{oTr<{1>+7QvHA53_fi9#adZrG(o9ExHKQ#^Kq602M@9Cu}4@48X z5#6D?(Up!yCmM^6dlrp1G3`^+J`*_9sfq(Xq(Q_vlJ1Kr`$Y%W~!r|3!-qXGXHzmF@> zFC2fO{cGJ<1l$(wzav`T2#vEVIzbC`!UNOZ2E9ec6_zSa;lcoC#h&PZ-YH*=2EHC$ z!JyRNj^5LI&@UvT&>eUM8{->k{|=465{9M@ltd}{m~t`0Uafv)=+Frc#7cMwn)qSpf=)yiG+;!&|KCN01Mf!@cr1=bKfPW+C;R|SbP>9u|E2sB zy0xoPU+ID33raQgacqEor#uvm*BQ$@TH?Z$4nZ>>mh$kFN1^xf(fBO-cuh|GR5anY zQvV(rZ!Y>&e2jimT7mYf@?f!m&CznHHWyC3eJXa2P0>It&*65BLm2&%( zPe#X`5xb+~E=ajgyd2rVQpEr+%;aWtqTA6ezANPs=;0iN_In21>WOIJx6uCYps(Z) z(!L}vPyIh}laa-^ZLs|NzwNnjiyNn5FLY)5p({BQ{p(g6^i%5?Y=r0GE;t0emoKA< z%|>6j3)Lgx{&p$uRe;zeg12Cf!m=IH$V@|ZfL+G&_i@W+WVk8brpK5uR#|u z6rJ!vbf+Fh59!#{zkn|2rT7|h{`p6&xNyKsbif=m(5LA0`USSfAFu=N_t1tF$KfEf z-zR9`&*GPF<^eJ0|&bPtneEx4Ty4ZnQXvgi)6*oj*rH7#toRs#iDW8ib z&mAHaR_ky0)eViPK=KT`bldtdY?nBHh&gV2F@ zpaJiV51=a_jjrhF_;P#`y#;g7h0R9~=V$0o)1{xdaDvK@7H*1e*%oNPI_Q=*h} zk3bVS8V!70JUR7eqmqg(fxzo%ktq;up}kucZAQ~O0BR`=5 zSH-odUyn{$eh(D%Zq_*~kjqxXD%>VLxW|3B`(TzGnGjVV^zB(^{U?uYKo zK`9@OuDA`lqGQpgqYK)vJ38({bjSLj{V$JKqi@vG7@mK(_690+Fgoz=bR3Qb7>T|S zA4Mm872TPcsb7Fjyc~`5J38(kbmB^5iv+8n{c57OVB4{!;_&QCg#(UFhfe4gcR>T3 zoA&e3)80GvSEl|NH1QkI1a3jk)KGN75%J+THto-rxG>-=ae6wuhX$IDCb9@k@EbJn zkMZ}kuSg$$1Opl4zfn!uB2{Ac6D!cxWLRJ?({I%lHK^P<%MlJf89^IrAIVkO(4E2)nL z-UXd#kCgX86FVs7!_frWrrfDq=K1f;MME0SLf=d`qbs`yJ#3Gs{)N;}i}TQlm!ezy zEt=3ubf?y!@hXik+H0Wk>Z0vUtoQSO&va;&hNELAbj7Eo{Q`7_m!pBMMjxX=sUM6c za3`AB{pk3I(4BY&9X~PcuVVSXk3WqIS1=n5{3+V;8}#1)fCgNS23m!#;4gH74WBCd z*NoesiENL4`D_?lp)aPB(0O`1#q;kkjW46Z7tnp^51Hdreg{2lU!W5&M-SES=q>sW zO|Zt(MMAaEE#Cp{w`<%Fee)fGCf*HQV9%#{{>}6vDqLYd^pISQ*58Qk%n&qz;i-Qp zjzRlBi;jOezMl5C&~fjhiG7&zm+`w27k*Fw1?yqeXNo}0&;(k<{o)~Lz@yQL+o!&B z>d#EM2bxfCbgTQt>r+1z-J#OGTo~{XbZf?;TQecPoc7n^Td999<#}kL3(yIdptt55 zG|um6qHEE4Dm`1&S4H~s_n+dTq86Ibwy_a9a8GoC1JMZ%N6$oCY>cO3J-iP6&i5#K z%ci1d<6U(89CZ9A=%M`_%m4iUk7@W7?YO$!!1r|Yo^AA8k$EjNK;2jmov1OE6GcB% z4orJz^iX$0C+v&HyAECGQ1$tLkPFYiSoE9CoAGn>@%bJ7l3DHfB7vP_6LjL;(R;iv z8u$owAsx^JJEL2F4tk4wp^xEZSaK_G=E4EP(SW1TK;u%Lh-Use`Z4@IdXK+K`8PDt zsxK6A>Y)=iMR#OxG=Yw20-e$M&VGUC-$T-i3hj*!ye#Ew(SbLj2@OvBa5T|J(Um`y z_E*s7{OzEOjV`F}1fG8bHJwmQyeFDSt9TeXuuVKZo`jA&4LuXx(ZhB@ z%DvH*_DlI%G|o+_ACmg}N?f?&k#Q^Y?qWJ#w)xIzcOR!Xwe0I5y>uu`{~TGtdOjL2u1PXyR9)fv=B);vH!G zdr}^W#4lAm%7vd|V~dK4@o2~A;>&Rw8h93(*qoFPqlf9a)W3#KI6dX}(23@uhxN16e~-?y9PR)6B%Xg? zjsK>h+Dk>IHDeugz>cv|+zkz|H=0|xpO<+4ZRk&h ziImWl4UHqwKu@Bt;1|#Uv(Nw^ru+r^<@G!Cjrte*m~HxUkzif)4D5uSjRvW2QR2cC zwoJuA=$0LdPSif0icZ))<=*Hkw?CTTF!U*U0PEo>bmddg1G1`7eJTe}G#%Ui!1_wg$6hbP2gxWfi7smXQLDLLgQVM^5y8bYtVat1D5~!zdN|_bl!sw zxF4N(6gpsRd?xKLq7%M?PBcBfgT|Sc@<(XA&r)8B##@&1&y#un4YVp1|D?kPQ;LpN z(SX&_iE5(vcw6*c-UwaEVQD`OeSw{r^7-h5ed6V4yaBP~Kc8oZ8>ukU+t7eRQ+@z# zAB_%t0zCsyqL1mTDbGT0&8KLbW$3t{;;-oV)#yV0M*CGNy;d|-K?iJ#Hf)jl+USb5 zMel8MbjS8ZUsQ*nZHFQgBp#yhLePi@Z*BpJt zwn5LpspuIv5B*YlJ(~Ck^cIaqCwdNz_e$ztM|WfnR`dB^n2K-E6|O)BtVXx~A9TVk zrWU`m-5xEUh)#SaI`I|g&Rm0zy9NEs7>UN6fc`u%8C}p^EdTSr%eXMWiugzT8{N8! zX~i3EW3;>}+J8$l@HQ#$l=en(x41W&=z-|OozO&jVfp+2KrRe86y36WQ+^1Y@Nsly zPo;hmI`I^AE8jx<%}xC$DKAFjeuMsi^JCg8zfl~<&EDYoH=`Y?a7*_^@9E)az%$T^ z&O-xT94|v}QGfI)xE8(VL(nrcGWFwA|1x^GXQ79A0UGzSH%di-uc$EK3UuP%(a(gx z(T=sI7wy}{dT7FpQr;8ow{Oa=(S(nP$Dk8;NclwcFrQlD!ig_RLtpe3Tp6!J2i}HG za7Vlk?e`Fx@K|)hXVX3r8&ZA^{SoYcX#aJw%9};GRD%oeZ5?!i`YG>%e(1DBx2}Ea zyP*^IL?`SW`=PhsYV<>CaOy{*6F-XOGlV`JlaO0os(6nJCtil`#4mAG>erw<@Eb|Xbjdj!i{A1B7iXyR|6X0b+mA%I{uFego~gew-iF?Sk!S*Au>Adh0vFzsDd>bBpc5=ec`2H}w{bbT z1AnA_gBit6R7LyMjys?`+6di&-BR8&<^5;y{5#-aDtwU~g_b+UF7Yfh(D|`Xydv!b z(OYpdx`4Y=KLTCxBj}DimHH|1tr?|a;`ga=MGMdX-^3r|N;H8#ni*8hYC{1aWlI`q@4%B&*O?a}rI=uYj5CUyXtSZge=JoU$;{ZBww z+BM~~W3QsVRM9sTSD^u}!}5w#KQ!gx=tLvY1Rh1-Y|o=RFb5s~DLV0&@q6?Iwh|q` z9!;q7JND=KuU5X`A0|Nu?tpe|l=@xK04?JYSYBD|icWkEdL}MJ`wu`r+y8s%4LCRD1?Yr}(FDIkZ_!#bPL=lxYoO!m zq+IX4eE)Aog4cWwBL@7zc=NPDL<#uQy?a^Cs5<2b-blk=0Li(W#7>M*Q zRou*lTQvk5;BYkKDd^|-J7_{n(SR$koM_6`<`nI9(TR6KCuoVTuoap>+thbJ<8&_9 z^ZfPT!UQfZSMVE5G(ZUrI0#+Yuy{Wj@S*rbd>W1OBD#>N=mNe%SH2dFS7~l`7|VbE z+l~t}Z5;PPcc3+T&yG#~>GAy3_d{25GrB|f#wXD6lhB=d6Ycjw%1hA&Eywad|G$b0 zGg}iY%`3{)&;Yg3l{G+D-aPI5pot%n`eV_+C#2j3UBH>~lC)nR2hHR8H}D-)76W)v_GA!-GOSyOmeGxr@c6=2LJR|LM(1bolCs>Fk zv?P9q<-?cu)$!ldZ?K@~zX>|NCfdJLCk;ELqA5CY3v|N$Qa&gif!^C=(Lkr5Z@SY{ zz8DRB8QSk^^p@R>?%0U<7}Bp)@eCKu}*jJEDiB5jMh>sqdQlv(Z48pgVRAn!w=H--#wN zGWBE7xKE)IPe}dbl&4|&_y4oFF!MR-@KIcd23Q=wK?D7i_EqS(HK|{h`i&M9^_!yO zw?M~jllq;|Gt+1h&%Z0!mkPJ|AarYwMDKZ9bfsO;Kt0ev7sty}KM-B{O(_pWIM+TTP2%|jDgfc9UK@{j0*zr{6Z zoONlh`gze_+JcMnHz0JYcR^RYKl*Pfv_(Hod#3$bG~wIP3GPe%NOUL0qw!uv`^~{} zf^i9&__D%M#qu=#9{)iDZ}>$qa1(S#wnP)$G3DLReg~id4?!nvgRZm#`rEXwxC>s6 zjqnlltjxk1{`^0m3j_TRUFmmm9lD~e78ijV#NE&d_d&J`*lSZa5mb% zH=1BSEdTw##DyIP#i8hc`{HBh%AZFM=~Q%!KSsxWkDi?s@pp8hwQ+swD=#VfZxXk_ zl9_D7g#qfPp-IZk(Ut9;`h(EGho`-5>W@$TNofDBsXqtZ!CvT@x+?Xz#ygkr{JVnT zRG7#^=qY|O9VVd@zLxTv=)HS4^&g>u7oiLIA^wu~Rp=R5n{utCMZ9g%d3RdM^Y5W) zOodzA0!`px^cEb0uHY0jk@L_O$A##Geb5#6Ljzue#=9}?x5r^|cpQoLf25R)acH3D z&=tO%`swJz@1P0IMPE#xr~YU3Q}H)+eC02T1UEy=Tc8uwLF4R%?sOw`p`|@?(JHo0 zhm+6=&qP;x5js&{bVqJN1K)!Neh^*xBWU39Xup@xglC}r7ohzY7nUl%PKO`RjQ>JE z-z)vE=vWI4xGg$CBXozFqy6_s10S05(dY_0q}&x<$T?_2ebD~b;-)_TH*;Y|ccC4J zqZ2%iuKZav;EQM?Q_)1;iyxu=zCio^FZDm8asEK#uSX}Y{8dq|hUMpfOD;TA+oFMX zi1pEdP0&EQqy6?n1096!z~N{@?a-&;M06qN#!Jw+1JQUlpz&_S^6&rd=E6WD)8TP6 z;COVR7vp3!@O1PR%|*BL%eVr)*XvTQ{&n$G?SRJH6^++29`rTOzZo4)g_*ZSGwp&V z)GeNe_PaRc%TgYI_P;*$x1hIRXzCw`qtS^UM|bckH2!m6mx_v)(=a6+r=b(hjI&e! zAv)nAbVW;2{~h{j{skSk;Wx#Eo1hbIf!5cFJEpy1iHq{qq@rcY2c>)@I`G)oDRxE^ z>4vWC9CYh@rTuDj;_FhrHRYix4@bw9M&;u1G(3eS^a8q7lhKK$ru{86@VjV$`6(|< z`^bqcWCUP)(nvX(X;T_W6 z4NdR@bO-yUd}X{AxAc!TH*?`Bz8?)ZHXWY3zi;nKwMtgKou=7nZXcs_EkcKWm-au= zxz?fmHe6QZP&L*-bKN@SdT75UsoyQ`i^e&084rlJwG9oss%;;(6$~9fRJwD^q_xI_{=;JDSjckPqBa z#Ud`;(znn=-a}XPF}i}!Q~ny=;vdmZ>Wygst=AU)w?ikcize78R+&(2PoTv?Y*xI8L z9*rKVZfM8eXu#9ai3X$NMx_3NcsaWD6VZuoMOQu-jk_3q{aumJcIeL>yPyfRK?8R{6YZS(u4tksq7(Ir1JM3Mkp-73hI3)Y7vrut5e@VJ zx&!mjUk^W%`VZqOG|-nRe}hi=Q~U#+xZ?Zb#Z)!cLhE#uL#u->K*s8jQY4FGCk_1G-bUp$okSjr*wj{LfFtv+1xH9rz|X@MCns zFXFf8N`FQJZ9w~1{7{s)K;Nj_pgUA6)=hgoG+rYt{{wl=xNrpr#?I)#9_R!oqXAD# zeSb8-pm=WTN1^>MO8K&suR`Nri=MGt(ed~E!1HhB_fz4D9#6wFDKAD7S(fsOw11HL zRcK;gq<$?L=g0UvdYJ!36WIF4V&a|9L>vCd^Y6tTR5(!!G@*Udp&fb)4ns5Uir&K> z=%-jeblgSg%1Ut}n#fdi-0kS&JqzvsNXkz*zyzL;FQEgLqtEX<=r`{*=t}=a6R7l4 z(XR$NzINOhow#9aiY{OuG)~*pcaNoBTo||?`uGh*|FYE8=)f811hdf<%uRVd`nR>7 zP5C)=WiO%$E<@k-AEF6;i^f@xF7QvJKj(j4vE`e_8tBAz(Fq%(_pk*Ts9ow0Pq{nV zzZaT7e{_ODX+IYoKRRB8{#~Y23?KT^KncM@oTXV8GpqY1oe#sBW`%+<`1JDT%L*M1cqZ1BJ{pi$Rg?=c_Ncm}W zr&gqXHTvu2ieHPJtB-!{9uSXAeXkN1W;OzS@mzprd<8o3#CQvOOJ<>&KZy2!4DJ6c zy46cl|2CT7N-Y0PUvxp+{Z=frDY}ED)?Ao*XLQ0|@ys|9-I2@Ce%Gh|?)Wg4Kc2Dt zyrV1q7X2;mUua_6{9b%-sE5vTAQG=s(K!{p&;e(n-&ig}SNMPE%4eWEH5;Aq0d%5Q z(3O1@*P;EY{ZUL@10BB$x>JqO_7+(F{NFzn2gMF($0N}Mx}lF#Z*=SXqL0}?G?C$G zzw6R|3%X;sqwkFe(D9F?{Ry=Hf3f@vvZY*@(en6C{1{!~|Il~$dNi@k|17p}TXbdh z(D6;sz%5d4gC^V_9d~%j$E4f?%fBEyg$q|S0G((UdatiSS8^+w$h~O4r{ZF?|LbT1 zU!YIXx9C0o9i6z!hQjKx7Ml3Z8+iU5xH}cz^X6&jl#a)sflfpZQU5p`UD>7R)?SHD zGy&a#DRDX)e>OVd1M!Kta0Ac317D)Tfp4IJKSb+SrQ;ej&``nQiw z(8GKnx^u^%{Z2#UoQ*zyBTHPk!f|MZH=rw;hIX78XQQ{`0d$N1iw1rPee6C!1Ac?v zx(#uwzl#11(Dy)dwEyAgtt*|xg%h8Hu6T6Hm!dmzHM%2H(1dPD`%E;^d(-{^I(}YU zkop(UaWAL*2Abfz$oNvl+I09n9ezO*+K~Fne;0>t3pA1KQ{D+ppfNgeGj!a(DIbhZ z+$rUwV-NHYpHeRK`Fmy>&P8vl{5 zJmvpG`%V8hpa1t!;k|qUUFiaJf)~)OdoT6hp)36*ZcP0qjJAFYbRpZKTfH;-v@}O2 zY?JcgY47e|5H!<%RG8`Tcp)0-3iP?X4xL~+n&91N|NB$_7`g)s(4AY7`d88ZZ>Ibq zI_@*{TlUxf1p$AY{s-NGx|NCn_0Y4>IORiP=Xh-Fi6(X$I`Kd>-q5se$3XWTuihby271PZip_dS<3sQ z+!m|)^G8Q6oaiWYi~69?^Vw*iOXHR3$|j-{ULS8n@9`~YLU*7$_E_qlN8`Mb`Zv(O z2e%T-|3GF%m7>F@aZ5DgZQ~BHe%c$Oi8POUr@eLB+ogP1%15EMpj*nl(5Im>mY_vkRybBuVBy=JD(D-Mfan8o_$1Zx-#%;>;?{hev z3Rmz*IzE;1A~e8DSbiGNt$aWApP~2sD>Q)(Xq;-B6+5#H+P@YWXP3Aen$Vu5T(m+T zp99d$JEDP(Nc(ZA?}-LHCG`X1(0Cpi=R$PCE74c{#I(*zw-D01dDl z?YIiPXX{h0T&?I|2kqAs?RPNxb3nJ$4?^Q!h;H>HbZ2fv7d#Woe?evz7jEg}Xvb&K ztzUw6d@b#7p*!$#>OYHLq5Z!@-ygrAXQA@u#hKX_eY$o^xd}So-j@CO{~#_5&buJXdT{thhG1#f{LdZ<+dzDR)EXIV1JwZNc;JR$WGg_jodTPiLY5 z9zhS;V)Vn~12prm(TRUX`&Zkta7VPhIeI2Kq7(K+;|xUSxd@FnaZ8?mUj);saKgvX zfiI#jmXFeLJvvd9>V>t@{(GSP+oB)4$E7?Z?U$kxO+gd88=dc|)UPPz;&b#l{W(_O zsyNM!(H}C~p%e5*KmA6bUoNMjD|;NB=oK{4kI>(8eTODkZR;Zb&S>JT(VZxD;lhEv z(l7+wvP)8)gl2vR8u$rxXI?@Bf0p`R&^VjbC?=?bo|UHP8Ectx>y+CfXQfopF%8F{ zhwk`vI63uw(S!z|hifGIbX>~!OhXcc0hNc5jyey=nk|)6YPXOOKB1A10&LE}B1`e)IJm!LcFO6uRhlAmhtrNd`w_%ePM*T)TL z=9RWBCfF1`gj=I4-wRFrKy;!*Q|^rJ=rQP_JQ+Px=WomN?^aEu!c#dt4G*D-EkQGX z9X$hY<8JsrG{9yxi@-ah6E;EP?S;Nq4oQ1gG_jM=9Xt))p)+gp{JWxIRJekX=;xc$8HtjuPZ?s=ObO#2b{f4Fe{FKL{30{`^iP(U0X$lukFb@r|5Z#d_Xd*A8D|#dC zAEALhOZzwIgzM08zoonZP3&JZPSsjPzpdkTNPDSbhvK550orko*b+^sb=nU`6X_I> zi@oDObo}r*1|5GX`eAh?`s$s6E?^Gw^DpmwE*v-?UCBZ;^Tp^bS(frU@ss!kI_^6( zvGu9{CvLWV(Y`erZ+kSMUE*%G`}x0TDq5kLwMGLTioRlxMsHDH^iU2(S8_3$z)fi2 z>FBAyE9HmN{sj82e+J!&*U+cwLoEOPZ!H%FSQmds1OJ_JmD)x77HDGIpo#8;_S-$} z&Cv<=L3ge_x}!(NW6=J`qj7rG=K1$x02L-MEFDLs<3*{z9G&p$v`&FI$7KzC*q zx&u$3D_)GoeH)$lLo~6^;@7o#{;l|#3IlCKGp<~xIL+12Kjo^92C9Ju+8*tJG)d-yYquQX?)5v_Cp=hj=Wyl2g(?F!dwQK$oU|QtEF_c{chz;Zbx4 z7RT4oaUY`dtSKy2{KAC^RH|Ea*edRX2HF!1)D}Ipozea$roJB<`0UhQgibIXUEz)B z_*v+J9!77$)8%@ezlG`W3VN^Ji66)Rp@F_ezoKnGAHP~V7F*pMO|(7QuRHqT)IaqX zpr0ud(Z~57^hdAxxTDYiyXo*#I&8jE5oj0myIqTT7&_6(X&-_H8jDUi4NdIfw7-P@ zMDzhV@sDV{$~zbJJ7B3P6)m~&-Q62Kbf=-Ga}c^C=b%r=`6*wFZsE9i4ch;@cw_3P zr93m`S!kR&=;Qh5&OHBS_&gO(`~e#1bMzjsL07y!^_%WeB(x>kuV%_SpkFNNr@k$k zU!g$90OwrM-9T zkM6*bSQ?Rr3*u#IxCWi*dh}LIP5oV|zc1y7(8uqI)Gto`E9k;j#CKEw5gPY%WCu$X zYq)S_>(Buk(&1lpWt-M725g14Z-=g6ht$_k{qE>3X^JMaANs!N7`vn6PDlFcIxZ2i{gigrX_KzpRVBRavcXyPZJJ9aXf_~~(A91@42{m;je9WUU*2`@nd zj7Q&Cld%Ebi#|Rtqc50MY5yI40d2Euu@f!Oc>AL}auE7^|0B=^3`Wn=7<8U-yRv>? z1lLmG8*Dn7$fIbW1?XvBgl_e#XrMP!UWEqyD*l}Mf6$%Tv|-_vXxwe%j%d8y8nS*T zYMO?YX=sCH*d7gZ1iGSQ(%u_)r`#`IjUK88(Q)(9#1^G~S$r3rcomw^S0yf-;K%qY zy44%ejx~2HtcxblAnt|k#6j^$G+<9OfxdB29EQdlgD&_|bl%dqTueX%T%QiNqAR*R z?f0Sq9!&Z1loy}@pHKNkG|qB#hu({Sp%XT2RK(c>DVHi*a$&~%qk-BL4HX^HKu4kz zcaJB>zG*)b4Ll5uGb;6$pyS5J>(KZ&#c5dn2Xbbn!@cDSeo=tsdx#ELgbi>BdJDcp zKNEgNZ&l^piw~(C(Q(bupYirX6X=2EPgit7r=@-nmY@G~xp3gfG>k<%UXl81Q@#;R zXhysXUHO0F192W2?aK8GgqYJ3wN_W_oF|Mw{u2L2Kq_)Yv7UGWC=uvKkb1l%5d zEbGUn=!TjtKJw0Sv+E2uQ93GsS#(A1P?qN|yO zCizf&5)HNx9lta#OZ%HCe~2ctDt>`2DSzEKUqb3ODc*Xm(6?3>bd^KV2}h#|U5ZY0 zb-WHu;KsDymhwI5F5Hh!JRcqROxj;S;(B!A4Om`rv!YxT-H{sTEv$#$ik2yN zK_}{s#ybOD`H(mqx3^++DlSF`Tye|uck|yTd3hUEF76&QhX>JEPoP7eN&O4x7pYg# zU0#Xix)zP|JsRh?)bl5(Nyg9E1SM&lECh~6l1U*ly(E#hw-TxQ8 z8{6zv9H07V!p+eMTc*AZx`4ycSHRKexIS1uZfPG~;=+k9j^ol{BKmH*Dc*-p@C>@* zr76FHCiWH@XLZ`YK@<2P{*v|$=((@dqUc}RnhRIBJvv}l^b9mXx2z=^ct3RFwyAHQ z`c7#7qto64+fhCVJtI@m_;;ccKal#Tk)0@2EGaH3UPmYT0G((Rn!sxGyX#ss!GF?T zrDd^|)zF=(iH_e1ov=859fMxqRma3 zss9e$(SOjLsJ?fxfSR#xY_K=azbj}$g*HbM*gGBeM^|z%`j~Y}`3SWCap*)RpcC~^ z{aNTr&q@6lbn7ok{rJ@1us6@Y18=6niDsZ%KMS4UVRYc*DL;$u#0%)eZ>GE|?LVLs zuTTBo=&7&1Pq71aV*|9lNhuZkp%b-56X}!=UD59vz0ib4$FXSt%g_Z(KyS_UXo7d5 z2|kS8!e`N2_8xks)}jk7ZREnho9$Z!+!9To78-cx*bwcv2YMLyiu++XarD-8O8t>& z0>_~f^@(Sp@kb(Y_#b!{7Zq2e!vrk9`EWNn-iQ9l>}%*mYtR5c#XnMCv0stc=4ksi zXaYN+3u%ld(j1L*0G9uJ^3YTqfp+XxZs12fG*BP(vtS?^a1Yraf!gQ_8=#5qi6+t#P2_--4@rCH)OU?NQr|n} z(^DRV<=;=9lZp$_z?Y(d$H(i?Q+yNpT+c!idKBIA1!;d5-TE)lg=~n`4k{9_jqdEu zDesEq&;KS|IAKdHKffs-iUv9Yo%lpFKz}rWLFkSQPkA(&XbFvXecEqE7d8XE1+&n3 z9!AbT&np+Y5FNM}?f5F%@m=(JUWNAi34JPlMQ>G=w#8Gi4O*^+4X^>4cn36rW3dhP zjMum2`S%Bcm#J_ozd|Rdba1i4&CrBu#M)@UUDDnZ?Z0o@+n@=zPq_=aL*39F>xs_O z7ftk{gIT}N^LQ!@G!fnM>(M~Br+hEEBTuCKT*|Mb6MTrSa8=4{&a}t5FPM3dXGOxZ^=6J&~0)^u~T)h3*~y)8P7r!dl*e* zetaHXaA_GAu6RWnK23Qon%HmX%4@eT+!bAMbM)5igRb;Ibb^ktYubCFTiquPMqgy3 zkgxTniV0jaqv8(qo6a(H!nNo(m-XlytootFz&+534@MI?EOtSEFg_05$-(HvSE4(1 z1G*D;qHn_cu>AYUW#tS0ToMhq5}jam%HNHtv3t;Q&!OX%q7yAcZ^`?q z{~X==H7Rez^7sEr9g7uIMFVYvX1qN*al^Q0Y!wec`yYZnMTcSeg@q<^BAUP{DGx*! zIyB{x9eMukcp(*TX(9E=q?l(O-W5jdrYcc=0$kMc)HQp#l4#hio+3?<(|{tJBem zo<-xli$2cZrChypkzi>zE_{(3f^Ok)=q>4q?!>9+V|5|=s=g6@93Mp|SdLEcW$OPz z`|WT<(cT)}`eWls=q)|HuvBpt7fv`Fy;q~rM8={6uRzbnwdi5G8SQr`+HW?xBM+p0 z5gKnv%CDm1-az|*nD)=GChwn$uedPapJ-^>(0qbLwZH1Mfm7o{QeP$I!=aNy=}< z)#$DH1--bmi}%_x3yV1+)R3sCw6;To>J`X6UVJ zo%$Z=<2ew0QC$+Jpevt^F0Awf7Y2S79qQ& z(1qQICU|SS1Izyd-~Xh;yfn;@3sb)oJ&doS6TFl5PtYx0jZW}m>VHZ7Ms&qhk1Nj1 zR%oI-V)+(f`S<_3apB=>jt*#tW_nmW3LVfr_C!~BN*sVDa!$$@qH(T>*P!txqj9F9 zJA2!4JpWeArot88A0I~pEJRnlB)*0QdMD+N(GQ!|=&7#Mtw?O!xFb4#H}vUfhVH>qw}1Ej4xI6 z;leFD2i^Ly=t?G`9jB!ImXv3s0q3UtIJ$rZ@rC#*8s{xEvG?Pr@k=cK_le(e;i32i z9q$1T9}=l^0Z%}rUzm2GHs}Dp2 zABKJ?bwMXS1w9+5qy0vp{l=m@c6pqDCNw49iuSuB&W>}_{^*H3|8{sP4GYt-1bs}F zrThUp(JHk6nzVn9Zsi6v(an1nXJhNQBRZ}zx}z=71Uskxm=YHTJTVogq{A8L77als z7=^Cgo+Iyo3^+P8bg!Uhq^2KPpYtV#m#`5R?OfDRFFS_yv(Fy0LybxW% z%PGH|_LcDqbo{qy;_J`}enS)d2aUH$?;_6T=sdN0=jZ==RQOYCBlJ%)I%69gh`vf^ zVmYC>5S?%-I?*yT!MD@?DLV0&Xuq$~em|!CJ9;bs?#=UW!`7!1_o_Bp-aYPxX1YI` zKzsC_c1BlvBD%%B(L~Qc6S)}6zc)Y^HUk^sLi9bb8eQnd5*L0y-|^Jqu(dz~9ff=0 z8R$<$Q_$1?DB6E<%I~9ze2pglL;MY0`9CRF=~FDEI@+&xEY;(})7=;yurIpO1LL9S z1V^O3YdjuZ`N?VT7tcg@Y-k*X#xJ39C#C*IaRfiUz7S9(8Q;ud=EPA0W5$1KgNZJ;c0Z>2k3M989ML>bb>$7ftC6er@I=O zaCP)~ubFZ^v|l6i)-^-pwnF2yi5;-~`F|7_9#6S_C;kD*)t6dHed{HQO_zh4a2P~kn=fPPQk^z@?K5Z!^j(18b_k5eaf;xo}i zhNe6MUEyf-`7gzBXo6SA$>{j0r;D zybAqr`UCxOzDB=dp54)fH7jx97VnR4QM+_FKAxQR)6kWji6%HKj!gR)G-2cUW*d+0 z*e&Q;nuX3YFXaVjLZz3v@QwCq8ooyZY(z7x-oLn)wb6hL(F9te6Yh)Nl7rHID!R3U z(FxB*-*}_ZAIB%7J2MAKtW@y=7j|5MuJ8kNqR-I*KcKf}^D~M>YM?9HDej5ovyt{r z=$Yz!IPnZIHz7q0jkH1M=|FB<5HlwU>zyoUz<7(KL~qltfqjqz7> zXLcS?B)l8iza=_;e>9oDj?bc*E=3b~6&&wMJ*EN;gZP2LRV5R^?RngH@d|KqX7<&N1+oQhmP-w#yuU4 za~3*oB)W4KqYEqD$b}irMgz=^^HTpbI?*C@3zwi1tU)JOhwj9mssB6mRnIEo)j%h% zjqYfD^j7YLj4xFjm<}D#z(=KgLeZh3PwEGv2@XRO9-Z>Vaa`&rq7&T^XQGKdkoL#X zGqeCX|NMaf7oPr4)8Sh*k#*?6jVV_iTui)G+%DEd`_)Hxq6xZV&CrBfrTu`|9!>BF zt;0Jd(lJuDEe8l1bys2O#Rm>|Aoe{ zK7{ofaCA3mOqP-TH;LhmdxL4{AMgw+26F4sROnV=6p##yK9Fg`h zL-YB6DHTq9RT?Iv2~9-<-;S>2KJ>Afm+}%c@ayPSe}o>cZ_q?GKf9Q48#I1xG){eV z=k_ddQU2UVS9W|F&Pe?j^j=TG@|z9~JO>T<2%6~A=*pf?`%7s5*Hd1JCi(^1|0i@| zr9VH$mrVf#sk7Tc@EtmhWlGUD2)W z5l=?9xDWciI1@d^7ouM#uR{;rJy?E9(0)tMIPaqgeuB=kdKk~Y6<2{ z;YG*I(e@g#4!ZUA(Vc6GZuJ4^L>+Kn?2N|0C|-_Ed<{B&@^GGiGo6--xoChV(JlWk zdT$q@hjAIY(ht!Ie@y+KXuzr?3TvVX?}ARaI~uoH>RX|Ydz%s$-qS9r=!I_K5Om@T z(Lh(l>(IoeqVJ7q=;!%E*aDa0KKKhZ#U|%fspy2qqY2!C?(htBXG*iVa3v3*6Fr%R zg()vZ2P{Wd@?QKT{x7aYWy*-PHX%k zeuoD91s(Ti$`$7q32chCZ-q`+Gwy&UTrcenvHbUcns`COK51x&2JVO^)CGNvjzg<9eolNc9T%f3 zd=s7ELo~t9QvMoE^rzJSicb7b%GE{}*cV0*OvXmp}(XyB7l-xuvS z0A1;DG|pJG-{t7|3F!FAXuqi`-+2+wza8(T!Z+N*=&5`G{ZxDpeII;<240T_`V&pG zVr)^rIa*%>{Ue*&Xxx3$eo#C#^_}CfV_Cl$^`ydk+Yb#i6rJ$AlrKP6QbPM(nfA%( zL^q{=2AaTs&==ba@niIi{DOO7<%^4*+q=Yt6ShMGbxOG_I#CaFV4rw)+Q-H#;skX3 z4d{;DijJS1_J`w>secw-VCkhaEKkKdDSs3{M^E|Mw10}7 zI`N+9_|91V{(p2TPDG!A-sr${Qhxz@s4hV#nuhMoU1);$qX8dBcj#$!{Ih9)Ipw#| zaVt~)3d`UB*KuK>4Y3MOg^%CXXnj3&XZAoRYJmpY7u`Ak7QOe>zfEfb{;eAOpMb8| zKV`Fh4BG$7v|n4|`FF)r(qR@l!K3IGiYL?YHT1LKEo_Htuqp0-S&?8j^uw!n%4ebD z&rAI^=)^apxAJy0!8w-^$Sr-C3Z0)0i_k=t#T96PchMDog7*I`?Q7A1-=m+7>(N`V z<>f{H+UR4vBf6t|qKWKV;=;h~(G_$?x9kM;7YQTKL~cMQn2K)w^wiHn6PXhqMOXeb z`Z4|nHo))ExLaRQ%+n0LC8YzoFoDjvJ062hI1-)cf|M^uGarwhjT_LNxD!om7P_MQ zQ~xBI*aCFi3+TAl;wQ+w{13djFq8FYApTYC@|VTU(8P9$jnMXH=)`-Y6YP&B+z#tw zM|52OI5-YR`;S3yO{rYw=kJN>@PBBaX(`V{Cz_3BJ}320qlrA1@{8!l>hjco8ox;U zH|Wl+Oa0&Ij#R!9{rP_@E*fARG;kXD>)tQe-?Un&PDrOjE)KrwKSTq6p7K{{;2+TOzofh|Sp)6y^#y=Sw~fRCU9pGtXAd4?z<Mu+EM0DJgv`<6N!pzh^faT}^aV`wB01fm! zn&FG+mcE(x_tC^YMFXutck0(zX+qI|D>UAAaYr=nu4qDy(fBPUDVD1jzkA^ zOUDz@L{3K!*O}-9L(qUDQoaz~!OPGeUMHd-yED)oo*SP+<1d|%=l|6-yoCl_g-*C8 zevf9n9^HX|(0)}X7T@!0poer1^y9ZZ+I}KBt`C~PS?G?9ikFwta2*=>wv_Kl`4Kdc zr_mKJLNk96UFkA(+`H(6pQimQblkV-xOHg%KT^NRwZ%@Bs&Qd}>S)L9BD zzEAc4)v(=vH+_2lh<+DQLj{ z=<|OTdN0SKU5`#ME#4jH#>de(&#KS=VlE8u3OeDN>F^$!@h52D)oK48o#1D5 z+{Re>x+0-1vAlA$-!8Fn>RZPBvHbhLwp=)IM>OCODIb^e3Gq}kp#kUwLsLH@UYPdF z<2C3lydFLMkEQ$^x}Yzv%jf?OR2cBrxDlPG(&VCJH8jDRDc3;{(XJ^sPkU?hFt$a< zcR`>3Zs@J*i@q0zq6@ubGS9ygUqyvpiw>NU4!6cT(|#YC$V2D~9!veRDKAFHFOTn_ ziGGZZ`wHEOZ_xz)DCMH!`l6y58ep50>%{tKf=$qSx)&O_b?gwkqL1ZCXo7>{2z2~d zbmGg=H)&}?Dy~BZOilR?bilpwL3HBB&;*}}i_`upy22G`zjx6e**-y<%3f`5>23cJQ+>AFS??^sXr&4k0v%YUY7c+%JTe8 z;=+~Q7^k6IbO$={-jpARkE01cgC?>x<=4<}weP0>19Ty)(D>h?iLOKAZp8BM|0<>w z4b{*AHPKUA51ptL`rGjX(bIhbdaC=Q356bb>xR3R@RTQ`ac)B6Oh?DvfzEdy`qS`(|Ht$1 zR=-MxTmK0fa4ovUKcEx;jSj4NW6@p*UCAzJ{qAW0rs&WA2coyCd&+&&J_e0H9!+Rc zDHT)EfYZ^;?@9T7bOrNLei99^5Dl;d{m*lkr@RIo{}Z~x-_b)?>!u=pJ#?Xs(Z{m1 zPcDu`56Nj*ABUpfXs$(f;BNFcn)6d$f&NnJOEgfWsYSm!Xt_BWr(^2-$1&&*O+w)4j-k%kLZL|Z!SJ=8=!&rja|?{ebF;A2JL?>Ho#eE;!Dv#U-$@j#lO+S z>ffR~|LwW3p)WSZ%TvA&8&Q50-O3+vcdUMEk?=lfeRp)CbJ6bw|{|35%_tO5q)UQP+{1JV>RLm$ASQC9O z?1?6PK#2=8>5K+E3Z0;P$~|MB)DJ)t8;rg$hG7F7gPxUJ(K9p`JsZ#CzW6S-!p(25 zQqdj{LdTab;=+JepqXBSCUhH?Z%x|o$0pQ2g3a&)^u_4I9(oyn$y7Joo$t{f7-3I\n" "Language: es\n" @@ -25,180 +25,190 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 2.5.1\n" -#: cps/book_formats.py:118 cps/book_formats.py:122 cps/web.py:1398 +#: cps/book_formats.py:119 cps/book_formats.py:123 cps/web.py:1401 msgid "not installed" msgstr "No instalado" -#: cps/helper.py:77 +#: cps/helper.py:78 #, python-format msgid "kindlegen binary %(kindlepath)s not found" msgstr "" -#: cps/helper.py:83 +#: cps/helper.py:84 #, python-format msgid "epub format not found for book id: %(book)d" msgstr "" -#: cps/helper.py:93 +#: cps/helper.py:94 msgid "kindlegen failed, no execution permissions" msgstr "" -#: cps/helper.py:108 +#: cps/helper.py:109 #, python-format msgid "Kindlegen failed with Error %(error)s. Message: %(message)s" msgstr "" -#: cps/helper.py:187 +#: cps/helper.py:188 #, python-format msgid "Failed to send mail: %s" msgstr "Fallo al enviar el correo : %s" -#: cps/helper.py:194 +#: cps/helper.py:195 msgid "Calibre-web test email" msgstr "Prueba de Correo Calibre-web" -#: cps/helper.py:195 cps/helper.py:207 +#: cps/helper.py:196 cps/helper.py:208 msgid "This email has been sent via calibre web." msgstr "Este mensaje ha sido enviado via Calibre Web." -#: cps/helper.py:204 cps/templates/detail.html:43 +#: cps/helper.py:205 cps/templates/detail.html:43 msgid "Send to Kindle" msgstr "Enviar a Kindle" -#: cps/helper.py:224 cps/helper.py:238 +#: cps/helper.py:225 cps/helper.py:239 msgid "Could not find any formats suitable for sending by email" msgstr "Formato no compatible para enviar por correo electronico" +#: cps/helper.py:338 +#, python-format +msgid "Rename title from: \"%s\" to \"%s\" failed with error: %s" +msgstr "" + +#: cps/helper.py:347 +#, python-format +msgid "Rename author from: \"%s\" to \"%s\" failed with error: %s" +msgstr "" + #: cps/ub.py:577 msgid "Guest" msgstr "Invitado" -#: cps/web.py:964 +#: cps/web.py:967 msgid "Requesting update package" msgstr "Solicitando paquete de actualización" -#: cps/web.py:965 +#: cps/web.py:968 msgid "Downloading update package" msgstr "Descargando paquete de actualización" -#: cps/web.py:966 +#: cps/web.py:969 msgid "Unzipping update package" msgstr "Descomprimiendo paquete de actualización" -#: cps/web.py:967 +#: cps/web.py:970 msgid "Files are replaced" msgstr "Ficheros sustituidos" -#: cps/web.py:968 +#: cps/web.py:971 msgid "Database connections are closed" msgstr "Los conexiones de base datos están cerradas" -#: cps/web.py:969 +#: cps/web.py:972 msgid "Server is stopped" msgstr "El servidor está detenido" -#: cps/web.py:970 +#: cps/web.py:973 msgid "Update finished, please press okay and reload page" msgstr "Actualización finalizada. Por favor, pulse OK y recargue la página" -#: cps/web.py:1044 +#: cps/web.py:1047 msgid "Recently Added Books" msgstr "" -#: cps/web.py:1054 +#: cps/web.py:1057 msgid "Newest Books" msgstr "" -#: cps/web.py:1065 +#: cps/web.py:1069 msgid "Oldest Books" msgstr "" -#: cps/web.py:1077 +#: cps/web.py:1081 msgid "Books (A-Z)" msgstr "" -#: cps/web.py:1088 +#: cps/web.py:1092 msgid "Books (Z-A)" msgstr "" -#: cps/web.py:1116 +#: cps/web.py:1120 msgid "Hot Books (most downloaded)" msgstr "Libros populares (los mas descargados)" -#: cps/web.py:1129 +#: cps/web.py:1133 msgid "Best rated books" msgstr "Libros mejor valorados" -#: cps/templates/index.xml:32 cps/web.py:1140 +#: cps/templates/index.xml:32 cps/web.py:1144 msgid "Random Books" msgstr "Libros al azar" -#: cps/web.py:1154 +#: cps/web.py:1158 msgid "Author list" msgstr "Lista de autores" -#: cps/web.py:1166 cps/web.py:1225 cps/web.py:1355 cps/web.py:1827 +#: cps/web.py:1170 cps/web.py:1228 cps/web.py:1358 cps/web.py:1827 msgid "Error opening eBook. File does not exist or file is not accessible:" msgstr "Error en la apertura del eBook. El archivo no existe o no es accesible:" -#: cps/templates/index.xml:64 cps/web.py:1209 +#: cps/templates/index.xml:64 cps/web.py:1212 msgid "Series list" msgstr "Lista de series" -#: cps/web.py:1223 +#: cps/web.py:1226 #, python-format msgid "Series: %(serie)s" msgstr "Series : %(serie)s" -#: cps/web.py:1256 +#: cps/web.py:1259 msgid "Available languages" msgstr "Lenguajes disponibles" -#: cps/web.py:1273 +#: cps/web.py:1276 #, python-format msgid "Language: %(name)s" msgstr "Lenguaje: %(name)s" -#: cps/templates/index.xml:58 cps/web.py:1283 +#: cps/templates/index.xml:58 cps/web.py:1286 msgid "Category list" msgstr "Lista de categorias" -#: cps/web.py:1297 +#: cps/web.py:1300 #, python-format msgid "Category: %(name)s" msgstr "Categoría : %(name)s" -#: cps/web.py:1409 +#: cps/web.py:1412 msgid "Excecution permissions missing" msgstr "" -#: cps/web.py:1423 +#: cps/web.py:1426 msgid "Statistics" msgstr "Estadisticas" -#: cps/web.py:1587 +#: cps/web.py:1591 msgid "Server restarted, please reload page" msgstr "Servidor reiniciado. Por favor, recargue la página" -#: cps/web.py:1589 +#: cps/web.py:1593 msgid "Performing shutdown of server, please close window" msgstr "Servidor en proceso de apagado. Por favor, cierre la ventana." -#: cps/web.py:1605 +#: cps/web.py:1609 msgid "Update done" msgstr "Actualización realizada" -#: cps/web.py:1687 cps/web.py:1700 +#: cps/web.py:1691 cps/web.py:1704 msgid "search" msgstr "búsqueda" #: cps/templates/index.xml:39 cps/templates/index.xml:42 -#: cps/templates/layout.html:131 cps/web.py:1782 +#: cps/templates/layout.html:132 cps/web.py:1782 msgid "Read Books" msgstr "Libros leídos" -#: cps/templates/index.xml:45 cps/templates/index.xml:48 -#: cps/templates/layout.html:132 cps/web.py:1785 +#: cps/templates/index.xml:46 cps/templates/index.xml:49 +#: cps/templates/layout.html:134 cps/web.py:1785 msgid "Unread Books" msgstr "Libros no leídos" @@ -206,7 +216,7 @@ msgstr "Libros no leídos" msgid "Read a Book" msgstr "Leer un libro" -#: cps/web.py:1925 cps/web.py:2555 +#: cps/web.py:1925 cps/web.py:2556 msgid "Please fill out all fields!" msgstr "¡Por favor completar todos los campos!" @@ -261,7 +271,7 @@ msgstr "Envio de Libro a %(kindlemail)s correctamente" msgid "There was an error sending this book: %(res)s" msgstr "Ha sucedido un error en el envio del Libro: %(res)s" -#: cps/web.py:2085 cps/web.py:2640 +#: cps/web.py:2085 cps/web.py:2641 msgid "Please configure your kindle email address first..." msgstr "Configurar primero la dirección de correo Kindle por favor..." @@ -270,179 +280,179 @@ msgstr "Configurar primero la dirección de correo Kindle por favor..." msgid "Book has been added to shelf: %(sname)s" msgstr "El libro fue agregado a el estante: %(sname)s" -#: cps/web.py:2164 +#: cps/web.py:2166 #, python-format msgid "Book has been removed from shelf: %(sname)s" msgstr "El libro fue removido del estante: %(sname)s" -#: cps/web.py:2183 cps/web.py:2207 +#: cps/web.py:2185 cps/web.py:2209 #, python-format msgid "A shelf with the name '%(title)s' already exists." msgstr "Une étagère de ce nom '%(title)s' existe déjà." -#: cps/web.py:2188 +#: cps/web.py:2190 #, python-format msgid "Shelf %(title)s created" msgstr "Estante %(title)s creado" -#: cps/web.py:2190 cps/web.py:2218 +#: cps/web.py:2192 cps/web.py:2220 msgid "There was an error" msgstr "Ha sucedido un error" -#: cps/web.py:2191 cps/web.py:2193 +#: cps/web.py:2193 cps/web.py:2195 msgid "create a shelf" msgstr "crear un estante" -#: cps/web.py:2216 +#: cps/web.py:2218 #, python-format msgid "Shelf %(title)s changed" msgstr "Estante %(title)s cambiado" -#: cps/web.py:2219 cps/web.py:2221 +#: cps/web.py:2221 cps/web.py:2223 msgid "Edit a shelf" msgstr "Editar un estante" -#: cps/web.py:2242 +#: cps/web.py:2244 #, python-format msgid "successfully deleted shelf %(name)s" msgstr "Estante %(name)s fue borrado correctamente" -#: cps/web.py:2264 +#: cps/web.py:2266 #, python-format msgid "Shelf: '%(name)s'" msgstr "Estante: '%(name)s'" -#: cps/web.py:2267 +#: cps/web.py:2269 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "" -#: cps/web.py:2299 +#: cps/web.py:2300 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "Cambiar orden del estante: '%(name)s'" -#: cps/web.py:2368 +#: cps/web.py:2369 msgid "Found an existing account for this email address." msgstr "Existe una cuenta vinculada a esta dirección de correo." -#: cps/web.py:2370 cps/web.py:2374 +#: cps/web.py:2371 cps/web.py:2375 #, python-format msgid "%(name)s's profile" msgstr "Perfil de %(name)s" -#: cps/web.py:2371 +#: cps/web.py:2372 msgid "Profile updated" msgstr "Perfil actualizado" -#: cps/web.py:2385 +#: cps/web.py:2386 msgid "Admin page" msgstr "Página de administración" -#: cps/web.py:2509 +#: cps/web.py:2510 msgid "Calibre-web configuration updated" msgstr "Configuración de Calibre-web actualizada" -#: cps/web.py:2516 cps/web.py:2522 cps/web.py:2536 +#: cps/web.py:2517 cps/web.py:2523 cps/web.py:2537 msgid "Basic Configuration" msgstr "Configuración básica" -#: cps/web.py:2520 +#: cps/web.py:2521 msgid "DB location is not valid, please enter correct path" msgstr "Localicación de la BD inválida. Por favor, introduzca la ruta correcta." -#: cps/templates/admin.html:34 cps/web.py:2557 cps/web.py:2610 +#: cps/templates/admin.html:34 cps/web.py:2558 cps/web.py:2611 msgid "Add new user" msgstr "Agregar un nuevo usuario" -#: cps/web.py:2602 +#: cps/web.py:2603 #, python-format msgid "User '%(user)s' created" msgstr "Usuario '%(user)s' creado" -#: cps/web.py:2606 +#: cps/web.py:2607 msgid "Found an existing account for this email address or nickname." msgstr "" "Se ha encontrado una cuenta vinculada a esta dirección de correo o nombre" " de usuario." -#: cps/web.py:2628 +#: cps/web.py:2629 msgid "Mail settings updated" msgstr "Parámetros de correo actualizados" -#: cps/web.py:2635 +#: cps/web.py:2636 #, python-format msgid "Test E-Mail successfully send to %(kindlemail)s" msgstr "Exito al realizar envio de prueba a %(kindlemail)s" -#: cps/web.py:2638 +#: cps/web.py:2639 #, python-format msgid "There was an error sending the Test E-Mail: %(res)s" msgstr "Error al realizar envio de prueba a E-Mail: %(res)s" -#: cps/web.py:2642 +#: cps/web.py:2643 msgid "E-Mail settings updated" msgstr "Ajustes de correo electrónico actualizados" -#: cps/web.py:2643 +#: cps/web.py:2644 msgid "Edit mail settings" msgstr "Editar parametros de correo" -#: cps/web.py:2672 +#: cps/web.py:2673 #, python-format msgid "User '%(nick)s' deleted" msgstr "Usuario '%(nick)s' borrado" -#: cps/web.py:2780 +#: cps/web.py:2781 #, python-format msgid "User '%(nick)s' updated" msgstr "Usuario '%(nick)s' actualizado" -#: cps/web.py:2783 +#: cps/web.py:2784 msgid "An unknown error occured." msgstr "Error inesperado." -#: cps/web.py:2786 +#: cps/web.py:2787 #, python-format msgid "Edit User %(nick)s" msgstr "Editar Usuario %(nick)s" -#: cps/web.py:2802 +#: cps/web.py:2803 msgid "Error opening eBook. File does not exist or file is not accessible" msgstr "" -#: cps/web.py:2817 cps/web.py:3018 cps/web.py:3161 +#: cps/web.py:2818 cps/web.py:3026 cps/web.py:3031 cps/web.py:3174 msgid "edit metadata" msgstr "editar metainformación" -#: cps/web.py:2827 cps/web.py:3055 +#: cps/web.py:2828 cps/web.py:3068 #, python-format msgid "File extension \"%s\" is not allowed to be uploaded to this server" msgstr "No se permite subir archivos con la extensión \"%s\" a este servidor" -#: cps/web.py:2838 +#: cps/web.py:2839 #, python-format msgid "Failed to store file %s." msgstr "" -#: cps/web.py:2858 cps/web.py:2862 +#: cps/web.py:2861 cps/web.py:2865 msgid "unknown" msgstr "" -#: cps/web.py:3061 +#: cps/web.py:3074 msgid "File to be uploaded must have an extension" msgstr "El archivo a subir debe tener una extensión" -#: cps/web.py:3080 +#: cps/web.py:3093 #, python-format msgid "Failed to create path %s (Permission denied)." msgstr "Fallo al crear la ruta %s (permiso negado)" -#: cps/web.py:3085 +#: cps/web.py:3098 #, python-format msgid "Failed to store file %s (Permission denied)." msgstr "Fallo al almacenar el archivo %s (permiso negado)" -#: cps/web.py:3090 +#: cps/web.py:3103 #, python-format msgid "Failed to delete file %s (Permission denied)." msgstr "Fallo al borrar el archivo %s (permiso negado)" @@ -647,7 +657,7 @@ msgstr "Descripcion" msgid "Tags" msgstr "Etiqueta" -#: cps/templates/book_edit.html:39 cps/templates/layout.html:141 +#: cps/templates/book_edit.html:39 cps/templates/layout.html:143 #: cps/templates/search_form.html:37 msgid "Series" msgstr "Series" @@ -734,7 +744,7 @@ msgstr "Haga clic en la portada para cargar la metainformación en el formulario msgid "Loading..." msgstr "Cargando..." -#: cps/templates/book_edit.html:196 cps/templates/layout.html:205 +#: cps/templates/book_edit.html:196 cps/templates/layout.html:207 msgid "Close" msgstr "Cerrar" @@ -943,7 +953,7 @@ msgstr "Guardar cambios" msgid "Save settings and send Test E-Mail" msgstr "Guardar cambios y enviar un correo de prueba" -#: cps/templates/feed.xml:20 cps/templates/layout.html:189 +#: cps/templates/feed.xml:20 cps/templates/layout.html:191 msgid "Next" msgstr "Siguiente" @@ -988,7 +998,7 @@ msgstr "Libros recientes" msgid "Show Random Books" msgstr "Mostrar libros al azar" -#: cps/templates/index.xml:52 cps/templates/layout.html:144 +#: cps/templates/index.xml:52 cps/templates/layout.html:146 msgid "Authors" msgstr "Autores" @@ -1053,39 +1063,39 @@ msgstr "" msgid "Descending" msgstr "" -#: cps/templates/layout.html:135 +#: cps/templates/layout.html:137 msgid "Discover" msgstr "Descubrir" -#: cps/templates/layout.html:138 +#: cps/templates/layout.html:140 msgid "Categories" msgstr "Categoria" -#: cps/templates/layout.html:147 cps/templates/search_form.html:58 +#: cps/templates/layout.html:149 cps/templates/search_form.html:58 msgid "Languages" msgstr "Lenguaje" -#: cps/templates/layout.html:150 +#: cps/templates/layout.html:152 msgid "Public Shelves" msgstr "Estantes públicos" -#: cps/templates/layout.html:154 +#: cps/templates/layout.html:156 msgid "Your Shelves" msgstr "Sus estantes" -#: cps/templates/layout.html:159 +#: cps/templates/layout.html:161 msgid "Create a Shelf" msgstr "Crear un estante" -#: cps/templates/layout.html:160 cps/templates/stats.html:3 +#: cps/templates/layout.html:162 cps/templates/stats.html:3 msgid "About" msgstr "Acerca de" -#: cps/templates/layout.html:174 +#: cps/templates/layout.html:176 msgid "Previous" msgstr "" -#: cps/templates/layout.html:201 +#: cps/templates/layout.html:203 msgid "Book Details" msgstr "" diff --git a/cps/translations/fr/LC_MESSAGES/messages.po b/cps/translations/fr/LC_MESSAGES/messages.po index 01a46efb..28fc847b 100644 --- a/cps/translations/fr/LC_MESSAGES/messages.po +++ b/cps/translations/fr/LC_MESSAGES/messages.po @@ -20,7 +20,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/calibre-web\n" -"POT-Creation-Date: 2017-11-12 14:54+0100\n" +"POT-Creation-Date: 2017-11-30 16:45+0100\n" "PO-Revision-Date: 2017-10-26 22:42+0200\n" "Last-Translator: Nicolas Roudninski \n" "Language: fr\n" @@ -31,182 +31,192 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 2.5.1\n" -#: cps/book_formats.py:118 cps/book_formats.py:122 cps/web.py:1398 +#: cps/book_formats.py:119 cps/book_formats.py:123 cps/web.py:1401 msgid "not installed" msgstr "non installé" -#: cps/helper.py:77 +#: cps/helper.py:78 #, python-format msgid "kindlegen binary %(kindlepath)s not found" msgstr "" -#: cps/helper.py:83 +#: cps/helper.py:84 #, python-format msgid "epub format not found for book id: %(book)d" msgstr "" -#: cps/helper.py:93 +#: cps/helper.py:94 msgid "kindlegen failed, no execution permissions" msgstr "" -#: cps/helper.py:108 +#: cps/helper.py:109 #, python-format msgid "Kindlegen failed with Error %(error)s. Message: %(message)s" msgstr "" -#: cps/helper.py:187 +#: cps/helper.py:188 #, python-format msgid "Failed to send mail: %s" msgstr "Impossible d'envoyer le courriel : %s" -#: cps/helper.py:194 +#: cps/helper.py:195 msgid "Calibre-web test email" msgstr "" -#: cps/helper.py:195 cps/helper.py:207 +#: cps/helper.py:196 cps/helper.py:208 msgid "This email has been sent via calibre web." msgstr "Ce message a été envoyé depuis calibre web." -#: cps/helper.py:204 cps/templates/detail.html:43 +#: cps/helper.py:205 cps/templates/detail.html:43 msgid "Send to Kindle" msgstr "Envoyer vers Kindle" -#: cps/helper.py:224 cps/helper.py:238 +#: cps/helper.py:225 cps/helper.py:239 msgid "Could not find any formats suitable for sending by email" msgstr "Impossible de trouver un format adapté à envoyer par courriel" +#: cps/helper.py:338 +#, python-format +msgid "Rename title from: \"%s\" to \"%s\" failed with error: %s" +msgstr "" + +#: cps/helper.py:347 +#, python-format +msgid "Rename author from: \"%s\" to \"%s\" failed with error: %s" +msgstr "" + #: cps/ub.py:577 msgid "Guest" msgstr "Invité" -#: cps/web.py:964 +#: cps/web.py:967 msgid "Requesting update package" msgstr "" -#: cps/web.py:965 +#: cps/web.py:968 msgid "Downloading update package" msgstr "Téléchargement la mise à jour" -#: cps/web.py:966 +#: cps/web.py:969 msgid "Unzipping update package" msgstr "Décompression de la mise à jour" -#: cps/web.py:967 +#: cps/web.py:970 msgid "Files are replaced" msgstr "Fichiers remplacés" -#: cps/web.py:968 +#: cps/web.py:971 msgid "Database connections are closed" msgstr "Connexion à la base de donnée fermée" -#: cps/web.py:969 +#: cps/web.py:972 msgid "Server is stopped" msgstr "Serveur arrêté" -#: cps/web.py:970 +#: cps/web.py:973 msgid "Update finished, please press okay and reload page" msgstr "Mise à jour terminée, merci d’appuyer sur okay et de rafraîchir la page" -#: cps/web.py:1044 +#: cps/web.py:1047 msgid "Recently Added Books" msgstr "Ajouts récents" -#: cps/web.py:1054 +#: cps/web.py:1057 msgid "Newest Books" msgstr "Livres récents" -#: cps/web.py:1065 +#: cps/web.py:1069 msgid "Oldest Books" msgstr "Anciens livres" -#: cps/web.py:1077 +#: cps/web.py:1081 msgid "Books (A-Z)" msgstr "Livres (A-Z)" -#: cps/web.py:1088 +#: cps/web.py:1092 msgid "Books (Z-A)" msgstr "Livres (Z-A)" -#: cps/web.py:1116 +#: cps/web.py:1120 msgid "Hot Books (most downloaded)" msgstr "Livres populaires (les plus téléchargés)" -#: cps/web.py:1129 +#: cps/web.py:1133 msgid "Best rated books" msgstr "Livres les mieux notés" -#: cps/templates/index.xml:32 cps/web.py:1140 +#: cps/templates/index.xml:32 cps/web.py:1144 msgid "Random Books" msgstr "Livres au hasard" -#: cps/web.py:1154 +#: cps/web.py:1158 msgid "Author list" msgstr "Liste des auteurs" -#: cps/web.py:1166 cps/web.py:1225 cps/web.py:1355 cps/web.py:1827 +#: cps/web.py:1170 cps/web.py:1228 cps/web.py:1358 cps/web.py:1827 msgid "Error opening eBook. File does not exist or file is not accessible:" msgstr "" "Erreur d'ouverture du livre numérique. Le fichier n'existe pas ou n'est " "pas accessible :" -#: cps/templates/index.xml:64 cps/web.py:1209 +#: cps/templates/index.xml:64 cps/web.py:1212 msgid "Series list" msgstr "Liste des séries" -#: cps/web.py:1223 +#: cps/web.py:1226 #, python-format msgid "Series: %(serie)s" msgstr "Séries : %(serie)s" -#: cps/web.py:1256 +#: cps/web.py:1259 msgid "Available languages" msgstr "Langues disponibles" -#: cps/web.py:1273 +#: cps/web.py:1276 #, python-format msgid "Language: %(name)s" msgstr "Langue : %(name)s" -#: cps/templates/index.xml:58 cps/web.py:1283 +#: cps/templates/index.xml:58 cps/web.py:1286 msgid "Category list" msgstr "Liste des catégories" -#: cps/web.py:1297 +#: cps/web.py:1300 #, python-format msgid "Category: %(name)s" msgstr "Catégorie : %(name)s" -#: cps/web.py:1409 +#: cps/web.py:1412 msgid "Excecution permissions missing" msgstr "" -#: cps/web.py:1423 +#: cps/web.py:1426 msgid "Statistics" msgstr "Statistiques" -#: cps/web.py:1587 +#: cps/web.py:1591 msgid "Server restarted, please reload page" msgstr "Serveur redémarré, merci de rafraîchir la page" -#: cps/web.py:1589 +#: cps/web.py:1593 msgid "Performing shutdown of server, please close window" msgstr "" -#: cps/web.py:1605 +#: cps/web.py:1609 msgid "Update done" msgstr "Mise à jour effectuée" -#: cps/web.py:1687 cps/web.py:1700 +#: cps/web.py:1691 cps/web.py:1704 msgid "search" msgstr "recherche" #: cps/templates/index.xml:39 cps/templates/index.xml:42 -#: cps/templates/layout.html:131 cps/web.py:1782 +#: cps/templates/layout.html:132 cps/web.py:1782 msgid "Read Books" msgstr "Livres lus" -#: cps/templates/index.xml:45 cps/templates/index.xml:48 -#: cps/templates/layout.html:132 cps/web.py:1785 +#: cps/templates/index.xml:46 cps/templates/index.xml:49 +#: cps/templates/layout.html:134 cps/web.py:1785 msgid "Unread Books" msgstr "Livres non-lus" @@ -214,7 +224,7 @@ msgstr "Livres non-lus" msgid "Read a Book" msgstr "Lire un livre" -#: cps/web.py:1925 cps/web.py:2555 +#: cps/web.py:1925 cps/web.py:2556 msgid "Please fill out all fields!" msgstr "SVP, complétez tous les champs !" @@ -269,7 +279,7 @@ msgstr "Livres envoyés à %(kindlemail)s avec succès" msgid "There was an error sending this book: %(res)s" msgstr "Il y a eu une erreur en envoyant ce livre : %(res)s" -#: cps/web.py:2085 cps/web.py:2640 +#: cps/web.py:2085 cps/web.py:2641 msgid "Please configure your kindle email address first..." msgstr "Veuillez configurer votre adresse kindle d'abord..." @@ -278,179 +288,179 @@ msgstr "Veuillez configurer votre adresse kindle d'abord..." msgid "Book has been added to shelf: %(sname)s" msgstr "Le livre a bien été ajouté à l'étagère : %(sname)s" -#: cps/web.py:2164 +#: cps/web.py:2166 #, python-format msgid "Book has been removed from shelf: %(sname)s" msgstr "Le livre a été supprimé de l'étagère %(sname)s" -#: cps/web.py:2183 cps/web.py:2207 +#: cps/web.py:2185 cps/web.py:2209 #, python-format msgid "A shelf with the name '%(title)s' already exists." msgstr "Une étagère de ce nom '%(title)s' existe déjà." -#: cps/web.py:2188 +#: cps/web.py:2190 #, python-format msgid "Shelf %(title)s created" msgstr "Étagère %(title)s créée" -#: cps/web.py:2190 cps/web.py:2218 +#: cps/web.py:2192 cps/web.py:2220 msgid "There was an error" msgstr "Il y a eu une erreur" -#: cps/web.py:2191 cps/web.py:2193 +#: cps/web.py:2193 cps/web.py:2195 msgid "create a shelf" msgstr "créer une étagère" -#: cps/web.py:2216 +#: cps/web.py:2218 #, python-format msgid "Shelf %(title)s changed" msgstr "" -#: cps/web.py:2219 cps/web.py:2221 +#: cps/web.py:2221 cps/web.py:2223 msgid "Edit a shelf" msgstr "Modifier une étagère" -#: cps/web.py:2242 +#: cps/web.py:2244 #, python-format msgid "successfully deleted shelf %(name)s" msgstr "l’étagère %(name)s a été supprimé avec succès" -#: cps/web.py:2264 +#: cps/web.py:2266 #, python-format msgid "Shelf: '%(name)s'" msgstr "Étagère : '%(name)s'" -#: cps/web.py:2267 +#: cps/web.py:2269 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "" -#: cps/web.py:2299 +#: cps/web.py:2300 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "" -#: cps/web.py:2368 +#: cps/web.py:2369 msgid "Found an existing account for this email address." msgstr "Un compte avec cette adresse de courriel existe déjà." -#: cps/web.py:2370 cps/web.py:2374 +#: cps/web.py:2371 cps/web.py:2375 #, python-format msgid "%(name)s's profile" msgstr "Profil de %(name)s" -#: cps/web.py:2371 +#: cps/web.py:2372 msgid "Profile updated" msgstr "Profil mis à jour" -#: cps/web.py:2385 +#: cps/web.py:2386 msgid "Admin page" msgstr "Page administrateur" -#: cps/web.py:2509 +#: cps/web.py:2510 msgid "Calibre-web configuration updated" msgstr "Configuration de Calibre-web mise à jour" -#: cps/web.py:2516 cps/web.py:2522 cps/web.py:2536 +#: cps/web.py:2517 cps/web.py:2523 cps/web.py:2537 msgid "Basic Configuration" msgstr "Configuration basique" -#: cps/web.py:2520 +#: cps/web.py:2521 msgid "DB location is not valid, please enter correct path" msgstr "" -#: cps/templates/admin.html:34 cps/web.py:2557 cps/web.py:2610 +#: cps/templates/admin.html:34 cps/web.py:2558 cps/web.py:2611 msgid "Add new user" msgstr "Ajouter un nouvel utilisateur" -#: cps/web.py:2602 +#: cps/web.py:2603 #, python-format msgid "User '%(user)s' created" msgstr "Utilisateur '%(user)s' créé" -#: cps/web.py:2606 +#: cps/web.py:2607 msgid "Found an existing account for this email address or nickname." msgstr "Un compte avec cette adresse de courriel ou ce surnom existe déjà." -#: cps/web.py:2628 +#: cps/web.py:2629 msgid "Mail settings updated" msgstr "Paramètres de courriel mis à jour" -#: cps/web.py:2635 +#: cps/web.py:2636 #, python-format msgid "Test E-Mail successfully send to %(kindlemail)s" msgstr "" -#: cps/web.py:2638 +#: cps/web.py:2639 #, python-format msgid "There was an error sending the Test E-Mail: %(res)s" msgstr "" -#: cps/web.py:2642 +#: cps/web.py:2643 msgid "E-Mail settings updated" msgstr "Préférences e-mail mises à jour" -#: cps/web.py:2643 +#: cps/web.py:2644 msgid "Edit mail settings" msgstr "Éditer les paramètres de courriel" -#: cps/web.py:2672 +#: cps/web.py:2673 #, python-format msgid "User '%(nick)s' deleted" msgstr "Utilisateur '%(nick)s' supprimé" -#: cps/web.py:2780 +#: cps/web.py:2781 #, python-format msgid "User '%(nick)s' updated" msgstr "Utilisateur '%(nick)s' mis à jour" -#: cps/web.py:2783 +#: cps/web.py:2784 msgid "An unknown error occured." msgstr "Oups ! Une erreur inconnue a eu lieu." -#: cps/web.py:2786 +#: cps/web.py:2787 #, python-format msgid "Edit User %(nick)s" msgstr "Éditer l'utilisateur %(nick)s" -#: cps/web.py:2802 +#: cps/web.py:2803 msgid "Error opening eBook. File does not exist or file is not accessible" msgstr "" "Erreur à l’ouverture du livre. Le fichier n’existe pas ou n’est pas " "accessible" -#: cps/web.py:2817 cps/web.py:3018 cps/web.py:3161 +#: cps/web.py:2818 cps/web.py:3026 cps/web.py:3031 cps/web.py:3174 msgid "edit metadata" msgstr "modifier les métadonnées" -#: cps/web.py:2827 cps/web.py:3055 +#: cps/web.py:2828 cps/web.py:3068 #, python-format msgid "File extension \"%s\" is not allowed to be uploaded to this server" msgstr "" -#: cps/web.py:2838 +#: cps/web.py:2839 #, python-format msgid "Failed to store file %s." msgstr "" -#: cps/web.py:2858 cps/web.py:2862 +#: cps/web.py:2861 cps/web.py:2865 msgid "unknown" msgstr "inconnu" -#: cps/web.py:3061 +#: cps/web.py:3074 msgid "File to be uploaded must have an extension" msgstr "Pour être téléverser le fichier doit avoir une extension" -#: cps/web.py:3080 +#: cps/web.py:3093 #, python-format msgid "Failed to create path %s (Permission denied)." msgstr "Impossible de créer le chemin %s (permission refusée)" -#: cps/web.py:3085 +#: cps/web.py:3098 #, python-format msgid "Failed to store file %s (Permission denied)." msgstr "Impossible d'enregistrer le fichier %s (permission refusée)" -#: cps/web.py:3090 +#: cps/web.py:3103 #, python-format msgid "Failed to delete file %s (Permission denied)." msgstr "Impossible de supprimer le fichier %s (permission refusée)" @@ -655,7 +665,7 @@ msgstr "Description" msgid "Tags" msgstr "Étiquette" -#: cps/templates/book_edit.html:39 cps/templates/layout.html:141 +#: cps/templates/book_edit.html:39 cps/templates/layout.html:143 #: cps/templates/search_form.html:37 msgid "Series" msgstr "Séries" @@ -742,7 +752,7 @@ msgstr "" msgid "Loading..." msgstr "Chargement…" -#: cps/templates/book_edit.html:196 cps/templates/layout.html:205 +#: cps/templates/book_edit.html:196 cps/templates/layout.html:207 msgid "Close" msgstr "Fermer" @@ -951,7 +961,7 @@ msgstr "Sauvegarder les réglages" msgid "Save settings and send Test E-Mail" msgstr "Sauvegarder les réglages et tester l’envoi d’e-mail" -#: cps/templates/feed.xml:20 cps/templates/layout.html:189 +#: cps/templates/feed.xml:20 cps/templates/layout.html:191 msgid "Next" msgstr "Suivant" @@ -998,7 +1008,7 @@ msgstr "Les derniers livres" msgid "Show Random Books" msgstr "Montrer des livres au hasard" -#: cps/templates/index.xml:52 cps/templates/layout.html:144 +#: cps/templates/index.xml:52 cps/templates/layout.html:146 msgid "Authors" msgstr "Auteurs" @@ -1063,39 +1073,39 @@ msgstr "Ascendant" msgid "Descending" msgstr "Descendant" -#: cps/templates/layout.html:135 +#: cps/templates/layout.html:137 msgid "Discover" msgstr "Découvrir" -#: cps/templates/layout.html:138 +#: cps/templates/layout.html:140 msgid "Categories" msgstr "Catégories" -#: cps/templates/layout.html:147 cps/templates/search_form.html:58 +#: cps/templates/layout.html:149 cps/templates/search_form.html:58 msgid "Languages" msgstr "Langues" -#: cps/templates/layout.html:150 +#: cps/templates/layout.html:152 msgid "Public Shelves" msgstr "Étagères publiques" -#: cps/templates/layout.html:154 +#: cps/templates/layout.html:156 msgid "Your Shelves" msgstr "Vos étagères" -#: cps/templates/layout.html:159 +#: cps/templates/layout.html:161 msgid "Create a Shelf" msgstr "Créer une étagère" -#: cps/templates/layout.html:160 cps/templates/stats.html:3 +#: cps/templates/layout.html:162 cps/templates/stats.html:3 msgid "About" msgstr "À propos" -#: cps/templates/layout.html:174 +#: cps/templates/layout.html:176 msgid "Previous" msgstr "Précédent" -#: cps/templates/layout.html:201 +#: cps/templates/layout.html:203 msgid "Book Details" msgstr "Détails du livre" diff --git a/cps/translations/it/LC_MESSAGES/messages.po b/cps/translations/it/LC_MESSAGES/messages.po index 39e0bbc9..1e2febe8 100644 --- a/cps/translations/it/LC_MESSAGES/messages.po +++ b/cps/translations/it/LC_MESSAGES/messages.po @@ -14,7 +14,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/calibre-web\n" -"POT-Creation-Date: 2017-11-12 14:54+0100\n" +"POT-Creation-Date: 2017-11-30 16:45+0100\n" "PO-Revision-Date: 2017-04-04 15:09+0200\n" "Last-Translator: Marco Picone \n" "Language: it\n" @@ -25,182 +25,192 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 2.5.1\n" -#: cps/book_formats.py:118 cps/book_formats.py:122 cps/web.py:1398 +#: cps/book_formats.py:119 cps/book_formats.py:123 cps/web.py:1401 msgid "not installed" msgstr "non installato" -#: cps/helper.py:77 +#: cps/helper.py:78 #, python-format msgid "kindlegen binary %(kindlepath)s not found" msgstr "Non trovato" -#: cps/helper.py:83 +#: cps/helper.py:84 #, python-format msgid "epub format not found for book id: %(book)d" msgstr "formato epub non trovato" -#: cps/helper.py:93 +#: cps/helper.py:94 msgid "kindlegen failed, no execution permissions" msgstr "non ci sono permessi" -#: cps/helper.py:108 +#: cps/helper.py:109 #, python-format msgid "Kindlegen failed with Error %(error)s. Message: %(message)s" msgstr "errore" -#: cps/helper.py:187 +#: cps/helper.py:188 #, python-format msgid "Failed to send mail: %s" msgstr "Impossibile inviare email: %s" -#: cps/helper.py:194 +#: cps/helper.py:195 msgid "Calibre-web test email" msgstr "test email Calibre-web" -#: cps/helper.py:195 cps/helper.py:207 +#: cps/helper.py:196 cps/helper.py:208 msgid "This email has been sent via calibre web." msgstr "L'email è stata inviata tramite Calibre Web." -#: cps/helper.py:204 cps/templates/detail.html:43 +#: cps/helper.py:205 cps/templates/detail.html:43 msgid "Send to Kindle" msgstr "Invia a Kindle" -#: cps/helper.py:224 cps/helper.py:238 +#: cps/helper.py:225 cps/helper.py:239 msgid "Could not find any formats suitable for sending by email" msgstr "Impossibile trovare i formati adatti per l'invio tramite email" +#: cps/helper.py:338 +#, python-format +msgid "Rename title from: \"%s\" to \"%s\" failed with error: %s" +msgstr "" + +#: cps/helper.py:347 +#, python-format +msgid "Rename author from: \"%s\" to \"%s\" failed with error: %s" +msgstr "" + #: cps/ub.py:577 msgid "Guest" msgstr "ospite" -#: cps/web.py:964 +#: cps/web.py:967 msgid "Requesting update package" msgstr "Richiesta del pacchetto di aggiornamento" -#: cps/web.py:965 +#: cps/web.py:968 msgid "Downloading update package" msgstr "Scaricare il pacchetto di aggiornamento" -#: cps/web.py:966 +#: cps/web.py:969 msgid "Unzipping update package" msgstr "Decomprimere pacchetto di aggiornamento" -#: cps/web.py:967 +#: cps/web.py:970 msgid "Files are replaced" msgstr "I file vengono sostituiti" -#: cps/web.py:968 +#: cps/web.py:971 msgid "Database connections are closed" msgstr "Le connessioni di database sono chiuse" -#: cps/web.py:969 +#: cps/web.py:972 msgid "Server is stopped" msgstr "Il server viene arrestato" -#: cps/web.py:970 +#: cps/web.py:973 msgid "Update finished, please press okay and reload page" msgstr "Aggiornamento completato, prego premere bene e ricaricare pagina" -#: cps/web.py:1044 +#: cps/web.py:1047 msgid "Recently Added Books" msgstr "Libri aggiunti di recente" -#: cps/web.py:1054 +#: cps/web.py:1057 msgid "Newest Books" msgstr "I più nuovi libri" -#: cps/web.py:1065 +#: cps/web.py:1069 msgid "Oldest Books" msgstr "Libri più vecchi" -#: cps/web.py:1077 +#: cps/web.py:1081 msgid "Books (A-Z)" msgstr "Ebook (A-Z)" -#: cps/web.py:1088 +#: cps/web.py:1092 msgid "Books (Z-A)" msgstr "Ebook (Z-A)" -#: cps/web.py:1116 +#: cps/web.py:1120 msgid "Hot Books (most downloaded)" msgstr "Hot Books (più scaricati)" -#: cps/web.py:1129 +#: cps/web.py:1133 msgid "Best rated books" msgstr "I migliori libri valutati" -#: cps/templates/index.xml:32 cps/web.py:1140 +#: cps/templates/index.xml:32 cps/web.py:1144 msgid "Random Books" msgstr "Libri casuali" -#: cps/web.py:1154 +#: cps/web.py:1158 msgid "Author list" msgstr "Elenco degli autori" -#: cps/web.py:1166 cps/web.py:1225 cps/web.py:1355 cps/web.py:1827 +#: cps/web.py:1170 cps/web.py:1228 cps/web.py:1358 cps/web.py:1827 msgid "Error opening eBook. File does not exist or file is not accessible:" msgstr "" "Errore durante l'apertura di eBook. Il file non esiste o il file non è " "accessibile:" -#: cps/templates/index.xml:64 cps/web.py:1209 +#: cps/templates/index.xml:64 cps/web.py:1212 msgid "Series list" msgstr "Lista delle serie" -#: cps/web.py:1223 +#: cps/web.py:1226 #, python-format msgid "Series: %(serie)s" msgstr "Serie :" -#: cps/web.py:1256 +#: cps/web.py:1259 msgid "Available languages" msgstr "Lingue disponibili" -#: cps/web.py:1273 +#: cps/web.py:1276 #, python-format msgid "Language: %(name)s" msgstr "Lingue: %(name)s" -#: cps/templates/index.xml:58 cps/web.py:1283 +#: cps/templates/index.xml:58 cps/web.py:1286 msgid "Category list" msgstr "Elenco categorie" -#: cps/web.py:1297 +#: cps/web.py:1300 #, python-format msgid "Category: %(name)s" msgstr "Categoria : %(name)s" -#: cps/web.py:1409 +#: cps/web.py:1412 msgid "Excecution permissions missing" msgstr "Mancano autorizzazioni di esecuzione" -#: cps/web.py:1423 +#: cps/web.py:1426 msgid "Statistics" msgstr "Statistica" -#: cps/web.py:1587 +#: cps/web.py:1591 msgid "Server restarted, please reload page" msgstr "Server riavviato, ricarica pagina" -#: cps/web.py:1589 +#: cps/web.py:1593 msgid "Performing shutdown of server, please close window" msgstr "Eseguire l'arresto del server, chiudi la finestra." -#: cps/web.py:1605 +#: cps/web.py:1609 msgid "Update done" msgstr "Aggiornamento fatto" -#: cps/web.py:1687 cps/web.py:1700 +#: cps/web.py:1691 cps/web.py:1704 msgid "search" msgstr "ricerca" #: cps/templates/index.xml:39 cps/templates/index.xml:42 -#: cps/templates/layout.html:131 cps/web.py:1782 +#: cps/templates/layout.html:132 cps/web.py:1782 msgid "Read Books" msgstr "Leggere libri" -#: cps/templates/index.xml:45 cps/templates/index.xml:48 -#: cps/templates/layout.html:132 cps/web.py:1785 +#: cps/templates/index.xml:46 cps/templates/index.xml:49 +#: cps/templates/layout.html:134 cps/web.py:1785 msgid "Unread Books" msgstr "Libri non letti" @@ -208,7 +218,7 @@ msgstr "Libri non letti" msgid "Read a Book" msgstr "Leggere un libro" -#: cps/web.py:1925 cps/web.py:2555 +#: cps/web.py:1925 cps/web.py:2556 msgid "Please fill out all fields!" msgstr "Compila tutti i campi" @@ -263,7 +273,7 @@ msgstr "Libro inviare con successo %(kindlemail)s correttamente" msgid "There was an error sending this book: %(res)s" msgstr "Si è verificato un errore durante l'invio di questo libro: %(res)s" -#: cps/web.py:2085 cps/web.py:2640 +#: cps/web.py:2085 cps/web.py:2641 msgid "Please configure your kindle email address first..." msgstr "Si prega di configurare innanzitutto il tuo indirizzo email..." @@ -272,183 +282,183 @@ msgstr "Si prega di configurare innanzitutto il tuo indirizzo email..." msgid "Book has been added to shelf: %(sname)s" msgstr "Il libro è stato aggiunto alla mensola: %(sname)s" -#: cps/web.py:2164 +#: cps/web.py:2166 #, python-format msgid "Book has been removed from shelf: %(sname)s" msgstr "Il libro è stato rimosso dalla mensola: %(sname)s" -#: cps/web.py:2183 cps/web.py:2207 +#: cps/web.py:2185 cps/web.py:2209 #, python-format msgid "A shelf with the name '%(title)s' already exists." msgstr "Uno scaffale con il nome '%(title)s' esiste già." -#: cps/web.py:2188 +#: cps/web.py:2190 #, python-format msgid "Shelf %(title)s created" msgstr "Mensola %(title)s creato" -#: cps/web.py:2190 cps/web.py:2218 +#: cps/web.py:2192 cps/web.py:2220 msgid "There was an error" msgstr "c'era un errore" -#: cps/web.py:2191 cps/web.py:2193 +#: cps/web.py:2193 cps/web.py:2195 msgid "create a shelf" msgstr "creare uno scaffale" -#: cps/web.py:2216 +#: cps/web.py:2218 #, python-format msgid "Shelf %(title)s changed" msgstr "Mensola %(title)s cambiato" -#: cps/web.py:2219 cps/web.py:2221 +#: cps/web.py:2221 cps/web.py:2223 msgid "Edit a shelf" msgstr "Modifica un ripiano" -#: cps/web.py:2242 +#: cps/web.py:2244 #, python-format msgid "successfully deleted shelf %(name)s" msgstr "cancellato con successo il ripiano %(name)s" -#: cps/web.py:2264 +#: cps/web.py:2266 #, python-format msgid "Shelf: '%(name)s'" msgstr "Mensola: '%(name)s'" -#: cps/web.py:2267 +#: cps/web.py:2269 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "" "Errore durante l'apertura dello scaffale. La mensola non esiste o non è " "accessibile" -#: cps/web.py:2299 +#: cps/web.py:2300 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "Modificare l'ordine della mensola: '%(name)s'" -#: cps/web.py:2368 +#: cps/web.py:2369 msgid "Found an existing account for this email address." msgstr "Trovato un account esistente per questo indirizzo email." -#: cps/web.py:2370 cps/web.py:2374 +#: cps/web.py:2371 cps/web.py:2375 #, python-format msgid "%(name)s's profile" msgstr "Profilo di %(name)s" -#: cps/web.py:2371 +#: cps/web.py:2372 msgid "Profile updated" msgstr "Profilo aggiornato" -#: cps/web.py:2385 +#: cps/web.py:2386 msgid "Admin page" msgstr "Pagina di amministrazione" -#: cps/web.py:2509 +#: cps/web.py:2510 msgid "Calibre-web configuration updated" msgstr "Aggiornamento della configurazione del calibro-web" -#: cps/web.py:2516 cps/web.py:2522 cps/web.py:2536 +#: cps/web.py:2517 cps/web.py:2523 cps/web.py:2537 msgid "Basic Configuration" msgstr "Configurazione di base" -#: cps/web.py:2520 +#: cps/web.py:2521 msgid "DB location is not valid, please enter correct path" msgstr "Posizione DB non valida. Inserisci il percorso corretto." -#: cps/templates/admin.html:34 cps/web.py:2557 cps/web.py:2610 +#: cps/templates/admin.html:34 cps/web.py:2558 cps/web.py:2611 msgid "Add new user" msgstr "Aggiungi un nuovo utente" -#: cps/web.py:2602 +#: cps/web.py:2603 #, python-format msgid "User '%(user)s' created" msgstr "utente '%(user)s' creato" -#: cps/web.py:2606 +#: cps/web.py:2607 msgid "Found an existing account for this email address or nickname." msgstr "" "È stato trovato un account collegato a questo indirizzo e-mail o nome " "utente." -#: cps/web.py:2628 +#: cps/web.py:2629 msgid "Mail settings updated" msgstr "Parametri di posta aggiornati" -#: cps/web.py:2635 +#: cps/web.py:2636 #, python-format msgid "Test E-Mail successfully send to %(kindlemail)s" msgstr "Successo quando invii il test a %(kindlemail)s" -#: cps/web.py:2638 +#: cps/web.py:2639 #, python-format msgid "There was an error sending the Test E-Mail: %(res)s" msgstr "Impossibile inviare il test a E-Mail: %(res)s" -#: cps/web.py:2642 +#: cps/web.py:2643 msgid "E-Mail settings updated" msgstr "Impostazioni email aggiornate" -#: cps/web.py:2643 +#: cps/web.py:2644 msgid "Edit mail settings" msgstr "Modificare i parametri della posta" -#: cps/web.py:2672 +#: cps/web.py:2673 #, python-format msgid "User '%(nick)s' deleted" msgstr "utente '%(nick)s' cancellati" -#: cps/web.py:2780 +#: cps/web.py:2781 #, python-format msgid "User '%(nick)s' updated" msgstr "utente '%(nick)s' aggiornato" -#: cps/web.py:2783 +#: cps/web.py:2784 msgid "An unknown error occured." msgstr "Errore imprevisto." -#: cps/web.py:2786 +#: cps/web.py:2787 #, python-format msgid "Edit User %(nick)s" msgstr "Modifica utente %(nick)s" -#: cps/web.py:2802 +#: cps/web.py:2803 msgid "Error opening eBook. File does not exist or file is not accessible" msgstr "" "Errore durante l'apertura di eBook. Il file non esiste o il file non è " "accessibile" -#: cps/web.py:2817 cps/web.py:3018 cps/web.py:3161 +#: cps/web.py:2818 cps/web.py:3026 cps/web.py:3031 cps/web.py:3174 msgid "edit metadata" msgstr "modificare la metainformazione" -#: cps/web.py:2827 cps/web.py:3055 +#: cps/web.py:2828 cps/web.py:3068 #, python-format msgid "File extension \"%s\" is not allowed to be uploaded to this server" msgstr "Non è consentito caricare i file con l'estensione \"%s\" a questo server" -#: cps/web.py:2838 +#: cps/web.py:2839 #, python-format msgid "Failed to store file %s." msgstr "" -#: cps/web.py:2858 cps/web.py:2862 +#: cps/web.py:2861 cps/web.py:2865 msgid "unknown" msgstr "Sconosciuto" -#: cps/web.py:3061 +#: cps/web.py:3074 msgid "File to be uploaded must have an extension" msgstr "Il file da caricare deve avere un'estensione" -#: cps/web.py:3080 +#: cps/web.py:3093 #, python-format msgid "Failed to create path %s (Permission denied)." msgstr "Impossibile creare il percorso %s (autorizzazione negata)" -#: cps/web.py:3085 +#: cps/web.py:3098 #, python-format msgid "Failed to store file %s (Permission denied)." msgstr "Impossibile archiviare il file %s (autorizzazione negata)" -#: cps/web.py:3090 +#: cps/web.py:3103 #, python-format msgid "Failed to delete file %s (Permission denied)." msgstr "Impossibile eliminare il file %s (autorizzazione negata)" @@ -653,7 +663,7 @@ msgstr "Descrizione" msgid "Tags" msgstr "Tags" -#: cps/templates/book_edit.html:39 cps/templates/layout.html:141 +#: cps/templates/book_edit.html:39 cps/templates/layout.html:143 #: cps/templates/search_form.html:37 msgid "Series" msgstr "Serie" @@ -740,7 +750,7 @@ msgstr "Fai clic sul coperchio per caricare i metadati nel modulo" msgid "Loading..." msgstr "Caricamento in corso..." -#: cps/templates/book_edit.html:196 cps/templates/layout.html:205 +#: cps/templates/book_edit.html:196 cps/templates/layout.html:207 msgid "Close" msgstr "Chiuso" @@ -949,7 +959,7 @@ msgstr "Salva le impostazioni" msgid "Save settings and send Test E-Mail" msgstr "Salvare le impostazioni e inviare Test e-mail" -#: cps/templates/feed.xml:20 cps/templates/layout.html:189 +#: cps/templates/feed.xml:20 cps/templates/layout.html:191 msgid "Next" msgstr "Prossimo" @@ -994,7 +1004,7 @@ msgstr "Gli ultimi Libri" msgid "Show Random Books" msgstr "Mostra libri casuali" -#: cps/templates/index.xml:52 cps/templates/layout.html:144 +#: cps/templates/index.xml:52 cps/templates/layout.html:146 msgid "Authors" msgstr "Autori" @@ -1059,39 +1069,39 @@ msgstr "Ascendente" msgid "Descending" msgstr "Discendente" -#: cps/templates/layout.html:135 +#: cps/templates/layout.html:137 msgid "Discover" msgstr "Per scoprire" -#: cps/templates/layout.html:138 +#: cps/templates/layout.html:140 msgid "Categories" msgstr "Categoria" -#: cps/templates/layout.html:147 cps/templates/search_form.html:58 +#: cps/templates/layout.html:149 cps/templates/search_form.html:58 msgid "Languages" msgstr "lingua" -#: cps/templates/layout.html:150 +#: cps/templates/layout.html:152 msgid "Public Shelves" msgstr "Ripiani pubblici" -#: cps/templates/layout.html:154 +#: cps/templates/layout.html:156 msgid "Your Shelves" msgstr "I tuoi scaffali" -#: cps/templates/layout.html:159 +#: cps/templates/layout.html:161 msgid "Create a Shelf" msgstr "Crea una mensola" -#: cps/templates/layout.html:160 cps/templates/stats.html:3 +#: cps/templates/layout.html:162 cps/templates/stats.html:3 msgid "About" msgstr "Di" -#: cps/templates/layout.html:174 +#: cps/templates/layout.html:176 msgid "Previous" msgstr "Precedente" -#: cps/templates/layout.html:201 +#: cps/templates/layout.html:203 msgid "Book Details" msgstr "Dettagli ebook" diff --git a/cps/translations/nl/LC_MESSAGES/messages.po b/cps/translations/nl/LC_MESSAGES/messages.po index 2e29210b..18a36030 100644 --- a/cps/translations/nl/LC_MESSAGES/messages.po +++ b/cps/translations/nl/LC_MESSAGES/messages.po @@ -22,7 +22,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-web dutch translation by Ed Driesen (GPL V3)\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2017-11-12 14:54+0100\n" +"POT-Creation-Date: 2017-11-30 16:45+0100\n" "PO-Revision-Date: 2017-06-21 20:15+0200\n" "Last-Translator: \n" "Language: nl\n" @@ -33,182 +33,192 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 2.5.1\n" -#: cps/book_formats.py:118 cps/book_formats.py:122 cps/web.py:1398 +#: cps/book_formats.py:119 cps/book_formats.py:123 cps/web.py:1401 msgid "not installed" msgstr "niet geïnstalleerd" -#: cps/helper.py:77 +#: cps/helper.py:78 #, python-format msgid "kindlegen binary %(kindlepath)s not found" msgstr "kindlegen binary %(kindlepath)s niet gevonden" -#: cps/helper.py:83 +#: cps/helper.py:84 #, python-format msgid "epub format not found for book id: %(book)d" msgstr "epub type niet gevonden voor boek met id: %(book)d" -#: cps/helper.py:93 +#: cps/helper.py:94 msgid "kindlegen failed, no execution permissions" msgstr "kindlegen gefaald, geen rechten om uit te voeren" -#: cps/helper.py:108 +#: cps/helper.py:109 #, python-format msgid "Kindlegen failed with Error %(error)s. Message: %(message)s" msgstr "Kindlegen gefaald met Error %(error)s. Bericht: %(message)s" -#: cps/helper.py:187 +#: cps/helper.py:188 #, python-format msgid "Failed to send mail: %s" msgstr "Mail sturen gefaald: %s" -#: cps/helper.py:194 +#: cps/helper.py:195 msgid "Calibre-web test email" msgstr "Calibre-web test email" -#: cps/helper.py:195 cps/helper.py:207 +#: cps/helper.py:196 cps/helper.py:208 msgid "This email has been sent via calibre web." msgstr "Deze mail werd verstuurd met calibre web." -#: cps/helper.py:204 cps/templates/detail.html:43 +#: cps/helper.py:205 cps/templates/detail.html:43 msgid "Send to Kindle" msgstr "Stuur naar Kindle:" -#: cps/helper.py:224 cps/helper.py:238 +#: cps/helper.py:225 cps/helper.py:239 msgid "Could not find any formats suitable for sending by email" msgstr "Kon geen geschikte formaten vinden om te verzenden per email" +#: cps/helper.py:338 +#, python-format +msgid "Rename title from: \"%s\" to \"%s\" failed with error: %s" +msgstr "" + +#: cps/helper.py:347 +#, python-format +msgid "Rename author from: \"%s\" to \"%s\" failed with error: %s" +msgstr "" + #: cps/ub.py:577 msgid "Guest" msgstr "Gast" -#: cps/web.py:964 +#: cps/web.py:967 msgid "Requesting update package" msgstr "Update pakket wordt aangevraagd" -#: cps/web.py:965 +#: cps/web.py:968 msgid "Downloading update package" msgstr "Update pakket wordt gedownload" -#: cps/web.py:966 +#: cps/web.py:969 msgid "Unzipping update package" msgstr "Update pakket wordt uitgepakt" -#: cps/web.py:967 +#: cps/web.py:970 msgid "Files are replaced" msgstr "Bestanden zijn vervangen" -#: cps/web.py:968 +#: cps/web.py:971 msgid "Database connections are closed" msgstr "Database verbindingen zijn gesloten" -#: cps/web.py:969 +#: cps/web.py:972 msgid "Server is stopped" msgstr "Server is gestopt" -#: cps/web.py:970 +#: cps/web.py:973 msgid "Update finished, please press okay and reload page" msgstr "Update voltooid, klik op ok en herlaad de pagina" -#: cps/web.py:1044 +#: cps/web.py:1047 msgid "Recently Added Books" msgstr "Recent toegevoegde boeken" -#: cps/web.py:1054 +#: cps/web.py:1057 msgid "Newest Books" msgstr "Nieuwste boeken" -#: cps/web.py:1065 +#: cps/web.py:1069 msgid "Oldest Books" msgstr "Oudste boeken" -#: cps/web.py:1077 +#: cps/web.py:1081 msgid "Books (A-Z)" msgstr "Boeken (A-Z)" -#: cps/web.py:1088 +#: cps/web.py:1092 msgid "Books (Z-A)" msgstr "Boeken (A-Z)" -#: cps/web.py:1116 +#: cps/web.py:1120 msgid "Hot Books (most downloaded)" msgstr "Populaire boeken (meeste downloads)" -#: cps/web.py:1129 +#: cps/web.py:1133 msgid "Best rated books" msgstr "Best beoordeelde boeken" -#: cps/templates/index.xml:32 cps/web.py:1140 +#: cps/templates/index.xml:32 cps/web.py:1144 msgid "Random Books" msgstr "Willekeurige boeken" -#: cps/web.py:1154 +#: cps/web.py:1158 msgid "Author list" msgstr "Auteur lijst" -#: cps/web.py:1166 cps/web.py:1225 cps/web.py:1355 cps/web.py:1827 +#: cps/web.py:1170 cps/web.py:1228 cps/web.py:1358 cps/web.py:1827 msgid "Error opening eBook. File does not exist or file is not accessible:" msgstr "" "Fout bij openen van het boek. Bestand bestaat niet of is niet " "toegankelijk:" -#: cps/templates/index.xml:64 cps/web.py:1209 +#: cps/templates/index.xml:64 cps/web.py:1212 msgid "Series list" msgstr "Serie lijst" -#: cps/web.py:1223 +#: cps/web.py:1226 #, python-format msgid "Series: %(serie)s" msgstr "Serie: %(serie)s" -#: cps/web.py:1256 +#: cps/web.py:1259 msgid "Available languages" msgstr "Beschikbare talen" -#: cps/web.py:1273 +#: cps/web.py:1276 #, python-format msgid "Language: %(name)s" msgstr "Taal: %(name)s" -#: cps/templates/index.xml:58 cps/web.py:1283 +#: cps/templates/index.xml:58 cps/web.py:1286 msgid "Category list" msgstr "Categorie lijst" -#: cps/web.py:1297 +#: cps/web.py:1300 #, python-format msgid "Category: %(name)s" msgstr "Categorie: %(name)s" -#: cps/web.py:1409 +#: cps/web.py:1412 msgid "Excecution permissions missing" msgstr "Rechten om uit te voeren ontbreken" -#: cps/web.py:1423 +#: cps/web.py:1426 msgid "Statistics" msgstr "Statistieken" -#: cps/web.py:1587 +#: cps/web.py:1591 msgid "Server restarted, please reload page" msgstr "Server herstart, gelieve de pagina herladen" -#: cps/web.py:1589 +#: cps/web.py:1593 msgid "Performing shutdown of server, please close window" msgstr "Bezig met het stoppen van de server, gelieve venster te sluiten" -#: cps/web.py:1605 +#: cps/web.py:1609 msgid "Update done" msgstr "Update voltooid" -#: cps/web.py:1687 cps/web.py:1700 +#: cps/web.py:1691 cps/web.py:1704 msgid "search" msgstr "zoek" #: cps/templates/index.xml:39 cps/templates/index.xml:42 -#: cps/templates/layout.html:131 cps/web.py:1782 +#: cps/templates/layout.html:132 cps/web.py:1782 msgid "Read Books" msgstr "Gelezen Boeken" -#: cps/templates/index.xml:45 cps/templates/index.xml:48 -#: cps/templates/layout.html:132 cps/web.py:1785 +#: cps/templates/index.xml:46 cps/templates/index.xml:49 +#: cps/templates/layout.html:134 cps/web.py:1785 msgid "Unread Books" msgstr "Ongelezen Boeken" @@ -216,7 +226,7 @@ msgstr "Ongelezen Boeken" msgid "Read a Book" msgstr "Lees een boek" -#: cps/web.py:1925 cps/web.py:2555 +#: cps/web.py:1925 cps/web.py:2556 msgid "Please fill out all fields!" msgstr "Gelieve alle velden in te vullen!" @@ -271,7 +281,7 @@ msgstr "Boek met succes verstuurd naar %(kindlemail)s" msgid "There was an error sending this book: %(res)s" msgstr "Er trad een fout op bij het versturen van dit boek: %(res)s" -#: cps/web.py:2085 cps/web.py:2640 +#: cps/web.py:2085 cps/web.py:2641 msgid "Please configure your kindle email address first..." msgstr "Gelieve eerst je kindle email adres te configureren..." @@ -280,179 +290,179 @@ msgstr "Gelieve eerst je kindle email adres te configureren..." msgid "Book has been added to shelf: %(sname)s" msgstr "Boek werd toegevoegd aan boekenplank: %(sname)s" -#: cps/web.py:2164 +#: cps/web.py:2166 #, python-format msgid "Book has been removed from shelf: %(sname)s" msgstr "Boek werd verwijderd van boekenplank: %(sname)s" -#: cps/web.py:2183 cps/web.py:2207 +#: cps/web.py:2185 cps/web.py:2209 #, python-format msgid "A shelf with the name '%(title)s' already exists." msgstr "Een boekenplank met de naam '%(title)s' bestaat reeds." -#: cps/web.py:2188 +#: cps/web.py:2190 #, python-format msgid "Shelf %(title)s created" msgstr "Boekenplank %(title)s aangemaakt" -#: cps/web.py:2190 cps/web.py:2218 +#: cps/web.py:2192 cps/web.py:2220 msgid "There was an error" msgstr "Er deed zich een fout voor" -#: cps/web.py:2191 cps/web.py:2193 +#: cps/web.py:2193 cps/web.py:2195 msgid "create a shelf" msgstr "maak een boekenplank" -#: cps/web.py:2216 +#: cps/web.py:2218 #, python-format msgid "Shelf %(title)s changed" msgstr "Boekenplank %(title)s gewijzigd" -#: cps/web.py:2219 cps/web.py:2221 +#: cps/web.py:2221 cps/web.py:2223 msgid "Edit a shelf" msgstr "Bewerk een boekenplank" -#: cps/web.py:2242 +#: cps/web.py:2244 #, python-format msgid "successfully deleted shelf %(name)s" msgstr "Boekenplank %(name)s succesvol gewist" -#: cps/web.py:2264 +#: cps/web.py:2266 #, python-format msgid "Shelf: '%(name)s'" msgstr "Boekenplank: '%(name)s'" -#: cps/web.py:2267 +#: cps/web.py:2269 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "" "Fout bij openen boekenplank. Boekenplank bestaat niet of is niet " "toegankelijk" -#: cps/web.py:2299 +#: cps/web.py:2300 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "Verander volgorde van Boekenplank: '%(name)s'" -#: cps/web.py:2368 +#: cps/web.py:2369 msgid "Found an existing account for this email address." msgstr "Een bestaand gebruiker gevonden voor dit email adres." -#: cps/web.py:2370 cps/web.py:2374 +#: cps/web.py:2371 cps/web.py:2375 #, python-format msgid "%(name)s's profile" msgstr "%(name)s's profiel" -#: cps/web.py:2371 +#: cps/web.py:2372 msgid "Profile updated" msgstr "Profiel aangepast" -#: cps/web.py:2385 +#: cps/web.py:2386 msgid "Admin page" msgstr "Administratie pagina" -#: cps/web.py:2509 +#: cps/web.py:2510 msgid "Calibre-web configuration updated" msgstr "Calibre-web configuratie aangepast" -#: cps/web.py:2516 cps/web.py:2522 cps/web.py:2536 +#: cps/web.py:2517 cps/web.py:2523 cps/web.py:2537 msgid "Basic Configuration" msgstr "Basis configuratie" -#: cps/web.py:2520 +#: cps/web.py:2521 msgid "DB location is not valid, please enter correct path" msgstr "DB locatie is niet geldig, gelieve het correcte pad in te geven" -#: cps/templates/admin.html:34 cps/web.py:2557 cps/web.py:2610 +#: cps/templates/admin.html:34 cps/web.py:2558 cps/web.py:2611 msgid "Add new user" msgstr "Voeg nieuwe gebruiker toe" -#: cps/web.py:2602 +#: cps/web.py:2603 #, python-format msgid "User '%(user)s' created" msgstr "Gebruiker '%(user)s' aangemaakt" -#: cps/web.py:2606 +#: cps/web.py:2607 msgid "Found an existing account for this email address or nickname." msgstr "Een bestaande gebruiker gevonden voor dit emailadres of gebruikersnaam." -#: cps/web.py:2628 +#: cps/web.py:2629 msgid "Mail settings updated" msgstr "Mail instellingen aangepast" -#: cps/web.py:2635 +#: cps/web.py:2636 #, python-format msgid "Test E-Mail successfully send to %(kindlemail)s" msgstr "Test email met succes verstuurd naar %(kindlemail)s" -#: cps/web.py:2638 +#: cps/web.py:2639 #, python-format msgid "There was an error sending the Test E-Mail: %(res)s" msgstr "Er trad een fout op met het versturen van de test email: %(res)s" -#: cps/web.py:2642 +#: cps/web.py:2643 msgid "E-Mail settings updated" msgstr "Email instellingen aangepast" -#: cps/web.py:2643 +#: cps/web.py:2644 msgid "Edit mail settings" msgstr "Bewerk mail instellingen" -#: cps/web.py:2672 +#: cps/web.py:2673 #, python-format msgid "User '%(nick)s' deleted" msgstr "Gebruiker '%(nick)s' verwijderd" -#: cps/web.py:2780 +#: cps/web.py:2781 #, python-format msgid "User '%(nick)s' updated" msgstr "Gebruiker '%(nick)s' aangepast" -#: cps/web.py:2783 +#: cps/web.py:2784 msgid "An unknown error occured." msgstr "Een onbekende fout deed zich voor." -#: cps/web.py:2786 +#: cps/web.py:2787 #, python-format msgid "Edit User %(nick)s" msgstr "Bewerk gebruiker '%(nick)s'" -#: cps/web.py:2802 +#: cps/web.py:2803 msgid "Error opening eBook. File does not exist or file is not accessible" msgstr "Fout bij openen eBook. Het bestand bestaat niet of is niet toegankelijk" -#: cps/web.py:2817 cps/web.py:3018 cps/web.py:3161 +#: cps/web.py:2818 cps/web.py:3026 cps/web.py:3031 cps/web.py:3174 msgid "edit metadata" msgstr "Bewerk metadata" -#: cps/web.py:2827 cps/web.py:3055 +#: cps/web.py:2828 cps/web.py:3068 #, python-format msgid "File extension \"%s\" is not allowed to be uploaded to this server" msgstr "Het uploaden van bestandsextensie \"%s\" is niet toegestaan op deze server" -#: cps/web.py:2838 +#: cps/web.py:2839 #, python-format msgid "Failed to store file %s." msgstr "Bestand opslaan niet gelukt voor %s." -#: cps/web.py:2858 cps/web.py:2862 +#: cps/web.py:2861 cps/web.py:2865 msgid "unknown" msgstr "onbekend" -#: cps/web.py:3061 +#: cps/web.py:3074 msgid "File to be uploaded must have an extension" msgstr "Up te loaden bestanden dienen een extensie te hebben" -#: cps/web.py:3080 +#: cps/web.py:3093 #, python-format msgid "Failed to create path %s (Permission denied)." msgstr "Het pad %s aanmaken mislukt (Geen toestemming)." -#: cps/web.py:3085 +#: cps/web.py:3098 #, python-format msgid "Failed to store file %s (Permission denied)." msgstr "Bestand %s opslaan mislukt (Geen toestemming)." -#: cps/web.py:3090 +#: cps/web.py:3103 #, python-format msgid "Failed to delete file %s (Permission denied)." msgstr "Bestand %s wissen mislukt (Geen toestemming)." @@ -657,7 +667,7 @@ msgstr "Omschrijving" msgid "Tags" msgstr "Tags" -#: cps/templates/book_edit.html:39 cps/templates/layout.html:141 +#: cps/templates/book_edit.html:39 cps/templates/layout.html:143 #: cps/templates/search_form.html:37 msgid "Series" msgstr "Series" @@ -744,7 +754,7 @@ msgstr "Klik op de omslag om de metatadata in het formulier te laden" msgid "Loading..." msgstr "Aan het laden..." -#: cps/templates/book_edit.html:196 cps/templates/layout.html:205 +#: cps/templates/book_edit.html:196 cps/templates/layout.html:207 msgid "Close" msgstr "Sluit" @@ -953,7 +963,7 @@ msgstr "Bewaar instelling" msgid "Save settings and send Test E-Mail" msgstr "Bewaar instellingen en stuur test email" -#: cps/templates/feed.xml:20 cps/templates/layout.html:189 +#: cps/templates/feed.xml:20 cps/templates/layout.html:191 msgid "Next" msgstr "Volgende" @@ -998,7 +1008,7 @@ msgstr "Recentste boeken" msgid "Show Random Books" msgstr "Toon Willekeurige Boeken" -#: cps/templates/index.xml:52 cps/templates/layout.html:144 +#: cps/templates/index.xml:52 cps/templates/layout.html:146 msgid "Authors" msgstr "Auteurs" @@ -1063,39 +1073,39 @@ msgstr "Oplopend" msgid "Descending" msgstr "Aflopend" -#: cps/templates/layout.html:135 +#: cps/templates/layout.html:137 msgid "Discover" msgstr "Ontdek" -#: cps/templates/layout.html:138 +#: cps/templates/layout.html:140 msgid "Categories" msgstr "Categorieën" -#: cps/templates/layout.html:147 cps/templates/search_form.html:58 +#: cps/templates/layout.html:149 cps/templates/search_form.html:58 msgid "Languages" msgstr "Talen" -#: cps/templates/layout.html:150 +#: cps/templates/layout.html:152 msgid "Public Shelves" msgstr "Publieke Boekenplanken" -#: cps/templates/layout.html:154 +#: cps/templates/layout.html:156 msgid "Your Shelves" msgstr "Jou Boekenplanken" -#: cps/templates/layout.html:159 +#: cps/templates/layout.html:161 msgid "Create a Shelf" msgstr "Maak een boekenplank" -#: cps/templates/layout.html:160 cps/templates/stats.html:3 +#: cps/templates/layout.html:162 cps/templates/stats.html:3 msgid "About" msgstr "Over" -#: cps/templates/layout.html:174 +#: cps/templates/layout.html:176 msgid "Previous" msgstr "Vorige" -#: cps/templates/layout.html:201 +#: cps/templates/layout.html:203 msgid "Book Details" msgstr "Boek Details" diff --git a/cps/translations/pl/LC_MESSAGES/messages.po b/cps/translations/pl/LC_MESSAGES/messages.po index 4e00030b..6adf346c 100644 --- a/cps/translations/pl/LC_MESSAGES/messages.po +++ b/cps/translations/pl/LC_MESSAGES/messages.po @@ -12,7 +12,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre Web - polski (POT: 2017-04-11 22:51)\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2017-11-12 14:54+0100\n" +"POT-Creation-Date: 2017-11-30 16:45+0100\n" "PO-Revision-Date: 2017-04-11 22:51+0200\n" "Last-Translator: Radosław Kierznowski \n" "Language: pl\n" @@ -24,182 +24,192 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 2.5.1\n" -#: cps/book_formats.py:118 cps/book_formats.py:122 cps/web.py:1398 +#: cps/book_formats.py:119 cps/book_formats.py:123 cps/web.py:1401 msgid "not installed" msgstr "nie zainstalowane" -#: cps/helper.py:77 +#: cps/helper.py:78 #, python-format msgid "kindlegen binary %(kindlepath)s not found" msgstr "" -#: cps/helper.py:83 +#: cps/helper.py:84 #, python-format msgid "epub format not found for book id: %(book)d" msgstr "" -#: cps/helper.py:93 +#: cps/helper.py:94 msgid "kindlegen failed, no execution permissions" msgstr "" -#: cps/helper.py:108 +#: cps/helper.py:109 #, python-format msgid "Kindlegen failed with Error %(error)s. Message: %(message)s" msgstr "" -#: cps/helper.py:187 +#: cps/helper.py:188 #, python-format msgid "Failed to send mail: %s" msgstr "Nie można wysłać poczty: %s" -#: cps/helper.py:194 +#: cps/helper.py:195 msgid "Calibre-web test email" msgstr "Calibre-web testowy email" -#: cps/helper.py:195 cps/helper.py:207 +#: cps/helper.py:196 cps/helper.py:208 msgid "This email has been sent via calibre web." msgstr "Ten e-mail został wysłany przez Calibre Web." -#: cps/helper.py:204 cps/templates/detail.html:43 +#: cps/helper.py:205 cps/templates/detail.html:43 msgid "Send to Kindle" msgstr "Wyślij do Kindle" -#: cps/helper.py:224 cps/helper.py:238 +#: cps/helper.py:225 cps/helper.py:239 msgid "Could not find any formats suitable for sending by email" msgstr "" "Nie można znaleźć żadnych formatów przystosowane do wysyłania pocztą " "e-mail" +#: cps/helper.py:338 +#, python-format +msgid "Rename title from: \"%s\" to \"%s\" failed with error: %s" +msgstr "" + +#: cps/helper.py:347 +#, python-format +msgid "Rename author from: \"%s\" to \"%s\" failed with error: %s" +msgstr "" + #: cps/ub.py:577 msgid "Guest" msgstr "Gość" -#: cps/web.py:964 +#: cps/web.py:967 msgid "Requesting update package" msgstr "Żądanie o pakiet aktualizacji" -#: cps/web.py:965 +#: cps/web.py:968 msgid "Downloading update package" msgstr "Pobieranie pakietu aktualizacji" -#: cps/web.py:966 +#: cps/web.py:969 msgid "Unzipping update package" msgstr "Rozpakowywanie pakietu aktualizacji" -#: cps/web.py:967 +#: cps/web.py:970 msgid "Files are replaced" msgstr "Pliki zostały zastąpione" -#: cps/web.py:968 +#: cps/web.py:971 msgid "Database connections are closed" msgstr "Połączenia z bazą danych zostały zakończone" -#: cps/web.py:969 +#: cps/web.py:972 msgid "Server is stopped" msgstr "Serwer jest zatrzymany" -#: cps/web.py:970 +#: cps/web.py:973 msgid "Update finished, please press okay and reload page" msgstr "Aktualizacja zakończona, proszę nacisnąć OK i odświeżyć stronę" -#: cps/web.py:1044 +#: cps/web.py:1047 msgid "Recently Added Books" msgstr "" -#: cps/web.py:1054 +#: cps/web.py:1057 msgid "Newest Books" msgstr "" -#: cps/web.py:1065 +#: cps/web.py:1069 msgid "Oldest Books" msgstr "" -#: cps/web.py:1077 +#: cps/web.py:1081 msgid "Books (A-Z)" msgstr "" -#: cps/web.py:1088 +#: cps/web.py:1092 msgid "Books (Z-A)" msgstr "" -#: cps/web.py:1116 +#: cps/web.py:1120 msgid "Hot Books (most downloaded)" msgstr "Najpopularniejsze książki (najczęściej pobierane)" -#: cps/web.py:1129 +#: cps/web.py:1133 msgid "Best rated books" msgstr "Najlepiej oceniane książki" -#: cps/templates/index.xml:32 cps/web.py:1140 +#: cps/templates/index.xml:32 cps/web.py:1144 msgid "Random Books" msgstr "Losowe książki" -#: cps/web.py:1154 +#: cps/web.py:1158 msgid "Author list" msgstr "Lista autorów" -#: cps/web.py:1166 cps/web.py:1225 cps/web.py:1355 cps/web.py:1827 +#: cps/web.py:1170 cps/web.py:1228 cps/web.py:1358 cps/web.py:1827 msgid "Error opening eBook. File does not exist or file is not accessible:" msgstr "Błąd otwierania e-booka. Plik nie istnieje lub plik nie jest dostępny:" -#: cps/templates/index.xml:64 cps/web.py:1209 +#: cps/templates/index.xml:64 cps/web.py:1212 msgid "Series list" msgstr "Lista serii" -#: cps/web.py:1223 +#: cps/web.py:1226 #, python-format msgid "Series: %(serie)s" msgstr "Seria: %(serie)s" -#: cps/web.py:1256 +#: cps/web.py:1259 msgid "Available languages" msgstr "Dostępne języki" -#: cps/web.py:1273 +#: cps/web.py:1276 #, python-format msgid "Language: %(name)s" msgstr "Język: %(name)s" -#: cps/templates/index.xml:58 cps/web.py:1283 +#: cps/templates/index.xml:58 cps/web.py:1286 msgid "Category list" msgstr "Lista kategorii" -#: cps/web.py:1297 +#: cps/web.py:1300 #, python-format msgid "Category: %(name)s" msgstr "Kategoria: %(name)s" -#: cps/web.py:1409 +#: cps/web.py:1412 msgid "Excecution permissions missing" msgstr "" -#: cps/web.py:1423 +#: cps/web.py:1426 msgid "Statistics" msgstr "Statystyki" -#: cps/web.py:1587 +#: cps/web.py:1591 msgid "Server restarted, please reload page" msgstr "Serwer uruchomiony ponownie, proszę odświeżyć stronę" -#: cps/web.py:1589 +#: cps/web.py:1593 msgid "Performing shutdown of server, please close window" msgstr "Wykonano wyłączenie serwera, proszę zamknąć okno" -#: cps/web.py:1605 +#: cps/web.py:1609 msgid "Update done" msgstr "Aktualizacja zakończona" -#: cps/web.py:1687 cps/web.py:1700 +#: cps/web.py:1691 cps/web.py:1704 msgid "search" msgstr "szukaj" #: cps/templates/index.xml:39 cps/templates/index.xml:42 -#: cps/templates/layout.html:131 cps/web.py:1782 +#: cps/templates/layout.html:132 cps/web.py:1782 msgid "Read Books" msgstr "Przeczytane książki" -#: cps/templates/index.xml:45 cps/templates/index.xml:48 -#: cps/templates/layout.html:132 cps/web.py:1785 +#: cps/templates/index.xml:46 cps/templates/index.xml:49 +#: cps/templates/layout.html:134 cps/web.py:1785 msgid "Unread Books" msgstr "Nieprzeczytane książki" @@ -207,7 +217,7 @@ msgstr "Nieprzeczytane książki" msgid "Read a Book" msgstr "Czytaj książkę" -#: cps/web.py:1925 cps/web.py:2555 +#: cps/web.py:1925 cps/web.py:2556 msgid "Please fill out all fields!" msgstr "Proszę wypełnić wszystkie pola!" @@ -262,7 +272,7 @@ msgstr "Książka została pomyślnie wysłana do %(kindlemail)s" msgid "There was an error sending this book: %(res)s" msgstr "Wystąpił błąd podczas wysyłania tej książki: %(res)s" -#: cps/web.py:2085 cps/web.py:2640 +#: cps/web.py:2085 cps/web.py:2641 msgid "Please configure your kindle email address first..." msgstr "Proszę najpierw skonfigurować adres e-mail swojego kindla..." @@ -271,177 +281,177 @@ msgstr "Proszę najpierw skonfigurować adres e-mail swojego kindla..." msgid "Book has been added to shelf: %(sname)s" msgstr "Książka została dodana do półki: %(sname)s" -#: cps/web.py:2164 +#: cps/web.py:2166 #, python-format msgid "Book has been removed from shelf: %(sname)s" msgstr "Książka została usunięta z półki: %(sname)s" -#: cps/web.py:2183 cps/web.py:2207 +#: cps/web.py:2185 cps/web.py:2209 #, python-format msgid "A shelf with the name '%(title)s' already exists." msgstr "Półka o nazwie '%(title)s' już istnieje." -#: cps/web.py:2188 +#: cps/web.py:2190 #, python-format msgid "Shelf %(title)s created" msgstr "Półka %(title)s została utworzona" -#: cps/web.py:2190 cps/web.py:2218 +#: cps/web.py:2192 cps/web.py:2220 msgid "There was an error" msgstr "Wystąpił błąd" -#: cps/web.py:2191 cps/web.py:2193 +#: cps/web.py:2193 cps/web.py:2195 msgid "create a shelf" msgstr "utwórz półkę" -#: cps/web.py:2216 +#: cps/web.py:2218 #, python-format msgid "Shelf %(title)s changed" msgstr "Półka %(title)s została zmieniona" -#: cps/web.py:2219 cps/web.py:2221 +#: cps/web.py:2221 cps/web.py:2223 msgid "Edit a shelf" msgstr "Edytuj półkę" -#: cps/web.py:2242 +#: cps/web.py:2244 #, python-format msgid "successfully deleted shelf %(name)s" msgstr "pomyślnie usunięto półkę %(name)s" -#: cps/web.py:2264 +#: cps/web.py:2266 #, python-format msgid "Shelf: '%(name)s'" msgstr "Półka: '%(name)s'" -#: cps/web.py:2267 +#: cps/web.py:2269 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "" -#: cps/web.py:2299 +#: cps/web.py:2300 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "Zmieniono kolejność półki: '%(name)s'" -#: cps/web.py:2368 +#: cps/web.py:2369 msgid "Found an existing account for this email address." msgstr "Znaleziono istniejące konto dla tego adresu e-mail." -#: cps/web.py:2370 cps/web.py:2374 +#: cps/web.py:2371 cps/web.py:2375 #, python-format msgid "%(name)s's profile" msgstr "Profil użytkownika %(name)s" -#: cps/web.py:2371 +#: cps/web.py:2372 msgid "Profile updated" msgstr "Zaktualizowano profil" -#: cps/web.py:2385 +#: cps/web.py:2386 msgid "Admin page" msgstr "Portal administracyjny" -#: cps/web.py:2509 +#: cps/web.py:2510 msgid "Calibre-web configuration updated" msgstr "Konfiguracja Calibre-web została zaktualizowana" -#: cps/web.py:2516 cps/web.py:2522 cps/web.py:2536 +#: cps/web.py:2517 cps/web.py:2523 cps/web.py:2537 msgid "Basic Configuration" msgstr "Podstawowa konfiguracja" -#: cps/web.py:2520 +#: cps/web.py:2521 msgid "DB location is not valid, please enter correct path" msgstr "Lokalizacja bazy danych jest nieprawidłowa, wpisz poprawną ścieżkę" -#: cps/templates/admin.html:34 cps/web.py:2557 cps/web.py:2610 +#: cps/templates/admin.html:34 cps/web.py:2558 cps/web.py:2611 msgid "Add new user" msgstr "Dodaj nowego użytkownika" -#: cps/web.py:2602 +#: cps/web.py:2603 #, python-format msgid "User '%(user)s' created" msgstr "Użytkownik '%(user)s' został utworzony" -#: cps/web.py:2606 +#: cps/web.py:2607 msgid "Found an existing account for this email address or nickname." msgstr "Znaleziono istniejące konto dla tego adresu e-mail lub nazwy użytkownika." -#: cps/web.py:2628 +#: cps/web.py:2629 msgid "Mail settings updated" msgstr "Zaktualizowano ustawienia poczty e-mail" -#: cps/web.py:2635 +#: cps/web.py:2636 #, python-format msgid "Test E-Mail successfully send to %(kindlemail)s" msgstr "Testowy e-mail został pomyślnie wysłany do %(kindlemail)s" -#: cps/web.py:2638 +#: cps/web.py:2639 #, python-format msgid "There was an error sending the Test E-Mail: %(res)s" msgstr "Wystąpił błąd podczas wysyłania testowej wiadomości e-mail: %(res)s" -#: cps/web.py:2642 +#: cps/web.py:2643 msgid "E-Mail settings updated" msgstr "Zaktualizowano ustawienia e-mail" -#: cps/web.py:2643 +#: cps/web.py:2644 msgid "Edit mail settings" msgstr "Edytuj ustawienia poczty e-mail" -#: cps/web.py:2672 +#: cps/web.py:2673 #, python-format msgid "User '%(nick)s' deleted" msgstr "Użytkownik '%(nick)s' został usunięty" -#: cps/web.py:2780 +#: cps/web.py:2781 #, python-format msgid "User '%(nick)s' updated" msgstr "Użytkownik '%(nick)s' został zaktualizowany" -#: cps/web.py:2783 +#: cps/web.py:2784 msgid "An unknown error occured." msgstr "Wystąpił nieznany błąd." -#: cps/web.py:2786 +#: cps/web.py:2787 #, python-format msgid "Edit User %(nick)s" msgstr "Edytuj użytkownika %(nick)s" -#: cps/web.py:2802 +#: cps/web.py:2803 msgid "Error opening eBook. File does not exist or file is not accessible" msgstr "" -#: cps/web.py:2817 cps/web.py:3018 cps/web.py:3161 +#: cps/web.py:2818 cps/web.py:3026 cps/web.py:3031 cps/web.py:3174 msgid "edit metadata" msgstr "edytuj metadane" -#: cps/web.py:2827 cps/web.py:3055 +#: cps/web.py:2828 cps/web.py:3068 #, python-format msgid "File extension \"%s\" is not allowed to be uploaded to this server" msgstr "Rozszerzenie pliku \"%s\" nie jest dozwolone do przesłania na ten serwer" -#: cps/web.py:2838 +#: cps/web.py:2839 #, python-format msgid "Failed to store file %s." msgstr "" -#: cps/web.py:2858 cps/web.py:2862 +#: cps/web.py:2861 cps/web.py:2865 msgid "unknown" msgstr "" -#: cps/web.py:3061 +#: cps/web.py:3074 msgid "File to be uploaded must have an extension" msgstr "Plik do przesłania musi mieć rozszerzenie" -#: cps/web.py:3080 +#: cps/web.py:3093 #, python-format msgid "Failed to create path %s (Permission denied)." msgstr "Nie udało się utworzyć łącza %s (Odmowa dostępu)." -#: cps/web.py:3085 +#: cps/web.py:3098 #, python-format msgid "Failed to store file %s (Permission denied)." msgstr "Nie można przechowywać pliku %s (Odmowa dostępu)." -#: cps/web.py:3090 +#: cps/web.py:3103 #, python-format msgid "Failed to delete file %s (Permission denied)." msgstr "Nie udało się usunąć pliku %s (Odmowa dostępu)." @@ -646,7 +656,7 @@ msgstr "Opis" msgid "Tags" msgstr "Tagi" -#: cps/templates/book_edit.html:39 cps/templates/layout.html:141 +#: cps/templates/book_edit.html:39 cps/templates/layout.html:143 #: cps/templates/search_form.html:37 msgid "Series" msgstr "Seria" @@ -733,7 +743,7 @@ msgstr "Kliknij okładkę, aby załadować metadane do formularza" msgid "Loading..." msgstr "Ładowanie..." -#: cps/templates/book_edit.html:196 cps/templates/layout.html:205 +#: cps/templates/book_edit.html:196 cps/templates/layout.html:207 msgid "Close" msgstr "Zamknij" @@ -943,7 +953,7 @@ msgstr "Zapisz ustawienia" msgid "Save settings and send Test E-Mail" msgstr "Zapisz ustawienia i wyślij testową wiadomość e-mail" -#: cps/templates/feed.xml:20 cps/templates/layout.html:189 +#: cps/templates/feed.xml:20 cps/templates/layout.html:191 msgid "Next" msgstr "Następne" @@ -988,7 +998,7 @@ msgstr "Ostatnie książki" msgid "Show Random Books" msgstr "Pokazuj losowe książki" -#: cps/templates/index.xml:52 cps/templates/layout.html:144 +#: cps/templates/index.xml:52 cps/templates/layout.html:146 msgid "Authors" msgstr "Autorzy" @@ -1053,39 +1063,39 @@ msgstr "" msgid "Descending" msgstr "" -#: cps/templates/layout.html:135 +#: cps/templates/layout.html:137 msgid "Discover" msgstr "Odkrywaj" -#: cps/templates/layout.html:138 +#: cps/templates/layout.html:140 msgid "Categories" msgstr "Kategorie" -#: cps/templates/layout.html:147 cps/templates/search_form.html:58 +#: cps/templates/layout.html:149 cps/templates/search_form.html:58 msgid "Languages" msgstr "Języki" -#: cps/templates/layout.html:150 +#: cps/templates/layout.html:152 msgid "Public Shelves" msgstr "Publiczne półki" -#: cps/templates/layout.html:154 +#: cps/templates/layout.html:156 msgid "Your Shelves" msgstr "Twoje półki" -#: cps/templates/layout.html:159 +#: cps/templates/layout.html:161 msgid "Create a Shelf" msgstr "Utwórz półkę" -#: cps/templates/layout.html:160 cps/templates/stats.html:3 +#: cps/templates/layout.html:162 cps/templates/stats.html:3 msgid "About" msgstr "O programie" -#: cps/templates/layout.html:174 +#: cps/templates/layout.html:176 msgid "Previous" msgstr "" -#: cps/templates/layout.html:201 +#: cps/templates/layout.html:203 msgid "Book Details" msgstr "" diff --git a/cps/translations/ru/LC_MESSAGES/messages.po b/cps/translations/ru/LC_MESSAGES/messages.po index be51eb93..cb6d86b8 100644 --- a/cps/translations/ru/LC_MESSAGES/messages.po +++ b/cps/translations/ru/LC_MESSAGES/messages.po @@ -14,7 +14,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/calibre-web\n" -"POT-Creation-Date: 2017-11-12 14:54+0100\n" +"POT-Creation-Date: 2017-11-30 16:45+0100\n" "PO-Revision-Date: 2017-04-30 00:47+0300\n" "Last-Translator: Pavel Korovin \n" "Language: ru\n" @@ -26,180 +26,190 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 2.5.1\n" -#: cps/book_formats.py:118 cps/book_formats.py:122 cps/web.py:1398 +#: cps/book_formats.py:119 cps/book_formats.py:123 cps/web.py:1401 msgid "not installed" msgstr "Отсутствует" -#: cps/helper.py:77 +#: cps/helper.py:78 #, python-format msgid "kindlegen binary %(kindlepath)s not found" msgstr "" -#: cps/helper.py:83 +#: cps/helper.py:84 #, python-format msgid "epub format not found for book id: %(book)d" msgstr "" -#: cps/helper.py:93 +#: cps/helper.py:94 msgid "kindlegen failed, no execution permissions" msgstr "" -#: cps/helper.py:108 +#: cps/helper.py:109 #, python-format msgid "Kindlegen failed with Error %(error)s. Message: %(message)s" msgstr "" -#: cps/helper.py:187 +#: cps/helper.py:188 #, python-format msgid "Failed to send mail: %s" msgstr "Ошибка отправки письма: %s" -#: cps/helper.py:194 +#: cps/helper.py:195 msgid "Calibre-web test email" msgstr "Тестовое письмо от Calibre-web" -#: cps/helper.py:195 cps/helper.py:207 +#: cps/helper.py:196 cps/helper.py:208 msgid "This email has been sent via calibre web." msgstr "Письмо было отправлено через calibre web" -#: cps/helper.py:204 cps/templates/detail.html:43 +#: cps/helper.py:205 cps/templates/detail.html:43 msgid "Send to Kindle" msgstr "Отправить на Kindle" -#: cps/helper.py:224 cps/helper.py:238 +#: cps/helper.py:225 cps/helper.py:239 msgid "Could not find any formats suitable for sending by email" msgstr "Невозоможно найти формат, подходящий для отправки по email" +#: cps/helper.py:338 +#, python-format +msgid "Rename title from: \"%s\" to \"%s\" failed with error: %s" +msgstr "" + +#: cps/helper.py:347 +#, python-format +msgid "Rename author from: \"%s\" to \"%s\" failed with error: %s" +msgstr "" + #: cps/ub.py:577 msgid "Guest" msgstr "Гость" -#: cps/web.py:964 +#: cps/web.py:967 msgid "Requesting update package" msgstr "Проверка обновлений" -#: cps/web.py:965 +#: cps/web.py:968 msgid "Downloading update package" msgstr "Загрузка обновлений" -#: cps/web.py:966 +#: cps/web.py:969 msgid "Unzipping update package" msgstr "Распаковка обновлений" -#: cps/web.py:967 +#: cps/web.py:970 msgid "Files are replaced" msgstr "Файлы заменены" -#: cps/web.py:968 +#: cps/web.py:971 msgid "Database connections are closed" msgstr "Соеднинения с базой данных закрыты" -#: cps/web.py:969 +#: cps/web.py:972 msgid "Server is stopped" msgstr "Сервер остановлен" -#: cps/web.py:970 +#: cps/web.py:973 msgid "Update finished, please press okay and reload page" msgstr "Обновления установлены, нажмите okay и перезагрузите страницу" -#: cps/web.py:1044 +#: cps/web.py:1047 msgid "Recently Added Books" msgstr "" -#: cps/web.py:1054 +#: cps/web.py:1057 msgid "Newest Books" msgstr "" -#: cps/web.py:1065 +#: cps/web.py:1069 msgid "Oldest Books" msgstr "" -#: cps/web.py:1077 +#: cps/web.py:1081 msgid "Books (A-Z)" msgstr "" -#: cps/web.py:1088 +#: cps/web.py:1092 msgid "Books (Z-A)" msgstr "" -#: cps/web.py:1116 +#: cps/web.py:1120 msgid "Hot Books (most downloaded)" msgstr "Популярные книги (часто загружаемые)" -#: cps/web.py:1129 +#: cps/web.py:1133 msgid "Best rated books" msgstr "Книги с наивысшим рейтингом" -#: cps/templates/index.xml:32 cps/web.py:1140 +#: cps/templates/index.xml:32 cps/web.py:1144 msgid "Random Books" msgstr "Случайный выбор" -#: cps/web.py:1154 +#: cps/web.py:1158 msgid "Author list" msgstr "Авторы" -#: cps/web.py:1166 cps/web.py:1225 cps/web.py:1355 cps/web.py:1827 +#: cps/web.py:1170 cps/web.py:1228 cps/web.py:1358 cps/web.py:1827 msgid "Error opening eBook. File does not exist or file is not accessible:" msgstr "Невозможно открыть книгу. Файл не существует или недоступен." -#: cps/templates/index.xml:64 cps/web.py:1209 +#: cps/templates/index.xml:64 cps/web.py:1212 msgid "Series list" msgstr "Серии" -#: cps/web.py:1223 +#: cps/web.py:1226 #, python-format msgid "Series: %(serie)s" msgstr "Серии: %(serie)s" -#: cps/web.py:1256 +#: cps/web.py:1259 msgid "Available languages" msgstr "Языки" -#: cps/web.py:1273 +#: cps/web.py:1276 #, python-format msgid "Language: %(name)s" msgstr "Язык: %(name)s" -#: cps/templates/index.xml:58 cps/web.py:1283 +#: cps/templates/index.xml:58 cps/web.py:1286 msgid "Category list" msgstr "Категории" -#: cps/web.py:1297 +#: cps/web.py:1300 #, python-format msgid "Category: %(name)s" msgstr "Категория: %(name)s" -#: cps/web.py:1409 +#: cps/web.py:1412 msgid "Excecution permissions missing" msgstr "" -#: cps/web.py:1423 +#: cps/web.py:1426 msgid "Statistics" msgstr "Статистика" -#: cps/web.py:1587 +#: cps/web.py:1591 msgid "Server restarted, please reload page" msgstr "Сервер перезагружен, пожалуйста, перезагрузите страницу" -#: cps/web.py:1589 +#: cps/web.py:1593 msgid "Performing shutdown of server, please close window" msgstr "Производится остановка сервера, пожалуйста, закройте окно" -#: cps/web.py:1605 +#: cps/web.py:1609 msgid "Update done" msgstr "Обновление закончено" -#: cps/web.py:1687 cps/web.py:1700 +#: cps/web.py:1691 cps/web.py:1704 msgid "search" msgstr "поиск" #: cps/templates/index.xml:39 cps/templates/index.xml:42 -#: cps/templates/layout.html:131 cps/web.py:1782 +#: cps/templates/layout.html:132 cps/web.py:1782 msgid "Read Books" msgstr "Прочитанные" -#: cps/templates/index.xml:45 cps/templates/index.xml:48 -#: cps/templates/layout.html:132 cps/web.py:1785 +#: cps/templates/index.xml:46 cps/templates/index.xml:49 +#: cps/templates/layout.html:134 cps/web.py:1785 msgid "Unread Books" msgstr "Непрочитанные" @@ -207,7 +217,7 @@ msgstr "Непрочитанные" msgid "Read a Book" msgstr "Читать книгу" -#: cps/web.py:1925 cps/web.py:2555 +#: cps/web.py:1925 cps/web.py:2556 msgid "Please fill out all fields!" msgstr "Пожалуйста, заполните все поля!" @@ -262,7 +272,7 @@ msgstr "Книга успешно отправлена на %(kindlemail)s" msgid "There was an error sending this book: %(res)s" msgstr "Ошибка при отправке книги: %(res)s" -#: cps/web.py:2085 cps/web.py:2640 +#: cps/web.py:2085 cps/web.py:2641 msgid "Please configure your kindle email address first..." msgstr "Пожалуйста, сначала укажите ваш kindle email..." @@ -271,177 +281,177 @@ msgstr "Пожалуйста, сначала укажите ваш kindle email. msgid "Book has been added to shelf: %(sname)s" msgstr "Книга добавлена на книжную полку: %(sname)s" -#: cps/web.py:2164 +#: cps/web.py:2166 #, python-format msgid "Book has been removed from shelf: %(sname)s" msgstr "Книга удалена с книжной полки: %(sname)s" -#: cps/web.py:2183 cps/web.py:2207 +#: cps/web.py:2185 cps/web.py:2209 #, python-format msgid "A shelf with the name '%(title)s' already exists." msgstr "Книжкная полка с названием '%(title)s' уже существует." -#: cps/web.py:2188 +#: cps/web.py:2190 #, python-format msgid "Shelf %(title)s created" msgstr "Создана книжная полка %(title)s" -#: cps/web.py:2190 cps/web.py:2218 +#: cps/web.py:2192 cps/web.py:2220 msgid "There was an error" msgstr "Произошла ошибка" -#: cps/web.py:2191 cps/web.py:2193 +#: cps/web.py:2193 cps/web.py:2195 msgid "create a shelf" msgstr "создать книжную полку" -#: cps/web.py:2216 +#: cps/web.py:2218 #, python-format msgid "Shelf %(title)s changed" msgstr "Книжная полка %(title)s изменена" -#: cps/web.py:2219 cps/web.py:2221 +#: cps/web.py:2221 cps/web.py:2223 msgid "Edit a shelf" msgstr "Изменить книжную полку" -#: cps/web.py:2242 +#: cps/web.py:2244 #, python-format msgid "successfully deleted shelf %(name)s" msgstr "Книжная полка %(name)s удалена" -#: cps/web.py:2264 +#: cps/web.py:2266 #, python-format msgid "Shelf: '%(name)s'" msgstr "Книжная полка: '%(name)s'" -#: cps/web.py:2267 +#: cps/web.py:2269 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "" -#: cps/web.py:2299 +#: cps/web.py:2300 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "Изменить расположение книжной полки '%(name)s'" -#: cps/web.py:2368 +#: cps/web.py:2369 msgid "Found an existing account for this email address." msgstr "Найдена учётная запись для для данного адреса email." -#: cps/web.py:2370 cps/web.py:2374 +#: cps/web.py:2371 cps/web.py:2375 #, python-format msgid "%(name)s's profile" msgstr "Профиль %(name)s" -#: cps/web.py:2371 +#: cps/web.py:2372 msgid "Profile updated" msgstr "Профиль обновлён" -#: cps/web.py:2385 +#: cps/web.py:2386 msgid "Admin page" msgstr "Администрирование" -#: cps/web.py:2509 +#: cps/web.py:2510 msgid "Calibre-web configuration updated" msgstr "Конфигурация Calibre-web обновлена" -#: cps/web.py:2516 cps/web.py:2522 cps/web.py:2536 +#: cps/web.py:2517 cps/web.py:2523 cps/web.py:2537 msgid "Basic Configuration" msgstr "Настройки сервера" -#: cps/web.py:2520 +#: cps/web.py:2521 msgid "DB location is not valid, please enter correct path" msgstr "Неверный путь к фалу БД, пожалуйста, укажите правильное расположение БД" -#: cps/templates/admin.html:34 cps/web.py:2557 cps/web.py:2610 +#: cps/templates/admin.html:34 cps/web.py:2558 cps/web.py:2611 msgid "Add new user" msgstr "Добавить пользователя" -#: cps/web.py:2602 +#: cps/web.py:2603 #, python-format msgid "User '%(user)s' created" msgstr "Пользователь '%(user)s' добавлен" -#: cps/web.py:2606 +#: cps/web.py:2607 msgid "Found an existing account for this email address or nickname." msgstr "Для указанного адреса или имени найдена существующая учётная запись." -#: cps/web.py:2628 +#: cps/web.py:2629 msgid "Mail settings updated" msgstr "Настройки почты изменены" -#: cps/web.py:2635 +#: cps/web.py:2636 #, python-format msgid "Test E-Mail successfully send to %(kindlemail)s" msgstr "Тестовое сообщение успешно отправлено на адрес %(kindlemail)s" -#: cps/web.py:2638 +#: cps/web.py:2639 #, python-format msgid "There was an error sending the Test E-Mail: %(res)s" msgstr "Ошибка отправки тестового сообщения: %(res)s" -#: cps/web.py:2642 +#: cps/web.py:2643 msgid "E-Mail settings updated" msgstr "Обновлены настройки e-mail" -#: cps/web.py:2643 +#: cps/web.py:2644 msgid "Edit mail settings" msgstr "Изменить почтовые настройки" -#: cps/web.py:2672 +#: cps/web.py:2673 #, python-format msgid "User '%(nick)s' deleted" msgstr "Пользователь '%(nick)s' удалён" -#: cps/web.py:2780 +#: cps/web.py:2781 #, python-format msgid "User '%(nick)s' updated" msgstr "Пользователь '%(nick)s' обновлён" -#: cps/web.py:2783 +#: cps/web.py:2784 msgid "An unknown error occured." msgstr "Произошла неизвестная ошибка." -#: cps/web.py:2786 +#: cps/web.py:2787 #, python-format msgid "Edit User %(nick)s" msgstr "Изменить пользователя %(nick)s" -#: cps/web.py:2802 +#: cps/web.py:2803 msgid "Error opening eBook. File does not exist or file is not accessible" msgstr "" -#: cps/web.py:2817 cps/web.py:3018 cps/web.py:3161 +#: cps/web.py:2818 cps/web.py:3026 cps/web.py:3031 cps/web.py:3174 msgid "edit metadata" msgstr "изменить метаданные" -#: cps/web.py:2827 cps/web.py:3055 +#: cps/web.py:2828 cps/web.py:3068 #, python-format msgid "File extension \"%s\" is not allowed to be uploaded to this server" msgstr "Запрещена загрузка файлов с расширением \"%s\"" -#: cps/web.py:2838 +#: cps/web.py:2839 #, python-format msgid "Failed to store file %s." msgstr "" -#: cps/web.py:2858 cps/web.py:2862 +#: cps/web.py:2861 cps/web.py:2865 msgid "unknown" msgstr "неизвестно" -#: cps/web.py:3061 +#: cps/web.py:3074 msgid "File to be uploaded must have an extension" msgstr "Загружаемый файл должен иметь расширение" -#: cps/web.py:3080 +#: cps/web.py:3093 #, python-format msgid "Failed to create path %s (Permission denied)." msgstr "Ошибка при создании пути %s (доступ запрещён)" -#: cps/web.py:3085 +#: cps/web.py:3098 #, python-format msgid "Failed to store file %s (Permission denied)." msgstr "Ошибка записи файоа %s (доступ запрещён)" -#: cps/web.py:3090 +#: cps/web.py:3103 #, python-format msgid "Failed to delete file %s (Permission denied)." msgstr "Ошибка удаления файла %s (доступ запрещён)" @@ -646,7 +656,7 @@ msgstr "Описание" msgid "Tags" msgstr "Теги" -#: cps/templates/book_edit.html:39 cps/templates/layout.html:141 +#: cps/templates/book_edit.html:39 cps/templates/layout.html:143 #: cps/templates/search_form.html:37 msgid "Series" msgstr "Серии" @@ -733,7 +743,7 @@ msgstr "Нажмите на обложку, чтобы получить мета msgid "Loading..." msgstr "Загрузка..." -#: cps/templates/book_edit.html:196 cps/templates/layout.html:205 +#: cps/templates/book_edit.html:196 cps/templates/layout.html:207 msgid "Close" msgstr "Закрыть" @@ -940,7 +950,7 @@ msgstr "Сохранить настройки" msgid "Save settings and send Test E-Mail" msgstr "Сохранить настройки и отправить тестовое письмо" -#: cps/templates/feed.xml:20 cps/templates/layout.html:189 +#: cps/templates/feed.xml:20 cps/templates/layout.html:191 msgid "Next" msgstr "Дальше" @@ -985,7 +995,7 @@ msgstr "Последние поступления" msgid "Show Random Books" msgstr "Показывать случайные книги" -#: cps/templates/index.xml:52 cps/templates/layout.html:144 +#: cps/templates/index.xml:52 cps/templates/layout.html:146 msgid "Authors" msgstr "Авторы" @@ -1050,39 +1060,39 @@ msgstr "" msgid "Descending" msgstr "" -#: cps/templates/layout.html:135 +#: cps/templates/layout.html:137 msgid "Discover" msgstr "Обзор" -#: cps/templates/layout.html:138 +#: cps/templates/layout.html:140 msgid "Categories" msgstr "Категории" -#: cps/templates/layout.html:147 cps/templates/search_form.html:58 +#: cps/templates/layout.html:149 cps/templates/search_form.html:58 msgid "Languages" msgstr "Языки" -#: cps/templates/layout.html:150 +#: cps/templates/layout.html:152 msgid "Public Shelves" msgstr "Общие книжные полки" -#: cps/templates/layout.html:154 +#: cps/templates/layout.html:156 msgid "Your Shelves" msgstr "Ваши книжные полки" -#: cps/templates/layout.html:159 +#: cps/templates/layout.html:161 msgid "Create a Shelf" msgstr "Создать книжную полку" -#: cps/templates/layout.html:160 cps/templates/stats.html:3 +#: cps/templates/layout.html:162 cps/templates/stats.html:3 msgid "About" msgstr "О программе" -#: cps/templates/layout.html:174 +#: cps/templates/layout.html:176 msgid "Previous" msgstr "" -#: cps/templates/layout.html:201 +#: cps/templates/layout.html:203 msgid "Book Details" msgstr "" diff --git a/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.po b/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.po index a5b1cded..190ef138 100644 --- a/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.po +++ b/cps/translations/zh_Hans_CN/LC_MESSAGES/messages.po @@ -15,7 +15,7 @@ msgid "" msgstr "" "Project-Id-Version: Calibre-web\n" "Report-Msgid-Bugs-To: https://github.com/janeczku/calibre-web\n" -"POT-Creation-Date: 2017-11-12 14:54+0100\n" +"POT-Creation-Date: 2017-11-30 16:45+0100\n" "PO-Revision-Date: 2017-01-06 17:00+0000\n" "Last-Translator: dalin \n" "Language: zh_Hans_CN\n" @@ -26,180 +26,190 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 2.5.1\n" -#: cps/book_formats.py:118 cps/book_formats.py:122 cps/web.py:1398 +#: cps/book_formats.py:119 cps/book_formats.py:123 cps/web.py:1401 msgid "not installed" msgstr "未安装" -#: cps/helper.py:77 +#: cps/helper.py:78 #, python-format msgid "kindlegen binary %(kindlepath)s not found" msgstr "找不到kindlegen二进制 %(kindlepath)s" -#: cps/helper.py:83 +#: cps/helper.py:84 #, python-format msgid "epub format not found for book id: %(book)d" msgstr "没有找到书籍ID %(book)d 的epub格式" -#: cps/helper.py:93 +#: cps/helper.py:94 msgid "kindlegen failed, no execution permissions" msgstr "kindlegen失败,没有可执行权限" -#: cps/helper.py:108 +#: cps/helper.py:109 #, python-format msgid "Kindlegen failed with Error %(error)s. Message: %(message)s" msgstr "Kindlegen 因为错误 %(error)s 失败。消息: %(message)s" -#: cps/helper.py:187 +#: cps/helper.py:188 #, python-format msgid "Failed to send mail: %s" msgstr "发送邮件失败: %s" -#: cps/helper.py:194 +#: cps/helper.py:195 msgid "Calibre-web test email" msgstr "Calibre-web 测试邮件" -#: cps/helper.py:195 cps/helper.py:207 +#: cps/helper.py:196 cps/helper.py:208 msgid "This email has been sent via calibre web." msgstr "此邮件由calibre web发送" -#: cps/helper.py:204 cps/templates/detail.html:43 +#: cps/helper.py:205 cps/templates/detail.html:43 msgid "Send to Kindle" msgstr "发送到Kindle" -#: cps/helper.py:224 cps/helper.py:238 +#: cps/helper.py:225 cps/helper.py:239 msgid "Could not find any formats suitable for sending by email" msgstr "无法找到适合邮件发送的格式" +#: cps/helper.py:338 +#, python-format +msgid "Rename title from: \"%s\" to \"%s\" failed with error: %s" +msgstr "" + +#: cps/helper.py:347 +#, python-format +msgid "Rename author from: \"%s\" to \"%s\" failed with error: %s" +msgstr "" + #: cps/ub.py:577 msgid "Guest" msgstr "游客" -#: cps/web.py:964 +#: cps/web.py:967 msgid "Requesting update package" msgstr "正在请求更新包" -#: cps/web.py:965 +#: cps/web.py:968 msgid "Downloading update package" msgstr "正在下载更新包" -#: cps/web.py:966 +#: cps/web.py:969 msgid "Unzipping update package" msgstr "正在解压更新包" -#: cps/web.py:967 +#: cps/web.py:970 msgid "Files are replaced" msgstr "文件已替换" -#: cps/web.py:968 +#: cps/web.py:971 msgid "Database connections are closed" msgstr "数据库连接已关闭" -#: cps/web.py:969 +#: cps/web.py:972 msgid "Server is stopped" msgstr "服务器已停止" -#: cps/web.py:970 +#: cps/web.py:973 msgid "Update finished, please press okay and reload page" msgstr "更新完成,请按确定并刷新页面" -#: cps/web.py:1044 +#: cps/web.py:1047 msgid "Recently Added Books" msgstr "最近添加的书籍" -#: cps/web.py:1054 +#: cps/web.py:1057 msgid "Newest Books" msgstr "最新书籍" -#: cps/web.py:1065 +#: cps/web.py:1069 msgid "Oldest Books" msgstr "最旧书籍" -#: cps/web.py:1077 +#: cps/web.py:1081 msgid "Books (A-Z)" msgstr "书籍 (A-Z)" -#: cps/web.py:1088 +#: cps/web.py:1092 msgid "Books (Z-A)" msgstr "书籍 (Z-A)" -#: cps/web.py:1116 +#: cps/web.py:1120 msgid "Hot Books (most downloaded)" msgstr "热门书籍(最多下载)" -#: cps/web.py:1129 +#: cps/web.py:1133 msgid "Best rated books" msgstr "最高评分书籍" -#: cps/templates/index.xml:32 cps/web.py:1140 +#: cps/templates/index.xml:32 cps/web.py:1144 msgid "Random Books" msgstr "随机书籍" -#: cps/web.py:1154 +#: cps/web.py:1158 msgid "Author list" msgstr "作者列表" -#: cps/web.py:1166 cps/web.py:1225 cps/web.py:1355 cps/web.py:1827 +#: cps/web.py:1170 cps/web.py:1228 cps/web.py:1358 cps/web.py:1827 msgid "Error opening eBook. File does not exist or file is not accessible:" msgstr "无法打开电子书。 文件不存在或者文件不可访问:" -#: cps/templates/index.xml:64 cps/web.py:1209 +#: cps/templates/index.xml:64 cps/web.py:1212 msgid "Series list" msgstr "丛书列表" -#: cps/web.py:1223 +#: cps/web.py:1226 #, python-format msgid "Series: %(serie)s" msgstr "丛书: %(serie)s" -#: cps/web.py:1256 +#: cps/web.py:1259 msgid "Available languages" msgstr "可用语言" -#: cps/web.py:1273 +#: cps/web.py:1276 #, python-format msgid "Language: %(name)s" msgstr "语言: %(name)s" -#: cps/templates/index.xml:58 cps/web.py:1283 +#: cps/templates/index.xml:58 cps/web.py:1286 msgid "Category list" msgstr "分类列表" -#: cps/web.py:1297 +#: cps/web.py:1300 #, python-format msgid "Category: %(name)s" msgstr "分类: %(name)s" -#: cps/web.py:1409 +#: cps/web.py:1412 msgid "Excecution permissions missing" msgstr "可执行权限缺失" -#: cps/web.py:1423 +#: cps/web.py:1426 msgid "Statistics" msgstr "统计" -#: cps/web.py:1587 +#: cps/web.py:1591 msgid "Server restarted, please reload page" msgstr "服务器已重启,请刷新页面" -#: cps/web.py:1589 +#: cps/web.py:1593 msgid "Performing shutdown of server, please close window" msgstr "正在关闭服务器,请关闭窗口" -#: cps/web.py:1605 +#: cps/web.py:1609 msgid "Update done" msgstr "更新完成" -#: cps/web.py:1687 cps/web.py:1700 +#: cps/web.py:1691 cps/web.py:1704 msgid "search" msgstr "搜索" #: cps/templates/index.xml:39 cps/templates/index.xml:42 -#: cps/templates/layout.html:131 cps/web.py:1782 +#: cps/templates/layout.html:132 cps/web.py:1782 msgid "Read Books" msgstr "已读书籍" -#: cps/templates/index.xml:45 cps/templates/index.xml:48 -#: cps/templates/layout.html:132 cps/web.py:1785 +#: cps/templates/index.xml:46 cps/templates/index.xml:49 +#: cps/templates/layout.html:134 cps/web.py:1785 msgid "Unread Books" msgstr "未读书籍" @@ -207,7 +217,7 @@ msgstr "未读书籍" msgid "Read a Book" msgstr "阅读一本书" -#: cps/web.py:1925 cps/web.py:2555 +#: cps/web.py:1925 cps/web.py:2556 msgid "Please fill out all fields!" msgstr "请填写所有字段" @@ -262,7 +272,7 @@ msgstr "此书已被成功发给 %(kindlemail)s" msgid "There was an error sending this book: %(res)s" msgstr "发送这本书的时候出现错误: %(res)s" -#: cps/web.py:2085 cps/web.py:2640 +#: cps/web.py:2085 cps/web.py:2641 msgid "Please configure your kindle email address first..." msgstr "请先配置您的kindle电子邮箱地址..." @@ -271,177 +281,177 @@ msgstr "请先配置您的kindle电子邮箱地址..." msgid "Book has been added to shelf: %(sname)s" msgstr "此书已被添加到书架: %(sname)s" -#: cps/web.py:2164 +#: cps/web.py:2166 #, python-format msgid "Book has been removed from shelf: %(sname)s" msgstr "此书已从书架 %(sname)s 中删除" -#: cps/web.py:2183 cps/web.py:2207 +#: cps/web.py:2185 cps/web.py:2209 #, python-format msgid "A shelf with the name '%(title)s' already exists." msgstr "已存在书架 '%(title)s'。" -#: cps/web.py:2188 +#: cps/web.py:2190 #, python-format msgid "Shelf %(title)s created" msgstr "书架 %(title)s 已被创建" -#: cps/web.py:2190 cps/web.py:2218 +#: cps/web.py:2192 cps/web.py:2220 msgid "There was an error" msgstr "发生错误" -#: cps/web.py:2191 cps/web.py:2193 +#: cps/web.py:2193 cps/web.py:2195 msgid "create a shelf" msgstr "创建书架" -#: cps/web.py:2216 +#: cps/web.py:2218 #, python-format msgid "Shelf %(title)s changed" msgstr "书架 %(title)s 已被修改" -#: cps/web.py:2219 cps/web.py:2221 +#: cps/web.py:2221 cps/web.py:2223 msgid "Edit a shelf" msgstr "编辑书架" -#: cps/web.py:2242 +#: cps/web.py:2244 #, python-format msgid "successfully deleted shelf %(name)s" msgstr "成功删除书架 %(name)s" -#: cps/web.py:2264 +#: cps/web.py:2266 #, python-format msgid "Shelf: '%(name)s'" msgstr "书架: '%(name)s'" -#: cps/web.py:2267 +#: cps/web.py:2269 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "打开书架出错。书架不存在或不可访问" -#: cps/web.py:2299 +#: cps/web.py:2300 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "修改书架 '%(name)s' 顺序" -#: cps/web.py:2368 +#: cps/web.py:2369 msgid "Found an existing account for this email address." msgstr "找到已使用此邮箱的账号。" -#: cps/web.py:2370 cps/web.py:2374 +#: cps/web.py:2371 cps/web.py:2375 #, python-format msgid "%(name)s's profile" msgstr "%(name)s 的资料" -#: cps/web.py:2371 +#: cps/web.py:2372 msgid "Profile updated" msgstr "资料已更新" -#: cps/web.py:2385 +#: cps/web.py:2386 msgid "Admin page" msgstr "管理页" -#: cps/web.py:2509 +#: cps/web.py:2510 msgid "Calibre-web configuration updated" msgstr "Calibre-web配置已更新" -#: cps/web.py:2516 cps/web.py:2522 cps/web.py:2536 +#: cps/web.py:2517 cps/web.py:2523 cps/web.py:2537 msgid "Basic Configuration" msgstr "基本配置" -#: cps/web.py:2520 +#: cps/web.py:2521 msgid "DB location is not valid, please enter correct path" msgstr "DB位置无效,请输入正确路径" -#: cps/templates/admin.html:34 cps/web.py:2557 cps/web.py:2610 +#: cps/templates/admin.html:34 cps/web.py:2558 cps/web.py:2611 msgid "Add new user" msgstr "添加新用户" -#: cps/web.py:2602 +#: cps/web.py:2603 #, python-format msgid "User '%(user)s' created" msgstr "用户 '%(user)s' 已被创建" -#: cps/web.py:2606 +#: cps/web.py:2607 msgid "Found an existing account for this email address or nickname." msgstr "已存在使用此邮箱或昵称的账号。" -#: cps/web.py:2628 +#: cps/web.py:2629 msgid "Mail settings updated" msgstr "邮箱设置已更新" -#: cps/web.py:2635 +#: cps/web.py:2636 #, python-format msgid "Test E-Mail successfully send to %(kindlemail)s" msgstr "测试邮件已成功发送到 %(kindlemail)s" -#: cps/web.py:2638 +#: cps/web.py:2639 #, python-format msgid "There was an error sending the Test E-Mail: %(res)s" msgstr "发送测试邮件时发生错误: %(res)s" -#: cps/web.py:2642 +#: cps/web.py:2643 msgid "E-Mail settings updated" msgstr "E-Mail 设置已更新" -#: cps/web.py:2643 +#: cps/web.py:2644 msgid "Edit mail settings" msgstr "编辑邮箱设置" -#: cps/web.py:2672 +#: cps/web.py:2673 #, python-format msgid "User '%(nick)s' deleted" msgstr "用户 '%(nick)s' 已被删除" -#: cps/web.py:2780 +#: cps/web.py:2781 #, python-format msgid "User '%(nick)s' updated" msgstr "用户 '%(nick)s' 已被更新" -#: cps/web.py:2783 +#: cps/web.py:2784 msgid "An unknown error occured." msgstr "发生未知错误。" -#: cps/web.py:2786 +#: cps/web.py:2787 #, python-format msgid "Edit User %(nick)s" msgstr "编辑用户 %(nick)s" -#: cps/web.py:2802 +#: cps/web.py:2803 msgid "Error opening eBook. File does not exist or file is not accessible" msgstr "打开电子书出错。文件不存在或不可访问" -#: cps/web.py:2817 cps/web.py:3018 cps/web.py:3161 +#: cps/web.py:2818 cps/web.py:3026 cps/web.py:3031 cps/web.py:3174 msgid "edit metadata" msgstr "编辑元数据" -#: cps/web.py:2827 cps/web.py:3055 +#: cps/web.py:2828 cps/web.py:3068 #, python-format msgid "File extension \"%s\" is not allowed to be uploaded to this server" msgstr "不能上传后缀为 \"%s\" 的文件到此服务器" -#: cps/web.py:2838 +#: cps/web.py:2839 #, python-format msgid "Failed to store file %s." msgstr "" -#: cps/web.py:2858 cps/web.py:2862 +#: cps/web.py:2861 cps/web.py:2865 msgid "unknown" msgstr "未知" -#: cps/web.py:3061 +#: cps/web.py:3074 msgid "File to be uploaded must have an extension" msgstr "要上传的文件必须有一个后缀" -#: cps/web.py:3080 +#: cps/web.py:3093 #, python-format msgid "Failed to create path %s (Permission denied)." msgstr "创建路径 %s 失败(权限拒绝)。" -#: cps/web.py:3085 +#: cps/web.py:3098 #, python-format msgid "Failed to store file %s (Permission denied)." msgstr "存储文件 %s 失败(权限拒绝)。" -#: cps/web.py:3090 +#: cps/web.py:3103 #, python-format msgid "Failed to delete file %s (Permission denied)." msgstr "删除文件 %s 失败(权限拒绝)。" @@ -646,7 +656,7 @@ msgstr "简介" msgid "Tags" msgstr "标签" -#: cps/templates/book_edit.html:39 cps/templates/layout.html:141 +#: cps/templates/book_edit.html:39 cps/templates/layout.html:143 #: cps/templates/search_form.html:37 msgid "Series" msgstr "丛书" @@ -733,7 +743,7 @@ msgstr "点击封面加载元数据到表单" msgid "Loading..." msgstr "加载中..." -#: cps/templates/book_edit.html:196 cps/templates/layout.html:205 +#: cps/templates/book_edit.html:196 cps/templates/layout.html:207 msgid "Close" msgstr "关闭" @@ -940,7 +950,7 @@ msgstr "保存设置" msgid "Save settings and send Test E-Mail" msgstr "保存设置并发送测试邮件" -#: cps/templates/feed.xml:20 cps/templates/layout.html:189 +#: cps/templates/feed.xml:20 cps/templates/layout.html:191 msgid "Next" msgstr "下一个" @@ -985,7 +995,7 @@ msgstr "最新书籍" msgid "Show Random Books" msgstr "显示随机书籍" -#: cps/templates/index.xml:52 cps/templates/layout.html:144 +#: cps/templates/index.xml:52 cps/templates/layout.html:146 msgid "Authors" msgstr "作者" @@ -1050,39 +1060,39 @@ msgstr "升序" msgid "Descending" msgstr "降序" -#: cps/templates/layout.html:135 +#: cps/templates/layout.html:137 msgid "Discover" msgstr "发现" -#: cps/templates/layout.html:138 +#: cps/templates/layout.html:140 msgid "Categories" msgstr "分类" -#: cps/templates/layout.html:147 cps/templates/search_form.html:58 +#: cps/templates/layout.html:149 cps/templates/search_form.html:58 msgid "Languages" msgstr "语言" -#: cps/templates/layout.html:150 +#: cps/templates/layout.html:152 msgid "Public Shelves" msgstr "公开书架" -#: cps/templates/layout.html:154 +#: cps/templates/layout.html:156 msgid "Your Shelves" msgstr "您的书架" -#: cps/templates/layout.html:159 +#: cps/templates/layout.html:161 msgid "Create a Shelf" msgstr "创建书架" -#: cps/templates/layout.html:160 cps/templates/stats.html:3 +#: cps/templates/layout.html:162 cps/templates/stats.html:3 msgid "About" msgstr "关于" -#: cps/templates/layout.html:174 +#: cps/templates/layout.html:176 msgid "Previous" msgstr "" -#: cps/templates/layout.html:201 +#: cps/templates/layout.html:203 msgid "Book Details" msgstr "" diff --git a/cps/ub.py b/cps/ub.py index 7b1f92ba..5f4d5df0 100644 --- a/cps/ub.py +++ b/cps/ub.py @@ -47,12 +47,9 @@ DEFAULT_PASS = "admin123" DEFAULT_PORT = int(os.environ.get("CALIBRE_PORT", 8083)) - DEVELOPMENT = False - - class UserBase: @property def is_authenticated(self): @@ -203,6 +200,7 @@ class Anonymous(AnonymousUserMixin, UserBase): def is_authenticated(self): return False + # Baseclass representing Shelfs in calibre-web inapp.db class Shelf(Base): __tablename__ = 'shelf' @@ -290,7 +288,7 @@ class Settings(Base): config_google_drive_folder = Column(String) config_google_drive_calibre_url_base = Column(String) config_google_drive_watch_changes_response = Column(String) - config_columns_to_ignore = Column(String) + #config_columns_to_ignore = Column(String) config_remote_login = Column(Boolean) config_use_goodreads = Column(Boolean) config_goodreads_api_key = Column(String) @@ -403,22 +401,22 @@ class Config: (self.config_default_role & ROLE_DELETE_BOOKS == ROLE_DELETE_BOOKS)) def mature_content_tags(self): - if (sys.version_info > (3, 0)): #Python3 str, Python2 unicode + if sys.version_info > (3, 0): # Python3 str, Python2 unicode lstrip = str.lstrip else: lstrip = unicode.lstrip return list(map(lstrip, self.config_mature_content_tags.split(","))) def get_Log_Level(self): - ret_value="" + ret_value = "" if self.config_log_level == logging.INFO: - ret_value='INFO' + ret_value = 'INFO' elif self.config_log_level == logging.DEBUG: - ret_value='DEBUG' + ret_value = 'DEBUG' elif self.config_log_level == logging.WARNING: - ret_value='WARNING' + ret_value = 'WARNING' elif self.config_log_level == logging.ERROR: - ret_value='ERROR' + ret_value = 'ERROR' return ret_value @@ -495,7 +493,7 @@ def migrate_Database(): conn = engine.connect() conn.execute("ALTER TABLE user ADD column `sidebar_view` Integer DEFAULT 1") session.commit() - create=True + create = True try: if create: conn = engine.connect() @@ -535,11 +533,13 @@ def migrate_Database(): conn = engine.connect() conn.execute("ALTER TABLE Settings ADD column `config_mature_content_tags` String DEFAULT ''") + def clean_database(): # Remove expired remote login tokens now = datetime.datetime.now() session.query(RemoteAuthToken).filter(now > RemoteAuthToken.expiration).delete() + def create_default_config(): settings = Settings() settings.mail_server = "mail.example.com" diff --git a/cps/uploader.py b/cps/uploader.py index 2772e033..40741bfd 100644 --- a/cps/uploader.py +++ b/cps/uploader.py @@ -14,17 +14,17 @@ BookMeta = namedtuple('BookMeta', 'file_path, extension, title, author, cover, d """ -def upload(file): +def upload(uploadfile): tmp_dir = os.path.join(gettempdir(), 'calibre_web') if not os.path.isdir(tmp_dir): os.mkdir(tmp_dir) - filename = file.filename + filename = uploadfile.filename filename_root, file_extension = os.path.splitext(filename) md5 = hashlib.md5() md5.update(filename.encode('utf-8')) tmp_file_path = os.path.join(tmp_dir, md5.hexdigest()) - file.save(tmp_file_path) + uploadfile.save(tmp_file_path) meta = book_formats.process(tmp_file_path, filename_root, file_extension) return meta diff --git a/cps/web.py b/cps/web.py index 61122591..06c4a18a 100755 --- a/cps/web.py +++ b/cps/web.py @@ -103,6 +103,7 @@ global_task = None ALLOWED_EXTENSIONS = set(['txt', 'pdf', 'epub', 'mobi', 'azw', 'azw3', 'cbr', 'cbz', 'cbt', 'djvu', 'prc', 'doc', 'docx', 'fb2']) + def md5(fname): hash_md5 = hashlib.md5() with open(fname, "rb") as f: @@ -110,6 +111,7 @@ def md5(fname): hash_md5.update(chunk) return hash_md5.hexdigest() + class Singleton: """ A non-thread-safe helper class to ease implementing singletons. @@ -437,7 +439,7 @@ def formatdate(val): def format_date_input(val): conformed_timestamp = re.sub(r"[:]|([-](?!((\d{2}[:]\d{2})|(\d{4}))$))", '', val) date_obj = datetime.datetime.strptime(conformed_timestamp[:15], "%Y%m%d %H%M%S") - input_date = date_obj.isoformat().split('T', 1)[0] # Hack to support dates <1900 + input_date = date_obj.isoformat().split('T', 1)[0] # Hack to support dates <1900 return '' if input_date == "0101-01-01" else input_date @@ -600,7 +602,7 @@ def modify_database_object(input_elements, db_book_object, db_object, db_session # if no element is found add it if new_element is None: if db_type == 'author': - new_element = db_object(add_element, add_element.replace('|',','), "") + new_element = db_object(add_element, add_element.replace('|', ','), "") elif db_type == 'series': new_element = db_object(add_element, add_element) elif db_type == 'custom': @@ -831,7 +833,7 @@ def feed_series(book_id): if not off: off = 0 entries, random, pagination = fill_indexpage((int(off) / (int(config.config_books_per_page)) + 1), - db.Books, db.Books.series.any(db.Series.id == book_id),db.Books.series_index) + db.Books, db.Books.series.any(db.Series.id == book_id), db.Books.series_index) xml = render_title_template('feed.xml', entries=entries, pagination=pagination) response = make_response(xml) response.headers["Content-Type"] = "application/atom+xml; charset=utf-8" @@ -850,6 +852,7 @@ def do_gdrive_download(df, headers): total_size = int(df.metadata.get('fileSize')) download_url = df.metadata.get('downloadUrl') s = partial(total_size, 1024 * 1024) # I'm downloading BIG files, so 100M chunk size is fine for me + def stream(): for byte in s: headers = {"Range": 'bytes=%s-%s' % (byte[0], byte[1])} @@ -969,13 +972,13 @@ def get_updater_status(): "6": _(u'Server is stopped'), "7": _(u'Update finished, please press okay and reload page') } - status['text']=text + status['text'] = text helper.updater_thread = helper.Updater() helper.updater_thread.start() - status['status']=helper.updater_thread.get_update_status() + status['status'] = helper.updater_thread.get_update_status() elif request.method == "GET": try: - status['status']=helper.updater_thread.get_update_status() + status['status'] = helper.updater_thread.get_update_status() except Exception: status['status'] = 7 return json.dumps(status) @@ -1055,6 +1058,7 @@ def newest_books(page): else: abort(404) + @app.route('/books/oldest', defaults={'page': 1}) @app.route('/books/oldest/page/') @login_required_if_no_ano @@ -1136,7 +1140,7 @@ def best_rated_books(page): def discover(page): if current_user.show_random_books(): entries, __, pagination = fill_indexpage(page, db.Books, True, func.randomblob(2)) - pagination = Pagination(1, config.config_books_per_page,config.config_books_per_page) + pagination = Pagination(1, config.config_books_per_page, config.config_books_per_page) return render_title_template('discover.html', entries=entries, pagination=pagination, title=_(u"Random Books")) else: abort(404) @@ -1150,7 +1154,7 @@ def author_list(): .join(db.books_authors_link).join(db.Books).filter(common_filters())\ .group_by('books_authors_link.author').order_by(db.Authors.sort).all() for entry in entries: - entry.Authors.name=entry.Authors.name.replace('|',',') + entry.Authors.name = entry.Authors.name.replace('|', ',') return render_title_template('list.html', entries=entries, folder='author', title=_(u"Author list")) else: abort(404) @@ -1166,7 +1170,7 @@ def author(book_id, page): flash(_(u"Error opening eBook. File does not exist or file is not accessible:"), category="error") return redirect(url_for("index")) - name = (db.session.query(db.Authors).filter(db.Authors.id == book_id).first().name).replace('|',',') + name = (db.session.query(db.Authors).filter(db.Authors.id == book_id).first().name).replace('|', ',') author_info = None other_books = [] @@ -1198,7 +1202,6 @@ def get_unique_other_books(library_books, author_books): return other_books - @app.route("/series") @login_required_if_no_ano def series_list(): @@ -1436,9 +1439,9 @@ def delete_book(book_id): ub.session.commit() if config.config_use_google_drive: - helper.delete_book_gdrive(book) # ToDo really delete file + helper.delete_book_gdrive(book) # ToDo really delete file else: - helper.delete_book(book,config.config_calibre_dir) + helper.delete_book(book, config.config_calibre_dir) # check if only this book links to: # author, language, series, tags, custom columns modify_database_object([u''], book.authors, db.Authors, db.session, 'author') @@ -1466,7 +1469,7 @@ def delete_book(book_id): getattr(book, cc_string).remove(del_cc) db.session.delete(del_cc) else: - modify_database_object([u''], getattr(book, cc_string),db.cc_classes[c.id], db.session, 'custom') + modify_database_object([u''], getattr(book, cc_string), db.cc_classes[c.id], db.session, 'custom') db.session.query(db.Books).filter(db.Books.id == book_id).delete() db.session.commit() else: @@ -1474,6 +1477,7 @@ def delete_book(book_id): app.logger.info('Book with id "'+str(book_id)+'" could not be deleted') return redirect(url_for('index')) + @app.route("/gdrive/authenticate") @login_required @admin_required @@ -1619,10 +1623,10 @@ def search(): db.Books.publishers.any(db.Publishers.name.ilike("%" + term + "%")), db.Books.title.ilike("%" + term + "%")))\ .filter(common_filters()).all() -# entries = db.session.query(db.Books).with_entities(db.Books.title).filter(db.Books.title.ilike("%" + term + "%")).all() - #result = db.session.execute("select name from authors where lower(name) like '%" + term.lower() + "%'") - #entries = result.fetchall() - #result.close() + # entries = db.session.query(db.Books).with_entities(db.Books.title).filter(db.Books.title.ilike("%" + term + "%")).all() + # result = db.session.execute("select name from authors where lower(name) like '%" + term.lower() + "%'") + # entries = result.fetchall() + # result.close() return render_title_template('search.html', searchterm=term, entries=entries) else: return render_title_template('search.html', searchterm="") @@ -1724,9 +1728,10 @@ def get_cover(cover_path): else: return send_from_directory(os.path.join(config.config_calibre_dir, cover_path), "cover.jpg") + @app.route("/show//") @login_required_if_no_ano -def serve_book(book_id,book_format): +def serve_book(book_id, book_format): book_format = book_format.split(".")[0] book = db.session.query(db.Books).filter(db.Books.id == book_id).first() data = db.session.query(db.Data).filter(db.Data.book == book.id).filter(db.Data.format == book_format.upper()).first() @@ -1858,7 +1863,7 @@ def read_book(book_id, book_format): elif book_format.lower() == "txt": return render_title_template('readtxt.html', txtfile=book_id, title=_(u"Read a Book")) else: - for fileext in ["cbr","cbt","cbz"]: + for fileext in ["cbr", "cbt", "cbz"]: if book_format.lower() == fileext: all_name = str(book_id) + "/" + book.data[0].name + "." + fileext tmp_file = os.path.join(book_dir, book.data[0].name) + "." + fileext @@ -1960,7 +1965,7 @@ def login(): flash(_(u"you are now logged in as: '%(nickname)s'", nickname=user.nickname), category="success") return redirect_back(url_for("index")) else: - ipAdress=request.headers.get('X-Forwarded-For', request.remote_addr) + ipAdress = request.headers.get('X-Forwarded-For', request.remote_addr) app.logger.info('Login failed for user "' + form['username'] + '" IP-adress: ' + ipAdress) flash(_(u"Wrong Username or Password"), category="error") @@ -2265,7 +2270,6 @@ def show_shelf(shelf_id): return redirect(url_for("index")) - @app.route("/shelf/order/", methods=["GET", "POST"]) @login_required def order_shelf(shelf_id): @@ -2402,7 +2406,7 @@ def configuration_helper(origin): success = False if request.method == "POST": to_save = request.form.to_dict() - content = ub.session.query(ub.Settings).first() # type: ub.Settings + content = ub.session.query(ub.Settings).first() # type: ub.Settings if "config_calibre_dir" in to_save: if content.config_calibre_dir != to_save["config_calibre_dir"]: content.config_calibre_dir = to_save["config_calibre_dir"] @@ -2806,7 +2810,7 @@ def edit_book(book_id): except Exception: book.languages[index].language_name = _(isoLanguages.get(part3=book.languages[index].lang_code).name) for author in book.authors: - author_names.append(author.name.replace('|',',')) + author_names.append(author.name.replace('|', ',')) # Show form if request.method != 'POST': @@ -2845,172 +2849,184 @@ def edit_book(book_id): db.session.add(db_format) to_save = request.form.to_dict() + if book.title != to_save["book_title"]: book.title = to_save["book_title"] edited_books_id.add(book.id) + input_authors = to_save["author_name"].split('&') - input_authors = map(lambda it: it.strip().replace(',','|'), input_authors) + input_authors = map(lambda it: it.strip().replace(',', '|'), input_authors) # we have all author names now if input_authors == ['']: input_authors = [_(u'unknown')] # prevent empty Author if book.authors: author0_before_edit = book.authors[0].name else: - author0_before_edit = db.Authors(_(u'unknown'),'',0) + author0_before_edit = db.Authors(_(u'unknown'), '', 0) modify_database_object(input_authors, book.authors, db.Authors, db.session, 'author') if book.authors: if author0_before_edit != book.authors[0].name: edited_books_id.add(book.id) book.author_sort = helper.get_sorted_author(input_authors[0]) - if to_save["cover_url"] and save_cover(to_save["cover_url"], book.path): - book.has_cover = 1 + error = False + for b in edited_books_id: + if config.config_use_google_drive: + error = helper.update_dir_structure_gdrive(b) + else: + error = helper.update_dir_stucture(b, config.config_calibre_dir) + if error: # stop on error + break + if config.config_use_google_drive: + updateGdriveCalibreFromLocal() - if book.series_index != to_save["series_index"]: - book.series_index = to_save["series_index"] + if not error: + if to_save["cover_url"] and save_cover(to_save["cover_url"], book.path): + book.has_cover = 1 - if len(book.comments): - book.comments[0].text = to_save["description"] - else: - book.comments.append(db.Comments(text=to_save["description"], book=book.id)) + if book.series_index != to_save["series_index"]: + book.series_index = to_save["series_index"] - input_tags = to_save["tags"].split(',') - input_tags = map(lambda it: it.strip(), input_tags) - modify_database_object(input_tags, book.tags, db.Tags, db.session, 'tags') + if len(book.comments): + book.comments[0].text = to_save["description"] + else: + book.comments.append(db.Comments(text=to_save["description"], book=book.id)) - input_series = [to_save["series"].strip()] - input_series = [x for x in input_series if x != ''] - modify_database_object(input_series, book.series, db.Series, db.session, 'series') + input_tags = to_save["tags"].split(',') + input_tags = map(lambda it: it.strip(), input_tags) + modify_database_object(input_tags, book.tags, db.Tags, db.session, 'tags') - input_languages = to_save["languages"].split(',') - input_languages = map(lambda it: it.strip().lower(), input_languages) + input_series = [to_save["series"].strip()] + input_series = [x for x in input_series if x != ''] + modify_database_object(input_series, book.series, db.Series, db.session, 'series') - if to_save["pubdate"]: - try: - book.pubdate = datetime.datetime.strptime(to_save["pubdate"], "%Y-%m-%d") - except ValueError: + input_languages = to_save["languages"].split(',') + input_languages = map(lambda it: it.strip().lower(), input_languages) + + if to_save["pubdate"]: + try: + book.pubdate = datetime.datetime.strptime(to_save["pubdate"], "%Y-%m-%d") + except ValueError: + book.pubdate = db.Books.DEFAULT_PUBDATE + else: book.pubdate = db.Books.DEFAULT_PUBDATE - else: - book.pubdate = db.Books.DEFAULT_PUBDATE - # retranslate displayed text to language codes - languages = db.session.query(db.Languages).all() - input_l = [] - for lang in languages: - try: - lang.name = LC.parse(lang.lang_code).get_language_name(get_locale()).lower() - except Exception: - lang.name = _(isoLanguages.get(part3=lang.lang_code).name).lower() - for inp_lang in input_languages: - if inp_lang == lang.name: - input_l.append(lang.lang_code) - modify_database_object(input_l, book.languages, db.Languages, db.session, 'languages') - - if to_save["rating"].strip(): - old_rating = False - if len(book.ratings) > 0: - old_rating = book.ratings[0].rating - ratingx2 = int(float(to_save["rating"]) * 2) - if ratingx2 != old_rating: - is_rating = db.session.query(db.Ratings).filter(db.Ratings.rating == ratingx2).first() - if is_rating: - book.ratings.append(is_rating) - else: - new_rating = db.Ratings(rating=ratingx2) - book.ratings.append(new_rating) - if old_rating: + # retranslate displayed text to language codes + languages = db.session.query(db.Languages).all() + input_l = [] + for lang in languages: + try: + lang.name = LC.parse(lang.lang_code).get_language_name(get_locale()).lower() + except Exception: + lang.name = _(isoLanguages.get(part3=lang.lang_code).name).lower() + for inp_lang in input_languages: + if inp_lang == lang.name: + input_l.append(lang.lang_code) + modify_database_object(input_l, book.languages, db.Languages, db.session, 'languages') + + if to_save["rating"].strip(): + old_rating = False + if len(book.ratings) > 0: + old_rating = book.ratings[0].rating + ratingx2 = int(float(to_save["rating"]) * 2) + if ratingx2 != old_rating: + is_rating = db.session.query(db.Ratings).filter(db.Ratings.rating == ratingx2).first() + if is_rating: + book.ratings.append(is_rating) + else: + new_rating = db.Ratings(rating=ratingx2) + book.ratings.append(new_rating) + if old_rating: + book.ratings.remove(book.ratings[0]) + else: + if len(book.ratings) > 0: book.ratings.remove(book.ratings[0]) - else: - if len(book.ratings) > 0: - book.ratings.remove(book.ratings[0]) - - for c in cc: - cc_string = "custom_column_" + str(c.id) - if not c.is_multiple: - if len(getattr(book, cc_string)) > 0: - cc_db_value = getattr(book, cc_string)[0].value - else: - cc_db_value = None - if to_save[cc_string].strip(): - if c.datatype == 'bool': - if to_save[cc_string] == 'None': - to_save[cc_string] = None - else: - to_save[cc_string] = 1 if to_save[cc_string] == 'True' else 0 - if to_save[cc_string] != cc_db_value: - if cc_db_value is not None: - if to_save[cc_string] is not None: - setattr(getattr(book, cc_string)[0], 'value', to_save[cc_string]) - else: - del_cc = getattr(book, cc_string)[0] - getattr(book, cc_string).remove(del_cc) - db.session.delete(del_cc) + + for c in cc: + cc_string = "custom_column_" + str(c.id) + if not c.is_multiple: + if len(getattr(book, cc_string)) > 0: + cc_db_value = getattr(book, cc_string)[0].value + else: + cc_db_value = None + if to_save[cc_string].strip(): + if c.datatype == 'bool': + if to_save[cc_string] == 'None': + to_save[cc_string] = None else: - cc_class = db.cc_classes[c.id] - new_cc = cc_class(value=to_save[cc_string], book=book_id) - db.session.add(new_cc) - elif c.datatype == 'int': - if to_save[cc_string] == 'None': - to_save[cc_string] = None - if to_save[cc_string] != cc_db_value: - if cc_db_value is not None: - if to_save[cc_string] is not None: - setattr(getattr(book, cc_string)[0], 'value', to_save[cc_string]) + to_save[cc_string] = 1 if to_save[cc_string] == 'True' else 0 + if to_save[cc_string] != cc_db_value: + if cc_db_value is not None: + if to_save[cc_string] is not None: + setattr(getattr(book, cc_string)[0], 'value', to_save[cc_string]) + else: + del_cc = getattr(book, cc_string)[0] + getattr(book, cc_string).remove(del_cc) + db.session.delete(del_cc) else: + cc_class = db.cc_classes[c.id] + new_cc = cc_class(value=to_save[cc_string], book=book_id) + db.session.add(new_cc) + elif c.datatype == 'int': + if to_save[cc_string] == 'None': + to_save[cc_string] = None + if to_save[cc_string] != cc_db_value: + if cc_db_value is not None: + if to_save[cc_string] is not None: + setattr(getattr(book, cc_string)[0], 'value', to_save[cc_string]) + else: + del_cc = getattr(book, cc_string)[0] + getattr(book, cc_string).remove(del_cc) + db.session.delete(del_cc) + else: + cc_class = db.cc_classes[c.id] + new_cc = cc_class(value=to_save[cc_string], book=book_id) + db.session.add(new_cc) + + else: + if c.datatype == 'rating': + to_save[cc_string] = str(int(float(to_save[cc_string]) * 2)) + if to_save[cc_string].strip() != cc_db_value: + if cc_db_value is not None: + # remove old cc_val del_cc = getattr(book, cc_string)[0] getattr(book, cc_string).remove(del_cc) - db.session.delete(del_cc) - else: + if len(del_cc.books) == 0: + db.session.delete(del_cc) cc_class = db.cc_classes[c.id] - new_cc = cc_class(value=to_save[cc_string], book=book_id) - db.session.add(new_cc) - - else: - if c.datatype == 'rating': - to_save[cc_string] = str(int(float(to_save[cc_string]) * 2)) - if to_save[cc_string].strip() != cc_db_value: - if cc_db_value is not None: - # remove old cc_val - del_cc = getattr(book, cc_string)[0] - getattr(book, cc_string).remove(del_cc) - if len(del_cc.books) == 0: - db.session.delete(del_cc) - cc_class = db.cc_classes[c.id] - new_cc = db.session.query(cc_class).filter( - cc_class.value == to_save[cc_string].strip()).first() - # if no cc val is found add it - if new_cc is None: - new_cc = cc_class(value=to_save[cc_string].strip()) - db.session.add(new_cc) new_cc = db.session.query(cc_class).filter( cc_class.value == to_save[cc_string].strip()).first() - # add cc value to book - getattr(book, cc_string).append(new_cc) + # if no cc val is found add it + if new_cc is None: + new_cc = cc_class(value=to_save[cc_string].strip()) + db.session.add(new_cc) + new_cc = db.session.query(cc_class).filter( + cc_class.value == to_save[cc_string].strip()).first() + # add cc value to book + getattr(book, cc_string).append(new_cc) + else: + if cc_db_value is not None: + # remove old cc_val + del_cc = getattr(book, cc_string)[0] + getattr(book, cc_string).remove(del_cc) + if len(del_cc.books) == 0: + db.session.delete(del_cc) else: - if cc_db_value is not None: - # remove old cc_val - del_cc = getattr(book, cc_string)[0] - getattr(book, cc_string).remove(del_cc) - if len(del_cc.books) == 0: - db.session.delete(del_cc) - else: - input_tags = to_save[cc_string].split(',') - input_tags = map(lambda it: it.strip(), input_tags) - modify_database_object(input_tags, getattr(book, cc_string),db.cc_classes[c.id], db.session, 'custom') - db.session.commit() - author_names = [] - for author in book.authors: - author_names.append(author.name) - for b in edited_books_id: - if config.config_use_google_drive: - helper.update_dir_structure_gdrive(b) + input_tags = to_save[cc_string].split(',') + input_tags = map(lambda it: it.strip(), input_tags) + modify_database_object(input_tags, getattr(book, cc_string), db.cc_classes[c.id], db.session, 'custom') + db.session.commit() + author_names = [] + for author in book.authors: + author_names.append(author.name) + if "detail_view" in to_save: + return redirect(url_for('show_book', book_id=book.id)) else: - helper.update_dir_stucture(b, config.config_calibre_dir) - if config.config_use_google_drive: - updateGdriveCalibreFromLocal() - if "detail_view" in to_save: - return redirect(url_for('show_book', book_id=book.id)) + return render_title_template('book_edit.html', book=book, authors=author_names, cc=cc, + title=_(u"edit metadata")) else: + db.session.rollback() + flash( error, category="error") return render_title_template('book_edit.html', book=book, authors=author_names, cc=cc, title=_(u"edit metadata")) @@ -3173,4 +3189,3 @@ def start_gevent(): app.logger.info('Unable to listen on \'\', trying on IPv4 only...') gevent_server = WSGIServer(('0.0.0.0', ub.config.config_port), app) gevent_server.serve_forever() - diff --git a/messages.pot b/messages.pot index da8a4766..27f35ad0 100644 --- a/messages.pot +++ b/messages.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2017-11-12 14:54+0100\n" +"POT-Creation-Date: 2017-11-30 16:45+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,180 +17,190 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 2.5.1\n" -#: cps/book_formats.py:118 cps/book_formats.py:122 cps/web.py:1398 +#: cps/book_formats.py:119 cps/book_formats.py:123 cps/web.py:1401 msgid "not installed" msgstr "" -#: cps/helper.py:77 +#: cps/helper.py:78 #, python-format msgid "kindlegen binary %(kindlepath)s not found" msgstr "" -#: cps/helper.py:83 +#: cps/helper.py:84 #, python-format msgid "epub format not found for book id: %(book)d" msgstr "" -#: cps/helper.py:93 +#: cps/helper.py:94 msgid "kindlegen failed, no execution permissions" msgstr "" -#: cps/helper.py:108 +#: cps/helper.py:109 #, python-format msgid "Kindlegen failed with Error %(error)s. Message: %(message)s" msgstr "" -#: cps/helper.py:187 +#: cps/helper.py:188 #, python-format msgid "Failed to send mail: %s" msgstr "" -#: cps/helper.py:194 +#: cps/helper.py:195 msgid "Calibre-web test email" msgstr "" -#: cps/helper.py:195 cps/helper.py:207 +#: cps/helper.py:196 cps/helper.py:208 msgid "This email has been sent via calibre web." msgstr "" -#: cps/helper.py:204 cps/templates/detail.html:43 +#: cps/helper.py:205 cps/templates/detail.html:43 msgid "Send to Kindle" msgstr "" -#: cps/helper.py:224 cps/helper.py:238 +#: cps/helper.py:225 cps/helper.py:239 msgid "Could not find any formats suitable for sending by email" msgstr "" +#: cps/helper.py:338 +#, python-format +msgid "Rename title from: \"%s\" to \"%s\" failed with error: %s" +msgstr "" + +#: cps/helper.py:347 +#, python-format +msgid "Rename author from: \"%s\" to \"%s\" failed with error: %s" +msgstr "" + #: cps/ub.py:577 msgid "Guest" msgstr "" -#: cps/web.py:964 +#: cps/web.py:967 msgid "Requesting update package" msgstr "" -#: cps/web.py:965 +#: cps/web.py:968 msgid "Downloading update package" msgstr "" -#: cps/web.py:966 +#: cps/web.py:969 msgid "Unzipping update package" msgstr "" -#: cps/web.py:967 +#: cps/web.py:970 msgid "Files are replaced" msgstr "" -#: cps/web.py:968 +#: cps/web.py:971 msgid "Database connections are closed" msgstr "" -#: cps/web.py:969 +#: cps/web.py:972 msgid "Server is stopped" msgstr "" -#: cps/web.py:970 +#: cps/web.py:973 msgid "Update finished, please press okay and reload page" msgstr "" -#: cps/web.py:1044 +#: cps/web.py:1047 msgid "Recently Added Books" msgstr "" -#: cps/web.py:1054 +#: cps/web.py:1057 msgid "Newest Books" msgstr "" -#: cps/web.py:1065 +#: cps/web.py:1069 msgid "Oldest Books" msgstr "" -#: cps/web.py:1077 +#: cps/web.py:1081 msgid "Books (A-Z)" msgstr "" -#: cps/web.py:1088 +#: cps/web.py:1092 msgid "Books (Z-A)" msgstr "" -#: cps/web.py:1116 +#: cps/web.py:1120 msgid "Hot Books (most downloaded)" msgstr "" -#: cps/web.py:1129 +#: cps/web.py:1133 msgid "Best rated books" msgstr "" -#: cps/templates/index.xml:32 cps/web.py:1140 +#: cps/templates/index.xml:32 cps/web.py:1144 msgid "Random Books" msgstr "" -#: cps/web.py:1154 +#: cps/web.py:1158 msgid "Author list" msgstr "" -#: cps/web.py:1166 cps/web.py:1225 cps/web.py:1355 cps/web.py:1827 +#: cps/web.py:1170 cps/web.py:1228 cps/web.py:1358 cps/web.py:1827 msgid "Error opening eBook. File does not exist or file is not accessible:" msgstr "" -#: cps/templates/index.xml:64 cps/web.py:1209 +#: cps/templates/index.xml:64 cps/web.py:1212 msgid "Series list" msgstr "" -#: cps/web.py:1223 +#: cps/web.py:1226 #, python-format msgid "Series: %(serie)s" msgstr "" -#: cps/web.py:1256 +#: cps/web.py:1259 msgid "Available languages" msgstr "" -#: cps/web.py:1273 +#: cps/web.py:1276 #, python-format msgid "Language: %(name)s" msgstr "" -#: cps/templates/index.xml:58 cps/web.py:1283 +#: cps/templates/index.xml:58 cps/web.py:1286 msgid "Category list" msgstr "" -#: cps/web.py:1297 +#: cps/web.py:1300 #, python-format msgid "Category: %(name)s" msgstr "" -#: cps/web.py:1409 +#: cps/web.py:1412 msgid "Excecution permissions missing" msgstr "" -#: cps/web.py:1423 +#: cps/web.py:1426 msgid "Statistics" msgstr "" -#: cps/web.py:1587 +#: cps/web.py:1591 msgid "Server restarted, please reload page" msgstr "" -#: cps/web.py:1589 +#: cps/web.py:1593 msgid "Performing shutdown of server, please close window" msgstr "" -#: cps/web.py:1605 +#: cps/web.py:1609 msgid "Update done" msgstr "" -#: cps/web.py:1687 cps/web.py:1700 +#: cps/web.py:1691 cps/web.py:1704 msgid "search" msgstr "" #: cps/templates/index.xml:39 cps/templates/index.xml:42 -#: cps/templates/layout.html:131 cps/web.py:1782 +#: cps/templates/layout.html:132 cps/web.py:1782 msgid "Read Books" msgstr "" -#: cps/templates/index.xml:45 cps/templates/index.xml:48 -#: cps/templates/layout.html:132 cps/web.py:1785 +#: cps/templates/index.xml:46 cps/templates/index.xml:49 +#: cps/templates/layout.html:134 cps/web.py:1785 msgid "Unread Books" msgstr "" @@ -198,7 +208,7 @@ msgstr "" msgid "Read a Book" msgstr "" -#: cps/web.py:1925 cps/web.py:2555 +#: cps/web.py:1925 cps/web.py:2556 msgid "Please fill out all fields!" msgstr "" @@ -253,7 +263,7 @@ msgstr "" msgid "There was an error sending this book: %(res)s" msgstr "" -#: cps/web.py:2085 cps/web.py:2640 +#: cps/web.py:2085 cps/web.py:2641 msgid "Please configure your kindle email address first..." msgstr "" @@ -262,177 +272,177 @@ msgstr "" msgid "Book has been added to shelf: %(sname)s" msgstr "" -#: cps/web.py:2164 +#: cps/web.py:2166 #, python-format msgid "Book has been removed from shelf: %(sname)s" msgstr "" -#: cps/web.py:2183 cps/web.py:2207 +#: cps/web.py:2185 cps/web.py:2209 #, python-format msgid "A shelf with the name '%(title)s' already exists." msgstr "" -#: cps/web.py:2188 +#: cps/web.py:2190 #, python-format msgid "Shelf %(title)s created" msgstr "" -#: cps/web.py:2190 cps/web.py:2218 +#: cps/web.py:2192 cps/web.py:2220 msgid "There was an error" msgstr "" -#: cps/web.py:2191 cps/web.py:2193 +#: cps/web.py:2193 cps/web.py:2195 msgid "create a shelf" msgstr "" -#: cps/web.py:2216 +#: cps/web.py:2218 #, python-format msgid "Shelf %(title)s changed" msgstr "" -#: cps/web.py:2219 cps/web.py:2221 +#: cps/web.py:2221 cps/web.py:2223 msgid "Edit a shelf" msgstr "" -#: cps/web.py:2242 +#: cps/web.py:2244 #, python-format msgid "successfully deleted shelf %(name)s" msgstr "" -#: cps/web.py:2264 +#: cps/web.py:2266 #, python-format msgid "Shelf: '%(name)s'" msgstr "" -#: cps/web.py:2267 +#: cps/web.py:2269 msgid "Error opening shelf. Shelf does not exist or is not accessible" msgstr "" -#: cps/web.py:2299 +#: cps/web.py:2300 #, python-format msgid "Change order of Shelf: '%(name)s'" msgstr "" -#: cps/web.py:2368 +#: cps/web.py:2369 msgid "Found an existing account for this email address." msgstr "" -#: cps/web.py:2370 cps/web.py:2374 +#: cps/web.py:2371 cps/web.py:2375 #, python-format msgid "%(name)s's profile" msgstr "" -#: cps/web.py:2371 +#: cps/web.py:2372 msgid "Profile updated" msgstr "" -#: cps/web.py:2385 +#: cps/web.py:2386 msgid "Admin page" msgstr "" -#: cps/web.py:2509 +#: cps/web.py:2510 msgid "Calibre-web configuration updated" msgstr "" -#: cps/web.py:2516 cps/web.py:2522 cps/web.py:2536 +#: cps/web.py:2517 cps/web.py:2523 cps/web.py:2537 msgid "Basic Configuration" msgstr "" -#: cps/web.py:2520 +#: cps/web.py:2521 msgid "DB location is not valid, please enter correct path" msgstr "" -#: cps/templates/admin.html:34 cps/web.py:2557 cps/web.py:2610 +#: cps/templates/admin.html:34 cps/web.py:2558 cps/web.py:2611 msgid "Add new user" msgstr "" -#: cps/web.py:2602 +#: cps/web.py:2603 #, python-format msgid "User '%(user)s' created" msgstr "" -#: cps/web.py:2606 +#: cps/web.py:2607 msgid "Found an existing account for this email address or nickname." msgstr "" -#: cps/web.py:2628 +#: cps/web.py:2629 msgid "Mail settings updated" msgstr "" -#: cps/web.py:2635 +#: cps/web.py:2636 #, python-format msgid "Test E-Mail successfully send to %(kindlemail)s" msgstr "" -#: cps/web.py:2638 +#: cps/web.py:2639 #, python-format msgid "There was an error sending the Test E-Mail: %(res)s" msgstr "" -#: cps/web.py:2642 +#: cps/web.py:2643 msgid "E-Mail settings updated" msgstr "" -#: cps/web.py:2643 +#: cps/web.py:2644 msgid "Edit mail settings" msgstr "" -#: cps/web.py:2672 +#: cps/web.py:2673 #, python-format msgid "User '%(nick)s' deleted" msgstr "" -#: cps/web.py:2780 +#: cps/web.py:2781 #, python-format msgid "User '%(nick)s' updated" msgstr "" -#: cps/web.py:2783 +#: cps/web.py:2784 msgid "An unknown error occured." msgstr "" -#: cps/web.py:2786 +#: cps/web.py:2787 #, python-format msgid "Edit User %(nick)s" msgstr "" -#: cps/web.py:2802 +#: cps/web.py:2803 msgid "Error opening eBook. File does not exist or file is not accessible" msgstr "" -#: cps/web.py:2817 cps/web.py:3018 cps/web.py:3161 +#: cps/web.py:2818 cps/web.py:3026 cps/web.py:3031 cps/web.py:3174 msgid "edit metadata" msgstr "" -#: cps/web.py:2827 cps/web.py:3055 +#: cps/web.py:2828 cps/web.py:3068 #, python-format msgid "File extension \"%s\" is not allowed to be uploaded to this server" msgstr "" -#: cps/web.py:2838 +#: cps/web.py:2839 #, python-format msgid "Failed to store file %s." msgstr "" -#: cps/web.py:2858 cps/web.py:2862 +#: cps/web.py:2861 cps/web.py:2865 msgid "unknown" msgstr "" -#: cps/web.py:3061 +#: cps/web.py:3074 msgid "File to be uploaded must have an extension" msgstr "" -#: cps/web.py:3080 +#: cps/web.py:3093 #, python-format msgid "Failed to create path %s (Permission denied)." msgstr "" -#: cps/web.py:3085 +#: cps/web.py:3098 #, python-format msgid "Failed to store file %s (Permission denied)." msgstr "" -#: cps/web.py:3090 +#: cps/web.py:3103 #, python-format msgid "Failed to delete file %s (Permission denied)." msgstr "" @@ -637,7 +647,7 @@ msgstr "" msgid "Tags" msgstr "" -#: cps/templates/book_edit.html:39 cps/templates/layout.html:141 +#: cps/templates/book_edit.html:39 cps/templates/layout.html:143 #: cps/templates/search_form.html:37 msgid "Series" msgstr "" @@ -724,7 +734,7 @@ msgstr "" msgid "Loading..." msgstr "" -#: cps/templates/book_edit.html:196 cps/templates/layout.html:205 +#: cps/templates/book_edit.html:196 cps/templates/layout.html:207 msgid "Close" msgstr "" @@ -931,7 +941,7 @@ msgstr "" msgid "Save settings and send Test E-Mail" msgstr "" -#: cps/templates/feed.xml:20 cps/templates/layout.html:189 +#: cps/templates/feed.xml:20 cps/templates/layout.html:191 msgid "Next" msgstr "" @@ -976,7 +986,7 @@ msgstr "" msgid "Show Random Books" msgstr "" -#: cps/templates/index.xml:52 cps/templates/layout.html:144 +#: cps/templates/index.xml:52 cps/templates/layout.html:146 msgid "Authors" msgstr "" @@ -1041,39 +1051,39 @@ msgstr "" msgid "Descending" msgstr "" -#: cps/templates/layout.html:135 +#: cps/templates/layout.html:137 msgid "Discover" msgstr "" -#: cps/templates/layout.html:138 +#: cps/templates/layout.html:140 msgid "Categories" msgstr "" -#: cps/templates/layout.html:147 cps/templates/search_form.html:58 +#: cps/templates/layout.html:149 cps/templates/search_form.html:58 msgid "Languages" msgstr "" -#: cps/templates/layout.html:150 +#: cps/templates/layout.html:152 msgid "Public Shelves" msgstr "" -#: cps/templates/layout.html:154 +#: cps/templates/layout.html:156 msgid "Your Shelves" msgstr "" -#: cps/templates/layout.html:159 +#: cps/templates/layout.html:161 msgid "Create a Shelf" msgstr "" -#: cps/templates/layout.html:160 cps/templates/stats.html:3 +#: cps/templates/layout.html:162 cps/templates/stats.html:3 msgid "About" msgstr "" -#: cps/templates/layout.html:174 +#: cps/templates/layout.html:176 msgid "Previous" msgstr "" -#: cps/templates/layout.html:201 +#: cps/templates/layout.html:203 msgid "Book Details" msgstr ""