From 442a3ca8f69abae882998d7e999cb6ce9a7b1d6a Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Thu, 16 Aug 2018 14:49:33 +0200 Subject: [PATCH] Add grouper loaders and t-data container Also added server-side files: ScriptedSQL connector and scripts for the connections (SIS->midPoint, Grouper->midPoint). --- grouper-midpoint/README.md | 12 +- .../grouper/grouper-loader.properties | 6 +- grouper-midpoint/mp-gr/docker-compose.yml | 12 + .../mp-gr/g-data/container_files/demo.gsh | 274 ++++++++++++++++++ grouper-midpoint/mp-gr/i-data/Dockerfile | 6 +- .../container_files/seed-data/ds-setup.inf | 2 +- .../container_files/seed-data/users.ldif | 18 +- grouper-midpoint/mp-gr/m-server/Dockerfile | 1 + ....bundles.db.scriptedsql-2.2.6-SNAPSHOT.jar | Bin 0 -> 99664 bytes .../res/grouper/SchemaScript.groovy | 91 ++++++ .../res/grouper/SearchScript.groovy | 101 +++++++ .../res/grouper/TestScript.groovy | 38 +++ .../res/sis/SchemaScript.groovy | 54 ++++ .../res/sis/SearchScript.groovy | 71 +++++ .../container_files/res/sis/TestScript.groovy | 38 +++ .../container_files/schema/user-schema.xsd | 21 ++ grouper-midpoint/mp-gr/s-data/Dockerfile | 2 +- grouper-midpoint/mp-gr/t-data/Dockerfile | 30 ++ .../container_files/seed-data/ds-setup.inf | 28 ++ .../container_files/seed-data/users.ldif | 1 + 20 files changed, 787 insertions(+), 19 deletions(-) create mode 100644 grouper-midpoint/mp-gr/g-data/container_files/demo.gsh create mode 100644 grouper-midpoint/mp-gr/m-server/container_files/icf-connectors/net.tirasa.connid.bundles.db.scriptedsql-2.2.6-SNAPSHOT.jar create mode 100644 grouper-midpoint/mp-gr/m-server/container_files/res/grouper/SchemaScript.groovy create mode 100644 grouper-midpoint/mp-gr/m-server/container_files/res/grouper/SearchScript.groovy create mode 100644 grouper-midpoint/mp-gr/m-server/container_files/res/grouper/TestScript.groovy create mode 100644 grouper-midpoint/mp-gr/m-server/container_files/res/sis/SchemaScript.groovy create mode 100644 grouper-midpoint/mp-gr/m-server/container_files/res/sis/SearchScript.groovy create mode 100644 grouper-midpoint/mp-gr/m-server/container_files/res/sis/TestScript.groovy create mode 100644 grouper-midpoint/mp-gr/m-server/container_files/schema/user-schema.xsd create mode 100644 grouper-midpoint/mp-gr/t-data/Dockerfile create mode 100644 grouper-midpoint/mp-gr/t-data/container_files/seed-data/ds-setup.inf create mode 100644 grouper-midpoint/mp-gr/t-data/container_files/seed-data/users.ldif diff --git a/grouper-midpoint/README.md b/grouper-midpoint/README.md index 4f474d6..1a1a632 100644 --- a/grouper-midpoint/README.md +++ b/grouper-midpoint/README.md @@ -12,12 +12,20 @@ There are the following containers: - `m-server`: midPoint application (GUI, REST, tasks, etc); it reads from `s-data`, updates its own repository and pushes data to Grouper via `i-data` - `m-data`: midPoint repository (MySQL) - `i-data`: intermediate repository for communication from midPoint to Grouper (LDAP) -- `g-ui`, `g-daemon`, `g-ws`: Grouper containers +- `g-ui`, `g-daemon`, `g-ws`, `gsh`: Grouper containers - `g-data`: the Grouper repository (MySQL) - `idp`: Shibboleth identity provider; it uses `i-data` as the auhentication source +- `t-data`: target(s) where identities should be provisioned (currently LDAP) All files needed to build and compose these containers are in `mp-gr` directory. TODO ... -TODO: how to initialize things +TODO: + - grouper loader jobs + - grouper -> midPoint connection + - add banderson to sysadmin group (via midPoint) + - user passwords in i-data (via midPoint) + - groups for courses are not created automatically on first import (why?) + - grouper loader jobs should be created at initialization + - fix hardcoded password for grouper loader LDAP diff --git a/grouper-midpoint/mp-gr/configs-and-secrets/grouper/grouper-loader.properties b/grouper-midpoint/mp-gr/configs-and-secrets/grouper/grouper-loader.properties index 67ffba7..ab1fe5d 100644 --- a/grouper-midpoint/mp-gr/configs-and-secrets/grouper/grouper-loader.properties +++ b/grouper-midpoint/mp-gr/configs-and-secrets/grouper/grouper-loader.properties @@ -8,13 +8,15 @@ #note the URL should start with ldap: or ldaps: if it is SSL. #It should contain the server and port (optional if not default), and baseDn, #e.g. ldaps://ldapserver.school.edu:636/dc=school,dc=edu -ldap.demo.url = ldap://i-data:389/dc=example,dc=edu +#ldap.demo.url = ldap://i-data:389/dc=internet2,dc=edu +ldap.demo.url = ldap://i-data:389 #optional, if authenticated ldap.demo.user = cn=admin,dc=internet2,dc=edu #optional, if authenticated note the password can be stored encrypted in an external file -ldap.demo.pass = ${java.lang.System.getenv().get('SUBJECT_SOURCE_LDAP_PASSWORD_FILE') != null ? org.apache.commons.io.FileUtils.readFileToString(java.lang.System.getenv().get('SUBJECT_SOURCE_LDAP_PASSWORD_FILE'), "utf-8") : java.lang.System.getenv().get('SUBJECT_SOURCE_LDAP_PASSWORD')} +#ldap.demo.pass = ${java.lang.System.getenv().get('SUBJECT_SOURCE_LDAP_PASSWORD_FILE') != null ? org.apache.commons.io.FileUtils.readFileToString(java.lang.System.getenv().get('SUBJECT_SOURCE_LDAP_PASSWORD_FILE'), "utf-8") : java.lang.System.getenv().get('SUBJECT_SOURCE_LDAP_PASSWORD')} +ldap.demo.pass=password #optional, if you are using tls, set this to true. Generally you will not be using an SSL URL to use TLS... ldap.demo.tls = false diff --git a/grouper-midpoint/mp-gr/docker-compose.yml b/grouper-midpoint/mp-gr/docker-compose.yml index 224f153..d9391cb 100644 --- a/grouper-midpoint/mp-gr/docker-compose.yml +++ b/grouper-midpoint/mp-gr/docker-compose.yml @@ -191,6 +191,17 @@ services: - source_mysql:/var/lib/mysql - source_ldap:/var/lib/dirsrv + t-data: + build: ./t-data/ + expose: + - "389" + ports: + - "2389:389" + networks: + - back + volumes: + - target_ldap:/var/lib/dirsrv + m-data: build: ./m-data/ expose: @@ -275,6 +286,7 @@ volumes: grouper_mysql: source_mysql: source_ldap: + target_ldap: intermediate_ldap: midpoint_mysql: midpoint_home: diff --git a/grouper-midpoint/mp-gr/g-data/container_files/demo.gsh b/grouper-midpoint/mp-gr/g-data/container_files/demo.gsh new file mode 100644 index 0000000..276bd22 --- /dev/null +++ b/grouper-midpoint/mp-gr/g-data/container_files/demo.gsh @@ -0,0 +1,274 @@ +gs = GrouperSession.startRootSession(); +#addRootStem("basis", "basis"); +addRootStem("ref", "ref"); +#addRootStem("bundle", "bundle"); +#addRootStem("app", "app"); +#addRootStem("org", "org"); +#testStem = addRootStem("test", "test"); + +addStem("ref", "course", "course") + +#addGroup("etc","coursesLoader", "coursesLoader"); +#groupAddType("etc:coursesLoader", "grouperLoader"); +#setGroupAttr("etc:coursesLoader", "grouperLoaderDbName", "grouper"); +#setGroupAttr("etc:coursesLoader", "grouperLoaderType", "SQL_GROUP_LIST"); +#setGroupAttr("etc:coursesLoader", "grouperLoaderScheduleType", "CRON"); +#setGroupAttr("etc:coursesLoader", "grouperLoaderQuartzCron", "0 * * * * ?"); +#setGroupAttr("etc:coursesLoader", "grouperLoaderQuartzCron", "0 * * * * ?"); +#setGroupAttr("etc:coursesLoader", "grouperLoaderQuery", "select distinct id as SUBJECT_IDENTIFIER, 'ldap' as SUBJECT_SOURCE_ID, CONCAT('ref:course:', courseID) as GROUP_NAME from SIS_Courses"); + +addStem("ref", "affiliation", "affiliation") +#folder = StemFinder.findByName(gs, "ref:affiliation"); +#AttributeAssign attributeAssign = folder.getAttributeDelegate().addAttribute(RuleUtils.ruleAttributeDefName()).getAttributeAssign(); +#AttributeValueDelegate attributeValueDelegate = attributeAssign.getAttributeValueDelegate(); +#attributeValueDelegate.assignValue(RuleUtils.ruleActAsSubjectSourceIdName(), "g:isa"); +#attributeValueDelegate.assignValue(RuleUtils.ruleActAsSubjectIdName(), "GrouperSystem"); +#attributeValueDelegate.assignValue(RuleUtils.ruleCheckTypeName(), RuleCheckType.groupCreate.name()); +#attributeValueDelegate.assignValue(RuleUtils.ruleCheckStemScopeName(), Stem.Scope.SUB.name()); +#attributeValueDelegate.assignValue(RuleUtils.ruleThenElName(),'${ruleElUtils.assignGroupPrivilege(groupId, "g:gsa", groupId, null, "read")}'); + +group = new GroupSave(gs).assignName("etc:affiliationLoader").assignCreateParentStemsIfNotExist(true).save(); +group.getAttributeDelegate().assignAttribute(LoaderLdapUtils.grouperLoaderLdapAttributeDefName()).getAttributeAssign(); +attributeAssign = group.getAttributeDelegate().retrieveAssignment(null, LoaderLdapUtils.grouperLoaderLdapAttributeDefName(), false, true); +attributeAssign.getAttributeValueDelegate().assignValue(LoaderLdapUtils.grouperLoaderLdapQuartzCronName(), "0 * * * * ?"); +attributeAssign.getAttributeValueDelegate().assignValue(LoaderLdapUtils.grouperLoaderLdapTypeName(), "LDAP_GROUPS_FROM_ATTRIBUTES"); +attributeAssign.getAttributeValueDelegate().assignValue(LoaderLdapUtils.grouperLoaderLdapServerIdName(), "demo"); +attributeAssign.getAttributeValueDelegate().assignValue(LoaderLdapUtils.grouperLoaderLdapFilterName(), "(eduPersonAffiliation=*)"); +attributeAssign.getAttributeValueDelegate().assignValue(LoaderLdapUtils.grouperLoaderLdapSearchDnName(), "ou=People,dc=internet2,dc=edu"); +attributeAssign.getAttributeValueDelegate().assignValue(LoaderLdapUtils.grouperLoaderLdapSubjectAttributeName(), "uid"); +attributeAssign.getAttributeValueDelegate().assignValue(LoaderLdapUtils.grouperLoaderLdapSourceIdName(), "ldap"); +attributeAssign.getAttributeValueDelegate().assignValue(LoaderLdapUtils.grouperLoaderLdapGroupAttributeName(), "eduPersonAffiliation"); +attributeAssign.getAttributeValueDelegate().assignValue(LoaderLdapUtils.grouperLoaderLdapSubjectIdTypeName(), "subjectId"); +#attributeAssign.getAttributeValueDelegate().assignValue(LoaderLdapUtils.grouperLoaderLdapSubjectExpressionName(), '${subjectAttributes["subjectId"]}'); +attributeAssign.getAttributeValueDelegate().assignValue(LoaderLdapUtils.grouperLoaderLdapGroupNameExpressionName(), 'ref:affiliation:${groupAttribute}_systemOfRecord'); +attributeAssign.getAttributeValueDelegate().assignValue(LoaderLdapUtils.grouperLoaderLdapGroupDisplayNameExpressionName(), '${groupAttribute} system of record'); +attributeAssign.getAttributeValueDelegate().assignValue(LoaderLdapUtils.grouperLoaderLdapGroupTypesName(), "addIncludeExclude"); + +group = new GroupSave(gs).assignName("etc:deptLoader").assignCreateParentStemsIfNotExist(true).save(); +group.getAttributeDelegate().assignAttribute(LoaderLdapUtils.grouperLoaderLdapAttributeDefName()).getAttributeAssign(); +attributeAssign = group.getAttributeDelegate().retrieveAssignment(null, LoaderLdapUtils.grouperLoaderLdapAttributeDefName(), false, true); +attributeAssign.getAttributeValueDelegate().assignValue(LoaderLdapUtils.grouperLoaderLdapQuartzCronName(), "0 * * * * ?"); +attributeAssign.getAttributeValueDelegate().assignValue(LoaderLdapUtils.grouperLoaderLdapTypeName(), "LDAP_GROUPS_FROM_ATTRIBUTES"); +attributeAssign.getAttributeValueDelegate().assignValue(LoaderLdapUtils.grouperLoaderLdapServerIdName(), "demo"); +attributeAssign.getAttributeValueDelegate().assignValue(LoaderLdapUtils.grouperLoaderLdapFilterName(), "(businessCategory=*)"); +attributeAssign.getAttributeValueDelegate().assignValue(LoaderLdapUtils.grouperLoaderLdapSearchDnName(), "ou=People,dc=internet2,dc=edu"); +attributeAssign.getAttributeValueDelegate().assignValue(LoaderLdapUtils.grouperLoaderLdapSubjectAttributeName(), "uid"); +attributeAssign.getAttributeValueDelegate().assignValue(LoaderLdapUtils.grouperLoaderLdapSourceIdName(), "ldap"); +attributeAssign.getAttributeValueDelegate().assignValue(LoaderLdapUtils.grouperLoaderLdapGroupAttributeName(), "businessCategory"); +attributeAssign.getAttributeValueDelegate().assignValue(LoaderLdapUtils.grouperLoaderLdapSubjectIdTypeName(), "subjectId"); +#attributeAssign.getAttributeValueDelegate().assignValue(LoaderLdapUtils.grouperLoaderLdapSubjectExpressionName(), '${subjectAttributes["subjectId"]}'); +attributeAssign.getAttributeValueDelegate().assignValue(LoaderLdapUtils.grouperLoaderLdapGroupNameExpressionName(), 'ref:dept:${groupAttribute}'); +attributeAssign.getAttributeValueDelegate().assignValue(LoaderLdapUtils.grouperLoaderLdapGroupDisplayNameExpressionName(), '${groupAttribute}'); + +group = new GroupSave(gs).assignName("etc:coursesLoader").assignCreateParentStemsIfNotExist(true).save(); +group.getAttributeDelegate().assignAttribute(LoaderLdapUtils.grouperLoaderLdapAttributeDefName()).getAttributeAssign(); +attributeAssign = group.getAttributeDelegate().retrieveAssignment(null, LoaderLdapUtils.grouperLoaderLdapAttributeDefName(), false, true); +attributeAssign.getAttributeValueDelegate().assignValue(LoaderLdapUtils.grouperLoaderLdapQuartzCronName(), "0 * * * * ?"); +attributeAssign.getAttributeValueDelegate().assignValue(LoaderLdapUtils.grouperLoaderLdapTypeName(), "LDAP_GROUP_LIST"); +attributeAssign.getAttributeValueDelegate().assignValue(LoaderLdapUtils.grouperLoaderLdapFilterName(), "(cn=*)"); +attributeAssign.getAttributeValueDelegate().assignValue(LoaderLdapUtils.grouperLoaderLdapSearchDnName(), "ou=Courses,ou=Groups,dc=internet2,dc=edu"); +attributeAssign.getAttributeValueDelegate().assignValue(LoaderLdapUtils.grouperLoaderLdapServerIdName(), "demo"); +attributeAssign.getAttributeValueDelegate().assignValue(LoaderLdapUtils.grouperLoaderLdapSourceIdName(), "ldap"); +attributeAssign.getAttributeValueDelegate().assignValue(LoaderLdapUtils.grouperLoaderLdapSubjectExpressionName(), '${loaderLdapElUtils.convertDnToSpecificValue(subjectId)}'); +attributeAssign.getAttributeValueDelegate().assignValue(LoaderLdapUtils.grouperLoaderLdapSubjectAttributeName(), "uniqueMember"); +attributeAssign.getAttributeValueDelegate().assignValue(LoaderLdapUtils.grouperLoaderLdapSubjectIdTypeName(), "subjectId"); +attributeAssign.getAttributeValueDelegate().assignValue(LoaderLdapUtils.grouperLoaderLdapExtraAttributesName(), "cn"); +attributeAssign.getAttributeValueDelegate().assignValue(LoaderLdapUtils.grouperLoaderLdapGroupNameExpressionName(), 'ref:course:${groupAttributes["cn"]}'); + +group = GroupFinder.findByName(gs, "etc:sysadmingroup", true); +group.getAttributeDelegate().assignAttribute(LoaderLdapUtils.grouperLoaderLdapAttributeDefName()).getAttributeAssign(); +attributeAssign = group.getAttributeDelegate().retrieveAssignment(null, LoaderLdapUtils.grouperLoaderLdapAttributeDefName(), false, true); +attributeAssign.getAttributeValueDelegate().assignValue(LoaderLdapUtils.grouperLoaderLdapQuartzCronName(), "0 * * * * ?"); +attributeAssign.getAttributeValueDelegate().assignValue(LoaderLdapUtils.grouperLoaderLdapTypeName(), "LDAP_SIMPLE"); +attributeAssign.getAttributeValueDelegate().assignValue(LoaderLdapUtils.grouperLoaderLdapFilterName(), "(cn=sysadmingroup)"); +attributeAssign.getAttributeValueDelegate().assignValue(LoaderLdapUtils.grouperLoaderLdapSearchDnName(), "ou=Groups,dc=internet2,dc=edu"); +attributeAssign.getAttributeValueDelegate().assignValue(LoaderLdapUtils.grouperLoaderLdapServerIdName(), "demo"); +attributeAssign.getAttributeValueDelegate().assignValue(LoaderLdapUtils.grouperLoaderLdapSourceIdName(), "ldap"); +attributeAssign.getAttributeValueDelegate().assignValue(LoaderLdapUtils.grouperLoaderLdapSubjectExpressionName(), '${loaderLdapElUtils.convertDnToSpecificValue(subjectId)}'); +attributeAssign.getAttributeValueDelegate().assignValue(LoaderLdapUtils.grouperLoaderLdapSubjectAttributeName(), "uniqueMember"); +attributeAssign.getAttributeValueDelegate().assignValue(LoaderLdapUtils.grouperLoaderLdapSubjectIdTypeName(), "subjectId"); + + +#addGroup("bundle", "default_services", "default_services"); +#addGroup("bundle", "student_services", "student_services"); +#addGroup("bundle", "employee_services", "employee_services"); + +#addStem("ref", "student", "student"); +#addStem("ref:student", "class", "class"); +#addGroup("ref:student:class", "freshmen", "freshmen"); +#addGroup("ref:student:class", "sophomore", "sophomore"); +#addGroup("ref:student:class", "junior", "junior"); +#addGroup("ref:student:class", "senior", "senior"); +#addGroup("ref:student:class", "graduate", "graduate"); +#addGroup("ref:student:class", "doctorate", "doctorate"); + +#addGroup("ref:student", "finaid", "finaid"); +#addStem("ref:student", "athlete", "athlete"); +#addGroup("ref:student:athlete", "baseball", "baseball"); +#addGroup("ref:student:athlete", "basketball", "basketball"); +#addGroup("ref:student:athlete", "football", "football"); +#addGroup("ref:student:athlete", "soccer", "soccer"); +#addGroup("ref:student:athlete", "volleyball", "volleyball"); + +#addStem("ref", "employee", "employee"); +#addGroup("ref:employee", "fulltime", "fulltime"); +#addGroup("ref:employee", "parttime", "parttime"); +#addGroup("ref:employee", "tenured", "tenured"); +#addGroup("ref:employee", "emeritus", "emeritus"); + +#addStem("ref", "alumni", "alumni"); + +#addStem("ref", "role", "role"); +#addGroup("ref:role", "president", "president"); +#addGroup("ref:role", "provost", "provost"); +#addGroup("ref:role", "deptSecretary", "deptSecretary"); +#addGroup("ref:role", "dean", "dean"); +#addGroup("ref:role", "director", "director"); +#addGroup("ref:role", "custodian", "custodian"); +#addGroup("ref:role", "deptChair", "deptChair"); +#addGroup("ref:role", "faculty", "faculty"); +#addGroup("ref:role", "programmer", "programmer"); +#addGroup("ref:role", "programSpecialist", "programSpecialist"); +#addGroup("ref:role", "recruiter", "recruiter"); +#addGroup("ref:role", "coach", "coach"); +#addGroup("ref:role", "vicePresident", "vicePresident"); + +#addMember("bundle:student_services", "ref:student:class:freshmen"); +#addMember("bundle:student_services", "ref:student:class:sophomore"); +#addMember("bundle:student_services", "ref:student:class:junior"); +#addMember("bundle:student_services", "ref:student:class:senior"); +#addMember("bundle:student_services", "ref:student:class:graduate"); +#addMember("bundle:student_services", "ref:student:class:doctorate"); + +#addStem("org", "admissions", "admissions"); +#addStem("org:admissions", "etc", "etc"); +#addGroup("org:admissions:etc", "admissions_admin", "admissions_admin"); +#grantPriv("org:admissions", "org:admissions:etc:admissions_admin", NamingPrivilege.STEM); +#addStem("org:admissions", "ref", "ref"); +#addStem("org:admissions", "app", "app"); + +#addStem("org", "bursar", "bursar"); +#addStem("org:bursar", "etc", "etc"); +#addGroup("org:bursar:etc", "bursar_admin", "bursar_admin"); +#grantPriv("org:bursar", "org:bursar:etc:bursar_admin", NamingPrivilege.STEM); +#addStem("org:bursar", "ref", "ref"); +#addStem("org:bursar", "app", "app"); + +#addStem("org", "business", "business"); +#addStem("org:business", "etc", "etc"); +#addGroup("org:business:etc", "business_admin", "business_admin"); +#grantPriv("org:business", "org:business:etc:business_admin", NamingPrivilege.STEM); +#addStem("org:business", "ref", "ref"); +#addStem("org:business", "app", "app"); + +#addStem("org", "computerscience", "computerscience"); +#addStem("org:computerscience", "etc", "etc"); +#addGroup("org:computerscience:etc", "computerscience_admin", "computerscience_admin"); +#grantPriv("org:computerscience", "org:computerscience:etc:computerscience_admin", NamingPrivilege.STEM); +#addStem("org:computerscience", "ref", "ref"); +#addStem("org:computerscience", "app", "app"); + +#addStem("org", "education", "education"); +#addStem("org:education", "etc", "etc"); +#addGroup("org:education:etc", "education_admin", "education_admin"); +#grantPriv("org:education", "org:education:etc:education_admin", NamingPrivilege.STEM); +#addStem("org:education", "ref", "ref"); +#addStem("org:education", "app", "app"); + +#addStem("org", "psychology", "psychology"); +#addStem("org:psychology", "etc", "etc"); +#addGroup("org:psychology:etc", "psychology_admin", "psychology_admin"); +#grantPriv("org:psychology", "org:psychology:etc:psychology_admin", NamingPrivilege.STEM); +#addStem("org:psychology", "ref", "ref"); +#addStem("org:psychology", "app", "app"); + +#addStem("org", "physicaleducation", "physicaleducation"); +#addStem("org:physicaleducation", "etc", "etc"); +#addGroup("org:physicaleducation:etc", "physicaleducation_admin", "physicaleducation_admin"); +#grantPriv("org:physicaleducation", "org:physicaleducation:etc:physicaleducation_admin", NamingPrivilege.STEM); +#addStem("org:physicaleducation", "ref", "ref"); +#2addStem("org:physicaleducation", "app", "app"); + +#addStem("org", "humanresources", "humanresources"); +#addStem("org:humanresources", "etc", "etc"); +#addGroup("org:humanresources:etc", "humanresources_admin", "humanresources_admin"); +#grantPriv("org:humanresources", "org:humanresources:etc:humanresources_admin", NamingPrivilege.STEM); +#addStem("org:humanresources", "ref", "ref"); +#addStem("org:humanresources", "app", "app"); + + + +#banner=addStem("app", "banner", "banner"); +#addStem("app:banner", "etc", "etc"); +#addGroup("app:banner:etc", "banner_admin", "banner_admin"); +#grantPriv("app:banner", "app:banner:etc:banner_admin", NamingPrivilege.STEM); +#addGroup("app:banner", "banner_user_allow", "banner_user_allow"); +#addGroup("app:banner", "banner_user_deny", "banner_user_deny"); +#addGroup("app:banner", "banner_user", "banner_user"); +#addComposite("app:banner:banner_user", CompositeType.UNION, "app:banner:banner_user_allow", "app:banner:banner_user_deny") + +#portal = addStem("app", "portal", "portal"); +#addStem("app:portal", "etc", "etc"); +#addGroup("app:portal:etc", "portal_admin", "portal_admin"); +#grantPriv("app:portal", "app:portal:etc:portal_admin", NamingPrivilege.STEM); +#addGroup("app:portal", "portal_user_allow", "portal_user_allow"); +#addGroup("app:portal", "portal_user_deny", "portal_user_deny"); +#addGroup("app:portal", "portal_user", "portal_user"); +#addComposite("app:portal:portal_user", CompositeType.UNION, "app:portal:portal_user_allow", "app:portal:portal_user_deny") + +#addStem("app", "vpn", "vpn"); +#addStem("app:vpn", "etc", "etc"); +#addGroup("app:vpn:etc", "vpn_admin", "vpn_admin"); +#grantPriv("app:vpn", "app:vpn:etc:vpn_admin", NamingPrivilege.STEM); +#addGroup("app:vpn", "vpn_user_allow", "vpn_user_allow"); +#addGroup("app:vpn", "vpn_user_deny", "vpn_user_deny"); +#addGroup("app:vpn", "vpn_user", "vpn_user"); +#addComposite("app:vpn:vpn_user", CompositeType.UNION, "app:vpn:vpn_user_allow", "app:vpn:vpn_user_deny") + + +## Setup some user favorites +#subject = SubjectFinder.findById("banderson"); +#group = GroupFinder.findByName(gs, "etc:sysadmingroup", true); +#GrouperUserDataApi.favoriteGroupAdd("etc:grouperUi:grouperUiUserData", subject, group); +# +#stem = StemFinder.findByName(gs, "org:computerscience", true); +#GrouperUserDataApi.favoriteStemAdd("etc:grouperUi:grouperUiUserData", subject, stem); + + +##Set up service definitions +#AttributeDef appServiceDef = new AttributeDefSave(gs).assignCreateParentStemsIfNotExist(true).assignAttributeDefType(AttributeDefType.service).assignName("etc:apps:appsServiceDefinition").assignToStem(true).save(); +# +#AttributeDefName appService = new AttributeDefNameSave(gs, appServiceDef).assignCreateParentStemsIfNotExist(true).assignName("etc:apps:appsService").assignDisplayExtension("Central IT production Apps").save(); +# +#banner.getAttributeDelegate().assignAttribute(appService); +#portal.getAttributeDelegate().assignAttribute(appService); +# +#addMember("app:banner:banner_user_allow", "banderson"); + + +## Auto create the PSPNG attributes +#edu.internet2.middleware.grouper.pspng.FullSyncProvisionerFactory.getFullSyncer("pspng_groupOfUniqueNames"); +# +# +#AttributeDef pspngAttributeDef = AttributeDefFinder.findByName("etc:pspng:provision_to_def", true); +#AttributeDefName pspngAttribute = AttributeDefNameFinder.findByName("etc:pspng:provision_to", true); +#AttributeAssignSave attributeAssignSave = new AttributeAssignSave(gs).assignPrintChangesToSystemOut(true); +# +##Assign the PSPNG attribute for the standard groups +#attributeAssignSave.assignAttributeDefName(pspngAttribute); +#attributeAssignSave.assignOwnerStem(testStem); +#attributeAssignSave.addValue("pspng_groupOfUniqueNames"); +#attributeAssignSave.save(); +# +##Assign the PSPNG attribute for the entitlements +#AttributeAssignSave attributeAssignSave2 = new AttributeAssignSave(gs).assignPrintChangesToSystemOut(true); +#attributeAssignSave2.assignAttributeDefName(pspngAttribute); +#attributeAssignSave2.assignOwnerGroup(GroupFinder.findByName(gs, "app:vpn:vpn_user", true)); +#attributeAssignSave2.addValue("pspng_entitlements"); +#attributeAssignSave2.save(); +# +#attributeAssignSave2 = new AttributeAssignSave(gs).assignPrintChangesToSystemOut(true); +#attributeAssignSave2.assignAttributeDefName(pspngAttribute); +#attributeAssignSave2.assignOwnerGroup(GroupFinder.findByName(gs, "app:banner:banner_user", true)); +#attributeAssignSave2.addValue("pspng_entitlements"); +#attributeAssignSave2.save(); diff --git a/grouper-midpoint/mp-gr/i-data/Dockerfile b/grouper-midpoint/mp-gr/i-data/Dockerfile index 829939d..6e87782 100644 --- a/grouper-midpoint/mp-gr/i-data/Dockerfile +++ b/grouper-midpoint/mp-gr/i-data/Dockerfile @@ -1,7 +1,7 @@ FROM centos:centos7 LABEL author="tier-packaging@internet2.edu " - + RUN yum install -y epel-release \ && yum update -y \ && yum install -y 389-ds-base 389-admin 389-adminutil \ @@ -25,4 +25,6 @@ RUN useradd ldapadmin \ EXPOSE 389 -CMD /usr/sbin/ns-slapd -D /etc/dirsrv/slapd-dir && sleep 100000000 +# temporary! + +CMD rm -rf /var/lock/dirsrv/slapd-dir/server/* && /usr/sbin/ns-slapd -D /etc/dirsrv/slapd-dir && sleep 100000000 diff --git a/grouper-midpoint/mp-gr/i-data/container_files/seed-data/ds-setup.inf b/grouper-midpoint/mp-gr/i-data/container_files/seed-data/ds-setup.inf index 9eef33c..96c29a1 100644 --- a/grouper-midpoint/mp-gr/i-data/container_files/seed-data/ds-setup.inf +++ b/grouper-midpoint/mp-gr/i-data/container_files/seed-data/ds-setup.inf @@ -16,7 +16,7 @@ ServerIpAddress = 0.0.0.0 SysUser = nobody [slapd] -AddOrgEntries = Yes +AddOrgEntries = No AddSampleEntries = No InstallLdifFile = suggest RootDN = cn=Directory Manager diff --git a/grouper-midpoint/mp-gr/i-data/container_files/seed-data/users.ldif b/grouper-midpoint/mp-gr/i-data/container_files/seed-data/users.ldif index 91360a9..5381f7d 100644 --- a/grouper-midpoint/mp-gr/i-data/container_files/seed-data/users.ldif +++ b/grouper-midpoint/mp-gr/i-data/container_files/seed-data/users.ldif @@ -5,20 +5,16 @@ cn: admin userPassword: password description: LDAP administrator -dn: uid=banderson,ou=People,dc=internet2,dc=edu -objectClass: organizationalPerson -objectClass: person -objectClass: top -objectClass: inetOrgPerson -givenName: Bob -uid: banderson -sn: Anderson -cn: Bob Anderson -userPassword: password - dn: cn=users,ou=Groups,dc=internet2,dc=edu objectClass: groupOfUniqueNames objectClass: top uniqueMember: uid=banderson,ou=People,dc=internet2,dc=edu uniqueMember: uid=jsmith,ou=People,dc=internet2,dc=edu cn: users + +dn: ou=Courses,ou=Groups,dc=internet2,dc=edu +objectClass: top +objectClass: organizationalUnit +ou: Courses + + diff --git a/grouper-midpoint/mp-gr/m-server/Dockerfile b/grouper-midpoint/mp-gr/m-server/Dockerfile index 98894cc..bd728a2 100644 --- a/grouper-midpoint/mp-gr/m-server/Dockerfile +++ b/grouper-midpoint/mp-gr/m-server/Dockerfile @@ -29,6 +29,7 @@ ENV MP_DIR /opt/midpoint RUN mkdir -p ${MP_DIR}/var COPY ${MP_DIST_FILE} ${MP_DIR} +COPY container_files/ ${MP_DIR}/var/ RUN echo 'Extracting midPoint archive...' \ && tar xzf ${MP_DIR}/midpoint-${MP_VERSION}-dist.tar.gz -C ${MP_DIR} --strip-components=1 diff --git a/grouper-midpoint/mp-gr/m-server/container_files/icf-connectors/net.tirasa.connid.bundles.db.scriptedsql-2.2.6-SNAPSHOT.jar b/grouper-midpoint/mp-gr/m-server/container_files/icf-connectors/net.tirasa.connid.bundles.db.scriptedsql-2.2.6-SNAPSHOT.jar new file mode 100644 index 0000000000000000000000000000000000000000..88fcb54a3ff6d02b9a1fc8a7ad4ada2fb1b49df4 GIT binary patch literal 99664 zcmbTebC732(>2((ZM&y!+nTm*o6|OaZQC}cZQHhOyLaB@x3TX&8{gi)Zd9DSakHW- z>zvBU`Yi(r1_J~H1qAfg0V@aeKRnR?-sQwpgy^K?#TkD8gP{RIK|%dLU}*m%OioB% zN?c4?g_6oWl&Io}J9(r^QFGCG>rI>XkXNHFHZ!Z}! zW0eqZ>HTnXnJ|tgAnq^9cQPeO!$FP-@2>P}Ur^x3jY}`44!U{}ylL zYG-0&>ii$<@c*NoiP3*BrT+gibvAagbZ{{>adx!%51;ur+JKx5Z5{rP|NQSq7Scb| z|2Y6vj6MS-O1v!lh%b_x?$FAM|pHWD>4^I*g@nHq67K!5SLwy_jjE7EDlPQXE;+bo3P%3U)-v8ymvu zCG5XZ?s6v-UFe=QXxJ5)G2 zQCQXv8)~zaFEk!1OQR|B<0s7QQ(qiwnX({XP_oLTo=*E{*^C}?>HGrPnpv{MxBaH0 z=7-Zge+vB*nM1&gLT8P3VKv7|_6v4*3$uOx7(*!{vLWXB>`A!I|3>I<8G=%q8UlV52tF4cP1vKgn*~Dr ztClgijp8`mU}#*l0jR%SxJovDFao?{$>P=Q9=fDt!0)NDA52=jh}zQAQ3_JY@niPKQ-Lus*1HjL?p8 zWAfJ@z9X4T}&M7 z=caqC=x`LpD(l1TjdxcGzlU|lyLrYIE)8^rEdf2N^O&F!RoY1kif<|&ObEi{eljnE zRu>Jn&H0?_?5;`XVO3`M?V-McWmN89Fyqy6N~SN5P(f1GRJkkaZB<7!NZp!lP&s%q zaa(^f$;lQJ19I1iuR-6^DSg5sE1?~VoO=5Lh#&bxkk=u1{Y8kA8#c|TH4C99$CHyg zZ<)%3i?Z-c8db3i%&mh}yOX9WE&R>T?3XHGE4djgOBCs^yZkGK3SVg|Y$>E68gF zdCzk$g0KX&Wf{K>tHgCDI1YbWG?iUvdQ5h-v_4u4L~cOwW<*ZdPT8mP8LJ-w2t_G{k zWGN6+WZ(ak?RX7@LFl?5e&<#?ayS9?TAhxf(JCezDhK1ky;UWuSz`i+sNtBy@W_3EejR`UvXh0mf5}p zW`OoraKfMZ5BJFM`Tls;bD&TCw4OM2c5z(!=3u*L^v{t3HyWYao7s7I3C+OPS&AQ5 z!U_svD;ncautAaAV3dj9mIspY#H6N3Qs|8nUj(w(mgz|jt?Lf{@=-yOLE%vpzdi@f zvB1H@+EX|6F7#_jxug=txl9pvf3MFiKivL79Z zRHOT<1z-{L%NL<(&2NqTC9z^HBd+KRG&K{YHg0W5@S$N+((HcIDltL_5I>E)YMYUN zJF~WS8cbLyl7-OIGlHdJ63+;%JcL82M`kzzOIzo6Ink5-0D-1U7v-Z2|3b;zrO!0& zlOKn*JdNuUQg)M$#;1YzpV3)Rh$#*!WWJGz?}o z-jrHtLT#!CC@WR|#bdQ5;*kNu!j4rRCo_+=;NwjYxq@nMqg=`19S8XhsO%O>zJs>XUB>U$K z8A@rmX6$@8jxfOTf+AB2BPZ&j}0g>UZDtfU2XD!D=W^|~v;3xf0d zGhI)mJaM1=4Q@%hRX0EJZlg(&?A|Hy?}F zO;lHf@h?<<+B-EHx*d~n(H@kI%d|Dn$bMG~gb!lcC)MQpy(iE*7PaAL-dh#B)4Dz0 zw(aKf{L5!6QJRTBOx_}~d?Fm;>97i$YeJ&?pjFc;;&mfuatAAMtt35xEGBNLZ|UZJBuGaLw=7S zCvmoQI}@C(mfw{J<~E)j$0_+WejS)6DT~R4>!xZpq{9D=ayN5FW51WnyEKoYE%?!S32&{UlH2&!g6C5-oF6L133*3eA>cRVXEN%^Q6CuB?w z+8g{yO}J3W9A%V-(%$k%S(r1=ftnIuX=;a}loh_QU~Olt@XJaL5H)!w*)d)IR*jqt z8c?p^I?xOSAM8g~N6K%aZx&eDj|6Vy`-Rd0CAv!d=;8E;mfh++M)2)>x<0me|CWk{ zvD%-(b_O0ZDAAKW}Z^FH4`VRv!!F!LIy{DiHS zk49FGtOWv+pf6FTkoStJY6p96oPe2&xQ%iHjGErNyLRl!i_u*rVc#UgGq?O(;AXNU z!eJrQoA6Nc0k7a-6w4`sIt4JC(-4l<};v>=%HVk4f*+)*#pXXbY zxbmdToH;2wR>S;(#<`+Yjbwr(e5wi`wnq7l(YcMJ7(BA?ldP9D!Pf!@R2U}n%&C)s z=#iszqUS4zh0x>fm8@tA0YH27G>f5#u~jK$h5Syrkl^Y_3m(Vg->088%kDZ*uj4su zKKC_4O(cY%{0e$^_(XYM&7z%J00HcnA5&KVS2Tau)1glwlckqd(JPz-%~juo{I?;}6ul{XDXEI9vGyZCXPr%WyuUrjN`4Q&X3Go*tSs+7W;S!Wl^!&MygOBs z+pLap6|GJG@(eR8ae*T&6j?%Cqaf|b3+_Aqi|l)L=o0biIF#e^-i5}(|3{oXyLEO> zdB^AbX^F*tBws5k$yA$|i#4Zl@?nE-K^)FT_o#%W-+dH|`t)|O1ZpPt&-L4K6W~^Q zl|?`xyuUzLG{S+P6f&o^SZRIo1czCtCkhCA03sCV^YIKDIl8wvo^PC29mX7P!}qw* z#GvYt$ZPxt0r6}bYODhVFy4GsjN!#Y<}9F+am}k2v;qSgcohVbIVQ+|T4yIeXMr;F zx44QQ5~L$)_3kt^Pq@&MCN|;7gj?S3K#a8~fdxkAh?g<_2ZLe%!h)+ubFYI_ zI%RIl=v&(<8gZr3y7TXQ@Jz|O@4PogwE0}+9SUN`+9cwEX#<{kZsJnuo0n;7-qCO) z!(8pyr5D!FE5_jd&JD($6ZHOrSkmUUT;l8c;^deOv#vg6V=P_uKc-hTTxr6Oi_VTa);i>EWfac2VlOyoaC*(vbN7#%hz*AQvf+t1mK%b+%9!iUem zn%wcUZzr#B`)p=}-A-KPWS704(z>;iwjQurA}F)K5FM6#AJr2ixp=9~`3< ze}-aGB1}6>Vcqi4w3|Ro=F-DUj)bQaS4pIUC%ortFeI;oG-tn^G{qPJl}wLz;kPbLi&dl0ZjW=duGmmTtxBX+qc zj$VLRGiIeOL+qaL6)Q6;`E9sIVZTFlB!w+LMF^J%_(%P2pFKT#NgPlAQ)sH_8OBK4 zCL_^wBg}a6QIzjgW)$T0;6 zZ4pX6&4EX&s8_(u)Z#^9v`I(|b|z<-%ks z_Xpn}3V_MX{QL3gV+cX`OdF+z+3}cu)3hn#JWb(l{bhd}V*x6R&UUk1&Sl?!?np{tH{83cmgERzr>5gb0Z zcUFWtmBgVUe9xg)nLOA+3S~DzW2ElZjdKIs(z=-?6lq~5uUtGVH8s?E-IC|BDt%8L z5p~X{>RF;)dc%rCXBF53cDpZ@3+%yjcg)jcT9hKJpx0=yd)0OLsJQU~t5-!sJ4Iz7 zJN8J*wu@$1H{tHKlV7OmYgw(g3utNSA2L!SAjdg2T(&up6w*8rgY$}P@BQ1}urgd= zcESbTjU&nfWZz8vWUX_!88l%pX_dPIdeg)-ZFYPTTeNEh{lDEubi3^Vi74%`*k@gY zu0$ljVV2C_aY!gE3T2&$U`$dNiBDHfV*Y^NBd#Aytlv^7L_b6UaDLj1*5$zg z!N;SMkA#Jnp#jIYeOr#V(knXz(6<2=F}9qsaLwaC)*V zm&5Up3uQILO^*>sWac-dtSly(Z-`DXjqw7WAfLDhCWqe?SW!uPI&=BfWB}sPxYxtX znP@(Kg1-oqnod5|vMQQGXxq5M)M{-+PQhDJe{Up|nDYWd_a^%{wT!@3Tvk-{f2AC! ztKL3__0G_?vq+{A#m_Zr;f2;NzCsiW2#E+&{M^F}v6;PJk619bW9Lr_4*NP|!yhjK zdOpueZ;*w4FUc%@6^HK-*PcDvJ#|MyY)87$c`w#H?feu|>-ZqLI6QqneQ>1SK%5Qj z-V1MKpV<|+M6QXwOjFzcVm8w2xKpn$Aa;NuZ1$MP$GW;zws3xJM zej{;HyRFmJy=XFNko>i;%lc}q3`Ht4jxOEeoz+jx2{HE9CX?lT*ipahTqCpu?i}(Q z>RBFXOCNeycvjygpEAa&dp7+p-83g6^rmC}*aQ>`G#>iT7QheNpXZ6gSoGWayB7a+ zG3nK*gMR#Rv(FAPkMxRs5&`wf(eg*!V>h9N;&y?mT}%j1q4YqLSDzu<2M5bCtn(7F z4eyQpca(?0v^HaZs^}6ty4;DNc@GSK(w~~6SGVRZ)!G?}hhJQv;5=B+stdupYDJ%g z$TpF5;34SjgXH*A8TC?-kmrOsRA5_p3YCfJQ~$JJShM;G?s!JHpGGQZ$T`Y;Y{~c` zy>b{+u!t&4VudTbSG6`|Xf=rY+4^*$@Jcq*)$}G3Czkm6irr;-k4*=_C2UZ*ej3^! zb>rsM!VEF;>B8wJY8$HRtJFkMNxuj1Y* z^L+1f`{7VPa5(xFtg`$xW8X9ozqt{?lX`8eyh^T8ZDkRrEH{F!hlz;~~SJI-wdVX^rx9C;#7U$OKO7^cOi;<8sb5J6NLMvL@hkukc zsVARAZxq%lq>L1k+klztxy`ub8I2lVwq@h<-E2_Kz`vv@2&t{hlJreO81V@;*>^9I zz#d9<2a^>Ow)iiU!sIy$@C<2DSkfP6)skz+r_5ire@rENs00HGa0TVEkJkLO)?EE` zNL=>qri(8HBi{qa=bb#P<#C5{o?OXh+6L|95Kj~*BP@V~;XiM$+L5Oq1e%aVIE=Yg zNI7p7xvJp(dB&rx4ioT*Dwp2QBBtcr?6~hPt8zlHzmEL=r9L2`5)*m3oG^ia5aj>2 zRLFn7UoY}MlN?a~-xCGOin1dA5*?<-F7{6J#x{n|&Rgo*&I{sb-|Xz8RQo8XAo)#2 zP2l=e1xH$VAjCQ-`$#CtVQA|ODd=LNDR{d6vZb|Oe72AYmMmSoe_1}u#;;Kra!D_AZWGMarE%2ZumfNM3#q%iTLwN0-xjPPI+zZ=e&bS}U{ z4^SeDfchM$m0fg1*ectvGQTsHHTKG7=xfhr@ZH6p&P$}VQ)NjVJWqprvu9J_LLatl z%;PFb)ZKZVEbPZl*2m#$M-ax>8)~Wn+Q%$7mz7{8s`&2FdEyYGHvzKEuSo(2R=b%g z(jAg31lt)qJ4`%HY?0Pa;$#dqy4*PMbauE_WA1VrR83N5v2ezGB%uUXvPM`k@}r)zJK2+&yL|Ls@&wfGdbm z=iNEV*vX5h2m`pu2-%7RlRyE(qf6#GlAU_FdTY7F@UX zT6>h8XR_OfnK{sEuQPs+q`+BfRk%$ZTDhL9u=I(}?|}zWY+1fG^9G^V7V5>4zacVj z8hPMCE(k<)3^eRCAAoWB#RPbAdxPc-4Lrb7j1yApv&{Nk_lpRjDbge1&xFdT3!6_X|{S6l#i+f;G7Z4i_Aj2cgK{H^IisIsXwR@>XOIo_0~);C{j3f z1~0UdZJ!WIbX}I~z&b)Og^!em03uyjTR1Ti5&mGecIYRjYGlb!XW29_=re{( z%qi|?sCcqTGGP`GFwC@~8??TjsGziAGQQLw+%OKN*-<6# zu9zTPtj_~;JZVI7zk$6WQD1xs=?kpwK}F&3?aW!xWv&qALO4|s3)1*=v*+nO*l{M< zKj7mo`m~eC&6TX-UdAdw1zjw&lA>OX^B-C4La>ZOrD2MfE_V58aa*FPE<7oc7_ zl+fjMRbw(?FlgaU7Tv{gGnvsE$}44&cr2wyX1Ntd(ZnPdK$0#9DwoI}z)EI2UnI3& z6oMg~S#%T+29=k^!qUNm6W#Eg;G28Ao$h?YchYmR?L4!k5Zm)TOA6$Gy?q!$_(23R zMZ9m;ym~f7 zM`DLwA0=mpTA!)?r*-vu0DqOXAXg_SHQb{-Jk`^&6cJ)qv$-KEYT^vl-PsWwQxCcJ z-;RSrZ1|rp4>n;{3kz0uF7#+IB%J<{BjpAG>QeJBMZVG!^B0muFcwR>)P?uptV!C# z%)~c_tweK$-lTrZSiPiMVQt`dx?K*_kLE5ECL|A5N>OTP#JqSZtcDGP0N? ztSoCPr9w`bI1q}Kf0vY{f+~cXB@Q@B-n3*M_t2uqjZ)5C8d-pLWlbHU;nG!=?8~^= z>TEr?Vyiy?K%!}HmWyi)Ob3Infv>bQ<;=}cb7C4kCLbL&rS4%5Z%vIeXQ?C zVRy52F0_p}w472J53VQ|MUpIKX}5X1JWp10rJyWD(|SYorK@~TP5b-loS~vVzx>+? zJt`_{X3mOSC0gzNF|NS!zRF3G_+~jKI(85u3{mz8QCwmmK+5SZD`9fILo$ROH2;=r zO0sdPtlau7c=aH;wCYM`fiTZ!0&FI+A|T$P%A{iam37IBt+ABLEQy^f)-zxj5F>hN z449cuQzXUnm~1theiXxDA%GXN`Cl6yN!=>e%^l&jZ>YtG-VuvU+Fvwdk3($6qWdIXSQAHfTVGrtPTOnQ2- ze%Oi*4DO%|=z5Bfcvg2Xv(97T`#^;q$`UNemNGoewVddOGYZYlEYfAyS)Icx%tRz@?ILOiA~A_!QlSqtoBnzBix%=a zuNY_v1ncwlEYdNHYKP8JG>Os~7~6{y)XDN-?IH7g6HzN^Ym3ryP}-YLvD&`XoPCy6 zMigR(*HJjIj@jesz5~(`9jSlgLXJ3q9`M-hfI>1eC<0(ckU@GLe1L(;()_VZtH|_a zUxz9C3^6?1t~*Uyz$Az$`p7Uj>Y5@Pyp&6&%o+5Ty`~b?1C7N=qn@#<|9pN=xAA3b z`k4y{;(ETKZIT5{4zXf7(xd21I$S8W>Vbspm>J6V`*_gV4j$2#QlNTItIKI*mg)9? zVa3%U2I*aLobW_E*=g^!23qdEcjk&y;}V%ACFn z-SB7JP%m7|&p>Oz*-3{XxQ5j3B1<{%fr8fwD8Fa^O3GZ#y+9+5Cy?phQk$q=NH}(?BN!vITtYN2q1WlKlA!vo*E) zI$+0>0L&r>1}aR)Mt{{!cN>;n7+myJNez(>DFjP*diYER2$3)8Z}iK6n$KVbWpxH~ zh2oBZ4`JguZgs|ez2by;bXIaSx7`wSrEdNEj0W40c?E|uVtdeU&%o|$VlG{BgVqmT zs4e&$&$3H94K~E>YY0bz3b=?Fs>%-BBG0ljI}JX>zguKw7d2^NUcT15Eo?fhIJ%kF zESKcvo1m5Dm&Km?;QUxY+znfBEq!7R3^swaBAC3eU0`*n+Pl)5;48aSk9&@s{<*I$w2oWw0D_(i*xO%pXs#u&F+zlVOv13!ry-8WR zBd~X5`&(LBys`m~N~u%>uWIVUG?d0QyayX;ckE`~JkUFP(;7!6ydvjz)B_$Jw1qQc zuQm68o*95&FW`o3uVWM2M}8PFuAOI`aUOm)q<(GewHzI51s6bI=8f3-Le&{7v@?@O zn3uw{8)TO^B|kfpFzrkmsAuo*GrE+%BtQFbl>KIC_6fz}n-uKc&eOO)_6k-0rwPC! za6GPYVDjnaIULJ!K$&(IEBQKd4PcWWCX8$MqZ{y8POe`bd-e7l7BC!EU_Q_#`%L07 zu1>r&ReF)e9u^2u=wMvlYD_||9B1(j#lA5c79icrU66NXZdM|3U^D_%+0Q`7;__r# z;8Gv|J+kF z>THzN@mou-9~*mJy9fA<0Q_bE`ow$cTiBUdfEVP0FH6_GbTOG5T#>Q3i)UKJMXa0^TpPIUtwuZ$Mnhx(7l(+2xcM*|Q zo3>%AJ+3R36PK&4x@3Wu)Do<`(it$(J=|9iZ$$lI^ILKc1bqtF+JtDa$31I}=vrgguevi7uuXCgho0XNhC+jiePJ9> zOCeVQOOF?agnPLFe9y^ss-1#Tgo+n84mTH`EnYN z+94RXuos3cvoIeaQ3ismKw-h`;V_s3nIX{*9d*##)Hb0!!Sb(+AWx_7*0{w-eucj1i_1^~Wa%RsjdDcv2?^2+pQErp*C9WGT1)Er@U_(yHNN1dwF!^B z&2j0)C$%g3|6lF?*Pi45 zC3V#=+|kUjf8?H-Gfhzv$dNF9b2Kkah1j)efr5=f#I-`F$|*rBaj#|Dgxa_@vow;0 z8~j~b_ew1&SpGBAAqY!WZ7WcI@;W5YYoBwlm#EJ>a=>wMlf5=2Z-7a1YnZ#{nY(e* z);aSrt^fUT%mc)Jkj>c7xfafugDeVf41z7x5NKg2OG1gIOnk~LAHo#fxjPA^1T`SY z1TZ&*F$yt&4M^C{#xP+I=IY}@?JphtSVQ9P0y%Nu51twIpbwsbd7FWbKN)zu4>a)A zi(?q|U~#hSW;l79-%t&1N%C>IlzRfor$Sm;i)@CRRf&$(e^I z0g94`(K_-BhbYvfEh54XQqr>LZ3*S;?TT@6vgoWlh8HDP<E1PS+vkhaPfZy}_fnWqw8)#~m@XX({ok)5x2s$f zeYva+8NtcaU3u`SW)!T>qS>R)szqNT7O3_lADIwMLcXfOR8>B*3-vQUw(655pCB-P3x&QDiUIvq45SN zg2$5P=Rx9P#|NrADE777+Jf)&iD9Rrd1LM<&xY7RXG5~`lnleH+f-@gYm6Dy7%hno zP4hd(>{hz+9kNCOZfHHw1%BU(d`kAk-l1X(sNS-4QXHJX&>vt1ek%1J$5Y#K@f)?H zPo!mx&!T-wV}1Ya{l?Wvnw2PO{#_ol++lExZ*4^^Q(`teZO2`@+wzM4BCJdHGOG`A z_0mdG@f)J4#RON%E!%FyhSV&RoP8b~T-{Nw|9xFJ(MpeX;XEUofq0y~oMw>6SSzG- z*R?Z$mpg{`6)c9jHGmez&PcDn!Tqg(X=1_QtAwc3K>*@;23UhHdhC|^_i2X4CipK4?&r{t#C)zfRja1gK79ssA#loX7hnJEn`1Wn; z_73`lBP|QYk}V&`wCqv1BnJBG#89rn_0C*?1MWY_><0n5}Q#o^l#`5|#} znI2W7ooX!1iElsMYSSUm9(z=5R2S;3?1Dj2N9U+SiL9}jj-Qoabt7c5Y))!EDYGgu112Zwd~Y|=H7jtppvs>IPPLq`8{`AF+0i)5U-X|fmstdrij`QHldH+ zlS$5k<4D(V!OH~{{%1GLL*i_h>puUWAN>CMA+KlHzH;c`fgS3ZSvUT^7icbRhn?_w zLQP?Q$SghGYO+4bDz8=yXr)EIecdr;zRe{0XvXc;}DH zmcL&(8KW%9<&(tMLmb22AX_j=^mhv~|8dm&0!Lk-O)-by`XVj>qM*-{^<|td#$jVv zAfNpFW(_O(!QLl%7-ywGvOnwo9l_AK&4v?~%zb_Li*b#U|_I zNxyEx-dLin?HQ#Y5c4TsBHHc;WSQ;uyG6XJrnc&RywYXl$%5#fKlS1JnpSpz?Gyi} z7h+k2tkM6er~^rm5cMx4-D=d|Qwhq1swtqvw%DvM&TvpHQXd?`lTuF@icrQd!z}YI z`d!A_G6@S$I9LxDzr(+0wOAuN4q4su^Bd5c1;;&i0Oc~w*=Gwt` z3f_QIAHWR;MBA}Bo&j0@3lujQ3kkLeb11%-;(kq;6S3szzci#G*VQHc>E6)*`tmDymHXX9#&@e5W)TmwJ zDnb29ozSY5VA$YIEXJKcoj)S`ZSff$uhXylQ#sz}Yg5*e_LIAO_gZeVjy71@t-2U4 zbj>rt_zQL}3KmObQA@`t^0bxGH0S(|YB;IG2ITJ;ab#2fU)z}zP_as4;mxqDe&WuU zx!s=L8kg2JI*t@Uw_B5x4lzQxCm4Rys2&|7QHV;xQ3p13E57=kI$%Rd7Oi|?49J%g zIcG>ZSqObjiNUvHLpE-l*I3eI{ISz3$nEDvf1*g~HH@;d9CUcU1pbRq6nxws??3_p zo&Bq``hPEHi+l#Oow0 zm8e=5Xw~dY`qY?_0VjdzOZS!G(rQ+%NL6T_R^?#4xg}cl0Ujt3(@ID{`>l~{f*7Xs zsjAd_USy>CFn7mg0$6|;`BhvKzJ^i>N?_xbb|dN?reYa2^nzue!H6D`_+(j{S*9tJ zF;%ivwG`a>Ug`RjysU8Al2md?2!vm2)6~{d*b?L%rs>(aIp=UOF3A!kvv2RLOk_ir zXd`1AL>nf8+?WMJJ@Z^&^vuX($pDT1rS^U6zU6nRL+J{(iC&oos^0g&&-hW56ud4) z|3T>?5`nz$)ac*8o@+q4hR29h2XEbfweN;el^b1z9<`aL>v5hT4_UtVc*{|UOZARW~%zWr@@nB*k%x5W!TB37wFVKE+srB>1*Gx18b!>XJU9u zz|^RaN~Q@NMrX$+Ut%4KMaR`8-xcg55XuYhNCG|ml6U}$V#m`#2+;w%bQ&?L-&a*~ z)As;o0=k%&G`1hsf-YP08yLtyqm@)}TF>Mf9ofV>jdVIh5#BHr^s)@{p0}0Rk@hDa zrGdgK)3F0r5fl=h4D#1w8oL)rB^vz!8sqmNdYF@j8_*I=AtORn-{Z`*AcuOgd_p8U_ClVf%)kIMuC&3*DAmsE>H>w5i;jaU#c~*N=JPeFAyjW z=DAgZ7?D*yoBw{^hi-HBCI`+#3TD>=&(8GZd{Ec|O6GD@*c+pTD2}7VQ*s}HxMu3z z-&C=Ow^%N2SDHmdg6^H%_Wm|y#%nQtI@m0UBOZ zLYI#hvY+d?oD!)GZ!GF|~%ijC|h-3?cYKN7Z;N>KS_^Cv^H?k^&tco>)87!;*`eSa^pWQx@mtAQ{IH=8NSRrfR7XnNBtG)&IqPl!z={yrcH13^<>+WOY z9-=Upy57iIZ?4$-4+HQm*ILaLK^PLtfir<1D8TqKzR|s-Qx%a=4Grkw)q88)q2ff_ z5SH~Ph~$D?)Ojfait{8sYQo|W({vQ?H5&uCCZ14(aVI;|qX{tf*wR{{Hr&?r!sS5= z*bOIk+4m|#TgIZhr$HHS`hgS^Vormc4`Q7y;?FOG?6aMeRATY zI0bs4vm-o?(sXWsLMMM>PhH%K{*^^+ILkSB;{Ai){e=yNq>go7FkZ%%KNN!saZTYI zAVSkbaSOaiWPXr2H=3lHTH?Xs!#LQmieV989IgVPY_Rz%r}{gmx`M7CTGF!@D%(XI z8p&Gd@YKTtNFCH<)u|RPncNDdE1{`5-H3p4teUCJRyqoo)mjVH#cXfiiv8_=7B`xJ z$hrULap25|6MM$T#*DE87=amKmd*DpErm=P!oEJH!gTlwDi*I$WAK!fDZ z1Qy}{DmTyq3{5t*fok}Eg|6&*&voQX;~Fyp6&b)n59p6ARB;MwD-8WJ!v!&VehTPS)rxnT(k^xL`QYnAHe(ra7J#N%7 z_DZ}(l13hY87goNfciDIv=<}-we=Skj;UbX%1m}uIAl5ib3vZfES2kFhuu{y#>*SF zA*||@_S2JIR^O@X6rWA^OC0v5_-j=eIH%qk%%15#4HFK8%^eTPI( zVq|4U$|Kapt<2iacw}4)-wtem*)~bRi28}fm51R-LfW0@=tDW*ShP~JS3W7+4*|fjl_{SIXMwr&B z7)%|fw_hlOZb6&h7r3_eXoty~PQR$P+`q99LlGC&OmL<#2I@ka@&kcxgZKC#;MmdO zMp?X04lqx+Fhs&TV&|Dg9H+Szr-w++7#Ts31Rfm{?I_~jbV`Fp# zlj>uySGjojzi-xlVq$|3R{thk&~Q8`n|(IJN?wP!9!$p@?=&$44h596RWj4_M%yD* zk*9I>!9!cv$^>$}mJX)%htAu>UUVGfCYsIeK=grZ(*EL=FNSgGYW8jl`ytBQaL(!2 zMR&u?phNXleFJtM@IKS)Q+!Z`_)#5Ugg>9rsAZf_IUM%Ej2V!H#7OoLa@+FK1#B53 zG>WW&(XJjHMDb}=QMUJ@C#Cej#WmMZeYnn~CVs4+z=khS1_~~meEO4twRu#T(C7DL-lAk9^|~$I84S+4lYa3C#m)=aFg0zNdpOcIYj0Hk>KGrrCKDvxUhXhPJq2q zA?hC8Ye6yNCg^vj6Bq{yCv9u^!Nf7-m8#E^pA!#E^3T|jjfQ|?34&1da|*qH>hvwf zm`~=!e>;52gjw|(2YA3)*$@*=K0EaJM*fwQM1=#k5n{9%;!U;kCn<~Hrwoz!^RMW! z7xQR^<}1m9Wq$2+aly>^krak-TO&~?EvOO?H}S3~0!Q8~SV0VF056Q1EwAV6MDRm? z#oH|qi@W|cg7I%6nr{&@5vOqLeS~uFAX?IU=5Juv3|O4})7}{nd47L3^`y<#as9`9 zG{Ah_!n@EWAbEB@r)ZV^J?RMG-;S2E^7$CbOIq8|DrM)}Eo=9AFm}+K$@}&L{9ihB2uuIZ5aIvfG@rPojf<(1ij$$8vyI{Zd8n@|?ZX{a3~i)mp=8T; zRS8O~+W&sB2wZ&#vI!j8HqSuPBC)xdrd_J}O1NE{9TyErQ3Z^!tc;5PxA%p@D{NlQ z!JYXJRjj+)LflA65ple-nYsC~@3s5&X8P8pz|Z#`roY5(B_^&R%&5m4*a9r9CPU1= z7=vCv6GO~Fa5$Y_Cm>O#4x=_aPAm)Mt|EM;bJc%=L=W>WG@L^$3;8Z3ypd!&!b5wI zr}IZwuX7~oq0=K5lkj$5L{DdTNCJfactyd(QL(oagx}cWYQ<%0y>Ips5y0dD0Z1C3 zMPB}282iQ`-5Msz=4~6dZQI6e+qP}nwr$(C?e5#QZF~FuW_Dw~iJgs&cz&KAC!UCt zRhe0p<;WbLB~@yyDOOlE^qVDK++C8M**nMLL6uQGSkFaOg?e>flDJ@0OklYwF>~~+ ztT8=K0fIe&sfk@e$|$<Tlg6$z_A1My`-PLDzw0(JRkisOoX45yjAi{TY+S< z2q}rcgdA~Jk%h@E1y)9ePS{8|^}Ck7O9Qd_`Pn+($5Uz%5nMvhR30>fZJ0m8Lb21( zc)DQs4R5u;V*RxDGUpSa%L(`1+@*4Z&T6Vm zWb5q7AUUZe0kdcg_SOL>mwwyo+wtG;sjv!)5(~{wBM(3C9dnBKaLHBtA1|(g#h;?+ zwcE_R#UMlY_}FV(+?QSfd)@ce!-L%3niXKUn}+I9_K7cxFB5UA5XGqwj?KO83no|> zGWOPe^Vb5MqH}Q>N@v$ah2FcOr?aVZXz{^vinkmIeL^u_`SdyQEB%Radu}T=jyd5& zgyZu|r=gcL1C0Go|EH_3-m8?2fVgom7vzg(|L+(1UKK=|eG9;C(N=#OP*2ibj}N>Z z5eVL06NnyPSUotOZ$s0%Z4UH7KT{%{4a_jHl}NBt9%S^$sOu;=JFnXvQ7)GS3=ABY zU<2r>zEL~@1;;?WvFtcmIvk8JI8ed|VO87T*mWUDG+5z7nP1Vb=G6-Q@K55Rc;vfy z*(r2kCPa~Xn*3<*#LxspdZhl)mqG~1bm4jsV04posxh?s&~qHeAOrRDRJto#IW_Fi z^Nr?*nCQ*#z!B4@o$N)s&FN9-An}NGyjh#OaET^7VHM~+;uBJK2M$wgt@OwHnvS<7 z6H}+{;SVZ1hh)=iA~Cr}&T+ST!JJw=E1)FDtfian6Ljn8#V~$3SR;S&tPnb&S@VWJi)}F|lisI7%54s7PG8t*& z48~Tb!GElfeDclqIMO}1GphR>V5qyOJMDq1x~jCQSn)LZp*q$MZ^J5VaxYz6Gw7vV zB;40mE1kaS~Vk(bO zPxk+ehyr>8wJhPqm=d@rdYo_D3k*@k$p^OD>@MQ2s4mzy7xR2xm0xBHxRYNO-J$8| znL=Gj41j}=maevcVNiJy6?(D$%{DTZrv|HY1({O`zI_bj6K?BxlRV&6eIqF3ItYqG zjFq**{vu;|m}h~P5+66!P27zl&13Z>#(m%PB-MuDvSrD6U1$V04^JO~GFyl7%PN6g zL$U>UDgr{*6}M#w1inBWNv*0Wp>$OmO@s?~G2>r9iLU4uHan5us6HbEgSez%q@o`a zL|;T+Z;cc6((utZ>xVbeDlf0$Hzry;GYHYz(Br!#-H@U@zhOAAULQw&{;9DNzY;GmegOaw z;r_pBEap#*{ogq_0`^9Fjz<4cNNG&$ZET#~vXrcB2w362x_k5+b=o)b4y!+fuhj8( z5Q(Ct{2Dog5E!=9Z1o+;y z>~}o#_K{jCvn_t`1Z5|}OH-jWn&Qy$s!lC~Yf^@UOFIEtQ&S=H6VL_do*&|lVzWts zfx}9*3E*$4B&+uU;L4tr6M=2vDzHNbItf!*ke+x_u~9^bZQw!=+d(1PU|u`#D?{E0 zEz8zZlU?REyF&N94~Rr30q2p8*T?&lN7o`)W9zT9u^aAd*%kkx#U?}&7G8A5y@7?M z0%>=yK6B=1&*#>{j3!4|ih~(;cFmr6HfyTpat?kO6v&fuZ9%b@1BZ<-Q<_o+r~LF4 zhG_B+Z$(@}1Z9aO5F*FAPgK3GS7uLdVE^bA27UG8w_mK4il#5w##$EyOL6Kh7)OFq z8SNYhb3T|}2#TzMqk02~W+4p=7}3mHIWdjtL1{@fub(jdT~u53Z3fF zx4@lH22XU$1tcf4BCk0_O%A^GAVS~Tij$@sb8YA;3jJe)9GWRe5?<9KKt{oj{&L|i za@)k>w_$)A`*?|())t^KB>up#6M}>9V|ulBjB!^vGOOWL^_T2HmK4!Qh)or}3b(oJ zlVV|2#m&yxqZcb9uOl>H8mu}kFSazta=GWKT~@9pu92#IL!OeWh#9~IZ(CI>^^=2V z^=5>s@+5FjfXL1&RJ7_YH@`Rp6I_;8I;88BE|~eW{4lCW+o{ZGi3s(yX?17B9Taq* zAF}0<44Z^shrxo|-9;ffIYIl`{Abswj~g<6D1Z6dgf-z+9}ruWil$_B%1PA%D8sgG zw8Iayyms}9lA0`%h)^#2Ee9_f-hjT0`2n;zHgQcJA1Ymoi5E-9U_h1nZYRDC`!85| zZi`RQOr?29-pJFfx9R-Lt0^!aL!|rfD|(_U4>H}6zZoT?U?dijmJU{CukQcByybOj8G zG}dvG_Ef%sV7Pp{zeJP9I0n&# z!KEzp#BaMUyW{l0-6q|55!3{RIO>FP6Cdi@*S1ChtyLNl-J z*P_Qt_|2S9+g)z&+#i(@)HF;!Cw;QwHNK&!;ve+CHIp)-}0r#E2rKfu1EkOA$&V4-!^VpEMUnjEUWE zj%n6vlYMKrodg=a84B4oezP0!zM%oq=r+(i@I#)IAGorGcRr^7tG8yUNj8mq5@mGI zKT2MM(c45%2j^&F#dGrPB<;{n#r70h+YQZ9JhPzKeRs@cK0gkR1j0or&3?&;a#ek%!NN1b?B6egv=;hc%+ z=OkcTLRH~bWWQ2*Ow8QfO+KWmH4A#63w`oz)cfPf@uvBCRCfH}m7E#6Vp*Q@OS-a+ zDrVa-M(KF($C)5${kBk`Ny4Q|J(QC#3mj%&8qNuG-Q7qe{i1vsMMEF{!5t|YytmbN1Kd3IY z5~dIeTkYMoMK@2!QGv&A_1bx`Y0;ZCaROp?4*#Jw3a~Y6EDbHjDXF#c27UGGkP+b6 zF6ZDI@ou;-Xs-CKpZ(+A5^^IU@Q?Dz=XY#;xxYbeG0y>KN=m;&+MZae^LK*c=8?P& zSm83KJjH1s{SD88#wglv`IYkOYhPWWH2Ud0ntNoJ5^Rj7Ot91qH9k_Y;DR|%uLg0% z6M=Y7)yd@+@5-^(lchL`xNO0~GpCdybClFzp~J{@VGDbEHe~2^w z?oJl_xO-0fSsPKLoCVOH?d&6DM#n6&N+##mMNYr%#e>uYhme73~o>@=`gWSV_3 z`AU%EtNzn^Y13_cP>X|9CkY5CYxzJSbR6L)t%3R$_`xF zWdX)7m#jn$s(__OsEKZWV*0e`O7R0_Nd`YqRpI_wgNGIkfWztTM1xBPw zpb;tc(|E-Mv{!OFN56#U&60SoW3-X|gJkV`7J*IPdk} z^7&r%0^h4vdHGrebM>Y6@9GP_XYk#IWMxJ3GO`_M_p}Ry4PXthqrEbSLe|dAgdSyUjR715gNk{^uN~-UNP;EEEr%7WlRU=GSwfo~=+l8k53d$H7az zG9*zhEhQ`A<{MtBMBrFWHMGbQK8>%TtFUdg(c8%PZ8k;+H!t>M0eV?TEKf| z8?oBT08&|c)_A5uy%6$vx-)Nv4%FI!oNguR?)xzGXQ@cfQ zbM}Af!_TKP&o>PQvc-Ibc?13P1y2q|TetxO0Pz3#_5X8Ag8pCVlY*PI!M~BGCY2xZ zB!c)gT~mskWw;_VaCn6oty1rMp)L{${F0w!lxJM*8y0f4dWwUz_tLYiusIO1Y-oc- zK1wU;vbeA)qr|2*orhLuc zZpDuMjbj_*BeDY*E`+jS^M*&#eL{U@D_20(QDU!uRHjijrALs_7?sj&q5C=9YU{Fy zr0%cx^p!#{17AV=`xC!bQ8NuAsPZ&Vjf#>bCGJOyrXS)VZIjfXAS+3UXO_|w_`^^} z#Y;4^HwI=XmlChYK@@c{do%ZZ#;s=K4wTdthzI9Il!08Wuyz7zl*i0x@JY!X$h;#`l(LZ>QL)S|t-kBY=` z(2QJNVmPSnlLBw42?!eI5{t;{E$fn)8KQ_PxpTAt!>uJx$G9H=JFlB7$35B?%%|jk zjdhFojvRVDGzD{oop@B3GTn*2i_uUa zj?M55lWpoEay~AOw~}JOA&HCPJ140WM=`P`a;K|OJf7!0%muLPr<2m8x;2(FDuUs3`VPPJ z&hg-0Gc`y!l~!%5Ni8HhD-WM5yGCuku$jTy*b+au;i1_;8C&}9Mduv@bQuMf>&}8P zV{P;Hg8GT`2sQxN-3TrpR9Ws>(2R&xsp& zU%7Sa4}bCM*|cQirVMrq=#qLf@(G;;#E^K1rOTioNVN@%oD3Swgp(b7cE^@1v($e# zl1-&s+gbDvl_V0PlFsWXhwD5M+up}74!q8}H+g@ZF7hN6Q*?W^nSAVt$m`Q3Rw4U&AkHHR|BE+Wk7(-<|DUM$<#P2uhj%WTx;8Nru7sr5a&lcIK3qX7*#*rZ zcKe*(I&A4 z9N-`tS}dP!DXy)#JSxCU8JUgK&Yn+uDiAG1;#z9rjN(N z-~YvcNlu6IiCocQY6<;$h~5Q5ue0JVjo z)!_USzBp5je>I|$XiwJ#Sgd9(x~c$#wW2({JUkTKe&EtOccZkKGAXuQngfgaSyj4i z{z^|~ugn2scSp|5-)tHoC!X<#_|4f<4yi^e3zkWNYd4aT3uG{O~I$~f!ir|w3txWrZw8kx(Z+T?f=4x+!}Id4H}>Yt+}#AjX?BPndKQ{o9^d1x#q&( z+<=V?2mBqZw@x%nC$uc8afbz-?9KofO8eDt8!3*4!o112i;u1<(|Fg-E~Bt8n`TBm z5(px(NHbET3GS54q=aPeFsK3^RQK6o5j(+eFDscsO^G0WAE+#$#V?>Pb}S0C9FcEG z%?%ab3b1PK_hbsUP4O4+2@&zHv=xvr-#3tq7;LpVy(mgx5PCg;s})xtXj|;9d5u1v zZK>OwD6i@Fw*CXrF=%bDaNnvh!fz767&Ww_NtT<Y66#i6);@_Q-~9|R#Y zNY+V2;x$qi9PJS5zl|1#)FJAv%jr*Q0>Y-~6c}ZYuxnPvUv9SqSn;c|qj+p#$Vew_ zYG;DrG^Kaipma^VIn$zcx z<}{nKB8A6#nbM~g+}6B?=0GK*+zcv2KRZ9R#~(%^HuM<&^^8rvDvi-1s*-E!^?Y^u z@^V$!2X(Ups)_Szu%7^aBnMQW_M^58!G|o*;o?UY3|Vn`xg@PzIAYOQ(X^%0?EZ}1 z^|RGBJzc9VX$&m~`Ki#(=nQC-Eul?3(D=r|?=WB>n=3x2URJ~d;U^{ah1WBHDcHiW z{|1-DKQVrUEB+N(2;$GD;Ft{_c8eM{Ew{ zfg3B{Du$s`30u>!%gGMNX$gR3b8C2;GvK#*Z#zCVcrgs^s~8jI>Fwwk zuAP+-U>3xOpDeSuLbV@cG|_>ileNU@P&1g&x_!t^g7<|XPbREEC{q|}5(Y_T7(pZT z9J*lj0nCAi*9~BR8OB#WiTL-iqGgIig_R7)`Od)_;13@!#@$#W3qpufBXgcO(FtTv zd3Y(0)Jd`D_%O13O9)G4R*#a^_$K7PH!P{em!$IvM?-)0YRUZN-$`F=<}V3fHZEL> z(n7C}XW(tY&JnWS{@7DSl)9Pzv;-^BF;wYDH!tSgRt4aLG4T)9k%h|^*#ui6;N~sd zJQ}=_Sue42jj>;2a4J!a8DqwAZFSfz|uxOV|wiWPDStsRz`jj3kcD|u?BuYT-n!V)n za9H{N7;=b8(Xj7T#b-P@IYs_rgB1~5L1>=K_Bngy3OL>9643Q#%;-BI3H!>PhVaIg z_e7AX5xJ%QK;6n#a}{`L)GdF0Q}WR{U|?5SYjtZkIfDQxrCkCCCMAWXUV-zy7Y?oI zqwyo&-xEtzMy`12nKqP(4^AnCp|lV!UfyLu*P?ajeSH5KLONBi$}wFI`i^luw+Vl? zBxkTZJ^+g`W)0+2v{1U_Zd_Y-KJ}qo$LYF0p;$ZUm-<6}F3fhOFJn_=$#Je$U%6?= z-P6!<91qw<;Ql8W;o*K<8H`O4j zv%9*kJ6L8it(TN_VSB+L<@E;pNkM#N2WO~4sN>};M$o70hJj;Pbhaj%%Qk zjMXOWV{z?riP$w)7n5u+XXmZvM^y70R9NQ^*KSt-T~o-czQ33QrqBl0t`99>n{#8! zcHcLq;}xIPth-I8ay~#J+9k(PT1$sMS|~P1ZJK5;H}CJfI}PH=Y|39nP+4>!4e|W` zrywvlf$Tmw;-dz^}M55 z#3Iybj^rW7#ni^R8?hbG9h#wy|3)ZnLoFl_CEr2~bkKtjJ`q1}-83&tJyJ}5If?I6 z&r1^1@P-e(-gHH2xB$6@?dK;p&Ky3O2ztOro?}3g2rOzJCW@a!)UQvHRAAsUk3<}A z`s*(h&tQlOntH)CunI{CE{=ql*u(;8@W%((GM@c|4$5AkPHz_+6c{#%gpK7lq|eWQ zCd9^>BCI}*I`1l4u%QniL2<>+5El^*0XXy#e^A~U-8MV>;1Q|y)VhU+C^WFaFCux0 zB8RCKI+;M9u!G>^-v=djWS*Qo#KO5O2&2B4k~GboA(1DDOT*b#zwD(I^&>qn!3w>) zh2k`O-H4V(t#?xB`CU^r+2BAAqy>>Qv`~b+kOZpIHAjfRCIrjQt1`5Mt_~q4S!vcYZdi#%r9i?$@I z&jEAS_QI+3Nh*e8AVmNt3g+2lOLs?#gtoWC*NbLePB`mN1~-pC%#eAyapLb&3%~So zP^CLV2{TUhBl=nNC&|;?Xu_CS8?|!4Wry*={#dhB$FmA5SgG*CE~4VA&k};acSOQ_ zUT)BgA2+dL!uzBr^>1iS$+iTivZuuJf>HK-XZ|BWb@4!K4rSo@a+p86yq}fuV*}}M zlQ8j@q))~T3*I&?>x|BMbF~f^X?k|V)l*6}$}U{ygObWlTdRU^(|!WNhJ*Xp~}u9n8$w&_udn3JBXzha9D?h<94hI}Ya81tR^)?YskvVK0=;OyMF`fC~{ z`epF(jt|uIQM>~!6)}-@mv>52N?kIoYFcP*PCk}!ij#t7Hz_M9e|?YuSJ8BeP|iAb z6=$IuGM<4FwcW&-_lsoEEcybyj^kZ7&kUq-VCkp>Gm`Ib=~ItD3$5<9yH&EXk79JuNnyeKID z$0+Mo3%jt#Oo8e0(W;>CiX^Ls^ELodXD6{Px-S0GY}E|8hN(KrGA8zGD&YcWg^HpF zE`q$DxadE?mcdWtD!o~Pt1R~)wL2+Ws#dLsIIf%IU79>GA|tlqw4Z7z^)W}Nj z-%4B6fAWQ^AHG0Z1a;u_nOqI5xo!nr=%m|$8J-VrdPY>2CmL0F=GNmaBJX@KXtv1= z2qdt#xxc^ZAp(=r2aw%YLFn`KX$X6LOo^sdRScC%t4r_2`t1O@|N1yGbn&AF)=UpC z6zOPaO()y3V@nlB{G?)k*I73UCng1KdwYEWZJ8?U@!zjQ3(NDX*6GgXzlOi^SSaD! zR$)=7FM_s;tC9r@>i+6$KBxU>pa$w^pk`AD|59aHy$_@(|F4u308UI97D+z`;ZhY+ zqc`!-K#dtgwq$iYqo|kle3#TTgKtcGP`VYL8Cca2CnOHs_wEWCe7NdT6tbjUV3e)W z&TQX>%zhr5Lhf?39ArVEaR=cBC@_>D<#Bq%t}N?=bW5;-Fev6Ynn4KH%;9}y83t~L zAlDzVMu?eaJ{rhAJ_e=cNmhC`iH(=cdaU$xPvbFayrE zP1wJDorF=rx<`+Hd>sL9S}s}pDk-w7EI6|F1=O@x=p5vVxe4EEZhlu&9@1@w1G&MS zsybzJR4yj0(DppGTz8|mob~t|BC=J? zG4XdM)fx@_GLvsiOC0Z!c(r#0u+ET%5@s~m-Sk(gbg`#?UgrcVet)5)bpfqlvf%(j zQzqAdxLEtf%;~OsHO&wvwP@OsYhegQ!w$wAa;MV;io5uSr6|H%@f2A)8Y1jbkt)Ig zDAhYiizNh-Huc}a%hrw;Y4Y;|Pndj!9mXvyt3vc*4pCck)tj(tFH*qFm~E;wri$KX zRlq@oN|4iW61=0I_B7%Cumz=1n~K{krVV@>*^}nzQmX!C55xS2)RlgihOoP!m1#wM zzu)Wb!hYL2Fk-|U<8IYhTTh?vUh04Cz8#T3W1cZ8>}~JNOxn;r?vugpacHtJ<(yK; zi7J10pm;adWdQ*D-#sPQMry6qtoG^t$r|naUN98@t)eR99TxRYoY#*@Az+Ux#Bhp| zJJJFtDtGN%WG&Q9%9I;2cfs75Z*IMl$~_;*AAdhezpq`?XeBv8)h-m0$gz-5I>`3S z#y5d|MclB6xOols;!}vc2{&yzUW{$K{9=GGBIaZDquRjwb)ATTDG3-Gp<<2?F ziWpa7(+d1%_U&lGDbDR%#OBvWzxrTx zpK9MfvaHQ<=FuOv*;<12m}(u`d)j^q77|@9u*jwAQyz_*c-mMzBjsj40T;Y{Tm2m4 zY`z@kPkX!RgxO<;myK!P-u21+{x6FganUnnDWF0RT(0|2XLP zADO*(|Lw@*KQ{#bdBVWP%F4#tf!a`?nx2Mr*Y|7g zm%b;F-XvlG2Ic5RPF9iBX~1 z>CtYHS($OMF=i54a;i%VmRX_kuxX)LP%a)^#9};s>AUF0dP7laR$- z9qkS8mr7?{R#a40)q+pldyad{o^Km?&h#IC+Hhxh0#mDAC)&B7`j(iqan=^(dW=vt#vMCc1Hwk6DeLJ3wq& z=w_j{DKL!fPPGD^f^E_H!O0MWMMKNM-RP*FB@heK)@Q@~XmuvOG$|)tvE{jx650&} zd@D=v5~P-Q{MaN>VB}rB9#V{`_&ZDQVTE%`_vAVH~(j}xI$zEN4b`O&D(7#^N zJ>!O98M*ujQ))Dn&q=kAm}Y!{v+*}9wZFEfouN@6UPT9rJTsdu)4f$q_;g!1^%?i* z`stT8mSYA)3E^$)u`1e!7r9kUwRIAi^PscMQxS2L_G>A$P^A^b4-1{d30Yo<3=)M9 zyqs_fPx=Gd6GEWI3Zht)Sk{P=%8C!4Xqug=!zq8^!75i{BROCD2e`}0hfJZdT{4G` zM}TOBiI;lL>e5hsyC$&+Vm{qguoqPlsP0X(k7=Jun<39<>PrB=YIA2t7vZHQ#s?P2 zQEz;RI))@-&Er~^sU{YkmwNIb7Ng>2U6%>}5fx1oB?#DEm7RNX#Q!Z}s^vPDOVod1 zP=QHqTKf8VqQ(~V6+Jm*!k^c~-%*=+jF;!Px!HfA$~G(;9%>od#p8i!{@jCLNh2a_ zu0mK~HDuEnHtQ*0gt~K@XPxy6)^qed`*>Zh>$i7GFFXbG0C8>Ppr_oTI^yvDU=gH8 zqkYpKQP)L=UoFa+zL=0vG4ueBEifu$eNe)_DpXqS>FWY1v8JjCtsZ`8_Q(*OYh(U| z!xo{Usnqwi*ao)yo40=m;bOohgufvlF~Nu4d9;?Xl5WUeKf^?f>={5NRU^BSkMc%H zP5ZXpG#^l?d2+rWC{&0SBIoI>gS?cS;06m<>UIHkuW?Xs_Jku}$Hrs8qeh0N{uK1? z@HSJ_0|Zt+n^;Mns4?m{uB{m^i)_@hwjN5&79)u9lpJAYDRPXDX8U(!`YhenzF{tb zG3NlT;d^Udxf}36u~MgytGWUKr=G_E#%9) z5m~YlzQ47d;y`g=sfCTdiHhuRD&_ZwUJ1fIzw8zHRm0=8yEp+NG3Bdss%hU!4P_zl zh5nU!Ga9|i?<+3y708+*UgfG>gRUX`tCE}94+CwSPoh2caEL%5Iv-A8Bh=OP77AG= zvVcPITZO}Wf-)k}P>vqYChG*_fjVG=l&T(bt$U@ehS&EbP6f>k+kROmm8?i_AyU2p z+})gjxad5&PP3E^bGc9srDJx3LbZw1t$np)S$=2jrL9_eMx*=k}P6(NUj-?>EfTF&lMA>PBgPGFQbMiR#bk?UaAiEl3 z(MM8VsM+63nz?iqY|(v`+?tVq@Vi;!*bbIwbnQadB!o{(F+u^&)|!?GPTxc~q*lZM z6?TPDPxB2Za&OjhRu`gSTzq_uRC;0X`i0@GI_MuxY-)b5LFfbVv+_HLqLo){9Dgue#Y~UGBx&AW1=NHH>Ml8*MsN=FBAeM;K`4n*(|)E@s?>Mt5{4hcTiwZL4V;PAA4 ziV9^dpPw@}m*RCP2XA2Ci6wNON-kZC!s_V3(nmYPie>`i%jd;P3T9O8`KcO|+c=<=G0D>eaewXU% zDjEn|``@en77f50%TenWJwtmSz( zWrWq!vS&9L`mW8dO8%#4U7BsPA{^_3H1(P-D@t}sw1o)dGbR}GY-&qu&e84z9FP%0 zn6F z`}*%AgWLA7GXmaQu%wtb>8W(*5hBgP-$wfkUNB7dy+c5|0ikbV%!l6B5RKVtRtIUv z%0o|$-Z3R!9Yy&&cdPP&<_z!&C8~|SH(+y;szr~?fV*C^<)=(@?QuwDT}7$N^*BB( z1wACi__ALSTNPD4Bi_Mx5fu3u%1Iou_MAx)=oozxmY(;5Y%fuL*v+>BwE|AIc5QRv zE86-#3F4s(!$Bi^racTyEzAO3B!ggxHL0Ql>GqmH!~OPn2bXv0e#^U%Ujtev&|9i1 zV*@6k{bcqGA|5eFU#sRrT0*+o`(t*U@jClC!1snma;vtROjE&3FGpl4jC3wyZZ=F= z;JYpKH1xO(=-l0!&)0pZT|Ir04)f0NIQHAj#6oVL(*h4qq~KNPK|M;~#rHynGrt@? zqy}bk<*BdJ^J6Anx$wiFSR@Nk$E8x$QHI)+ra2!}0-ru@i=!zUPe=vEt*SsSIvf4{ zfKh-nsiYJKA3au1*^lN*fZo3(8{mUK@koJpVXBV3D#V}VgWvDO*u2RpPl|mxuaZ&@ zfE1&U5Ql$V!gL>yV3i_2+1m?{+q4x}POcvRk-FtQH4h;;Nb0uJy)>b^=}Ef4H@}y% z*YEhG#$-QX&eiO8%sqwTU5TcON!%9PqN=sWxz!STjwl2YcS?Gh9XN#tvKv~)zE*b2CiCMY*=x(oKRZ4d zp_o~=O$<{8H|jzY9SVd9P^X`Y?;1sEQM$R))tk|T-s12V8grKm>t$=g?}82r|1a`T z6PmV`-YH~=zyX5N5wG_F`T5RsxI0@4-f4de>)t<0k%2bd5w;w}mq;!1^MvzAEYSM6 zVP`<`~`!jRq!I6_5m76lu_D<8u4R5WADVoww4y%u@g z6wn23OAlkZlP7Y&cJGru^-t_(#GRqheH=w5p&RmQ>x|IdiZ-N!a(mBADQVsf?iXA* zb4zgk-n(vvFI!E?B0=Dn=EhIM@PvI~do!>{E`zZMB{zoohNaSaEs&<oS5Nf4*opz1M_}5kuD?Z^GtJuxm8PT%VKm+V?p!HQH?wGL4V}JJ2?Ly=gk> zsjY9xZsl-4&dH-AGcoC00IDuGR=g&dN!1pm0EgN6a~6B4U8HCd*xEofv7|+!NVdUE zd)cNZBj2V-Iqmgz01Prnkl^BW0?%PxJaMT++MDk5K^RaEjz18{izi!;aO5G0=tlac zbRc!W>ILU_8k!<6qPz449$vPUK$J_qpiHA?lCGDaFH8X^xL$nER#{U&8K- zgi0iyY`h#q9leEcvpuqQ*=oSmW0v$-hPF<^tJjjfIS`*CV;wI&X!`v}MwkRv@4whM zY)=-4rCe`M)Z{sGo~#ZVorEy9X|z%~m_NsOFM|t3pnZ$X5M$0_L(Uj+$3GhP$8&Ss z?CYkgpZn<7Zj8r@2L~Dl4weC9in(9%=Tok->jyWC*u)tYt;af?_vdzO0oOgm1R)UM zqcY_Pk*LxO!4loCe~xsp8pxvMK&?(hqBoe!g#=_*zH$7zNRVM!%xrJ+nlj{XXn3EE zv2@=;D06wQA^}cT7qABFi?<(<+kvfgqaXXkGBz^7NbrJ5D2GvZdYwNlT@jeGASy=o zHD(!=d1~Drx^?^zOs}JSOv`@;sZmvvBex;!x_i$mFDR>oDD!9A=-obZdACHTpU`i8 z%kf_rnxPY3TS^lv#?%{DAibXCFk=*TY3|>{`}(tLKtUllgSgUqgfpg23ATBh-+tyX zp;FsNd0AmWk%7=-#;S1%c?)@R#)A>d4D=yHiO-<)OYvMEs*R69*BX1jZYCjN&EcUc z0&>k*+7CG92XgxzV>=LeGKD^jNZ^tf;fDxFPirR?0Q|yNp z{vDjE0)gBHr9!9=)dujuq1oIeNe!NVS$Ja@lEMmgEb1UEJm5Puv=R=XD!$N{pZMsH zdwtLryl{~VFI*3}W>sq(yXb$vJv9LLezD|i3tGKx^sXgx9*<-OXx7VH96hstCn;5d7wWaNQNNEL9VPPgUk{Dz)> z9~gCJJQ%jVoPgzG?yr@}R4tDGrjJp*lgj_@DY`%1RT`~EWC`!JYk zN{7y8oA>^4JKt4sR5zCBQMg#Ih6jbl>0RTwK&~RiE67vHg!!h`n^3FS>chtjk7!dD zPM~;M4&Az$b_h-IFuwr+Nu66!vdOzctx(;_cr-B?mFWDhImiMU+zBcj*_7Ul$+xXu z#vId0OFTn$0DW22RbM=wwnDaHTWmJRYuwTpJY8V|nap&&cE=BTqjA6C0MgeAXrBb{ zQ2rhN2eqn+0N{@p5fNNFC>a6ZC)$oDO`9SW7VunJU@8JjHG{mhk)HnrK|sF0QHPK# zdnR0;XM+KYWIoC#0(4ptE|6pHf>A1>Kx1zWt8FL#PAtDrwWke`4GL`fnX%`jNYv%@ z#?WALJh?v|5SRN%Z~E!z+vmFz6F6wzNt8bPrvCKJ^)2z)-m|Ujm%A6K4k z%~>)_@NUipE)%iy=$WGsBvJ?WPZxa<#i*-#ckoQzohBqlyX@~RTzg@%|!(^ya7Nz%!SU{d%^ z{uPzXC-{p%$(fW>Ez9D0g!YX)Os%#?4QD(2I6dZ_g-i#=ghXGHF8b#WrotOnOAYI1$owh%d2b1GEIHnfHIbC z^iJ>166|W(WaLYFNKITz{YLzzZd<3jXUSyBAmz`#F3YQxGSpA$33RDe@9Y6e4v6t) z>n!H?5eNP5bB)kaxO2#JsAoB(Eq&-+p*el)0`geLp1F*>4Ab0*(3{SMV-rv)&;)3& zt!O`Nf9@xCW05bbuR6TbrQ}z~PP&Q5&3;?R{GV5(QwXS64uEel_ua%+vfD+94pBi| z`LY8|9)0>8pC4F&u&ztQcHB2Mg(!D}8EuAvG?8U^blDRD^IjOfWUtzzSJ##;)w)^n z2O3ULaBeJU)y3dlwc^hrWa~&;@DOyiAyT~Q%wLj_kmm%s6kuDp@>NM0(|>cpuom?b zoQceEKaDidkaLvxxYCJ3I^{6NU}06}q)Hcf&l+vW&>9f8v-O!Gp_LrQtC>wC4lJ?r z72C^-UhB?i=ddB6Uo+4KX&X1M7G{W%PZy5gna?Jo)XR3HhZH8)oeXs-0)sk=sRdHL zKR30da^0<|1u~SB`z!Aqv(EQEw;vAq1x8|S!Kx}wGxtpc@md-YJSaE#0y;!QNx?#> zd?pYx8&Y%fD6m3(iv(=?D>3a(A)4?|LLigtvywhz#cGyT%G0p09&F6je{EG+TA?Md zq?V6Xk+CdjltaR({w!tDDvi^HM*>=?Mbjy*DdTkWoXJb_>jf?OTq0L3TO3=bD>*bz z7Na3&=AeZ1MV8dm4}U|}>&+W#g&uEnJGOZh*?`A`?2L7eR zK}hZ0fS+#~LWobODZYD2_;ygLJD4n(uqDk<@>Az1z_UM#!;-z2R7_}Pwp$cH8vWkj$qtjw;~A(zgppkc6eUHVP$fkPRzYsg&&O@6xgxbbsxEo@ zLAetFDgi};P;Sl#i`%XijRzY-hJr}o>S}K8d+~jFxzaeR4|KU_3r@O8GdPeL@-$?t zv09z)uZ>}=-8QJOnI@G98tU2YHLzn(zH7Pr7@cZ4mwDSX$bh8N{KF^IoBR=cP)ME1 z0S!^NK;NF7aMqFi(S7bji|k@5gT2ml$NtxS25OxQ!T zboaOV5w8Tv(}0H8euPY=dRED|UZO=&v<;363l_#~qYVq{_rel1o2x=&{p9U!@8nGV zn|U|fMiQROWv+sZ)p`<(%3jJ+!rPy(2AlIai8*M#rx@Kl*U{Vr& z1m~dgIgOHKq8cZYn&X*k^7EEMB~?1L9~qxx(49gq7ID zVO4-7Rvq~(c$!kBQ+Oj-Sc-43f2d$OQsyNF2oMk<*uPRirhlh`GIqv>)&Nga6G0~@ zQ%C22YF$mTuG5AHTIfzQ?&O^~pAI`MDKNXj`Fia#2BsA10-0P=slz6$IahIaqN%E) zv9w^K1)w-x$ckhahd z=&?4sgCGt*8NxuEqVzuTPY2}@9h8SxjS(T-Ruq#Cyip?%>GF|ZxTAR3)Nsf(g9GD?A$xDWkFL^Doxs;`5hsqb+EiZ^1gXN>_PnbGquR&Tg@W4K`Mm z8{Vb#Tw<-lzjPp;J#~abEFZm3ROExn4?!@r0d+cWw+K;vTPbmEOGY& z&eOebaEi8DBq@$EOS~e@xhkuubT+KtENd4msaOemnom1A4ix#$Ldz_l*HRY++!!JP1AYdT7TPKgsxvBehJ8%hh^qnxRIN8a7Ll*@BLOv7aZ=w8XMa#Az-riYSK@xpVV^}_osfk zZ|o}3Am`9&y8v8k_#Rt`ZXtu}f+hxTyI#G&@yN+8b*_&HlI&x6F+MVCb3wsFLQg4- z=$S6%XZR{RhiF}blB6f}oB2@D>h1?|)Pk=x6>D(KOa;BusXxn4qiUtk*E%8G|0hPs|(=7LGBrJOv@#D!tWqFvr!tfdAoD2$lo4pFx3uxS;=)S7H5k zUPTOG?QH6(Zei+Z`k%D+Psfs?rmK#linawB0B7jWrVt4aGG1p0gtQ_1@heUFp8{=EwQwPerJ3*-KRk%GqK9xHGI^W`bW9&ysq&x^Bv?i=nkfWZ!=R|vvU)8%p zp5op_iRdc~Nr0luQZ#3i=s?oV$Rg_Wa_w9h?T##Gc=2RWCUfo7gcJQ=7TQN9zSJ3- z(sdI<6_m#Sucn$w+#p{BWsMM%5f`{B25rWvu4{Ywk77gY>*T=Sr>miXec3tYBJ%6? zk4I7t(r(ugv`M-4>od?!!W^O5>N&t}8wRi|a{P;dh8-PADdwEDIIF)%(c%i>&82g= zH`+l>$|`ji@b=bYFKhPTNX8H2qI9v<5Ao?Dl$uXs1Fvh<+F`{Kfa?B29Ogw7l zwG<4B$VR|Mdi(yazlR|!GN0O6Ed?u_RxS*jXEwW&rdO8%ajt;&$&IE_OnzsWh)N}= zrRw>pZ{$=~nb5hiS|Df)V{#oHKP!&$g82L5F)VoX+seRg<9u^m@k^;D)~;}F2NN0%S&57`6V%ln6_t66FapdiW< zhGk4VcyoRmOr{)is!ofK-?gi?xISi2UeHRB>PC`mM^`8xx^%mKZ?@Poy`P|OO`Mg9 zx#XesROijkN|eBfSw~0#l6L z+JqZI5&+?Khd0g!_;Pd~e3EB|e^jK96oEYQ#)3cR>urgT%AZF52{qtoikqo!I$e66 zPpQ$p& zCpKHOz9X~Sqp>xJ^|CcYe;8XpX`A+Hgu-;YrB(a{o_xio#wTIyy`mynkRm+me@xGh zLB#;*7A;T20q5fdeC@q5xZUbzG;Nq$4CK{=Sa?;_pa zmAPMo^`vQ{c>99a3u9+wV^X3;4O`zJA@|N9o1q>OAK_UK2-gh@M`~S_Iwd;4lIt7= z1~=Xm%RrQ<)@{_y1=PJoJjSTk@5FIat%?u$)W2%jg5K#?Amc+kg7OW;IPOR8=fr z`Am}qh7_&e#B=_z1;7v{$P_B|LW;tgTCS}Crr-d{QW>)3LW*nZ>(1?R%*{w?%J*{i z+E3t{KSbwVW{Hvup)IEee|^r(Tk4Bf@6l9qZ_gj#zMNN*SPlesW6Ibe2ei?B9bOJl z#682emvC<%mE3biII6Lsgph*Ww&dwy2M{wja`f!TBJ{AMQqtvnN7eBDSYxO%WBbEK z3Y&Ju-)&GcM3WupL&pjGh!^4CFpa{6$v7i>bd4E;3vLgyw0@`kgz^ zh}u8%1=>buet zfROIJh<~N?D?7|gO=XL+RgbCb?g_9q2%yVyC#=XZ2=geY&n0iKIj~WhrknS3>Yuqt z^_Urhp~>Ey-F!ccfm20k17zRPCYd+*>3h}%FE7(hQt#$bWPMEIPSzaGm2 z2Yn=9bsge;cor(7Kt1;e-&F4C!wX<6&Xdsi1lQqQq2SPNn6Z zX3?=4A~@fWuH90m6W`Vq{{yVoi6e)fvNC=T*vSAP`bZXN5ERFgj-zL|smwfEO=TU+ zBKL1O;M$ID?2k6w;8eY{0$Xep3cp&4C%|`oB$~EMpCk)WV+}xT7V@5fqj4!cpK6{*s&BNeO*?k;AUk=tG);1B&J=jd z31H2z{sLnGs1htM**e)js**}jlKGsv?s9!no|TdxuYrq7M6+96Kubz zDk7ZzDDsB#tL3=#2ANw;(gJNW1WA8r51Km+%{uwl!wBtY zRSIX6#7qwqRFr4dAghTeNJB@UwQE`5P zBA*v&0P`Tpt%P!A9*J+*@1N@SPWqO^6O2tZ&*gUHZ;e8$xPUl&rxulrgQ}*m5;-rC z(0%2ubWKRR8#SFF@2*g=y6F`6AeJ7<%AI>4*N<9I|L!)NjjnpHUwAJ_U)~T~gQ}=c zX^M6@)Xt=fE$G}>$1{Wylsh_EJA5UJvkZ`VUbm<{5kS6>3#+p1$RNo9!IlD0E&aJ-+4SiU zC#_)F^vP6FWGA0ij$iN@SfqW_VC-Tub%~vJ-#<@$R=t9ziI24fT_FWd9HY5p*eR-ldd*ENNiVt_4 z8%p18K5AIb$^12A6IWHiI~Sm`NFA!QqF!(;71xFdjS3$+!Bo{d#^Nw$P+~F)c)^#! zWmH))q4b)H?@X0C#|fSCa2hgj{u7a(7^_lPi_H}aOUtWKS~EQF07+US>B zl%a-m-pS1PyGa;7lz5I7-2-3PBf@)28j6}!N6NDZLG3#yol)+WASN)}(wV6s4sjDO z7xENqmt<+9?8~ayDW#po@CyhJ=C6Koi(~CVb{HmZd(g#y!1Z2+Xce> zsV`ArrisDqcsgco{34ug#wASu)CU{m870)LX0`h7>|I8Er}0F(SJLa+TY+*fljzB` zz+1AfX{Y`w&Hx=kUs}2!tyi3TYj9N=cxoA2KB?DY2iP-L4B&&?g@+|8i0-VF3e?>2 zGNGUu*5Y={pJRrk=T!@7MT%v9opyMxwS#S0$owDjIa-xmz-a?7S}{`Se>@c&ZDCcN z{KTn8(E*^N4uJ)As(sc-w=Sw70iYaX47X`p%=S=W@VJVjinzw%F}Y0kIBqPPto1-i zY7Sz9yr3_N47Wg~p`xJD8f^9$!f*$jSv-TQwLb*>fa}!onq!PJW{BKox|iDu@MK9g zi$wJbuCG6wfKNw@^aJ*Ge-BAp)nzA6nVx+wl@J`8U_AvjkXnx>3Ds7a93DV6Qxve? zbkb>-SCfOuMYvxj3|^7W>LQ}To2|1q7>hb&ZrAX6!W@tQO7m^^PW zJ9&03+1a)=+^D@|zVrE$FG+$S@id7(y}Wmf!yEtuLlP|OdVD#RZP$~*?B)99{RU$I z^8lSKq!xip>L_`Nwakzz0y~nF?q6W2G`LKHlD=RsJJ=M81GmoQ#-s!Wca}0hrGFCo zz0P=_djZ2-&+Ar-tdxczJZc*}xD}}gQ+%a1mZM-hTD3|i?ETyIYL{+M=h?m~2ndq) zr!?HJE_3M6=fJB-@+U3LF;P9&;KJREP0jrUwHv133^r8M1iDk>&3mmmI3SR0iC~ILR^qO+;!+^Apw6O5H7}Lp^_P1P2y(VCXE~c~`bj1Xh{@ z+DZ=Cu1`5)T=6Kg=jRJV$SHKszcDC3{6jVIobt`w2quyW{OoofI&fB5=bfp7z2JmL zFXs5sa#PjM7+5#Ul%Gw8>uCj7`?;N7l6lYA8Q}EOT_o`j6mz7dH98NO9}Mew$LBg) zr*Oldh4n?j5R1F%OcL7W4B5q__I#c>7G1)RNK~hyaqn718ZCVnWX+Rk$vapmRQh}u zhEWswsC;gGyM`+tx61?IzAMg>mLeoOWSx;5M3gC6bAbSva|&)0F;Lw(r-kLVT3aPI zSZB4Hr(_zo)~E@auVjVov_otIr!3Qp?P4aq* z2&nFPn_*#WJ@F$|3F^GUtwzc86fd92JaZI z!=f=uyzCLqgpk6qLzORk+%xGEH;0Z%!>6I3d2^cN^`kE^24a(GC?FCq{d{UtN~=9E zrf)BLV;K^~iWe`9TJxkey}#Xu+IPL`Y1H zD2Q~mC|=|cnxcZ@uxA9Veah;X!>hiG1l%W(FWLaK44lN%ZSM6$C--EY{tW>T9fRE5 zFvAGN2vLDwMa;94kQx?#Fyk?lE?@^x+_alC`26W#AiXXWpKG5)hiLZzav z+jWOw;?@xh>}r~tir}fCdri*g^-R$k*ow_)q{d`e8%f}B2?#rI<_)U%TS1`Fe$LI-R?#9 zIV&$b$g9>{EN($ae&9=DVB!HiLMZEASpsj+f2^-@Sj7AH-_>ga{#WbE{r|So@z2Vy zild>eleM9<-G8q0aE6CF+7aGpZ_?#8&E%m4VS>FEVODTGh$p~tPutB1A`i00bMJu^69idjn)$JYVjFxrQamqdoyL$ zC`krrSVPMtznST}`RL@kdGZQ7`F?m+1~S`6#hj>j0z2NnD0~f#*4C*vEQ_LV<#Nb! ze=9}p)M>-(6g|Q#d`&I4bu)^C4OzVy0J}sTZWVpXk-Nm~b!)%HyG(UxMSW>g@V}XO z%{}c=M%%$;<&Sr$L+X@Ad*Qwl#zcVni5R{wzIrtjB=@-*610CuM2_#e7jMBuvxM)k zhs<*>1Q{DiOt#5I7C9<%hpNa!7kNyLQ%e`)E2=y$|8%WXY6=7p`LtUZlJWhZ05BFWB-9fXN`D zoOc#hT=DFUfa(J3Le zVwb!dE@@en$E~z4O$)=LN|stn*r%Am26Zj0_4Mt*v4Me(CeuX#Ug&m(qSo?@93Sn{ ztiwy~m98-*S0Udjn%WavjMe?IN=~(P_<82}qL-e~BxLu^Oqq1;yF}J8D!bM@OF97hvLO)jE-_Gl*A%>NR~5W>$f^rVmBJm*Zp>X-$aZ!rds-Ro6Q=h#cD0dq zZ_F;Zb|;cg8KSA1${p4Y7U*V<@g~ufmC2XV*f z9!r`;Cv%|;8rlVrYmRbU>YZ+XyEQVJktz}2KFa2HmhvpA*J6gciz@PZjQ2$DdnhH z)>T@!6r@AGW`y978Vqt*qRw9IylJ_7{9MhP=GpxA4OY}qb2wA?9qa!q?MVYU=WLQ| z<1Iak2?+c1AOrC(Zj^75G2R`8&Omd#wfQn(d?$O~I6hK3mbl1$UC{)eQKU-axZkY2 zUU3|%a;!Ab^0y4za6J-h=soUWvC)j{nk%Iwo3=(YR~liAuFwu6Ws>pX5^Gl7$9u}4 zZe5L;GMVSjP;!?;9PSazJ@vxe*X*k~NM|+6t-D3vUJ|1$U9hp#$ zylO~6COpfi!BCE@wTJp-PihA6q&7>Q&^C0;)gW*6Iij)APv!~q2bGOjvpb8ft7bLGnj*&^EbbZyX(@trMR(L}VY;LZu0d{* zqp)d<2HfKwPpY=1GJkRjeGv<8Nqp)XP0GG9^#uB?2K;=j1ortgP7K@~G}mh&a3dkW zpX}emj?f*6p^8wJb58`?JJ`pM5i9qJiQ4;UCzHH)fFzSCLRngS$Ebl%5ab%$|8`;o z2QjpoJ=e-Gp*{Y}#uV6qK3oHzC|*3`nPPtAT?7Xgzp2Y}xb<58jcm#@;(6d}J~rAeYrM0P`KA!G z{zR7235o#((0bLF&dp(;J;N(VB9Ah@===way)B7im^nSf+@qdvH0V$T1;h>{APq_g z;_r8VAz0v<16U(gb-OOzZbVxKgC`LdIa0PL+d&-(1k4?bWx(#f3X%*u)aD;z_kfvh z2{3x({z>OQ=)~?RP9eVT(6IHs|W1w9^IAiGL%5K8y&f>2R+dsAa)1xGvg|GYj|qrTyUs*3fUW0EAhI45nf zh@pUqY`vK3E=)?Bq6DL|p#-2zj;xn$IcpiW?O2X5f+VFt|5ek77=L7zpz~h9$<}b&pxpf7z{u zv~!;iCq?j{frYk<m zghm>&mX4dPD`4SMb6q#RIA}(Ngvtsp8{z2=5&wwfq#9LzG2`H2tPzok>PMen%pC7~ z$J)%PEX~w~n>kKZgeVY?LveKJt)vV(8wxgx9z%5~eEoO|$0bOCPq|?h>CaYzW?QYJ zG#gWa=Ohgy?kKHL%tV3Kl@2LHE!ch|AwtA{{{#tugaM}|X&ex`NL}D$GFnrt(P*-z z^%NnB1HcJSm(Wo?2~Pewz0i%pdJ&3ncPzO29$17!8=Qx%R{HJUYQrO}j_v=^P=DeF zJ$9~~0y{F6TrkTBx3gh?ff4ulhmtxoyUs1Qpr@K4^Z*f`{ltm2S$_qsN<)sp8jI~{ zY|1}-%A{UO>LFlu535&Ob#H@8D>mK!%Kya<<$ZH8Ul$mSiPb;Of(4 zwTTTxwbFX1T!}rkpSXXb3-Htfn|$50Y9x)je z1=mcvf{lwzl^D7o{G^n-p7hoaQfSV`ZplX>hcOB$_(Q_I2x>l7C{ z4G?<)qfH>nN$iA)m)LBvxv<4uT^1AWC~)MVkd(&7&Do21wJN!-e>JleN<@E)aW&|A zd0P;ISYv^Dmy39FP>49Y&q=`77Y6s(@&=VAVeO!m#2h90v0$0qB}u+8mi&LQ@=Zay zb<37z+qP}nwr%dRvCG(H+x*J5&0V%_+g1Ia+kHE_U(US|-7j;^`Lbfgip&@z$H6>+kngjF#v8x04+fi`QHlK-51lj}y;<6_?EN;Z zT!{5b_x@SfyNqyFhYY6~5l6Hsi$uW&IzEWAFQ|1Fs}uOd4XRRBGalll)^#+3(&|w( zpIOQjw?cZFqEG;OTb+*kvHFv3Y6eZoeeSO(ED1fAO`-+mR80R4QPXzFX&mg#jeZTm;awmQ>uC!nPeco(J~lmtwR`ehP<6qu z@O)uhljqz#iP1xHQY0E;+T14|8fhur$)gh#)VaGfeC`hUu+r^LT?y2 zblARU)M`vf7GVKtG(SqA<@WY^PUU__^uk+KuoIRXD6dt({Qx!Wfa6?oMNuiYFq@RPfR%a&6nRg zd%M-GL$NWqn{i;a+KhA{Ez~_0_~_{~^xorBbW>gD_!lQmO@86{Z%Fvotj!hs0w+4! z-iX8aKl0yGdQE-e4)x+YeWI-{2v7sErpfLw=Tw63L}7z!qz6jOQPy-u5VBIceCA9Z z^TZ8q7|qGZ_=jEip5Tni0eYL?db6o>ih#d5@J6!}ndXT+V*Tj1um%(e#54VqUI;az z2MnoVc=djRKPV4>O6Z`~bS7UqE|8&KYHdGdckivY763j!7+DIZH z`H1ovNYjrJSlbw zx2KQvf!OS^D#E050OOJKI`RAr%hR@iKOsoOe#7mBXOd0o^MX1Du9ssSS7?EF>kUR$_~ zChL8XPndEzKM3dc-Jhrzun|s<4=@`WJSLDvh&U}yTu(ZuGR%h08q>V6-8zCMkQQg1|nJpn$Vx^Mq+ zsK5G(JCD;Dj8JsBkhzS|9BokLMv39mj95~^z;VTN=HpU29f=H9nSN18Mr54R`)bLK z$du%4pfqKY3oK{8PHOSDlNVLh6&S-J?|7EVLPja?ZAdD5$<%Me1hnLrwj-!v*BEgO z)?=U%FrSg#aI}ip?yM0&jS zo-pmods$-(=()o78lD(lH3JW0u;>P21{IF5ZyKR#2@aZ`;Ca00JyBgcdp>PAlYqEq zVwz4X==F$dLZKc^V%t~y{HYxF)nG~S4RIvCFiI=bdt(`iy=+PEp19c^psHZ@gN9+pG2X{5ug;n z?}{fTTj{V3hY2(EUQh;smR6QB0q$Xty9GR3N$R6+AZ|QglC7PstshsdJ^&B@?{ADg zx)ymkqv<|$ROr9(dtk@#zNRL1)q3&=nbH?-cGRWy`75{-7*4D)x`SE+4J}paTEli% zZ5F$_pdMH%@C5hXNyc4Glm7b(veGlu85?W*v; zh8<0d7lAvjoA?0d+NN?)Oib!&Ayuj{)hj517h47K(D_>W*5Z@Mcs>=_`81mZJ(oAT zutS+$mFfD#$6<-e9?}6w-%(Q8QZ%*p)+y2Qr`2>dMKbhVU#vNe!6O;95S}p`#})n5 zp2=IP6-(|nQ%dY;D2ujPONg*7zkWQDN5MYU;YJCnOnL0r%xzI*Yzdl3&Agfi2|14n z3N&G(^s%G3dqvdBjZNEx$}P_7#Yf`EPHaTeibs5xv_o8_JW3r~H`gPG7p0Z_MyQ-Op=ht`esLkIX5mAUUEXU~ zYR`bz`bt9SzSPXPq-Acae{enG1Gq#}GWK@(lag%c@96k!?2;MRUve1RMs$JUEz`V6 zM>)m4D5o!GCK*yX;smYC;muHzEjb0jrUD}cC9rA^L0xWm9KsT~p;+s`z|=9Zg>i4_ z8#cvNIz;E$EcPEN538Z;I*?M5Sn4(AZ&9w33HNvZ+9Ia|GmG9XF&cz=OkpHZ+ zI$QfjNcG~8cA}BWt_|6ja!#meCaVEz*2XR_djF%bkt`K+Cj=A-NE+(@i{r@re>jf9 zXy2vu`Z^fpS`0x@Hp4A?7)Z6?XtX$}w;E)`WE2ZmU>L2PT%F?4jG3NZcmA((B*Zd> zH{VnT8Fr@1G9sR<+?F$bC%iiu+`PSh{y)G*ARZ=G!V>h_&2Ym7rdoqic=A|wfq~5M z2RIb_fA$)}q~SH$^h{?t+H(>IEKl_^3{SE)Zw=NZw%zcI-%~FRu?k^S?xB!@T0n;M zuOEVR6H1B18b#Fjh_Tlz$v8YTVuBdyE!COjv}2EEnEsaHVp_}j#?v$oA&qyE_s?=T zaPJ$J=%G0$VA>VPbW*gYwKXmJ&|}@L&?VLg=IgLHxXhqFX6AZ?IJ~AF5^&1R8>fsV zPu3h@mlP^{vi$sQy8HM8j>Kip*-+W$7IuFA34O zhpPt9%VNZMmB|025Gb?+aic9$U{J|XK~-MMJ=&xn*P)N}ovAzTC^{;C=$b8*6$_?t zZZ%4cFD=JR_Ps-bezU+-Z3@wf#e;Khc3OVIU(MB{j^Qsz6Se^tEV)tOPsT@6vk+*L zZl3ObRAHO~=JZiJbuQgGU+ILE%S4;lgY`nImnv3HBfyS(*(~d_sOO<7sVrjIK;z5K zXHeJrv}f{~EWjlVPco{kcTgS=a!~Ke8S+TKcf=C@DYMs3FeZtdV|6!Rg&a%;Zx5U=`VlLyn7aB`6I-#g}-&(Z!H$i4uD!o)W21da*tdC?{Ob zB51jLLKa+(Aq=ePi?x8dVpc1QfI7^|R}#ERXG<_@hq0bkI{gj{V_K7YrqxPMMdIJ% zXQM~FB6)|`!3t%x(q9$*<>iTam$w0|&Ny9|fudfZ&;b+JiuNHi=W#mfQ+&rv#V3^R z*MT!LUy(VsNJixVbn@qd?+r&}hF$LuG8g)3?;qg?WId8Xg8OyqWt3v}1p)oxC#y@u zf29pApW*D*KiF9KZ(Yd$vL9H<*}>7=+11+IMaA63;g|dWMn?@@N8BasZw&)$w>7SM zlnkl@1bex7a$W{0!l~@Jz#l|D={d+fW27sz5Q**`QPLFiQ#XMR06(7^?kYx0RSMpYFbi zveLr-z}Nn{wD44$(?rZdkgw3#Uzl@Yr_cDd&$=+lF01}B+_=b-(V_b`tz4u@&MnXR z7(mF-f;}JUv*qyC37fC%-~)_ar%FchQe{5zqClb0)g*;HxGkg#HmgB44*LUS^c)-a zci?4u0s-?q_1!O4bz2g3CC3Ayk*1C+wQVXaebY5Lij+eR_LM2Kj>IDUkB7DFj8+v3 z<1sq3g$0WqNnzCKo@;9Gpc&cNrw*`xJ7vZb#GBr25J2@gUZutlKGd_vL@vxY$@V za!Yf*j`ZWqSuA=O?a*LI8iZ0*Mph_FJng2;>Wxw!MEFS_nx~<_Y*_@8bSL~2`BOS8 zd~xw|*hZ^zQ?d;zwsdT*RwmNDeb~D4`;w$$Ea58C0poWwfwuavl_pn>lce@?b2Z31 zUT+VUZ5)9%VWnK?XlOsR%L4S*I*6{k#|h3EXA2Sn%6Rl+rr! z6D_!x|CGw^86F@!zriJt8G<y&-FWaG?BeIAb63-j6sNo^xKf zH}Ld70V7o%vl*yc=0+)a?Ol9)d~fG^U~#rhk-Hg16}#E?}quZ=Lmfb?ujOzd;s#vry4vBUgfd7+fI8E9$H)R z*c@68yuS&Fe7w3DSi5jRtO6O|SNG@x2@GY5YcI}Nj&Xdzu}N%-S3|`0ieH4297a*O<1ez+ZN12puzQh*^SvI$54+Kw82*`?SOfN;Ubf zT3yl4s^le6xjinRSO7Ob$iM6_F?FC8s6Tu}Jx%?B-9P(avA>W{EX%fkY%e}J^nycd ze^B&ddA-yr{pD!U6t<~3B|BI+t<8B**tlAkKRllg!*2tGB}9?C zZ64cI`NsMEzAd$K7(l{%>i2vvT{R4+>Iq}VHAVdhq{=Bl`bMR& z%Pb?Pa1Nb4oa70qxW~^I1I`z`v#0%uJ+oKqN#H*U`-;W5Px$%#Mrn{(E+Bq+&;aIb z{Qw1P`6oHeJA759TW+V?GsBJ@j`Q~`zl2o8v2L<-cyVf^X}t4SdYtQo@*?%98np3rUL1+$Or9px zcqN=stm+<|Ax>>0V7dXY9p7gl*@*mHoX%sC`p--7IfMDgfOTPd>D(3(dZp#kB_w>X z38ph-@r)5RDGyl6#JU_`pT;D3k{^96t|F+|r_P-(=G74hS|03%D zS%m*DJLI@wyx|B13QHJ@DDklcN~_?=q!vX=l-RBye}H1Gbc3SP%>&eRgfhIhAN#k7 z?^$IJSOW5n>qze(NHl*-R2}wyCkcwA2mNV}o|_l_>9w8j*E{Thq&hV+=8E0yNP_4J zt~gj4hW#R}5j8Rz9sFl5f5q4mD@_tQrMX4lhd#@Fv8DR1Zpxdkh5ofVkBR~jmdK)O+5uinD07_pke zsFCmJ@Js9r6e*iPkm^_%z0qf*jCMOH`X*-bo7|tH|4Z%L9^Yosc%)J zw>Z3A%$I0C;du%Sb18q@PJ5DZ88m#?I&$U#OcVOGNUpF%QO-mq5C7XKj zrkV%)2k*gveFdE4Md#=bQ=zPO0$V_9CoE5(RyV$c(LTJ9IicQy?V@jBcWv;N?qkgT zd2~GnnxSxS5H~_A3lE#KtB6}IO}@ro z^5BTSU?OwYZRRfPiG%YWHV9#dPVkVo2!S558vQ|GxNYN$Y;^mnec#zr5ZWoOv!zYu zfRaYnSvq(^qjZXehRU=1hCLkf9oGf(!4`Z$eU^n2_RSGW9D!lW#Ll8U2DrfAKXRsB z#!ED%l?5Rz57KeP>}o=%qu&d@4~bgz>7umm!#Fl^Dh;aAGa$UJ1BURCGk!K&AQ$dt zwzQg+8R|tG#~Qe9xm&+#s&*RsR)4NItHd-1}wP`Jv?qOmDrw=OsvM-o( ztO^b{&>ja@%KEafw9`50Z`vkzxz}}P=rL?uC5qdY>OZ9gw^CE)cyPj2vwJ#Bf3mw) z<`?B;{sKfgMK`lA)Ihd-c&18Md3JZ$WLc=zR7^)I@R z1pX?@B<|n`qWL={T>}<_x1gMkLW_=x*a1@D*2Oo>Lob2j#5MN|pm^d~qwy4g=4eMO zNvVTPuht_Wv@@lW>pj&+Ispl*(i_aG7j%d`_;As|1T!-1Z;WLl7H4O&%*gM6+m&=h zagSUF5|%2mlw8Tx<-ACWHqo=JRHUN#$go5i)Vl<&L|;^!wtJ|^)qvDUij>Z%ch1L&z|TvP_?E5<16!#Wnt6ULQ^%#srM&jwMD-Y@T%zLbU zfZ_EagvyJ;+y3~lGgLDG5&J^!-s*ws)8alLNZgKf&M45o%><)Z@8ERHy#4Ogs1(un zLbqa@9F^YZs}!&x<`lp|$TA!sO+XeFFbVNM*3Nq9?MboS!ix+iIa7eiHDPAu%8_1{ zAow3Q(us)2i|fFEfWZIljr9MvV8QyIf`$IS1PlHJ`mGi^mDzi88j)d@c=0~OLsDk= zObYQil7w5fErrv4cT7t_fPY`_J}YzxRYcE6QMAXh#1IuR-{s#NpBes_zgwLjU!!TY zK&AD`A~;3f?O77M_Y@=Ze~M;fo#fKnEKOKq$bO-!Qe0=H8%td~Gh$YRnPAa5Jm}kp z-|+jWN8&SxR~NRS!0%OhL8y{$tqXwCGLvEG?WoJbiM~C|%a~rk-I*w%!sVE+U@~UL zRK(kMohJY~@whg1Pv)0SQdw)x?Z=E#d=1A6M+cQ=nGK&q8&YV!#_T9>f455L79qbD z=vS_%XdZD+JUO$HvGwCih9obf?$DjTM{D^gs-w7j?I80`!21RP@D&}kt6Ze1>!(OW zAHFJ?mw79(-t`TL@-@r`(qix= z)X#>F!evMWjegO07Lx5X`}YlHhf)%euldWEVR23QY(1uIAoT`k8V4FbnoMz%?wPyk za!m}844M$N{%VzA{HsprDgX|G-NJRL#3e6{{Na@}nd#T9<9ltrcq}xJl#|&WMO9E4 zCX!>Udz8qDwLFtodT$;weSyt%?~VT|$SoSl_GJSjs@S9U-KmbOX!wozqoWVu<1JA* zducvo4D+s9QXoQ?G=~a0s~{?B=o+2N;HvsaqwV6#VRb_nO&Ev{5r;&JH^}uTV8u!v z2`Ma`ZY{MXq7?FX6YHaCzW4*O9rBdaUc43pGOw_&=_i(5UINoCG(Ih*l)W4t>C+Vv z$v8@=G>^=tH>j6Cl<$ZQKD$bnIy~#GZrOZw|8l(R{In|j`;ww2vMm#w#)w75e`NqL5kpBC2oTWTzn%2L`QPo({Xd5d z{m*15(X{nMTf+9UY|O&uKxM#%Dn`;e+D`-{5m5#iIu0v_hpvmqTGye-BF0|Lfp2US ziA-y0u^L{tX$EhKG#Qpfw_*ogh3_&R4iQM>H`sXSi2S!WTMnK4o4N zC5W28X7ticgN2xQu|c&{y)xF;LeXup1+LMuIYhc;8GS{!IfQ|@4xrh}#c0dy*166> zM_-~onpkS>>LNpyXi?G8S?QgF-0D^-dbf#giRbfKK88wAswJAlJs8x6C55 zd&^BJz^*+=-qc__s8+|P{^eq05APk8f_B0kiC@;+-js-8u%Z5~s?++;AB^b9)Y1y?TmDLFkml&NTzTxNcQd!|rlH7F zkmbIxoxW{}E3G=f?p{kkaCW*U#$z5nRg8Z2fJj+gmwVdy5!&NEpf`-`nbd%r zc;;zeCYj@^;MvglBF%-dGEe=R4-m<}TDebuX+$oTrIU%%Qie664GkL#CcBfvLD$WD z`D+cES%M~;Nrl=X3P`K9-41k)B~pKOgmuzWcbIpzU;spw*ChzWC~Uwk3pa}+{DOCo zWn2A@VA~SB>=nqN;uYzHtm?hjRw<~KrfQ$mw`yN;AXP9b|9#MH4kFc{t)6;4f1mNS zGO{-!AB<<2)6QPy&f_zfQ-Aes|IU9O)vv=4`OYhMxSdOHWgROvq@1KnYoN=C$mpZt z2@fo}iDIyxd97HB6A_Ko?N^9a85v~u?Y$>Ppj&FmQ0VW(y1vg+{b7s z0iK%uC?9&m7vNX1jl&5_9sp~j7Z0ls4cX>l)yhNOm+RpNF4cYqIBuIgxjCsN;mJVc zL>h6^u!X%kZ0uP=x zz5HT>JqZ1Pqy`z!{Ui+*ZDmTsIz_zt&3FfP&YRiW=)`$`RTgD@b4)!(Lr;XmQIwg{ zFS1tERE|J8PQmtsUlzG637;IAt-HLrsXt0Kz$edqA$N#JYHX5uMn{=KG8GH5Pruj--FT9M;z804Sw z+?cdXguKdu`g-J8%1JHHbB$YnTaP@k-0AV|>b9b~w4fJXoqg>*lnzXN1J0=0#0tP! z*s%3kOw2M5#S1nfL?A#%%Y?=1k70_K$Pa25v+`gppicAp7H*vV2{l_EIFIqU-zu^1 zYDNajZjE5b_5x>~0>Geo+}k8RQdNzKrH{}V`%kdcC)N8`$r32wO=ZMGwct!D92s18 zNAMV>aQm8+tboYFyB`)@I4ur;C0lUlaJ_~zOUi+!w--d3jFY*(RX{MyUP6Y|J3yJ| z6x70*JVW#{u{h$mkS)GWegc#kW*arCj%7UIA8bI5!jY?BLLnX1C57$OwT*x@qnaBt z{h?&6`kBE*V8O3eOIX!GwOpahMFxp#%E?lap(tbNQz#|wooOeyuPxoLDOj$J1+Irh z@cLN3KMi9(BC;S?%?Ze82uKhJk4Z0xZjMCTV8h3spgahUb`H2ANj-rTce!#8qYkNd z@D=y?az_ASbG>(P-%*xM$TQNwe2h~gQ3|oP8D*g9VFVV-qpB&V=Ja4xqh!w>3GR4K z-{fHPCC-Sjt;$i{L7@_5E~4a(7W#c4CVM0k=49m9zcKqDSFRQO^hqp@Augv0IKey< zi+#feW|+b=Ut=GX1jVA?#SJUq=m~_x?b>gkCS3Nh?t`dFyx=BTdBKlBkrroB5K@jN zo`LDm^OguaPIX?SI39^5r-;n52V%IU8hDRFN(R&gLB0@H4U9cz<&bGIe634s`k;Yz zcfjcqLwGk2Xjkn_=0RFfW;HYHBqn)8SKv+Fupzx@^$wjrDvOL-&A{AgCHtoXaR9SV z3{Y|UJeueo{lpO{E*QDt_CA%y8KAX|yE{hpz2ar?rUcXX4L(_ZU4yBQ1aI4b6T(}V z*Lb^cyx*^X%70cPhG0%ivZq> z|7);}F0_%_(vrYQPli|0xNLw>K;5{)mYPrAl+8F1nrwNy>1yP4#lg^1981if-qMhIsN1?@PBAYZ4sr)sE41=MBS2?nlm1 zu8X1X-o>Z~>YV2wArYYi$6E&w^>((f;=_|)PyZn;=QQf_Vo!q zh2Z6hB#SlC&dG_Syx-r$Wgz&Y9AKMc4&qscVggRDG^I7VVa4LN2%wu|e&FrN4>>;; zq2W)pfV^W%7HcR$+j|#3KZDor@~&Q@;V59g2*UVs!K9V6lII6Gzfi;JL(L;MjJ8r| z>Wa`G!&}??_l|Lg^v}|+9~L3RTiy9r+N2!>CF~y^gYCo~53_Fvx$o-n8;G*Rouqw_ z`9Jl&X~;LQTZnSsO1Zrg`IWClK#_uG_oJVZfO3y7TzDse8DgsM!%68)ubhb3xbx+m3C%+Y0|-d0}BtY^40t7fQzU6VI-n6){(h?EsH z{#Jy^}Op6efToR z0XZ1)i!@x|7o~1Qt-=j(J>Lvu2frnJ%omnjjSlua$9V;CY(^AM7-sg&7aNo$p0@ADe>!wi=|5V{&el#!9Ky z^{f2hIJA&Hrv5yhl@SHLWLox-)qLPCWMpH&7$;Q>d^2o+U*;)vd#Qf}4bKBFpkFv&`TjU((lIL18T9V0>Mo{6yxLQ|N@ZBny+dyaydX&OpW z1AO@ShG|Iz|EoI&h^ZbJ+hrA=>)w&WND(`cZBQWpssyErSWOHH8ko$u-w6}4Eb5xRSu3^wQVe<+Ng(??>(};EljZ=V0@H#I{dT(_dF}8 zJ{1aT+to85&Ns$^pSgOh!4_wb{a|usSj0R*3dx|+GSP=ha;JDsc0&JV8;PMjJ?U2f zHp_2eO2SggeKH%EYA2o)C1n%QGaDyL zP}mqWmd8rYBZ~dHRhcfVU7u7N1nPrWiwK)Ql(mp1TZY09g{>bbG@aDe^rDezQJLP# z2KMYyh?)VS>}}TFd0bSWwME(=H9TT%;&pi7#YIQc$%@jpAMAwhK6w-Tx%O3$q}UTy zk~`*_X>vpz^hj`3As6Xsi8wF>XUD}bT`@!j=^R1sm>h!ot4i@wonIB?a+dhxVc%KJ zjv>Iqo}dfm)|geNT_VG$q#kp7nJG}!DoJhJ9q@kF5}q(wp$%A4D@{WpEh$eEwNmbE zJoKqh0`j`Gv35zYU?U|cL2eWzInJ(>H=QRF9hvKQ43M$4*cm$+2Xi@DO#E1R+y+qG z3z8)n1_|zd4C&Glr#cJblagMP7FaEv&W z%M%WHEGLpn+DxAbjSJ4NaUm8eF`^5jxI=)@WgU3!u{%Qd{~%XV1B;V&m5Tn_wIAr6 zxI;&Iw2hT;eJr*A>l`bvJNNxzoX+827$anOkh(?) zj|)ax;*rg%WT-nu_nuL~q#3&T>TGjNz`iiQt#rIh?U2&{RdJ(rj^cKfz`$c5rDstw z8A$fEq=LIB;kn)Pf+K~vn=q+kvR9tJfHX2TT9N|MXi{e{w4$j6eY1d_rb?i>_H)-?IE-34Y);#wkTH=|tv7 zK6TxsmV+uIKF7j>Qll1*b7}H5i~b4J4Rk>{Tv~|UElS><3*mOUy`;omy;a&nz&B+W zby1_(ICw8QE!V1?uwp|M!_mEFOKQI5V~LGzDW;yag_$Q8X8|oXCISLHn0GPfHbe4I zl~2TPWqY?bSPl@X34AOMFBTJNv@ir_PO;FT)xJP&N=r}SBYPR0n(G_oC;%kp7iKs z>U;Zpgy|`H{C;HOeb~Eo!Frf_ViVD;#UnR zU^*!Ez1w?7g|G}U2|Ri1j_xVpU9=%lHr1*;Zi$foiSj9;`Prtx)u|7c=!N*J2yMu{R9ffO>{ zk(iQycMn}AcpKkK{XLqMG9NGt=uZ*3N#1ihGm32|!K$8@Y)KIGu7BnFnx_@Cd%c9^ z;0(`nRKg@Ywy!<7N)yD04d*B?-s&V6$3F16j3>uW>~UPgLde^i_kG2_CTMVt%=^Re zen@z(JNzgL<-Lx}z6Z&Bgufx| zxeFaFd0BAX1LmZsgVa5QHfQy0+$!}eZlUVYAo8zi!k^n=wR`wp!SS3#C298pX?q3x zZnF0ZE0ND7HCz-dfG&H3 zDO!L#F-Gi_mVxx%?KMfhppwxc)$C2w3hBQN#Ro zy=U0awyI``*vG2}`?YQ?vfR)wstqx7x^CuS#?^*i0dvsF4g zwF#_Iw?o%Vu5k|P7t^A;dab`^PVb7*4RfAgCIjZ0XKK^58qIy*#i-%Hsj1uOQ2@me zfT6FEq^FsqMb2~>-bJ`ihD9xkVq)Dr8#bmE1GS3DD%{6lSQ3}Rbc}r<~0Y;YBPicst^SkNX_Z%)zll*K^vr@ z-!Mvd2)aD7_s(I2^v)yxdCQ_|*@l0@?&Aif#7wN1Yp=TLBUU*&>d4%}At?z~nBIFKM|QFvV$qR!SIU0OT@#Eu$_+`g6(zRMZOtip zGB96+0tKS_?2K75f2u)g-a!VjW()^D0|jc)pBnFUK5l~<)I(h}G_}@5>Ki}Mn=;H6 z6$xJObPLR8Rf+|S%z((@rnH6%CPz$j(=Yqs>P3D4WTeJKJvDk^IY4Q{{q}8uK(irf@ad1sawGTDD7$WF6&XY$&QGz zTfBE(OJCf<6z^=k_6*Q63B}& zc2M(t{DBKdAuTh;sGJk~0xa8WTfq}UHVgE0+60IO%?08g09tp2;C8+50>5%i9sv0* z^Lw6o^$e(lxWrs8=D=gvG8WLW**T zg=(_NYipR!DTtI2s?ExRPDk+aT(Bzxzs!knIA_oVMW0(}>bSF&1vY-Q`TlT~3_U8M zM7CIO(N5770!~TE!QiK!cb)*y7~{VDA({7k1ua1HOmtCeMW9g7in^!5+|p|8326=8 zW^L*{S|LXE#&k5mA|N{u(3@ZPXTxg9eZ|u^^He@_um2g#L%FxJY)6}oXov3>EfbbW z=N$r_PZrqfd5k`}IZ8q}{cVFv)uwKFt|2j@X+B4qf=9|B;1S}}%*^61+ZpOR>o(u% zPta%G#|%^f5x=WSGM8~&!K5SOMIgYu-wY$Fzu;ZA3M^f;*hI}CN*LQ$t%u= z%)x~Kt1h(cWS1$WP32MKMtJ#dJyBq}yJawVYFKz<_t!IuLU>VHmGOx(JP*CSi_mM8%%k?Vvj5|kPPDcNj3xbT(h;zv<1!uB?_@*C0% zbIa9e;kwwqlM0#bk{wYxXJ)PuwYNZSumDjE_>hg9y#OAR>Y*s$b8Ic<5Kn(x{&QnNM33X zH=hxQrZg6WAYyZ8!=wkO&T9{(<2|SCI~uz$!~qES&Z$FSoV37M4&1a*A@S_XXpRab zJq2Khq=3mP@y;?8gy6MmwdSPbe6KbkR$AytL-K=SHW)k&<(QMv_6t^$eM;dTf*UY=8vkW0=gw@dfOuZTvYr=Xmb~&bhGEX(GfW zqJLOpjkZ(?ATcsi z-uuqLagO_kZs}{1C`sE~e93FbB@l)tPzpb6UFdw%TGV?D^q`LV7#5ffYvP3=Pbxj4 zgxfQBGCF37=|T-1z4OV3tLZ1t>2(_Asu}RNV?_=|(dF>hH8oppoRShSFn7^XMs@bZv z&4qj+cW#jw1~&IC!L4YxP?w^)9U3}4`mo{w>49xYugn3nks+lqk?lDY_Xn;hiA}1n z&^$373o6^9&0T3EU2)3~Nv`;U;;nbAu9$+dh$erFJ_~W_YXKY5{iF9z zhX)5wdnI@{B@8htlGXR){sA3XeAYbv@{)}j3FDCYUWRjUU(O;Un2UCT3SrdF_O}u7 zchY*tV_H;EUa?0q*||@NVkF~Q%Fru2busUnc1f3tK_e=0TZf?`{5~+P!K3y(1lkc> z9-;)l1R;Z$m9k-r?zRz|`)g1Xgc73=1yscT;TlknHhm3zQ`F5o$Z`Wy=W8{0DD-uv7*WSgH*ZWl)S4zg3QdT z@}bh2nZA+f^Ht@qIrh#+!ef0|ry^0;$Baz81dDN?wTXi^NezV$#&C44@HZ zz#C5f!mohcm=uaDS|JG(g^RAD%Iw98Gi=luS)C zd4YtIA$ww2nX+2hy>$?dym>_c%^Zg!`dRnXKVPU6RP!_vn zvo}{LC_35?%ma>KgZ;b~Tza43i@|g%o5W3Jb1XAKpngy$L#P5dEFxdS-adU8A9C}t zH^md_#GPMxg5H9qj=h?A>zfR})%OwM3YG10yW7ur%NKCs$CuZq%94riNznH|&e!Xl zYdD#7nMc1)iL_NRY%gdo%j^0-TDuCcxRRxd6WrZ`26uONcbDMq1PK=02`<4s1a}J- z2oPL?1s#F~4Fm}K4`kmi`(Or!kLjv=`<_1cRCQ0+ppAgs#@4e;rw|g>K)>#@Ek%bDhU7j$CIWyjZbqtcDu$6Czh>HY@yT5O>M}HdDhB!#`Abq zGP~BGlk!u|ABmJ+@rk&+!7}xc5*P%24JWLEe3#?r>7l^$NOW%X-pdc+IbW#25E-zM zDA{vLu!_i2O(!Ur+oqgSmnf;{9&pLblilDNIM$O$W#=5I?Nlm^ATVwIpp;g|m8@Zx zSH*>=h`DAX%EfDrHXy{6NO`fY>(BgTLpniySdG$~ODjuCH@ zHuA=VcwJ_>D%RN4HqWuQD~w(deIDM_XP25e$%fZ*iXo+2@~#LAW#vKIHo@Au3P>e* z@lUb9gXbaq=$)-Kn(Ovk>hKok%ItRK8{8^%!27gyotg@E*muduD(k0VTdac?>bmx{ zjh>ZNwy4kO(d?9yvv~zo0$i2{+w+gwhDSidD$@x#oDpk@Q3dEGvvx#N3~2kl(|?jx z8lF;Kjm;#H2*#fo3F}0#DYAy2V?tIk6Y_0>xh7ov%6qZtPzO9zI$=jYd9=+Hs`0ElkBc0emZh^VH){+b5sqj8#wFnh_>9QMP8c z?VPQ7t`sRgkql`xqm{q&-F0a>elFqpdI4r?*Cm8Ci*Bgq)4JBKOA+fx^14$)Q)`9~ z+0YZoBQ^T(rP^ENZp}KL!BPrIJjA6L^-?v7u@PTjiNsq)wj~^bp1mxnUomVAIWNAj z@N3QrE`_!T^b8d*-DTC^&CZ+3W0m3)FDh2YkK=jC{+Lo_wVtTx!xVk9)D^_Z5d_~G zw+Vn1Qd|DX_!lc8@BGaC_SZ$rDw$^Op1~I-<{rhK(eFz(zPo=@$t=)cw)#dgU7YM* zaE?=ZF+4R$GC|MSHp!~#pj;#q$QB%e=i zft-y*V)$6k0>d7k!G2=ow%bFIIVA>z7r;Oe^C=+kLz6O7<# z0jajj^IG;c!?N&@mT|>fh)9xx)HWMeUKBsgF?I3BEUz83%DWgFho(cCp+l-2j~QE~ ztIW_;KB(}KkiH@W^US*37TGT3&-K|x3f1K=B>5)s=(7T=n78o6RF-A=IUJp;Zys*9 zjH|fQU?cv8UJ0KQfo_NNdq|Ub%PerdwGb7zrLIzfi;B8uBQ&P_t!?drI6{#-W?7GT zhqz$)-yJ=k1vA@Q!zl{ z5Hl2;{T&S+0Atge0%XW454wT$y^o|oyqV1oD;tw>3yX0Jt9{t1MlVe|_sGo3;LHl^ zNM$;an|@540gM3Wi-4Jv7lBZpLTZB}_1Bo3`pu7XqIyBxXZ;=W z0yZfCl+Cl)@G;B~K2IqZ%;EDwqEL<-nbJ;hAdeH2BpI;9j^q5%=dnfXvB{64nUeS! zdndA@!j2gLn&%CU_ymm6MHNxXC%Ex5tQ5}mj$o(k@@qokTrrG=PE}0tF--F7{o>>b zY-UHa#)Km*uRW@&LIZlAma`>&g*Da^o_8_kM0L-s96QFfWTfdv@rh ztZI)?;R?Smuh~>Q*q5s}*<74`BR^Lnuy|ZXZC7yO&5Gz0JExD^P~;xt?VSPn+0uC# zj||p~RXNEK#g${YfUx)bS~FW6X*PEADYQGx6sBK}miMUu@^M zS;K7KTfq|ooP3?i#nR87zwHRi5#Ra%n`^4uQ;-Rk-x5Rfnp#}D4vtITk>`r+diNOS zyBjy-2%w5o-#)Wp^2rkIGpvTOOx`6od2c#4H2ZbJO4_D=-8ZV@6UWZ<%*jpVP+K4H z0JzG%r+wDCaFpyS<&FdhtajN-y>hI>Gs0+*Iwg~hQH9z1W|w}2D{Wx=HA-0#=fabK ztgQD+&*=1;a1GXIp)1Nw*q-T;Yj-HmRX%_O(aS?e*H% z$2f2I56I=U&lECTNvX#Vc5~Yz+{WK3+iP%=n4{<83ns69cey@;_%1DHoGUP$Wxn?| zAbRL%?VQj2^Y{G8EtA$}`RWj78J4fI@QKzn?4H%<$^xkU8$0im?fUBpS_xLAk~&Vt z1%ZPH`eL~7%a&WE56|SO8^>ck!KT>mfY@%4*lxE0cEZBNUQ*UR_XKg=7^Sc=>Gya% zmd#^OgY#SX##nlx=LNlJE_GFSnC;O1qx_ne@h*7V4S7CD+lL*;_ybP#Q}W{VR9gO7 zg({E+1Ie9_q$#_SNwL0d39``Fh3J;>tx4~`FQ43V&QFqSID#TXS|S?J-%X0bCPmGV zS`5(aVD*T9%hl3_S>CTf5>I{}KI(?CUnF(W&;9881vgRxUjBgm?B25+6pbUcXa)=C zy-%=>)KQqceuq$>vF()w0CbN4 za=0(dKQTz+K$mtv0v|L>pfZM=GS87^+~b~28yT!^>^J%DGK)@-4D@+4M`d~h^70%v zrJl|4VIV&@0C%M0lW`K-%u(m-QRo?VF1`|Vns_sOYI=FMdCzKklim|j5D-|!KU;qD zm!GgwQIb_Oax$|0W$zvh1P9eAjO)F5xy7Msm_tziJ_St0M;Cq=;p0&GHgQ3;HtdzN z5F#CwQknf-W*jzdN=mfZiQ#kMt4NAeWrA-CgXSpE9c#-lc-$;X)ah)C2()?Jwl^oY zIO~JbGQIZAV5A)S2H)=UoMt-jah<+8ay#lZXLt*5$nS~YC(!~Pf#PaN%Dxrq=)!3z z!5ia-x;jQhnBGHLk|(oS=#n3Fj!A5Tvg6iiH|-b#9_)}9!vi@#;E45pL3oj3%?siJ z_Ptv)0X`4c-si>`Kq>yI^UmrS?t5_j7B0dy_fUXQbcOTt002rfAAXDzZ*NsHz%lv> zXXcuFxG~XtpJ;IWr8Rf$SB|j&9WbP=GjV@h{6m zi^x%8By?c7xls@46|8HD+*}RS$Z)o@-FK-cUdhUPvY%I%!Z|j^J(^?U{Bk*`ns2J& zny=C;sh17l`I=^~KZVj|;FF%H&DZyNW?YLjQTz#8K}XnBX#)N95axgoZXJ04oV2-8 zl~dW!mSkkPz3$c{qc`MrqDSJ*rJ}DFq{ne~UzWS65wv92#z_}zO0roNV26i@X=O(D zYL~5%Y(dJuzMUX_HBaAee$%Mm*YeuAFs=>1c59kO+~`U0Le z?gP&xBBoNqDOTZC`lCu!&K$$Wo15p*wlqsiXPtV`s5E#9B48>cUNz##ygFk};$9JJ zLc_>@OB?${5y|~sn+umC`U3p4ff@@}72=nSna3mqzCpDangO0qGJBp`^4b-Sus*R9 z3efZz4y)^8t#~tr2kU|Nu_C$kQ~M_(c%*}Dj!8jY4Tq{?G?>W*G-u?}5}31Ap*mfq z&j_X|%GhcjHMbDFz^|93>*V7UaMaJKFQ*m-#rqBLPM~R+CDcDoCPD||GFa@l8s(Qf_RIBcs=5X0PBj38vp%P8o8J#w1k0N;71jt@HLJEIC&bPyo34)wt4J`na>sC;XITft z4&|d<+_VqXgSkjO8ds4K#)wiTN5-;Lx7)w6ua993Jv|Sv5kUh8$)cf=ybKN;MRpe6 z1j(cNI_8Wc<=RJ#_jts1IMXH*>cQKdAK zDVG#ELX<)LLy~^3K*CcPi*-xRLH?N&(i`+01o2^*wYRJ6UO6r1r!QKboGMfHoal3k zK4!=1V}%7xh{{03k=u*t|BgOj$lb(19@T`dp9rr;7>_Xe%L7KS5_hi77~}A8^t|6S zI(mv*nA-}+zfXJ(Wq7SB?$bQ8hAH0GYju@Z#5iFxR6fIMOwHfVBaM-AW*TC34|VhuHTE1bixeQY zb(G*)SXWw`@hWD3EoOLScaAR3NdEjWXOxFl*joKn%owS zMC%c%lB*JH`~nEm9nwVN`vJtcLOkbw&& z3P3lBg_R_0V@?vEH)^}!&}b?ggjbDsISys&6g7w3Z==b3sEjD)1V#ARl7nJJ2zMdG z!ig}639F==nQ6Y5l#~@tR$RJ!A%1+uCP~a8@Lh8r3I6`lkB+e7 z-7t|bilFZ^d$CmviF(VJqDUYCFcyx&MB(HHB3*SO5%p9#?-Q=CuWuA1WFKELlreR| zk+&}NT;FwmwJg?k56KtsgJ68rLEI{QK-`{UzEsx2A zP#E|1RH(wM%%Xb-svcaFiUqAjj#!m=4B!hj*Car!(Q!y%8;f~ob}oh0<4hY&_%Ud| zijK3leuZ;B8f%9BGIm#-VLpJr9!tOs+98hM9hDmdLzVdnvdX z9Z}ubS-g6nfOQXNMbiP6E%)NYr?Yf+=zVLrgJ-tH*Ew{Z&}mpiR%&OGI$^$6#LwSM ztr%$Y@HerpYfG37Hkpl03tGDk7U_$IA$|d)8N@p&LRf{;`a}^@vU_u@UxHs^j+;LM z0pUmbGyTH-yZYs+tDT9B>79Q0A!Qi;Q<%%Z(uLmP*IjB7Rpjh(nULEyG$Q-RUn)Q5 zVteT%35r36N+MWB($#4_ve$e#mn4u~`ue5~U)$yGcFP%Odnt%ev793djQ4@T?jjf+V zFn6f6-yDLsl^db3eUjOWtnls_Fz66HqW?q%DOUm=Lbw1WCR0s|(l`dn_E{D&CxOtZ z1UW_IfaxNbSCBD5@X_Y$de{$yPXJIrufN&M^(0`q#@Zc<=gTIT0r|(OPLqTq z+yN^Nb6g=c5WBTw!yZ`6{i4O12y+mjgh;TVi0#g`p!pP0iE43{(UplgHt4mqyHcn~ z=D4z$*r3=#Hdoa3bdX7+NyIbh`XidKshgZ`Q8b=b8mnHqk6dT#3JS&{SMAR}HLkZe z^qJCgQ5Ht@!3K8Oj9Qk!Rj$PyXUgy62_(ERG3-ZBh*W}eky!JkQwo^Tk>KTt55s`; zhSZNm(iI!iPJj<$sun#p1ba!I6?^z~s%`QT#KSps-LqTZA{JfV$uP;zuSWJIDut*> zDqg`Ld&!UmY`rgK3+E?wdZn;6kT^2HmZBCys_`YH<*~YTnrtcdQjhgGxLK(XEG}*8 zbV<;piSHDrhX`+m1OQh9DP3?`Eo!jLs6Z=d>*TwSOeo?)^UYS=gs$nRlY;%3hIovew<=UEhPJNaI)$rz(~v&~&lLQko=-fcMASRZ>f`Q7LhRZ7C zNmQqU`#fh*{3F}Rv0h8GZT>HGh=zl9^SFIS<@{bXC;=55HOTiCY8mB0luhP<*NWE+Ti7zw#- zXgD*QbgHdt`Y5{1jj~(4Z<%T?>KG`QRPR_p94hLEGqmwdx@p$bpr_BV7^IL=%Alw$ zDowO|F_q)5JU*{s9I_Hdmgz3s?&40)+!9=1#??E$VXq_XVlf?cI(_(f$)jZ==MKmC zOcHQw>8$0aLM30+HVZTMsC8Yuyfv>aZgjh;pLf+~zmt&F$eEVM&Uo{FF?)ZtnW|{i zw0%J!l;xUbXnx}6IR7a3i9Sx;=}L&s^ugVZ9TTd?HO4?R_xvfE|27{x+~?z{2YgH! zdps^aKn$rG8;1;Pg`tF~@8vcfHC=xRswZ}}Pr!g@ftP#B$L@>i8yt6hJPqXI7&8X} zovxu>C*F`*{B=OfY%&wPIa18g)bhI|M>j9W*(5H2OsUL4>NlYNYbtHYy}07?%X zfV98)4FyxFJ7aD5Y!3R(bF9L&(`9ig3uQje<4tx-?Kso0jwr<9t-&>9=`G@9Sbr`E zqMH3aa0n6TN1%FBX2gjV)OkjMc&feXqJl26aM)5ruLhsSx;zI$ImSF=#lmI&S3*Ww z9=lJ-z7GFQ$a41ynWSFs2O*dGEZq_ENhHm=Rr2ZukdVh}3JNA6SBd_FknR40klp&B z%X2O0q=UO4v~pWG{QKg7K>og}PwnFe1ae{9O1rltY!Mfu48bz3N`4^BnBuxPRgIh# zOWKQF8q)=l2B$D-GU!+`9EIcot3G^yf@EF;P^xP8oYCvY6Ef-`D32QUx5|^}Q(Tnx z_S39x@nTOmdd@(ARalwWANkq;-0YYTe>@7LS#R{cKl5%)XH;9v`7Uwg7ffhd>IKrT>1TRfp6y{rN3WbGhI|SD zvan2JDs6~!%8(I%Ylb(0u&>)Q0U}>QIuVyoMD)ToT(}H|tgSfk8?Mv^21_PEiSzHe zJ!)pJ1Ph@fbi2#eJ~noF$S&YSvQ>0PDJvFoS8k5-=N1bl!GLkh**oa)TRwn(KNv9ij%g^tB#m?@UqKoQL)taYuR9eA%|jeA zQo4FI%q9_*HdeNEq#PF^{^f_YB;$n{TajHA-2k{8?QgXGl&=0~65cj8-*=hUn3I5X zJpalTrG6cyEXflNr-UpcZ=yvRiCkq%OR*c}X*uMa#-^`~Vt{*6w8IGr8a1pZ94{$B z&!gy}f#4P-~c4wR;ingTO z*P?5iy8`27mf^F!PoMo*IMV=ul)7(X>>Beae%5` zjvf=s{?O6UAlIvm?uD?BE&$iyI!&XmrYT$sgW*fQVF7c-Gyy(_!Yqo?gpBBF(}6OI z33A!$3&;9Rv;-egW4tFHs5^!n&aMgC_&b=b+!H?GES>q)wZAA?_iogHol{0asNK$ z+0P3lwFTX;1E}s4B^-VLKNQp?a13MBi80>vAbxpb9Jt7k_zM zMw>{F;@geYTX)kYMi197#H1&#PLg02Aupr%f;>6@)Wvh@Jja9%T*l7*X{2^G5Alsm z5bnE9?$z0J**BD%Gza0&m#M>tb4@5^W67ISVMLRj3-^|4oGKrYt|g1qPUBtAhvYkG zgVX@={W&~=kyv}63y5ziTX`V9WoD-i>tX*x(;)+ReFOjoAiftzZ)uu;F_w^#=Z>ax zrRab({pDl7&gvE)&UCZqCm>DZnb?6_4_V1Jj35E!#wL4P!}KB9($K+q8kn}iDUEY4 zFP-A%MB{L-^0U-jIV$5cU+^#c-9&h4CY31tF4PbNiCl(@AddzW(9;iI7Jm7hMKB7z z-lx=8l0a1XU8kddA}c%V7QAh0Tn=hL@aFx4y+HmLybqAObW6`Z`#^eTD4RUYQ_v~k zXM6#L8U#C92z$6Zll-pKSf?I5qVRg3Cj=y2x z4c`3AAu6VfW^@+j(tAd2-gereC5kU88PUC^DLM*;G%1lG{qC~`%I8s$Wf_AJAg5Q? z8w$tgV5QRC@pl4)_KHB3ZNE#A$|9Q(-_wN$ovy!Ga9JFBGJyprP}s9CU)T__Q)5eE z4fI70gs`ASJ!L-N!?=Z{L&(5P+@sKFOVBVNa%*AZ##wHWyA>H{^06r>U31PdFJqp* zBcdeRgv|mi`>VS;5V;X|$fdnQZX3KtF( zZ7*{8P-+cyK#uhexy24?ptr~^xJ54Rz#ygRiIT0fN~Len&fasKR8jI=aLKsHqQY@p z<@aYag-jH-; z!-&Eya_ci6bqOWx;vDCNAY{J!8j-wP8N@QTD@AhQE2 z*7WldK=w=;?b|t%HSUCjyC;m-8sFoayWOVw8E9sufpGQx-wFzA`}=|--u@P`y-TMm zuQt=wx4VdhWN5yL0To4E0a$HGZmYu%+~M}j%iWG#%O&rP*d#e)D~>>$&(BYf0Pi=9 zIk|(sfD6DP6*&m#bqwu3WewPZH_L0;+CYIXM2e~DFFGW7BM+75p{W!3#2GurE;vt1 zwBVR1rM1>6!*jD%`wEFwx2tv3;Ykx)xeFo7Gbpqn(nclN*Q(H%1ak=CxYd#k6&TyGa=>20p8YafR}nq+qe>{c^BX@P+1{Yd_*xfXI4@gr9Fsz zzWf@wPOMWAn-s3m3jl)&B-{zC)2{W4I0Hl_y$at3B%u{D(4+|j2TU5}uE65hFr@*T zfVq@r!;6sWnk!p!)Wk=KkENKS5iydHb$YX2YTGyE4i91gTHK{PJ8ak_g`&vgnQe&K zX0z1f^-+or4Q)PeUy~~yR*RZxR8G=%J6v3TOGHN8eSLVk;T}6}SvQY9>RIi@EHO9+ z{uQO}i+9fCH`?{2p$-$t5L1cC3W;gNs&*HM zoQcw(y@A?;GSrQlqR4&bKPBpv8 z^A+6+3c3HSpfGd#!$jP8(AuQvfIk?uB$=q6wpd`mbf)QoyX^;}QMIX?#lvcUA2PKT z;g+Xnz`$=KRfUr)XkOzs5eE$XgngUwhm6=mzHi!{SV9EMb_1S&b!?TL?KiBIZ2Ih8 z?RQu#fIr0YV%*-)W_PU+-eKxXo3BKLwWcV-vp61rHBsePEXFb3fVaw{37!s{W421Q zWFJud@dy-EhS7m>Ury{@+;_xq8~4Ek`juOi#?EOZ0ufF}ZA?S*n7a@Xz5q#nok>z! zfm~wu@C^$#Vo`=Or_884-tH@NkQfT#9;;skMdA-Z@#cr1FukQ^g?obH3s#lwt)PJK zTy$x<6BJA=b`xqBs7s%Pi$4q|B}rq2wlBj0(ry+>l7rT=Qx-+*g=SLdxaqz@(KeB_ z6-`|9B9YVJXgYPH8Bc;O(0mn0E*8RnLz>yv|1SK+TQG*c|HOUR58^&6pTJ9(UlVb# zcZoRNyF{E8cEKQh$&e+i+ifClQJwhLM4Sgglkp|auZg(#w~4r-+eDn!x2j^hNRH?lF~eKbv!UiW`XflIPNN_RHSKP?dw- zDm&j|A+?{#`RxcEuxn%EEC!|?_y_NOZ^yOo?*$jR#yYdlIBmR}3ojTsFS`x=y8pL4 zZDRV5l*JWLS)g+x)ZQwKQ}5I7zbK2;|5g?TzbFfX|5g^{lvm=tALZA@{4RWM0MMS^ zFVqTFq@2v3?}8^?BNnDTGb%=BE%-BK@$6S+p(eTe|4ZZj9QSj#=Ciq*KaFp3_$ zRFAnYJIA16(^!+#Z#h~&I9F-3y7tL0$^ya=qUu}vO#SaDixAW$fN-(UG-i^tMyT&H z%MS>r0wFw1lSH~^79uZ`5%7y9KFcwo0*?S{;y1N|&&01Az}Q0bT;Dk}rfMpUYAh3c z?@%Mxj>yen6vEtEr$E*^hQVQ2{1h>y5c@2|qMYNh0ZD0v72IqKicc(9i{eyfFnSe)$pgvp+kh;5%m)DXBiYRi*6eMtNJ$|BGMySX(S4kSJ6%0LHs z&@`L8C^JpEBX3e-22xhb!?$oQaD>&U;$|~9)@+%Nz74`^?$v%EGUWh^<`SK8reXPsbFWYkcSc;L@x<}(2Gd%OB4VxE@gOFUk$ z#<66{u$Il%J=SN<%@J3Yk;_k?Q}U*CT$vzpG#ssdgM?o$|qjArrj%D*=dKT07u z4XH^MzDwKwoK1HK9ML)-A2K{Qv$@)n zUSp2G6&M{KA6egJkb~oX2#np3xS;=JklkV~?YZs*#>mGX8Dxdq46+4ncyQOF-!jP8 ztNJ!?11=py&poeNyhCB%<5b2030U=(faOwg3I-`&%UQy*-%#<)E~rx|g>Bvv@TQ_A zWQpk|jO8&VP1>L`)7vNwpfDEyA&j5GmGocdx_u3I*GB67SiZ;Z-w^?us@Ex80|wYV znx-S>t}XpI|D`c`pO%ZS!0#hqcL1MJ0&Z>oM+Vt+GxMm%^lWmMyz(sdQoED+`8!eC zZn3zqvzu4`h2t7)>6Lc9Egu{_#$--ABX49UPLAJ3e;769J9#0u1a&=M19}a0i{*~~ z>Ln8(mK%P-GVC38f8O*N3HX!~Qx&3F%Ibe zvz+OV&9MF*Gr#<%yDfO}>xiuTor?1R#G-?}Exo&~O`W=}{hTE7^>9T>&3R6u70>bO z?Ld5uCP4pk-P{Fq$4 z+3dpo6WMqf5Por`vVET|4?Iq&E=kW)+~StHDknfa1w$@8^02ipbF7~F!w;z zw-L+}y7JQkFzOIHkkd(zmq5-WGFBpUflWLrOj{yuFvOrjrrpl167HghCC`aLN-3>= z41&~W0_AP=2J>hD6^9WOzo2uv)1zGgcCo{H1D|z#Sq|brPED~ALDDpbd8T(6^zfyz zrI2KJ4W)A@nS>@>%U2~j*9|5%b#fWL0 zUtz~+^}~OAN%po}QMf)YHrA>c28-o<=zy-O^N8BI*y&vtBs2800$P8r`q)FY54mvJ zu5&W)lIO0O@m@;c(fcK;!VRx;iFH>G2GFZ!mexhM%kx!TQ#Ci(E?|Nky;=8PC({U4 zPPaEK$7z?a>Pgqxo@6#}O|qw?P_%|2$rDG5h-wj)q!wAh+4aa@*0vn6=Yd}HsSzr) zUlFec(_=VTh(vz8J-__je04tmN-s1PSAQ@l0!t+{9tPr`nr15Bjjo6(JEn)ipXV z=7Oj^Z6qZ`m*89SOl><+>iOd%b#gioOBDtA>dDvCAzIX9;_4P=nxZ-);k025ujgWw zKrthAP$!{?PrbUx4l`fZ+kP~ii&~V>!+NK_TprVK`b@u>e=cV~$PqhmI%M{e5yX5Q zm!wR?q-IDK>D-s1N`sZ`z^gvrOlCjDjmb8qPJN;knKF%nv@C&64P^-DTg~WJ>HbhV zks~_!p^9t924N_gi6o1p-muP0hJ^~;wV03(J&bGh_=>Pfv~|IL%q00@`~FRgABCSj zZQSP@u7nn8*o)O~Q9To0eSM?a9h14lu2(mb5YQWXJ?n{m4WJWWrYaO_z!#@SHRtUkD~asQkG#%pQS~b0lKEf!TlRm*lA#y z>Crl4SusW-={bH=8e*I~4X2r^ZykQsY}lalR=v53M)pbz!2G@KdhO9&)t#eYXz~?s z5D-6@KidRf_+K!|Z})h*fhyQ8Mr6O0tIXBx8sd_Ir#bPVoSTzajqF7xn;B%&e)jgz zMMV79>%Cp6k)*>0&lOGm&E~MPw5#}xIT7>(&Pesk(dzk+6}gi0nW3hemU&xi?6SP@ zgNC#QRQu?t<5n|W)u;q#$0IQ3iv$Q(;RS9_k$rop&>46Fo*=iU2nvP{{`&+B^Xn^Q zkX<2=`=|V)*>AeXI*mxs9{7e};1m6xiG2Sj_nXNH$xDfgsi@M+iQjkpvvPvC=lDu! z<`*6HXD#3!v^WQOpuGO9A?kyMq@cei+5W6O?t}I!zuW$|TiqY`HNgWr5r1mu?jHC5 zJ*3{>HT54A`e$|?9@6!n+WCt^B70zp3+(?VjDH4Md^|6g6BY;vqWrC$-@a=7y}<5) zOjb%nOkPFo=hi96X*-y}_dN!pOW;9k8r*-djWwBq6Y!_-FGat9c1ASyV(|pXBHX|+ z#QeZnIsRWbleITCva$3uH4$=l2GYdu+s8eUIVb?02o3Cy3Sht4hamn7`{I^1E~ZWz z7N$<74|e4K*~R;|Zn8H}ARs-+Kf8dZ_<#172=G6q#x9ojcK_|-b^r`|pl7QAaYYNf zEOZZC;L-h+3*lcU5`Nco&Q27FIPd~kLH`hvznT6({}-mE>~8yA%Ff09Py6Q)<~x>t z;DIMY{wM|Tn+Ip+|7T$U=HEYdy8wf3uv#_7|2FfOi(7+YbN3L%(&9 zBCv0c4@8dnlOLM+HwP!||IbVN14XJ%Mt06NMlSY$;OKs_V)}<8R_HGriMcxfp`++z z@BTYO?AG@E(y^w08tuL$PPhkn0= z&%;5Bulx_|1pe&eesK(%2QH$t|5jz7pL^wg&4Gu#l4S7rDsB91`TnlA91kp~JpIQN z41RWU|Fb>R51csI{GIJ|f3|yn&F#bf-jDfPpA-7o@cpHb+z$*_r2Lx&yg&Q7zetVm zfgi{8f4R)^XIJ+Z6Fod7fy{ri2JUA+_t$eg^aGajZx$;3?C1W}`$In)dH-gu$j^T6 z&zU|PAo+#=cv}BwC->*99-fR!$-kM5{n^j`iG_!LIN$u6`LLh;+|L3(^m9@EZze5% z_H#c&_s~y$)xXIw|5-SK^y{nJ(C_aAB@$+~})E&Tbuc|YnFe&8ss>3@+-P?Uj$y0u3K{2l;aKiB5lzy1$U zO9u!Fg0Fq(u>b&7$^ZaRO9KQH00;;O0QtKMO#lD@000000000003ZMW0BmVuFJo_Q zZEtRKEpuaXX>fF9WGyi+G%hhNFfM9ga*VkHj3`0Zt~<7E+qP}nwr$(CZQHi7$F}X+ zGj|{4=D#QBe)+3=b<&-ulB&F`v)-ywkOl^U0{92S_|RbEKG^rCf5UYEhV+m!cn|qn|uGbE1`yrInNiisC>cCowCb z`XWs$J)y?D#Js`~cqzN|C^rbKX`W#YVPOM{dUOC3q`@Jqv+xD%{|zVXUnu;)^ZGvr z4Dv7ROkL>z{|V^-O}JP(89E#O2N3E13mV(o*;$(W2OjJH${X9;+S=PW|A&6W|FNI5 zv6H2Pi>b+f5DDSGiX!zP)0oBAPn~0^i zdE*N_SrlT2uwMW$xqY`mzd^s1tchL#C928TjLjVviI)x1)b!}ZL>;|sf;6Az$daL> zFHc{zCqmlX6hS9$|AX|9KdtCO`>L6^`mPiATz<;!^JS%k=9+4o)m5V>3Z96@gmm#r zI2EP)nsJlG54eFM%?QI-``9oEB@Ktq$#Sad7GM8lp?P~%-hwoIu3<`WQiIK^bX_z{DV3YvEe+q~ zn}SvzP59G&l&T9A?m`|RB#$!QQq^pmT&|j)*T3A}vn;L{2tQo4aZ1p;4+`u}NgY0C z;C#>|DlZazBPyZtMT5SyiuEpSh%)NyUwckjjlaU3dzQ1-o7ya-Im4C;^t*mK8%KdZ zEhPyR=F%o*H!g;B1|nny4Y6(2bY*6kxT}~v!$Z#Bj1iyHz5t5~*jvv7baA^A? z-BXWG(1O4FwD>1Rd@?;=@5Y4Ct7hbQjg85^ueeozNZW^?Z8L&=ZtW#1sdTiF0|j>l|Gd+2 z%`dbsasdORW5T4|?bc#8PI?|wi0~8|AlF|5LcLS}bbAB+USA$#nPUT_MYu{`Dnv;K&;76nVuD z6%R%@AyR+ow-KwWCfl|`4s|xy6!Y*JGu*B)KYYQf@n zsw!JDNolG)s%k|l0?1?XVnJN*-tDc=u?6NKdqw>oFLI+2yuVvm zf)&>c>R2HAb;YkDBebG24g(nxz7Ii~R9-S3?x4L73@oq>ekpB21BVoqrLY%eO3)%x z#ms4)RjYn5Jxr%=t;Ab$^NWAROPKzqx50WVy&O#^Yj|s>tZ4`ml%xtEwI)rmAo|9N z0%U46e+~*g7iU(jJgGk21DJ)P@anl%6aK^iZh6mYkb{Za+VQ|)j;$g9F7#f2!ZnQx zSTHEMIWsTOWugbD$(`iyJV6w7ECmqCx%5<#xu9tJUw>>!k zD8Qw1jz2pI*k(inZ=tLdz|tLOoF3K1jsa8551cMW$Y!KF5`qCIqfHHFpKd6+*!~2T zbBRWG!sC(lm9PwIZuuuG*MmkoPlRWdmuIi*_JP*f<=$}rN^ecR;gw(h%YuXjWjd)r z=Iy2{-W#0r<|}P~wH)D~+#PmVm*a-ThiInSvH4YK8&`oYQmMi?44|<#p8SvW6ow*< zYWdvT;fJrq`!=$x{M27$KI#WG8`?dS2$6oIt?P^p;HV*23%D;r>KE12$AcH(24=Of zSDt$nyYq$vp3dF2%EIecD-o*cAatG*(Lw?&!nyD&n_GN>$KZ9-S;9>tXHo|%F|8Cm z{v5^tO>{$mf;YW)yMV64OyxIKcz3O8b%2ykD%Wxp{I|G-)~N{4JA(&IN{NLVFXjx4NA<5A?2=CB4&Pi z;n0x^J`RQ^GW_Nv^y~uj_)DR~V3t`Z!(p(qf$)~r>!Ed(M;XIo#WW1Rlr>~a-~;#C zTS_6a#u*7?llB&0N((kbDtiUFp_Gr@Ne=q_Ymlb+-wd^55%Ma(c#zHu7T7;Z4q$Z! zCb@CF0anc%^coPZKRS@~MPF&RS>sn96_csw`fVKnnNMgmztSglb4zwZYJW88Lnf& z7dc26?=N;iOxq#vA%0(J z+ZfXZu-vq*m#;=no{R+?f`A`EwxG|Ns%ke|egeOlibv1l(~k#PgxUaT#g;?H73jl|N_UEw|-R_MC)Yfva!^CG88h(#kW!3nmo& z0LfQgzxV4sQbJ`)cHW|-9gAV%aPwkGx<)Eq3NA&JFKe^h*2LmgN*oT!&somfhQND~ z12Pn&dG_qtaP0U=Cc*2C!*bYZ-&#&A8GlSy>>RV9u(4G+d6nE=rJ%t2csmaJbL-1* zr)6IQu-ECLHLv@Ip(X-caA6glJ8UxjC+u`eIIk~ssw`;>J`)jN#u| zeBNSgxg86O%6q;)FRRS<*B{Q)3xtX-sp6APOt|Fijzn4dBl+UdqaSQuMtK-Af6?d< zuPiwGH4nNuq|z35jDED8V&T`Ct$SKOL*~mq{g!;tV$Bz;ACTa)HfG?DOq+1T@{?D~ zKfFxS3r@zG=@;uKue~rv-_b@6_wLXhoFEUML{qkRWs~1GS7s({m~{2Yo8xI~|2e&y zv1$`OY^*NH9uVmx)E{K*SJuE=GCMR!862H)_6HNtSAu{^@*e&lhS=~$*`_GFfgz4A zYeRm`w{6e13+n-q?3BYk%p|Na)0gka>!Sn zJWR9OLr}C1+M`Ay4b(>^>=>1z)!St9OoY$cf*_mqA6$rwlXlOZdu5%;4INx9Q#P)FAM*pxvIv+@g#>4Bzc)h4a_0_hB7%#oN45>pDx zRyOc&_V_;~33U8~nsI9lS)z~l?-<$9sUKtg@`v53<7upkX@c0?fWPVwhisX#t716% z--5FxuTVzXHd)E0Tj9ntXP?YE>2nAVcEaL70RTA@Dk{;h5|}vVo+(;uN4=M#y6Ok3 zH_#z#o$DJa+mU~0x7+QDa0}_`znTy=0s};=z_L_^RO{o4xPdaE?wt}aFH@2`bMhPpOnrv=5)wn%de)j%&(l7 z&mTp^{uHN5xn{`*Y?Yfs0jLRNyX2Tp$+jY?l@5A5Ub@C50eXpqZaRDwb_a-4W0&rYp#b#X;P9rWLGPtbD z^*OvB2(Q2fWW!(P**YOVLiEelPu04FnMV=wl2UmnqBBj-&}PFWvPHR-*Kh4Rq22Ea zOh)R0#=PjocO@VK47X(ZNkBkimapi62Vs;%OMba=5)Ft^7}WdE{wgVMWU}~w?>9j637GS z0JuEH`ZLbQKfXVmnLvT_&!Y8VxAkZ5ZtsaM4qokKr*~qKFT4iV|GM$?YR;2cf%bAP zaao3$+Oa!Hmj*UNn;Ab6;`EJ|CUDV5!PQk+r9Kff$c`Q(fX{^z3ly#QtJ4^yEwf3 zynL~z-+^6>?mr6cRZTs$TZE147=-IIyC`?08WJT-ih(Y4B&oY zHx~J^{;9`3UrBj)>ZY4|-X63AFCe}loqKT zaS0z0YMg^KNZ-19w=jc`dbx7?&3ZKvrCzlsJ*F_Z?PjP)5*XG|Oe>V~Bi`1Q%JZ>!fk7Y^Q7G33+xgRB?Sqk@|}XuYD&w^ zr@#pFD;BUFtU|Xx2W!Da3I$JT$WH!_6RTZWt4PPdc(OHDZ``T2vPMZ{NvjyICSzIB zr~rpjB`#ypDvQ^JMF3c;L(wU#E$4Li;!8V`OY%0fgd+Tq#13D#WKHH&R~vnkt*f7M z7~arQ-vW`3{vzu|x5^mR6Ew$OP+_Yu^d_LKLMw>TxeS;%UptM8wqFQ8H6 zxQ63G9V3toA`w(avur7#a84lMI;WD#CMAE|NpspY8{#qy2MmfoUR)&dg%5JZ?0I73 zoj9c18#HastR>VN^8P0IXAiUV`|Hs2)3Z@_=gi?N*)?nM4H)rd&aPp$KXSL$y|h#l z`FuM(MG70IQ3Xf-Sr`Q50ekjV@f|J`O86tflG98&5(Sh}f*2wWA^QMq8e+j2h_JZk zi^}A#s}0P&UEEe@22_SDHW(xHtiqDW(MuFbwtwQlm0cUA?vSY!&db#^1%PJ@+-fnn z4k0^`3{*C(kE9F2RMY5|6_N-69;I4dV18kru2?GgS6vu(`(bq&d*Bm zot6hv(KxHm=ZiQ4?yuYXoxVLo!%mlcD+J-wdo$syU(S<2w{T(jlEwiM|Eit|Fq3zo zq$v>|c!cHvhaR4yhcGZh4lI;j_E}Bg+vLIebLxtw{-i^(u^MFY#>zt%bf9pl=ci4l zWeXp6&;LwXggk#)MIZnG4Uqqov`qiKq!s@6=3;2);!J03W9aOhsyJ=8EP%qBT($yx z5sXxD&?+bqkU(nyDddC$43-SFHTef?tJp1yIV{uhHyRZQnlB(;NT)p1Y})8_+xcvp z`|aWCEj}M0@8|~ryQ4L9m^KD;41c-(WAWG*!^9Ke%QB1npxiShL^&+@Jtg0<{`7KP zx;E|dope}kfx@`630kjxXz(T)XVKMUK zZup>-8gkh)=j85tg9Q#5{0*b7CrN5^4F)?Nj~?SwP#H3;SA&YtIz4m&liq4^buFbw z&w-ZP@8Eh1*%D)01M*6m}L(9ju6b*G4wsOvcmO5P<%Xv}j088-k zCa8$NyOw13eEZK(ORKAVM-_G90}Ssb*}{0n9GQj3h*!bRkmk|W2)Ok()x!bS9%1#G zt7M0K9(qWO!_%aDgFW>mYZrLP0PyD}A>0I3UbF))v5=KXY0n4v|Iieply_9tm*B&{jx0AfAy-@>#f#bu2%caGK=GFfC3n&K&$!;0v11r zqW)e3fa=SH5Wgn@>yN49yi@g!@z-+~Q1=a%vUfhKA@#-jALP3y-Rt_q`@>be_W|<{ z^jEzX0w+C)!v2n}#j|{8)aN^l%V)ltQ~m4+uFc~vp!YlM^WRI?eMMdMnaTAz?(;ur zgZqW=Rlf&Eg|mDw0t!DgMDcSPaNr$Okx@bJ9pi(q zkyr|yWy^gpXXd*sim3NpjPXx?mvobP-OI}VT#U+lIak8}a(uMWr^g-T`}u6?BLlyi z5&V|iCkyIe&F~AqyH$|It&K2bC1K3LE2}aJAzSLmxC=1)6-L5@PoNM><`|`ri9OlK zEsS8u#>fWw8s(75tu!bJ#{=h~9!uC6bqsMqU_&kv*z1CR;ENmp7*LD~JY?nN=1o09H%J z7D*sCv+CR+lt&xMrXbqR4KGu^+n0ZV#?;t2(9&e~WF;vcEZ8 z=>2R=wD+In?~z7+joh(1_EX^*^n44V!gKBWHc~?FBEwr6F&leDQ?+sJ6Z<57cx0q9 zM%jr5leKY86~Iv#eX8;hLs^ZzLQUvX*iiFtQzCQfE zt_1ajmEA5tN^$=cC-1;iN##1C1EL*QAN2gEbl}Jp{m&Ym+n01FqmWZz{kAIe+R58}@5cg~ z&LJd$j2*EJ44q_3Z&74@6*O$ZGTl@%gl}@BkGgVSAz;LbVPzQaO2>qTRFGd&W+ZVI zKM|(qIeq?54}_h)W0+;jvMyYPNht^t_6v=~dQ`{JDBXFh}yR@_vMMrjjmZli? zQ(8gCV|*2)rJ14_OeYgsr3{GhB7jJSuog74O5R!151} z;L1xuDAPGe%}r5}`Zo}|f@--M;L#NL{6scxw3bvopiGQCaCo{X8?nOGDbv8FuvN<6 zl(thFTt{(c7n_Oj-~-jSjJl9b^}b*{(J*eW(NL9JLjI%2zgh*rOD10GzRn&vr=SHr zWG9PLmYo$%m2A4|=5&pZN2ouj9{EE2!X}frFx%eVzgHYxG!8Th3oW=8xZG`!HNh;4>w|t2 zekKh~dKR(YppSzhf!{|Zv%I~Ph~1^j^NA3760W1 zH*2Li)RI`{?KO=pCxSNrXd2o(LNd{}@EtLN!H#GKTjIL*Erspdpn;`}DFAAUVAQ)i zL^R1U5n!yVM+xe;&r%j@%WGQc?=}EA&0@skYe->gkJ0Ft&5D{READxNv@c!{X3P`w zT^172$iG#z3*CVG>fzw}i`&pc9CeI2s6RoKLw>W-F@+IJ4v479k1&uWHWce?v)m&} zuH|$BV(b8lUvwo(*gA52hG1{)3dDpzvm&pcQ^~znudmrUzh~hIif{lfSZT%Pfm551 z(-8+m>bag&wJ7!QLIm5{=}3n&m}ls>b;Jqjm`%eaO@vC9iDHw1^>693m3k|IN@j`` zM+*e!GeIE+KJBaKS>VtL%60eLKxSkHjG6V#ZkX6KPX|PtnYeC3vaE_hXG18vLeQAg z)}(kpY#krS<@?{IHykDYN`78gJ}1uvy*EP3%QC3F+Y@$4_B-IHpYHYq$kLi%Y>3m& zhM@7*0U1D`T(Z1|ppKlXX3YYPG~rPx&-@K_tR;Sk$900qUgx*J+Rf~yfXY=Cu&!r1 z$lVOxMpfCPhE!%C5o@#TnWc(wx%aq&Kd{(94i0vF`}#PTA)GopvSjMTg(&iSoHLl5 zVkC9HN6J@)_TbvS6~%sWRD)Ym*5-HDx5N7Qwx)G@IwKfu)0y-UF;VcB2+8y7vs=fF zNhqn25!<5E82g{1LXNk?#)?{_$i((Gu|ug(>5w<22qB%A_eV&~ZHl*cbMjj+Gbek? z>#S+rZs5XMF_$GIYi61Hlu#y7q%$Ly--c>FG#%7PFf-5|3_CS&68-EyAFFxci7=+4 zPQnH$2@Dx2GK=Zs4Y;_6frzO}=2^A2@uE8eOi0{A7`vj^%X_WiAoIpg)Ks->ZEeG6s~3B%y}w&<|ZMKWzf{AB$dWT;75%;F~^iFi7uU@BBOG=&u*tBP^? zrYkEec18Y~t2&~p8tRy7a((eE=k^+8QhY9pJ>wG;XM&cBAR}8^@&1ZFpWkrfT`GIm z@7)v?PNd!WBT~f&x-zMYJ}@6=YIvNL!{L(^r4V26C@BWXom;C;HX10J8Morw=r}Lb_FJS8 zAB*2!9l+OvcD5iM$FJ;R#*xg|Z;D|N*BQ-i25{yfecP2U2Fgxsd-lC~{wo>Lglr4k_+V-6^0N-b`Z z6|U*Z2yP&Zhi2&UPBztf%LhAy^TEjhn%g`)0=K$_0XT&{COA*JG!K^2lne!=Mi!+j zn0bFx8mTFvmeHtif-a3T3xNxF6UQCAKIp&es9$VFw^2kZJFazi2WF?Bckio4% zmnV>aJ)kM0s7hy9I#ijUf^&2wUm6dWz(O|KLYM5twk4McHzFFz7Mcia_hf?G`d;^O zRhoZvNnT(PLnSMlgO^uQk~&}C^y>=eVK6m~J~jCS>3e_M@mKcN>KZ?vxW$6)aGo7a z>jf!QhY(sjP|uP%T7%#u8(SmRIf}fcHum{GBT2dY1694`h|(1+r|~- z#iq$B6P`Da)S4T+$FWD>$e8bJRJ1I4C6lrW3zO6GnVy`or1QY)B24Em76w9Na5I!{i2{z>D@V3vT&l!?q>k z@oR}(qVithoX!X`hZDy~kjdgwgi_!ZkJ)`UG_0VomXcaVol7bUPIL3b2W|4_BxsdJ zN@{7$M>ZQG%S>|uAhxIJo(gx5C07L?U2AoFN?r!(EX`h4G^I;oL;QJ#bJXzM4zndJ zjyr^XaCS&=$6k?^95=IBfWoLFpnvIaLo8D+&8#n}@pOG;x3YICC!>dQ(A zYbM(uRfcTWN>~-C!%r)cXH8I?Tq+|j(T3w_Xy0?E9SH?jx^+uk&rA-xMFdIvGCKt# zN^nvVvv<+S<4SkyJEf%|4R;?O=bHvLpC=);q^!m%skHpE-(-!cD4bIOBQ1NXlJi}j zE-snVnXJqSSEgw69L{(7HYSvEcq@N!=ks`%jY`#D)s7>|P-kgMgXSO=7V%D+yYUuK z#w4)S@zIo@OJLGgjMQt(uL6M1fidkY^#cgcfa*%P&Sw$ZZw(SRS|qDra3~cCsRZ8k zw02fYT#!Neh0!U$bYF<}nB_Q3St2OcNquk9b!hmNs3Ko9TkIHsuk_rG<6uGPBQ4D` z-oTC_?oAg{pe#XqsZ=Rz&?K~!DOB4cTjk|$nM`n>uN+&C$f5B#D)`N-4}`8^Hl+B+ zLXC=iS7sm+ZB3P8CbLeBBKCXbnA3JU{MEUTAs;6BM=_TmR=b5DCK`Q~MSc){-wnWa zia=xDNb~Fx4w=pZ*H26?8mefuB6r3q>FLYOJWsR|Jt67n4D~YP{?!w!fa1%hoGClX z=28b3qZ3#&qBd3nsh>!bt5+MLZ|Yw+q3oDKsCt4hzOAXFwllP`hwNciOrRj-bU-R3 zYJ4ehKYwHrnC-hKDhpTR2bn72y=i^Ou?(kB8CQ=q%)+`hAD(Ck-42=SMVZ-r_;i_L z*NAs>a`0ilE=8z_-dvcn#AVOo7r$O}^~A`K?66-^)+qnF67nsU0}cs>pvmr+cYVDP z9F1b}{QV{1; zj7FoFw9GCkJyzv9*;?onNn2n{WG2Uey(Cf-3d#miHk^o{!&{t9zhT2HM-Zst6ZK%&grr0yk7- z!AWf_xzOvvVw7q~fqmRLXOqv%Cv`}$e7pUnZ3f+8a&fbT5QcfZ{=onOJ0~6tKW}-1 zrdCitwhZ!8Xj@I`n{?^eIG~mb#Z>AQzT*6bKI6vwcIE-$WQbeh!MeC{IqELN+6BC)HDz_+&*VbCT!^ds7iTOz_kXhfMV_PHI(#hfqNgbEa%`|fBzHa=32LicRJS*=fzuq!%CaB1_#I8iz=eEW&1Y*yZs=QuNeo zrbLuEDb2c%JTMIm-V#1{InBhn9~OChoqwuHKBvSNLJxm&0eXCT$5Q>(+=oR!2ZVDVg9Pcf*N1OG5E2Wn@}t{voR5 zagb$ImgmJXRTvjK94k7*@taZ^I0kRJ^$&?j)>DXg$TfJHNgg(r1-wTvHOLd>v9A<- z4JmQevK^?L=H{4FAZ(1Gksphj%ePI*0gw+5HFA5>-sJ&PFSXT439uiK11P`ttC60x zpnZcd-Io13DxSf+-n>5P#4cPowD}2 zeb_lhWXBz$qTTH)GdskUeMy?wxgW7KFFOca$7t*`+Th5_9Y2D&54;a$q{3OjS}@3X z@*oe zJNM&}3+wcHtA7~O_LRkEEe$DLO^A0qQ$QwMA=RIO{cL!7&PQTo{((m2?cjZRRk99v zfy{muQW0?gqA1M`+AC3v{xd^x8pCp8R3;WvkZbQGUe}Qy%3=9f-^P(}f-tw{?D0rha&yxSt9s15X7yQQRde}}^_mt8D=5eOA zOF5x|&*N-*Gsrp*Jfg+_v1k=@y~5+$oUJ&9c+ln}7nXAaOhecJ>Lwu}nn1X6{pfhj zq@3Spj2J%_075`F9z|It7kfR*k=w1z*i;q1Ft0QyBrNt$==IJRUq= z$a_{m+sE3~udA&G9lj{L0{Vs%v)=SkR`QGJ1$_R&s=n^m-hRdq-A2GAeHtv4jSzG_ z^e!?swl$>Hnyx=iFqw7-ZF^KYn2*yjR5@YyM0GN7hU_!{vGR5lhM5z#k(0*WB?`Qo zAE9#mx9X>EnAxmXD7V_pIg1KEDK*HnCo?Gab2X5sebNZmzhGh7GeWyK$e8x1wzc z466Kfmi>4AOHmLeQ7S+teS%;iA;xSiei}PvV|Uor8;aXS!9>w0gdo$=>?^@xyj{yL zha=yfvB?wz-#hQ70)B7ZjLBoT)Ex~1?v$}$KUH-yISLw+>@dua6vHDfHcLH8&L>lq zRQg`0EDTbKVf)f6o0R_;K9)2ozHh3&3;V+9SQVx2M~a&1Jtx*FNJ{8XD8i7OqNb&V z?}5QTi4&E{n7!oMb*uEEcT`(1>t}A?9VgKoOQxlpu3I zunIXAim1R1Zk}P0X-pQ<4SbL-^^;CW3l#cUbDr3C0whi0{vw@In6`>hpK85#)*-Yc zXM=FKC;yk7r|)wDn}Ch&4>6F3`78y$S|IrkG)t~f>(kWl**UmRSb>%3H_?pdM0=!U zPkfWsD*>CxjOv9zUO_F{dSY>)9&(2O@T$EQlCo^b8EbO2)vK-xv|5eUTwVR;+Z_-U z-1U*T63-*iqR>uDB8>0Fiy%Q*`3rZHsKSxW$Y(v0hd2^1Wd8T!FGrr@`=C`X@tQ+m z22~215!9Gq)*AjZDTG4RksOhi2QJgr_TLLug{IG^{9a2>i%^&X7k+yXwp0-kQqT|{ z!^$ew0)6J1dRBn4P2ojc3nkkIC3$Dst#|Jqfqlr1Qb{*AdEb(+1E#_GJoKbYcmHNG zr)A_m;Z-vq!XiAO0~EtA{}n(BegKbf!mCRQ(r#Ks&Zi6T2Drd2qU-PmxalqNo!fMG zKo^)#-{Uu6v-s`emOsu~jN?iK`ks%yRA0jRs=GLoTK)oCWf^S5B z1#0pbzA2FTkph{`ILH80OTGa#(jl#xWb5?T>_}J|YUI#R6mwTtvPP=M#RSI7C_pLK z0&=5|z+?ERLK4l>jQNIGky-4`AAAo=?UXcTaH^@+sXjEa#uBuxCOOA`?w=o8++FxGO&OO87bovQUXY?I(&l4-&tj{e@u zm}*-5Gt+T-z*I&nlsf$|bCa#%E&;TcLD;!9-yln^wD^1qvaa%!?3DaLr)q>S?J!a` zg8JdWvb2Ez!Q^G%X4&$t44|pJm0V-8$jtMYiKdCqoN?e~!bGu#`a3c@$)j<0<%0%eV%OC(Nbb zos_-yV$N+PbMjdV*!JVJ{|3c)TINi63k{&NI2p^z3nD;g;lMSfvq-=@Ax%7rK)eSA zLuZjlc)-S$G9X?@6xgb-xb{c4p|J^o)CQGS8I%^4&K?0GWN9&;PL>Xn){rZ<$rL-2 z1j~{5?p9NHX)L;#MY?6kmC&dwsST=q9PnKa2RVZ?-yyXoTN=*VknQ4tY$XTaXQ-&6 zdApz+#qWzC%olVB@;5)%RLa5h+n7)|WP6f}flSU@L|lM-n(z42=a;d>kd}ObdIl|0 z+OM*hn4UCAdg({BQ(|Y`BZw))aul+3;YpDZ#g;?iTXiz(Oc_a5H8g@jcSXc^#qifT zJ7_z&T0wUu&0*%!7=A8u`*-(_#&^C_A>$ZMlm>9G@{Vm1fx+BT`|5kE3N?^BJ8nn&NC zX@*8LWP>+ngbQ?*5(2FTCy#7+h~WFo`!gR|Uad22Mgs%nI)db0>SdWc0LI`-@@%M} z09Qd7d6Xu*7RVzzVAP&T@_jU%LOZcboim@>4!cuFkw690^F(X(q0~qkyVnNYG1p72_d<~HUN3i5Rz|919ea_awJ+M~3cW1%9gy6fN zHoX09yEjk*aiBXvt092y{%0}E+r+ou-(q*S@758CR}<@QK~MQ8lxDbrg9#HA{6ip% z4sCY4g`=M53A$OJs{LP;$%4)-BE->=CFy^}pi!*T3BhPJ!m5k40v4JIguhpV=i^se z>PucmnNP|}r$Dy}AjJ9AnVLNAihImF_|)yU&-8B9gm9J83y-!LcEn}y`joEa&)L~y z_)d&zoAo5FnzaCyJ~#5Ja%}>KkfY0IbjlDB32HL&ZG?F8&T&{P0c{ zw(=FUnj&sFK-Atv(zu7B@nM42O8|S%0IN_9o2|s(^96sUFyLRJn*|)yYWD-sdvf(t`mPb^WWoWBPHh8;x(b*h-LMMjcY#C*@Z1B88LY7Fd z%)x}AkH$j6OZdstnl~0txHUoeZQWPmF+#Zu@)5pM?1!h3mKHoAY9j+Tb1PwLOBL4Y zP*Vm2KN-98QhJqZUS=_!kNQFP**oBhNsS)B41Al@uDAIEZD6r)mP6c6yh`%F z0Sm-zo&gn;x$a=Zh~<mfA(SY|Bk-2DHU8vb>~ADl|6qHM0mC ze@t4u!{9$%s|1#eA7blGve4a5;_E+O+9*4-wAQ<7KFN+9`Dt7o_snSswEe8}9!T9D z%6A5-P7FpRLoCKnsl`E}``+(Nut0Q{Y|#Z)a_qlMp;uV#AQ6U%k>)n@v7OZ{Cg zH?RUFjX1M3-ryiU8Pj@PTdXS8=4H{w{xmEnP&Y*VX%3-4 z-54iO&XKY7WDFrj5FthqpiaSojKzVBgFu`}0Xhl(Gywp$G62gG0LwA}>Qn;M6atkt z0BVaoA~UaF73u?M+TTtlU*};2-YxL+Nu{9>1?UolW})1$0QGhHp)9Zfm8JkH$ov-( z+)EIMkfnDO$0;%u`c(*Dwjlgb6`BJ{3T-__kSL=y(|6naXS`#9M!NlA)jj`9xU=}h*Wr(3{d%!zr z&1mZD`o_`#3p;NTB?t44VYAM=0@EsMn?ETFpTAttN|Na7Qx=TIg5HRzVnR?3A*hrP zDEGM)ln};%lga#3CC|P+tS3NdQeEnm}tb*R4DXy)EMg|<1a^2aQtg!{1sjD$25u2f8TaCzSh_Iag#^+VTA z&da{{dOyopP;5p!6^TW7Dl)N%XtICo zZYr~{nZwinYQ$_Jo5=@RWK`Qo=Ri$tAoP)9M^<7+~BuRzp?`D8M4IKcm$S zD%s(Ju+`kp!f~5o)ggM+b7tJ*fVjhPpj}U&`3d~pv|h@~{d(dN^l>jIV4 zFiZAjtBO9$3sbj^ZmM&hZ7qZ>Oa-kD>{?`exU|-S28Q9|fQ}tc4s!~Vf8vNN;PV4p zpgcjzqdlCGw4rLJ?IvlpAEsP<8_1w$C8Tfc^uK1^)4diW!upkzaD#rlvde`%dTa`c@$yp&y2ey4Nw1_Y+I8 z$bhAH+|W)i(i~y0h-Ht4#ZlA_zl*>%nt6rqnSS6;hw7CSW`)*H_wp9GU*jh@q#bGv zbdC)xSXjFX2PFpE$TiPk_+*9MV%0ta-T(4y+0?V>2RK)(r3VGp42<=oc4SlSj|3FU zjuq;9wf)8v64_js4Rp@UuuraZ>54kJJ5C6cFpSI$G#_}pF>e=HUJHHNv5tbUHfVe|T z^~N*wkn{pyCK&f$v#Er%NL>_NgFX-gIAk-xA>FC*!3hSTlg<-OFJk3FI(zqYrhKX0 z&6DpZ--!UY#XY{orIE?P*ku%e6p){W%osTZJ@$?^-shC4-!SF1E#ME4sC}wA)_1Pv z18X{N0c^)zz~yC69nNqWjxsM(NRHde$JlV0cB z8Xg>J9$_i1?3W%NuPOerUAix29=hjaY+*Yrl%vN@V4#Ra`ValNPA!jxV^d~gJ|Oo_!D;e4Agw)xOz_%%OYH2Q|eBzkxvDda;}%w5sJv=ZO` zX!ll%B^eUS|NLQh@S4otJ1XfTwiVT4!m3IBPE9>H;0~Ok>fNk-IIR_2>vk$$v5`*w zZI_nOqf`?<^D?z{hTYvbUC$6PbJmGCsyIgZc!RBbU}^R zBm%yIuv=zwm`Vm)Hc&~Rz8(50PF&3<9_3}FsE$t`gfGz1C4buUxcJ?pH5Yq)^w9GI8FQFVuOtE9=?A(!x!?2TL@yqaXzROtg`B$$cM z2Eom?kEuL$N#$Wgoa_kzFWEP1Ga-#t8h(N>vdGL%H$5l$oYa@nYuDaF-0@UiA#DHv zSUY{|$d&i{*N`Er!acmzJr}yVA070~6uboS)Ba5NDU~O06bBxL)_NVP3v>&l5%i`= zR)s|Nm3*ocHumPX8Uta>3wq5{xJ;y(w;BoI0!O_#c*c~-q-t}zw>qAe9kvwe#jc0J(fKZtT4i>>PwTKUZcn zj4NU`*ngO8@e5Z7RWrhuKc7!q7{)n`LogaD9y(V@?kVCXg3o z6$+%nA%_Dzx@X@9sy&tjxa;NRgt%n$HgQ+xDO$=Iq)(J}vXw$;s=~zf4_VSO=~u>3 zzTtQ`(}z7s5Vd{(I*6JEzrqT;Lar(UXRdHw6&_e5VwqYvBiUk!r7v|pmhals?Q-{UX z(O4A`nTa&=t64dP$xBkcB#vg(A;=K3gulyIavPMN8Dh-km+wS%#idIkbH|7+II@|U z;fCOGG)T4~kfd2-%)#WQKkV?s*xJ$Ys52##caKc=j4-R6ZY^FbGU}8U8lsT-=65F7TXid#dkhfE;O%YzvM+#tff2a@6~AZ^QAhF1;m}S-H|}& zmnS|kQ-rcvp*>iiHC%-V14&+^S;ty__zTQ>z9(=nQr3}lTuhw%m~xgz0ey)!BH!CX zlz^$+<0&zur+I0I;3XBd%Qje|Oj+MiaK(876DCYgfu*omcVt`oGFUu64HFG%bMK-z z^4P%mThk?_uX$(1lRnM3QuSzszoBfLbU!*=s>;Eq6~=1G1~;C>Y(!kU6JV(r_wIm6 ziq6W(4|G6(#dJ641&rAYcA8Qotszgv**>O7DIMjTyxts5E<3J42yOEoHBB0C;ieJ6 zLmiHvT%ud;T8ee|P)AXLhm5z+{@ea@`7Kp!V>)EQKDL>Xun~F-+t&>)Zk{`VYiRHB zK(uxnzT}~4Ec#lBCL^YPRNv=e22s2}$UW4&Rjp8K@3M`E72b)bJQ&Nw%DDcSYvV3i zf6~oG!0q{_9_@oQfmObRHVJF?J_z-TwaA zY;a=sQYG2*jK(#TpvTlSy-E`=M$=(kUD4vaIK3Gpg}#1F&Z`@f%+cJtio%tqc;AT0 zvE4IPeeu5S$FVx|zHkD2@YJvG07+cfmFHR4BOnoOF*u!W;e|FbF2@*`jH> z{N-8DVMeBU3UFs9Ak71)wy$l z^RP?TiAPWeB%i%y)$K)@J$>bX zirH@zV*`0N4OzJ2#tK|6Pjb_l4SP{t=}FsG+^RI z$vb%&Z7mB<%PMQwElnr;JV&y=YpnAC@j8rm_zV}!`_{e1_=?RAwAkK#@~Un0E=FAI z?I$Syp{CR3U2Jr*Y`t#3qeDe!zKw5=1U1WY{wy+-KZX}Uj}SM6v@ZlW&Vs`4M<*BQ z>Jn^!cIZ*)h-Yudem-JX3vX?{9*@zEH10@$^~OZ6RR1;PbuG6xd{g0#t^9!OB{2xWPXasFJ&d>$po^^ z2h>cY@Cm`$`3{DoTXCpldIx-V)8uCW^yFg#+ar>Klro#Ewu@grZ!CfW$GMTo*~C;o zCNW3JAaAgKtL#>cO${!Rm02gToQu8n;Q`_8p$)vrDh`pQVK0Tf@t!Oba!Mz5s<5Hc zyBD{l%39UAb&ayRl`G%@sP1M`co)+Hs{y*VP9UDrFzA&iH<9B zPSi;oRiW9F?X5F&#Mygf_{UertJ zuj;`#e7^Tv{`~DUVR25;0vZxENrH;8nCWo$8PRrSq+Vr!gZ)=`0!jqWSNRFZ&Av3i z#E>1$UeO)kVgV(~@@#OmyG0V=0fG!FWJnsIqH||N7-ItH-r=Q#Y|6j08aLrRtpx1Z z=F9`*AISyOQ>W5^A>1&meE0nU@k?X@RCdH2%m7Wp5I7A~O3yla@?|lR29}X#@k0T} zih_%m?V|~uY!pjRF@(1aXqyp1u%10mr~TUO&5WkzS2JKyOoRCDf|`kyX(R-0$M0PK@vsN#TtA3xVbt(K_up z2=UPaQZM*ak$|*71Ww+jGOu8sNDL&o$TZYLArnol7iNCAwn3TW(#0tyHBtiAAPdoj z2rxkn%mIh1V2p$4{In$XJvS7kl~6$klbpR=9FIoO>Kn`Ce@GeMfUcQF* z`+|%D1JdMR6XjfdvR@(jeJaTiL&z+P!(_?{Obpd&3=k?-b}kl>>x$3H6xDx40y~5X1@o zw)j;PqDcqoe;zc01bM5H`+?Bcn}ZQXTO5op`v!aL4cWNqIVb0Y3b4EXtayE=j;oxA z-$I{LW7taf_U+@gW~c8>`{l>e%x%bZ-XZkPH7NJDl7zR<*|+oYS8%Re*uI^Lp6>!ZT%w32s@GedjYonTKZ}=3s>gu~Q4}F&YJ!W*i z=<}>Q1nKE2T1>8T-79pouFqUld}vaI!NBp-68WrA^_WH>-G~Os(j`) zZd89BFTee!W!?=PF6thdas1W!s|Cb(#O2btKY+ zk$1htDZqv(u?<=EE$FrR6BO(1u~lw3N)#afaoDbnHoxE1im1`rB+N2TMP9xa&EgsF zqyl^p*0>%kt`(|XMe+wrfRq_Xat>D`)+JnOXnjyAXVNsz{;2iB!C~IDQ+k2>;BUFt zx^AkvQEW0|KQ4*3MTMv?R`NJ6Tme%!2#Nq|kkm`-m4ufi`FQLKwrUREIpibEgzdR4 z8%+y85nf;7Bu4)HDl5emDsM3_9&6+0USS&gxErpBap)ZY)8a9-y$A4ZKpk+kj<5x{ zU9{^mkjhq_c~C(}6ltB;pwG=D4n)cVsc3jEO8U&Fox}0zniphQ3=Y03H z6#GSwx35~$PEc!?={4r48Ny&`f!A8(atplXh6mgT*ky{1S)fduG>_2~(dO!R8cDv0OUxsEy?l*CC zTOJ?+4tmyle`}9)ba^NmrhqcO6@CXh0%6}th;oh@!< zpPUKSCb*fCfs|6b)Z%3{$K!p}?t(-ZEO3g!#3G zvM6gBL*}}9h51Rt)t+5reV8eM`_nXgll>q2XHqR`jdOUZmCLEPIjp_kNd)pCH9I35 z3=i9~#i_ZaL*=*_0~UdB;q==@J>r_J>{*mWd7t!GCKVN^nNDVZF%cl z*tU-TIE~qaJ%@?vhO@?)-&=otJev+7=Oq4axn6GhnQP?VV$$Gt`|25hk>|i$f^5ZN zSo%{Knl%qW(Viz$uEJndDKmAk?OXPGFRs*7eE={30mP?Oh}fZhSn_8${LSzZ!UI(N zHZLqre9-p3yeCdY$p*dpZ3{OsHRW|h7}fL&oB>)8i|{L8r8+HAS==Q`T;Lnm&VaW_>lUTu4NhJwuks_iC^crKMmb`d~pmbFQiybSk#JpwoF#TAz2qP^+JKvfq;1Kj2>F$=}P#WPbsR z8e)*|#*x;2b9oc5T=;Z*6Saf8v4=h57f1LEZU=ZPlzcxHxXtsg*7#Pf_nRny$ zE&Ou^<@uPWn*Z0}2k8vF^Uh4sO_3hhDg42Mp+)tMwbp0khhn?HJ-G|PO`q!O^U_FM z*nWuLEuqBI4g}HL_~*V*)!WP)%x4tvQ{V4b#ww-XV|j(+pH_@dbsvQ!{BJgohhPt% z1m3UCH#K?v@Vg@JCW*Kp+%gC;$Km zfd7$J8S*Qw@;@2^z@^|Hzhp&K1ZgGZ#OVJa_GdO`++f^|p07Wk0|Ee`{6psd`z{V3 z|93H2K{-h=QDqf6S+Tz(2Kg_9KZwb`FzrlT{>k~Dy9)gm35kD7xL7(FIvf72Aktq1 z9seq5Y;R|0Y4W%7Sbvc(_>b~Nu68Cirp|whgZmepwZFwNG5T95%D+IN0R6*y|Fp$F zRr*(#zM%eh zAmB^tzkEnWQdm?@S@gfV(&i6gF;q|hfbVbs0K$I?0~7}^ei{1@NBIAxit;~mfGaD? z2!9Qusj-W_6P>Y*p|kUUCu}t;*!TP*<01wC5dRBd8~*<@p_!$*tCOLNrM=yMCM|ru zIobgS066_}K#{+YmeBn_lm4OQ|CW&%1^F)TD|)g;T2Zt6_u z;AHP$>f~Z+`acXR4VHX)0R{j-@?}1$zc76Y{$DWt+X#wT+PIiHsW=(hIolZiZwIo9 ziukAT*W97|r6u-Xc#S3h^j2XfQ$rWie}L1OJK5X2dH#2g0M38w4gUgi`5!>=UoQPG zw^wyA`9A?o4#iq~0s{aDeU0>Ad$g!gHj4e!U4gUks*LeSjb?^)CpY4yCZ@}>%#RmS}X>Pv?68w9qf(); +accAttrsInfo.add(uidAIB.build()); +accAttrsInfo.add(AttributeInfoBuilder.build("subject_id", String.class)); +accAttrsInfo.add(AttributeInfoBuilder.build("subject_identifier0", String.class)); +accAttrsInfo.add(AttributeInfoBuilder.build("sort_string0", String.class)); +accAttrsInfo.add(AttributeInfoBuilder.build("search_string0", String.class)); +accAttrsInfo.add(AttributeInfoBuilder.build("name", String.class)); +accAttrsInfo.add(AttributeInfoBuilder.build("description", String.class)); +accAttrsInfo.add(AttributeInfoBuilder.build("group", String.class, [Flags.MULTIVALUED] as Set)); +// Create the __ACCOUNT__ Object class +final ObjectClassInfo ociAccount = new ObjectClassInfoBuilder().setType("__ACCOUNT__").addAllAttributeInfo(accAttrsInfo).build(); +builder.defineObjectClass(ociAccount); + +/* +// Declare the __GROUP__ attributes +// Make the gid required +gidAIB = new AttributeInfoBuilder("gid",String.class); +gidAIB.setRequired(true); + +grpAttrsInfo = new HashSet(); +grpAttrsInfo.add(gidAIB.build()); +grpAttrsInfo.add(AttributeInfoBuilder.build("name", String.class)); +grpAttrsInfo.add(AttributeInfoBuilder.build("description", String.class)); +// Create the __GROUP__ Object class +final ObjectClassInfo ociGroup = new ObjectClassInfoBuilder().setType("__GROUP__").addAllAttributeInfo(grpAttrsInfo).build(); +builder.defineObjectClass(ociGroup); + + +// Declare the organization attributes +// Make the name required +nAIB = new AttributeInfoBuilder("name",String.class); +nAIB.setRequired(true); + +orgAttrsInfo = new HashSet(); +orgAttrsInfo.add(nAIB.build()); +orgAttrsInfo.add(AttributeInfoBuilder.build("description", String.class)); +// Create the organization Object class +final ObjectClassInfo ociOrg = new ObjectClassInfoBuilder().setType("organization").addAllAttributeInfo(orgAttrsInfo).build(); +builder.defineObjectClass(ociOrg); +*/ + +log.info("Schema script done"); diff --git a/grouper-midpoint/mp-gr/m-server/container_files/res/grouper/SearchScript.groovy b/grouper-midpoint/mp-gr/m-server/container_files/res/grouper/SearchScript.groovy new file mode 100644 index 0000000..801bfe1 --- /dev/null +++ b/grouper-midpoint/mp-gr/m-server/container_files/res/grouper/SearchScript.groovy @@ -0,0 +1,101 @@ +/* + * ==================== + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright 2013 ForgeRock. All rights reserved. + * + * The contents of this file are subject to the terms of the Common Development + * and Distribution License("CDDL") (the "License"). You may not use this file + * except in compliance with the License. + * + * You can obtain a copy of the License at + * http://opensource.org/licenses/cddl1.php + * See the License for the specific language governing permissions and limitations + * under the License. + * + * When distributing the Covered Code, include this CDDL Header Notice in each file + * and include the License file at http://opensource.org/licenses/cddl1.php. + * If applicable, add the following below this CDDL Header, with the fields + * enclosed by brackets [] replaced by your own identifying information: + * "Portions Copyrighted [year] [name of copyright owner]" + * ==================== + * Portions Copyrighted 2013 ConnId. + */ +import groovy.sql.Sql; +import groovy.sql.DataSet; + +// Parameters: +// The connector sends the following: +// connection: handler to the SQL connection +// objectClass: a String describing the Object class (__ACCOUNT__ / __GROUP__ / other) +// action: a string describing the action ("SEARCH" here) +// log: a handler to the Log facility +// options: a handler to the OperationOptions Map +// query: a handler to the Query Map +// +// The Query map describes the filter used. +// +// query = [ operation: "CONTAINS", left: attribute, right: "value", not: true/false ] +// query = [ operation: "ENDSWITH", left: attribute, right: "value", not: true/false ] +// query = [ operation: "STARTSWITH", left: attribute, right: "value", not: true/false ] +// query = [ operation: "EQUALS", left: attribute, right: "value", not: true/false ] +// query = [ operation: "GREATERTHAN", left: attribute, right: "value", not: true/false ] +// query = [ operation: "GREATERTHANOREQUAL", left: attribute, right: "value", not: true/false ] +// query = [ operation: "LESSTHAN", left: attribute, right: "value", not: true/false ] +// query = [ operation: "LESSTHANOREQUAL", left: attribute, right: "value", not: true/false ] +// query = null : then we assume we fetch everything +// +// AND and OR filter just embed a left/right couple of queries. +// query = [ operation: "AND", left: query1, right: query2 ] +// query = [ operation: "OR", left: query1, right: query2 ] +// +// Returns: A list of Maps. Each map describing one row. +// !!!! Each Map must contain a '__UID__' and '__NAME__' attribute. +// This is required to build a ConnectorObject. + +log.info("Entering "+action+" Script"); + +def sql = new Sql(connection); +def result = [] +def where = ""; + +switch ( objectClass ) { + case "__ACCOUNT__": + sql.eachRow("\ +select m.id, m.name, m.subject_id, m.subject_identifier0, m.sort_string0, m.search_string0, m.description, m.subject_source, group_concat(distinct g.name) as groups \ +from \ + grouper_members m \ + left join grouper_memberships_all_v gm on m.id=gm.member_id and gm.owner_id in \ + (select m.subject_id \ + from grouper_memberships gm join grouper_members m on gm.member_id=m.id \ + where gm.owner_id = (select subject_id from grouper_members where name='etc:exportedGroups' and subject_type='group')) \ + left join grouper_groups g on gm.owner_id=g.id \ +group by m.id \ +having \ + subject_source = 'ldap';", + {result.add( + [__UID__:it.id, + __NAME__:it.subject_id, + uid:it.id, + subject_id:it.subject_id, + subject_identifier0:it.subject_identifier0, + sort_string0:it.sort_string0, + search_string0:it.search_string0, + name:it.name, + description:it.description, + group:it.groups?.tokenize(',')])} ); + break + +/* case "__GROUP__": + sql.eachRow("SELECT * FROM Groups" + where, {result.add([__UID__:it.name, __NAME__:it.name, gid:it.gid, ,description:it.description])} ); + break + + case "organization": + sql.eachRow("SELECT * FROM Organizations" + where, {result.add([__UID__:it.name, __NAME__:it.name, description:it.description])} ); + break */ + + default: + result; +} + +return result; diff --git a/grouper-midpoint/mp-gr/m-server/container_files/res/grouper/TestScript.groovy b/grouper-midpoint/mp-gr/m-server/container_files/res/grouper/TestScript.groovy new file mode 100644 index 0000000..a232c15 --- /dev/null +++ b/grouper-midpoint/mp-gr/m-server/container_files/res/grouper/TestScript.groovy @@ -0,0 +1,38 @@ +/* + * ==================== + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright 2013 ForgeRock. All rights reserved. + * + * The contents of this file are subject to the terms of the Common Development + * and Distribution License("CDDL") (the "License"). You may not use this file + * except in compliance with the License. + * + * You can obtain a copy of the License at + * http://opensource.org/licenses/cddl1.php + * See the License for the specific language governing permissions and limitations + * under the License. + * + * When distributing the Covered Code, include this CDDL Header Notice in each file + * and include the License file at http://opensource.org/licenses/cddl1.php. + * If applicable, add the following below this CDDL Header, with the fields + * enclosed by brackets [] replaced by your own identifying information: + * "Portions Copyrighted [year] [name of copyright owner]" + * ==================== + * Portions Copyrighted 2013 ConnId. + */ +import groovy.sql.Sql; +import groovy.sql.DataSet; + +// Parameters: +// The connector sends the following: +// connection: handler to the SQL connection +// action: a string describing the action ("TEST" here) +// log: a handler to the Log facility + +log.info("Entering "+action+" Script"); +def sql = new Sql(connection); + +sql.eachRow("select * from grouper_members limit 10", { println it.subject_id } ); + + diff --git a/grouper-midpoint/mp-gr/m-server/container_files/res/sis/SchemaScript.groovy b/grouper-midpoint/mp-gr/m-server/container_files/res/sis/SchemaScript.groovy new file mode 100644 index 0000000..6cbee2d --- /dev/null +++ b/grouper-midpoint/mp-gr/m-server/container_files/res/sis/SchemaScript.groovy @@ -0,0 +1,54 @@ +/* + * ==================== + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright 2013 ForgeRock. All rights reserved. + * + * The contents of this file are subject to the terms of the Common Development + * and Distribution License("CDDL") (the "License"). You may not use this file + * except in compliance with the License. + * + * You can obtain a copy of the License at + * http://opensource.org/licenses/cddl1.php + * See the License for the specific language governing permissions and limitations + * under the License. + * + * When distributing the Covered Code, include this CDDL Header Notice in each file + * and include the License file at http://opensource.org/licenses/cddl1.php. + * If applicable, add the following below this CDDL Header, with the fields + * enclosed by brackets [] replaced by your own identifying information: + * "Portions Copyrighted [year] [name of copyright owner]" + * ==================== + * Portions Copyrighted 2013 ConnId. + */ +import org.identityconnectors.framework.common.objects.AttributeInfo; +import org.identityconnectors.framework.common.objects.AttributeInfo.Flags; +import org.identityconnectors.framework.common.objects.AttributeInfoBuilder; +import org.identityconnectors.framework.common.objects.ObjectClassInfo; +import org.identityconnectors.framework.common.objects.ObjectClassInfoBuilder; + +// Parameters: +// The connector sends the following: +// action: a string describing the action ("SCHEMA" here) +// log: a handler to the Log facility +// builder: SchemaBuilder instance for the connector +// +// The connector will make the final call to builder.build() +// so the scipt just need to declare the different object types. + +// This sample shows how to create 3 basic ObjectTypes: __ACCOUNT__, __GROUP__ and organization. +// Each of them contains one required attribute and normal String attributes + + +log.info("Entering "+action+" Script"); + +uidAIB = new AttributeInfoBuilder("uid",String.class); +uidAIB.setRequired(true); + +accAttrsInfo = new HashSet(); +accAttrsInfo.add(uidAIB.build()); +accAttrsInfo.add(AttributeInfoBuilder.build("courseId", String.class, [Flags.MULTIVALUED] as Set)); +ociAccount = new ObjectClassInfoBuilder().setType("__ACCOUNT__").addAllAttributeInfo(accAttrsInfo).build(); +builder.defineObjectClass(ociAccount); + +log.info("Schema script done"); diff --git a/grouper-midpoint/mp-gr/m-server/container_files/res/sis/SearchScript.groovy b/grouper-midpoint/mp-gr/m-server/container_files/res/sis/SearchScript.groovy new file mode 100644 index 0000000..026ef8d --- /dev/null +++ b/grouper-midpoint/mp-gr/m-server/container_files/res/sis/SearchScript.groovy @@ -0,0 +1,71 @@ +/* + * ==================== + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright 2013 ForgeRock. All rights reserved. + * + * The contents of this file are subject to the terms of the Common Development + * and Distribution License("CDDL") (the "License"). You may not use this file + * except in compliance with the License. + * + * You can obtain a copy of the License at + * http://opensource.org/licenses/cddl1.php + * See the License for the specific language governing permissions and limitations + * under the License. + * + * When distributing the Covered Code, include this CDDL Header Notice in each file + * and include the License file at http://opensource.org/licenses/cddl1.php. + * If applicable, add the following below this CDDL Header, with the fields + * enclosed by brackets [] replaced by your own identifying information: + * "Portions Copyrighted [year] [name of copyright owner]" + * ==================== + * Portions Copyrighted 2013 ConnId. + */ +import groovy.sql.Sql; +import groovy.sql.DataSet; + +// Parameters: +// The connector sends the following: +// connection: handler to the SQL connection +// objectClass: a String describing the Object class (__ACCOUNT__ / __GROUP__ / other) +// action: a string describing the action ("SEARCH" here) +// log: a handler to the Log facility +// options: a handler to the OperationOptions Map +// query: a handler to the Query Map +// +// The Query map describes the filter used. +// +// query = [ operation: "CONTAINS", left: attribute, right: "value", not: true/false ] +// query = [ operation: "ENDSWITH", left: attribute, right: "value", not: true/false ] +// query = [ operation: "STARTSWITH", left: attribute, right: "value", not: true/false ] +// query = [ operation: "EQUALS", left: attribute, right: "value", not: true/false ] +// query = [ operation: "GREATERTHAN", left: attribute, right: "value", not: true/false ] +// query = [ operation: "GREATERTHANOREQUAL", left: attribute, right: "value", not: true/false ] +// query = [ operation: "LESSTHAN", left: attribute, right: "value", not: true/false ] +// query = [ operation: "LESSTHANOREQUAL", left: attribute, right: "value", not: true/false ] +// query = null : then we assume we fetch everything +// +// AND and OR filter just embed a left/right couple of queries. +// query = [ operation: "AND", left: query1, right: query2 ] +// query = [ operation: "OR", left: query1, right: query2 ] +// +// Returns: A list of Maps. Each map describing one row. +// !!!! Each Map must contain a '__UID__' and '__NAME__' attribute. +// This is required to build a ConnectorObject. + +log.info("Entering "+action+" Script"); + +def sql = new Sql(connection); +def result = [] +def where = ""; + +switch ( objectClass ) { + case "__ACCOUNT__": + sql.eachRow("select uid, concat(surname, ', ', givenName, ' (', uid, ')') as name, group_concat(courseId) as courses from SIS_COURSES group by uid", {result.add([__UID__:it.uid, __NAME__:it.name, uid:it.uid, courseId:it.courses?.tokenize(',')])} ); + break + + default: + result; +} + +return result; diff --git a/grouper-midpoint/mp-gr/m-server/container_files/res/sis/TestScript.groovy b/grouper-midpoint/mp-gr/m-server/container_files/res/sis/TestScript.groovy new file mode 100644 index 0000000..95f87ad --- /dev/null +++ b/grouper-midpoint/mp-gr/m-server/container_files/res/sis/TestScript.groovy @@ -0,0 +1,38 @@ +/* + * ==================== + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright 2013 ForgeRock. All rights reserved. + * + * The contents of this file are subject to the terms of the Common Development + * and Distribution License("CDDL") (the "License"). You may not use this file + * except in compliance with the License. + * + * You can obtain a copy of the License at + * http://opensource.org/licenses/cddl1.php + * See the License for the specific language governing permissions and limitations + * under the License. + * + * When distributing the Covered Code, include this CDDL Header Notice in each file + * and include the License file at http://opensource.org/licenses/cddl1.php. + * If applicable, add the following below this CDDL Header, with the fields + * enclosed by brackets [] replaced by your own identifying information: + * "Portions Copyrighted [year] [name of copyright owner]" + * ==================== + * Portions Copyrighted 2013 ConnId. + */ +import groovy.sql.Sql; +import groovy.sql.DataSet; + +// Parameters: +// The connector sends the following: +// connection: handler to the SQL connection +// action: a string describing the action ("TEST" here) +// log: a handler to the Log facility + +log.info("Entering "+action+" Script"); +def sql = new Sql(connection); + +sql.eachRow("select * from SIS_COURSES limit 10", { println it.uid } ); + + diff --git a/grouper-midpoint/mp-gr/m-server/container_files/schema/user-schema.xsd b/grouper-midpoint/mp-gr/m-server/container_files/schema/user-schema.xsd new file mode 100644 index 0000000..d7b2f86 --- /dev/null +++ b/grouper-midpoint/mp-gr/m-server/container_files/schema/user-schema.xsd @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + diff --git a/grouper-midpoint/mp-gr/s-data/Dockerfile b/grouper-midpoint/mp-gr/s-data/Dockerfile index e19ee69..f21df4f 100644 --- a/grouper-midpoint/mp-gr/s-data/Dockerfile +++ b/grouper-midpoint/mp-gr/s-data/Dockerfile @@ -41,4 +41,4 @@ RUN useradd ldapadmin \ EXPOSE 389 3306 -CMD /usr/sbin/ns-slapd -D /etc/dirsrv/slapd-dir && mysqld_safe +CMD rm -rf /var/lock/dirsrv/slapd-dir/server/* && /usr/sbin/ns-slapd -D /etc/dirsrv/slapd-dir && mysqld_safe diff --git a/grouper-midpoint/mp-gr/t-data/Dockerfile b/grouper-midpoint/mp-gr/t-data/Dockerfile new file mode 100644 index 0000000..6e87782 --- /dev/null +++ b/grouper-midpoint/mp-gr/t-data/Dockerfile @@ -0,0 +1,30 @@ +FROM centos:centos7 + +LABEL author="tier-packaging@internet2.edu " + +RUN yum install -y epel-release \ + && yum update -y \ + && yum install -y 389-ds-base 389-admin 389-adminutil \ + && yum clean all \ + && rm -rf /var/cache/yum + +COPY container_files/seed-data/ /seed-data/ + +RUN useradd ldapadmin \ + && rm -fr /var/lock /usr/lib/systemd/system \ + # The 389-ds setup will fail because the hostname can't reliable be determined, so we'll bypass it and then install. \ + && sed -i 's/checkHostname {/checkHostname {\nreturn();/g' /usr/lib64/dirsrv/perl/DSUtil.pm \ + # Not doing SELinux \ + && sed -i 's/updateSelinuxPolicy($inf);//g' /usr/lib64/dirsrv/perl/* \ + # Do not restart at the end \ + && sed -i '/if (@errs = startServer($inf))/,/}/d' /usr/lib64/dirsrv/perl/* \ + && setup-ds.pl --silent --file /seed-data/ds-setup.inf \ + && /usr/sbin/ns-slapd -D /etc/dirsrv/slapd-dir \ + && while ! curl -s ldap://localhost:389 > /dev/null; do echo waiting for ldap to start; sleep 1; done; \ + ldapadd -H ldap:/// -f /seed-data/users.ldif -x -D "cn=Directory Manager" -w password + +EXPOSE 389 + +# temporary! + +CMD rm -rf /var/lock/dirsrv/slapd-dir/server/* && /usr/sbin/ns-slapd -D /etc/dirsrv/slapd-dir && sleep 100000000 diff --git a/grouper-midpoint/mp-gr/t-data/container_files/seed-data/ds-setup.inf b/grouper-midpoint/mp-gr/t-data/container_files/seed-data/ds-setup.inf new file mode 100644 index 0000000..96c29a1 --- /dev/null +++ b/grouper-midpoint/mp-gr/t-data/container_files/seed-data/ds-setup.inf @@ -0,0 +1,28 @@ +[General] +AdminDomain = internet2.edu +ConfigDirectoryAdminID = admin +ConfigDirectoryAdminPwd = admin +ConfigDirectoryLdapURL = ldap://localhost:389/o=NetscapeRoot +FullMachineName = localhost +ServerRoot = /usr/lib64/dirsrv +SuiteSpotGroup = nobody +SuiteSpotUserID = nobody + +[admin] +Port = 9830 +ServerAdminID = admin +ServerAdminPwd = admin +ServerIpAddress = 0.0.0.0 +SysUser = nobody + +[slapd] +AddOrgEntries = No +AddSampleEntries = No +InstallLdifFile = suggest +RootDN = cn=Directory Manager +RootDNPwd = password +ServerIdentifier = dir +ServerPort = 389 +SlapdConfigForMC = yes +Suffix = dc=internet2,dc=edu +UseExistingMC = No diff --git a/grouper-midpoint/mp-gr/t-data/container_files/seed-data/users.ldif b/grouper-midpoint/mp-gr/t-data/container_files/seed-data/users.ldif new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/grouper-midpoint/mp-gr/t-data/container_files/seed-data/users.ldif @@ -0,0 +1 @@ +