From 4d29e8d54fa8631f32e7ca3650b89d8e715380db Mon Sep 17 00:00:00 2001 From: northdpole Date: Mon, 30 Aug 2021 17:13:17 +0100 Subject: [PATCH 1/6] migrate frontend --- .../src/pages/Search/components/BodyText.scss | 6 ++++ .../src/pages/Search/components/BodyText.tsx | 29 +++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 application/frontend/src/pages/Search/components/BodyText.scss create mode 100644 application/frontend/src/pages/Search/components/BodyText.tsx diff --git a/application/frontend/src/pages/Search/components/BodyText.scss b/application/frontend/src/pages/Search/components/BodyText.scss new file mode 100644 index 000000000..28900ec79 --- /dev/null +++ b/application/frontend/src/pages/Search/components/BodyText.scss @@ -0,0 +1,6 @@ +.index-text{ + margin-top: 2rem; + width: 67%; + background: white; + padding: 1%; +} diff --git a/application/frontend/src/pages/Search/components/BodyText.tsx b/application/frontend/src/pages/Search/components/BodyText.tsx new file mode 100644 index 000000000..05c66598e --- /dev/null +++ b/application/frontend/src/pages/Search/components/BodyText.tsx @@ -0,0 +1,29 @@ +import React, { useState } from 'react'; +import { useHistory } from 'react-router-dom'; +import { Button, Dropdown, Form, Icon, Input } from 'semantic-ui-react'; + +import { CRE, STANDARD } from '../../../routes'; +import './BodyText.scss'; + +export const SearchBody = () => { + + return ( +
+

OPEN CRE

+Linking standards. By the community, for the community. +Open Common Requirement Enumeration links standards and guidelines at the level of topics that need to be taken into account when procuring, designing, building and testing great software. +

WHY?

+

CRE follows up on the ENISA recommendation for a repository to bring the fragmented landscape of security knowledge resources together. +This initiative was taken by an independent group of software security experts who got together to make it 1) easier to create and maintain standards and guidelines, and 2) easier to find relevant information. +No more endless searches for relevant rules and information, no more broken links, no more need to cover every topic everywhere - just link. +

+

WHAT?

+

The idea of CRE is to link each section of a resource to a shared topic identifier (a Common Requirement), instead of linking to just 1 or 2 other resources. Through this shared link, all resources map to eachother. This 1) enables standard and guideline makers to work efficiently, 2) it enables users to find the information they need, and 3) it facilitates a shared understanding in the industry of what cyber security is. The key element is self-maintainability: the CRE topic links in the resource can be automatically parsed and used to map everything together. No more manual mapping labour. Furthermore, because the topics are linked as well, users can quickly find more relevant material through related topics. +For example the topic of session time-out will take the user not only to relevant criteria in several standards, but also to testing guides, development tips, more technical detail, threat descriptions, articles etc. Plus, from there the user can navigate to resources about session management in general. +The CRE only links and therefore does not create a new standard of requirements. It is simply a standard on how standards can link together. +

WHEN?

+

Currently, CRE has linked several OWASP standards together, and included other standards (CWE, NIST-800 53, NIST-800 63b), as part of the OWASP Integration standard project. +Join the movement.

+
+ ); +}; From 9feedbc7a251a3f74d603d1ff4242bf11f31ee4f Mon Sep 17 00:00:00 2001 From: northdpole Date: Mon, 30 Aug 2021 23:25:15 +0100 Subject: [PATCH 2/6] debugging --- application/cmd/cre_main.py | 54 +++--- application/database/db.py | 311 ++++++++++++++++++----------------- application/tests/db_test.py | 6 +- application/utils/parsers.py | 107 +++++++----- 4 files changed, 255 insertions(+), 223 deletions(-) diff --git a/application/cmd/cre_main.py b/application/cmd/cre_main.py index 844f37bbd..32d79e0ab 100644 --- a/application/cmd/cre_main.py +++ b/application/cmd/cre_main.py @@ -48,25 +48,29 @@ def register_standard( for unlinked_standard in cre_less_standards: # if anything in this collection.add_link( cre=cre, - standard=db.dbStandardFromStandard(unlinked_standard), + standard=db.dbStandardFromStandard( + unlinked_standard), type=link.ltype, ) else: cres = collection.find_cres_of_standard(linked_standard) if cres: for cre in cres: - collection.add_link(cre=cre, standard=db_link, type=link.ltype) + collection.add_link( + cre=cre, standard=db_link, type=link.ltype) for unlinked_standard in cre_less_standards: collection.add_link( cre=cre, - standard=db.dbStandardFromStandard(unlinked_standard), + standard=db.dbStandardFromStandard( + unlinked_standard), type=link.ltype, ) else: # if neither the root nor a linked standard has a CRE, add both as unlinked standards cre_less_standards.append(link.document) if link.document.links and len(link.document.links) > 0: - register_standard(standard=link.document, collection=collection) + register_standard(standard=link.document, + collection=collection) elif type(link.document).__name__ == defs.CRE.__name__: dbcre = register_cre(link.document, collection) @@ -76,29 +80,25 @@ def register_standard( def register_cre(cre: defs.CRE, collection: db.Standard_collection) -> db.CRE: - dbcre: db.CRE = collection.add_cre(cre) - for link in cre.links: - if type(link.document).__name__ == defs.CRE.__name__: - collection.add_internal_link( - dbcre, register_cre(link.document, collection), type=link.ltype - ) - elif type(link.document).__name__ == defs.Standard.__name__: + if type(link.document) == defs.CRE: + collection.add_internal_link(dbcre, + register_cre( + link.document, collection), + type=link.ltype) + elif type(link.document) == defs.Standard: collection.add_link( cre=dbcre, standard=register_standard( - standard=link.document, collection=collection - ), - type=link.ltype, - ) + standard=link.document, collection=collection), + type=link.ltype) return dbcre def parse_file( filename: str, yamldocs: List[Dict[str, Any]], scollection: db.Standard_collection ) -> Optional[List[defs.Document]]: - """given yaml from export format deserialise to internal standards format and add standards to db""" resulting_objects = [] @@ -147,7 +147,8 @@ def parse_file( if register_callback: register_callback(document, collection=scollection) # type: ignore else: - logger.warning("Callback to register Document is None, likely missing data") + logger.warning( + "Callback to register Document is None, likely missing data") resulting_objects.append(document) return resulting_objects @@ -156,7 +157,6 @@ def parse_file( def parse_standards_from_spreadsheeet( cre_file: List[Dict[str, Any]], result: db.Standard_collection ) -> None: - """given a yaml with standards, build a list of standards in the db""" hi_lvl_CREs = {} cres = {} @@ -181,11 +181,13 @@ def parse_standards_from_spreadsheeet( for link in doc.links: if type(link.document).__name__ == defs.CRE.__name__: dbcre = register_cre(link.document, result) - result.add_internal_link(group=dbgroup, cre=dbcre, type=link.ltype) + result.add_internal_link( + group=dbgroup, cre=dbcre, type=link.ltype) elif type(link.document).__name__ == defs.Standard.__name__: dbstandard = register_standard(link.document, result) - result.add_link(cre=dbgroup, standard=dbstandard, type=link.ltype) + result.add_link( + cre=dbgroup, standard=dbstandard, type=link.ltype) def get_standards_files_from_disk(cre_loc: str) -> Generator[str, None, None]: @@ -197,7 +199,6 @@ def get_standards_files_from_disk(cre_loc: str) -> Generator[str, None, None]: def add_from_spreadsheet(spreadsheet_url: str, cache_loc: str, cre_loc: str) -> None: - """--add --from_spreadsheet use the cre db in this repo import new mappings from @@ -213,12 +214,12 @@ def add_from_spreadsheet(spreadsheet_url: str, cache_loc: str, cre_loc: str) -> database.export(cre_loc) logger.info( - "Db located at %s got updated, files extracted at %s" % (cache_loc, cre_loc) + "Db located at %s got updated, files extracted at %s" % ( + cache_loc, cre_loc) ) def add_from_disk(cache_loc: str, cre_loc: str) -> None: - """--add --cre_loc use the cre db in this repo import new mappings from @@ -236,7 +237,6 @@ def add_from_disk(cache_loc: str, cre_loc: str) -> None: def review_from_spreadsheet(cache: str, spreadsheet_url: str, share_with: str) -> None: - """--review --from_spreadsheet copy db to new temp dir, import new mappings from spreadsheet @@ -266,7 +266,6 @@ def review_from_spreadsheet(cache: str, spreadsheet_url: str, share_with: str) - def review_from_disk(cache: str, cre_file_loc: str, share_with: str) -> None: - """--review --cre_loc copy db to new temp dir, import new mappings from yaml files defined in @@ -298,7 +297,6 @@ def review_from_disk(cache: str, cre_file_loc: str, share_with: str) -> None: def print_graph() -> None: - """export db to single json object, pass to visualise.html so it can be shown in browser""" raise NotImplementedError @@ -347,7 +345,6 @@ def create_spreadsheet( title: str, share_with: List[str], ) -> Any: - """Reads cre docs exported from a standards_collection.export() dumps each doc into a workbook""" flat_dicts = sheet_utils.prepare_spreadsheet( @@ -365,5 +362,6 @@ def prepare_for_review(cache: str) -> Tuple[str, str]: if os.path.isfile(cache): shutil.copy(cache, loc) else: - logger.fatal("Could not copy database %s this seems like a bug" % cache) + logger.fatal( + "Could not copy database %s this seems like a bug" % cache) return loc, os.path.join(loc, cache_filename) diff --git a/application/database/db.py b/application/database/db.py index d93b7c844..a8cf55634 100644 --- a/application/database/db.py +++ b/application/database/db.py @@ -31,13 +31,13 @@ class Standard(BaseModel): # type: ignore # which subpart of are we linking to subsection = sqla.Column(sqla.String) tags = sqla.Column(sqla.String, default="") # coma separated tags - - version = sqla.Column(sqla.String) + version = sqla.Column(sqla.String, default="") # some external link to where this is, usually a URL with an anchor link = sqla.Column(sqla.String, default="") __table_args__ = ( - sqla.UniqueConstraint(name, section, subsection, name="standard_section"), + sqla.UniqueConstraint(name, section, subsection, + name="standard_section"), ) @@ -61,15 +61,18 @@ class InternalLinks(BaseModel): # type: ignore __tablename__ = "crelinks" type = sqla.Column(sqla.String, default="SAME") - group = sqla.Column(sqla.Integer, sqla.ForeignKey("cre.id"), primary_key=True) - cre = sqla.Column(sqla.Integer, sqla.ForeignKey("cre.id"), primary_key=True) + group = sqla.Column(sqla.Integer, sqla.ForeignKey( + "cre.id"), primary_key=True) + cre = sqla.Column(sqla.Integer, sqla.ForeignKey( + "cre.id"), primary_key=True) class Links(BaseModel): # type: ignore __tablename__ = "links" type = sqla.Column(sqla.String, default="SAM") - cre = sqla.Column(sqla.Integer, sqla.ForeignKey("cre.id"), primary_key=True) + cre = sqla.Column(sqla.Integer, sqla.ForeignKey( + "cre.id"), primary_key=True) standard = sqla.Column( sqla.Integer, sqla.ForeignKey("standard.id"), primary_key=True ) @@ -82,7 +85,7 @@ def __init__(self) -> None: def __load_cre_graph(self) -> nx.Graph: - graph = nx.Graph() + graph = nx.DiGraph() for il in self.session.query(InternalLinks).all(): graph.add_node(f"CRE: {il.group}") graph.add_node(f"CRE: {il.cre}") @@ -160,24 +163,28 @@ def get_max_internal_connections(self) -> int: return 0 def find_cres_of_cre(self, cre: CRE) -> Optional[List[CRE]]: - - """returns the higher level CREs of the cre or none if no higher level cres link to it""" - cre_id = self.session.query(CRE.id).filter(CRE.name == cre.name).first() + """returns the higher level CREs of the cre or none + if no higher level cres link to it""" + cre_id = self.session.query(CRE.id).filter( + CRE.name == cre.name).first() links = ( - self.session.query(InternalLinks).filter(InternalLinks.cre == cre_id).all() + self.session.query(InternalLinks).filter( + InternalLinks.cre == cre_id).all() ) if links: result = [] for link in links: result.append( - self.session.query(CRE).filter(CRE.id == link.group).first() + self.session.query(CRE).filter( + CRE.id == link.group).first() ) return result return None def find_cres_of_standard(self, standard: Standard) -> Optional[List[CRE]]: - """returns the CREs that link to this standard or none if none link to it""" + """returns the CREs that link to this standard or none + if none link to it""" if not standard.id: standard = ( self.session.query(Standard) @@ -196,17 +203,20 @@ def find_cres_of_standard(self, standard: Standard) -> Optional[List[CRE]]: return None result: List[CRE] = [] for link in ( - self.session.query(Links).filter(Links.standard == standard.id).all() + self.session.query(Links).filter( + Links.standard == standard.id).all() ): - result.append(self.session.query(CRE).filter(CRE.id == link.cre).first()) + result.append(self.session.query( + CRE).filter(CRE.id == link.cre).first()) return result or None def get_by_tags(self, tags: List[str]) -> List[cre_defs.Document]: - """Returns the cre_defs.Documents and their Links that are tagged with ALL of the tags provided """ - # TODO: (spyros), when we have useful tags this needs to be refactored so both standards and CREs become the same query and it gets paginated + # TODO: (spyros), when we have useful tags this needs to be refactored + # so both standards and CREs become the same query + # and it gets paginated standards_where_clause = [] cre_where_clause = [] documents = [] @@ -218,7 +228,8 @@ def get_by_tags(self, tags: List[str]) -> List[cre_defs.Document]: standards_where_clause.append( sqla.and_(Standard.tags.like("%{}%".format(tag))) ) - cre_where_clause.append(sqla.and_(CRE.tags.like("%{}%".format(tag)))) + cre_where_clause.append( + sqla.and_(CRE.tags.like("%{}%".format(tag)))) standards = Standard.query.filter(*standards_where_clause).all() or [] for standard in standards: @@ -233,7 +244,8 @@ def get_by_tags(self, tags: List[str]) -> List[cre_defs.Document]: documents.extend(standard) else: logger.fatal( - "db.get_standard returned None for Standard %s:%s that exists, BUG!" + "db.get_standard returned None for" + "Standard %s:%s that exists, BUG!" % (standard.name, standard.section) ) @@ -259,7 +271,8 @@ def get_standards_with_pagination( page: int = 0, items_per_page: Optional[int] = None, ) -> Tuple[ - Optional[int], Optional[List[cre_defs.Standard]], Optional[List[Standard]] + Optional[int], Optional[List[cre_defs.Standard] + ], Optional[List[Standard]] ]: standards = [] @@ -270,13 +283,15 @@ def get_standards_with_pagination( if dbstands.items: for dbstand in dbstands.items: standard = StandardFromDB(dbstandard=dbstand) - linked_cres = Links.query.filter(Links.standard == dbstand.id).all() + linked_cres = Links.query.filter( + Links.standard == dbstand.id).all() for dbcre_link in linked_cres: dbcre = CRE.query.filter(CRE.id == dbcre_link.cre).first() if dbcre: standard.add_link( cre_defs.Link( - ltype=dbcre_link.type, document=CREfromDB(dbcre) + ltype=dbcre_link.type, document=CREfromDB( + dbcre) ) ) standards.append(standard) @@ -302,13 +317,15 @@ def get_standards( if dbstands: for dbstand in dbstands: standard = StandardFromDB(dbstandard=dbstand) - linked_cres = Links.query.filter(Links.standard == dbstand.id).all() + linked_cres = Links.query.filter( + Links.standard == dbstand.id).all() for dbcre_link in linked_cres: standard.add_link( cre_defs.Link( ltype=dbcre_link.type, document=CREfromDB( - CRE.query.filter(CRE.id == dbcre_link.cre).first() + CRE.query.filter( + CRE.id == dbcre_link.cre).first() ), ) ) @@ -329,8 +346,6 @@ def __get_standards_query__( page: int = 0, items_per_page: Optional[int] = None, ) -> sqla.Query: - - total_pages = 0 query = Standard.query.filter(Standard.name == name) if section: query = query.filter(Standard.section == section) @@ -348,7 +363,7 @@ def get_CRE( cre = None query = CRE.query if not external_id and not name: - logger.error(f"You need to search by either external_id or name") + logger.error("You need to search by either external_id or name") return None if external_id: @@ -360,12 +375,15 @@ def get_CRE( if dbcre: cre = CREfromDB(dbcre) else: - logger.warning("CRE %s:%s does not exist in the db" % (external_id, name)) + logger.warning("CRE %s:%s does not exist in the db" % + (external_id, name)) return None - # todo figure a way to return both the Standard and the link_type for that link - linked_standards = self.session.query(Links).filter(Links.cre == dbcre.id).all() + # todo figure a way to return both the Standard + # and the link_type for that link + linked_standards = self.session.query( + Links).filter(Links.cre == dbcre.id).all() for ls in linked_standards: cre.add_link( cre_defs.Link( @@ -382,7 +400,8 @@ def get_CRE( internal_links = ( self.session.query(InternalLinks) .filter( - sqla.or_(InternalLinks.cre == dbcre.id, InternalLinks.group == dbcre.id) + sqla.or_(InternalLinks.cre == dbcre.id, + InternalLinks.group == dbcre.id) ) .all() ) @@ -397,7 +416,8 @@ def get_CRE( res = q.filter(CRE.id == il.cre).first() cre.add_link( cre_defs.Link( - document=CREfromDB(res), ltype=cre_defs.LinkTypes.from_str(il.type) + document=CREfromDB(res), + ltype=cre_defs.LinkTypes.from_str(il.type) ) ) @@ -445,7 +465,8 @@ def export(self, dir: str) -> List[cre_defs.Document]: cr = CREfromDB(internal_doc) if len(standard.name) != 0: cr.add_link( - cre_defs.Link(ltype=type, document=StandardFromDB(standard)) + cre_defs.Link( + ltype=type, document=StandardFromDB(standard)) ) docs[cr.name] = cr @@ -454,7 +475,8 @@ def export(self, dir: str) -> List[cre_defs.Document]: ustand = StandardFromDB(ustandard) docs[ "%s-%s:%s:%s" - % (ustand.name, ustand.section, ustand.subsection, ustand.version) + % (ustand.name, ustand.section, + ustand.subsection, ustand.version) ] = ustand for _, doc in docs.items(): @@ -469,33 +491,27 @@ def export(self, dir: str) -> List[cre_defs.Document]: def add_cre(self, cre: cre_defs.CRE) -> CRE: entry: CRE - - if cre.id != None: - entry = ( - self.session.query(CRE) - .filter(CRE.name == cre.name, CRE.external_id == cre.id) - .first() - ) + query: sqla.Query = self.session.query( + CRE).filter(CRE.name == cre.name) + if cre.id: + entry = query.filter(CRE.external_id == cre.id).first() else: - entry = ( - self.session.query(CRE) - .filter(CRE.name == cre.name, CRE.description == cre.description) - .first() - ) + entry = query.filter(CRE.description == cre.description).first() if entry is not None: logger.debug("knew of %s ,skipping" % cre.name) return entry else: logger.debug("did not know of %s ,adding" % cre.name) - entry = CRE(description=cre.description, name=cre.name, external_id=cre.id) + entry = CRE(description=cre.description, + name=cre.name, external_id=cre.id, + tags=','.join([str(t) for t in cre.tags])) self.session.add(entry) self.session.commit() self.cre_graph.add_node(f"CRE: {entry.id}") return entry def add_standard(self, standard: cre_defs.Standard) -> Standard: - entry: Standard = Standard.query.filter( sqla.and_( Standard.name == standard.name, @@ -510,13 +526,15 @@ def add_standard(self, standard: cre_defs.Standard) -> Standard: self.session.commit() return entry else: - logger.debug(f"did not know of {standard.name}:{standard.section} ,adding") + logger.debug( + f"did not know of {standard.name}:{standard.section} ,adding") entry = Standard( name=standard.name, section=standard.section, subsection=standard.subsection, link=standard.hyperlink, version=standard.version, + tags=','.join([str(t) for t in standard.tags]) ) self.session.add(entry) self.session.commit() @@ -529,10 +547,14 @@ def __introduces_cycle(self, node_from: str, node_to: str) -> Any: existing_cycle = nx.find_cycle(self.cre_graph) if existing_cycle: logger.fatal( - f"Existing graph contains cycle, this not a recoverable error, manual database actions are required {existing_cycle}" + "Existing graph contains cycle," + "this not a recoverable error," + f" manual database actions are required {existing_cycle}" ) raise ValueError( - f"Existing graph contains cycle, this not a recoverable error, manual database actions are required {existing_cycle}" + "Existing graph contains cycle," + "this not a recoverable error," + f" manual database actions are required {existing_cycle}" ) except nx.exception.NetworkXNoCycle: pass # happy path, we don't want cycles @@ -544,74 +566,49 @@ def __introduces_cycle(self, node_from: str, node_to: str) -> Any: return False def add_internal_link( - self, group: CRE, cre: CRE, type: cre_defs.LinkTypes = cre_defs.LinkTypes.Same + self, group: CRE, cre: CRE, + type: cre_defs.LinkTypes = cre_defs.LinkTypes.Same ) -> None: - if cre.id == None: - if cre.external_id == None: - cre = ( - self.session.query(CRE) - .filter( - sqla.and_( - CRE.name == cre.name, CRE.description == cre.description - ) - ) - .first() - ) + if cre.id is None: + if cre.external_id is None: + cre = (self.session.query(CRE) + .filter(sqla.and_( + CRE.name == cre.name, + CRE.description == cre.description)).first()) else: - cre = ( - self.session.query(CRE) - .filter( - sqla.and_( - CRE.name == cre.name, CRE.external_id == cre.external_id - ) - ) - .first() - ) - if group.id == None: - if group.external_id == None: - group = ( - self.session.query(CRE) - .filter( - sqla.and_( - CRE.name == group.name, CRE.description == group.description - ) - ) - .first() - ) + cre = (self.session.query(CRE) + .filter(sqla.and_( + CRE.name == cre.name, + CRE.external_id == cre.external_id)).first()) + if group.id is None: + if group.external_id is None: + group = (self.session.query(CRE) + .filter(sqla.and_( + CRE.name == group.name, + CRE.description == group.description)).first()) else: - group = ( - self.session.query(CRE) - .filter( - sqla.and_( - CRE.name == group.name, CRE.external_id == group.external_id - ) - ) - .first() - ) - if cre == None or group == None: + group = (self.session.query(CRE) + .filter(sqla.and_( + CRE.name == group.name, + CRE.external_id == group.external_id)).first()) + if cre is None or group is None: logger.fatal( - "Tried to insert internal mapping with element that doesn't exist in db, this looks like a bug" - ) - + "Tried to insert internal mapping with element" + " that doesn't exist in db, this looks like a bug") return None entry = ( self.session.query(InternalLinks) - .filter( - sqla.or_( - sqla.and_( - InternalLinks.cre == group.id, InternalLinks.group == cre.id - ), - sqla.and_( - InternalLinks.cre == cre.id, InternalLinks.group == group.id - ), - ) - ) - .first() - ) - if entry != None: - logger.debug(f"knew of internal link {cre.name} == {group.name} ,updating") + .filter(sqla.or_(sqla.and_( + InternalLinks.cre == group.id, + InternalLinks.group == cre.id), + sqla.and_( + InternalLinks.cre == cre.id, + InternalLinks.group == group.id))).first()) + if entry is not None: + logger.debug( + f"knew of internal link {cre.name} == {group.name} ,updating") entry.type = type.value self.session.commit() @@ -619,20 +616,24 @@ def add_internal_link( else: logger.debug( - f"did not know of internal link {group.external_id}:{group.name} == {cre.external_id}:{cre.name} ,adding" + "did not know of internal link" + f" {group.external_id}:{group.name}" + f" == {cre.external_id}:{cre.name} ,adding" ) - cycle = self.__introduces_cycle(f"CRE: {group.id}", f"CRE: {cre.id}") + cycle = self.__introduces_cycle( + f"CRE: {group.external_id}", f"CRE: {cre.external_id}") if not cycle: self.session.add( InternalLinks(type=type.value, cre=cre.id, group=group.id) ) self.session.commit() - self.cre_graph.add_edge(f"CRE: {group.id}", f"CRE: {cre.id}") + self.cre_graph.add_edge(f"CRE: {group.external_id}", f"CRE: {cre.external_id}") else: logger.warning( - f"A link between CREs {group.external_id} and {cre.external_id} would introduce a cycle, skipping" + f"A link between CREs {group.external_id} and" + f" {cre.external_id} " + f"would introduce cycle {cycle}, skipping" ) - logger.debug(cycle) def add_link( self, @@ -641,58 +642,59 @@ def add_link( type: cre_defs.LinkTypes = cre_defs.LinkTypes.Same, ) -> None: - if cre.id == None: + if cre.id is None: cre = ( - self.session.query(CRE).filter(sqla.and_(CRE.name == cre.name)).first() + self.session.query(CRE).filter( + sqla.and_(CRE.name == cre.name)).first() ) - if standard.id == None: + if standard.id is None: standard = ( self.session.query(Standard) - .filter( - sqla.and_( + .filter(sqla.and_( Standard.name == standard.name, Standard.section == standard.section, Standard.subsection == standard.subsection, - Standard.version == standard.version, - ) - ) - .first() - ) + Standard.version == standard.version)).first()) entry = ( self.session.query(Links) - .filter(sqla.and_(Links.cre == cre.id, Links.standard == standard.id)) - .first() - ) + .filter(sqla.and_(Links.cre == cre.id, + Links.standard == standard.id)).first()) if entry: logger.debug( - f"knew of link {standard.name}:{standard.section}=={cre.name} ,updating" - ) + f"knew of link {standard.name}:{standard.section}" + f"=={cre.name} ,updating") entry.type = type.value self.session.commit() return else: - # Since multiple CREs need to link to the same standard, cycles are inevitable - # cycle = self.__introduces_cycle( - # f"CRE: {cre.id}", f"Standard: {str(standard.id)}") - # if not cycle: - logger.debug( - f"did not know of link {standard.id}){standard.name}:{standard.section}=={cre.id}){cre.name} ,adding" - ) - self.session.add(Links(type=type.value, cre=cre.id, standard=standard.id)) - self.cre_graph.add_edge(f"CRE: {cre.id}", f"Standard: {str(standard.id)}") - # else: - # logger.warning(f"A link between CRE {cre.external_id} and Standard: {standard.name}:{standard.section}:{standard.subsection}" - # " would introduce a cycle, skipping") - # logger.debug(f"{cycle}") + cycle = None # self.__introduces_cycle( + # f"CRE: {cre.external_id}", f"Standard: {str(standard.id)}") + if not cycle: + logger.debug( + f"did not know of link {standard.id})" + f"{standard.name}:{standard.section}=={cre.id}){cre.name}" + " ,adding" + ) + self.session.add( + Links(type=type.value, cre=cre.id, standard=standard.id)) + self.cre_graph.add_edge( + f"CRE: {cre.external_id}", f"Standard: {str(standard.id)}") + else: + logger.warning(f"A link between CRE {cre.external_id}" + f" and Standard: {standard.name}" + f":{standard.section}:{standard.subsection}" + f" would introduce cycle {cycle}, skipping") + logger.debug(f"{cycle}") self.session.commit() def find_path_between_standards( self, standard_source_id: int, standard_destination_id: int ) -> bool: - """One line method to return paths in a graph, this starts getting complicated when we have more linktypes""" + """One line method to return paths in a graph, + this starts getting complicated when we have more linktypes""" res: bool = nx.has_path( - self.cre_graph, + self.cre_graph.to_undirected(), "Standard: " + str(standard_source_id), "Standard: " + str(standard_destination_id), ) @@ -700,15 +702,16 @@ def find_path_between_standards( return res def gap_analysis(self, standards: List[str]) -> List[cre_defs.Standard]: - - """Since the CRE structure is a tree-like graph with leaves being standards we can find the paths between standards - find_path_between_standards() is a graph-path-finding method + """ Since the CRE structure is a tree-like graph with + leaves being standards we can find the paths between standards + find_path_between_standards() is a graph-path-finding method """ processed_standards = [] dbstands = [] for stand in standards: dbstands.extend( - self.session.query(Standard).filter(Standard.name == stand).all() + self.session.query(Standard).filter( + Standard.name == stand).all() ) for standard in dbstands: @@ -716,7 +719,8 @@ def gap_analysis(self, standards: List[str]) -> List[cre_defs.Standard]: for other_standard in dbstands: if standard.id == other_standard.id: continue - if self.find_path_between_standards(standard.id, other_standard.id): + if self.find_path_between_standards(standard.id, + other_standard.id): working_standard.add_link( cre_defs.Link(document=StandardFromDB(other_standard)) ) @@ -745,8 +749,7 @@ def StandardFromDB(dbstandard: Standard) -> cre_defs.Standard: subsection=dbstandard.subsection, hyperlink=dbstandard.link, tags=tags, - version=dbstandard.version, - ) + version=dbstandard.version) def CREfromDB(dbcre: CRE) -> cre_defs.CRE: @@ -755,5 +758,5 @@ def CREfromDB(dbcre: CRE) -> cre_defs.CRE: if dbcre.tags: tags = set(dbcre.tags.split(",")) return cre_defs.CRE( - name=dbcre.name, description=dbcre.description, id=dbcre.external_id, tags=tags - ) + name=dbcre.name, description=dbcre.description, + id=dbcre.external_id, tags=tags) diff --git a/application/tests/db_test.py b/application/tests/db_test.py index 02b5c399e..8c3ead4db 100644 --- a/application/tests/db_test.py +++ b/application/tests/db_test.py @@ -81,6 +81,7 @@ def test_get_by_tags(self) -> None: section="tagsstand", name="tagsstand", link="https://example.com", + version="", tags="tag1, dots.5.5, space 6 , several spaces and newline 7 \n", ) standard = db.StandardFromDB(dbstandard) @@ -235,7 +236,6 @@ def test_CREfromDB(self) -> None: def test_add_cre(self) -> None: original_desc = str(uuid.uuid4()) name = str(uuid.uuid4()) - gname = str(uuid.uuid4()) c = defs.CRE( id="cid", doctype=defs.Credoctypes.CRE, description=original_desc, name=name @@ -264,9 +264,9 @@ def test_add_cre(self) -> None: self.collection.session.query(db.CRE).filter(db.CRE.name == c.name).first() ) # ensure original description - self.assertEqual(dbcre.description, str(original_desc)) + self.assertEqual(dbcre.description, original_desc) # ensure original description - self.assertEqual(newCRE.description, str(original_desc)) + self.assertEqual(newCRE.description, original_desc) def test_add_standard(self) -> None: original_section = str(uuid.uuid4()) diff --git a/application/utils/parsers.py b/application/utils/parsers.py index 2f8785461..772bb7b41 100644 --- a/application/utils/parsers.py +++ b/application/utils/parsers.py @@ -1,5 +1,6 @@ import logging import re +from copy import copy from pprint import pprint from typing import Any, Dict, List, Optional, Tuple @@ -26,6 +27,7 @@ def is_empty(value: Optional[str]) -> bool: or value.lower() == "no" or value.lower() == "tbd" or value.lower() == "see higher level topic" + or value.lower() == "tbd" ) @@ -75,7 +77,8 @@ def parse_export_format(lfile: List[Dict[str, Any]]) -> Dict[str, defs.Document] internal_mapping: defs.Document cres: Dict[str, defs.Document] = {} lone_standards: Dict[str, defs.Standard] = {} - link_types_regexp = re.compile(defs.ExportFormat.linked_cre_name_key("(\d+)")) + link_types_regexp = re.compile( + defs.ExportFormat.linked_cre_name_key("(\d+)")) max_internal_cre_links = len( set([k for k, v in lfile[0].items() if link_types_regexp.match(k)]) ) @@ -89,7 +92,8 @@ def parse_export_format(lfile: List[Dict[str, Any]]) -> Dict[str, defs.Document] st.document.name + ":" + st.document.section ] = st.document else: - logger.fatal(f"Got a {type(st.document)} expected Standard") + logger.fatal( + f"Got a {type(st.document)} expected Standard") else: # cre -> standards, other cres name = mapping.pop(defs.ExportFormat.cre_name_key()) id = mapping.pop(defs.ExportFormat.cre_id_key()) @@ -122,9 +126,11 @@ def parse_export_format(lfile: List[Dict[str, Any]]) -> Dict[str, defs.Document] # add the CRE links for i in range(0, max_internal_cre_links): - name = mapping.pop(defs.ExportFormat.linked_cre_name_key(str(i))) + name = mapping.pop( + defs.ExportFormat.linked_cre_name_key(str(i))) if not is_empty(name): - id = mapping.pop(defs.ExportFormat.linked_cre_id_key(str(i))) + id = mapping.pop( + defs.ExportFormat.linked_cre_id_key(str(i))) link_type = mapping.pop( defs.ExportFormat.linked_cre_link_type_key(str(i)) ) @@ -194,7 +200,8 @@ def parse_uknown_key_val_spreadsheet( else: # pop is important here, if the primary standard is not removed, it will end up linking to itself primary_standard = defs.Standard( - name=main_standard_name, section=mapping.pop(main_standard_name) + name=main_standard_name, section=mapping.pop( + main_standard_name) ) for key, value in mapping.items(): @@ -205,7 +212,8 @@ def parse_uknown_key_val_spreadsheet( ): linked_standard = defs.Standard(name=key, section=value) standards_registered.append(f"{key}-{value}") - primary_standard.add_link(defs.Link(document=linked_standard)) + primary_standard.add_link( + defs.Link(document=linked_standard)) if primary_standard: standards[sname] = primary_standard return standards @@ -228,7 +236,8 @@ def parse_v1_standards( # raise EnvironmentError( # "same cre name %s different id? %s %s" % (cre.name, cre.id, id)) else: - cre = defs.CRE(description=cre_mapping.pop("Description"), name=name, id=id) + cre = defs.CRE(description=cre_mapping.pop( + "Description"), name=name, id=id) asvs_tags = [] if cre_mapping.pop("ASVS-L1") == "X": asvs_tags.append("L1") @@ -253,7 +262,8 @@ def parse_v1_standards( if not is_empty(cre_mapping.get("CWE")): cre.add_link( defs.Link( - document=defs.Standard(name="CWE", section=cre_mapping.pop("CWE")) + document=defs.Standard( + name="CWE", section=cre_mapping.pop("CWE")) ) ) @@ -306,7 +316,8 @@ def parse_v1_standards( if not is_empty(cre_mapping.get("OPC")): cre.add_link( defs.Link( - document=defs.Standard(name="OPC", section=cre_mapping.pop("OPC")) + document=defs.Standard( + name="OPC", section=cre_mapping.pop("OPC")) ) ) @@ -321,7 +332,8 @@ def parse_v1_standards( if not is_empty(cre_mapping.get("WSTG")): cre.add_link( defs.Link( - document=defs.Standard(name="WSTG", section=cre_mapping.pop("WSTG")) + document=defs.Standard( + name="WSTG", section=cre_mapping.pop("WSTG")) ) ) if not is_empty(cre_mapping.get("SIG ISO 25010")): @@ -369,7 +381,8 @@ def parse_v0_standards(cre_file: List[Dict[str, str]]) -> Dict[str, defs.CRE]: cre: defs.CRE linked_standard: defs.Standard if not is_empty(cre_mapping.get("CRE-ID-lookup-from-taxonomy-table")): - existing = cres.get(cre_mapping["CRE-ID-lookup-from-taxonomy-table"]) + existing = cres.get( + cre_mapping["CRE-ID-lookup-from-taxonomy-table"]) if existing: cre = existing name = cre_mapping.get("name") @@ -387,7 +400,8 @@ def parse_v0_standards(cre_file: List[Dict[str, str]]) -> Dict[str, defs.CRE]: if cre_mapping.get("ID-taxonomy-lookup-from-ASVS-mapping"): linked_standard = defs.Standard( name="ASVS", - section=cre_mapping.pop("ID-taxonomy-lookup-from-ASVS-mapping"), + section=cre_mapping.pop( + "ID-taxonomy-lookup-from-ASVS-mapping"), subsection=cre_mapping.pop("Item"), ) @@ -406,7 +420,8 @@ def parse_hierarchical_export_format( cre_file: List[Dict[str, str]] ) -> Dict[str, defs.CRE]: cres: Dict[str, defs.CRE] = {} - max_hierarchy = len([key for key in cre_file[0].keys() if "CRE hierarchy" in key]) + max_hierarchy = len( + [key for key in cre_file[0].keys() if "CRE hierarchy" in key]) for mapping in cre_file: cre: defs.CRE name: str = "" @@ -414,7 +429,8 @@ def parse_hierarchical_export_format( higher_cre: int = 0 # a CRE's name is the last hierarchy item which is not blank for i in range(max_hierarchy, 0, -1): - key = [key for key in mapping if key.startswith("CRE hierarchy %s" % i)][0] + key = [key for key in mapping if key.startswith( + "CRE hierarchy %s" % i)][0] if not is_empty(mapping.get(key)): if current_hierarchy == 0: name = mapping.pop(key) @@ -423,7 +439,8 @@ def parse_hierarchical_export_format( higher_cre = i break if is_empty(name): - logger.warning("Found entry without a cre name, skipping") + logger.warning(f'Found entry with ID {mapping.get("CRE ID")}' + ' without a cre name, skipping') continue if name in cres.keys(): @@ -452,7 +469,8 @@ def parse_hierarchical_export_format( ): if not cres.get(other_cre): logger.warning( - "%s linking to not yet existent cre %s" % (cre.name, other_cre) + "%s linking to not yet existent cre %s" % ( + cre.name, other_cre) ) new_cre = defs.CRE(name=other_cre) cres[new_cre.name] = new_cre @@ -482,7 +500,8 @@ def parse_hierarchical_export_format( document=defs.Standard( name="Top10 2017", section=mapping.pop("Standard Top10 2017"), - hyperlink=mapping.pop("Standard Top10 Hyperlink").strip(), + hyperlink=mapping.pop( + "Standard Top10 Hyperlink").strip(), ) ) ) @@ -491,7 +510,8 @@ def parse_hierarchical_export_format( defs.Link( document=defs.Standard( name="OPC", - section=mapping.pop("Standard OPC (ASVS source)").strip(), + section=mapping.pop( + "Standard OPC (ASVS source)").strip(), ) ) ) @@ -516,7 +536,8 @@ def parse_hierarchical_export_format( defs.Link( document=defs.Standard( name="CWE", - section=str(mapping.pop("Standard CWE (from ASVS)")).strip(), + section=str(mapping.pop( + "Standard CWE (from ASVS)")).strip(), ) ) ) @@ -549,28 +570,38 @@ def parse_hierarchical_export_format( cs = str(mapping.pop("Standard Cheat_sheets")) if "," in cs: for csc in set(cs.split(",")): - cheatsheet = defs.Standard(name="Cheat_sheets", section=csc.strip()) + cheatsheet = defs.Standard( + name="Cheat_sheets", section=csc.strip()) cre.add_link(defs.Link(document=cheatsheet)) # link CRE to a higher level one - if f"CRE hierarchy {str(higher_cre)}" in mapping: - if cres.get(mapping[f"CRE hierarchy {str(higher_cre)}"]): - cre_hi = cres[mapping[f"CRE hierarchy {str(higher_cre)}"]] - - existing_link = [ - c - for c in cre_hi.links - if c.document.doctype == defs.Credoctypes.CRE - and c.document.name == name - ] - if existing_link: - cre_hi.links[ - cre_hi.links.index(existing_link[0]) - # ugliest way ever to write "update the object in that pointer" - ].document = cre - else: - cre_hi.add_link(defs.Link(document=cre)) - cres[cre_hi.name] = cre_hi + + if higher_cre and cres.get(mapping[f"CRE hierarchy {str(higher_cre)}"]): + cre_hi = cres[mapping[f"CRE hierarchy {str(higher_cre)}"]] + + existing_link = [ + c + for c in cre_hi.links + if c.document.doctype == defs.Credoctypes.CRE + and c.document.name == cre.name + ] + # pprint( + # f'state:{higher_cre},\n {cre_hi},\n\n {cre}, \n\n{existing_link}') + # input() + shallow_copy = copy(cre) # we only need a shallow copy here + shallow_copy.links = [] + # there is no need to capture the entirety of the cre tree, we just need to register this shallow relation + # the "cres" dict should contain the rest of the info + if existing_link: + cre_hi.links[ + cre_hi.links.index(existing_link[0]) + # ugliest way ever to write "update the object in that pointer" + ].document = shallow_copy + else: + cre_hi.add_link(defs.Link(document=shallow_copy)) + cres[cre_hi.name] = cre_hi + else: + pass # add the cre to cres and make the connection if cre: cres[cre.name] = cre return cres From 1530ae3f35f7cb03df671779b8ed716a4cc13a78 Mon Sep 17 00:00:00 2001 From: northdpole Date: Mon, 30 Aug 2021 23:27:09 +0100 Subject: [PATCH 3/6] debugging and auto-deploy changes --- Procfile | 2 +- cres/db.sqlite | Bin 327680 -> 196608 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/Procfile b/Procfile index 52d23bfd2..4c55e4074 100644 --- a/Procfile +++ b/Procfile @@ -1 +1 @@ -web: gunicorn cre:app --log-file=- \ No newline at end of file +web: cp cres/db.sqlite . && gunicorn cre:app --log-file=- \ No newline at end of file diff --git a/cres/db.sqlite b/cres/db.sqlite index c093ed3b235f425f9aee616f6a25b07018011c27..e64e59ad94ce2732a9343d461fede76af02b5c6d 100644 GIT binary patch literal 196608 zcmeFa349#Iu|GbuJA2K}>|$)=3)|~MzVJ#rv!^h&k>yLiZTY}9LRm>GYq7K|c2~9q z0WvECxq)0HkdOy?IUyHG2sy}ol7xiZCpqBdJ`OY)NZzcokC>`0JA`29Zb_xrE- zAggM+t9z=etE#Jes=N2^D%J|I!E$9JUyCKV^EjU8E{(-FF7#WD;}ZDa`VsI4{crv7 z)*ny(FKD!G{FWU3FD@89#YNs0{j_{fRsC16^T3vlgIi(;J2vgw64Oz!Rbr?% zK3a$!?l{o7z2m^zm>BA>6k=U_4sO}D zfupgVTaLz7fx_CDReUwo-MaU{mac7k=rKKA9XqgP>y`ss_H=IPj!}E7iUX6%F#^uQ z7E-Svu3jDV&sjf*=Zd9)!kOw-!&q+g=ErJf9q!d%u~*Um329gQ0&^BFmrltBdY7qq*T5c=z*>6qNpEdF{HHiX^_|S2)`^qi>NdZB zPUpg>;tR@|tg-$IXh*$)IWuSS6Z0(Y;E~|w39+L%wEz^()C!eSez+IU9l|tFsP(a+PLYomXO{vrD7=+B~$M<0!TGx}u%O^=#CO%60U(Bwdq15FMzInd-llLJi- zG&#`ZK$8Pa4m3INzlZ}Dot4p>WfMp7J2tTtzZcbMpM8Ekj^A^%Dt@1*wc~g66n;f6 z@kA?}H|oLP+;Xh^&l-Oc*!*d7pvi$I2bvsca-hk9CI^}vXmX&*fhGr<9B6Xje=`T7 zb?#cdfBcMpwwo88^tWj1WKZW%Az$mQ4iyTu>QJpVTD`cft)FlPs!%Bws;%YI`RZtE zxpKn!sO?a-Q0d)QDW1yrkK^BR%{WQWYmn?FlC49vkzwvhbn5&`9Xmgd9;}x6XV8O= zvD#3fR4ex9=?KH5hW%)B#th%=d9tUY`*8Q+bgR;;@at*+-xqz1IuytL|C7;QMSp65 zglhgYInd-llLJi-G&#`ZK$8Pa4m3H?LP9Y^U>eY`y`Bi{@-}D=36v5(Bwdq15FMzInd-llLJi-G&#`ZK$8Pa4m3H?07{N`3ie-r(Y@h5@JpC$*I9B6W& z$$=&ZnjC0ypvi$I2bvsca-hk9CI^}v_}|TeC8FT*czBt=*?ST_ou`A`6Z|^Q9)NQV z@J8-6{Ax-Vu#tO&i#`_pVDz@=y2xK5KZv|1^8Cp0NID|QACqsF&&WCX0_n%n%cTKn zvotgOi||{*$HP(aUhz5N{?M;N9}nFY+82C0czf`Q;GDp>1Gfh@_&@4@k^g|d%`f;K z@x9-7hp*;~2p<(*Aan@4_d)M~*XOy@vyA^d{~G>EelD6ncRyP;`nd&i|H`zQilR*Vhi`)kMq(U>dZKw)$^kL(Y%TE73}z6}A8(PqfWR3@HD zC3cm|C&xx9M??jeL&U0MgM-EXqMjWhRzVx(5k0FzH9t(LBu0nFs#1XhWF?`*RVC{p*q<-O`U)}hasb&RkSU^E>Mz7Ep(?xOw33YHQfXHeN?{MO zL>NQG6GLcp)VR2!Fwj{UAFY*7RPv)k|{c}RYtzly zL86!eMJKkTB|#Zq63RawsX@qsDe+G`R8FaGNzjX~movF!Jdw;C0fUAM)oN_GSUPD< zK@eNmM#W~XRMlKOomLL+>NbfC>Cc)KBtBbZG}TqoX=N~Yu4gxbk6 z+>m@0O1jA5PiKEtucazm!1z==n@l!VY1ENRE~27oS3P%05%iU}E+|=rMbSij;^4vK2$VoeBhm4YInLsveQESv8(a=k}D@6I3ce?Sk2c z29D`jeb8Fp35YlA|~lLs%NTv%q)F|n$l0=FP$eV zr4ClcFk1#t79!hUpx(zu%Q{y{hV%VU6jh8Q6kK_@x@9?4zE;K@h$ofAfiiTdp>*w} zM;KUC(Fu)>qDz##sBI9pB_WlON$=uiLhql7M`;)z^h zH!?vDn>NI1T`vf$&|j>QRKW{~9Ximp*5t=9nXO8B3|h(<&`P0N9s?Vz9s9c4P8a$x z9u+bu)h#iDaY-mKHK#ZeMHQfvh}G3`3dkIBrKs_AM%hY69lnW+YOGow9;2~Yv%u(lPRT;y<~A2f zkMZs8AS&=`$t>CfG>61itEWPh^UhTYwpYMm4puU70$>Y>bmftHVTRi=2SIO=Obf zGMkzJGG9f;JP0osMOuEjNJZDlX(W+Lq;gc0+;ZL1BJ+bZc+g?-5S7|3D-eH7fn7up zBMHkj1~+#cFA9sAC-bEjUmY~s*PUbq3oaCI>^9TRs{=;S6s>boSW2<3n)=#ShTj_(I0ChktI(CwO|xywtaL*-X=Ci-$9ZUyFwd zt=Bz-bSCGJkcL5Cz*Di+aPRb0VPi2`|8M2q$VG3C?udLla&zQj`3v%(9Fx8;-6CYldLcA+mINM`J%d_=!d(g3H0Vk zIfJR8=F*$ZjE?;KFloY9(P zsi>VQe)W~lpnqLf2FkUUb$6$)p$0owCKFh#DCvC_eOBAEofrpC8)gV&XZvQGuBK`| zE0qlTnO2a=a}>!u;n2brG*`SV(IqB~P88DJ&~)24(bzBNVAs;=Z z3BzAIR5GmgK&%ta->eEw-F3jv{3X*#i$q6*d^uR2A~ zI^|pvhAji<1*R8~5sOMp$6PTmvw9zBtHUwPn zoMY9Wt5Vs1ISa#(O{5Q@QPVeX@MqbVnbu#DJ^ucG#INEOZpPlu16*T z{BIkj>ifYz#N!lo3O63Bf6ByKGQ6W|qD&RK#oSMHQO74rf2zz$Qvy>c4wl}V(xQm}$)4x;bkiE@(4AA*yVj%RY@1R0Y+ z_l>c>fHP#Kcg>f|Bj9nNy8KG2g5Z}P5J`66rOA!OQ*tA%wc4U0m0CSBmqtfY$xRJI zv3YOzfgyT+eG4XKJfSLkV2{d`ljdr+2tVAQ22MFl5De((aCuyJa*fzlgFm(A1kr43 z$wIm1NbspJhND&7IM ztpoIIudE`Wu9{W5nGZsNAl;89XM~pUqhpm5g@H^zmG70a@Y)MBUMdjUft1qa8hcOb9J-E0|= zN%%qOE<-M{Ceqy;r^nO=odM?w+$qBP=-q*x=Su3Pdg?l-!i=oahk(GzhO)D0!6ZXn zQILRAK_k>gGF@GHln8Xl3b}4s_@)?Gi-Zvo#~5NsHn90JDtL{Y#@Z!A(ZxdlNl-cg znnrNJS;r@njG5j4kA{eQ11#@ZDA)?WVfPo4}BDv3M8QNXnksw=QY)GUJ zQpp~fq&=NXSS2k&dIdd@jw4IX*2w2(rVF>wZH zLqgvGuon47*u&U5S&O)Ajfy$6&Bg=NrK>P;vvI^NyP(_1s_fgebMsbpEzLvX@*bIf2;dS(z1HFaBOQs{$Czjz-} zK%|PIWm&k2>>bPkvZc>Zo%E z6&#n7`T{q1q>w)uTh%|DhcYglsjYUd?Pz;}grYnM&loaf$A30<5s|B~dP~I>HFNOk z_I{?^LEE_9AOKAi&#B3$B2YdJr&rg|2t2`)89*$45PKgZh0WWD0Omi|9SB8qkM&ji zi+$MpfymS1ZBoK{Ykg1a{p#50D0cq9ysf%~tV56*A(FHT*OWAlV|`0JFib?HNV`BV zBABtKiEFM>dNfK88Ii+fijHB^PHxeg*(Rs-n6I*LXuL{cI_!DqK><_zC&$Ol9Sj&p zlZ$Y)ktH7*XpCZf#gP%r2TW=Fty@A0nRjp28=Hf05`5ZR2Ch3v?!T6Vf2^u&LAK-B z)u|Kp$~gu4Hc9J&f1POI%qaAHX_HP0@dqP&|FlT`3zr0Rc9;T>rCBzU+NvaqJy5<>?=(y^^ms0r-dn;31jNubCHlPu#;9X7%&lj(=So|h zwB~^-(DzfB_SE_R&RPUQzt`^rgmn~47b4$K!;F7U7=4OzHU4l4sC$&bc_~tWoFdj2~8x){` zKf;xKc`*t&E~$WXWo+e`k&Jzh2r`Wg8X5`@@FQ5LwfOlxR^E9y(gCo>#2fu?+U%W zy(?{QTE|xjTik^j)uy>sy>^L^H41_Z7M_l%nHf>LJ}va%^|3inu~uKYYNVq(v97kg z4Xc6})CRbo;@;oq)6!NoQkqv{YsH8-=&IMS&-r1PS3T&x9g&l`xj*cP*6I2dD~>W2 zo){Wk8WQBnBoo{N38CBB!VcDgzK;{@qbXwyB;p|1Ecd=n;TpW_^cEoI^5wD>!bUWz z)4(|ji~_A_2PvjSCvhm`l1QuEf9R9eC`O`rb#WB^8R@Gk8It52_jpP;PIU4(XOV~d ztn-7+iR(xUt%Oc0v?R%8`OGHav{i}OGh+>mz#f*t2m`@B;zW*Nr?Bm3EugR}kEau9 z{=g2O79b{IbvE5I9_Bd_Re|JsIw1xXir8U7n64BXU?>}XFFct-U`0{5_ZqsxwdqLw z>Br%)qP0ODqqz^i3C^3nEu7MKo>ScC5Bao(cmWp?7W%Ob8X0H^-qY_~nj4|>=L@SB z@QsllGaOW0D8!+EizU*&EIyT_;|d9dd)+Ky0iNQ#+t{c+xY=xmU#$;r$Eh;hTc{L$ z51GPf*8ZX{E{F@{Df&WZShA|hJ-XMYMPZSt7AlcgVJ!DnikOmSm|53yjni27hZ;6A zQwi*+DGDFj3~2{B#DgpW13hzy%-}GDrmSzm>y+V;4iT7`&X$BKLDLZNK|PaXzs)Y53^{WSMDXRQ~?##0E8rTEc1 z<8UD97E`IABBDLCI3wk3p5<7fD?yj{!Zzio5VmtX^DwBP#zN*6P77wS-ZisvJ$%YG z1kDXY`Es9jk*gS1R?qM(n|VSmr<*cI=deOY&S+Dz_?)ZTn`M= z)MO%`g+rpMDL$PRdcl={HpXYh1p5yAw8f})u1@ZmCjqlZeA<$KhAh3xKXc5?Jh!Ik zM*ko7HjAZ73XW82nXnGMm^!{}MxU?LFEZ21faO*U8pA_}3oIYTbbE}WFbSL;!X5?p zS%c&MY&6!4-u5S9V)%}K?hv4PWH7l=xC--qQuH;3xC6HN^&JDKBS)u=8{4w_iXq2+ zSo8a|YYhtK$_i0qJz%IWyVx?z)Nlx4AqoJIZH%dyT8bzj;(4W^mTBW#v_;Gw{3!#O7D(o^sgR!Fwab!-vMLGPwPaed73oSE}YOQ zfMfsU2^jO#%)DJbElgFP(Rmm1)XZGnPIut2)W|3W0QZv8F}#KY1&S9{hrmX<(GO=N zaTFuL_hp4V#!y$+`q3lHi=b$7$#4;!$A7S$99LlX_8St{V2<=y^i=0+%u_gX3{Box zhn=J`587Oy8;gJWWUYB3H@yL-#uHoF+q)f6mz6Qv1syD&(QTgLc$i1o=rkV5mcb1b zVcJA8#UI!0*rW|db0cz0^jypB;NId1elqxi;IY75{}272_TTTR2ipRF4tytYSKu`F z7QU0ehz|>o3m+8D@_FH~kPt-gcfD`*K8OEz??&%T&nKf_iQeORooAVc=fCgShO-1? z(PPmK(dAJw@|(yfBCm*C5?LOR(!pp^9 ziuZ_Di=ARL^tI3%Lc2m<|84$l{-p00o@;&Y_T8ZSq*H9+o16RGS$*9qvs2m(}RZZ}hFBX&q9%Cy@5A$MfQ&5}EA1b*V_mVln66bRYuqM-K?$tVj zCvAb5TVp5Mu$}@{TnwoPg|V`-H@{={K3E3IQUSHsoG-M<9(oIFbDrONF(#tN758;+ zE|HM-W5W<$hZ*O^i6WdhOYvKl2w28!F;4wLa47t29N|e}rGx!)enUeE7~ZA*U(C(7R@4f1+%gz}4_+j68N^5m3|i!gJGYN0jGKdL`!{`cZVn9`Jl)BQSI7FW zphCv54<05X9CxO5ciLdB+2E|KQ`)`Eq( zC8)am>tBqRzHN%m4&hSL*G?+6B1Up;Y{@7HlH)WCce~Lt6Z(S~ELsr|8@JGwyI!0k zK$&!oyHnTK?!yys&+R1#tyGPBTG8WN5{s8il6z#O&^`Q&%SjMTC&>`c^;D1kf zID>n$?=l?L;jp&!E$|p8VyU-u7cBidny=_vaF}JC-TPMJz&IT=%-e1(DP8?w3f9ip zWl;EMQHYJ-_CFA4`~Mrs3xvfqBxVFIi}(aW>wNV*VJ2jCZ+8Z}P}n8sEAxaFEavU~ z(QyTfD11i1UzLHo?|ef0Autc7kEWjn(LcU0tY!*IJ(o-J!$#Q1Cg`fhOl?1T9$9_= zKgkzYK_WdA48rmcI&75MaT?_;G#~a{`62xl;io<9Y#xYSpnGBe(srb|g}HAL7O)U| zobaK2L5TB68FMcMHK(T1+>QDwe>3S_rV1S@E;ayd$`oLRzKc?m+=tfS_G6D;sZm+m zM@kjU>SR{o6GnW?$wAUS`UXEaNahF(kJDm3rzH5CzQAydA&wZq6gaG3;Ctm&Gb)hUkPnn!n|+kKjM0gwIc>3%F{er~t!s84Ir37xZzadWS| zTUY#D&a*mtsCNvngiReWw0N5GW3Nnh4GYU+_fs5eKXq>o}r2rw&Id~}A$&&%~0HbosYLuT3x(U9&Z zIZV=F58PJ$GF?90)u@v=NUR5)M)TwJdUWnAlgw}rcL-yo3(UiraOUZ)h-`s<)kN_m zOU>iu%6+6bsic6W=|VW`#q(LpMxFEBJTH#3lT!&-G>Ctvx8^!nf$cp^~^JU zwPByOljtDi5BJF>p!yWWs?c6yA`IeKNa7^MKlSyb`Hkkqy*^E$#=y{X`gw=>-N?d? z*p>i!X__I(V*o7x4e^NTqr7a#;7F|Ivp==J!Y!&J~s|@aU&_ z4eg0f6lr&Y`@r{|v zeM8^3)N2itPnSrOCBRS|CFj0w5Of+r^Y~*yC)jwB+&o^+X)A>edo4%GwZSW{(l8?E z&o5gm?9|JV(bvsHQ9s|@S0LqTZj#}v4X8wwpH1igFX3+IqF;!XqE|%z5V;`|lRqlI zQ$8qfmd}^oBfUZDl4ghR55F<|qVTn0Uc5uRL|lq*{s%%kf)@AI$seb0BDZ?R7j{#$sB@FMK?AM*aedmGOEukz0IywCGy&kp|Q{0sRw_b_)K z8h*;33oZ$A%Vx^>q0{JCqu^|BvZFOQe;x1(T=;aWg8$T>i$mP(d3dHR>F7S(eOPTx zwkktdOjj>%Yde9jgvR<>!L_!%M>@LqwNa6_zTt9T+o@D*qE&6f@3umzEpbLs;)m5Z zMVidmGF<%Dk%69eH+i)+a}LSp+~hN@>NzBzolO2*GAA>ceDd7&K9UY{Gj(z3JhBCc z%6d}n=5ptfS&^i(IVI7fx|_?M%b|}bj^?0_dJ^vDa;@oe$IPBKH+i)+d+x~3Z+(g> znrc<&$DiU^x>b#=b#Ni6W_m7icQe;|E=6jMqq&sQK4W!|n>~j#%aQJb+qR61*2a5Q zHTEDiU4^2?52xZrOgfGjAO*Ncp{#5queRpSK@f!R>pH6XA-bQ@s8;)Oe94j-KFy@1B@@ zG~3UmO6p%s++O_*xs7#huN`)t#N8_wQ6t%B*hs@#9HXiqQJ>USWTBIPYPRRX$^1Kq z)4gYbn|%6QYLmJ1pF$3EJ@Y0vd=6(}&)mu6&!IA(JLf6htG(xf$qk=FcW7WXiQ+}i zP!x^jNw4*p!z3ZRdKR^E%`u*p^=rpdRCe4Ggj~XF?dnSIwK^(Zi@!3kPcNb;8fDd7vO_|i- zpg;|_J<|qvb@z4_N0F@qCXPiTeZn^HPrMI%KjdBK`LO3% zp8cMzXC?m-|9<{Bzmxj~8lC)e{FKEYON+qcK37_#XUrmQOqCQu2Gb%wwKE^7IR-nE zZ11T~Zf;sy>M5G5IGV#@nd4Vk&DpG*R&!Hool$3F+05MXBumw`dC$RkLXk@-$t+d2 zXT<82>uQg{hfv_3$~d-j#B-8t=xpg}n#xktob{FS!j!R`zrY5sf=ZjrTu8Ez)IX zuISy2?{xZWy?gad3v`4IH{ne5({&+orDIrF&m%?w%p{IH=QGn@l|p z#S_Ge^fP3|kwRZ@w~4dw13z0P)VgfL^6e37JT{r>({d7~W_skP)f@t;NULz{GE1cA86u5H__RbC z88Z&!%dFk_oT9&29;;G(>qz6Ps1&B3j{HpRoc0`^Og?uG$sd|bep0jC&cl2`0UbM9DU;@q{@vv2b2Ov}A_3U2M4O#WO3QT8C}t%sH! zn^}l>Bj&x^!ABg9n7eC|o-o3h$)26=E@C>JLk90~lh2-0@?CE7x#`6Ro?`sAPbPmZ znX}DJJ~=%dId$(NTN{KR)w9Lj+%#44Q#7~P(HzcC_jJ0O%bm;3t)5M8^4aORGgH4! zPse2P=TI|5E_E;~ttNXmPHyfTT7}34M{{aA)3bhZbJOw$re+?k|2wf5$JhTajjoS8 ziqrb<#@GMrZ4qj+Ncr}$z1828`k#{cM#thIx;Y;CF>*Vu-;wPc>AdotCMIjUvR+HBpq zJ+cK!C^APh+9KC&Ab01*dtntLq2k9`w?xq^_q^R zrt_NarrI>@kguk&uzr%t%dI?_9tdf zw@)6`7GeBs?T#plhV5+EL4?k|d$uA?#u1Hnw%v+T+$q)s{oA zO-GKfmY=*6w^f^mJ%%Ej^e(=wBj8at|;KLzdS=)0+2g!Zu63BHVaxkkI#jTU%%!PF@w zHKJh`o3)osr(`Vx1XJ!9HQ8$4A%W9c^iN`BM3Wqi<7@w;T6l`are*%8Xslrax;=4J zqaA4X+?rNoY*J(EG;BaG>2@gqCDDt040b72FJ>ZrXuZPBpNl_@S-(sRz;3K0ZSBZ0 z4O>KZ18Fg_dyBHInjfWT58hR(<4`;k>%i?lH5Bg0?N#`Pt{GaS`A}iu6czBX3nl4^ zXo6!raC&{NhOJqbw%&B8dslq<@}nB<(z>}fEoW*H_l|2kXzM4GEzN{o$ms-erdCXx z<1LW^<@oiJTbtHwo~pIE*G=M}v2Bp*xz=jd+Vq>=G6z?POm%89@@&Ujrc=4O*G%e& zVR(~0SGzkh&9KeX9XU7-^17fnc7vuPD2=;8XB@AmrW40cTQ6aW%rv<<)gX#kaX-Z0 z%SWGxemDA1^nvIbqA!cqqvh!3(XMDFx-5EL6FJRg?dEZ^q2!}C`8EK+y&%Da%xc!fMu=A>Ur z-#D$_5`eW$v&?BJ_h3*NxGIT?z66!_ffcDUe z5R7E-m%(obKOKB`@Gj3h&jHUy&)VQE!Rvy8F@gMT8 z^#%fu1-{JR8~AA89f8*dUL3eKFzmgFe~f?96YxCdc`|Suk&Sk5zjrLKDljMD_dn@> z-2WAP_3%#rzxi+WU*{k3U+&-Ozu3RpKi41d&iDPn_aEMSk@xV6!Vi6`J*PbdAuenb zUL`yz+~awkaFej#=M#P>^b2FceBW1nANSqoyUTZr?|NU!*W=seTjvgj%I$7!BL2|ofVJhz@Xc$8BfTCNqd40jH18(7agP(B9!DGY(%N88UBNg zddXI71$e?-1B!aN$c0IHE^NR+Y&`QCFd1Oxx-hC|P6Gzw=DEOyQ9QF;n51W>3!{2w zG+;1EJS{Fv(zCPygCoG6wJwb6xu^jH)_PXCFe%T<^JqHq`gEkv0+RhMgnG3Lp{!~^ zP)Of}P_Au2D6Q#ZE<|d?g-DLM5Ng$hP@d&LsF+E~3tb2`)_}k_2+o(Ij}kJSt`g~l z3z6z_A(9ul5NgVWP_{Q9@Ij60LZsKb5UGtWL~@f0p?0_s%8mvECTYfnP;)MXl5Iew zTeEXrh|C2pL~?-(q0Vz5l=B)8P=niC2<74i1U|`Wb0ISAE=1bnLZkvNgu2CrPZpBD>dxNF8z^k_TM~bsr|o0&{whZc@}0Zj3@xv7t<2zl)4=#HpE}yj!!} z*W4(4+3iN9xkucn6!%p(D#<%Z*BN zZ*Zeh+4Eq<*VrSPqds3eT_!wh1sOL=u9 zqf%VmjY@K_bfb`i!i`e625&V%_L=*(vlO9J?qhD0!adZ8qB(n?8F260a~D#$w>6@`L+(FN&vNy_QFQbVE{wuCy;$-+74CNpW#DP@y)I0Wztn|M zdC7%QxL-PyFu9EB>s^TCDHlS$s(}a=8JyNo1deyag-C{62vu?+l+#Ymv|<^O;ojj! zrMVBgQ7P`DZWMA-xlt}@!cQD2lfWm2i64UVy*jo|Bw9V`Tpknh40(GJAE%iKK~)#Vc%w-iip7j z(T9W^J=Y4a6yAa;!V{j8Ld_TBzs3LD6XpLJtwsBUoUkIg4;ca1M(0O^$TIMFqcX^HqAM|nF4cR)t>*y?e@m1mr#p}eY{Ga3>6#Egu=n~h7adELY zLlh9j_$h8w_=2z_^pViJJZ+)Zhi(f!4_{f7Litd)X9-SNWJ9Y%7lxuCPw;iYj=l(R7={0g3#0O%ZooiI^Pg~FsJjaPF~$TH zcN=`P;W_o?BkXw^4E!*I)b=$0eh1XfKj5f~&xoPS-|NC8`THFhYCp%n!={1k9&dL& zSNXTOFiHNcE=-EQ$AwArZ*gD{2|!=SuvrF*FiHMRtmSMr$G?$5NhI_Bo(<*F{I?u+ zNf2`UH(eNo|GEp4Q8a zE*Im;W3=9rrjf$`#eqpvIEQxz9SD=;Bd#(k{~{Mg;ho_OP(iJ(hB7oAx4AG1ztg{z zQWZAfDOyu^Vbc7W228TGoiDmDIsT*zljR3pm<-<^sB&~j%=l?|OvB#p!l-?)y$hrA6E2Lx-@vGSCd*$7P9`jV{xkoww?lq6 z&zc5$Sk&;FU6>T#dD7patpf|DpOb;|qxYZe?H;S(&Zt6fhq;Y5=_?2B19`NyTBds` zrknraAACr0#T95_$uoPKzOibdw-a~DO@4t7GIIije31>L`I$D5;;&|-(2hKa-*-SN z-)2Kfj-Tg%()=cy2+}?>AlJ_Kv2xfR=3Zz+$PZbtA+?=*J%e!8fO`cal5OX&uz?)k zVwXdDuCq3jPH{KeP^z8#F{;hPpdHzQuZ;$58cBXND~Al%+@EX+31!m`2p9J_AcbGa zDB?SI;+#PqpF!5_a=6dtC-x&Hx!HaMD{-^^D52WiL1turD=U~ztNcP%5SxF`wjZTZ z{B1UrRQXri1=ZxG4nSFMmqUiXdu=Gu&c_`PvY$C1m6sWmYR~dlIiM8xNgKj-E$_6U zWQO-TpcMC42c+>f1i!rC>674Az85WKq8398(kVIR(Ck~vRsZ*rKrobHF_9GI-` zMZMC6QTbQ6Fbel_S45v5y)Igb4kDBPp6Di=1y~bZ6g@xckNi3EMC3=2uSXt= zd?<2XC0G=zh8Qrbhq>h>G{%iQbih+j!AoP zP9TFj2p37`;~v64ho1=lDE#&CL*WmF?+d>ne0%uC;X2mgSK`#bf$-Mw#o<=0#4iYo z;@@yv;g9j9!oygD-!HyJyiTzaIQ-@Pom(2k#EPJowz;HNjFa zA3PY`7Q8qZ55|HsgZ{vu0>21+Kk((iCj$>4JK~*zTLWhUrvq08dII|boqPB4 zG~mGrf}i-mVf2I$x`AiEoxKApBYQrSJpcE5fIQ_X+n3uN7V*+#sA0 zP6}5D`-ROyR#+n}6wVX8$jA6o+~4p;@5j9F@xIA>hxf%^&0F)H@E-H-LIg(fF7wXz z2Jn5x&pqGse9`k!&$~RY_uS@rp643Rh^H5M96B4^)^L4}Fq`*uBMVH4yERk%7zUbrq> z&~@B%!*$7qZi0~5(2e1`XhS!I>mduek~kS zU9h0#+;hab*DAQYB-T9)xL&OD7O<>WtaA()7Padca8lH+V?a&Ru4TY=qV{YCTq|nV zSisU}i`vx;xJJ~*8F00zow0x=Cq(Tu0|rIy6a#uhZHxiqqE@qj*cnl)GC&r!3Ik4y z+Eo^?_^7CjGT@Y`l`UXVuc(z6aD}LiFaV7XGoUPLCmB!@wJRAgCTc|sSO{uE3;?wg z3;?SJ8ITvX0t2d|Hedl4Rz$6z0auAyp9L%c={y5K`dJJZ6}4UlprcnX03GdNz=)__ zZUOT_?KlH4z{ePX0Y1urD@E-x1{6i@2m^*h?XU&R!^jb}-;sqSj>r7l6Qa27tge z24J+eGT?Gi+roh3qPCd<$3(5u0%k+1HZkBbQR}dP-WE~2lmW9vZ6gC_iP{DREEl!) z3|J;=moQ+4sI6nb5mCF?0!ZfbkxfPJDy=12!F18K5G1_07zj0^yz z$rc#^NRuft0FWk2WB?#dhR6W+iW=D=9hl)4H8Mj6;1e~nLIxm+8W|x2SSM;^gA5=p zYGi^8pjFhE1)8x()W`xEPj-tM86X4LC2Gw6%-AVv%>L|9M2*>>9Xmvg*`Kafk(r;a zxX7$emm)Ib)76C&m}VQ>TSaDiw#P+gdA4sBnc>;KU1WA=TTo zK9Sj+t%Ar*&ep9Wvp8F~h|J(@*(@@9v!zpH=4P`ZGHbJWlgNxsry??2)7c?1Q?uz( zky)Be8%1VlIyQ*R&UCC7nVGrt5|LS%OV^3a$XvQaWH#o~i$!K)Hu^0alI&WM*^%r;A~PeIH6pVjnbjgQBAHbpvmxoA$V^CjrN}Huszqc5 zBsE)P_9Hb*WacBaTx8ZGwM=BjBeg5P#1~JW~fU6$Sj7kSY!r6StK%hp)3@cxlk??nYCCmTV%#!%`B1G ziZwGuW-8Xq5SgV|vp{5qV)bm1*@@M&L}n&d&lH)JSUq24Mq>3mk=ckMMY*3W{M)S2s0xhGYIF4BC`kQ%OW!e=Sw29 z2D8EpL}m(nevw%MpHF0lz$b{z4)}s1GXuVW$gF_i7nu}0bSIWon1;Bc_RbDKgC-c&8rN^YNN}rVOm)^fT;Pzm9a7}PQPzwAt@C4TIU&7Y__XS=Tcv;|vz^TBA zz-581z{P=!uzr{QfAjwe_a%PC|4ILQ{crNW%Kv=-HU43LkADx=?g{@A|M`Be?@8Z} zv2y>6@BO}eeXsGo*!LV?#n+E@`&M7px5_sU!}Z@-wLgk)1U`a{iLVo0hBf;sVMsVC z><}&yT7|{J48i05o%eC?*N`{iz1}x_Z}+~y`)u!s_X_V`@1U756gE^7t^w>_<8a0rTifcJ6EZeCaG?jDho{vk)@| z&XvwW(ik{LItyVl!LRZcNM|8$7RdcjIt!6w;9sS)kU9(GXG>=xcqaH2?pM-T_#PI> zpC?Vg{a|2Jnt%twKv|lA6JmkfN2Ce(Ar{Ebk|yAanBbQ|c>>;u1rlXABn$*)_#_OR zDNVpFVc_}F1UwT4&X6YHoS5JvL>c~x1rlYrC=3K;cqt4-pW&!5Fd|LBS24ja5h=JU z4E&%p0guH3dDMl|!aylJL4J!qWT*JBGy%`WeE2Y8^Am7h7#NZ!iVXY$?~^8m9AHqI zIN<;T(!?MGKhOOoJW&9s`;gq{hoy-D$HPB|C;IJ&SB5A0Y^W$r8`%N%nIf3+IMC{IfIx|HcBTzi@FFC`c3Va!l|cq6A0Br1TId!PQ|8K?&ZD1@c~L z0uB!YJ<4a zC*TK}gg@CMO~4Z}AAXYidw2rQkooWvC&CkOhb(ANnt(%O7X1YG1!)345d;4gp6Fs_ zKaQH)Z3s2Dv7#U6{whsub%6gZO>AM{$LPg3v#KA%i+4I6;>9;Pz&}Y79S-onqzSl7 zW|uz3{ZX2L$7F&Z;UL0rni%+`Gy%Vffp3x~;5sqz57Gp@ClmZI)rAAaK-7f~#X!`B z8^yrihbQ1knQZ$|G&})c%7h+V9G-wTWkHL=6Y!@jC@oFEqcX`n$o)>5fKz3HALM>6 zO~9{W;BTb~xK<|k0qP*UD+Yc*nt+4F!1qfN@Ua;98)*V=76X4RO~BJK!S~b5hqJ{% zP+si-pO7Y2Ilx~^6Dt|`KI+B_2Z(O8I6!n`xdX%-EpvdskS3Ng@Bt#V!~ud7Trsm( z4{#s_Z;XK;1&54*?~^9rlQHmT(gfTx6MQdGhG)h=P=<5HKv0H%#=xJ1C*Y!)L-gL` z(gd6|_VB0D1pG7;yq^feRbwCs!&_q@2*Y7x;7_Cp_-qXPPiX>fn+d)Ld*BoB+!**D z(gd706MQ!{1pkeJXb3JG1JMw?I0im0O~8?3;A7GRd^r=mi~Er@VO!g~xF3cm$l4kj z_O6OFVH?}KxF1Lpwy}K^_kC%?Hnwl#9+f6+WBV@dbJB!uY~RIwPnxie?S0&Lr3u^E z-p74Mny`)SecZRDx@~OViM_?TZEWAkeN(F2#`YcDH>A34Y~R6sU8>v0_8r{Uq`GZv z-wv%+w~g)Fxi3m}+t|LH`>Is8jqTg0ux)JL#(gDRCu3{y=B<}Xb=%gymHV<(w{7iP zxkseBZENr4z9iLcTYE1xYunm;xre2?ZENqLW^G%05BGVgZrj>dfvbAMP zgD8`^HAvmTy-%v!_Vy0$0jX}=+grJRlj^p;y_I{dRJZNzt=xO1x@~W7<=!aO$=({2 zZ{_Zn>bAkXg-DUXHJ;u=q{!l0;OnKjZE|lRQntyxg?o=wCzERwzL`jo&9y*~vW@P| zI6_djjqc4v$~L+;bMKPsWOR+XFXrAN)orW$V(vbvZd=_KaqpDsw$*(R_YSFUTiq9O zZ>5yo zds(;+t7}2Gh3hc726Pqoif|n^*MdL=Cf9;q9EP*ZaiZH_E}twGVtqKnI1q~+*wTG)aBMhsy3j}W-JU8UYgenb zlc?;Kl~g94O=J!hM{t4p{4u1hpCZo4~g);0P$L)%VuXUmCP0yjk` zyZ3hNo26|d+yXg4mkQ@{=KJ+%TLVCAEi=_j4xGs$KN&8YcaqPa$QMhvj(uAtKRUF3 zR}8EIQ}ei^9an(hzT;8cKwKpz;wn|TcGtKdm>7oZ!#lMt)a*D$2bW@}Rg-*iWOTT| z?!KlfMAD#`cP1OB+cb;)o3+hEUh`4c3(`aN@W!LcPUBL(D2ADE+cP?aSzz7&b4Qptmb z{-IKl$hB#g(v$s|H+UB{0ghNwIE*XqhpVxn{3*Ii{Hn2{&Z6o@Z6npVO3r3*Eo?5= zfs0A2)`KfRJJb&@AvzDRym{?HaIKSC(3RmXl`zVdvxG|AYnZ$emIitW5>#A{@ z9Z;VqD*2HS%(;uSG?D4jb+D4o9jX>+cHmtKgM*}EA<*3&&~7!#TbR>QRJvbI>enBq z4h~f?XmoXbVK{~TBEvOmr}QqqzO27TcmFsp_?|0?n3U+6t23xWs<2 z3|?W57G*_m1k2_;ux6;&RW)oe1JVXs~- zoTwB}=zJx)C0$@BrP!&WLsx=}bg^i4m9~#tU0Od>l{GV$YAsX%9t?yL*Mv`bh4>t8ITczWn|FiT@4Qf3 zMo;2$GN;7T31w5Ul*bgpbfH(Ojc2u`^gNI01}&ae59@vhCE{c~0B@mh@|a)^Qj*h_ zP|bcBca%drD2J-%tR6L-1VbC34z9sA8H1N6MnEIPsA`v-Os8-ocZO8It@%lD>ITlR zI@K0!F_m5~r;uEu`}M zWqjd)M67AMJOs_5G3?tqmunYNjU_9yxg?l{8l%Hy-DWk^SfMSTVjD617&2xVyEpIZ z1mjI521bmwX!EJydRa-62bgre*@_ssT6#y}70fewnow~iI(gH&%7HIbj*pGPIf51h zCt&Hw_|um|DQzy*I1Ud3JWH!q4V|^4P^kI{J9Hq7YjJoWuFaupyJaa(>K&Y-YEqj`HIB*(d77%~_ThC; z(c)^XkE9jmGNa9+TD>wZXn+)Fr>I3b9X%?KRp5*3BTbUGPMb*;ic?Ol}lCvn0Or{R$qcH&AvWVn}a5`ZrZEca# z&ZE-D_0p=EJV;IfSOo6_*&0c+IP0;uiEB}+2Eoq24CGSXm?3@TGh}p~<%f%X6`flv zwFs5(fLLKYlT`MUV`HV$n80YtaE8Xp@F+0*yEIvML%ebZ`Yx4C>qV<$qm&4;Fwh3q zUKh1CaHm3kGL5J11;wklxhV#-I8-W=7hb5QG|70mToT?!${=OA>#UyXk(P&t&BfI` zElkx~G|2@d#my%=Bx1@I=Yu_$uA@??Z zKlew^O8!g1Q23{TUj-iUyghJT-~j)kzykkQ{kQqg__z84zAyT2^@C3GVfN-TM-6pErS948O*`k^37h z{#D_~0?&a0#|7R5XqK>W0l&LgDvrR3Os24;&SqM@368QD;%Bw6Z2`ZlkcX!WaltC6 z0RPNbE145Bqo(3nCA0XbPip}sFk(1vtf?(YF^ud$p}$DWM$F_|?9hR(wWbAu9$6d1 z3J%;}Yr4D^Wqs|QSh7wiF7Q}g)Yo{Wv5`KgAIvVyNBB*sTO~c5*R2eea4PJDg3q;M zn}pK~JdhzQTg!B_D%F7>t*>8elnA>-^$s1-m$`*X1+J$VZ%8Gu=)f1}2M_zS#dxu? z+8As&y%YHr#sV|eSE!vXfJQ&Na2wS1MLDU|Q>glS?N@I)pKL0jxR3^_30Shb2c1R1q1#yw%?ueJX;8Zmvh+#6obZ zIq3V8n&$T{654bYz>1*X_ka%#RI&aDP9RG*|>{(eO`b5D<9ruN8JK@X!N#^}$Mc#BlhHm4-QkMn8R?>>dERd zIRjuHEEB>msgO;zpYp&%Qy38hMis#VxIo!}&gNa1hP9Y2-d02+Mll*%*ecl!9GevP z)6K%QQ%_98A!FmB3%ud1+ExoUtD|#DtVLL_5A9e93olGu3~%8~f5BLUD3Cy0WyhbF z5{{dttQq~(y5F=E+zaPnC~4v`&2Jh5?gd>w&9{KZqbdZ7EFPxhSjl#xL7YStQ?;ZE zTb$gxf)N;k$5B3A&14f;XCz81gpGO|uHXnJGz>sh#cET{BALK?VPvXeOeL5Bq*%lB zr}$M0A0$SyLciYI%GfX_8~UUN^U!Cu)YGTnD69jPngf`3@MkjV;~Rvl^m^6<=s22y zAYf9e;O!_(L861$kLemCMFK*2{~vqr0UgDWwSjhZ_r$K5AzNgD$RMGaQAA){WNbh} z5)vRl2n7%b2}=SDIL&A@*oHGvV9M(4WdYyAlYp=ZyYp)Yd;C1%Cue!RXTbjXU zN8WeNJMY&yP~Yw8u5i1$Zgq9t?`E&?W0Yn}ieJ7Sy;-c2py#IROI2(<&Cd^DVplLx zJm=l*sbOcO6Q`>ibuBctVEEo-jLCQkn)$exR0;X$o6J-3KXcV%59DI~O@^=&dw!Lo?4@4)5xZF%&cR90OK#8k+2aHLo!~r*pOT?t293+7fk=TWb|Zp zfqq%Tk(j#ZDr8*-6E`f~Vg3W7)SioT135wI%|f*y$+>vu_`FO%nbl1!Awhllm?mXQ zZ;8s8BbBc1&9&@xpdPbHOf`7jSntZt%g5?-Ht8oidVH2*OkAWB=0Is=F)RdDAkz8z zPE&hpGgm!YU@;2Txhj?q*lo?l^fNo)UoT0@I%9bJzvTZk@P8Wk-)KOe6*HsMZI+}@ zb-T|O+jDc-cc&b(F{m!bP}8uj=Y(<#R+4&56tgjp$pZ_;hAef7G2O;w5=MQKF(+nI zYRh<#3)_{Omp71~j`xbT?NicuM07q$UfRM}9ZrLnmsOe_#1H6MF5`8_J_F*J$ zuWe?{+uXc`eLHDi58Q-VJtEe21o5E`Y#9eq`Om{Ic!RM~}raFCf1?xGOD&|htr|t_|F?A8v8MAVn46D|H-;$f_rNT*Cw*NKeSvVQlOM@xGxUfcAKE^JPY>B{CU9YMTuV!lKO z`~E*odQ9@2=bPkx+ZfcIZr84CdyC2 zf4rLPBWL3a|5z0I`~6ji+It2`04>7r6<1?rs7(ZV5Fr@+U}5;ZviF6KK*Wc5EGf)k zt3#W6HV0%|zgKznq1N9eG*|bp7zxx$zEF#`S=oWY>d>a1%>qOG@71j8P;<}RK~?vA z(TOtYAn42{Aw#hs}sum9m6D5g;t5|SIj4on5*4LKjLfeJElE;n zD#oQ}p}tTlZdZJ=fkm5~PzkEBij68&xl&nkLDi!43L??>R|g-MD^W&G}0lqYmJiqc~OGD6|J6`{jKNtTB)rI9Z2p{xom z5ShoH!PJai&t_DG<|oPd_vroJ&^+tC2xM1<<|ZlX_qZ3{&>TxqIfV#iI$IPKH#?xk zO=W~kX12YdS(fsGxxp177O1}aqy)^_sg##^^H+vgn0h^POJh>GMMtEZAyC0FwO z=-cc2)c3ycP2WqtdwsY0uJ=9Vdq|z2`qdF&Jq z4KMwNv|F@)X>V(j>8(*KF5%#OJGY z1zbg7v-g5gFWqHx{^Werx!3uL^Ihlb&gY!xAx7VQh}m~N*!5zF*0;jB1QGkTIP1Wz zHwJ$BhdA@#qwjL|bA0QR;GzF_$4ibU9Us6;|Idz_9NQfyIl}NcxY}_MeDybjZ|^Wi zxv$z+?mOH!3rq$rJ=1%e zug-gtx6`}R+wQIQmLuk2oj2&646cJ&-Xd>?SMmJl?eEn*d%Z&uci>acn_xY7%JY!t zUe9fw>pf?BPV#hmF7RA|y{qlmpci@5>MiOu z>OF{KxB_eg7lH9FSDB}jYLm24TAJnqzrxS%eeO@)?}20CdG}-P`w_q32KN>2^WCSr zk9QyI-s;}uu6I|v%MiifPn+#IuBTiNy6&cj(PCNv zW`}WfI2}MWuseLOeW_fn+@svAoQZuVCn(1%&4{OXC^!+PI7TDVgx8_kf3SaP|Iq$- z`-}F+?e~Kj@jAp;JllSKwINEwa6Cd&c&l?JoHjd9R9ZQ`Kz6Nj+8C-n*42r%H%iHBznNV1&AwgIsl$ zOC_>gMSf6M>W3;vs?{8fP*>=newA{Aeo{TTS-Dt@HIs@IPT&th9c9pVAKeU$o zNx4QxwPdSuwSjI>t}@W|%9T3O$c4%k2D(nUTt{wljdGcRE>JGzNIF%y#5i`XaE)zQ(?eab4_7O>lMh2^Tt^&cw9_v$hoEhS&8Rr-%h z`>K`3q3_hCI;y~r75a}AebsW~(6?%teyBWGU7{ZU;y;pw2VUUUjaHN^t2M1AV2=*3n{I zG0Q+-s5AA97mZYlIT)cH%0aGrhI?&YrcUR&g^L=Qz#-hz$an$I zC*wGTTN)XwUj;Ty;xSN+Py7u#P}5N)9s6X=IR&KrBiI8t7Cqz(A*v{yGAgDCuXQlSm%}b&|e10)Z&;8R!J! z)e#6liOWEp#A%=~ap-8h^Z;3HpuZ6Qyu-tm@UdX*T4L9K1RW@`>1d2}98q=Mj%gtZ z2gedw2N^YlaL`P6x6jxp{f8gvkbdFd80lvYj+TDX!RVu;A34}5{lLKv>3bcFS|@$S zL8J672dkuibFf|dMhEFfO8YqQNP9WhCVj1gk;|p8IM^zEse=(U(ia@8mOkfTm9&S0 zR_QYiTBJ`o*dl$RgW)yO#~iGdKH{K5`WFYa(uW+hOCRW9Sex`u4vvuC*TK*l={*is zOYd^9S$cZKPrm?%BZL7nuR4i2i3p5oP$-;V;roM9_64~dW3@&(!)9!i2afrER!D8!Rmq1-5d;%{;Y#l zOQoAQ7%Sb*!5HZl4l<;hIT$G2#=!vTRvoOYkalq}R=SacG1B!MWJuR>Fi`pv2Lq%V zIOr>JV^v))U8WzY9xGkL!5HaE4l<-GI2b5h&A|ZaDh~Qem+N3fnRF2cOQZ`p7%N@M zL56f82Lq)`I2a&Ztb^sH(jPe(D{=F*e2jDsKawGx&A~wFJPrm(=W@_jI!g!3N~BXb z7%QF0!5HZ@4l<-aa4=9hgM$Im=^XTxPSwF-he;t0uo=&Rk&`S~a5PW-$LK#S$dZoZ z2QrV<)A{qa^K|wOo@O1z)6AWEI&a=Ko;r`zGr-R7lR26|t_oiqCgp3d5=r?dU7Je}F1 zr?dQRiLq!Wun2c+_g17Oc|K8P1hF&9Bze>A@8|&0DUgMOn*unpwru+)AG2EY;I#!3v%R z%JsC+U&hnyC3;$5FXgGNgs19ao;nxtbm~Gq&CfcVri(>A+&14mgyjV-DeI#=$%tH$zW@W2f_UU=dFTOylX8LY`(6 z@N{&(o(4wd@pMEkPeqv)BYoPdeCs5 z_8rF4K|}R)+`u6`9Wa=u{nL2b?;xJ`9mLZ<1NC&WZ-AcmclYP1x1XN&bNA(`rw>o5 zPfrJEcoD*=Lfsyox~QJo>>5vP-~z<&Hr2&br<11+hn}i-J5O!kg~xfSs`6A(cq+@P z>T<)mx|?iQ;w|!2Tc_(VA6M@KU)?q8h3e^QRNaa9t_F35S^}Q=Lf}0#1#0K=kJ~uJdfgS`)1Eop7T9_fQQ0%L=~v>EQ6QIOgO7e zfiK!14+Y=gzv-ul^!EyVlKzF>POqgG?ih-0$N(`C0cv z?z`PL;w|}H_o?nq_mOxbq(O@N{ct8HP>oeDTuGbM~;6c}2t{YsJ zxz2W-g2C600MpIy+$> zHeo$vnRAhIrZe9;#W~73$f;p9KNk~jJIsX{+)dfVmiKNe;UyT?zCTzckHvkV0f&(!`@_HZ7;Xax6i;E_IUd+ zdtbZV_9J2td}wqx_}(f&2#I2|Nsr!W-o)GIp0HO%JT#)mS+n%U0xtykv!jkxC}3@?CpNfM0qYh_!&7=KE#01 z7xF9)!L~z61iXfn3V10g7w{5N#v$l*$YBCrLyU@@CS660nuDu{EEXqRLX1X$Sce!j z2a67w!%qOe4l!y5ULImJ;t$d##ApOKb%;?(uMVZD&UR8 zXePLG$P9iItUBai4nd(qjMs0_=a3?P6x2Cnnt<1mLJp6Yc9A>*uOYbtUQKcYyp$9O zcnQhp5Ck~HFW{9VTfj?6P{2z_fWs&nKSjVx$YcR8CX+b)3^&tg+h@{lc_zQFpRJXR zwtq?vk&X6zN)DEd_Iyfa$VPiUCDUc2?Vpk&L^jp?(TlZ~c*g4!5r_?Q&PMk79!BC^r6k4V03H25PjTsGA3FOnx`@q+(_bEk6nA<309 z1x_}WXc%=PLW3mm?n?r@Le)lP8V>JJVL;9c_fGLkcske0Vl{q1x%NRarh51ULGRg zIC(IKZ}JV?fR2pdUWX_Ucm%*q96 ztcCn<0{X~a0lnla0X^hv1LCr8IDDRX$mar5vd4fp z;Y$H`lP@>~g)8|~Ko|Lh!)J(-d?cWQ{7XO^`Iy6}iJiP_KFAEqUFY&9MXeO`lgO3u4Ja0g(%DuoLNL0zQ{M1KQ zk>~iqhoxW0lL9_Np5nhhypB9$phogE{~7eC)75|15njpxOD+@e9&)LGcaw`byi59+oFm{z-0@vb(Cux%}Xr(nsV>0slqL5O6m+TflqCSpwce{>UMyMak&`en3v+ z@OJ5+P{94+9h_4nea@ zP89H6a)N;GkQlGcWo_hmeh@U4WCe$yuq4X`yq7E!@E%en;N4`YfPW?x0`4M}9Dtkwfr>lJx@aB265EHk7Or@KMspA?QL$ zgMbf{dJaJoO6mlBkgVkpe4u2FfV)U7hv3m9OZfi(+a*N&3wmDx?_Zs_4BxY(AUzmC zAETS;VC_L|BO=@@?!E2{-E-WNTrc6>^<-C;YdF5q=Q>`%zW>>d9Q%Xz8rx4;J2=L+ zN!_cSrfyN|Ria$1bSmviANf!68FE-2DSOHF+&yd3|U@VF#prm|~kzh!#DW3A0BNDGfi*cGX7 zNAw5Qgfo)VCZ%0R`@7F;!lRQEk>TAm2b=L+Dxb_;jh1JY$ZQE80=lXx znoHBK-1?VvciMn8VmSv4c*x1^q1#aA9s*xL?9uM0jl}ly# zgfr)XRjxMNhuze%y}YT*7A-WlTym$D^7Rc39a-x;HZ`}0eXNWHze5>w4C11iIdBby zLyAd-m(Z75!`?()rn2AsfOY8&do0guZg!wLOhpyMCf?M>%A}iWgJCSRW$3d^UuMNopgyAG4ugCio4}>(j!{gkH|w z1oA7wjwB_fG-z8(tO(l^vJIr>j~Q|k8dEmBCIAUCZ&0mwHR+$vD}xOU|vO7 zPEt-vvlnYQ6=9Mj+f>GwZd$4cO9|Pg=rGi+wxMH_WZP?HSA>p9$TmgS3Tth>p`*Lq z!<>rHQAx__^*vl0+Q|mg@x2^S8O!tjNA3F14pvBSca-ae6oXx^y`6DpCJfWw&~}T? z@|X|Yk^31qf)$}{3F=I7dSJb6)uFA(R-Y1xVY(ot0Wj$>-5lD&^w?WRfTeK8hq-Io zT3g4=o}l5>VnDfqm_l zc-DKSW2gEqx(zY<(zMUC8?_E?hURj=6~^iFhEI{V-Y z^tp~Y$5_P2d%%90eTm&^dkRtOC#i3$m#gjS0(F@3q;iF_L>VK$Ctogi$P48R@(Hiuk2@VVzO51{|JfWkE3MrCVAo{NSx&~Lb6_OlYMUI^`9v4! z%$Q)!T)GzA^I#SPLyAu5)&>oM>w|H;L1{C>I-BSwkf7=$XNkrCIyc%OVGpCgtQrq0 z5XRk#RhDJ@1A z0?-%cClAEUpp!LvFsp*-`sFMFhQV*17q&6&*LVuR zAe|FTditV@(sWP}E?88IR6H^Z!>XrMtS1NVaUi2hq9Vq8q+c6v@3b&s7p+4-(aBx($FKbW31Q}j;d#N> zY7P23T>Kl{d;6i!n;trrWwg;_(DD6tM%|bUGegI)%Q*vdL3S><*7bW(->`PeI-P|d z^>5S5y@fihSgxLVV zSy_!&ea2RVk&)dO&=xZK=c3R~c2$$706jL}Ux4C!67rWY7Nkv^7%Ncxh8R6K5Zb}6 zuEJvk{@(bAZSC(1=PqDfu?&gP>$5`J*+nIIoM0hx8BKl9A{WlK_V(GKBiRKz!6pv& zah6R0_&+1GgM|Cg_Dxmgix;fN|J%v$+`CKpC074cxb8JrR|Ku|wsB+S&Cr2sV<9 z*aH4C!7bmjU2K4~)GmEYsEu7%9AtrbK2>g`L=dp*9G{$v`>61GKCI*%c?-V!hQYqsK5k zBeaQKyUCM{(LXmgK1UHZd=ofC&1WYa5`to|Hv*#z&kQxQ>ubgqU~ZJ}_b*_)Q=&NC z-hiFdAi89?5SETd?XiXx@rO3DOqS}S2|_TGc65Kd^+5;`QaI5je|CbQ4eXlb2n7Ly zkz;Cybyw(|bz^-^Pq%pB_SEf{Kh(soD(P>K*8V2BE#e2|gx0fb5V;0}PeDPj9CY=J zJ4}$#u>y3?t?u-n`Jr|CW&Lx&433yB%{q^6J1Dw1t5}>by8C4)uqf21S8{w1guRHW zvcSsFnWUuj1;Q9k!Lu_l)WEJjq(A6rK?)eavL1-cny|3BX%o{8qZ>_U)j&xZp?Y?1 zu)m+Nm-`F&x$L3X(X<(HWWbJ&v+_c9>@3cU@Avzcf`HD5K2*=zVs)S)sLh zLoiiD56%y6Z9-3g&8=-|VKrfTi(6y;g889Z-TD&r1enC!JUoA}-CNdzf|&Job`lGL zf-cFT1K{-(Gjnpo#VdfSi*p3%fm4a;Z_tTcuM zf6!Puw$3Et)yfI2X6K@-usLKPpij=&sAUAL=-yn6EFHCMu2dLW#V%{W3yDtr3TxVf z-Az0~dX3n)9_NZZG_;ak+YWAhkYnc+%x)Egb$X}FOjKUHSWJ-ED6%~(RL!zj(BELJ zO(?z_tt~pll+X%x!JPgqAVYq(KRzt#r&lKna!0~f*}szX{X)U{@iw8dM1`@CrRdTKr2v z_x{RqDGrsh3$`FC7PvJ1c?$%&HwX^dL&rv5#0O(hsq~?c@x1ehFzC0fYuQU5qPUc? zJZ2$uN$ckV%~`E&>!unPv!AAx^BMK8kyy!WsUzh*2MLQ2 z|1TY2%3I_izoNX~QVo0mL>vkJ8LP$!MN@;LMzFqw1*e*gD6^MmM`F3EW(kV`$i~tH%?_wT!IOKX*qIHr zEj5NsLm3H0kkYLvV@a>dNZ}(o8N&KZaj$f$_ZbiechoFoaUy?h`PJ5YMgA5Ci*(Nx zw5X(4iu~_M{iJv6QR>v*>2YCs&8())>!CutTCh&q^O;k(qmbpjDx{pf-=P4+C&5Mw zJ(2+1VzCaP_!{G`h7OFe0H@BYyjR^|xNRX0^4#Qk3H>VGUnz z|Bbf;yCa^Ly^)mm9Nm4U=DgKgtBl*4t_utEi&v&Qq8sE9T6MQ?s;<~jrXgB`90@D9#%6@Yheh)aWK{T}DrU>khEc?)<3 z&vZt>Fxcp<0<&PDa}rnvspDsG3;x6LJa`3fbzA{P!7j&EFbXbnEPxOFWXCXv$Nmd; zH@sti0iF-H*{_7}eAK?pzTUpvewe+;KE*!V?zR2L_NDDz+l#h`Y`5F4!v2RCSQVOV zD{P0`rrR=YBWymKq<*Eo2R4O=)jQOy)pOM2)$QsAFxM?qXTZ~bq}m5Q6kjXvD=#aL zz{ma?j;ZjMY}dz#6h&H)gl(rt`>_}NxL>##HF;W*&_OA*G7w2LAy3s z#B$ozWD(0~*LsV%gm$g7h^4fv(ISqeT@4m-4DG77h$XbE&LVE4U2Egw4@^0=77@x> zV-ca88jA?!thR_y&MJ!t<*c-bP)@Z)gmP9`L?~yuMTByeSwtwO$|6EJl@<}oS!xlX zoC=Ew<&>MEbQSF?Gexq2b}g}pO|+{tE`HCnQDPCHjl~ub+E`=}p^b$W5!yK1B0?L7 zSwv`KfklKi=37K)W1dBXHs)GHXk(5=gf?bdL}+7{MT9nHT1050*dnf{U58r4b+qdc zi-@jrutjX7T{Gh1cT73cEh3atWD%j9X%-R6DYS@CPJu;)a`G)Al#^!>p`2Wc2<7Bh zL?|a{5uu!bMTBzv77@zHwun&9REr4ZWLd-p+LdV$>uJ{%iwNaRwup7KYf@bNmMLeV zMTBxDSVSmiyhVg^##uxtXRJkpa>iIhC?~@rLOG)?B9t@AB0@Ro77@xBX%V5E5f%~3 z8Ez4woM9Fb${A`AF#r#-h_$q9uti)$yVBy~zojo|*FhF>H|-i^5uc%515J@Yu>&k( z4ejb57r$YO?Pn38*uEAKitS?&p;(_qgkrrG5sLL#L@1V8L?~9Xh)}HCB0{k)iwMO! zEg}@_u!vBs-6BGC-OIFL z+TXoQ8>ao;%d}zI-@Qy5rv2T^v|-xcy-XXX{oN})LnEgB-OIFL+TXoou@-^-CHhSP zF)EFi=J#vqF&Z(=@7H7@jhN>5YjQY^nCAB@au|)6=JzYIfJRL7`z4uABc}QNlFXwK z)BJuxrqhUNe!pOvGtKW8WG;=E=JyLShek~E`vsXzBc}QNoMmO2-_KcAruqGx*l5Hw zzn~VP5!3vBE$`^((}-z(Kf}NmF|9ACY_tfozC5ST*3yV+d_j3bBc|~Ma}kZ0#ut1xG-4WGaN5v_ zX?#J4LnEf~1tkuRn8p{hI5c7!Uy$I?h-rL5ghL~y@dfP-jhMz4+&DC18ecHs(1>Y# zL6<`#rtt+M4vm<`7hE|sVj5pCY#-zQUP#5BHO(xDO4_=01H zMoi-iavd5mjqiKxWYhS*N2bt-X?#JnLnEf~eV3%uh-rM^C6j2xG`=9+p%K&gzQay7 zjqf{T0*#o)7X&;sVjACnka09(8eb6c(1>Y#-zH;d#5BHdlMEU$jqh8S9!E^$3yvNd zF^w4jwR!r|OOV$v?GCWsP0$Vk z!`(c0p6g*(nJeEl4jlbgIQ`Ca$Bm9N!MpFUe~X>|>9(6~)73}R8s$^vXobp`%31Po z`23$njw7R`o29c*RN|i}yw>88RZy4~uHBEvNN#JGg`(=_?HSBU#sB7jodB!DHKIh} zOp^Qig_ZM!S6iB%kEXBMPt*Oa;gzBy!qGJ~#(@KFx;KpIRsBVjIBbk-4YQb4J+z;S z^VR`Zp((taIoss+(laXQ5`E9*>y|KLWU=iC_~XAN-L3LltA7Xn31?%tiWOMc%K{JZ zo7)lLN>&;RtY%5&Vm7GU{C^|LwBv5n)6I z>%Bt%tM8bb!ey+?8NF=k0k6An3L_9%@5?*jFX{E+QdVAXofLm-?}{gkm}mXt;gWJ% z!z`FtkAW>EC%Xgn(?2MTAZG)0?uB^Nwc^s!IhnK5!V8m|0DrJGe0a}lrsk7-z~iqs ze3;b)6lS-ESrD^sn#xJZC;Pvs!hCBLg1A}p607h(wL;$TTuT-5vi)gc#3~!8lPtvV z9;bXj?O4>ZZVK}MZ)Yg2;aQ0#rs4qpU)++J7JU@@F)d@!&3ZKYe|k%*!-t9z&1qRm zY!FFf!-WsAG!Q#})4~TQ+;Gl*fEzwT)I`k7Qgb~&VD;CB^d?I=oF}p$E4a{73~swW0xNGg*Ya?{8**hhN0cd^MKG|X^!O)# z7=xDba%&a_?x*JD%G;t@v*5p|657zYB5PhG?H^e@6Vd#ag=i zbH^|4zsdKyFLZ|74fyIl)b+9JUf1!ijjnO70c4KzT{+Wv8{!9E;XBf?-u?^u!nex) zkT1`EjlIo2(>~Jni|sAjrKB&o0xN78q)z=sIY@m;dR@H=Q3R&RXUgBoo5&ezALUhW z$`>Ur7aYiu0<~_aEVjq!?iL2sLi(H*xZ*d!nE<{MIM!0vv>9Z7{sOo}&B*rOtxbN-cm*e9c+(1^Lv7aCY%zR8sWXusBf?9NUz5x|E8Aqe0YTW z3j(BOhPp|w3p_3@IWxB|OV;&0vd$|gfR~M*tUg3N0#`#RY@5k}Umw&xwsOg;vFZ#~ zI&ZgL?eujGEzD&OipT-wLVnOsmXBA9&9gv)0MAVQ1~LK$U~%5EBDHC#T-K0T+ue=5 zv8{DedLwq}^K6+*6gGM_w6QV*xMO~QEm#NI_Ht-k|khl!I$tJ^CTr{AYOmb1sTDzAL&t zi0bDRWJ?bfs_RfQ^l-RSZEesUwKFU>Oi#6)V>LH8kzoJkWN(Rpgevh z917E0bZ5kN<}n7xBy8Bsf#0n^5Fpcd%?z)l-*Pj`59Yy#G)H|x!>dyI zC=*W*DMu#<9UIfDPTK)5Jl$Wb30;2+c7xXkKkrRz7x^8D(~Ta003^Ln^N zZ*17!o)6c)KyL1$iKsx*3xw-PJEJlP2K)<0sk!m;Q9Pbj<{%5F4#v0;z;Ki~UELTz z!|a3UaCvR2<9#Qw9&n_~3})v__ob`B_{H3}jqiE$qiK10U|~&1`J$%X+`XP^==v}RuTQ;Mt2Hm|G&WP}@g)?*A#%yr5 z1keM{GkO5;>v%BQ&>1jE0v$to?dHvB7Vk@Iw=^}^2jI4xlN*rE9jX?3L`8Ma&qeWP zws9IdJ9}0!rr{x4UkeYN^leQTI_sL7@Jw4Dv(|0tZ6J+dZqva)E(tc-LbGtK!E5oG zyb%9Ak%K`ML6n8Ikn6uFDJcVmL1RJG`L+-lDjT!PxCcJ7O6b10kDI|#13&D#+Pd}3 z%IU^NJUpx)6o9}Ym>nRq4^`Wd4|{rg4h(vCscnQ`etO)_G_=7@Sid{j$RLoLPi7XY zTPzj9-P9k&bVg3m(AL_v9ktoq#6}Kg@2pkugGnJLm`x7#Qwq-N#V|6xQC5jWH@ekSpDS4>7o;q_{L2lY(G=PRXLALHL-PaF25S$HH*IEqYX0Pc$voN!W z`?a+PF~S$*7TAWOzPJJ`BX#=I$%Z(_S5y!TRO$BszlkTe9;dZ#*S-IB|Lb}*zdev$ zfFUARIww!9VfVPXVJlb-5*Q@djj%E;7|aaP-szaEpaO8Sg_B!d`uZ&x0CAsTl@O&H zb2!*c4Al5VXHj4TP3R6exv(_B+#?34Ls2FsWEg_7^O<*Xf%KT(*$#w5fRUGgZb14} zS2CWot?)hqO%Fdo!i1f`A_3-#e!)7i*Ro$q9IH3@+>m4ph zhUH0#f(&9IV%wim6X{tDDi`SoeR7|qr0(P_28oOG{cLq-(pDS@HH$&)B7HYmU63@B z*^A4CW`k_Lv9_+M8TZ*BG3!2ezyy@N7Z`J#Ts*z`*?~%{F1r(y zb?c=Db(FzMM*3SHh3=Pi<25q~(8z#%wKm=;V`9hnK`{1G_QF~0-3*U9dUkt9!)EyV>+`P*hNu(u>6JyRjGHdMAp3AWN&PiKErWE6 zIQjdKd1?=y7K3k#IC9ikxx|>u@HrHF?=a}CFfxj_i1ft^$}7?fva>Nx9>u=@A1a+7 z`A+q<`__W}?-lPOh<9Ir=z10OU3wS2nl7Y8+Pm8Gh&*4d9p--B-RM5tUF3Sgb)### zYqIlh=f%!boI@Sgg7I&hL$lvvud+|Ky=OZfaR7c)A4IJAaT9m3pqz0W4i4enNTt(WJk%2Exkv{DXm8)EqP_<@SfSHxRjhUdv7Or z*W=&wbAy4j&Y=k{omH}UE{xgAPOzkRZ>c}ECB6Mr#Y%;q6ZEg_OzT-*ir;(CF_x7b0G9q~&@^%iilo#-4r*#fUQ1zU$viZ8I`zKZpeBkDOvA4M2(d@2jN2mIY8t&=A70sgqvSbHXW`-sETmR-I+GNd z%0St((5lWj*SJMdsob`nIj42n_tTtUYp1PeS4r`c&4GS~@^-40ZVs;6)=nj{3aK>v zfO~6eC*v#c_DwgCl}aR(11{0qNvw^|!5lzJxFtLm489C9BJm!zOQnMycMU`q1~#u#iYOX<-n5_n5Hpn^n*nJ~FX#|I=NY zt>JBnC8jdy9q_&JhPPU}M<6>pExaX(KIWEWW@J=_8K-ym(LS}koIM9IZ@9f%Eefl` zZApqs#T+LVb%dp;oWlI7@a7~%r7}h(7S(DgDlaEEKHLJ`vQQbG`2HIs7{!!yH#?Nc z#lp?uO`=l5$_KOj+5gK2qcz-&BD)Pu!PIsPAE>ox4R1^=@qha8r-e5p>D;B2SfXtW zHzii4@PDarPk24LM|>p0leaE;<+8DZxiPVF|I;zs8*Z@l-GU%$SD#QjK8Qngb&0k6 zpPF2^?;xmNa_0p`D>d`I{iebv5F-yGjG`2COZ4fc6`iuXJ39`AeJ*St?-f54sI z>%EtH&w~H|vEB}ElXo>%3+8)gcmv+?-eKOpUc2W<&zIlL#v#yFPWj<9fyQBz*dBcU|kc*mWlM8yxLwbE(b;ov%A@aK7(a=PGh#yT-!5 z-{<_^`ML8M=UvXrTq|8mTyvd4$5&2=<4tEj=Sj{D&KhThbAj_<=LF|)$4`zA9nU+@ zb{^;4;<(AN3BLWsj)9Jajw>DKIZkzSI*xR#byPX>9O(|X;}OR__6zMR?3?Yg?H}9U zw(qp>v%h42+ zd$cRHom!)|Su4d_(KKz2)C?f>itPJPyXR=%wD&P=hh=9wK!2a3%E&f zarhG&

m-;t+6|Vi&NFViT}RQ3V{NC;}EKvVfHe5pby@3FwpmBVdL6i-6_w&jOao zKMA-*{!zeE`3C{l%HIoED}Tpt+fN?(TXC>i{x^r90Fl2DaEQE5z-6)#CjCd!NB&wI zt&+bIaFG0^fJO2b0#?eO3%FF?BcMjA^1lQeD}N~9 z82JMMOXPnFxKVzeL(q1}?+G|WepkR{@;d_dk^doJmHf7VgXFgaERz2&V5R(~fJ@~! z1oX*&6R<*lUBGhrH37@yR|Q-mzan6%{IUV1tK^r&(GBv80yfDna0t2$`FR0{$j=G5 zOnz3tKJqgHR>@BbI7og4M+7XB9~N+l{E&d9 z@`D1dm;Wl@I{5(sOXR-@*eKu6At*BB`ve>!?-pjYdT?-H;|zFNRa`3eD-%9jgRAzvzBxqOL$W%9)W zE|D)1uvETKz#{od0f)%f3OGo^l4Bj8RYDBunySHKD-Prx#zP{1KdK8G^d zp=9Y$`i88OLjo?B&lGT(e7b;D@*f1Olus6LseF=v74iuJmdnQrSSH5=Tp~vWEXCwi zA9B7SC30B6BKZ^nhsb9LI7mKKz&`S60{Y|=IRpuZe1w22Qf%f|`0Og=`yD)}e@ zE9LD1E|rfIutMG{V7a_Sz%sc*z$J3KfTePqfF<%~0gL1v0uGUn6>yNeQ@}p*(E|G9 zZ5)CfL~apqncOU3mApZ~N|`^w5*R&X{)hus$ovroESKxVxn(kcZgF&p%pYvPQkg&4 zfF&}2ngJKftHfnR@_GS>$eRQlBsU4zN8Tu)Pv&Eb1l|vsj|UQnJ7oTh10F8(K|lh# zhs>XB3EUkrfARqr$b9Sociw!tlIIJ)4w(-l64*H8GJX_H95R3OadfuK#|FUZG9Lv1 zi)8-5OCZyb`J)XuT`s}fz^MJd5#SfS2;w29D!iG1rzl(xfPECM2SA^~ZwsJP;kSi& zq%V{f_Wge!`Bw6M<$KTflJ8;P9loo5=lG8IZTD@!O29(j3}2RSq_2;Uc)#|(?|m7& z1Mc)*<2@IC0z14Ly(_(oya#)ydeiadFMGc6eCT=2^SI|8&-I=Q@y>q?dYo)owiI{fcMEM+HlS5{*U`h_q%u_eb{{m-XYI%AMf7o-r%lwFLEF3&UTM-_j4<* zeXb8&ueu(0-R-*0b%E<-tQ54kY7nEa*cEV%aSd`gu|n{P^G)Z|&ikD=IWKjd?(B4S zI2#bVkTU=db9x-VIKFVa<9NaGpyM{I2At)HI<`61JC-{Ra}+tIIEFjCc+daR{;vH+ z`@{CT?AO{au%BW-)_#P&&c4(>532x^!2#&A6Wd9(+~-Bxc~ zYMW;(uuZfLv1#hh>KE!e>Wg^mzf;|%o~NFu?!+7aYPCc?RQ0Q1$x!Xex5`I|(D0P9 zTltf6v2vOcRyvdhrBa!%6e^RHq2OBhS^ivpM}AR$SiVEPT0RH+EOyG98=;SFRyM@N$Y(6BLJV#@3HXm%zc!tI{;9Q;i2I8|c7H9JzS?t$1 zn-9dNwHRab;Tccx(O6^r((&X`Eyl=v_>bdlT8we|7?P^R>P%@0jm4RK$awMyjm4RK zAU;K7aV8%!j%CZ3e0WCVkS!zfF(hQmczg^A*@DK$Xv#R2ZJfsk`8-KuaULHsmYhRl zaULItPtaJL$A^p|_t03J#|Pr$T8#1d@NzN~8jI8TkPPw|jm2qv$Y@qyM&rZJ9gX@j z79T@GeV3RL@`-c!;6l_l&fx>`1{#ZV_&|JEi!lx#p3x{=8mI6fqsT)v7N_um_#llP zhI9EnO(%b)u{ebfNhc3zF-GCTa~io$i!lZtLu#b4x$!GUlE2VcoWX~TB=^%;oWTd; zeKa;Je)0(EM=iz}e0WYHnrVy?`0zT6kba=CID-!vLEJPJXYhfzTZ=IUAAad@=!_Bg z7!q{G_jO8!h^aqb?7cWE)k-NSPl;-|4Vbq^Ur?xZn4e&h{JBX`hPoVtgkk=to3PTd3X zHX4gl_dvXr#^TgH5N~nEK;1+1a_U!UF%b7~QmT4#vlg2qq&jkw76WY$|E-SP=#GK4 zhhMf9mw~f~|Fo9;NsEmWQZ3o4#lYCZf2$=oXfY7>2E2euF+y3>k-lgS`1u0h9sS;#X!{~e!EtSfvJZ}E_NM=dW5t~i-D(yOHTG1XnKTn zwL1ou9^N1a8U&6W{*!}TMPqS_9x_PUMPqS_9*C#XSe&AV3?f(3Se&AV3?!G+Se&8< z;$<`zr|2OA*|pdiZrsO#Gf2}MHXVd7BanVc8qS0*@5tnX_U+TrBTP#1GNuwP?l#WA3h_+kAQ)#r#6v-J{ z^a#<1jwPpS(amuQT{hYpm&j=}+9EDwQz#l`mXtr-m~zpmX-YBeqEXY7ddMGW)HJ1- ziP5NON->F}QPY%SB1fall=7UZ^dXI!wiIv5G|FtL@hdq=i<-t%bJHj@ru;{|G}EYQ zP2JLKG-_H?ygk#XX-(bacp7Ealwa#&Co^+uh$N;(VNdz9cC>UKjhgn42+uQ)Cuao=(2dePSEc~O>>G@a~fsll$YuRQ(Dxtr%uvEqozG|uwqSn z>Oir~p7Ki_tXO7Hg@|HJi;8!38Z|Ad0|aeR)1o>^Cyg?T%CEJva+pcw&9kE%)1um0 zIi^Lmv*wu=)lLS}=zL2~8)%f7RFQF*MopV)W92ZL%FD5#9Mh!QSUILiwXt%TN#!}= z9iK)`n`$G+(Wq%tZRA)QHEpWO$}w%KigK7u_@-T(y|n|4)U8Jl)hVGS_tszP?qsA*TROhBW|u8NFz(x_=z@hL=$GQ-Nt zkx`CmS7la?X;)=dj%io1dO)M5U6sjp8iido%E2cR8ii#wM0_UEqA;ySIRxdvw8no# zITI`*%7Jx_|Jt8MVP4~6KN^L7jf>l86b9B1@d<@SVPWIq78-?#jf)*L3LDEs_Bln1 z!pQPUN&i_%qcF1ZAKPdYR@M;lX@y2%X5->!ca+&#U2i)vM8V7&zu|iejl#~xMYIlv zHZCrsQJC7eh|w-?Yo(t-^cjuYT8M*aG;V7l7SU+j)&A%ZZM8C!8O2y^4s7QccpH*Reqf-pC3Z6Sg%mswkJZ7F;I&zH7JzRP?w@qQoi zwtEM7?!eyvz4Uz=rlV*deAhi54E)9Jx559n-1WWdBiD(p?XIEDhn<_8WzJ%}BR}V8 zag^Kl+F!S?wad24Z8O1XA67@HeU+P)GWjcb^dBh?A-l%I1IF(&w zNpH#OP7sXo+%xoz)&=k#NvT=;;diO-ED;5W?e96M?fy!({e5+3oTyAx-=Es1-2GJF z(+OU(_+Bc1;p)zXqB&-PDQ(@{Pl2mC9#qKW(isqua7FaP;H>!0G@^Zn%?XHzrl|2yiZy>l*O^kWVhy`i1_ zFGEqKbtWNb(}#Tjs?In;n`m%~PFBekn$|gMKSNt^b>~cRFU7-z&8Vqtjoi<}j1+7o%S%({X zC3a>PmoC5)UeO6Uv>w@}=Bdyv+v-lxpIPmYKMO-sDmN?HK<@1X=~;ilts5xB6ev!0 zChSIGYVJtMi!10>T;ZzDe9=1b6a-Q;Q^}u#Rh^87Oy2};=Knhm>!UkCLN-xnV6^zN zrf(mDeT0l|&1|8;j4*HRL=I?7nQXbI>aV&Yk>Ig46bnm~hr%vN_Y7BXF{;&Be9Hc#H~<80+13-|-8I~fOAj}lWd5Bn)` zb!TQ`0V#Eq{S@HooFZm4C8e`w6|C-@oLFE=)8_pYxVm#vVgbMBlxbz>L{Wh7e@>C3 zFsZNX%FYRi*{5_zl4kGi9B&zl^79K;c8=>=UWzlEq~)#b9GjSZN5 z`^i2dG5eIPP}1z(c>ixyPLv$fevW-AzEM{rGM!KTOg&j$<$Kq;(RqUJe&+(;CBCR{ zldl510Veo{!Y6=uzwv(Lebf7#_aWz>ymu;hdqdu3-b~NWo|ipWD<^ukdkQ@hJ^kp9 zjuYrV9e2}b=$-i9A49aiWwe-1q^{@I6CMEz-8t@ISb2Ef^=H?m*!jQNwZP?f4R#Ud$IcfVN2qg@FO=61 zjo=;?%X-E)?*B{vPXqrS(mc=NIQ=87m&s(~KiJ0jxL^<*ebh zQDeKE?$3-f^UIkB+2DvN$6e$2{5vR59BUg`oNzoag?r5DPDp-i6-jz^zC0@F@jQ8W z(&GWSPnK=sAs)H=#H+kG)1R9@n-L?mZq^B-K*v%CE+^@V8atb+^*H}`o2Zf7N82zB zOU&M!gppf^+c1^uaY}JZZS!{UW=UO{wuuNR-@QG>OEdG*i?@J03A4^RMh#Wgu(hdS zn-pDxfVH>@y@({iC=7I#8IVXO#Hl5HdLQ38ks|@I+kYkGxNjZWl-sKyyj2Zr(I%Zg zb^mQ!*MV{t^-6b@TbdcOC};(1W`n1!1=IPuUk!FHUDEq-z|r5-&;QwhSBIev({ozWb0{s0|B~vOb9?Hw)GpW%Q`wkJIvBny)s50EiQkNe4nq{p+#apP=oM>a>?bYg!o%~oNkcekU#b~ogeqF>~Xrzo8r%w-b{8pJ6}rZ*gCCI9yvMb`8m=> zJ&NVLEWw>gPY;j_dLGw#PYR`1lOE3}CnP- z&Y)FD(vlu8Aj6U#50cB09Un7B>g=I5&XbjMOpntI`Yduu($fPyyE8xCPtp@l$Ea9% zP}0K%Ly{iO&q#VWxG?Eqe?J_~uskU|CJR~Qvkg3m4>xl*ZSL4U@etdnrf&1E!px;0 zrCe8o4-lMxwY`S1(AFH@(z>msMwlameNQ@Xift6e3(It`pk@I`NEt0I3>LUto4|X? zSEh)TX&W`C+sS#R?OeoI6&csh7S59@-8aEDYKDhcvd*oU*~Uo1Yl?M3QdF^}qph`B zn`#4ZlC=)M%9=z@on#wT+%4l^W}KC|W;U2lLAbQJwH;0Hp$><5T$VZn;&m`Nu(6!h zl4BcH-mMP)Y^I1Uji9__^u09(FWWfN5J<IWI3*oE4lt$d-XVVL1r?sI0)^ zG+V~d9)}SDCM%Gc^arqxWhMOqbZbQ;Y!ee^#LTKzw6-?4OP3{^(Q>1^xfO)xE$gIM zvK#~xV7qiVzW)=qJVDYuy5IJ_=zG+6kMBm`<-W6hC;E=@wSf;{g>SKMrZ3Mo$v48+ z&u91k;QbtI0IzzV^xp5i)qAz~eDA5=uy?C>1GoUnymP(NyjkAS-a%fs=NHe{@CbOr z^Q`AV&z+v@JQsV;@I*a3JT0EJ-~l+ybFe4i8Rr?|@p@$XZ~6&+8!P~i(tF?=a5+7j zo=A^@cR(Y2*ca28G>=ZABWOQr*M87GhX?zs+LPM-+O68v@IF6P3&TrbgSJ{L)8@iY zAWIvq4Z>Q&FIY|Z5bFugVnyLj_jT@z-DkL?;23Ce*Sag*^W8=6EHDfVa=TqWx;}Hg z<$4zE0yn!ZbDiPpbal8IT$QeQt^(IYFbZhSpPYM~Z#$oJKH$8?dAajUXT-V1+32h? z`~`;g@E5qsake7{?tmu83diA&>5eSNNJk%s48DL5?62A%v)^sM-hPq&5B89~9h?DG z_67E7@D~_n_aHXH7q)k7FWMdkSHLdY`L>f0C1JB|Ef@l3+j4E=YzNt#>i6m=>YM7* z>iz1?>gDPm)u?);xk%Ja&DUbpbUY>z%TNb@_X{j@}u&faLfG>XHaEzG{-5@~13r%8?0e>RukFs>*~X>`+j6h6uiv@jhC42D0c6=e%WAeP z8J%QX7!0=(_>PhU(?ahp^Z?-vJt6c!z|;Vtgd_w=fKWnc;rq|d?5^DM<<;vi-}n1| z(hofUXLs7p&dxLQ+|2W*A>G6V8MzOUGChy|F}9@Zd2EldB~8y`cZ@9s^*lDm2uWX9wyD_9z%e5>cN168Cu0h{Xc z8(ryZJ&*mT_Pww4Jhq?O(m(Y4dRO{V&)2)s-}QW*D}ABoYhCGcJzwKWpXvE(TWTYp z>iKo9^fx_UiJc!^cOu}=}I5!`IWBp zfu65$rT1C>IFu*0HoZ#TWqD`ADF{w}&+^WOQ}POVhvl6Orx4#}d1u2Z#J5=9*>DQ+ zO_p~yoI?B^%kvGVqM%pE8!YeaI3+KW*IC}#aSHJ@J&zry;vH-uzt!{DaB54h>Ur!p zwWU||`~p{cSf7A-?02q zj`#$5mgQ%55}#rD8IJfk`8CT=?<79W^3ytrPqF;ePU4e#{z$vnR`P_NpW;f7>-ov9 z^q8KXYxKOc$CNy@hUJ|-rsP3r`@FNq z6yifH@9Z%pSC9wwJl|s~GJ0U1p66Rkg>-KV%R4(v$>rp3mghT6#hbpI+@@X$Qk~>)5*-^}tOI*B*w z`Qdgu)R7xmewcIf66|Zw5A7sg&+?H2g^8+A?$GfDK z--M9_rH(f57t4pN@DI%X0-Px?Bf2ljXSvwZ$`7-c_L;|l9Ug?5nBSRN|W$@x@`t5ECRZ``hN1#009+cmB}Exg^QJIZrAY1bXy zxt*9ASDhkOweBd+?If=|dUHEDMdNBy#5!5yO4GvYTQsgRE!=XF28Ai{i5gdz;`%nN z*}*4hTvdweZ5mgU0&ms0niP18#+9VNn>DT?1#Z>2g0ygbPUGrP;AV|0M}d#mxM~!5 zlg1UJz)c!givl-lTqz2?QR6C6;0BE=M1ePGTpbF$UV}0exU^Q|s?fS#Tc>eFXyK9? zjjKTmA6%_*C1~M3Yc#F`Excx(#ucEzRT@`+0hO(yXI4Qfo{`5JVXz&++_ zP+$_z(V)E~o~=Q3NjyvAddtec$59&BS_041xXu!IhQ>9Pz|%FZuLPc^acw2=RE_H@ zfsfRnsU)7FK~G6MS%a36c#;McCGkWJ`bpvm8kCd7<29%ziN|R%2WK>BC3!uqK_y9? z(x8wePHNCb0*7N7RFT9{4SGo6p`$b?A%RClG-x1+$7)bN5|7ci?y;V0RG9|NBk^br zYDeJENDVqi;t?7Yj>N+?Xd8)#X;3v157nS&1n$*agO(Av_Ye&#M&iL5^ozuUG$*Ps_9)-)&uiGvz6g2Vw0>Of+D5V{~}y+MO80dIgE;mzSXto`SQC&Lq9X}D+D6Z$;#N38oF5B*o@C!vc&XNFD+ zHHOxN7Kf&V;-SHzKJfkbrSWIux5iV(ea6kkrN$48lZ{RA`M1QFZX_%Z00H(D`w-s# ze#3sje#)+9IMBzousU`u7zQV>(X1~E>EG+0U~j-K{So~x{aSdZE5N5*gI)>d!6|wK zdjxvviuO7D$h{1Ia{q;@cmH*_Kz9ptw?KCbbhkiv3v{fexfGA3>zRqgxg*vy6YFzFtYapY=#E&cnOLQJg5^^e%%nBCiDkMlz0s-~ zW@4c(V;+MO=O)(bj#$l1EY}@z9W$|Fcf=}YV$m+e6?82#v2J(7EHklmcf>W!#Ohs& z%js%nVgc`ntC)#3ydzdJ6U%rqOswY}@mOYJN$-fqFcYhK zM_j>7EbJX|xo%=@FB_xW!%VF1otw*;i3PqRF4aw}@nzg49^J$$UrLK1VVy6fMUb%4 zm(oJyinYGXWnwhXEIN~T~ z!mQwkBbf=yf+LR5O&AwsPD8fqCO0owrrNP|m~L_dgOrBqCO0uiX^3ueBZHI%>n1ld zNNJF6azlfZ25P2bY8YFqo7~o5-72H~bdy^fq|{e8xxK-XM$;p7lUp35RHB>Q<{+iR zHPf*=RMqqK{~U4|2|tB3|Aufh^gdShm7#v{;D4WSim}Y-4L<-6vm3EaU(Uwp|HQBE z*J3rE(EZv|+J*QXePr;X;C;cZ!TG^Kf$svp4crZ1`b)qE_^SUb|1`fB9`b5@abM8; zuJ?9$zF+B`pnj>|skW&JwU_dYa)EM!GEwQ}`M`5Oyw#=X=kzYR3?x9iP$m3D&9y#K zf?6b#(XvD&g8eJlU6XBWD_uAh+eie>^O9;#cAu*&wHW1daWl))9BZVa8KjA0doj3( zOC8#I!6FYj;ugL^!lD75UcP9qxyFxFd9M*k#>&7-DUN*c7|qoUZ9L=*!<;x1XTXqP z7|3U{U?|?5ZI`n^HnyxZS6i8lFw&7^Su_(X2d(C&EGi7*)8_iMt)R!o39_oDrVaJg zWt>u&v%iDA7g>vk0K;%~RXvz)>uW%pTEia@%(>tP$C`FfQKx@9hiT?YD~E$Jpreh&BC}gs zu;&S<=Kk#*u!()LS-~@DGB_PKxI9aTtzJF5Dc3Trls|n<{Z{MU{EO!pWgf>fm}5k7 z(m$3?FXeljtmbr|*yT(gVjjz5PcjneNEsM-oesfMmDX1C-NO8U-!StS9&hTN@jzSJ z)QVQd?i(--R|8KlSMZqiMl6{D?@4k=b=e-hp{5y(?lqu&7g?9$y>P;4^rNQ6!_DP9 z^)S?)GjT?zi{2pia>dPM{N}MnG7~FHCZfx+84T3YU_M5}fY06~)3zv5L2Hd1bJNVF zJk=H>0n+DaJbrW&XraZ1EWyBScd;t|$moH~mdxjMs^$ckU^33-Kxy6IEa#a-jc7Vu z7E49!c5+*Cnz=+269)-vGLoELmu&=E#-|-kr^ME@dQJoHWCX_U##-wmZEduk5UtSCHq~6jQ??ozFw`bu$)lSe*5*vr*v4m((VGi+gt!q&@lk-k zj&;>F+13X1A`E1$;HDpA&gW4U8Y%F?#uI6thhVU;tFNuYci`}h%LEZ~9#2q?k0x1` zN@hAeynJ>PZ5>@j&8_yU9%RntNyecsSuD8LiGpgYy-MAeI?SBIV@)+8c&Xs4+$4rg z_q*WjFl*VI8M%l#TT~&HN|YtjQ8~cw9#iaOECqir2CZD)XU?)l#FGq*);5!w+Rz|x zmVy_Yp98_WL&ui6;D{}!_^vI@ZbC&iL)?q1m=mn?>{~aMHnwhD%U?bQOHL#XdTI=$ z^|{i*s#}YG|tfZU>x$~#S zx!w8bUxl89(OB{%&o*aRk4BA5g7f~y&>k(-Rd~m>e6U75oOXZ$;+m_ekteLmT89I~ zC&~GZIcq!5e6~4VW|an&C#b#`BH@;1J~X=@e0`_0$kvzE$jR&RUum|6liTBquWxQU z(wxR0DQ84bsaP_-sI{51)$g|VQqU}mRE~zIZU&3GH4rAusXU7c420k;PG%aL_Fr@U zovm$d+Ja}DY97gxwHi^daVO#tr#bKiZL(^?Im)Xs;vkZ-WWgeX|^QH6i-`W;K|Bj znY0-7vupW|W+;BE?{%sks<5^hEtNErJXxiY#^{50F%^>^e4thQJwZS4=RuS3w_y#s z{QIp%k8c}eCV0AqMjDe8@B>fX_dt+ssKvqfmb#6(@n)PSsI{gO@mLbWoHYo`@znZM z#FxvbaG0y`SyDsO7K_Dxq#5IhXBn|{vMiB_i!l!BxXPH zM8xhkZXZU@eCX!S*y(dknGvgyAz-&Ii>ISA_(MYzU}(aZU~S2U66Wu|KDUv(FTjUi z)q)o{&>YJXrZGODz@)5Q>00!S)=l;}6g9{2NXsxANn7?04K zFtAylc$rzo(LYDK%+WmlBqIjZ3o5e(*+#Ba`3H?0 zE&6kWwbf}8Qi+HN81HD^T?I_Fzzj^y#<1}8I5rz87lncn6I9t9JV6h@rK!}*x}#W$a^qXGqMkJ2u;<}RE3S%!_6T) zgXsn;R2EMq_!f5SLqrGS1>t2k;?451GUi|&b~aa z0>fvryA?ee7sqa?UTbOJdVFFt&3;yHlM?7CnS`UI*ET^JKq+93F20dX*|vtJ?7Ag0 z%a_))Htdy8+U(2o$r?$_ldx*B)tgl{KHJ2c1S%bqj+QOem}NU^KR4Jsf~TB-PL5Zd zjxNU;56oM6hj8>V2EL?O!lP9p8b*m!8t()>0z*-Cqveal?Hat#;jm_t=!tRjaGnn9 zUaUFO@gxS?I%lNiZ@YRcM&4$wOgr^IjowZsl3#m5?Mh4NxX@hsL@4I#;r)a0z44f_ z!T`A#GA6G zu>9?y24c!A=G1h~k!r5Q(*<2GX9;wiauxC8xqGMwm3Xj*j>Irt#!_@MtVAWArPrmC$ap02E$ddi zs~nW+(6Q=btCQ?|P;f>hIdsthW$J=|5nm1>a;%~K2dfj%B>VY9#Rp7}NUD|gYyaPW zpz?dBC00es+c5coU!N186SzI0^aLypFkQ1ICAGOyXhD4aQF^fdRL`_MdwRFr-2(r9 z3y6_GF6{VHQka3nlwFv$5`4~>O490y>IRG&PF$`xWc*y|7U&b#ID_>ypQ_eYuZv;Q z7Eh$;I;)^%YwM41g}bWO95hZ2>HsbnlIfln7v`XLc=4~StXt=e2QDvfW=KI zCY$x^#5@9Xfx4!3IZVULunwlo`V?2VQKv6lQZ7|?X*`NmMLI^YQxZcMA55ItgzeW0 z6CA7r_)H4Zie?yv(y%vX(sA=_udggMVLyKp7fx`|Jj@K`nVSaT-ujx(_cd2fumu*9>u9`o1IToqQdynZ}3 zmO7Zy+R-sF#4C)G-yg0f4Ue3Y?>2!YzZrzln4+s%LnYR4HP#f;GPdWENj|B~V4vzt z5l1em@ZQ}O8CMb!7*!&vxIR!#bLBY$m8z@Wm=#^mn$4%8Q5eLd;;$hF~9 z+L%jYV2Y)qI@nV7g^pj3>z1DRngpX>`oYmYLofiLKPT zzx-T0!dG!o^6m_E8&8ID21Q^2jOsXxr)J9xFV}_K7H^r4Hf?H<3+6})4~SRrD{F9A z+P0~>)AzUg=)k{`DC{vXb(0sZ0cfclH(>I??*d{Na32tc4e>$o=ZnSS zH8-4AS+?fVO-(Q~iP_ff2AEtb!RK9xA)e(p$?EYa z3DM>6PngV=S<^bZf5CQ&#fN1L1^@>~M8@iKpD^oMM8T!;BZ^0!(@3SR3OFO|GAg-bBk=*XF9~ zVZ|>)SKka9=x#r^a9y?zZk4RTlH254H^Jb94xUWL%M#J}ESzE=_iyR3?nt}0fM(=q z(sLexk!BT4$+K}LKW+>+`Wgor0rnmHl)cB^V9(=J{(bCrb}hSz{g8FAHr5E%zGK(| zoXbyR*Zu%@Fw+^)ztBI>-_l=%U%!X2cmGEHGVu4EuAi*8;B5XHeYrkgpQ@+9;x_=N z^L3rVdhi!8`MseaC9(@bM_zj{^<_{zQn2hcY`c= z2s{P;987#ssXAA! z$7%mnYEDgqY2jdXwDNaVSBdhW^0x95%q9l~L z%4($#c3ga}Xi9(2_nwzLKk+=|xy$pE=Pl29p3B2;hd+Qfh`YisVNb|I;d8?`hA#`Z zz!yX@ygED=J|OGENt_3n0)G&F!dmG2&n*@91DvzQ51h7-T6j9d9Q128`)_4w4e=07n zZcy(K7grMBnU^#&QWr+U48 zvA24ixLDbsUMntEqWo(lMEO_SS9_>e$*4WmEA5L1saJ@LD;w0y#l@9Kf0+$?se+Rk zT(&*bOJvlZ>c#f`p6W&7Vnu^`p}1Iq^nzuXR-pU~?5jOgLAVTV*|2(^xVp>}QqQ%a zp`Ii10$HhGss$-4Qw3WtpsxN%L|sZBQh#W}2US633)WUmJu9Gkg4p+@o+)x#GDJN? zqCV>B67^P#BJmQBUoFUsgH&*vdC=xdJV6y)D<0~hi-)MEO4LW~kf^uXE+Q^QYWSP5 zA`Vgo(=V7|1L`T_;v%1VvP52WyF{ugcxu5L>sJMBE}&1{Chjkcs)FbiWU^khO394ZArStJ(Hi^fW@1bgw zxIeFt+9*+Pb)!T_sgj{}o`d6IQ{!_N`OKl;s*>S#4&9~J+E@Rn3SM10 z8xaJ(E#NLyQ0xMJr&fu$vk+me4R@)6VwcXM->7TE)tPjxD*2sf()U!!?>v)!s7fN{ z8T9vRM#P;#KTy*GPN(myDI5M-O$s;-nMtnaX~-;YU;UFB6L2d1qZ+m0AJm8q-&My7 zcqB?2W5ajUG65%(`_<7l{6ZZiA^n{?(uTX#5jK2V9WL5A-d`OiQ9pI4L`ijsh#04D zse=Wag!~8D@C$XIgvft@4R@)fHhfdu19+)V>lT*%3C}rIy(64fSwQg$e!D z!zAjb9xBmj^$-zp0^Z}nHhdjt_pGmBe1EmKME%r*BpR*u5)sEEO-~!XruGo`$Msjk z67^F<;`TWDTh*}Pt11)sGyPRvqJApQBl7Pr6IX*GVurq=25k7U>KFIZ{Z*et{Zy|+ zqg7QzOru7M4PU|lV&$3YuTqKnsYIgD%J(8-ir%dJ(}pi9---Ll{>rx!^;5o)XteUR zh?u0il&@^~g7Ob>Kha!uktr>F^VdE zV#DW@kH!5+v+|L+2m)Q@FY;oe@>g*Yyt&E;Hhf0;P(aYo$B$dE17MDsPCWLq{vWlgO*Q zC6TJUDI$XNR{5l4Wc~wA=+$t}L3JRp&x+%J-VVph4whCf$+Chi~MRemm!s{EI@4Z2z7ZX4dC+$A80 zWfeIoIy|b#nbM*3ZsiVfAJnqS?KZqqk@F)^$||?oSMN}65fDtM%6Sr!8BUNi4KGqm36WX5fM76HPO;&S z6**hzLC;m>WTHofvR&K;hSCO-caD^gg6JRJ+bnBwJZ0+d1#BSSsB++G@RX=>X3*u@$@{$8ZeNR;m6!o5AsvKwP5cM}AY8|3JD{`&tsmd{<&ND=n zV@j=Ou==!!TI(64%8{hjGf;g}q^g;rJ|XVccm}AC%Zoi#Il9z%O4Ucj#p)UAuSCph zPha&Bd9kM|$BAlBe^m}1>t?8Oa9M|#a>!Zd>8HvuqiTlwfXJx|_vN5beU|7lzLWpA>EiuL&;>PseI+SoqLzF!W96uUP3l7y3o$&d{}?3qplZTWAB;cnd>E zVs$r2p8tQ}c-?r$c+j}bxY9VsIMvvU9a+aY zitGfofvtosVKN)bN?A|l(LdAwpueO)rr)FA0Dgee^%M0**bmC#+i#pcO7E+OVLSK? z9spj^p49HwZiU_89PLzC4eGU(+R?BX#I+&Xq44VWZSdpZ?}IM|9}nIOYrz%4vtcX9 z1=j_a1&<1*gTuiez;I^aqrlsNU0^f3J8)g#$AQxWCk7e=s{@MyQv>n9;K0EFzyBZp z5BzWVpM^!>4*ymDbN#1Tp8YEP^Zk?k5&uAcAHUD{rSH$a-};{N-S4}_cNskUodOHM zTHjJw0MfqUSpRF@Z?XD+%ljPG{Xg|y<2}#21FQdf?{VJw-bvoE-coN*uSfkHEB#m0 zC)A&-H({NB7FPRB>Kb*iIvwXFhNy>Fe*HdFey2REJgnTIT&X&sWfXXP;Pu%dfb z4ucOXx@YAu0I{NbRt|%ZUgT%xL{2p`SkXNyhrviMx<}<|P>g$24ug_jWaB zDZ;MBia0Ijh!3(Nj?3AiN7ITpFDFmtmg_|vmy@L|8KPr~>PUU`V$hX(vtj^}cv9HB z^rGLriI3XX>1I$bdYzk#k*n%T$W?JAOB%sjP6KlMpsCR@l}_M9LGKxC^7K(B|BPy-Y7`b#5Mwn_HZlu$!^MW=DkWj1^it zi5|Vs;v}8lM=#`DskdHecBP4W;dob?zzUlniI#;;jTM?)(L?n@qZ4-?a^2`k$hE@((koGJw$OJdoC-~Irm_5V};sI;x1OG=_LM>6{;N(_BU2o*GWWV zSEa%Z#|o}Wg)NR1T$MTtTC(7(RM_OS0#vGS;k2T^R)9j4LO-nlbt;9VUVt(cCp=fs zueAbnskpTqiJ(cPfJD%vQa~bTQITjl{Yo!Di3({M{ZuPJhl+^Hdg=veQ2W+D^a3=f zke2d@P@p2>QbdIMv~PW>6`(!Et#T9wsZTY?;+ zIPF_s=mqFaAuZ++p*BUt#fS){Y2W%>FF@1tA7truK%8Sk$bxVjYj zCf-jkxY{zFWCd4S!n(@}uC|1Qmla%XIf>VSYfDk3NxTlOx}3!8z}2OF_f1xC^(Cyn ztl;X)i99P;Uryv%aeXP$PUKm+3UeZTLoc`ra{?ZRD@^e?6Yw}(UrK2-E4b8F0Six15 zupF}jSC!(y#?e>dtj&p=K}uIyW>5oHS!Uv_;3`X4lUac)OOa28zN{CxwiIQik&mk^ z)5ynFmT5c*SC%3nEX=InYRfczNiVqCGKGA&wiLOh`sq7dWtkeyc5r1W@`2Tv?cmzd z7GKnNaCIqCCj09q=Wh^|-RM#pm@MuC|OKsjDqvt!6u#oVZc?oW8@=mXT(@{!fq_ z2t5AJ2>mJaQfN!)Fr559&X~jg4A#E;Sp_>1zv(}V-Tn-}&|jpD5B@gzM6fQnBJdS{ zK_BOT-M`IW;(Nfi+DE;gcz1de>Wf&t9;^IAc~3b_84BO>cYBu6FX-8{jP^o7UHq%< zFgS~JloO=>4;Zz|#opJ|;@}cLcDffu)1e(~FZyP|aum&W=r$MQ2#dcM%<)}g1df$0 z=iC|AM%*&@5H84!vmM%=Wpt69djDlqb_DG*1UE0}HoHb54;toJS*MdG*r>xP*E<4x z=iem))P3h4>hO1B5KYA*l^wo43ygJ%R~ozT_WeNKJ@bzr$oyAzsL09?Dz2jagxzzGjzMD`C=T_C_O`uq?@}M$7iD^7`&K)5`=d-8$ZxW;eaqhYcd7RK z{z59+H{1E!-4t9yU1|G$z1hn4Ry%jMb-MIs_g(wS_LjZ#?-EP*zVokW&)NCAt#iQo zeW<;;(`Pm=nyPF+-Y(8ZVc8h0Q+k5K!@ zPEVAKfr-9hA5U}uyWFbw4fYcavZi+#PUqE?4`#o_@ay+1po??6{S**tukX}mu~=$V zd)=NT#=ADt+fRvyw%6{Zh9yVos`i>a%kJW&Y(Hg(+N(P~Z8DZTw0+%Pl@W6SG(^?j zmFd#wzTe8M-K{c-Rqfe5O9Z3a0qji`?Q84;>=CSsy=hNe@PhkbprN-G;-9zn_o!&(}8m(wwxp#408aeh=Tt$1up1H@ybZKngckajSoqMV) z{b*mg^Y#A#-vcE4!|Cv^Gg}Kj9(a)@YH`Ei?UMv4t;?h1Bc#v%@_PIxFfhK zxFGO8cG0&4dicNa|G|HX{|Mg~$fEnNy9K&ipt}XSTcEoI{xdC*>=+Xu17^V_d{`%@ z;WR8NO}ShdcWJu1ysEi=6F(TgdN|yrj2Lt@ylqbz+);*fL-t4)Et_K>_7~Bz9iwf{ zYnywMT{B+n-xQne7`1m9U785(zl>1F$j;NDOybav5qr&(g^4?!?HImiePA5!%4}o* z^~rV&+q;Y|O)d9dMyO+G=Vy+?c0XkALJxRD5AIZGGCpo-#~?KHRQ{vIit?qi`2S_1 zp<|;pOOk7)Y{$U8YuBX->i(PL(2fE7dF$zHN9mr$chRD`|KhV9{r4{8fcLC^dzW#* zo3ZbHnlY8_IAZVO4{*nB=qTYogiYXm>VNP<7(cwedPVix)s}~-)i@cydTw@ecCTN< zLLG;9>e8`sk!;6ddp=|Gzz-0I?pX%bhX;BPI%MxM4)A!8?KpVPG7?=|81DbG3U&19 z^n&0ZGTYI6??MlF;~lhj83*_~3wQLwgY~ic`HGp*NCZ#TbMI0Q@GCpCqsM-}?pU@X zym#>j`0H-$2=T9b%Kz}|Udo*i3a8+!`LDC^mm!=k?Dc)~^?z@6D+xaj|Nra2^=E+L zZ)a#_XqfSl@vL#Lae;9HJOj)#V(eRR_TBoQnb>ug(%k~xEzsQp-7V1F0^Kdp-2&Y$ z(A@&vEzsQpJWC!=#%rTlu9bBMSd?5lLZSF;c*L>mp9VP}NpClhX)Q z!!s%zkm4G+JvPCyXWVQN9@8V>Z-P5_$sNF5QjX28TL*W7IXI!rH8r$a-eEb93p~&r zZ02~X{$K}y6TMWzF&g(Un?>a~mrpVonX$0^F!OkRX$ZKK5H}s`yw&e;a}&Qe3?wF; zz9YVy`}$I|iQkNaTL?ZEE9NYnJ!8q#6)CfU-(QU~xl8?cr~1G>V*__}C@2v)k&*CyD)`7^ z<_4Z{g+;^`NhZJ`um{%>cU&z!1;djiCzwL}uIGu4H6oy+O2s2bgZ^pvC~zFh-R`=c z>hWAt&3c}ya!8sx*iZb6I*RSnc4?iSr7dCB@jRvvNyEP)-0jciWJ=iV4Oja75p5bQ zUdhhM#+bD{*+L@$r-t#QO(r3EBrNBkGHn%pV1Os#L1qn4FwSClN@rrb?}WD89>N9Y zD6^W!nuBaDFUzibWxFb!T`^BI*YVgJz++;$Rd!?lTh5qAn^ipdJW#yAeR4bn?uk&-{*`{Gex`n$K2-awcBi&O8x{OI__JUIJpI3iOuGNNTcEoIx?7;T1-e_Hy9K&i z;Qv$$MAc;_9x)RJ(S*y}V3Ehcr#lEEn=PN!oF6a^r|5sPxMGk(Fe$-xdQE*Tn9e{e z38(0A+TRQx*O)(ZhyBrbl$<{u{`YwaoQo^R3F&GD+ZVjHyKdA=H`ixz7nEsyy&?Uv z=RjppmWo8k4aa%&L!3-DIrDahWnva*@mp*Wuv%;Y4cRu725K$7@DLua8#xCd_en37 z9x>2~MKT%kSm)~1Z^T-LpJa4u$a52!@tL*r+mCSOo#Jc@@bmv@gmV(eNBmdZos#8~ z&aUw0N0d;RqIxTy+gcW(dK;>_t8t6)j@R3Ehd){n8`vufiy2Nl4QJ+qzww5a2smcb zndm~xX}!$aCAiv+`%Ds~(ZS=?YNz7IlpV#n!^#$7j}O??EWhj^XXY;h>}jonspL-sJqjmtNm`UE8S=|v@CuJU zWHEQR-_E-FTvbC;4qs#(#Dd9aa@!n!XQr-T(uU934g;I;pN`qqOqt4_?jME z1e}B*38J`UG(|pN@6FFbF?DS@zN`gfiABU&gQX8vse8NTm)#%tq?3NmsD^~MFBUlke(v=ob%D!XfHf7;spYtbxT3}@Y^j1!mHqWH> z-Ewwa!R>3+qye;u5zbT{k1WmL^K=t|?uL)XZ6Fl@8G%IxfzQ%nGq;%$k_mLCSahUC z7_cY{4o19D{(N95X=p`%gvht6#4~9S_hrZ~K_=35Zd{B0B9frftxt4eYYW(M1dRnR zs=T#x=19WCoJ*i4=JHY z#RtE&JofGu4;Yy&!o%EXj9a{w&=G~%1s&hwZgKb`qP*i|QZvv5N*A-V_<^f4;7v+_ zbX@Z_l83#|lknH!&%*bG?+o7*zB+s{cxgAlq*eh&fO(*?oDlvH-T_|^zYu=fx6XH5 z_>u5A;WI*?g+2_u8+twTLg?bqIj|bEhql4j`-V_es3KGznirZLnh=VIM!_>+N$8-E z9#V{NjL(b@jdw%egxka0!nyETppeWFM|`pahyOH6fOxL6xPEEY<#+*u+KtQ zhn@~S61opQ2XFFC_9c8HeWkvGeFl8#f93ty`$zBV-sg>N@HzN`@wD*>JQv()++?I`vkdzZb=USLnNN5E)sC%cJV&B|Gr`Ps$n9Cik4 zXWLi~{s^mBMewxXiNR)gI#?B48k`&W3}+tR3cM8fMc|&mErF{8qXGj0hXjm(;{VG3 zF}xr=?|jK%M}1p;jo!z-XM6AW-r>E@d$IR4?>6ryZ?(6=yU05eJO*Rc zkJNY7SJh|KU#j=0SE}c$XMoQj>{Y!()UVW=)l<|~b-lV890qgL$!c63q4raI!$&kx z{;s@i@fSP|?}m4S#o%)IH!LdKm7G$iR4Pl9S;|Busti?1Jl}af^}OeK!}Gl7F{P&x zP)f-EkR#96=y~%0)O58w-|iOpkF`Khr5?{%I*cA7(NKD@L_;V%$6I#?Q+STI&>#xW z@fI3Ldj(WVJ!5NWPwP?{?MLA@9yiNqUkbPJK%?mqG$c_8H6%KmGAn6SJ=HC+ww}Ue zJmTxbq(KV>$&EDNkCJ%@s3ojSPoj*%XFLiziR$Egi8S(0iGlUL|>3U zOY}K;PomGrpDffyJ|%Dhk6hZw-^d>%`h>h2NbXkWt>k0!j&*k{`G~wN(O(HXz$5Ke z@)z=^L?06PhqtbMK;SdpLhqB;15cAi(FXsCf30%2kl&K$Bzl#=X*}w(g}g%G*4aWY zlV<|o?e>(L$qNLI;&FE~*+rg`=y~#_M9+~Yffum*^1!fAQ9}Uy^&ZMdW7(tV;i}jI8?CksHYktUtZyKUQpaK?kY@ z{22M^#_cCt;fC$ot#G^VBsPxp+Pw^Mr}_k34O(|F;CtwHa>`b5=j1I`xV~kx6}Ftz zD#8<6M7S*{!V{WB*mk@Kw{8;QmL?HyZWLkbMk}n(HHffzg9wjbFTzdrB5bM?VPmZb zH`a)-p<09+)`@U^l@*rOuC>D2x~vtJ)U2_>gR56tVV^attZ>b`N)cAA6ye$m5oV9G zLS^-_B3yNh2rE~JaOH9lRxA_YaZ5#bY`F-JSz?6~<}J3uc`Fu)aQQ+JE<0L;OBaZ+ ze7*>m%oE|_xguONM}!M!i}2`KB3y8k2b5vHReOhrVP z9BYN)*ccH;%dBwdsL@t9Dl$rhV@HZ`%m@*d4Hx0)VOAI#IaGurhKO+ZU=a=*B*LKs zt*}?`0an<1NT~=1_ZQ)yej*&$SA+wO5MgPF2>Tx{!hVN|uSgZ7}7*&1g((y0#@kL{UX$S zA`E&(7*Iv%SA1%aQU$zMK^pY%xy*HeuSxjJ@JCqVzZ!lf{7dWwxH)`f_+mh5ey#Lw|#}z}LYB@M!4X&~2e>LKlX901Lp@&_=BPj|nXZ zO$((%qeBBi2V><=j4zB2jJJ#zjVHkjaHnyDajCJ>C>Yy~7K?XqsWI1>VkC?aMnB0r z_!+zp{thewkHZ7u9qc-+&VR&C#oGLMR?8}}VxI%HfH+pneOWK&x7Nz<>2K)IgEQbh z{dWCY{UZH`dWYTy-he9o82B%k2HwFkeV~4b&cGe;ckM&%ZS5uPDeWQcZtW)y@8DK# zqqbICu^aE87W_W=dGP(PlMM7F9DOlX~Av5O~GpHeOMBl6`UB128RYq zf<1y>G-mf-cMEj4Kz9ptw?KCbbhp6&qb(r#kQ(V`T5H2rT4Tc&DmgS8X^yV5uQt;v z8y-*B+He!i+OUbP5qzCB^jJZ?R8>Qd5qFQH4Ro~)H_%lA9!uBLN*mVGl{T!S6*jD; z#|d~0t)VMySWTDPa2;J{!z#K|z!h{YEw^EoF0tVnx>&&FbTwUM!&P*l4J+xP8-3Lj->#d1wt0L~P_i@-VqaBzllM zLiIk}76A>gItN^+@ym%vB+^)|eoTxY}U$h9`SmRw`Q zYsl3$yqa8L!>h>UHrz?B5|4ICExA%$yog*uF0$d}Mt*F=OUVT`yo8)@!;8sz z0`4Ril5=eMW3tnR7m%}Ucs}`&4bLM#wBfl#@J^DQ*HCoNmJ(kfIIGBH%v&*EQ)NXObN@JcFEO!_&#BHY}13 z8x}~r4R;XJhNqFd4NoPf2x!t?)N8|@R248!dr-xOVd}AAh*D{*gAZt7v@^H;F9C*8 At1anA(&u76q1n5vL)|MVuEbTjuP8)BsqzJAQW4PMQqD>NeFAN zWM~WBOKHpNO8Z($_kDS7Usu}Fo%T`M(v|LeX&YVf@?a$BUf`$`?R4GuUK$QYj3REdj zrNF-w1&ZfeTs5m#TS_<0We-i{X6Ld~W7(N8ky^Wxv1mFLOh>!=V?pt2aFZhE$Aa;} zbgVCy3=SsJ!NKAF{<@$dPh}@_!F|zW_pWG?^0T?oxqM+t{8aJo?EE3qWBOt)dt_F; zPWg%a)X{SOSZ-#P$~%^w86D5g&kihY-b6AM?;E6cZo<>e!DOsAmW&N{$5KJ6Pqf|mo?d|QW$`2X zLfO38?X2mnu}Jx;vD^)_*H2&tlF81`6<9vQnwW{OL{_hJaBkVi$bwqg?;>?p5J&ua zGWuM4WTr4bed$SQL~S`Od9(uRsO5{Oqdhz$3eopQ;!y2GNo8|`(^=EKdMUc#J&iO1 za;YOWSIvqQmeMLg9Xzs|X>y9ele=LqH#3!;$Y5|8#?V-9c625`Z5&6$K2p}_n2V|u0f zuS$U`1*#ONQlLtKDg~+(s8XOxfhq;66sS_5N`Wc`{s$@0dwV}>+j)Bce>)b^_}jFw z27l{IGx)o)v=e{Vmt6R}wsDLNc#!Nz=Q z2(BD(KuH9n!#(kIus_k)7a!~k4kZ&*aj-WU?;pl%(r-}8B|gWB6_T}kf2_Hq+3LYB zt9l(PR~_g0w$(S*H{$zHccQ;P)}00h{jq(~!E`3JFE*G?Wm3bvz47ii;Qo;iUd%)X zqx~bPcuM*SifU6`&Xu+5JTI)JzNtPE-WTnU_rO7>0d5$Ho>*o$6-%O+p`reGtS1v6 z92!oeHu%XLNN0LtL$Sdg6rN!(qY(eNqv*_9N_C6CUmvFiiGidD^Tf;_YG6$ zpbo+~G=LU##}mV;3>qBo29{|Jh4ijCdTA({Opj#x<6X&UG9F7=HwOY^QXo)}R-=j~ z|83glSa;BXS4&eW8j6I2J)m@dVhBz{6{rLUKI_!)0!x;+)A?krlESXFsGrOXL zJ^ko@Yc1{npBH!yRXxP^|9>6$S>T6(?*<+VJQDaq;Gw|B0v`;#C-Anw8~95VI94-N z3REdjr9hPeRSHxoP^CbX0#yoBDNv$`?R4MS}QlP&yhXUip8}PTgxCeiu#mn$_ zn|d4mwyHV&4XgX{w?QR?#uk;HUZ$?Z-*va(&l=kBzi=P^EbGFbKnQ>Q7hC-gNlyQr zfTe+eCGc_oo&K)`rUM)3hw8s71*#ONQlLtKDg~+(s8XOxfhq;66sS_5N`Wc`{wWj) zZMSFFS>daY92tW5LNp!CM9F6Y`|Sup(U6KEvOzji-nkEl8$;npb0{2clm0DmNb(u6 zYTsbrS!?M}>^JPyCsG;sgd~RHdePS25^8E{x&)tGyv81>wRU4;e=yS>?cNp3biny_gg6;30+`}T1+S?xwM}Sy!3y=%b(%WyuONtFSRC%2> z1z!@{kuNtVgXWR9Mm*Zjw)NxiHh|N~zIYG0cxbPu;{!1`afBn0P`IfBO>eT)q4?FU z_K|g#aser0xw-=kVx$cA#lm5H8wPfb;f=KaZwvf_5F8BrDezkkQnvc9N`Wc`suZYF zph|%%1*#ONQlLtKDg~+(s8XOxfhq<5&r+c0j!nS5Wnn%3HW$}ekyrzdQ*(9)e$4^O zRR2{eP^CbX0#yoBDNv$`?R4GuUK$QYj3REdjrNI9+3S2JRtrn|geB62;Q14Xi zR;yL|qV!A4wY2~53Oqs$>f`(WfgkbH|MXM!UzGw?3REdjr9hPeRSHxoP^CbX0#yoB zDNv$`?{I90Kj%Q5*zs6_KssF8aQgna~PdkLawRcdAfb$pVhJY2tEwumd47?71 zrCot1aP!|IflnabANzrRtp2M~ph|%%1*#ONQlLtKDg~+(s8XOxfhq;66sS_5N`e1b z3T$Wl_76ITLM;! z7I*>6HA!!_?DhpL(t6i(q`+$f_XeE)NBuALKifa&ul0L;-|^k&JK^(q|Lk4x&Utrw zJ)UoP?)OZ1E>eD>+^0;*zn7mO-y(Oq|LFd)`!()a_hs%H*K=H3o&W88pYu7+YxZQD${V(>P+dpo9xBXh%uWaA3y~lQ!?HcQEte>zx-@3!{2g`>nZ?)WJ*(Uu} z`lWO?{*wY0=U;$j^zbdT8(R=3DLyqlKNrkSjRgzya|9kUv@#lWNw}=bCmC+* zqU)Vnf<3uoxrxFwH9t5sQy2x6>Vl~`l#`tq14sp?3x$bU{~EMtC2vtA+}P1|37WL3 zAew}W#UjyU_pUhIMMYO8v759q+I3ml)n9aBRx-ACIG$t|N2M-b4YYEVXmt;S+Jo__ z!-bhi-a)Aovvax0V0U41x-dm(#;1-UDa@Rx^Icq~a%)ptzSa$t)a^P>k@~h&Pk(o& zZx|tj_mDxR|fnlZ# zF}8Zx^<5R!Hm(A}222EthB|_ATv(RG)n~!fNGcs0pu4&T`K4f~-4_z?-BQLB+*g6B zi4nUK1GvDAE(x9rJ-j%-C$CVd$U3jDEiXjYuRs;bUk-%bZr}U?g2Zo~EY48nQ1Q<)zb$amPXyuDZuwgKnpFJ9k z&dx&Qaq(A}$d8_25|2s3vH6+YY~3aWpLZru!>9mOxu5`QfKr75xPr>|I)TG7JW338cSkxL!2PO9+|O{pY_u;XFQ~S- z+0gtBNnK`x);(USb)z$*4~ z2%zy$!QuUuMST%@Qu@MYwMjkFBa;8y{s*w`@9+nFzw^D&H|AU6vwOecy~#V_?eVsH zzU3)+uJyEe6y+PrjMA$tm;XaPF7K4X?!UR;>%Q4N-OC?0J$KEiFKBxd;yr$Oy*N*c%ELwGe_`RXZ~PSGP*os{au zmMou(F4)R*(dhi#IHoUR`uU{IMJtM3G#{-y%c*U8COb7dU6`56^k+}xW-<_nG?Fo4 z{>O{%$KA8}>2Z{rnw!D+UsR&+T6C*6d2VTpT$NeGTM+{v{$sqg@fyg|CUkd&EKTJ` zA+&;H*|}_R7E{gakzDUV@Wp&3UqDkw8iOp_YN9V09oiM|4kFNM5CK=CUH$RYE@CJ) zgDD3o^<70bNP7);B+CjSHnl1_om3Brb_HAURTVrFlGI3fLbCcQlNk zjizCbVbT~5;+EWCqBn?;t;T6)s^tJaNSTNdr)y*B2Gt~A$^gcdxj`-VE4r)Bx4%q- zj>g6-_R$PAFG$c>kLzQ5aXGAh&1wh%XK7lD3wjgDI4%-Vki<8 z%wAr$9Y20NG(A(e4m=#1D@=#xa#IbB;YeFUG!o7b5QICDc| zOJnOmVJZ(6K(;H5)=rvQdv>d+I$z4z^rme|YWhLZ^m<%WTRAz`XXBXtm{tbfy(miP z`sU6dAZME9oW)womnh>EiL|B%8Cx#X5o-Zkp2_kq6&=Kc_{x}A`Bhx6d~|@iiG=G} zcT)%NrC}`OAuz;Ra5i&1KR2G)GgUY~mDx8xF_oLi9?DPT=dft^_8Z94;@eYhUu(GW z%H6Des}1dII-~Z92*#(lK6)fZtt5SQ)~#&itz_aSKX)QCke?kbOdZZ2nV(^cVQ-J2 zO>Nt|(dC&%{MZqU-7uG%naWO_Y#p7-%^b^Pncv-oj|+=FUScs78^oxK#gbU(&@yeX zJ3iEpxpg>-LQKjMt12vC_@X^N1w_z-DXu$UPw-t)?uW+q=GL9y|5f|-ZfG{Kndz?b zffz+#j;98?E~oFx)(6OpitaNE8-p}OU}~%;aA7&ba{tJ1C-u|nbLpo>-cMaKg`>Ht zOr=V1+yR=HmVu{R(rwv}Zx*ksn>zGM)61*B{5HnAWh)1653gvup~0jZE3+A$gmhhc z2$ydoz&9Yep*_TJ5{K0ZMkqw^PHpXgawMr*p&Tol3;j5gn>sQ#zO@}~*jdR?P#!J8 zRBk%U**91?9PF8=!MU*wFPm0xc)2y$pUcjYB`SX`Kao35__7=5X^l^GHi2kBpLO4U%hWZl*BdZ8D7Grpp>ZjFv@| zTSN?Bq)ZFg{H_f%T5LAZVoBYxWEgj|Caq}wh6eP1!^!#|`tZiwSTM_4<*V25VvEjj zB1DECM`e4++IX&ppGY0(v!}8=nwB(+={rVsI+^H)U8y@xG2v5n2e&fXtkY=|sc)^| z6N7z0v&y7G-4F{&F#eUXo=^;BCI&__iQWviK2;E=W(&km#fpT@pw_S7v>B+HtOcn! ztP+|HXaJ@nteh~|IyT|Wt127C*5(zqPnw595dE6muK@XTd43n;2bh&X| zQ`dai;;$f=U;>T}B4U0h(Hly|lKT)e-(bY63vIwx-IaAg!ncuyF&!TqP7J4lGh#d1S_q6Hg%*$U)i{&3!_xsj$QaNTlpoJ=FF5?T~8mrzJAfyXQ$1AkzUd& z<+*sXNw}PZX%wvd!V>oX9|)xUKlIP|{_1;$ug&`d?@PQ_dDnTq=$ZDkD!)@+tt1q$ ze80TQ{WbUX?grO)TyJq*=W2F7?tG=Q-SJJwosLfI@!x5`(Dp6cy;#@RS$|}G26p#< zV0j+)f_@-9$NF?hvi$9&%gl-&hn*{H)n!(`&k(L}tZzX_^~U>#lU&%rtQ`xHbnlL% z>-gRSI9#*Yg305_o(!2aM>75Kt|T)-TQ@B#wfRXX^|D2!Ha!WYu1^sKdi%u z5jryzOAf@@4HGHrmPMFG&Z^9lQ}xmWVd~H^g{9&orFIR+`+G8E-|r(^{L+1Az2qt< zc0bl=<<)o8H?kW*$`<)h#myk`!3?AwrbFqF!5ov`pUCWwj?hk&F!Vs6THf95Sh?!@ za?z2qFWU01R+O<{l+j+_n2J&D5D4t5l8~v$On+=&tUqOSm_Cb~*=M#M)HW+>YpZXh z=??xkkdks@MVm=MEJyod>=kZ1j;EymYDXbgl?#cSybyGoHml6=Rj>5v>!~jWEPNc+ z{|_wcuR26Eh6Jvy^-U&vR`$MjFH8vL3d2n&*qs~dk9Nm26CAP`jc14n-U)_XrMk*h zoSMOwsDf(T7ai_TTi)DHf2 zXfL(Jc?N65-Q!ephiH0Bed8H?6oOpFo-xhSp{b#>#SAt+xSMbGg%Vu^fycEUEF)2H zaG~6S${FHPEii7v#J<6t|w-ZDthBw7Oj^v#@Q~Y_s?7VZJVTq$I2D`Q`cE7 z8LDk_xwc9^)rp#dd|u*0s#C6H!lR^Xb?FE*TWh7R?THP=1~C)v#W9dGFFA-wt%BLi5*7(7X=%l1;C`Tz!E zrg>HcVtU5dc0LIabz1#9(b6LZEKfGY(%NLuw_Wi;KA%)N@clv2*=J+(OkPWE*{D~I z<^O3c#q2R#*g$Y5y3@D-4g1Nl=m0u2G2D~s8t&c`ONY8sL!kqyl=X;-SlG!rO$FuQ z4KuYa{d&ZN!kTMCWA$kde1Dou4j0(-Vuq<6=1BlMFR)AuTQgVSyS&~~>|&kfyVS^F z_pT%snB1;my*iEpZqcdy54e3?2o+FUR{W8$d8WFUEitt$Pa`mo9*!BN8CF-N6#M7- z>C|3La%G)PgeTPsuyu|KPn8S*pKt-X$Xscq;q%-#wN1MV750w6QEF+l+|qxdV~1}a z)m2lj>&bDNaAOUJVr6Ycj?r-Lq%t_;(fYqxI!^xog8{q$OaA-(*ZVj69`n80H|yK( zeZu>6Zto_MESLP`O5tV_(`&I61+~>RA@0xZsI==&t|A^x^j=LNU z_76!Pwp=0|w;#2yv;D&MLfe2%vA)N87(4x6wajRXeHz*~X|kaS`(=&H0jw8et|2-U z4~fZSX76w;ITFH8bZ?_^y2Q3C_x4*K#sI0+7mZEzO-mLvK>PGqARQR!52X^(A;Ttq z=0FPa4i`TTL^JzSy5E@f3l(c|!ZUJOJol3eA@)wwnr(u$fGH7LERI;ec$g4w(%O!e zn>D#{v8^k!B~@++8&*ACi34ycNW=FalNwGE6|K9B%A9I3Df1<3(S5tDy~a+WB22pc z6h&x@{S2QxTVoYUiHbUv2G?x`8S+ko+mucPI9T)yhEmD6wP#U@CKbLUa+MPoHZfpR zm#CRwCS%5u1?n>_YiA|F;3Hc(M_a6ADxQ~T8rB_6P&5=Z39QM5t~JI~x8=jZiWCwPB7?lSz*Z(Q5Q81j6TGqN-I_>(ycKp3+KTuu-Mq zHe#?-^}r1vP4~RQF*HgJ$5zV`D!au{cFPjNMl=Q8MLU7i4ldSqr?6kPxPiJfr5CNA z?L>c$8meiotY(oTH%-_3;{%x84fa`|bq!&;&hU9t<>z{3nx{i|DoKWU^If+gxR|74 zy~F)j04MguW0|gKD%NBDaK%gw!rUy*PtiI-7NUYC%|q7DEGp2%AZJkEu5@|``;O^d ziJp}8QW0v-1Cu2>Y8_@=C%+ymm@rc)2&y7Ft2mJ{X&ZcAiFO?}_bGQ6L< zVx^%lQ&;GQM$>AIwpqZ7DJ&qME@Gj|N-aZ1F@^zU?t;qKL(!grIJw!8fqoyt}SRZr@~CjtBU0s*ENvq74)_~WjD&W zMK1&T@H9)bCHFh5w-Ryk+FbJ-9FO)LB;u^qacQb=Jq<3E^azncUP?7uZ-G^$R^4DI zz2)pm*X@8I+}sVd0yi|;OAyAvS6A$7U{+Dze46svV+`deiEXe~PslhtLnJz^HyITk z720%`g~l24T2H|EUOQrF{OP*6zc=1M9Di(($R=!dgn^047P*sEHfsp(rL;FfR=a4w zb=Fke=}iK<3}>39vd690n}`mBz-j2COEGxFVgk;}>q(?S?6bYY2?z`8G*;BLYMV|i zNS$*m^~(4Vj-L#4p&puupmN$$hrVI^Bi5;1=#>+OdQL~%C9t<1HQGfW+UnbBbA>yk zly{VY1?^3ieNv>q!h~BJ*ASrZ+Dvv4lLEGmnk#BGeXxW9CQD-GHcd8AMdyBG>r$gi zprV>hD41{#QTN6Upa+>+0QrYu*^Bn1q&v*5H(QfTC0P%dKQNn-Odm)K<_{vL##JgB z8yBYWUNJ2Xu`TDt)UU8a_ZwT%+|Z6=j+$FHzL+5X4ceJpX4^mZyd( zYyF~vO{>9zJ=5MUw8lB{g~@<*IMUAj^8^T zv%k`IkM$4MZv&)4}{+S@|y9btnrOK=rEY4Wu#X-JHn6Z!M$r#cg-Ycud)2$!#IYBGahp@ z^YH7Mpwou4_->{!e`Gv(JU1~B8p|EV;mk19Gxi4kA)85Jf@+vBdBT`4+}HF+5BXFB0CeD z%#Ds`r}DFtv-RbT1#EQk4WvblUw#36OVoh@G`=wujx>kD&Fwk?aE?VgZ<(7KEsRl9 z3!`YrEMWuW<_c8vAx^72xkFCRRkq^HL~uGgH%^?z&M4)_ z=#U0HuO_oo@cw59#K3;&r^)FFo<)0R^EjJ|BdMm6%&e^YNY({s=h5SH<6s*Q2uBRE z_O+XP1>AL%e6We#50Olu;}aN=*(u8A;EqhJ zO;7VvqZ9LEcm+coW2LfKe%yFGI}0)iU;N+%_r+(uGO7FGQ(0peNTVSB=xAY{I)RR3 zv(bj*WjMlZ=9Z->#C$+-+O`WP4l4X%S1lu{xWU)j(G0m+VccJP9zAODb+opGTHD$T zB6U!lRxH{B7$GIc3DBM7Mi`@{VuV0cPR>th96k#|%^lCtXeqP3L7LWSlp_H{d{`Hp z%#V#tKok-a;gB{vtHK5`p0OXx+)YxY>@y#n9WTsJj0MND#~`1;R1?hS7CzeWP|ePq zfI!u}Z~3U>GO1~E<=9)2nx+kSbtjIAt}E7RLowV6Qj|wxj<}7O8-%!ip7q}BbZ#^c z-}Q+C9of(@2^KIKAPUg>S?*e{_4+Imq--=VK{p)XXAbY2xhMy%L4vMnvqAcsu+Ct; zgmpSjVW(5-F(0+yM4oqK6U1GlSsOsQG$<=T$b%WkUAV_$w6o{IO*zPl!sH3264^P( z&2`$q!aLevp-!C1&Cg~@9GWEvbY>x#Jyyu0qvyF;#Q2)b&(bI*-pE1Gj*{G9nl3-Z zOBFJgwKo#3?85R4LATiJC%xfYk{(&*<^10i4u@J=T8&3g)htfc))tSF0%{6D3F!i* zLPmkdz}O=C0!A{TFHArS&&|>}HK-@F4r-ha=ObC5kGVqrXl~*}`D+q`>@&Id@{3q$>0%n2htYCM}3(CbGvt6imkECm1)99H9D1(FCXY;bxki zP2{svqq%yv{nZoe#kmg5EO0_g9N95C|EzLz7HDZ|4z;y)7$2$4IEK8Y=r{-xK)yA# zhFUZx$R5jLp2g1LFqVfdVLT4Z*#rr)dGzQ6RHw%Lq-KresS6&NN8h3cIX7##(+Ggp z9^(-!Fo;?6=5kQM7|`b3ydLr%Ou&m%+m9lxNHc168;(c=Z84f#LxOi%XW-}%O^-k~ zeF$O#FmVE!{v0_YMRj~)JVwD z!hu#kBt6)XdRojJ(NrhaT64kaiR{!AlZTjZaT!VL4^3*)Q&tF@HRWa|q5X-hSZ-xU z>FgX9STqTlDM0%Y%;ukX0pV9LGvqA6256b;Gzd{)<&>14o5;|KEqDVOC98Td&gQRG z=eL*J9bVjUU2M!24$rZ9jyCk!WPBnIg?9pi6fJ|i&5n%$MVh(ltN;!nKAN4w{GAP6 z!{>bPu`Y@Z4fWHQ6Q=b3ku4SydVRk3rp8c9_|zd}X#KxT`lJ;2VcMiuNQ)m5m*!97zesc z!JxwA6DvF{W(sV0;g`d-xSgMdoB+{DWS6I*Bv~0a%b2N!V=jze|L!U1t z(Usa$#+3y!JOQ~wITV>=>ud46POvJK&*X}>xMnjJw27_jVDv-h0C|1kDj(7vs52t zVTuT0AQiNbSTqA93mHR6pZNzt3rwx^WQ>EJIK)@MV?o0R)8sUGdS)Jyo!Nu9Ko^)} z03F4Q6=lt3M~{NiDKc2-6^iBiA$pIg7_iS|0n>F_&7z0&TBozKv&Rc8h8W3j8ktlu z1~CR6CabgxKmm2Z?&we&Is(HUN)2oebhB(Wj~O6YWAt?~>=2XFR6u-4mkbaYh#|qa z3lB6gpqT)T&-AH)5D?6`NUIF22d2114C(;~qiF^`N+JyuVD&NCHbv-j5x~2cRi+sf zE7=jln{hA`ERk>+Y86unSWrZH#8g;;qpc7#1+3s`@=lXZVRF&>qTXbg$Ek__I5Tvc z_e9jqIFGna%^oQ;P-9u4f-NpZZ_MQ`HO!bW=O!+|JPz21z6y@#CV(9%$ws<3MXo>Q zwlJD_W9Z;TbRj0TONk|JOBsR_(*6Vvm2rWUyuFK#NZz@O=HHq?s>D^)Mn<4Ryaud! znGsnqDb_exJ@7NdOey52ILhK%O=B=T*=mF6udOR-S^=Z&;ghgxFo$RYpa(I@1eRyI z@FO8PSC|e)>cZ$yuvsL`AS36Cx@R@BF2*V|^+7{2iv>*$wK1Ws#x_$)eB}xqL{>6( zXdmVsOgv!{VWR*~$n2dB-k6&yFe@9F3DZ5u7qkHd@bz8UAg5V(Fj<9IXErw|8!ZJqSMH0wNnKP{LDPF>m%pX1>2097HXbaq@b09rST$FGUxe$PCU;9%9=Qn>R0^TH(`3PJ!v+UaXV* z8d5{a=m;$$*U;%*bvxPiPRYcA5z9*z!(x{ttO5GksiX z^J^T{GN_u^H5;8cUQ9+eGk!#8R0qD&77jonUzPz&jb>AQ>O37MF3wJ#qz1-l!?0|^ z4nvj9pbOY?-6%DPyF?qIW}-s)>EF@E(*;`3fRAWdhouZ@^lZ6Etndm!MBu@~`no)g zh1TZa(d-mpL#^fU!0b(oz^9d6rq*IAr5%Y=_tAmqVl=x{yBQl359^I%QV2qrn^}Rb z0XYz1f<;gGpJi*kd1a5f(rN@wt-XDXTEkn`SULMYF^Sm~G;Q!`j`rU4#xXre0t!<= zY;4U2kK`x_3)wrc>4h$tMgJp1aav&ZqUbtYeK6rvn1YlgM$p1bVcG)I0$*`z1(sLw zn0e2fm}YYuCZL&d0BbuwV}q_noF>dba|kUp2^5$GVOCfC6oUdyfQ%^|Iy^timkF5O z06h|K0{sd+iSfu%hj2lVm1MvJ3yDE$u=X%zQRXuQ#9#!#?3QNFOO2>jr>(su)YR0pnTfQQ_-BKlvg+k?1&FL7P%>UW)o(*U1vPCL7uHI5%U-r+dm=ylZD zKWcxwJ%hM^f405Kma)aGf3tqi`cmtZHEq4X>a={%@^;IsEKjv0E$z}1(s$3^+EAm0 z(fbrsQV;pp+5}(0`evVsC?FynTVs1$w~BBdI1H|Z)?f}^2F*jhLc@b`xb3r3bDVqO z|Jobt9_j9ng%atZhJoH_jY{^0lhoJLsA9#sa#g}me&f>Rqo@WHxk{xaRBa{t6#Ne^ zBt8|hW6^*n99~i}16{eQPp_a2r-CY0X~qU52m98jr0q8@E*wr)!G>V8zR9N|B!^x_ zQ+T@y?YMGPR<8msXiHaNrV)ZiEv60JF6%q$)b)50HDc1zgy@6_{Q<8q3TzxRMrG_# z5r!J4;B_<_>)Vz_gPr{zp(DHSMvV@38~W*(o#tV5Bvx#gHb&0r`rp1xBXRd~-BB@7+JUQz&P?cJ)9!;2}tRXmCK zITQ_z_{bOsXR}J7qbYQjE>1B}lQdAp+c1mwASQWV-4>MsN1LL5p(PQ7D9(}D#}F^H zF0C$Ooh2gk!NDKlzbcV0cR|W<=yH)KWyoMAtWgnD`ea?xRHu>~gGuC2JhQf7Vty`E zI2`IC*6W5DbqYHm9V%`2o8lUsS+~^rRBW{CQZ(G&sd}lOaynnOpGtgbiY3$)Pw<$R zsS8zXQm;#Gk3;*5lUR62yxH<#&32r*MJn*U56E36QJf!jf(6Wv{1uHwFuBv>i z9J9@*V$W4n(bg7@tJuuMNkFXzcCo;@x|aG>hoS6_j(@-aJb<7vvMylOQ%l3ncA#t`nTlG+JniSceuyS`mm6MmDm) zVKO$8$F?4ADPCP*qrw=uJaQ^2eRiYbswqY^W9jXcd}m0MWbJ!-ZwwFUb0Y+1gaEsz@owNZg9IoofTYyIn#`excZia6dvb`x7@VJ*7d2)1Y zhDPPl?0Ru*x*XGuU51l6PEm^0P#bV1FB|gT6s~FvUs#m+=B02i020`}VU}X%2m^0o zGD0(xWp;E1dv?sG#rJi}2$X$Dv@mezT|ri(6~3m{#!yG34M=X-NxyXZTH#vK95JcG z@;p!NLww_PMaOMG8J-x8K)bOLWjMBI_D~qwU>z3`mT3n?-$~*K60&Gbe(G3Z0v-n^ z_dNjF#U2IkJHxsITYTEOiv{X~x1fj|Sh3|$raK6sd#u?ziTDi(&L{}99&W4fg3cc< z8uN;|1-GlsB(ATFh$zd~rBCKY?f78}gp!ass+;A9&&*t~V`Wo%k-L~-Ec zefQ0oOInDPThhz#z!6GoS zkK$mA=EI2nc)Y@Q4&iQs{g;?wkC496tP0@zJS_iX)*FrX2`OQ&mexEYs@ z1I@sZ6{7?@lw!l(><9sDVQSi!;HDQfzl|9F_}(S^2hJ72x%^~K+uWZ-_vguDO|*Ot z&1A=1W^y4mP_;c{Vj{NjLy8~f=6nI1#gE)*$df#o$5s@OpU%bd>{h)RVYSy44=&l(*^12;eH)kW#Ts_SK|($# z$Ojd@qwS(F$8+-9!2SdFV6<&yco)x%F>e>vI-&;rq;al_F)VNJA}4$9c?`A|do9N1 zA;v%YP?HP@g{GYly`JKLt1G*g>PbT* z4Wf{KrEN_!Hky&hc+Cd(a>`Q)HH0|k>(r6s9K*$8kod`np`lKU)C!zQS@Cltv>gLn zfw;!8wEaCzXKlcwB&=YOSqf9;unTiB_xGU6U6x-(kE zQ7)k*7CQ~H0!3js?>IZRRFk9o5^*?#V*@Lh#tcWTK@52uz)LOFL+~b`!;_Hwz-gYl zNb%h{;tnq7%BQT@ki*=8eZ>TAkhz4LsA5KrB!C!&kZ^;s{n38)a*AiK-Zr}wX1OUi zuT3y7USe!WYZ__r_L&{UvMe`4H??LNx zUO+WkUm`6ZjM}Jzlo$uaG$qJ{8{{l=ltmASWKUw8QbUk7=pMq|c-)U` zc$#LI7@wrhEWbvB7=ChoZl3uZ7+yo`5h96}DdbN<4z=hhexi`7nLCbk!PFRYsHu>u za01Z#X3>sKW?(oyjP66p#q+W4yRMY$DEE%;AdXXRU_TthV25W6og{qjK>FEnw5u#s z2`6pfv#DH2o5~ql1XW?~Js|*?^r9&{B$@7{r>%lO2sRIA?_i}#zTdRwEQ^vHPT$cO zonwc0pg*J7)Z<6fQ6ckD2{FfoQCf1cn}V0rM2hpO-Q7d%!T8xiqg z7sp+|{%Rj%4?VD%h+S)n&Vy~HuHioG?uv*DROF(l5NBSbA;yfgzapj}qDP+@t`vew z3nGQ+5XQJ)2>Loy5ebUQMEC_lPu!ZI#j4;x>SU-W6R*Iho6V=v4gFZw^vA4&i*PlC z05lb-#RRS>*Nki07;S@4HPQ79P}M@+?yZPxgK)+5&BDW2+-@a~{--nn#van6wUJ*w-G_bp>`!O*A%0Yfy)TnHKv`lN6SHl}*Qf ztf_?Pk|FW5SbGinP9Ng1CooAHvG@^Kag~UbMv>gi*Ay(#^waZuXirbC#b+-5$>S_4 z-fJ%YNgJ&UdylzzbD#ZV#8J$}n>+L$E8dNmf#UL+b96V9-c&I{F~O;1`I9&}NpIMW zYO`X1o|Olm^cutMGc*p(s?Z=1mUO$5US%r8yjOfig}f5+l2?hasDz4n)7DUmCY#Q| zwM%+2ghaDRP@Fbvif9W#V4i@Gs~uu8E4LbPq&gW>`5hKN$dVz2u^W>2^D1uZ+!ZqcBRrO>oAj^D}?H# zi|r~L84Po!3imHvWS-20;F!5kGnXtef=^lKjCp!vR*S|$%aemM@iv(>7kw)2d3HtT z%|)9<#kpgBgiXo}6VxZs)1WXxa~~~4KjuFFRNtPP7B%F_^949+roVY=c<%Jin4+Gy zoWtS?r*=cS(6L?#|9{IC>tQMIyTDHa-wym&;332Tct_xMftLlIA9z~emcUHlNZ{(g z-av0)dmtRx5V$B1z&!zf^#8*Dxc^cAXZ;`XzuW%?|116X`0w&R#Xs-A&Y$t8{c->0 z{wDt>|7!nozsvU*->-c?@O|C)1>eVg@AJJGcMH7O_bgut_Jm2_A>V#qzc1=*#Tkd7 zZ>3N1{@wdq?~lFT^nMAph7Wk(=6x;hB7Cm*4)0CgX>ZPZr8nX2@pgFYz3aRedVOB2 z=l7nU!Cvu*=hL1KdEV)H!1Hq08=mgD)idiE_Z;*jJ$;@Xo`~l%Pp#)Xj{~s{f2n*= z`Kt0c<)g}blsCd^@j~Sp%2Sj%Wn8&h8N&I7cBM`UD(5S1`7iRX4!T$K3C6zrpt) zyT{xI-2Lt=+|BMy?u*^$x$Uk$xPIpPw(HBTPvY)`x42&IdXeiHuBW)>T;n)BG34rT zwY%zELD%^%xAQN~Upc?$eAM|F=ZBo{aNh5H32s?faNgjYa9-<7J9jyEIK$5M&I_H0 zbL9A~<42Ci9A9vJ%<&$_8yv52-0gUp<7P*}G3wao*zM?aL>wC&s~ld3WdE)GNA}0; zU%-isciCTOe~JCs_M-imJ#Rl~AF}t@+wEKJm)Mut9kxH%ero%s?P1%4w)ffIXnUpY zZrf9BH`xldQQJOS+}3Fe+t%4Gz}*giv;G=qIUcos+WJB3Tdn_YeUbGp>#eXO9WLun zxwyr?!eU892O2u$;${JND#cBJt@OL}3Z=MF&%9hIUZ!VWCKoq|PYx-?_47kY&lm7!rMN=-ASB(b6qoCn=gY-q z;;kE$;(7Xm=gGx@crYy&{Q}O)MW29Ym7-Vw;JHfCqh;!(=O{%*&pcZ$%GxJ&ps!nh z@GPb1(lcn3Q_nm@E;_^~pqyR6pqx#A=`Oiw6%WRhqD6mjr(Bf8gRG+7raySPqTZ@! zo~Ed`Xqm0jQx)}QJ#&Ym-lS)4SJWHz%z~_*K!!MN>snd8LBLyN^|*jH%jz)!ZD0tgMa;_!e0`BH){4^{@tSnU~d^fDg;+n1DNFbyUD(vU*6s z*UM^Fz|*pNt$NNtsNmdVP@a7I#y;{Ji>nZ`Gt}6wclhqLcquv7oo|D!6 z0zM?G`vi=7hXss!(*nLxR#O_h32jUY81?QIFzOu=FzQMO_=Kzu3it+D9T4zwS?w1v zaM&YY;ILc3v$7f&@G)84rNJA4L!W?wL$82=LrlQHp+~@IZ?}L^SC@cMS5&~L>k0wS z$m&iFz6^bIxq#6}odPb%>J9-<$?A3iqhGcO7`Sx^7`U|y7`U|wcwAOn1q^&z1PuB& z3wTmin>2XCgse6S_^7N#1bm&Wh6S9L)dm5h{CWW&k=2lZfoGk7f#+5M15cqLHh_PG zhS&g{Nkh^J> ztE3y)?>1Q_)xhAZWmRZ~^;gNN&4p$S&nWKsm|=RGp1 z0S4}tNeK{mzDp(*z`$mi6aWK5GKqf%u9SuFKR+%D*?;~nS&07g`(z>c&yUJN@Sks! zN$#@}u8@V)KfhNNLVrbrEM)$Qm`oy{-d)in3xU6)TPAtWe(jQlv|kaGN!YVrZL$#c zE3S}*q+hX97J`07hb-j$icVRG`4u~4A>~(WmxYjDu}Ky(enqP+MEr`&Wg+30H^@T3 zFYlCvd|$pp7UF&Rc3DXG<(p(7+?Th?Lbfm8CJWIX=#YhE4>Zd{um_rCA=d-#vJmTm zHd#pZz-n0t^+2mEWO|@Q79!o>APb4^Z z+}9urQSPgkg(UZdWFg3Xb+VA-zGboy>E|rDY zmeXFOh}BcDZCBuw4#W$ZOYXS%__hg}wO*Mz0SP&5bIU>uTV1k{!d9m&gs{~i3mI&+%R&TOZL*NSR;!x? zunZw)rS<*Z45H-R4nz83gw;KNw`-ye8M;Msvv;8-A!wSOYe6=(@;4y+EG7qGz> z;HUm?`oHM^7}ou-_rJ{lJj4q;;h(^&KjrWBZ}Zpt*ZR-*yRqi~rSH4GM|=zJ9@!W}3{`HsaA`Sb3*%zw#30IZ8=6rd$XAgdw)R->O`qEK?lvALXCP-;y7eAC%uK zzd?Sv{5<(~tnQD>*T{S2nA{=PVLUCD9qvE4f9n3G`(gLTv9^D``(^Iux)eH?$ub?+g!hc$HQZ;&$~Y2dZ+7kh=%ZNSJ5?(b^TSYL06Zn#kI**>+-uS z&fhwJ==_@Vvsl%?-T4~lz0PMkpW>W#9(Im6`<*+Tjm{0uRZg$t?~W%N-*-If__X7L zj<-5q?RX(>SG?76y<^O=Ut7_ychoo(`(N$9vOjKr#Qu=|1NOJrUuD0?{&f4z_JaM8 zeV;vU-(hdCud`nOM)-^Em$vWP{>%1B+ke>JY`f3)0^8GUH`}JQ_52Q71J?63SkM2} z`YY?>)<>+LvcBK?X6t>{7g(Qey~R3h9mN@t-Cz~NKY2ljyul6ff{=NG>y-r(dbE-n zl>VkHkl5pyzbXqP_$V_VeOX=*qHmyCUJ$ZxV6(D7!jHf79c6*UAJ2SISs($(Gmj_> zBm#Nn3(5isL7w@GvOr>xXa1}#kRarl&npWg3VG&h$^r>Pp81oqK;n=x{e+nii2cLz zf{=*)z>Gv9f9Y;zfrKK@JYQKLvB)!jR2E1u^2{HU1rm)s^A&kP2*>`*SXm$`$sc@4Ss*#dGoMu!NK*0)NJg@fXMU$F zkhJ8PZzu~SFL~xMWq~9n&wNE$AeqTCUzZnz)ZAlL7D#OJ2mh@skl>`uZt2U)0*OwZ z`K`Plgy(LcNz#))0GcE}dFD6D0!dJwLC25`<(aQ53nWE(<_Tqi2|e=-rF4Uyc}yuC*E3&HO2_of*Ok(|p82U#n$t5sQA)E~ zrkAjpL58sD1vb~~4}i_Io&f>{Jp%-$^b8P~)H6U}LeBt!qk86hO6fX1^JAry*D^8b zTXJa}8A2ci1diwrzNC~6>zQvVrJSDmky0AdGe1;Hqk87cO6icE`GHc(>KQcWT0H~e zX7tP>O6eLsgN7c|Gv8NASL>N?$fc{0VR+uEl&;htfC3|W1{64;XF!4ddIl8Or)M5l zO2b;F2Ygpb>lu(Eg$z~G19Bww2O!5@J@Z|qG^A&~qm&YQ1`Qb0Gw7)SJp(-Z^$hUb zqi2BUZawogr4-jQ-&RVyv`jbQ*{5fKXD>2@XE*SS=?~CTJ$eS%bn6*l)1_yCO;pbS zn=AATupwnbW2##MHl%HM=Br9csGBZgTv9iLKv%O;656Iq0-;FT&?jBeXO$AE8=iSo zDG7bkC818CZ@Q$FpEl{lh8L&LPqGDC?O;CO;q}V_BgX{AK^hBB8+56LA`IP}To&2owK4TDFNl2A97OP^9oq;B{ZZ&pe|-&`(z zQZA9cp-(#J?gGxy#n@;KDa!Dwg z9VnNS4SlhrQz;2uvqSorTq0e=9yBT?QZuHX zrr9oiL@tr0VGqWYl2A0;r4J}2p=h>CAC^m`Xy~nNC`#y=Z753UnQhXCFv-MAgvmDP z9=Sw%hJAr@g__w$C<-;RP5Mu{L~4fK>Oi@qWf+WdNy$)A9nw4H5@{LsU|cSdl40=G zN=fLL4(Wq(iF6D-Xoo$XR1AY*j~5!I9VHcohG~aAUTBzhG`1)-OuO`cr6@E^oAgel zC^Sr)^g_8v8iopPJ17@P!7vzQ3H{P0{fAN%`lU^JpIjvU!rlT}q+S>dv`D*91KXt6 zD@CDR+9d2nka}Tn9g>TrT^Nl06`@?(r1vUCpLA_1;AW*LR7)$> zAyi8%)ge?%E9xNC!oENqLbJ3=?^cRJv$RU@l8dBS=&csuE)+`(k(3k*djK*Bz0xAR zLn#Wq(jvWGE|OkhZvjP8D+~sTLaVe8ibAWj5Q;*pv;alYD(nlOD3nSIc&R9qN{jS1 zxkyTd-fBi2q*EA-I)qATraFX5X{I`aN@+$Nq*B-ys6%L!W~xJIlxFFza*;F&z14&| zNTDzoBoX?gNqUQ1Bz?jjfFwelG)Z?VMWIfbs9d2=nxr?$MN%j9Nh8W7ZNgxbOUi`U zq)~dKTqJG69-v&IOd6?Np-dVj>{1D3(kQ(_DGFs0kzOwsNtw|1k#V_5x`e@Ku23Zr z=>erER7pg7om>>EBm%TZm9Q^>me3>->3*dsG)Y9l_Mp%t5$Ux`QD~Bg^ctloG)Y+c zccmyaNmzQdTojrljNLcVB-G%r^eVYXs)VWxqk7UL3`X@rk%XoDk~kha;blLDU(+#cA8ef=+CP5&(H-*@a_6cAfKY&WD|^cHZgiMJ&L_9rrr!#D28f{-5@{?R)H2+Y`21ZBw=uTdnoISYKZ2 z+UMF~Nm(wI9+&PnEHW8ry;l0R`L}Q!!O?Y!hu zH+PTI4N&8_DKIuOgQGmVaGHu;_=J=K?y*Dq`zUs`cD))RsUdnRLQUYr(5wg@jmY3y zDLA7=w?Y+;XJ@DD3o}O=438RE6&X=QhSi-(QRVgHbCVOj>UD@hwd%MQ)TfQSuIVP* z?nHk--CUcD^&`v`u9?S$M7T{1-i(MP-5m$qKN6z2716K z0(H~DPC92Fnk!5rrtVZjV>r^*5N*#;8j5R|mSuWy4+yTF!5wPsK-qdVhvq~UH3uP< z=IOqk*fHu_&)cqEjdwGZq)El;-MHam6ESw!p~oa*y5K$wd<|)E%|9X$PW`Plcxz#So5)LfhcP zZglKeewN*L#ZT|{Kwz=p^?25$?n5z?mBpY}S|~8t5Mq+Wg6Tvsih-S`@N#_=VGp4h zaGDv>%A)apx`Yb23=;`NJXoC2;%tTw;9ISQOJy=iG(!Y+s1Q`^)ieT*g@DWAfMXO_ zLJOngRa58y3cH#Z>hA8?s3y^ZwnZ&iER}Go9d9-)dJ{ok;{&lE0;LQLr4TT12ydDD zVmO45q5RAobq6O19TG|Qr0Uw#1U}insNfDF6EFYCnj$5?^%hkKs0vj&^kq_2E^T zsGvS%Y`nM+K?aKC3vr}{Bif|yM!&V7ti}C?NIQC135?AyH4a2g?1reHXA^g~E~V~b zk+%XGt{qT~O(gzA&=8P2ge#8eJh(Zs5JVq(Egjz%OPK=oZC3k$nn^xUz&H`QGd)7x znV<_Bd}?o51~j&`bg3~AuU5#}b344YO6>sxwZ=}Q;F5H$dt_McW^vNW;aQ)Yqk=Um z;%%KQK5HbQMj4S^8j&08+ZUY(FdXqP$C_>^$KVm6xmT%IoVXlG;E~?FZRN(At zi>nBAwQ|)h2K3Di_l5#-vY(=dhsv?@4bcQfd@6!XiSVeck*01HQJ;*V%G(#6Gc=TK zCXJwnPemvuQEF3TYqyG6MU|zRPahacHQ-kf5yqz?3XmwZv8A<3MckZ~s|q?D+Ro&p zj_GKoPemXcQD{peVyPqSj4{%2+Zh~9T&Gg(mkROA`MV-iYB%oxG*Q8Pyu&~Rak9uv z<8BpEOpLT_TNKUsj7mYok;+m|!9z>o(x^tLl!T!N%tsFv<%;rwgfK4 ziGbw+C1CYG;s1&MVVnnez<;0rYq&}9eg3!kzl+ELH~MG%_rg!0=)V%D0}lC<{@s47 z?giv_iNr6?{~fL^FHi-$omo8VDL8Y z1KxYR&-32tEqZUn*@26^jovNZOTCBSTX3Csx3|l?4YwQo!ShScM?639e8aoktH8tH z)1KFQp5b|~=Pj^xya1;N_IXO48{uh?QU2oD4nG6GC+HdQ^msOVYH*_9JId$baqtu6 zQRP8pLb+A>fbtI9lyIN&V)z|ARhd^tl`ECK$}VN6(klN#k(BjHts=|6SC%Uw`TK~M z@Fn>n`7Zg*@@wR~;fVcV`91PWd<1?7!*ajeEpL+}@+SBqTp;^oyZg`XC)_`F ze;Y9xKL?M5_q*Tje!%@o_lw-mcHiN?#XaXf>OSNiaSyrs+?Tss+;#4C?u*>Z+-}$3 z;h*qx*Y{jsbA7?}AkH4V&2_))Wv;tjcfm{HglpP$#C6b>a>ZRc;i<6IwboVR^11BJ zKRcgr{@D3#=U1GcbAHVEKIdEDvG7vo-Ojt5s`I#W(m4vRg&}93^Kxg4bE|W$v&QLj z+8lp${1Uzkk2${Nc*yZ#oJe>R{1@(ZJjZbd&Lqq@@{Via!!YRRacpyh9hW&Sb}WZg z=K4<$FPAa_BcE9cAwtH;PuoZ1Lz`B&PU2RL*cH5%1c3Zt|z3n2~ zc{Zo@FMRH8x%bp_@aoh5Zzv$!EmkY+!j`xO-D%n5wp%RLrg2L@2Rbc-9O$ql*h{bw zTY5F<4VEqqdZwjYgYLBSun!u?Ein#sTKYK9VcErAf|1w~)u0C~mut}LES(y3zh#>S zz1GsML9em2Y0wKT9jv&>xaA5CWGy>6&}rGufey}{N$v0SV{ zFSOKZ&^?xmH0TAE8V!1; z{W$U>{Z)hRkp7}Uw@ZK4patnq8dQ>gt3gHSR~n>BztEtkNIzo*Z@o?WDF<$qe!_uU zq#tqMX6c6<$VxxvK&SL`4s=MrlLutE9_2i8kZaA2ME zYYwcH{>XqWH%Z^*z`XPW4qPvNmjlz%cQ|lZ`aTE7q{lgsmA=h^Yo%{-pi}xD12*3% zeVGGu(xV(WEIr17ob)vgj7eYRz#-`?9LP$KaNt_$zc|n-eVqdx(l;2e>4fxo4%{Gp zjswS~&vM|H^eGO^OJCx^tn?5E4oeSnU`+Y~2M$S};XqdUGzU7RFEU``y!1&99F{)8 z0c?nKU`+Zr2j--Yao~{jQ4VCKk8ogC`Y;D(qz^IRvg@V)CGHCBE5+N9nu>)a9DZ+2RfzKb08-@z=1L8bsQL#?&rWE>9rilO0VI-wbH+H zAS1n+0qd`kUd4fC={^n|lwQdJoAe3}TrItv16N5eV?c1N^imF7DZPXP&CR`=q-WP}3kip990v^Egl=J(mM%={X!oNzdj$ zQhF8xE?6r)lLLFDXK-Lhx{Cug=}rzLq^EOWPYK zw0;jyL%Vre7w74+T|8ac$5UG`PcM$~bZZYwJ+5w^BK|q`w`X&dr}is&x@jj*J(u%z zV<%59+riTf+j+Wv8&B7D@buDlmdb0}cp7ZwsjY>lYnpj_NfS$5u120ZB0OCk=BcfL zrx(}rv^K<2C(c9@zE0;>p4M#P=>?m4YTv}ul^c0#yNsvjZQ$ue>sjhpwT`D3UdmIf zbEsTLO^~M-tl{a(OL%(zYM!pRn5WBYdAjT(p4wOO)OI0H&#U2S-~yJ~T`PI&IG?BX z6+E>q=c#`gPkraH)aDBC)Zyo;7i%!!XY+V@s(5&6Q+O)lFaSNr`i@eo%f(Ztlcx>` zPwjS|+H5?vS{-(aEL&;)-(<)B|L+1n4}351b*%nB8TcU106Y+QW#C0P1#kyq0L)?a ze{Eo2pdV}h_CP(N09+hcfi=J6|DFG5SmS@y{{{ai{2%nc6OjP!^S=oG0}EL7Px}x1 zug0l>-TtV*%^&iw!zzCnP6qtl_usysVuk-z!~=NH_kOJN@AtjjcMm)bO1=}m0!|1V z^rinFdv5|CS5^Lv&pG$bc4sD`AQULelu}9|)66~@pg@|XO`ENmq;0wl(pKtORp1-JM6oOABIGn1qQ@qPdP-;d=( z`<%IFea`Zn<$0bj&i5C>CqO80dSFRlQNZp0oB#JX&;Qi_kpC`N3fuu?!VkeO!2j|e z_Fv&2$65X&|0aK|h<}CuWLOM%egE*i;ClwX0Uq+*?fbg#b2!g`$oDRIHarZw zfpOo(zMO9}&ha(Aw6D^)9R2|o`P|0eaF&1CcpUl-cfmuz9mcK32aR_cZ^B9ba%0Ts zH?l^DvB9V|Qbx#FW}IjoWw_uc;CJ4qyg&9nfRp@JythLi;{D#Yd#{Bx!9njOILGhs zX1wdY7kZPhC^!xN0?NcG{_@E!17*cg1){V{kCc!&Fq?iu%G?ooHYn=~jIVQEn1 zUgbXBeWLp)w+lW5e((Af5E&nKec$y>*B4y3!H>YZaejY2Y!3FqlR%eit7{{C30&Yx zxAcDLUgz7K*Wv_!xpNFB_$>SiG~on) zt~2Uf=?prLgKq(@|5^XF{)GM`{a*ds(DL|0a~|2}*Td{O(P_TM#;e0ZDzE>pJ)WZ)*qMPrRM2=r7i8wzfVt23rA6Jy0k15K>M-^r8 z5k+}N$ljql32}$BoXHmBBOTZ=G}^N z@rxAYt^ z=FO6b^EOFT@{A-j-XwBtcKn0O%Ndvkae1@S?D!j(_ae=X7kQnE_h(+KsE4?`#A$Xs zz}Kta-pto3>N;L8ifHcO4U$;N*GXapua?9a{6a}A=NCxgbT03AnjC-SagkG#<1bv^ zzce{s;`08b$?;PzZ+e;>KjIM;?+0Ao-N1y2pR0bmm&<#gCdWNo-sdzqzR#ngu%$DRgzfALy|ayuaLxYF0XhtIR41xP09wx3;cMI>juYT{A5Kv%H>tf2FD{@UeIhn zJ(j4i4{&)Yw83#dU#fn)m!GPryLeC(wxNTcCJD|@5Z~52{=kn@)bF{xzgh429hbK@ z>m9%48TNvre#PVk&05D}>_zq4qwLR$dW8K^Q4g^{ zDe3|CcSYUDbHB?OQNu~9ZcR3)jOVMzY-to9Z#@l6!jSUjiMf9@;0d6 z@d$fX{q_)hPEilA-z(}q_FF~W!=4vK)OWDoiJ$5mPqAMp>Phy5qJGJKrl?=A#}xGh zdq`0~XFpKXPuSCn`Z4>Zq8?+9D(X@8BSk&J9#+&t?1zf_0sD!f9$-IL)cx#9Mcv1K zs;GO}@Gz; z!oI7hAF=N!>LK<$MLobCRMh?KK1JQbzAxBV+rjP^Kh-#X!oH=bAG2>L>M`~;MLo*? zM^TTkuPEwA?8}P!A^Vb|9%5fr)C26>in@o%d!m{S_D%8A8pp%z4n;l0KC7r7uum)M zL3W#>9$;To)cx%9iuyjgT~T+l&nW6H_Bqj>HE|~IlGbQUUIwkuQ zxT5Z3w<_vh_Ay1>!#=90@3UJJbvL_NQFpPM6!ks!5k-BM$xEPWjs3Uy33e>(LyEeS zyH~~2*%@VlZXvd4b}wvf5&SaUviW$ExR-@?jQ7BZ9H%6_Wl?)?-lN|T-UfpT^U!> zS*@qF#cV$!{#*T-tRk(#$-(^vpblZ7Hx0}_0*%WB=fyiIfH;8$HZ&CpiU>ea0zZUs zCv!n?Ob6zO=cn z@z9bEfV506o;;?Y?j}N-sJjiwBH%Ls6b5Jr)Fl@rd_UPfRMUj35H$l55A?`^$}v8k z>)HccwAS3%*uLS>?lC~K05gWrP{s(_2iP=FHCK313StXcj}XcSJ`NA{g!bk36A}fG zNJjhj3QcB0oiJ-9(h}5%3A?u{xS=>Q6)UKG?}t+V4YQpNbr#^e8lHZg^K91Lp7J6bK<~T zOapf@S~Rds2v*|BZs_3ya7{tG0V|KN;|SaaI6)ThqJUNbo*50EF5pH17N-YYWDTYj zK#u~(2lQv9+Bo$x^|j2q5&$td;J)0K;honoYk% zvLm>hiGglFpY;z6P{#vug>doEy|Tk81%}9(HK~=w4$K8CVoO`YRt2lo0HEhAtN`j7 zv(;;=YqD+lEANDM?6N~kdcdJ5I0P=GOb+#s?sS(hRxmNhfF(H8)jvXTZNSv)$)Va7 zydVu~a}+^UShRF^Kk8Ny>}YGm--?w`Ge$t+(SV`>CNTgp2Zkq5B3jc9s1{)UjQ|E^ z%tVxfLTJ#0av2*L9tKhyAZn1h2dF7(WCO+#!yKjd0vt_1CTB?xx2>fSEw9eBL+7($ zQ$u6j+PW;}5v(FIEgfx8Po5klwcz|E{on(@A>-ghB3(FA0A4jlJTGL5gs}l+ltj6s zg{pYa^rD+E|5S5DyQ#j^_MTAzO=vO9%(x^Au%fvKk>~qNh>&6^3cQ%oCfAYfa1F3^ zEFIj&PK6ti0f_jLjRXU_GEfzcg<_EsSMn#f(#KFBl8l9_suHCR|4(e8&np6eWDZ5s zaS3FlRK6!qfSU4>$sHLm6H_j1uZP7zLs++HQ0(sSofysS!k{wIRpkPKc{B_FR9fWZ zI!KdrVrXIvs6!IkiqyO@P9#1n@IguY7>FlA%NYhOElt2@s{_=NiK4Qmv2OB8(tSR( zs0(!irfIAS^)owK_8yHY8=X{6Sen!@@<3J2BtRd+a8v5#g8QY>$H#gGb_3oAsG`(4 zW*%L@8Rwf%&x}rn z)-~xZlg&m}%>-%sGuZ%L?j`xn1fg`K-XZ8t$yqVUMBmVG%k3H>VA_G8!uX=4z{b)u zCj*wqhSmxKR~iL`>hL&0lcC9A9iS>l(c=9A{b(P=yBObtkRxM)?>%D4B)%1ZQq9w~ zlU-0lUvkL3TDB#cDw?u{->6m;3D&lMs0(;qL;VNPk!l0bH9Sh@4H9dPCZ~X)I{?YK zDwx5_Khz6oGz?NgVj_?(Y1Acv8nNDWwAWB4n+Ufg;d=*$ccHO_^@If+3#34R8i5=P z(b_3M5wWiJAV=VU4dn)aqAHee1s@FCf^4RxOra6E^6awUL$uCV1(I>!>D~ z>|8Y|89H)11hIgThQ0(|F~L2Gkr^5Td>>ZMZaD+dXCpwJrOhH$%c}Fs*Cz}60YI`y zXn@HbFb!CeA5(0K*vlVD2(YO{N_6*h^$XBi6D^lU8TA!9iK6e$L7t(CRx}!BGL90I zYKwsJH86oKi8&kP(6d&VL7oidTrb(K_JaV$BsRE@!6Hk6J*bQi5|0Q9A)YITX4FtXzW7be66-93R( zg6>ycUw|4%43(*{b1L3#P-N_1vD?7-E;L;f+0Yk}r`Ur_Fk-oBGSks8PgDf4k1UWG z=I+Vr{UXcJ$unStvLt^Dftq6|SU`#5;-v1q^vlkuZ2h09iwi$2nG5;t1C;7hS>oa}_&-jbs9dDPn+;g`3 zN%#BRQP+2&@m&UgbUper`qlc`+MQY(UayC>qxjwYb^Jp1BD;-U2uuC9I|{tN)0F|c z?%(R-;6IfCn9B+KBsdV6eE)Nn+K#7-viWC?uN_a8Wb@A%Iy-(2Xs;6n%|`tbHpq_0 zOLBO{7PgKb?j^jU4q1sL;YOD1u!}7QtI5DV(+<#^xj|(^ZLq*>X;S;SP+Rlb&{_aB z*41}30`3o_ck;7oZja+KKXl&F9*NcEHWTJhi#H9VW}6bxqYZ?0dixJz??$yX54n zD;Z7@YU)A_o7i_-C}X#sapF~F%)V2IgOzBNKTZ?JhjYZ}ZumC24>-2%gP zM%|X0x>l-r7VugvZMb=Cu5EY7pwif?pTQJWX>)6){(BqP@(OnqRtQ}{lwV{Fi zPe~pNV@+`$UoFXFR=bNVq0M!zIFHX24_FvvE@*&lsOv05d!*o|>W;>C_Q}%x7FMZw z^ZPh}gin|Z$j(j7g(y20pj&HoTZTFgBc!ekXyN8!y*`75`7OhgFfJ2IYM*OF<+oocpa4IR&ElPaazwE{!yWV3vL1TUl&O?6Ez zZMdeauCF5teexYa-9q@9^^Gl?Gojj+47+-QnwGJ%UJ!#asC!d2ZU$?!?VaTEBqV(+ zz`sNrLYa_RKl)r}hni4_>a}(34W$iQ5JMN#pw|^j7a)SIN}F{tQIO{vvu2#^nmV+k zjyx=Eu5P1sC)8NqP}x@Bz$Pb;1*`JMn5>Gesxng@DQ7zO!Tp9cD&aVYt~f+bbhNj2 zAe^bG7CdZdR<|;t7P@O~!s{7uTa{W!t;{%c zwAU`Mv9`MPWy?Q!1r4Acn=45(?;~-=jB~{D*Jlb!r`4k%xFwSb)nr=PrIX93S1RrD z6K3B3Wcf$vFq<`*jg1YJv{%38<=uS zT+DeRG`s7e%l#BAurJeVbWiy`<*zH>Tz*#B^JR}i!+$&c`|E*k!J~g&AmRTD?CW3e zUkR`Ly*?MT~mp(F3{{@VLiXuLbeJLg{OdW!#neVe_L^|5Bh zla7ZR*Wy3>kE_$B|3m$U1OMT`{}m2YO1kp?A{XH7?#+>*Y-` z{YI}HxKpkOCMWli-;vGA?+AR)paYdFV-+4?gU?neMizmmCsK~oqb^E%lc*m`t978Sk6xZSv zdL|1@j@o`}qTz7;#=NYzvB2b@&5cMTb;;y_XvBtsM$F;! zYaxx8y$_$KS%Jwtb{(QsiS7BIsKZjrJ5BQ)f@_^SLROv7falIk;}bcbywH$1YQiA z@Rr*vlx4Q(Po7oD4+D5#Ouz}GaL-5g zmu(Hg`5b)pwX_8#K=(!Y6GUTH7H~ZAFKA42OM63oXO{MlYx2jVYO}q(MT40-Iy}%B zllQ#@c_WWyRWgC0-*)Gl>GxrFnYR?}%tH9{1FK}6Y5nT424Q>^= z?CZcQV{p(K_lxsK&0VcXAYX1z<77PCo-dnK&B&{-=FWUTWV_rNt3bCe$#!lv&rk-! z4JZ6;fxo{Jr)DAO7w*jaXBAL7OkQOHzF7s74wzS2fHA9p(gE_S3JB!Ac2}n($(?!6 ztO85B`c)N}%DXY~OTB5I+hiAeZEzxXCwy|Pj*dbFz#N@-oBwOSDj3G6KL2F8f(t=vkly?ZWXayOS z_Mn+jds_!web&+~5WKQjRkSsG+1=_{lb50N)y1VlPQ*x%lfrME zt@TAIOWChs@&ALeJIlUU_KC6&z}o-6%3fPG23!BFWzF#D zmnd6Vb~5bz^}wHC<^Pkw{kSRkeBf4i@_S3*aNuBI2;TcT0_y_j1;ViHKR)2||K0yv z{}cX){onI{1-b_x^1t1Gwg0vLG2jhs^S8i5U&4Q;|0I98pTnB}Y2RbMd!U_gyYD97 z4Zb(RFW)}c@$c|$^wq(NzruH_?`U}Bd(n8-_=$0!@eSDT-(tMScr&c`4;X_$E65mY zjdP7k<22(q!|?vi`@HuF??bTK|C0AM?+0PCf3^3u-Z5D0Z}T>LtG#h}-8;!!jysGO z;BoIU&pn>6dv1rfJ&6E#DLn0EJ#C&kPZezRgPvnNZdmC5+Wk}5=YPxndH1dE_qnfk zzutX?`x1ALdy9L6`+Ru4I0JV1gaP=1>nYbG@TvDz*QZ<`Rv3Weu0Gc`SBq;6eCeI( zI>}WIPkMiJJ`F#5-*iVDbU+ItO z_vl~OKMSk-8};k-8F`Auh-Lhg$}?T-L1W(J*Pdc-49FqJG75#@6q0@y-quz z4Qe^9Lu=4hYhj=O9tW(*zwzJlC-_7ByZp=iHvU2WcK%=dwS0{4=AFC|14jNaW(ahI z@G8bx&X^(85gEA1m@#2T##z>wF=0o>*-m4IU`J%M9o`uecVuj-F=OJ6j5&Vkogv&2 zg0C3sG-e2Pgi?&L?Zyn@j>y0^?+gKth*<63854J8OfzOo+>tT1)tE7HN5)`~Gefu| zlw!|P?~DmMvZv0NA=nYhb`Q%KGbZlH9=64pA>0x9WwSA30*~xro4hjwJVJS0ToctzWs4y#)KW|r}~<(BmJz+m@#2T`q?^T#)KW|ry@<*k$$$(m?78^nRBam zhHytH=e|l~hG0kNLmxv^Ox%$^6lvm)^s(cO8NwZrv7*L|2|UurbYq5qN930l?+hW2 zh>X#E6LHo$(<+>AS&iLw)FmCq$V3sSjwr z$NGT0+*TlI%($$;h29ybO45bAboHT&UErP3%n#^0Zqloa8D>Q~-3zoZC}%#a05{JKb-7NO`CGOd1vGwIZP+yUhSKyvGc{Q{{BGN^%h@ z(xpCJglRs#%lr^GrgPQ@w|Dv?^8;F*HE9&M(~5)wcUXa>F}>XiB)rqxRFW(T+^Rlg zslZP20}9+?eTW&;rbNlYapg2g6zZrfN;CyZmPL$dQ=nwwDRY_xiiowrm?n8bJ(6XW z-f0pj^kL^t@3bjTcA`L2p6moj-LxrBcCuB*G|3Z6zLSN#)22Y#i7q68BC^7eGv&!n zc7`!c@T6|o$#4CZOW4!DA1HA zJ5V6W6Uuf6+;vWy0%ZrXC4oZO?m)JtJlO&0scBQ5>|iUs)22Mxj;5RPWIH?4m?n8b z`EG|p&}kAVl-G7Ji{y!*QMf5iwo~CGPQ(WkPSQlsIqx(H6G3k`rb(8_T$dZurZCwC zaII+)CiG<+JKdNzrO7s`uPIHo!TIR)DwWwbuz`dLWxNe_Cs`tspXQw=VIn^C8PldL z*#>y4X;YSLV@r)`k|mU6D_dero5Ex(0Q#m)VX}3XF-^im#G>>hO=OawF>Q*It!$Ao zZHkkv>{RbGi4!V+D+V)36G8WQr%hq9wcD6Bg~?WSiZM;XL>BT+?=(phkpdlO3X`p@ z+?Y0n$yRoMNyPAc6LCY|u9I&BJ*PO!xkCY{tq5++niC%mjqlQf}HI!CA1?6Hf2dCJHePHSwhLTutnZ!5+;;n3koSSKLGM<+LR?*uo0LxWyuzJbDcJ2 z$(A+VX_6%(ImU`9O17YMQGy4Kow0v(t#?P zf~2F*J4J$os@{R>k{pp`dyOd)Br@RfPLU*`SnZYGDH0@tZt_l%91(P_F-2m862P^Q zcZ%eQ_|WB@GQ~)HyLXDji1=MIrbvp&1TJHW#E1+yy;CGdC{_l=kr)v)curD8&|St9 z2@y&FuSeb~k|N?m$~$EWk<7`)lqp0qaK<}DLPSK`=bbWTNCx#VWk`kr%i5G78942o zGG#~`>OnGuQn#TVrU+?6>r4^Sw$3|6B1FVl>z!&g>1yv32@vr+YGKNcwhhJ<$q#A+ zTq+q;rT~FQBkvRm5K7SusBw}Xf(Fz$i4RKA?0B;=Me;)it}~`g0RneP#*`^QnjL@| zCjla(0mPdmhz$J0J4GTy~H12DF2LpRr%iX>axGVcmEY- z7nGF+ei8UYU_6lazo0eiyYw3E0skXxwRXGzz3`B9r}kI>UUrLrhkv>6Ir!D<@Er%g zdG9wi^N;FZXO9^X?{nVId2jUY_OA3iigWWDJ&m4Y-4D7y=+3&A!>jz)U2lWVK^Phb zPx7a=N`AR^rFJoIhDV|tJ4ri6{}emOE_QxjU&_zr*Ezo8`~J|kDiMl@BkZY4eItITZm(IFwRAxNuLkWk*xJ%PSR-_w8ava8 zs!%)~XP@L@J%i#}8?u|%!6Lg6FI9B^15^%Djp`IlB-_o-NW3bP3Rkh;ovKHWprd^q z?$a7jlG0O7!$>)rO0oZ5uCK=Td7id#Sr$rErC0*YKfa(H7J0P381-+ctf@^W6QMNx zN}MQu5)4nr;-Pf9ik+}TUupJ1YeOq)-CP$R$tEyth zYHxL%XcbaKh`ewOTV1mO#zbxP&@GOqQ=ud}>mRbMU{3M1eL4mU<*FF_{Yt$~@QQY-?Sccuaz|aR|o#jz6m!t8Nz@jwRwSWsW=kc#2*ra)E&`P|eH+MIz{;Xu|P( zSwR8&gFb9*XliIrq5|;d-l^`*pt7O1)52`v*t&%{yN z)fnEvqNbMw#K;zd7u`#h!An;x6%NIsF}8e#UX4o5`aDiD-h2pQW!ww4#TzY+)N(nj`3-6edEhTwg>JClQZ_Qefh}$LXh1r>OhT z6h>YI^Y1%g*&j;S_WyivvA%2xs{wo4NDaBJ785vBl@6bHg1%x2E9#h7GL0|E(^lyX z%fuJEPqMggrzh6U4ejf)c;F6)BNz{`d5300OwY`Uj_2PNET5Q;cniy9>l@lK?N*vp zykf32078NecVh!OtrM^5&2^ir8|^f)*x7o`ta1v|6vV9x>1*eVYePd7#6CBwZ=5GK z-iA>Xr590<@X|pYAb8&>PZ=$7M_+4U?+-{z=I5@!dvR}eX~+3l>y1+ z2CP2fwFxhXge-=RYX%-(n`EHKC7G<$H_V@lVq!sk6Bp=v=8Zp}bwWY~zK(1Tuzjno!}^19j3Oi2`FcP4tFZR=nkxI5mMwD+ff?A|DHCJXN8*8c zeSb;vf`MPmuq-B0p>r9LO(YCQGRg8*=cI4J`4Hk|b8R&om5_fL>`1Y3ArwvNzX%OW zMvhMDoy&`xHE+ENl0}b6>Dx-{Q7owI8|$_-NGmVP3r;fmn&b857%K&AOs3=5-y{~D zrB@?E>^$J#Co|hXUTi?f!AdmMFW27U4T_W;v;!+uDYQp>{A?-n3VESi&a~9%2T`x$ zCY1C8a&GR-t|8+Zxw=C_scj;JVKlbu9KHXQ<{>H}FYyOcT%4%(WMvYq4u<_cU;$=zw>;x+mu z7(>NH+i8U`oy%{PtUjRPx-O0j(}*@Ieh9%~|Pk|TX_y<^^Lh=mLbab0V+ zqgAksR+w<2R|@F4>n;-&Z+-1u7^RQ*tisW8R@>EvA1gPOaGYuyu_lSJdXbbOMa3!4 zO&bli(oqBVvCe*1%r))Y><+rQ>mK8I*B$;O{O3OiulbkzTHM#VS393_e$@LO??qm> z=Tn}XYlHJO`a{Ndd6ExtH#>(tz&^T%Lc`dUab#HEu(m_08bUI(o0kaLda_-z zCt;Q2w`ptw=1qV>UJpA^>b#c5h8lDoxt$Y!rX0_&!UlK#lEyxRQDuvQ*osu1{j@^(V%c*w`-ApEVZY$E}2e-(vb)|M%+))v8h?yH=25F(PRXd z7zy_2WqKMZtnGNFz~DK8JCbNT%$A;mb7%>d#4vz8Wi#Sq-Dqg(kT;cJxiuCdF~<+* z7=$9J$vHZBT9*2v8PO!>O2l!W>tM;kC+@85UQN>t930f1T8W#4lG>HBO;(9kwYcM_ zSnSFB4E~&eeIl=EZ0V@YuIZ@RP}g1+Pll4IC_74AnxQM8`__&d#!wROc)#g=!Qpfq zhnq8WlF}B;q@%d?NheQ^Un3tC$dtEz;W#HWuol z&O8d)AI)+5;2I3QSDv9@YZ(0%i8_9ABCdK=7HXtdrP3ilue00CPqtT#M3kDDX19nt zL$qWb)7=zuPeiKN)oNh3Wnw7|%5aK1#g%AHOUs4^oIETQ*+?2!qTvMF-sYSPls3s8 z7S_eL<^CWmFBk~C9y-+-j0)WJ7D$n#t2D zwQsI#+hA^R?UnHd?N}L0GY~^;-sSOS76ZtYA7RSJuMpzjSvC#jn!*2DeUkPsRVmLE<-d2)ZQgp700MgvtOU7*NCjud4~KhkZS?R zJGpSABFRuHS;c-8((C5zEvq8-RIPISYz`?U`qrKw#Wl4PryP%)liA*XMsRNsi$)yx zink7HZJd2!k)ao?6c&q@#7&_`!mw8gW zj7x62;P9qq=cIeyl4s>J&zgmH$a~<;;^u9hT9w{mfFqWLlU=2F2zP31-YU&^g^A^> z0ndYS|Ee}9iR3mcE62R@yykF}ZC5bXvB^2P_?2fmKksOVn2K$eC$~9wMhm&Q-PxdD z`Es?YZe54*XPfZM;+m+*4sqKtPcI7RCOGSN)YoHWsLZssRd-suLR!$nD_3JXKi^=M zcXpP2q4Xm!uUX{F%UQEFh<0_;X-dmpXTnChT(wyJH zdia+-E&R`(YER6w90+%Y`>*cb@E<{c{(kp2fNpn_`(64S?rYf7?$^4<+`FMczutWw zknNVbk8wL)f6||DJR7G~)-ZyIfyp6|BMa3B8;>0wkXAIiGj_ z-1(sMTh2S2H#={D{`{nK+}Z2wbZ&62c2+u1a~|vT=r8Hd>OTf*-PiTofjYlOk7&oa2WdGahhLbh2r5bA1HGkbFBD=tyPq-DfpP?!&WGkNb_Y@C>l=llQxmt zhhwGNhcww(in}UxagQ@#v4c2V=!rL>h9mfh!xcSyfnVvc%8A7joLixIEY3%*P!yOR zFBSUAN|XD)e?=Wao9otOTk26?*z$yGs@b2i)Kq|QWj19tQB#lXyJ~?=#Y1CbBTS?= zus_<3iiG*`Rw$lI@#CyeG@0PX*u51A$9cKtcfy8~dNvy6<6~6K7FkU)y@?cU1Vd6B ztADV^E83ZcEVCTx18!YAUSX8mA4tO5&Pt_L5>j9AI9{7!e=o0d9R7FMepzga$CCW+ zf>4Biqlx&UNxr0D(-yP0>m@$RUS5rbf4wxf=&Q-?f2^8D(_#K4yL+)m;-9rX#;W4{ z{dOo8;cv4;i70v9sFxWC^EHPrj>0Xa8eR+YR^WJ{$RXxG>pj5n z+rkO>ulF6`c>WS%-v*O?m^rxIdF5UXLJKzQcRXu#AL&@tSRrUDIsR^ksuIi|%dvQp zZMMI~s@OdRp|In_b|{)+XBUK$j?ZJEIL5(91VqEz?N5=k;~fQ|2>X0NDD1e&4uz{6 zSKFC{QA0gHlyH30j+h8X>`$=-+gT8bv4`zYG|7H#hayq-q#X)}9lt}CYRL_= z-PWf_I?S%IKA}&4WPd_yM(j^XX0PdyM4Elnju=m|ciACy@J9+larR$!C>mym?NB7; zc+P5RB$8~wr(;ELM{t-bvqQl2II1ud^A?1n=~D~WpS0t9hVz(mkxiIqXoi%_8A6hF z!6MM!-i7E*3TIMM;luvG@$HS2r_auF!8?e8Jh5l61?eA(bA(asLiYpn<@noHs-sud zk!0#DU#^zi42iO88sS@`pI-E-arfboEFXzB>1<>^CVa%AI!oX8B~b z>(|=R2K5fz2O&9>UZkCL(H;d}Ih&@v{ z&Zu6q##vE*a0(j2AsyPTaF7eF0pXyPJebi%YpA8Q9oroCbObDFvRO21n3ZP9ep%>0 zvudu399d;B6QZKYXSWYw&ZCC0l_&w-CzD%=+?wbAJd{jvJB_&5w z3++jnC%eC3osK5?`B=o&`7ROWwwQ}0V!YD+mW=Wpg$X0P&H5Ng#dr($@n!a2zKi<5 zQZkKJ{8{}|t|KHI#iImru zeWq+tV5$FozH5z77+!DO)9Vg6UvTc#*Jy9ym$2mj+2hLO*?oXnnCv_lP>L0WcsvTO zf{<~#2m6PBjiVf32s9eYjf@Q$DH zH*5oh!7)W>_bBkHOu#i%92jaSj{rGF`^WZBrUl6bDhSY30Mtjx=HsT+Xi;h~`K7zT zx#NwR6$KGc#R>Th!76mKFU!+K7w%+7#JRdOAKlvfzJu7DS@U%RWT8806(WN z+uHjk26v6E>fTimTvZFR4T9?c+1o!(DOZi{1*YBb0HB}7Ru$bQ*cu7yRH?2V3!joF z&*}k>CbN4AcobK|t6%`r80jAx?-|{lg98%6B`QQL3Jy*TP=^BNk_J`LSfXw>0gH-I zo{-0pdvUg2Qa;j6Xf_842oQ52S_E2D3ey5)8mRqYT!GOx(36SHC%Zm4yo(^8EbO-N z+-PqPe5UjUfv6&;O$Bgpa^3g^FkvGACZcb&6kt#wqI8TyfS!Q8v^z{DMoe(SN;Nh- z*fR{g%$|X<9sn@PL=_gU6oIYm$9L-!@}tor%ArC5vZM-HWyh7=0K0xY07M|<$|P|rRAi8WR!@FW3T zlN(joWwcfk-WympgaKCoO-a2)2ybSh?qPxN177xsl}~!q!6>EN6$ByQOzc~lKOw|z9&&%_r6va~UB_tbGisvKTXOb+E zwYT6KUmf0Mg;?D8_4NZt5*@cc2)H;x!3vIz0Q74&0mUiVCnnCn1|IXDVDaSoi@@1@ z^~Sk4OS6augPg;Ja|+nT(f(Z%;|h36f;3_56V#CuoQU5|gHo|mA%p@IGB-p^JOGs7 zUao&+VnDz^B4Up@;!Fu*atNg(8*7I!Yx$e4Ryo<0rN%TV=^r(h<~gyedZbq=HPgAwm-@%?dLCi#e8BteI#f zyh;M~6&%>LpODWmCrZ|WqSsnj3J8tf$>lpq=5&}cN4$6ytxG00aM$Smk@4Z)(cB1z z9hSgez_5+?4a!Ab^b5eMXcg)086pXdrHN2m;Y5}eY^otvRU1HXzW20wY%(Ud?La;A zp)2J`l5d2C^`w%!`oOlHq23;>DnsBXIE0l|PS|8TxT_!Q7eNRj%6Olw6PB%UtZV&% z4a0bt80xI?`O7C4 z&)2+S?gO7$2!4TxSjbihTPZQb1lSn~590k?QrF!3*uru`?7MQo_SPn1!n#b85PT3f zEgAHs9H(Nu6WAv@9lQXOWk~|N3@%Myh7E1A_%P>F@a5ak-@}tkF@#hjlZE{~Fg&~m z8)pjH*w&(QEboMn0~#PH(H`I%$GAzFseiqqt<4q`FF z+5~*f(^iU^UC@g8#`eOLRG@*$;(DLM<#ztf`Fr@9d))bu^KR!ioS%1o!uesmmtW_+ z%K2L7KIf3L+qo4!=jxs3Iiv787j!OmmN}jJU-aMVPr~!u{ra8ym-SEUH|y`!-=<#+ z?{k;wqvd}rf42N*-@{0pus zUtWGv`7z~2IV<}!d<;HO_M@_U%D!3lg|geqK2mmL+4W^tmra!&C>w#N!R=*jW$WOd zAXyeFJH710vZKmefxiZR7kE1Gc;KPH-GOfez5pb{j|AQwcyr+Ofyuz7f#JaJz>YvB z&=9yFkO))+mIY1>92Ic+|LXsp|0(~E{SWxR1Mh>M@qg6+0pJH^wiGN8y$5+s2oSPeF&`J-}DI251SF8KXv@vD4@< z8jUqZm9fe=-B@BAZFmib_mAFZy+89l?7iFj4e#f@pYVRzdxQ5n?^W5zl>|J3U|Ve8zK&=Y5{Hd9LwHc@BC;J$;^? zo_5cA&xM|(C*(QZv&3_>$K(FH`w#A4xgU2w#eS3#Z6ydeg@`-<3QCIVuJUU~1TOYq!5^4T1NyPa_MWn4P$UmT{Q~CQ8 zbqasCqE6=TP}CCs5k)QH?^jegf2X7z@8mZq>U#cRMP1E5C<@!!!`~x`ZhoUAcJU8M zBFEn)i8z0+NCp>7{B4R_!mn4RA3dMJ?iQl$7Hm{2GzTmOlP^N#yudl32svAc;7?R>X!Y zB@Rza=!(tk7=B1mNAoKbwTMp%>PnW?J|&V~xly}a5-YS%OJb?^IT7g!c0iMTcm><9 z-K2iIRQqp5^=h*7u0XHfs(#CAvWu_SsL3wAVuf~#$o7h*+9yP$%h^6nGWl}0SChST zIh)XAuV2o3wGXOzIqgG=%4+WynOwd?`+y{tYH}Q0hCFT*u`WX%vMVlQbG8PQc*cg4u$>5>`IZ@{*78* z5-r*ll31a=RuW4!IfO1{1KL56!=-GGwpURXYZHp<)%GhYryWpKR@)~sxpakgsU((a zmx*utSid%)s6K5>QN7xTqIPS8ippuDippw3B9ncM+9i@$p$$u7sWvVm?PY!1#fs|H zdKI->>sC~c)}^SN)~~3n)*~|6+o<(PVuiL_5=*r`BGLrw*0w3COWUfboOY3-vf6e< z)oD3NIewRa#I-e& zsMKmCu|m60#D?oz?Oa7=w6vnyv?@hy)Dntn)#8e3){=@^r=>)8{c-IaNi5aQ6W{t+ zixyH;vv#(knzWUQs?p9;R9uTHDymf~>Ub@zC|z46GVY6O5lK{PF-fe@Dnz7S)~GF2 z)CMi6s5)(hqQcr~l5$+5EfYz5yR_w!*rlB=iMV!#Br3HtMQr$})lN}VgLaal)@e%= zwN^VpQT5vKiVABdicEILwUZ^WR6A9CgD+a`I7QWJixgF(1r)VL^D8Q<9j&OaR;H-q zwbv+Wv3884(3WyhM9(hmC`qi=j+I1OTPz}Vvue#y)PYwz_%B7$+&=!4B)a%BlBng+N+QLdmPDLCCy7e_ z8D)|#4HvGEsA1Nxv zA68V9KcuJ#e^60j{(zz?`F$dj>^}YjNo?TvOCrvHD2Yn`h=>gbt^969h4@{Hs^H&N z)Y<$SiaLvbT~TN7??}q=b^d)ty_Mf7GTzz8za@zr|E45%@_Qw*ntxXkY5qM)#Q8lU zJv^%NFDmK`{#8j~Kl>#SZATyfiX?LU%aT~l|3?yO{xuOBu2=cz6}5uP-4vXw^4ryK z%lRiog6)0$Gm^-0x%t|@liwkK+0Nw#ZTo8eS@}zxe?g>&Z&fb0Qrp-veyjTJG=7Vs zmU6j6gF{w+TY!5U=dpv1^7oa`KzIK;Wqq*8zc=vJKo`!(4xEU$_}BUU>>$p%@4?wN z1JC-8!k_*DW2v#o`)%)=yt};Tdr!wH^Ie|vJQdL3f7*S(eX%?3_QS*9>s<$2tN52) zPH5i0)7kG#J5Pm<{nh&AdZYGJ?OyFFt$F@~3LBaK+y4_^CcXKv$FUTk9g}C*^xISk_kLX58|eOtZ#gLWbB;E$}TG13Kxe;=~@|F0vBZ2MWv$ z9u%Z*WwCpiV)uoM^X(K1Q=;O_q_O*3` zBjfu+`C2rgWC&+~Xp{=JOpJ$ycZb%{8dZZAogpa5panH{3t)b+BfmzpU|B&6O7WeJ z(1Lk=g4&>p)ulZpF+1aX@)wGdFR)6630uj?v!;Ty%Q7FmOLakt9Blzh33{{bCE7ZR z^B0uX1LjZb@b0uUe?B-!@OFe78LSG!Wp1pdH57>k$&YW4+{#ttS0m1Bd_jU4v+%eq zeTRy8{yao40Y$|+kqUMULHCT1rgl#Z1RIBYq486V$4B%ew36!c=c0}lfK(i-UMYax zeD+D9BHf@s{v5lLqp9Skd|I&DTy-etQslY?^0wHc+TwgwDOVe6p?n^W)a6su788Gr zN-SLn7F1#&pR}8jjHSEt3DJ~@HEN)fTrz4FlyQj!De)1uI3F)jmza6X2h?EQ#z?k_Lwd)EY|^n{3@H*iD-0NJ_KGbnLJr#hWQzu)r)hh zNh|r{IXfO|LZ#Og#2l9 za}M?{+wx0imHe;c9C={6nBU>>bbB^=*6C+?&cUnjsh&k1&HaM=NzLp2q5He~E$%N0 zG`lyuXZW|=``rWXo$gk>%DqN^H@`#AxZ^;zJKk-${)+eDpSd1zebe<>*G;Y)TyJz8 za!t5;U7fB**9ESqYq?(U{H602=Wb_6|AYRy@^6(->KB!-)!qtR!OxWK=MQQlTCKLY zth&q-cqH&KT@So2urm-37I_mdJ_uLqogO9!8VFirjT)(lPdF&RBhxRINQ1G zf`vuq?>xhab5?1_5i8@y;jTRuLH>@_&ZRwYPhj2cm<8Kd;q%`N@wcyX;$Tuz$h_xF ze(iGSvRG;K(xV@@t!5K&VsWL#u4FvIFSCqv(^dR{6@Y2fzS4%&lL8x^DsT}pJTXdk z3-jL0@WFyolDy9fC1AO~JMF~PSpkb`h6e|stSPU`j*u(+T@|HdHgngIwj(J`V^a-{ z)_Lo5dTGMyV!f?-6XxoiOZOF)Sd710i#wrSsMLWg?R{k80AyIQZ-Ie9;fwr7?qfPdtzZ>e}r_yZH z4pcFF45w06jwkF?sj%a9b|?|&-F67R^4@NTVo}y;g_7|Yv&#lpIV-on#nLQkH76NM zon!~1;W0ZNd^LWtAQWM5vLlA08|+U&klAB}a67~{+M#$ATU!u{v%lJ*Skz%#*c0-` zPwj8fID4QV6m#5O5Q?%@R#o6O(DsIth(!1bJ0g4nE-wg0*;XqAuok`{?8FJEXmRQQ zhB6&|XnWpL9~4L)L9$EEscW{hRkWLt=#T->`dpf^sJcSU^ATgwAHl&nM9btRXCnn;arw_ z`G}7D;!a!v6t($fZvfbNbBVnpUmG}Xh?1ye#i9~vnll~Zcv;`k7=)>COLGvGOLa}H z?U{-zAi`3mNs__F9$9qr$X6~4EpA_b|Ec-d&txdd$j;&2X(bEcm~g0`fxb4RY4 zC*L}4foU6V`%RFW_h7wTW_9O-n&r!HvrOX@~PVSlg=^%fgIsz0`+y+^FR;}Pskw-x4s zbItDl-U($UKY#JKo^v>k#nW&3cv(NRYaW zU#h*6-^cFzH+dz_AAdP6Ob#``O2zikFPgbu8k@j6mQ0LuqdAyv<6-=OGzl5Y?ZzXl zWpp#kB&0%^zV}=@9x}}XgToW!BNMQCH3t!lRfKVoFrmiV7+EU!=K6;q{rZQ?cJSl>yD zu-cZUAaS@mxFwUJHpN%Y?#2=~os(M+P(v<&MW)q};lhqID`SpKVb(Od7yYM3+bHbT zyZVM<8A@hZqwoZP!9Ug`%|r)=VPk~$3x@{6Kr073?+%=xX~nYRj|{_XiEOsubfO;) zG_WAiECRdmF4zqtrTLm;jmo*8H4f?f(YWc=)dh_!8l|O;Lj^`LX7}b$8Q9&4CJN^V zXf-v9>ZN)X5rv)%YF3Y!J(oiDf?7)RPfTOjom&Rd!rYTGT-V;zC_Q9gz>0uvgC_OqoM!v4|CUBA|A{lukIoKr_H#@ClQqo9vcpx(GiSFg}M94k)#t-f+YLXADB} zqE@KJSRXuXI z;CI7F?yF;(0cFl(Y~91cEEOIiRio``=#y=chz{t^644HRQstN`YO z&XL~(Tn}N?clGrQBH>Wi0M3$Vjc7kUSaSt!mL|m_FPME|U=FFp6xOM90PO<%fR(WGou#Nz60dFVw?4`x% zAPo4$VgwkJM6_@*0yE^W4W20`4~EJh9H~&9D}tnbCT1nZ2ZA)PED?e*>GaqWs0#+Y z5JDALFi~0IjD@nuWZ(#*hjQx~?^2Wy&c99WYFB zCVJVjhAnVVBisZDGgVwIqkAz>g>xPyV5|}*hG_AfvkZGI4CY3~P*6h#-aPh#O=3R6 zDbhf0l$M2p0nh~3d$#AUEIHy^+f2`+`QSM5Vc3+VMZR4~$dtAKbERi!3{^L$kLX&f zui>6zU;s{u3U^5O2&;QIY8b^#gmH0cwide~h4&z5coKoP9xO9zr?m@`LL`#+$+W|w z^&cb6<`S0DwRPJKWhSkXlb4TvG5x`9a#|$icQ@Ki9Zhnv7fu=W3yBCdQna5|HVF)(@)DPfz ziIW~$88Kv~p|Nsb(Ou{<2&;Tio785vU}aPue5~D^&BhXK!UA*+G4aBqF2@qs=|+L| z8?B0%tAC}~O8^lLe%yfK(%K44A;R>=R6YF?N^x!=0wA48I3<3|s+|;+=>RWENDar0 zP^?n}1f`P>C)(g-ud*6{9XG6gC%BSm#DWlw4$<$M1GrrdCF5yR?cs>ZL#GZ>nn)lL z0TfL%YNnB{=LrAki~)*pK_CuTiF8%Uj4(@=VzO-yt+i`2YDmEqN33WCqA4;qF#_i| zkUlM={Wu+}aLzKXne?850m%yV2w z&>;h@gW?MLfWaCGZzO}{8K#RCIi$yGf)GRj?B^%MOdx3rw$Z)<6Jh{6M#LP&+Ci>X zXmY3sSa-#{6eRiHo`K?m2I*NQB=_+J-i%6{Z+VfM2f=XC+mHU8T#LOgu|fh}Dt6Gz z48$WGo=J~LaB+nFd%+YfaDrnm_|!5=33nj)Q9V+Q5AVV1K+ecgLVAR{QLcjVe|f+@3QidvZu>_=)4Lx0w33ZR`y=~ z+d8ZvwKr;eVUPU_{#_pB%ea?)jJ=ypIbL);?f43^r9WE_xrG9QsS1>UC-H^M?2z=h znk7v-f;3c9In)C5G`f$?glbzdXB=`tXNhzeNv)Cohp*JuO#qIl2pR>!bl{NF)|0_g z&7}K~j%qELoKR{x3Fw&sUa zNBiQc)-(#;$3PzEVpDw|FP&H9FBNs|DX44GtjCd~)ATBCG za1lDWEWb~5cV$5h5@zoIWDSlmgY5dyWmYBW#uwl3gy!jdoKK25Dmy=c28_>YK>XjX z0axTNnbpy;f2NjzQ0izSTY^_I-_Y3(hrU#-*Z=wJKOFcE2mZr>QV!&s@>#Eg9^L{| znyo#x>D4{Gy+S)i=t>oyJ!e_qRlLIdXhT+aDc#fM2C{YHV@jxC&PIKFl3`es0i$&E;b#2n( zUXakAjpR~vaT~JkYj@}SMF|P3@vti~8+N2^#q1KyR03~0WQ7z6)8afli_f()2*>l} z#k<7R1}2wK6)m={#5F@uWs4ghe;yvJ&D~@)yffb;8nV2gAqx`Rvm0VDM`A@OE5|?{ z4wlWnfyP`*zDpG7E+{Z+w)#k%oA;V;aemj_EQ&Yea~{XyNhdb{?Jcd5usOSIBjbJh z_Jwc&r-#qb`0z*wm-&@Zc;u_Bj%4ZIP=om>8q326EVPY^jHRHNdt|K{e;!w{Cbz57 zi}Sc{o2xe?{`{yNF_jMFM{KS|QprgzKP=cbY_To2YC&u>S^G+7Td3&Wt5QPBAD16O z{g)Mq51GJp8Yky&R1ty7N0kbxmU>nt=;i9B95-TVxZdR1T{mvV5YvuY6m1GyL-<%2&cWUwOG!_D9?TJPOZz zUn{%4?546C%H9O8eEZ5SF56kQv8=W%Rd#mSDP>3F4&lYXv+%}uf8d*e&jmgjcu(Lu z=<**33TP;0yy~5)FVO?qKeXR!Pr#$zx3$k{ zAJuNu-lQFZH@!Y>tJbJpphdK0@TBMAFY#yLNAF(#b$&a)iQmBA$n$)H_wjAKnOE}| zhK2m&JG@IjhVx8ylj9xiOyA+09s0O&_#%Xu__otHoV5b0jl(;wzz*Z^4lAG;hqqgS z?Y_g?5Kx)lY8>8betNsxINWIkklhw55Ht>NwgSj*lNCUA9SDf*-p)Q|9Bwy1y>+SY zaK`-fR(6B$aGM?KH4bmIBChZqZnZyUeTQ4@&_{iTo9)mo#^EM2+4ac3(fo8hJLEgO z!49Fc^>zrQHCV||+B*9aN?U7(ZuT9nw?j7>hwIE_Z$W9b=BKx?xB3p(*ddg*#tvO% z9Im#Ko$EV%q5TP^U0{c<_Z>dp4*j=rc(s}A%_!|W^V6GIpYQOwb_k`NV~5bTw3Q5P ztFk|#w3HqCi0^RH4t>}-oG_DJhtlHar|Z~4V1M3iH$dX74?~qbk$);W=l{nR3n)Q4tZ9i4g(KAnA#S5|RLs z6i7meg&0DBNC^^xV4n<R&bE3FRZ#_Y??fjGWlc~~C~LeEb(YXGF{U2XS9oDlkZtP?uX?mf^6p^Fc2 zLRZu*it4Yw~d-rxi zms!1g$z%zXwx^6rXj`n_5h|+E?%l(QYOs34Dhh>#oTyoLZ_o)Xw0i?i=u*4ac0!j} zy%s{Op?xUYFQfWso%mG9wbSnPs*r|;dQ>u$Z8}kCsNsaLPTWrDLaSGo$$C+mCZl>? zJFQ-qifXcY&QgJeR?nF#Fy8JtLnYFh?Vi(}(6M&UX-?<@tLIditS8Iv*(jrWv>)3& z8=TOOte#WUgH3kNdM9d@-P7fSP?2@&K?FKg0JU1{JcnAH?1X-3_pEV3=UY7;GTCO- zYPF2oj2`G&rJ}0so|P&J-QBZ7MWL{hoG295?u5_<%bn19R?jk->>L!fR7Rbnwb(sv zPN>i7S)v|9%UV?cg(-b@j&`oyqx9K1+7GNArO!4Yd(vl2nQWr$Nuh}ls;@NKCgeyO zO+@wEJxZl*(vnt>QfYDINGgpz7}pYZ59u@!LjI)GM5xd1A+07ty>^dMYjLf|>QQQ~ z8(Au~)~#)}dz4!1)>^C{rPjLV+C56GbyN3~T4Rf(8}+Z1g>};mB(27Z?$*w+dz4!1 z);3u^q}Eun7>ZU}Ee4I(Lt2d`i&1YWwHBk&NUiZ?C{1a#7?nm^O(g5Kdz4y>X)&vZ z)EY~6HcC@k?QHFAyN9$IOLjIjl++r35DisY?QANVv>J~>(WKNwDip1>+S%G!c8}6( zXKQErd!W@cN_JM3)dQWTQL3}FGpruyG!ba=_duobr{-EcP-r4znZF16j7N;OdZ5lk zM6=ZcZ6*SzTRl)_B5<0&2g-~kITIy9m9YrGtXe%#Wg>tQC&{N!A{3d3K#9;}JUL2) z8WRyH5n4NeTl#+{vK#AmgIDl0^P+TfXr(3Ky`@#+6B$UpUSs-ptnQ>N`%_t5hxK_ zOGKbVC@m2{iO^Xhu+HBDmBo^rh7zH%SOh>@tsW>W5kQI1SNtjTB(#-?K#9;+JOU*` zSBVIe2wf!tYpourDiJu@-xCr^PDP1OR4fA6tyT~8ln9_is4155sVEUjN<^SUC@CI+ z5}~3*1WJU45`i^V4-}LLbohIqpjeWPC=u$3MF8s6>Vb9=0h9>k#GgWm&`lx&B|uAfweY6DTzRfwHZoD1eWAF-M<-nh$UH%5}}4z1b}0$&Co(3fD)mE z_){nmDo8}2M5rJhffAvBLl}hZT`*BKP*WXN`&@d5nWoPwHeAs1W+QB z4}S_JLiO+n*9ZR1&^$Z>B|`Ct6etmTM+BBwo1u0@pw+(_YKJ9RhZ3Q5SOnl^$^L&| z*KMw_87c_Y1|ACJ*eAfNzQ(`V7xVtW^DECj<~QI3_=P#rI0|o&^W78mX6->F_NR;WVq4>3l@;{utdCY*ix&@CVah|*9bn-=8C4;vYM)LdETHfkOt&SC&4}%VYIYZbD~VOJB+cvxHlvQQ8#5bame24VfK$MNriQ8o zO*128H`~FjWjnd~B8>&^9ASb3t0bp;neiOVl2}Ia=d~b$T)eggR4eFx$Cglx@c=_e z-s!42q6W>B;i0iT$$D#Mu(&iYT9{j`9ug)WX{Koh#75A=(O^koA?(UZ1|sFfDq?$( ziI?386QE+C$$?cSojA|w7Dh%W`3KYNySQaGx_~vDvq3U5AheV>nwilK;$i|4AF?|n zvnR(!Z$?#hCBR*3E2{DFIK?mzP--*5QYwtP*i&G5Eu$~HP=)MYm0RIO^Lt1fG-gt2pd)f@r{ssvMR z%^dozAvP%%qGoALgDo!FP*Uw)Wx>oZ$k_|n>L%_N)`SjNuY$WyP<9UL_5;5Gnxj=U zWpkVk8M6L0;DT)?UxULb!9KAdO}MeayyE<5ael6{qS!wcpoqgT6Z4}brMUy_FZYhw z6g?(bSe%FG0^AUjxnwLiX3_kFHyF2S9n=IdtrGyVNj7!NF8~&X03~BPFSGx}>|Nf0 ztr%vCv=d`&2lgS_4I8x_JRyzi;nopdx)Q9V>ms0|#*WwEbOp1;#T=Yfm+Ao!J1XX< zN>3@qs9{0nV_Qt;W@84ous3EyLgp@1BgQf+tnnQ$4`JoE7+zdpj)QR|JwA!jGEKnj zcWGg!_z$PHLa0ki4ajt%>=F{;M(;9;yigZEs=i z>}(a%v4Lqmu5b8GNnUCQQ)|hJvK5*M8!S_Mv79X2A z>lj2WS~Wl`!h*R9o)X7$PYDGz3j(pq^4SgKeMnq=bSUx0U}QNaHd}ag<)w`yft-N3 zl?;fv#VyzMDb5<0rpp=K9`8l9$V3ma#?mH(on|R0d^?@~WR-$#xUvn!-GM<>$*&PT zn&#Pry&2ZR9ZN}jTnmBxAr0~97bBIg~dN|-{6yOzSuk@=s%?Eys7nVmSey=_XL`eQIh&5o6W zw{~!k#DPu9(D)1IfC~@%ko1#9J!$DWKL}p}nt>@UuY(xR#zw?6s?3V$cdiV;mf+OM z5Q(Zt?=VED39yG{uLuJ9c3?D2W#JjY-Fuz+CyZ!gi({~&&F=1;`JF2@*wKt{P2>

IU;59s;9%x`10 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%0Aj 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 Gwf_OsbfhK# From e841bdfdf73eefcf6af24e47460eb4e803e4026c Mon Sep 17 00:00:00 2001 From: northdpole Date: Tue, 31 Aug 2021 00:16:56 +0100 Subject: [PATCH 4/6] debugging --- application/cmd/cre_main.py | 40 ++--- application/database/db.py | 250 ++++++++++++++++--------------- application/tests/db_test.py | 23 ++- application/utils/parsers.py | 65 +++----- application/utils/spreadsheet.py | 1 - 5 files changed, 182 insertions(+), 197 deletions(-) diff --git a/application/cmd/cre_main.py b/application/cmd/cre_main.py index 32d79e0ab..ac2410944 100644 --- a/application/cmd/cre_main.py +++ b/application/cmd/cre_main.py @@ -48,29 +48,25 @@ def register_standard( for unlinked_standard in cre_less_standards: # if anything in this collection.add_link( cre=cre, - standard=db.dbStandardFromStandard( - unlinked_standard), + standard=db.dbStandardFromStandard(unlinked_standard), type=link.ltype, ) else: cres = collection.find_cres_of_standard(linked_standard) if cres: for cre in cres: - collection.add_link( - cre=cre, standard=db_link, type=link.ltype) + collection.add_link(cre=cre, standard=db_link, type=link.ltype) for unlinked_standard in cre_less_standards: collection.add_link( cre=cre, - standard=db.dbStandardFromStandard( - unlinked_standard), + standard=db.dbStandardFromStandard(unlinked_standard), type=link.ltype, ) else: # if neither the root nor a linked standard has a CRE, add both as unlinked standards cre_less_standards.append(link.document) if link.document.links and len(link.document.links) > 0: - register_standard(standard=link.document, - collection=collection) + register_standard(standard=link.document, collection=collection) elif type(link.document).__name__ == defs.CRE.__name__: dbcre = register_cre(link.document, collection) @@ -83,16 +79,17 @@ def register_cre(cre: defs.CRE, collection: db.Standard_collection) -> db.CRE: dbcre: db.CRE = collection.add_cre(cre) for link in cre.links: if type(link.document) == defs.CRE: - collection.add_internal_link(dbcre, - register_cre( - link.document, collection), - type=link.ltype) + collection.add_internal_link( + dbcre, register_cre(link.document, collection), type=link.ltype + ) elif type(link.document) == defs.Standard: collection.add_link( cre=dbcre, standard=register_standard( - standard=link.document, collection=collection), - type=link.ltype) + standard=link.document, collection=collection + ), + type=link.ltype, + ) return dbcre @@ -147,8 +144,7 @@ def parse_file( if register_callback: register_callback(document, collection=scollection) # type: ignore else: - logger.warning( - "Callback to register Document is None, likely missing data") + logger.warning("Callback to register Document is None, likely missing data") resulting_objects.append(document) return resulting_objects @@ -181,13 +177,11 @@ def parse_standards_from_spreadsheeet( for link in doc.links: if type(link.document).__name__ == defs.CRE.__name__: dbcre = register_cre(link.document, result) - result.add_internal_link( - group=dbgroup, cre=dbcre, type=link.ltype) + result.add_internal_link(group=dbgroup, cre=dbcre, type=link.ltype) elif type(link.document).__name__ == defs.Standard.__name__: dbstandard = register_standard(link.document, result) - result.add_link( - cre=dbgroup, standard=dbstandard, type=link.ltype) + result.add_link(cre=dbgroup, standard=dbstandard, type=link.ltype) def get_standards_files_from_disk(cre_loc: str) -> Generator[str, None, None]: @@ -214,8 +208,7 @@ def add_from_spreadsheet(spreadsheet_url: str, cache_loc: str, cre_loc: str) -> database.export(cre_loc) logger.info( - "Db located at %s got updated, files extracted at %s" % ( - cache_loc, cre_loc) + "Db located at %s got updated, files extracted at %s" % (cache_loc, cre_loc) ) @@ -362,6 +355,5 @@ def prepare_for_review(cache: str) -> Tuple[str, str]: if os.path.isfile(cache): shutil.copy(cache, loc) else: - logger.fatal( - "Could not copy database %s this seems like a bug" % cache) + logger.fatal("Could not copy database %s this seems like a bug" % cache) return loc, os.path.join(loc, cache_filename) diff --git a/application/database/db.py b/application/database/db.py index a8cf55634..ee4041773 100644 --- a/application/database/db.py +++ b/application/database/db.py @@ -2,6 +2,7 @@ from typing import Any, Dict, List, Optional, Tuple +from collections import Counter import networkx as nx # type: ignore import yaml from flask_sqlalchemy.model import DefaultMeta @@ -36,8 +37,7 @@ class Standard(BaseModel): # type: ignore # some external link to where this is, usually a URL with an anchor link = sqla.Column(sqla.String, default="") __table_args__ = ( - sqla.UniqueConstraint(name, section, subsection, - name="standard_section"), + sqla.UniqueConstraint(name, section, subsection, name="standard_section"), ) @@ -61,18 +61,15 @@ class InternalLinks(BaseModel): # type: ignore __tablename__ = "crelinks" type = sqla.Column(sqla.String, default="SAME") - group = sqla.Column(sqla.Integer, sqla.ForeignKey( - "cre.id"), primary_key=True) - cre = sqla.Column(sqla.Integer, sqla.ForeignKey( - "cre.id"), primary_key=True) + group = sqla.Column(sqla.Integer, sqla.ForeignKey("cre.id"), primary_key=True) + cre = sqla.Column(sqla.Integer, sqla.ForeignKey("cre.id"), primary_key=True) class Links(BaseModel): # type: ignore __tablename__ = "links" type = sqla.Column(sqla.String, default="SAM") - cre = sqla.Column(sqla.Integer, sqla.ForeignKey( - "cre.id"), primary_key=True) + cre = sqla.Column(sqla.Integer, sqla.ForeignKey("cre.id"), primary_key=True) standard = sqla.Column( sqla.Integer, sqla.ForeignKey("standard.id"), primary_key=True ) @@ -144,39 +141,23 @@ def get_standards_names(self) -> List[str]: return res def get_max_internal_connections(self) -> int: - count: Dict[int, int] = {} - - # TODO: (spyros) this should be made into a count(*) query q = self.session.query(InternalLinks).all() - for il in q: - if il.group in count.keys(): - count[il.group] += 1 - else: - count[il.group] = 1 - if il.cre in count.keys(): - count[il.cre] += 1 - else: - count[il.cre] = 1 - if count: - return max(count.values()) - else: - return 0 + grp_count = Counter([x.group for x in q]) or {0: 0} + cre_count = Counter([x.cre for x in q]) or {0: 0} + return max([max(cre_count.values()), max(grp_count.values())]) def find_cres_of_cre(self, cre: CRE) -> Optional[List[CRE]]: """returns the higher level CREs of the cre or none - if no higher level cres link to it""" - cre_id = self.session.query(CRE.id).filter( - CRE.name == cre.name).first() + if no higher level cres link to it""" + cre_id = self.session.query(CRE.id).filter(CRE.name == cre.name).first() links = ( - self.session.query(InternalLinks).filter( - InternalLinks.cre == cre_id).all() + self.session.query(InternalLinks).filter(InternalLinks.cre == cre_id).all() ) if links: result = [] for link in links: result.append( - self.session.query(CRE).filter( - CRE.id == link.group).first() + self.session.query(CRE).filter(CRE.id == link.group).first() ) return result @@ -184,7 +165,7 @@ def find_cres_of_cre(self, cre: CRE) -> Optional[List[CRE]]: def find_cres_of_standard(self, standard: Standard) -> Optional[List[CRE]]: """returns the CREs that link to this standard or none - if none link to it""" + if none link to it""" if not standard.id: standard = ( self.session.query(Standard) @@ -203,11 +184,9 @@ def find_cres_of_standard(self, standard: Standard) -> Optional[List[CRE]]: return None result: List[CRE] = [] for link in ( - self.session.query(Links).filter( - Links.standard == standard.id).all() + self.session.query(Links).filter(Links.standard == standard.id).all() ): - result.append(self.session.query( - CRE).filter(CRE.id == link.cre).first()) + result.append(self.session.query(CRE).filter(CRE.id == link.cre).first()) return result or None def get_by_tags(self, tags: List[str]) -> List[cre_defs.Document]: @@ -228,8 +207,7 @@ def get_by_tags(self, tags: List[str]) -> List[cre_defs.Document]: standards_where_clause.append( sqla.and_(Standard.tags.like("%{}%".format(tag))) ) - cre_where_clause.append( - sqla.and_(CRE.tags.like("%{}%".format(tag)))) + cre_where_clause.append(sqla.and_(CRE.tags.like("%{}%".format(tag)))) standards = Standard.query.filter(*standards_where_clause).all() or [] for standard in standards: @@ -271,8 +249,7 @@ def get_standards_with_pagination( page: int = 0, items_per_page: Optional[int] = None, ) -> Tuple[ - Optional[int], Optional[List[cre_defs.Standard] - ], Optional[List[Standard]] + Optional[int], Optional[List[cre_defs.Standard]], Optional[List[Standard]] ]: standards = [] @@ -283,15 +260,13 @@ def get_standards_with_pagination( if dbstands.items: for dbstand in dbstands.items: standard = StandardFromDB(dbstandard=dbstand) - linked_cres = Links.query.filter( - Links.standard == dbstand.id).all() + linked_cres = Links.query.filter(Links.standard == dbstand.id).all() for dbcre_link in linked_cres: dbcre = CRE.query.filter(CRE.id == dbcre_link.cre).first() if dbcre: standard.add_link( cre_defs.Link( - ltype=dbcre_link.type, document=CREfromDB( - dbcre) + ltype=dbcre_link.type, document=CREfromDB(dbcre) ) ) standards.append(standard) @@ -317,15 +292,13 @@ def get_standards( if dbstands: for dbstand in dbstands: standard = StandardFromDB(dbstandard=dbstand) - linked_cres = Links.query.filter( - Links.standard == dbstand.id).all() + linked_cres = Links.query.filter(Links.standard == dbstand.id).all() for dbcre_link in linked_cres: standard.add_link( cre_defs.Link( ltype=dbcre_link.type, document=CREfromDB( - CRE.query.filter( - CRE.id == dbcre_link.cre).first() + CRE.query.filter(CRE.id == dbcre_link.cre).first() ), ) ) @@ -375,15 +348,13 @@ def get_CRE( if dbcre: cre = CREfromDB(dbcre) else: - logger.warning("CRE %s:%s does not exist in the db" % - (external_id, name)) + logger.warning("CRE %s:%s does not exist in the db" % (external_id, name)) return None # todo figure a way to return both the Standard # and the link_type for that link - linked_standards = self.session.query( - Links).filter(Links.cre == dbcre.id).all() + linked_standards = self.session.query(Links).filter(Links.cre == dbcre.id).all() for ls in linked_standards: cre.add_link( cre_defs.Link( @@ -400,8 +371,7 @@ def get_CRE( internal_links = ( self.session.query(InternalLinks) .filter( - sqla.or_(InternalLinks.cre == dbcre.id, - InternalLinks.group == dbcre.id) + sqla.or_(InternalLinks.cre == dbcre.id, InternalLinks.group == dbcre.id) ) .all() ) @@ -416,8 +386,7 @@ def get_CRE( res = q.filter(CRE.id == il.cre).first() cre.add_link( cre_defs.Link( - document=CREfromDB(res), - ltype=cre_defs.LinkTypes.from_str(il.type) + document=CREfromDB(res), ltype=cre_defs.LinkTypes.from_str(il.type) ) ) @@ -465,8 +434,7 @@ def export(self, dir: str) -> List[cre_defs.Document]: cr = CREfromDB(internal_doc) if len(standard.name) != 0: cr.add_link( - cre_defs.Link( - ltype=type, document=StandardFromDB(standard)) + cre_defs.Link(ltype=type, document=StandardFromDB(standard)) ) docs[cr.name] = cr @@ -475,8 +443,7 @@ def export(self, dir: str) -> List[cre_defs.Document]: ustand = StandardFromDB(ustandard) docs[ "%s-%s:%s:%s" - % (ustand.name, ustand.section, - ustand.subsection, ustand.version) + % (ustand.name, ustand.section, ustand.subsection, ustand.version) ] = ustand for _, doc in docs.items(): @@ -491,8 +458,7 @@ def export(self, dir: str) -> List[cre_defs.Document]: def add_cre(self, cre: cre_defs.CRE) -> CRE: entry: CRE - query: sqla.Query = self.session.query( - CRE).filter(CRE.name == cre.name) + query: sqla.Query = self.session.query(CRE).filter(CRE.name == cre.name) if cre.id: entry = query.filter(CRE.external_id == cre.id).first() else: @@ -503,9 +469,12 @@ def add_cre(self, cre: cre_defs.CRE) -> CRE: return entry else: logger.debug("did not know of %s ,adding" % cre.name) - entry = CRE(description=cre.description, - name=cre.name, external_id=cre.id, - tags=','.join([str(t) for t in cre.tags])) + entry = CRE( + description=cre.description, + name=cre.name, + external_id=cre.id, + tags=",".join([str(t) for t in cre.tags]), + ) self.session.add(entry) self.session.commit() self.cre_graph.add_node(f"CRE: {entry.id}") @@ -526,15 +495,14 @@ def add_standard(self, standard: cre_defs.Standard) -> Standard: self.session.commit() return entry else: - logger.debug( - f"did not know of {standard.name}:{standard.section} ,adding") + logger.debug(f"did not know of {standard.name}:{standard.section} ,adding") entry = Standard( name=standard.name, section=standard.section, subsection=standard.subsection, link=standard.hyperlink, version=standard.version, - tags=','.join([str(t) for t in standard.tags]) + tags=",".join([str(t) for t in standard.tags]), ) self.session.add(entry) self.session.commit() @@ -566,49 +534,74 @@ def __introduces_cycle(self, node_from: str, node_to: str) -> Any: return False def add_internal_link( - self, group: CRE, cre: CRE, - type: cre_defs.LinkTypes = cre_defs.LinkTypes.Same + self, group: CRE, cre: CRE, type: cre_defs.LinkTypes = cre_defs.LinkTypes.Same ) -> None: if cre.id is None: if cre.external_id is None: - cre = (self.session.query(CRE) - .filter(sqla.and_( - CRE.name == cre.name, - CRE.description == cre.description)).first()) + cre = ( + self.session.query(CRE) + .filter( + sqla.and_( + CRE.name == cre.name, CRE.description == cre.description + ) + ) + .first() + ) else: - cre = (self.session.query(CRE) - .filter(sqla.and_( - CRE.name == cre.name, - CRE.external_id == cre.external_id)).first()) + cre = ( + self.session.query(CRE) + .filter( + sqla.and_( + CRE.name == cre.name, CRE.external_id == cre.external_id + ) + ) + .first() + ) if group.id is None: if group.external_id is None: - group = (self.session.query(CRE) - .filter(sqla.and_( - CRE.name == group.name, - CRE.description == group.description)).first()) + group = ( + self.session.query(CRE) + .filter( + sqla.and_( + CRE.name == group.name, CRE.description == group.description + ) + ) + .first() + ) else: - group = (self.session.query(CRE) - .filter(sqla.and_( - CRE.name == group.name, - CRE.external_id == group.external_id)).first()) + group = ( + self.session.query(CRE) + .filter( + sqla.and_( + CRE.name == group.name, CRE.external_id == group.external_id + ) + ) + .first() + ) if cre is None or group is None: logger.fatal( "Tried to insert internal mapping with element" - " that doesn't exist in db, this looks like a bug") + " that doesn't exist in db, this looks like a bug" + ) return None entry = ( self.session.query(InternalLinks) - .filter(sqla.or_(sqla.and_( - InternalLinks.cre == group.id, - InternalLinks.group == cre.id), - sqla.and_( - InternalLinks.cre == cre.id, - InternalLinks.group == group.id))).first()) + .filter( + sqla.or_( + sqla.and_( + InternalLinks.cre == group.id, InternalLinks.group == cre.id + ), + sqla.and_( + InternalLinks.cre == cre.id, InternalLinks.group == group.id + ), + ) + ) + .first() + ) if entry is not None: - logger.debug( - f"knew of internal link {cre.name} == {group.name} ,updating") + logger.debug(f"knew of internal link {cre.name} == {group.name} ,updating") entry.type = type.value self.session.commit() @@ -620,14 +613,13 @@ def add_internal_link( f" {group.external_id}:{group.name}" f" == {cre.external_id}:{cre.name} ,adding" ) - cycle = self.__introduces_cycle( - f"CRE: {group.external_id}", f"CRE: {cre.external_id}") + cycle = self.__introduces_cycle(f"CRE: {group.id}", f"CRE: {cre.id}") if not cycle: self.session.add( InternalLinks(type=type.value, cre=cre.id, group=group.id) ) self.session.commit() - self.cre_graph.add_edge(f"CRE: {group.external_id}", f"CRE: {cre.external_id}") + self.cre_graph.add_edge(f"CRE: {group.id}", f"CRE: {cre.id}") else: logger.warning( f"A link between CREs {group.external_id} and" @@ -644,32 +636,39 @@ def add_link( if cre.id is None: cre = ( - self.session.query(CRE).filter( - sqla.and_(CRE.name == cre.name)).first() + self.session.query(CRE).filter(sqla.and_(CRE.name == cre.name)).first() ) if standard.id is None: standard = ( self.session.query(Standard) - .filter(sqla.and_( + .filter( + sqla.and_( Standard.name == standard.name, Standard.section == standard.section, Standard.subsection == standard.subsection, - Standard.version == standard.version)).first()) + Standard.version == standard.version, + ) + ) + .first() + ) entry = ( self.session.query(Links) - .filter(sqla.and_(Links.cre == cre.id, - Links.standard == standard.id)).first()) + .filter(sqla.and_(Links.cre == cre.id, Links.standard == standard.id)) + .first() + ) if entry: logger.debug( f"knew of link {standard.name}:{standard.section}" - f"=={cre.name} ,updating") + f"=={cre.name} ,updating" + ) entry.type = type.value self.session.commit() return else: - cycle = None # self.__introduces_cycle( - # f"CRE: {cre.external_id}", f"Standard: {str(standard.id)}") + cycle = self.__introduces_cycle( + f"CRE: {cre.id}", f"Standard: {str(standard.id)}" + ) if not cycle: logger.debug( f"did not know of link {standard.id})" @@ -677,14 +676,18 @@ def add_link( " ,adding" ) self.session.add( - Links(type=type.value, cre=cre.id, standard=standard.id)) + Links(type=type.value, cre=cre.id, standard=standard.id) + ) self.cre_graph.add_edge( - f"CRE: {cre.external_id}", f"Standard: {str(standard.id)}") + f"CRE: {cre.id}", f"Standard: {str(standard.id)}" + ) else: - logger.warning(f"A link between CRE {cre.external_id}" - f" and Standard: {standard.name}" - f":{standard.section}:{standard.subsection}" - f" would introduce cycle {cycle}, skipping") + logger.warning( + f"A link between CRE {cre.external_id}" + f" and Standard: {standard.name}" + f":{standard.section}:{standard.subsection}" + f" would introduce cycle {cycle}, skipping" + ) logger.debug(f"{cycle}") self.session.commit() @@ -692,7 +695,7 @@ def find_path_between_standards( self, standard_source_id: int, standard_destination_id: int ) -> bool: """One line method to return paths in a graph, - this starts getting complicated when we have more linktypes""" + this starts getting complicated when we have more linktypes""" res: bool = nx.has_path( self.cre_graph.to_undirected(), "Standard: " + str(standard_source_id), @@ -702,16 +705,15 @@ def find_path_between_standards( return res def gap_analysis(self, standards: List[str]) -> List[cre_defs.Standard]: - """ Since the CRE structure is a tree-like graph with - leaves being standards we can find the paths between standards - find_path_between_standards() is a graph-path-finding method + """Since the CRE structure is a tree-like graph with + leaves being standards we can find the paths between standards + find_path_between_standards() is a graph-path-finding method """ processed_standards = [] dbstands = [] for stand in standards: dbstands.extend( - self.session.query(Standard).filter( - Standard.name == stand).all() + self.session.query(Standard).filter(Standard.name == stand).all() ) for standard in dbstands: @@ -719,8 +721,7 @@ def gap_analysis(self, standards: List[str]) -> List[cre_defs.Standard]: for other_standard in dbstands: if standard.id == other_standard.id: continue - if self.find_path_between_standards(standard.id, - other_standard.id): + if self.find_path_between_standards(standard.id, other_standard.id): working_standard.add_link( cre_defs.Link(document=StandardFromDB(other_standard)) ) @@ -749,7 +750,8 @@ def StandardFromDB(dbstandard: Standard) -> cre_defs.Standard: subsection=dbstandard.subsection, hyperlink=dbstandard.link, tags=tags, - version=dbstandard.version) + version=dbstandard.version, + ) def CREfromDB(dbcre: CRE) -> cre_defs.CRE: @@ -758,5 +760,5 @@ def CREfromDB(dbcre: CRE) -> cre_defs.CRE: if dbcre.tags: tags = set(dbcre.tags.split(",")) return cre_defs.CRE( - name=dbcre.name, description=dbcre.description, - id=dbcre.external_id, tags=tags) + name=dbcre.name, description=dbcre.description, id=dbcre.external_id, tags=tags + ) diff --git a/application/tests/db_test.py b/application/tests/db_test.py index 8c3ead4db..f4134069a 100644 --- a/application/tests/db_test.py +++ b/application/tests/db_test.py @@ -27,9 +27,11 @@ def setUp(self) -> None: self.collection = db.Standard_collection() collection = self.collection - dbcre = collection.add_cre(defs.CRE(description="CREdesc", name="CREname")) + dbcre = collection.add_cre( + defs.CRE(id="111-000", description="CREdesc", name="CREname") + ) dbgroup = collection.add_cre( - defs.CRE(description="Groupdesc", name="GroupName") + defs.CRE(id="111-001", description="Groupdesc", name="GroupName") ) dbstandard = collection.add_standard( defs.Standard( @@ -40,7 +42,7 @@ def setUp(self) -> None: ) ) - unlinked = collection.add_standard( + collection.add_standard( defs.Standard( subsection="4.5.6", section="Unlinked", @@ -50,7 +52,6 @@ def setUp(self) -> None: ) collection.session.add(dbcre) - collection.add_link(cre=dbcre, standard=dbstandard) collection.add_internal_link(cre=dbcre, group=dbgroup) @@ -151,19 +152,26 @@ def test_export(self) -> None: loc = tempfile.mkdtemp() result = [ defs.CRE( + id="111-001", description="Groupdesc", name="GroupName", links=[ - defs.Link(document=defs.CRE(description="CREdesc", name="CREname")) + defs.Link( + document=defs.CRE( + id="111-000", description="CREdesc", name="CREname" + ) + ) ], ), defs.CRE( - id="", + id="111-000", description="CREdesc", name="CREname", links=[ defs.Link( - document=defs.CRE(description="Groupdesc", name="GroupName") + document=defs.CRE( + id="111-001", description="Groupdesc", name="GroupName" + ) ), defs.Link( document=defs.Standard( @@ -194,6 +202,7 @@ def test_export(self) -> None: doc = yaml.safe_load(f) self.assertDictEqual(group, doc) crename = result[1].name + ".yaml" + self.maxDiff = None with open(os.path.join(loc, crename), "r") as f: doc = yaml.safe_load(f) self.assertDictEqual(cre, doc) diff --git a/application/utils/parsers.py b/application/utils/parsers.py index 772bb7b41..0cde1089d 100644 --- a/application/utils/parsers.py +++ b/application/utils/parsers.py @@ -77,8 +77,7 @@ def parse_export_format(lfile: List[Dict[str, Any]]) -> Dict[str, defs.Document] internal_mapping: defs.Document cres: Dict[str, defs.Document] = {} lone_standards: Dict[str, defs.Standard] = {} - link_types_regexp = re.compile( - defs.ExportFormat.linked_cre_name_key("(\d+)")) + link_types_regexp = re.compile(defs.ExportFormat.linked_cre_name_key("(\d+)")) max_internal_cre_links = len( set([k for k, v in lfile[0].items() if link_types_regexp.match(k)]) ) @@ -92,8 +91,7 @@ def parse_export_format(lfile: List[Dict[str, Any]]) -> Dict[str, defs.Document] st.document.name + ":" + st.document.section ] = st.document else: - logger.fatal( - f"Got a {type(st.document)} expected Standard") + logger.fatal(f"Got a {type(st.document)} expected Standard") else: # cre -> standards, other cres name = mapping.pop(defs.ExportFormat.cre_name_key()) id = mapping.pop(defs.ExportFormat.cre_id_key()) @@ -126,11 +124,9 @@ def parse_export_format(lfile: List[Dict[str, Any]]) -> Dict[str, defs.Document] # add the CRE links for i in range(0, max_internal_cre_links): - name = mapping.pop( - defs.ExportFormat.linked_cre_name_key(str(i))) + name = mapping.pop(defs.ExportFormat.linked_cre_name_key(str(i))) if not is_empty(name): - id = mapping.pop( - defs.ExportFormat.linked_cre_id_key(str(i))) + id = mapping.pop(defs.ExportFormat.linked_cre_id_key(str(i))) link_type = mapping.pop( defs.ExportFormat.linked_cre_link_type_key(str(i)) ) @@ -200,8 +196,7 @@ def parse_uknown_key_val_spreadsheet( else: # pop is important here, if the primary standard is not removed, it will end up linking to itself primary_standard = defs.Standard( - name=main_standard_name, section=mapping.pop( - main_standard_name) + name=main_standard_name, section=mapping.pop(main_standard_name) ) for key, value in mapping.items(): @@ -212,8 +207,7 @@ def parse_uknown_key_val_spreadsheet( ): linked_standard = defs.Standard(name=key, section=value) standards_registered.append(f"{key}-{value}") - primary_standard.add_link( - defs.Link(document=linked_standard)) + primary_standard.add_link(defs.Link(document=linked_standard)) if primary_standard: standards[sname] = primary_standard return standards @@ -236,8 +230,7 @@ def parse_v1_standards( # raise EnvironmentError( # "same cre name %s different id? %s %s" % (cre.name, cre.id, id)) else: - cre = defs.CRE(description=cre_mapping.pop( - "Description"), name=name, id=id) + cre = defs.CRE(description=cre_mapping.pop("Description"), name=name, id=id) asvs_tags = [] if cre_mapping.pop("ASVS-L1") == "X": asvs_tags.append("L1") @@ -262,8 +255,7 @@ def parse_v1_standards( if not is_empty(cre_mapping.get("CWE")): cre.add_link( defs.Link( - document=defs.Standard( - name="CWE", section=cre_mapping.pop("CWE")) + document=defs.Standard(name="CWE", section=cre_mapping.pop("CWE")) ) ) @@ -316,8 +308,7 @@ def parse_v1_standards( if not is_empty(cre_mapping.get("OPC")): cre.add_link( defs.Link( - document=defs.Standard( - name="OPC", section=cre_mapping.pop("OPC")) + document=defs.Standard(name="OPC", section=cre_mapping.pop("OPC")) ) ) @@ -332,8 +323,7 @@ def parse_v1_standards( if not is_empty(cre_mapping.get("WSTG")): cre.add_link( defs.Link( - document=defs.Standard( - name="WSTG", section=cre_mapping.pop("WSTG")) + document=defs.Standard(name="WSTG", section=cre_mapping.pop("WSTG")) ) ) if not is_empty(cre_mapping.get("SIG ISO 25010")): @@ -381,8 +371,7 @@ def parse_v0_standards(cre_file: List[Dict[str, str]]) -> Dict[str, defs.CRE]: cre: defs.CRE linked_standard: defs.Standard if not is_empty(cre_mapping.get("CRE-ID-lookup-from-taxonomy-table")): - existing = cres.get( - cre_mapping["CRE-ID-lookup-from-taxonomy-table"]) + existing = cres.get(cre_mapping["CRE-ID-lookup-from-taxonomy-table"]) if existing: cre = existing name = cre_mapping.get("name") @@ -400,8 +389,7 @@ def parse_v0_standards(cre_file: List[Dict[str, str]]) -> Dict[str, defs.CRE]: if cre_mapping.get("ID-taxonomy-lookup-from-ASVS-mapping"): linked_standard = defs.Standard( name="ASVS", - section=cre_mapping.pop( - "ID-taxonomy-lookup-from-ASVS-mapping"), + section=cre_mapping.pop("ID-taxonomy-lookup-from-ASVS-mapping"), subsection=cre_mapping.pop("Item"), ) @@ -420,8 +408,7 @@ def parse_hierarchical_export_format( cre_file: List[Dict[str, str]] ) -> Dict[str, defs.CRE]: cres: Dict[str, defs.CRE] = {} - max_hierarchy = len( - [key for key in cre_file[0].keys() if "CRE hierarchy" in key]) + max_hierarchy = len([key for key in cre_file[0].keys() if "CRE hierarchy" in key]) for mapping in cre_file: cre: defs.CRE name: str = "" @@ -429,8 +416,7 @@ def parse_hierarchical_export_format( higher_cre: int = 0 # a CRE's name is the last hierarchy item which is not blank for i in range(max_hierarchy, 0, -1): - key = [key for key in mapping if key.startswith( - "CRE hierarchy %s" % i)][0] + key = [key for key in mapping if key.startswith("CRE hierarchy %s" % i)][0] if not is_empty(mapping.get(key)): if current_hierarchy == 0: name = mapping.pop(key) @@ -439,8 +425,10 @@ def parse_hierarchical_export_format( higher_cre = i break if is_empty(name): - logger.warning(f'Found entry with ID {mapping.get("CRE ID")}' - ' without a cre name, skipping') + logger.warning( + f'Found entry with ID {mapping.get("CRE ID")}' + " without a cre name, skipping" + ) continue if name in cres.keys(): @@ -469,8 +457,7 @@ def parse_hierarchical_export_format( ): if not cres.get(other_cre): logger.warning( - "%s linking to not yet existent cre %s" % ( - cre.name, other_cre) + "%s linking to not yet existent cre %s" % (cre.name, other_cre) ) new_cre = defs.CRE(name=other_cre) cres[new_cre.name] = new_cre @@ -500,8 +487,7 @@ def parse_hierarchical_export_format( document=defs.Standard( name="Top10 2017", section=mapping.pop("Standard Top10 2017"), - hyperlink=mapping.pop( - "Standard Top10 Hyperlink").strip(), + hyperlink=mapping.pop("Standard Top10 Hyperlink").strip(), ) ) ) @@ -510,8 +496,7 @@ def parse_hierarchical_export_format( defs.Link( document=defs.Standard( name="OPC", - section=mapping.pop( - "Standard OPC (ASVS source)").strip(), + section=mapping.pop("Standard OPC (ASVS source)").strip(), ) ) ) @@ -536,8 +521,7 @@ def parse_hierarchical_export_format( defs.Link( document=defs.Standard( name="CWE", - section=str(mapping.pop( - "Standard CWE (from ASVS)")).strip(), + section=str(mapping.pop("Standard CWE (from ASVS)")).strip(), ) ) ) @@ -570,8 +554,7 @@ def parse_hierarchical_export_format( cs = str(mapping.pop("Standard Cheat_sheets")) if "," in cs: for csc in set(cs.split(",")): - cheatsheet = defs.Standard( - name="Cheat_sheets", section=csc.strip()) + cheatsheet = defs.Standard(name="Cheat_sheets", section=csc.strip()) cre.add_link(defs.Link(document=cheatsheet)) # link CRE to a higher level one @@ -588,7 +571,7 @@ def parse_hierarchical_export_format( # pprint( # f'state:{higher_cre},\n {cre_hi},\n\n {cre}, \n\n{existing_link}') # input() - shallow_copy = copy(cre) # we only need a shallow copy here + shallow_copy = copy(cre) # we only need a shallow copy here shallow_copy.links = [] # there is no need to capture the entirety of the cre tree, we just need to register this shallow relation # the "cres" dict should contain the rest of the info diff --git a/application/utils/spreadsheet.py b/application/utils/spreadsheet.py index 7c67dfbf2..fb15d9173 100644 --- a/application/utils/spreadsheet.py +++ b/application/utils/spreadsheet.py @@ -149,7 +149,6 @@ def prepare_spreadsheet( header[defs.ExportFormat.link_type_key(name)] = None maxgroups = collection.get_max_internal_connections() for i in range(0, maxgroups): - header[defs.ExportFormat.linked_cre_id_key(str(i))] = None header[defs.ExportFormat.linked_cre_name_key(str(i))] = None header[defs.ExportFormat.linked_cre_link_type_key(str(i))] = None From 9cd12590a537d8af2a7b13ff0db9457f7ed33650 Mon Sep 17 00:00:00 2001 From: northdpole Date: Tue, 31 Aug 2021 00:36:50 +0100 Subject: [PATCH 5/6] set python version for mypy --- .mypy.ini | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .mypy.ini diff --git a/.mypy.ini b/.mypy.ini new file mode 100644 index 000000000..a684f1dd6 --- /dev/null +++ b/.mypy.ini @@ -0,0 +1,2 @@ +[mypy] +python_version = 2.8 From f77e373a21b2ef088edc0f1b715cf0030320be98 Mon Sep 17 00:00:00 2001 From: northdpole Date: Tue, 31 Aug 2021 00:40:37 +0100 Subject: [PATCH 6/6] fix mypy? --- .github/workflows/linter.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/linter.yml b/.github/workflows/linter.yml index bb111b2b8..60fde0c81 100644 --- a/.github/workflows/linter.yml +++ b/.github/workflows/linter.yml @@ -23,6 +23,6 @@ jobs: VALIDATE_PYTHON_BLACK: true VALIDATE_ALL_CODEBASE: false VALIDATE_PYTHON_MYPY: true - + PYTHON_MYPY_CONFIG_FILE: .mypy.ini DEFAULT_BRANCH: main GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}