From 4390a417a8a2e8eb5c13decde290b45d609cd8b3 Mon Sep 17 00:00:00 2001 From: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Date: Fri, 21 Jun 2024 15:01:59 +0200 Subject: [PATCH 001/169] initial commit Signed-off-by: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Signed-off-by: Abdul Hameed --- sdk/python/feast/permissions/__init__.py | 0 .../feast/permissions/authorized_resource.py | 131 ++++++++++++++++++ sdk/python/feast/permissions/decision.py | 75 ++++++++++ sdk/python/feast/permissions/enforcer.py | 81 +++++++++++ sdk/python/feast/permissions/permission.py | 121 ++++++++++++++++ sdk/python/feast/permissions/policy.py | 59 ++++++++ sdk/python/feast/permissions/role_manager.py | 31 +++++ .../feast/permissions/security_manager.py | 124 +++++++++++++++++ sdk/python/tests/unit/permissions/__init__.py | 0 .../permissions/test_authorized_resources.py | 117 ++++++++++++++++ .../tests/unit/permissions/test_decision.py | 111 +++++++++++++++ .../tests/unit/permissions/test_permission.py | 91 ++++++++++++ .../tests/unit/permissions/test_policy.py | 11 ++ .../permissions/test_require_permissions.py | 90 ++++++++++++ .../unit/permissions/test_role_manager.py | 17 +++ 15 files changed, 1059 insertions(+) create mode 100644 sdk/python/feast/permissions/__init__.py create mode 100644 sdk/python/feast/permissions/authorized_resource.py create mode 100644 sdk/python/feast/permissions/decision.py create mode 100644 sdk/python/feast/permissions/enforcer.py create mode 100644 sdk/python/feast/permissions/permission.py create mode 100644 sdk/python/feast/permissions/policy.py create mode 100644 sdk/python/feast/permissions/role_manager.py create mode 100644 sdk/python/feast/permissions/security_manager.py create mode 100644 sdk/python/tests/unit/permissions/__init__.py create mode 100644 sdk/python/tests/unit/permissions/test_authorized_resources.py create mode 100644 sdk/python/tests/unit/permissions/test_decision.py create mode 100644 sdk/python/tests/unit/permissions/test_permission.py create mode 100644 sdk/python/tests/unit/permissions/test_policy.py create mode 100644 sdk/python/tests/unit/permissions/test_require_permissions.py create mode 100644 sdk/python/tests/unit/permissions/test_role_manager.py diff --git a/sdk/python/feast/permissions/__init__.py b/sdk/python/feast/permissions/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/sdk/python/feast/permissions/authorized_resource.py b/sdk/python/feast/permissions/authorized_resource.py new file mode 100644 index 0000000000..da335245f4 --- /dev/null +++ b/sdk/python/feast/permissions/authorized_resource.py @@ -0,0 +1,131 @@ +import logging +import re +from typing import Any, Optional, Union, get_args + +from feast.feast_object import FeastObject + +ALL_RESOURCE_TYPES = "ALL" +AuthzedResourceType = Union[ALL_RESOURCE_TYPES, FeastObject] + + +logger = logging.getLogger(__name__) + + +class AuthzedResource: + """ + Identifies the protected resources by class type and optional filters + based on the resource name and tags. + + Attributes: + type: the type of secured resource (must match one Feast class, as defined by the FeastObject type, or the `ALL` string) + name_pattern: a regex to match the resource name. Defaults to None, meaning that no name filtering is applied + required_tags: dictionary of key-value pairs that must match the resource tags. All these required_tags must be present as resource + tags with the given value. Defaults to None, meaning that no tags filtering is applied. + """ + + type: AuthzedResourceType + with_subclasses: bool + name_pattern: Optional[str] + required_tags: Optional[dict[str, str]] + + def __init__( + self, + type: AuthzedResourceType, + with_subclasses: bool = False, + name_pattern: Optional[str] = None, + required_tags: Optional[dict[str, str]] = None, + ): + if type != ALL_RESOURCE_TYPES and type not in get_args(FeastObject): + raise ValueError(f"type '{type}' is not one of the managed types") + + self.type = type + self.with_subclasses = with_subclasses + self.name_pattern = _normalize_name_pattern(name_pattern) + self.required_tags = _normalize_required_tags(required_tags) + + def __str__(self): + return f"AuthzedResource(type={self.type}, with_subclasses={self.with_subclasses}, name_pattern={self.name_pattern}, required_tags={self.required_tags})" + + def __eq__(self, other): + if not isinstance(other, AuthzedResource): + return NotImplemented + return ( + self.type == other.type + and self.with_subclasses == other.with_subclasses + and self.name_pattern == other.name_pattern + and self.required_tags == other.required_tags + ) + + def match_resource(self, resource: FeastObject) -> bool: + if resource is None: + logger.warning(f"None passed to {self.match_resource.__name__}") + return False + + if not is_of_expected_type(resource): + logger.warning( + f"Given resource is not of a managed type but {type(resource)}" + ) + return False + + if self.type != ALL_RESOURCE_TYPES and not isinstance(resource, self.type): + logger.info(f"Resource does not match expected type {self.type}") + return False + + if self.name_pattern is not None: + if hasattr(resource, "name"): + if isinstance(resource.name, str): + match = bool(re.fullmatch(self.name_pattern, resource.name)) + if not match: + logger.info( + f"Resource name {resource.name} does not match pattern {self.name_pattern}" + ) + return False + else: + logger.warning( + f"Resource {resource} has no `name` attribute of unexpected type {type(resource.name)}" + ) + else: + logger.warning(f"Resource {resource} has no `name` attribute") + + if self.required_tags: + if hasattr(resource, "tags"): + if isinstance(resource.tags, dict): + for tag in self.required_tags.keys(): + required_value = self.required_tags.get(tag) + actual_value = resource.tags.get(tag) + if required_value != actual_value: + logger.info( + f"Unmatched value {actual_value} for tag {tag}: expected {required_value}" + ) + return False + else: + logger.warning( + f"Resource {resource} has no `tags` attribute of unexpected type {type(resource.tags)}" + ) + else: + logger.warning(f"Resource {resource} has no `tags` attribute") + + return True + + +def is_of_expected_type(resource: Any): + for t in get_args(FeastObject): + # Use isinstance to pass Mock validation + if isinstance(resource, t): + return True + return False + + +def _normalize_name_pattern(name_pattern: Optional[str]): + if name_pattern is not None: + return name_pattern.strip() + return None + + +def _normalize_required_tags(required_tags: Optional[dict[str, str]]): + if required_tags: + return { + k.strip(): v.strip() if isinstance(v, str) else v + for k, v in required_tags.items() + } + return None diff --git a/sdk/python/feast/permissions/decision.py b/sdk/python/feast/permissions/decision.py new file mode 100644 index 0000000000..9ee4dcfaf9 --- /dev/null +++ b/sdk/python/feast/permissions/decision.py @@ -0,0 +1,75 @@ +import enum +import logging + +logger = logging.getLogger(__name__) + + +class DecisionStrategy(enum.Enum): + """ + The strategy to be adopted in case multiple policies are defined. + """ + + UNANIMOUS = "unanimous" # All policies must evaluate to a positive decision for the final decision to be also positive. + AFFIRMATIVE = ( + "affirmative" # At least one policy must evaluate to a positive decision + ) + CONSENSUS = "consensus" # The number of positive decisions must be greater than the number of negative decisions. + + +class DecisionEvaluator: + def __init__( + self, + decision_strategy: DecisionStrategy, + num_of_voters: int, + ) -> (bool, list[str]): + self.num_of_voters = num_of_voters + + self.grant_count = 0 + self.deny_count = 0 + + self.grant_quorum = ( + 1 + if decision_strategy == DecisionStrategy.AFFIRMATIVE + else num_of_voters + if decision_strategy == DecisionStrategy.UNANIMOUS + else num_of_voters // 2 + 1 + ) + self.deny_quorum = ( + num_of_voters + if decision_strategy == DecisionStrategy.AFFIRMATIVE + else 1 + if decision_strategy == DecisionStrategy.UNANIMOUS + else num_of_voters // 2 + 1 + ) + self.grant_decision = None + self.explanations: list[str] = [] + logger.info( + f"Decision evaluation started with grant_quorum={self.grant_quorum}, deny_quorum={self.deny_quorum}" + ) + + def is_decided(self) -> bool: + return self.grant_decision is not None + + def grant(self) -> (bool, list[str]): + logger.info( + f"Decided grant is {self.grant_decision}, explanations={self.explanations}" + ) + return self.grant_decision, self.explanations + + def add_grant(self, label, grant: bool, explanation: str): + if self.is_decided(): + logger.warning("Grant decision already decided, discarding vote") + return + if grant: + self.grant_count += 1 + else: + self.deny_count += 1 + self.explanations.append(explanation) + + if self.grant_count >= self.grant_quorum: + self.grant_decision = True + if self.deny_count >= self.deny_quorum: + self.grant_decision = False + logger.info( + f"After {label}: grants={self.grant_count}, deny_count={self.deny_count}, grant_decision={self.grant_decision}" + ) diff --git a/sdk/python/feast/permissions/enforcer.py b/sdk/python/feast/permissions/enforcer.py new file mode 100644 index 0000000000..1cadc7cc31 --- /dev/null +++ b/sdk/python/feast/permissions/enforcer.py @@ -0,0 +1,81 @@ +import logging + +from feast.feast_object import FeastObject +from feast.permissions.decision import DecisionEvaluator +from feast.permissions.permission import ( + AuthzedAction, + Permission, +) +from feast.permissions.role_manager import RoleManager + +logger = logging.getLogger(__name__) + + +def enforce_policy( + role_manager: RoleManager, + permissions: list[Permission], + user: str, + resource: FeastObject, + actions: list[AuthzedAction], +) -> tuple[bool, str]: + """ + Defines the logic to apply the configured permissions when a given action is requested on + a protected resource. + + Args: + role_manager: The `RoleManager` instance. + permissions: The configured set of `Permission`. + user: The current user. + resource: The resource for which we need to enforce authorized permission. + actions: The requested actions to be authorized. + """ + + if not permissions: + return (True, "") + + matching_permissions = [ + p + for p in permissions + if p.match_resource(resource) and p.match_actions(actions) + ] + + if matching_permissions: + evaluator = DecisionEvaluator( + Permission.get_global_decision_strategy(), len(matching_permissions) + ) + for p in matching_permissions: + permission_grant, permission_explanations = _evaluate_permission_grant( + p, + role_manager=role_manager, + user=user, + ) + evaluator.add_grant( + f"Permission ({p.name})", + permission_grant, + f"Permission {p.name} denied access: {','.join(permission_explanations)}", + ) + + if evaluator.is_decided(): + grant, explanations = evaluator.grant() + return grant, ",".join(explanations) + else: + message = f"No permissions defined to manage {actions} on {type(resource)}:{resource.name}." + logger.info(f"**PERMISSION GRANTED**: {message}") + return (True, "") + + +def _evaluate_permission_grant( + permission: Permission, + role_manager: RoleManager, + user: str, +) -> tuple[bool, list[str]]: + evaluator = DecisionEvaluator( + permission.decision_strategy, len(permission.policies) + ) + for policy in permission.policies: + grant_decision, explanation = policy.validate_user( + user, role_manager=role_manager + ) + evaluator.add_grant(f"Policy ({policy})", grant_decision, explanation) + if evaluator.is_decided(): + return evaluator.grant() diff --git a/sdk/python/feast/permissions/permission.py b/sdk/python/feast/permissions/permission.py new file mode 100644 index 0000000000..60ede6943c --- /dev/null +++ b/sdk/python/feast/permissions/permission.py @@ -0,0 +1,121 @@ +import enum +from abc import ABC +from typing import Optional, Union + +from feast.feast_object import FeastObject +from feast.permissions.authorized_resource import ALL_RESOURCE_TYPES, AuthzedResource +from feast.permissions.decision import DecisionStrategy +from feast.permissions.policy import AllowAll, Policy + + +class AuthzedAction(enum.Enum): + """ + Identifies the type of action being secured by the permissions framework, according to the familiar CRUD and Feast terminology. + """ + + ALL = "all" # All actions + CREATE = "create" # Create an instance + READ = "read" # Access the instance state + UPDATE = "update" # Update the instance state + DELETE = "delete" # Deelete an instance + QUERY = "query" # Query both online and online stores + QUERY_ONLINE = "query_online" # Query the online store only + QUERY_OFFLINE = "query_online" # Query the offline store only + WRITE = "write" # Query on any store + WRITE_ONLINE = "write_online" # Write to the online store only + WRITE_OFFLINE = "write_offline" # Write to the offline store only + + +class Permission(ABC): + """ + The Permission class defines the authorization policies to be validated whenever the identified actions are + requested on the matching resources. + + Attributes: + name: The permission name (can be duplicated, used for logging troubleshooting) + resources: The list of protected resource (as `AuthzedResource` type). Defaults to `ALL`. + actions: The actions authorized by this permission. Defaults to `AuthzedAction.ALL`. + policies: The policies to be applied to validate a client request. + decision_strategy: The strategy to apply in case of multiple policies. + """ + + _name: str + _resources: list[AuthzedResource] + _actions: list[AuthzedAction] + _policies: list[Policy] + _decision_strategy: DecisionStrategy + + def __init__( + self, + name: str, + resources: Optional[ + Union[str, list[AuthzedResource], AuthzedResource] + ] = ALL_RESOURCE_TYPES, + actions: Optional[ + Union[list[AuthzedAction], AuthzedAction] + ] = AuthzedAction.ALL, + policies: Optional[Union[list[Policy], Policy]] = AllowAll, + decision_strategy: Optional[DecisionStrategy] = DecisionStrategy.UNANIMOUS, + ): + if not resources: + raise ValueError("The list 'resources' must be non-empty.") + if actions is None or not actions: + raise ValueError("The list 'actions' must be non-empty.") + if not policies: + raise ValueError("The list 'policies' must be non-empty.") + if decision_strategy not in DecisionStrategy.__members__.values(): + raise ValueError( + "The 'decision_strategy' must be one of the allowed values." + ) + self._name = name + self._resources = resources if isinstance(resources, list) else [resources] + self._actions = actions if isinstance(actions, list) else [actions] + self._policies = policies if isinstance(policies, list) else [policies] + self._decision_strategy = decision_strategy + + _global_decision_strategy: DecisionStrategy = DecisionStrategy.UNANIMOUS + + @staticmethod + def get_global_decision_strategy() -> DecisionStrategy: + return Permission._global_decision_strategy + + @staticmethod + def set_global_decision_strategy(global_decision_strategy: DecisionStrategy): + """ + Defines the global decision strategy to be applied if multiple permissions match the same resource. + """ + Permission._global_decision_strategy = global_decision_strategy + + @property + def name(self) -> str: + return self._name + + @property + def resources(self) -> list[AuthzedResource]: + return self._resources + + @property + def actions(self) -> list[AuthzedAction]: + return self._actions + + @property + def policies(self) -> list[Policy]: + return self._policies + + @property + def decision_strategy(self) -> DecisionStrategy: + return self._decision_strategy + + def match_resource(self, resource: FeastObject) -> bool: + matches = [ + authzed_resource + for authzed_resource in self._resources + if authzed_resource.match_resource(resource) + ] + return len(matches) > 0 + + def match_actions(self, actions: list[AuthzedAction]) -> bool: + if AuthzedAction.ALL in self._actions: + return True + + return all(a in self._actions for a in actions) diff --git a/sdk/python/feast/permissions/policy.py b/sdk/python/feast/permissions/policy.py new file mode 100644 index 0000000000..b22f031afb --- /dev/null +++ b/sdk/python/feast/permissions/policy.py @@ -0,0 +1,59 @@ +from abc import ABC, abstractmethod + +from feast.permissions.role_manager import RoleManager + + +class Policy(ABC): + """ + An abstract class to ensure that the current user matches the configured security policies. + """ + + @abstractmethod + def validate_user(self, user: str, **kwargs) -> (bool, str): + """ + Converts data source config in protobuf spec to a DataSource class object. + + Args: + data_source: A protobuf representation of a DataSource. + + Returns: + A DataSource class object. + + Raises: + ValueError: The type of DataSource could not be identified. + """ + raise NotImplementedError + + +class RoleBasedPolicy(Policy): + """ + An Policy class where the user roles must be enforced to grant access to the requested action. + All the configured roles must be granted to the current user in order to allow the execution. + + The `role_manager` keywork argument must be present in the `kwargs` optional key-value arguments. + """ + + def __init__( + self, + roles: list[str], + ): + self.roles = roles + + def get_roles(self) -> list[str]: + self.roles + + def validate_user(self, user: str, **kwargs) -> (bool, str): + rm: RoleManager = kwargs.get("role_manager") + result = rm.has_roles_for_user(user, self.roles) + explain = "" if result else f"Requires roles {self.roles}" + return (result, explain) + + +def allow_all(self, user: str, **kwargs) -> (bool, str): + return True, "" + + +""" +A `Policy` instance to allow execution of any action to each user +""" +AllowAll = type("AllowAll", (Policy,), {Policy.validate_user.__name__: allow_all})() diff --git a/sdk/python/feast/permissions/role_manager.py b/sdk/python/feast/permissions/role_manager.py new file mode 100644 index 0000000000..ad2ebc3f2b --- /dev/null +++ b/sdk/python/feast/permissions/role_manager.py @@ -0,0 +1,31 @@ +class RoleManager: + """ + RoleManager is the registry of user roles captured by the AuthManager implementations and used by the + RoleBasedPolicy policy. + """ + + def __init__(self): + self.roles_by_user = {} + + def add_roles_for_user(self, user: str, roles: list[str]): + """ + Adds the given roles to the given user. + """ + self.roles_by_user.setdefault(user, []).extend(roles) + + def clear(self) -> None: + """ + Clears all the registered roles. + """ + self.roles_by_user.clear() + + def has_roles_for_user(self, user: str, roles: list[str]) -> bool: + """ + Returns True only if the given user has any registered role and all the given roles are registered. + """ + print( + f"Check {user} has all {roles}: currently {self.roles_by_user[user] if user in self.roles_by_user else[]}" + ) + return user in self.roles_by_user and all( + r in self.roles_by_user[user] for r in roles + ) diff --git a/sdk/python/feast/permissions/security_manager.py b/sdk/python/feast/permissions/security_manager.py new file mode 100644 index 0000000000..ba6f53aae3 --- /dev/null +++ b/sdk/python/feast/permissions/security_manager.py @@ -0,0 +1,124 @@ +import logging +from contextvars import ContextVar +from typing import List, Optional, Union + +from feast.feast_object import FeastObject +from feast.permissions.authorized_resource import is_of_expected_type +from feast.permissions.enforcer import enforce_policy +from feast.permissions.permission import AuthzedAction, Permission +from feast.permissions.role_manager import RoleManager + +logger = logging.getLogger(__name__) + + +def require_permissions(actions: Union[list[AuthzedAction], AuthzedAction]): + """ + A decorator to define the actions that are executed from within the current class method and that must be protected + against unauthorized access. + + The first parameter of the protected method must be `self` + """ + + def require_permissions_decorator(func): + def permission_checker(*args, **kwargs): + logger.debug(f"permission_checker for {args}, {kwargs}") + resource = args[0] + if not is_of_expected_type(resource): + raise NotImplementedError( + f"The first argument is not of a managed type but {type(resource)}" + ) + + sm = get_security_manager() + if sm is None: + return True + + sm.assert_permissions( + resource=resource, + actions=actions, + ) + logger.debug( + f"User {sm.current_user} can invoke {actions} on {resource.name}:{type(resource)} " + ) + result = func(*args, **kwargs) + return result + + return permission_checker + + return require_permissions_decorator + + +class SecurityManager: + """ + The security manager holds references to the security components (role manager, policy enforces) and the configured permissions. + It is accessed and defined using the global functions :func:`_get_security_manager` and :func:`_set_security_manager` + """ + + def __init__( + self, + role_manager: RoleManager, + permissions: list[Permission] = [], + ): + self._role_manager: RoleManager = role_manager + self._permissions: list[Permission] = permissions + self._current_user: ContextVar[Optional[str]] = ContextVar( + "current_user", default=None + ) + + def set_current_user(self, user: str): + self._current_user.set(user) + + @property + def role_manager(self) -> RoleManager: + return self._role_manager + + @property + def current_user(self) -> Optional[str]: + return self._current_user.get() + + @property + def permissions(self) -> list[Permission]: + return self._permissions + + def assert_permissions( + self, + resource: FeastObject, + actions: Union[AuthzedAction, List[AuthzedAction]], + ): + """ + TODO ADD DOCSTRING + """ + result, explain = enforce_policy( + role_manager=self._role_manager, + permissions=self._permissions, + user=self.current_user, + resource=resource, + actions=actions if isinstance(actions, list) else [actions], + ) + if not result: + raise PermissionError(explain) + + +""" +Global instance. +""" +_sm: Optional[SecurityManager] = None + + +""" +Return the global instance of `SecurityManager`. +""" + + +def get_security_manager() -> Optional[SecurityManager]: + global _sm + return _sm + + +""" +Initializes the global instance of `SecurityManager`. +""" + + +def set_security_manager(sm: SecurityManager): + global _sm + _sm = sm diff --git a/sdk/python/tests/unit/permissions/__init__.py b/sdk/python/tests/unit/permissions/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/sdk/python/tests/unit/permissions/test_authorized_resources.py b/sdk/python/tests/unit/permissions/test_authorized_resources.py new file mode 100644 index 0000000000..686bf30000 --- /dev/null +++ b/sdk/python/tests/unit/permissions/test_authorized_resources.py @@ -0,0 +1,117 @@ +from typing import get_args +from unittest.mock import Mock + +import assertpy +import pytest + +from feast import ( + FeatureStore, +) +from feast.feast_object import FeastObject +from feast.permissions.permission import ( + ALL_RESOURCE_TYPES, + AuthzedResource, +) + + +def test_authorized_resource_types(): + # Invalid types + with pytest.raises(ValueError): + AuthzedResource("any") + with pytest.raises(ValueError): + AuthzedResource(FeatureStore) + + # Valid types + AuthzedResource("ALL") + AuthzedResource(ALL_RESOURCE_TYPES) + for t in get_args(FeastObject): + AuthzedResource(t) + + +def test_authorized_resource_type_defaults(): + authzed_resource = AuthzedResource(ALL_RESOURCE_TYPES) + assertpy.assert_that(authzed_resource.with_subclasses).is_false() + assertpy.assert_that(authzed_resource.name_pattern).is_none() + assertpy.assert_that(authzed_resource.required_tags).is_none() + + +def test_authorized_resource_matches_ALL(): + authzed_resource = AuthzedResource(ALL_RESOURCE_TYPES) + resource = None + assertpy.assert_that(authzed_resource.match_resource(resource)).is_false() + resource = "invalid string" + assertpy.assert_that(authzed_resource.match_resource(resource)).is_false() + resource = "ALL" + assertpy.assert_that(authzed_resource.match_resource(resource)).is_false() + + for t in get_args(FeastObject): + resource = Mock(spec=t) + resource.name = "test" + assertpy.assert_that(authzed_resource.match_resource(resource)).is_true() + + +def test_authorized_resource_matches_ALL_with_name_filter(): + authzed_resource = AuthzedResource(ALL_RESOURCE_TYPES, name_pattern="test.*") + for t in get_args(FeastObject): + resource = Mock(spec=t) + resource.name = "test" + assertpy.assert_that(authzed_resource.match_resource(resource)).is_true() + + for t in get_args(FeastObject): + resource = Mock(spec=t) + resource.name = "test1" + assertpy.assert_that(authzed_resource.match_resource(resource)).is_true() + + for t in get_args(FeastObject): + resource = Mock(spec=t) + resource.name = "wrongtest" + assertpy.assert_that(authzed_resource.match_resource(resource)).is_false() + + authzed_resource = AuthzedResource(ALL_RESOURCE_TYPES, name_pattern=".*test.*") + for t in get_args(FeastObject): + resource = Mock(spec=t) + resource.name = "wrongtest" + assertpy.assert_that(authzed_resource.match_resource(resource)).is_true() + + +def test_authorized_resource_matches_ALL_with_tags(): + # Missing tags + authzed_resource = AuthzedResource( + ALL_RESOURCE_TYPES, required_tags={"owner": "dev"} + ) + for t in get_args(FeastObject): + resource = Mock(spec=t) + resource.name = "test" + resource.tags = {} + assertpy.assert_that(authzed_resource.match_resource(resource)).is_false() + + # Wrong tag value + for t in get_args(FeastObject): + resource = Mock(spec=t) + resource.name = "test" + resource.tags = {"owner": "master"} + assertpy.assert_that(authzed_resource.match_resource(resource)).is_false() + + # All matching tags + for t in get_args(FeastObject): + resource = Mock(spec=t) + resource.name = "test" + resource.tags = {"owner": "dev", "other": 1} + assertpy.assert_that(authzed_resource.match_resource(resource)).is_true() + + # One missing tag + authzed_resource = AuthzedResource( + ALL_RESOURCE_TYPES, required_tags={"owner": "dev", "dep": 1} + ) + for t in get_args(FeastObject): + resource = Mock(spec=t) + resource.name = "test" + resource.tags = {"owner": "dev", "other": 1} + assertpy.assert_that(authzed_resource.match_resource(resource)).is_false() + + # All matching tags + for t in get_args(FeastObject): + resource = Mock(spec=t) + resource.name = "test" + resource.tags = {"owner": "dev", "other": 1, "dep": 1} + assertpy.assert_that(authzed_resource.match_resource(resource)).is_true() diff --git a/sdk/python/tests/unit/permissions/test_decision.py b/sdk/python/tests/unit/permissions/test_decision.py new file mode 100644 index 0000000000..27f5007e6e --- /dev/null +++ b/sdk/python/tests/unit/permissions/test_decision.py @@ -0,0 +1,111 @@ +import assertpy + +from feast.permissions.decision import DecisionEvaluator, DecisionStrategy + + +def test_affirmative(): + evaluator = DecisionEvaluator(DecisionStrategy.AFFIRMATIVE, 3) + evaluator.add_grant("vote", True, "") + assertpy.assert_that(evaluator.is_decided()).is_true() + assertpy.assert_that(evaluator.grant()).is_equal_to((True, [])) + + evaluator = DecisionEvaluator(DecisionStrategy.AFFIRMATIVE, 3) + evaluator.add_grant("vote", False, "a message") + assertpy.assert_that(evaluator.is_decided()).is_false() + evaluator.add_grant("vote", False, "a message") + assertpy.assert_that(evaluator.is_decided()).is_false() + evaluator.add_grant("vote", False, "a message") + assertpy.assert_that(evaluator.is_decided()).is_true() + grant, explanations = evaluator.grant() + assertpy.assert_that(grant).is_equal_to(False) + assertpy.assert_that(explanations).is_length(3) + + +def test_unanimous(): + evaluator = DecisionEvaluator(DecisionStrategy.UNANIMOUS, 3) + evaluator.add_grant("vote", True, "") + assertpy.assert_that(evaluator.is_decided()).is_false() + evaluator.add_grant("vote", True, "") + assertpy.assert_that(evaluator.is_decided()).is_false() + evaluator.add_grant("vote", True, "") + assertpy.assert_that(evaluator.is_decided()).is_true() + assertpy.assert_that(evaluator.grant()).is_equal_to((True, [])) + + evaluator = DecisionEvaluator(DecisionStrategy.UNANIMOUS, 3) + evaluator.add_grant("vote", True, "") + assertpy.assert_that(evaluator.is_decided()).is_false() + evaluator.add_grant("vote", False, "a message") + assertpy.assert_that(evaluator.is_decided()).is_true() + grant, explanations = evaluator.grant() + assertpy.assert_that(grant).is_equal_to(False) + assertpy.assert_that(explanations).is_length(1) + + +def test_consensus(): + evaluator = DecisionEvaluator(DecisionStrategy.CONSENSUS, 1) + evaluator.add_grant("vote", True, "") + assertpy.assert_that(evaluator.is_decided()).is_true() + assertpy.assert_that(evaluator.grant()).is_equal_to((True, [])) + + evaluator = DecisionEvaluator(DecisionStrategy.CONSENSUS, 1) + evaluator.add_grant("vote", False, "a message") + assertpy.assert_that(evaluator.is_decided()).is_true() + grant, explanations = evaluator.grant() + assertpy.assert_that(grant).is_equal_to(False) + assertpy.assert_that(explanations).is_length(1) + + evaluator = DecisionEvaluator(DecisionStrategy.CONSENSUS, 5) + evaluator.add_grant("vote", True, "") + assertpy.assert_that(evaluator.is_decided()).is_false() + evaluator.add_grant("vote", False, "a message") + assertpy.assert_that(evaluator.is_decided()).is_false() + evaluator.add_grant("vote", False, "a message") + assertpy.assert_that(evaluator.is_decided()).is_false() + evaluator.add_grant("vote", True, "") + assertpy.assert_that(evaluator.is_decided()).is_false() + evaluator.add_grant("vote", True, "") + assertpy.assert_that(evaluator.is_decided()).is_true() + grant, explanations = evaluator.grant() + assertpy.assert_that(grant).is_equal_to(True) + assertpy.assert_that(explanations).is_length(2) + + evaluator = DecisionEvaluator(DecisionStrategy.CONSENSUS, 5) + evaluator.add_grant("vote", True, "") + assertpy.assert_that(evaluator.is_decided()).is_false() + evaluator.add_grant("vote", False, "a message") + assertpy.assert_that(evaluator.is_decided()).is_false() + evaluator.add_grant("vote", False, "a message") + assertpy.assert_that(evaluator.is_decided()).is_false() + evaluator.add_grant("vote", False, "a message") + assertpy.assert_that(evaluator.is_decided()).is_true() + grant, explanations = evaluator.grant() + assertpy.assert_that(grant).is_equal_to(False) + assertpy.assert_that(explanations).is_length(3) + + +def test_additional_votes_are_discarded(): + evaluator = DecisionEvaluator(DecisionStrategy.UNANIMOUS, 2) + evaluator.add_grant("vote", True, "") + assertpy.assert_that(evaluator.is_decided()).is_false() + evaluator.add_grant("vote", True, "") + assertpy.assert_that(evaluator.is_decided()).is_true() + evaluator.add_grant("vote", False, "a message") + assertpy.assert_that(evaluator.is_decided()).is_true() + evaluator.add_grant("vote", False, "a message") + assertpy.assert_that(evaluator.is_decided()).is_true() + evaluator.add_grant("vote", False, "a message") + assertpy.assert_that(evaluator.is_decided()).is_true() + assertpy.assert_that(evaluator.grant()).is_equal_to((True, [])) + + evaluator = DecisionEvaluator(DecisionStrategy.UNANIMOUS, 2) + evaluator.add_grant("vote", False, "a message") + assertpy.assert_that(evaluator.is_decided()).is_true() + evaluator.add_grant("vote", False, "a message") + assertpy.assert_that(evaluator.is_decided()).is_true() + evaluator.add_grant("vote", False, "a message") + assertpy.assert_that(evaluator.is_decided()).is_true() + evaluator.add_grant("vote", False, "a message") + assertpy.assert_that(evaluator.is_decided()).is_true() + grant, explanations = evaluator.grant() + assertpy.assert_that(grant).is_equal_to(False) + assertpy.assert_that(explanations).is_length(1) diff --git a/sdk/python/tests/unit/permissions/test_permission.py b/sdk/python/tests/unit/permissions/test_permission.py new file mode 100644 index 0000000000..d373fb0326 --- /dev/null +++ b/sdk/python/tests/unit/permissions/test_permission.py @@ -0,0 +1,91 @@ +from unittest.mock import Mock + +import assertpy +import pytest + +from feast import ( + FeatureView, +) +from feast.permissions.authorized_resource import ALL_RESOURCE_TYPES +from feast.permissions.permission import ( + AuthzedAction, + AuthzedResource, + DecisionStrategy, + Permission, +) +from feast.permissions.policy import AllowAll + + +def test_global_decision_strategy(): + assertpy.assert_that(Permission.get_global_decision_strategy()).is_equal_to( + DecisionStrategy.UNANIMOUS + ) + + for value in DecisionStrategy.__members__.values(): + Permission.set_global_decision_strategy(value) + assertpy.assert_that(Permission.get_global_decision_strategy()).is_equal_to( + value + ) + + +def test_permission_defaults(): + p = Permission(name="test") + assertpy.assert_that(type(p.resources)).is_equal_to(list) + assertpy.assert_that(p.resources[0]).is_equal_to(ALL_RESOURCE_TYPES) + assertpy.assert_that(type(p.actions)).is_equal_to(list) + assertpy.assert_that(p.actions[0]).is_equal_to(AuthzedAction.ALL) + assertpy.assert_that(type(p.actions)).is_equal_to(list) + assertpy.assert_that(type(p.policies)).is_equal_to(list) + assertpy.assert_that(p.policies[0]).is_equal_to(AllowAll) + assertpy.assert_that(p.decision_strategy).is_equal_to(DecisionStrategy.UNANIMOUS) + + +def test_permission_validity(): + # Invalid values + with pytest.raises(ValueError): + Permission(name="test", resources=None) + with pytest.raises(ValueError): + Permission(name="test", resources=[]) + with pytest.raises(ValueError): + Permission(name="test", actions=None) + with pytest.raises(ValueError): + Permission(name="test", actions=[]) + with pytest.raises(ValueError): + Permission(name="test", policies=None) + with pytest.raises(ValueError): + Permission(name="test", policies=[]) + with pytest.raises(ValueError): + Permission(name="test", decision_strategy=None) + with pytest.raises(ValueError): + Permission(name="test", decision_strategy="invalid") + + # Valid values + Permission(name="test", resources=AuthzedResource("ALL")) + Permission( + name="test", resources=[AuthzedResource("ALL"), AuthzedResource(FeatureView)] + ) + Permission(name="test", actions=AuthzedAction.ALL) + Permission(name="test", actions=[AuthzedAction.ALL]) + Permission(name="test", actions=[AuthzedAction.CREATE, AuthzedAction.DELETE]) + + +def test_permission_normalized_args(): + p = Permission(name="test", resources=AuthzedResource("ALL")) + assertpy.assert_that(type(p.resources)).is_equal_to(list) + assertpy.assert_that(p.resources).is_equal_to([AuthzedResource("ALL")]) + + p = Permission(name="test", actions=AuthzedAction.CREATE) + assertpy.assert_that(type(p.actions)).is_equal_to(list) + assertpy.assert_that(p.actions).is_equal_to([AuthzedAction.CREATE]) + + p = Permission(name="test", policies=Mock()) + assertpy.assert_that(type(p.policies)).is_equal_to(list) + + +def test_permission_match_actions(): + p = Permission(name="test", resources=AuthzedResource("ALL")) + + for action in AuthzedAction.__members__.values(): + assertpy.assert_that(p.match_actions(actions=action)).is_true() + + p = Permission(name="test", resources=AuthzedResource("ALL")) diff --git a/sdk/python/tests/unit/permissions/test_policy.py b/sdk/python/tests/unit/permissions/test_policy.py new file mode 100644 index 0000000000..2a8afb9f57 --- /dev/null +++ b/sdk/python/tests/unit/permissions/test_policy.py @@ -0,0 +1,11 @@ +import assertpy + +from feast.permissions.policy import AllowAll + + +def test_allow_all(): + policy = AllowAll + + assertpy.assert_that(policy.validate_user("any")).is_true() + assertpy.assert_that(policy.validate_user(None, roles=["any"])).is_true() + assertpy.assert_that(policy.validate_user("any", other_arg=1234)).is_true() diff --git a/sdk/python/tests/unit/permissions/test_require_permissions.py b/sdk/python/tests/unit/permissions/test_require_permissions.py new file mode 100644 index 0000000000..54f5648e38 --- /dev/null +++ b/sdk/python/tests/unit/permissions/test_require_permissions.py @@ -0,0 +1,90 @@ +from unittest.mock import Mock + +import assertpy +import pytest + +from feast import FeatureView +from feast.permissions.authorized_resource import AuthzedResource +from feast.permissions.permission import AuthzedAction, Permission +from feast.permissions.policy import RoleBasedPolicy +from feast.permissions.role_manager import RoleManager +from feast.permissions.security_manager import ( + SecurityManager, + require_permissions, + set_security_manager, +) + + +class SecuredFeatureView(FeatureView): + def __init__(self, name, tags): + super().__init__( + name=name, + source=Mock(), + tags=tags, + ) + + @require_permissions(actions=[AuthzedAction.READ]) + def read_protected(self) -> bool: + return True + + def unprotected(self) -> bool: + return True + + +@pytest.fixture +def security_manager() -> SecurityManager: + permissions = [] + permissions.append( + Permission( + name="reader", + resources=AuthzedResource(type=FeatureView, with_subclasses=True), + policies=[RoleBasedPolicy(roles=["reader"])], + actions=[AuthzedAction.READ], + ) + ) + + rm = RoleManager() + rm.add_roles_for_user("r", ["reader"]) + rm.add_roles_for_user("w", ["writer"]) + rm.add_roles_for_user("rw", ["reader", "writer"]) + sm = SecurityManager(role_manager=rm, permissions=permissions) + set_security_manager(sm) + return sm + + +@pytest.fixture +def feature_view() -> FeatureView: + return SecuredFeatureView("secured", {}) + + +def test_no_user(security_manager, feature_view): + fv = feature_view + + with pytest.raises(PermissionError): + fv.read_protected() + assertpy.assert_that(fv.unprotected()).is_true() + + +def test_reader_user(security_manager, feature_view): + sm = security_manager + fv = feature_view + sm.set_current_user("r") + fv.read_protected() + assertpy.assert_that(fv.unprotected()).is_true() + + +def test_writer_user(security_manager, feature_view): + sm = security_manager + fv = feature_view + sm.set_current_user("w") + with pytest.raises(PermissionError): + fv.read_protected() + assertpy.assert_that(fv.unprotected()).is_true() + + +def test_reader_writer_user(security_manager, feature_view): + sm = security_manager + fv = feature_view + sm.set_current_user("rw") + fv.read_protected() + assertpy.assert_that(fv.unprotected()).is_true() diff --git a/sdk/python/tests/unit/permissions/test_role_manager.py b/sdk/python/tests/unit/permissions/test_role_manager.py new file mode 100644 index 0000000000..4d6e755fe7 --- /dev/null +++ b/sdk/python/tests/unit/permissions/test_role_manager.py @@ -0,0 +1,17 @@ +import assertpy + +from feast.permissions.role_manager import RoleManager + + +def test_has_roles(): + rm = RoleManager() + rm.add_roles_for_user("a", ["a1", "a2"]) + rm.add_roles_for_user("b", ["b1", "b2"]) + + assertpy.assert_that(rm.has_roles_for_user("c", list())).is_false() + assertpy.assert_that(rm.has_roles_for_user("a", ["a1"])).is_true() + assertpy.assert_that(rm.has_roles_for_user("a", ["a1", "a2"])).is_true() + assertpy.assert_that(rm.has_roles_for_user("a", ["a1", "a2", "a3"])).is_false() + assertpy.assert_that(rm.has_roles_for_user("a", ["a1", "a3"])).is_false() + assertpy.assert_that(rm.has_roles_for_user("b", ["a1", "a3"])).is_false() + assertpy.assert_that(rm.has_roles_for_user("b", ["b1", "b2"])).is_true() From a4859b7d185750a17609ae5c9b61a13708a6806b Mon Sep 17 00:00:00 2001 From: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Date: Fri, 21 Jun 2024 16:47:43 +0200 Subject: [PATCH 002/169] fixed linting issues (but 1) Signed-off-by: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Signed-off-by: Abdul Hameed --- .../feast/permissions/authorized_resource.py | 25 +++++++++++-------- sdk/python/feast/permissions/decision.py | 9 ++++--- sdk/python/feast/permissions/enforcer.py | 2 ++ sdk/python/feast/permissions/permission.py | 24 ++++++++---------- sdk/python/feast/permissions/policy.py | 21 ++++++++++------ .../feast/permissions/security_manager.py | 2 +- .../permissions/test_authorized_resources.py | 3 +-- .../tests/unit/permissions/test_permission.py | 23 +++++++++-------- ...ermissions.py => test_security_manager.py} | 0 9 files changed, 60 insertions(+), 49 deletions(-) rename sdk/python/tests/unit/permissions/{test_require_permissions.py => test_security_manager.py} (100%) diff --git a/sdk/python/feast/permissions/authorized_resource.py b/sdk/python/feast/permissions/authorized_resource.py index da335245f4..7aec5ad4ed 100644 --- a/sdk/python/feast/permissions/authorized_resource.py +++ b/sdk/python/feast/permissions/authorized_resource.py @@ -4,9 +4,10 @@ from feast.feast_object import FeastObject -ALL_RESOURCE_TYPES = "ALL" -AuthzedResourceType = Union[ALL_RESOURCE_TYPES, FeastObject] - +""" +Constant to refer to all the managed types. +""" +ALL_RESOURCE_TYPES = list(get_args(FeastObject)) logger = logging.getLogger(__name__) @@ -17,28 +18,30 @@ class AuthzedResource: based on the resource name and tags. Attributes: - type: the type of secured resource (must match one Feast class, as defined by the FeastObject type, or the `ALL` string) + type: the list of secured resource types (must match one Feast class, as defined by the FeastObject type) name_pattern: a regex to match the resource name. Defaults to None, meaning that no name filtering is applied required_tags: dictionary of key-value pairs that must match the resource tags. All these required_tags must be present as resource tags with the given value. Defaults to None, meaning that no tags filtering is applied. """ - type: AuthzedResourceType + type: list[FeastObject] with_subclasses: bool name_pattern: Optional[str] required_tags: Optional[dict[str, str]] def __init__( self, - type: AuthzedResourceType, + type: Union[list[FeastObject], FeastObject], with_subclasses: bool = False, name_pattern: Optional[str] = None, required_tags: Optional[dict[str, str]] = None, ): - if type != ALL_RESOURCE_TYPES and type not in get_args(FeastObject): - raise ValueError(f"type '{type}' is not one of the managed types") + _type: list[FeastObject] = type if isinstance(type, list) else [type] + for t in _type: + if t not in get_args(FeastObject): + raise ValueError(f"{t} is not one of the managed types") - self.type = type + self.type = _type self.with_subclasses = with_subclasses self.name_pattern = _normalize_name_pattern(name_pattern) self.required_tags = _normalize_required_tags(required_tags) @@ -67,8 +70,8 @@ def match_resource(self, resource: FeastObject) -> bool: ) return False - if self.type != ALL_RESOURCE_TYPES and not isinstance(resource, self.type): - logger.info(f"Resource does not match expected type {self.type}") + if not any(isinstance(resource, t) for t in self.type): + logger.info(f"Resource does not match any of the expected type {self.type}") return False if self.name_pattern is not None: diff --git a/sdk/python/feast/permissions/decision.py b/sdk/python/feast/permissions/decision.py index 9ee4dcfaf9..0b292c0bce 100644 --- a/sdk/python/feast/permissions/decision.py +++ b/sdk/python/feast/permissions/decision.py @@ -1,5 +1,6 @@ import enum import logging +from typing import Optional logger = logging.getLogger(__name__) @@ -21,7 +22,7 @@ def __init__( self, decision_strategy: DecisionStrategy, num_of_voters: int, - ) -> (bool, list[str]): + ): self.num_of_voters = num_of_voters self.grant_count = 0 @@ -41,7 +42,7 @@ def __init__( if decision_strategy == DecisionStrategy.UNANIMOUS else num_of_voters // 2 + 1 ) - self.grant_decision = None + self.grant_decision: Optional[bool] = None self.explanations: list[str] = [] logger.info( f"Decision evaluation started with grant_quorum={self.grant_quorum}, deny_quorum={self.deny_quorum}" @@ -50,11 +51,11 @@ def __init__( def is_decided(self) -> bool: return self.grant_decision is not None - def grant(self) -> (bool, list[str]): + def grant(self) -> tuple[bool, list[str]]: logger.info( f"Decided grant is {self.grant_decision}, explanations={self.explanations}" ) - return self.grant_decision, self.explanations + return bool(self.grant_decision), self.explanations def add_grant(self, label, grant: bool, explanation: str): if self.is_decided(): diff --git a/sdk/python/feast/permissions/enforcer.py b/sdk/python/feast/permissions/enforcer.py index 1cadc7cc31..6e949a5c90 100644 --- a/sdk/python/feast/permissions/enforcer.py +++ b/sdk/python/feast/permissions/enforcer.py @@ -79,3 +79,5 @@ def _evaluate_permission_grant( evaluator.add_grant(f"Policy ({policy})", grant_decision, explanation) if evaluator.is_decided(): return evaluator.grant() + + return True, [] diff --git a/sdk/python/feast/permissions/permission.py b/sdk/python/feast/permissions/permission.py index 60ede6943c..4eed027634 100644 --- a/sdk/python/feast/permissions/permission.py +++ b/sdk/python/feast/permissions/permission.py @@ -1,9 +1,9 @@ import enum from abc import ABC -from typing import Optional, Union +from typing import Union from feast.feast_object import FeastObject -from feast.permissions.authorized_resource import ALL_RESOURCE_TYPES, AuthzedResource +from feast.permissions.authorized_resource import AuthzedResource from feast.permissions.decision import DecisionStrategy from feast.permissions.policy import AllowAll, Policy @@ -18,9 +18,9 @@ class AuthzedAction(enum.Enum): READ = "read" # Access the instance state UPDATE = "update" # Update the instance state DELETE = "delete" # Deelete an instance - QUERY = "query" # Query both online and online stores + QUERY = "query" # Query both online and offline stores QUERY_ONLINE = "query_online" # Query the online store only - QUERY_OFFLINE = "query_online" # Query the offline store only + QUERY_OFFLINE = "query_offline" # Query the offline store only WRITE = "write" # Query on any store WRITE_ONLINE = "write_online" # Write to the online store only WRITE_OFFLINE = "write_offline" # Write to the offline store only @@ -33,14 +33,14 @@ class Permission(ABC): Attributes: name: The permission name (can be duplicated, used for logging troubleshooting) - resources: The list of protected resource (as `AuthzedResource` type). Defaults to `ALL`. + resources: The list of protected resource (as `AuthzedResource` type). actions: The actions authorized by this permission. Defaults to `AuthzedAction.ALL`. policies: The policies to be applied to validate a client request. decision_strategy: The strategy to apply in case of multiple policies. """ _name: str - _resources: list[AuthzedResource] + _resources: list[FeastObject] _actions: list[AuthzedAction] _policies: list[Policy] _decision_strategy: DecisionStrategy @@ -48,14 +48,10 @@ class Permission(ABC): def __init__( self, name: str, - resources: Optional[ - Union[str, list[AuthzedResource], AuthzedResource] - ] = ALL_RESOURCE_TYPES, - actions: Optional[ - Union[list[AuthzedAction], AuthzedAction] - ] = AuthzedAction.ALL, - policies: Optional[Union[list[Policy], Policy]] = AllowAll, - decision_strategy: Optional[DecisionStrategy] = DecisionStrategy.UNANIMOUS, + resources: Union[list[AuthzedResource], AuthzedResource], + actions: Union[list[AuthzedAction], AuthzedAction] = AuthzedAction.ALL, + policies: Union[list[Policy], Policy] = AllowAll, + decision_strategy: DecisionStrategy = DecisionStrategy.UNANIMOUS, ): if not resources: raise ValueError("The list 'resources' must be non-empty.") diff --git a/sdk/python/feast/permissions/policy.py b/sdk/python/feast/permissions/policy.py index b22f031afb..79d2d8334b 100644 --- a/sdk/python/feast/permissions/policy.py +++ b/sdk/python/feast/permissions/policy.py @@ -9,7 +9,7 @@ class Policy(ABC): """ @abstractmethod - def validate_user(self, user: str, **kwargs) -> (bool, str): + def validate_user(self, user: str, **kwargs) -> tuple[bool, str]: """ Converts data source config in protobuf spec to a DataSource class object. @@ -40,16 +40,23 @@ def __init__( self.roles = roles def get_roles(self) -> list[str]: - self.roles - - def validate_user(self, user: str, **kwargs) -> (bool, str): - rm: RoleManager = kwargs.get("role_manager") - result = rm.has_roles_for_user(user, self.roles) + return self.roles + + def validate_user(self, user: str, **kwargs) -> tuple[bool, str]: + if "role_manager" not in kwargs: + raise ValueError("Missing keywork argument 'role_manager'") + if not isinstance(kwargs["role_manager"], RoleManager): + raise ValueError( + f"The keywork argument 'role_manager' is not of the expected type {RoleManager.__name__}" + ) + rm = kwargs.get("role_manager") + if isinstance(rm, RoleManager): + result = rm.has_roles_for_user(user, self.roles) explain = "" if result else f"Requires roles {self.roles}" return (result, explain) -def allow_all(self, user: str, **kwargs) -> (bool, str): +def allow_all(self, user: str, **kwargs) -> tuple[bool, str]: return True, "" diff --git a/sdk/python/feast/permissions/security_manager.py b/sdk/python/feast/permissions/security_manager.py index ba6f53aae3..0f8062c754 100644 --- a/sdk/python/feast/permissions/security_manager.py +++ b/sdk/python/feast/permissions/security_manager.py @@ -90,7 +90,7 @@ def assert_permissions( result, explain = enforce_policy( role_manager=self._role_manager, permissions=self._permissions, - user=self.current_user, + user=self.current_user if self.current_user is not None else "", resource=resource, actions=actions if isinstance(actions, list) else [actions], ) diff --git a/sdk/python/tests/unit/permissions/test_authorized_resources.py b/sdk/python/tests/unit/permissions/test_authorized_resources.py index 686bf30000..74f1bf8ebd 100644 --- a/sdk/python/tests/unit/permissions/test_authorized_resources.py +++ b/sdk/python/tests/unit/permissions/test_authorized_resources.py @@ -8,7 +8,7 @@ FeatureStore, ) from feast.feast_object import FeastObject -from feast.permissions.permission import ( +from feast.permissions.authorized_resource import ( ALL_RESOURCE_TYPES, AuthzedResource, ) @@ -22,7 +22,6 @@ def test_authorized_resource_types(): AuthzedResource(FeatureStore) # Valid types - AuthzedResource("ALL") AuthzedResource(ALL_RESOURCE_TYPES) for t in get_args(FeastObject): AuthzedResource(t) diff --git a/sdk/python/tests/unit/permissions/test_permission.py b/sdk/python/tests/unit/permissions/test_permission.py index d373fb0326..c03bf4f7d4 100644 --- a/sdk/python/tests/unit/permissions/test_permission.py +++ b/sdk/python/tests/unit/permissions/test_permission.py @@ -41,32 +41,35 @@ def test_permission_defaults(): def test_permission_validity(): + all_resources = AuthzedResource(type=ALL_RESOURCE_TYPES) # Invalid values with pytest.raises(ValueError): Permission(name="test", resources=None) with pytest.raises(ValueError): Permission(name="test", resources=[]) with pytest.raises(ValueError): - Permission(name="test", actions=None) + Permission(name="test", resources=all_resources, actions=None) with pytest.raises(ValueError): - Permission(name="test", actions=[]) + Permission(name="test", resources=all_resources, actions=[]) with pytest.raises(ValueError): - Permission(name="test", policies=None) + Permission(name="test", resources=all_resources, policies=None) with pytest.raises(ValueError): - Permission(name="test", policies=[]) + Permission(name="test", resources=all_resources, policies=[]) with pytest.raises(ValueError): - Permission(name="test", decision_strategy=None) - with pytest.raises(ValueError): - Permission(name="test", decision_strategy="invalid") + Permission(name="test", resources=all_resources, decision_strategy="invalid") # Valid values Permission(name="test", resources=AuthzedResource("ALL")) Permission( name="test", resources=[AuthzedResource("ALL"), AuthzedResource(FeatureView)] ) - Permission(name="test", actions=AuthzedAction.ALL) - Permission(name="test", actions=[AuthzedAction.ALL]) - Permission(name="test", actions=[AuthzedAction.CREATE, AuthzedAction.DELETE]) + Permission(name="test", resources=all_resources, actions=AuthzedAction.ALL) + Permission(name="test", resources=all_resources, actions=[AuthzedAction.ALL]) + Permission( + name="test", + resources=all_resources, + actions=[AuthzedAction.CREATE, AuthzedAction.DELETE], + ) def test_permission_normalized_args(): diff --git a/sdk/python/tests/unit/permissions/test_require_permissions.py b/sdk/python/tests/unit/permissions/test_security_manager.py similarity index 100% rename from sdk/python/tests/unit/permissions/test_require_permissions.py rename to sdk/python/tests/unit/permissions/test_security_manager.py From 1f6d6f3ac1046f4eecdb50bc1cfe1fd45e99b5e3 Mon Sep 17 00:00:00 2001 From: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Date: Fri, 21 Jun 2024 17:49:01 +0200 Subject: [PATCH 003/169] deleted AuthzedResource and moved types to the Permission class Signed-off-by: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Signed-off-by: Abdul Hameed --- .../feast/permissions/authorized_resource.py | 134 ----------------- sdk/python/feast/permissions/permission.py | 138 +++++++++++++++-- .../feast/permissions/security_manager.py | 3 +- .../permissions/test_authorized_resources.py | 116 --------------- .../tests/unit/permissions/test_permission.py | 140 ++++++++++++++---- .../unit/permissions/test_security_manager.py | 4 +- 6 files changed, 237 insertions(+), 298 deletions(-) delete mode 100644 sdk/python/feast/permissions/authorized_resource.py delete mode 100644 sdk/python/tests/unit/permissions/test_authorized_resources.py diff --git a/sdk/python/feast/permissions/authorized_resource.py b/sdk/python/feast/permissions/authorized_resource.py deleted file mode 100644 index 7aec5ad4ed..0000000000 --- a/sdk/python/feast/permissions/authorized_resource.py +++ /dev/null @@ -1,134 +0,0 @@ -import logging -import re -from typing import Any, Optional, Union, get_args - -from feast.feast_object import FeastObject - -""" -Constant to refer to all the managed types. -""" -ALL_RESOURCE_TYPES = list(get_args(FeastObject)) - -logger = logging.getLogger(__name__) - - -class AuthzedResource: - """ - Identifies the protected resources by class type and optional filters - based on the resource name and tags. - - Attributes: - type: the list of secured resource types (must match one Feast class, as defined by the FeastObject type) - name_pattern: a regex to match the resource name. Defaults to None, meaning that no name filtering is applied - required_tags: dictionary of key-value pairs that must match the resource tags. All these required_tags must be present as resource - tags with the given value. Defaults to None, meaning that no tags filtering is applied. - """ - - type: list[FeastObject] - with_subclasses: bool - name_pattern: Optional[str] - required_tags: Optional[dict[str, str]] - - def __init__( - self, - type: Union[list[FeastObject], FeastObject], - with_subclasses: bool = False, - name_pattern: Optional[str] = None, - required_tags: Optional[dict[str, str]] = None, - ): - _type: list[FeastObject] = type if isinstance(type, list) else [type] - for t in _type: - if t not in get_args(FeastObject): - raise ValueError(f"{t} is not one of the managed types") - - self.type = _type - self.with_subclasses = with_subclasses - self.name_pattern = _normalize_name_pattern(name_pattern) - self.required_tags = _normalize_required_tags(required_tags) - - def __str__(self): - return f"AuthzedResource(type={self.type}, with_subclasses={self.with_subclasses}, name_pattern={self.name_pattern}, required_tags={self.required_tags})" - - def __eq__(self, other): - if not isinstance(other, AuthzedResource): - return NotImplemented - return ( - self.type == other.type - and self.with_subclasses == other.with_subclasses - and self.name_pattern == other.name_pattern - and self.required_tags == other.required_tags - ) - - def match_resource(self, resource: FeastObject) -> bool: - if resource is None: - logger.warning(f"None passed to {self.match_resource.__name__}") - return False - - if not is_of_expected_type(resource): - logger.warning( - f"Given resource is not of a managed type but {type(resource)}" - ) - return False - - if not any(isinstance(resource, t) for t in self.type): - logger.info(f"Resource does not match any of the expected type {self.type}") - return False - - if self.name_pattern is not None: - if hasattr(resource, "name"): - if isinstance(resource.name, str): - match = bool(re.fullmatch(self.name_pattern, resource.name)) - if not match: - logger.info( - f"Resource name {resource.name} does not match pattern {self.name_pattern}" - ) - return False - else: - logger.warning( - f"Resource {resource} has no `name` attribute of unexpected type {type(resource.name)}" - ) - else: - logger.warning(f"Resource {resource} has no `name` attribute") - - if self.required_tags: - if hasattr(resource, "tags"): - if isinstance(resource.tags, dict): - for tag in self.required_tags.keys(): - required_value = self.required_tags.get(tag) - actual_value = resource.tags.get(tag) - if required_value != actual_value: - logger.info( - f"Unmatched value {actual_value} for tag {tag}: expected {required_value}" - ) - return False - else: - logger.warning( - f"Resource {resource} has no `tags` attribute of unexpected type {type(resource.tags)}" - ) - else: - logger.warning(f"Resource {resource} has no `tags` attribute") - - return True - - -def is_of_expected_type(resource: Any): - for t in get_args(FeastObject): - # Use isinstance to pass Mock validation - if isinstance(resource, t): - return True - return False - - -def _normalize_name_pattern(name_pattern: Optional[str]): - if name_pattern is not None: - return name_pattern.strip() - return None - - -def _normalize_required_tags(required_tags: Optional[dict[str, str]]): - if required_tags: - return { - k.strip(): v.strip() if isinstance(v, str) else v - for k, v in required_tags.items() - } - return None diff --git a/sdk/python/feast/permissions/permission.py b/sdk/python/feast/permissions/permission.py index 4eed027634..1482362ec3 100644 --- a/sdk/python/feast/permissions/permission.py +++ b/sdk/python/feast/permissions/permission.py @@ -1,12 +1,15 @@ import enum +import logging +import re from abc import ABC -from typing import Union +from typing import Any, Optional, Union, get_args from feast.feast_object import FeastObject -from feast.permissions.authorized_resource import AuthzedResource from feast.permissions.decision import DecisionStrategy from feast.permissions.policy import AllowAll, Policy +logger = logging.getLogger(__name__) + class AuthzedAction(enum.Enum): """ @@ -26,6 +29,12 @@ class AuthzedAction(enum.Enum): WRITE_OFFLINE = "write_offline" # Write to the offline store only +""" +Constant to refer to all the managed types. +""" +ALL_RESOURCE_TYPES = list(get_args(FeastObject)) + + class Permission(ABC): """ The Permission class defines the authorization policies to be validated whenever the identified actions are @@ -33,14 +42,20 @@ class Permission(ABC): Attributes: name: The permission name (can be duplicated, used for logging troubleshooting) - resources: The list of protected resource (as `AuthzedResource` type). + types: The list of protected resource types as defined by the `FeastObject` type. Defaults to all managed types (e.g. the `ALL_RESOURCE_TYPES` constant) + name_pattern: a regex to match the resource name. Defaults to None, meaning that no name filtering is applied + required_tags: dictionary of key-value pairs that must match the resource tags. All these required_tags must be present as resource + tags with the given value. Defaults to None, meaning that no tags filtering is applied. actions: The actions authorized by this permission. Defaults to `AuthzedAction.ALL`. policies: The policies to be applied to validate a client request. decision_strategy: The strategy to apply in case of multiple policies. """ _name: str - _resources: list[FeastObject] + _types: list[FeastObject] + _with_subclasses: bool + _name_pattern: Optional[str] + _required_tags: Optional[dict[str, str]] _actions: list[AuthzedAction] _policies: list[Policy] _decision_strategy: DecisionStrategy @@ -48,13 +63,19 @@ class Permission(ABC): def __init__( self, name: str, - resources: Union[list[AuthzedResource], AuthzedResource], + types: Union[list[FeastObject], FeastObject] = ALL_RESOURCE_TYPES, + with_subclasses: bool = False, + name_pattern: Optional[str] = None, + required_tags: Optional[dict[str, str]] = None, actions: Union[list[AuthzedAction], AuthzedAction] = AuthzedAction.ALL, policies: Union[list[Policy], Policy] = AllowAll, decision_strategy: DecisionStrategy = DecisionStrategy.UNANIMOUS, ): - if not resources: - raise ValueError("The list 'resources' must be non-empty.") + if not types: + raise ValueError("The list 'types' must be non-empty.") + for t in types if isinstance(types, list) else [types]: + if t not in get_args(FeastObject): + raise ValueError(f"{t} is not one of the managed types") if actions is None or not actions: raise ValueError("The list 'actions' must be non-empty.") if not policies: @@ -64,7 +85,10 @@ def __init__( "The 'decision_strategy' must be one of the allowed values." ) self._name = name - self._resources = resources if isinstance(resources, list) else [resources] + self._types = types if isinstance(types, list) else [types] + self._with_subclasses = with_subclasses + self._name_pattern = _normalize_name_pattern(name_pattern) + self._required_tags = _normalize_required_tags(required_tags) self._actions = actions if isinstance(actions, list) else [actions] self._policies = policies if isinstance(policies, list) else [policies] self._decision_strategy = decision_strategy @@ -87,8 +111,20 @@ def name(self) -> str: return self._name @property - def resources(self) -> list[AuthzedResource]: - return self._resources + def types(self) -> list[FeastObject]: + return self._types + + @property + def with_subclasses(self) -> bool: + return self._with_subclasses + + @property + def name_pattern(self) -> Optional[str]: + return self._name_pattern + + @property + def required_tags(self) -> Optional[dict[str, str]]: + return self._required_tags @property def actions(self) -> list[AuthzedAction]: @@ -103,15 +139,85 @@ def decision_strategy(self) -> DecisionStrategy: return self._decision_strategy def match_resource(self, resource: FeastObject) -> bool: - matches = [ - authzed_resource - for authzed_resource in self._resources - if authzed_resource.match_resource(resource) - ] - return len(matches) > 0 + if resource is None: + logger.warning(f"None passed to {self.match_resource.__name__}") + return False + + if not is_of_expected_type(resource): + logger.warning( + f"Given resource is not of a managed type but {type(resource)}" + ) + return False + + t = tuple(self.types) + # mypy check ignored because of https://github.com/python/mypy/issues/11673, or it raises "Argument 2 to "isinstance" has incompatible type "tuple[Featu ..." + if not isinstance(resource, t): # type: ignore + logger.info( + f"Resource does not match any of the expected type {self.types}" + ) + return False + + if self.name_pattern is not None: + if hasattr(resource, "name"): + if isinstance(resource.name, str): + match = bool(re.fullmatch(self.name_pattern, resource.name)) + if not match: + logger.info( + f"Resource name {resource.name} does not match pattern {self.name_pattern}" + ) + return False + else: + logger.warning( + f"Resource {resource} has no `name` attribute of unexpected type {type(resource.name)}" + ) + else: + logger.warning(f"Resource {resource} has no `name` attribute") + + if self.required_tags: + if hasattr(resource, "tags"): + if isinstance(resource.tags, dict): + for tag in self.required_tags.keys(): + required_value = self.required_tags.get(tag) + actual_value = resource.tags.get(tag) + if required_value != actual_value: + logger.info( + f"Unmatched value {actual_value} for tag {tag}: expected {required_value}" + ) + return False + else: + logger.warning( + f"Resource {resource} has no `tags` attribute of unexpected type {type(resource.tags)}" + ) + else: + logger.warning(f"Resource {resource} has no `tags` attribute") + + return True def match_actions(self, actions: list[AuthzedAction]) -> bool: if AuthzedAction.ALL in self._actions: return True return all(a in self._actions for a in actions) + + +def is_of_expected_type(resource: Any): + for t in get_args(FeastObject): + # Use isinstance to pass Mock validation + if isinstance(resource, t): + return True + return False + + +def _normalize_name_pattern(name_pattern: Optional[str]): + if name_pattern is not None: + return name_pattern.strip() + return None + + +def _normalize_required_tags(required_tags: Optional[dict[str, str]]): + if required_tags: + return { + k.strip(): v.strip() if isinstance(v, str) else v + for k, v in required_tags.items() + } + return None diff --git a/sdk/python/feast/permissions/security_manager.py b/sdk/python/feast/permissions/security_manager.py index 0f8062c754..44e469d7e0 100644 --- a/sdk/python/feast/permissions/security_manager.py +++ b/sdk/python/feast/permissions/security_manager.py @@ -3,9 +3,8 @@ from typing import List, Optional, Union from feast.feast_object import FeastObject -from feast.permissions.authorized_resource import is_of_expected_type from feast.permissions.enforcer import enforce_policy -from feast.permissions.permission import AuthzedAction, Permission +from feast.permissions.permission import AuthzedAction, Permission, is_of_expected_type from feast.permissions.role_manager import RoleManager logger = logging.getLogger(__name__) diff --git a/sdk/python/tests/unit/permissions/test_authorized_resources.py b/sdk/python/tests/unit/permissions/test_authorized_resources.py deleted file mode 100644 index 74f1bf8ebd..0000000000 --- a/sdk/python/tests/unit/permissions/test_authorized_resources.py +++ /dev/null @@ -1,116 +0,0 @@ -from typing import get_args -from unittest.mock import Mock - -import assertpy -import pytest - -from feast import ( - FeatureStore, -) -from feast.feast_object import FeastObject -from feast.permissions.authorized_resource import ( - ALL_RESOURCE_TYPES, - AuthzedResource, -) - - -def test_authorized_resource_types(): - # Invalid types - with pytest.raises(ValueError): - AuthzedResource("any") - with pytest.raises(ValueError): - AuthzedResource(FeatureStore) - - # Valid types - AuthzedResource(ALL_RESOURCE_TYPES) - for t in get_args(FeastObject): - AuthzedResource(t) - - -def test_authorized_resource_type_defaults(): - authzed_resource = AuthzedResource(ALL_RESOURCE_TYPES) - assertpy.assert_that(authzed_resource.with_subclasses).is_false() - assertpy.assert_that(authzed_resource.name_pattern).is_none() - assertpy.assert_that(authzed_resource.required_tags).is_none() - - -def test_authorized_resource_matches_ALL(): - authzed_resource = AuthzedResource(ALL_RESOURCE_TYPES) - resource = None - assertpy.assert_that(authzed_resource.match_resource(resource)).is_false() - resource = "invalid string" - assertpy.assert_that(authzed_resource.match_resource(resource)).is_false() - resource = "ALL" - assertpy.assert_that(authzed_resource.match_resource(resource)).is_false() - - for t in get_args(FeastObject): - resource = Mock(spec=t) - resource.name = "test" - assertpy.assert_that(authzed_resource.match_resource(resource)).is_true() - - -def test_authorized_resource_matches_ALL_with_name_filter(): - authzed_resource = AuthzedResource(ALL_RESOURCE_TYPES, name_pattern="test.*") - for t in get_args(FeastObject): - resource = Mock(spec=t) - resource.name = "test" - assertpy.assert_that(authzed_resource.match_resource(resource)).is_true() - - for t in get_args(FeastObject): - resource = Mock(spec=t) - resource.name = "test1" - assertpy.assert_that(authzed_resource.match_resource(resource)).is_true() - - for t in get_args(FeastObject): - resource = Mock(spec=t) - resource.name = "wrongtest" - assertpy.assert_that(authzed_resource.match_resource(resource)).is_false() - - authzed_resource = AuthzedResource(ALL_RESOURCE_TYPES, name_pattern=".*test.*") - for t in get_args(FeastObject): - resource = Mock(spec=t) - resource.name = "wrongtest" - assertpy.assert_that(authzed_resource.match_resource(resource)).is_true() - - -def test_authorized_resource_matches_ALL_with_tags(): - # Missing tags - authzed_resource = AuthzedResource( - ALL_RESOURCE_TYPES, required_tags={"owner": "dev"} - ) - for t in get_args(FeastObject): - resource = Mock(spec=t) - resource.name = "test" - resource.tags = {} - assertpy.assert_that(authzed_resource.match_resource(resource)).is_false() - - # Wrong tag value - for t in get_args(FeastObject): - resource = Mock(spec=t) - resource.name = "test" - resource.tags = {"owner": "master"} - assertpy.assert_that(authzed_resource.match_resource(resource)).is_false() - - # All matching tags - for t in get_args(FeastObject): - resource = Mock(spec=t) - resource.name = "test" - resource.tags = {"owner": "dev", "other": 1} - assertpy.assert_that(authzed_resource.match_resource(resource)).is_true() - - # One missing tag - authzed_resource = AuthzedResource( - ALL_RESOURCE_TYPES, required_tags={"owner": "dev", "dep": 1} - ) - for t in get_args(FeastObject): - resource = Mock(spec=t) - resource.name = "test" - resource.tags = {"owner": "dev", "other": 1} - assertpy.assert_that(authzed_resource.match_resource(resource)).is_false() - - # All matching tags - for t in get_args(FeastObject): - resource = Mock(spec=t) - resource.name = "test" - resource.tags = {"owner": "dev", "other": 1, "dep": 1} - assertpy.assert_that(authzed_resource.match_resource(resource)).is_true() diff --git a/sdk/python/tests/unit/permissions/test_permission.py b/sdk/python/tests/unit/permissions/test_permission.py index c03bf4f7d4..5bf14d7f34 100644 --- a/sdk/python/tests/unit/permissions/test_permission.py +++ b/sdk/python/tests/unit/permissions/test_permission.py @@ -1,15 +1,17 @@ +from typing import get_args from unittest.mock import Mock import assertpy import pytest from feast import ( + FeatureService, FeatureView, ) -from feast.permissions.authorized_resource import ALL_RESOURCE_TYPES +from feast.feast_object import FeastObject from feast.permissions.permission import ( + ALL_RESOURCE_TYPES, AuthzedAction, - AuthzedResource, DecisionStrategy, Permission, ) @@ -28,10 +30,13 @@ def test_global_decision_strategy(): ) -def test_permission_defaults(): +def test_defaults(): p = Permission(name="test") - assertpy.assert_that(type(p.resources)).is_equal_to(list) - assertpy.assert_that(p.resources[0]).is_equal_to(ALL_RESOURCE_TYPES) + assertpy.assert_that(type(p.types)).is_equal_to(list) + assertpy.assert_that(p.types).is_equal_to(ALL_RESOURCE_TYPES) + assertpy.assert_that(p.with_subclasses).is_false() + assertpy.assert_that(p.name_pattern).is_none() + assertpy.assert_that(p.required_tags).is_none() assertpy.assert_that(type(p.actions)).is_equal_to(list) assertpy.assert_that(p.actions[0]).is_equal_to(AuthzedAction.ALL) assertpy.assert_that(type(p.actions)).is_equal_to(list) @@ -40,42 +45,38 @@ def test_permission_defaults(): assertpy.assert_that(p.decision_strategy).is_equal_to(DecisionStrategy.UNANIMOUS) -def test_permission_validity(): - all_resources = AuthzedResource(type=ALL_RESOURCE_TYPES) +def test_validity(): # Invalid values with pytest.raises(ValueError): - Permission(name="test", resources=None) + Permission(name="test", types=None) with pytest.raises(ValueError): - Permission(name="test", resources=[]) + Permission(name="test", types=[]) with pytest.raises(ValueError): - Permission(name="test", resources=all_resources, actions=None) + Permission(name="test", actions=None) with pytest.raises(ValueError): - Permission(name="test", resources=all_resources, actions=[]) + Permission(name="test", actions=[]) with pytest.raises(ValueError): - Permission(name="test", resources=all_resources, policies=None) + Permission(name="test", policies=None) with pytest.raises(ValueError): - Permission(name="test", resources=all_resources, policies=[]) + Permission(name="test", policies=[]) with pytest.raises(ValueError): - Permission(name="test", resources=all_resources, decision_strategy="invalid") + Permission(name="test", decision_strategy="invalid") # Valid values - Permission(name="test", resources=AuthzedResource("ALL")) - Permission( - name="test", resources=[AuthzedResource("ALL"), AuthzedResource(FeatureView)] - ) - Permission(name="test", resources=all_resources, actions=AuthzedAction.ALL) - Permission(name="test", resources=all_resources, actions=[AuthzedAction.ALL]) + Permission(name="test", types=ALL_RESOURCE_TYPES) + Permission(name="test", types=[FeatureView, FeatureService]) + Permission(name="test", actions=AuthzedAction.ALL) + Permission(name="test", actions=[AuthzedAction.ALL]) Permission( name="test", - resources=all_resources, actions=[AuthzedAction.CREATE, AuthzedAction.DELETE], ) -def test_permission_normalized_args(): - p = Permission(name="test", resources=AuthzedResource("ALL")) - assertpy.assert_that(type(p.resources)).is_equal_to(list) - assertpy.assert_that(p.resources).is_equal_to([AuthzedResource("ALL")]) +def test_normalized_args(): + p = Permission(name="test") + assertpy.assert_that(type(p.types)).is_equal_to(list) + assertpy.assert_that(p.types).is_equal_to(ALL_RESOURCE_TYPES) p = Permission(name="test", actions=AuthzedAction.CREATE) assertpy.assert_that(type(p.actions)).is_equal_to(list) @@ -85,10 +86,93 @@ def test_permission_normalized_args(): assertpy.assert_that(type(p.policies)).is_equal_to(list) -def test_permission_match_actions(): - p = Permission(name="test", resources=AuthzedResource("ALL")) +def test_match_resource(): + p = Permission(name="test") + resource = None + assertpy.assert_that(p.match_resource(resource)).is_false() + resource = "invalid string" + assertpy.assert_that(p.match_resource(resource)).is_false() + resource = "ALL" + assertpy.assert_that(p.match_resource(resource)).is_false() + + for t in get_args(FeastObject): + resource = Mock(spec=t) + resource.name = "test" + assertpy.assert_that(p.match_resource(resource)).is_true() + + +def test_resource_match_with_name_filter(): + p = Permission(name="test", name_pattern="test.*") + for t in get_args(FeastObject): + resource = Mock(spec=t) + resource.name = "test" + assertpy.assert_that(p.match_resource(resource)).is_true() + + for t in get_args(FeastObject): + resource = Mock(spec=t) + resource.name = "test1" + assertpy.assert_that(p.match_resource(resource)).is_true() + + for t in get_args(FeastObject): + resource = Mock(spec=t) + resource.name = "wrongtest" + assertpy.assert_that(p.match_resource(resource)).is_false() + + p = Permission(name="test", name_pattern=".*test.*") + for t in get_args(FeastObject): + resource = Mock(spec=t) + resource.name = "wrongtest" + assertpy.assert_that(p.match_resource(resource)).is_true() + + +def test_resource_match_with_tags(): + # Missing tags + p = Permission(name="test", required_tags={"owner": "dev"}) + for t in get_args(FeastObject): + resource = Mock(spec=t) + resource.name = "test" + resource.tags = {} + assertpy.assert_that(p.match_resource(resource)).is_false() + + # Wrong tag value + for t in get_args(FeastObject): + resource = Mock(spec=t) + resource.name = "test" + resource.tags = {"owner": "master"} + assertpy.assert_that(p.match_resource(resource)).is_false() + + # All matching tags + for t in get_args(FeastObject): + resource = Mock(spec=t) + resource.name = "test" + resource.tags = {"owner": "dev", "other": 1} + assertpy.assert_that(p.match_resource(resource)).is_true() + + # One missing tag + p = Permission(name="test", required_tags={"owner": "dev", "dep": 1}) + for t in get_args(FeastObject): + resource = Mock(spec=t) + resource.name = "test" + resource.tags = {"owner": "dev", "other": 1} + assertpy.assert_that(p.match_resource(resource)).is_false() + + # All matching tags + for t in get_args(FeastObject): + resource = Mock(spec=t) + resource.name = "test" + resource.tags = {"owner": "dev", "other": 1, "dep": 1} + assertpy.assert_that(p.match_resource(resource)).is_true() + + +def test_match_actions(): + p = Permission(name="test") for action in AuthzedAction.__members__.values(): assertpy.assert_that(p.match_actions(actions=action)).is_true() - p = Permission(name="test", resources=AuthzedResource("ALL")) + p = Permission(name="test", actions=[AuthzedAction.CREATE, AuthzedAction.DELETE]) + assertpy.assert_that( + p.match_actions(actions=[AuthzedAction.CREATE, AuthzedAction.DELETE]) + ).is_true() + assertpy.assert_that(p.match_actions(actions=[AuthzedAction.CREATE])).is_true() + assertpy.assert_that(p.match_actions(actions=[AuthzedAction.DELETE])).is_true() diff --git a/sdk/python/tests/unit/permissions/test_security_manager.py b/sdk/python/tests/unit/permissions/test_security_manager.py index 54f5648e38..03c396b629 100644 --- a/sdk/python/tests/unit/permissions/test_security_manager.py +++ b/sdk/python/tests/unit/permissions/test_security_manager.py @@ -4,7 +4,6 @@ import pytest from feast import FeatureView -from feast.permissions.authorized_resource import AuthzedResource from feast.permissions.permission import AuthzedAction, Permission from feast.permissions.policy import RoleBasedPolicy from feast.permissions.role_manager import RoleManager @@ -37,7 +36,8 @@ def security_manager() -> SecurityManager: permissions.append( Permission( name="reader", - resources=AuthzedResource(type=FeatureView, with_subclasses=True), + types=FeatureView, + with_subclasses=True, policies=[RoleBasedPolicy(roles=["reader"])], actions=[AuthzedAction.READ], ) From a2fa5de7847aae015b2d62a40f282cd20f094b50 Mon Sep 17 00:00:00 2001 From: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Date: Mon, 24 Jun 2024 11:36:12 +0200 Subject: [PATCH 004/169] using pytest.mark.parametrize tests Signed-off-by: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Signed-off-by: Abdul Hameed --- .../tests/unit/permissions/test_permission.py | 199 ++++++++---------- .../tests/unit/permissions/test_policy.py | 63 +++++- .../unit/permissions/test_role_manager.py | 25 ++- .../unit/permissions/test_security_manager.py | 61 +++--- 4 files changed, 199 insertions(+), 149 deletions(-) diff --git a/sdk/python/tests/unit/permissions/test_permission.py b/sdk/python/tests/unit/permissions/test_permission.py index 5bf14d7f34..4e70a24360 100644 --- a/sdk/python/tests/unit/permissions/test_permission.py +++ b/sdk/python/tests/unit/permissions/test_permission.py @@ -15,7 +15,7 @@ DecisionStrategy, Permission, ) -from feast.permissions.policy import AllowAll +from feast.permissions.policy import AllowAll, Policy def test_global_decision_strategy(): @@ -45,32 +45,31 @@ def test_defaults(): assertpy.assert_that(p.decision_strategy).is_equal_to(DecisionStrategy.UNANIMOUS) -def test_validity(): - # Invalid values - with pytest.raises(ValueError): - Permission(name="test", types=None) - with pytest.raises(ValueError): - Permission(name="test", types=[]) - with pytest.raises(ValueError): - Permission(name="test", actions=None) - with pytest.raises(ValueError): - Permission(name="test", actions=[]) - with pytest.raises(ValueError): - Permission(name="test", policies=None) - with pytest.raises(ValueError): - Permission(name="test", policies=[]) - with pytest.raises(ValueError): - Permission(name="test", decision_strategy="invalid") - - # Valid values - Permission(name="test", types=ALL_RESOURCE_TYPES) - Permission(name="test", types=[FeatureView, FeatureService]) - Permission(name="test", actions=AuthzedAction.ALL) - Permission(name="test", actions=[AuthzedAction.ALL]) - Permission( - name="test", - actions=[AuthzedAction.CREATE, AuthzedAction.DELETE], - ) +@pytest.mark.parametrize( + "dict, result", + [ + ({"types": None}, False), + ({"types": []}, False), + ({"types": ALL_RESOURCE_TYPES}, True), + ({"types": [FeatureView, FeatureService]}, True), + ({"actions": None}, False), + ({"actions": []}, False), + ({"actions": AuthzedAction.ALL}, True), + ({"actions": [AuthzedAction.ALL]}, True), + ({"actions": [AuthzedAction.CREATE, AuthzedAction.DELETE]}, True), + ({"policies": None}, False), + ({"policies": []}, False), + ({"policies": Mock(spec=Policy)}, True), + ({"policies": [Mock(spec=Policy)]}, True), + ({"decision_strategy": DecisionStrategy.AFFIRMATIVE}, True), + ], +) +def test_validity(dict, result): + if not result: + with pytest.raises(ValueError): + Permission(name="test", **dict) + else: + Permission(name="test", **dict) def test_normalized_args(): @@ -86,93 +85,77 @@ def test_normalized_args(): assertpy.assert_that(type(p.policies)).is_equal_to(list) -def test_match_resource(): +@pytest.mark.parametrize( + "resource, result", + [ + (None, False), + ("invalid string", False), + ("ALL", False), + ("ALL", False), + ] + + [(Mock(spec=t), True) for t in get_args(FeastObject)], +) +def test_match_resource(resource, result): p = Permission(name="test") - resource = None - assertpy.assert_that(p.match_resource(resource)).is_false() - resource = "invalid string" - assertpy.assert_that(p.match_resource(resource)).is_false() - resource = "ALL" - assertpy.assert_that(p.match_resource(resource)).is_false() - - for t in get_args(FeastObject): - resource = Mock(spec=t) - resource.name = "test" - assertpy.assert_that(p.match_resource(resource)).is_true() - - -def test_resource_match_with_name_filter(): - p = Permission(name="test", name_pattern="test.*") - for t in get_args(FeastObject): - resource = Mock(spec=t) - resource.name = "test" - assertpy.assert_that(p.match_resource(resource)).is_true() - - for t in get_args(FeastObject): - resource = Mock(spec=t) - resource.name = "test1" - assertpy.assert_that(p.match_resource(resource)).is_true() + assertpy.assert_that(p.match_resource(resource)).is_equal_to(result) - for t in get_args(FeastObject): - resource = Mock(spec=t) - resource.name = "wrongtest" - assertpy.assert_that(p.match_resource(resource)).is_false() - p = Permission(name="test", name_pattern=".*test.*") +@pytest.mark.parametrize( + "pattern, name, match", + [ + ("test.*", "test", True), + ("test.*", "test1", True), + ("test.*", "wrongtest", False), + (".*test.*", "wrongtest", True), + ], +) +def test_resource_match_with_name_filter(pattern, name, match): + p = Permission(name="test", name_pattern=pattern) for t in get_args(FeastObject): resource = Mock(spec=t) - resource.name = "wrongtest" - assertpy.assert_that(p.match_resource(resource)).is_true() - - -def test_resource_match_with_tags(): + resource.name = name + assertpy.assert_that(p.match_resource(resource)).is_equal_to(match) + + +@pytest.mark.parametrize( + ("required_tags, tags, result"), + [ + ({"owner": "dev"}, {}, False), + ({"owner": "dev"}, {"owner": "master"}, False), + ({"owner": "dev"}, {"owner": "dev", "other": 1}, True), + ({"owner": "dev", "dep": 1}, {"owner": "dev", "other": 1}, False), + ({"owner": "dev", "dep": 1}, {"owner": "dev", "other": 1, "dep": 1}, True), + ], +) +def test_resource_match_with_tags(required_tags, tags, result): # Missing tags - p = Permission(name="test", required_tags={"owner": "dev"}) + p = Permission(name="test", required_tags=required_tags) for t in get_args(FeastObject): resource = Mock(spec=t) resource.name = "test" - resource.tags = {} - assertpy.assert_that(p.match_resource(resource)).is_false() - - # Wrong tag value - for t in get_args(FeastObject): - resource = Mock(spec=t) - resource.name = "test" - resource.tags = {"owner": "master"} - assertpy.assert_that(p.match_resource(resource)).is_false() - - # All matching tags - for t in get_args(FeastObject): - resource = Mock(spec=t) - resource.name = "test" - resource.tags = {"owner": "dev", "other": 1} - assertpy.assert_that(p.match_resource(resource)).is_true() - - # One missing tag - p = Permission(name="test", required_tags={"owner": "dev", "dep": 1}) - for t in get_args(FeastObject): - resource = Mock(spec=t) - resource.name = "test" - resource.tags = {"owner": "dev", "other": 1} - assertpy.assert_that(p.match_resource(resource)).is_false() - - # All matching tags - for t in get_args(FeastObject): - resource = Mock(spec=t) - resource.name = "test" - resource.tags = {"owner": "dev", "other": 1, "dep": 1} - assertpy.assert_that(p.match_resource(resource)).is_true() - - -def test_match_actions(): - p = Permission(name="test") - - for action in AuthzedAction.__members__.values(): - assertpy.assert_that(p.match_actions(actions=action)).is_true() - - p = Permission(name="test", actions=[AuthzedAction.CREATE, AuthzedAction.DELETE]) - assertpy.assert_that( - p.match_actions(actions=[AuthzedAction.CREATE, AuthzedAction.DELETE]) - ).is_true() - assertpy.assert_that(p.match_actions(actions=[AuthzedAction.CREATE])).is_true() - assertpy.assert_that(p.match_actions(actions=[AuthzedAction.DELETE])).is_true() + resource.tags = tags + assertpy.assert_that(p.match_resource(resource)).is_equal_to(result) + + +@pytest.mark.parametrize( + ("permitted_actions, actions, result"), + [(AuthzedAction.ALL, a, True) for a in AuthzedAction.__members__.values()] + + [ + ( + [AuthzedAction.CREATE, AuthzedAction.DELETE], + [AuthzedAction.CREATE, AuthzedAction.DELETE], + True, + ), + ([AuthzedAction.CREATE, AuthzedAction.DELETE], [AuthzedAction.CREATE], True), + ([AuthzedAction.CREATE, AuthzedAction.DELETE], [AuthzedAction.DELETE], True), + ([AuthzedAction.CREATE, AuthzedAction.DELETE], [AuthzedAction.UPDATE], False), + ( + [AuthzedAction.CREATE, AuthzedAction.DELETE], + [AuthzedAction.CREATE, AuthzedAction.DELETE, AuthzedAction.UPDATE], + False, + ), + ], +) +def test_match_actions(permitted_actions, actions, result): + p = Permission(name="test", actions=permitted_actions) + assertpy.assert_that(p.match_actions(actions=actions)).is_equal_to(result) diff --git a/sdk/python/tests/unit/permissions/test_policy.py b/sdk/python/tests/unit/permissions/test_policy.py index 2a8afb9f57..082e84df21 100644 --- a/sdk/python/tests/unit/permissions/test_policy.py +++ b/sdk/python/tests/unit/permissions/test_policy.py @@ -1,11 +1,62 @@ import assertpy +import pytest -from feast.permissions.policy import AllowAll +from feast.permissions.policy import AllowAll, RoleBasedPolicy +from feast.permissions.role_manager import RoleManager -def test_allow_all(): - policy = AllowAll +@pytest.mark.parametrize( + "user, dict", + [ + ("any", None), + (None, None), + ("any", {"other_arg": 1234}), + ], +) +def test_allow_all(user, dict): + if dict: + assertpy.assert_that(AllowAll.validate_user(user, **dict)).is_true() + else: + assertpy.assert_that(AllowAll.validate_user(user)).is_true() - assertpy.assert_that(policy.validate_user("any")).is_true() - assertpy.assert_that(policy.validate_user(None, roles=["any"])).is_true() - assertpy.assert_that(policy.validate_user("any", other_arg=1234)).is_true() + +@pytest.fixture +def role_manager() -> RoleManager: + rm = RoleManager() + rm.add_roles_for_user("r", ["reader"]) + rm.add_roles_for_user("w", ["writer"]) + rm.add_roles_for_user("rw", ["reader", "writer"]) + return rm + + +@pytest.mark.parametrize( + "required_roles, user, result", + [ + (["reader"], "r", True), + (["writer"], "r", False), + (["reader", "writer"], "r", False), + (["reader"], "w", False), + (["writer"], "w", True), + (["reader", "writer"], "w", False), + (["reader"], "rw", True), + (["writer"], "rw", True), + (["reader", "writer"], "rw", True), + (["reader", "writer", "updater"], "rw", False), + ], +) +def test_role_based_policy(role_manager, required_roles, user, result): + rm = role_manager + policy = RoleBasedPolicy(roles=required_roles) + + with pytest.raises(ValueError): + policy.validate_user(user=user) + with pytest.raises(ValueError): + policy.validate_user(user=user, role_manager="wrong-type") + + validate_result, explain = policy.validate_user(user, role_manager=rm) + assertpy.assert_that(validate_result).is_equal_to(result) + + if result is True: + assertpy.assert_that(explain).is_equal_to("") + else: + assertpy.assert_that(len(explain)).is_greater_than(0) diff --git a/sdk/python/tests/unit/permissions/test_role_manager.py b/sdk/python/tests/unit/permissions/test_role_manager.py index 4d6e755fe7..25ec054f4a 100644 --- a/sdk/python/tests/unit/permissions/test_role_manager.py +++ b/sdk/python/tests/unit/permissions/test_role_manager.py @@ -1,17 +1,24 @@ import assertpy +import pytest from feast.permissions.role_manager import RoleManager -def test_has_roles(): +@pytest.mark.parametrize( + "user, roles, result", + [ + ("c", [], False), + ("a", ["a1"], True), + ("a", ["a1", "a2"], True), + ("a", ["a1", "a2", "a3"], False), + ("b", ["a1", "a3"], False), + ("b", ["b1", "b2"], True), + ], +) +def test_has_roles(user, roles, result): rm = RoleManager() rm.add_roles_for_user("a", ["a1", "a2"]) rm.add_roles_for_user("b", ["b1", "b2"]) - - assertpy.assert_that(rm.has_roles_for_user("c", list())).is_false() - assertpy.assert_that(rm.has_roles_for_user("a", ["a1"])).is_true() - assertpy.assert_that(rm.has_roles_for_user("a", ["a1", "a2"])).is_true() - assertpy.assert_that(rm.has_roles_for_user("a", ["a1", "a2", "a3"])).is_false() - assertpy.assert_that(rm.has_roles_for_user("a", ["a1", "a3"])).is_false() - assertpy.assert_that(rm.has_roles_for_user("b", ["a1", "a3"])).is_false() - assertpy.assert_that(rm.has_roles_for_user("b", ["b1", "b2"])).is_true() + assertpy.assert_that(rm.has_roles_for_user(user=user, roles=roles)).is_equal_to( + result + ) diff --git a/sdk/python/tests/unit/permissions/test_security_manager.py b/sdk/python/tests/unit/permissions/test_security_manager.py index 03c396b629..81d5956972 100644 --- a/sdk/python/tests/unit/permissions/test_security_manager.py +++ b/sdk/python/tests/unit/permissions/test_security_manager.py @@ -26,6 +26,10 @@ def __init__(self, name, tags): def read_protected(self) -> bool: return True + @require_permissions(actions=[AuthzedAction.WRITE]) + def write_protected(self) -> bool: + return True + def unprotected(self) -> bool: return True @@ -42,6 +46,15 @@ def security_manager() -> SecurityManager: actions=[AuthzedAction.READ], ) ) + permissions.append( + Permission( + name="writer", + types=FeatureView, + with_subclasses=True, + policies=[RoleBasedPolicy(roles=["writer"])], + actions=[AuthzedAction.WRITE], + ) + ) rm = RoleManager() rm.add_roles_for_user("r", ["reader"]) @@ -57,34 +70,30 @@ def feature_view() -> FeatureView: return SecuredFeatureView("secured", {}) -def test_no_user(security_manager, feature_view): - fv = feature_view - - with pytest.raises(PermissionError): - fv.read_protected() - assertpy.assert_that(fv.unprotected()).is_true() - - -def test_reader_user(security_manager, feature_view): +@pytest.mark.parametrize( + "user, can_read, can_write", + [ + (None, False, False), + ("r", True, False), + ("w", False, True), + ("rw", True, True), + ], +) +def test_access_SecuredFeatureView( + security_manager, feature_view, user, can_read, can_write +): sm = security_manager fv = feature_view - sm.set_current_user("r") - fv.read_protected() - assertpy.assert_that(fv.unprotected()).is_true() - -def test_writer_user(security_manager, feature_view): - sm = security_manager - fv = feature_view - sm.set_current_user("w") - with pytest.raises(PermissionError): + sm.set_current_user(user) + if can_read: fv.read_protected() - assertpy.assert_that(fv.unprotected()).is_true() - - -def test_reader_writer_user(security_manager, feature_view): - sm = security_manager - fv = feature_view - sm.set_current_user("rw") - fv.read_protected() + else: + with pytest.raises(PermissionError): + fv.read_protected() + if can_write: + fv.write_protected() + else: + with pytest.raises(PermissionError): + fv.write_protected() assertpy.assert_that(fv.unprotected()).is_true() From d906554a1bbcaa225b2cfa3898403b3c145a8163 Mon Sep 17 00:00:00 2001 From: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Date: Mon, 24 Jun 2024 12:11:25 +0200 Subject: [PATCH 005/169] moved decorator to decorator module Signed-off-by: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Signed-off-by: Abdul Hameed --- sdk/python/feast/permissions/decorator.py | 43 +++++++++++++++++++ .../feast/permissions/security_manager.py | 38 +--------------- ..._security_manager.py => test_decorator.py} | 2 +- 3 files changed, 45 insertions(+), 38 deletions(-) create mode 100644 sdk/python/feast/permissions/decorator.py rename sdk/python/tests/unit/permissions/{test_security_manager.py => test_decorator.py} (97%) diff --git a/sdk/python/feast/permissions/decorator.py b/sdk/python/feast/permissions/decorator.py new file mode 100644 index 0000000000..e582501f07 --- /dev/null +++ b/sdk/python/feast/permissions/decorator.py @@ -0,0 +1,43 @@ +import logging +from typing import Union + +from feast.permissions.permission import AuthzedAction, is_of_expected_type +from feast.permissions.security_manager import get_security_manager + +logger = logging.getLogger(__name__) + + +def require_permissions(actions: Union[list[AuthzedAction], AuthzedAction]): + """ + A decorator to define the actions that are executed from within the current class method and that must be protected + against unauthorized access. + + The first parameter of the protected method must be `self` + """ + + def require_permissions_decorator(func): + def permission_checker(*args, **kwargs): + logger.debug(f"permission_checker for {args}, {kwargs}") + resource = args[0] + if not is_of_expected_type(resource): + raise NotImplementedError( + f"The first argument is not of a managed type but {type(resource)}" + ) + + sm = get_security_manager() + if sm is None: + return True + + sm.assert_permissions( + resource=resource, + actions=actions, + ) + logger.debug( + f"User {sm.current_user} can invoke {actions} on {resource.name}:{type(resource)} " + ) + result = func(*args, **kwargs) + return result + + return permission_checker + + return require_permissions_decorator diff --git a/sdk/python/feast/permissions/security_manager.py b/sdk/python/feast/permissions/security_manager.py index 44e469d7e0..f66e54076a 100644 --- a/sdk/python/feast/permissions/security_manager.py +++ b/sdk/python/feast/permissions/security_manager.py @@ -4,48 +4,12 @@ from feast.feast_object import FeastObject from feast.permissions.enforcer import enforce_policy -from feast.permissions.permission import AuthzedAction, Permission, is_of_expected_type +from feast.permissions.permission import AuthzedAction, Permission from feast.permissions.role_manager import RoleManager logger = logging.getLogger(__name__) -def require_permissions(actions: Union[list[AuthzedAction], AuthzedAction]): - """ - A decorator to define the actions that are executed from within the current class method and that must be protected - against unauthorized access. - - The first parameter of the protected method must be `self` - """ - - def require_permissions_decorator(func): - def permission_checker(*args, **kwargs): - logger.debug(f"permission_checker for {args}, {kwargs}") - resource = args[0] - if not is_of_expected_type(resource): - raise NotImplementedError( - f"The first argument is not of a managed type but {type(resource)}" - ) - - sm = get_security_manager() - if sm is None: - return True - - sm.assert_permissions( - resource=resource, - actions=actions, - ) - logger.debug( - f"User {sm.current_user} can invoke {actions} on {resource.name}:{type(resource)} " - ) - result = func(*args, **kwargs) - return result - - return permission_checker - - return require_permissions_decorator - - class SecurityManager: """ The security manager holds references to the security components (role manager, policy enforces) and the configured permissions. diff --git a/sdk/python/tests/unit/permissions/test_security_manager.py b/sdk/python/tests/unit/permissions/test_decorator.py similarity index 97% rename from sdk/python/tests/unit/permissions/test_security_manager.py rename to sdk/python/tests/unit/permissions/test_decorator.py index 81d5956972..f47a003932 100644 --- a/sdk/python/tests/unit/permissions/test_security_manager.py +++ b/sdk/python/tests/unit/permissions/test_decorator.py @@ -4,12 +4,12 @@ import pytest from feast import FeatureView +from feast.permissions.decorator import require_permissions from feast.permissions.permission import AuthzedAction, Permission from feast.permissions.policy import RoleBasedPolicy from feast.permissions.role_manager import RoleManager from feast.permissions.security_manager import ( SecurityManager, - require_permissions, set_security_manager, ) From 21d29a841e466cf92c2d71febebcd2b58d1deaa7 Mon Sep 17 00:00:00 2001 From: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Date: Mon, 24 Jun 2024 12:11:41 +0200 Subject: [PATCH 006/169] parametrized decision tests Signed-off-by: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Signed-off-by: Abdul Hameed --- .../tests/unit/permissions/test_decision.py | 173 +++++++----------- 1 file changed, 70 insertions(+), 103 deletions(-) diff --git a/sdk/python/tests/unit/permissions/test_decision.py b/sdk/python/tests/unit/permissions/test_decision.py index 27f5007e6e..16f5d0c27b 100644 --- a/sdk/python/tests/unit/permissions/test_decision.py +++ b/sdk/python/tests/unit/permissions/test_decision.py @@ -1,111 +1,78 @@ import assertpy +import pytest from feast.permissions.decision import DecisionEvaluator, DecisionStrategy +# Each vote is a tuple of `current_vote` and expected output of `is_decided` -def test_affirmative(): - evaluator = DecisionEvaluator(DecisionStrategy.AFFIRMATIVE, 3) - evaluator.add_grant("vote", True, "") - assertpy.assert_that(evaluator.is_decided()).is_true() - assertpy.assert_that(evaluator.grant()).is_equal_to((True, [])) - evaluator = DecisionEvaluator(DecisionStrategy.AFFIRMATIVE, 3) - evaluator.add_grant("vote", False, "a message") - assertpy.assert_that(evaluator.is_decided()).is_false() - evaluator.add_grant("vote", False, "a message") - assertpy.assert_that(evaluator.is_decided()).is_false() - evaluator.add_grant("vote", False, "a message") - assertpy.assert_that(evaluator.is_decided()).is_true() - grant, explanations = evaluator.grant() - assertpy.assert_that(grant).is_equal_to(False) - assertpy.assert_that(explanations).is_length(3) - - -def test_unanimous(): - evaluator = DecisionEvaluator(DecisionStrategy.UNANIMOUS, 3) - evaluator.add_grant("vote", True, "") - assertpy.assert_that(evaluator.is_decided()).is_false() - evaluator.add_grant("vote", True, "") - assertpy.assert_that(evaluator.is_decided()).is_false() - evaluator.add_grant("vote", True, "") - assertpy.assert_that(evaluator.is_decided()).is_true() - assertpy.assert_that(evaluator.grant()).is_equal_to((True, [])) - - evaluator = DecisionEvaluator(DecisionStrategy.UNANIMOUS, 3) - evaluator.add_grant("vote", True, "") - assertpy.assert_that(evaluator.is_decided()).is_false() - evaluator.add_grant("vote", False, "a message") - assertpy.assert_that(evaluator.is_decided()).is_true() - grant, explanations = evaluator.grant() - assertpy.assert_that(grant).is_equal_to(False) - assertpy.assert_that(explanations).is_length(1) - - -def test_consensus(): - evaluator = DecisionEvaluator(DecisionStrategy.CONSENSUS, 1) - evaluator.add_grant("vote", True, "") - assertpy.assert_that(evaluator.is_decided()).is_true() - assertpy.assert_that(evaluator.grant()).is_equal_to((True, [])) - - evaluator = DecisionEvaluator(DecisionStrategy.CONSENSUS, 1) - evaluator.add_grant("vote", False, "a message") - assertpy.assert_that(evaluator.is_decided()).is_true() - grant, explanations = evaluator.grant() - assertpy.assert_that(grant).is_equal_to(False) - assertpy.assert_that(explanations).is_length(1) - - evaluator = DecisionEvaluator(DecisionStrategy.CONSENSUS, 5) - evaluator.add_grant("vote", True, "") - assertpy.assert_that(evaluator.is_decided()).is_false() - evaluator.add_grant("vote", False, "a message") - assertpy.assert_that(evaluator.is_decided()).is_false() - evaluator.add_grant("vote", False, "a message") - assertpy.assert_that(evaluator.is_decided()).is_false() - evaluator.add_grant("vote", True, "") - assertpy.assert_that(evaluator.is_decided()).is_false() - evaluator.add_grant("vote", True, "") - assertpy.assert_that(evaluator.is_decided()).is_true() - grant, explanations = evaluator.grant() - assertpy.assert_that(grant).is_equal_to(True) - assertpy.assert_that(explanations).is_length(2) - - evaluator = DecisionEvaluator(DecisionStrategy.CONSENSUS, 5) - evaluator.add_grant("vote", True, "") - assertpy.assert_that(evaluator.is_decided()).is_false() - evaluator.add_grant("vote", False, "a message") - assertpy.assert_that(evaluator.is_decided()).is_false() - evaluator.add_grant("vote", False, "a message") - assertpy.assert_that(evaluator.is_decided()).is_false() - evaluator.add_grant("vote", False, "a message") - assertpy.assert_that(evaluator.is_decided()).is_true() - grant, explanations = evaluator.grant() - assertpy.assert_that(grant).is_equal_to(False) - assertpy.assert_that(explanations).is_length(3) - - -def test_additional_votes_are_discarded(): - evaluator = DecisionEvaluator(DecisionStrategy.UNANIMOUS, 2) - evaluator.add_grant("vote", True, "") - assertpy.assert_that(evaluator.is_decided()).is_false() - evaluator.add_grant("vote", True, "") - assertpy.assert_that(evaluator.is_decided()).is_true() - evaluator.add_grant("vote", False, "a message") - assertpy.assert_that(evaluator.is_decided()).is_true() - evaluator.add_grant("vote", False, "a message") - assertpy.assert_that(evaluator.is_decided()).is_true() - evaluator.add_grant("vote", False, "a message") - assertpy.assert_that(evaluator.is_decided()).is_true() - assertpy.assert_that(evaluator.grant()).is_equal_to((True, [])) +@pytest.mark.parametrize( + "evaluator, votes, decision, no_of_explanations", + [ + (DecisionEvaluator(DecisionStrategy.AFFIRMATIVE, 3), [(True, True)], True, 0), + (DecisionEvaluator(DecisionStrategy.AFFIRMATIVE, 3), [(True, True)], True, 0), + ( + DecisionEvaluator(DecisionStrategy.AFFIRMATIVE, 3), + [(False, False), (False, False), (False, True)], + False, + 3, + ), + ( + DecisionEvaluator(DecisionStrategy.UNANIMOUS, 3), + [(True, False), (True, False), (True, True)], + True, + 0, + ), + ( + DecisionEvaluator(DecisionStrategy.UNANIMOUS, 3), + [(True, False), (False, True)], + False, + 1, + ), + (DecisionEvaluator(DecisionStrategy.CONSENSUS, 1), [(True, True)], True, 0), + (DecisionEvaluator(DecisionStrategy.CONSENSUS, 1), [(False, True)], False, 1), + ( + DecisionEvaluator(DecisionStrategy.CONSENSUS, 5), + [ + (True, False), + (False, False), + (False, False), + (True, False), + (True, True), + ], + True, + 2, + ), + ( + DecisionEvaluator(DecisionStrategy.CONSENSUS, 5), + [(True, False), (False, False), (False, False), (False, True)], + False, + 3, + ), + ( + DecisionEvaluator(DecisionStrategy.UNANIMOUS, 2), + [(True, False), (True, True), (False, True), (False, True), (False, True)], + True, + 0, + ), + ( + DecisionEvaluator(DecisionStrategy.UNANIMOUS, 2), + [(False, True), (False, True), (False, True), (False, True), (False, True)], + False, + 1, + ), + ], +) +def test_decision_evaluator(evaluator, votes, decision, no_of_explanations): + for v in votes: + vote = v[0] + decided = v[1] + evaluator.add_grant("vote", vote, "" if vote else "a message") + if decided: + assertpy.assert_that(evaluator.is_decided()).is_true() + else: + assertpy.assert_that(evaluator.is_decided()).is_false() - evaluator = DecisionEvaluator(DecisionStrategy.UNANIMOUS, 2) - evaluator.add_grant("vote", False, "a message") - assertpy.assert_that(evaluator.is_decided()).is_true() - evaluator.add_grant("vote", False, "a message") - assertpy.assert_that(evaluator.is_decided()).is_true() - evaluator.add_grant("vote", False, "a message") - assertpy.assert_that(evaluator.is_decided()).is_true() - evaluator.add_grant("vote", False, "a message") - assertpy.assert_that(evaluator.is_decided()).is_true() grant, explanations = evaluator.grant() - assertpy.assert_that(grant).is_equal_to(False) - assertpy.assert_that(explanations).is_length(1) + assertpy.assert_that(grant).is_equal_to(decision) + assertpy.assert_that(explanations).is_length(no_of_explanations) From f477adde51bacbc9ba530b13d754a1a7f089be76 Mon Sep 17 00:00:00 2001 From: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Date: Mon, 24 Jun 2024 16:47:25 +0200 Subject: [PATCH 007/169] Added matcher and action modules. Added global assert_permissions function Signed-off-by: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Signed-off-by: Abdul Hameed --- sdk/python/feast/permissions/action.py | 19 ++++ sdk/python/feast/permissions/decorator.py | 15 +-- sdk/python/feast/permissions/matcher.py | 104 ++++++++++++++++++ sdk/python/feast/permissions/permission.py | 103 +++-------------- .../feast/permissions/security_manager.py | 13 ++- .../tests/unit/permissions/test_permission.py | 51 +++++++-- 6 files changed, 201 insertions(+), 104 deletions(-) create mode 100644 sdk/python/feast/permissions/action.py create mode 100644 sdk/python/feast/permissions/matcher.py diff --git a/sdk/python/feast/permissions/action.py b/sdk/python/feast/permissions/action.py new file mode 100644 index 0000000000..bb590cbd06 --- /dev/null +++ b/sdk/python/feast/permissions/action.py @@ -0,0 +1,19 @@ +import enum + + +class AuthzedAction(enum.Enum): + """ + Identifies the type of action being secured by the permissions framework, according to the familiar CRUD and Feast terminology. + """ + + ALL = "all" # All actions + CREATE = "create" # Create an instance + READ = "read" # Access the instance state + UPDATE = "update" # Update the instance state + DELETE = "delete" # Deelete an instance + QUERY = "query" # Query both online and offline stores + QUERY_ONLINE = "query_online" # Query the online store only + QUERY_OFFLINE = "query_offline" # Query the offline store only + WRITE = "write" # Query on any store + WRITE_ONLINE = "write_online" # Write to the online store only + WRITE_OFFLINE = "write_offline" # Write to the offline store only diff --git a/sdk/python/feast/permissions/decorator.py b/sdk/python/feast/permissions/decorator.py index e582501f07..a90ec567f9 100644 --- a/sdk/python/feast/permissions/decorator.py +++ b/sdk/python/feast/permissions/decorator.py @@ -1,8 +1,9 @@ import logging from typing import Union -from feast.permissions.permission import AuthzedAction, is_of_expected_type -from feast.permissions.security_manager import get_security_manager +from feast.permissions.action import AuthzedAction +from feast.permissions.matcher import is_a_feast_object +from feast.permissions.security_manager import assert_permissions logger = logging.getLogger(__name__) @@ -19,21 +20,17 @@ def require_permissions_decorator(func): def permission_checker(*args, **kwargs): logger.debug(f"permission_checker for {args}, {kwargs}") resource = args[0] - if not is_of_expected_type(resource): + if not is_a_feast_object(resource): raise NotImplementedError( f"The first argument is not of a managed type but {type(resource)}" ) - sm = get_security_manager() - if sm is None: - return True - - sm.assert_permissions( + return assert_permissions( resource=resource, actions=actions, ) logger.debug( - f"User {sm.current_user} can invoke {actions} on {resource.name}:{type(resource)} " + f"Current User can invoke {actions} on {resource.name}:{type(resource)} " ) result = func(*args, **kwargs) return result diff --git a/sdk/python/feast/permissions/matcher.py b/sdk/python/feast/permissions/matcher.py new file mode 100644 index 0000000000..32d473dfcd --- /dev/null +++ b/sdk/python/feast/permissions/matcher.py @@ -0,0 +1,104 @@ +import logging +import re +from typing import Any, Optional, Union, get_args +from unittest.mock import Mock + +from feast.feast_object import FeastObject +from feast.permissions.action import AuthzedAction + +logger = logging.getLogger(__name__) + + +def is_a_feast_object(resource: Any): + for t in get_args(FeastObject): + # Use isinstance to pass Mock validation + if isinstance(resource, t): + return True + return False + + +def resource_match_config( + resource: FeastObject, + expected_types: list[FeastObject], + with_subclasses: bool = True, + name_pattern: Optional[str] = None, + required_tags: Optional[dict[str, str]] = None, +) -> bool: + if resource is None: + logger.warning(f"None passed to {resource_match_config.__name__}") + return False + + if not is_a_feast_object(resource): + logger.warning(f"Given resource is not of a managed type but {type(resource)}") + return False + + if with_subclasses: + # mypy check ignored because of https://github.com/python/mypy/issues/11673, or it raises "Argument 2 to "isinstance" has incompatible type "tuple[Featu ..." + if not isinstance(resource, tuple(expected_types)): # type: ignore + logger.info( + f"Resource does not match any of the expected type {expected_types} (with_subclasses={with_subclasses})" + ) + return False + else: + is_mock = isinstance(resource, Mock) + exact_type_match = False + for t in expected_types: + if not is_mock: + if type(resource) is t: + exact_type_match = True + break + else: + if getattr(resource, "_spec_class", None) is t: + exact_type_match = True + break + if not exact_type_match: + logger.info( + f"Resource does not match any of the expected type {expected_types} (with_subclasses={with_subclasses})" + ) + return False + + if name_pattern is not None: + if hasattr(resource, "name"): + if isinstance(resource.name, str): + match = bool(re.fullmatch(name_pattern, resource.name)) + if not match: + logger.info( + f"Resource name {resource.name} does not match pattern {name_pattern}" + ) + return False + else: + logger.warning( + f"Resource {resource} has no `name` attribute of unexpected type {type(resource.name)}" + ) + else: + logger.warning(f"Resource {resource} has no `name` attribute") + + if required_tags: + if hasattr(resource, "tags"): + if isinstance(resource.tags, dict): + for tag in required_tags.keys(): + required_value = required_tags.get(tag) + actual_value = resource.tags.get(tag) + if required_value != actual_value: + logger.info( + f"Unmatched value {actual_value} for tag {tag}: expected {required_value}" + ) + return False + else: + logger.warning( + f"Resource {resource} has no `tags` attribute of unexpected type {type(resource.tags)}" + ) + else: + logger.warning(f"Resource {resource} has no `tags` attribute") + + return True + + +def actions_match_config( + actions: list[AuthzedAction], + allowed_actions: Union[list[AuthzedAction], AuthzedAction] = AuthzedAction.ALL, +) -> bool: + if AuthzedAction.ALL in allowed_actions: + return True + + return all(a in allowed_actions for a in actions) diff --git a/sdk/python/feast/permissions/permission.py b/sdk/python/feast/permissions/permission.py index 1482362ec3..95a87f64b0 100644 --- a/sdk/python/feast/permissions/permission.py +++ b/sdk/python/feast/permissions/permission.py @@ -1,34 +1,16 @@ -import enum import logging -import re from abc import ABC -from typing import Any, Optional, Union, get_args +from typing import Optional, Union, get_args from feast.feast_object import FeastObject +from feast.permissions.action import AuthzedAction from feast.permissions.decision import DecisionStrategy +from feast.permissions.matcher import actions_match_config, resource_match_config from feast.permissions.policy import AllowAll, Policy logger = logging.getLogger(__name__) -class AuthzedAction(enum.Enum): - """ - Identifies the type of action being secured by the permissions framework, according to the familiar CRUD and Feast terminology. - """ - - ALL = "all" # All actions - CREATE = "create" # Create an instance - READ = "read" # Access the instance state - UPDATE = "update" # Update the instance state - DELETE = "delete" # Deelete an instance - QUERY = "query" # Query both online and offline stores - QUERY_ONLINE = "query_online" # Query the online store only - QUERY_OFFLINE = "query_offline" # Query the offline store only - WRITE = "write" # Query on any store - WRITE_ONLINE = "write_online" # Write to the online store only - WRITE_OFFLINE = "write_offline" # Write to the offline store only - - """ Constant to refer to all the managed types. """ @@ -43,6 +25,7 @@ class Permission(ABC): Attributes: name: The permission name (can be duplicated, used for logging troubleshooting) types: The list of protected resource types as defined by the `FeastObject` type. Defaults to all managed types (e.g. the `ALL_RESOURCE_TYPES` constant) + with_subclasses: If `True`, it includes subclasses of the given types in the match, otherwise only precise type match is applied. Defaults to `True`. name_pattern: a regex to match the resource name. Defaults to None, meaning that no name filtering is applied required_tags: dictionary of key-value pairs that must match the resource tags. All these required_tags must be present as resource tags with the given value. Defaults to None, meaning that no tags filtering is applied. @@ -64,7 +47,7 @@ def __init__( self, name: str, types: Union[list[FeastObject], FeastObject] = ALL_RESOURCE_TYPES, - with_subclasses: bool = False, + with_subclasses: bool = True, name_pattern: Optional[str] = None, required_tags: Optional[dict[str, str]] = None, actions: Union[list[AuthzedAction], AuthzedAction] = AuthzedAction.ALL, @@ -139,73 +122,19 @@ def decision_strategy(self) -> DecisionStrategy: return self._decision_strategy def match_resource(self, resource: FeastObject) -> bool: - if resource is None: - logger.warning(f"None passed to {self.match_resource.__name__}") - return False - - if not is_of_expected_type(resource): - logger.warning( - f"Given resource is not of a managed type but {type(resource)}" - ) - return False - - t = tuple(self.types) - # mypy check ignored because of https://github.com/python/mypy/issues/11673, or it raises "Argument 2 to "isinstance" has incompatible type "tuple[Featu ..." - if not isinstance(resource, t): # type: ignore - logger.info( - f"Resource does not match any of the expected type {self.types}" - ) - return False - - if self.name_pattern is not None: - if hasattr(resource, "name"): - if isinstance(resource.name, str): - match = bool(re.fullmatch(self.name_pattern, resource.name)) - if not match: - logger.info( - f"Resource name {resource.name} does not match pattern {self.name_pattern}" - ) - return False - else: - logger.warning( - f"Resource {resource} has no `name` attribute of unexpected type {type(resource.name)}" - ) - else: - logger.warning(f"Resource {resource} has no `name` attribute") - - if self.required_tags: - if hasattr(resource, "tags"): - if isinstance(resource.tags, dict): - for tag in self.required_tags.keys(): - required_value = self.required_tags.get(tag) - actual_value = resource.tags.get(tag) - if required_value != actual_value: - logger.info( - f"Unmatched value {actual_value} for tag {tag}: expected {required_value}" - ) - return False - else: - logger.warning( - f"Resource {resource} has no `tags` attribute of unexpected type {type(resource.tags)}" - ) - else: - logger.warning(f"Resource {resource} has no `tags` attribute") - - return True + return resource_match_config( + resource=resource, + expected_types=self.types, + with_subclasses=self.with_subclasses, + name_pattern=self.name_pattern, + required_tags=self.required_tags, + ) def match_actions(self, actions: list[AuthzedAction]) -> bool: - if AuthzedAction.ALL in self._actions: - return True - - return all(a in self._actions for a in actions) - - -def is_of_expected_type(resource: Any): - for t in get_args(FeastObject): - # Use isinstance to pass Mock validation - if isinstance(resource, t): - return True - return False + return actions_match_config( + allowed_actions=self.actions, + actions=actions, + ) def _normalize_name_pattern(name_pattern: Optional[str]): diff --git a/sdk/python/feast/permissions/security_manager.py b/sdk/python/feast/permissions/security_manager.py index f66e54076a..7607c0fc97 100644 --- a/sdk/python/feast/permissions/security_manager.py +++ b/sdk/python/feast/permissions/security_manager.py @@ -3,8 +3,9 @@ from typing import List, Optional, Union from feast.feast_object import FeastObject +from feast.permissions.action import AuthzedAction from feast.permissions.enforcer import enforce_policy -from feast.permissions.permission import AuthzedAction, Permission +from feast.permissions.permission import Permission from feast.permissions.role_manager import RoleManager logger = logging.getLogger(__name__) @@ -61,6 +62,16 @@ def assert_permissions( raise PermissionError(explain) +def assert_permissions( + resource: FeastObject, + actions: Union[AuthzedAction, List[AuthzedAction]], +): + sm = get_security_manager() + if sm is None: + return True + return sm.assert_permissions(resource=resource, actions=actions) + + """ Global instance. """ diff --git a/sdk/python/tests/unit/permissions/test_permission.py b/sdk/python/tests/unit/permissions/test_permission.py index 4e70a24360..b9ae51d300 100644 --- a/sdk/python/tests/unit/permissions/test_permission.py +++ b/sdk/python/tests/unit/permissions/test_permission.py @@ -4,11 +4,13 @@ import assertpy import pytest -from feast import ( - FeatureService, - FeatureView, -) +from feast.batch_feature_view import BatchFeatureView +from feast.data_source import DataSource +from feast.entity import Entity from feast.feast_object import FeastObject +from feast.feature_service import FeatureService +from feast.feature_view import FeatureView +from feast.on_demand_feature_view import OnDemandFeatureView from feast.permissions.permission import ( ALL_RESOURCE_TYPES, AuthzedAction, @@ -16,6 +18,8 @@ Permission, ) from feast.permissions.policy import AllowAll, Policy +from feast.saved_dataset import ValidationReference +from feast.stream_feature_view import StreamFeatureView def test_global_decision_strategy(): @@ -34,7 +38,7 @@ def test_defaults(): p = Permission(name="test") assertpy.assert_that(type(p.types)).is_equal_to(list) assertpy.assert_that(p.types).is_equal_to(ALL_RESOURCE_TYPES) - assertpy.assert_that(p.with_subclasses).is_false() + assertpy.assert_that(p.with_subclasses).is_true() assertpy.assert_that(p.name_pattern).is_none() assertpy.assert_that(p.required_tags).is_none() assertpy.assert_that(type(p.actions)).is_equal_to(list) @@ -85,6 +89,39 @@ def test_normalized_args(): assertpy.assert_that(type(p.policies)).is_equal_to(list) +@pytest.mark.parametrize( + "resource, types, result", + [ + (None, ALL_RESOURCE_TYPES, False), + ("invalid string", ALL_RESOURCE_TYPES, False), + ("ALL", ALL_RESOURCE_TYPES, False), + ("ALL", ALL_RESOURCE_TYPES, False), + (Mock(spec=FeatureView), OnDemandFeatureView, False), + (Mock(spec=FeatureView), FeatureService, False), + (Mock(spec=OnDemandFeatureView), FeatureView, True), + (Mock(spec=OnDemandFeatureView), FeatureService, False), + (Mock(spec=BatchFeatureView), FeatureView, True), + (Mock(spec=BatchFeatureView), FeatureService, False), + (Mock(spec=StreamFeatureView), FeatureView, True), + (Mock(spec=StreamFeatureView), FeatureService, False), + (Mock(spec=Entity), FeatureView, False), + (Mock(spec=Entity), FeatureService, False), + (Mock(spec=Entity), FeatureService, False), + (Mock(spec=FeatureService), FeatureView, True), + (Mock(spec=FeatureService), OnDemandFeatureView, False), + (Mock(spec=DataSource), FeatureView, False), + (Mock(spec=DataSource), FeatureService, False), + (Mock(spec=ValidationReference), FeatureView, False), + (Mock(spec=ValidationReference), FeatureService, False), + ] + + [(Mock(spec=t), ALL_RESOURCE_TYPES, True) for t in get_args(FeastObject)] + + [(Mock(spec=t), [t], True) for t in get_args(FeastObject)], +) +def _test_match_resource_with_subclasses(resource, types, result): # TEMPORARY DISABLED + p = Permission(name="test", types=types, with_subclasses=True) + assertpy.assert_that(p.match_resource(resource)).is_equal_to(result) + + @pytest.mark.parametrize( "resource, result", [ @@ -95,8 +132,8 @@ def test_normalized_args(): ] + [(Mock(spec=t), True) for t in get_args(FeastObject)], ) -def test_match_resource(resource, result): - p = Permission(name="test") +def test_match_resource_no_subclasses(resource, result): + p = Permission(name="test", with_subclasses=False) assertpy.assert_that(p.match_resource(resource)).is_equal_to(result) From 30ee844fb9088a9e29f5cbc647601d19c03b2753 Mon Sep 17 00:00:00 2001 From: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Date: Mon, 24 Jun 2024 16:54:59 +0200 Subject: [PATCH 008/169] fixed linting error Signed-off-by: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Signed-off-by: Abdul Hameed --- sdk/python/feast/permissions/matcher.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sdk/python/feast/permissions/matcher.py b/sdk/python/feast/permissions/matcher.py index 32d473dfcd..75654fabda 100644 --- a/sdk/python/feast/permissions/matcher.py +++ b/sdk/python/feast/permissions/matcher.py @@ -1,6 +1,6 @@ import logging import re -from typing import Any, Optional, Union, get_args +from typing import Any, Optional, get_args from unittest.mock import Mock from feast.feast_object import FeastObject @@ -96,7 +96,7 @@ def resource_match_config( def actions_match_config( actions: list[AuthzedAction], - allowed_actions: Union[list[AuthzedAction], AuthzedAction] = AuthzedAction.ALL, + allowed_actions: list[AuthzedAction], ) -> bool: if AuthzedAction.ALL in allowed_actions: return True From 183d0c4624f11b4eaf0556cd7e07735ccd40f70c Mon Sep 17 00:00:00 2001 From: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Date: Mon, 24 Jun 2024 17:46:13 +0200 Subject: [PATCH 009/169] Managing with_subclasses flag and overriding it in case it's an abstract class like DataSource Signed-off-by: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Signed-off-by: Abdul Hameed --- sdk/python/feast/permissions/matcher.py | 22 ++- .../tests/unit/permissions/test_permission.py | 134 ++++++++++++++---- 2 files changed, 129 insertions(+), 27 deletions(-) diff --git a/sdk/python/feast/permissions/matcher.py b/sdk/python/feast/permissions/matcher.py index 75654fabda..8c6eed4444 100644 --- a/sdk/python/feast/permissions/matcher.py +++ b/sdk/python/feast/permissions/matcher.py @@ -17,6 +17,18 @@ def is_a_feast_object(resource: Any): return False +def _get_type(resource: FeastObject) -> Any: + is_mock = isinstance(resource, Mock) + if not is_mock: + return type(resource) + else: + return getattr(resource, "_spec_class", None) + + +def _is_abstract_type(type: Any) -> bool: + return bool(getattr(type, "__abstractmethods__", False)) + + def resource_match_config( resource: FeastObject, expected_types: list[FeastObject], @@ -28,10 +40,18 @@ def resource_match_config( logger.warning(f"None passed to {resource_match_config.__name__}") return False + _type = _get_type(resource) if not is_a_feast_object(resource): - logger.warning(f"Given resource is not of a managed type but {type(resource)}") + logger.warning(f"Given resource is not of a managed type but {_type}") return False + is_abstract = _is_abstract_type(_type) + if is_abstract and not with_subclasses: + logger.debug( + f"Overriding default configuration for abstract type {_type}: with_subclasses=True" + ) + with_subclasses = True + if with_subclasses: # mypy check ignored because of https://github.com/python/mypy/issues/11673, or it raises "Argument 2 to "isinstance" has incompatible type "tuple[Featu ..." if not isinstance(resource, tuple(expected_types)): # type: ignore diff --git a/sdk/python/tests/unit/permissions/test_permission.py b/sdk/python/tests/unit/permissions/test_permission.py index b9ae51d300..b67e10d165 100644 --- a/sdk/python/tests/unit/permissions/test_permission.py +++ b/sdk/python/tests/unit/permissions/test_permission.py @@ -96,44 +96,126 @@ def test_normalized_args(): ("invalid string", ALL_RESOURCE_TYPES, False), ("ALL", ALL_RESOURCE_TYPES, False), ("ALL", ALL_RESOURCE_TYPES, False), - (Mock(spec=FeatureView), OnDemandFeatureView, False), - (Mock(spec=FeatureView), FeatureService, False), - (Mock(spec=OnDemandFeatureView), FeatureView, True), - (Mock(spec=OnDemandFeatureView), FeatureService, False), - (Mock(spec=BatchFeatureView), FeatureView, True), - (Mock(spec=BatchFeatureView), FeatureService, False), - (Mock(spec=StreamFeatureView), FeatureView, True), - (Mock(spec=StreamFeatureView), FeatureService, False), - (Mock(spec=Entity), FeatureView, False), - (Mock(spec=Entity), FeatureService, False), - (Mock(spec=Entity), FeatureService, False), - (Mock(spec=FeatureService), FeatureView, True), - (Mock(spec=FeatureService), OnDemandFeatureView, False), - (Mock(spec=DataSource), FeatureView, False), - (Mock(spec=DataSource), FeatureService, False), - (Mock(spec=ValidationReference), FeatureView, False), - (Mock(spec=ValidationReference), FeatureService, False), + ( + Mock(spec=FeatureView), + [t for t in get_args(FeastObject) if t not in [FeatureView]], + False, + ), + ( + Mock(spec=OnDemandFeatureView), + [t for t in get_args(FeastObject) if t not in [OnDemandFeatureView]], + False, + ), # OnDemandFeatureView is a BaseFeatureView + ( + Mock(spec=BatchFeatureView), + FeatureView, + True, + ), # BatchFeatureView is a FeatureView + ( + Mock(spec=BatchFeatureView), + [ + t + for t in get_args(FeastObject) + if t not in [FeatureView, BatchFeatureView] + ], + False, + ), + ( + Mock(spec=StreamFeatureView), + FeatureView, + True, + ), # StreamFeatureView is a FeatureView + ( + Mock(spec=StreamFeatureView), + [ + t + for t in get_args(FeastObject) + if t not in [FeatureView, StreamFeatureView] + ], + False, + ), + ( + Mock(spec=Entity), + [t for t in get_args(FeastObject) if t not in [Entity]], + False, + ), + ( + Mock(spec=FeatureService), + [t for t in get_args(FeastObject) if t not in [FeatureService]], + False, + ), + ( + Mock(spec=DataSource), + [t for t in get_args(FeastObject) if t not in [DataSource]], + False, + ), + ( + Mock(spec=ValidationReference), + [t for t in get_args(FeastObject) if t not in [ValidationReference]], + False, + ), ] + [(Mock(spec=t), ALL_RESOURCE_TYPES, True) for t in get_args(FeastObject)] + [(Mock(spec=t), [t], True) for t in get_args(FeastObject)], ) -def _test_match_resource_with_subclasses(resource, types, result): # TEMPORARY DISABLED +def test_match_resource_with_subclasses(resource, types, result): p = Permission(name="test", types=types, with_subclasses=True) assertpy.assert_that(p.match_resource(resource)).is_equal_to(result) @pytest.mark.parametrize( - "resource, result", + "resource, types, result", [ - (None, False), - ("invalid string", False), - ("ALL", False), - ("ALL", False), + (None, ALL_RESOURCE_TYPES, False), + ("invalid string", ALL_RESOURCE_TYPES, False), + ("ALL", ALL_RESOURCE_TYPES, False), + ("ALL", ALL_RESOURCE_TYPES, False), + ( + Mock(spec=FeatureView), + [t for t in get_args(FeastObject) if t not in [FeatureView]], + False, + ), + ( + Mock(spec=OnDemandFeatureView), + [t for t in get_args(FeastObject) if t not in [OnDemandFeatureView]], + False, + ), + ( + Mock(spec=BatchFeatureView), + [t for t in get_args(FeastObject) if t not in [BatchFeatureView]], + False, + ), + ( + Mock(spec=StreamFeatureView), + [t for t in get_args(FeastObject) if t not in [StreamFeatureView]], + False, + ), + ( + Mock(spec=Entity), + [t for t in get_args(FeastObject) if t not in [Entity]], + False, + ), + ( + Mock(spec=FeatureService), + [t for t in get_args(FeastObject) if t not in [FeatureService]], + False, + ), + ( + Mock(spec=DataSource), + [t for t in get_args(FeastObject) if t not in [DataSource]], + False, + ), + ( + Mock(spec=ValidationReference), + [t for t in get_args(FeastObject) if t not in [ValidationReference]], + False, + ), ] - + [(Mock(spec=t), True) for t in get_args(FeastObject)], + + [(Mock(spec=t), ALL_RESOURCE_TYPES, True) for t in get_args(FeastObject)] + + [(Mock(spec=t), [t], True) for t in get_args(FeastObject)], ) -def test_match_resource_no_subclasses(resource, result): - p = Permission(name="test", with_subclasses=False) +def test_match_resource_no_subclasses(resource, types, result): + p = Permission(name="test", types=types, with_subclasses=False) assertpy.assert_that(p.match_resource(resource)).is_equal_to(result) From e4a0f9fff1fb5135d03f854e113aca85cc459d39 Mon Sep 17 00:00:00 2001 From: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Date: Tue, 25 Jun 2024 10:53:06 +0200 Subject: [PATCH 010/169] Permission includes a single Policy Signed-off-by: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Signed-off-by: Abdul Hameed --- sdk/python/feast/permissions/enforcer.py | 27 ++--------------- sdk/python/feast/permissions/permission.py | 30 ++++++------------- .../tests/unit/permissions/test_decorator.py | 4 +-- .../tests/unit/permissions/test_permission.py | 16 ++++------ 4 files changed, 19 insertions(+), 58 deletions(-) diff --git a/sdk/python/feast/permissions/enforcer.py b/sdk/python/feast/permissions/enforcer.py index 6e949a5c90..11345fbeb5 100644 --- a/sdk/python/feast/permissions/enforcer.py +++ b/sdk/python/feast/permissions/enforcer.py @@ -44,15 +44,13 @@ def enforce_policy( Permission.get_global_decision_strategy(), len(matching_permissions) ) for p in matching_permissions: - permission_grant, permission_explanations = _evaluate_permission_grant( - p, - role_manager=role_manager, - user=user, + permission_grant, permission_explanation = p.policy.validate_user( + user=user, role_manager=role_manager ) evaluator.add_grant( f"Permission ({p.name})", permission_grant, - f"Permission {p.name} denied access: {','.join(permission_explanations)}", + f"Permission {p.name} denied access: {permission_explanation}", ) if evaluator.is_decided(): @@ -62,22 +60,3 @@ def enforce_policy( message = f"No permissions defined to manage {actions} on {type(resource)}:{resource.name}." logger.info(f"**PERMISSION GRANTED**: {message}") return (True, "") - - -def _evaluate_permission_grant( - permission: Permission, - role_manager: RoleManager, - user: str, -) -> tuple[bool, list[str]]: - evaluator = DecisionEvaluator( - permission.decision_strategy, len(permission.policies) - ) - for policy in permission.policies: - grant_decision, explanation = policy.validate_user( - user, role_manager=role_manager - ) - evaluator.add_grant(f"Policy ({policy})", grant_decision, explanation) - if evaluator.is_decided(): - return evaluator.grant() - - return True, [] diff --git a/sdk/python/feast/permissions/permission.py b/sdk/python/feast/permissions/permission.py index 95a87f64b0..2a86d32abd 100644 --- a/sdk/python/feast/permissions/permission.py +++ b/sdk/python/feast/permissions/permission.py @@ -19,7 +19,7 @@ class Permission(ABC): """ - The Permission class defines the authorization policies to be validated whenever the identified actions are + The Permission class defines the authorization policy to be validated whenever the identified actions are requested on the matching resources. Attributes: @@ -30,8 +30,7 @@ class Permission(ABC): required_tags: dictionary of key-value pairs that must match the resource tags. All these required_tags must be present as resource tags with the given value. Defaults to None, meaning that no tags filtering is applied. actions: The actions authorized by this permission. Defaults to `AuthzedAction.ALL`. - policies: The policies to be applied to validate a client request. - decision_strategy: The strategy to apply in case of multiple policies. + policy: The policy to be applied to validate a client request. """ _name: str @@ -40,8 +39,7 @@ class Permission(ABC): _name_pattern: Optional[str] _required_tags: Optional[dict[str, str]] _actions: list[AuthzedAction] - _policies: list[Policy] - _decision_strategy: DecisionStrategy + _policy: Policy def __init__( self, @@ -51,8 +49,7 @@ def __init__( name_pattern: Optional[str] = None, required_tags: Optional[dict[str, str]] = None, actions: Union[list[AuthzedAction], AuthzedAction] = AuthzedAction.ALL, - policies: Union[list[Policy], Policy] = AllowAll, - decision_strategy: DecisionStrategy = DecisionStrategy.UNANIMOUS, + policy: Policy = AllowAll, ): if not types: raise ValueError("The list 'types' must be non-empty.") @@ -61,20 +58,15 @@ def __init__( raise ValueError(f"{t} is not one of the managed types") if actions is None or not actions: raise ValueError("The list 'actions' must be non-empty.") - if not policies: - raise ValueError("The list 'policies' must be non-empty.") - if decision_strategy not in DecisionStrategy.__members__.values(): - raise ValueError( - "The 'decision_strategy' must be one of the allowed values." - ) + if not policy: + raise ValueError("The list 'policy' must be non-empty.") self._name = name self._types = types if isinstance(types, list) else [types] self._with_subclasses = with_subclasses self._name_pattern = _normalize_name_pattern(name_pattern) self._required_tags = _normalize_required_tags(required_tags) self._actions = actions if isinstance(actions, list) else [actions] - self._policies = policies if isinstance(policies, list) else [policies] - self._decision_strategy = decision_strategy + self._policy = policy _global_decision_strategy: DecisionStrategy = DecisionStrategy.UNANIMOUS @@ -114,12 +106,8 @@ def actions(self) -> list[AuthzedAction]: return self._actions @property - def policies(self) -> list[Policy]: - return self._policies - - @property - def decision_strategy(self) -> DecisionStrategy: - return self._decision_strategy + def policy(self) -> Policy: + return self._policy def match_resource(self, resource: FeastObject) -> bool: return resource_match_config( diff --git a/sdk/python/tests/unit/permissions/test_decorator.py b/sdk/python/tests/unit/permissions/test_decorator.py index f47a003932..bd9554fed0 100644 --- a/sdk/python/tests/unit/permissions/test_decorator.py +++ b/sdk/python/tests/unit/permissions/test_decorator.py @@ -42,7 +42,7 @@ def security_manager() -> SecurityManager: name="reader", types=FeatureView, with_subclasses=True, - policies=[RoleBasedPolicy(roles=["reader"])], + policy=RoleBasedPolicy(roles=["reader"]), actions=[AuthzedAction.READ], ) ) @@ -51,7 +51,7 @@ def security_manager() -> SecurityManager: name="writer", types=FeatureView, with_subclasses=True, - policies=[RoleBasedPolicy(roles=["writer"])], + policy=RoleBasedPolicy(roles=["writer"]), actions=[AuthzedAction.WRITE], ) ) diff --git a/sdk/python/tests/unit/permissions/test_permission.py b/sdk/python/tests/unit/permissions/test_permission.py index b67e10d165..7061274f04 100644 --- a/sdk/python/tests/unit/permissions/test_permission.py +++ b/sdk/python/tests/unit/permissions/test_permission.py @@ -44,9 +44,8 @@ def test_defaults(): assertpy.assert_that(type(p.actions)).is_equal_to(list) assertpy.assert_that(p.actions[0]).is_equal_to(AuthzedAction.ALL) assertpy.assert_that(type(p.actions)).is_equal_to(list) - assertpy.assert_that(type(p.policies)).is_equal_to(list) - assertpy.assert_that(p.policies[0]).is_equal_to(AllowAll) - assertpy.assert_that(p.decision_strategy).is_equal_to(DecisionStrategy.UNANIMOUS) + assertpy.assert_that(isinstance(p.policy, Policy)).is_true() + assertpy.assert_that(p.policy).is_equal_to(AllowAll) @pytest.mark.parametrize( @@ -61,11 +60,9 @@ def test_defaults(): ({"actions": AuthzedAction.ALL}, True), ({"actions": [AuthzedAction.ALL]}, True), ({"actions": [AuthzedAction.CREATE, AuthzedAction.DELETE]}, True), - ({"policies": None}, False), - ({"policies": []}, False), - ({"policies": Mock(spec=Policy)}, True), - ({"policies": [Mock(spec=Policy)]}, True), - ({"decision_strategy": DecisionStrategy.AFFIRMATIVE}, True), + ({"policy": None}, False), + ({"policy": []}, False), + ({"policy": Mock(spec=Policy)}, True), ], ) def test_validity(dict, result): @@ -85,9 +82,6 @@ def test_normalized_args(): assertpy.assert_that(type(p.actions)).is_equal_to(list) assertpy.assert_that(p.actions).is_equal_to([AuthzedAction.CREATE]) - p = Permission(name="test", policies=Mock()) - assertpy.assert_that(type(p.policies)).is_equal_to(list) - @pytest.mark.parametrize( "resource, types, result", From b5c5af14b6e4aacafe955863c293cd848a3aead8 Mon Sep 17 00:00:00 2001 From: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Date: Wed, 26 Jun 2024 11:06:31 +0200 Subject: [PATCH 011/169] completed docstrings for permissions package Signed-off-by: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Signed-off-by: Abdul Hameed --- sdk/python/feast/permissions/action.py | 2 +- sdk/python/feast/permissions/decision.py | 43 +++++++++++-- sdk/python/feast/permissions/decorator.py | 6 +- sdk/python/feast/permissions/enforcer.py | 58 ++++++++++-------- sdk/python/feast/permissions/matcher.py | 36 +++++++++++ sdk/python/feast/permissions/permission.py | 27 ++++++--- sdk/python/feast/permissions/policy.py | 20 ++++--- sdk/python/feast/permissions/role_manager.py | 28 +++++++-- .../feast/permissions/security_manager.py | 60 +++++++++++++------ .../tests/unit/permissions/test_decision.py | 2 +- 10 files changed, 210 insertions(+), 72 deletions(-) diff --git a/sdk/python/feast/permissions/action.py b/sdk/python/feast/permissions/action.py index bb590cbd06..655bfcbdeb 100644 --- a/sdk/python/feast/permissions/action.py +++ b/sdk/python/feast/permissions/action.py @@ -3,7 +3,7 @@ class AuthzedAction(enum.Enum): """ - Identifies the type of action being secured by the permissions framework, according to the familiar CRUD and Feast terminology. + Identify the type of action being secured by the permissions framework, according to the familiar CRUD and Feast terminology. """ ALL = "all" # All actions diff --git a/sdk/python/feast/permissions/decision.py b/sdk/python/feast/permissions/decision.py index 0b292c0bce..35099e10ed 100644 --- a/sdk/python/feast/permissions/decision.py +++ b/sdk/python/feast/permissions/decision.py @@ -7,7 +7,7 @@ class DecisionStrategy(enum.Enum): """ - The strategy to be adopted in case multiple policies are defined. + The strategy to be adopted in case multiple permissions match an execution request. """ UNANIMOUS = "unanimous" # All policies must evaluate to a positive decision for the final decision to be also positive. @@ -18,6 +18,23 @@ class DecisionStrategy(enum.Enum): class DecisionEvaluator: + """ + A class to implement the decision logic, according to the selected strategy. + + Args: + decision_strategy: The associated `DecisionStrategy`. + num_of_voters: The expected number of votes to complete the decision. + + Examples: + Create the instance and specify the strategy and number of decisions: + `evaluator = DecisionEvaluator(DecisionStrategy.UNANIMOUS, 3) + + For each vote that you receivem, add a decision grant: `evaluator.add_grant(vote, message)` + and check if the decision process ended: `if evaluator.is_decided():` + Once decided, get the result and the failure explanations using: + `grant, explanations = evaluator.grant()` + """ + def __init__( self, decision_strategy: DecisionStrategy, @@ -49,15 +66,33 @@ def __init__( ) def is_decided(self) -> bool: + """ + Returns: + bool: `True` when the decision process completed (e.g. we added as many votes as specified in the `num_of_voters` creation argument). + """ return self.grant_decision is not None def grant(self) -> tuple[bool, list[str]]: + """ + Returns: + tuple[bool, list[str]]: The tuple of decision computation: a `bool` with the computation decision and a `list[str]` with the + denial explanations (possibly empty). + """ logger.info( f"Decided grant is {self.grant_decision}, explanations={self.explanations}" ) return bool(self.grant_decision), self.explanations - def add_grant(self, label, grant: bool, explanation: str): + def add_grant(self, grant: bool, explanation: str): + """ + Add a single vote to the decision computation, with a possible denial reason. + If the evalluation process already ended, additional votes are discarded. + + Args: + grant: `True` is the decision is accepted, `False` otherwise. + explanation: Denial reason (not considered when `vote` is `True`). + """ + if self.is_decided(): logger.warning("Grant decision already decided, discarding vote") return @@ -71,6 +106,6 @@ def add_grant(self, label, grant: bool, explanation: str): self.grant_decision = True if self.deny_count >= self.deny_quorum: self.grant_decision = False - logger.info( - f"After {label}: grants={self.grant_count}, deny_count={self.deny_count}, grant_decision={self.grant_decision}" + logger.debug( + f"After new grant: grants={self.grant_count}, deny_count={self.deny_count}, grant_decision={self.grant_decision}" ) diff --git a/sdk/python/feast/permissions/decorator.py b/sdk/python/feast/permissions/decorator.py index a90ec567f9..1fda30506c 100644 --- a/sdk/python/feast/permissions/decorator.py +++ b/sdk/python/feast/permissions/decorator.py @@ -10,10 +10,12 @@ def require_permissions(actions: Union[list[AuthzedAction], AuthzedAction]): """ - A decorator to define the actions that are executed from within the current class method and that must be protected + A decorator to define the actions that are executed from the decorated class method and that must be protected against unauthorized access. The first parameter of the protected method must be `self` + Args: + actions: The list of actions that must be permitted to the current user. """ def require_permissions_decorator(func): @@ -26,7 +28,7 @@ def permission_checker(*args, **kwargs): ) return assert_permissions( - resource=resource, + resources=resource, actions=actions, ) logger.debug( diff --git a/sdk/python/feast/permissions/enforcer.py b/sdk/python/feast/permissions/enforcer.py index 11345fbeb5..5ad8e5d8c1 100644 --- a/sdk/python/feast/permissions/enforcer.py +++ b/sdk/python/feast/permissions/enforcer.py @@ -1,4 +1,5 @@ import logging +from typing import Union from feast.feast_object import FeastObject from feast.permissions.decision import DecisionEvaluator @@ -15,48 +16,55 @@ def enforce_policy( role_manager: RoleManager, permissions: list[Permission], user: str, - resource: FeastObject, + resources: Union[list[FeastObject], FeastObject], actions: list[AuthzedAction], ) -> tuple[bool, str]: """ - Defines the logic to apply the configured permissions when a given action is requested on + Define the logic to apply the configured permissions when a given action is requested on a protected resource. + If no permissions are defined, the result is to allow the execution. + Args: role_manager: The `RoleManager` instance. permissions: The configured set of `Permission`. user: The current user. - resource: The resource for which we need to enforce authorized permission. + resources: The resources for which we need to enforce authorized permission. actions: The requested actions to be authorized. + Returns: + tuple[bool, str]: a boolean with the result of the authorization check (`True` stands for allowed) and string to explain + the reason for denying execution. """ - if not permissions: return (True, "") - matching_permissions = [ - p - for p in permissions - if p.match_resource(resource) and p.match_actions(actions) - ] - - if matching_permissions: - evaluator = DecisionEvaluator( - Permission.get_global_decision_strategy(), len(matching_permissions) + for resource in resources if isinstance(resources, list) else [resources]: + logger.debug( + f"Enforcing permission policies for {type(resource)}:{resource.name} to execute {actions}" ) - for p in matching_permissions: - permission_grant, permission_explanation = p.policy.validate_user( - user=user, role_manager=role_manager - ) - evaluator.add_grant( - f"Permission ({p.name})", - permission_grant, - f"Permission {p.name} denied access: {permission_explanation}", + matching_permissions = [ + p + for p in permissions + if p.match_resource(resources) and p.match_actions(actions) + ] + + if matching_permissions: + evaluator = DecisionEvaluator( + Permission.get_global_decision_strategy(), len(matching_permissions) ) + for p in matching_permissions: + permission_grant, permission_explanation = p.policy.validate_user( + user=user, role_manager=role_manager + ) + evaluator.add_grant( + permission_grant, + f"Permission {p.name} denied access: {permission_explanation}", + ) - if evaluator.is_decided(): - grant, explanations = evaluator.grant() - return grant, ",".join(explanations) + if evaluator.is_decided(): + grant, explanations = evaluator.grant() + return grant, ",".join(explanations) else: - message = f"No permissions defined to manage {actions} on {type(resource)}:{resource.name}." + message = f"No permissions defined to manage {actions} on {type(resources)}:{resources.name}." logger.info(f"**PERMISSION GRANTED**: {message}") return (True, "") diff --git a/sdk/python/feast/permissions/matcher.py b/sdk/python/feast/permissions/matcher.py index 8c6eed4444..249b6fb46a 100644 --- a/sdk/python/feast/permissions/matcher.py +++ b/sdk/python/feast/permissions/matcher.py @@ -1,3 +1,7 @@ +""" +This module provides utility matching functions. +""" + import logging import re from typing import Any, Optional, get_args @@ -10,6 +14,14 @@ def is_a_feast_object(resource: Any): + """ + A matcher to verify that a given object is one of the Feast objects defined in the `FeastObject` type. + + Args: + resource: An object instance to verify. + Returns: + `True` if the given object is one of the types in the FeastObject alias or a subclass of one of them. + """ for t in get_args(FeastObject): # Use isinstance to pass Mock validation if isinstance(resource, t): @@ -36,6 +48,19 @@ def resource_match_config( name_pattern: Optional[str] = None, required_tags: Optional[dict[str, str]] = None, ) -> bool: + """ + Match a given Feast object against the configured type, name and tags in a permission configuration. + + Args: + resource: A FeastObject instance to match agains the permission. + expected_types: The list of object types configured in the permission. + with_subclasses: `True` if the type match includes sub-classes, `False` if the type match is exact. + name_pattern: The optional name pattern filter configured in the permission. + required_tags: The optional dicstionary of required tags configured in the permission. + + Returns: + bool: `True` if the resource matches the configured permission filters. + """ if resource is None: logger.warning(f"None passed to {resource_match_config.__name__}") return False @@ -118,6 +143,17 @@ def actions_match_config( actions: list[AuthzedAction], allowed_actions: list[AuthzedAction], ) -> bool: + """ + Match a list of actions against the actions defined in a permission configuration. + + Args: + actions: Alist of actions to be executed. + allowed_actions: The list of actions configured in the permission. + + Returns: + bool: `True` if all the given `actions` are defined in the `allowed_actions`. + Whatever the requested `actions`, it returns `True` if `allowed_actions` includes `AuthzedAction.ALL` + """ if AuthzedAction.ALL in allowed_actions: return True diff --git a/sdk/python/feast/permissions/permission.py b/sdk/python/feast/permissions/permission.py index 2a86d32abd..006053f305 100644 --- a/sdk/python/feast/permissions/permission.py +++ b/sdk/python/feast/permissions/permission.py @@ -23,12 +23,14 @@ class Permission(ABC): requested on the matching resources. Attributes: - name: The permission name (can be duplicated, used for logging troubleshooting) - types: The list of protected resource types as defined by the `FeastObject` type. Defaults to all managed types (e.g. the `ALL_RESOURCE_TYPES` constant) - with_subclasses: If `True`, it includes subclasses of the given types in the match, otherwise only precise type match is applied. Defaults to `True`. - name_pattern: a regex to match the resource name. Defaults to None, meaning that no name filtering is applied - required_tags: dictionary of key-value pairs that must match the resource tags. All these required_tags must be present as resource - tags with the given value. Defaults to None, meaning that no tags filtering is applied. + name: The permission name (can be duplicated, used for logging troubleshooting). + types: The list of protected resource types as defined by the `FeastObject` type. + Defaults to all managed types (e.g. the `ALL_RESOURCE_TYPES` constant) + with_subclasses: If `True`, it includes sub-classes of the given types in the match, otherwise only exact type match is applied. + Defaults to `True`. + name_pattern: A regex to match the resource name. Defaults to None, meaning that no name filtering is applied + required_tags: Dictionary of key-value pairs that must match the resource tags. All these required_tags must + be present in a resource tags with the given value. Defaults to None, meaning that no tags filtering is applied. actions: The actions authorized by this permission. Defaults to `AuthzedAction.ALL`. policy: The policy to be applied to validate a client request. """ @@ -72,12 +74,15 @@ def __init__( @staticmethod def get_global_decision_strategy() -> DecisionStrategy: + """ + The global decision strategy to be applied when multiple permissions match an execution request. + """ return Permission._global_decision_strategy @staticmethod def set_global_decision_strategy(global_decision_strategy: DecisionStrategy): """ - Defines the global decision strategy to be applied if multiple permissions match the same resource. + Define the global decision strategy to be applied when multiple permissions match an execution request. """ Permission._global_decision_strategy = global_decision_strategy @@ -110,6 +115,10 @@ def policy(self) -> Policy: return self._policy def match_resource(self, resource: FeastObject) -> bool: + """ + Returns: + `True` when the given resource matches the type, name and tags filters defined in the permission. + """ return resource_match_config( resource=resource, expected_types=self.types, @@ -119,6 +128,10 @@ def match_resource(self, resource: FeastObject) -> bool: ) def match_actions(self, actions: list[AuthzedAction]) -> bool: + """ + Returns: + `True` when the given actions are included in the permitted actions. + """ return actions_match_config( allowed_actions=self.actions, actions=actions, diff --git a/sdk/python/feast/permissions/policy.py b/sdk/python/feast/permissions/policy.py index 79d2d8334b..f7c330f49b 100644 --- a/sdk/python/feast/permissions/policy.py +++ b/sdk/python/feast/permissions/policy.py @@ -11,26 +11,25 @@ class Policy(ABC): @abstractmethod def validate_user(self, user: str, **kwargs) -> tuple[bool, str]: """ - Converts data source config in protobuf spec to a DataSource class object. + Validate the given user against the configured policy. Args: - data_source: A protobuf representation of a DataSource. + user: The current user. + kwargs: The list of keyword args to be passed to the actual implementation. Returns: - A DataSource class object. - - Raises: - ValueError: The type of DataSource could not be identified. + bool: `True` if the user matches the policy criteria, `False` otherwise. + str: A possibly empty explanation of the reason for not matching the configured policy. """ raise NotImplementedError class RoleBasedPolicy(Policy): """ - An Policy class where the user roles must be enforced to grant access to the requested action. + A `Policy` implementation where the user roles must be enforced to grant access to the requested action. All the configured roles must be granted to the current user in order to allow the execution. - The `role_manager` keywork argument must be present in the `kwargs` optional key-value arguments. + E.g., if the policy enforces roles `a` and `b`, the user must have both of them in order to satisfy the policy. """ def __init__( @@ -43,6 +42,11 @@ def get_roles(self) -> list[str]: return self.roles def validate_user(self, user: str, **kwargs) -> tuple[bool, str]: + """ + Validate the given `user` against the configured roles. + + The `role_manager` keywork argument must be present in the `kwargs` optional key-value arguments. + """ if "role_manager" not in kwargs: raise ValueError("Missing keywork argument 'role_manager'") if not isinstance(kwargs["role_manager"], RoleManager): diff --git a/sdk/python/feast/permissions/role_manager.py b/sdk/python/feast/permissions/role_manager.py index ad2ebc3f2b..07f0b99902 100644 --- a/sdk/python/feast/permissions/role_manager.py +++ b/sdk/python/feast/permissions/role_manager.py @@ -1,7 +1,12 @@ +import logging + +logger = logging.getLogger(__name__) + + class RoleManager: """ - RoleManager is the registry of user roles captured by the AuthManager implementations and used by the - RoleBasedPolicy policy. + `RoleManager` is the registry of user roles captured from the external user request and used by the + `RoleBasedPolicy` policy. """ def __init__(self): @@ -9,21 +14,32 @@ def __init__(self): def add_roles_for_user(self, user: str, roles: list[str]): """ - Adds the given roles to the given user. + Add the given roles to the given user. + + Args: + user: The user ID. + roles: The list of associated roles. """ self.roles_by_user.setdefault(user, []).extend(roles) def clear(self) -> None: """ - Clears all the registered roles. + Clear all the registered roles. """ self.roles_by_user.clear() def has_roles_for_user(self, user: str, roles: list[str]) -> bool: """ - Returns True only if the given user has any registered role and all the given roles are registered. + Verify the given user has the requested roles. + + Args: + user: The user ID. + roles: The list of requested roles. + + Returns: + bool: `True` only if the given user has any registered role and all the given roles are registered. """ - print( + logger.debug( f"Check {user} has all {roles}: currently {self.roles_by_user[user] if user in self.roles_by_user else[]}" ) return user in self.roles_by_user and all( diff --git a/sdk/python/feast/permissions/security_manager.py b/sdk/python/feast/permissions/security_manager.py index 7607c0fc97..c4aaedbccf 100644 --- a/sdk/python/feast/permissions/security_manager.py +++ b/sdk/python/feast/permissions/security_manager.py @@ -14,7 +14,7 @@ class SecurityManager: """ The security manager holds references to the security components (role manager, policy enforces) and the configured permissions. - It is accessed and defined using the global functions :func:`_get_security_manager` and :func:`_set_security_manager` + It is accessed and defined using the global functions `_get_security_manager` and `_set_security_manager` """ def __init__( @@ -33,29 +33,51 @@ def set_current_user(self, user: str): @property def role_manager(self) -> RoleManager: + """ + Returns: + RoleManager: the configured `RoleManager` instance. + """ return self._role_manager @property def current_user(self) -> Optional[str]: + """ + Returns: + str: the possibly empty ID of the current user. `contextvars` module is used to ensure that each concurrent request has its own + individual user ID. + """ return self._current_user.get() @property def permissions(self) -> list[Permission]: + """ + Returns: + list[Permission]: the list of `Permission` configured in the Feast registry. + """ return self._permissions def assert_permissions( self, - resource: FeastObject, + resources: Union[list[FeastObject], FeastObject], actions: Union[AuthzedAction, List[AuthzedAction]], ): """ - TODO ADD DOCSTRING + Verify if the current user is authorized ro execute the requested actions on the given resources. + + If no permissions are defined, the result is to allow the execution. + + Args: + resources: The resources for which we need to enforce authorized permission. + actions: The requested actions to be authorized. + + Raises: + PermissionError: If the current user is not authorized to eecute all the requested actions on the given resources. """ result, explain = enforce_policy( role_manager=self._role_manager, permissions=self._permissions, user=self.current_user if self.current_user is not None else "", - resource=resource, + resources=resources, actions=actions if isinstance(actions, list) else [actions], ) if not result: @@ -63,36 +85,38 @@ def assert_permissions( def assert_permissions( - resource: FeastObject, + resources: Union[list[FeastObject], FeastObject], actions: Union[AuthzedAction, List[AuthzedAction]], ): + """ + A utility function to invoke the `assert_permissions` method on the global security manager. + + If no global `SecurityManager` is defined, the execution is permitted. + """ sm = get_security_manager() if sm is None: - return True - return sm.assert_permissions(resource=resource, actions=actions) + return + return sm.assert_permissions(resources=resources, actions=actions) """ -Global instance. +The possibly empty global instance of `SecurityManager`. """ _sm: Optional[SecurityManager] = None -""" -Return the global instance of `SecurityManager`. -""" - - def get_security_manager() -> Optional[SecurityManager]: + """ + Return the global instance of `SecurityManager`. + """ global _sm return _sm -""" -Initializes the global instance of `SecurityManager`. -""" - - def set_security_manager(sm: SecurityManager): + """ + Initialize the global instance of `SecurityManager`. + """ + global _sm _sm = sm diff --git a/sdk/python/tests/unit/permissions/test_decision.py b/sdk/python/tests/unit/permissions/test_decision.py index 16f5d0c27b..38522343fc 100644 --- a/sdk/python/tests/unit/permissions/test_decision.py +++ b/sdk/python/tests/unit/permissions/test_decision.py @@ -67,7 +67,7 @@ def test_decision_evaluator(evaluator, votes, decision, no_of_explanations): for v in votes: vote = v[0] decided = v[1] - evaluator.add_grant("vote", vote, "" if vote else "a message") + evaluator.add_grant(vote, "" if vote else "a message") if decided: assertpy.assert_that(evaluator.is_decided()).is_true() else: From dd15dd9e8b9fbed10123e93ed9992aae20f9e5bf Mon Sep 17 00:00:00 2001 From: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Date: Wed, 26 Jun 2024 11:19:38 +0200 Subject: [PATCH 012/169] fixed inter issues Signed-off-by: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Signed-off-by: Abdul Hameed --- sdk/python/feast/permissions/enforcer.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/sdk/python/feast/permissions/enforcer.py b/sdk/python/feast/permissions/enforcer.py index 5ad8e5d8c1..02d0d308d8 100644 --- a/sdk/python/feast/permissions/enforcer.py +++ b/sdk/python/feast/permissions/enforcer.py @@ -38,14 +38,15 @@ def enforce_policy( if not permissions: return (True, "") - for resource in resources if isinstance(resources, list) else [resources]: + _resources = resources if isinstance(resources, list) else [resources] + for resource in _resources: logger.debug( f"Enforcing permission policies for {type(resource)}:{resource.name} to execute {actions}" ) matching_permissions = [ p for p in permissions - if p.match_resource(resources) and p.match_actions(actions) + if p.match_resource(resource) and p.match_actions(actions) ] if matching_permissions: @@ -65,6 +66,6 @@ def enforce_policy( grant, explanations = evaluator.grant() return grant, ",".join(explanations) else: - message = f"No permissions defined to manage {actions} on {type(resources)}:{resources.name}." + message = f"No permissions defined to manage {actions} on {resources}." logger.info(f"**PERMISSION GRANTED**: {message}") return (True, "") From 7d7a787e52370a258664bc0bc546cbd53a586258 Mon Sep 17 00:00:00 2001 From: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Date: Wed, 26 Jun 2024 14:39:03 +0200 Subject: [PATCH 013/169] Changed roles matching rule from "all" to "any" Signed-off-by: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Signed-off-by: Abdul Hameed --- sdk/python/feast/permissions/policy.py | 6 ++--- sdk/python/feast/permissions/role_manager.py | 11 +++++----- .../tests/unit/permissions/test_policy.py | 8 ++++--- .../unit/permissions/test_role_manager.py | 22 ++++++++++++++----- 4 files changed, 29 insertions(+), 18 deletions(-) diff --git a/sdk/python/feast/permissions/policy.py b/sdk/python/feast/permissions/policy.py index f7c330f49b..d1fb41123b 100644 --- a/sdk/python/feast/permissions/policy.py +++ b/sdk/python/feast/permissions/policy.py @@ -27,9 +27,9 @@ def validate_user(self, user: str, **kwargs) -> tuple[bool, str]: class RoleBasedPolicy(Policy): """ A `Policy` implementation where the user roles must be enforced to grant access to the requested action. - All the configured roles must be granted to the current user in order to allow the execution. + At least one of the configured roles must be granted to the current user in order to allow the execution of the secured operation. - E.g., if the policy enforces roles `a` and `b`, the user must have both of them in order to satisfy the policy. + E.g., if the policy enforces roles `a` and `b`, the user must have at least one of them in order to satisfy the policy. """ def __init__( @@ -55,7 +55,7 @@ def validate_user(self, user: str, **kwargs) -> tuple[bool, str]: ) rm = kwargs.get("role_manager") if isinstance(rm, RoleManager): - result = rm.has_roles_for_user(user, self.roles) + result = rm.user_has_matching_role(user, self.roles) explain = "" if result else f"Requires roles {self.roles}" return (result, explain) diff --git a/sdk/python/feast/permissions/role_manager.py b/sdk/python/feast/permissions/role_manager.py index 07f0b99902..ca939a162f 100644 --- a/sdk/python/feast/permissions/role_manager.py +++ b/sdk/python/feast/permissions/role_manager.py @@ -28,9 +28,9 @@ def clear(self) -> None: """ self.roles_by_user.clear() - def has_roles_for_user(self, user: str, roles: list[str]) -> bool: + def user_has_matching_role(self, user: str, roles: list[str]) -> bool: """ - Verify the given user has the requested roles. + Verify that the given user has at least one of the requested roles. Args: user: The user ID. @@ -40,8 +40,7 @@ def has_roles_for_user(self, user: str, roles: list[str]) -> bool: bool: `True` only if the given user has any registered role and all the given roles are registered. """ logger.debug( - f"Check {user} has all {roles}: currently {self.roles_by_user[user] if user in self.roles_by_user else[]}" - ) - return user in self.roles_by_user and all( - r in self.roles_by_user[user] for r in roles + f"Check {user} has all {roles}: currently {self.roles_by_user.get(user, [])}" ) + user_roles = self.roles_by_user.get(user, []) + return any(role in user_roles for role in roles) diff --git a/sdk/python/tests/unit/permissions/test_policy.py b/sdk/python/tests/unit/permissions/test_policy.py index 082e84df21..84e4527bff 100644 --- a/sdk/python/tests/unit/permissions/test_policy.py +++ b/sdk/python/tests/unit/permissions/test_policy.py @@ -34,14 +34,16 @@ def role_manager() -> RoleManager: [ (["reader"], "r", True), (["writer"], "r", False), - (["reader", "writer"], "r", False), + (["reader", "writer"], "r", True), + (["writer", "updater"], "r", False), (["reader"], "w", False), (["writer"], "w", True), - (["reader", "writer"], "w", False), + (["reader", "writer"], "w", True), + (["reader", "updater"], "w", False), (["reader"], "rw", True), (["writer"], "rw", True), (["reader", "writer"], "rw", True), - (["reader", "writer", "updater"], "rw", False), + (["updater"], "rw", False), ], ) def test_role_based_policy(role_manager, required_roles, user, result): diff --git a/sdk/python/tests/unit/permissions/test_role_manager.py b/sdk/python/tests/unit/permissions/test_role_manager.py index 25ec054f4a..ef70252d5f 100644 --- a/sdk/python/tests/unit/permissions/test_role_manager.py +++ b/sdk/python/tests/unit/permissions/test_role_manager.py @@ -4,21 +4,31 @@ from feast.permissions.role_manager import RoleManager +@pytest.fixture(scope="module") +def role_manager(): + rm = RoleManager() + rm.add_roles_for_user("a", ["a1", "a2"]) + rm.add_roles_for_user("b", ["b1", "b2"]) + return rm + + @pytest.mark.parametrize( "user, roles, result", [ ("c", [], False), + ("a", ["b1"], False), + ("a", ["a1", "b1"], True), ("a", ["a1"], True), ("a", ["a1", "a2"], True), - ("a", ["a1", "a2", "a3"], False), + ("a", ["a1", "a2", "a3"], True), ("b", ["a1", "a3"], False), + ("b", ["a1", "b1"], True), ("b", ["b1", "b2"], True), + ("b", ["b1", "b2", "b3"], True), ], ) -def test_has_roles(user, roles, result): - rm = RoleManager() - rm.add_roles_for_user("a", ["a1", "a2"]) - rm.add_roles_for_user("b", ["b1", "b2"]) - assertpy.assert_that(rm.has_roles_for_user(user=user, roles=roles)).is_equal_to( +def test_user_has_matching_role(role_manager, user, roles, result): + rm = role_manager + assertpy.assert_that(rm.user_has_matching_role(user=user, roles=roles)).is_equal_to( result ) From bb857e2f6c9ca74b623a0059ed9ca6b5a65ab1f9 Mon Sep 17 00:00:00 2001 From: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Date: Thu, 27 Jun 2024 08:45:54 +0200 Subject: [PATCH 014/169] Introducing permission framework and authorization manager in user guide (to be continued after the code is consolidated) Signed-off-by: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Signed-off-by: Abdul Hameed --- docs/SUMMARY.md | 1 + docs/getting-started/components/README.md | 4 + .../components/authz_manager.md | 0 docs/getting-started/components/overview.md | 1 + docs/getting-started/concepts/README.md | 4 + docs/getting-started/concepts/permission.md | 121 ++++++++++++++++++ docs/reference/feast-cli-commands.md | 23 ++++ sdk/python/docs/source/feast.rst | 9 ++ 8 files changed, 163 insertions(+) create mode 100644 docs/getting-started/components/authz_manager.md create mode 100644 docs/getting-started/concepts/permission.md diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index 0060ae729e..9d5ba276be 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -16,6 +16,7 @@ * [Feature retrieval](getting-started/concepts/feature-retrieval.md) * [Point-in-time joins](getting-started/concepts/point-in-time-joins.md) * [Registry](getting-started/concepts/registry.md) + * [Permissions](getting-started/concepts/permissions.md) * [\[Alpha\] Saved dataset](getting-started/concepts/dataset.md) * [Architecture](getting-started/architecture/README.md) * [Overview](getting-started/architecture/overview.md) diff --git a/docs/getting-started/components/README.md b/docs/getting-started/components/README.md index d468714bd4..e1c000abce 100644 --- a/docs/getting-started/components/README.md +++ b/docs/getting-started/components/README.md @@ -19,3 +19,7 @@ {% content-ref url="provider.md" %} [provider.md](provider.md) {% endcontent-ref %} + +{% content-ref url="authz_manager.md" %} +[authz_manager.md](authz_manager.md) +{% endcontent-ref %} diff --git a/docs/getting-started/components/authz_manager.md b/docs/getting-started/components/authz_manager.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/docs/getting-started/components/overview.md b/docs/getting-started/components/overview.md index 393f436e5b..0ee3835de6 100644 --- a/docs/getting-started/components/overview.md +++ b/docs/getting-started/components/overview.md @@ -28,3 +28,4 @@ A complete Feast deployment contains the following components: * **Batch Materialization Engine:** The [Batch Materialization Engine](batch-materialization-engine.md) component launches a process which loads data into the online store from the offline store. By default, Feast uses a local in-process engine implementation to materialize data. However, additional infrastructure can be used for a more scalable materialization process. * **Online Store:** The online store is a database that stores only the latest feature values for each entity. The online store is either populated through materialization jobs or through [stream ingestion](../../reference/data-sources/push.md). * **Offline Store:** The offline store persists batch data that has been ingested into Feast. This data is used for producing training datasets. For feature retrieval and materialization, Feast does not manage the offline store directly, but runs queries against it. However, offline stores can be configured to support writes if Feast configures logging functionality of served features. +* **Authorization manager**: The authorization manager detects authentication tokens from client requests to Feast servers and uses this information to enforce permission policies on the requested services. diff --git a/docs/getting-started/concepts/README.md b/docs/getting-started/concepts/README.md index e805e3b486..1769a2d741 100644 --- a/docs/getting-started/concepts/README.md +++ b/docs/getting-started/concepts/README.md @@ -31,3 +31,7 @@ {% content-ref url="dataset.md" %} [dataset.md](dataset.md) {% endcontent-ref %} + +{% content-ref url="permission.md" %} +[permission.md](permission.md) +{% endcontent-ref %} diff --git a/docs/getting-started/concepts/permission.md b/docs/getting-started/concepts/permission.md new file mode 100644 index 0000000000..cd3d681405 --- /dev/null +++ b/docs/getting-started/concepts/permission.md @@ -0,0 +1,121 @@ +# Permission + +## Overview + +The Feast permissions model allows to configure granular permission policies to all the resources defined in a feature store. + +The configured permissions are stored in the Feast registry and accessible through the CLI and the registry APIs. + +The permission authorization enforcement is performed when requests are executed through one of the Feast (Python) servers +- The online feature server (REST) +- The offline feature server (Arrow Flight) +- The registry server (grpc) + +On the contrary, there is no permission enforcement when accessing the Feast API with a local provider. + +## Concepts + +The permission model is based on the following components: +- A `resource` is a Feast object that we want to secure against unauthorized access. + - We assume that the resource has a `name` attribute and optional dictionary of associated key-value `tags`. +- An `action` is a logical operation executed on the secured resource, like: + - `create`: Create an instance. + - `read`: Access the instance state. + - `update`: Update the instance state. + - `delete`: Delete an instance. + - `query`: Query both online and offline stores. + - `query_online`: Query the online store. + - `query_offline`: Query the o ffline store. + - `write`: Query on any store. + - `write_online`: Write to the online store. + - `write_offline`: Write to the offline store. +- A `policy` identifies the rule for enforcing authorization decisions on secured resources, based on the current user. + - A default implementation is provided for role-based policies, using the user roles to grant or deny access to the requested actions + on the secured resources. + +The `Permission` class identifies a single permission configured on the feature store and is identified by these attributes: +- `name`: The permission name. +- `types`: The list of protected resource types. Defaults to all managed types, e.g. the `ALL_RESOURCE_TYPES` alias +- `with_subclasses`: Specify if sub-classes are included in the resource match or not. Defaults to `True`. +- `name_pattern`: A regex to match the resource name. Defaults to `None`, meaning that no name filtering is applied +- `required_tags`: Dictionary of key-value pairs that must match the resource tags. Defaults to `None`, meaning that no tags filtering is applied. +- `actions`: The actions authorized by this permission. Defaults to `AuthzedAction.ALL`. +- `policy`: The policy to be applied to validate a client request. + +Given the above definitions, the feature store can be configured with granular control over each resource, enabling partitioned access by +teams to meet organizational requirements for service and data sharing, and protection of sensitive information. + +The `feast` CLI includes a new `permissions` command to list the registered permissions, with options to identify the matching resources for each configured permission and the existing resources that are not covered by any permission. + +{% hint style="info" %} +**Note**: Feast resources that do not match any of the configured permissions are not secured by any authorization policy, meaning any user can execute any action on such resources. +{% endhint %} + +## Configuration examples +This permission configuration allows to access the resource state and query all the stores for any feature view or feature service +to all users with role `super-reader`: +```py +Permission( + name="feature-reader", + types=[FeatureView, FeatureService], + policy=RoleBasedPolicy(roles=["super-reader"]), + actions=[AuthzedAction.READ, QUERY], +) +``` +Please note that all sub-classes of `FeatureView` are also included since the default for the `with_subclasses` parameter is `True`. + +This example grants permission to write on all the data sources with `risk_level` tag set to `hi` only to users with role `admin` or `data_team`: +```py +Permission( + name="ds-writer", + types=[DataSource], + required_tags={"risk_level": "hi"}, + policy=RoleBasedPolicy(roles=["admin", "data_team"]), + actions=[AuthzedAction.WRITE], +) +``` + +{% hint style="info" %} +**Note**: When using multiple roles in a role-based policy, the user must be granted at least one of the specified roles. +{% endhint %} + + +The following permission grants authorization to query the offline store of all the feature views including `risky` in the name, to users with role `trusted`: +```py +Permission( + name="reader", + types=[FeatureView], + with_subclasses=False, # exclude sub-classes + name_pattern=".*risky.*", + policy=RoleBasedPolicy(roles=["trusted"]), + actions=[AuthzedAction.QUERY_OFFLINE], +) +``` + +## Authorizing Feast clients +**TODO** +Initial proposals: +* Kubernetes RBAC: +```yaml +offline_store: + type: remote + host: localhost + port: 8815 + auth: + type: kubernetes +``` +* OIDC authorization: +```yaml +offline_store: + type: remote + host: localhost + port: 8815 + auth: + type: oidc + server: 'http://0.0.0.0:8080' + realm: 'poc' + client-id: 'app' + client-secret: 'mqAzX7zDalQ1a3BZRWs7Pi5JRqCq7h4z' + username: 'username' + password: 'password' +``` \ No newline at end of file diff --git a/docs/reference/feast-cli-commands.md b/docs/reference/feast-cli-commands.md index afcfcfef64..299de741ac 100644 --- a/docs/reference/feast-cli-commands.md +++ b/docs/reference/feast-cli-commands.md @@ -24,6 +24,7 @@ Commands: init Create a new Feast repository materialize Run a (non-incremental) materialization job to... materialize-incremental Run an incremental materialization job to ingest... + permissions Access permissions registry-dump Print contents of the metadata registry teardown Tear down deployed feature store infrastructure version Display Feast SDK version @@ -155,6 +156,28 @@ Load data from feature views into the online store, beginning from either the pr feast materialize-incremental 2022-01-01T00:00:00 ``` +## Permissions +***TODO*** Update +```text +feast permissions --help +... +``` + +### List permissions +***TODO*** Description and output examples + +```text +feast permissions list +... +``` + +### Describe a permission +***TODO*** Description and output examples +```text +feast permissions describe permission-name +... +``` + ## Teardown Tear down deployed feature store infrastructure diff --git a/sdk/python/docs/source/feast.rst b/sdk/python/docs/source/feast.rst index 95fbea8d7a..83137574dd 100644 --- a/sdk/python/docs/source/feast.rst +++ b/sdk/python/docs/source/feast.rst @@ -12,6 +12,7 @@ Subpackages feast.embedded_go feast.infra feast.loaders + feast.permissions feast.protos feast.transformation feast.ui @@ -251,6 +252,14 @@ feast.proto\_json module :undoc-members: :show-inheritance: +feast.prova module +------------------ + +.. automodule:: feast.prova + :members: + :undoc-members: + :show-inheritance: + feast.registry\_server module ----------------------------- From abf384fb85daf88b64179d2d6d044bda22c50135 Mon Sep 17 00:00:00 2001 From: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Date: Thu, 27 Jun 2024 08:48:23 +0200 Subject: [PATCH 015/169] removed test code Signed-off-by: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Signed-off-by: Abdul Hameed --- sdk/python/docs/source/feast.rst | 8 -------- 1 file changed, 8 deletions(-) diff --git a/sdk/python/docs/source/feast.rst b/sdk/python/docs/source/feast.rst index 83137574dd..f4db875995 100644 --- a/sdk/python/docs/source/feast.rst +++ b/sdk/python/docs/source/feast.rst @@ -252,14 +252,6 @@ feast.proto\_json module :undoc-members: :show-inheritance: -feast.prova module ------------------- - -.. automodule:: feast.prova - :members: - :undoc-members: - :show-inheritance: - feast.registry\_server module ----------------------------- From 8fb5227efcb0b1c37044320f561c84e85328b480 Mon Sep 17 00:00:00 2001 From: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Date: Thu, 27 Jun 2024 08:56:34 +0200 Subject: [PATCH 016/169] hiding sensitive data (false positive, anyway) Signed-off-by: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Signed-off-by: Abdul Hameed --- docs/getting-started/concepts/permission.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/getting-started/concepts/permission.md b/docs/getting-started/concepts/permission.md index cd3d681405..9ada6c162e 100644 --- a/docs/getting-started/concepts/permission.md +++ b/docs/getting-started/concepts/permission.md @@ -113,9 +113,9 @@ offline_store: auth: type: oidc server: 'http://0.0.0.0:8080' - realm: 'poc' - client-id: 'app' - client-secret: 'mqAzX7zDalQ1a3BZRWs7Pi5JRqCq7h4z' - username: 'username' - password: 'password' + realm: 'OIDC_REALM' + client-id: 'CLIENT_ID' + client-secret: 'CLIENT_SECRET' + username: 'USERNAME' + password: 'PASSWORD' ``` \ No newline at end of file From ae0174071a98f58cb9d11090f140ab6af8c6545b Mon Sep 17 00:00:00 2001 From: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Date: Mon, 1 Jul 2024 14:19:39 +0200 Subject: [PATCH 017/169] Added filter_only flag to assert_permissions and returning a list of filtered resources instead of PermissionError Signed-off-by: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Signed-off-by: Abdul Hameed --- sdk/python/feast/permissions/enforcer.py | 31 +++++-- sdk/python/feast/permissions/matcher.py | 10 +- sdk/python/feast/permissions/permission.py | 4 +- .../feast/permissions/security_manager.py | 19 ++-- sdk/python/tests/unit/permissions/conftest.py | 92 +++++++++++++++++++ .../tests/unit/permissions/test_decorator.py | 72 +-------------- .../tests/unit/permissions/test_permission.py | 8 +- .../tests/unit/permissions/test_policy.py | 10 -- .../unit/permissions/test_security_manager.py | 90 ++++++++++++++++++ 9 files changed, 229 insertions(+), 107 deletions(-) create mode 100644 sdk/python/tests/unit/permissions/conftest.py create mode 100644 sdk/python/tests/unit/permissions/test_security_manager.py diff --git a/sdk/python/feast/permissions/enforcer.py b/sdk/python/feast/permissions/enforcer.py index 02d0d308d8..02d899cb90 100644 --- a/sdk/python/feast/permissions/enforcer.py +++ b/sdk/python/feast/permissions/enforcer.py @@ -18,7 +18,8 @@ def enforce_policy( user: str, resources: Union[list[FeastObject], FeastObject], actions: list[AuthzedAction], -) -> tuple[bool, str]: + filter_only: bool = False, +) -> list[FeastObject]: """ Define the logic to apply the configured permissions when a given action is requested on a protected resource. @@ -31,14 +32,19 @@ def enforce_policy( user: The current user. resources: The resources for which we need to enforce authorized permission. actions: The requested actions to be authorized. + filter_only: If `True`, it removes unauthorized resources from the returned value, otherwise it raises a `PermissionError` the + first unauthorized resource. Defaults to `False`. Returns: - tuple[bool, str]: a boolean with the result of the authorization check (`True` stands for allowed) and string to explain - the reason for denying execution. + list[FeastObject]: A list of the permitted resources (a subset of the input `resources`). + + Raises: + PermissionError: If the current user is not authorized to eecute the requested actions on the given resources (and `filter_only` is `False`). """ + _resources = resources if isinstance(resources, list) else [resources] if not permissions: - return (True, "") + return _resources - _resources = resources if isinstance(resources, list) else [resources] + _permitted_resources: list[FeastObject] = [] for resource in _resources: logger.debug( f"Enforcing permission policies for {type(resource)}:{resource.name} to execute {actions}" @@ -64,8 +70,13 @@ def enforce_policy( if evaluator.is_decided(): grant, explanations = evaluator.grant() - return grant, ",".join(explanations) - else: - message = f"No permissions defined to manage {actions} on {resources}." - logger.info(f"**PERMISSION GRANTED**: {message}") - return (True, "") + if not grant and not filter_only: + raise PermissionError(",".join(explanations)) + if grant: + _permitted_resources.append(resource) + break + else: + _permitted_resources.append(resource) + message = f"No permissions defined to manage {actions} on {type(resource)}/{resource.name}." + logger.info(f"**PERMISSION GRANTED**: {message}") + return _permitted_resources diff --git a/sdk/python/feast/permissions/matcher.py b/sdk/python/feast/permissions/matcher.py index 249b6fb46a..0270f179cc 100644 --- a/sdk/python/feast/permissions/matcher.py +++ b/sdk/python/feast/permissions/matcher.py @@ -140,21 +140,21 @@ def resource_match_config( def actions_match_config( - actions: list[AuthzedAction], + requested_actions: list[AuthzedAction], allowed_actions: list[AuthzedAction], ) -> bool: """ Match a list of actions against the actions defined in a permission configuration. Args: - actions: Alist of actions to be executed. + requested_actions: A list of actions to be executed. allowed_actions: The list of actions configured in the permission. Returns: - bool: `True` if all the given `actions` are defined in the `allowed_actions`. - Whatever the requested `actions`, it returns `True` if `allowed_actions` includes `AuthzedAction.ALL` + bool: `True` if all the given `requested_actions` are defined in the `allowed_actions`. + Whatever the `requested_actions`, it returns `True` if `allowed_actions` includes `AuthzedAction.ALL` """ if AuthzedAction.ALL in allowed_actions: return True - return all(a in allowed_actions for a in actions) + return all(a in allowed_actions for a in requested_actions) diff --git a/sdk/python/feast/permissions/permission.py b/sdk/python/feast/permissions/permission.py index 006053f305..ae1fa35d6f 100644 --- a/sdk/python/feast/permissions/permission.py +++ b/sdk/python/feast/permissions/permission.py @@ -127,14 +127,14 @@ def match_resource(self, resource: FeastObject) -> bool: required_tags=self.required_tags, ) - def match_actions(self, actions: list[AuthzedAction]) -> bool: + def match_actions(self, requested_actions: list[AuthzedAction]) -> bool: """ Returns: `True` when the given actions are included in the permitted actions. """ return actions_match_config( allowed_actions=self.actions, - actions=actions, + requested_actions=requested_actions, ) diff --git a/sdk/python/feast/permissions/security_manager.py b/sdk/python/feast/permissions/security_manager.py index c4aaedbccf..66f5de773c 100644 --- a/sdk/python/feast/permissions/security_manager.py +++ b/sdk/python/feast/permissions/security_manager.py @@ -60,7 +60,8 @@ def assert_permissions( self, resources: Union[list[FeastObject], FeastObject], actions: Union[AuthzedAction, List[AuthzedAction]], - ): + filter_only: bool = False, + ) -> list[FeastObject]: """ Verify if the current user is authorized ro execute the requested actions on the given resources. @@ -69,25 +70,27 @@ def assert_permissions( Args: resources: The resources for which we need to enforce authorized permission. actions: The requested actions to be authorized. + filter_only: If `True`, it removes unauthorized resources from the returned value, otherwise it raises a `PermissionError` the + first unauthorized resource. Defaults to `False`. Raises: PermissionError: If the current user is not authorized to eecute all the requested actions on the given resources. """ - result, explain = enforce_policy( + return enforce_policy( role_manager=self._role_manager, permissions=self._permissions, user=self.current_user if self.current_user is not None else "", resources=resources, actions=actions if isinstance(actions, list) else [actions], + filter_only=filter_only, ) - if not result: - raise PermissionError(explain) def assert_permissions( resources: Union[list[FeastObject], FeastObject], actions: Union[AuthzedAction, List[AuthzedAction]], -): + filter_only: bool = False, +) -> list[FeastObject]: """ A utility function to invoke the `assert_permissions` method on the global security manager. @@ -95,8 +98,10 @@ def assert_permissions( """ sm = get_security_manager() if sm is None: - return - return sm.assert_permissions(resources=resources, actions=actions) + return resources if isinstance(resources, list) else [resources] + return sm.assert_permissions( + resources=resources, actions=actions, filter_only=filter_only + ) """ diff --git a/sdk/python/tests/unit/permissions/conftest.py b/sdk/python/tests/unit/permissions/conftest.py new file mode 100644 index 0000000000..19a84742b5 --- /dev/null +++ b/sdk/python/tests/unit/permissions/conftest.py @@ -0,0 +1,92 @@ +from unittest.mock import Mock + +import pytest + +from feast import FeatureView +from feast.permissions.decorator import require_permissions +from feast.permissions.permission import AuthzedAction, Permission +from feast.permissions.policy import RoleBasedPolicy +from feast.permissions.role_manager import RoleManager +from feast.permissions.security_manager import ( + SecurityManager, + set_security_manager, +) + + +class SecuredFeatureView(FeatureView): + def __init__(self, name, tags): + super().__init__( + name=name, + source=Mock(), + tags=tags, + ) + + @require_permissions(actions=[AuthzedAction.READ]) + def read_protected(self) -> bool: + return True + + @require_permissions(actions=[AuthzedAction.WRITE]) + def write_protected(self) -> bool: + return True + + def unprotected(self) -> bool: + return True + + +@pytest.fixture +def feature_views() -> list[FeatureView]: + return [ + SecuredFeatureView("secured", {}), + SecuredFeatureView("special-secured", {}), + ] + + +@pytest.fixture +def role_manager() -> RoleManager: + rm = RoleManager() + rm.add_roles_for_user("r", ["reader"]) + rm.add_roles_for_user("w", ["writer"]) + rm.add_roles_for_user("rw", ["reader", "writer"]) + return rm + + +@pytest.fixture +def security_manager() -> SecurityManager: + permissions = [] + permissions.append( + Permission( + name="reader", + types=FeatureView, + with_subclasses=True, + policy=RoleBasedPolicy(roles=["reader"]), + actions=[AuthzedAction.READ], + ) + ) + permissions.append( + Permission( + name="writer", + types=FeatureView, + with_subclasses=True, + policy=RoleBasedPolicy(roles=["writer"]), + actions=[AuthzedAction.WRITE], + ) + ) + permissions.append( + Permission( + name="special", + types=FeatureView, + with_subclasses=True, + name_pattern="special.*", + policy=RoleBasedPolicy(roles=["admin", "special-reader"]), + actions=[AuthzedAction.READ, AuthzedAction.WRITE], + ) + ) + + rm = RoleManager() + rm.add_roles_for_user("r", ["reader"]) + rm.add_roles_for_user("w", ["writer"]) + rm.add_roles_for_user("rw", ["reader", "writer"]) + rm.add_roles_for_user("admin", ["reader", "writer", "admin"]) + sm = SecurityManager(role_manager=rm, permissions=permissions) + set_security_manager(sm) + return sm diff --git a/sdk/python/tests/unit/permissions/test_decorator.py b/sdk/python/tests/unit/permissions/test_decorator.py index bd9554fed0..f328121346 100644 --- a/sdk/python/tests/unit/permissions/test_decorator.py +++ b/sdk/python/tests/unit/permissions/test_decorator.py @@ -1,74 +1,6 @@ -from unittest.mock import Mock - import assertpy import pytest -from feast import FeatureView -from feast.permissions.decorator import require_permissions -from feast.permissions.permission import AuthzedAction, Permission -from feast.permissions.policy import RoleBasedPolicy -from feast.permissions.role_manager import RoleManager -from feast.permissions.security_manager import ( - SecurityManager, - set_security_manager, -) - - -class SecuredFeatureView(FeatureView): - def __init__(self, name, tags): - super().__init__( - name=name, - source=Mock(), - tags=tags, - ) - - @require_permissions(actions=[AuthzedAction.READ]) - def read_protected(self) -> bool: - return True - - @require_permissions(actions=[AuthzedAction.WRITE]) - def write_protected(self) -> bool: - return True - - def unprotected(self) -> bool: - return True - - -@pytest.fixture -def security_manager() -> SecurityManager: - permissions = [] - permissions.append( - Permission( - name="reader", - types=FeatureView, - with_subclasses=True, - policy=RoleBasedPolicy(roles=["reader"]), - actions=[AuthzedAction.READ], - ) - ) - permissions.append( - Permission( - name="writer", - types=FeatureView, - with_subclasses=True, - policy=RoleBasedPolicy(roles=["writer"]), - actions=[AuthzedAction.WRITE], - ) - ) - - rm = RoleManager() - rm.add_roles_for_user("r", ["reader"]) - rm.add_roles_for_user("w", ["writer"]) - rm.add_roles_for_user("rw", ["reader", "writer"]) - sm = SecurityManager(role_manager=rm, permissions=permissions) - set_security_manager(sm) - return sm - - -@pytest.fixture -def feature_view() -> FeatureView: - return SecuredFeatureView("secured", {}) - @pytest.mark.parametrize( "user, can_read, can_write", @@ -80,10 +12,10 @@ def feature_view() -> FeatureView: ], ) def test_access_SecuredFeatureView( - security_manager, feature_view, user, can_read, can_write + security_manager, feature_views, user, can_read, can_write ): sm = security_manager - fv = feature_view + fv = feature_views[0] sm.set_current_user(user) if can_read: diff --git a/sdk/python/tests/unit/permissions/test_permission.py b/sdk/python/tests/unit/permissions/test_permission.py index 7061274f04..878e8e1f8e 100644 --- a/sdk/python/tests/unit/permissions/test_permission.py +++ b/sdk/python/tests/unit/permissions/test_permission.py @@ -251,7 +251,7 @@ def test_resource_match_with_tags(required_tags, tags, result): @pytest.mark.parametrize( - ("permitted_actions, actions, result"), + ("permitted_actions, requested_actions, result"), [(AuthzedAction.ALL, a, True) for a in AuthzedAction.__members__.values()] + [ ( @@ -269,6 +269,8 @@ def test_resource_match_with_tags(required_tags, tags, result): ), ], ) -def test_match_actions(permitted_actions, actions, result): +def test_match_actions(permitted_actions, requested_actions, result): p = Permission(name="test", actions=permitted_actions) - assertpy.assert_that(p.match_actions(actions=actions)).is_equal_to(result) + assertpy.assert_that( + p.match_actions(requested_actions=requested_actions) + ).is_equal_to(result) diff --git a/sdk/python/tests/unit/permissions/test_policy.py b/sdk/python/tests/unit/permissions/test_policy.py index 84e4527bff..2074dbb990 100644 --- a/sdk/python/tests/unit/permissions/test_policy.py +++ b/sdk/python/tests/unit/permissions/test_policy.py @@ -2,7 +2,6 @@ import pytest from feast.permissions.policy import AllowAll, RoleBasedPolicy -from feast.permissions.role_manager import RoleManager @pytest.mark.parametrize( @@ -20,15 +19,6 @@ def test_allow_all(user, dict): assertpy.assert_that(AllowAll.validate_user(user)).is_true() -@pytest.fixture -def role_manager() -> RoleManager: - rm = RoleManager() - rm.add_roles_for_user("r", ["reader"]) - rm.add_roles_for_user("w", ["writer"]) - rm.add_roles_for_user("rw", ["reader", "writer"]) - return rm - - @pytest.mark.parametrize( "required_roles, user, result", [ diff --git a/sdk/python/tests/unit/permissions/test_security_manager.py b/sdk/python/tests/unit/permissions/test_security_manager.py new file mode 100644 index 0000000000..588a99a1ab --- /dev/null +++ b/sdk/python/tests/unit/permissions/test_security_manager.py @@ -0,0 +1,90 @@ +import assertpy +import pytest + +from feast.permissions.action import AuthzedAction +from feast.permissions.decision import DecisionStrategy +from feast.permissions.permission import Permission + + +@pytest.fixture(scope="module", autouse=True) +def setup_module(): + Permission.set_global_decision_strategy(DecisionStrategy.UNANIMOUS) + + +@pytest.mark.parametrize( + "user, requested_actions, allowed, allowed_single", + [ + (None, [], False, [False, False]), + ("r", [AuthzedAction.READ], False, [True, False]), + ("r", [AuthzedAction.WRITE], False, [False, False]), + ("w", [AuthzedAction.READ], False, [False, False]), + ("w", [AuthzedAction.WRITE], False, [True, False]), + ("rw", [AuthzedAction.READ], False, [True, False]), + ("rw", [AuthzedAction.WRITE], False, [True, False]), + ("rw", [AuthzedAction.READ, AuthzedAction.WRITE], False, [True, False]), + ("admin", [AuthzedAction.READ, AuthzedAction.WRITE], True, [True, True]), + ("admin", [AuthzedAction.QUERY, AuthzedAction.WRITE], True, [True, True]), + ], +) +def test_access_SecuredFeatureView_raise_error( + security_manager, feature_views, user, requested_actions, allowed, allowed_single +): + sm = security_manager + resources = feature_views + + sm.set_current_user(user) + if allowed: + result = sm.assert_permissions(resources=resources, actions=requested_actions) + assertpy.assert_that(result).is_equal_to(resources) + else: + with pytest.raises(PermissionError): + sm.assert_permissions(resources=resources, actions=requested_actions) + + for i, r in enumerate(resources): + if allowed_single[i]: + result = sm.assert_permissions(resources=r, actions=requested_actions) + assertpy.assert_that(result).is_equal_to([r]) + else: + with pytest.raises(PermissionError): + sm.assert_permissions(resources=r, actions=requested_actions) + + +@pytest.mark.parametrize( + "user, requested_actions, allowed, allowed_single", + [ + (None, [], False, [False, False]), + ("r", [AuthzedAction.READ], False, [True, False]), + ("r", [AuthzedAction.WRITE], False, [False, False]), + ("w", [AuthzedAction.READ], False, [False, False]), + ("w", [AuthzedAction.WRITE], False, [True, False]), + ("rw", [AuthzedAction.READ], False, [True, False]), + ("rw", [AuthzedAction.WRITE], False, [True, False]), + ("rw", [AuthzedAction.READ, AuthzedAction.WRITE], False, [True, False]), + ("admin", [AuthzedAction.READ, AuthzedAction.WRITE], True, [True, True]), + ("admin", [AuthzedAction.QUERY, AuthzedAction.WRITE], True, [True, True]), + ], +) +def test_access_SecuredFeatureView_filter_resources( + security_manager, feature_views, user, requested_actions, allowed, allowed_single +): + sm = security_manager + resources = feature_views + + sm.set_current_user(user) + result = sm.assert_permissions( + resources=resources, actions=requested_actions, filter_only=True + ) + if allowed: + assertpy.assert_that(result).is_equal_to(resources) + else: + filtered = [r for i, r in enumerate(resources) if allowed_single[i]] + assertpy.assert_that(result).is_equal_to(filtered) + + for i, r in enumerate(resources): + result = sm.assert_permissions( + resources=r, actions=requested_actions, filter_only=True + ) + if allowed_single[i]: + assertpy.assert_that(result).is_equal_to([r]) + else: + assertpy.assert_that(result).is_equal_to([]) From 7b02d264160c77bdca15de2bcf3712f3f1383588 Mon Sep 17 00:00:00 2001 From: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Date: Mon, 1 Jul 2024 14:56:57 +0200 Subject: [PATCH 018/169] added the option to return the single resource, or None Signed-off-by: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Signed-off-by: Abdul Hameed --- sdk/python/feast/permissions/enforcer.py | 16 +++++++++++---- .../feast/permissions/security_manager.py | 20 +++++++++++++++++-- .../unit/permissions/test_security_manager.py | 6 +++--- 3 files changed, 33 insertions(+), 9 deletions(-) diff --git a/sdk/python/feast/permissions/enforcer.py b/sdk/python/feast/permissions/enforcer.py index 02d899cb90..30665296c6 100644 --- a/sdk/python/feast/permissions/enforcer.py +++ b/sdk/python/feast/permissions/enforcer.py @@ -1,5 +1,5 @@ import logging -from typing import Union +from typing import Optional, Union from feast.feast_object import FeastObject from feast.permissions.decision import DecisionEvaluator @@ -19,7 +19,7 @@ def enforce_policy( resources: Union[list[FeastObject], FeastObject], actions: list[AuthzedAction], filter_only: bool = False, -) -> list[FeastObject]: +) -> Optional[Union[list[FeastObject], FeastObject]]: """ Define the logic to apply the configured permissions when a given action is requested on a protected resource. @@ -34,8 +34,10 @@ def enforce_policy( actions: The requested actions to be authorized. filter_only: If `True`, it removes unauthorized resources from the returned value, otherwise it raises a `PermissionError` the first unauthorized resource. Defaults to `False`. + Returns: - list[FeastObject]: A list of the permitted resources (a subset of the input `resources`). + Union[list[FeastObject], FeastObject]: A filtered list of the permitted resources or the original `resources`, if permitted + (otherwise it's `None`). Raises: PermissionError: If the current user is not authorized to eecute the requested actions on the given resources (and `filter_only` is `False`). @@ -79,4 +81,10 @@ def enforce_policy( _permitted_resources.append(resource) message = f"No permissions defined to manage {actions} on {type(resource)}/{resource.name}." logger.info(f"**PERMISSION GRANTED**: {message}") - return _permitted_resources + return ( + _permitted_resources + if isinstance(resources, list) + else _permitted_resources[0] + if _permitted_resources + else None + ) diff --git a/sdk/python/feast/permissions/security_manager.py b/sdk/python/feast/permissions/security_manager.py index 66f5de773c..0274df54e7 100644 --- a/sdk/python/feast/permissions/security_manager.py +++ b/sdk/python/feast/permissions/security_manager.py @@ -61,7 +61,7 @@ def assert_permissions( resources: Union[list[FeastObject], FeastObject], actions: Union[AuthzedAction, List[AuthzedAction]], filter_only: bool = False, - ) -> list[FeastObject]: + ) -> Optional[Union[list[FeastObject], FeastObject]]: """ Verify if the current user is authorized ro execute the requested actions on the given resources. @@ -73,6 +73,10 @@ def assert_permissions( filter_only: If `True`, it removes unauthorized resources from the returned value, otherwise it raises a `PermissionError` the first unauthorized resource. Defaults to `False`. + Returns: + Union[list[FeastObject], FeastObject]: A filtered list of the permitted resources or the original `resources`, if permitted + (otherwise it's `None`). + Raises: PermissionError: If the current user is not authorized to eecute all the requested actions on the given resources. """ @@ -90,11 +94,23 @@ def assert_permissions( resources: Union[list[FeastObject], FeastObject], actions: Union[AuthzedAction, List[AuthzedAction]], filter_only: bool = False, -) -> list[FeastObject]: +) -> Optional[Union[list[FeastObject], FeastObject]]: """ A utility function to invoke the `assert_permissions` method on the global security manager. If no global `SecurityManager` is defined, the execution is permitted. + + Args: + resources: The resources for which we need to enforce authorized permission. + actions: The requested actions to be authorized. + filter_only: If `True`, it removes unauthorized resources from the returned value, otherwise it raises a `PermissionError` the + first unauthorized resource. Defaults to `False`. + Returns: + Union[list[FeastObject], FeastObject]: A filtered list of the permitted resources or the original `resources`, if permitted + (otherwise it's `None`). + + Raises: + PermissionError: If the current user is not authorized to eecute the requested actions on the given resources (and `filter_only` is `False`). """ sm = get_security_manager() if sm is None: diff --git a/sdk/python/tests/unit/permissions/test_security_manager.py b/sdk/python/tests/unit/permissions/test_security_manager.py index 588a99a1ab..d4743c7dfd 100644 --- a/sdk/python/tests/unit/permissions/test_security_manager.py +++ b/sdk/python/tests/unit/permissions/test_security_manager.py @@ -43,7 +43,7 @@ def test_access_SecuredFeatureView_raise_error( for i, r in enumerate(resources): if allowed_single[i]: result = sm.assert_permissions(resources=r, actions=requested_actions) - assertpy.assert_that(result).is_equal_to([r]) + assertpy.assert_that(result).is_equal_to(r) else: with pytest.raises(PermissionError): sm.assert_permissions(resources=r, actions=requested_actions) @@ -85,6 +85,6 @@ def test_access_SecuredFeatureView_filter_resources( resources=r, actions=requested_actions, filter_only=True ) if allowed_single[i]: - assertpy.assert_that(result).is_equal_to([r]) + assertpy.assert_that(result).is_equal_to(r) else: - assertpy.assert_that(result).is_equal_to([]) + assertpy.assert_that(result).is_none() From ad6765bdc331a409bc9707ff072efdf7ca02efe1 Mon Sep 17 00:00:00 2001 From: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Date: Mon, 1 Jul 2024 15:53:40 +0200 Subject: [PATCH 019/169] separate validating functions: assert_permission and filtered_resources Signed-off-by: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Signed-off-by: Abdul Hameed --- sdk/python/feast/permissions/decorator.py | 2 +- sdk/python/feast/permissions/enforcer.py | 21 +++----- .../feast/permissions/security_manager.py | 45 +++++++++++----- .../unit/permissions/test_security_manager.py | 52 +++---------------- 4 files changed, 44 insertions(+), 76 deletions(-) diff --git a/sdk/python/feast/permissions/decorator.py b/sdk/python/feast/permissions/decorator.py index 1fda30506c..3b9f7a4ae3 100644 --- a/sdk/python/feast/permissions/decorator.py +++ b/sdk/python/feast/permissions/decorator.py @@ -28,7 +28,7 @@ def permission_checker(*args, **kwargs): ) return assert_permissions( - resources=resource, + resource=resource, actions=actions, ) logger.debug( diff --git a/sdk/python/feast/permissions/enforcer.py b/sdk/python/feast/permissions/enforcer.py index 30665296c6..080db4bb25 100644 --- a/sdk/python/feast/permissions/enforcer.py +++ b/sdk/python/feast/permissions/enforcer.py @@ -1,5 +1,4 @@ import logging -from typing import Optional, Union from feast.feast_object import FeastObject from feast.permissions.decision import DecisionEvaluator @@ -16,10 +15,10 @@ def enforce_policy( role_manager: RoleManager, permissions: list[Permission], user: str, - resources: Union[list[FeastObject], FeastObject], + resources: list[FeastObject], actions: list[AuthzedAction], filter_only: bool = False, -) -> Optional[Union[list[FeastObject], FeastObject]]: +) -> list[FeastObject]: """ Define the logic to apply the configured permissions when a given action is requested on a protected resource. @@ -36,18 +35,16 @@ def enforce_policy( first unauthorized resource. Defaults to `False`. Returns: - Union[list[FeastObject], FeastObject]: A filtered list of the permitted resources or the original `resources`, if permitted - (otherwise it's `None`). + list[FeastObject]: A filtered list of the permitted resources. Raises: PermissionError: If the current user is not authorized to eecute the requested actions on the given resources (and `filter_only` is `False`). """ - _resources = resources if isinstance(resources, list) else [resources] if not permissions: - return _resources + return resources _permitted_resources: list[FeastObject] = [] - for resource in _resources: + for resource in resources: logger.debug( f"Enforcing permission policies for {type(resource)}:{resource.name} to execute {actions}" ) @@ -81,10 +78,4 @@ def enforce_policy( _permitted_resources.append(resource) message = f"No permissions defined to manage {actions} on {type(resource)}/{resource.name}." logger.info(f"**PERMISSION GRANTED**: {message}") - return ( - _permitted_resources - if isinstance(resources, list) - else _permitted_resources[0] - if _permitted_resources - else None - ) + return _permitted_resources diff --git a/sdk/python/feast/permissions/security_manager.py b/sdk/python/feast/permissions/security_manager.py index 0274df54e7..ac1bf9dad3 100644 --- a/sdk/python/feast/permissions/security_manager.py +++ b/sdk/python/feast/permissions/security_manager.py @@ -58,10 +58,10 @@ def permissions(self) -> list[Permission]: def assert_permissions( self, - resources: Union[list[FeastObject], FeastObject], + resources: list[FeastObject], actions: Union[AuthzedAction, List[AuthzedAction]], filter_only: bool = False, - ) -> Optional[Union[list[FeastObject], FeastObject]]: + ) -> list[FeastObject]: """ Verify if the current user is authorized ro execute the requested actions on the given resources. @@ -74,8 +74,7 @@ def assert_permissions( first unauthorized resource. Defaults to `False`. Returns: - Union[list[FeastObject], FeastObject]: A filtered list of the permitted resources or the original `resources`, if permitted - (otherwise it's `None`). + list[FeastObject]: A filtered list of the permitted resources, possibly empty. Raises: PermissionError: If the current user is not authorized to eecute all the requested actions on the given resources. @@ -91,33 +90,51 @@ def assert_permissions( def assert_permissions( - resources: Union[list[FeastObject], FeastObject], + resource: FeastObject, actions: Union[AuthzedAction, List[AuthzedAction]], filter_only: bool = False, -) -> Optional[Union[list[FeastObject], FeastObject]]: +) -> FeastObject: """ A utility function to invoke the `assert_permissions` method on the global security manager. If no global `SecurityManager` is defined, the execution is permitted. Args: - resources: The resources for which we need to enforce authorized permission. + resource: The resource for which we need to enforce authorized permission. actions: The requested actions to be authorized. - filter_only: If `True`, it removes unauthorized resources from the returned value, otherwise it raises a `PermissionError` the - first unauthorized resource. Defaults to `False`. Returns: - Union[list[FeastObject], FeastObject]: A filtered list of the permitted resources or the original `resources`, if permitted - (otherwise it's `None`). + FeastObject: The original `resource`, if permitted. Raises: PermissionError: If the current user is not authorized to eecute the requested actions on the given resources (and `filter_only` is `False`). """ sm = get_security_manager() if sm is None: - return resources if isinstance(resources, list) else [resources] + return resource return sm.assert_permissions( - resources=resources, actions=actions, filter_only=filter_only - ) + resources=[resource], actions=actions, filter_only=False + )[0] + + +def permitted_resources( + resources: list[FeastObject], + actions: Union[AuthzedAction, List[AuthzedAction]], +) -> list[FeastObject]: + """ + A utility function to invoke the `assert_permissions` method on the global security manager. + + If no global `SecurityManager` is defined, the execution is permitted. + + Args: + resources: The resources for which we need to enforce authorized permission. + actions: The requested actions to be authorized. + Returns: + list[FeastObject]]: A filtered list of the permitted resources, possibly empty. + """ + sm = get_security_manager() + if sm is None: + return resources + return sm.assert_permissions(resources=resources, actions=actions, filter_only=True) """ diff --git a/sdk/python/tests/unit/permissions/test_security_manager.py b/sdk/python/tests/unit/permissions/test_security_manager.py index d4743c7dfd..c8a383a97f 100644 --- a/sdk/python/tests/unit/permissions/test_security_manager.py +++ b/sdk/python/tests/unit/permissions/test_security_manager.py @@ -4,6 +4,7 @@ from feast.permissions.action import AuthzedAction from feast.permissions.decision import DecisionStrategy from feast.permissions.permission import Permission +from feast.permissions.security_manager import assert_permissions, permitted_resources @pytest.fixture(scope="module", autouse=True) @@ -26,54 +27,14 @@ def setup_module(): ("admin", [AuthzedAction.QUERY, AuthzedAction.WRITE], True, [True, True]), ], ) -def test_access_SecuredFeatureView_raise_error( +def test_access_SecuredFeatureView( security_manager, feature_views, user, requested_actions, allowed, allowed_single ): sm = security_manager resources = feature_views sm.set_current_user(user) - if allowed: - result = sm.assert_permissions(resources=resources, actions=requested_actions) - assertpy.assert_that(result).is_equal_to(resources) - else: - with pytest.raises(PermissionError): - sm.assert_permissions(resources=resources, actions=requested_actions) - - for i, r in enumerate(resources): - if allowed_single[i]: - result = sm.assert_permissions(resources=r, actions=requested_actions) - assertpy.assert_that(result).is_equal_to(r) - else: - with pytest.raises(PermissionError): - sm.assert_permissions(resources=r, actions=requested_actions) - - -@pytest.mark.parametrize( - "user, requested_actions, allowed, allowed_single", - [ - (None, [], False, [False, False]), - ("r", [AuthzedAction.READ], False, [True, False]), - ("r", [AuthzedAction.WRITE], False, [False, False]), - ("w", [AuthzedAction.READ], False, [False, False]), - ("w", [AuthzedAction.WRITE], False, [True, False]), - ("rw", [AuthzedAction.READ], False, [True, False]), - ("rw", [AuthzedAction.WRITE], False, [True, False]), - ("rw", [AuthzedAction.READ, AuthzedAction.WRITE], False, [True, False]), - ("admin", [AuthzedAction.READ, AuthzedAction.WRITE], True, [True, True]), - ("admin", [AuthzedAction.QUERY, AuthzedAction.WRITE], True, [True, True]), - ], -) -def test_access_SecuredFeatureView_filter_resources( - security_manager, feature_views, user, requested_actions, allowed, allowed_single -): - sm = security_manager - resources = feature_views - - sm.set_current_user(user) - result = sm.assert_permissions( - resources=resources, actions=requested_actions, filter_only=True - ) + result = permitted_resources(resources=resources, actions=requested_actions) if allowed: assertpy.assert_that(result).is_equal_to(resources) else: @@ -81,10 +42,9 @@ def test_access_SecuredFeatureView_filter_resources( assertpy.assert_that(result).is_equal_to(filtered) for i, r in enumerate(resources): - result = sm.assert_permissions( - resources=r, actions=requested_actions, filter_only=True - ) if allowed_single[i]: + result = assert_permissions(resource=r, actions=requested_actions) assertpy.assert_that(result).is_equal_to(r) else: - assertpy.assert_that(result).is_none() + with pytest.raises(PermissionError): + assert_permissions(resource=r, actions=requested_actions) From b1fbdb633a1e3d6dd5cc42d2eadff354673cd1cf Mon Sep 17 00:00:00 2001 From: Theodor Mihalache Date: Thu, 27 Jun 2024 16:26:18 -0400 Subject: [PATCH 020/169] Store and Manage permissions in the Registry Signed-off-by: Theodor Mihalache Signed-off-by: Abdul Hameed --- protos/feast/core/Permission.proto | 57 +++++ protos/feast/core/Policy.proto | 23 ++ protos/feast/core/Registry.proto | 4 +- protos/feast/registry/RegistryServer.proto | 38 +++- sdk/python/feast/diff/registry_diff.py | 24 +- sdk/python/feast/errors.py | 5 + sdk/python/feast/feast_object.py | 8 +- sdk/python/feast/feature_store.py | 214 ++++++++++-------- .../feast/infra/registry/base_registry.py | 63 ++++++ .../feast/infra/registry/caching_registry.py | 31 +++ .../infra/registry/proto_registry_utils.py | 20 ++ sdk/python/feast/infra/registry/registry.py | 49 +++- sdk/python/feast/infra/registry/remote.py | 46 ++++ sdk/python/feast/infra/registry/snowflake.py | 62 +++++ sdk/python/feast/infra/registry/sql.py | 53 +++++ .../registry/snowflake_table_creation.sql | 10 +- .../registry/snowflake_table_deletion.sql | 2 + sdk/python/feast/permissions/matcher.py | 16 +- sdk/python/feast/permissions/permission.py | 124 +++++++++- sdk/python/feast/permissions/policy.py | 72 +++++- sdk/python/feast/registry_server.py | 43 ++++ sdk/python/feast/repo_contents.py | 4 + sdk/python/feast/repo_operations.py | 6 + .../test_local_feature_store.py | 34 +++ .../tests/unit/permissions/test_permission.py | 66 +++--- 25 files changed, 924 insertions(+), 150 deletions(-) create mode 100644 protos/feast/core/Permission.proto create mode 100644 protos/feast/core/Policy.proto diff --git a/protos/feast/core/Permission.proto b/protos/feast/core/Permission.proto new file mode 100644 index 0000000000..774b2b4345 --- /dev/null +++ b/protos/feast/core/Permission.proto @@ -0,0 +1,57 @@ +syntax = "proto3"; +package feast.core; + +option go_package = "github.com/feast-dev/feast/go/protos/feast/core"; +option java_outer_classname = "Permission"; +option java_package = "feast.proto.core"; + +import "feast/core/Policy.proto"; + +message Permission { + + enum AuthzedAction { + ALL = 0; + CREATE = 1; + READ = 2; + UPDATE = 3; + DELETE = 4; + QUERY = 5; + QUERY_ONLINE = 6; + QUERY_OFFLINE = 7; + WRITE = 8; + WRITE_ONLINE = 9; + WRITE_OFFLINE = 10; + } + + // Name of the permission. Must be unique. Not updated. + string name = 1; + + // Name of Feast project. + string project = 2; + + enum Type { + FEATURE_VIEW = 0; + ONDEMAND_FEATURE_VIEW = 1; + BATCH_FEATURE_VIEW = 2; + STREAM_FEATURE_VIEW= 3; + ENTITY = 4; + FEATURE_SERVICE = 5; + DATA_SOURCE = 6; + VALIDATION_REFERENCE = 7; + PERMISSION = 8; + } + + repeated Type types = 3; + + bool with_subclasses = 4; + + optional string name_pattern = 5; + + map required_tags = 6; + + // List of actions. + repeated AuthzedAction actions = 7; + + // the policy. + Policy policy = 8; +} \ No newline at end of file diff --git a/protos/feast/core/Policy.proto b/protos/feast/core/Policy.proto new file mode 100644 index 0000000000..f12b5f1a56 --- /dev/null +++ b/protos/feast/core/Policy.proto @@ -0,0 +1,23 @@ +syntax = "proto3"; +package feast.core; + +option go_package = "github.com/feast-dev/feast/go/protos/feast/core"; +option java_outer_classname = "Policy"; +option java_package = "feast.proto.core"; + +message Policy { + // Name of the policy. + string name = 1; + + // Name of Feast project. + string project = 2; + + oneof policy_type { + RoleBasedPolicy role_based_policy = 3; + } +} + +message RoleBasedPolicy { + // List of roles in this policy. + repeated string roles = 1; +} \ No newline at end of file diff --git a/protos/feast/core/Registry.proto b/protos/feast/core/Registry.proto index 0c3f8a53f9..b4f1ffb0a3 100644 --- a/protos/feast/core/Registry.proto +++ b/protos/feast/core/Registry.proto @@ -32,8 +32,9 @@ import "feast/core/DataSource.proto"; import "feast/core/SavedDataset.proto"; import "feast/core/ValidationProfile.proto"; import "google/protobuf/timestamp.proto"; +import "feast/core/Permission.proto"; -// Next id: 16 +// Next id: 17 message Registry { repeated Entity entities = 1; repeated FeatureTable feature_tables = 2; @@ -51,6 +52,7 @@ message Registry { string registry_schema_version = 3; // to support migrations; incremented when schema is changed string version_id = 4; // version id, random string generated on each update of the data; now used only for debugging purposes google.protobuf.Timestamp last_updated = 5; + repeated Permission permissions = 16; } message ProjectMetadata { diff --git a/protos/feast/registry/RegistryServer.proto b/protos/feast/registry/RegistryServer.proto index 44529f5409..2cfa23f9f1 100644 --- a/protos/feast/registry/RegistryServer.proto +++ b/protos/feast/registry/RegistryServer.proto @@ -14,6 +14,7 @@ import "feast/core/FeatureService.proto"; import "feast/core/SavedDataset.proto"; import "feast/core/ValidationProfile.proto"; import "feast/core/InfraObject.proto"; +import "feast/core/Permission.proto"; service RegistryServer{ // Entity RPCs @@ -59,7 +60,13 @@ service RegistryServer{ rpc GetValidationReference (GetValidationReferenceRequest) returns (feast.core.ValidationReference) {} rpc ListValidationReferences (ListValidationReferencesRequest) returns (ListValidationReferencesResponse) {} rpc DeleteValidationReference (DeleteValidationReferenceRequest) returns (google.protobuf.Empty) {} - + + // Permission RPCs + rpc ApplyPermission (ApplyPermissionRequest) returns (google.protobuf.Empty) {} + rpc GetPermission (GetPermissionRequest) returns (feast.core.Permission) {} + rpc ListPermissions (ListPermissionsRequest) returns (ListPermissionsResponse) {} + rpc DeletePermission (DeletePermissionRequest) returns (google.protobuf.Empty) {} + rpc ApplyMaterialization (ApplyMaterializationRequest) returns (google.protobuf.Empty) {} rpc ListProjectMetadata (ListProjectMetadataRequest) returns (ListProjectMetadataResponse) {} rpc UpdateInfra (UpdateInfraRequest) returns (google.protobuf.Empty) {} @@ -316,4 +323,33 @@ message DeleteValidationReferenceRequest { string name = 1; string project = 2; bool commit = 3; +} + +// Permissions + +message ApplyPermissionRequest { + feast.core.Permission permission = 1; + string project = 2; + bool commit = 3; +} + +message GetPermissionRequest { + string name = 1; + string project = 2; + bool allow_cache = 3; +} + +message ListPermissionsRequest { + string project = 1; + bool allow_cache = 2; +} + +message ListPermissionsResponse { + repeated feast.core.Permission permissions = 1; +} + +message DeletePermissionRequest { + string name = 1; + string project = 2; + bool commit = 3; } \ No newline at end of file diff --git a/sdk/python/feast/diff/registry_diff.py b/sdk/python/feast/diff/registry_diff.py index 9236b087d4..49e6efbd6b 100644 --- a/sdk/python/feast/diff/registry_diff.py +++ b/sdk/python/feast/diff/registry_diff.py @@ -10,6 +10,7 @@ from feast.feature_view import DUMMY_ENTITY_NAME from feast.infra.registry.base_registry import BaseRegistry from feast.infra.registry.registry import FEAST_OBJECT_TYPES, FeastObjectType +from feast.permissions.permission import Permission from feast.protos.feast.core.DataSource_pb2 import DataSource as DataSourceProto from feast.protos.feast.core.Entity_pb2 import Entity as EntityProto from feast.protos.feast.core.FeatureService_pb2 import ( @@ -20,6 +21,7 @@ OnDemandFeatureView as OnDemandFeatureViewProto, ) from feast.protos.feast.core.OnDemandFeatureView_pb2 import OnDemandFeatureViewSpec +from feast.protos.feast.core.Permission_pb2 import Permission as PermissionProto from feast.protos.feast.core.SavedDataset_pb2 import SavedDataset as SavedDatasetProto from feast.protos.feast.core.StreamFeatureView_pb2 import ( StreamFeatureView as StreamFeatureViewProto, @@ -111,6 +113,7 @@ def tag_objects_for_keep_delete_update_add( StreamFeatureViewProto, ValidationReferenceProto, SavedDatasetProto, + PermissionProto, ) @@ -129,8 +132,10 @@ def diff_registry_objects( current_spec: FeastObjectSpecProto new_spec: FeastObjectSpecProto if isinstance( - current_proto, (DataSourceProto, ValidationReferenceProto) - ) or isinstance(new_proto, (DataSourceProto, ValidationReferenceProto)): + current_proto, (DataSourceProto, ValidationReferenceProto, PermissionProto) + ) or isinstance( + new_proto, (DataSourceProto, ValidationReferenceProto, PermissionProto) + ): assert type(current_proto) == type(new_proto) current_spec = cast(DataSourceProto, current_proto) new_spec = cast(DataSourceProto, new_proto) @@ -354,6 +359,15 @@ def apply_diff_to_registry( project, commit=False, ) + elif feast_object_diff.feast_object_type == FeastObjectType.PERMISSION: + permission_obj = cast( + Permission, feast_object_diff.current_feast_object + ) + registry.delete_permission( + permission_obj.name, + project, + commit=False, + ) if feast_object_diff.transition_type in [ TransitionType.CREATE, @@ -387,6 +401,12 @@ def apply_diff_to_registry( project, commit=False, ) + elif feast_object_diff.feast_object_type == FeastObjectType.PERMISSION: + registry.apply_permission( + cast(Permission, feast_object_diff.new_feast_object), + project, + commit=False, + ) if commit: registry.commit() diff --git a/sdk/python/feast/errors.py b/sdk/python/feast/errors.py index c4c1157626..ff8da63ffa 100644 --- a/sdk/python/feast/errors.py +++ b/sdk/python/feast/errors.py @@ -391,6 +391,11 @@ def __init__(self, input_dict: dict): ) +class PermissionNotFoundException(Exception): + def __init__(self, name, project): + super().__init__(f"Permission {name} does not exist in project {project}") + + class ZeroRowsQueryResult(Exception): def __init__(self, query: str): super().__init__(f"This query returned zero rows:\n{query}") diff --git a/sdk/python/feast/feast_object.py b/sdk/python/feast/feast_object.py index d9505dcb9f..3e0c48d3d4 100644 --- a/sdk/python/feast/feast_object.py +++ b/sdk/python/feast/feast_object.py @@ -1,4 +1,4 @@ -from typing import Union +from typing import Union, get_args from .batch_feature_view import BatchFeatureView from .data_source import DataSource @@ -6,11 +6,13 @@ from .feature_service import FeatureService from .feature_view import FeatureView from .on_demand_feature_view import OnDemandFeatureView +from .permissions.permission import Permission from .protos.feast.core.DataSource_pb2 import DataSource as DataSourceProto from .protos.feast.core.Entity_pb2 import EntitySpecV2 from .protos.feast.core.FeatureService_pb2 import FeatureServiceSpec from .protos.feast.core.FeatureView_pb2 import FeatureViewSpec from .protos.feast.core.OnDemandFeatureView_pb2 import OnDemandFeatureViewSpec +from .protos.feast.core.Permission_pb2 import Permission as PermissionProto from .protos.feast.core.SavedDataset_pb2 import SavedDatasetSpec from .protos.feast.core.StreamFeatureView_pb2 import StreamFeatureViewSpec from .protos.feast.core.ValidationProfile_pb2 import ( @@ -30,6 +32,7 @@ DataSource, ValidationReference, SavedDataset, + Permission, ] FeastObjectSpecProto = Union[ @@ -41,4 +44,7 @@ DataSourceProto, ValidationReferenceProto, SavedDatasetSpec, + PermissionProto, ] + +ALL_RESOURCE_TYPES = list(get_args(FeastObject)) diff --git a/sdk/python/feast/feature_store.py b/sdk/python/feast/feature_store.py index 77638f5a62..5cd31f7180 100644 --- a/sdk/python/feast/feature_store.py +++ b/sdk/python/feast/feature_store.py @@ -76,6 +76,7 @@ from feast.infra.registry.sql import SqlRegistry from feast.on_demand_feature_view import OnDemandFeatureView from feast.online_response import OnlineResponse +from feast.permissions.permission import Permission from feast.protos.feast.core.InfraObject_pb2 import Infra as InfraProto from feast.protos.feast.serving.ServingService_pb2 import ( FieldStatus, @@ -694,99 +695,6 @@ def _get_feature_views_to_materialize( return feature_views_to_materialize - def plan( - self, desired_repo_contents: RepoContents - ) -> Tuple[RegistryDiff, InfraDiff, Infra]: - """Dry-run registering objects to metadata store. - - The plan method dry-runs registering one or more definitions (e.g., Entity, FeatureView), and produces - a list of all the changes the that would be introduced in the feature repo. The changes computed by the plan - command are for informational purposes, and are not actually applied to the registry. - - Args: - desired_repo_contents: The desired repo state. - - Raises: - ValueError: The 'objects' parameter could not be parsed properly. - - Examples: - Generate a plan adding an Entity and a FeatureView. - - >>> from feast import FeatureStore, Entity, FeatureView, Feature, FileSource, RepoConfig - >>> from feast.feature_store import RepoContents - >>> from datetime import timedelta - >>> fs = FeatureStore(repo_path="project/feature_repo") - >>> driver = Entity(name="driver_id", description="driver id") - >>> driver_hourly_stats = FileSource( - ... path="project/feature_repo/data/driver_stats.parquet", - ... timestamp_field="event_timestamp", - ... created_timestamp_column="created", - ... ) - >>> driver_hourly_stats_view = FeatureView( - ... name="driver_hourly_stats", - ... entities=[driver], - ... ttl=timedelta(seconds=86400 * 1), - ... source=driver_hourly_stats, - ... ) - >>> registry_diff, infra_diff, new_infra = fs.plan(RepoContents( - ... data_sources=[driver_hourly_stats], - ... feature_views=[driver_hourly_stats_view], - ... on_demand_feature_views=list(), - ... stream_feature_views=list(), - ... entities=[driver], - ... feature_services=list())) # register entity and feature view - """ - # Validate and run inference on all the objects to be registered. - self._validate_all_feature_views( - desired_repo_contents.feature_views, - desired_repo_contents.on_demand_feature_views, - desired_repo_contents.stream_feature_views, - ) - _validate_data_sources(desired_repo_contents.data_sources) - self._make_inferences( - desired_repo_contents.data_sources, - desired_repo_contents.entities, - desired_repo_contents.feature_views, - desired_repo_contents.on_demand_feature_views, - desired_repo_contents.stream_feature_views, - desired_repo_contents.feature_services, - ) - - # Compute the desired difference between the current objects in the registry and - # the desired repo state. - registry_diff = diff_between( - self._registry, self.project, desired_repo_contents - ) - - # Compute the desired difference between the current infra, as stored in the registry, - # and the desired infra. - self._registry.refresh(project=self.project) - current_infra_proto = InfraProto() - current_infra_proto.CopyFrom(self._registry.proto().infra) - desired_registry_proto = desired_repo_contents.to_registry_proto() - new_infra = self._provider.plan_infra(self.config, desired_registry_proto) - new_infra_proto = new_infra.to_proto() - infra_diff = diff_infra_protos(current_infra_proto, new_infra_proto) - - return registry_diff, infra_diff, new_infra - - def _apply_diffs( - self, registry_diff: RegistryDiff, infra_diff: InfraDiff, new_infra: Infra - ): - """Applies the given diffs to the metadata store and infrastructure. - - Args: - registry_diff: The diff between the current registry and the desired registry. - infra_diff: The diff between the current infra and the desired infra. - new_infra: The desired infra. - """ - infra_diff.update() - apply_diff_to_registry( - self._registry, registry_diff, self.project, commit=False - ) - - self._registry.update_infra(new_infra, self.project, commit=True) - def apply( self, objects: Union[ @@ -798,6 +706,7 @@ def apply( StreamFeatureView, FeatureService, ValidationReference, + Permission, List[FeastObject], ], objects_to_delete: Optional[List[FeastObject]] = None, @@ -869,6 +778,7 @@ def apply( validation_references_to_update = [ ob for ob in objects if isinstance(ob, ValidationReference) ] + permissions_to_update = [ob for ob in objects if isinstance(ob, Permission)] batch_sources_to_add: List[DataSource] = [] for data_source in data_sources_set_to_update: @@ -924,10 +834,15 @@ def apply( self._registry.apply_validation_reference( validation_references, project=self.project, commit=False ) + for permission in permissions_to_update: + self._registry.apply_permission( + permission, project=self.project, commit=False + ) entities_to_delete = [] views_to_delete = [] sfvs_to_delete = [] + permissions_to_delete = [] if not partial: # Delete all registry objects that should not exist. entities_to_delete = [ @@ -956,6 +871,9 @@ def apply( validation_references_to_delete = [ ob for ob in objects_to_delete if isinstance(ob, ValidationReference) ] + permissions_to_delete = [ + ob for ob in objects_to_delete if isinstance(ob, Permission) + ] for data_source in data_sources_to_delete: self._registry.delete_data_source( @@ -985,6 +903,10 @@ def apply( self._registry.delete_validation_reference( validation_references.name, project=self.project, commit=False ) + for permission in permissions_to_delete: + self._registry.delete_permission( + permission.name, project=self.project, commit=False + ) tables_to_delete: List[FeatureView] = ( views_to_delete + sfvs_to_delete if not partial else [] # type: ignore @@ -1002,6 +924,100 @@ def apply( self._registry.commit() + def plan( + self, desired_repo_contents: RepoContents + ) -> Tuple[RegistryDiff, InfraDiff, Infra]: + """Dry-run registering objects to metadata store. + + The plan method dry-runs registering one or more definitions (e.g., Entity, FeatureView), and produces + a list of all the changes the that would be introduced in the feature repo. The changes computed by the plan + command are for informational purposes, and are not actually applied to the registry. + + Args: + desired_repo_contents: The desired repo state. + + Raises: + ValueError: The 'objects' parameter could not be parsed properly. + + Examples: + Generate a plan adding an Entity and a FeatureView. + + >>> from feast import FeatureStore, Entity, FeatureView, Feature, FileSource, RepoConfig + >>> from feast.feature_store import RepoContents + >>> from datetime import timedelta + >>> fs = FeatureStore(repo_path="project/feature_repo") + >>> driver = Entity(name="driver_id", description="driver id") + >>> driver_hourly_stats = FileSource( + ... path="project/feature_repo/data/driver_stats.parquet", + ... timestamp_field="event_timestamp", + ... created_timestamp_column="created", + ... ) + >>> driver_hourly_stats_view = FeatureView( + ... name="driver_hourly_stats", + ... entities=[driver], + ... ttl=timedelta(seconds=86400 * 1), + ... source=driver_hourly_stats, + ... ) + >>> registry_diff, infra_diff, new_infra = fs.plan(RepoContents( + ... data_sources=[driver_hourly_stats], + ... feature_views=[driver_hourly_stats_view], + ... on_demand_feature_views=list(), + ... stream_feature_views=list(), + ... entities=[driver], + ... feature_services=list(), + ... permissions=list())) # register entity and feature view + """ + # Validate and run inference on all the objects to be registered. + self._validate_all_feature_views( + desired_repo_contents.feature_views, + desired_repo_contents.on_demand_feature_views, + desired_repo_contents.stream_feature_views, + ) + _validate_data_sources(desired_repo_contents.data_sources) + self._make_inferences( + desired_repo_contents.data_sources, + desired_repo_contents.entities, + desired_repo_contents.feature_views, + desired_repo_contents.on_demand_feature_views, + desired_repo_contents.stream_feature_views, + desired_repo_contents.feature_services, + ) + + # Compute the desired difference between the current objects in the registry and + # the desired repo state. + registry_diff = diff_between( + self._registry, self.project, desired_repo_contents + ) + + # Compute the desired difference between the current infra, as stored in the registry, + # and the desired infra. + self._registry.refresh(project=self.project) + current_infra_proto = InfraProto() + current_infra_proto.CopyFrom(self._registry.proto().infra) + desired_registry_proto = desired_repo_contents.to_registry_proto() + new_infra = self._provider.plan_infra(self.config, desired_registry_proto) + new_infra_proto = new_infra.to_proto() + infra_diff = diff_infra_protos(current_infra_proto, new_infra_proto) + + return registry_diff, infra_diff, new_infra + + def _apply_diffs( + self, registry_diff: RegistryDiff, infra_diff: InfraDiff, new_infra: Infra + ): + """Applies the given diffs to the metadata store and infrastructure. + + Args: + registry_diff: The diff between the current registry and the desired registry. + infra_diff: The diff between the current infra and the desired infra. + new_infra: The desired infra. + """ + infra_diff.update() + apply_diff_to_registry( + self._registry, registry_diff, self.project, commit=False + ) + + self._registry.update_infra(new_infra, self.project, commit=True) + def teardown(self): """Tears down all local and cloud resources for the feature store.""" tables: List[FeatureView] = [] @@ -1915,6 +1931,18 @@ def get_validation_reference( ref._dataset = self.get_saved_dataset(ref.dataset_name) return ref + def list_permissions(self, allow_cache: bool = False) -> List[Permission]: + """ + Retrieves the list of permissions from the registry. + + Args: + allow_cache: Whether to allow returning permissions from a cached registry. + + Returns: + A list of data sources. + """ + return self._registry.list_permissions(self.project, allow_cache=allow_cache) + def _print_materialization_log( start_date, end_date, num_feature_views: int, online_store: str diff --git a/sdk/python/feast/infra/registry/base_registry.py b/sdk/python/feast/infra/registry/base_registry.py index 03bec64830..7283feaec8 100644 --- a/sdk/python/feast/infra/registry/base_registry.py +++ b/sdk/python/feast/infra/registry/base_registry.py @@ -28,6 +28,7 @@ from feast.feature_view import FeatureView from feast.infra.infra_object import Infra from feast.on_demand_feature_view import OnDemandFeatureView +from feast.permissions.permission import Permission from feast.project_metadata import ProjectMetadata from feast.protos.feast.core.Entity_pb2 import Entity as EntityProto from feast.protos.feast.core.FeatureService_pb2 import ( @@ -590,6 +591,68 @@ def get_user_metadata( self, project: str, feature_view: BaseFeatureView ) -> Optional[bytes]: ... + # Permission operations + @abstractmethod + def apply_permission( + self, permission: Permission, project: str, commit: bool = True + ): + """ + Registers a single permission with Feast + + Args: + permission: A permission that will be registered + project: Feast project that this permission belongs to + commit: Whether to immediately commit to the registry + """ + raise NotImplementedError + + @abstractmethod + def delete_permission(self, name: str, project: str, commit: bool = True): + """ + Deletes a permission or raises an exception if not found. + + Args: + name: Name of permission + project: Feast project that this permission belongs to + commit: Whether the change should be persisted immediately + """ + raise NotImplementedError + + @abstractmethod + def get_permission( + self, name: str, project: str, allow_cache: bool = False + ) -> Permission: + """ + Retrieves a permission. + + Args: + name: Name of permission + project: Feast project that this permission belongs to + allow_cache: Whether to allow returning this permission from a cached registry + + Returns: + Returns either the specified permission, or raises an exception if none is found + """ + raise NotImplementedError + + @abstractmethod + def list_permissions( + self, + project: str, + allow_cache: bool = False, + ) -> List[Permission]: + """ + Retrieve a list of permissions from the registry + + Args: + project: Filter permission based on project name + allow_cache: Whether to allow returning permissions from a cached registry + + Returns: + List of permissions + """ + raise NotImplementedError + @abstractmethod def proto(self) -> RegistryProto: """ diff --git a/sdk/python/feast/infra/registry/caching_registry.py b/sdk/python/feast/infra/registry/caching_registry.py index 298639028d..4494f4b960 100644 --- a/sdk/python/feast/infra/registry/caching_registry.py +++ b/sdk/python/feast/infra/registry/caching_registry.py @@ -14,6 +14,7 @@ from feast.infra.registry import proto_registry_utils from feast.infra.registry.base_registry import BaseRegistry from feast.on_demand_feature_view import OnDemandFeatureView +from feast.permissions.permission import Permission from feast.project_metadata import ProjectMetadata from feast.saved_dataset import SavedDataset, ValidationReference from feast.stream_feature_view import StreamFeatureView @@ -311,6 +312,36 @@ def _get_infra(self, project: str) -> Infra: def get_infra(self, project: str, allow_cache: bool = False) -> Infra: return self._get_infra(project) + @abstractmethod + def _get_permission(self, name: str, project: str) -> Permission: + pass + + def get_permission( + self, name: str, project: str, allow_cache: bool = False + ) -> Permission: + if allow_cache: + self._refresh_cached_registry_if_necessary() + return proto_registry_utils.get_permission( + self.cached_registry_proto, name, project + ) + return self._get_permission(name, project) + + @abstractmethod + def _list_permissions(self, project: str) -> List[Permission]: + pass + + def list_permissions( + self, + project: str, + allow_cache: bool = False, + ) -> List[Permission]: + if allow_cache: + self._refresh_cached_registry_if_necessary() + return proto_registry_utils.list_permissions( + self.cached_registry_proto, project + ) + return self._list_permissions(project) + def refresh(self, project: Optional[str] = None): if project: project_metadata = proto_registry_utils.get_project_metadata( diff --git a/sdk/python/feast/infra/registry/proto_registry_utils.py b/sdk/python/feast/infra/registry/proto_registry_utils.py index 0e85f5b0a9..4dc972f325 100644 --- a/sdk/python/feast/infra/registry/proto_registry_utils.py +++ b/sdk/python/feast/infra/registry/proto_registry_utils.py @@ -10,12 +10,14 @@ EntityNotFoundException, FeatureServiceNotFoundException, FeatureViewNotFoundException, + PermissionNotFoundException, SavedDatasetNotFound, ValidationReferenceNotFound, ) from feast.feature_service import FeatureService from feast.feature_view import FeatureView from feast.on_demand_feature_view import OnDemandFeatureView +from feast.permissions.permission import Permission from feast.project_metadata import ProjectMetadata from feast.protos.feast.core.Registry_pb2 import ProjectMetadata as ProjectMetadataProto from feast.protos.feast.core.Registry_pb2 import Registry as RegistryProto @@ -285,3 +287,21 @@ def list_project_metadata( for project_metadata in registry_proto.project_metadata if project_metadata.project == project ] + + +@registry_proto_cache +def list_permissions(registry_proto: RegistryProto, project: str) -> List[Permission]: + permissions = [] + for permission_proto in registry_proto.permissions: + if permission_proto.project == project: + permissions.append(Permission.from_proto(permission_proto)) + return permissions + + +def get_permission( + registry_proto: RegistryProto, name: str, project: str +) -> Permission: + for permission in registry_proto.permissions: + if permission.project == project and permission.name == name: + return Permission.from_proto(permission) + raise PermissionNotFoundException(name=name, project=project) diff --git a/sdk/python/feast/infra/registry/registry.py b/sdk/python/feast/infra/registry/registry.py index fe44e6253a..adb563634c 100644 --- a/sdk/python/feast/infra/registry/registry.py +++ b/sdk/python/feast/infra/registry/registry.py @@ -31,6 +31,7 @@ EntityNotFoundException, FeatureServiceNotFoundException, FeatureViewNotFoundException, + PermissionNotFoundException, ValidationReferenceNotFound, ) from feast.feature_service import FeatureService @@ -41,6 +42,7 @@ from feast.infra.registry.base_registry import BaseRegistry from feast.infra.registry.registry_store import NoopRegistryStore from feast.on_demand_feature_view import OnDemandFeatureView +from feast.permissions.permission import Permission from feast.project_metadata import ProjectMetadata from feast.protos.feast.core.Registry_pb2 import Registry as RegistryProto from feast.repo_config import RegistryConfig @@ -73,6 +75,7 @@ class FeastObjectType(Enum): ON_DEMAND_FEATURE_VIEW = "on demand feature view" STREAM_FEATURE_VIEW = "stream feature view" FEATURE_SERVICE = "feature service" + PERMISSION = "permission" @staticmethod def get_objects_from_registry( @@ -91,6 +94,7 @@ def get_objects_from_registry( FeastObjectType.FEATURE_SERVICE: registry.list_feature_services( project=project ), + FeastObjectType.PERMISSION: registry.list_permissions(project=project), } @staticmethod @@ -104,6 +108,7 @@ def get_objects_from_repo_contents( FeastObjectType.ON_DEMAND_FEATURE_VIEW: repo_contents.on_demand_feature_views, FeastObjectType.STREAM_FEATURE_VIEW: repo_contents.stream_feature_views, FeastObjectType.FEATURE_SERVICE: repo_contents.feature_services, + FeastObjectType.PERMISSION: repo_contents.permissions, } @@ -307,9 +312,6 @@ def apply_data_source( if existing_data_source_proto.name == data_source.name: del registry.data_sources[idx] data_source_proto = data_source.to_proto() - data_source_proto.data_source_class_type = ( - f"{data_source.__class__.__module__}.{data_source.__class__.__name__}" - ) data_source_proto.project = project data_source_proto.data_source_class_type = ( f"{data_source.__class__.__module__}.{data_source.__class__.__name__}" @@ -905,3 +907,44 @@ def _existing_feature_view_names_to_fvs(self) -> Dict[str, Message]: fv.spec.name: fv for fv in self.cached_registry_proto.stream_feature_views } return {**odfvs, **fvs, **sfv} + + def get_permission( + self, name: str, project: str, allow_cache: bool = False + ) -> Permission: + registry_proto = self._get_registry_proto( + project=project, allow_cache=allow_cache + ) + return proto_registry_utils.get_permission(registry_proto, name, project) + + def list_permissions( + self, project: str, allow_cache: bool = False + ) -> List[Permission]: + registry_proto = self._get_registry_proto( + project=project, allow_cache=allow_cache + ) + return proto_registry_utils.list_permissions(registry_proto, project) + + def apply_permission( + self, permission: Permission, project: str, commit: bool = True + ): + registry = self._prepare_registry_for_changes(project) + for idx, existing_permission_proto in enumerate(registry.permissions): + if existing_permission_proto.project == project: + del registry.permissions[idx] + permission_proto = permission.to_proto() + permission_proto.project = project + registry.permissions.append(permission_proto) + if commit: + self.commit() + + def delete_permission(self, name: str, project: str, commit: bool = True): + self._prepare_registry_for_changes(project) + assert self.cached_registry_proto + + for idx, permission_proto in enumerate(self.cached_registry_proto.permissions): + if permission_proto.name == name: + del self.cached_registry_proto.permissions[idx] + if commit: + self.commit() + return + raise PermissionNotFoundException(name, project) diff --git a/sdk/python/feast/infra/registry/remote.py b/sdk/python/feast/infra/registry/remote.py index 9fa6d8ebee..4ef2359cbe 100644 --- a/sdk/python/feast/infra/registry/remote.py +++ b/sdk/python/feast/infra/registry/remote.py @@ -15,6 +15,7 @@ from feast.infra.infra_object import Infra from feast.infra.registry.base_registry import BaseRegistry from feast.on_demand_feature_view import OnDemandFeatureView +from feast.permissions.permission import Permission from feast.project_metadata import ProjectMetadata from feast.protos.feast.core.Registry_pb2 import Registry as RegistryProto from feast.protos.feast.registry import RegistryServer_pb2, RegistryServer_pb2_grpc @@ -437,6 +438,51 @@ def get_user_metadata( ) -> Optional[bytes]: pass + def apply_permission( + self, permission: Permission, project: str, commit: bool = True + ): + permission_proto = permission.to_proto() + permission_proto.project = project + + request = RegistryServer_pb2.ApplyPermissionRequest( + permission=permission_proto, project=project, commit=commit + ) + + self.stub.ApplyPermission(request) + + def delete_permission(self, name: str, project: str, commit: bool = True): + request = RegistryServer_pb2.DeletePermissionRequest( + name=name, project=project, commit=commit + ) + + self.stub.DeletePermission(request) + + def get_permission( + self, name: str, project: str, allow_cache: bool = False + ) -> Permission: + request = RegistryServer_pb2.GetPermissionRequest( + name=name, project=project, allow_cache=allow_cache + ) + + response = self.stub.GetPermission(request) + + return Permission.from_proto(response) + + def list_permissions( + self, + project: str, + allow_cache: bool = False, + ) -> List[Permission]: + request = RegistryServer_pb2.ListPermissionsRequest( + project=project, allow_cache=allow_cache + ) + + response = self.stub.ListPermissions(request) + + return [ + Permission.from_proto(permission) for permission in response.permissions + ] + def proto(self) -> RegistryProto: return self.stub.Proto(Empty()) diff --git a/sdk/python/feast/infra/registry/snowflake.py b/sdk/python/feast/infra/registry/snowflake.py index ac4f52dc06..dac9a4bc40 100644 --- a/sdk/python/feast/infra/registry/snowflake.py +++ b/sdk/python/feast/infra/registry/snowflake.py @@ -18,6 +18,7 @@ EntityNotFoundException, FeatureServiceNotFoundException, FeatureViewNotFoundException, + PermissionNotFoundException, SavedDatasetNotFound, ValidationReferenceNotFound, ) @@ -31,6 +32,7 @@ execute_snowflake_statement, ) from feast.on_demand_feature_view import OnDemandFeatureView +from feast.permissions.permission import Permission from feast.project_metadata import ProjectMetadata from feast.protos.feast.core.DataSource_pb2 import DataSource as DataSourceProto from feast.protos.feast.core.Entity_pb2 import Entity as EntityProto @@ -42,6 +44,7 @@ from feast.protos.feast.core.OnDemandFeatureView_pb2 import ( OnDemandFeatureView as OnDemandFeatureViewProto, ) +from feast.protos.feast.core.Permission_pb2 import Permission as PermissionProto from feast.protos.feast.core.Registry_pb2 import Registry as RegistryProto from feast.protos.feast.core.SavedDataset_pb2 import SavedDataset as SavedDatasetProto from feast.protos.feast.core.StreamFeatureView_pb2 import ( @@ -342,6 +345,17 @@ def _apply_object( self._set_last_updated_metadata(update_datetime, project) + def apply_permission( + self, permission: Permission, project: str, commit: bool = True + ): + return self._apply_object( + "PERMISSIONS", + project, + "PERMISSION_NAME", + permission, + "PERMISSION_PROTO", + ) + # delete operations def delete_data_source(self, name: str, project: str, commit: bool = True): return self._delete_object( @@ -421,6 +435,15 @@ def _delete_object( return cursor.rowcount + def delete_permission(self, name: str, project: str, commit: bool = True): + return self._delete_object( + "PERMISSIONS", + name, + project, + "PERMISSION_NAME", + PermissionNotFoundException, + ) + # get operations def get_data_source( self, name: str, project: str, allow_cache: bool = False @@ -619,6 +642,25 @@ def _get_object( else: return None + def get_permission( + self, name: str, project: str, allow_cache: bool = False + ) -> Permission: + if allow_cache: + self._refresh_cached_registry_if_necessary() + return proto_registry_utils.get_permission( + self.cached_registry_proto, name, project + ) + return self._get_object( + "PERMISSIONS", + name, + project, + PermissionProto, + Permission, + "PERMISSION_NAME", + "PERMISSION_PROTO", + PermissionNotFoundException, + ) + # list operations def list_data_sources( self, @@ -793,6 +835,24 @@ def _list_objects( return objects return [] + def list_permissions( + self, + project: str, + allow_cache: bool = False, + ) -> List[Permission]: + if allow_cache: + self._refresh_cached_registry_if_necessary() + return proto_registry_utils.list_permissions( + self.cached_registry_proto, project + ) + return self._list_objects( + "PERMISSIONS", + project, + PermissionProto, + Permission, + "PERMISSION_PROTO", + ) + def apply_materialization( self, feature_view: FeatureView, @@ -934,6 +994,7 @@ def proto(self) -> RegistryProto: (self.list_saved_datasets, r.saved_datasets), (self.list_validation_references, r.validation_references), (self.list_project_metadata, r.project_metadata), + (self.list_permissions, r.permissions), ]: objs: List[Any] = lister(project) # type: ignore if objs: @@ -964,6 +1025,7 @@ def _get_all_projects(self) -> Set[str]: "FEATURE_VIEWS", "ON_DEMAND_FEATURE_VIEWS", "STREAM_FEATURE_VIEWS", + "PERMISSIONS", ] with GetSnowflakeConnection(self.registry_config) as conn: diff --git a/sdk/python/feast/infra/registry/sql.py b/sdk/python/feast/infra/registry/sql.py index a2b16a3a09..36ca3f6389 100644 --- a/sdk/python/feast/infra/registry/sql.py +++ b/sdk/python/feast/infra/registry/sql.py @@ -30,6 +30,7 @@ EntityNotFoundException, FeatureServiceNotFoundException, FeatureViewNotFoundException, + PermissionNotFoundException, SavedDatasetNotFound, ValidationReferenceNotFound, ) @@ -38,6 +39,7 @@ from feast.infra.infra_object import Infra from feast.infra.registry.caching_registry import CachingRegistry from feast.on_demand_feature_view import OnDemandFeatureView +from feast.permissions.permission import Permission from feast.project_metadata import ProjectMetadata from feast.protos.feast.core.DataSource_pb2 import DataSource as DataSourceProto from feast.protos.feast.core.Entity_pb2 import Entity as EntityProto @@ -49,6 +51,7 @@ from feast.protos.feast.core.OnDemandFeatureView_pb2 import ( OnDemandFeatureView as OnDemandFeatureViewProto, ) +from feast.protos.feast.core.Permission_pb2 import Permission as PermissionProto from feast.protos.feast.core.Registry_pb2 import Registry as RegistryProto from feast.protos.feast.core.SavedDataset_pb2 import SavedDataset as SavedDatasetProto from feast.protos.feast.core.StreamFeatureView_pb2 import ( @@ -149,6 +152,15 @@ Column("infra_proto", LargeBinary, nullable=False), ) +permissions = Table( + "permissions", + metadata, + Column("permission_name", String(255), primary_key=True), + Column("project_id", String(50), primary_key=True), + Column("last_updated_timestamp", BigInteger, nullable=False), + Column("permission_proto", LargeBinary, nullable=False), +) + class FeastMetadataKeys(Enum): LAST_UPDATED_TIMESTAMP = "last_updated_timestamp" @@ -207,6 +219,7 @@ def teardown(self): on_demand_feature_views, saved_datasets, validation_references, + permissions, }: with self.engine.begin() as conn: stmt = delete(t) @@ -666,6 +679,7 @@ def proto(self) -> RegistryProto: (self.list_saved_datasets, r.saved_datasets), (self.list_validation_references, r.validation_references), (self.list_project_metadata, r.project_metadata), + (self.list_permissions, r.permissions), ]: objs: List[Any] = lister(project) # type: ignore if objs: @@ -917,6 +931,7 @@ def _get_all_projects(self) -> Set[str]: feature_views, on_demand_feature_views, stream_feature_views, + permissions, }: stmt = select(table) rows = conn.execute(stmt).all() @@ -924,3 +939,41 @@ def _get_all_projects(self) -> Set[str]: projects.add(row._mapping["project_id"]) return projects + + def _get_permission(self, name: str, project: str) -> Permission: + return self._get_object( + table=permissions, + name=name, + project=project, + proto_class=PermissionProto, + python_class=Permission, + id_field_name="permission_name", + proto_field_name="permission_proto", + not_found_exception=PermissionNotFoundException, + ) + + def _list_permissions(self, project: str) -> List[Permission]: + return self._list_objects( + permissions, + project, + PermissionProto, + Permission, + "permission_proto", + ) + + def apply_permission( + self, permission: Permission, project: str, commit: bool = True + ): + return self._apply_object( + permissions, project, "permission_name", permission, "permission_proto" + ) + + def delete_permission(self, name: str, project: str, commit: bool = True): + with self.engine.begin() as conn: + stmt = delete(permissions).where( + permissions.c.permission_name == name, + permissions.c.project_id == project, + ) + rows = conn.execute(stmt) + if rows.rowcount < 1: + raise PermissionNotFoundException(name, project) diff --git a/sdk/python/feast/infra/utils/snowflake/registry/snowflake_table_creation.sql b/sdk/python/feast/infra/utils/snowflake/registry/snowflake_table_creation.sql index aa35caeac4..021d175b4e 100644 --- a/sdk/python/feast/infra/utils/snowflake/registry/snowflake_table_creation.sql +++ b/sdk/python/feast/infra/utils/snowflake/registry/snowflake_table_creation.sql @@ -80,4 +80,12 @@ CREATE TABLE IF NOT EXISTS REGISTRY_PATH."VALIDATION_REFERENCES" ( last_updated_timestamp TIMESTAMP_LTZ NOT NULL, validation_reference_proto BINARY NOT NULL, PRIMARY KEY (validation_reference_name, project_id) -) +); + +CREATE TABLE IF NOT EXISTS REGISTRY_PATH."PERMISSIONS" ( + permission_name VARCHAR, + project_id VARCHAR, + last_updated_timestamp TIMESTAMP_LTZ NOT NULL, + permission_proto BINARY NOT NULL, + PRIMARY KEY (permission_name, project_id) +); diff --git a/sdk/python/feast/infra/utils/snowflake/registry/snowflake_table_deletion.sql b/sdk/python/feast/infra/utils/snowflake/registry/snowflake_table_deletion.sql index a355c72062..780424abd1 100644 --- a/sdk/python/feast/infra/utils/snowflake/registry/snowflake_table_deletion.sql +++ b/sdk/python/feast/infra/utils/snowflake/registry/snowflake_table_deletion.sql @@ -17,3 +17,5 @@ DROP TABLE IF EXISTS REGISTRY_PATH."SAVED_DATASETS"; DROP TABLE IF EXISTS REGISTRY_PATH."STREAM_FEATURE_VIEWS"; DROP TABLE IF EXISTS REGISTRY_PATH."VALIDATION_REFERENCES" + +DROP TABLE IF EXISTS REGISTRY_PATH."PERMISSIONS" diff --git a/sdk/python/feast/permissions/matcher.py b/sdk/python/feast/permissions/matcher.py index 0270f179cc..634cbf2f0e 100644 --- a/sdk/python/feast/permissions/matcher.py +++ b/sdk/python/feast/permissions/matcher.py @@ -4,12 +4,14 @@ import logging import re -from typing import Any, Optional, get_args +from typing import TYPE_CHECKING, Any, Optional from unittest.mock import Mock -from feast.feast_object import FeastObject from feast.permissions.action import AuthzedAction +if TYPE_CHECKING: + from feast.feast_object import FeastObject + logger = logging.getLogger(__name__) @@ -22,14 +24,16 @@ def is_a_feast_object(resource: Any): Returns: `True` if the given object is one of the types in the FeastObject alias or a subclass of one of them. """ - for t in get_args(FeastObject): + from feast.feast_object import ALL_RESOURCE_TYPES + + for t in ALL_RESOURCE_TYPES: # Use isinstance to pass Mock validation if isinstance(resource, t): return True return False -def _get_type(resource: FeastObject) -> Any: +def _get_type(resource: "FeastObject") -> Any: is_mock = isinstance(resource, Mock) if not is_mock: return type(resource) @@ -42,8 +46,8 @@ def _is_abstract_type(type: Any) -> bool: def resource_match_config( - resource: FeastObject, - expected_types: list[FeastObject], + resource: "FeastObject", + expected_types: list["FeastObject"], with_subclasses: bool = True, name_pattern: Optional[str] = None, required_tags: Optional[dict[str, str]] = None, diff --git a/sdk/python/feast/permissions/permission.py b/sdk/python/feast/permissions/permission.py index ae1fa35d6f..9fd6cee45d 100644 --- a/sdk/python/feast/permissions/permission.py +++ b/sdk/python/feast/permissions/permission.py @@ -1,20 +1,23 @@ import logging +import re from abc import ABC -from typing import Optional, Union, get_args +from typing import TYPE_CHECKING, Any, Optional, Union -from feast.feast_object import FeastObject +from feast.importer import import_class from feast.permissions.action import AuthzedAction from feast.permissions.decision import DecisionStrategy from feast.permissions.matcher import actions_match_config, resource_match_config from feast.permissions.policy import AllowAll, Policy +from feast.protos.feast.core.Permission_pb2 import Permission as PermissionProto -logger = logging.getLogger(__name__) +if TYPE_CHECKING: + from feast.feast_object import FeastObject +logger = logging.getLogger(__name__) """ Constant to refer to all the managed types. """ -ALL_RESOURCE_TYPES = list(get_args(FeastObject)) class Permission(ABC): @@ -36,7 +39,7 @@ class Permission(ABC): """ _name: str - _types: list[FeastObject] + _types: list["FeastObject"] _with_subclasses: bool _name_pattern: Optional[str] _required_tags: Optional[dict[str, str]] @@ -46,17 +49,19 @@ class Permission(ABC): def __init__( self, name: str, - types: Union[list[FeastObject], FeastObject] = ALL_RESOURCE_TYPES, + types: Optional[Union[list["FeastObject"], "FeastObject"]] = None, with_subclasses: bool = True, name_pattern: Optional[str] = None, required_tags: Optional[dict[str, str]] = None, actions: Union[list[AuthzedAction], AuthzedAction] = AuthzedAction.ALL, policy: Policy = AllowAll, ): + from feast.feast_object import ALL_RESOURCE_TYPES + if not types: - raise ValueError("The list 'types' must be non-empty.") + types = ALL_RESOURCE_TYPES for t in types if isinstance(types, list) else [types]: - if t not in get_args(FeastObject): + if t not in ALL_RESOURCE_TYPES: raise ValueError(f"{t} is not one of the managed types") if actions is None or not actions: raise ValueError("The list 'actions' must be non-empty.") @@ -70,6 +75,25 @@ def __init__( self._actions = actions if isinstance(actions, list) else [actions] self._policy = policy + def __eq__(self, other): + if not isinstance(other, Permission): + raise TypeError("Comparisons should only involve Permission class objects.") + + if ( + self.name != other.name + or self.with_subclasses != other.with_subclasses + or self.name_pattern != other.name_pattern + or self.required_tags != other.required_tags + or self.policy != other.policy + or self.actions != other.actions + ): + return False + + if sorted(self.types) != sorted(other.types): + return False + + return True + _global_decision_strategy: DecisionStrategy = DecisionStrategy.UNANIMOUS @staticmethod @@ -91,7 +115,7 @@ def name(self) -> str: return self._name @property - def types(self) -> list[FeastObject]: + def types(self) -> list["FeastObject"]: return self._types @property @@ -114,7 +138,7 @@ def actions(self) -> list[AuthzedAction]: def policy(self) -> Policy: return self._policy - def match_resource(self, resource: FeastObject) -> bool: + def match_resource(self, resource: "FeastObject") -> bool: """ Returns: `True` when the given resource matches the type, name and tags filters defined in the permission. @@ -137,6 +161,68 @@ def match_actions(self, requested_actions: list[AuthzedAction]) -> bool: requested_actions=requested_actions, ) + @staticmethod + def from_proto(permission_proto: PermissionProto) -> Any: + """ + Converts permission config in protobuf spec to a Permission class object. + + Args: + permission_proto: A protobuf representation of a Permission. + + Returns: + A Permission class object. + """ + + types = [ + get_type_class_from_permission_type( + _PERMISSION_TYPES[PermissionProto.Type.Name(t)] + ) + for t in permission_proto.types + ] + actions = [ + AuthzedAction[PermissionProto.AuthzedAction.Name(action)] + for action in permission_proto.actions + ] + + permission = Permission( + permission_proto.name, + types, + permission_proto.with_subclasses, + permission_proto.name_pattern or None, + dict(permission_proto.required_tags), + actions, + Policy.from_proto(permission_proto.policy), + ) + + return permission + + def to_proto(self) -> PermissionProto: + """ + Converts a PermissionProto object to its protobuf representation. + """ + types = [ + PermissionProto.Type.Value( + re.sub(r"([a-z])([A-Z])", r"\1_\2", t.__name__).upper() + ) + for t in self.types + ] + + actions = [ + PermissionProto.AuthzedAction.Value(action.name) for action in self.actions + ] + + permission_proto = PermissionProto( + name=self.name, + types=types, + with_subclasses=self.with_subclasses, + name_pattern=self.name_pattern if self.name_pattern is not None else None, + required_tags=self.required_tags, + actions=actions, + policy=self.policy.to_proto(), + ) + + return permission_proto + def _normalize_name_pattern(name_pattern: Optional[str]): if name_pattern is not None: @@ -151,3 +237,21 @@ def _normalize_required_tags(required_tags: Optional[dict[str, str]]): for k, v in required_tags.items() } return None + + +def get_type_class_from_permission_type(permission_type: str): + module_name, config_class_name = permission_type.rsplit(".", 1) + return import_class(module_name, config_class_name) + + +_PERMISSION_TYPES = { + "FEATURE_VIEW": "feast.feature_view.FeatureView", + "ONDEMAND_FEATURE_VIEW": "feast.on_demand_feature_view.OnDemandFeatureView", + "BATCH_FEATURE_VIEW": "feast.batch_feature_view.BatchFeatureView", + "STREAM_FEATURE_VIEW": "feast.stream_feature_view.StreamFeatureView", + "ENTITY": "feast.entity.Entity", + "FEATURE_SERVICE": "feast.feature_service.FeatureService", + "DATA_SOURCE": "feast.data_source.DataSource", + "VALIDATION_REFERENCE": "feast.saved_dataset.ValidationReference", + "PERMISSION": "feast.permissions.permission.Permission", +} diff --git a/sdk/python/feast/permissions/policy.py b/sdk/python/feast/permissions/policy.py index d1fb41123b..86ec8a5dc0 100644 --- a/sdk/python/feast/permissions/policy.py +++ b/sdk/python/feast/permissions/policy.py @@ -1,6 +1,9 @@ from abc import ABC, abstractmethod +from typing import Any from feast.permissions.role_manager import RoleManager +from feast.protos.feast.core.Policy_pb2 import Policy as PolicyProto +from feast.protos.feast.core.Policy_pb2 import RoleBasedPolicy as RoleBasedPolicyProto class Policy(ABC): @@ -23,6 +26,31 @@ def validate_user(self, user: str, **kwargs) -> tuple[bool, str]: """ raise NotImplementedError + @staticmethod + def from_proto(policy_proto: PolicyProto) -> Any: + """ + Converts policy config in protobuf spec to a Policy class object. + + Args: + policy_proto: A protobuf representation of a Policy. + + Returns: + A Policy class object. + """ + policy_type = policy_proto.WhichOneof("policy_type") + if policy_type == "role_based_policy": + return RoleBasedPolicy.from_proto(policy_proto) + if policy_type is None: + return None + raise NotImplementedError(f"policy_type is unsupported: {policy_type}") + + @abstractmethod + def to_proto(self) -> PolicyProto: + """ + Converts a PolicyProto object to its protobuf representation. + """ + raise NotImplementedError + class RoleBasedPolicy(Policy): """ @@ -38,6 +66,17 @@ def __init__( ): self.roles = roles + def __eq__(self, other): + if not isinstance(other, RoleBasedPolicy): + raise TypeError( + "Comparisons should only involve RoleBasedPolicy class objects." + ) + + if sorted(self.roles) != sorted(other.roles): + return False + + return True + def get_roles(self) -> list[str]: return self.roles @@ -59,12 +98,43 @@ def validate_user(self, user: str, **kwargs) -> tuple[bool, str]: explain = "" if result else f"Requires roles {self.roles}" return (result, explain) + @staticmethod + def from_proto(policy_proto: PolicyProto) -> Any: + """ + Converts policy config in protobuf spec to a Policy class object. + + Args: + policy_proto: A protobuf representation of a Policy. + + Returns: + A RoleBasedPolicy class object. + """ + return RoleBasedPolicy(roles=list(policy_proto.role_based_policy.roles)) + + def to_proto(self) -> PolicyProto: + """ + Converts a PolicyProto object to its protobuf representation. + """ + + role_based_policy_proto = RoleBasedPolicyProto(roles=self.roles) + policy_proto = PolicyProto(role_based_policy=role_based_policy_proto) + + return policy_proto + def allow_all(self, user: str, **kwargs) -> tuple[bool, str]: return True, "" +def empty_policy(self) -> PolicyProto: + return PolicyProto() + + """ A `Policy` instance to allow execution of any action to each user """ -AllowAll = type("AllowAll", (Policy,), {Policy.validate_user.__name__: allow_all})() +AllowAll = type( + "AllowAll", + (Policy,), + {Policy.validate_user.__name__: allow_all, Policy.to_proto.__name__: empty_policy}, +)() diff --git a/sdk/python/feast/registry_server.py b/sdk/python/feast/registry_server.py index 53acb9f625..cbb4f0d32f 100644 --- a/sdk/python/feast/registry_server.py +++ b/sdk/python/feast/registry_server.py @@ -12,6 +12,7 @@ from feast.infra.infra_object import Infra from feast.infra.registry.base_registry import BaseRegistry from feast.on_demand_feature_view import OnDemandFeatureView +from feast.permissions.permission import Permission from feast.protos.feast.registry import RegistryServer_pb2, RegistryServer_pb2_grpc from feast.saved_dataset import SavedDataset, ValidationReference from feast.stream_feature_view import StreamFeatureView @@ -336,6 +337,47 @@ def GetInfra(self, request: RegistryServer_pb2.GetInfraRequest, context): project=request.project, allow_cache=request.allow_cache ).to_proto() + def ApplyPermission( + self, request: RegistryServer_pb2.ApplyPermissionRequest, context + ): + self.proxied_registry.apply_permission( + permission=Permission.from_proto(request.permission), + project=request.project, + commit=request.commit, + ) + return Empty() + + def GetPermission(self, request: RegistryServer_pb2.GetPermissionRequest, context): + permission = self.proxied_registry.get_permission( + name=request.name, project=request.project, allow_cache=request.allow_cache + ).to_proto() + + permission.project = request.project + return permission + + def ListPermissions( + self, request: RegistryServer_pb2.ListPermissionsRequest, context + ): + permissions_proto = [] + permissions = self.proxied_registry.list_permissions( + project=request.project, + allow_cache=request.allow_cache, + ) + for p in permissions: + permission_proto = p.to_proto() + permission_proto.project = request.project + permissions_proto.append(permission_proto) + + return RegistryServer_pb2.ListPermissionsResponse(permissions=permissions_proto) + + def DeletePermission( + self, request: RegistryServer_pb2.DeletePermissionRequest, context + ): + self.proxied_registry.delete_permission( + name=request.name, project=request.project, commit=request.commit + ) + return Empty() + def Commit(self, request, context): self.proxied_registry.commit() return Empty() @@ -353,6 +395,7 @@ def start_server(store: FeatureStore, port: int): RegistryServer_pb2_grpc.add_RegistryServerServicer_to_server( RegistryServer(store.registry), server ) + # TODO init security manager server.add_insecure_port(f"[::]:{port}") server.start() server.wait_for_termination() diff --git a/sdk/python/feast/repo_contents.py b/sdk/python/feast/repo_contents.py index 33b99f29b2..9893d5be4e 100644 --- a/sdk/python/feast/repo_contents.py +++ b/sdk/python/feast/repo_contents.py @@ -18,6 +18,7 @@ from feast.feature_service import FeatureService from feast.feature_view import FeatureView from feast.on_demand_feature_view import OnDemandFeatureView +from feast.permissions.permission import Permission from feast.protos.feast.core.Registry_pb2 import Registry as RegistryProto from feast.stream_feature_view import StreamFeatureView @@ -33,6 +34,7 @@ class RepoContents(NamedTuple): stream_feature_views: List[StreamFeatureView] entities: List[Entity] feature_services: List[FeatureService] + permissions: List[Permission] def to_registry_proto(self) -> RegistryProto: registry_proto = RegistryProto() @@ -50,4 +52,6 @@ def to_registry_proto(self) -> RegistryProto: registry_proto.stream_feature_views.extend( [fv.to_proto() for fv in self.stream_feature_views] ) + registry_proto.permissions.extend([p.to_proto() for p in self.permissions]) + return registry_proto diff --git a/sdk/python/feast/repo_operations.py b/sdk/python/feast/repo_operations.py index 0a89ab72ca..a025fd61ed 100644 --- a/sdk/python/feast/repo_operations.py +++ b/sdk/python/feast/repo_operations.py @@ -27,6 +27,7 @@ from feast.infra.registry.registry import FEAST_OBJECT_TYPES, FeastObjectType, Registry from feast.names import adjectives, animals from feast.on_demand_feature_view import OnDemandFeatureView +from feast.permissions.permission import Permission from feast.repo_config import RepoConfig from feast.repo_contents import RepoContents from feast.stream_feature_view import StreamFeatureView @@ -120,6 +121,7 @@ def parse_repo(repo_root: Path) -> RepoContents: feature_services=[], on_demand_feature_views=[], stream_feature_views=[], + permissions=[], ) for repo_file in get_repo_files(repo_root): @@ -201,6 +203,10 @@ def parse_repo(repo_root: Path) -> RepoContents: (obj is odfv) for odfv in res.on_demand_feature_views ): res.on_demand_feature_views.append(obj) + elif isinstance(obj, Permission) and not any( + (obj is fs) for fs in res.permissions + ): + res.permissions.append(obj) res.entities.append(DUMMY_ENTITY) return res diff --git a/sdk/python/tests/unit/local_feast_tests/test_local_feature_store.py b/sdk/python/tests/unit/local_feast_tests/test_local_feature_store.py index 0e834e314b..4d67068e4f 100644 --- a/sdk/python/tests/unit/local_feast_tests/test_local_feature_store.py +++ b/sdk/python/tests/unit/local_feast_tests/test_local_feature_store.py @@ -14,6 +14,9 @@ from feast.field import Field from feast.infra.offline_stores.file_source import FileSource from feast.infra.online_stores.sqlite import SqliteOnlineStoreConfig +from feast.permissions.action import AuthzedAction +from feast.permissions.permission import Permission +from feast.permissions.policy import RoleBasedPolicy from feast.repo_config import RepoConfig from feast.stream_feature_view import stream_feature_view from feast.types import Array, Bytes, Float32, Int64, String @@ -338,6 +341,37 @@ def test_apply_entities_and_feature_views(test_feature_store): test_feature_store.teardown() +@pytest.mark.parametrize( + "test_feature_store", + [lazy_fixture("feature_store_with_local_registry")], +) +def test_apply_permissions(test_feature_store): + assert isinstance(test_feature_store, FeatureStore) + + permission = Permission( + name="reader", + types=FeatureView, + with_subclasses=True, + policy=RoleBasedPolicy(roles=["reader"]), + actions=[AuthzedAction.READ], + ) + + # Register Permission + test_feature_store.apply([permission]) + + permissions = test_feature_store.list_permissions() + assert len(permissions) == 1 + assert permissions[0] == permission + + # delete Permission + test_feature_store.apply(objects=[], objects_to_delete=[permission], partial=False) + + permissions = test_feature_store.list_permissions() + assert len(permissions) == 0 + + test_feature_store.teardown() + + @pytest.mark.parametrize( "test_feature_store", [lazy_fixture("feature_store_with_local_registry")], diff --git a/sdk/python/tests/unit/permissions/test_permission.py b/sdk/python/tests/unit/permissions/test_permission.py index 878e8e1f8e..7f2a4431ef 100644 --- a/sdk/python/tests/unit/permissions/test_permission.py +++ b/sdk/python/tests/unit/permissions/test_permission.py @@ -1,4 +1,3 @@ -from typing import get_args from unittest.mock import Mock import assertpy @@ -7,12 +6,11 @@ from feast.batch_feature_view import BatchFeatureView from feast.data_source import DataSource from feast.entity import Entity -from feast.feast_object import FeastObject +from feast.feast_object import ALL_RESOURCE_TYPES from feast.feature_service import FeatureService from feast.feature_view import FeatureView from feast.on_demand_feature_view import OnDemandFeatureView from feast.permissions.permission import ( - ALL_RESOURCE_TYPES, AuthzedAction, DecisionStrategy, Permission, @@ -51,8 +49,8 @@ def test_defaults(): @pytest.mark.parametrize( "dict, result", [ - ({"types": None}, False), - ({"types": []}, False), + ({"types": None}, True), + ({"types": []}, True), ({"types": ALL_RESOURCE_TYPES}, True), ({"types": [FeatureView, FeatureService]}, True), ({"actions": None}, False), @@ -92,12 +90,12 @@ def test_normalized_args(): ("ALL", ALL_RESOURCE_TYPES, False), ( Mock(spec=FeatureView), - [t for t in get_args(FeastObject) if t not in [FeatureView]], + [t for t in ALL_RESOURCE_TYPES if t not in [FeatureView]], False, ), ( Mock(spec=OnDemandFeatureView), - [t for t in get_args(FeastObject) if t not in [OnDemandFeatureView]], + [t for t in ALL_RESOURCE_TYPES if t not in [OnDemandFeatureView]], False, ), # OnDemandFeatureView is a BaseFeatureView ( @@ -107,11 +105,7 @@ def test_normalized_args(): ), # BatchFeatureView is a FeatureView ( Mock(spec=BatchFeatureView), - [ - t - for t in get_args(FeastObject) - if t not in [FeatureView, BatchFeatureView] - ], + [t for t in ALL_RESOURCE_TYPES if t not in [FeatureView, BatchFeatureView]], False, ), ( @@ -123,34 +117,39 @@ def test_normalized_args(): Mock(spec=StreamFeatureView), [ t - for t in get_args(FeastObject) + for t in ALL_RESOURCE_TYPES if t not in [FeatureView, StreamFeatureView] ], False, ), ( Mock(spec=Entity), - [t for t in get_args(FeastObject) if t not in [Entity]], + [t for t in ALL_RESOURCE_TYPES if t not in [Entity]], False, ), ( Mock(spec=FeatureService), - [t for t in get_args(FeastObject) if t not in [FeatureService]], + [t for t in ALL_RESOURCE_TYPES if t not in [FeatureService]], False, ), ( Mock(spec=DataSource), - [t for t in get_args(FeastObject) if t not in [DataSource]], + [t for t in ALL_RESOURCE_TYPES if t not in [DataSource]], False, ), ( Mock(spec=ValidationReference), - [t for t in get_args(FeastObject) if t not in [ValidationReference]], + [t for t in ALL_RESOURCE_TYPES if t not in [ValidationReference]], + False, + ), + ( + Mock(spec=Permission), + [t for t in ALL_RESOURCE_TYPES if t not in [Permission]], False, ), ] - + [(Mock(spec=t), ALL_RESOURCE_TYPES, True) for t in get_args(FeastObject)] - + [(Mock(spec=t), [t], True) for t in get_args(FeastObject)], + + [(Mock(spec=t), ALL_RESOURCE_TYPES, True) for t in ALL_RESOURCE_TYPES] + + [(Mock(spec=t), [t], True) for t in ALL_RESOURCE_TYPES], ) def test_match_resource_with_subclasses(resource, types, result): p = Permission(name="test", types=types, with_subclasses=True) @@ -166,47 +165,52 @@ def test_match_resource_with_subclasses(resource, types, result): ("ALL", ALL_RESOURCE_TYPES, False), ( Mock(spec=FeatureView), - [t for t in get_args(FeastObject) if t not in [FeatureView]], + [t for t in ALL_RESOURCE_TYPES if t not in [FeatureView]], False, ), ( Mock(spec=OnDemandFeatureView), - [t for t in get_args(FeastObject) if t not in [OnDemandFeatureView]], + [t for t in ALL_RESOURCE_TYPES if t not in [OnDemandFeatureView]], False, ), ( Mock(spec=BatchFeatureView), - [t for t in get_args(FeastObject) if t not in [BatchFeatureView]], + [t for t in ALL_RESOURCE_TYPES if t not in [BatchFeatureView]], False, ), ( Mock(spec=StreamFeatureView), - [t for t in get_args(FeastObject) if t not in [StreamFeatureView]], + [t for t in ALL_RESOURCE_TYPES if t not in [StreamFeatureView]], False, ), ( Mock(spec=Entity), - [t for t in get_args(FeastObject) if t not in [Entity]], + [t for t in ALL_RESOURCE_TYPES if t not in [Entity]], False, ), ( Mock(spec=FeatureService), - [t for t in get_args(FeastObject) if t not in [FeatureService]], + [t for t in ALL_RESOURCE_TYPES if t not in [FeatureService]], False, ), ( Mock(spec=DataSource), - [t for t in get_args(FeastObject) if t not in [DataSource]], + [t for t in ALL_RESOURCE_TYPES if t not in [DataSource]], False, ), ( Mock(spec=ValidationReference), - [t for t in get_args(FeastObject) if t not in [ValidationReference]], + [t for t in ALL_RESOURCE_TYPES if t not in [ValidationReference]], + False, + ), + ( + Mock(spec=Permission), + [t for t in ALL_RESOURCE_TYPES if t not in [Permission]], False, ), ] - + [(Mock(spec=t), ALL_RESOURCE_TYPES, True) for t in get_args(FeastObject)] - + [(Mock(spec=t), [t], True) for t in get_args(FeastObject)], + + [(Mock(spec=t), ALL_RESOURCE_TYPES, True) for t in ALL_RESOURCE_TYPES] + + [(Mock(spec=t), [t], True) for t in ALL_RESOURCE_TYPES], ) def test_match_resource_no_subclasses(resource, types, result): p = Permission(name="test", types=types, with_subclasses=False) @@ -224,7 +228,7 @@ def test_match_resource_no_subclasses(resource, types, result): ) def test_resource_match_with_name_filter(pattern, name, match): p = Permission(name="test", name_pattern=pattern) - for t in get_args(FeastObject): + for t in ALL_RESOURCE_TYPES: resource = Mock(spec=t) resource.name = name assertpy.assert_that(p.match_resource(resource)).is_equal_to(match) @@ -243,7 +247,7 @@ def test_resource_match_with_name_filter(pattern, name, match): def test_resource_match_with_tags(required_tags, tags, result): # Missing tags p = Permission(name="test", required_tags=required_tags) - for t in get_args(FeastObject): + for t in ALL_RESOURCE_TYPES: resource = Mock(spec=t) resource.name = "test" resource.tags = tags From a9d7a92506b812f81a2c46cdd63f19a9942cba1e Mon Sep 17 00:00:00 2001 From: Theodor Mihalache Date: Fri, 28 Jun 2024 10:11:16 -0400 Subject: [PATCH 021/169] Applied review comments Signed-off-by: Theodor Mihalache Signed-off-by: Abdul Hameed --- protos/feast/core/Permission.proto | 2 +- protos/feast/core/Policy.proto | 2 +- protos/feast/registry/RegistryServer.proto | 2 +- sdk/python/feast/feature_store.py | 188 ++++++++++----------- 4 files changed, 97 insertions(+), 97 deletions(-) diff --git a/protos/feast/core/Permission.proto b/protos/feast/core/Permission.proto index 774b2b4345..7d54d265f1 100644 --- a/protos/feast/core/Permission.proto +++ b/protos/feast/core/Permission.proto @@ -54,4 +54,4 @@ message Permission { // the policy. Policy policy = 8; -} \ No newline at end of file +} diff --git a/protos/feast/core/Policy.proto b/protos/feast/core/Policy.proto index f12b5f1a56..e4313535ec 100644 --- a/protos/feast/core/Policy.proto +++ b/protos/feast/core/Policy.proto @@ -20,4 +20,4 @@ message Policy { message RoleBasedPolicy { // List of roles in this policy. repeated string roles = 1; -} \ No newline at end of file +} diff --git a/protos/feast/registry/RegistryServer.proto b/protos/feast/registry/RegistryServer.proto index 2cfa23f9f1..e441a71077 100644 --- a/protos/feast/registry/RegistryServer.proto +++ b/protos/feast/registry/RegistryServer.proto @@ -352,4 +352,4 @@ message DeletePermissionRequest { string name = 1; string project = 2; bool commit = 3; -} \ No newline at end of file +} diff --git a/sdk/python/feast/feature_store.py b/sdk/python/feast/feature_store.py index 5cd31f7180..68a80774e4 100644 --- a/sdk/python/feast/feature_store.py +++ b/sdk/python/feast/feature_store.py @@ -695,6 +695,100 @@ def _get_feature_views_to_materialize( return feature_views_to_materialize + def plan( + self, desired_repo_contents: RepoContents + ) -> Tuple[RegistryDiff, InfraDiff, Infra]: + """Dry-run registering objects to metadata store. + + The plan method dry-runs registering one or more definitions (e.g., Entity, FeatureView), and produces + a list of all the changes the that would be introduced in the feature repo. The changes computed by the plan + command are for informational purposes, and are not actually applied to the registry. + + Args: + desired_repo_contents: The desired repo state. + + Raises: + ValueError: The 'objects' parameter could not be parsed properly. + + Examples: + Generate a plan adding an Entity and a FeatureView. + + >>> from feast import FeatureStore, Entity, FeatureView, Feature, FileSource, RepoConfig + >>> from feast.feature_store import RepoContents + >>> from datetime import timedelta + >>> fs = FeatureStore(repo_path="project/feature_repo") + >>> driver = Entity(name="driver_id", description="driver id") + >>> driver_hourly_stats = FileSource( + ... path="project/feature_repo/data/driver_stats.parquet", + ... timestamp_field="event_timestamp", + ... created_timestamp_column="created", + ... ) + >>> driver_hourly_stats_view = FeatureView( + ... name="driver_hourly_stats", + ... entities=[driver], + ... ttl=timedelta(seconds=86400 * 1), + ... source=driver_hourly_stats, + ... ) + >>> registry_diff, infra_diff, new_infra = fs.plan(RepoContents( + ... data_sources=[driver_hourly_stats], + ... feature_views=[driver_hourly_stats_view], + ... on_demand_feature_views=list(), + ... stream_feature_views=list(), + ... entities=[driver], + ... feature_services=list(), + ... permissions=list())) # register entity and feature view + """ + # Validate and run inference on all the objects to be registered. + self._validate_all_feature_views( + desired_repo_contents.feature_views, + desired_repo_contents.on_demand_feature_views, + desired_repo_contents.stream_feature_views, + ) + _validate_data_sources(desired_repo_contents.data_sources) + self._make_inferences( + desired_repo_contents.data_sources, + desired_repo_contents.entities, + desired_repo_contents.feature_views, + desired_repo_contents.on_demand_feature_views, + desired_repo_contents.stream_feature_views, + desired_repo_contents.feature_services, + ) + + # Compute the desired difference between the current objects in the registry and + # the desired repo state. + registry_diff = diff_between( + self._registry, self.project, desired_repo_contents + ) + + # Compute the desired difference between the current infra, as stored in the registry, + # and the desired infra. + self._registry.refresh(project=self.project) + current_infra_proto = InfraProto() + current_infra_proto.CopyFrom(self._registry.proto().infra) + desired_registry_proto = desired_repo_contents.to_registry_proto() + new_infra = self._provider.plan_infra(self.config, desired_registry_proto) + new_infra_proto = new_infra.to_proto() + infra_diff = diff_infra_protos(current_infra_proto, new_infra_proto) + + return registry_diff, infra_diff, new_infra + + def _apply_diffs( + self, registry_diff: RegistryDiff, infra_diff: InfraDiff, new_infra: Infra + ): + """Applies the given diffs to the metadata store and infrastructure. + + Args: + registry_diff: The diff between the current registry and the desired registry. + infra_diff: The diff between the current infra and the desired infra. + new_infra: The desired infra. + """ + infra_diff.update() + apply_diff_to_registry( + self._registry, registry_diff, self.project, commit=False + ) + + self._registry.update_infra(new_infra, self.project, commit=True) + def apply( self, objects: Union[ @@ -924,100 +1018,6 @@ def apply( self._registry.commit() - def plan( - self, desired_repo_contents: RepoContents - ) -> Tuple[RegistryDiff, InfraDiff, Infra]: - """Dry-run registering objects to metadata store. - - The plan method dry-runs registering one or more definitions (e.g., Entity, FeatureView), and produces - a list of all the changes the that would be introduced in the feature repo. The changes computed by the plan - command are for informational purposes, and are not actually applied to the registry. - - Args: - desired_repo_contents: The desired repo state. - - Raises: - ValueError: The 'objects' parameter could not be parsed properly. - - Examples: - Generate a plan adding an Entity and a FeatureView. - - >>> from feast import FeatureStore, Entity, FeatureView, Feature, FileSource, RepoConfig - >>> from feast.feature_store import RepoContents - >>> from datetime import timedelta - >>> fs = FeatureStore(repo_path="project/feature_repo") - >>> driver = Entity(name="driver_id", description="driver id") - >>> driver_hourly_stats = FileSource( - ... path="project/feature_repo/data/driver_stats.parquet", - ... timestamp_field="event_timestamp", - ... created_timestamp_column="created", - ... ) - >>> driver_hourly_stats_view = FeatureView( - ... name="driver_hourly_stats", - ... entities=[driver], - ... ttl=timedelta(seconds=86400 * 1), - ... source=driver_hourly_stats, - ... ) - >>> registry_diff, infra_diff, new_infra = fs.plan(RepoContents( - ... data_sources=[driver_hourly_stats], - ... feature_views=[driver_hourly_stats_view], - ... on_demand_feature_views=list(), - ... stream_feature_views=list(), - ... entities=[driver], - ... feature_services=list(), - ... permissions=list())) # register entity and feature view - """ - # Validate and run inference on all the objects to be registered. - self._validate_all_feature_views( - desired_repo_contents.feature_views, - desired_repo_contents.on_demand_feature_views, - desired_repo_contents.stream_feature_views, - ) - _validate_data_sources(desired_repo_contents.data_sources) - self._make_inferences( - desired_repo_contents.data_sources, - desired_repo_contents.entities, - desired_repo_contents.feature_views, - desired_repo_contents.on_demand_feature_views, - desired_repo_contents.stream_feature_views, - desired_repo_contents.feature_services, - ) - - # Compute the desired difference between the current objects in the registry and - # the desired repo state. - registry_diff = diff_between( - self._registry, self.project, desired_repo_contents - ) - - # Compute the desired difference between the current infra, as stored in the registry, - # and the desired infra. - self._registry.refresh(project=self.project) - current_infra_proto = InfraProto() - current_infra_proto.CopyFrom(self._registry.proto().infra) - desired_registry_proto = desired_repo_contents.to_registry_proto() - new_infra = self._provider.plan_infra(self.config, desired_registry_proto) - new_infra_proto = new_infra.to_proto() - infra_diff = diff_infra_protos(current_infra_proto, new_infra_proto) - - return registry_diff, infra_diff, new_infra - - def _apply_diffs( - self, registry_diff: RegistryDiff, infra_diff: InfraDiff, new_infra: Infra - ): - """Applies the given diffs to the metadata store and infrastructure. - - Args: - registry_diff: The diff between the current registry and the desired registry. - infra_diff: The diff between the current infra and the desired infra. - new_infra: The desired infra. - """ - infra_diff.update() - apply_diff_to_registry( - self._registry, registry_diff, self.project, commit=False - ) - - self._registry.update_infra(new_infra, self.project, commit=True) - def teardown(self): """Tears down all local and cloud resources for the feature store.""" tables: List[FeatureView] = [] From 1534a8dbc886ebb8349e5302568ec0f8acbc0228 Mon Sep 17 00:00:00 2001 From: Theodor Mihalache Date: Fri, 28 Jun 2024 12:06:52 -0400 Subject: [PATCH 022/169] Store and Manage permissions in the Registry - Fixes to code - Made test case broader Signed-off-by: Theodor Mihalache Signed-off-by: Abdul Hameed --- protos/feast/core/Permission.proto | 5 +++-- sdk/python/feast/permissions/permission.py | 5 +++-- .../tests/unit/local_feast_tests/test_local_feature_store.py | 3 ++- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/protos/feast/core/Permission.proto b/protos/feast/core/Permission.proto index 7d54d265f1..8c56fa2f0d 100644 --- a/protos/feast/core/Permission.proto +++ b/protos/feast/core/Permission.proto @@ -31,14 +31,15 @@ message Permission { enum Type { FEATURE_VIEW = 0; - ONDEMAND_FEATURE_VIEW = 1; + ON_DEMAND_FEATURE_VIEW = 1; BATCH_FEATURE_VIEW = 2; STREAM_FEATURE_VIEW= 3; ENTITY = 4; FEATURE_SERVICE = 5; DATA_SOURCE = 6; VALIDATION_REFERENCE = 7; - PERMISSION = 8; + SAVED_DATASET = 8; + PERMISSION = 9; } repeated Type types = 3; diff --git a/sdk/python/feast/permissions/permission.py b/sdk/python/feast/permissions/permission.py index 9fd6cee45d..195b59a136 100644 --- a/sdk/python/feast/permissions/permission.py +++ b/sdk/python/feast/permissions/permission.py @@ -89,7 +89,7 @@ def __eq__(self, other): ): return False - if sorted(self.types) != sorted(other.types): + if set(self.types) != set(other.types): return False return True @@ -246,12 +246,13 @@ def get_type_class_from_permission_type(permission_type: str): _PERMISSION_TYPES = { "FEATURE_VIEW": "feast.feature_view.FeatureView", - "ONDEMAND_FEATURE_VIEW": "feast.on_demand_feature_view.OnDemandFeatureView", + "ON_DEMAND_FEATURE_VIEW": "feast.on_demand_feature_view.OnDemandFeatureView", "BATCH_FEATURE_VIEW": "feast.batch_feature_view.BatchFeatureView", "STREAM_FEATURE_VIEW": "feast.stream_feature_view.StreamFeatureView", "ENTITY": "feast.entity.Entity", "FEATURE_SERVICE": "feast.feature_service.FeatureService", "DATA_SOURCE": "feast.data_source.DataSource", "VALIDATION_REFERENCE": "feast.saved_dataset.ValidationReference", + "SAVED_DATASET": "feast.saved_dataset.SavedDataset", "PERMISSION": "feast.permissions.permission.Permission", } diff --git a/sdk/python/tests/unit/local_feast_tests/test_local_feature_store.py b/sdk/python/tests/unit/local_feast_tests/test_local_feature_store.py index 4d67068e4f..0316309c43 100644 --- a/sdk/python/tests/unit/local_feast_tests/test_local_feature_store.py +++ b/sdk/python/tests/unit/local_feast_tests/test_local_feature_store.py @@ -23,6 +23,7 @@ from tests.integration.feature_repos.universal.feature_views import TAGS from tests.utils.cli_repo_creator import CliRunner, get_example_repo from tests.utils.data_source_test_creator import prep_file_source +from feast.feast_object import ALL_RESOURCE_TYPES @pytest.mark.parametrize( @@ -350,7 +351,7 @@ def test_apply_permissions(test_feature_store): permission = Permission( name="reader", - types=FeatureView, + types=ALL_RESOURCE_TYPES, with_subclasses=True, policy=RoleBasedPolicy(roles=["reader"]), actions=[AuthzedAction.READ], From a21845d331842e7ecd3674921e47b57ad479a112 Mon Sep 17 00:00:00 2001 From: Theodor Mihalache Date: Fri, 28 Jun 2024 12:48:31 -0400 Subject: [PATCH 023/169] Store and Manage permissions in the Registry - Fixed incorrectly recognized linter error Signed-off-by: Theodor Mihalache Signed-off-by: Abdul Hameed --- sdk/python/feast/permissions/permission.py | 2 +- .../tests/unit/local_feast_tests/test_local_feature_store.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sdk/python/feast/permissions/permission.py b/sdk/python/feast/permissions/permission.py index 195b59a136..97c57b32c3 100644 --- a/sdk/python/feast/permissions/permission.py +++ b/sdk/python/feast/permissions/permission.py @@ -202,7 +202,7 @@ def to_proto(self) -> PermissionProto: """ types = [ PermissionProto.Type.Value( - re.sub(r"([a-z])([A-Z])", r"\1_\2", t.__name__).upper() + re.sub(r"([a-z])([A-Z])", r"\1_\2", t.__name__).upper() # type: ignore[union-attr] ) for t in self.types ] diff --git a/sdk/python/tests/unit/local_feast_tests/test_local_feature_store.py b/sdk/python/tests/unit/local_feast_tests/test_local_feature_store.py index 0316309c43..10fc265d2e 100644 --- a/sdk/python/tests/unit/local_feast_tests/test_local_feature_store.py +++ b/sdk/python/tests/unit/local_feast_tests/test_local_feature_store.py @@ -9,6 +9,7 @@ from feast.data_format import AvroFormat, ParquetFormat from feast.data_source import KafkaSource from feast.entity import Entity +from feast.feast_object import ALL_RESOURCE_TYPES from feast.feature_store import FeatureStore from feast.feature_view import FeatureView from feast.field import Field @@ -23,7 +24,6 @@ from tests.integration.feature_repos.universal.feature_views import TAGS from tests.utils.cli_repo_creator import CliRunner, get_example_repo from tests.utils.data_source_test_creator import prep_file_source -from feast.feast_object import ALL_RESOURCE_TYPES @pytest.mark.parametrize( From e06a63158b1098af5e04bd3c1e4d472ef8038ce9 Mon Sep 17 00:00:00 2001 From: Theodor Mihalache Date: Mon, 1 Jul 2024 11:04:07 -0400 Subject: [PATCH 024/169] Store and Manage permissions in the Registry - Added test - Fixed missing property to permission - Changed code following review Signed-off-by: Theodor Mihalache Signed-off-by: Abdul Hameed --- protos/feast/core/Permission.proto | 3 ++ sdk/python/feast/permissions/permission.py | 11 +++- sdk/python/feast/registry_server.py | 18 +++---- sdk/python/feast/repo_operations.py | 2 +- .../registration/test_universal_registry.py | 51 +++++++++++++++++++ 5 files changed, 73 insertions(+), 12 deletions(-) diff --git a/protos/feast/core/Permission.proto b/protos/feast/core/Permission.proto index 8c56fa2f0d..60a153d1cb 100644 --- a/protos/feast/core/Permission.proto +++ b/protos/feast/core/Permission.proto @@ -55,4 +55,7 @@ message Permission { // the policy. Policy policy = 8; + + // User defined metadata + map tags = 9; } diff --git a/sdk/python/feast/permissions/permission.py b/sdk/python/feast/permissions/permission.py index 97c57b32c3..57aa0afd59 100644 --- a/sdk/python/feast/permissions/permission.py +++ b/sdk/python/feast/permissions/permission.py @@ -1,7 +1,7 @@ import logging import re from abc import ABC -from typing import TYPE_CHECKING, Any, Optional, Union +from typing import TYPE_CHECKING, Any, Dict, Optional, Union from feast.importer import import_class from feast.permissions.action import AuthzedAction @@ -45,6 +45,7 @@ class Permission(ABC): _required_tags: Optional[dict[str, str]] _actions: list[AuthzedAction] _policy: Policy + _tags: Dict[str, str] def __init__( self, @@ -55,6 +56,7 @@ def __init__( required_tags: Optional[dict[str, str]] = None, actions: Union[list[AuthzedAction], AuthzedAction] = AuthzedAction.ALL, policy: Policy = AllowAll, + tags: Optional[Dict[str, str]] = None, ): from feast.feast_object import ALL_RESOURCE_TYPES @@ -74,6 +76,7 @@ def __init__( self._required_tags = _normalize_required_tags(required_tags) self._actions = actions if isinstance(actions, list) else [actions] self._policy = policy + self._tags = tags or {} def __eq__(self, other): if not isinstance(other, Permission): @@ -138,6 +141,10 @@ def actions(self) -> list[AuthzedAction]: def policy(self) -> Policy: return self._policy + @property + def tags(self) -> Dict[str, str]: + return self._tags + def match_resource(self, resource: "FeastObject") -> bool: """ Returns: @@ -192,6 +199,7 @@ def from_proto(permission_proto: PermissionProto) -> Any: dict(permission_proto.required_tags), actions, Policy.from_proto(permission_proto.policy), + dict(permission_proto.tags) or None, ) return permission @@ -219,6 +227,7 @@ def to_proto(self) -> PermissionProto: required_tags=self.required_tags, actions=actions, policy=self.policy.to_proto(), + tags=self._tags if self._tags is not None else None, ) return permission_proto diff --git a/sdk/python/feast/registry_server.py b/sdk/python/feast/registry_server.py index cbb4f0d32f..50fcc79b2d 100644 --- a/sdk/python/feast/registry_server.py +++ b/sdk/python/feast/registry_server.py @@ -358,17 +358,15 @@ def GetPermission(self, request: RegistryServer_pb2.GetPermissionRequest, contex def ListPermissions( self, request: RegistryServer_pb2.ListPermissionsRequest, context ): - permissions_proto = [] - permissions = self.proxied_registry.list_permissions( - project=request.project, - allow_cache=request.allow_cache, + return RegistryServer_pb2.ListPermissionsResponse( + permissions=[ + permission.to_proto() + for permission in self.proxied_registry.list_permissions( + project=request.project, + allow_cache=request.allow_cache, + ) + ] ) - for p in permissions: - permission_proto = p.to_proto() - permission_proto.project = request.project - permissions_proto.append(permission_proto) - - return RegistryServer_pb2.ListPermissionsResponse(permissions=permissions_proto) def DeletePermission( self, request: RegistryServer_pb2.DeletePermissionRequest, context diff --git a/sdk/python/feast/repo_operations.py b/sdk/python/feast/repo_operations.py index a025fd61ed..50f9a9ccc0 100644 --- a/sdk/python/feast/repo_operations.py +++ b/sdk/python/feast/repo_operations.py @@ -204,7 +204,7 @@ def parse_repo(repo_root: Path) -> RepoContents: ): res.on_demand_feature_views.append(obj) elif isinstance(obj, Permission) and not any( - (obj is fs) for fs in res.permissions + (obj is p) for p in res.permissions ): res.permissions.append(obj) diff --git a/sdk/python/tests/integration/registration/test_universal_registry.py b/sdk/python/tests/integration/registration/test_universal_registry.py index 9dcd1b5b91..72e6aa6ca3 100644 --- a/sdk/python/tests/integration/registration/test_universal_registry.py +++ b/sdk/python/tests/integration/registration/test_universal_registry.py @@ -32,6 +32,7 @@ from feast.data_source import KafkaSource from feast.entity import Entity from feast.errors import FeatureViewNotFoundException +from feast.feast_object import ALL_RESOURCE_TYPES from feast.feature_view import FeatureView from feast.field import Field from feast.infra.infra_object import Infra @@ -40,6 +41,9 @@ from feast.infra.registry.remote import RemoteRegistry, RemoteRegistryConfig from feast.infra.registry.sql import SqlRegistry from feast.on_demand_feature_view import on_demand_feature_view +from feast.permissions.action import AuthzedAction +from feast.permissions.permission import Permission +from feast.permissions.policy import RoleBasedPolicy from feast.protos.feast.registry import RegistryServer_pb2, RegistryServer_pb2_grpc from feast.registry_server import RegistryServer from feast.repo_config import RegistryConfig @@ -566,6 +570,53 @@ def location_features_from_push(inputs: pd.DataFrame) -> pd.DataFrame: test_registry.teardown() +@pytest.mark.integration +@pytest.mark.parametrize( + "test_registry", + all_fixtures, +) +def test_apply_permissions(test_registry): + # Create Permission + permission1 = Permission( + name="reader", + types=ALL_RESOURCE_TYPES, + with_subclasses=True, + policy=RoleBasedPolicy(roles=["reader"]), + actions=[AuthzedAction.READ], + ) + + # Create Permission + permission2 = Permission( + name="writer", + types=ALL_RESOURCE_TYPES, + with_subclasses=True, + policy=RoleBasedPolicy(roles=["writer"]), + actions=[AuthzedAction.WRITE], + ) + + project = "project" + + # Register permissions + test_registry.apply_permission(permission1, project, commit=False) + test_registry.apply_permission(permission2, project, commit=False) + + permissions = test_registry.list_permissions(project) + assert len(permissions) == 2 + p1 = permissions[0] + p2 = permissions[1] + assert p1 == permission1 + assert p2 == permission2 + + # Delete permissions + test_registry.delete_permission(permission1.name, project, commit=False) + test_registry.delete_permission(permission2.name, project, commit=False) + + permissions = test_registry.list_permissions(project) + assert len(permissions) == 0 + + test_registry.teardown() + + @pytest.mark.integration @pytest.mark.parametrize( "test_registry", From 4fadb7b879c3103cf6239cd0a6e3636beaafbb23 Mon Sep 17 00:00:00 2001 From: Theodor Mihalache Date: Thu, 27 Jun 2024 16:26:18 -0400 Subject: [PATCH 025/169] Store and Manage permissions in the Registry Signed-off-by: Theodor Mihalache Signed-off-by: Abdul Hameed --- sdk/python/feast/errors.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/sdk/python/feast/errors.py b/sdk/python/feast/errors.py index ff8da63ffa..9fb0ca3edf 100644 --- a/sdk/python/feast/errors.py +++ b/sdk/python/feast/errors.py @@ -404,3 +404,8 @@ def __init__(self, query: str): class ZeroColumnQueryResult(Exception): def __init__(self, query: str): super().__init__(f"This query returned zero columns:\n{query}") + + +class PermissionNotFoundException(Exception): + def __init__(self, name, project): + super().__init__(f"Permission {name} does not exist in project {project}") From 7d17c78d595a2258e55f319db6462b4270b065cf Mon Sep 17 00:00:00 2001 From: Theodor Mihalache Date: Fri, 28 Jun 2024 12:06:52 -0400 Subject: [PATCH 026/169] Store and Manage permissions in the Registry - Fixes to code - Made test case broader Signed-off-by: Theodor Mihalache Signed-off-by: Abdul Hameed --- .../tests/unit/local_feast_tests/test_local_feature_store.py | 1 + 1 file changed, 1 insertion(+) diff --git a/sdk/python/tests/unit/local_feast_tests/test_local_feature_store.py b/sdk/python/tests/unit/local_feast_tests/test_local_feature_store.py index 10fc265d2e..e9652a9cc0 100644 --- a/sdk/python/tests/unit/local_feast_tests/test_local_feature_store.py +++ b/sdk/python/tests/unit/local_feast_tests/test_local_feature_store.py @@ -24,6 +24,7 @@ from tests.integration.feature_repos.universal.feature_views import TAGS from tests.utils.cli_repo_creator import CliRunner, get_example_repo from tests.utils.data_source_test_creator import prep_file_source +from feast.feast_object import ALL_RESOURCE_TYPES @pytest.mark.parametrize( From ec079a617b8be4681dde123f9a52482257560830 Mon Sep 17 00:00:00 2001 From: Theodor Mihalache Date: Fri, 28 Jun 2024 12:48:31 -0400 Subject: [PATCH 027/169] Store and Manage permissions in the Registry - Fixed incorrectly recognized linter error Signed-off-by: Theodor Mihalache Signed-off-by: Abdul Hameed --- .../tests/unit/local_feast_tests/test_local_feature_store.py | 1 - 1 file changed, 1 deletion(-) diff --git a/sdk/python/tests/unit/local_feast_tests/test_local_feature_store.py b/sdk/python/tests/unit/local_feast_tests/test_local_feature_store.py index e9652a9cc0..10fc265d2e 100644 --- a/sdk/python/tests/unit/local_feast_tests/test_local_feature_store.py +++ b/sdk/python/tests/unit/local_feast_tests/test_local_feature_store.py @@ -24,7 +24,6 @@ from tests.integration.feature_repos.universal.feature_views import TAGS from tests.utils.cli_repo_creator import CliRunner, get_example_repo from tests.utils.data_source_test_creator import prep_file_source -from feast.feast_object import ALL_RESOURCE_TYPES @pytest.mark.parametrize( From aef0747353c3ac03be4212bb92f09a194f372ee6 Mon Sep 17 00:00:00 2001 From: Theodor Mihalache Date: Mon, 1 Jul 2024 14:06:07 -0400 Subject: [PATCH 028/169] Store and Manage permissions in the Registry - Added test - Fixed delete and apply permission Signed-off-by: Theodor Mihalache Signed-off-by: Abdul Hameed --- sdk/python/feast/infra/registry/registry.py | 4 ++-- .../integration/registration/test_universal_registry.py | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/sdk/python/feast/infra/registry/registry.py b/sdk/python/feast/infra/registry/registry.py index adb563634c..4bbcff1b13 100644 --- a/sdk/python/feast/infra/registry/registry.py +++ b/sdk/python/feast/infra/registry/registry.py @@ -929,7 +929,7 @@ def apply_permission( ): registry = self._prepare_registry_for_changes(project) for idx, existing_permission_proto in enumerate(registry.permissions): - if existing_permission_proto.project == project: + if existing_permission_proto.name == permission.name and existing_permission_proto.project == project: del registry.permissions[idx] permission_proto = permission.to_proto() permission_proto.project = project @@ -942,7 +942,7 @@ def delete_permission(self, name: str, project: str, commit: bool = True): assert self.cached_registry_proto for idx, permission_proto in enumerate(self.cached_registry_proto.permissions): - if permission_proto.name == name: + if permission_proto.name == name and permission_proto.project == project: del self.cached_registry_proto.permissions[idx] if commit: self.commit() diff --git a/sdk/python/tests/integration/registration/test_universal_registry.py b/sdk/python/tests/integration/registration/test_universal_registry.py index 72e6aa6ca3..8a8006b606 100644 --- a/sdk/python/tests/integration/registration/test_universal_registry.py +++ b/sdk/python/tests/integration/registration/test_universal_registry.py @@ -597,8 +597,8 @@ def test_apply_permissions(test_registry): project = "project" # Register permissions - test_registry.apply_permission(permission1, project, commit=False) - test_registry.apply_permission(permission2, project, commit=False) + test_registry.apply_permission(permission1, project) + test_registry.apply_permission(permission2, project) permissions = test_registry.list_permissions(project) assert len(permissions) == 2 @@ -608,8 +608,8 @@ def test_apply_permissions(test_registry): assert p2 == permission2 # Delete permissions - test_registry.delete_permission(permission1.name, project, commit=False) - test_registry.delete_permission(permission2.name, project, commit=False) + test_registry.delete_permission(permission1.name, project) + test_registry.delete_permission(permission2.name, project) permissions = test_registry.list_permissions(project) assert len(permissions) == 0 From 14ea4c2d5aa4917467c2e961b39aef44cac29392 Mon Sep 17 00:00:00 2001 From: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Date: Tue, 2 Jul 2024 13:13:51 +0200 Subject: [PATCH 029/169] replaced aggregated actions with aliases for QUERY and WRITE and ALL Signed-off-by: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Signed-off-by: Abdul Hameed --- sdk/python/feast/infra/registry/registry.py | 5 ++++- sdk/python/feast/permissions/action.py | 18 +++++++++++++++--- sdk/python/feast/permissions/matcher.py | 4 ---- sdk/python/feast/permissions/permission.py | 6 +++--- sdk/python/tests/unit/permissions/conftest.py | 6 +++--- .../tests/unit/permissions/test_permission.py | 10 +++++----- .../unit/permissions/test_security_manager.py | 14 +++++++------- 7 files changed, 37 insertions(+), 26 deletions(-) diff --git a/sdk/python/feast/infra/registry/registry.py b/sdk/python/feast/infra/registry/registry.py index 4bbcff1b13..3c98cf9012 100644 --- a/sdk/python/feast/infra/registry/registry.py +++ b/sdk/python/feast/infra/registry/registry.py @@ -929,7 +929,10 @@ def apply_permission( ): registry = self._prepare_registry_for_changes(project) for idx, existing_permission_proto in enumerate(registry.permissions): - if existing_permission_proto.name == permission.name and existing_permission_proto.project == project: + if ( + existing_permission_proto.name == permission.name + and existing_permission_proto.project == project + ): del registry.permissions[idx] permission_proto = permission.to_proto() permission_proto.project = project diff --git a/sdk/python/feast/permissions/action.py b/sdk/python/feast/permissions/action.py index 655bfcbdeb..82125848a3 100644 --- a/sdk/python/feast/permissions/action.py +++ b/sdk/python/feast/permissions/action.py @@ -6,14 +6,26 @@ class AuthzedAction(enum.Enum): Identify the type of action being secured by the permissions framework, according to the familiar CRUD and Feast terminology. """ - ALL = "all" # All actions CREATE = "create" # Create an instance READ = "read" # Access the instance state UPDATE = "update" # Update the instance state DELETE = "delete" # Deelete an instance - QUERY = "query" # Query both online and offline stores QUERY_ONLINE = "query_online" # Query the online store only QUERY_OFFLINE = "query_offline" # Query the offline store only - WRITE = "write" # Query on any store WRITE_ONLINE = "write_online" # Write to the online store only WRITE_OFFLINE = "write_offline" # Write to the offline store only + + +# Alias for all available actions +ALL_ACTIONS = [a for a in AuthzedAction.__members__.values()] + +# Alias for all query actions +QUERY = [ + AuthzedAction.QUERY_OFFLINE, + AuthzedAction.QUERY_ONLINE, +] +# Alias for all write actions +WRITE = [ + AuthzedAction.WRITE_OFFLINE, + AuthzedAction.WRITE_ONLINE, +] diff --git a/sdk/python/feast/permissions/matcher.py b/sdk/python/feast/permissions/matcher.py index 634cbf2f0e..00a820d641 100644 --- a/sdk/python/feast/permissions/matcher.py +++ b/sdk/python/feast/permissions/matcher.py @@ -156,9 +156,5 @@ def actions_match_config( Returns: bool: `True` if all the given `requested_actions` are defined in the `allowed_actions`. - Whatever the `requested_actions`, it returns `True` if `allowed_actions` includes `AuthzedAction.ALL` """ - if AuthzedAction.ALL in allowed_actions: - return True - return all(a in allowed_actions for a in requested_actions) diff --git a/sdk/python/feast/permissions/permission.py b/sdk/python/feast/permissions/permission.py index 57aa0afd59..be8abacdd4 100644 --- a/sdk/python/feast/permissions/permission.py +++ b/sdk/python/feast/permissions/permission.py @@ -4,7 +4,7 @@ from typing import TYPE_CHECKING, Any, Dict, Optional, Union from feast.importer import import_class -from feast.permissions.action import AuthzedAction +from feast.permissions.action import ALL_ACTIONS, AuthzedAction from feast.permissions.decision import DecisionStrategy from feast.permissions.matcher import actions_match_config, resource_match_config from feast.permissions.policy import AllowAll, Policy @@ -34,7 +34,7 @@ class Permission(ABC): name_pattern: A regex to match the resource name. Defaults to None, meaning that no name filtering is applied required_tags: Dictionary of key-value pairs that must match the resource tags. All these required_tags must be present in a resource tags with the given value. Defaults to None, meaning that no tags filtering is applied. - actions: The actions authorized by this permission. Defaults to `AuthzedAction.ALL`. + actions: The actions authorized by this permission. Defaults to `ALL_ACTIONS`. policy: The policy to be applied to validate a client request. """ @@ -54,7 +54,7 @@ def __init__( with_subclasses: bool = True, name_pattern: Optional[str] = None, required_tags: Optional[dict[str, str]] = None, - actions: Union[list[AuthzedAction], AuthzedAction] = AuthzedAction.ALL, + actions: Union[list[AuthzedAction], AuthzedAction] = ALL_ACTIONS, policy: Policy = AllowAll, tags: Optional[Dict[str, str]] = None, ): diff --git a/sdk/python/tests/unit/permissions/conftest.py b/sdk/python/tests/unit/permissions/conftest.py index 19a84742b5..ee2e258981 100644 --- a/sdk/python/tests/unit/permissions/conftest.py +++ b/sdk/python/tests/unit/permissions/conftest.py @@ -25,7 +25,7 @@ def __init__(self, name, tags): def read_protected(self) -> bool: return True - @require_permissions(actions=[AuthzedAction.WRITE]) + @require_permissions(actions=[AuthzedAction.UPDATE]) def write_protected(self) -> bool: return True @@ -68,7 +68,7 @@ def security_manager() -> SecurityManager: types=FeatureView, with_subclasses=True, policy=RoleBasedPolicy(roles=["writer"]), - actions=[AuthzedAction.WRITE], + actions=[AuthzedAction.UPDATE], ) ) permissions.append( @@ -78,7 +78,7 @@ def security_manager() -> SecurityManager: with_subclasses=True, name_pattern="special.*", policy=RoleBasedPolicy(roles=["admin", "special-reader"]), - actions=[AuthzedAction.READ, AuthzedAction.WRITE], + actions=[AuthzedAction.READ, AuthzedAction.UPDATE], ) ) diff --git a/sdk/python/tests/unit/permissions/test_permission.py b/sdk/python/tests/unit/permissions/test_permission.py index 7f2a4431ef..86659d4ff9 100644 --- a/sdk/python/tests/unit/permissions/test_permission.py +++ b/sdk/python/tests/unit/permissions/test_permission.py @@ -10,8 +10,8 @@ from feast.feature_service import FeatureService from feast.feature_view import FeatureView from feast.on_demand_feature_view import OnDemandFeatureView +from feast.permissions.action import ALL_ACTIONS, AuthzedAction from feast.permissions.permission import ( - AuthzedAction, DecisionStrategy, Permission, ) @@ -40,7 +40,7 @@ def test_defaults(): assertpy.assert_that(p.name_pattern).is_none() assertpy.assert_that(p.required_tags).is_none() assertpy.assert_that(type(p.actions)).is_equal_to(list) - assertpy.assert_that(p.actions[0]).is_equal_to(AuthzedAction.ALL) + assertpy.assert_that(p.actions).is_equal_to(ALL_ACTIONS) assertpy.assert_that(type(p.actions)).is_equal_to(list) assertpy.assert_that(isinstance(p.policy, Policy)).is_true() assertpy.assert_that(p.policy).is_equal_to(AllowAll) @@ -55,8 +55,8 @@ def test_defaults(): ({"types": [FeatureView, FeatureService]}, True), ({"actions": None}, False), ({"actions": []}, False), - ({"actions": AuthzedAction.ALL}, True), - ({"actions": [AuthzedAction.ALL]}, True), + ({"actions": ALL_ACTIONS}, True), + ({"actions": ALL_ACTIONS}, True), ({"actions": [AuthzedAction.CREATE, AuthzedAction.DELETE]}, True), ({"policy": None}, False), ({"policy": []}, False), @@ -256,7 +256,7 @@ def test_resource_match_with_tags(required_tags, tags, result): @pytest.mark.parametrize( ("permitted_actions, requested_actions, result"), - [(AuthzedAction.ALL, a, True) for a in AuthzedAction.__members__.values()] + [(ALL_ACTIONS, [a], True) for a in AuthzedAction.__members__.values()] + [ ( [AuthzedAction.CREATE, AuthzedAction.DELETE], diff --git a/sdk/python/tests/unit/permissions/test_security_manager.py b/sdk/python/tests/unit/permissions/test_security_manager.py index c8a383a97f..9eb80260c3 100644 --- a/sdk/python/tests/unit/permissions/test_security_manager.py +++ b/sdk/python/tests/unit/permissions/test_security_manager.py @@ -1,7 +1,7 @@ import assertpy import pytest -from feast.permissions.action import AuthzedAction +from feast.permissions.action import QUERY, AuthzedAction from feast.permissions.decision import DecisionStrategy from feast.permissions.permission import Permission from feast.permissions.security_manager import assert_permissions, permitted_resources @@ -17,14 +17,14 @@ def setup_module(): [ (None, [], False, [False, False]), ("r", [AuthzedAction.READ], False, [True, False]), - ("r", [AuthzedAction.WRITE], False, [False, False]), + ("r", [AuthzedAction.UPDATE], False, [False, False]), ("w", [AuthzedAction.READ], False, [False, False]), - ("w", [AuthzedAction.WRITE], False, [True, False]), + ("w", [AuthzedAction.UPDATE], False, [True, False]), ("rw", [AuthzedAction.READ], False, [True, False]), - ("rw", [AuthzedAction.WRITE], False, [True, False]), - ("rw", [AuthzedAction.READ, AuthzedAction.WRITE], False, [True, False]), - ("admin", [AuthzedAction.READ, AuthzedAction.WRITE], True, [True, True]), - ("admin", [AuthzedAction.QUERY, AuthzedAction.WRITE], True, [True, True]), + ("rw", [AuthzedAction.UPDATE], False, [True, False]), + ("rw", [AuthzedAction.READ, AuthzedAction.UPDATE], False, [True, False]), + ("admin", [AuthzedAction.READ, AuthzedAction.UPDATE], True, [True, True]), + ("admin", QUERY + [AuthzedAction.UPDATE], True, [True, True]), ], ) def test_access_SecuredFeatureView( From 98eed4419a715904d9196bd300816201e3055b8b Mon Sep 17 00:00:00 2001 From: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Date: Tue, 2 Jul 2024 13:20:54 +0200 Subject: [PATCH 030/169] Updated user guide Signed-off-by: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Signed-off-by: Abdul Hameed --- docs/getting-started/concepts/permission.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/getting-started/concepts/permission.md b/docs/getting-started/concepts/permission.md index 9ada6c162e..466d685b71 100644 --- a/docs/getting-started/concepts/permission.md +++ b/docs/getting-started/concepts/permission.md @@ -39,7 +39,7 @@ The `Permission` class identifies a single permission configured on the feature - `with_subclasses`: Specify if sub-classes are included in the resource match or not. Defaults to `True`. - `name_pattern`: A regex to match the resource name. Defaults to `None`, meaning that no name filtering is applied - `required_tags`: Dictionary of key-value pairs that must match the resource tags. Defaults to `None`, meaning that no tags filtering is applied. -- `actions`: The actions authorized by this permission. Defaults to `AuthzedAction.ALL`. +- `actions`: The actions authorized by this permission. Defaults to `ALL_VALUES`, an alias defined in the `action` module. - `policy`: The policy to be applied to validate a client request. Given the above definitions, the feature store can be configured with granular control over each resource, enabling partitioned access by From 78decaaf2f7801753a22a6fee0975d8269eec767 Mon Sep 17 00:00:00 2001 From: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Date: Tue, 2 Jul 2024 14:08:09 +0200 Subject: [PATCH 031/169] Updated enum in proto Signed-off-by: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Signed-off-by: Abdul Hameed --- protos/feast/core/Permission.proto | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/protos/feast/core/Permission.proto b/protos/feast/core/Permission.proto index 60a153d1cb..aba9f0bb40 100644 --- a/protos/feast/core/Permission.proto +++ b/protos/feast/core/Permission.proto @@ -10,17 +10,14 @@ import "feast/core/Policy.proto"; message Permission { enum AuthzedAction { - ALL = 0; - CREATE = 1; - READ = 2; - UPDATE = 3; - DELETE = 4; - QUERY = 5; - QUERY_ONLINE = 6; - QUERY_OFFLINE = 7; - WRITE = 8; - WRITE_ONLINE = 9; - WRITE_OFFLINE = 10; + CREATE = 0; + READ = 1; + UPDATE = 2; + DELETE = 3; + QUERY_ONLINE = 4; + QUERY_OFFLINE = 5; + WRITE_ONLINE = 6; + WRITE_OFFLINE = 7; } // Name of the permission. Must be unique. Not updated. From a02602dfd854ece6fb4020ad876f7d32363e0b4d Mon Sep 17 00:00:00 2001 From: Theodor Mihalache Date: Tue, 2 Jul 2024 13:00:51 -0400 Subject: [PATCH 032/169] Store and Manage permissions in the Registry - Fixed test errors following refactor - Added test Signed-off-by: Theodor Mihalache Signed-off-by: Abdul Hameed --- .../registration/test_universal_registry.py | 2 +- .../tests/unit/diff/test_registry_diff.py | 25 +++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/sdk/python/tests/integration/registration/test_universal_registry.py b/sdk/python/tests/integration/registration/test_universal_registry.py index 8a8006b606..c227e09457 100644 --- a/sdk/python/tests/integration/registration/test_universal_registry.py +++ b/sdk/python/tests/integration/registration/test_universal_registry.py @@ -591,7 +591,7 @@ def test_apply_permissions(test_registry): types=ALL_RESOURCE_TYPES, with_subclasses=True, policy=RoleBasedPolicy(roles=["writer"]), - actions=[AuthzedAction.WRITE], + actions=[AuthzedAction.CREATE], ) project = "project" diff --git a/sdk/python/tests/unit/diff/test_registry_diff.py b/sdk/python/tests/unit/diff/test_registry_diff.py index c209f1e0e0..08d33c2366 100644 --- a/sdk/python/tests/unit/diff/test_registry_diff.py +++ b/sdk/python/tests/unit/diff/test_registry_diff.py @@ -6,8 +6,12 @@ tag_objects_for_keep_delete_update_add, ) from feast.entity import Entity +from feast.feast_object import ALL_RESOURCE_TYPES from feast.feature_view import FeatureView from feast.on_demand_feature_view import on_demand_feature_view +from feast.permissions.action import AuthzedAction +from feast.permissions.permission import Permission +from feast.permissions.policy import RoleBasedPolicy from feast.types import String from tests.utils.data_source_test_creator import prep_file_source @@ -170,3 +174,24 @@ def test_diff_registry_objects_batch_to_push_source(simple_dataset_1): feast_object_diffs.feast_object_property_diffs[0].property_name == "stream_source" ) + + +def test_diff_registry_objects_permissions(): + pre_changed = Permission( + name="reader", + types=ALL_RESOURCE_TYPES, + with_subclasses=True, + policy=RoleBasedPolicy(roles=["reader"]), + actions=[AuthzedAction.READ], + ) + post_changed = Permission( + name="reader", + types=ALL_RESOURCE_TYPES, + with_subclasses=True, + policy=RoleBasedPolicy(roles=["reader"]), + actions=[AuthzedAction.CREATE], + ) + + feast_object_diffs = diff_registry_objects(pre_changed, post_changed, "permission") + assert len(feast_object_diffs.feast_object_property_diffs) == 1 + assert feast_object_diffs.feast_object_property_diffs[0].property_name == "actions" From 6fba046d050984a33d642e5ad94ab790b9437a9d Mon Sep 17 00:00:00 2001 From: Theodor Mihalache Date: Wed, 3 Jul 2024 13:01:04 -0400 Subject: [PATCH 033/169] Store and Manage permissions in the Registry - Removed redundant property - Added tags filter option to list_permissions Signed-off-by: Theodor Mihalache Signed-off-by: Abdul Hameed --- protos/feast/registry/RegistryServer.proto | 1 + sdk/python/feast/feature_store.py | 8 ++++-- .../feast/infra/registry/base_registry.py | 8 ++++++ .../feast/infra/registry/caching_registry.py | 9 ++++--- .../infra/registry/proto_registry_utils.py | 10 ++++--- sdk/python/feast/infra/registry/registry.py | 7 +++-- sdk/python/feast/infra/registry/remote.py | 3 ++- sdk/python/feast/infra/registry/snowflake.py | 2 ++ sdk/python/feast/infra/registry/sql.py | 5 +++- sdk/python/feast/permissions/permission.py | 26 ++++++------------- .../tests/unit/permissions/test_permission.py | 4 +-- 11 files changed, 51 insertions(+), 32 deletions(-) diff --git a/protos/feast/registry/RegistryServer.proto b/protos/feast/registry/RegistryServer.proto index e441a71077..fc2ab12217 100644 --- a/protos/feast/registry/RegistryServer.proto +++ b/protos/feast/registry/RegistryServer.proto @@ -342,6 +342,7 @@ message GetPermissionRequest { message ListPermissionsRequest { string project = 1; bool allow_cache = 2; + map tags = 3; } message ListPermissionsResponse { diff --git a/sdk/python/feast/feature_store.py b/sdk/python/feast/feature_store.py index 68a80774e4..15ec8e1451 100644 --- a/sdk/python/feast/feature_store.py +++ b/sdk/python/feast/feature_store.py @@ -1931,7 +1931,9 @@ def get_validation_reference( ref._dataset = self.get_saved_dataset(ref.dataset_name) return ref - def list_permissions(self, allow_cache: bool = False) -> List[Permission]: + def list_permissions( + self, allow_cache: bool = False, tags: Optional[dict[str, str]] = None + ) -> List[Permission]: """ Retrieves the list of permissions from the registry. @@ -1941,7 +1943,9 @@ def list_permissions(self, allow_cache: bool = False) -> List[Permission]: Returns: A list of data sources. """ - return self._registry.list_permissions(self.project, allow_cache=allow_cache) + return self._registry.list_permissions( + self.project, allow_cache=allow_cache, tags=tags + ) def _print_materialization_log( diff --git a/sdk/python/feast/infra/registry/base_registry.py b/sdk/python/feast/infra/registry/base_registry.py index 7283feaec8..a5af1d85da 100644 --- a/sdk/python/feast/infra/registry/base_registry.py +++ b/sdk/python/feast/infra/registry/base_registry.py @@ -640,6 +640,7 @@ def list_permissions( self, project: str, allow_cache: bool = False, + tags: Optional[dict[str, str]] = None, ) -> List[Permission]: """ Retrieve a list of permissions from the registry @@ -779,6 +780,13 @@ def to_dict(self, project: str) -> Dict[str, List[Any]]: registry_dict["infra"].append( self._message_to_sorted_dict(infra_object.to_proto()) ) + for permission in sorted( + self.list_permissions(project=project), key=lambda ds: ds.name + ): + registry_dict["permissions"].append( + self._message_to_sorted_dict(permission.to_proto()) + ) + return registry_dict @staticmethod diff --git a/sdk/python/feast/infra/registry/caching_registry.py b/sdk/python/feast/infra/registry/caching_registry.py index 4494f4b960..7533272e37 100644 --- a/sdk/python/feast/infra/registry/caching_registry.py +++ b/sdk/python/feast/infra/registry/caching_registry.py @@ -327,20 +327,23 @@ def get_permission( return self._get_permission(name, project) @abstractmethod - def _list_permissions(self, project: str) -> List[Permission]: + def _list_permissions( + self, project: str, tags: Optional[dict[str, str]] + ) -> List[Permission]: pass def list_permissions( self, project: str, allow_cache: bool = False, + tags: Optional[dict[str, str]] = None, ) -> List[Permission]: if allow_cache: self._refresh_cached_registry_if_necessary() return proto_registry_utils.list_permissions( - self.cached_registry_proto, project + self.cached_registry_proto, project, tags ) - return self._list_permissions(project) + return self._list_permissions(project, tags) def refresh(self, project: Optional[str] = None): if project: diff --git a/sdk/python/feast/infra/registry/proto_registry_utils.py b/sdk/python/feast/infra/registry/proto_registry_utils.py index 4dc972f325..bb4eb4ee40 100644 --- a/sdk/python/feast/infra/registry/proto_registry_utils.py +++ b/sdk/python/feast/infra/registry/proto_registry_utils.py @@ -289,11 +289,15 @@ def list_project_metadata( ] -@registry_proto_cache -def list_permissions(registry_proto: RegistryProto, project: str) -> List[Permission]: +@registry_proto_cache_with_tags +def list_permissions( + registry_proto: RegistryProto, project: str, tags: Optional[dict[str, str]] +) -> List[Permission]: permissions = [] for permission_proto in registry_proto.permissions: - if permission_proto.project == project: + if permission_proto.project == project and utils.has_all_tags( + permission_proto.tags, tags + ): permissions.append(Permission.from_proto(permission_proto)) return permissions diff --git a/sdk/python/feast/infra/registry/registry.py b/sdk/python/feast/infra/registry/registry.py index 3c98cf9012..64672ad0c9 100644 --- a/sdk/python/feast/infra/registry/registry.py +++ b/sdk/python/feast/infra/registry/registry.py @@ -917,12 +917,15 @@ def get_permission( return proto_registry_utils.get_permission(registry_proto, name, project) def list_permissions( - self, project: str, allow_cache: bool = False + self, + project: str, + allow_cache: bool = False, + tags: Optional[dict[str, str]] = None, ) -> List[Permission]: registry_proto = self._get_registry_proto( project=project, allow_cache=allow_cache ) - return proto_registry_utils.list_permissions(registry_proto, project) + return proto_registry_utils.list_permissions(registry_proto, project, tags) def apply_permission( self, permission: Permission, project: str, commit: bool = True diff --git a/sdk/python/feast/infra/registry/remote.py b/sdk/python/feast/infra/registry/remote.py index 4ef2359cbe..2b1e40b50d 100644 --- a/sdk/python/feast/infra/registry/remote.py +++ b/sdk/python/feast/infra/registry/remote.py @@ -472,9 +472,10 @@ def list_permissions( self, project: str, allow_cache: bool = False, + tags: Optional[dict[str, str]] = None, ) -> List[Permission]: request = RegistryServer_pb2.ListPermissionsRequest( - project=project, allow_cache=allow_cache + project=project, allow_cache=allow_cache, tags=tags ) response = self.stub.ListPermissions(request) diff --git a/sdk/python/feast/infra/registry/snowflake.py b/sdk/python/feast/infra/registry/snowflake.py index dac9a4bc40..0856e52246 100644 --- a/sdk/python/feast/infra/registry/snowflake.py +++ b/sdk/python/feast/infra/registry/snowflake.py @@ -839,6 +839,7 @@ def list_permissions( self, project: str, allow_cache: bool = False, + tags: Optional[dict[str, str]] = None, ) -> List[Permission]: if allow_cache: self._refresh_cached_registry_if_necessary() @@ -851,6 +852,7 @@ def list_permissions( PermissionProto, Permission, "PERMISSION_PROTO", + tags, ) def apply_materialization( diff --git a/sdk/python/feast/infra/registry/sql.py b/sdk/python/feast/infra/registry/sql.py index 36ca3f6389..25bf49fdcb 100644 --- a/sdk/python/feast/infra/registry/sql.py +++ b/sdk/python/feast/infra/registry/sql.py @@ -952,13 +952,16 @@ def _get_permission(self, name: str, project: str) -> Permission: not_found_exception=PermissionNotFoundException, ) - def _list_permissions(self, project: str) -> List[Permission]: + def _list_permissions( + self, project: str, tags: Optional[dict[str, str]] + ) -> List[Permission]: return self._list_objects( permissions, project, PermissionProto, Permission, "permission_proto", + tags=tags, ) def apply_permission( diff --git a/sdk/python/feast/permissions/permission.py b/sdk/python/feast/permissions/permission.py index be8abacdd4..2f8f820765 100644 --- a/sdk/python/feast/permissions/permission.py +++ b/sdk/python/feast/permissions/permission.py @@ -32,17 +32,16 @@ class Permission(ABC): with_subclasses: If `True`, it includes sub-classes of the given types in the match, otherwise only exact type match is applied. Defaults to `True`. name_pattern: A regex to match the resource name. Defaults to None, meaning that no name filtering is applied - required_tags: Dictionary of key-value pairs that must match the resource tags. All these required_tags must be present in a resource tags with the given value. Defaults to None, meaning that no tags filtering is applied. actions: The actions authorized by this permission. Defaults to `ALL_ACTIONS`. policy: The policy to be applied to validate a client request. + tags: Dictionary of key-value pairs that must match the resource tags. All these tags must """ _name: str _types: list["FeastObject"] _with_subclasses: bool _name_pattern: Optional[str] - _required_tags: Optional[dict[str, str]] _actions: list[AuthzedAction] _policy: Policy _tags: Dict[str, str] @@ -53,10 +52,9 @@ def __init__( types: Optional[Union[list["FeastObject"], "FeastObject"]] = None, with_subclasses: bool = True, name_pattern: Optional[str] = None, - required_tags: Optional[dict[str, str]] = None, actions: Union[list[AuthzedAction], AuthzedAction] = ALL_ACTIONS, policy: Policy = AllowAll, - tags: Optional[Dict[str, str]] = None, + tags: Optional[dict[str, str]] = None, ): from feast.feast_object import ALL_RESOURCE_TYPES @@ -73,10 +71,9 @@ def __init__( self._types = types if isinstance(types, list) else [types] self._with_subclasses = with_subclasses self._name_pattern = _normalize_name_pattern(name_pattern) - self._required_tags = _normalize_required_tags(required_tags) self._actions = actions if isinstance(actions, list) else [actions] self._policy = policy - self._tags = tags or {} + self._tags = _normalize_tags(tags) def __eq__(self, other): if not isinstance(other, Permission): @@ -86,7 +83,7 @@ def __eq__(self, other): self.name != other.name or self.with_subclasses != other.with_subclasses or self.name_pattern != other.name_pattern - or self.required_tags != other.required_tags + or self.tags != other.tags or self.policy != other.policy or self.actions != other.actions ): @@ -129,10 +126,6 @@ def with_subclasses(self) -> bool: def name_pattern(self) -> Optional[str]: return self._name_pattern - @property - def required_tags(self) -> Optional[dict[str, str]]: - return self._required_tags - @property def actions(self) -> list[AuthzedAction]: return self._actions @@ -155,7 +148,7 @@ def match_resource(self, resource: "FeastObject") -> bool: expected_types=self.types, with_subclasses=self.with_subclasses, name_pattern=self.name_pattern, - required_tags=self.required_tags, + required_tags=self.tags, ) def match_actions(self, requested_actions: list[AuthzedAction]) -> bool: @@ -196,7 +189,6 @@ def from_proto(permission_proto: PermissionProto) -> Any: types, permission_proto.with_subclasses, permission_proto.name_pattern or None, - dict(permission_proto.required_tags), actions, Policy.from_proto(permission_proto.policy), dict(permission_proto.tags) or None, @@ -224,7 +216,6 @@ def to_proto(self) -> PermissionProto: types=types, with_subclasses=self.with_subclasses, name_pattern=self.name_pattern if self.name_pattern is not None else None, - required_tags=self.required_tags, actions=actions, policy=self.policy.to_proto(), tags=self._tags if self._tags is not None else None, @@ -239,11 +230,10 @@ def _normalize_name_pattern(name_pattern: Optional[str]): return None -def _normalize_required_tags(required_tags: Optional[dict[str, str]]): - if required_tags: +def _normalize_tags(tags: Optional[dict[str, str]]): + if tags: return { - k.strip(): v.strip() if isinstance(v, str) else v - for k, v in required_tags.items() + k.strip(): v.strip() if isinstance(v, str) else v for k, v in tags.items() } return None diff --git a/sdk/python/tests/unit/permissions/test_permission.py b/sdk/python/tests/unit/permissions/test_permission.py index 86659d4ff9..8bb473952e 100644 --- a/sdk/python/tests/unit/permissions/test_permission.py +++ b/sdk/python/tests/unit/permissions/test_permission.py @@ -38,7 +38,7 @@ def test_defaults(): assertpy.assert_that(p.types).is_equal_to(ALL_RESOURCE_TYPES) assertpy.assert_that(p.with_subclasses).is_true() assertpy.assert_that(p.name_pattern).is_none() - assertpy.assert_that(p.required_tags).is_none() + assertpy.assert_that(p.tags).is_none() assertpy.assert_that(type(p.actions)).is_equal_to(list) assertpy.assert_that(p.actions).is_equal_to(ALL_ACTIONS) assertpy.assert_that(type(p.actions)).is_equal_to(list) @@ -246,7 +246,7 @@ def test_resource_match_with_name_filter(pattern, name, match): ) def test_resource_match_with_tags(required_tags, tags, result): # Missing tags - p = Permission(name="test", required_tags=required_tags) + p = Permission(name="test", tags=required_tags) for t in ALL_RESOURCE_TYPES: resource = Mock(spec=t) resource.name = "test" From 4408be56780895b73bbd7cc811e83d144ca15ea8 Mon Sep 17 00:00:00 2001 From: Abdul Hameed Date: Tue, 25 Jun 2024 17:14:25 -0400 Subject: [PATCH 034/169] Added permission assert check for registry server, offline server, online server functions Signed-off-by: Abdul Hameed --- sdk/python/feast/feature_server.py | 84 +++++- sdk/python/feast/offline_server.py | 36 ++- sdk/python/feast/permissions/action.py | 9 + sdk/python/feast/registry_server.py | 340 +++++++++++++++++++------ 4 files changed, 379 insertions(+), 90 deletions(-) diff --git a/sdk/python/feast/feature_server.py b/sdk/python/feast/feature_server.py index 908c9741c2..1b1f2d24a8 100644 --- a/sdk/python/feast/feature_server.py +++ b/sdk/python/feast/feature_server.py @@ -20,7 +20,9 @@ from feast import proto_json, utils from feast.constants import DEFAULT_FEATURE_SERVER_REGISTRY_TTL from feast.data_source import PushMode -from feast.errors import PushSourceNotFoundException +from feast.errors import FeatureViewNotFoundException, PushSourceNotFoundException +from feast.permissions.action import WRITE, AuthzedAction +from feast.permissions.security_manager import assert_permissions # Define prometheus metrics cpu_usage_gauge = Gauge( @@ -97,19 +99,40 @@ async def get_body(request: Request): def get_online_features(body=Depends(get_body)): try: body = json.loads(body) + full_feature_names = body.get("full_feature_names", False) + entity_rows = body["entities"] # Initialize parameters for FeatureStore.get_online_features(...) call if "feature_service" in body: - features = store.get_feature_service( + feature_service = store.get_feature_service( body["feature_service"], allow_cache=True ) + assert_permissions( + resource=feature_service, actions=[AuthzedAction.QUERY_ONLINE] + ) + features = feature_service else: features = body["features"] - - full_feature_names = body.get("full_feature_names", False) + all_feature_views, all_on_demand_feature_views = ( + utils._get_feature_views_to_use( + store.registry, + store.project, + features, + allow_cache=True, + hide_dummy_entity=False, + ) + ) + for feature_view in all_feature_views: + assert_permissions( + resource=feature_view, actions=[AuthzedAction.QUERY_ONLINE] + ) + for od_feature_view in all_on_demand_feature_views: + assert_permissions( + resource=od_feature_view, actions=[AuthzedAction.QUERY_ONLINE] + ) response_proto = store.get_online_features( features=features, - entity_rows=body["entities"], + entity_rows=entity_rows, full_feature_names=full_feature_names, ).proto @@ -128,16 +151,41 @@ def push(body=Depends(get_body)): try: request = PushFeaturesRequest(**json.loads(body)) df = pd.DataFrame(request.df) + actions = [] if request.to == "offline": to = PushMode.OFFLINE + actions = [AuthzedAction.WRITE_OFFLINE] elif request.to == "online": to = PushMode.ONLINE + actions = [AuthzedAction.WRITE_ONLINE] elif request.to == "online_and_offline": to = PushMode.ONLINE_AND_OFFLINE + actions = WRITE else: raise ValueError( f"{request.to} is not a supported push format. Please specify one of these ['online', 'offline', 'online_and_offline']." ) + + from feast.data_source import PushSource + + all_fvs = store.list_feature_views( + allow_cache=request.allow_registry_cache + ) + store.list_stream_feature_views( + allow_cache=request.allow_registry_cache + ) + fvs_with_push_sources = { + fv + for fv in all_fvs + if ( + fv.stream_source is not None + and isinstance(fv.stream_source, PushSource) + and fv.stream_source.name == request.push_source_name + ) + } + + for feature_view in fvs_with_push_sources: + assert_permissions(resource=feature_view, actions=actions) + store.push( push_source_name=request.push_source_name, df=df, @@ -160,10 +208,24 @@ def write_to_online_store(body=Depends(get_body)): try: request = WriteToFeatureStoreRequest(**json.loads(body)) df = pd.DataFrame(request.df) + feature_view_name = request.feature_view_name + allow_registry_cache = request.allow_registry_cache + try: + feature_view = store.get_stream_feature_view( + feature_view_name, allow_registry_cache=allow_registry_cache + ) + except FeatureViewNotFoundException: + feature_view = store.get_feature_view( + feature_view_name, allow_registry_cache=allow_registry_cache + ) + + assert_permissions( + resource=feature_view, actions=[AuthzedAction.WRITE_ONLINE] + ) store.write_to_online_store( - feature_view_name=request.feature_view_name, + feature_view_name=feature_view_name, df=df, - allow_registry_cache=request.allow_registry_cache, + allow_registry_cache=allow_registry_cache, ) except Exception as e: # Print the original exception on the server side @@ -179,6 +241,10 @@ def health(): def materialize(body=Depends(get_body)): try: request = MaterializeRequest(**json.loads(body)) + for feature_view in request.feature_views: + assert_permissions( + resource=feature_view, actions=[AuthzedAction.WRITE_ONLINE] + ) store.materialize( utils.make_tzaware(parser.parse(request.start_ts)), utils.make_tzaware(parser.parse(request.end_ts)), @@ -194,6 +260,10 @@ def materialize(body=Depends(get_body)): def materialize_incremental(body=Depends(get_body)): try: request = MaterializeIncrementalRequest(**json.loads(body)) + for feature_view in request.feature_views: + assert_permissions( + resource=feature_view, actions=[AuthzedAction.WRITE_ONLINE] + ) store.materialize_incremental( utils.make_tzaware(parser.parse(request.end_ts)), request.feature_views ) diff --git a/sdk/python/feast/offline_server.py b/sdk/python/feast/offline_server.py index be92620d68..a16dcb8932 100644 --- a/sdk/python/feast/offline_server.py +++ b/sdk/python/feast/offline_server.py @@ -3,7 +3,7 @@ import logging import traceback from datetime import datetime -from typing import Any, Dict, List +from typing import Any, Dict, List, cast import pyarrow as pa import pyarrow.flight as fl @@ -12,6 +12,8 @@ from feast.feature_logging import FeatureServiceLoggingSource from feast.feature_view import DUMMY_ENTITY_NAME from feast.infra.offline_stores.offline_utils import get_offline_store_from_config +from feast.permissions.action import AuthzedAction +from feast.permissions.security_manager import assert_permissions from feast.saved_dataset import SavedDatasetStorage logger = logging.getLogger(__name__) @@ -217,7 +219,15 @@ def offline_write_batch(self, command: dict, key: str): assert len(feature_views) == 1, "incorrect feature view" table = self.flights[key] self.offline_store.offline_write_batch( - self.store.config, feature_views[0], table, command["progress"] + self.store.config, + cast( + FeatureView, + assert_permissions( + feature_views[0], actions=[AuthzedAction.WRITE_OFFLINE] + ), + ), + table, + command["progress"], ) def _validate_write_logged_features_parameters(self, command: dict): @@ -234,6 +244,10 @@ def write_logged_features(self, command: dict, key: str): feature_service.logging_config is not None ), "feature service must have logging_config set" + assert_permissions( + resource=feature_service, + actions=[AuthzedAction.WRITE_OFFLINE], + ) self.offline_store.write_logged_features( config=self.store.config, data=table, @@ -260,10 +274,12 @@ def _validate_pull_all_from_table_or_query_parameters(self, command: dict): def pull_all_from_table_or_query(self, command: dict): self._validate_pull_all_from_table_or_query_parameters(command) + data_source = self.store.get_data_source(command["data_source_name"]) + assert_permissions(data_source, actions=[AuthzedAction.QUERY_OFFLINE]) return self.offline_store.pull_all_from_table_or_query( self.store.config, - self.store.get_data_source(command["data_source_name"]), + data_source, command["join_key_columns"], command["feature_name_columns"], command["timestamp_field"], @@ -287,10 +303,11 @@ def _validate_pull_latest_from_table_or_query_parameters(self, command: dict): def pull_latest_from_table_or_query(self, command: dict): self._validate_pull_latest_from_table_or_query_parameters(command) - + data_source = self.store.get_data_source(command["data_source_name"]) + assert_permissions(resource=data_source, actions=[AuthzedAction.QUERY_OFFLINE]) return self.offline_store.pull_latest_from_table_or_query( self.store.config, - self.store.get_data_source(command["data_source_name"]), + data_source, command["join_key_columns"], command["feature_name_columns"], command["timestamp_field"], @@ -343,6 +360,11 @@ def get_historical_features(self, command: dict, key: str): project=project, ) + for feature_view in feature_views: + assert_permissions( + resource=feature_view, actions=[AuthzedAction.QUERY_OFFLINE] + ) + retJob = self.offline_store.get_historical_features( config=self.store.config, feature_views=feature_views, @@ -377,6 +399,10 @@ def persist(self, command: dict, key: str): raise NotImplementedError data_source = self.store.get_data_source(command["data_source_name"]) + assert_permissions( + resource=data_source, + actions=[AuthzedAction.WRITE_OFFLINE], + ) storage = SavedDatasetStorage.from_data_source(data_source) ret_job.persist(storage, command["allow_overwrite"], command["timeout"]) except Exception as e: diff --git a/sdk/python/feast/permissions/action.py b/sdk/python/feast/permissions/action.py index 82125848a3..09bce94511 100644 --- a/sdk/python/feast/permissions/action.py +++ b/sdk/python/feast/permissions/action.py @@ -29,3 +29,12 @@ class AuthzedAction(enum.Enum): AuthzedAction.WRITE_OFFLINE, AuthzedAction.WRITE_ONLINE, ] + + +# Alias for CRUD actions +CRUD = [ + AuthzedAction.CREATE, + AuthzedAction.READ, + AuthzedAction.UPDATE, + AuthzedAction.DELETE, +] diff --git a/sdk/python/feast/registry_server.py b/sdk/python/feast/registry_server.py index 50fcc79b2d..86e0e66be2 100644 --- a/sdk/python/feast/registry_server.py +++ b/sdk/python/feast/registry_server.py @@ -1,18 +1,22 @@ from concurrent import futures +from datetime import datetime +from typing import cast from datetime import datetime, timezone import grpc from google.protobuf.empty_pb2 import Empty -from feast import FeatureStore +from feast import FeatureService, FeatureStore from feast.data_source import DataSource from feast.entity import Entity -from feast.feature_service import FeatureService +from feast.feast_object import FeastObject from feast.feature_view import FeatureView from feast.infra.infra_object import Infra from feast.infra.registry.base_registry import BaseRegistry from feast.on_demand_feature_view import OnDemandFeatureView +from feast.permissions.action import CRUD, AuthzedAction from feast.permissions.permission import Permission +from feast.permissions.security_manager import assert_permissions, permitted_resources from feast.protos.feast.registry import RegistryServer_pb2, RegistryServer_pb2_grpc from feast.saved_dataset import SavedDataset, ValidationReference from feast.stream_feature_view import StreamFeatureView @@ -24,31 +28,52 @@ def __init__(self, registry: BaseRegistry) -> None: self.proxied_registry = registry def ApplyEntity(self, request: RegistryServer_pb2.ApplyEntityRequest, context): - self.proxied_registry.apply_entity( - entity=Entity.from_proto(request.entity), - project=request.project, - commit=request.commit, + assert_permissions( + resource=self.proxied_registry.apply_entity( + entity=Entity.from_proto(request.entity), + project=request.project, + commit=request.commit, + ), + actions=CRUD, ) return Empty() def GetEntity(self, request: RegistryServer_pb2.GetEntityRequest, context): - return self.proxied_registry.get_entity( - name=request.name, project=request.project, allow_cache=request.allow_cache + return assert_permissions( + self.proxied_registry.get_entity( + name=request.name, + project=request.project, + allow_cache=request.allow_cache, + ), + actions=[AuthzedAction.READ], ).to_proto() def ListEntities(self, request: RegistryServer_pb2.ListEntitiesRequest, context): return RegistryServer_pb2.ListEntitiesResponse( entities=[ entity.to_proto() - for entity in self.proxied_registry.list_entities( - project=request.project, - allow_cache=request.allow_cache, - tags=dict(request.tags), + for entity in permitted_resources( + resources=cast( + list[FeastObject], + self.proxied_registry.list_entities( + project=request.project, + allow_cache=request.allow_cache, + tags=dict(request.tags), + ), + ), + actions=AuthzedAction.READ, ) ] ) def DeleteEntity(self, request: RegistryServer_pb2.DeleteEntityRequest, context): + assert_permissions( + resource=self.proxied_registry.get_entity( + name=request.name, project=request.project + ), + actions=AuthzedAction.DELETE, + ) + self.proxied_registry.delete_entity( name=request.name, project=request.project, commit=request.commit ) @@ -57,16 +82,24 @@ def DeleteEntity(self, request: RegistryServer_pb2.DeleteEntityRequest, context) def ApplyDataSource( self, request: RegistryServer_pb2.ApplyDataSourceRequest, context ): - self.proxied_registry.apply_data_source( - data_source=DataSource.from_proto(request.data_source), - project=request.project, - commit=request.commit, + assert_permissions( + resource=self.proxied_registry.apply_data_source( + data_source=DataSource.from_proto(request.data_source), + project=request.project, + commit=request.commit, + ), + actions=CRUD, ) return Empty() def GetDataSource(self, request: RegistryServer_pb2.GetDataSourceRequest, context): - return self.proxied_registry.get_data_source( - name=request.name, project=request.project, allow_cache=request.allow_cache + return assert_permissions( + resource=self.proxied_registry.get_data_source( + name=request.name, + project=request.project, + allow_cache=request.allow_cache, + ), + actions=AuthzedAction.READ, ).to_proto() def ListDataSources( @@ -75,10 +108,16 @@ def ListDataSources( return RegistryServer_pb2.ListDataSourcesResponse( data_sources=[ data_source.to_proto() - for data_source in self.proxied_registry.list_data_sources( - project=request.project, - allow_cache=request.allow_cache, - tags=dict(request.tags), + for data_source in permitted_resources( + resources=cast( + list[FeastObject], + self.proxied_registry.list_data_sources( + project=request.project, + allow_cache=request.allow_cache, + tags=dict(request.tags), + ), + ), + actions=AuthzedAction.READ, ) ] ) @@ -86,6 +125,14 @@ def ListDataSources( def DeleteDataSource( self, request: RegistryServer_pb2.DeleteDataSourceRequest, context ): + assert_permissions( + resource=self.proxied_registry.get_data_source( + name=request.name, + project=request.project, + ), + actions=AuthzedAction.DELETE, + ) + self.proxied_registry.delete_data_source( name=request.name, project=request.project, commit=request.commit ) @@ -94,8 +141,13 @@ def DeleteDataSource( def GetFeatureView( self, request: RegistryServer_pb2.GetFeatureViewRequest, context ): - return self.proxied_registry.get_feature_view( - name=request.name, project=request.project, allow_cache=request.allow_cache + return assert_permissions( + self.proxied_registry.get_feature_view( + name=request.name, + project=request.project, + allow_cache=request.allow_cache, + ), + actions=[AuthzedAction.READ], ).to_proto() def ApplyFeatureView( @@ -111,8 +163,13 @@ def ApplyFeatureView( elif feature_view_type == "stream_feature_view": feature_view = StreamFeatureView.from_proto(request.stream_feature_view) - self.proxied_registry.apply_feature_view( - feature_view=feature_view, project=request.project, commit=request.commit + assert_permissions( + resource=self.proxied_registry.apply_feature_view( + feature_view=feature_view, + project=request.project, + commit=request.commit, + ), + actions=CRUD, ) return Empty() @@ -122,10 +179,16 @@ def ListFeatureViews( return RegistryServer_pb2.ListFeatureViewsResponse( feature_views=[ feature_view.to_proto() - for feature_view in self.proxied_registry.list_feature_views( - project=request.project, - allow_cache=request.allow_cache, - tags=dict(request.tags), + for feature_view in permitted_resources( + resources=cast( + list[FeastObject], + self.proxied_registry.list_feature_views( + project=request.project, + allow_cache=request.allow_cache, + tags=dict(request.tags), + ), + ), + actions=AuthzedAction.READ, ) ] ) @@ -133,6 +196,12 @@ def ListFeatureViews( def DeleteFeatureView( self, request: RegistryServer_pb2.DeleteFeatureViewRequest, context ): + assert_permissions( + resource=self.proxied_registry.get_feature_view( + name=request.name, project=request.project + ), + actions=[AuthzedAction.DELETE], + ) self.proxied_registry.delete_feature_view( name=request.name, project=request.project, commit=request.commit ) @@ -141,8 +210,13 @@ def DeleteFeatureView( def GetStreamFeatureView( self, request: RegistryServer_pb2.GetStreamFeatureViewRequest, context ): - return self.proxied_registry.get_stream_feature_view( - name=request.name, project=request.project, allow_cache=request.allow_cache + return assert_permissions( + resource=self.proxied_registry.get_stream_feature_view( + name=request.name, + project=request.project, + allow_cache=request.allow_cache, + ), + actions=[AuthzedAction.READ], ).to_proto() def ListStreamFeatureViews( @@ -151,10 +225,16 @@ def ListStreamFeatureViews( return RegistryServer_pb2.ListStreamFeatureViewsResponse( stream_feature_views=[ stream_feature_view.to_proto() - for stream_feature_view in self.proxied_registry.list_stream_feature_views( - project=request.project, - allow_cache=request.allow_cache, - tags=dict(request.tags), + for stream_feature_view in permitted_resources( + resources=cast( + list[FeastObject], + self.proxied_registry.list_stream_feature_views( + project=request.project, + allow_cache=request.allow_cache, + tags=dict(request.tags), + ), + ), + actions=AuthzedAction.READ, ) ] ) @@ -162,8 +242,13 @@ def ListStreamFeatureViews( def GetOnDemandFeatureView( self, request: RegistryServer_pb2.GetOnDemandFeatureViewRequest, context ): - return self.proxied_registry.get_on_demand_feature_view( - name=request.name, project=request.project, allow_cache=request.allow_cache + return assert_permissions( + resource=self.proxied_registry.get_on_demand_feature_view( + name=request.name, + project=request.project, + allow_cache=request.allow_cache, + ), + actions=[AuthzedAction.READ], ).to_proto() def ListOnDemandFeatureViews( @@ -172,10 +257,16 @@ def ListOnDemandFeatureViews( return RegistryServer_pb2.ListOnDemandFeatureViewsResponse( on_demand_feature_views=[ on_demand_feature_view.to_proto() - for on_demand_feature_view in self.proxied_registry.list_on_demand_feature_views( - project=request.project, - allow_cache=request.allow_cache, - tags=dict(request.tags), + for on_demand_feature_view in permitted_resources( + resources=cast( + list[FeastObject], + self.proxied_registry.list_on_demand_feature_views( + project=request.project, + allow_cache=request.allow_cache, + tags=dict(request.tags), + ), + ), + actions=AuthzedAction.READ, ) ] ) @@ -183,18 +274,27 @@ def ListOnDemandFeatureViews( def ApplyFeatureService( self, request: RegistryServer_pb2.ApplyFeatureServiceRequest, context ): - self.proxied_registry.apply_feature_service( - feature_service=FeatureService.from_proto(request.feature_service), - project=request.project, - commit=request.commit, + assert_permissions( + resource=self.proxied_registry.apply_feature_service( + feature_service=FeatureService.from_proto(request.feature_service), + project=request.project, + commit=request.commit, + ), + actions=CRUD, ) + return Empty() def GetFeatureService( self, request: RegistryServer_pb2.GetFeatureServiceRequest, context ): - return self.proxied_registry.get_feature_service( - name=request.name, project=request.project, allow_cache=request.allow_cache + return assert_permissions( + resource=self.proxied_registry.get_feature_service( + name=request.name, + project=request.project, + allow_cache=request.allow_cache, + ), + actions=[AuthzedAction.READ], ).to_proto() def ListFeatureServices( @@ -203,10 +303,16 @@ def ListFeatureServices( return RegistryServer_pb2.ListFeatureServicesResponse( feature_services=[ feature_service.to_proto() - for feature_service in self.proxied_registry.list_feature_services( - project=request.project, - allow_cache=request.allow_cache, - tags=dict(request.tags), + for feature_service in permitted_resources( + resources=cast( + list[FeastObject], + self.proxied_registry.list_feature_services( + project=request.project, + allow_cache=request.allow_cache, + tags=dict(request.tags), + ), + ), + actions=AuthzedAction.READ, ) ] ) @@ -214,6 +320,15 @@ def ListFeatureServices( def DeleteFeatureService( self, request: RegistryServer_pb2.DeleteFeatureServiceRequest, context ): + ( + assert_permissions( + resource=self.proxied_registry.get_feature_service( + name=request.name, project=request.project + ), + actions=[AuthzedAction.DELETE], + ), + ) + self.proxied_registry.delete_feature_service( name=request.name, project=request.project, commit=request.commit ) @@ -222,18 +337,27 @@ def DeleteFeatureService( def ApplySavedDataset( self, request: RegistryServer_pb2.ApplySavedDatasetRequest, context ): - self.proxied_registry.apply_saved_dataset( - saved_dataset=SavedDataset.from_proto(request.saved_dataset), - project=request.project, - commit=request.commit, + assert_permissions( + resource=self.proxied_registry.apply_saved_dataset( + saved_dataset=SavedDataset.from_proto(request.saved_dataset), + project=request.project, + commit=request.commit, + ), + actions=CRUD, ) + return Empty() def GetSavedDataset( self, request: RegistryServer_pb2.GetSavedDatasetRequest, context ): - return self.proxied_registry.get_saved_dataset( - name=request.name, project=request.project, allow_cache=request.allow_cache + return assert_permissions( + self.proxied_registry.get_saved_dataset( + name=request.name, + project=request.project, + allow_cache=request.allow_cache, + ), + actions=[AuthzedAction.READ], ).to_proto() def ListSavedDatasets( @@ -242,8 +366,14 @@ def ListSavedDatasets( return RegistryServer_pb2.ListSavedDatasetsResponse( saved_datasets=[ saved_dataset.to_proto() - for saved_dataset in self.proxied_registry.list_saved_datasets( - project=request.project, allow_cache=request.allow_cache + for saved_dataset in permitted_resources( + resources=cast( + list[FeastObject], + self.proxied_registry.list_saved_datasets( + project=request.project, allow_cache=request.allow_cache + ), + ), + actions=AuthzedAction.READ, ) ] ) @@ -251,6 +381,13 @@ def ListSavedDatasets( def DeleteSavedDataset( self, request: RegistryServer_pb2.DeleteSavedDatasetRequest, context ): + assert_permissions( + resource=self.proxied_registry.get_saved_dataset( + name=request.name, project=request.project + ), + actions=[AuthzedAction.DELETE], + ) + self.proxied_registry.delete_saved_dataset( name=request.name, project=request.project, commit=request.commit ) @@ -259,20 +396,29 @@ def DeleteSavedDataset( def ApplyValidationReference( self, request: RegistryServer_pb2.ApplyValidationReferenceRequest, context ): - self.proxied_registry.apply_validation_reference( - validation_reference=ValidationReference.from_proto( - request.validation_reference + assert_permissions( + resource=self.proxied_registry.apply_validation_reference( + validation_reference=ValidationReference.from_proto( + request.validation_reference + ), + project=request.project, + commit=request.commit, ), - project=request.project, - commit=request.commit, + actions=CRUD, ) + return Empty() def GetValidationReference( self, request: RegistryServer_pb2.GetValidationReferenceRequest, context ): - return self.proxied_registry.get_validation_reference( - name=request.name, project=request.project, allow_cache=request.allow_cache + return assert_permissions( + self.proxied_registry.get_validation_reference( + name=request.name, + project=request.project, + allow_cache=request.allow_cache, + ), + actions=[AuthzedAction.READ], ).to_proto() def ListValidationReferences( @@ -281,8 +427,15 @@ def ListValidationReferences( return RegistryServer_pb2.ListValidationReferencesResponse( validation_references=[ validation_reference.to_proto() - for validation_reference in self.proxied_registry.list_validation_references( - project=request.project, allow_cache=request.allow_cache + for validation_reference in permitted_resources( + resources=cast( + list[FeastObject], + self.proxied_registry.list_validation_references( + project=request.project, + allow_cache=request.allow_cache, + ), + ), + actions=AuthzedAction.READ, ) ] ) @@ -290,6 +443,12 @@ def ListValidationReferences( def DeleteValidationReference( self, request: RegistryServer_pb2.DeleteValidationReferenceRequest, context ): + assert_permissions( + resource=self.proxied_registry.get_validation_reference( + name=request.name, project=request.project + ), + actions=[AuthzedAction.DELETE], + ) self.proxied_registry.delete_validation_reference( name=request.name, project=request.project, commit=request.commit ) @@ -310,6 +469,11 @@ def ListProjectMetadata( def ApplyMaterialization( self, request: RegistryServer_pb2.ApplyMaterializationRequest, context ): + assert_permissions( + resource=FeatureView.from_proto(request.feature_view), + actions=[AuthzedAction.WRITE_ONLINE], + ) + self.proxied_registry.apply_materialization( feature_view=FeatureView.from_proto(request.feature_view), project=request.project, @@ -340,19 +504,26 @@ def GetInfra(self, request: RegistryServer_pb2.GetInfraRequest, context): def ApplyPermission( self, request: RegistryServer_pb2.ApplyPermissionRequest, context ): - self.proxied_registry.apply_permission( - permission=Permission.from_proto(request.permission), - project=request.project, - commit=request.commit, + assert_permissions( + self.proxied_registry.apply_permission( + permission=Permission.from_proto(request.permission), + project=request.project, + commit=request.commit, + ), + actions=CRUD, ) return Empty() def GetPermission(self, request: RegistryServer_pb2.GetPermissionRequest, context): permission = self.proxied_registry.get_permission( name=request.name, project=request.project, allow_cache=request.allow_cache - ).to_proto() + ) + assert_permissions( + resource=permission, + actions=[AuthzedAction.READ], + ) + permission.to_proto().project = request.project - permission.project = request.project return permission def ListPermissions( @@ -361,9 +532,14 @@ def ListPermissions( return RegistryServer_pb2.ListPermissionsResponse( permissions=[ permission.to_proto() - for permission in self.proxied_registry.list_permissions( - project=request.project, - allow_cache=request.allow_cache, + for permission in permitted_resources( + resources=cast( + list[FeastObject], + self.proxied_registry.list_permissions( + project=request.project, allow_cache=request.allow_cache + ), + ), + actions=AuthzedAction.READ, ) ] ) @@ -371,6 +547,14 @@ def ListPermissions( def DeletePermission( self, request: RegistryServer_pb2.DeletePermissionRequest, context ): + assert_permissions( + resource=self.proxied_registry.get_permission( + name=request.name, + project=request.project, + ), + actions=[AuthzedAction.DELETE], + ) + self.proxied_registry.delete_permission( name=request.name, project=request.project, commit=request.commit ) From 34c151c0535ca3e5ff0b39273c52ea5569fbd5eb Mon Sep 17 00:00:00 2001 From: Abdul Hameed Date: Fri, 5 Jul 2024 11:29:45 -0400 Subject: [PATCH 035/169] Fix linter after rebase Signed-off-by: Abdul Hameed --- sdk/python/feast/errors.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/sdk/python/feast/errors.py b/sdk/python/feast/errors.py index 9fb0ca3edf..ff8da63ffa 100644 --- a/sdk/python/feast/errors.py +++ b/sdk/python/feast/errors.py @@ -404,8 +404,3 @@ def __init__(self, query: str): class ZeroColumnQueryResult(Exception): def __init__(self, query: str): super().__init__(f"This query returned zero columns:\n{query}") - - -class PermissionNotFoundException(Exception): - def __init__(self, name, project): - super().__init__(f"Permission {name} does not exist in project {project}") From aa0758c1b0000575e34ed8f99a9874f9046456c0 Mon Sep 17 00:00:00 2001 From: Theodor Mihalache Date: Mon, 8 Jul 2024 10:48:55 -0400 Subject: [PATCH 036/169] CLI command "feast permissions list" Added cli command permissions Added tags parameter to list_validation_references and list_saved_datasets in registry Added list_validation_references and list_saved_datasets apis to feature_store Added missing tags parameters to registry_server methods Signed-off-by: Theodor Mihalache Signed-off-by: Abdul Hameed --- protos/feast/registry/RegistryServer.proto | 2 + sdk/python/feast/cli.py | 275 +++++++++++++++++- sdk/python/feast/feature_store.py | 37 ++- .../feast/infra/registry/base_registry.py | 18 +- .../feast/infra/registry/caching_registry.py | 26 +- .../infra/registry/proto_registry_utils.py | 16 +- sdk/python/feast/infra/registry/registry.py | 16 +- sdk/python/feast/infra/registry/remote.py | 14 +- sdk/python/feast/infra/registry/snowflake.py | 14 +- sdk/python/feast/infra/registry/sql.py | 10 +- sdk/python/feast/permissions/permission.py | 3 + sdk/python/feast/registry_server.py | 5 +- .../requirements/py3.10-ci-requirements.txt | 1 + .../requirements/py3.10-requirements.txt | 1 + .../requirements/py3.11-ci-requirements.txt | 1 + .../requirements/py3.11-requirements.txt | 1 + .../requirements/py3.9-ci-requirements.txt | 1 + .../requirements/py3.9-requirements.txt | 1 + .../registration/test_universal_registry.py | 4 +- 19 files changed, 409 insertions(+), 37 deletions(-) diff --git a/protos/feast/registry/RegistryServer.proto b/protos/feast/registry/RegistryServer.proto index fc2ab12217..928354077b 100644 --- a/protos/feast/registry/RegistryServer.proto +++ b/protos/feast/registry/RegistryServer.proto @@ -284,6 +284,7 @@ message GetSavedDatasetRequest { message ListSavedDatasetsRequest { string project = 1; bool allow_cache = 2; + map tags = 3; } message ListSavedDatasetsResponse { @@ -313,6 +314,7 @@ message GetValidationReferenceRequest { message ListValidationReferencesRequest { string project = 1; bool allow_cache = 2; + map tags = 3; } message ListValidationReferencesResponse { diff --git a/sdk/python/feast/cli.py b/sdk/python/feast/cli.py index f4e3e97d27..f5cf1c82bf 100644 --- a/sdk/python/feast/cli.py +++ b/sdk/python/feast/cli.py @@ -16,7 +16,7 @@ from datetime import datetime from importlib.metadata import version as importlib_version from pathlib import Path -from typing import List, Optional +from typing import Any, List, Optional import click import yaml @@ -24,15 +24,17 @@ from dateutil import parser from pygments import formatters, highlight, lexers -from feast import utils +from feast import BatchFeatureView, Entity, FeatureService, StreamFeatureView, utils from feast.constants import ( DEFAULT_FEATURE_TRANSFORMATION_SERVER_PORT, DEFAULT_OFFLINE_SERVER_PORT, DEFAULT_REGISTRY_SERVER_PORT, ) +from feast.data_source import DataSource from feast.errors import FeastObjectNotFoundException, FeastProviderLoginError from feast.feature_view import FeatureView from feast.on_demand_feature_view import OnDemandFeatureView +from feast.permissions.policy import RoleBasedPolicy from feast.repo_config import load_repo_config from feast.repo_operations import ( apply_total, @@ -44,6 +46,7 @@ registry_dump, teardown, ) +from feast.saved_dataset import SavedDataset, ValidationReference from feast.utils import maybe_local_tz _logger = logging.getLogger(__name__) @@ -879,5 +882,273 @@ def validate( exit(1) +@cli.group(name="feast-permissions") +def feast_permissions_cmd(): + """ + Access permissions + """ + pass + + +@feast_permissions_cmd.command(name="list") +@click.option( + "--verbose", + "-v", + is_flag=True, + help="Print the resources matching each configured permission", +) +@tagsOption +@click.pass_context +def feast_permissions_command(ctx: click.Context, verbose: bool, tags: list[str]): + from bigtree import Node + from tabulate import tabulate + + table: list[Any] = [] + tags_filter = utils.tags_list_to_dict(tags) + + store = create_feature_store(ctx) + + permissions = store.list_permissions(tags=tags_filter) + + root_node = Node("permissions") + roles: set[str] = set() + + for p in permissions: + policy = p.policy + if not verbose: + _handle_not_verbose_permissions_command(p, policy, roles, table) + else: + if isinstance(policy, RoleBasedPolicy) and len(policy.get_roles()) > 0: + roles = set(policy.get_roles()) + permission_node = Node( + p.name + " " + str(list(roles)), parent=root_node + ) + else: + permission_node = Node(p.name, parent=root_node) + + for feast_type in p.types: + if feast_type in [ + FeatureView, + OnDemandFeatureView, + BatchFeatureView, + StreamFeatureView, + ]: + _handle_fv_verbose_permissions_command( + p, permission_node, store, feast_type, tags_filter + ) + elif feast_type == Entity: + _handle_entity_verbose_permissions_command( + feast_type, p, permission_node, store, tags_filter + ) + elif feast_type == FeatureService: + _handle_fs_verbose_permissions_command( + feast_type, p, permission_node, store, tags_filter + ) + elif feast_type == DataSource: + _handle_ds_verbose_permissions_command( + feast_type, p, permission_node, store, tags_filter + ) + elif feast_type == ValidationReference: + _handle_vr_verbose_permissions_command( + feast_type, p, permission_node, store, tags_filter + ) + elif feast_type == SavedDataset: + _handle_sd_verbose_permissions_command( + feast_type, p, permission_node, store, tags_filter + ) + + if not verbose: + print( + tabulate( + table, + headers=[ + "NAME", + "TYPES", + "WITH_SUBCLASS", + "NAME_PATTERN", + "ACTIONS", + "ROLES", + ], + tablefmt="plain", + ) + ) + else: + _print_permission_verbose_example() + + print("Permissions:") + print("") + root_node.show() + + +def _print_permission_verbose_example(): + from bigtree import Node + + print("") + print( + f"{Style.BRIGHT + Fore.GREEN}The structure of the {Style.BRIGHT + Fore.WHITE}feast-permissions list --verbose {Style.BRIGHT + Fore.GREEN}command will be as in the following example:" + ) + print("") + print(f"{Style.DIM}For example: {Style.RESET_ALL}{Style.BRIGHT + Fore.GREEN}") + print("") + explanation_root_node = Node("permissions") + explanation_permission_node = Node( + "permission_1" + " " + str(["role names list"]), + parent=explanation_root_node, + ) + Node( + FeatureView.__name__ + ": " + str(["feature view names"]), + parent=explanation_permission_node, + ) + Node(FeatureService.__name__ + ": none", parent=explanation_permission_node) + Node("..", parent=explanation_permission_node) + Node( + "permission_2" + " " + str(["role names list"]), + parent=explanation_root_node, + ) + Node("..", parent=explanation_root_node) + explanation_root_node.show() + print( + f""" +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------{Style.RESET_ALL} + """ + ) + + +def _handle_sd_verbose_permissions_command( + feast_type, p, policy_node, store, tags_filter +): + from bigtree import Node + + saved_datasets = store.list_saved_datasets(tags=tags_filter) + saved_datasets_names = set() + for sd in saved_datasets: + if p.match_resource(sd): + saved_datasets_names.add(sd.name) + if len(saved_datasets_names) > 0: + Node( + feast_type.__name__ + ": " + str(list(saved_datasets_names)), # type: ignore[union-attr] + parent=policy_node, + ) + else: + Node(feast_type.__name__ + ": none", parent=policy_node) # type: ignore[union-attr] + + +def _handle_vr_verbose_permissions_command( + feast_type, p, policy_node, store, tags_filter +): + from bigtree import Node + + validation_references = store.list_validation_references(tags=tags_filter) + validation_references_names = set() + for vr in validation_references: + if p.match_resource(vr): + validation_references_names.add(vr.name) + if len(validation_references_names) > 0: + Node( + feast_type.__name__ + ": " + str(list(validation_references_names)), # type: ignore[union-attr] + parent=policy_node, + ) + else: + Node(feast_type.__name__ + ": none", parent=policy_node) # type: ignore[union-attr] + + +def _handle_ds_verbose_permissions_command( + feast_type, p, policy_node, store, tags_filter +): + from bigtree import Node + + data_sources = store.list_data_sources(tags=tags_filter) + data_sources_names = set() + for ds in data_sources: + if p.match_resource(ds): + data_sources_names.add(ds.name) + if len(data_sources_names) > 0: + Node( + feast_type.__name__ + ": " + str(list(data_sources_names)), # type: ignore[union-attr] + parent=policy_node, + ) + else: + Node(feast_type.__name__ + ": none", parent=policy_node) # type: ignore[union-attr] + + +def _handle_fs_verbose_permissions_command( + feast_type, p, policy_node, store, tags_filter +): + from bigtree import Node + + feature_services = store.list_feature_services(tags=tags_filter) + feature_services_names = set() + for fs in feature_services: + if p.match_resource(fs): + feature_services_names.add(fs.name) + if len(feature_services_names) > 0: + Node( + feast_type.__name__ + ": " + str(list(feature_services_names)), # type: ignore[union-attr] + parent=policy_node, + ) + else: + Node(feast_type.__name__ + ": none", parent=policy_node) # type: ignore[union-attr] + + +def _handle_entity_verbose_permissions_command( + feast_type, p, policy_node, store, tags_filter +): + from bigtree import Node + + entities = store.list_entities(tags=tags_filter) + entities_names = set() + for e in entities: + if p.match_resource(e): + entities_names.add(e.name) + if len(entities_names) > 0: + Node(feast_type.__name__ + ": " + str(list(entities_names)), parent=policy_node) # type: ignore[union-attr] + else: + Node(feast_type.__name__ + ": none", parent=policy_node) # type: ignore[union-attr] + + +def _handle_fv_verbose_permissions_command(p, policy_node, store, t, tags_filter): + from bigtree import Node + + feature_views = [] + feature_views_names = set() + if t == FeatureView: + feature_views = store.list_all_feature_views(tags=tags_filter) # type: ignore[assignment] + elif t == OnDemandFeatureView: + feature_views = store.list_on_demand_feature_views( + tags=tags_filter # type: ignore[assignment] + ) + elif t == BatchFeatureView: + feature_views = store.list_batch_feature_views(tags=tags_filter) # type: ignore[assignment] + elif t == StreamFeatureView: + feature_views = store.list_stream_feature_views( + tags=tags_filter # type: ignore[assignment] + ) + for fv in feature_views: + if p.match_resource(fv): + feature_views_names.add(fv.name) + if len(feature_views_names) > 0: + Node( + t.__name__ + " " + str(list(feature_views_names)), # type: ignore[union-attr] + parent=policy_node, + ) + else: + Node(t.__name__ + ": none", parent=policy_node) # type: ignore[union-attr] + + +def _handle_not_verbose_permissions_command(p, policy, roles, table): + if isinstance(policy, RoleBasedPolicy): + roles = set(policy.get_roles()) + table.append( + [ + p.name, + [t.__name__ for t in p.types], # type: ignore[union-attr] + p.with_subclasses, + p.name_pattern, + p.actions, + roles, + ] + ) + + if __name__ == "__main__": cli() diff --git a/sdk/python/feast/feature_store.py b/sdk/python/feast/feature_store.py index 15ec8e1451..13e7b54ed2 100644 --- a/sdk/python/feast/feature_store.py +++ b/sdk/python/feast/feature_store.py @@ -1931,6 +1931,23 @@ def get_validation_reference( ref._dataset = self.get_saved_dataset(ref.dataset_name) return ref + def list_validation_references( + self, allow_cache: bool = False, tags: Optional[dict[str, str]] = None + ) -> List[ValidationReference]: + """ + Retrieves the list of validation references from the registry. + + Args: + allow_cache: Whether to allow returning validation references from a cached registry. + tags: Filter by tags. + + Returns: + A list of validation references. + """ + return self._registry.list_validation_references( + self.project, allow_cache=allow_cache, tags=tags + ) + def list_permissions( self, allow_cache: bool = False, tags: Optional[dict[str, str]] = None ) -> List[Permission]: @@ -1939,14 +1956,32 @@ def list_permissions( Args: allow_cache: Whether to allow returning permissions from a cached registry. + tags: Filter by tags. Returns: - A list of data sources. + A list of permissions. """ return self._registry.list_permissions( self.project, allow_cache=allow_cache, tags=tags ) + def list_saved_datasets( + self, allow_cache: bool = False, tags: Optional[dict[str, str]] = None + ) -> List[SavedDataset]: + """ + Retrieves the list of saved datasets from the registry. + + Args: + allow_cache: Whether to allow returning saved datasets from a cached registry. + tags: Filter by tags. + + Returns: + A list of saved datasets. + """ + return self._registry.list_saved_datasets( + self.project, allow_cache=allow_cache, tags=tags + ) + def _print_materialization_log( start_date, end_date, num_feature_views: int, online_store: str diff --git a/sdk/python/feast/infra/registry/base_registry.py b/sdk/python/feast/infra/registry/base_registry.py index a5af1d85da..5ba9cbedb9 100644 --- a/sdk/python/feast/infra/registry/base_registry.py +++ b/sdk/python/feast/infra/registry/base_registry.py @@ -458,7 +458,10 @@ def delete_saved_dataset(self, name: str, project: str, commit: bool = True): @abstractmethod def list_saved_datasets( - self, project: str, allow_cache: bool = False + self, + project: str, + allow_cache: bool = False, + tags: Optional[dict[str, str]] = None, ) -> List[SavedDataset]: """ Retrieves a list of all saved datasets in specified project @@ -466,6 +469,7 @@ def list_saved_datasets( Args: project: Feast project allow_cache: Whether to allow returning this dataset from a cached registry + tags: Filter by tags Returns: Returns the list of SavedDatasets @@ -522,17 +526,21 @@ def get_validation_reference( # TODO: Needs to be implemented. def list_validation_references( - self, project: str, allow_cache: bool = False + self, + project: str, + allow_cache: bool = False, + tags: Optional[dict[str, str]] = None, ) -> List[ValidationReference]: """ Retrieve a list of validation references from the registry Args: - allow_cache: Allow returning feature views from the cached registry - project: Filter feature views based on project name + project: Filter validation references based on project name + allow_cache: Allow returning validation references from the cached registry + tags: Filter by tags Returns: - List of request feature views + List of request validation references """ raise NotImplementedError diff --git a/sdk/python/feast/infra/registry/caching_registry.py b/sdk/python/feast/infra/registry/caching_registry.py index 7533272e37..611d67de96 100644 --- a/sdk/python/feast/infra/registry/caching_registry.py +++ b/sdk/python/feast/infra/registry/caching_registry.py @@ -250,18 +250,23 @@ def get_saved_dataset( return self._get_saved_dataset(name, project) @abstractmethod - def _list_saved_datasets(self, project: str) -> List[SavedDataset]: + def _list_saved_datasets( + self, project: str, tags: Optional[dict[str, str]] = None + ) -> List[SavedDataset]: pass def list_saved_datasets( - self, project: str, allow_cache: bool = False + self, + project: str, + allow_cache: bool = False, + tags: Optional[dict[str, str]] = None, ) -> List[SavedDataset]: if allow_cache: self._refresh_cached_registry_if_necessary() return proto_registry_utils.list_saved_datasets( - self.cached_registry_proto, project + self.cached_registry_proto, project, tags ) - return self._list_saved_datasets(project) + return self._list_saved_datasets(project, tags) @abstractmethod def _get_validation_reference(self, name: str, project: str) -> ValidationReference: @@ -278,18 +283,23 @@ def get_validation_reference( return self._get_validation_reference(name, project) @abstractmethod - def _list_validation_references(self, project: str) -> List[ValidationReference]: + def _list_validation_references( + self, project: str, tags: Optional[dict[str, str]] = None + ) -> List[ValidationReference]: pass def list_validation_references( - self, project: str, allow_cache: bool = False + self, + project: str, + allow_cache: bool = False, + tags: Optional[dict[str, str]] = None, ) -> List[ValidationReference]: if allow_cache: self._refresh_cached_registry_if_necessary() return proto_registry_utils.list_validation_references( - self.cached_registry_proto, project + self.cached_registry_proto, project, tags ) - return self._list_validation_references(project) + return self._list_validation_references(project, tags) @abstractmethod def _list_project_metadata(self, project: str) -> List[ProjectMetadata]: diff --git a/sdk/python/feast/infra/registry/proto_registry_utils.py b/sdk/python/feast/infra/registry/proto_registry_utils.py index bb4eb4ee40..7a24be3ed5 100644 --- a/sdk/python/feast/infra/registry/proto_registry_utils.py +++ b/sdk/python/feast/infra/registry/proto_registry_utils.py @@ -254,24 +254,28 @@ def list_data_sources( return data_sources -@registry_proto_cache +@registry_proto_cache_with_tags def list_saved_datasets( - registry_proto: RegistryProto, project: str + registry_proto: RegistryProto, project: str, tags: Optional[dict[str, str]] ) -> List[SavedDataset]: saved_datasets = [] for saved_dataset in registry_proto.saved_datasets: - if saved_dataset.spec.project == project: + if saved_dataset.spec.project == project and utils.has_all_tags( + saved_dataset.tags, tags + ): saved_datasets.append(SavedDataset.from_proto(saved_dataset)) return saved_datasets -@registry_proto_cache +@registry_proto_cache_with_tags def list_validation_references( - registry_proto: RegistryProto, project: str + registry_proto: RegistryProto, project: str, tags: Optional[dict[str, str]] ) -> List[ValidationReference]: validation_references = [] for validation_reference in registry_proto.validation_references: - if validation_reference.project == project: + if validation_reference.project == project and utils.has_all_tags( + validation_reference.tags, tags + ): validation_references.append( ValidationReference.from_proto(validation_reference) ) diff --git a/sdk/python/feast/infra/registry/registry.py b/sdk/python/feast/infra/registry/registry.py index 64672ad0c9..dfd0ed94e3 100644 --- a/sdk/python/feast/infra/registry/registry.py +++ b/sdk/python/feast/infra/registry/registry.py @@ -711,12 +711,15 @@ def get_saved_dataset( return proto_registry_utils.get_saved_dataset(registry_proto, name, project) def list_saved_datasets( - self, project: str, allow_cache: bool = False + self, + project: str, + allow_cache: bool = False, + tags: Optional[dict[str, str]] = None, ) -> List[SavedDataset]: registry_proto = self._get_registry_proto( project=project, allow_cache=allow_cache ) - return proto_registry_utils.list_saved_datasets(registry_proto, project) + return proto_registry_utils.list_saved_datasets(registry_proto, project, tags) def apply_validation_reference( self, @@ -753,12 +756,17 @@ def get_validation_reference( ) def list_validation_references( - self, project: str, allow_cache: bool = False + self, + project: str, + allow_cache: bool = False, + tags: Optional[dict[str, str]] = None, ) -> List[ValidationReference]: registry_proto = self._get_registry_proto( project=project, allow_cache=allow_cache ) - return proto_registry_utils.list_validation_references(registry_proto, project) + return proto_registry_utils.list_validation_references( + registry_proto, project, tags + ) def delete_validation_reference(self, name: str, project: str, commit: bool = True): registry_proto = self._prepare_registry_for_changes(project) diff --git a/sdk/python/feast/infra/registry/remote.py b/sdk/python/feast/infra/registry/remote.py index 2b1e40b50d..0e46b6dde6 100644 --- a/sdk/python/feast/infra/registry/remote.py +++ b/sdk/python/feast/infra/registry/remote.py @@ -339,10 +339,13 @@ def get_saved_dataset( return SavedDataset.from_proto(response) def list_saved_datasets( - self, project: str, allow_cache: bool = False + self, + project: str, + allow_cache: bool = False, + tags: Optional[dict[str, str]] = None, ) -> List[SavedDataset]: request = RegistryServer_pb2.ListSavedDatasetsRequest( - project=project, allow_cache=allow_cache + project=project, allow_cache=allow_cache, tags=tags ) response = self.stub.ListSavedDatasets(request) @@ -385,10 +388,13 @@ def get_validation_reference( return ValidationReference.from_proto(response) def list_validation_references( - self, project: str, allow_cache: bool = False + self, + project: str, + allow_cache: bool = False, + tags: Optional[dict[str, str]] = None, ) -> List[ValidationReference]: request = RegistryServer_pb2.ListValidationReferencesRequest( - project=project, allow_cache=allow_cache + project=project, allow_cache=allow_cache, tags=tags ) response = self.stub.ListValidationReferences(request) diff --git a/sdk/python/feast/infra/registry/snowflake.py b/sdk/python/feast/infra/registry/snowflake.py index 0856e52246..801b90afe3 100644 --- a/sdk/python/feast/infra/registry/snowflake.py +++ b/sdk/python/feast/infra/registry/snowflake.py @@ -758,12 +758,15 @@ def list_on_demand_feature_views( ) def list_saved_datasets( - self, project: str, allow_cache: bool = False + self, + project: str, + allow_cache: bool = False, + tags: Optional[dict[str, str]] = None, ) -> List[SavedDataset]: if allow_cache: self._refresh_cached_registry_if_necessary() return proto_registry_utils.list_saved_datasets( - self.cached_registry_proto, project + self.cached_registry_proto, project, tags ) return self._list_objects( "SAVED_DATASETS", @@ -771,6 +774,7 @@ def list_saved_datasets( SavedDatasetProto, SavedDataset, "SAVED_DATASET_PROTO", + tags=tags, ) def list_stream_feature_views( @@ -794,7 +798,10 @@ def list_stream_feature_views( ) def list_validation_references( - self, project: str, allow_cache: bool = False + self, + project: str, + allow_cache: bool = False, + tags: Optional[dict[str, str]] = None, ) -> List[ValidationReference]: return self._list_objects( "VALIDATION_REFERENCES", @@ -802,6 +809,7 @@ def list_validation_references( ValidationReferenceProto, ValidationReference, "VALIDATION_REFERENCE_PROTO", + tags=tags, ) def _list_objects( diff --git a/sdk/python/feast/infra/registry/sql.py b/sdk/python/feast/infra/registry/sql.py index 25bf49fdcb..cd6d2e2bb3 100644 --- a/sdk/python/feast/infra/registry/sql.py +++ b/sdk/python/feast/infra/registry/sql.py @@ -332,13 +332,16 @@ def _get_validation_reference(self, name: str, project: str) -> ValidationRefere not_found_exception=ValidationReferenceNotFound, ) - def _list_validation_references(self, project: str) -> List[ValidationReference]: + def _list_validation_references( + self, project: str, tags: Optional[dict[str, str]] = None + ) -> List[ValidationReference]: return self._list_objects( table=validation_references, project=project, proto_class=ValidationReferenceProto, python_class=ValidationReference, proto_field_name="validation_reference_proto", + tags=tags, ) def _list_entities( @@ -460,13 +463,16 @@ def _list_feature_views( tags=tags, ) - def _list_saved_datasets(self, project: str) -> List[SavedDataset]: + def _list_saved_datasets( + self, project: str, tags: Optional[dict[str, str]] = None + ) -> List[SavedDataset]: return self._list_objects( saved_datasets, project, SavedDatasetProto, SavedDataset, "saved_dataset_proto", + tags=tags, ) def _list_on_demand_feature_views( diff --git a/sdk/python/feast/permissions/permission.py b/sdk/python/feast/permissions/permission.py index 2f8f820765..e8be31596b 100644 --- a/sdk/python/feast/permissions/permission.py +++ b/sdk/python/feast/permissions/permission.py @@ -94,6 +94,9 @@ def __eq__(self, other): return True + def __hash__(self): + return hash(self.name) + _global_decision_strategy: DecisionStrategy = DecisionStrategy.UNANIMOUS @staticmethod diff --git a/sdk/python/feast/registry_server.py b/sdk/python/feast/registry_server.py index 86e0e66be2..e7dce34d18 100644 --- a/sdk/python/feast/registry_server.py +++ b/sdk/python/feast/registry_server.py @@ -370,7 +370,9 @@ def ListSavedDatasets( resources=cast( list[FeastObject], self.proxied_registry.list_saved_datasets( - project=request.project, allow_cache=request.allow_cache + project=request.project, + allow_cache=request.allow_cache, + tags=dict(request.tags), ), ), actions=AuthzedAction.READ, @@ -433,6 +435,7 @@ def ListValidationReferences( self.proxied_registry.list_validation_references( project=request.project, allow_cache=request.allow_cache, + tags=dict(request.tags), ), ), actions=AuthzedAction.READ, diff --git a/sdk/python/requirements/py3.10-ci-requirements.txt b/sdk/python/requirements/py3.10-ci-requirements.txt index 785342550a..52525ac63b 100644 --- a/sdk/python/requirements/py3.10-ci-requirements.txt +++ b/sdk/python/requirements/py3.10-ci-requirements.txt @@ -1050,3 +1050,4 @@ yarl==1.9.4 # via aiohttp zipp==3.19.1 # via importlib-metadata +bigtree==0.19.2 diff --git a/sdk/python/requirements/py3.10-requirements.txt b/sdk/python/requirements/py3.10-requirements.txt index 250e617b85..f1ec2b16ab 100644 --- a/sdk/python/requirements/py3.10-requirements.txt +++ b/sdk/python/requirements/py3.10-requirements.txt @@ -222,3 +222,4 @@ websockets==12.0 # via uvicorn zipp==3.19.1 # via importlib-metadata +bigtree==0.19.2 diff --git a/sdk/python/requirements/py3.11-ci-requirements.txt b/sdk/python/requirements/py3.11-ci-requirements.txt index f16b486aa5..b58d12f46f 100644 --- a/sdk/python/requirements/py3.11-ci-requirements.txt +++ b/sdk/python/requirements/py3.11-ci-requirements.txt @@ -1028,3 +1028,4 @@ yarl==1.9.4 # via aiohttp zipp==3.19.1 # via importlib-metadata +bigtree==0.19.2 diff --git a/sdk/python/requirements/py3.11-requirements.txt b/sdk/python/requirements/py3.11-requirements.txt index 4f1655de09..e51452a594 100644 --- a/sdk/python/requirements/py3.11-requirements.txt +++ b/sdk/python/requirements/py3.11-requirements.txt @@ -216,3 +216,4 @@ websockets==12.0 # via uvicorn zipp==3.19.1 # via importlib-metadata +bigtree==0.19.2 diff --git a/sdk/python/requirements/py3.9-ci-requirements.txt b/sdk/python/requirements/py3.9-ci-requirements.txt index 94bfa82058..422fea1602 100644 --- a/sdk/python/requirements/py3.9-ci-requirements.txt +++ b/sdk/python/requirements/py3.9-ci-requirements.txt @@ -1064,3 +1064,4 @@ yarl==1.9.4 # via aiohttp zipp==3.19.1 # via importlib-metadata +bigtree==0.19.2 diff --git a/sdk/python/requirements/py3.9-requirements.txt b/sdk/python/requirements/py3.9-requirements.txt index f9fa856a0e..0b3c8a33c9 100644 --- a/sdk/python/requirements/py3.9-requirements.txt +++ b/sdk/python/requirements/py3.9-requirements.txt @@ -225,3 +225,4 @@ websockets==12.0 # via uvicorn zipp==3.19.2 # via importlib-metadata +bigtree==0.19.2 diff --git a/sdk/python/tests/integration/registration/test_universal_registry.py b/sdk/python/tests/integration/registration/test_universal_registry.py index c227e09457..c5e69dc60a 100644 --- a/sdk/python/tests/integration/registration/test_universal_registry.py +++ b/sdk/python/tests/integration/registration/test_universal_registry.py @@ -1205,7 +1205,9 @@ def simple_udf(x: int): assert stream_feature_views[0] == sfv test_registry.delete_feature_view("test kafka stream feature view", project) - stream_feature_views = test_registry.list_stream_feature_views(project) + stream_feature_views = test_registry.list_stream_feature_views( + project, tags=sfv.tags + ) assert len(stream_feature_views) == 0 test_registry.teardown() From fbe1bd557e3e7f2f943fc2242e4816c28bae18db Mon Sep 17 00:00:00 2001 From: Theodor Mihalache Date: Mon, 8 Jul 2024 11:38:55 -0400 Subject: [PATCH 037/169] CLI command "feast permissions list" - Changes following review Signed-off-by: Theodor Mihalache Signed-off-by: Abdul Hameed --- sdk/python/feast/cli.py | 225 ++++++---------------------------- sdk/python/feast/cli_utils.py | 201 ++++++++++++++++++++++++++++++ 2 files changed, 241 insertions(+), 185 deletions(-) create mode 100644 sdk/python/feast/cli_utils.py diff --git a/sdk/python/feast/cli.py b/sdk/python/feast/cli.py index f5cf1c82bf..ca92d58fa6 100644 --- a/sdk/python/feast/cli.py +++ b/sdk/python/feast/cli.py @@ -20,10 +20,12 @@ import click import yaml +from bigtree import Node from colorama import Fore, Style from dateutil import parser from pygments import formatters, highlight, lexers +import feast.cli_utils as cli_utils from feast import BatchFeatureView, Entity, FeatureService, StreamFeatureView, utils from feast.constants import ( DEFAULT_FEATURE_TRANSFORMATION_SERVER_PORT, @@ -900,7 +902,6 @@ def feast_permissions_cmd(): @tagsOption @click.pass_context def feast_permissions_command(ctx: click.Context, verbose: bool, tags: list[str]): - from bigtree import Node from tabulate import tabulate table: list[Any] = [] @@ -916,7 +917,7 @@ def feast_permissions_command(ctx: click.Context, verbose: bool, tags: list[str] for p in permissions: policy = p.policy if not verbose: - _handle_not_verbose_permissions_command(p, policy, roles, table) + cli_utils.handle_not_verbose_permissions_command(p, policy, table) else: if isinstance(policy, RoleBasedPolicy) and len(policy.get_roles()) > 0: roles = set(policy.get_roles()) @@ -933,28 +934,52 @@ def feast_permissions_command(ctx: click.Context, verbose: bool, tags: list[str] BatchFeatureView, StreamFeatureView, ]: - _handle_fv_verbose_permissions_command( - p, permission_node, store, feast_type, tags_filter + cli_utils.handle_fv_verbose_permissions_command( + feast_type, # type: ignore[arg-type] + p, + permission_node, + store, + tags_filter, ) elif feast_type == Entity: - _handle_entity_verbose_permissions_command( - feast_type, p, permission_node, store, tags_filter + cli_utils.handle_entity_verbose_permissions_command( + feast_type, # type: ignore[arg-type] + p, + permission_node, + store, + tags_filter, ) elif feast_type == FeatureService: - _handle_fs_verbose_permissions_command( - feast_type, p, permission_node, store, tags_filter + cli_utils.handle_fs_verbose_permissions_command( + feast_type, # type: ignore[arg-type] + p, + permission_node, + store, + tags_filter, ) elif feast_type == DataSource: - _handle_ds_verbose_permissions_command( - feast_type, p, permission_node, store, tags_filter + cli_utils.handle_ds_verbose_permissions_command( + feast_type, # type: ignore[arg-type] + p, + permission_node, + store, + tags_filter, ) elif feast_type == ValidationReference: - _handle_vr_verbose_permissions_command( - feast_type, p, permission_node, store, tags_filter + cli_utils.handle_vr_verbose_permissions_command( + feast_type, # type: ignore[arg-type] + p, + permission_node, + store, + tags_filter, ) elif feast_type == SavedDataset: - _handle_sd_verbose_permissions_command( - feast_type, p, permission_node, store, tags_filter + cli_utils.handle_sd_verbose_permissions_command( + feast_type, # type: ignore[arg-type] + p, + permission_node, + store, + tags_filter, ) if not verbose: @@ -973,182 +998,12 @@ def feast_permissions_command(ctx: click.Context, verbose: bool, tags: list[str] ) ) else: - _print_permission_verbose_example() + cli_utils.print_permission_verbose_example() print("Permissions:") print("") root_node.show() -def _print_permission_verbose_example(): - from bigtree import Node - - print("") - print( - f"{Style.BRIGHT + Fore.GREEN}The structure of the {Style.BRIGHT + Fore.WHITE}feast-permissions list --verbose {Style.BRIGHT + Fore.GREEN}command will be as in the following example:" - ) - print("") - print(f"{Style.DIM}For example: {Style.RESET_ALL}{Style.BRIGHT + Fore.GREEN}") - print("") - explanation_root_node = Node("permissions") - explanation_permission_node = Node( - "permission_1" + " " + str(["role names list"]), - parent=explanation_root_node, - ) - Node( - FeatureView.__name__ + ": " + str(["feature view names"]), - parent=explanation_permission_node, - ) - Node(FeatureService.__name__ + ": none", parent=explanation_permission_node) - Node("..", parent=explanation_permission_node) - Node( - "permission_2" + " " + str(["role names list"]), - parent=explanation_root_node, - ) - Node("..", parent=explanation_root_node) - explanation_root_node.show() - print( - f""" --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------{Style.RESET_ALL} - """ - ) - - -def _handle_sd_verbose_permissions_command( - feast_type, p, policy_node, store, tags_filter -): - from bigtree import Node - - saved_datasets = store.list_saved_datasets(tags=tags_filter) - saved_datasets_names = set() - for sd in saved_datasets: - if p.match_resource(sd): - saved_datasets_names.add(sd.name) - if len(saved_datasets_names) > 0: - Node( - feast_type.__name__ + ": " + str(list(saved_datasets_names)), # type: ignore[union-attr] - parent=policy_node, - ) - else: - Node(feast_type.__name__ + ": none", parent=policy_node) # type: ignore[union-attr] - - -def _handle_vr_verbose_permissions_command( - feast_type, p, policy_node, store, tags_filter -): - from bigtree import Node - - validation_references = store.list_validation_references(tags=tags_filter) - validation_references_names = set() - for vr in validation_references: - if p.match_resource(vr): - validation_references_names.add(vr.name) - if len(validation_references_names) > 0: - Node( - feast_type.__name__ + ": " + str(list(validation_references_names)), # type: ignore[union-attr] - parent=policy_node, - ) - else: - Node(feast_type.__name__ + ": none", parent=policy_node) # type: ignore[union-attr] - - -def _handle_ds_verbose_permissions_command( - feast_type, p, policy_node, store, tags_filter -): - from bigtree import Node - - data_sources = store.list_data_sources(tags=tags_filter) - data_sources_names = set() - for ds in data_sources: - if p.match_resource(ds): - data_sources_names.add(ds.name) - if len(data_sources_names) > 0: - Node( - feast_type.__name__ + ": " + str(list(data_sources_names)), # type: ignore[union-attr] - parent=policy_node, - ) - else: - Node(feast_type.__name__ + ": none", parent=policy_node) # type: ignore[union-attr] - - -def _handle_fs_verbose_permissions_command( - feast_type, p, policy_node, store, tags_filter -): - from bigtree import Node - - feature_services = store.list_feature_services(tags=tags_filter) - feature_services_names = set() - for fs in feature_services: - if p.match_resource(fs): - feature_services_names.add(fs.name) - if len(feature_services_names) > 0: - Node( - feast_type.__name__ + ": " + str(list(feature_services_names)), # type: ignore[union-attr] - parent=policy_node, - ) - else: - Node(feast_type.__name__ + ": none", parent=policy_node) # type: ignore[union-attr] - - -def _handle_entity_verbose_permissions_command( - feast_type, p, policy_node, store, tags_filter -): - from bigtree import Node - - entities = store.list_entities(tags=tags_filter) - entities_names = set() - for e in entities: - if p.match_resource(e): - entities_names.add(e.name) - if len(entities_names) > 0: - Node(feast_type.__name__ + ": " + str(list(entities_names)), parent=policy_node) # type: ignore[union-attr] - else: - Node(feast_type.__name__ + ": none", parent=policy_node) # type: ignore[union-attr] - - -def _handle_fv_verbose_permissions_command(p, policy_node, store, t, tags_filter): - from bigtree import Node - - feature_views = [] - feature_views_names = set() - if t == FeatureView: - feature_views = store.list_all_feature_views(tags=tags_filter) # type: ignore[assignment] - elif t == OnDemandFeatureView: - feature_views = store.list_on_demand_feature_views( - tags=tags_filter # type: ignore[assignment] - ) - elif t == BatchFeatureView: - feature_views = store.list_batch_feature_views(tags=tags_filter) # type: ignore[assignment] - elif t == StreamFeatureView: - feature_views = store.list_stream_feature_views( - tags=tags_filter # type: ignore[assignment] - ) - for fv in feature_views: - if p.match_resource(fv): - feature_views_names.add(fv.name) - if len(feature_views_names) > 0: - Node( - t.__name__ + " " + str(list(feature_views_names)), # type: ignore[union-attr] - parent=policy_node, - ) - else: - Node(t.__name__ + ": none", parent=policy_node) # type: ignore[union-attr] - - -def _handle_not_verbose_permissions_command(p, policy, roles, table): - if isinstance(policy, RoleBasedPolicy): - roles = set(policy.get_roles()) - table.append( - [ - p.name, - [t.__name__ for t in p.types], # type: ignore[union-attr] - p.with_subclasses, - p.name_pattern, - p.actions, - roles, - ] - ) - - if __name__ == "__main__": cli() diff --git a/sdk/python/feast/cli_utils.py b/sdk/python/feast/cli_utils.py new file mode 100644 index 0000000000..ad09e732bd --- /dev/null +++ b/sdk/python/feast/cli_utils.py @@ -0,0 +1,201 @@ +from typing import Any, Optional + +from bigtree import Node +from colorama import Fore, Style + +from feast import ( + BatchFeatureView, + FeatureService, + FeatureStore, + FeatureView, + OnDemandFeatureView, + StreamFeatureView, +) +from feast.feast_object import FeastObject +from feast.permissions.permission import Permission +from feast.permissions.policy import Policy, RoleBasedPolicy + + +def print_permission_verbose_example(): + print("") + print( + f"{Style.BRIGHT + Fore.GREEN}The structure of the {Style.BRIGHT + Fore.WHITE}feast-permissions list --verbose {Style.BRIGHT + Fore.GREEN}command will be as in the following example:" + ) + print("") + print(f"{Style.DIM}For example: {Style.RESET_ALL}{Style.BRIGHT + Fore.GREEN}") + print("") + explanation_root_node = Node("permissions") + explanation_permission_node = Node( + "permission_1" + " " + str(["role names list"]), + parent=explanation_root_node, + ) + Node( + FeatureView.__name__ + ": " + str(["feature view names"]), + parent=explanation_permission_node, + ) + Node(FeatureService.__name__ + ": none", parent=explanation_permission_node) + Node("..", parent=explanation_permission_node) + Node( + "permission_2" + " " + str(["role names list"]), + parent=explanation_root_node, + ) + Node("..", parent=explanation_root_node) + explanation_root_node.show() + print( + f""" +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------{Style.RESET_ALL} + """ + ) + + +def handle_sd_verbose_permissions_command( + feast_type: list[FeastObject], + p: Permission, + policy_node: Node, + store: FeatureStore, + tags_filter: Optional[dict[str, str]], +): + saved_datasets = store.list_saved_datasets(tags=tags_filter) + saved_datasets_names = set() + for sd in saved_datasets: + if p.match_resource(sd): + saved_datasets_names.add(sd.name) + if len(saved_datasets_names) > 0: + Node( + feast_type.__name__ + ": " + str(list(saved_datasets_names)), # type: ignore[union-attr, attr-defined] + parent=policy_node, + ) + else: + Node(feast_type.__name__ + ": none", parent=policy_node) # type: ignore[union-attr, attr-defined] + + +def handle_vr_verbose_permissions_command( + feast_type: list[FeastObject], + p: Permission, + policy_node: Node, + store: FeatureStore, + tags_filter: Optional[dict[str, str]], +): + validation_references = store.list_validation_references(tags=tags_filter) + validation_references_names = set() + for vr in validation_references: + if p.match_resource(vr): + validation_references_names.add(vr.name) + if len(validation_references_names) > 0: + Node( + feast_type.__name__ + ": " + str(list(validation_references_names)), # type: ignore[union-attr, attr-defined] + parent=policy_node, + ) + else: + Node(feast_type.__name__ + ": none", parent=policy_node) # type: ignore[union-attr, attr-defined] + + +def handle_ds_verbose_permissions_command( + feast_type: list[FeastObject], + p: Permission, + policy_node: Node, + store: FeatureStore, + tags_filter: Optional[dict[str, str]], +): + data_sources = store.list_data_sources(tags=tags_filter) + data_sources_names = set() + for ds in data_sources: + if p.match_resource(ds): + data_sources_names.add(ds.name) + if len(data_sources_names) > 0: + Node( + feast_type.__name__ + ": " + str(list(data_sources_names)), # type: ignore[union-attr, attr-defined] + parent=policy_node, + ) + else: + Node(feast_type.__name__ + ": none", parent=policy_node) # type: ignore[union-attr, attr-defined] + + +def handle_fs_verbose_permissions_command( + feast_type: list[FeastObject], + p: Permission, + policy_node: Node, + store: FeatureStore, + tags_filter: Optional[dict[str, str]], +): + feature_services = store.list_feature_services(tags=tags_filter) + feature_services_names = set() + for fs in feature_services: + if p.match_resource(fs): + feature_services_names.add(fs.name) + if len(feature_services_names) > 0: + Node( + feast_type.__name__ + ": " + str(list(feature_services_names)), # type: ignore[union-attr, attr-defined] + parent=policy_node, + ) + else: + Node(feast_type.__name__ + ": none", parent=policy_node) # type: ignore[union-attr, attr-defined] + + +def handle_entity_verbose_permissions_command( + feast_type: list[FeastObject], + p: Permission, + policy_node: Node, + store: FeatureStore, + tags_filter: Optional[dict[str, str]], +): + entities = store.list_entities(tags=tags_filter) + entities_names = set() + for e in entities: + if p.match_resource(e): + entities_names.add(e.name) + if len(entities_names) > 0: + Node(feast_type.__name__ + ": " + str(list(entities_names)), parent=policy_node) # type: ignore[union-attr, attr-defined] + else: + Node(feast_type.__name__ + ": none", parent=policy_node) # type: ignore[union-attr, attr-defined] + + +def handle_fv_verbose_permissions_command( + feast_type: list[FeastObject], + p: Permission, + policy_node: Node, + store: FeatureStore, + tags_filter: Optional[dict[str, str]], +): + feature_views = [] + feature_views_names = set() + if feast_type == FeatureView: + feature_views = store.list_all_feature_views(tags=tags_filter) # type: ignore[assignment] + elif feast_type == OnDemandFeatureView: + feature_views = store.list_on_demand_feature_views( + tags=tags_filter # type: ignore[assignment] + ) + elif feast_type == BatchFeatureView: + feature_views = store.list_batch_feature_views(tags=tags_filter) # type: ignore[assignment] + elif feast_type == StreamFeatureView: + feature_views = store.list_stream_feature_views( + tags=tags_filter # type: ignore[assignment] + ) + for fv in feature_views: + if p.match_resource(fv): + feature_views_names.add(fv.name) + if len(feature_views_names) > 0: + Node( + feast_type.__name__ + " " + str(list(feature_views_names)), # type: ignore[union-attr, attr-defined] + parent=policy_node, + ) + else: + Node(feast_type.__name__ + ": none", parent=policy_node) # type: ignore[union-attr, attr-defined] + + +def handle_not_verbose_permissions_command( + p: Permission, policy: Policy, table: list[Any] +): + roles: set[str] = set() + if isinstance(policy, RoleBasedPolicy): + roles = set(policy.get_roles()) + table.append( + [ + p.name, + [t.__name__ for t in p.types], # type: ignore[union-attr, attr-defined] + p.with_subclasses, + p.name_pattern, + p.actions, + roles, + ] + ) From 87710cbd32ba0f85372cbf8f123e0a3944b25bce Mon Sep 17 00:00:00 2001 From: Theodor Mihalache Date: Mon, 8 Jul 2024 13:39:47 -0400 Subject: [PATCH 038/169] CLI command "feast permissions list" - Changes following review Signed-off-by: Theodor Mihalache Signed-off-by: Abdul Hameed --- docs/reference/feast-cli-commands.md | 51 +++++++++++++++---- sdk/python/feast/cli.py | 24 ++++++++- sdk/python/feast/errors.py | 8 +++ sdk/python/feast/feature_store.py | 15 ++++++ .../infra/registry/proto_registry_utils.py | 4 +- sdk/python/feast/permissions/permission.py | 5 ++ 6 files changed, 95 insertions(+), 12 deletions(-) diff --git a/docs/reference/feast-cli-commands.md b/docs/reference/feast-cli-commands.md index 299de741ac..0519e453a6 100644 --- a/docs/reference/feast-cli-commands.md +++ b/docs/reference/feast-cli-commands.md @@ -157,25 +157,58 @@ feast materialize-incremental 2022-01-01T00:00:00 ``` ## Permissions -***TODO*** Update -```text -feast permissions --help -... -``` ### List permissions -***TODO*** Description and output examples +List all registered permission ```text feast permissions list -... + +Options: + --tags TEXT Filter by tags (e.g. --tags 'key:value' --tags 'key:value, + key:value, ...'). Items return when ALL tags match. + --verbose +``` + +```text +NAME TYPES WITH_SUBCLASS NAME_PATTERN ACTIONS ROLES +reader_permission1234 ['FeatureView'] True transformed_conv_rate [] {'reader'} +writer_permission1234 ['FeatureView'] True transformed_conv_rate [] {'writer'} +``` + +```text +feast permissions list -v +``` + +```text +Permissions: + +permissions +├── reader_permission1234 ['reader'] +│ └── FeatureView: none +└── writer_permission1234 ['writer'] + ├── FeatureView: none + │── OnDemandFeatureView: ['transformed_conv_rate_fresh', 'transformed_conv_rate'] + └── BatchFeatureView: ['driver_hourly_stats', 'driver_hourly_stats_fresh'] ``` ### Describe a permission -***TODO*** Description and output examples +Describes the provided permission + ```text feast permissions describe permission-name -... +name: permission-name +types: +- FEATURE_VIEW +withSubclasses: true +namePattern: transformed_conv_rate +actions: +- READ +policy: + roleBasedPolicy: + roles: + - reader + ``` ## Teardown diff --git a/sdk/python/feast/cli.py b/sdk/python/feast/cli.py index ca92d58fa6..3778cae707 100644 --- a/sdk/python/feast/cli.py +++ b/sdk/python/feast/cli.py @@ -884,7 +884,7 @@ def validate( exit(1) -@cli.group(name="feast-permissions") +@cli.group(name="permissions") def feast_permissions_cmd(): """ Access permissions @@ -1005,5 +1005,27 @@ def feast_permissions_command(ctx: click.Context, verbose: bool, tags: list[str] root_node.show() +@feast_permissions_cmd.command("describe") +@click.argument("name", type=click.STRING) +@click.pass_context +def permission_describe(ctx: click.Context, name: str): + """ + Describe a permission + """ + store = create_feature_store(ctx) + + try: + permission = store.get_permission(name) + except FeastObjectNotFoundException as e: + print(e) + exit(1) + + print( + yaml.dump( + yaml.safe_load(str(permission)), default_flow_style=False, sort_keys=False + ) + ) + + if __name__ == "__main__": cli() diff --git a/sdk/python/feast/errors.py b/sdk/python/feast/errors.py index ff8da63ffa..98a9a52486 100644 --- a/sdk/python/feast/errors.py +++ b/sdk/python/feast/errors.py @@ -396,6 +396,14 @@ def __init__(self, name, project): super().__init__(f"Permission {name} does not exist in project {project}") +class PermissionObjectNotFoundException(FeastObjectNotFoundException): + def __init__(self, name, project=None): + if project: + super().__init__(f"Permission {name} does not exist in project {project}") + else: + super().__init__(f"Permission {name} does not exist") + + class ZeroRowsQueryResult(Exception): def __init__(self, query: str): super().__init__(f"This query returned zero rows:\n{query}") diff --git a/sdk/python/feast/feature_store.py b/sdk/python/feast/feature_store.py index 13e7b54ed2..e20a1af4d6 100644 --- a/sdk/python/feast/feature_store.py +++ b/sdk/python/feast/feature_store.py @@ -1965,6 +1965,21 @@ def list_permissions( self.project, allow_cache=allow_cache, tags=tags ) + def get_permission(self, name: str) -> Permission: + """ + Retrieves a permission from the registry. + + Args: + name: Name of the permission. + + Returns: + The specified permission. + + Raises: + PermissionObjectNotFoundException: The permission could not be found. + """ + return self._registry.get_permission(name, self.project) + def list_saved_datasets( self, allow_cache: bool = False, tags: Optional[dict[str, str]] = None ) -> List[SavedDataset]: diff --git a/sdk/python/feast/infra/registry/proto_registry_utils.py b/sdk/python/feast/infra/registry/proto_registry_utils.py index 7a24be3ed5..09e39d3c3e 100644 --- a/sdk/python/feast/infra/registry/proto_registry_utils.py +++ b/sdk/python/feast/infra/registry/proto_registry_utils.py @@ -10,7 +10,7 @@ EntityNotFoundException, FeatureServiceNotFoundException, FeatureViewNotFoundException, - PermissionNotFoundException, + PermissionObjectNotFoundException, SavedDatasetNotFound, ValidationReferenceNotFound, ) @@ -312,4 +312,4 @@ def get_permission( for permission in registry_proto.permissions: if permission.project == project and permission.name == name: return Permission.from_proto(permission) - raise PermissionNotFoundException(name=name, project=project) + raise PermissionObjectNotFoundException(name=name, project=project) diff --git a/sdk/python/feast/permissions/permission.py b/sdk/python/feast/permissions/permission.py index e8be31596b..ec7e86b6cf 100644 --- a/sdk/python/feast/permissions/permission.py +++ b/sdk/python/feast/permissions/permission.py @@ -3,6 +3,8 @@ from abc import ABC from typing import TYPE_CHECKING, Any, Dict, Optional, Union +from google.protobuf.json_format import MessageToJson + from feast.importer import import_class from feast.permissions.action import ALL_ACTIONS, AuthzedAction from feast.permissions.decision import DecisionStrategy @@ -97,6 +99,9 @@ def __eq__(self, other): def __hash__(self): return hash(self.name) + def __str__(self): + return str(MessageToJson(self.to_proto())) + _global_decision_strategy: DecisionStrategy = DecisionStrategy.UNANIMOUS @staticmethod From e9ff6e6d15e00463c11e89ee5a6a2d27c2c23592 Mon Sep 17 00:00:00 2001 From: Abdul Hameed Date: Fri, 5 Jul 2024 17:35:53 -0400 Subject: [PATCH 039/169] added the documents reference for permissions for online, offline, registry server endpoints. Signed-off-by: Abdul Hameed --- .../feature-servers/offline-feature-server.md | 17 +++++++ .../feature-servers/python-feature-server.md | 16 +++++++ .../registry/registry-permissions.md | 46 +++++++++++++++++++ 3 files changed, 79 insertions(+) create mode 100644 docs/reference/registry/registry-permissions.md diff --git a/docs/reference/feature-servers/offline-feature-server.md b/docs/reference/feature-servers/offline-feature-server.md index 6c2fdf7a25..8e6733e29d 100644 --- a/docs/reference/feature-servers/offline-feature-server.md +++ b/docs/reference/feature-servers/offline-feature-server.md @@ -33,3 +33,20 @@ Please see the detail how to configure offline store client [remote-offline-stor The set of functionalities supported by remote offline stores is the same as those supported by offline stores with the SDK, which are described in detail [here](../offline-stores/overview.md#functionality). +# Offline Feature Server Permissions and Access Control + +## API Endpoints and Permissions + +| Endpoint | Resource Type |Permission | Description | +| ------------------------------------- |------------------|---------------|-----------------------------------------------------| +| offline_write_batch | FeatureView | Write Offline | Write a batch of data to the offline store | +| write_logged_features | FeatureService | Write Offline | Write logged features to the offline store | +| persist | DataSource | Write Offline | Persist the result of a query in the offline store | +| get_historical_features | FeatureView | Query Offline | Retrieve historical features | +| pull_all_from_table_or_query | DataSource | Query Offline | Pull all data from a table or query it | +| pull_latest_from_table_or_query | DataSource | Query Offline | Pull the latest data from a table or query it | + + +## How to configure Authentication and Authorization ? + +TODO add the section for that \ No newline at end of file diff --git a/docs/reference/feature-servers/python-feature-server.md b/docs/reference/feature-servers/python-feature-server.md index 33dfe77ae1..d0a62b0282 100644 --- a/docs/reference/feature-servers/python-feature-server.md +++ b/docs/reference/feature-servers/python-feature-server.md @@ -199,3 +199,19 @@ requests.post( "http://localhost:6566/push", data=json.dumps(push_data)) ``` + +# Online Feature Server Permissions and Access Control + +## API Endpoints and Permissions + +| Endpoint | Resource Type | Permission | Description | +| ---------------------------- |---------------------------------|-------------------------------------------------------| ------------------------------------------------------------------------ | +| /get-online-features | FeatureView,OnDemandFeatureView | Query Online | Get online features from the feature store | +| /push | FeatureView | Write Online, Write Offline, Write Online and Offline | Push features to the feature store (online, offline, or both) | +| /write-to-online-store | FeatureView | Write Online | Write features to the online store | +| /materialize | FeatureView | Write Online | Materialize features within a specified time range | +| /materialize-incremental | FeatureView | Write Online | Incrementally materialize features up to a specified timestamp | + +## How to configure Authentication and Authorization ? + +TODO add the section for that \ No newline at end of file diff --git a/docs/reference/registry/registry-permissions.md b/docs/reference/registry/registry-permissions.md new file mode 100644 index 0000000000..5c013bd155 --- /dev/null +++ b/docs/reference/registry/registry-permissions.md @@ -0,0 +1,46 @@ +# Registry Permissions and Access Control + + +## API Endpoints and Permissions + +| Endpoint | Resource Type | Permission | Description | +| ------------------------ |---------------------|------------------------| -------------------------------------------------------------- | +| ApplyEntity | Entity | Create, Update, Delete | Apply an entity to the registry | +| GetEntity | Entity | Read | Get an entity from the registry | +| ListEntities | Entity | Read | List entities in the registry | +| DeleteEntity | Entity | Delete | Delete an entity from the registry | +| ApplyDataSource | DataSource | Create, Update, Delete | Apply a data source to the registry | +| GetDataSource | DataSource | Read | Get a data source from the registry | +| ListDataSources | DataSource | Read | List data sources in the registry | +| DeleteDataSource | DataSource | Delete | Delete a data source from the registry | +| ApplyFeatureView | FeatureView | Create, Update, Delete | Apply a feature view to the registry | +| GetFeatureView | FeatureView | Read | Get a feature view from the registry | +| ListFeatureViews | FeatureView | Read | List feature views in the registry | +| DeleteFeatureView | FeatureView | Delete | Delete a feature view from the registry | +| GetStreamFeatureView | StreamFeatureView | Read | Get a stream feature view from the registry | +| ListStreamFeatureViews | StreamFeatureView | Read | List stream feature views in the registry | +| GetOnDemandFeatureView | OnDemandFeatureView | Read | Get an on-demand feature view from the registry | +| ListOnDemandFeatureViews | OnDemandFeatureView | Read | List on-demand feature views in the registry | +| ApplyFeatureService | FeatureService | Create, Update, Delete | Apply a feature service to the registry | +| GetFeatureService | FeatureService | Read | Get a feature service from the registry | +| ListFeatureServices | FeatureService | Read | List feature services in the registry | +| DeleteFeatureService | FeatureService | Delete | Delete a feature service from the registry | +| ApplySavedDataset | SavedDataset | Create, Update, Delete | Apply a saved dataset to the registry | +| GetSavedDataset | SavedDataset | Read | Get a saved dataset from the registry | +| ListSavedDatasets | SavedDataset | Read | List saved datasets in the registry | +| DeleteSavedDataset | SavedDataset | Delete | Delete a saved dataset from the registry | +| ApplyValidationReference | ValidationReference | Create, Update, Delete | Apply a validation reference to the registry | +| GetValidationReference | ValidationReference | Read | Get a validation reference from the registry | +| ListValidationReferences | ValidationReference | Read | List validation references in the registry | +| DeleteValidationReference| ValidationReference | Delete | Delete a validation reference from the registry | +| ApplyPermission | Permission | Create, Update, Delete | Apply a permission to the registry | +| GetPermission | Permission | Read | Get a permission from the registry | +| ListPermissions | Permission | Read | List permissions in the registry | +| DeletePermission | Permission | Delete | Delete a permission from the registry | +| Commit | | None | Commit changes to the registry | +| Refresh | | None | Refresh the registry | +| Proto | | None | Get the proto representation of the registry | + +## How to configure Authentication and Authorization ? + +TODO add the section for that \ No newline at end of file From 679579edbff38f90ef476374a572b1ffb14905e5 Mon Sep 17 00:00:00 2001 From: lokeshrangineni Date: Tue, 9 Jul 2024 11:47:04 -0400 Subject: [PATCH 040/169] =?UTF-8?q?Incorporating=20code=20review=20comment?= =?UTF-8?q?s=20to=20parse=20the=20auth=20block=20from=20the=20f=E2=80=A6?= =?UTF-8?q?=20(#36)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Incorporating code review comments to parse the auth block from the feature_store.yaml file. Signed-off-by: Lokesh Rangineni * Incorporating code review comments - renaming type from k8 to kubernetes. Signed-off-by: Lokesh Rangineni --------- Signed-off-by: Lokesh Rangineni Signed-off-by: Abdul Hameed --- sdk/python/feast/errors.py | 7 ++ sdk/python/feast/permissions/auth_model.py | 24 ++++ sdk/python/feast/repo_config.py | 57 +++++++++ .../infra/scaffolding/test_repo_config.py | 110 ++++++++++++++++++ 4 files changed, 198 insertions(+) create mode 100644 sdk/python/feast/permissions/auth_model.py diff --git a/sdk/python/feast/errors.py b/sdk/python/feast/errors.py index 98a9a52486..ffafe31125 100644 --- a/sdk/python/feast/errors.py +++ b/sdk/python/feast/errors.py @@ -223,6 +223,13 @@ def __init__(self, online_store_class_name: str): ) +class FeastInvalidAuthConfigClass(Exception): + def __init__(self, auth_config_class_name: str): + super().__init__( + f"Auth Config Class '{auth_config_class_name}' should end with the string `AuthConfig`.'" + ) + + class FeastInvalidBaseClass(Exception): def __init__(self, class_name: str, class_type: str): super().__init__( diff --git a/sdk/python/feast/permissions/auth_model.py b/sdk/python/feast/permissions/auth_model.py new file mode 100644 index 0000000000..860b4d1f89 --- /dev/null +++ b/sdk/python/feast/permissions/auth_model.py @@ -0,0 +1,24 @@ +from typing import Literal + +from feast.repo_config import FeastConfigBaseModel + + +class AuthConfig(FeastConfigBaseModel): + type: Literal["oidc", "kubernetes", "no_auth"] = "no_auth" + + +class OidcAuthConfig(AuthConfig): + auth_server_url: str + client_id: str + client_secret: str + username: str + password: str + realm: str = "master" + + +class NoAuthConfig(AuthConfig): + pass + + +class K8AuthConfig(AuthConfig): + pass diff --git a/sdk/python/feast/repo_config.py b/sdk/python/feast/repo_config.py index fc2792e323..4f09b97169 100644 --- a/sdk/python/feast/repo_config.py +++ b/sdk/python/feast/repo_config.py @@ -19,6 +19,7 @@ from feast.errors import ( FeastFeatureServerTypeInvalidError, + FeastInvalidAuthConfigClass, FeastOfflineStoreInvalidName, FeastOnlineStoreInvalidName, FeastRegistryNotSetError, @@ -86,6 +87,12 @@ "local": "feast.infra.feature_servers.local_process.config.LocalFeatureServerConfig", } +AUTH_CONFIGS_CLASS_FOR_TYPE = { + "no_auth": "feast.permissions.auth_model.NoAuthConfig", + "kubernetes": "feast.permissions.auth_model.K8AuthConfig", + "oidc": "feast.permissions.auth_model.OidcAuthConfig", +} + class FeastBaseModel(BaseModel): """Feast Pydantic Configuration Class""" @@ -167,6 +174,9 @@ class RepoConfig(FeastBaseModel): online_config: Any = Field(None, alias="online_store") """ OnlineStoreConfig: Online store configuration (optional depending on provider) """ + auth: Any = Field(None, alias="auth") + """ auth: Optional if the services needs the authentication against IDPs (optional depending on provider) """ + offline_config: Any = Field(None, alias="offline_store") """ OfflineStoreConfig: Offline store configuration (optional depending on provider) """ @@ -211,6 +221,13 @@ def __init__(self, **data: Any): self._online_store = None self.online_config = data.get("online_store", "sqlite") + self._auth = None + if "auth" not in data: + self.auth = dict() + self.auth["type"] = "no_auth" + else: + self.auth = data.get("auth") + self._batch_engine = None if "batch_engine" in data: self.batch_engine_config = data["batch_engine"] @@ -270,6 +287,20 @@ def offline_store(self): self._offline_store = self.offline_config return self._offline_store + @property + def auth_config(self): + if not self._auth: + if isinstance(self.auth, Dict): + self._auth = get_auth_config_from_type(self.auth.get("type"))( + **self.auth + ) + elif isinstance(self.auth, str): + self._auth = get_auth_config_from_type(self.auth.get("type"))() + elif self.auth: + self._auth = self.auth + + return self._auth + @property def online_store(self): if not self._online_store: @@ -300,6 +331,21 @@ def batch_engine(self): return self._batch_engine + @model_validator(mode="before") + def _validate_auth_config(cls, values: Any) -> Any: + if "auth" in values: + allowed_auth_types = AUTH_CONFIGS_CLASS_FOR_TYPE.keys() + if values["auth"].get("type") is None: + raise ValueError( + f"auth configuration is not having authentication type. Possible values={allowed_auth_types}" + ) + elif values["auth"]["type"] not in allowed_auth_types: + raise ValueError( + f'auth configuration is having invalid authentication type={values["auth"]["type"]}. Possible ' + f'values={allowed_auth_types}' + ) + return values + @model_validator(mode="before") def _validate_online_store_config(cls, values: Any) -> Any: # This method will validate whether the online store configurations are set correctly. This explicit validation @@ -480,6 +526,17 @@ def get_online_config_from_type(online_store_type: str): return import_class(module_name, config_class_name, config_class_name) +def get_auth_config_from_type(auth_config_type: str): + if auth_config_type in AUTH_CONFIGS_CLASS_FOR_TYPE: + auth_config_type = AUTH_CONFIGS_CLASS_FOR_TYPE[auth_config_type] + elif not auth_config_type.endswith("AuthConfig"): + raise FeastInvalidAuthConfigClass(auth_config_type) + module_name, online_store_class_type = auth_config_type.rsplit(".", 1) + config_class_name = f"{online_store_class_type}" + + return import_class(module_name, config_class_name, config_class_name) + + def get_offline_config_from_type(offline_store_type: str): if offline_store_type in OFFLINE_STORE_CLASS_FOR_TYPE: offline_store_type = OFFLINE_STORE_CLASS_FOR_TYPE[offline_store_type] diff --git a/sdk/python/tests/unit/infra/scaffolding/test_repo_config.py b/sdk/python/tests/unit/infra/scaffolding/test_repo_config.py index 98d82ce357..cc4a77662f 100644 --- a/sdk/python/tests/unit/infra/scaffolding/test_repo_config.py +++ b/sdk/python/tests/unit/infra/scaffolding/test_repo_config.py @@ -4,6 +4,7 @@ from typing import Optional from feast.infra.online_stores.sqlite import SqliteOnlineStoreConfig +from feast.permissions.auth_model import K8AuthConfig, NoAuthConfig, OidcAuthConfig from feast.repo_config import FeastConfigError, load_repo_config @@ -195,3 +196,112 @@ def test_no_provider(): ), expect_error=None, ) + + +def test_auth_config(): + _test_config( + dedent( + """ + project: foo + auth: + client_id: test_client_id + client_secret: test_client_secret + username: test_user_name + password: test_password + realm: master + auth_server_url: http://localhost:8712 + registry: "registry.db" + provider: local + online_store: + path: foo + entity_key_serialization_version: 2 + """ + ), + expect_error="not having authentication type", + ) + + _test_config( + dedent( + """ + project: foo + auth: + type: not_valid_auth_type + client_id: test_client_id + client_secret: test_client_secret + username: test_user_name + password: test_password + realm: master + auth_server_url: http://localhost:8712 + registry: "registry.db" + provider: local + online_store: + path: foo + entity_key_serialization_version: 2 + """ + ), + expect_error="invalid authentication type=not_valid_auth_type", + ) + + oidc_repo_config = _test_config( + dedent( + """ + project: foo + auth: + type: oidc + client_id: test_client_id + client_secret: test_client_secret + username: test_user_name + password: test_password + realm: master + auth_server_url: http://localhost:8712 + registry: "registry.db" + provider: local + online_store: + path: foo + entity_key_serialization_version: 2 + """ + ), + expect_error=None, + ) + assert oidc_repo_config.auth["type"] == "oidc" + assert isinstance(oidc_repo_config.auth_config, OidcAuthConfig) + assert oidc_repo_config.auth_config.client_id == "test_client_id" + assert oidc_repo_config.auth_config.client_secret == "test_client_secret" + assert oidc_repo_config.auth_config.username == "test_user_name" + assert oidc_repo_config.auth_config.password == "test_password" + assert oidc_repo_config.auth_config.realm == "master" + assert oidc_repo_config.auth_config.auth_server_url == "http://localhost:8712" + + no_auth_repo_config = _test_config( + dedent( + """ + project: foo + registry: "registry.db" + provider: local + online_store: + path: foo + entity_key_serialization_version: 2 + """ + ), + expect_error=None, + ) + assert no_auth_repo_config.auth.get("type") == "no_auth" + assert isinstance(no_auth_repo_config.auth_config, NoAuthConfig) + + k8_repo_config = _test_config( + dedent( + """ + auth: + type: kubernetes + project: foo + registry: "registry.db" + provider: local + online_store: + path: foo + entity_key_serialization_version: 2 + """ + ), + expect_error=None, + ) + assert k8_repo_config.auth.get("type") == "kubernetes" + assert isinstance(k8_repo_config.auth_config, K8AuthConfig) From 1085b9942b8213d929bceca5d37bbd722bf4fde4 Mon Sep 17 00:00:00 2001 From: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Date: Mon, 8 Jul 2024 08:43:08 +0200 Subject: [PATCH 041/169] definition and integration of auth manager in feast offline and online servers Signed-off-by: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Signed-off-by: Abdul Hameed --- .../feature_repo/data/driver_stats.parquet | Bin 35102 -> 35105 bytes .../feature_repo/data/online_store.db | Bin 28672 -> 28672 bytes .../feature_repo/example_repo.py | 6 +- sdk/python/feast/feature_server.py | 24 +++- sdk/python/feast/offline_server.py | 31 ++++- sdk/python/feast/permissions/auth/__init__.py | 0 .../feast/permissions/auth/auth_manager.py | 67 ++++++++++ .../auth/kubernetes_token_parser.py | 105 +++++++++++++++ .../permissions/auth/oidc_token_parser.py | 108 ++++++++++++++++ .../feast/permissions/auth/token_extractor.py | 51 ++++++++ .../feast/permissions/auth/token_parser.py | 31 +++++ .../feast/permissions/security_manager.py | 9 ++ sdk/python/feast/permissions/server/arrow.py | 101 +++++++++++++++ .../server/arrow_flight_token_extractor.py | 42 ++++++ sdk/python/feast/permissions/server/rest.py | 36 ++++++ .../server/rest_token_extractor.py | 38 ++++++ sdk/python/feast/permissions/server/utils.py | 121 ++++++++++++++++++ .../permissions/auth/test_token_extractor.py | 98 ++++++++++++++ 18 files changed, 863 insertions(+), 5 deletions(-) create mode 100644 sdk/python/feast/permissions/auth/__init__.py create mode 100644 sdk/python/feast/permissions/auth/auth_manager.py create mode 100644 sdk/python/feast/permissions/auth/kubernetes_token_parser.py create mode 100644 sdk/python/feast/permissions/auth/oidc_token_parser.py create mode 100644 sdk/python/feast/permissions/auth/token_extractor.py create mode 100644 sdk/python/feast/permissions/auth/token_parser.py create mode 100644 sdk/python/feast/permissions/server/arrow.py create mode 100644 sdk/python/feast/permissions/server/arrow_flight_token_extractor.py create mode 100644 sdk/python/feast/permissions/server/rest.py create mode 100644 sdk/python/feast/permissions/server/rest_token_extractor.py create mode 100644 sdk/python/feast/permissions/server/utils.py create mode 100644 sdk/python/tests/unit/permissions/auth/test_token_extractor.py diff --git a/examples/remote-offline-store/offline_server/feature_repo/data/driver_stats.parquet b/examples/remote-offline-store/offline_server/feature_repo/data/driver_stats.parquet index 19279202d84a63a921306eb5fcd8b88603fb54b6..592a2f5cab93744cc036d2b18c5015e25ae38246 100644 GIT binary patch delta 23930 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 Htj0e8Y^Jqj delta 23786 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 E0igfu)Bpeg diff --git a/examples/remote-offline-store/offline_server/feature_repo/data/online_store.db b/examples/remote-offline-store/offline_server/feature_repo/data/online_store.db index d230f45b934c6f347589b35d87f58efa2ba4aa6d..d3cb8ee0a9ceaf98a797bc62c018f66bbb95306a 100644 GIT binary patch delta 113 zcmZp8z}WDBaYB+}FG5D@HyIMt1SoSjJ{$xU%_t(_qRrYw}-D F004@@BG~`{ delta 100 zcmZp8z}WDBaYB+<+ACiE9}H~V#SDCT{B69mc=UNqxr;Xo3jF4p?908EkC}yCJTQ>4 zsjwt5DJOMuBe&9IE1s6gru>1Mm3XZf`9vAn#baX`n`$BQ2YEFnPvV=f*_8iu0ssp) B9}NHi diff --git a/examples/remote-offline-store/offline_server/feature_repo/example_repo.py b/examples/remote-offline-store/offline_server/feature_repo/example_repo.py index c06ebc788b..d9a25e1a37 100644 --- a/examples/remote-offline-store/offline_server/feature_repo/example_repo.py +++ b/examples/remote-offline-store/offline_server/feature_repo/example_repo.py @@ -3,7 +3,6 @@ from datetime import timedelta import pandas as pd -import os from feast import ( Entity, @@ -14,6 +13,8 @@ PushSource, RequestSource, ) +from feast.feature_logging import LoggingConfig +from feast.infra.offline_stores.file_source import FileLoggingDestination from feast.on_demand_feature_view import on_demand_feature_view from feast.types import Float32, Float64, Int64 @@ -89,6 +90,9 @@ def transformed_conv_rate(inputs: pd.DataFrame) -> pd.DataFrame: driver_stats_fv[["conv_rate"]], # Sub-selects a feature from a feature view transformed_conv_rate, # Selects all features from the feature view ], + logging_config=LoggingConfig( + destination=FileLoggingDestination(path=f"{os.path.dirname(os.path.abspath(__file__))}/data") + ), ) driver_activity_v2 = FeatureService( name="driver_activity_v2", features=[driver_stats_fv, transformed_conv_rate] diff --git a/sdk/python/feast/feature_server.py b/sdk/python/feast/feature_server.py index 1b1f2d24a8..9ad782d799 100644 --- a/sdk/python/feast/feature_server.py +++ b/sdk/python/feast/feature_server.py @@ -9,9 +9,8 @@ import pandas as pd import psutil from dateutil import parser -from fastapi import FastAPI, HTTPException, Request, Response, status +from fastapi import Depends, FastAPI, HTTPException, Request, Response, status from fastapi.logger import logger -from fastapi.params import Depends from google.protobuf.json_format import MessageToDict from prometheus_client import Gauge, start_http_server from pydantic import BaseModel @@ -23,6 +22,13 @@ from feast.errors import FeatureViewNotFoundException, PushSourceNotFoundException from feast.permissions.action import WRITE, AuthzedAction from feast.permissions.security_manager import assert_permissions +from feast.permissions.server.rest import inject_user_details_to_security_manager +from feast.permissions.server.utils import ( + ServerType, + auth_manager_type_from_env, + init_auth_manager, + init_security_manager, +) # Define prometheus metrics cpu_usage_gauge = Gauge( @@ -95,7 +101,11 @@ async def lifespan(app: FastAPI): async def get_body(request: Request): return await request.body() - @app.post("/get-online-features") + # TODO RBAC: complete the dependencies for the other endpoints + @app.post( + "/get-online-features", + dependencies=[Depends(inject_user_details_to_security_manager)], + ) def get_online_features(body=Depends(get_body)): try: body = json.loads(body) @@ -335,6 +345,14 @@ def start_server( ) monitoring_thread.start() + # TODO RBAC remove and use the auth section of the feature store config instead + auth_manager_type = auth_manager_type_from_env() + init_security_manager(auth_manager_type) + init_auth_manager( + auth_manager_type=auth_manager_type, + server_type=ServerType.REST, + ) + if sys.platform != "win32": FeastServeApplication( store=store, diff --git a/sdk/python/feast/offline_server.py b/sdk/python/feast/offline_server.py index a16dcb8932..b24febe78c 100644 --- a/sdk/python/feast/offline_server.py +++ b/sdk/python/feast/offline_server.py @@ -8,20 +8,38 @@ import pyarrow as pa import pyarrow.flight as fl +# import debugpy +# debugpy.listen(("localhost", 5678)) +# print("Waiting for debugger attach...") +# debugpy.wait_for_client() +# print("Debugger attached.") from feast import FeatureStore, FeatureView, utils from feast.feature_logging import FeatureServiceLoggingSource from feast.feature_view import DUMMY_ENTITY_NAME from feast.infra.offline_stores.offline_utils import get_offline_store_from_config from feast.permissions.action import AuthzedAction from feast.permissions.security_manager import assert_permissions +from feast.permissions.server.arrow import ( + arrowflight_middleware, + inject_user_details_to_security_manager, +) +from feast.permissions.server.utils import ( + ServerType, + auth_manager_type_from_env, + init_auth_manager, + init_security_manager, +) from feast.saved_dataset import SavedDatasetStorage logger = logging.getLogger(__name__) +logger.setLevel(logging.INFO) class OfflineServer(fl.FlightServerBase): def __init__(self, store: FeatureStore, location: str, **kwargs): - super(OfflineServer, self).__init__(location, **kwargs) + super(OfflineServer, self).__init__( + location, middleware=arrowflight_middleware(), **kwargs + ) self._location = location # A dictionary of configured flights, e.g. API calls received and not yet served self.flights: Dict[str, Any] = {} @@ -159,6 +177,9 @@ def _validate_do_get_parameters(self, command: dict): # Extracts the API parameters from the flights dictionary, delegates the execution to the FeatureStore instance # and returns the stream of data def do_get(self, context: fl.ServerCallContext, ticket: fl.Ticket): + # TODO RBAC: add the same to all the authorized endpoints + inject_user_details_to_security_manager(context) + key = ast.literal_eval(ticket.ticket.decode()) if key not in self.flights: logger.error(f"Unknown key {key}") @@ -432,6 +453,14 @@ def start_server( host: str, port: int, ): + # TODO RBAC remove and use the auth section of the feature store config instead + auth_manager_type = auth_manager_type_from_env() + init_security_manager(auth_manager_type) + init_auth_manager( + auth_manager_type=auth_manager_type, + server_type=ServerType.ARROW, + ) + location = "grpc+tcp://{}:{}".format(host, port) server = OfflineServer(store, location) logger.info(f"Offline store server serving on {location}") diff --git a/sdk/python/feast/permissions/auth/__init__.py b/sdk/python/feast/permissions/auth/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/sdk/python/feast/permissions/auth/auth_manager.py b/sdk/python/feast/permissions/auth/auth_manager.py new file mode 100644 index 0000000000..ba5dffafc5 --- /dev/null +++ b/sdk/python/feast/permissions/auth/auth_manager.py @@ -0,0 +1,67 @@ +from abc import ABC +from typing import Optional + +from .token_extractor import NoAuthTokenExtractor, TokenExtractor +from .token_parser import NoAuthTokenParser, TokenParser + + +class AuthManager(ABC): + """ + The authorization manager offers to intercept client requests and extract user details to inject in the security context. + """ + + _token_parser: TokenParser + _token_extractor: TokenExtractor + + def __init__(self, token_parser: TokenParser, token_extractor: TokenExtractor): + self._token_parser = token_parser + self._token_extractor = token_extractor + + @property + def token_parser(self) -> TokenParser: + return self._token_parser + + @property + def token_extractor(self) -> TokenExtractor: + return self._token_extractor + + +""" +The possibly empty global instance of `AuthManager`. +""" +_auth_manager: Optional[AuthManager] = None + + +def get_auth_manager() -> AuthManager: + """ + Return the global instance of `AuthManager`. + + Raises: + RuntimeError if the clobal instance is not set. + """ + global _auth_manager + if _auth_manager is None: + raise RuntimeError( + "AuthManager is not initialized. Call 'set_auth_manager' first." + ) + return _auth_manager + + +def set_auth_manager(auth_manager: AuthManager): + """ + Initialize the global instance of `AuthManager`. + """ + + global _auth_manager + _auth_manager = auth_manager + + +class AllowAll(AuthManager): + """ + An AuthManager not extracting nor parsing the authorization token. + """ + + def __init__(self): + super().__init__( + token_extractor=NoAuthTokenExtractor(), token_parser=NoAuthTokenParser() + ) diff --git a/sdk/python/feast/permissions/auth/kubernetes_token_parser.py b/sdk/python/feast/permissions/auth/kubernetes_token_parser.py new file mode 100644 index 0000000000..13f27bc805 --- /dev/null +++ b/sdk/python/feast/permissions/auth/kubernetes_token_parser.py @@ -0,0 +1,105 @@ +import logging + +import jwt +from kubernetes import client, config +from starlette.authentication import ( + AuthenticationError, +) + +from feast.permissions.auth.token_parser import TokenParser + +logger = logging.getLogger(__name__) + + +class KubernetesTokenParser(TokenParser): + """ + A `TokenParser` implementation to use Kubernetes RBAC resources to retrieve the user details. + The assumption is that the request header includes an authorization bearer with the token of the + client `ServiceAccount`. + By inspecting the role bindings, this `TokenParser` extracts the associated `Role`s. + + The client `ServiceAccount` is instead used as the user ID, together with the current namespace. + """ + + def __init__(self): + config.load_incluster_config() + self.v1 = client.CoreV1Api() + self.rbac_v1 = client.RbacAuthorizationV1Api() + + async def user_details_from_access_token( + self, access_token: str, **kwargs + ) -> tuple[str, list[str]]: + """ + Extract the service account from the token and search the roles associated with it. + + Returns: + str: Current user, the `:` separated concatenation of `namespace` and `service account name`. + list[str]: Roles associated to the user. + + Raises: + AuthenticationError if any error happens. + """ + sa_namespace, sa_name = _decode_token(access_token) + current_user = f"{sa_namespace}:{sa_name}" + logging.info(f"Received request from {sa_name} in {sa_namespace}") + + roles = self.get_roles(sa_namespace, sa_name) + logging.info(f"SA roles are: {roles}") + + return (current_user, roles) + + def get_roles(self, namespace: str, service_account_name: str) -> list[str]: + """ + Fetches the Kubernetes `Role`s associated to the given `ServiceAccount` in the given `namespace`. + + The research also includes the `ClusterRole`s, so the running deployment must be granted enough permissions to query + for such instances in all the namespaces. + + Returns: + list[str]: Name of the `Role`s and `ClusterRole`s associated to the service account. No string manipulation is performed on the role name. + """ + role_bindings = self.rbac_v1.list_namespaced_role_binding(namespace) + cluster_role_bindings = self.rbac_v1.list_cluster_role_binding() + + roles: set[str] = set() + + for binding in role_bindings.items: + if binding.subjects is not None: + for subject in binding.subjects: + if ( + subject.kind == "ServiceAccount" + and subject.name == service_account_name + ): + roles.add(binding.role_ref.name) + + for binding in cluster_role_bindings.items: + if binding.subjects is not None: + for subject in binding.subjects: + if ( + subject.kind == "ServiceAccount" + and subject.name == service_account_name + and subject.namespace == namespace + ): + roles.add(binding.role_ref.name) + + return list(roles) + + +def _decode_token(access_token: str) -> tuple[str, str]: + """ + The `sub` portion of the decoded token includes the service account name in the format: `system:serviceaccount:NAMESPACE:SA_NAME` + + Returns: + str: the namespace name. + str: the `ServiceAccount` name. + """ + try: + decoded_token = jwt.decode(access_token, options={"verify_signature": False}) + if "sub" in decoded_token: + subject: str = decoded_token["sub"] + _, _, sa_namespace, sa_name = subject.split(":") + return (sa_namespace, sa_name) + else: + raise AuthenticationError("Missing sub section in received token.") + except jwt.DecodeError as e: + raise AuthenticationError(f"Error decoding JWT token: {e}") diff --git a/sdk/python/feast/permissions/auth/oidc_token_parser.py b/sdk/python/feast/permissions/auth/oidc_token_parser.py new file mode 100644 index 0000000000..1a6fd4f74c --- /dev/null +++ b/sdk/python/feast/permissions/auth/oidc_token_parser.py @@ -0,0 +1,108 @@ +import logging +import os +from unittest.mock import Mock + +import jwt +from dotenv import load_dotenv +from fastapi import Request +from fastapi.security import OAuth2AuthorizationCodeBearer +from jwt import PyJWKClient +from starlette.authentication import ( + AuthenticationError, +) + +from feast.permissions.auth.token_parser import TokenParser + +logger = logging.getLogger(__name__) +logger.setLevel(logging.INFO) + + +class OidcTokenParser(TokenParser): + """ + A `TokenParser` to use an OIDC server to retrieve the user details. + # TODO RBAC: use auth configuration instead + Server settings are retrieved fro these environment variables: + - `OIDC_SERVER_URL` + - `REALM` + - `CLIENT_ID` + """ + + def __init__(self): + # TODO RBAC: use auth configuration instead + load_dotenv("./.env") + + self._OIDC_SERVER_URL = os.getenv("OIDC_SERVER_URL") + self._REALM = os.getenv("REALM") + self._CLIENT_ID = os.getenv("CLIENT_ID") + + async def _validate_token(self, access_token: str): + """ + Validate the token extracted from the headrer of the user request against the OAuth2 server. + """ + # FastAPI's OAuth2AuthorizationCodeBearer requires a Request type but actually uses only the headers field + # https://github.com/tiangolo/fastapi/blob/eca465f4c96acc5f6a22e92fd2211675ca8a20c8/fastapi/security/oauth2.py#L380 + request = Mock(spec=Request) + request.headers = {"Authorization": f"Bearer {access_token}"} + + oauth_2_scheme = OAuth2AuthorizationCodeBearer( + tokenUrl=f"{self._OIDC_SERVER_URL}/realms/{self._REALM}/protocol/openid-connect/token", + authorizationUrl=f"{self._OIDC_SERVER_URL}/realms/{self._REALM}/protocol/openid-connect/auth", + refreshUrl=f"{self._OIDC_SERVER_URL}/realms/{self._REALM}/protocol/openid-connect/token", + ) + + await oauth_2_scheme(request=request) + + async def user_details_from_access_token( + self, access_token: str, **kwargs + ) -> tuple[str, list[str]]: + """ + Validate the access token then decode it to extract the user credential and roles. + + Returns: + str: Current user. + list[str]: Roles associated to the user. + + Raises: + AuthenticationError if any error happens. + """ + + await self._validate_token(access_token) + logger.info("Validated token") + + url = f"{self._OIDC_SERVER_URL}/realms/{self._REALM}/protocol/openid-connect/certs" + optional_custom_headers = {"User-agent": "custom-user-agent"} + jwks_client = PyJWKClient(url, headers=optional_custom_headers) + + try: + signing_key = jwks_client.get_signing_key_from_jwt(access_token) + data = jwt.decode( + access_token, + signing_key.key, + algorithms=["RS256"], + audience="account", + options={"verify_exp": True}, + ) + + if "preferred_username" not in data: + raise AuthenticationError( + "Missing preferred_username field in access token." + ) + current_user = data["preferred_username"] + + if "resource_access" not in data: + raise AuthenticationError( + "Missing resource_access field in access token." + ) + if self._CLIENT_ID not in data["resource_access"]: + raise AuthenticationError( + f"Missing resource_access.{self._CLIENT_ID} field in access token." + ) + if "roles" not in data["resource_access"][self._CLIENT_ID]: + raise AuthenticationError( + f"Missing resource_access.{self._CLIENT_ID}.roles field in access token." + ) + roles = data["resource_access"][self._CLIENT_ID]["roles"] + logger.info(f"Extracted user {current_user} and roles {roles}") + return (current_user, roles) + except jwt.exceptions.InvalidTokenError: + raise AuthenticationError("Invalid token.") diff --git a/sdk/python/feast/permissions/auth/token_extractor.py b/sdk/python/feast/permissions/auth/token_extractor.py new file mode 100644 index 0000000000..6e7c4add96 --- /dev/null +++ b/sdk/python/feast/permissions/auth/token_extractor.py @@ -0,0 +1,51 @@ +import re +from abc import ABC + +from starlette.authentication import ( + AuthenticationError, +) + + +class TokenExtractor(ABC): + """ + A class to extract the authorization token from a user request. + """ + + def extract_access_token(self, **kwargs) -> str: + """ + Extract the authorization token from a user request. + + The actual implementation has to specify what arguments have to be defined in the kwywork args `kwargs` + + Returns: + The extracted access token. + """ + raise NotImplementedError() + + def _extract_bearer_token(self, auth_header: str) -> str: + """ + Extract the bearer token from th eauthorizatino header value. + + Args: + auth_header: The full value of the authorization header. + + Returns: + str: The token value, without the `Bearer` part. + + Raises: + AuthenticationError if the authorization token does not match the `Bearer` scheme. + """ + pattern = r"(?i)Bearer .+" + if not bool(re.match(pattern, auth_header)): + raise AuthenticationError(f"Expected Bearer schema, found {auth_header}") + _, access_token = auth_header.split() + return access_token + + +class NoAuthTokenExtractor(TokenExtractor): + """ + A `TokenExtractor` always returning an empty token + """ + + def extract_access_token(self, **kwargs) -> str: + return "" diff --git a/sdk/python/feast/permissions/auth/token_parser.py b/sdk/python/feast/permissions/auth/token_parser.py new file mode 100644 index 0000000000..d92189e2cf --- /dev/null +++ b/sdk/python/feast/permissions/auth/token_parser.py @@ -0,0 +1,31 @@ +from abc import ABC, abstractmethod + + +class TokenParser(ABC): + """ + A class to parse an access token to extract the user credential and roles. + """ + + @abstractmethod + async def user_details_from_access_token( + self, access_token: str, **kwargs + ) -> tuple[str, list[str]]: + """ + Parse the access token and return the current user and the list of associated roles. + + Returns: + str: Current user. + list[str]: Roles associated to the user. + """ + raise NotImplementedError() + + +class NoAuthTokenParser(TokenParser): + """ + A `TokenParser` always returning an empty token + """ + + async def user_details_from_access_token( + self, access_token: str, **kwargs + ) -> tuple[str, list[str]]: + return ("", []) diff --git a/sdk/python/feast/permissions/security_manager.py b/sdk/python/feast/permissions/security_manager.py index ac1bf9dad3..e9ae36aa13 100644 --- a/sdk/python/feast/permissions/security_manager.py +++ b/sdk/python/feast/permissions/security_manager.py @@ -158,3 +158,12 @@ def set_security_manager(sm: SecurityManager): global _sm _sm = sm + + +def no_security_manager(): + """ + Initialize the empty global instance of `SecurityManager`. + """ + + global _sm + _sm = None diff --git a/sdk/python/feast/permissions/server/arrow.py b/sdk/python/feast/permissions/server/arrow.py new file mode 100644 index 0000000000..2533541fa2 --- /dev/null +++ b/sdk/python/feast/permissions/server/arrow.py @@ -0,0 +1,101 @@ +""" +A module with utility functions and classes to support authorizing the Arrow Flight servers. +""" + +import asyncio +import logging +from typing import Optional, cast + +import pyarrow.flight as fl +from pyarrow.flight import ServerCallContext + +from feast.permissions.auth.auth_manager import ( + get_auth_manager, +) +from feast.permissions.security_manager import get_security_manager +from feast.permissions.server.utils import ( + AuthManagerType, + auth_manager_type_from_env, +) + +logger = logging.getLogger(__name__) +logger.setLevel(logging.INFO) + + +def arrowflight_middleware() -> Optional[dict[str, fl.ServerMiddlewareFactory]]: + """ + A dictionary with the configured middlewares to support extracting the user details when the authorization manager is defined. + The authorization middleware key is `auth`. + + Returns: + dict[str, fl.ServerMiddlewareFactory]: Optional dictionary of middlewares. If the authorization type is set to `NONE`, it returns `None`. + """ + # TODO RBAC remove and use the auth section of the feature store config instead + auth_manager_type = auth_manager_type_from_env() + if auth_manager_type == AuthManagerType.NONE: + return None + + return { + "auth": AuthorizationMiddlewareFactory(), + } + + +class AuthorizationMiddlewareFactory(fl.ServerMiddlewareFactory): + """ + A middleware factory to intercept the authorizatino header and propagate it to the authorization middleware. + """ + + def __init__(self): + pass + + def start_call(self, info, headers): + """ + Intercept the authorization header and propagate it to the authorization middleware. + """ + access_token = get_auth_manager().token_extractor.extract_access_token( + headers=headers + ) + return AuthorizationMiddleware(access_token=access_token) + + +class AuthorizationMiddleware(fl.ServerMiddleware): + """ + A server middleware holding the authorization headerr and offering a method to extract the user credentials. + """ + + def __init__(self, access_token: str): + self.access_token = access_token + + def call_completed(self, exception): + if exception: + print(f"{AuthorizationMiddleware.__name__} received {exception}") + + async def extract_user_details(self) -> tuple[str, list[str]]: + """ + Use the configured `TokenParser` to extract the user credentials. + """ + return await get_auth_manager().token_parser.user_details_from_access_token( + self.access_token + ) + + +def inject_user_details_to_security_manager(context: ServerCallContext): + """ + Function to use in Arrow Flight endpoints (e.g. `do_get`, `do_put` and so on) to access the token extracted from the header, + extract the user details out of it and propagate them to the current security manager, if any. + + Args: + context: The endpoint context. + """ + if context.get_middleware("auth") is None: + logger.info("No `auth` middleware.") + return + + sm = get_security_manager() + if sm is not None: + auth_middleware = cast(AuthorizationMiddleware, context.get_middleware("auth")) + current_user, roles = asyncio.run(auth_middleware.extract_user_details()) + print(f"extracted current_user, roles: {(current_user, roles)}") + + sm.set_current_user(current_user) + sm.role_manager.add_roles_for_user(current_user, roles) diff --git a/sdk/python/feast/permissions/server/arrow_flight_token_extractor.py b/sdk/python/feast/permissions/server/arrow_flight_token_extractor.py new file mode 100644 index 0000000000..2378fa8b19 --- /dev/null +++ b/sdk/python/feast/permissions/server/arrow_flight_token_extractor.py @@ -0,0 +1,42 @@ +from starlette.authentication import ( + AuthenticationError, +) + +from feast.permissions.auth.token_extractor import TokenExtractor + + +class ArrowFlightTokenExtractor(TokenExtractor): + def extract_access_token(self, **kwargs) -> str: + """ + Token extractor for Arrow Flight requests. + + Requires a keyword argument called `headers` of type `dict`. + + Returns: + The extracted access token. + """ + + if "headers" not in kwargs: + raise ValueError("Missing keywork argument 'headers'") + if not isinstance(kwargs["headers"], dict): + raise ValueError( + f"The keywork argument 'headers' is not of the expected type {dict.__name__}" + ) + + access_token = None + headers = kwargs["headers"] + if isinstance(headers, dict): + for header in headers: + if header.lower() == "authorization": + # With Arrow Flight, the header value is a list and we take the 0-th element + if not isinstance(headers[header], list): + raise AuthenticationError( + f"Authorization header must be of type list, found {type(headers[header])}" + ) + + return self._extract_bearer_token(headers[header][0]) + + if access_token is None: + raise AuthenticationError("Missing authorization header") + + return access_token diff --git a/sdk/python/feast/permissions/server/rest.py b/sdk/python/feast/permissions/server/rest.py new file mode 100644 index 0000000000..d45f05c6f8 --- /dev/null +++ b/sdk/python/feast/permissions/server/rest.py @@ -0,0 +1,36 @@ +""" +A module with utility functions to support authorizing the REST servers using the FastAPI framework. +""" + +from typing import Any + +from fastapi.requests import Request + +from feast.permissions.auth.auth_manager import ( + get_auth_manager, +) +from feast.permissions.security_manager import get_security_manager + + +async def inject_user_details_to_security_manager(request: Request) -> Any: + """ + A function to extract the authorization token from a user request, extract the user details and propagate them to the + current security manager, if any. + """ + sm = get_security_manager() + if sm is not None: + auth_manager = get_auth_manager() + access_token = auth_manager.token_extractor.extract_access_token( + request=request + ) + ( + current_user, + roles, + ) = await auth_manager.token_parser.user_details_from_access_token( + access_token=access_token + ) + + sm.set_current_user(current_user) + sm.role_manager.add_roles_for_user(current_user, roles) + + return current_user, roles diff --git a/sdk/python/feast/permissions/server/rest_token_extractor.py b/sdk/python/feast/permissions/server/rest_token_extractor.py new file mode 100644 index 0000000000..894c18eedb --- /dev/null +++ b/sdk/python/feast/permissions/server/rest_token_extractor.py @@ -0,0 +1,38 @@ +from fastapi.requests import Request +from starlette.authentication import ( + AuthenticationError, +) + +from feast.permissions.auth.token_extractor import TokenExtractor + + +class RestTokenExtractor(TokenExtractor): + def extract_access_token(self, **kwargs) -> str: + """ + Token extractor for REST requests. + + Requires a keyword argument called `request` of type `Request` + + Returns: + The extracted access token. + """ + + if "request" not in kwargs: + raise ValueError("Missing keywork argument 'request'") + if not isinstance(kwargs["request"], Request): + raise ValueError( + f"The keywork argument 'request' is not of the expected type {Request.__name__}" + ) + + access_token = None + request = kwargs["request"] + if isinstance(request, Request): + headers = request.headers + for header in headers: + if header.lower() == "authorization": + return self._extract_bearer_token(headers[header]) + + if access_token is None: + raise AuthenticationError("Missing authorization header") + + return access_token diff --git a/sdk/python/feast/permissions/server/utils.py b/sdk/python/feast/permissions/server/utils.py new file mode 100644 index 0000000000..d834bcc181 --- /dev/null +++ b/sdk/python/feast/permissions/server/utils.py @@ -0,0 +1,121 @@ +""" +A module with utility functions to support the authorization management in Feast servers. +""" + +import enum +import logging +import os + +from feast.permissions.auth.auth_manager import ( + AllowAll, + AuthManager, + set_auth_manager, +) +from feast.permissions.auth.kubernetes_token_parser import KubernetesTokenParser +from feast.permissions.auth.oidc_token_parser import OidcTokenParser +from feast.permissions.auth.token_extractor import TokenExtractor +from feast.permissions.auth.token_parser import TokenParser +from feast.permissions.role_manager import RoleManager +from feast.permissions.security_manager import ( + SecurityManager, + no_security_manager, + set_security_manager, +) +from feast.permissions.server.arrow_flight_token_extractor import ( + ArrowFlightTokenExtractor, +) +from feast.permissions.server.rest_token_extractor import RestTokenExtractor + +logger = logging.getLogger(__name__) +logger.setLevel(logging.INFO) + + +class ServerType(enum.Enum): + """ + Identify the server type. + """ + + REST = "rest" + ARROW = "arrow" + GRPC = "grpc" # TODO RBAC: to be completed + + +class AuthManagerType(enum.Enum): + """ + Identify the type of authorization manager. + """ + + NONE = "none" + OIDC = "oidc" + KUBERNETES = "kubernetes" + + +# TODO RBAC: will remove once we can manage the auth configuration +def auth_manager_type_from_env() -> AuthManagerType: + type = os.getenv("AUTH_MANAGER_TYPE", "none") + print(f"Configuring authentication manager for {type}") + + if type.lower() == AuthManagerType.OIDC.value: + return AuthManagerType.OIDC + if type.lower() == AuthManagerType.OIDC.value: + return AuthManagerType.OIDC + + return AuthManagerType.NONE + + +def init_security_manager(auth_manager_type: AuthManagerType): + """ + Initialize the global security manager. + Must be invoked at Feast server initialization time to create the `SecurityManager` instance. + + Args: + auth_manager_type: The authorization manager type. + """ + if auth_manager_type == AuthManagerType.NONE: + no_security_manager() + else: + # TODO permissions from registry + set_security_manager( + SecurityManager( + role_manager=RoleManager(), + permissions=[], + ) + ) + + +def init_auth_manager(server_type: ServerType, auth_manager_type: AuthManagerType): + """ + Initialize the global authorization manager. + Must be invoked at Feast server initialization time to create the `AuthManager` instance. + + Args: + server_type: The server type. + auth_manager_type: The authorization manager type. + + Raises: + ValueError: If any input argument has an unmanaged value. + """ + if auth_manager_type == AuthManagerType.NONE: + return AllowAll() + + token_extractor: TokenExtractor + token_parser: TokenParser + + if server_type == ServerType.REST: + token_extractor = RestTokenExtractor() + elif server_type == ServerType.ARROW: + token_extractor = ArrowFlightTokenExtractor() + else: + raise ValueError(f"Unmanaged server type {server_type}") + + if auth_manager_type == AuthManagerType.KUBERNETES: + token_parser = KubernetesTokenParser() + elif auth_manager_type == AuthManagerType.OIDC: + token_parser = OidcTokenParser() + else: + raise ValueError(f"Unmanaged authorization manager type {auth_manager_type}") + + auth_manager = AuthManager( + token_extractor=token_extractor, token_parser=token_parser + ) + set_auth_manager(auth_manager) diff --git a/sdk/python/tests/unit/permissions/auth/test_token_extractor.py b/sdk/python/tests/unit/permissions/auth/test_token_extractor.py new file mode 100644 index 0000000000..4f3aa08ed7 --- /dev/null +++ b/sdk/python/tests/unit/permissions/auth/test_token_extractor.py @@ -0,0 +1,98 @@ +from unittest.mock import Mock + +import assertpy +import pytest +from fastapi.requests import Request +from starlette.authentication import ( + AuthenticationError, +) + +from feast.permissions.server.arrow_flight_token_extractor import ( + ArrowFlightTokenExtractor, +) +from feast.permissions.server.rest_token_extractor import RestTokenExtractor + + +@pytest.mark.parametrize( + "error_type, dict, header", + [ + (ValueError, {}, None), + (ValueError, {"other": 123}, None), + (AuthenticationError, {}, ""), + (AuthenticationError, {}, "abcd"), + (AuthenticationError, {}, "other-scheme abcd"), + ], +) +def test_rest_token_extractor_failures(error_type, dict, header): + token_extractor = RestTokenExtractor() + + request = None + if header is not None: + request = Mock(spec=Request) + if header != "": + request.headers = {"authorization": header} + else: + request.headers = {} + with pytest.raises(error_type): + if request is None: + token_extractor.extract_access_token(**dict) + else: + token_extractor.extract_access_token(request=request) + + +def test_rest_token_extractor(): + token_extractor = RestTokenExtractor() + request: Request = Mock(spec=Request) + token = "abcd" + + request.headers = {"authorization": f"Bearer {token}"} + assertpy.assert_that( + token_extractor.extract_access_token(request=request) + ).is_equal_to(token) + + request.headers = {"authorization": f"bearer {token}"} + assertpy.assert_that( + token_extractor.extract_access_token(request=request) + ).is_equal_to(token) + + +@pytest.mark.parametrize( + "error_type, dict, header", + [ + (ValueError, {}, None), + (ValueError, {"other": 123}, None), + (AuthenticationError, {}, ""), + (AuthenticationError, {}, "abcd"), + (AuthenticationError, {}, ["abcd"]), + (AuthenticationError, {}, ["other-scheme abcd"]), + ], +) +def test_arrow_flight_token_extractor_failures(error_type, dict, header): + token_extractor = ArrowFlightTokenExtractor() + + headers = None + if header is not None: + if header != "": + headers = {"authorization": header} + else: + headers = {} + with pytest.raises(error_type): + if headers is None: + token_extractor.extract_access_token(**dict) + else: + token_extractor.extract_access_token(headers=headers) + + +def test_arrow_flight_token_extractor(): + token_extractor = ArrowFlightTokenExtractor() + token = "abcd" + + headers = {"authorization": [f"Bearer {token}"]} + assertpy.assert_that( + token_extractor.extract_access_token(headers=headers) + ).is_equal_to(token) + + headers = {"authorization": [f"bearer {token}"]} + assertpy.assert_that( + token_extractor.extract_access_token(headers=headers) + ).is_equal_to(token) From 7bfc9459318aded4c5f4f956d1505bd0c70a1212 Mon Sep 17 00:00:00 2001 From: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Date: Tue, 9 Jul 2024 10:02:58 +0200 Subject: [PATCH 042/169] typo Signed-off-by: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Signed-off-by: Abdul Hameed --- sdk/python/feast/permissions/server/arrow.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/python/feast/permissions/server/arrow.py b/sdk/python/feast/permissions/server/arrow.py index 2533541fa2..7974b58f86 100644 --- a/sdk/python/feast/permissions/server/arrow.py +++ b/sdk/python/feast/permissions/server/arrow.py @@ -60,7 +60,7 @@ def start_call(self, info, headers): class AuthorizationMiddleware(fl.ServerMiddleware): """ - A server middleware holding the authorization headerr and offering a method to extract the user credentials. + A server middleware holding the authorization header and offering a method to extract the user credentials. """ def __init__(self, access_token: str): From d988846d62381735d37a1169f5fa6f4e13994ed8 Mon Sep 17 00:00:00 2001 From: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Date: Tue, 9 Jul 2024 10:03:12 +0200 Subject: [PATCH 043/169] duplicated if Signed-off-by: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Signed-off-by: Abdul Hameed --- sdk/python/feast/permissions/server/utils.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sdk/python/feast/permissions/server/utils.py b/sdk/python/feast/permissions/server/utils.py index d834bcc181..dc63f5340e 100644 --- a/sdk/python/feast/permissions/server/utils.py +++ b/sdk/python/feast/permissions/server/utils.py @@ -57,8 +57,8 @@ def auth_manager_type_from_env() -> AuthManagerType: if type.lower() == AuthManagerType.OIDC.value: return AuthManagerType.OIDC - if type.lower() == AuthManagerType.OIDC.value: - return AuthManagerType.OIDC + if type.lower() == AuthManagerType.KUBERNETES.value: + return AuthManagerType.KUBERNETES return AuthManagerType.NONE From 07211da82d0d793c9d81a20ccd1a038681c5680f Mon Sep 17 00:00:00 2001 From: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Date: Tue, 9 Jul 2024 10:15:48 +0200 Subject: [PATCH 044/169] renamed functions with long name Signed-off-by: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Signed-off-by: Abdul Hameed --- sdk/python/feast/feature_server.py | 4 ++-- sdk/python/feast/offline_server.py | 4 ++-- sdk/python/feast/permissions/server/arrow.py | 2 +- sdk/python/feast/permissions/server/rest.py | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/sdk/python/feast/feature_server.py b/sdk/python/feast/feature_server.py index 9ad782d799..73bf1a09d8 100644 --- a/sdk/python/feast/feature_server.py +++ b/sdk/python/feast/feature_server.py @@ -22,7 +22,7 @@ from feast.errors import FeatureViewNotFoundException, PushSourceNotFoundException from feast.permissions.action import WRITE, AuthzedAction from feast.permissions.security_manager import assert_permissions -from feast.permissions.server.rest import inject_user_details_to_security_manager +from feast.permissions.server.rest import inject_user_details from feast.permissions.server.utils import ( ServerType, auth_manager_type_from_env, @@ -104,7 +104,7 @@ async def get_body(request: Request): # TODO RBAC: complete the dependencies for the other endpoints @app.post( "/get-online-features", - dependencies=[Depends(inject_user_details_to_security_manager)], + dependencies=[Depends(inject_user_details)], ) def get_online_features(body=Depends(get_body)): try: diff --git a/sdk/python/feast/offline_server.py b/sdk/python/feast/offline_server.py index b24febe78c..df58268701 100644 --- a/sdk/python/feast/offline_server.py +++ b/sdk/python/feast/offline_server.py @@ -21,7 +21,7 @@ from feast.permissions.security_manager import assert_permissions from feast.permissions.server.arrow import ( arrowflight_middleware, - inject_user_details_to_security_manager, + inject_user_details, ) from feast.permissions.server.utils import ( ServerType, @@ -178,7 +178,7 @@ def _validate_do_get_parameters(self, command: dict): # and returns the stream of data def do_get(self, context: fl.ServerCallContext, ticket: fl.Ticket): # TODO RBAC: add the same to all the authorized endpoints - inject_user_details_to_security_manager(context) + inject_user_details(context) key = ast.literal_eval(ticket.ticket.decode()) if key not in self.flights: diff --git a/sdk/python/feast/permissions/server/arrow.py b/sdk/python/feast/permissions/server/arrow.py index 7974b58f86..7a13c80df0 100644 --- a/sdk/python/feast/permissions/server/arrow.py +++ b/sdk/python/feast/permissions/server/arrow.py @@ -79,7 +79,7 @@ async def extract_user_details(self) -> tuple[str, list[str]]: ) -def inject_user_details_to_security_manager(context: ServerCallContext): +def inject_user_details(context: ServerCallContext): """ Function to use in Arrow Flight endpoints (e.g. `do_get`, `do_put` and so on) to access the token extracted from the header, extract the user details out of it and propagate them to the current security manager, if any. diff --git a/sdk/python/feast/permissions/server/rest.py b/sdk/python/feast/permissions/server/rest.py index d45f05c6f8..7787b17f08 100644 --- a/sdk/python/feast/permissions/server/rest.py +++ b/sdk/python/feast/permissions/server/rest.py @@ -12,7 +12,7 @@ from feast.permissions.security_manager import get_security_manager -async def inject_user_details_to_security_manager(request: Request) -> Any: +async def inject_user_details(request: Request) -> Any: """ A function to extract the authorization token from a user request, extract the user details and propagate them to the current security manager, if any. From 5386419cfde64efdeef5dc7da931ece094f5dbb7 Mon Sep 17 00:00:00 2001 From: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Date: Tue, 9 Jul 2024 12:04:33 +0200 Subject: [PATCH 045/169] using User class instead of RoleManager (completely removed) Signed-off-by: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Signed-off-by: Abdul Hameed --- .../feast/permissions/auth/auth_manager.py | 3 +- .../auth/kubernetes_token_parser.py | 12 ++--- .../permissions/auth/oidc_token_parser.py | 10 ++-- .../feast/permissions/auth/token_parser.py | 15 +++--- sdk/python/feast/permissions/enforcer.py | 8 ++-- sdk/python/feast/permissions/policy.py | 21 ++------- sdk/python/feast/permissions/role_manager.py | 46 ------------------- .../feast/permissions/security_manager.py | 30 +++++------- sdk/python/feast/permissions/server/arrow.py | 8 ++-- sdk/python/feast/permissions/server/rest.py | 8 +--- sdk/python/feast/permissions/server/utils.py | 2 - sdk/python/feast/permissions/user.py | 38 +++++++++++++++ sdk/python/tests/unit/permissions/conftest.py | 22 ++++----- .../tests/unit/permissions/test_decorator.py | 5 +- .../tests/unit/permissions/test_policy.py | 30 ++++-------- .../unit/permissions/test_security_manager.py | 11 ++++- .../{test_role_manager.py => test_user.py} | 20 ++++---- 17 files changed, 121 insertions(+), 168 deletions(-) delete mode 100644 sdk/python/feast/permissions/role_manager.py create mode 100644 sdk/python/feast/permissions/user.py rename sdk/python/tests/unit/permissions/{test_role_manager.py => test_user.py} (52%) diff --git a/sdk/python/feast/permissions/auth/auth_manager.py b/sdk/python/feast/permissions/auth/auth_manager.py index ba5dffafc5..e608904567 100644 --- a/sdk/python/feast/permissions/auth/auth_manager.py +++ b/sdk/python/feast/permissions/auth/auth_manager.py @@ -7,7 +7,8 @@ class AuthManager(ABC): """ - The authorization manager offers to intercept client requests and extract user details to inject in the security context. + The authorization manager offers services to manage authorization tokens from client requests + to extract user details before injecting them in the security context. """ _token_parser: TokenParser diff --git a/sdk/python/feast/permissions/auth/kubernetes_token_parser.py b/sdk/python/feast/permissions/auth/kubernetes_token_parser.py index 13f27bc805..421a17f020 100644 --- a/sdk/python/feast/permissions/auth/kubernetes_token_parser.py +++ b/sdk/python/feast/permissions/auth/kubernetes_token_parser.py @@ -7,6 +7,7 @@ ) from feast.permissions.auth.token_parser import TokenParser +from feast.permissions.user import User logger = logging.getLogger(__name__) @@ -18,7 +19,7 @@ class KubernetesTokenParser(TokenParser): client `ServiceAccount`. By inspecting the role bindings, this `TokenParser` extracts the associated `Role`s. - The client `ServiceAccount` is instead used as the user ID, together with the current namespace. + The client `ServiceAccount` is instead used as the user name, together with the current namespace. """ def __init__(self): @@ -26,15 +27,12 @@ def __init__(self): self.v1 = client.CoreV1Api() self.rbac_v1 = client.RbacAuthorizationV1Api() - async def user_details_from_access_token( - self, access_token: str, **kwargs - ) -> tuple[str, list[str]]: + async def user_details_from_access_token(self, access_token: str) -> User: """ Extract the service account from the token and search the roles associated with it. Returns: - str: Current user, the `:` separated concatenation of `namespace` and `service account name`. - list[str]: Roles associated to the user. + User: Current user, with associated roles. The `username` is the `:` separated concatenation of `namespace` and `service account name`. Raises: AuthenticationError if any error happens. @@ -46,7 +44,7 @@ async def user_details_from_access_token( roles = self.get_roles(sa_namespace, sa_name) logging.info(f"SA roles are: {roles}") - return (current_user, roles) + return User(username=current_user, roles=roles) def get_roles(self, namespace: str, service_account_name: str) -> list[str]: """ diff --git a/sdk/python/feast/permissions/auth/oidc_token_parser.py b/sdk/python/feast/permissions/auth/oidc_token_parser.py index 1a6fd4f74c..b8928d54c1 100644 --- a/sdk/python/feast/permissions/auth/oidc_token_parser.py +++ b/sdk/python/feast/permissions/auth/oidc_token_parser.py @@ -12,6 +12,7 @@ ) from feast.permissions.auth.token_parser import TokenParser +from feast.permissions.user import User logger = logging.getLogger(__name__) logger.setLevel(logging.INFO) @@ -52,15 +53,12 @@ async def _validate_token(self, access_token: str): await oauth_2_scheme(request=request) - async def user_details_from_access_token( - self, access_token: str, **kwargs - ) -> tuple[str, list[str]]: + async def user_details_from_access_token(self, access_token: str) -> User: """ Validate the access token then decode it to extract the user credential and roles. Returns: - str: Current user. - list[str]: Roles associated to the user. + User: Current user, with associated roles. Raises: AuthenticationError if any error happens. @@ -103,6 +101,6 @@ async def user_details_from_access_token( ) roles = data["resource_access"][self._CLIENT_ID]["roles"] logger.info(f"Extracted user {current_user} and roles {roles}") - return (current_user, roles) + return User(username=current_user, roles=roles) except jwt.exceptions.InvalidTokenError: raise AuthenticationError("Invalid token.") diff --git a/sdk/python/feast/permissions/auth/token_parser.py b/sdk/python/feast/permissions/auth/token_parser.py index d92189e2cf..f8f2aee44a 100644 --- a/sdk/python/feast/permissions/auth/token_parser.py +++ b/sdk/python/feast/permissions/auth/token_parser.py @@ -1,5 +1,7 @@ from abc import ABC, abstractmethod +from feast.permissions.user import User + class TokenParser(ABC): """ @@ -7,15 +9,12 @@ class TokenParser(ABC): """ @abstractmethod - async def user_details_from_access_token( - self, access_token: str, **kwargs - ) -> tuple[str, list[str]]: + async def user_details_from_access_token(self, access_token: str) -> User: """ Parse the access token and return the current user and the list of associated roles. Returns: - str: Current user. - list[str]: Roles associated to the user. + User: Current user, with associated roles. """ raise NotImplementedError() @@ -25,7 +24,5 @@ class NoAuthTokenParser(TokenParser): A `TokenParser` always returning an empty token """ - async def user_details_from_access_token( - self, access_token: str, **kwargs - ) -> tuple[str, list[str]]: - return ("", []) + async def user_details_from_access_token(self, access_token: str, **kwargs) -> User: + return User(username="", roles=[]) diff --git a/sdk/python/feast/permissions/enforcer.py b/sdk/python/feast/permissions/enforcer.py index 080db4bb25..4c5c4475e0 100644 --- a/sdk/python/feast/permissions/enforcer.py +++ b/sdk/python/feast/permissions/enforcer.py @@ -6,15 +6,14 @@ AuthzedAction, Permission, ) -from feast.permissions.role_manager import RoleManager +from feast.permissions.user import User logger = logging.getLogger(__name__) def enforce_policy( - role_manager: RoleManager, permissions: list[Permission], - user: str, + user: User, resources: list[FeastObject], actions: list[AuthzedAction], filter_only: bool = False, @@ -26,7 +25,6 @@ def enforce_policy( If no permissions are defined, the result is to allow the execution. Args: - role_manager: The `RoleManager` instance. permissions: The configured set of `Permission`. user: The current user. resources: The resources for which we need to enforce authorized permission. @@ -60,7 +58,7 @@ def enforce_policy( ) for p in matching_permissions: permission_grant, permission_explanation = p.policy.validate_user( - user=user, role_manager=role_manager + user=user ) evaluator.add_grant( permission_grant, diff --git a/sdk/python/feast/permissions/policy.py b/sdk/python/feast/permissions/policy.py index 86ec8a5dc0..271448422f 100644 --- a/sdk/python/feast/permissions/policy.py +++ b/sdk/python/feast/permissions/policy.py @@ -1,7 +1,7 @@ from abc import ABC, abstractmethod from typing import Any -from feast.permissions.role_manager import RoleManager +from feast.permissions.user import User from feast.protos.feast.core.Policy_pb2 import Policy as PolicyProto from feast.protos.feast.core.Policy_pb2 import RoleBasedPolicy as RoleBasedPolicyProto @@ -12,13 +12,12 @@ class Policy(ABC): """ @abstractmethod - def validate_user(self, user: str, **kwargs) -> tuple[bool, str]: + def validate_user(self, user: User) -> tuple[bool, str]: """ Validate the given user against the configured policy. Args: user: The current user. - kwargs: The list of keyword args to be passed to the actual implementation. Returns: bool: `True` if the user matches the policy criteria, `False` otherwise. @@ -80,21 +79,11 @@ def __eq__(self, other): def get_roles(self) -> list[str]: return self.roles - def validate_user(self, user: str, **kwargs) -> tuple[bool, str]: + def validate_user(self, user: User) -> tuple[bool, str]: """ Validate the given `user` against the configured roles. - - The `role_manager` keywork argument must be present in the `kwargs` optional key-value arguments. """ - if "role_manager" not in kwargs: - raise ValueError("Missing keywork argument 'role_manager'") - if not isinstance(kwargs["role_manager"], RoleManager): - raise ValueError( - f"The keywork argument 'role_manager' is not of the expected type {RoleManager.__name__}" - ) - rm = kwargs.get("role_manager") - if isinstance(rm, RoleManager): - result = rm.user_has_matching_role(user, self.roles) + result = user.has_matching_role(self.roles) explain = "" if result else f"Requires roles {self.roles}" return (result, explain) @@ -122,7 +111,7 @@ def to_proto(self) -> PolicyProto: return policy_proto -def allow_all(self, user: str, **kwargs) -> tuple[bool, str]: +def allow_all(self, user: User) -> tuple[bool, str]: return True, "" diff --git a/sdk/python/feast/permissions/role_manager.py b/sdk/python/feast/permissions/role_manager.py deleted file mode 100644 index ca939a162f..0000000000 --- a/sdk/python/feast/permissions/role_manager.py +++ /dev/null @@ -1,46 +0,0 @@ -import logging - -logger = logging.getLogger(__name__) - - -class RoleManager: - """ - `RoleManager` is the registry of user roles captured from the external user request and used by the - `RoleBasedPolicy` policy. - """ - - def __init__(self): - self.roles_by_user = {} - - def add_roles_for_user(self, user: str, roles: list[str]): - """ - Add the given roles to the given user. - - Args: - user: The user ID. - roles: The list of associated roles. - """ - self.roles_by_user.setdefault(user, []).extend(roles) - - def clear(self) -> None: - """ - Clear all the registered roles. - """ - self.roles_by_user.clear() - - def user_has_matching_role(self, user: str, roles: list[str]) -> bool: - """ - Verify that the given user has at least one of the requested roles. - - Args: - user: The user ID. - roles: The list of requested roles. - - Returns: - bool: `True` only if the given user has any registered role and all the given roles are registered. - """ - logger.debug( - f"Check {user} has all {roles}: currently {self.roles_by_user.get(user, [])}" - ) - user_roles = self.roles_by_user.get(user, []) - return any(role in user_roles for role in roles) diff --git a/sdk/python/feast/permissions/security_manager.py b/sdk/python/feast/permissions/security_manager.py index e9ae36aa13..75c144dea2 100644 --- a/sdk/python/feast/permissions/security_manager.py +++ b/sdk/python/feast/permissions/security_manager.py @@ -6,45 +6,38 @@ from feast.permissions.action import AuthzedAction from feast.permissions.enforcer import enforce_policy from feast.permissions.permission import Permission -from feast.permissions.role_manager import RoleManager +from feast.permissions.user import User logger = logging.getLogger(__name__) class SecurityManager: """ - The security manager holds references to the security components (role manager, policy enforces) and the configured permissions. - It is accessed and defined using the global functions `_get_security_manager` and `_set_security_manager` + The security manager it's the entry point to validate the configuration of the current user against the configured permission policies. + It is accessed and defined using the global functions `get_security_manager` and `set_security_manager` """ def __init__( self, - role_manager: RoleManager, permissions: list[Permission] = [], ): - self._role_manager: RoleManager = role_manager self._permissions: list[Permission] = permissions - self._current_user: ContextVar[Optional[str]] = ContextVar( + self._current_user: ContextVar[Optional[User]] = ContextVar( "current_user", default=None ) - def set_current_user(self, user: str): - self._current_user.set(user) - - @property - def role_manager(self) -> RoleManager: + def set_current_user(self, current_user: User): """ - Returns: - RoleManager: the configured `RoleManager` instance. + Init the user for the current context. """ - return self._role_manager + self._current_user.set(current_user) @property - def current_user(self) -> Optional[str]: + def current_user(self) -> Optional[User]: """ Returns: - str: the possibly empty ID of the current user. `contextvars` module is used to ensure that each concurrent request has its own - individual user ID. + str: the possibly empty instance of the current user. `contextvars` module is used to ensure that each concurrent request has its own + individual user. """ return self._current_user.get() @@ -80,9 +73,8 @@ def assert_permissions( PermissionError: If the current user is not authorized to eecute all the requested actions on the given resources. """ return enforce_policy( - role_manager=self._role_manager, permissions=self._permissions, - user=self.current_user if self.current_user is not None else "", + user=self.current_user if self.current_user is not None else User("", []), resources=resources, actions=actions if isinstance(actions, list) else [actions], filter_only=filter_only, diff --git a/sdk/python/feast/permissions/server/arrow.py b/sdk/python/feast/permissions/server/arrow.py index 7a13c80df0..bee900a556 100644 --- a/sdk/python/feast/permissions/server/arrow.py +++ b/sdk/python/feast/permissions/server/arrow.py @@ -17,6 +17,7 @@ AuthManagerType, auth_manager_type_from_env, ) +from feast.permissions.user import User logger = logging.getLogger(__name__) logger.setLevel(logging.INFO) @@ -70,7 +71,7 @@ def call_completed(self, exception): if exception: print(f"{AuthorizationMiddleware.__name__} received {exception}") - async def extract_user_details(self) -> tuple[str, list[str]]: + async def extract_user(self) -> User: """ Use the configured `TokenParser` to extract the user credentials. """ @@ -94,8 +95,7 @@ def inject_user_details(context: ServerCallContext): sm = get_security_manager() if sm is not None: auth_middleware = cast(AuthorizationMiddleware, context.get_middleware("auth")) - current_user, roles = asyncio.run(auth_middleware.extract_user_details()) - print(f"extracted current_user, roles: {(current_user, roles)}") + current_user = asyncio.run(auth_middleware.extract_user()) + print(f"extracted user: {current_user}") sm.set_current_user(current_user) - sm.role_manager.add_roles_for_user(current_user, roles) diff --git a/sdk/python/feast/permissions/server/rest.py b/sdk/python/feast/permissions/server/rest.py index 7787b17f08..1fa4eecba3 100644 --- a/sdk/python/feast/permissions/server/rest.py +++ b/sdk/python/feast/permissions/server/rest.py @@ -23,14 +23,10 @@ async def inject_user_details(request: Request) -> Any: access_token = auth_manager.token_extractor.extract_access_token( request=request ) - ( - current_user, - roles, - ) = await auth_manager.token_parser.user_details_from_access_token( + current_user = await auth_manager.token_parser.user_details_from_access_token( access_token=access_token ) sm.set_current_user(current_user) - sm.role_manager.add_roles_for_user(current_user, roles) - return current_user, roles + return current_user diff --git a/sdk/python/feast/permissions/server/utils.py b/sdk/python/feast/permissions/server/utils.py index dc63f5340e..1e8989ddb6 100644 --- a/sdk/python/feast/permissions/server/utils.py +++ b/sdk/python/feast/permissions/server/utils.py @@ -15,7 +15,6 @@ from feast.permissions.auth.oidc_token_parser import OidcTokenParser from feast.permissions.auth.token_extractor import TokenExtractor from feast.permissions.auth.token_parser import TokenParser -from feast.permissions.role_manager import RoleManager from feast.permissions.security_manager import ( SecurityManager, no_security_manager, @@ -77,7 +76,6 @@ def init_security_manager(auth_manager_type: AuthManagerType): # TODO permissions from registry set_security_manager( SecurityManager( - role_manager=RoleManager(), permissions=[], ) ) diff --git a/sdk/python/feast/permissions/user.py b/sdk/python/feast/permissions/user.py new file mode 100644 index 0000000000..783b683de6 --- /dev/null +++ b/sdk/python/feast/permissions/user.py @@ -0,0 +1,38 @@ +import logging + +logger = logging.getLogger(__name__) + + +class User: + _username: str + _roles: list[str] + + def __init__(self, username: str, roles: list[str]): + self._username = username + self._roles = roles + + @property + def username(self): + return self._username + + @property + def roles(self): + return self._roles + + def has_matching_role(self, requested_roles: list[str]) -> bool: + """ + Verify that the user has at least one of the requested roles. + + Args: + requested_roles: The list of requested roles. + + Returns: + bool: `True` only if the user has any registered role and all the given roles are registered. + """ + logger.debug( + f"Check {self.username} has all {requested_roles}: currently {self.roles}" + ) + return any(role in self.roles for role in requested_roles) + + def __str__(self): + return f"{self.username} ({self.roles})" diff --git a/sdk/python/tests/unit/permissions/conftest.py b/sdk/python/tests/unit/permissions/conftest.py index ee2e258981..ef9b877256 100644 --- a/sdk/python/tests/unit/permissions/conftest.py +++ b/sdk/python/tests/unit/permissions/conftest.py @@ -6,11 +6,11 @@ from feast.permissions.decorator import require_permissions from feast.permissions.permission import AuthzedAction, Permission from feast.permissions.policy import RoleBasedPolicy -from feast.permissions.role_manager import RoleManager from feast.permissions.security_manager import ( SecurityManager, set_security_manager, ) +from feast.permissions.user import User class SecuredFeatureView(FeatureView): @@ -42,12 +42,13 @@ def feature_views() -> list[FeatureView]: @pytest.fixture -def role_manager() -> RoleManager: - rm = RoleManager() - rm.add_roles_for_user("r", ["reader"]) - rm.add_roles_for_user("w", ["writer"]) - rm.add_roles_for_user("rw", ["reader", "writer"]) - return rm +def users() -> list[User]: + users = [] + users.append(User("r", ["reader"])) + users.append(User("w", ["writer"])) + users.append(User("rw", ["reader", "writer"])) + users.append(User("admin", ["reader", "writer", "admin"])) + return dict([(u.username, u) for u in users]) @pytest.fixture @@ -82,11 +83,6 @@ def security_manager() -> SecurityManager: ) ) - rm = RoleManager() - rm.add_roles_for_user("r", ["reader"]) - rm.add_roles_for_user("w", ["writer"]) - rm.add_roles_for_user("rw", ["reader", "writer"]) - rm.add_roles_for_user("admin", ["reader", "writer", "admin"]) - sm = SecurityManager(role_manager=rm, permissions=permissions) + sm = SecurityManager(permissions=permissions) set_security_manager(sm) return sm diff --git a/sdk/python/tests/unit/permissions/test_decorator.py b/sdk/python/tests/unit/permissions/test_decorator.py index f328121346..8f6c2c420b 100644 --- a/sdk/python/tests/unit/permissions/test_decorator.py +++ b/sdk/python/tests/unit/permissions/test_decorator.py @@ -3,7 +3,7 @@ @pytest.mark.parametrize( - "user, can_read, can_write", + "username, can_read, can_write", [ (None, False, False), ("r", True, False), @@ -12,10 +12,11 @@ ], ) def test_access_SecuredFeatureView( - security_manager, feature_views, user, can_read, can_write + security_manager, feature_views, users, username, can_read, can_write ): sm = security_manager fv = feature_views[0] + user = users.get(username) sm.set_current_user(user) if can_read: diff --git a/sdk/python/tests/unit/permissions/test_policy.py b/sdk/python/tests/unit/permissions/test_policy.py index 2074dbb990..4e78282d4f 100644 --- a/sdk/python/tests/unit/permissions/test_policy.py +++ b/sdk/python/tests/unit/permissions/test_policy.py @@ -2,25 +2,20 @@ import pytest from feast.permissions.policy import AllowAll, RoleBasedPolicy +from feast.permissions.user import User @pytest.mark.parametrize( - "user, dict", - [ - ("any", None), - (None, None), - ("any", {"other_arg": 1234}), - ], + "username", + [("r"), ("w"), ("rw"), ("missing")], ) -def test_allow_all(user, dict): - if dict: - assertpy.assert_that(AllowAll.validate_user(user, **dict)).is_true() - else: - assertpy.assert_that(AllowAll.validate_user(user)).is_true() +def test_allow_all(users, username): + user = users.get(username, User(username, [])) + assertpy.assert_that(AllowAll.validate_user(user)).is_true() @pytest.mark.parametrize( - "required_roles, user, result", + "required_roles, username, result", [ (["reader"], "r", True), (["writer"], "r", False), @@ -36,16 +31,11 @@ def test_allow_all(user, dict): (["updater"], "rw", False), ], ) -def test_role_based_policy(role_manager, required_roles, user, result): - rm = role_manager +def test_role_based_policy(users, required_roles, username, result): + user = users.get(username) policy = RoleBasedPolicy(roles=required_roles) - with pytest.raises(ValueError): - policy.validate_user(user=user) - with pytest.raises(ValueError): - policy.validate_user(user=user, role_manager="wrong-type") - - validate_result, explain = policy.validate_user(user, role_manager=rm) + validate_result, explain = policy.validate_user(user) assertpy.assert_that(validate_result).is_equal_to(result) if result is True: diff --git a/sdk/python/tests/unit/permissions/test_security_manager.py b/sdk/python/tests/unit/permissions/test_security_manager.py index 9eb80260c3..f98f31b2b1 100644 --- a/sdk/python/tests/unit/permissions/test_security_manager.py +++ b/sdk/python/tests/unit/permissions/test_security_manager.py @@ -13,7 +13,7 @@ def setup_module(): @pytest.mark.parametrize( - "user, requested_actions, allowed, allowed_single", + "username, requested_actions, allowed, allowed_single", [ (None, [], False, [False, False]), ("r", [AuthzedAction.READ], False, [True, False]), @@ -28,11 +28,18 @@ def setup_module(): ], ) def test_access_SecuredFeatureView( - security_manager, feature_views, user, requested_actions, allowed, allowed_single + security_manager, + feature_views, + users, + username, + requested_actions, + allowed, + allowed_single, ): sm = security_manager resources = feature_views + user = users.get(username) sm.set_current_user(user) result = permitted_resources(resources=resources, actions=requested_actions) if allowed: diff --git a/sdk/python/tests/unit/permissions/test_role_manager.py b/sdk/python/tests/unit/permissions/test_user.py similarity index 52% rename from sdk/python/tests/unit/permissions/test_role_manager.py rename to sdk/python/tests/unit/permissions/test_user.py index ef70252d5f..cce318cba7 100644 --- a/sdk/python/tests/unit/permissions/test_role_manager.py +++ b/sdk/python/tests/unit/permissions/test_user.py @@ -1,19 +1,19 @@ import assertpy import pytest -from feast.permissions.role_manager import RoleManager +from feast.permissions.user import User @pytest.fixture(scope="module") -def role_manager(): - rm = RoleManager() - rm.add_roles_for_user("a", ["a1", "a2"]) - rm.add_roles_for_user("b", ["b1", "b2"]) - return rm +def users(): + users = [] + users.append(User("a", ["a1", "a2"])) + users.append(User("b", ["b1", "b2"])) + return dict([(u.username, u) for u in users]) @pytest.mark.parametrize( - "user, roles, result", + "username, roles, result", [ ("c", [], False), ("a", ["b1"], False), @@ -27,8 +27,8 @@ def role_manager(): ("b", ["b1", "b2", "b3"], True), ], ) -def test_user_has_matching_role(role_manager, user, roles, result): - rm = role_manager - assertpy.assert_that(rm.user_has_matching_role(user=user, roles=roles)).is_equal_to( +def test_user_has_matching_role(users, username, roles, result): + user = users.get(username, User(username, [])) + assertpy.assert_that(user.has_matching_role(requested_roles=roles)).is_equal_to( result ) From 0548aeae14bf4dca4fdc23714351411ebf05083c Mon Sep 17 00:00:00 2001 From: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Date: Tue, 9 Jul 2024 14:55:36 +0200 Subject: [PATCH 046/169] Feed SecurityManager with Registry instance to fetch the actual permissions Signed-off-by: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Signed-off-by: Abdul Hameed --- sdk/python/feast/feature_server.py | 2 +- sdk/python/feast/offline_server.py | 2 +- sdk/python/feast/permissions/security_manager.py | 11 +++++++---- sdk/python/feast/permissions/server/utils.py | 6 ++++-- sdk/python/tests/unit/permissions/conftest.py | 5 ++++- 5 files changed, 17 insertions(+), 9 deletions(-) diff --git a/sdk/python/feast/feature_server.py b/sdk/python/feast/feature_server.py index 73bf1a09d8..63d6cb8e3b 100644 --- a/sdk/python/feast/feature_server.py +++ b/sdk/python/feast/feature_server.py @@ -347,7 +347,7 @@ def start_server( # TODO RBAC remove and use the auth section of the feature store config instead auth_manager_type = auth_manager_type_from_env() - init_security_manager(auth_manager_type) + init_security_manager(auth_manager_type=auth_manager_type, fs=store) init_auth_manager( auth_manager_type=auth_manager_type, server_type=ServerType.REST, diff --git a/sdk/python/feast/offline_server.py b/sdk/python/feast/offline_server.py index df58268701..9d0759782b 100644 --- a/sdk/python/feast/offline_server.py +++ b/sdk/python/feast/offline_server.py @@ -455,7 +455,7 @@ def start_server( ): # TODO RBAC remove and use the auth section of the feature store config instead auth_manager_type = auth_manager_type_from_env() - init_security_manager(auth_manager_type) + init_security_manager(auth_manager_type=auth_manager_type, fs=store) init_auth_manager( auth_manager_type=auth_manager_type, server_type=ServerType.ARROW, diff --git a/sdk/python/feast/permissions/security_manager.py b/sdk/python/feast/permissions/security_manager.py index 75c144dea2..315904305e 100644 --- a/sdk/python/feast/permissions/security_manager.py +++ b/sdk/python/feast/permissions/security_manager.py @@ -3,6 +3,7 @@ from typing import List, Optional, Union from feast.feast_object import FeastObject +from feast.infra.registry.base_registry import BaseRegistry from feast.permissions.action import AuthzedAction from feast.permissions.enforcer import enforce_policy from feast.permissions.permission import Permission @@ -19,9 +20,11 @@ class SecurityManager: def __init__( self, - permissions: list[Permission] = [], + project: str, + registry: BaseRegistry, ): - self._permissions: list[Permission] = permissions + self._project = project + self._registry = registry self._current_user: ContextVar[Optional[User]] = ContextVar( "current_user", default=None ) @@ -47,7 +50,7 @@ def permissions(self) -> list[Permission]: Returns: list[Permission]: the list of `Permission` configured in the Feast registry. """ - return self._permissions + return self._registry.list_permissions(project=self._project) def assert_permissions( self, @@ -73,7 +76,7 @@ def assert_permissions( PermissionError: If the current user is not authorized to eecute all the requested actions on the given resources. """ return enforce_policy( - permissions=self._permissions, + permissions=self.permissions, user=self.current_user if self.current_user is not None else User("", []), resources=resources, actions=actions if isinstance(actions, list) else [actions], diff --git a/sdk/python/feast/permissions/server/utils.py b/sdk/python/feast/permissions/server/utils.py index 1e8989ddb6..647ca310d0 100644 --- a/sdk/python/feast/permissions/server/utils.py +++ b/sdk/python/feast/permissions/server/utils.py @@ -62,13 +62,14 @@ def auth_manager_type_from_env() -> AuthManagerType: return AuthManagerType.NONE -def init_security_manager(auth_manager_type: AuthManagerType): +def init_security_manager(auth_manager_type: AuthManagerType, fs: "feast.FeatureStore"): """ Initialize the global security manager. Must be invoked at Feast server initialization time to create the `SecurityManager` instance. Args: auth_manager_type: The authorization manager type. + registry: The feature store registry. """ if auth_manager_type == AuthManagerType.NONE: no_security_manager() @@ -76,7 +77,8 @@ def init_security_manager(auth_manager_type: AuthManagerType): # TODO permissions from registry set_security_manager( SecurityManager( - permissions=[], + project=fs.project, + registry=fs.registry, ) ) diff --git a/sdk/python/tests/unit/permissions/conftest.py b/sdk/python/tests/unit/permissions/conftest.py index ef9b877256..c85ebb1596 100644 --- a/sdk/python/tests/unit/permissions/conftest.py +++ b/sdk/python/tests/unit/permissions/conftest.py @@ -3,6 +3,7 @@ import pytest from feast import FeatureView +from feast.infra.registry.base_registry import BaseRegistry from feast.permissions.decorator import require_permissions from feast.permissions.permission import AuthzedAction, Permission from feast.permissions.policy import RoleBasedPolicy @@ -83,6 +84,8 @@ def security_manager() -> SecurityManager: ) ) - sm = SecurityManager(permissions=permissions) + registry = Mock(spec=BaseRegistry) + registry.list_permissions = Mock(return_value=permissions) + sm = SecurityManager(project="any", registry=registry) set_security_manager(sm) return sm From a921f079f1f66bdf6d751dae7b5de03e990c3e86 Mon Sep 17 00:00:00 2001 From: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Date: Tue, 9 Jul 2024 15:00:11 +0200 Subject: [PATCH 047/169] fixed linter Signed-off-by: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Signed-off-by: Abdul Hameed --- sdk/python/feast/permissions/server/utils.py | 1 + 1 file changed, 1 insertion(+) diff --git a/sdk/python/feast/permissions/server/utils.py b/sdk/python/feast/permissions/server/utils.py index 647ca310d0..c89b85e5ca 100644 --- a/sdk/python/feast/permissions/server/utils.py +++ b/sdk/python/feast/permissions/server/utils.py @@ -6,6 +6,7 @@ import logging import os +import feast from feast.permissions.auth.auth_manager import ( AllowAll, AuthManager, From f0b95c89a7234f7de7e0ddd3039e4323d2e80490 Mon Sep 17 00:00:00 2001 From: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Date: Tue, 9 Jul 2024 17:42:10 +0200 Subject: [PATCH 048/169] review comments Signed-off-by: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Signed-off-by: Abdul Hameed --- sdk/python/feast/offline_server.py | 5 ----- sdk/python/feast/permissions/auth/token_extractor.py | 2 +- sdk/python/feast/permissions/server/arrow.py | 2 +- 3 files changed, 2 insertions(+), 7 deletions(-) diff --git a/sdk/python/feast/offline_server.py b/sdk/python/feast/offline_server.py index 9d0759782b..6a538cf8e5 100644 --- a/sdk/python/feast/offline_server.py +++ b/sdk/python/feast/offline_server.py @@ -8,11 +8,6 @@ import pyarrow as pa import pyarrow.flight as fl -# import debugpy -# debugpy.listen(("localhost", 5678)) -# print("Waiting for debugger attach...") -# debugpy.wait_for_client() -# print("Debugger attached.") from feast import FeatureStore, FeatureView, utils from feast.feature_logging import FeatureServiceLoggingSource from feast.feature_view import DUMMY_ENTITY_NAME diff --git a/sdk/python/feast/permissions/auth/token_extractor.py b/sdk/python/feast/permissions/auth/token_extractor.py index 6e7c4add96..37779d7640 100644 --- a/sdk/python/feast/permissions/auth/token_extractor.py +++ b/sdk/python/feast/permissions/auth/token_extractor.py @@ -24,7 +24,7 @@ def extract_access_token(self, **kwargs) -> str: def _extract_bearer_token(self, auth_header: str) -> str: """ - Extract the bearer token from th eauthorizatino header value. + Extract the bearer token from the authorization header value. Args: auth_header: The full value of the authorization header. diff --git a/sdk/python/feast/permissions/server/arrow.py b/sdk/python/feast/permissions/server/arrow.py index bee900a556..06312977fc 100644 --- a/sdk/python/feast/permissions/server/arrow.py +++ b/sdk/python/feast/permissions/server/arrow.py @@ -43,7 +43,7 @@ def arrowflight_middleware() -> Optional[dict[str, fl.ServerMiddlewareFactory]]: class AuthorizationMiddlewareFactory(fl.ServerMiddlewareFactory): """ - A middleware factory to intercept the authorizatino header and propagate it to the authorization middleware. + A middleware factory to intercept the authorization header and propagate it to the authorization middleware. """ def __init__(self): From f8a714077f2c2ebdbf1d3552fe7237fd92ec6536 Mon Sep 17 00:00:00 2001 From: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Date: Wed, 10 Jul 2024 09:21:49 +0200 Subject: [PATCH 049/169] fixed broken IT Signed-off-by: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Signed-off-by: Abdul Hameed --- sdk/python/feast/permissions/server/rest.py | 1 + 1 file changed, 1 insertion(+) diff --git a/sdk/python/feast/permissions/server/rest.py b/sdk/python/feast/permissions/server/rest.py index 1fa4eecba3..ecced3b34a 100644 --- a/sdk/python/feast/permissions/server/rest.py +++ b/sdk/python/feast/permissions/server/rest.py @@ -18,6 +18,7 @@ async def inject_user_details(request: Request) -> Any: current security manager, if any. """ sm = get_security_manager() + current_user = None if sm is not None: auth_manager = get_auth_manager() access_token = auth_manager.token_extractor.extract_access_token( From 95eca1097d1b7f14db3e4248464b4f13fc969015 Mon Sep 17 00:00:00 2001 From: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Date: Wed, 10 Jul 2024 14:28:03 +0200 Subject: [PATCH 050/169] Adding registry server (UT to be completed) Signed-off-by: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Signed-off-by: Abdul Hameed --- .../auth/kubernetes_token_parser.py | 4 + .../permissions/auth/oidc_token_parser.py | 7 +- sdk/python/feast/permissions/server/grpc.py | 47 ++++++ .../server/grpc_token_extractor.py | 36 ++++ sdk/python/feast/permissions/server/utils.py | 60 ++++--- sdk/python/feast/registry_server.py | 19 ++- .../permissions/auth/test_token_extractor.py | 42 +++++ .../permissions/auth/test_token_parser.py | 156 ++++++++++++++++++ .../unit/permissions/server/test_utils.py | 15 ++ 9 files changed, 360 insertions(+), 26 deletions(-) create mode 100644 sdk/python/feast/permissions/server/grpc.py create mode 100644 sdk/python/feast/permissions/server/grpc_token_extractor.py create mode 100644 sdk/python/tests/unit/permissions/auth/test_token_parser.py create mode 100644 sdk/python/tests/unit/permissions/server/test_utils.py diff --git a/sdk/python/feast/permissions/auth/kubernetes_token_parser.py b/sdk/python/feast/permissions/auth/kubernetes_token_parser.py index 421a17f020..c16e5232fb 100644 --- a/sdk/python/feast/permissions/auth/kubernetes_token_parser.py +++ b/sdk/python/feast/permissions/auth/kubernetes_token_parser.py @@ -95,6 +95,10 @@ def _decode_token(access_token: str) -> tuple[str, str]: decoded_token = jwt.decode(access_token, options={"verify_signature": False}) if "sub" in decoded_token: subject: str = decoded_token["sub"] + if len(subject.split(":")) != 4: + raise AuthenticationError( + f"Expecting 4 elements separated by : in th subject section, instead of {len(subject.split(':'))}." + ) _, _, sa_namespace, sa_name = subject.split(":") return (sa_namespace, sa_name) else: diff --git a/sdk/python/feast/permissions/auth/oidc_token_parser.py b/sdk/python/feast/permissions/auth/oidc_token_parser.py index b8928d54c1..d389871801 100644 --- a/sdk/python/feast/permissions/auth/oidc_token_parser.py +++ b/sdk/python/feast/permissions/auth/oidc_token_parser.py @@ -64,8 +64,11 @@ async def user_details_from_access_token(self, access_token: str) -> User: AuthenticationError if any error happens. """ - await self._validate_token(access_token) - logger.info("Validated token") + try: + await self._validate_token(access_token) + logger.info("Validated token") + except Exception as e: + raise AuthenticationError(f"Invalid token: {e}") url = f"{self._OIDC_SERVER_URL}/realms/{self._REALM}/protocol/openid-connect/certs" optional_custom_headers = {"User-agent": "custom-user-agent"} diff --git a/sdk/python/feast/permissions/server/grpc.py b/sdk/python/feast/permissions/server/grpc.py new file mode 100644 index 0000000000..24eb755700 --- /dev/null +++ b/sdk/python/feast/permissions/server/grpc.py @@ -0,0 +1,47 @@ +import asyncio +import logging +from typing import Optional + +import grpc + +from feast.permissions.auth.auth_manager import ( + get_auth_manager, +) +from feast.permissions.server.utils import ( + AuthManagerType, + auth_manager_type_from_env, +) + +logger = logging.getLogger(__name__) +logger.setLevel(logging.INFO) + + +def grpc_interceptors() -> Optional[list[grpc.ServerInterceptor]]: + """ + A list of the authorization interceptors. + + Returns: + list[grpc.ServerInterceptor]: Optional list of interceptors. If the authorization type is set to `NONE`, it returns `None`. + """ + # TODO RBAC remove and use the auth section of the feature store config instead + auth_manager_type = auth_manager_type_from_env() + if auth_manager_type == AuthManagerType.NONE: + return None + + return [AuthInterceptor()] + + +class AuthInterceptor(grpc.ServerInterceptor): + def intercept_service(self, continuation, handler_call_details): + auth_manager = get_auth_manager() + access_token = auth_manager.token_extractor.extract_access_token( + metadata=dict(handler_call_details.invocation_metadata) + ) + + print(f"Fetching user for token: {len(access_token)}") + current_user = asyncio.run( + auth_manager.token_parser.user_details_from_access_token(access_token) + ) + print(f"User is: {current_user}") + + return continuation(handler_call_details) diff --git a/sdk/python/feast/permissions/server/grpc_token_extractor.py b/sdk/python/feast/permissions/server/grpc_token_extractor.py new file mode 100644 index 0000000000..d75a18ded5 --- /dev/null +++ b/sdk/python/feast/permissions/server/grpc_token_extractor.py @@ -0,0 +1,36 @@ +from starlette.authentication import ( + AuthenticationError, +) + +from feast.permissions.auth.token_extractor import TokenExtractor + + +class GrpcTokenExtractor(TokenExtractor): + def extract_access_token(self, **kwargs) -> str: + """ + Token extractor for grpc server requests. + + Requires a keyword argument called `metadata` of type `dict`. + + Returns: + The extracted access token. + """ + + if "metadata" not in kwargs: + raise ValueError("Missing keywork argument 'metadata'") + if not isinstance(kwargs["metadata"], dict): + raise ValueError( + f"The keywork argument 'metadata' is not of the expected type {dict.__name__} but {type(kwargs['metadata'])}" + ) + + access_token = None + metadata = kwargs["metadata"] + if isinstance(metadata, dict): + for header in metadata: + if header.lower() == "authorization": + return self._extract_bearer_token(metadata[header]) + + if access_token is None: + raise AuthenticationError("Missing authorization header") + + return access_token diff --git a/sdk/python/feast/permissions/server/utils.py b/sdk/python/feast/permissions/server/utils.py index c89b85e5ca..ddf6ffa5dc 100644 --- a/sdk/python/feast/permissions/server/utils.py +++ b/sdk/python/feast/permissions/server/utils.py @@ -24,6 +24,7 @@ from feast.permissions.server.arrow_flight_token_extractor import ( ArrowFlightTokenExtractor, ) +from feast.permissions.server.grpc_token_extractor import GrpcTokenExtractor from feast.permissions.server.rest_token_extractor import RestTokenExtractor logger = logging.getLogger(__name__) @@ -45,11 +46,22 @@ class AuthManagerType(enum.Enum): Identify the type of authorization manager. """ - NONE = "none" + NONE = "no_auth" OIDC = "oidc" KUBERNETES = "kubernetes" +def str_to_auth_manager_type(value: str) -> AuthManagerType: + for t in AuthManagerType.__members__.values(): + if t.value.lower() == value.lower(): + return t + + logger.warning( + f"Requested unmanaged AuthManagerType of value {value}. Using NONE instead." + ) + return AuthManagerType.NONE + + # TODO RBAC: will remove once we can manage the auth configuration def auth_manager_type_from_env() -> AuthManagerType: type = os.getenv("AUTH_MANAGER_TYPE", "none") @@ -97,26 +109,30 @@ def init_auth_manager(server_type: ServerType, auth_manager_type: AuthManagerTyp ValueError: If any input argument has an unmanaged value. """ if auth_manager_type == AuthManagerType.NONE: - return AllowAll() - - token_extractor: TokenExtractor - token_parser: TokenParser - - if server_type == ServerType.REST: - token_extractor = RestTokenExtractor() - elif server_type == ServerType.ARROW: - token_extractor = ArrowFlightTokenExtractor() - else: - raise ValueError(f"Unmanaged server type {server_type}") - - if auth_manager_type == AuthManagerType.KUBERNETES: - token_parser = KubernetesTokenParser() - elif auth_manager_type == AuthManagerType.OIDC: - token_parser = OidcTokenParser() + set_auth_manager(AllowAll()) else: - raise ValueError(f"Unmanaged authorization manager type {auth_manager_type}") + token_extractor: TokenExtractor + token_parser: TokenParser + + if server_type == ServerType.REST: + token_extractor = RestTokenExtractor() + elif server_type == ServerType.ARROW: + token_extractor = ArrowFlightTokenExtractor() + elif server_type == ServerType.GRPC: + token_extractor = GrpcTokenExtractor() + else: + raise ValueError(f"Unmanaged server type {server_type}") + + if auth_manager_type == AuthManagerType.KUBERNETES: + token_parser = KubernetesTokenParser() + elif auth_manager_type == AuthManagerType.OIDC: + token_parser = OidcTokenParser() + else: + raise ValueError( + f"Unmanaged authorization manager type {auth_manager_type}" + ) - auth_manager = AuthManager( - token_extractor=token_extractor, token_parser=token_parser - ) - set_auth_manager(auth_manager) + auth_manager = AuthManager( + token_extractor=token_extractor, token_parser=token_parser + ) + set_auth_manager(auth_manager) diff --git a/sdk/python/feast/registry_server.py b/sdk/python/feast/registry_server.py index e7dce34d18..0db4e71139 100644 --- a/sdk/python/feast/registry_server.py +++ b/sdk/python/feast/registry_server.py @@ -17,6 +17,13 @@ from feast.permissions.action import CRUD, AuthzedAction from feast.permissions.permission import Permission from feast.permissions.security_manager import assert_permissions, permitted_resources +from feast.permissions.server.grpc import grpc_interceptors +from feast.permissions.server.utils import ( + ServerType, + init_auth_manager, + init_security_manager, + str_to_auth_manager_type, +) from feast.protos.feast.registry import RegistryServer_pb2, RegistryServer_pb2_grpc from feast.saved_dataset import SavedDataset, ValidationReference from feast.stream_feature_view import StreamFeatureView @@ -576,11 +583,19 @@ def Proto(self, request, context): def start_server(store: FeatureStore, port: int): - server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) + auth_manager_type = str_to_auth_manager_type(store.config.auth_config.type) + init_security_manager(auth_manager_type=auth_manager_type, fs=store) + init_auth_manager( + auth_manager_type=auth_manager_type, + server_type=ServerType.GRPC, + ) + + server = grpc.server( + futures.ThreadPoolExecutor(max_workers=10), interceptors=grpc_interceptors() + ) RegistryServer_pb2_grpc.add_RegistryServerServicer_to_server( RegistryServer(store.registry), server ) - # TODO init security manager server.add_insecure_port(f"[::]:{port}") server.start() server.wait_for_termination() diff --git a/sdk/python/tests/unit/permissions/auth/test_token_extractor.py b/sdk/python/tests/unit/permissions/auth/test_token_extractor.py index 4f3aa08ed7..a6fcd89e5b 100644 --- a/sdk/python/tests/unit/permissions/auth/test_token_extractor.py +++ b/sdk/python/tests/unit/permissions/auth/test_token_extractor.py @@ -10,6 +10,7 @@ from feast.permissions.server.arrow_flight_token_extractor import ( ArrowFlightTokenExtractor, ) +from feast.permissions.server.grpc_token_extractor import GrpcTokenExtractor from feast.permissions.server.rest_token_extractor import RestTokenExtractor @@ -40,6 +41,31 @@ def test_rest_token_extractor_failures(error_type, dict, header): token_extractor.extract_access_token(request=request) +@pytest.mark.parametrize( + "error_type, dict, header", + [ + (ValueError, {}, None), + (ValueError, {"other": 123}, None), + (AuthenticationError, {}, ""), + (AuthenticationError, {}, "abcd"), + (AuthenticationError, {}, "other-scheme abcd"), + ], +) +def test_grpc_token_extractor_failures(error_type, dict, header): + token_extractor = GrpcTokenExtractor() + + metadata = None + if header is not None: + metadata = {} + if metadata != "": + metadata["authorization"] = header + with pytest.raises(error_type): + if metadata is None: + token_extractor.extract_access_token(**dict) + else: + token_extractor.extract_access_token(metadata=metadata) + + def test_rest_token_extractor(): token_extractor = RestTokenExtractor() request: Request = Mock(spec=Request) @@ -56,6 +82,22 @@ def test_rest_token_extractor(): ).is_equal_to(token) +def test_grpc_token_extractor(): + token_extractor = GrpcTokenExtractor() + metadata = {} + token = "abcd" + + metadata["authorization"] = f"Bearer {token}" + assertpy.assert_that( + token_extractor.extract_access_token(metadata=metadata) + ).is_equal_to(token) + + metadata["authorization"] = f"bearer {token}" + assertpy.assert_that( + token_extractor.extract_access_token(metadata=metadata) + ).is_equal_to(token) + + @pytest.mark.parametrize( "error_type, dict, header", [ diff --git a/sdk/python/tests/unit/permissions/auth/test_token_parser.py b/sdk/python/tests/unit/permissions/auth/test_token_parser.py new file mode 100644 index 0000000000..e832ff9def --- /dev/null +++ b/sdk/python/tests/unit/permissions/auth/test_token_parser.py @@ -0,0 +1,156 @@ +# test_token_validator.py + +import asyncio +import os +from unittest.mock import MagicMock, patch + +import assertpy +import pytest +from kubernetes import client +from starlette.authentication import ( + AuthenticationError, +) + +from feast.permissions.auth.kubernetes_token_parser import KubernetesTokenParser +from feast.permissions.auth.oidc_token_parser import OidcTokenParser +from feast.permissions.user import User + +_CLIENT_ID = "test" + + +@pytest.fixture(autouse=True) +def setup(): + os.environ["OIDC_SERVER_URL"] = "http://localhost:8080" + os.environ["REALM"] = "test" + os.environ["CLIENT_ID"] = _CLIENT_ID + + +@patch( + "feast.permissions.auth.oidc_token_parser.OAuth2AuthorizationCodeBearer.__call__" +) +@patch("feast.permissions.auth.oidc_token_parser.PyJWKClient.get_signing_key_from_jwt") +@patch("feast.permissions.auth.oidc_token_parser.jwt.decode") +def test_oidc_token_validation_success(mock_jwt, mock_signing_key, mock_oauth2): + signing_key = MagicMock() + signing_key.key = "a-key" + mock_signing_key.return_value = signing_key + + user_data = { + "preferred_username": "my-name", + "resource_access": {_CLIENT_ID: {"roles": ["reader", "writer"]}}, + } + mock_jwt.return_value = user_data + + access_token = "aaa-bbb-ccc" + token_parser = OidcTokenParser() + user = asyncio.run( + token_parser.user_details_from_access_token(access_token=access_token) + ) + + assertpy.assert_that(user).is_type_of(User) + if isinstance(user, User): + assertpy.assert_that(user.username).is_equal_to("my-name") + assertpy.assert_that(user.roles.sort()).is_equal_to(["reader", "writer"].sort()) + assertpy.assert_that(user.has_matching_role(["reader"])).is_true() + assertpy.assert_that(user.has_matching_role(["writer"])).is_true() + assertpy.assert_that(user.has_matching_role(["updater"])).is_false() + + +@patch( + "feast.permissions.auth.oidc_token_parser.OAuth2AuthorizationCodeBearer.__call__" +) +def test_oidc_token_validation_failure(mock_oauth2): + mock_oauth2.side_effect = AuthenticationError("wrong token") + + access_token = "aaa-bbb-ccc" + token_parser = OidcTokenParser() + with pytest.raises(AuthenticationError): + asyncio.run( + token_parser.user_details_from_access_token(access_token=access_token) + ) + +# TODO RBAC: Move role bindings to a reusable fixture +@patch("feast.permissions.auth.kubernetes_token_parser.config.load_incluster_config") +@patch("feast.permissions.auth.kubernetes_token_parser.jwt.decode") +@patch( + "feast.permissions.auth.kubernetes_token_parser.client.RbacAuthorizationV1Api.list_namespaced_role_binding" +) +@patch( + "feast.permissions.auth.kubernetes_token_parser.client.RbacAuthorizationV1Api.list_cluster_role_binding" +) +def test_k8s_token_validation_success(mock_crb, mock_rb, mock_jwt, mock_config): + sa_name = "my-name" + namespace = "my-ns" + subject = f"system:serviceaccount:{namespace}:{sa_name}" + mock_jwt.return_value = {"sub": subject} + + roles = ["reader", "writer"] + roles_items = [] + for r in roles: + roles_items.append( + client.V1RoleBinding( + metadata=client.V1ObjectMeta(name=r, namespace=namespace), + subjects=[ + client.V1Subject( + kind="ServiceAccount", + name=sa_name, + api_group="rbac.authorization.k8s.io", + ) + ], + role_ref=client.V1RoleRef( + kind="Role", name=r, api_group="rbac.authorization.k8s.io" + ), + ) + ) + mock_rb.return_value = client.V1RoleBindingList(items=roles_items) + + croles = ["updater"] + croles_items = [] + for cr in croles: + croles_items.append( + client.V1ClusterRoleBinding( + metadata=client.V1ObjectMeta(name=r, namespace=namespace), + subjects=[ + client.V1Subject( + kind="ServiceAccount", + name=sa_name, + namespace=namespace, + api_group="rbac.authorization.k8s.io", + ) + ], + role_ref=client.V1RoleRef( + kind="Role", name=cr, api_group="rbac.authorization.k8s.io" + ), + ) + ) + mock_crb.return_value = client.V1RoleBindingList(items=croles_items) + + access_token = "aaa-bbb-ccc" + token_parser = KubernetesTokenParser() + user = asyncio.run( + token_parser.user_details_from_access_token(access_token=access_token) + ) + + assertpy.assert_that(user).is_type_of(User) + if isinstance(user, User): + assertpy.assert_that(user.username).is_equal_to(f"{namespace}:{sa_name}") + assertpy.assert_that(user.roles.sort()).is_equal_to((roles + croles).sort()) + for r in roles: + assertpy.assert_that(user.has_matching_role([r])).is_true() + for cr in croles: + assertpy.assert_that(user.has_matching_role([cr])).is_true() + assertpy.assert_that(user.has_matching_role(["foo"])).is_false() + + +@patch("feast.permissions.auth.kubernetes_token_parser.config.load_incluster_config") +@patch("feast.permissions.auth.kubernetes_token_parser.jwt.decode") +def test_k8s_token_validation_failure(mock_jwt, mock_config): + subject = "wrong-subject" + mock_jwt.return_value = {"sub": subject} + + access_token = "aaa-bbb-ccc" + token_parser = KubernetesTokenParser() + with pytest.raises(AuthenticationError): + asyncio.run( + token_parser.user_details_from_access_token(access_token=access_token) + ) diff --git a/sdk/python/tests/unit/permissions/server/test_utils.py b/sdk/python/tests/unit/permissions/server/test_utils.py new file mode 100644 index 0000000000..64dedbc16b --- /dev/null +++ b/sdk/python/tests/unit/permissions/server/test_utils.py @@ -0,0 +1,15 @@ +import assertpy +import pytest + +from feast.permissions.server.utils import AuthManagerType, str_to_auth_manager_type + + +@pytest.mark.parametrize( + "label, value", + [(t.value, t) for t in AuthManagerType] + + [(t.value.upper(), t) for t in AuthManagerType] + + [(t.value.lower(), t) for t in AuthManagerType] + + [("none", AuthManagerType.NONE)], +) +def test_str_to_auth_manager_type(label, value): + assertpy.assert_that(str_to_auth_manager_type(label)).is_equal_to(value) From 8d42fcff368ec49f5c56e71f947e59868049666d Mon Sep 17 00:00:00 2001 From: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Date: Wed, 10 Jul 2024 14:31:41 +0200 Subject: [PATCH 051/169] fix linter Signed-off-by: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Signed-off-by: Abdul Hameed --- sdk/python/tests/unit/permissions/auth/test_token_parser.py | 1 + 1 file changed, 1 insertion(+) diff --git a/sdk/python/tests/unit/permissions/auth/test_token_parser.py b/sdk/python/tests/unit/permissions/auth/test_token_parser.py index e832ff9def..ce400da182 100644 --- a/sdk/python/tests/unit/permissions/auth/test_token_parser.py +++ b/sdk/python/tests/unit/permissions/auth/test_token_parser.py @@ -69,6 +69,7 @@ def test_oidc_token_validation_failure(mock_oauth2): token_parser.user_details_from_access_token(access_token=access_token) ) + # TODO RBAC: Move role bindings to a reusable fixture @patch("feast.permissions.auth.kubernetes_token_parser.config.load_incluster_config") @patch("feast.permissions.auth.kubernetes_token_parser.jwt.decode") From ef6d21f14cbec4ec9d8e3125d78747a783c3a2a7 Mon Sep 17 00:00:00 2001 From: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Date: Wed, 10 Jul 2024 14:37:30 +0200 Subject: [PATCH 052/169] passing auth manager type from config Signed-off-by: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Signed-off-by: Abdul Hameed --- sdk/python/feast/permissions/server/grpc.py | 10 ++++++---- sdk/python/feast/registry_server.py | 3 ++- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/sdk/python/feast/permissions/server/grpc.py b/sdk/python/feast/permissions/server/grpc.py index 24eb755700..cdca7342e9 100644 --- a/sdk/python/feast/permissions/server/grpc.py +++ b/sdk/python/feast/permissions/server/grpc.py @@ -9,22 +9,24 @@ ) from feast.permissions.server.utils import ( AuthManagerType, - auth_manager_type_from_env, ) logger = logging.getLogger(__name__) logger.setLevel(logging.INFO) -def grpc_interceptors() -> Optional[list[grpc.ServerInterceptor]]: +def grpc_interceptors( + auth_manager_type: AuthManagerType, +) -> Optional[list[grpc.ServerInterceptor]]: """ A list of the authorization interceptors. + Args: + auth_manager_type: The type of authorization manager, from the feature store configuration. + Returns: list[grpc.ServerInterceptor]: Optional list of interceptors. If the authorization type is set to `NONE`, it returns `None`. """ - # TODO RBAC remove and use the auth section of the feature store config instead - auth_manager_type = auth_manager_type_from_env() if auth_manager_type == AuthManagerType.NONE: return None diff --git a/sdk/python/feast/registry_server.py b/sdk/python/feast/registry_server.py index 0db4e71139..9146bdc87e 100644 --- a/sdk/python/feast/registry_server.py +++ b/sdk/python/feast/registry_server.py @@ -591,7 +591,8 @@ def start_server(store: FeatureStore, port: int): ) server = grpc.server( - futures.ThreadPoolExecutor(max_workers=10), interceptors=grpc_interceptors() + futures.ThreadPoolExecutor(max_workers=10), + interceptors=grpc_interceptors(auth_manager_type), ) RegistryServer_pb2_grpc.add_RegistryServerServicer_to_server( RegistryServer(store.registry), server From 86a2e6b32c33ae2b07256d5d426d221dbf7b12d5 Mon Sep 17 00:00:00 2001 From: Abdul Hameed Date: Tue, 9 Jul 2024 15:30:18 -0400 Subject: [PATCH 053/169] used auth config to set auth manager type Signed-off-by: Abdul Hameed --- sdk/python/feast/feature_server.py | 3 +-- sdk/python/feast/offline_server.py | 8 ++++---- sdk/python/feast/permissions/server/arrow.py | 8 ++++---- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/sdk/python/feast/feature_server.py b/sdk/python/feast/feature_server.py index 63d6cb8e3b..b526dfadd8 100644 --- a/sdk/python/feast/feature_server.py +++ b/sdk/python/feast/feature_server.py @@ -25,7 +25,6 @@ from feast.permissions.server.rest import inject_user_details from feast.permissions.server.utils import ( ServerType, - auth_manager_type_from_env, init_auth_manager, init_security_manager, ) @@ -346,7 +345,7 @@ def start_server( monitoring_thread.start() # TODO RBAC remove and use the auth section of the feature store config instead - auth_manager_type = auth_manager_type_from_env() + auth_manager_type = store.config.auth_config.type init_security_manager(auth_manager_type=auth_manager_type, fs=store) init_auth_manager( auth_manager_type=auth_manager_type, diff --git a/sdk/python/feast/offline_server.py b/sdk/python/feast/offline_server.py index 6a538cf8e5..951c8d4b4b 100644 --- a/sdk/python/feast/offline_server.py +++ b/sdk/python/feast/offline_server.py @@ -20,7 +20,6 @@ ) from feast.permissions.server.utils import ( ServerType, - auth_manager_type_from_env, init_auth_manager, init_security_manager, ) @@ -33,7 +32,9 @@ class OfflineServer(fl.FlightServerBase): def __init__(self, store: FeatureStore, location: str, **kwargs): super(OfflineServer, self).__init__( - location, middleware=arrowflight_middleware(), **kwargs + location, + middleware=arrowflight_middleware(store.config.auth_config.type), + **kwargs, ) self._location = location # A dictionary of configured flights, e.g. API calls received and not yet served @@ -448,8 +449,7 @@ def start_server( host: str, port: int, ): - # TODO RBAC remove and use the auth section of the feature store config instead - auth_manager_type = auth_manager_type_from_env() + auth_manager_type = store.config.auth_config.type init_security_manager(auth_manager_type=auth_manager_type, fs=store) init_auth_manager( auth_manager_type=auth_manager_type, diff --git a/sdk/python/feast/permissions/server/arrow.py b/sdk/python/feast/permissions/server/arrow.py index 06312977fc..69a7a24052 100644 --- a/sdk/python/feast/permissions/server/arrow.py +++ b/sdk/python/feast/permissions/server/arrow.py @@ -15,7 +15,6 @@ from feast.permissions.security_manager import get_security_manager from feast.permissions.server.utils import ( AuthManagerType, - auth_manager_type_from_env, ) from feast.permissions.user import User @@ -23,7 +22,9 @@ logger.setLevel(logging.INFO) -def arrowflight_middleware() -> Optional[dict[str, fl.ServerMiddlewareFactory]]: +def arrowflight_middleware( + auth_manager_type: str, +) -> Optional[dict[str, fl.ServerMiddlewareFactory]]: """ A dictionary with the configured middlewares to support extracting the user details when the authorization manager is defined. The authorization middleware key is `auth`. @@ -31,8 +32,7 @@ def arrowflight_middleware() -> Optional[dict[str, fl.ServerMiddlewareFactory]]: Returns: dict[str, fl.ServerMiddlewareFactory]: Optional dictionary of middlewares. If the authorization type is set to `NONE`, it returns `None`. """ - # TODO RBAC remove and use the auth section of the feature store config instead - auth_manager_type = auth_manager_type_from_env() + if auth_manager_type == AuthManagerType.NONE: return None From 9fc6db7f6e3527d98fa807f8c6f479093b45e2b0 Mon Sep 17 00:00:00 2001 From: Abdul Hameed Date: Tue, 9 Jul 2024 16:18:42 -0400 Subject: [PATCH 054/169] inject the user details Signed-off-by: Abdul Hameed --- sdk/python/feast/feature_server.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/sdk/python/feast/feature_server.py b/sdk/python/feast/feature_server.py index b526dfadd8..f901d0e442 100644 --- a/sdk/python/feast/feature_server.py +++ b/sdk/python/feast/feature_server.py @@ -155,7 +155,7 @@ def get_online_features(body=Depends(get_body)): # Raise HTTPException to return the error message to the client raise HTTPException(status_code=500, detail=str(e)) - @app.post("/push") + @app.post("/push", dependencies=[Depends(inject_user_details)]) def push(body=Depends(get_body)): try: request = PushFeaturesRequest(**json.loads(body)) @@ -212,7 +212,7 @@ def push(body=Depends(get_body)): # Raise HTTPException to return the error message to the client raise HTTPException(status_code=500, detail=str(e)) - @app.post("/write-to-online-store") + @app.post("/write-to-online-store", dependencies=[Depends(inject_user_details)]) def write_to_online_store(body=Depends(get_body)): try: request = WriteToFeatureStoreRequest(**json.loads(body)) @@ -246,7 +246,7 @@ def write_to_online_store(body=Depends(get_body)): def health(): return Response(status_code=status.HTTP_200_OK) - @app.post("/materialize") + @app.post("/materialize", dependencies=[Depends(inject_user_details)]) def materialize(body=Depends(get_body)): try: request = MaterializeRequest(**json.loads(body)) @@ -265,7 +265,7 @@ def materialize(body=Depends(get_body)): # Raise HTTPException to return the error message to the client raise HTTPException(status_code=500, detail=str(e)) - @app.post("/materialize-incremental") + @app.post("/materialize-incremental", dependencies=[Depends(inject_user_details)]) def materialize_incremental(body=Depends(get_body)): try: request = MaterializeIncrementalRequest(**json.loads(body)) From ea9799705da2fa092fda7ad669855dafded010ab Mon Sep 17 00:00:00 2001 From: Abdul Hameed Date: Tue, 9 Jul 2024 17:12:12 -0400 Subject: [PATCH 055/169] created decorator function and applied to arrow function for injecting the user detail:wq Signed-off-by: Abdul Hameed --- sdk/python/feast/offline_server.py | 6 +++++- sdk/python/feast/permissions/server/arrow.py | 10 ++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/sdk/python/feast/offline_server.py b/sdk/python/feast/offline_server.py index 951c8d4b4b..cc6aa0795a 100644 --- a/sdk/python/feast/offline_server.py +++ b/sdk/python/feast/offline_server.py @@ -17,6 +17,7 @@ from feast.permissions.server.arrow import ( arrowflight_middleware, inject_user_details, + inject_user_details_decorator, ) from feast.permissions.server.utils import ( ServerType, @@ -57,6 +58,7 @@ def _make_flight_info(self, key: Any, descriptor: fl.FlightDescriptor): return fl.FlightInfo(schema, descriptor, endpoints, -1, -1) + @inject_user_details_decorator def get_flight_info( self, context: fl.ServerCallContext, descriptor: fl.FlightDescriptor ): @@ -65,6 +67,7 @@ def get_flight_info( return self._make_flight_info(key, descriptor) raise KeyError("Flight not found.") + @inject_user_details_decorator def list_flights(self, context: fl.ServerCallContext, criteria: bytes): for key, table in self.flights.items(): if key[1] is not None: @@ -76,6 +79,7 @@ def list_flights(self, context: fl.ServerCallContext, criteria: bytes): # Expects to receive request parameters and stores them in the flights dictionary # Indexed by the unique command + @inject_user_details_decorator def do_put( self, context: fl.ServerCallContext, @@ -172,8 +176,8 @@ def _validate_do_get_parameters(self, command: dict): # Extracts the API parameters from the flights dictionary, delegates the execution to the FeatureStore instance # and returns the stream of data + @inject_user_details_decorator def do_get(self, context: fl.ServerCallContext, ticket: fl.Ticket): - # TODO RBAC: add the same to all the authorized endpoints inject_user_details(context) key = ast.literal_eval(ticket.ticket.decode()) diff --git a/sdk/python/feast/permissions/server/arrow.py b/sdk/python/feast/permissions/server/arrow.py index 69a7a24052..3eb5419354 100644 --- a/sdk/python/feast/permissions/server/arrow.py +++ b/sdk/python/feast/permissions/server/arrow.py @@ -3,6 +3,7 @@ """ import asyncio +import functools import logging from typing import Optional, cast @@ -99,3 +100,12 @@ def inject_user_details(context: ServerCallContext): print(f"extracted user: {current_user}") sm.set_current_user(current_user) + + +def inject_user_details_decorator(func): + @functools.wraps(func) + def wrapper(self, context, *args, **kwargs): + inject_user_details(context) + return func(self, context, *args, **kwargs) + + return wrapper From 711374ab5b312b89bc608bbf11098b0b0fff05d3 Mon Sep 17 00:00:00 2001 From: Abdul Hameed Date: Wed, 10 Jul 2024 09:35:04 -0400 Subject: [PATCH 056/169] code review fixes including the unit test and integration test as suggested Signed-off-by: Abdul Hameed --- sdk/python/feast/feature_server.py | 3 ++- sdk/python/feast/offline_server.py | 24 ++++++++++++-------- sdk/python/feast/permissions/server/arrow.py | 2 +- sdk/python/feast/permissions/server/utils.py | 14 ------------ sdk/python/tests/unit/test_offline_server.py | 5 +++- 5 files changed, 21 insertions(+), 27 deletions(-) diff --git a/sdk/python/feast/feature_server.py b/sdk/python/feast/feature_server.py index f901d0e442..df62a8e013 100644 --- a/sdk/python/feast/feature_server.py +++ b/sdk/python/feast/feature_server.py @@ -27,6 +27,7 @@ ServerType, init_auth_manager, init_security_manager, + str_to_auth_manager_type, ) # Define prometheus metrics @@ -345,7 +346,7 @@ def start_server( monitoring_thread.start() # TODO RBAC remove and use the auth section of the feature store config instead - auth_manager_type = store.config.auth_config.type + auth_manager_type = str_to_auth_manager_type(store.config.auth_config.type) init_security_manager(auth_manager_type=auth_manager_type, fs=store) init_auth_manager( auth_manager_type=auth_manager_type, diff --git a/sdk/python/feast/offline_server.py b/sdk/python/feast/offline_server.py index cc6aa0795a..748237f339 100644 --- a/sdk/python/feast/offline_server.py +++ b/sdk/python/feast/offline_server.py @@ -16,13 +16,13 @@ from feast.permissions.security_manager import assert_permissions from feast.permissions.server.arrow import ( arrowflight_middleware, - inject_user_details, inject_user_details_decorator, ) from feast.permissions.server.utils import ( ServerType, init_auth_manager, init_security_manager, + str_to_auth_manager_type, ) from feast.saved_dataset import SavedDatasetStorage @@ -34,7 +34,9 @@ class OfflineServer(fl.FlightServerBase): def __init__(self, store: FeatureStore, location: str, **kwargs): super(OfflineServer, self).__init__( location, - middleware=arrowflight_middleware(store.config.auth_config.type), + middleware=arrowflight_middleware( + str_to_auth_manager_type(store.config.auth_config.type) + ), **kwargs, ) self._location = location @@ -178,8 +180,6 @@ def _validate_do_get_parameters(self, command: dict): # and returns the stream of data @inject_user_details_decorator def do_get(self, context: fl.ServerCallContext, ticket: fl.Ticket): - inject_user_details(context) - key = ast.literal_eval(ticket.ticket.decode()) if key not in self.flights: logger.error(f"Unknown key {key}") @@ -448,18 +448,22 @@ def remove_dummies(fv: FeatureView) -> FeatureView: return fv -def start_server( - store: FeatureStore, - host: str, - port: int, -): - auth_manager_type = store.config.auth_config.type +def _init_auth_manager(store: FeatureStore): + auth_manager_type = str_to_auth_manager_type(store.config.auth_config.type) init_security_manager(auth_manager_type=auth_manager_type, fs=store) init_auth_manager( auth_manager_type=auth_manager_type, server_type=ServerType.ARROW, ) + +def start_server( + store: FeatureStore, + host: str, + port: int, +): + _init_auth_manager(store) + location = "grpc+tcp://{}:{}".format(host, port) server = OfflineServer(store, location) logger.info(f"Offline store server serving on {location}") diff --git a/sdk/python/feast/permissions/server/arrow.py b/sdk/python/feast/permissions/server/arrow.py index 3eb5419354..47594bdaf9 100644 --- a/sdk/python/feast/permissions/server/arrow.py +++ b/sdk/python/feast/permissions/server/arrow.py @@ -24,7 +24,7 @@ def arrowflight_middleware( - auth_manager_type: str, + auth_manager_type: AuthManagerType, ) -> Optional[dict[str, fl.ServerMiddlewareFactory]]: """ A dictionary with the configured middlewares to support extracting the user details when the authorization manager is defined. diff --git a/sdk/python/feast/permissions/server/utils.py b/sdk/python/feast/permissions/server/utils.py index ddf6ffa5dc..b4c0340426 100644 --- a/sdk/python/feast/permissions/server/utils.py +++ b/sdk/python/feast/permissions/server/utils.py @@ -4,7 +4,6 @@ import enum import logging -import os import feast from feast.permissions.auth.auth_manager import ( @@ -62,19 +61,6 @@ def str_to_auth_manager_type(value: str) -> AuthManagerType: return AuthManagerType.NONE -# TODO RBAC: will remove once we can manage the auth configuration -def auth_manager_type_from_env() -> AuthManagerType: - type = os.getenv("AUTH_MANAGER_TYPE", "none") - print(f"Configuring authentication manager for {type}") - - if type.lower() == AuthManagerType.OIDC.value: - return AuthManagerType.OIDC - if type.lower() == AuthManagerType.KUBERNETES.value: - return AuthManagerType.KUBERNETES - - return AuthManagerType.NONE - - def init_security_manager(auth_manager_type: AuthManagerType, fs: "feast.FeatureStore"): """ Initialize the global security manager. diff --git a/sdk/python/tests/unit/test_offline_server.py b/sdk/python/tests/unit/test_offline_server.py index 5991e7450d..237e2ecad4 100644 --- a/sdk/python/tests/unit/test_offline_server.py +++ b/sdk/python/tests/unit/test_offline_server.py @@ -14,7 +14,7 @@ RemoteOfflineStore, RemoteOfflineStoreConfig, ) -from feast.offline_server import OfflineServer +from feast.offline_server import OfflineServer, _init_auth_manager from feast.repo_config import RepoConfig from tests.utils.cli_repo_creator import CliRunner @@ -26,6 +26,7 @@ def empty_offline_server(environment): store = environment.feature_store location = "grpc+tcp://localhost:0" + _init_auth_manager(store=store) return OfflineServer(store=store, location=location) @@ -102,6 +103,8 @@ def test_remote_offline_store_apis(): with tempfile.TemporaryDirectory() as temp_dir: store = default_store(str(temp_dir)) location = "grpc+tcp://localhost:0" + + _init_auth_manager(store=store) server = OfflineServer(store=store, location=location) assertpy.assert_that(server).is_not_none From 6899f41d2f226a44a49a3375f4aff5e09a7c52d9 Mon Sep 17 00:00:00 2001 From: lokeshrangineni Date: Wed, 10 Jul 2024 12:39:41 -0400 Subject: [PATCH 057/169] Implementation of oidc client authentication. (#40) * Adding initial draft code to manage the oidc client authentication. Signed-off-by: Lokesh Rangineni * Adding initial draft code to manage the oidc client authentication. Signed-off-by: Lokesh Rangineni * Incorporating code review comments. Signed-off-by: Lokesh Rangineni --------- Signed-off-by: Lokesh Rangineni Signed-off-by: Abdul Hameed --- .../feast/infra/online_stores/remote.py | 6 ++- sdk/python/feast/permissions/auth_model.py | 9 ++-- .../permissions/client/auth_client_manager.py | 8 +++ .../client/http_auth_requests_wrapper.py | 43 +++++++++++++++ .../client/kubernetes_auth_client_manager.py | 11 ++++ .../oidc_authentication_client_manager.py | 52 +++++++++++++++++++ sdk/python/feast/repo_config.py | 2 +- .../infra/scaffolding/test_repo_config.py | 15 +++++- 8 files changed, 137 insertions(+), 9 deletions(-) create mode 100644 sdk/python/feast/permissions/client/auth_client_manager.py create mode 100644 sdk/python/feast/permissions/client/http_auth_requests_wrapper.py create mode 100644 sdk/python/feast/permissions/client/kubernetes_auth_client_manager.py create mode 100644 sdk/python/feast/permissions/client/oidc_authentication_client_manager.py diff --git a/sdk/python/feast/infra/online_stores/remote.py b/sdk/python/feast/infra/online_stores/remote.py index 19e1b7d515..93fbcaf771 100644 --- a/sdk/python/feast/infra/online_stores/remote.py +++ b/sdk/python/feast/infra/online_stores/remote.py @@ -16,11 +16,13 @@ from datetime import datetime from typing import Any, Callable, Dict, List, Literal, Optional, Sequence, Tuple -import requests from pydantic import StrictStr from feast import Entity, FeatureView, RepoConfig from feast.infra.online_stores.online_store import OnlineStore +from feast.permissions.client.http_auth_requests_wrapper import ( + get_http_auth_requests_session, +) from feast.protos.feast.types.EntityKey_pb2 import EntityKey as EntityKeyProto from feast.protos.feast.types.Value_pb2 import Value as ValueProto from feast.repo_config import FeastConfigBaseModel @@ -70,7 +72,7 @@ def online_read( req_body = self._construct_online_read_api_json_request( entity_keys, table, requested_features ) - response = requests.post( + response = get_http_auth_requests_session(config.auth_config).post( f"{config.online_store.path}/get-online-features", data=req_body ) if response.status_code == 200: diff --git a/sdk/python/feast/permissions/auth_model.py b/sdk/python/feast/permissions/auth_model.py index 860b4d1f89..afb0a22bc9 100644 --- a/sdk/python/feast/permissions/auth_model.py +++ b/sdk/python/feast/permissions/auth_model.py @@ -1,4 +1,4 @@ -from typing import Literal +from typing import Literal, Optional from feast.repo_config import FeastConfigBaseModel @@ -8,9 +8,10 @@ class AuthConfig(FeastConfigBaseModel): class OidcAuthConfig(AuthConfig): - auth_server_url: str + auth_server_url: Optional[str] = None + auth_discovery_url: str client_id: str - client_secret: str + client_secret: Optional[str] = None username: str password: str realm: str = "master" @@ -20,5 +21,5 @@ class NoAuthConfig(AuthConfig): pass -class K8AuthConfig(AuthConfig): +class KubernetesAuthConfig(AuthConfig): pass diff --git a/sdk/python/feast/permissions/client/auth_client_manager.py b/sdk/python/feast/permissions/client/auth_client_manager.py new file mode 100644 index 0000000000..82f9b7433e --- /dev/null +++ b/sdk/python/feast/permissions/client/auth_client_manager.py @@ -0,0 +1,8 @@ +from abc import ABC, abstractmethod + + +class AuthenticationClientManager(ABC): + @abstractmethod + def get_token(self) -> str: + """Retrieves the token based on the authentication type configuration""" + pass diff --git a/sdk/python/feast/permissions/client/http_auth_requests_wrapper.py b/sdk/python/feast/permissions/client/http_auth_requests_wrapper.py new file mode 100644 index 0000000000..25b52ff5a5 --- /dev/null +++ b/sdk/python/feast/permissions/client/http_auth_requests_wrapper.py @@ -0,0 +1,43 @@ +import requests +from requests import Session + +from feast.permissions.auth_model import ( + AuthConfig, + KubernetesAuthConfig, + OidcAuthConfig, +) +from feast.permissions.client.kubernetes_auth_client_manager import ( + KubernetesAuthClientManager, +) +from feast.permissions.client.oidc_authentication_client_manager import ( + OidcAuthClientManager, +) + + +class AuthenticatedRequestsSession(Session): + def __init__(self, auth_token: str): + super().__init__() + self.auth_token = auth_token + self.headers.update({"Authorization": f"Bearer {self.auth_token}"}) + + +def get_auth_client_manager(auth_config: AuthConfig): + if auth_config.type == "oidc": + assert isinstance(auth_config, OidcAuthConfig) + return OidcAuthClientManager(auth_config) + elif auth_config.type == "kubernetes": + assert isinstance(auth_config, KubernetesAuthConfig) + return KubernetesAuthClientManager(auth_config) + else: + raise RuntimeError( + f"No Auth client manager implemented for the auth type:${auth_config.type}" + ) + + +def get_http_auth_requests_session(auth_config: AuthConfig) -> Session: + if auth_config.type == "no_auth": + request_session = requests.session() + else: + auth_client_manager = get_auth_client_manager(auth_config) + request_session = AuthenticatedRequestsSession(auth_client_manager.get_token()) + return request_session diff --git a/sdk/python/feast/permissions/client/kubernetes_auth_client_manager.py b/sdk/python/feast/permissions/client/kubernetes_auth_client_manager.py new file mode 100644 index 0000000000..ef74fba3a9 --- /dev/null +++ b/sdk/python/feast/permissions/client/kubernetes_auth_client_manager.py @@ -0,0 +1,11 @@ +from feast.permissions.auth_model import KubernetesAuthConfig +from feast.permissions.client.auth_client_manager import AuthenticationClientManager + + +class KubernetesAuthClientManager(AuthenticationClientManager): + def __init__(self, auth_config: KubernetesAuthConfig): + self.auth_config = auth_config + + # TODO: needs to implement this for k8 auth. + def get_token(self): + return "" diff --git a/sdk/python/feast/permissions/client/oidc_authentication_client_manager.py b/sdk/python/feast/permissions/client/oidc_authentication_client_manager.py new file mode 100644 index 0000000000..a16edd6ebd --- /dev/null +++ b/sdk/python/feast/permissions/client/oidc_authentication_client_manager.py @@ -0,0 +1,52 @@ +import logging + +import requests + +from feast.permissions.auth_model import OidcAuthConfig +from feast.permissions.client.auth_client_manager import AuthenticationClientManager + +logger = logging.getLogger(__name__) + + +class OidcAuthClientManager(AuthenticationClientManager): + def __init__(self, auth_config: OidcAuthConfig): + self.auth_config = auth_config + + def _get_token_endpoint(self): + response = requests.get(self.auth_config.auth_discovery_url) + if response.status_code == 200: + oidc_config = response.json() + if not oidc_config["token_endpoint"]: + raise RuntimeError( + " OIDC token_endpoint is not available from discovery url response." + ) + return oidc_config["token_endpoint"] + else: + raise RuntimeError( + f"Error fetching OIDC token endpoint configuration: {response.status_code} - {response.text}" + ) + + def get_token(self): + # Fetch the token endpoint from the discovery URL + token_endpoint = self._get_token_endpoint() + + token_request_body = { + "grant_type": "password", + "client_id": self.auth_config.client_id, + "username": self.auth_config.username, + "password": self.auth_config.password, + } + + token_response = requests.post(token_endpoint, data=token_request_body) + if token_response.status_code == 200: + access_token = token_response.json()["access_token"] + if not access_token: + logger.debug( + f"access_token is empty for the client_id=${self.auth_config.client_id}" + ) + raise RuntimeError("access token is empty") + return access_token + else: + raise RuntimeError( + "Failed to obtain access token: {token_response.status_code} - {token_response.text}" + ) diff --git a/sdk/python/feast/repo_config.py b/sdk/python/feast/repo_config.py index 4f09b97169..c5f6c93c6c 100644 --- a/sdk/python/feast/repo_config.py +++ b/sdk/python/feast/repo_config.py @@ -89,7 +89,7 @@ AUTH_CONFIGS_CLASS_FOR_TYPE = { "no_auth": "feast.permissions.auth_model.NoAuthConfig", - "kubernetes": "feast.permissions.auth_model.K8AuthConfig", + "kubernetes": "feast.permissions.auth_model.KubernetesAuthConfig", "oidc": "feast.permissions.auth_model.OidcAuthConfig", } diff --git a/sdk/python/tests/unit/infra/scaffolding/test_repo_config.py b/sdk/python/tests/unit/infra/scaffolding/test_repo_config.py index cc4a77662f..76ad85ca7c 100644 --- a/sdk/python/tests/unit/infra/scaffolding/test_repo_config.py +++ b/sdk/python/tests/unit/infra/scaffolding/test_repo_config.py @@ -4,7 +4,11 @@ from typing import Optional from feast.infra.online_stores.sqlite import SqliteOnlineStoreConfig -from feast.permissions.auth_model import K8AuthConfig, NoAuthConfig, OidcAuthConfig +from feast.permissions.auth_model import ( + KubernetesAuthConfig, + NoAuthConfig, + OidcAuthConfig, +) from feast.repo_config import FeastConfigError, load_repo_config @@ -210,6 +214,7 @@ def test_auth_config(): password: test_password realm: master auth_server_url: http://localhost:8712 + auth_discovery_url: http://localhost:8080/realms/master/.well-known/openid-configuration registry: "registry.db" provider: local online_store: @@ -232,6 +237,7 @@ def test_auth_config(): password: test_password realm: master auth_server_url: http://localhost:8712 + auth_discovery_url: http://localhost:8080/realms/master/.well-known/openid-configuration registry: "registry.db" provider: local online_store: @@ -254,6 +260,7 @@ def test_auth_config(): password: test_password realm: master auth_server_url: http://localhost:8712 + auth_discovery_url: http://localhost:8080/realms/master/.well-known/openid-configuration registry: "registry.db" provider: local online_store: @@ -271,6 +278,10 @@ def test_auth_config(): assert oidc_repo_config.auth_config.password == "test_password" assert oidc_repo_config.auth_config.realm == "master" assert oidc_repo_config.auth_config.auth_server_url == "http://localhost:8712" + assert ( + oidc_repo_config.auth_config.auth_discovery_url + == "http://localhost:8080/realms/master/.well-known/openid-configuration" + ) no_auth_repo_config = _test_config( dedent( @@ -304,4 +315,4 @@ def test_auth_config(): expect_error=None, ) assert k8_repo_config.auth.get("type") == "kubernetes" - assert isinstance(k8_repo_config.auth_config, K8AuthConfig) + assert isinstance(k8_repo_config.auth_config, KubernetesAuthConfig) From 7b6561ef110286d967aa4873a82bba594eaa7d4d Mon Sep 17 00:00:00 2001 From: Theodor Mihalache Date: Wed, 10 Jul 2024 16:53:18 -0400 Subject: [PATCH 058/169] Client module-grpc - Added authentication header for client grpc calls Signed-off-by: Theodor Mihalache Signed-off-by: Abdul Hameed --- sdk/python/feast/feature_store.py | 16 ++++++++-- sdk/python/feast/infra/registry/registry.py | 8 +++-- sdk/python/feast/infra/registry/remote.py | 12 +++++++- .../permissions/client/auth_client_manager.py | 29 ++++++++++++++++++ .../client/kubernetes_auth_client_manager.py | 11 +++++-- sdk/python/feast/repo_operations.py | 7 ++++- .../registration/test_universal_registry.py | 30 +++++++++++++------ 7 files changed, 95 insertions(+), 18 deletions(-) diff --git a/sdk/python/feast/feature_store.py b/sdk/python/feast/feature_store.py index e20a1af4d6..df38b65fb6 100644 --- a/sdk/python/feast/feature_store.py +++ b/sdk/python/feast/feature_store.py @@ -158,9 +158,16 @@ def __init__( elif registry_config and registry_config.registry_type == "remote": from feast.infra.registry.remote import RemoteRegistry - self._registry = RemoteRegistry(registry_config, self.config.project, None) + self._registry = RemoteRegistry( + registry_config, self.config.project, None, self.config.auth + ) else: - r = Registry(self.config.project, registry_config, repo_path=self.repo_path) + r = Registry( + self.config.project, + registry_config, + repo_path=self.repo_path, + auth_config=self.config.auth_config, + ) r._initialize_registry(self.config.project) self._registry = r @@ -200,7 +207,10 @@ def refresh_registry(self): """ registry_config = self.config.registry registry = Registry( - self.config.project, registry_config, repo_path=self.repo_path + self.config.project, + registry_config, + repo_path=self.repo_path, + auth_config=self.config.auth_config, ) registry.refresh(self.config.project) diff --git a/sdk/python/feast/infra/registry/registry.py b/sdk/python/feast/infra/registry/registry.py index dfd0ed94e3..3c4a4726b7 100644 --- a/sdk/python/feast/infra/registry/registry.py +++ b/sdk/python/feast/infra/registry/registry.py @@ -42,6 +42,7 @@ from feast.infra.registry.base_registry import BaseRegistry from feast.infra.registry.registry_store import NoopRegistryStore from feast.on_demand_feature_view import OnDemandFeatureView +from feast.permissions.auth_model import AuthConfig from feast.permissions.permission import Permission from feast.project_metadata import ProjectMetadata from feast.protos.feast.core.Registry_pb2 import Registry as RegistryProto @@ -165,6 +166,7 @@ def __new__( project: str, registry_config: Optional[RegistryConfig], repo_path: Optional[Path], + auth_config: AuthConfig, ): # We override __new__ so that we can inspect registry_config and create a SqlRegistry without callers # needing to make any changes. @@ -179,7 +181,7 @@ def __new__( elif registry_config and registry_config.registry_type == "remote": from feast.infra.registry.remote import RemoteRegistry - return RemoteRegistry(registry_config, project, repo_path) + return RemoteRegistry(registry_config, project, repo_path, auth_config) else: return super(Registry, cls).__new__(cls) @@ -188,6 +190,7 @@ def __init__( project: str, registry_config: Optional[RegistryConfig], repo_path: Optional[Path], + auth_config: AuthConfig, ): """ Create the Registry object. @@ -199,6 +202,7 @@ def __init__( """ self._refresh_lock = Lock() + self._auth_config = auth_config if registry_config: registry_store_type = registry_config.registry_store_type @@ -216,7 +220,7 @@ def __init__( ) def clone(self) -> "Registry": - new_registry = Registry("project", None, None) + new_registry = Registry("project", None, None, self._auth_config) new_registry.cached_registry_proto_ttl = timedelta(seconds=0) new_registry.cached_registry_proto = ( self.cached_registry_proto.__deepcopy__() diff --git a/sdk/python/feast/infra/registry/remote.py b/sdk/python/feast/infra/registry/remote.py index 0e46b6dde6..473c01e219 100644 --- a/sdk/python/feast/infra/registry/remote.py +++ b/sdk/python/feast/infra/registry/remote.py @@ -15,6 +15,8 @@ from feast.infra.infra_object import Infra from feast.infra.registry.base_registry import BaseRegistry from feast.on_demand_feature_view import OnDemandFeatureView +from feast.permissions.auth_model import AuthConfig +from feast.permissions.client.auth_client_manager import get_auth_client_manager from feast.permissions.permission import Permission from feast.project_metadata import ProjectMetadata from feast.protos.feast.core.Registry_pb2 import Registry as RegistryProto @@ -39,8 +41,16 @@ def __init__( registry_config: Union[RegistryConfig, RemoteRegistryConfig], project: str, repo_path: Optional[Path], + auth_config: AuthConfig, ): - self.channel = grpc.insecure_channel(registry_config.path) + if auth_config.type in ["oidc", "kubernetes"]: + auth_client_manager = get_auth_client_manager(auth_config) + token = auth_client_manager.get_token() + cred = grpc.access_token_call_credentials(token) + caller_cred = grpc.CallCredentials(cred) + self.channel = grpc.secure_channel(registry_config.path, caller_cred) + else: + self.channel = grpc.insecure_channel(registry_config.path) self.stub = RegistryServer_pb2_grpc.RegistryServerStub(self.channel) def apply_entity(self, entity: Entity, project: str, commit: bool = True): diff --git a/sdk/python/feast/permissions/client/auth_client_manager.py b/sdk/python/feast/permissions/client/auth_client_manager.py index 82f9b7433e..7f29482c16 100644 --- a/sdk/python/feast/permissions/client/auth_client_manager.py +++ b/sdk/python/feast/permissions/client/auth_client_manager.py @@ -1,8 +1,37 @@ from abc import ABC, abstractmethod +from feast.permissions.auth_model import ( + AuthConfig, + KubernetesAuthConfig, + OidcAuthConfig, +) + class AuthenticationClientManager(ABC): @abstractmethod def get_token(self) -> str: """Retrieves the token based on the authentication type configuration""" pass + + +def get_auth_client_manager(auth_config: AuthConfig) -> AuthenticationClientManager: + if auth_config.type == "oidc": + assert isinstance(auth_config, OidcAuthConfig) + + from feast.permissions.client.oidc_authentication_client_manager import ( + OidcAuthClientManager, + ) + + return OidcAuthClientManager(auth_config) + elif auth_config.type == "kubernetes": + assert isinstance(auth_config, KubernetesAuthConfig) + + from feast.permissions.client.kubernetes_auth_client_manager import ( + KubernetesAuthClientManager, + ) + + return KubernetesAuthClientManager(auth_config) + else: + raise RuntimeError( + f"No Auth client manager implemented for the auth type:${auth_config.type}" + ) diff --git a/sdk/python/feast/permissions/client/kubernetes_auth_client_manager.py b/sdk/python/feast/permissions/client/kubernetes_auth_client_manager.py index ef74fba3a9..b871769558 100644 --- a/sdk/python/feast/permissions/client/kubernetes_auth_client_manager.py +++ b/sdk/python/feast/permissions/client/kubernetes_auth_client_manager.py @@ -6,6 +6,13 @@ class KubernetesAuthClientManager(AuthenticationClientManager): def __init__(self, auth_config: KubernetesAuthConfig): self.auth_config = auth_config - # TODO: needs to implement this for k8 auth. def get_token(self): - return "" + try: + with open( + "/var/run/secrets/kubernetes.io/serviceaccount/token", "r" + ) as file: + token = file.read().strip() + return token + except Exception as e: + print(f"Error reading token: {e}") + raise e diff --git a/sdk/python/feast/repo_operations.py b/sdk/python/feast/repo_operations.py index 50f9a9ccc0..cb27568957 100644 --- a/sdk/python/feast/repo_operations.py +++ b/sdk/python/feast/repo_operations.py @@ -373,7 +373,12 @@ def registry_dump(repo_config: RepoConfig, repo_path: Path) -> str: """For debugging only: output contents of the metadata registry""" registry_config = repo_config.registry project = repo_config.project - registry = Registry(project, registry_config=registry_config, repo_path=repo_path) + registry = Registry( + project, + registry_config=registry_config, + repo_path=repo_path, + auth_config=repo_config.auth_config, + ) registry_dict = registry.to_dict(project=project) return json.dumps(registry_dict, indent=2, sort_keys=True) diff --git a/sdk/python/tests/integration/registration/test_universal_registry.py b/sdk/python/tests/integration/registration/test_universal_registry.py index c5e69dc60a..deb910a50f 100644 --- a/sdk/python/tests/integration/registration/test_universal_registry.py +++ b/sdk/python/tests/integration/registration/test_universal_registry.py @@ -42,6 +42,7 @@ from feast.infra.registry.sql import SqlRegistry from feast.on_demand_feature_view import on_demand_feature_view from feast.permissions.action import AuthzedAction +from feast.permissions.auth_model import NoAuthConfig from feast.permissions.permission import Permission from feast.permissions.policy import RoleBasedPolicy from feast.protos.feast.registry import RegistryServer_pb2, RegistryServer_pb2_grpc @@ -58,7 +59,7 @@ def local_registry() -> Registry: fd, registry_path = mkstemp() registry_config = RegistryConfig(path=registry_path, cache_ttl_seconds=600) - return Registry("project", registry_config, None) + return Registry("project", registry_config, None, auth_config=NoAuthConfig()) @pytest.fixture @@ -77,7 +78,7 @@ def gcs_registry() -> Registry: registry_config = RegistryConfig( path=f"gs://{bucket_name}/registry.db", cache_ttl_seconds=600 ) - return Registry("project", registry_config, None) + return Registry("project", registry_config, None, auth_config=NoAuthConfig()) @pytest.fixture @@ -89,7 +90,7 @@ def s3_registry() -> Registry: path=f"{aws_registry_path}/{int(time.time() * 1000)}/registry.db", cache_ttl_seconds=600, ) - return Registry("project", registry_config, None) + return Registry("project", registry_config, None, auth_config=NoAuthConfig()) @pytest.fixture(scope="session") @@ -116,7 +117,7 @@ def minio_registry() -> Registry: } with mock.patch.dict(os.environ, mock_environ): - yield Registry("project", registry_config, None) + yield Registry("project", registry_config, None, auth_config=NoAuthConfig()) container.stop() @@ -271,10 +272,15 @@ def handler(request): def mock_remote_registry(): fd, registry_path = mkstemp() registry_config = RegistryConfig(path=registry_path, cache_ttl_seconds=600) - proxied_registry = Registry("project", registry_config, None) + proxied_registry = Registry( + "project", registry_config, None, auth_config=NoAuthConfig() + ) registry = RemoteRegistry( - registry_config=RemoteRegistryConfig(path=""), project=None, repo_path=None + registry_config=RemoteRegistryConfig(path=""), + project=None, + repo_path=None, + auth_config=NoAuthConfig(), ) mock_channel = GrpcMockChannel( RegistryServer_pb2.DESCRIPTOR.services_by_name["RegistryServer"], @@ -1311,7 +1317,9 @@ def test_modify_feature_service_success(test_registry): def test_commit(): fd, registry_path = mkstemp() registry_config = RegistryConfig(path=registry_path, cache_ttl_seconds=600) - test_registry = Registry("project", registry_config, None) + test_registry = Registry( + "project", registry_config, None, auth_config=NoAuthConfig() + ) entity = Entity( name="driver_car_id", @@ -1352,7 +1360,9 @@ def test_commit(): validate_project_uuid(project_uuid, test_registry) # Create new registry that points to the same store - registry_with_same_store = Registry("project", registry_config, None) + registry_with_same_store = Registry( + "project", registry_config, None, auth_config=NoAuthConfig() + ) # Retrieving the entity should fail since the store is empty entities = registry_with_same_store.list_entities(project) @@ -1363,7 +1373,9 @@ def test_commit(): test_registry.commit() # Reconstruct the new registry in order to read the newly written store - registry_with_same_store = Registry("project", registry_config, None) + registry_with_same_store = Registry( + "project", registry_config, None, auth_config=NoAuthConfig() + ) # Retrieving the entity should now succeed entities = registry_with_same_store.list_entities(project, tags=entity.tags) From bc086efa2d8e540660355ea26961b81ad65e3959 Mon Sep 17 00:00:00 2001 From: Theodor Mihalache Date: Thu, 11 Jul 2024 14:43:24 -0400 Subject: [PATCH 059/169] Client module-grpc - Made changes following code review Signed-off-by: Theodor Mihalache Signed-off-by: Abdul Hameed --- sdk/python/feast/infra/registry/registry.py | 6 +- sdk/python/feast/infra/registry/remote.py | 250 ++++++++++++++---- .../feast/permissions/auth/auth_type.py | 11 + .../permissions/client/auth_client_manager.py | 13 +- .../client/http_auth_requests_wrapper.py | 25 +- .../client/kubernetes_auth_client_manager.py | 6 +- sdk/python/feast/permissions/server/arrow.py | 6 +- sdk/python/feast/permissions/server/grpc.py | 6 +- sdk/python/feast/permissions/server/utils.py | 29 +- sdk/python/feast/repo_config.py | 3 +- .../registration/test_universal_registry.py | 26 +- .../infra/scaffolding/test_repo_config.py | 7 +- .../unit/permissions/server/test_utils.py | 10 +- 13 files changed, 271 insertions(+), 127 deletions(-) create mode 100644 sdk/python/feast/permissions/auth/auth_type.py diff --git a/sdk/python/feast/infra/registry/registry.py b/sdk/python/feast/infra/registry/registry.py index 3c4a4726b7..fa9d436400 100644 --- a/sdk/python/feast/infra/registry/registry.py +++ b/sdk/python/feast/infra/registry/registry.py @@ -42,7 +42,7 @@ from feast.infra.registry.base_registry import BaseRegistry from feast.infra.registry.registry_store import NoopRegistryStore from feast.on_demand_feature_view import OnDemandFeatureView -from feast.permissions.auth_model import AuthConfig +from feast.permissions.auth_model import AuthConfig, NoAuthConfig from feast.permissions.permission import Permission from feast.project_metadata import ProjectMetadata from feast.protos.feast.core.Registry_pb2 import Registry as RegistryProto @@ -166,7 +166,7 @@ def __new__( project: str, registry_config: Optional[RegistryConfig], repo_path: Optional[Path], - auth_config: AuthConfig, + auth_config: AuthConfig = NoAuthConfig(), ): # We override __new__ so that we can inspect registry_config and create a SqlRegistry without callers # needing to make any changes. @@ -190,7 +190,7 @@ def __init__( project: str, registry_config: Optional[RegistryConfig], repo_path: Optional[Path], - auth_config: AuthConfig, + auth_config: AuthConfig = NoAuthConfig(), ): """ Create the Registry object. diff --git a/sdk/python/feast/infra/registry/remote.py b/sdk/python/feast/infra/registry/remote.py index 473c01e219..53ebd56d0e 100644 --- a/sdk/python/feast/infra/registry/remote.py +++ b/sdk/python/feast/infra/registry/remote.py @@ -15,8 +15,14 @@ from feast.infra.infra_object import Infra from feast.infra.registry.base_registry import BaseRegistry from feast.on_demand_feature_view import OnDemandFeatureView -from feast.permissions.auth_model import AuthConfig -from feast.permissions.client.auth_client_manager import get_auth_client_manager +from feast.permissions.auth.auth_type import AuthType +from feast.permissions.auth_model import ( + AuthConfig, + NoAuthConfig, +) +from feast.permissions.client.auth_client_manager import ( + create_metadata, +) from feast.permissions.permission import Permission from feast.project_metadata import ProjectMetadata from feast.protos.feast.core.Registry_pb2 import Registry as RegistryProto @@ -41,16 +47,10 @@ def __init__( registry_config: Union[RegistryConfig, RemoteRegistryConfig], project: str, repo_path: Optional[Path], - auth_config: AuthConfig, + auth_config: AuthConfig = NoAuthConfig(), ): - if auth_config.type in ["oidc", "kubernetes"]: - auth_client_manager = get_auth_client_manager(auth_config) - token = auth_client_manager.get_token() - cred = grpc.access_token_call_credentials(token) - caller_cred = grpc.CallCredentials(cred) - self.channel = grpc.secure_channel(registry_config.path, caller_cred) - else: - self.channel = grpc.insecure_channel(registry_config.path) + self.auth_config = auth_config + self.channel = grpc.insecure_channel(registry_config.path) self.stub = RegistryServer_pb2_grpc.RegistryServerStub(self.channel) def apply_entity(self, entity: Entity, project: str, commit: bool = True): @@ -58,21 +58,33 @@ def apply_entity(self, entity: Entity, project: str, commit: bool = True): entity=entity.to_proto(), project=project, commit=commit ) - self.stub.ApplyEntity(request) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_metadata(self.auth_config) + self.stub.ApplyEntity(request=request, metadata=metadata) + else: + self.stub.ApplyEntity(request) def delete_entity(self, name: str, project: str, commit: bool = True): request = RegistryServer_pb2.DeleteEntityRequest( name=name, project=project, commit=commit ) - self.stub.DeleteEntity(request) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_metadata(self.auth_config) + self.stub.DeleteEntity(request=request, metadata=metadata) + else: + self.stub.DeleteEntity(request) def get_entity(self, name: str, project: str, allow_cache: bool = False) -> Entity: request = RegistryServer_pb2.GetEntityRequest( name=name, project=project, allow_cache=allow_cache ) - response = self.stub.GetEntity(request) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_metadata(self.auth_config) + response = self.stub.GetEntity(request=request, metadata=metadata) + else: + response = self.stub.GetEntity(request) return Entity.from_proto(response) @@ -86,7 +98,11 @@ def list_entities( project=project, allow_cache=allow_cache, tags=tags ) - response = self.stub.ListEntities(request) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_metadata(self.auth_config) + response = self.stub.ListEntities(request=request, metadata=metadata) + else: + response = self.stub.ListEntities(request) return [Entity.from_proto(entity) for entity in response.entities] @@ -97,14 +113,22 @@ def apply_data_source( data_source=data_source.to_proto(), project=project, commit=commit ) - self.stub.ApplyDataSource(request) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_metadata(self.auth_config) + self.stub.ApplyDataSource(request=request, metadata=metadata) + else: + self.stub.ApplyDataSource(request) def delete_data_source(self, name: str, project: str, commit: bool = True): request = RegistryServer_pb2.DeleteDataSourceRequest( name=name, project=project, commit=commit ) - self.stub.DeleteDataSource(request) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_metadata(self.auth_config) + self.stub.DeleteDataSource(request=request, metadata=metadata) + else: + self.stub.DeleteDataSource(request) def get_data_source( self, name: str, project: str, allow_cache: bool = False @@ -113,7 +137,11 @@ def get_data_source( name=name, project=project, allow_cache=allow_cache ) - response = self.stub.GetDataSource(request) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_metadata(self.auth_config) + response = self.stub.GetDataSource(request=request, metadata=metadata) + else: + response = self.stub.GetDataSource(request) return DataSource.from_proto(response) @@ -127,7 +155,11 @@ def list_data_sources( project=project, allow_cache=allow_cache, tags=tags ) - response = self.stub.ListDataSources(request) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_metadata(self.auth_config) + response = self.stub.ListDataSources(request=request, metadata=metadata) + else: + response = self.stub.ListDataSources(request) return [ DataSource.from_proto(data_source) for data_source in response.data_sources @@ -140,14 +172,22 @@ def apply_feature_service( feature_service=feature_service.to_proto(), project=project, commit=commit ) - self.stub.ApplyFeatureService(request) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_metadata(self.auth_config) + self.stub.ApplyFeatureService(request=request, metadata=metadata) + else: + self.stub.ApplyFeatureService(request) def delete_feature_service(self, name: str, project: str, commit: bool = True): request = RegistryServer_pb2.DeleteFeatureServiceRequest( name=name, project=project, commit=commit ) - self.stub.DeleteFeatureService(request) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_metadata(self.auth_config) + self.stub.DeleteFeatureService(request=request, metadata=metadata) + else: + self.stub.DeleteFeatureService(request) def get_feature_service( self, name: str, project: str, allow_cache: bool = False @@ -156,7 +196,11 @@ def get_feature_service( name=name, project=project, allow_cache=allow_cache ) - response = self.stub.GetFeatureService(request) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_metadata(self.auth_config) + response = self.stub.GetFeatureService(request=request, metadata=metadata) + else: + response = self.stub.GetFeatureService(request) return FeatureService.from_proto(response) @@ -170,7 +214,11 @@ def list_feature_services( project=project, allow_cache=allow_cache, tags=tags ) - response = self.stub.ListFeatureServices(request) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_metadata(self.auth_config) + response = self.stub.ListFeatureServices(request=request, metadata=metadata) + else: + response = self.stub.ListFeatureServices(request) return [ FeatureService.from_proto(feature_service) @@ -201,14 +249,22 @@ def apply_feature_view( commit=commit, ) - self.stub.ApplyFeatureView(request) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_metadata(self.auth_config) + self.stub.ApplyFeatureView(request=request, metadata=metadata) + else: + self.stub.ApplyFeatureView(request) def delete_feature_view(self, name: str, project: str, commit: bool = True): request = RegistryServer_pb2.DeleteFeatureViewRequest( name=name, project=project, commit=commit ) - self.stub.DeleteFeatureView(request) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_metadata(self.auth_config) + self.stub.DeleteFeatureView(request=request, metadata=metadata) + else: + self.stub.DeleteFeatureView(request) def get_stream_feature_view( self, name: str, project: str, allow_cache: bool = False @@ -217,7 +273,13 @@ def get_stream_feature_view( name=name, project=project, allow_cache=allow_cache ) - response = self.stub.GetStreamFeatureView(request) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_metadata(self.auth_config) + response = self.stub.GetStreamFeatureView( + request=request, metadata=metadata + ) + else: + response = self.stub.GetStreamFeatureView(request) return StreamFeatureView.from_proto(response) @@ -231,7 +293,13 @@ def list_stream_feature_views( project=project, allow_cache=allow_cache, tags=tags ) - response = self.stub.ListStreamFeatureViews(request) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_metadata(self.auth_config) + response = self.stub.ListStreamFeatureViews( + request=request, metadata=metadata + ) + else: + response = self.stub.ListStreamFeatureViews(request) return [ StreamFeatureView.from_proto(stream_feature_view) @@ -245,7 +313,13 @@ def get_on_demand_feature_view( name=name, project=project, allow_cache=allow_cache ) - response = self.stub.GetOnDemandFeatureView(request) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_metadata(self.auth_config) + response = self.stub.GetOnDemandFeatureView( + request=request, metadata=metadata + ) + else: + response = self.stub.GetOnDemandFeatureView(request) return OnDemandFeatureView.from_proto(response) @@ -259,7 +333,13 @@ def list_on_demand_feature_views( project=project, allow_cache=allow_cache, tags=tags ) - response = self.stub.ListOnDemandFeatureViews(request) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_metadata(self.auth_config) + response = self.stub.ListOnDemandFeatureViews( + request=request, metadata=metadata + ) + else: + response = self.stub.ListOnDemandFeatureViews(request) return [ OnDemandFeatureView.from_proto(on_demand_feature_view) @@ -273,7 +353,11 @@ def get_feature_view( name=name, project=project, allow_cache=allow_cache ) - response = self.stub.GetFeatureView(request) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_metadata(self.auth_config) + response = self.stub.GetFeatureView(request=request, metadata=metadata) + else: + response = self.stub.GetFeatureView(request) return FeatureView.from_proto(response) @@ -287,7 +371,11 @@ def list_feature_views( project=project, allow_cache=allow_cache, tags=tags ) - response = self.stub.ListFeatureViews(request) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_metadata(self.auth_config) + response = self.stub.ListFeatureViews(request=request, metadata=metadata) + else: + response = self.stub.ListFeatureViews(request) return [ FeatureView.from_proto(feature_view) @@ -316,7 +404,11 @@ def apply_materialization( commit=commit, ) - self.stub.ApplyMaterialization(request) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_metadata(self.auth_config) + self.stub.ApplyMaterialization(request=request, metadata=metadata) + else: + self.stub.ApplyMaterialization(request) def apply_saved_dataset( self, @@ -328,7 +420,11 @@ def apply_saved_dataset( saved_dataset=saved_dataset.to_proto(), project=project, commit=commit ) - self.stub.ApplyFeatureService(request) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_metadata(self.auth_config) + self.stub.ApplyFeatureService(request=request, metadata=metadata) + else: + self.stub.ApplyFeatureService(request) def delete_saved_dataset(self, name: str, project: str, commit: bool = True): request = RegistryServer_pb2.DeleteSavedDatasetRequest( @@ -344,7 +440,11 @@ def get_saved_dataset( name=name, project=project, allow_cache=allow_cache ) - response = self.stub.GetSavedDataset(request) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_metadata(self.auth_config) + response = self.stub.GetSavedDataset(request=request, metadata=metadata) + else: + response = self.stub.GetSavedDataset(request) return SavedDataset.from_proto(response) @@ -358,7 +458,11 @@ def list_saved_datasets( project=project, allow_cache=allow_cache, tags=tags ) - response = self.stub.ListSavedDatasets(request) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_metadata(self.auth_config) + response = self.stub.ListSavedDatasets(request=request, metadata=metadata) + else: + response = self.stub.ListSavedDatasets(request) return [ SavedDataset.from_proto(saved_dataset) @@ -377,14 +481,22 @@ def apply_validation_reference( commit=commit, ) - self.stub.ApplyValidationReference(request) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_metadata(self.auth_config) + self.stub.ApplyValidationReference(request=request, metadata=metadata) + else: + self.stub.ApplyValidationReference(request) def delete_validation_reference(self, name: str, project: str, commit: bool = True): request = RegistryServer_pb2.DeleteValidationReferenceRequest( name=name, project=project, commit=commit ) - self.stub.DeleteValidationReference(request) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_metadata(self.auth_config) + self.stub.DeleteValidationReference(request=request, metadata=metadata) + else: + self.stub.DeleteValidationReference(request) def get_validation_reference( self, name: str, project: str, allow_cache: bool = False @@ -393,7 +505,13 @@ def get_validation_reference( name=name, project=project, allow_cache=allow_cache ) - response = self.stub.GetValidationReference(request) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_metadata(self.auth_config) + response = self.stub.GetValidationReference( + request=request, metadata=metadata + ) + else: + response = self.stub.GetValidationReference(request) return ValidationReference.from_proto(response) @@ -407,7 +525,13 @@ def list_validation_references( project=project, allow_cache=allow_cache, tags=tags ) - response = self.stub.ListValidationReferences(request) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_metadata(self.auth_config) + response = self.stub.ListValidationReferences( + request=request, metadata=metadata + ) + else: + response = self.stub.ListValidationReferences(request) return [ ValidationReference.from_proto(validation_reference) @@ -421,7 +545,11 @@ def list_project_metadata( project=project, allow_cache=allow_cache ) - response = self.stub.ListProjectMetadata(request) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_metadata(self.auth_config) + response = self.stub.ListProjectMetadata(request=request, metadata=metadata) + else: + response = self.stub.ListProjectMetadata(request) return [ProjectMetadata.from_proto(pm) for pm in response.project_metadata] @@ -430,14 +558,22 @@ def update_infra(self, infra: Infra, project: str, commit: bool = True): infra=infra.to_proto(), project=project, commit=commit ) - self.stub.UpdateInfra(request) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_metadata(self.auth_config) + self.stub.UpdateInfra(request=request, metadata=metadata) + else: + self.stub.UpdateInfra(request) def get_infra(self, project: str, allow_cache: bool = False) -> Infra: request = RegistryServer_pb2.GetInfraRequest( project=project, allow_cache=allow_cache ) - response = self.stub.GetInfra(request) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_metadata(self.auth_config) + response = self.stub.GetInfra(request=request, metadata=metadata) + else: + response = self.stub.GetInfra(request) return Infra.from_proto(response) @@ -464,14 +600,22 @@ def apply_permission( permission=permission_proto, project=project, commit=commit ) - self.stub.ApplyPermission(request) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_metadata(self.auth_config) + self.stub.ApplyPermission(request=request, metadata=metadata) + else: + self.stub.ApplyPermission(request) def delete_permission(self, name: str, project: str, commit: bool = True): request = RegistryServer_pb2.DeletePermissionRequest( name=name, project=project, commit=commit ) - self.stub.DeletePermission(request) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_metadata(self.auth_config) + self.stub.DeletePermission(request=request, metadata=metadata) + else: + self.stub.DeletePermission(request) def get_permission( self, name: str, project: str, allow_cache: bool = False @@ -480,7 +624,11 @@ def get_permission( name=name, project=project, allow_cache=allow_cache ) - response = self.stub.GetPermission(request) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_metadata(self.auth_config) + response = self.stub.GetPermission(request=request, metadata=metadata) + else: + response = self.stub.GetPermission(request) return Permission.from_proto(response) @@ -494,7 +642,11 @@ def list_permissions( project=project, allow_cache=allow_cache, tags=tags ) - response = self.stub.ListPermissions(request) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_metadata(self.auth_config) + response = self.stub.ListPermissions(request=request, metadata=metadata) + else: + response = self.stub.ListPermissions(request) return [ Permission.from_proto(permission) for permission in response.permissions @@ -509,7 +661,11 @@ def commit(self): def refresh(self, project: Optional[str] = None): request = RegistryServer_pb2.RefreshRequest(project=str(project)) - self.stub.Refresh(request) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_metadata(self.auth_config) + self.stub.Refresh(request=request, metadata=metadata) + else: + self.stub.Refresh(request) def teardown(self): pass diff --git a/sdk/python/feast/permissions/auth/auth_type.py b/sdk/python/feast/permissions/auth/auth_type.py new file mode 100644 index 0000000000..3fa34f97bd --- /dev/null +++ b/sdk/python/feast/permissions/auth/auth_type.py @@ -0,0 +1,11 @@ +import enum + + +class AuthType(enum.Enum): + """ + Identify the type of authorization. + """ + + NONE = "no_auth" + OIDC = "oidc" + KUBERNETES = "kubernetes" diff --git a/sdk/python/feast/permissions/client/auth_client_manager.py b/sdk/python/feast/permissions/client/auth_client_manager.py index 7f29482c16..2366511d24 100644 --- a/sdk/python/feast/permissions/client/auth_client_manager.py +++ b/sdk/python/feast/permissions/client/auth_client_manager.py @@ -1,5 +1,7 @@ from abc import ABC, abstractmethod +from typing import Tuple +from feast.permissions.auth.auth_type import AuthType from feast.permissions.auth_model import ( AuthConfig, KubernetesAuthConfig, @@ -15,7 +17,7 @@ def get_token(self) -> str: def get_auth_client_manager(auth_config: AuthConfig) -> AuthenticationClientManager: - if auth_config.type == "oidc": + if auth_config.type == AuthType.OIDC.value: assert isinstance(auth_config, OidcAuthConfig) from feast.permissions.client.oidc_authentication_client_manager import ( @@ -23,7 +25,7 @@ def get_auth_client_manager(auth_config: AuthConfig) -> AuthenticationClientMana ) return OidcAuthClientManager(auth_config) - elif auth_config.type == "kubernetes": + elif auth_config.type == AuthType.KUBERNETES.value: assert isinstance(auth_config, KubernetesAuthConfig) from feast.permissions.client.kubernetes_auth_client_manager import ( @@ -35,3 +37,10 @@ def get_auth_client_manager(auth_config: AuthConfig) -> AuthenticationClientMana raise RuntimeError( f"No Auth client manager implemented for the auth type:${auth_config.type}" ) + + +def create_metadata(auth_config: AuthConfig) -> Tuple[Tuple[str, str]]: + auth_client_manager = get_auth_client_manager(auth_config) + token = auth_client_manager.get_token() + + return (("authorization", "Bearer " + token),) diff --git a/sdk/python/feast/permissions/client/http_auth_requests_wrapper.py b/sdk/python/feast/permissions/client/http_auth_requests_wrapper.py index 25b52ff5a5..59ec0b6418 100644 --- a/sdk/python/feast/permissions/client/http_auth_requests_wrapper.py +++ b/sdk/python/feast/permissions/client/http_auth_requests_wrapper.py @@ -1,17 +1,11 @@ import requests from requests import Session +from feast.permissions.auth.auth_type import AuthType from feast.permissions.auth_model import ( AuthConfig, - KubernetesAuthConfig, - OidcAuthConfig, -) -from feast.permissions.client.kubernetes_auth_client_manager import ( - KubernetesAuthClientManager, -) -from feast.permissions.client.oidc_authentication_client_manager import ( - OidcAuthClientManager, ) +from feast.permissions.client.auth_client_manager import get_auth_client_manager class AuthenticatedRequestsSession(Session): @@ -21,21 +15,8 @@ def __init__(self, auth_token: str): self.headers.update({"Authorization": f"Bearer {self.auth_token}"}) -def get_auth_client_manager(auth_config: AuthConfig): - if auth_config.type == "oidc": - assert isinstance(auth_config, OidcAuthConfig) - return OidcAuthClientManager(auth_config) - elif auth_config.type == "kubernetes": - assert isinstance(auth_config, KubernetesAuthConfig) - return KubernetesAuthClientManager(auth_config) - else: - raise RuntimeError( - f"No Auth client manager implemented for the auth type:${auth_config.type}" - ) - - def get_http_auth_requests_session(auth_config: AuthConfig) -> Session: - if auth_config.type == "no_auth": + if auth_config.type == AuthType.NONE.value: request_session = requests.session() else: auth_client_manager = get_auth_client_manager(auth_config) diff --git a/sdk/python/feast/permissions/client/kubernetes_auth_client_manager.py b/sdk/python/feast/permissions/client/kubernetes_auth_client_manager.py index b871769558..03b412893d 100644 --- a/sdk/python/feast/permissions/client/kubernetes_auth_client_manager.py +++ b/sdk/python/feast/permissions/client/kubernetes_auth_client_manager.py @@ -1,6 +1,10 @@ +import logging + from feast.permissions.auth_model import KubernetesAuthConfig from feast.permissions.client.auth_client_manager import AuthenticationClientManager +logger = logging.getLogger(__name__) + class KubernetesAuthClientManager(AuthenticationClientManager): def __init__(self, auth_config: KubernetesAuthConfig): @@ -14,5 +18,5 @@ def get_token(self): token = file.read().strip() return token except Exception as e: - print(f"Error reading token: {e}") + logger.exception(f"Error reading token: {e}") raise e diff --git a/sdk/python/feast/permissions/server/arrow.py b/sdk/python/feast/permissions/server/arrow.py index 47594bdaf9..1295238556 100644 --- a/sdk/python/feast/permissions/server/arrow.py +++ b/sdk/python/feast/permissions/server/arrow.py @@ -15,7 +15,7 @@ ) from feast.permissions.security_manager import get_security_manager from feast.permissions.server.utils import ( - AuthManagerType, + AuthType, ) from feast.permissions.user import User @@ -24,7 +24,7 @@ def arrowflight_middleware( - auth_manager_type: AuthManagerType, + auth_manager_type: AuthType, ) -> Optional[dict[str, fl.ServerMiddlewareFactory]]: """ A dictionary with the configured middlewares to support extracting the user details when the authorization manager is defined. @@ -34,7 +34,7 @@ def arrowflight_middleware( dict[str, fl.ServerMiddlewareFactory]: Optional dictionary of middlewares. If the authorization type is set to `NONE`, it returns `None`. """ - if auth_manager_type == AuthManagerType.NONE: + if auth_manager_type == AuthType.NONE: return None return { diff --git a/sdk/python/feast/permissions/server/grpc.py b/sdk/python/feast/permissions/server/grpc.py index cdca7342e9..9890199dee 100644 --- a/sdk/python/feast/permissions/server/grpc.py +++ b/sdk/python/feast/permissions/server/grpc.py @@ -8,7 +8,7 @@ get_auth_manager, ) from feast.permissions.server.utils import ( - AuthManagerType, + AuthType, ) logger = logging.getLogger(__name__) @@ -16,7 +16,7 @@ def grpc_interceptors( - auth_manager_type: AuthManagerType, + auth_manager_type: AuthType, ) -> Optional[list[grpc.ServerInterceptor]]: """ A list of the authorization interceptors. @@ -27,7 +27,7 @@ def grpc_interceptors( Returns: list[grpc.ServerInterceptor]: Optional list of interceptors. If the authorization type is set to `NONE`, it returns `None`. """ - if auth_manager_type == AuthManagerType.NONE: + if auth_manager_type == AuthType.NONE: return None return [AuthInterceptor()] diff --git a/sdk/python/feast/permissions/server/utils.py b/sdk/python/feast/permissions/server/utils.py index b4c0340426..7345b08a9c 100644 --- a/sdk/python/feast/permissions/server/utils.py +++ b/sdk/python/feast/permissions/server/utils.py @@ -11,6 +11,7 @@ AuthManager, set_auth_manager, ) +from feast.permissions.auth.auth_type import AuthType from feast.permissions.auth.kubernetes_token_parser import KubernetesTokenParser from feast.permissions.auth.oidc_token_parser import OidcTokenParser from feast.permissions.auth.token_extractor import TokenExtractor @@ -40,28 +41,18 @@ class ServerType(enum.Enum): GRPC = "grpc" # TODO RBAC: to be completed -class AuthManagerType(enum.Enum): - """ - Identify the type of authorization manager. - """ - - NONE = "no_auth" - OIDC = "oidc" - KUBERNETES = "kubernetes" - - -def str_to_auth_manager_type(value: str) -> AuthManagerType: - for t in AuthManagerType.__members__.values(): +def str_to_auth_manager_type(value: str) -> AuthType: + for t in AuthType.__members__.values(): if t.value.lower() == value.lower(): return t logger.warning( f"Requested unmanaged AuthManagerType of value {value}. Using NONE instead." ) - return AuthManagerType.NONE + return AuthType.NONE -def init_security_manager(auth_manager_type: AuthManagerType, fs: "feast.FeatureStore"): +def init_security_manager(auth_manager_type: AuthType, fs: "feast.FeatureStore"): """ Initialize the global security manager. Must be invoked at Feast server initialization time to create the `SecurityManager` instance. @@ -70,7 +61,7 @@ def init_security_manager(auth_manager_type: AuthManagerType, fs: "feast.Feature auth_manager_type: The authorization manager type. registry: The feature store registry. """ - if auth_manager_type == AuthManagerType.NONE: + if auth_manager_type == AuthType.NONE: no_security_manager() else: # TODO permissions from registry @@ -82,7 +73,7 @@ def init_security_manager(auth_manager_type: AuthManagerType, fs: "feast.Feature ) -def init_auth_manager(server_type: ServerType, auth_manager_type: AuthManagerType): +def init_auth_manager(server_type: ServerType, auth_manager_type: AuthType): """ Initialize the global authorization manager. Must be invoked at Feast server initialization time to create the `AuthManager` instance. @@ -94,7 +85,7 @@ def init_auth_manager(server_type: ServerType, auth_manager_type: AuthManagerTyp Raises: ValueError: If any input argument has an unmanaged value. """ - if auth_manager_type == AuthManagerType.NONE: + if auth_manager_type == AuthType.NONE: set_auth_manager(AllowAll()) else: token_extractor: TokenExtractor @@ -109,9 +100,9 @@ def init_auth_manager(server_type: ServerType, auth_manager_type: AuthManagerTyp else: raise ValueError(f"Unmanaged server type {server_type}") - if auth_manager_type == AuthManagerType.KUBERNETES: + if auth_manager_type == AuthType.KUBERNETES: token_parser = KubernetesTokenParser() - elif auth_manager_type == AuthManagerType.OIDC: + elif auth_manager_type == AuthType.OIDC: token_parser = OidcTokenParser() else: raise ValueError( diff --git a/sdk/python/feast/repo_config.py b/sdk/python/feast/repo_config.py index c5f6c93c6c..74a653434a 100644 --- a/sdk/python/feast/repo_config.py +++ b/sdk/python/feast/repo_config.py @@ -26,6 +26,7 @@ FeastRegistryTypeInvalidError, ) from feast.importer import import_class +from feast.permissions.auth.auth_type import AuthType warnings.simplefilter("once", RuntimeWarning) @@ -224,7 +225,7 @@ def __init__(self, **data: Any): self._auth = None if "auth" not in data: self.auth = dict() - self.auth["type"] = "no_auth" + self.auth["type"] = AuthType.NONE.value else: self.auth = data.get("auth") diff --git a/sdk/python/tests/integration/registration/test_universal_registry.py b/sdk/python/tests/integration/registration/test_universal_registry.py index deb910a50f..fbd9f33c18 100644 --- a/sdk/python/tests/integration/registration/test_universal_registry.py +++ b/sdk/python/tests/integration/registration/test_universal_registry.py @@ -42,7 +42,6 @@ from feast.infra.registry.sql import SqlRegistry from feast.on_demand_feature_view import on_demand_feature_view from feast.permissions.action import AuthzedAction -from feast.permissions.auth_model import NoAuthConfig from feast.permissions.permission import Permission from feast.permissions.policy import RoleBasedPolicy from feast.protos.feast.registry import RegistryServer_pb2, RegistryServer_pb2_grpc @@ -59,7 +58,7 @@ def local_registry() -> Registry: fd, registry_path = mkstemp() registry_config = RegistryConfig(path=registry_path, cache_ttl_seconds=600) - return Registry("project", registry_config, None, auth_config=NoAuthConfig()) + return Registry("project", registry_config, None) @pytest.fixture @@ -78,7 +77,7 @@ def gcs_registry() -> Registry: registry_config = RegistryConfig( path=f"gs://{bucket_name}/registry.db", cache_ttl_seconds=600 ) - return Registry("project", registry_config, None, auth_config=NoAuthConfig()) + return Registry("project", registry_config, None) @pytest.fixture @@ -90,7 +89,7 @@ def s3_registry() -> Registry: path=f"{aws_registry_path}/{int(time.time() * 1000)}/registry.db", cache_ttl_seconds=600, ) - return Registry("project", registry_config, None, auth_config=NoAuthConfig()) + return Registry("project", registry_config, None) @pytest.fixture(scope="session") @@ -117,7 +116,7 @@ def minio_registry() -> Registry: } with mock.patch.dict(os.environ, mock_environ): - yield Registry("project", registry_config, None, auth_config=NoAuthConfig()) + yield Registry("project", registry_config, None) container.stop() @@ -272,15 +271,12 @@ def handler(request): def mock_remote_registry(): fd, registry_path = mkstemp() registry_config = RegistryConfig(path=registry_path, cache_ttl_seconds=600) - proxied_registry = Registry( - "project", registry_config, None, auth_config=NoAuthConfig() - ) + proxied_registry = Registry("project", registry_config, None) registry = RemoteRegistry( registry_config=RemoteRegistryConfig(path=""), project=None, repo_path=None, - auth_config=NoAuthConfig(), ) mock_channel = GrpcMockChannel( RegistryServer_pb2.DESCRIPTOR.services_by_name["RegistryServer"], @@ -1317,9 +1313,7 @@ def test_modify_feature_service_success(test_registry): def test_commit(): fd, registry_path = mkstemp() registry_config = RegistryConfig(path=registry_path, cache_ttl_seconds=600) - test_registry = Registry( - "project", registry_config, None, auth_config=NoAuthConfig() - ) + test_registry = Registry("project", registry_config, None) entity = Entity( name="driver_car_id", @@ -1360,9 +1354,7 @@ def test_commit(): validate_project_uuid(project_uuid, test_registry) # Create new registry that points to the same store - registry_with_same_store = Registry( - "project", registry_config, None, auth_config=NoAuthConfig() - ) + registry_with_same_store = Registry("project", registry_config, None) # Retrieving the entity should fail since the store is empty entities = registry_with_same_store.list_entities(project) @@ -1373,9 +1365,7 @@ def test_commit(): test_registry.commit() # Reconstruct the new registry in order to read the newly written store - registry_with_same_store = Registry( - "project", registry_config, None, auth_config=NoAuthConfig() - ) + registry_with_same_store = Registry("project", registry_config, None) # Retrieving the entity should now succeed entities = registry_with_same_store.list_entities(project, tags=entity.tags) diff --git a/sdk/python/tests/unit/infra/scaffolding/test_repo_config.py b/sdk/python/tests/unit/infra/scaffolding/test_repo_config.py index 76ad85ca7c..37a08ca09e 100644 --- a/sdk/python/tests/unit/infra/scaffolding/test_repo_config.py +++ b/sdk/python/tests/unit/infra/scaffolding/test_repo_config.py @@ -4,6 +4,7 @@ from typing import Optional from feast.infra.online_stores.sqlite import SqliteOnlineStoreConfig +from feast.permissions.auth.auth_type import AuthType from feast.permissions.auth_model import ( KubernetesAuthConfig, NoAuthConfig, @@ -270,7 +271,7 @@ def test_auth_config(): ), expect_error=None, ) - assert oidc_repo_config.auth["type"] == "oidc" + assert oidc_repo_config.auth["type"] == AuthType.OIDC.value assert isinstance(oidc_repo_config.auth_config, OidcAuthConfig) assert oidc_repo_config.auth_config.client_id == "test_client_id" assert oidc_repo_config.auth_config.client_secret == "test_client_secret" @@ -296,7 +297,7 @@ def test_auth_config(): ), expect_error=None, ) - assert no_auth_repo_config.auth.get("type") == "no_auth" + assert no_auth_repo_config.auth.get("type") == AuthType.NONE.value assert isinstance(no_auth_repo_config.auth_config, NoAuthConfig) k8_repo_config = _test_config( @@ -314,5 +315,5 @@ def test_auth_config(): ), expect_error=None, ) - assert k8_repo_config.auth.get("type") == "kubernetes" + assert k8_repo_config.auth.get("type") == AuthType.KUBERNETES.value assert isinstance(k8_repo_config.auth_config, KubernetesAuthConfig) diff --git a/sdk/python/tests/unit/permissions/server/test_utils.py b/sdk/python/tests/unit/permissions/server/test_utils.py index 64dedbc16b..7c5b4d68fd 100644 --- a/sdk/python/tests/unit/permissions/server/test_utils.py +++ b/sdk/python/tests/unit/permissions/server/test_utils.py @@ -1,15 +1,15 @@ import assertpy import pytest -from feast.permissions.server.utils import AuthManagerType, str_to_auth_manager_type +from feast.permissions.server.utils import AuthType, str_to_auth_manager_type @pytest.mark.parametrize( "label, value", - [(t.value, t) for t in AuthManagerType] - + [(t.value.upper(), t) for t in AuthManagerType] - + [(t.value.lower(), t) for t in AuthManagerType] - + [("none", AuthManagerType.NONE)], + [(t.value, t) for t in AuthType] + + [(t.value.upper(), t) for t in AuthType] + + [(t.value.lower(), t) for t in AuthType] + + [("none", AuthType.NONE)], ) def test_str_to_auth_manager_type(label, value): assertpy.assert_that(str_to_auth_manager_type(label)).is_equal_to(value) From fb48f1a3f4fd418df4fcee280ac219a4a91651b3 Mon Sep 17 00:00:00 2001 From: Theodor Mihalache Date: Thu, 11 Jul 2024 14:43:24 -0400 Subject: [PATCH 060/169] Client module-grpc - Made changes following code review Signed-off-by: Theodor Mihalache Signed-off-by: Abdul Hameed --- sdk/python/feast/feature_server.py | 8 ++++---- sdk/python/feast/offline_server.py | 10 +++++----- sdk/python/feast/permissions/server/arrow.py | 4 ++-- sdk/python/feast/permissions/server/grpc.py | 6 +++--- sdk/python/feast/permissions/server/utils.py | 20 +++++++++---------- sdk/python/feast/registry_server.py | 10 +++++----- .../unit/permissions/server/test_utils.py | 6 +++--- 7 files changed, 32 insertions(+), 32 deletions(-) diff --git a/sdk/python/feast/feature_server.py b/sdk/python/feast/feature_server.py index df62a8e013..4e03439cd3 100644 --- a/sdk/python/feast/feature_server.py +++ b/sdk/python/feast/feature_server.py @@ -27,7 +27,7 @@ ServerType, init_auth_manager, init_security_manager, - str_to_auth_manager_type, + str_to_auth_type, ) # Define prometheus metrics @@ -346,10 +346,10 @@ def start_server( monitoring_thread.start() # TODO RBAC remove and use the auth section of the feature store config instead - auth_manager_type = str_to_auth_manager_type(store.config.auth_config.type) - init_security_manager(auth_manager_type=auth_manager_type, fs=store) + auth_type = str_to_auth_type(store.config.auth_config.type) + init_security_manager(auth_type=auth_type, fs=store) init_auth_manager( - auth_manager_type=auth_manager_type, + auth_type=auth_type, server_type=ServerType.REST, ) diff --git a/sdk/python/feast/offline_server.py b/sdk/python/feast/offline_server.py index 748237f339..d7dde99727 100644 --- a/sdk/python/feast/offline_server.py +++ b/sdk/python/feast/offline_server.py @@ -22,7 +22,7 @@ ServerType, init_auth_manager, init_security_manager, - str_to_auth_manager_type, + str_to_auth_type, ) from feast.saved_dataset import SavedDatasetStorage @@ -35,7 +35,7 @@ def __init__(self, store: FeatureStore, location: str, **kwargs): super(OfflineServer, self).__init__( location, middleware=arrowflight_middleware( - str_to_auth_manager_type(store.config.auth_config.type) + str_to_auth_type(store.config.auth_config.type) ), **kwargs, ) @@ -449,10 +449,10 @@ def remove_dummies(fv: FeatureView) -> FeatureView: def _init_auth_manager(store: FeatureStore): - auth_manager_type = str_to_auth_manager_type(store.config.auth_config.type) - init_security_manager(auth_manager_type=auth_manager_type, fs=store) + auth_type = str_to_auth_type(store.config.auth_config.type) + init_security_manager(auth_type=auth_type, fs=store) init_auth_manager( - auth_manager_type=auth_manager_type, + auth_type=auth_type, server_type=ServerType.ARROW, ) diff --git a/sdk/python/feast/permissions/server/arrow.py b/sdk/python/feast/permissions/server/arrow.py index 1295238556..35bfbed76a 100644 --- a/sdk/python/feast/permissions/server/arrow.py +++ b/sdk/python/feast/permissions/server/arrow.py @@ -24,7 +24,7 @@ def arrowflight_middleware( - auth_manager_type: AuthType, + auth_type: AuthType, ) -> Optional[dict[str, fl.ServerMiddlewareFactory]]: """ A dictionary with the configured middlewares to support extracting the user details when the authorization manager is defined. @@ -34,7 +34,7 @@ def arrowflight_middleware( dict[str, fl.ServerMiddlewareFactory]: Optional dictionary of middlewares. If the authorization type is set to `NONE`, it returns `None`. """ - if auth_manager_type == AuthType.NONE: + if auth_type == AuthType.NONE: return None return { diff --git a/sdk/python/feast/permissions/server/grpc.py b/sdk/python/feast/permissions/server/grpc.py index 9890199dee..5838d77076 100644 --- a/sdk/python/feast/permissions/server/grpc.py +++ b/sdk/python/feast/permissions/server/grpc.py @@ -16,18 +16,18 @@ def grpc_interceptors( - auth_manager_type: AuthType, + auth_type: AuthType, ) -> Optional[list[grpc.ServerInterceptor]]: """ A list of the authorization interceptors. Args: - auth_manager_type: The type of authorization manager, from the feature store configuration. + auth_type: The type of authorization manager, from the feature store configuration. Returns: list[grpc.ServerInterceptor]: Optional list of interceptors. If the authorization type is set to `NONE`, it returns `None`. """ - if auth_manager_type == AuthType.NONE: + if auth_type == AuthType.NONE: return None return [AuthInterceptor()] diff --git a/sdk/python/feast/permissions/server/utils.py b/sdk/python/feast/permissions/server/utils.py index 7345b08a9c..2a72e3ab17 100644 --- a/sdk/python/feast/permissions/server/utils.py +++ b/sdk/python/feast/permissions/server/utils.py @@ -41,7 +41,7 @@ class ServerType(enum.Enum): GRPC = "grpc" # TODO RBAC: to be completed -def str_to_auth_manager_type(value: str) -> AuthType: +def str_to_auth_type(value: str) -> AuthType: for t in AuthType.__members__.values(): if t.value.lower() == value.lower(): return t @@ -52,16 +52,16 @@ def str_to_auth_manager_type(value: str) -> AuthType: return AuthType.NONE -def init_security_manager(auth_manager_type: AuthType, fs: "feast.FeatureStore"): +def init_security_manager(auth_type: AuthType, fs: "feast.FeatureStore"): """ Initialize the global security manager. Must be invoked at Feast server initialization time to create the `SecurityManager` instance. Args: - auth_manager_type: The authorization manager type. + auth_type: The authorization manager type. registry: The feature store registry. """ - if auth_manager_type == AuthType.NONE: + if auth_type == AuthType.NONE: no_security_manager() else: # TODO permissions from registry @@ -73,19 +73,19 @@ def init_security_manager(auth_manager_type: AuthType, fs: "feast.FeatureStore") ) -def init_auth_manager(server_type: ServerType, auth_manager_type: AuthType): +def init_auth_manager(server_type: ServerType, auth_type: AuthType): """ Initialize the global authorization manager. Must be invoked at Feast server initialization time to create the `AuthManager` instance. Args: server_type: The server type. - auth_manager_type: The authorization manager type. + auth_type: The authorization manager type. Raises: ValueError: If any input argument has an unmanaged value. """ - if auth_manager_type == AuthType.NONE: + if auth_type == AuthType.NONE: set_auth_manager(AllowAll()) else: token_extractor: TokenExtractor @@ -100,13 +100,13 @@ def init_auth_manager(server_type: ServerType, auth_manager_type: AuthType): else: raise ValueError(f"Unmanaged server type {server_type}") - if auth_manager_type == AuthType.KUBERNETES: + if auth_type == AuthType.KUBERNETES: token_parser = KubernetesTokenParser() - elif auth_manager_type == AuthType.OIDC: + elif auth_type == AuthType.OIDC: token_parser = OidcTokenParser() else: raise ValueError( - f"Unmanaged authorization manager type {auth_manager_type}" + f"Unmanaged authorization manager type {auth_type}" ) auth_manager = AuthManager( diff --git a/sdk/python/feast/registry_server.py b/sdk/python/feast/registry_server.py index 9146bdc87e..ed23771959 100644 --- a/sdk/python/feast/registry_server.py +++ b/sdk/python/feast/registry_server.py @@ -22,7 +22,7 @@ ServerType, init_auth_manager, init_security_manager, - str_to_auth_manager_type, + str_to_auth_type, ) from feast.protos.feast.registry import RegistryServer_pb2, RegistryServer_pb2_grpc from feast.saved_dataset import SavedDataset, ValidationReference @@ -583,16 +583,16 @@ def Proto(self, request, context): def start_server(store: FeatureStore, port: int): - auth_manager_type = str_to_auth_manager_type(store.config.auth_config.type) - init_security_manager(auth_manager_type=auth_manager_type, fs=store) + auth_type = str_to_auth_type(store.config.auth_config.type) + init_security_manager(auth_type=auth_type, fs=store) init_auth_manager( - auth_manager_type=auth_manager_type, + auth_type=auth_type, server_type=ServerType.GRPC, ) server = grpc.server( futures.ThreadPoolExecutor(max_workers=10), - interceptors=grpc_interceptors(auth_manager_type), + interceptors=grpc_interceptors(auth_type), ) RegistryServer_pb2_grpc.add_RegistryServerServicer_to_server( RegistryServer(store.registry), server diff --git a/sdk/python/tests/unit/permissions/server/test_utils.py b/sdk/python/tests/unit/permissions/server/test_utils.py index 7c5b4d68fd..2b5e7489cb 100644 --- a/sdk/python/tests/unit/permissions/server/test_utils.py +++ b/sdk/python/tests/unit/permissions/server/test_utils.py @@ -1,7 +1,7 @@ import assertpy import pytest -from feast.permissions.server.utils import AuthType, str_to_auth_manager_type +from feast.permissions.server.utils import AuthType, str_to_auth_type @pytest.mark.parametrize( @@ -11,5 +11,5 @@ + [(t.value.lower(), t) for t in AuthType] + [("none", AuthType.NONE)], ) -def test_str_to_auth_manager_type(label, value): - assertpy.assert_that(str_to_auth_manager_type(label)).is_equal_to(value) +def test_str_to_auth_type(label, value): + assertpy.assert_that(str_to_auth_type(label)).is_equal_to(value) From 0158cfd4e77890e892125c2f65db74decc502c88 Mon Sep 17 00:00:00 2001 From: Theodor Mihalache Date: Thu, 11 Jul 2024 14:43:24 -0400 Subject: [PATCH 061/169] Client module-grpc - Made changes following code review Signed-off-by: Theodor Mihalache Signed-off-by: Abdul Hameed --- sdk/python/feast/permissions/server/utils.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/sdk/python/feast/permissions/server/utils.py b/sdk/python/feast/permissions/server/utils.py index 2a72e3ab17..7479211450 100644 --- a/sdk/python/feast/permissions/server/utils.py +++ b/sdk/python/feast/permissions/server/utils.py @@ -105,9 +105,7 @@ def init_auth_manager(server_type: ServerType, auth_type: AuthType): elif auth_type == AuthType.OIDC: token_parser = OidcTokenParser() else: - raise ValueError( - f"Unmanaged authorization manager type {auth_type}" - ) + raise ValueError(f"Unmanaged authorization manager type {auth_type}") auth_manager = AuthManager( token_extractor=token_extractor, token_parser=token_parser From 2dbf6b19dd0e78be15773a24cb0b7e09bb6211d1 Mon Sep 17 00:00:00 2001 From: Theodor Mihalache Date: Thu, 11 Jul 2024 14:43:24 -0400 Subject: [PATCH 062/169] Client module-grpc - Made changes following code review Signed-off-by: Theodor Mihalache Signed-off-by: Abdul Hameed --- sdk/python/feast/infra/registry/remote.py | 74 +++++++++---------- .../permissions/client/auth_client_manager.py | 2 +- 2 files changed, 38 insertions(+), 38 deletions(-) diff --git a/sdk/python/feast/infra/registry/remote.py b/sdk/python/feast/infra/registry/remote.py index 53ebd56d0e..daee714ab8 100644 --- a/sdk/python/feast/infra/registry/remote.py +++ b/sdk/python/feast/infra/registry/remote.py @@ -21,7 +21,7 @@ NoAuthConfig, ) from feast.permissions.client.auth_client_manager import ( - create_metadata, + create_grpc_auth_header, ) from feast.permissions.permission import Permission from feast.project_metadata import ProjectMetadata @@ -59,7 +59,7 @@ def apply_entity(self, entity: Entity, project: str, commit: bool = True): ) if self.auth_config.type is not AuthType.NONE.value: - metadata = create_metadata(self.auth_config) + metadata = create_grpc_auth_header(self.auth_config) self.stub.ApplyEntity(request=request, metadata=metadata) else: self.stub.ApplyEntity(request) @@ -70,7 +70,7 @@ def delete_entity(self, name: str, project: str, commit: bool = True): ) if self.auth_config.type is not AuthType.NONE.value: - metadata = create_metadata(self.auth_config) + metadata = create_grpc_auth_header(self.auth_config) self.stub.DeleteEntity(request=request, metadata=metadata) else: self.stub.DeleteEntity(request) @@ -81,7 +81,7 @@ def get_entity(self, name: str, project: str, allow_cache: bool = False) -> Enti ) if self.auth_config.type is not AuthType.NONE.value: - metadata = create_metadata(self.auth_config) + metadata = create_grpc_auth_header(self.auth_config) response = self.stub.GetEntity(request=request, metadata=metadata) else: response = self.stub.GetEntity(request) @@ -99,7 +99,7 @@ def list_entities( ) if self.auth_config.type is not AuthType.NONE.value: - metadata = create_metadata(self.auth_config) + metadata = create_grpc_auth_header(self.auth_config) response = self.stub.ListEntities(request=request, metadata=metadata) else: response = self.stub.ListEntities(request) @@ -114,7 +114,7 @@ def apply_data_source( ) if self.auth_config.type is not AuthType.NONE.value: - metadata = create_metadata(self.auth_config) + metadata = create_grpc_auth_header(self.auth_config) self.stub.ApplyDataSource(request=request, metadata=metadata) else: self.stub.ApplyDataSource(request) @@ -125,7 +125,7 @@ def delete_data_source(self, name: str, project: str, commit: bool = True): ) if self.auth_config.type is not AuthType.NONE.value: - metadata = create_metadata(self.auth_config) + metadata = create_grpc_auth_header(self.auth_config) self.stub.DeleteDataSource(request=request, metadata=metadata) else: self.stub.DeleteDataSource(request) @@ -138,7 +138,7 @@ def get_data_source( ) if self.auth_config.type is not AuthType.NONE.value: - metadata = create_metadata(self.auth_config) + metadata = create_grpc_auth_header(self.auth_config) response = self.stub.GetDataSource(request=request, metadata=metadata) else: response = self.stub.GetDataSource(request) @@ -156,7 +156,7 @@ def list_data_sources( ) if self.auth_config.type is not AuthType.NONE.value: - metadata = create_metadata(self.auth_config) + metadata = create_grpc_auth_header(self.auth_config) response = self.stub.ListDataSources(request=request, metadata=metadata) else: response = self.stub.ListDataSources(request) @@ -173,7 +173,7 @@ def apply_feature_service( ) if self.auth_config.type is not AuthType.NONE.value: - metadata = create_metadata(self.auth_config) + metadata = create_grpc_auth_header(self.auth_config) self.stub.ApplyFeatureService(request=request, metadata=metadata) else: self.stub.ApplyFeatureService(request) @@ -184,7 +184,7 @@ def delete_feature_service(self, name: str, project: str, commit: bool = True): ) if self.auth_config.type is not AuthType.NONE.value: - metadata = create_metadata(self.auth_config) + metadata = create_grpc_auth_header(self.auth_config) self.stub.DeleteFeatureService(request=request, metadata=metadata) else: self.stub.DeleteFeatureService(request) @@ -197,7 +197,7 @@ def get_feature_service( ) if self.auth_config.type is not AuthType.NONE.value: - metadata = create_metadata(self.auth_config) + metadata = create_grpc_auth_header(self.auth_config) response = self.stub.GetFeatureService(request=request, metadata=metadata) else: response = self.stub.GetFeatureService(request) @@ -215,7 +215,7 @@ def list_feature_services( ) if self.auth_config.type is not AuthType.NONE.value: - metadata = create_metadata(self.auth_config) + metadata = create_grpc_auth_header(self.auth_config) response = self.stub.ListFeatureServices(request=request, metadata=metadata) else: response = self.stub.ListFeatureServices(request) @@ -250,7 +250,7 @@ def apply_feature_view( ) if self.auth_config.type is not AuthType.NONE.value: - metadata = create_metadata(self.auth_config) + metadata = create_grpc_auth_header(self.auth_config) self.stub.ApplyFeatureView(request=request, metadata=metadata) else: self.stub.ApplyFeatureView(request) @@ -261,7 +261,7 @@ def delete_feature_view(self, name: str, project: str, commit: bool = True): ) if self.auth_config.type is not AuthType.NONE.value: - metadata = create_metadata(self.auth_config) + metadata = create_grpc_auth_header(self.auth_config) self.stub.DeleteFeatureView(request=request, metadata=metadata) else: self.stub.DeleteFeatureView(request) @@ -274,7 +274,7 @@ def get_stream_feature_view( ) if self.auth_config.type is not AuthType.NONE.value: - metadata = create_metadata(self.auth_config) + metadata = create_grpc_auth_header(self.auth_config) response = self.stub.GetStreamFeatureView( request=request, metadata=metadata ) @@ -294,7 +294,7 @@ def list_stream_feature_views( ) if self.auth_config.type is not AuthType.NONE.value: - metadata = create_metadata(self.auth_config) + metadata = create_grpc_auth_header(self.auth_config) response = self.stub.ListStreamFeatureViews( request=request, metadata=metadata ) @@ -314,7 +314,7 @@ def get_on_demand_feature_view( ) if self.auth_config.type is not AuthType.NONE.value: - metadata = create_metadata(self.auth_config) + metadata = create_grpc_auth_header(self.auth_config) response = self.stub.GetOnDemandFeatureView( request=request, metadata=metadata ) @@ -334,7 +334,7 @@ def list_on_demand_feature_views( ) if self.auth_config.type is not AuthType.NONE.value: - metadata = create_metadata(self.auth_config) + metadata = create_grpc_auth_header(self.auth_config) response = self.stub.ListOnDemandFeatureViews( request=request, metadata=metadata ) @@ -354,7 +354,7 @@ def get_feature_view( ) if self.auth_config.type is not AuthType.NONE.value: - metadata = create_metadata(self.auth_config) + metadata = create_grpc_auth_header(self.auth_config) response = self.stub.GetFeatureView(request=request, metadata=metadata) else: response = self.stub.GetFeatureView(request) @@ -372,7 +372,7 @@ def list_feature_views( ) if self.auth_config.type is not AuthType.NONE.value: - metadata = create_metadata(self.auth_config) + metadata = create_grpc_auth_header(self.auth_config) response = self.stub.ListFeatureViews(request=request, metadata=metadata) else: response = self.stub.ListFeatureViews(request) @@ -405,7 +405,7 @@ def apply_materialization( ) if self.auth_config.type is not AuthType.NONE.value: - metadata = create_metadata(self.auth_config) + metadata = create_grpc_auth_header(self.auth_config) self.stub.ApplyMaterialization(request=request, metadata=metadata) else: self.stub.ApplyMaterialization(request) @@ -421,7 +421,7 @@ def apply_saved_dataset( ) if self.auth_config.type is not AuthType.NONE.value: - metadata = create_metadata(self.auth_config) + metadata = create_grpc_auth_header(self.auth_config) self.stub.ApplyFeatureService(request=request, metadata=metadata) else: self.stub.ApplyFeatureService(request) @@ -441,7 +441,7 @@ def get_saved_dataset( ) if self.auth_config.type is not AuthType.NONE.value: - metadata = create_metadata(self.auth_config) + metadata = create_grpc_auth_header(self.auth_config) response = self.stub.GetSavedDataset(request=request, metadata=metadata) else: response = self.stub.GetSavedDataset(request) @@ -459,7 +459,7 @@ def list_saved_datasets( ) if self.auth_config.type is not AuthType.NONE.value: - metadata = create_metadata(self.auth_config) + metadata = create_grpc_auth_header(self.auth_config) response = self.stub.ListSavedDatasets(request=request, metadata=metadata) else: response = self.stub.ListSavedDatasets(request) @@ -482,7 +482,7 @@ def apply_validation_reference( ) if self.auth_config.type is not AuthType.NONE.value: - metadata = create_metadata(self.auth_config) + metadata = create_grpc_auth_header(self.auth_config) self.stub.ApplyValidationReference(request=request, metadata=metadata) else: self.stub.ApplyValidationReference(request) @@ -493,7 +493,7 @@ def delete_validation_reference(self, name: str, project: str, commit: bool = Tr ) if self.auth_config.type is not AuthType.NONE.value: - metadata = create_metadata(self.auth_config) + metadata = create_grpc_auth_header(self.auth_config) self.stub.DeleteValidationReference(request=request, metadata=metadata) else: self.stub.DeleteValidationReference(request) @@ -506,7 +506,7 @@ def get_validation_reference( ) if self.auth_config.type is not AuthType.NONE.value: - metadata = create_metadata(self.auth_config) + metadata = create_grpc_auth_header(self.auth_config) response = self.stub.GetValidationReference( request=request, metadata=metadata ) @@ -526,7 +526,7 @@ def list_validation_references( ) if self.auth_config.type is not AuthType.NONE.value: - metadata = create_metadata(self.auth_config) + metadata = create_grpc_auth_header(self.auth_config) response = self.stub.ListValidationReferences( request=request, metadata=metadata ) @@ -546,7 +546,7 @@ def list_project_metadata( ) if self.auth_config.type is not AuthType.NONE.value: - metadata = create_metadata(self.auth_config) + metadata = create_grpc_auth_header(self.auth_config) response = self.stub.ListProjectMetadata(request=request, metadata=metadata) else: response = self.stub.ListProjectMetadata(request) @@ -559,7 +559,7 @@ def update_infra(self, infra: Infra, project: str, commit: bool = True): ) if self.auth_config.type is not AuthType.NONE.value: - metadata = create_metadata(self.auth_config) + metadata = create_grpc_auth_header(self.auth_config) self.stub.UpdateInfra(request=request, metadata=metadata) else: self.stub.UpdateInfra(request) @@ -570,7 +570,7 @@ def get_infra(self, project: str, allow_cache: bool = False) -> Infra: ) if self.auth_config.type is not AuthType.NONE.value: - metadata = create_metadata(self.auth_config) + metadata = create_grpc_auth_header(self.auth_config) response = self.stub.GetInfra(request=request, metadata=metadata) else: response = self.stub.GetInfra(request) @@ -601,7 +601,7 @@ def apply_permission( ) if self.auth_config.type is not AuthType.NONE.value: - metadata = create_metadata(self.auth_config) + metadata = create_grpc_auth_header(self.auth_config) self.stub.ApplyPermission(request=request, metadata=metadata) else: self.stub.ApplyPermission(request) @@ -612,7 +612,7 @@ def delete_permission(self, name: str, project: str, commit: bool = True): ) if self.auth_config.type is not AuthType.NONE.value: - metadata = create_metadata(self.auth_config) + metadata = create_grpc_auth_header(self.auth_config) self.stub.DeletePermission(request=request, metadata=metadata) else: self.stub.DeletePermission(request) @@ -625,7 +625,7 @@ def get_permission( ) if self.auth_config.type is not AuthType.NONE.value: - metadata = create_metadata(self.auth_config) + metadata = create_grpc_auth_header(self.auth_config) response = self.stub.GetPermission(request=request, metadata=metadata) else: response = self.stub.GetPermission(request) @@ -643,7 +643,7 @@ def list_permissions( ) if self.auth_config.type is not AuthType.NONE.value: - metadata = create_metadata(self.auth_config) + metadata = create_grpc_auth_header(self.auth_config) response = self.stub.ListPermissions(request=request, metadata=metadata) else: response = self.stub.ListPermissions(request) @@ -662,7 +662,7 @@ def refresh(self, project: Optional[str] = None): request = RegistryServer_pb2.RefreshRequest(project=str(project)) if self.auth_config.type is not AuthType.NONE.value: - metadata = create_metadata(self.auth_config) + metadata = create_grpc_auth_header(self.auth_config) self.stub.Refresh(request=request, metadata=metadata) else: self.stub.Refresh(request) diff --git a/sdk/python/feast/permissions/client/auth_client_manager.py b/sdk/python/feast/permissions/client/auth_client_manager.py index 2366511d24..9c9fd23b41 100644 --- a/sdk/python/feast/permissions/client/auth_client_manager.py +++ b/sdk/python/feast/permissions/client/auth_client_manager.py @@ -39,7 +39,7 @@ def get_auth_client_manager(auth_config: AuthConfig) -> AuthenticationClientMana ) -def create_metadata(auth_config: AuthConfig) -> Tuple[Tuple[str, str]]: +def create_grpc_auth_header(auth_config: AuthConfig) -> Tuple[Tuple[str, str]]: auth_client_manager = get_auth_client_manager(auth_config) token = auth_client_manager.get_token() From 6ac6c016ec138624057ef48675e57420c945dcac Mon Sep 17 00:00:00 2001 From: Theodor Mihalache Date: Fri, 12 Jul 2024 10:38:22 -0400 Subject: [PATCH 063/169] Client module-grpc - Made changes following code review Signed-off-by: Theodor Mihalache Signed-off-by: Abdul Hameed --- sdk/python/feast/feature_server.py | 4 +- sdk/python/feast/feature_store.py | 2 +- sdk/python/feast/infra/registry/remote.py | 305 +++++++----------- sdk/python/feast/offline_server.py | 6 +- .../permissions/client/auth_client_manager.py | 9 +- sdk/python/feast/permissions/server/arrow.py | 6 +- sdk/python/feast/permissions/server/grpc.py | 6 +- sdk/python/feast/permissions/server/utils.py | 29 +- sdk/python/feast/registry_server.py | 4 +- sdk/python/feast/repo_config.py | 27 +- .../unit/permissions/server/test_utils.py | 12 +- 11 files changed, 175 insertions(+), 235 deletions(-) diff --git a/sdk/python/feast/feature_server.py b/sdk/python/feast/feature_server.py index 4e03439cd3..a348b0b94a 100644 --- a/sdk/python/feast/feature_server.py +++ b/sdk/python/feast/feature_server.py @@ -27,7 +27,7 @@ ServerType, init_auth_manager, init_security_manager, - str_to_auth_type, + str_to_auth_manager_type, ) # Define prometheus metrics @@ -346,7 +346,7 @@ def start_server( monitoring_thread.start() # TODO RBAC remove and use the auth section of the feature store config instead - auth_type = str_to_auth_type(store.config.auth_config.type) + auth_type = str_to_auth_manager_type(store.config.auth_config.type) init_security_manager(auth_type=auth_type, fs=store) init_auth_manager( auth_type=auth_type, diff --git a/sdk/python/feast/feature_store.py b/sdk/python/feast/feature_store.py index df38b65fb6..a03706e56f 100644 --- a/sdk/python/feast/feature_store.py +++ b/sdk/python/feast/feature_store.py @@ -159,7 +159,7 @@ def __init__( from feast.infra.registry.remote import RemoteRegistry self._registry = RemoteRegistry( - registry_config, self.config.project, None, self.config.auth + registry_config, self.config.project, None, self.config.auth_config ) else: r = Registry( diff --git a/sdk/python/feast/infra/registry/remote.py b/sdk/python/feast/infra/registry/remote.py index daee714ab8..971f6f180a 100644 --- a/sdk/python/feast/infra/registry/remote.py +++ b/sdk/python/feast/infra/registry/remote.py @@ -15,7 +15,6 @@ from feast.infra.infra_object import Infra from feast.infra.registry.base_registry import BaseRegistry from feast.on_demand_feature_view import OnDemandFeatureView -from feast.permissions.auth.auth_type import AuthType from feast.permissions.auth_model import ( AuthConfig, NoAuthConfig, @@ -58,33 +57,27 @@ def apply_entity(self, entity: Entity, project: str, commit: bool = True): entity=entity.to_proto(), project=project, commit=commit ) - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_grpc_auth_header(self.auth_config) - self.stub.ApplyEntity(request=request, metadata=metadata) - else: - self.stub.ApplyEntity(request) + self.stub.ApplyEntity( + request=request, metadata=create_grpc_auth_header(self.auth_config) + ) def delete_entity(self, name: str, project: str, commit: bool = True): request = RegistryServer_pb2.DeleteEntityRequest( name=name, project=project, commit=commit ) - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_grpc_auth_header(self.auth_config) - self.stub.DeleteEntity(request=request, metadata=metadata) - else: - self.stub.DeleteEntity(request) + self.stub.DeleteEntity( + request=request, metadata=create_grpc_auth_header(self.auth_config) + ) def get_entity(self, name: str, project: str, allow_cache: bool = False) -> Entity: request = RegistryServer_pb2.GetEntityRequest( name=name, project=project, allow_cache=allow_cache ) - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_grpc_auth_header(self.auth_config) - response = self.stub.GetEntity(request=request, metadata=metadata) - else: - response = self.stub.GetEntity(request) + response = self.stub.GetEntity( + request=request, metadata=create_grpc_auth_header(self.auth_config) + ) return Entity.from_proto(response) @@ -98,11 +91,9 @@ def list_entities( project=project, allow_cache=allow_cache, tags=tags ) - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_grpc_auth_header(self.auth_config) - response = self.stub.ListEntities(request=request, metadata=metadata) - else: - response = self.stub.ListEntities(request) + response = self.stub.ListEntities( + request=request, metadata=create_grpc_auth_header(self.auth_config) + ) return [Entity.from_proto(entity) for entity in response.entities] @@ -113,22 +104,18 @@ def apply_data_source( data_source=data_source.to_proto(), project=project, commit=commit ) - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_grpc_auth_header(self.auth_config) - self.stub.ApplyDataSource(request=request, metadata=metadata) - else: - self.stub.ApplyDataSource(request) + self.stub.ApplyDataSource( + request=request, metadata=create_grpc_auth_header(self.auth_config) + ) def delete_data_source(self, name: str, project: str, commit: bool = True): request = RegistryServer_pb2.DeleteDataSourceRequest( name=name, project=project, commit=commit ) - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_grpc_auth_header(self.auth_config) - self.stub.DeleteDataSource(request=request, metadata=metadata) - else: - self.stub.DeleteDataSource(request) + self.stub.DeleteDataSource( + request=request, metadata=create_grpc_auth_header(self.auth_config) + ) def get_data_source( self, name: str, project: str, allow_cache: bool = False @@ -137,11 +124,9 @@ def get_data_source( name=name, project=project, allow_cache=allow_cache ) - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_grpc_auth_header(self.auth_config) - response = self.stub.GetDataSource(request=request, metadata=metadata) - else: - response = self.stub.GetDataSource(request) + response = self.stub.GetDataSource( + request=request, metadata=create_grpc_auth_header(self.auth_config) + ) return DataSource.from_proto(response) @@ -155,11 +140,9 @@ def list_data_sources( project=project, allow_cache=allow_cache, tags=tags ) - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_grpc_auth_header(self.auth_config) - response = self.stub.ListDataSources(request=request, metadata=metadata) - else: - response = self.stub.ListDataSources(request) + response = self.stub.ListDataSources( + request=request, metadata=create_grpc_auth_header(self.auth_config) + ) return [ DataSource.from_proto(data_source) for data_source in response.data_sources @@ -172,22 +155,18 @@ def apply_feature_service( feature_service=feature_service.to_proto(), project=project, commit=commit ) - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_grpc_auth_header(self.auth_config) - self.stub.ApplyFeatureService(request=request, metadata=metadata) - else: - self.stub.ApplyFeatureService(request) + self.stub.ApplyFeatureService( + request=request, metadata=create_grpc_auth_header(self.auth_config) + ) def delete_feature_service(self, name: str, project: str, commit: bool = True): request = RegistryServer_pb2.DeleteFeatureServiceRequest( name=name, project=project, commit=commit ) - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_grpc_auth_header(self.auth_config) - self.stub.DeleteFeatureService(request=request, metadata=metadata) - else: - self.stub.DeleteFeatureService(request) + self.stub.DeleteFeatureService( + request=request, metadata=create_grpc_auth_header(self.auth_config) + ) def get_feature_service( self, name: str, project: str, allow_cache: bool = False @@ -196,11 +175,9 @@ def get_feature_service( name=name, project=project, allow_cache=allow_cache ) - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_grpc_auth_header(self.auth_config) - response = self.stub.GetFeatureService(request=request, metadata=metadata) - else: - response = self.stub.GetFeatureService(request) + response = self.stub.GetFeatureService( + request=request, metadata=create_grpc_auth_header(self.auth_config) + ) return FeatureService.from_proto(response) @@ -214,11 +191,9 @@ def list_feature_services( project=project, allow_cache=allow_cache, tags=tags ) - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_grpc_auth_header(self.auth_config) - response = self.stub.ListFeatureServices(request=request, metadata=metadata) - else: - response = self.stub.ListFeatureServices(request) + response = self.stub.ListFeatureServices( + request=request, metadata=create_grpc_auth_header(self.auth_config) + ) return [ FeatureService.from_proto(feature_service) @@ -249,22 +224,18 @@ def apply_feature_view( commit=commit, ) - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_grpc_auth_header(self.auth_config) - self.stub.ApplyFeatureView(request=request, metadata=metadata) - else: - self.stub.ApplyFeatureView(request) + self.stub.ApplyFeatureView( + request=request, metadata=create_grpc_auth_header(self.auth_config) + ) def delete_feature_view(self, name: str, project: str, commit: bool = True): request = RegistryServer_pb2.DeleteFeatureViewRequest( name=name, project=project, commit=commit ) - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_grpc_auth_header(self.auth_config) - self.stub.DeleteFeatureView(request=request, metadata=metadata) - else: - self.stub.DeleteFeatureView(request) + self.stub.DeleteFeatureView( + request=request, metadata=create_grpc_auth_header(self.auth_config) + ) def get_stream_feature_view( self, name: str, project: str, allow_cache: bool = False @@ -273,13 +244,9 @@ def get_stream_feature_view( name=name, project=project, allow_cache=allow_cache ) - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_grpc_auth_header(self.auth_config) - response = self.stub.GetStreamFeatureView( - request=request, metadata=metadata - ) - else: - response = self.stub.GetStreamFeatureView(request) + response = self.stub.GetStreamFeatureView( + request=request, metadata=create_grpc_auth_header(self.auth_config) + ) return StreamFeatureView.from_proto(response) @@ -293,13 +260,9 @@ def list_stream_feature_views( project=project, allow_cache=allow_cache, tags=tags ) - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_grpc_auth_header(self.auth_config) - response = self.stub.ListStreamFeatureViews( - request=request, metadata=metadata - ) - else: - response = self.stub.ListStreamFeatureViews(request) + response = self.stub.ListStreamFeatureViews( + request=request, metadata=create_grpc_auth_header(self.auth_config) + ) return [ StreamFeatureView.from_proto(stream_feature_view) @@ -313,13 +276,9 @@ def get_on_demand_feature_view( name=name, project=project, allow_cache=allow_cache ) - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_grpc_auth_header(self.auth_config) - response = self.stub.GetOnDemandFeatureView( - request=request, metadata=metadata - ) - else: - response = self.stub.GetOnDemandFeatureView(request) + response = self.stub.GetOnDemandFeatureView( + request=request, metadata=create_grpc_auth_header(self.auth_config) + ) return OnDemandFeatureView.from_proto(response) @@ -333,13 +292,9 @@ def list_on_demand_feature_views( project=project, allow_cache=allow_cache, tags=tags ) - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_grpc_auth_header(self.auth_config) - response = self.stub.ListOnDemandFeatureViews( - request=request, metadata=metadata - ) - else: - response = self.stub.ListOnDemandFeatureViews(request) + response = self.stub.ListOnDemandFeatureViews( + request=request, metadata=create_grpc_auth_header(self.auth_config) + ) return [ OnDemandFeatureView.from_proto(on_demand_feature_view) @@ -353,11 +308,9 @@ def get_feature_view( name=name, project=project, allow_cache=allow_cache ) - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_grpc_auth_header(self.auth_config) - response = self.stub.GetFeatureView(request=request, metadata=metadata) - else: - response = self.stub.GetFeatureView(request) + response = self.stub.GetFeatureView( + request=request, metadata=create_grpc_auth_header(self.auth_config) + ) return FeatureView.from_proto(response) @@ -371,11 +324,9 @@ def list_feature_views( project=project, allow_cache=allow_cache, tags=tags ) - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_grpc_auth_header(self.auth_config) - response = self.stub.ListFeatureViews(request=request, metadata=metadata) - else: - response = self.stub.ListFeatureViews(request) + response = self.stub.ListFeatureViews( + request=request, metadata=create_grpc_auth_header(self.auth_config) + ) return [ FeatureView.from_proto(feature_view) @@ -404,11 +355,9 @@ def apply_materialization( commit=commit, ) - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_grpc_auth_header(self.auth_config) - self.stub.ApplyMaterialization(request=request, metadata=metadata) - else: - self.stub.ApplyMaterialization(request) + self.stub.ApplyMaterialization( + request=request, metadata=create_grpc_auth_header(self.auth_config) + ) def apply_saved_dataset( self, @@ -420,18 +369,18 @@ def apply_saved_dataset( saved_dataset=saved_dataset.to_proto(), project=project, commit=commit ) - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_grpc_auth_header(self.auth_config) - self.stub.ApplyFeatureService(request=request, metadata=metadata) - else: - self.stub.ApplyFeatureService(request) + self.stub.ApplyFeatureService( + request=request, metadata=create_grpc_auth_header(self.auth_config) + ) def delete_saved_dataset(self, name: str, project: str, commit: bool = True): request = RegistryServer_pb2.DeleteSavedDatasetRequest( name=name, project=project, commit=commit ) - self.stub.DeleteSavedDataset(request) + self.stub.DeleteSavedDataset( + request, metadata=create_grpc_auth_header(self.auth_config) + ) def get_saved_dataset( self, name: str, project: str, allow_cache: bool = False @@ -440,11 +389,9 @@ def get_saved_dataset( name=name, project=project, allow_cache=allow_cache ) - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_grpc_auth_header(self.auth_config) - response = self.stub.GetSavedDataset(request=request, metadata=metadata) - else: - response = self.stub.GetSavedDataset(request) + response = self.stub.GetSavedDataset( + request=request, metadata=create_grpc_auth_header(self.auth_config) + ) return SavedDataset.from_proto(response) @@ -458,11 +405,9 @@ def list_saved_datasets( project=project, allow_cache=allow_cache, tags=tags ) - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_grpc_auth_header(self.auth_config) - response = self.stub.ListSavedDatasets(request=request, metadata=metadata) - else: - response = self.stub.ListSavedDatasets(request) + response = self.stub.ListSavedDatasets( + request=request, metadata=create_grpc_auth_header(self.auth_config) + ) return [ SavedDataset.from_proto(saved_dataset) @@ -481,22 +426,18 @@ def apply_validation_reference( commit=commit, ) - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_grpc_auth_header(self.auth_config) - self.stub.ApplyValidationReference(request=request, metadata=metadata) - else: - self.stub.ApplyValidationReference(request) + self.stub.ApplyValidationReference( + request=request, metadata=create_grpc_auth_header(self.auth_config) + ) def delete_validation_reference(self, name: str, project: str, commit: bool = True): request = RegistryServer_pb2.DeleteValidationReferenceRequest( name=name, project=project, commit=commit ) - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_grpc_auth_header(self.auth_config) - self.stub.DeleteValidationReference(request=request, metadata=metadata) - else: - self.stub.DeleteValidationReference(request) + self.stub.DeleteValidationReference( + request=request, metadata=create_grpc_auth_header(self.auth_config) + ) def get_validation_reference( self, name: str, project: str, allow_cache: bool = False @@ -505,13 +446,9 @@ def get_validation_reference( name=name, project=project, allow_cache=allow_cache ) - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_grpc_auth_header(self.auth_config) - response = self.stub.GetValidationReference( - request=request, metadata=metadata - ) - else: - response = self.stub.GetValidationReference(request) + response = self.stub.GetValidationReference( + request=request, metadata=create_grpc_auth_header(self.auth_config) + ) return ValidationReference.from_proto(response) @@ -525,13 +462,9 @@ def list_validation_references( project=project, allow_cache=allow_cache, tags=tags ) - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_grpc_auth_header(self.auth_config) - response = self.stub.ListValidationReferences( - request=request, metadata=metadata - ) - else: - response = self.stub.ListValidationReferences(request) + response = self.stub.ListValidationReferences( + request=request, metadata=create_grpc_auth_header(self.auth_config) + ) return [ ValidationReference.from_proto(validation_reference) @@ -545,11 +478,9 @@ def list_project_metadata( project=project, allow_cache=allow_cache ) - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_grpc_auth_header(self.auth_config) - response = self.stub.ListProjectMetadata(request=request, metadata=metadata) - else: - response = self.stub.ListProjectMetadata(request) + response = self.stub.ListProjectMetadata( + request=request, metadata=create_grpc_auth_header(self.auth_config) + ) return [ProjectMetadata.from_proto(pm) for pm in response.project_metadata] @@ -558,22 +489,18 @@ def update_infra(self, infra: Infra, project: str, commit: bool = True): infra=infra.to_proto(), project=project, commit=commit ) - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_grpc_auth_header(self.auth_config) - self.stub.UpdateInfra(request=request, metadata=metadata) - else: - self.stub.UpdateInfra(request) + self.stub.UpdateInfra( + request=request, metadata=create_grpc_auth_header(self.auth_config) + ) def get_infra(self, project: str, allow_cache: bool = False) -> Infra: request = RegistryServer_pb2.GetInfraRequest( project=project, allow_cache=allow_cache ) - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_grpc_auth_header(self.auth_config) - response = self.stub.GetInfra(request=request, metadata=metadata) - else: - response = self.stub.GetInfra(request) + response = self.stub.GetInfra( + request=request, metadata=create_grpc_auth_header(self.auth_config) + ) return Infra.from_proto(response) @@ -600,22 +527,18 @@ def apply_permission( permission=permission_proto, project=project, commit=commit ) - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_grpc_auth_header(self.auth_config) - self.stub.ApplyPermission(request=request, metadata=metadata) - else: - self.stub.ApplyPermission(request) + self.stub.ApplyPermission( + request=request, metadata=create_grpc_auth_header(self.auth_config) + ) def delete_permission(self, name: str, project: str, commit: bool = True): request = RegistryServer_pb2.DeletePermissionRequest( name=name, project=project, commit=commit ) - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_grpc_auth_header(self.auth_config) - self.stub.DeletePermission(request=request, metadata=metadata) - else: - self.stub.DeletePermission(request) + self.stub.DeletePermission( + request=request, metadata=create_grpc_auth_header(self.auth_config) + ) def get_permission( self, name: str, project: str, allow_cache: bool = False @@ -624,11 +547,9 @@ def get_permission( name=name, project=project, allow_cache=allow_cache ) - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_grpc_auth_header(self.auth_config) - response = self.stub.GetPermission(request=request, metadata=metadata) - else: - response = self.stub.GetPermission(request) + response = self.stub.GetPermission( + request=request, metadata=create_grpc_auth_header(self.auth_config) + ) return Permission.from_proto(response) @@ -642,11 +563,9 @@ def list_permissions( project=project, allow_cache=allow_cache, tags=tags ) - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_grpc_auth_header(self.auth_config) - response = self.stub.ListPermissions(request=request, metadata=metadata) - else: - response = self.stub.ListPermissions(request) + response = self.stub.ListPermissions( + request=request, metadata=create_grpc_auth_header(self.auth_config) + ) return [ Permission.from_proto(permission) for permission in response.permissions @@ -661,11 +580,9 @@ def commit(self): def refresh(self, project: Optional[str] = None): request = RegistryServer_pb2.RefreshRequest(project=str(project)) - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_grpc_auth_header(self.auth_config) - self.stub.Refresh(request=request, metadata=metadata) - else: - self.stub.Refresh(request) + self.stub.Refresh( + request=request, metadata=create_grpc_auth_header(self.auth_config) + ) def teardown(self): pass diff --git a/sdk/python/feast/offline_server.py b/sdk/python/feast/offline_server.py index d7dde99727..c4b090e5b7 100644 --- a/sdk/python/feast/offline_server.py +++ b/sdk/python/feast/offline_server.py @@ -22,7 +22,7 @@ ServerType, init_auth_manager, init_security_manager, - str_to_auth_type, + str_to_auth_manager_type, ) from feast.saved_dataset import SavedDatasetStorage @@ -35,7 +35,7 @@ def __init__(self, store: FeatureStore, location: str, **kwargs): super(OfflineServer, self).__init__( location, middleware=arrowflight_middleware( - str_to_auth_type(store.config.auth_config.type) + str_to_auth_manager_type(store.config.auth_config.type) ), **kwargs, ) @@ -449,7 +449,7 @@ def remove_dummies(fv: FeatureView) -> FeatureView: def _init_auth_manager(store: FeatureStore): - auth_type = str_to_auth_type(store.config.auth_config.type) + auth_type = str_to_auth_manager_type(store.config.auth_config.type) init_security_manager(auth_type=auth_type, fs=store) init_auth_manager( auth_type=auth_type, diff --git a/sdk/python/feast/permissions/client/auth_client_manager.py b/sdk/python/feast/permissions/client/auth_client_manager.py index 9c9fd23b41..310ce8ca6b 100644 --- a/sdk/python/feast/permissions/client/auth_client_manager.py +++ b/sdk/python/feast/permissions/client/auth_client_manager.py @@ -1,5 +1,5 @@ from abc import ABC, abstractmethod -from typing import Tuple +from typing import Optional from feast.permissions.auth.auth_type import AuthType from feast.permissions.auth_model import ( @@ -39,7 +39,12 @@ def get_auth_client_manager(auth_config: AuthConfig) -> AuthenticationClientMana ) -def create_grpc_auth_header(auth_config: AuthConfig) -> Tuple[Tuple[str, str]]: +def create_grpc_auth_header( + auth_config: AuthConfig, +) -> Optional[tuple[tuple[str, str]]]: + if auth_config.type is AuthType.NONE.value: + return None + auth_client_manager = get_auth_client_manager(auth_config) token = auth_client_manager.get_token() diff --git a/sdk/python/feast/permissions/server/arrow.py b/sdk/python/feast/permissions/server/arrow.py index 35bfbed76a..5eba7d0916 100644 --- a/sdk/python/feast/permissions/server/arrow.py +++ b/sdk/python/feast/permissions/server/arrow.py @@ -15,7 +15,7 @@ ) from feast.permissions.security_manager import get_security_manager from feast.permissions.server.utils import ( - AuthType, + AuthManagerType, ) from feast.permissions.user import User @@ -24,7 +24,7 @@ def arrowflight_middleware( - auth_type: AuthType, + auth_type: AuthManagerType, ) -> Optional[dict[str, fl.ServerMiddlewareFactory]]: """ A dictionary with the configured middlewares to support extracting the user details when the authorization manager is defined. @@ -34,7 +34,7 @@ def arrowflight_middleware( dict[str, fl.ServerMiddlewareFactory]: Optional dictionary of middlewares. If the authorization type is set to `NONE`, it returns `None`. """ - if auth_type == AuthType.NONE: + if auth_type == AuthManagerType.NONE: return None return { diff --git a/sdk/python/feast/permissions/server/grpc.py b/sdk/python/feast/permissions/server/grpc.py index 5838d77076..2e1c5d1001 100644 --- a/sdk/python/feast/permissions/server/grpc.py +++ b/sdk/python/feast/permissions/server/grpc.py @@ -8,7 +8,7 @@ get_auth_manager, ) from feast.permissions.server.utils import ( - AuthType, + AuthManagerType, ) logger = logging.getLogger(__name__) @@ -16,7 +16,7 @@ def grpc_interceptors( - auth_type: AuthType, + auth_type: AuthManagerType, ) -> Optional[list[grpc.ServerInterceptor]]: """ A list of the authorization interceptors. @@ -27,7 +27,7 @@ def grpc_interceptors( Returns: list[grpc.ServerInterceptor]: Optional list of interceptors. If the authorization type is set to `NONE`, it returns `None`. """ - if auth_type == AuthType.NONE: + if auth_type == AuthManagerType.NONE: return None return [AuthInterceptor()] diff --git a/sdk/python/feast/permissions/server/utils.py b/sdk/python/feast/permissions/server/utils.py index 7479211450..ee189a6559 100644 --- a/sdk/python/feast/permissions/server/utils.py +++ b/sdk/python/feast/permissions/server/utils.py @@ -11,7 +11,6 @@ AuthManager, set_auth_manager, ) -from feast.permissions.auth.auth_type import AuthType from feast.permissions.auth.kubernetes_token_parser import KubernetesTokenParser from feast.permissions.auth.oidc_token_parser import OidcTokenParser from feast.permissions.auth.token_extractor import TokenExtractor @@ -41,18 +40,28 @@ class ServerType(enum.Enum): GRPC = "grpc" # TODO RBAC: to be completed -def str_to_auth_type(value: str) -> AuthType: - for t in AuthType.__members__.values(): +class AuthManagerType(enum.Enum): + """ + Identify the type of authorization manager. + """ + + NONE = "no_auth" + OIDC = "oidc" + KUBERNETES = "kubernetes" + + +def str_to_auth_manager_type(value: str) -> AuthManagerType: + for t in AuthManagerType.__members__.values(): if t.value.lower() == value.lower(): return t logger.warning( f"Requested unmanaged AuthManagerType of value {value}. Using NONE instead." ) - return AuthType.NONE + return AuthManagerType.NONE -def init_security_manager(auth_type: AuthType, fs: "feast.FeatureStore"): +def init_security_manager(auth_type: AuthManagerType, fs: "feast.FeatureStore"): """ Initialize the global security manager. Must be invoked at Feast server initialization time to create the `SecurityManager` instance. @@ -61,7 +70,7 @@ def init_security_manager(auth_type: AuthType, fs: "feast.FeatureStore"): auth_type: The authorization manager type. registry: The feature store registry. """ - if auth_type == AuthType.NONE: + if auth_type == AuthManagerType.NONE: no_security_manager() else: # TODO permissions from registry @@ -73,7 +82,7 @@ def init_security_manager(auth_type: AuthType, fs: "feast.FeatureStore"): ) -def init_auth_manager(server_type: ServerType, auth_type: AuthType): +def init_auth_manager(server_type: ServerType, auth_type: AuthManagerType): """ Initialize the global authorization manager. Must be invoked at Feast server initialization time to create the `AuthManager` instance. @@ -85,7 +94,7 @@ def init_auth_manager(server_type: ServerType, auth_type: AuthType): Raises: ValueError: If any input argument has an unmanaged value. """ - if auth_type == AuthType.NONE: + if auth_type == AuthManagerType.NONE: set_auth_manager(AllowAll()) else: token_extractor: TokenExtractor @@ -100,9 +109,9 @@ def init_auth_manager(server_type: ServerType, auth_type: AuthType): else: raise ValueError(f"Unmanaged server type {server_type}") - if auth_type == AuthType.KUBERNETES: + if auth_type == AuthManagerType.KUBERNETES: token_parser = KubernetesTokenParser() - elif auth_type == AuthType.OIDC: + elif auth_type == AuthManagerType.OIDC: token_parser = OidcTokenParser() else: raise ValueError(f"Unmanaged authorization manager type {auth_type}") diff --git a/sdk/python/feast/registry_server.py b/sdk/python/feast/registry_server.py index ed23771959..ba28d164b1 100644 --- a/sdk/python/feast/registry_server.py +++ b/sdk/python/feast/registry_server.py @@ -22,7 +22,7 @@ ServerType, init_auth_manager, init_security_manager, - str_to_auth_type, + str_to_auth_manager_type, ) from feast.protos.feast.registry import RegistryServer_pb2, RegistryServer_pb2_grpc from feast.saved_dataset import SavedDataset, ValidationReference @@ -583,7 +583,7 @@ def Proto(self, request, context): def start_server(store: FeatureStore, port: int): - auth_type = str_to_auth_type(store.config.auth_config.type) + auth_type = str_to_auth_manager_type(store.config.auth_config.type) init_security_manager(auth_type=auth_type, fs=store) init_auth_manager( auth_type=auth_type, diff --git a/sdk/python/feast/repo_config.py b/sdk/python/feast/repo_config.py index 74a653434a..92c63b52d6 100644 --- a/sdk/python/feast/repo_config.py +++ b/sdk/python/feast/repo_config.py @@ -334,17 +334,26 @@ def batch_engine(self): @model_validator(mode="before") def _validate_auth_config(cls, values: Any) -> Any: + from feast.permissions.auth_model import AuthConfig + if "auth" in values: allowed_auth_types = AUTH_CONFIGS_CLASS_FOR_TYPE.keys() - if values["auth"].get("type") is None: - raise ValueError( - f"auth configuration is not having authentication type. Possible values={allowed_auth_types}" - ) - elif values["auth"]["type"] not in allowed_auth_types: - raise ValueError( - f'auth configuration is having invalid authentication type={values["auth"]["type"]}. Possible ' - f'values={allowed_auth_types}' - ) + if isinstance(values["auth"], Dict): + if values["auth"].get("type") is None: + raise ValueError( + f"auth configuration is not having authentication type. Possible values={allowed_auth_types}" + ) + elif values["auth"]["type"] not in allowed_auth_types: + raise ValueError( + f'auth configuration is having invalid authentication type={values["auth"]["type"]}. Possible ' + f'values={allowed_auth_types}' + ) + elif isinstance(values["auth"], AuthConfig): + if values["auth"].type not in allowed_auth_types: + raise ValueError( + f'auth configuration is having invalid authentication type={values["auth"].type}. Possible ' + f'values={allowed_auth_types}' + ) return values @model_validator(mode="before") diff --git a/sdk/python/tests/unit/permissions/server/test_utils.py b/sdk/python/tests/unit/permissions/server/test_utils.py index 2b5e7489cb..00047f0135 100644 --- a/sdk/python/tests/unit/permissions/server/test_utils.py +++ b/sdk/python/tests/unit/permissions/server/test_utils.py @@ -1,15 +1,15 @@ import assertpy import pytest -from feast.permissions.server.utils import AuthType, str_to_auth_type +from feast.permissions.server.utils import AuthManagerType, str_to_auth_manager_type @pytest.mark.parametrize( "label, value", - [(t.value, t) for t in AuthType] - + [(t.value.upper(), t) for t in AuthType] - + [(t.value.lower(), t) for t in AuthType] - + [("none", AuthType.NONE)], + [(t.value, t) for t in AuthManagerType] + + [(t.value.upper(), t) for t in AuthManagerType] + + [(t.value.lower(), t) for t in AuthManagerType] + + [("none", AuthManagerType.NONE)], ) def test_str_to_auth_type(label, value): - assertpy.assert_that(str_to_auth_type(label)).is_equal_to(value) + assertpy.assert_that(str_to_auth_manager_type(label)).is_equal_to(value) From dc99e591998a642b50e047635772002f70f5c4d9 Mon Sep 17 00:00:00 2001 From: Theodor Mihalache Date: Fri, 12 Jul 2024 11:01:48 -0400 Subject: [PATCH 064/169] Client module-grpc - Made changes following code review Signed-off-by: Theodor Mihalache Signed-off-by: Abdul Hameed --- sdk/python/feast/infra/registry/remote.py | 78 +++++++++---------- .../permissions/client/auth_client_manager.py | 11 --- sdk/python/feast/permissions/client/utils.py | 17 ++++ 3 files changed, 55 insertions(+), 51 deletions(-) create mode 100644 sdk/python/feast/permissions/client/utils.py diff --git a/sdk/python/feast/infra/registry/remote.py b/sdk/python/feast/infra/registry/remote.py index 971f6f180a..97f4b6e423 100644 --- a/sdk/python/feast/infra/registry/remote.py +++ b/sdk/python/feast/infra/registry/remote.py @@ -19,9 +19,7 @@ AuthConfig, NoAuthConfig, ) -from feast.permissions.client.auth_client_manager import ( - create_grpc_auth_header, -) +from feast.permissions.client.utils import create_auth_header from feast.permissions.permission import Permission from feast.project_metadata import ProjectMetadata from feast.protos.feast.core.Registry_pb2 import Registry as RegistryProto @@ -58,7 +56,7 @@ def apply_entity(self, entity: Entity, project: str, commit: bool = True): ) self.stub.ApplyEntity( - request=request, metadata=create_grpc_auth_header(self.auth_config) + request=request, metadata=create_auth_header(self.auth_config) ) def delete_entity(self, name: str, project: str, commit: bool = True): @@ -67,7 +65,7 @@ def delete_entity(self, name: str, project: str, commit: bool = True): ) self.stub.DeleteEntity( - request=request, metadata=create_grpc_auth_header(self.auth_config) + request=request, metadata=create_auth_header(self.auth_config) ) def get_entity(self, name: str, project: str, allow_cache: bool = False) -> Entity: @@ -76,7 +74,7 @@ def get_entity(self, name: str, project: str, allow_cache: bool = False) -> Enti ) response = self.stub.GetEntity( - request=request, metadata=create_grpc_auth_header(self.auth_config) + request=request, metadata=create_auth_header(self.auth_config) ) return Entity.from_proto(response) @@ -92,7 +90,7 @@ def list_entities( ) response = self.stub.ListEntities( - request=request, metadata=create_grpc_auth_header(self.auth_config) + request=request, metadata=create_auth_header(self.auth_config) ) return [Entity.from_proto(entity) for entity in response.entities] @@ -105,7 +103,7 @@ def apply_data_source( ) self.stub.ApplyDataSource( - request=request, metadata=create_grpc_auth_header(self.auth_config) + request=request, metadata=create_auth_header(self.auth_config) ) def delete_data_source(self, name: str, project: str, commit: bool = True): @@ -114,7 +112,7 @@ def delete_data_source(self, name: str, project: str, commit: bool = True): ) self.stub.DeleteDataSource( - request=request, metadata=create_grpc_auth_header(self.auth_config) + request=request, metadata=create_auth_header(self.auth_config) ) def get_data_source( @@ -125,7 +123,7 @@ def get_data_source( ) response = self.stub.GetDataSource( - request=request, metadata=create_grpc_auth_header(self.auth_config) + request=request, metadata=create_auth_header(self.auth_config) ) return DataSource.from_proto(response) @@ -141,7 +139,7 @@ def list_data_sources( ) response = self.stub.ListDataSources( - request=request, metadata=create_grpc_auth_header(self.auth_config) + request=request, metadata=create_auth_header(self.auth_config) ) return [ @@ -156,7 +154,7 @@ def apply_feature_service( ) self.stub.ApplyFeatureService( - request=request, metadata=create_grpc_auth_header(self.auth_config) + request=request, metadata=create_auth_header(self.auth_config) ) def delete_feature_service(self, name: str, project: str, commit: bool = True): @@ -165,7 +163,7 @@ def delete_feature_service(self, name: str, project: str, commit: bool = True): ) self.stub.DeleteFeatureService( - request=request, metadata=create_grpc_auth_header(self.auth_config) + request=request, metadata=create_auth_header(self.auth_config) ) def get_feature_service( @@ -176,7 +174,7 @@ def get_feature_service( ) response = self.stub.GetFeatureService( - request=request, metadata=create_grpc_auth_header(self.auth_config) + request=request, metadata=create_auth_header(self.auth_config) ) return FeatureService.from_proto(response) @@ -192,7 +190,7 @@ def list_feature_services( ) response = self.stub.ListFeatureServices( - request=request, metadata=create_grpc_auth_header(self.auth_config) + request=request, metadata=create_auth_header(self.auth_config) ) return [ @@ -225,7 +223,7 @@ def apply_feature_view( ) self.stub.ApplyFeatureView( - request=request, metadata=create_grpc_auth_header(self.auth_config) + request=request, metadata=create_auth_header(self.auth_config) ) def delete_feature_view(self, name: str, project: str, commit: bool = True): @@ -234,7 +232,7 @@ def delete_feature_view(self, name: str, project: str, commit: bool = True): ) self.stub.DeleteFeatureView( - request=request, metadata=create_grpc_auth_header(self.auth_config) + request=request, metadata=create_auth_header(self.auth_config) ) def get_stream_feature_view( @@ -245,7 +243,7 @@ def get_stream_feature_view( ) response = self.stub.GetStreamFeatureView( - request=request, metadata=create_grpc_auth_header(self.auth_config) + request=request, metadata=create_auth_header(self.auth_config) ) return StreamFeatureView.from_proto(response) @@ -261,7 +259,7 @@ def list_stream_feature_views( ) response = self.stub.ListStreamFeatureViews( - request=request, metadata=create_grpc_auth_header(self.auth_config) + request=request, metadata=create_auth_header(self.auth_config) ) return [ @@ -277,7 +275,7 @@ def get_on_demand_feature_view( ) response = self.stub.GetOnDemandFeatureView( - request=request, metadata=create_grpc_auth_header(self.auth_config) + request=request, metadata=create_auth_header(self.auth_config) ) return OnDemandFeatureView.from_proto(response) @@ -293,7 +291,7 @@ def list_on_demand_feature_views( ) response = self.stub.ListOnDemandFeatureViews( - request=request, metadata=create_grpc_auth_header(self.auth_config) + request=request, metadata=create_auth_header(self.auth_config) ) return [ @@ -309,7 +307,7 @@ def get_feature_view( ) response = self.stub.GetFeatureView( - request=request, metadata=create_grpc_auth_header(self.auth_config) + request=request, metadata=create_auth_header(self.auth_config) ) return FeatureView.from_proto(response) @@ -325,7 +323,7 @@ def list_feature_views( ) response = self.stub.ListFeatureViews( - request=request, metadata=create_grpc_auth_header(self.auth_config) + request=request, metadata=create_auth_header(self.auth_config) ) return [ @@ -356,7 +354,7 @@ def apply_materialization( ) self.stub.ApplyMaterialization( - request=request, metadata=create_grpc_auth_header(self.auth_config) + request=request, metadata=create_auth_header(self.auth_config) ) def apply_saved_dataset( @@ -370,7 +368,7 @@ def apply_saved_dataset( ) self.stub.ApplyFeatureService( - request=request, metadata=create_grpc_auth_header(self.auth_config) + request=request, metadata=create_auth_header(self.auth_config) ) def delete_saved_dataset(self, name: str, project: str, commit: bool = True): @@ -379,7 +377,7 @@ def delete_saved_dataset(self, name: str, project: str, commit: bool = True): ) self.stub.DeleteSavedDataset( - request, metadata=create_grpc_auth_header(self.auth_config) + request, metadata=create_auth_header(self.auth_config) ) def get_saved_dataset( @@ -390,7 +388,7 @@ def get_saved_dataset( ) response = self.stub.GetSavedDataset( - request=request, metadata=create_grpc_auth_header(self.auth_config) + request=request, metadata=create_auth_header(self.auth_config) ) return SavedDataset.from_proto(response) @@ -406,7 +404,7 @@ def list_saved_datasets( ) response = self.stub.ListSavedDatasets( - request=request, metadata=create_grpc_auth_header(self.auth_config) + request=request, metadata=create_auth_header(self.auth_config) ) return [ @@ -427,7 +425,7 @@ def apply_validation_reference( ) self.stub.ApplyValidationReference( - request=request, metadata=create_grpc_auth_header(self.auth_config) + request=request, metadata=create_auth_header(self.auth_config) ) def delete_validation_reference(self, name: str, project: str, commit: bool = True): @@ -436,7 +434,7 @@ def delete_validation_reference(self, name: str, project: str, commit: bool = Tr ) self.stub.DeleteValidationReference( - request=request, metadata=create_grpc_auth_header(self.auth_config) + request=request, metadata=create_auth_header(self.auth_config) ) def get_validation_reference( @@ -447,7 +445,7 @@ def get_validation_reference( ) response = self.stub.GetValidationReference( - request=request, metadata=create_grpc_auth_header(self.auth_config) + request=request, metadata=create_auth_header(self.auth_config) ) return ValidationReference.from_proto(response) @@ -463,7 +461,7 @@ def list_validation_references( ) response = self.stub.ListValidationReferences( - request=request, metadata=create_grpc_auth_header(self.auth_config) + request=request, metadata=create_auth_header(self.auth_config) ) return [ @@ -479,7 +477,7 @@ def list_project_metadata( ) response = self.stub.ListProjectMetadata( - request=request, metadata=create_grpc_auth_header(self.auth_config) + request=request, metadata=create_auth_header(self.auth_config) ) return [ProjectMetadata.from_proto(pm) for pm in response.project_metadata] @@ -490,7 +488,7 @@ def update_infra(self, infra: Infra, project: str, commit: bool = True): ) self.stub.UpdateInfra( - request=request, metadata=create_grpc_auth_header(self.auth_config) + request=request, metadata=create_auth_header(self.auth_config) ) def get_infra(self, project: str, allow_cache: bool = False) -> Infra: @@ -499,7 +497,7 @@ def get_infra(self, project: str, allow_cache: bool = False) -> Infra: ) response = self.stub.GetInfra( - request=request, metadata=create_grpc_auth_header(self.auth_config) + request=request, metadata=create_auth_header(self.auth_config) ) return Infra.from_proto(response) @@ -528,7 +526,7 @@ def apply_permission( ) self.stub.ApplyPermission( - request=request, metadata=create_grpc_auth_header(self.auth_config) + request=request, metadata=create_auth_header(self.auth_config) ) def delete_permission(self, name: str, project: str, commit: bool = True): @@ -537,7 +535,7 @@ def delete_permission(self, name: str, project: str, commit: bool = True): ) self.stub.DeletePermission( - request=request, metadata=create_grpc_auth_header(self.auth_config) + request=request, metadata=create_auth_header(self.auth_config) ) def get_permission( @@ -548,7 +546,7 @@ def get_permission( ) response = self.stub.GetPermission( - request=request, metadata=create_grpc_auth_header(self.auth_config) + request=request, metadata=create_auth_header(self.auth_config) ) return Permission.from_proto(response) @@ -564,7 +562,7 @@ def list_permissions( ) response = self.stub.ListPermissions( - request=request, metadata=create_grpc_auth_header(self.auth_config) + request=request, metadata=create_auth_header(self.auth_config) ) return [ @@ -581,7 +579,7 @@ def refresh(self, project: Optional[str] = None): request = RegistryServer_pb2.RefreshRequest(project=str(project)) self.stub.Refresh( - request=request, metadata=create_grpc_auth_header(self.auth_config) + request=request, metadata=create_auth_header(self.auth_config) ) def teardown(self): diff --git a/sdk/python/feast/permissions/client/auth_client_manager.py b/sdk/python/feast/permissions/client/auth_client_manager.py index 310ce8ca6b..a6d2f3b1bc 100644 --- a/sdk/python/feast/permissions/client/auth_client_manager.py +++ b/sdk/python/feast/permissions/client/auth_client_manager.py @@ -1,5 +1,4 @@ from abc import ABC, abstractmethod -from typing import Optional from feast.permissions.auth.auth_type import AuthType from feast.permissions.auth_model import ( @@ -39,13 +38,3 @@ def get_auth_client_manager(auth_config: AuthConfig) -> AuthenticationClientMana ) -def create_grpc_auth_header( - auth_config: AuthConfig, -) -> Optional[tuple[tuple[str, str]]]: - if auth_config.type is AuthType.NONE.value: - return None - - auth_client_manager = get_auth_client_manager(auth_config) - token = auth_client_manager.get_token() - - return (("authorization", "Bearer " + token),) diff --git a/sdk/python/feast/permissions/client/utils.py b/sdk/python/feast/permissions/client/utils.py new file mode 100644 index 0000000000..ad0a6e7af4 --- /dev/null +++ b/sdk/python/feast/permissions/client/utils.py @@ -0,0 +1,17 @@ +from typing import Optional + +from feast.permissions.auth.auth_type import AuthType +from feast.permissions.auth_model import AuthConfig +from feast.permissions.client.auth_client_manager import get_auth_client_manager + + +def create_auth_header( + auth_config: AuthConfig, +) -> Optional[tuple[tuple[str, str]]]: + if auth_config.type is AuthType.NONE.value: + return None + + auth_client_manager = get_auth_client_manager(auth_config) + token = auth_client_manager.get_token() + + return (("authorization", "Bearer " + token),) From aaeb7b7820fdeb6fb453f1a738f6dafdf892da79 Mon Sep 17 00:00:00 2001 From: Theodor Mihalache Date: Fri, 12 Jul 2024 12:03:07 -0400 Subject: [PATCH 065/169] Client module-grpc - Made changes following code review Signed-off-by: Theodor Mihalache Signed-off-by: Abdul Hameed --- sdk/python/feast/infra/registry/remote.py | 309 +++++++++++------- .../permissions/client/auth_client_manager.py | 2 - sdk/python/feast/permissions/client/utils.py | 8 +- 3 files changed, 198 insertions(+), 121 deletions(-) diff --git a/sdk/python/feast/infra/registry/remote.py b/sdk/python/feast/infra/registry/remote.py index 97f4b6e423..7f20167e36 100644 --- a/sdk/python/feast/infra/registry/remote.py +++ b/sdk/python/feast/infra/registry/remote.py @@ -15,11 +15,14 @@ from feast.infra.infra_object import Infra from feast.infra.registry.base_registry import BaseRegistry from feast.on_demand_feature_view import OnDemandFeatureView +from feast.permissions.auth.auth_type import AuthType from feast.permissions.auth_model import ( AuthConfig, NoAuthConfig, ) -from feast.permissions.client.utils import create_auth_header +from feast.permissions.client.utils import ( + create_auth_header, +) from feast.permissions.permission import Permission from feast.project_metadata import ProjectMetadata from feast.protos.feast.core.Registry_pb2 import Registry as RegistryProto @@ -55,27 +58,33 @@ def apply_entity(self, entity: Entity, project: str, commit: bool = True): entity=entity.to_proto(), project=project, commit=commit ) - self.stub.ApplyEntity( - request=request, metadata=create_auth_header(self.auth_config) - ) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_auth_header(self.auth_config) + self.stub.ApplyEntity(request=request, metadata=metadata) + else: + self.stub.ApplyEntity(request) def delete_entity(self, name: str, project: str, commit: bool = True): request = RegistryServer_pb2.DeleteEntityRequest( name=name, project=project, commit=commit ) - self.stub.DeleteEntity( - request=request, metadata=create_auth_header(self.auth_config) - ) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_auth_header(self.auth_config) + self.stub.DeleteEntity(request=request, metadata=metadata) + else: + self.stub.DeleteEntity(request) def get_entity(self, name: str, project: str, allow_cache: bool = False) -> Entity: request = RegistryServer_pb2.GetEntityRequest( name=name, project=project, allow_cache=allow_cache ) - response = self.stub.GetEntity( - request=request, metadata=create_auth_header(self.auth_config) - ) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_auth_header(self.auth_config) + response = self.stub.GetEntity(request=request, metadata=metadata) + else: + response = self.stub.GetEntity(request) return Entity.from_proto(response) @@ -89,9 +98,11 @@ def list_entities( project=project, allow_cache=allow_cache, tags=tags ) - response = self.stub.ListEntities( - request=request, metadata=create_auth_header(self.auth_config) - ) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_auth_header(self.auth_config) + response = self.stub.ListEntities(request=request, metadata=metadata) + else: + response = self.stub.ListEntities(request) return [Entity.from_proto(entity) for entity in response.entities] @@ -102,18 +113,22 @@ def apply_data_source( data_source=data_source.to_proto(), project=project, commit=commit ) - self.stub.ApplyDataSource( - request=request, metadata=create_auth_header(self.auth_config) - ) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_auth_header(self.auth_config) + self.stub.ApplyDataSource(request=request, metadata=metadata) + else: + self.stub.ApplyDataSource(request) def delete_data_source(self, name: str, project: str, commit: bool = True): request = RegistryServer_pb2.DeleteDataSourceRequest( name=name, project=project, commit=commit ) - self.stub.DeleteDataSource( - request=request, metadata=create_auth_header(self.auth_config) - ) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_auth_header(self.auth_config) + self.stub.DeleteDataSource(request=request, metadata=metadata) + else: + self.stub.DeleteDataSource(request) def get_data_source( self, name: str, project: str, allow_cache: bool = False @@ -122,9 +137,11 @@ def get_data_source( name=name, project=project, allow_cache=allow_cache ) - response = self.stub.GetDataSource( - request=request, metadata=create_auth_header(self.auth_config) - ) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_auth_header(self.auth_config) + response = self.stub.GetDataSource(request=request, metadata=metadata) + else: + response = self.stub.GetDataSource(request) return DataSource.from_proto(response) @@ -138,9 +155,11 @@ def list_data_sources( project=project, allow_cache=allow_cache, tags=tags ) - response = self.stub.ListDataSources( - request=request, metadata=create_auth_header(self.auth_config) - ) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_auth_header(self.auth_config) + response = self.stub.ListDataSources(request=request, metadata=metadata) + else: + response = self.stub.ListDataSources(request) return [ DataSource.from_proto(data_source) for data_source in response.data_sources @@ -153,18 +172,22 @@ def apply_feature_service( feature_service=feature_service.to_proto(), project=project, commit=commit ) - self.stub.ApplyFeatureService( - request=request, metadata=create_auth_header(self.auth_config) - ) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_auth_header(self.auth_config) + self.stub.ApplyFeatureService(request=request, metadata=metadata) + else: + self.stub.ApplyFeatureService(request) def delete_feature_service(self, name: str, project: str, commit: bool = True): request = RegistryServer_pb2.DeleteFeatureServiceRequest( name=name, project=project, commit=commit ) - self.stub.DeleteFeatureService( - request=request, metadata=create_auth_header(self.auth_config) - ) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_auth_header(self.auth_config) + self.stub.DeleteFeatureService(request=request, metadata=metadata) + else: + self.stub.DeleteFeatureService(request) def get_feature_service( self, name: str, project: str, allow_cache: bool = False @@ -173,9 +196,11 @@ def get_feature_service( name=name, project=project, allow_cache=allow_cache ) - response = self.stub.GetFeatureService( - request=request, metadata=create_auth_header(self.auth_config) - ) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_auth_header(self.auth_config) + response = self.stub.GetFeatureService(request=request, metadata=metadata) + else: + response = self.stub.GetFeatureService(request) return FeatureService.from_proto(response) @@ -189,9 +214,11 @@ def list_feature_services( project=project, allow_cache=allow_cache, tags=tags ) - response = self.stub.ListFeatureServices( - request=request, metadata=create_auth_header(self.auth_config) - ) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_auth_header(self.auth_config) + response = self.stub.ListFeatureServices(request=request, metadata=metadata) + else: + response = self.stub.ListFeatureServices(request) return [ FeatureService.from_proto(feature_service) @@ -222,18 +249,22 @@ def apply_feature_view( commit=commit, ) - self.stub.ApplyFeatureView( - request=request, metadata=create_auth_header(self.auth_config) - ) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_auth_header(self.auth_config) + self.stub.ApplyFeatureView(request=request, metadata=metadata) + else: + self.stub.ApplyFeatureView(request) def delete_feature_view(self, name: str, project: str, commit: bool = True): request = RegistryServer_pb2.DeleteFeatureViewRequest( name=name, project=project, commit=commit ) - self.stub.DeleteFeatureView( - request=request, metadata=create_auth_header(self.auth_config) - ) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_auth_header(self.auth_config) + self.stub.DeleteFeatureView(request=request, metadata=metadata) + else: + self.stub.DeleteFeatureView(request) def get_stream_feature_view( self, name: str, project: str, allow_cache: bool = False @@ -242,9 +273,13 @@ def get_stream_feature_view( name=name, project=project, allow_cache=allow_cache ) - response = self.stub.GetStreamFeatureView( - request=request, metadata=create_auth_header(self.auth_config) - ) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_auth_header(self.auth_config) + response = self.stub.GetStreamFeatureView( + request=request, metadata=metadata + ) + else: + response = self.stub.GetStreamFeatureView(request) return StreamFeatureView.from_proto(response) @@ -258,9 +293,13 @@ def list_stream_feature_views( project=project, allow_cache=allow_cache, tags=tags ) - response = self.stub.ListStreamFeatureViews( - request=request, metadata=create_auth_header(self.auth_config) - ) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_auth_header(self.auth_config) + response = self.stub.ListStreamFeatureViews( + request=request, metadata=metadata + ) + else: + response = self.stub.ListStreamFeatureViews(request) return [ StreamFeatureView.from_proto(stream_feature_view) @@ -274,9 +313,13 @@ def get_on_demand_feature_view( name=name, project=project, allow_cache=allow_cache ) - response = self.stub.GetOnDemandFeatureView( - request=request, metadata=create_auth_header(self.auth_config) - ) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_auth_header(self.auth_config) + response = self.stub.GetOnDemandFeatureView( + request=request, metadata=metadata + ) + else: + response = self.stub.GetOnDemandFeatureView(request) return OnDemandFeatureView.from_proto(response) @@ -290,9 +333,13 @@ def list_on_demand_feature_views( project=project, allow_cache=allow_cache, tags=tags ) - response = self.stub.ListOnDemandFeatureViews( - request=request, metadata=create_auth_header(self.auth_config) - ) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_auth_header(self.auth_config) + response = self.stub.ListOnDemandFeatureViews( + request=request, metadata=metadata + ) + else: + response = self.stub.ListOnDemandFeatureViews(request) return [ OnDemandFeatureView.from_proto(on_demand_feature_view) @@ -306,9 +353,11 @@ def get_feature_view( name=name, project=project, allow_cache=allow_cache ) - response = self.stub.GetFeatureView( - request=request, metadata=create_auth_header(self.auth_config) - ) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_auth_header(self.auth_config) + response = self.stub.GetFeatureView(request=request, metadata=metadata) + else: + response = self.stub.GetFeatureView(request) return FeatureView.from_proto(response) @@ -322,9 +371,11 @@ def list_feature_views( project=project, allow_cache=allow_cache, tags=tags ) - response = self.stub.ListFeatureViews( - request=request, metadata=create_auth_header(self.auth_config) - ) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_auth_header(self.auth_config) + response = self.stub.ListFeatureViews(request=request, metadata=metadata) + else: + response = self.stub.ListFeatureViews(request) return [ FeatureView.from_proto(feature_view) @@ -353,9 +404,11 @@ def apply_materialization( commit=commit, ) - self.stub.ApplyMaterialization( - request=request, metadata=create_auth_header(self.auth_config) - ) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_auth_header(self.auth_config) + self.stub.ApplyMaterialization(request=request, metadata=metadata) + else: + self.stub.ApplyMaterialization(request) def apply_saved_dataset( self, @@ -367,18 +420,18 @@ def apply_saved_dataset( saved_dataset=saved_dataset.to_proto(), project=project, commit=commit ) - self.stub.ApplyFeatureService( - request=request, metadata=create_auth_header(self.auth_config) - ) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_auth_header(self.auth_config) + self.stub.ApplyFeatureService(request=request, metadata=metadata) + else: + self.stub.ApplyFeatureService(request) def delete_saved_dataset(self, name: str, project: str, commit: bool = True): request = RegistryServer_pb2.DeleteSavedDatasetRequest( name=name, project=project, commit=commit ) - self.stub.DeleteSavedDataset( - request, metadata=create_auth_header(self.auth_config) - ) + self.stub.DeleteSavedDataset(request) def get_saved_dataset( self, name: str, project: str, allow_cache: bool = False @@ -387,9 +440,11 @@ def get_saved_dataset( name=name, project=project, allow_cache=allow_cache ) - response = self.stub.GetSavedDataset( - request=request, metadata=create_auth_header(self.auth_config) - ) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_auth_header(self.auth_config) + response = self.stub.GetSavedDataset(request=request, metadata=metadata) + else: + response = self.stub.GetSavedDataset(request) return SavedDataset.from_proto(response) @@ -403,9 +458,11 @@ def list_saved_datasets( project=project, allow_cache=allow_cache, tags=tags ) - response = self.stub.ListSavedDatasets( - request=request, metadata=create_auth_header(self.auth_config) - ) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_auth_header(self.auth_config) + response = self.stub.ListSavedDatasets(request=request, metadata=metadata) + else: + response = self.stub.ListSavedDatasets(request) return [ SavedDataset.from_proto(saved_dataset) @@ -424,18 +481,22 @@ def apply_validation_reference( commit=commit, ) - self.stub.ApplyValidationReference( - request=request, metadata=create_auth_header(self.auth_config) - ) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_auth_header(self.auth_config) + self.stub.ApplyValidationReference(request=request, metadata=metadata) + else: + self.stub.ApplyValidationReference(request) def delete_validation_reference(self, name: str, project: str, commit: bool = True): request = RegistryServer_pb2.DeleteValidationReferenceRequest( name=name, project=project, commit=commit ) - self.stub.DeleteValidationReference( - request=request, metadata=create_auth_header(self.auth_config) - ) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_auth_header(self.auth_config) + self.stub.DeleteValidationReference(request=request, metadata=metadata) + else: + self.stub.DeleteValidationReference(request) def get_validation_reference( self, name: str, project: str, allow_cache: bool = False @@ -444,9 +505,13 @@ def get_validation_reference( name=name, project=project, allow_cache=allow_cache ) - response = self.stub.GetValidationReference( - request=request, metadata=create_auth_header(self.auth_config) - ) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_auth_header(self.auth_config) + response = self.stub.GetValidationReference( + request=request, metadata=metadata + ) + else: + response = self.stub.GetValidationReference(request) return ValidationReference.from_proto(response) @@ -460,9 +525,13 @@ def list_validation_references( project=project, allow_cache=allow_cache, tags=tags ) - response = self.stub.ListValidationReferences( - request=request, metadata=create_auth_header(self.auth_config) - ) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_auth_header(self.auth_config) + response = self.stub.ListValidationReferences( + request=request, metadata=metadata + ) + else: + response = self.stub.ListValidationReferences(request) return [ ValidationReference.from_proto(validation_reference) @@ -476,9 +545,11 @@ def list_project_metadata( project=project, allow_cache=allow_cache ) - response = self.stub.ListProjectMetadata( - request=request, metadata=create_auth_header(self.auth_config) - ) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_auth_header(self.auth_config) + response = self.stub.ListProjectMetadata(request=request, metadata=metadata) + else: + response = self.stub.ListProjectMetadata(request) return [ProjectMetadata.from_proto(pm) for pm in response.project_metadata] @@ -487,18 +558,22 @@ def update_infra(self, infra: Infra, project: str, commit: bool = True): infra=infra.to_proto(), project=project, commit=commit ) - self.stub.UpdateInfra( - request=request, metadata=create_auth_header(self.auth_config) - ) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_auth_header(self.auth_config) + self.stub.UpdateInfra(request=request, metadata=metadata) + else: + self.stub.UpdateInfra(request) def get_infra(self, project: str, allow_cache: bool = False) -> Infra: request = RegistryServer_pb2.GetInfraRequest( project=project, allow_cache=allow_cache ) - response = self.stub.GetInfra( - request=request, metadata=create_auth_header(self.auth_config) - ) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_auth_header(self.auth_config) + response = self.stub.GetInfra(request=request, metadata=metadata) + else: + response = self.stub.GetInfra(request) return Infra.from_proto(response) @@ -525,18 +600,22 @@ def apply_permission( permission=permission_proto, project=project, commit=commit ) - self.stub.ApplyPermission( - request=request, metadata=create_auth_header(self.auth_config) - ) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_auth_header(self.auth_config) + self.stub.ApplyPermission(request=request, metadata=metadata) + else: + self.stub.ApplyPermission(request) def delete_permission(self, name: str, project: str, commit: bool = True): request = RegistryServer_pb2.DeletePermissionRequest( name=name, project=project, commit=commit ) - self.stub.DeletePermission( - request=request, metadata=create_auth_header(self.auth_config) - ) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_auth_header(self.auth_config) + self.stub.DeletePermission(request=request, metadata=metadata) + else: + self.stub.DeletePermission(request) def get_permission( self, name: str, project: str, allow_cache: bool = False @@ -545,9 +624,11 @@ def get_permission( name=name, project=project, allow_cache=allow_cache ) - response = self.stub.GetPermission( - request=request, metadata=create_auth_header(self.auth_config) - ) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_auth_header(self.auth_config) + response = self.stub.GetPermission(request=request, metadata=metadata) + else: + response = self.stub.GetPermission(request) return Permission.from_proto(response) @@ -561,9 +642,11 @@ def list_permissions( project=project, allow_cache=allow_cache, tags=tags ) - response = self.stub.ListPermissions( - request=request, metadata=create_auth_header(self.auth_config) - ) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_auth_header(self.auth_config) + response = self.stub.ListPermissions(request=request, metadata=metadata) + else: + response = self.stub.ListPermissions(request) return [ Permission.from_proto(permission) for permission in response.permissions @@ -578,9 +661,11 @@ def commit(self): def refresh(self, project: Optional[str] = None): request = RegistryServer_pb2.RefreshRequest(project=str(project)) - self.stub.Refresh( - request=request, metadata=create_auth_header(self.auth_config) - ) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_auth_header(self.auth_config) + self.stub.Refresh(request=request, metadata=metadata) + else: + self.stub.Refresh(request) def teardown(self): pass diff --git a/sdk/python/feast/permissions/client/auth_client_manager.py b/sdk/python/feast/permissions/client/auth_client_manager.py index a6d2f3b1bc..ef8a9715ec 100644 --- a/sdk/python/feast/permissions/client/auth_client_manager.py +++ b/sdk/python/feast/permissions/client/auth_client_manager.py @@ -36,5 +36,3 @@ def get_auth_client_manager(auth_config: AuthConfig) -> AuthenticationClientMana raise RuntimeError( f"No Auth client manager implemented for the auth type:${auth_config.type}" ) - - diff --git a/sdk/python/feast/permissions/client/utils.py b/sdk/python/feast/permissions/client/utils.py index ad0a6e7af4..334b2a91d5 100644 --- a/sdk/python/feast/permissions/client/utils.py +++ b/sdk/python/feast/permissions/client/utils.py @@ -1,16 +1,10 @@ -from typing import Optional - -from feast.permissions.auth.auth_type import AuthType from feast.permissions.auth_model import AuthConfig from feast.permissions.client.auth_client_manager import get_auth_client_manager def create_auth_header( auth_config: AuthConfig, -) -> Optional[tuple[tuple[str, str]]]: - if auth_config.type is AuthType.NONE.value: - return None - +) -> tuple[tuple[str, str]]: auth_client_manager = get_auth_client_manager(auth_config) token = auth_client_manager.get_token() From 23ac8a62eab498acc2135be0d570cf7bb3f63e3e Mon Sep 17 00:00:00 2001 From: Abdul Hameed Date: Thu, 11 Jul 2024 17:26:02 -0400 Subject: [PATCH 066/169] added auth configuration for arrow flight client Signed-off-by: Abdul Hameed --- .../feast/infra/offline_stores/remote.py | 50 +++++++++++++++---- .../offline_stores/test_offline_store.py | 2 + 2 files changed, 42 insertions(+), 10 deletions(-) diff --git a/sdk/python/feast/infra/offline_stores/remote.py b/sdk/python/feast/infra/offline_stores/remote.py index dc657017d9..4fdb7ef390 100644 --- a/sdk/python/feast/infra/offline_stores/remote.py +++ b/sdk/python/feast/infra/offline_stores/remote.py @@ -27,6 +27,7 @@ RetrievalMetadata, ) from feast.infra.registry.base_registry import BaseRegistry +from feast.permissions.client.auth_client_manager import create_flight_call_options from feast.repo_config import FeastConfigBaseModel, RepoConfig from feast.saved_dataset import SavedDatasetStorage @@ -46,6 +47,7 @@ class RemoteRetrievalJob(RetrievalJob): def __init__( self, client: fl.FlightClient, + options: pa.flight.FlightCallOptions, api: str, api_parameters: Dict[str, Any], entity_df: Union[pd.DataFrame, str] = None, @@ -54,6 +56,7 @@ def __init__( ): # Initialize the client connection self.client = client + self.options = options self.api = api self.api_parameters = api_parameters self.entity_df = entity_df @@ -69,7 +72,12 @@ def _to_df_internal(self, timeout: Optional[int] = None) -> pd.DataFrame: # This is where do_get service is invoked def _to_arrow_internal(self, timeout: Optional[int] = None) -> pa.Table: return _send_retrieve_remote( - self.api, self.api_parameters, self.entity_df, self.table, self.client + self.api, + self.api_parameters, + self.entity_df, + self.table, + self.client, + self.options, ) @property @@ -110,6 +118,7 @@ def persist( api=RemoteRetrievalJob.persist.__name__, api_parameters=api_parameters, client=self.client, + options=self.options, table=self.table, entity_df=self.entity_df, ) @@ -130,6 +139,7 @@ def get_historical_features( # Initialize the client connection client = RemoteOfflineStore.init_client(config) + options = create_flight_call_options(config.auth_config) feature_view_names = [fv.name for fv in feature_views] name_aliases = [fv.projection.name_alias for fv in feature_views] @@ -144,6 +154,7 @@ def get_historical_features( return RemoteRetrievalJob( client=client, + options=options, api=OfflineStore.get_historical_features.__name__, api_parameters=api_parameters, entity_df=entity_df, @@ -164,6 +175,7 @@ def pull_all_from_table_or_query( # Initialize the client connection client = RemoteOfflineStore.init_client(config) + options = create_flight_call_options(config.auth_config) api_parameters = { "data_source_name": data_source.name, @@ -176,6 +188,7 @@ def pull_all_from_table_or_query( return RemoteRetrievalJob( client=client, + options=options, api=OfflineStore.pull_all_from_table_or_query.__name__, api_parameters=api_parameters, ) @@ -195,6 +208,7 @@ def pull_latest_from_table_or_query( # Initialize the client connection client = RemoteOfflineStore.init_client(config) + options = create_flight_call_options(config.auth_config) api_parameters = { "data_source_name": data_source.name, @@ -208,6 +222,7 @@ def pull_latest_from_table_or_query( return RemoteRetrievalJob( client=client, + options=options, api=OfflineStore.pull_latest_from_table_or_query.__name__, api_parameters=api_parameters, ) @@ -228,6 +243,7 @@ def write_logged_features( # Initialize the client connection client = RemoteOfflineStore.init_client(config) + options = create_flight_call_options(config.auth_config) api_parameters = { "feature_service_name": source._feature_service.name, @@ -237,6 +253,7 @@ def write_logged_features( api=OfflineStore.write_logged_features.__name__, api_parameters=api_parameters, client=client, + options=options, table=data, entity_df=None, ) @@ -252,6 +269,7 @@ def offline_write_batch( # Initialize the client connection client = RemoteOfflineStore.init_client(config) + options = create_flight_call_options(config.auth_config) feature_view_names = [feature_view.name] name_aliases = [feature_view.projection.name_alias] @@ -266,6 +284,7 @@ def offline_write_batch( api=OfflineStore.offline_write_batch.__name__, api_parameters=api_parameters, client=client, + options=options, table=table, entity_df=None, ) @@ -330,15 +349,27 @@ def _send_retrieve_remote( entity_df: Union[pd.DataFrame, str], table: pa.Table, client: fl.FlightClient, + options: pa.flight.FlightCallOptions, ): - command_descriptor = _call_put(api, api_parameters, client, entity_df, table) - return _call_get(client, command_descriptor) + command_descriptor = _call_put( + api, + api_parameters, + client, + options, + entity_df, + table, + ) + return _call_get(client, options, command_descriptor) -def _call_get(client: fl.FlightClient, command_descriptor: fl.FlightDescriptor): +def _call_get( + client: fl.FlightClient, + options: pa.flight.FlightCallOptions, + command_descriptor: fl.FlightDescriptor, +): flight = client.get_flight_info(command_descriptor) ticket = flight.endpoints[0].ticket - reader = client.do_get(ticket) + reader = client.do_get(ticket, options) return reader.read_all() @@ -346,6 +377,7 @@ def _call_put( api: str, api_parameters: Dict[str, Any], client: fl.FlightClient, + options: pa.flight.FlightCallOptions, entity_df: Union[pd.DataFrame, str], table: pa.Table, ): @@ -365,7 +397,7 @@ def _call_put( ) ) - _put_parameters(command_descriptor, entity_df, table, client) + _put_parameters(command_descriptor, entity_df, table, client, options) return command_descriptor @@ -374,6 +406,7 @@ def _put_parameters( entity_df: Union[pd.DataFrame, str], table: pa.Table, client: fl.FlightClient, + options: pa.flight.FlightCallOptions, ): updatedTable: pa.Table @@ -384,10 +417,7 @@ def _put_parameters( else: updatedTable = _create_empty_table() - writer, _ = client.do_put( - command_descriptor, - updatedTable.schema, - ) + writer, _ = client.do_put(command_descriptor, updatedTable.schema, options) writer.write_table(updatedTable) writer.close() diff --git a/sdk/python/tests/unit/infra/offline_stores/test_offline_store.py b/sdk/python/tests/unit/infra/offline_stores/test_offline_store.py index 6d5eeb90c7..dea5304ff4 100644 --- a/sdk/python/tests/unit/infra/offline_stores/test_offline_store.py +++ b/sdk/python/tests/unit/infra/offline_stores/test_offline_store.py @@ -3,6 +3,7 @@ import pandas as pd import pyarrow +import pyarrow.flight as fl import pytest from feast.infra.offline_stores.contrib.athena_offline_store.athena import ( @@ -215,6 +216,7 @@ def retrieval_job(request, environment): return RemoteRetrievalJob( client=MagicMock(), + options=fl.FlightCallOptions(), api_parameters={ "str": "str", }, From c7e92a003e19230e86112a098ab5b8e946fc0230 Mon Sep 17 00:00:00 2001 From: Theodor Mihalache Date: Fri, 12 Jul 2024 12:07:39 -0400 Subject: [PATCH 067/169] Client module-grpc - Made changes following code review Signed-off-by: Theodor Mihalache Signed-off-by: Abdul Hameed --- sdk/python/feast/infra/offline_stores/remote.py | 2 +- sdk/python/feast/permissions/client/utils.py | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/sdk/python/feast/infra/offline_stores/remote.py b/sdk/python/feast/infra/offline_stores/remote.py index 4fdb7ef390..f24afca371 100644 --- a/sdk/python/feast/infra/offline_stores/remote.py +++ b/sdk/python/feast/infra/offline_stores/remote.py @@ -27,7 +27,7 @@ RetrievalMetadata, ) from feast.infra.registry.base_registry import BaseRegistry -from feast.permissions.client.auth_client_manager import create_flight_call_options +from feast.permissions.client.utils import create_flight_call_options from feast.repo_config import FeastConfigBaseModel, RepoConfig from feast.saved_dataset import SavedDatasetStorage diff --git a/sdk/python/feast/permissions/client/utils.py b/sdk/python/feast/permissions/client/utils.py index 334b2a91d5..13fa23726b 100644 --- a/sdk/python/feast/permissions/client/utils.py +++ b/sdk/python/feast/permissions/client/utils.py @@ -1,3 +1,6 @@ +import pyarrow.flight as fl + +from feast.permissions.auth.auth_type import AuthType from feast.permissions.auth_model import AuthConfig from feast.permissions.client.auth_client_manager import get_auth_client_manager @@ -9,3 +12,10 @@ def create_auth_header( token = auth_client_manager.get_token() return (("authorization", "Bearer " + token),) + + +def create_flight_call_options(auth_config: AuthConfig) -> fl.FlightCallOptions: + if auth_config.type != AuthType.NONE.value: + headers = create_auth_header(auth_config) + return fl.FlightCallOptions(headers=headers) + return fl.FlightCallOptions() From 77abd12687e1b0893f2100c2a4cb1efb777e5de3 Mon Sep 17 00:00:00 2001 From: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Date: Fri, 12 Jul 2024 09:05:31 +0200 Subject: [PATCH 068/169] fix linter Signed-off-by: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Signed-off-by: Abdul Hameed --- sdk/python/feast/registry_server.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/sdk/python/feast/registry_server.py b/sdk/python/feast/registry_server.py index ba28d164b1..78e39d53d6 100644 --- a/sdk/python/feast/registry_server.py +++ b/sdk/python/feast/registry_server.py @@ -582,17 +582,17 @@ def Proto(self, request, context): return self.proxied_registry.proto() -def start_server(store: FeatureStore, port: int): - auth_type = str_to_auth_manager_type(store.config.auth_config.type) - init_security_manager(auth_type=auth_type, fs=store) +def start_server(store: FeatureStore, port: int, wait_for_termination: bool = False): + auth_manager_type = str_to_auth_type(store.config.auth_config.type) + init_security_manager(auth_type=auth_manager_type, fs=store) init_auth_manager( - auth_type=auth_type, + auth_type=auth_manager_type, server_type=ServerType.GRPC, ) server = grpc.server( futures.ThreadPoolExecutor(max_workers=10), - interceptors=grpc_interceptors(auth_type), + interceptors=grpc_interceptors(auth_manager_type), ) RegistryServer_pb2_grpc.add_RegistryServerServicer_to_server( RegistryServer(store.registry), server From c6e9638c1394adeee8dadf036a89681f07b4a2f7 Mon Sep 17 00:00:00 2001 From: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Date: Fri, 12 Jul 2024 11:24:52 +0200 Subject: [PATCH 069/169] Propagating auth config to token parser in server init Signed-off-by: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Signed-off-by: Abdul Hameed --- sdk/python/feast/feature_server.py | 1 + sdk/python/feast/offline_server.py | 1 + .../permissions/auth/oidc_token_parser.py | 37 ++++++++----------- sdk/python/feast/permissions/server/utils.py | 10 +++-- sdk/python/feast/registry_server.py | 3 +- 5 files changed, 26 insertions(+), 26 deletions(-) diff --git a/sdk/python/feast/feature_server.py b/sdk/python/feast/feature_server.py index a348b0b94a..1c2d50abe3 100644 --- a/sdk/python/feast/feature_server.py +++ b/sdk/python/feast/feature_server.py @@ -351,6 +351,7 @@ def start_server( init_auth_manager( auth_type=auth_type, server_type=ServerType.REST, + auth_config=store.config.auth_config, ) if sys.platform != "win32": diff --git a/sdk/python/feast/offline_server.py b/sdk/python/feast/offline_server.py index c4b090e5b7..cbf91f551a 100644 --- a/sdk/python/feast/offline_server.py +++ b/sdk/python/feast/offline_server.py @@ -454,6 +454,7 @@ def _init_auth_manager(store: FeatureStore): init_auth_manager( auth_type=auth_type, server_type=ServerType.ARROW, + auth_config=store.config.auth_config, ) diff --git a/sdk/python/feast/permissions/auth/oidc_token_parser.py b/sdk/python/feast/permissions/auth/oidc_token_parser.py index d389871801..7e1d7da613 100644 --- a/sdk/python/feast/permissions/auth/oidc_token_parser.py +++ b/sdk/python/feast/permissions/auth/oidc_token_parser.py @@ -1,9 +1,7 @@ import logging -import os from unittest.mock import Mock import jwt -from dotenv import load_dotenv from fastapi import Request from fastapi.security import OAuth2AuthorizationCodeBearer from jwt import PyJWKClient @@ -12,6 +10,7 @@ ) from feast.permissions.auth.token_parser import TokenParser +from feast.permissions.auth_model import OidcAuthConfig from feast.permissions.user import User logger = logging.getLogger(__name__) @@ -21,20 +20,13 @@ class OidcTokenParser(TokenParser): """ A `TokenParser` to use an OIDC server to retrieve the user details. - # TODO RBAC: use auth configuration instead - Server settings are retrieved fro these environment variables: - - `OIDC_SERVER_URL` - - `REALM` - - `CLIENT_ID` + Server settings are retrieved from the `auth` configurationof the Feature store. """ - def __init__(self): - # TODO RBAC: use auth configuration instead - load_dotenv("./.env") + _auth_config: OidcAuthConfig - self._OIDC_SERVER_URL = os.getenv("OIDC_SERVER_URL") - self._REALM = os.getenv("REALM") - self._CLIENT_ID = os.getenv("CLIENT_ID") + def __init__(self, auth_config: OidcAuthConfig): + self._auth_config = auth_config async def _validate_token(self, access_token: str): """ @@ -46,9 +38,9 @@ async def _validate_token(self, access_token: str): request.headers = {"Authorization": f"Bearer {access_token}"} oauth_2_scheme = OAuth2AuthorizationCodeBearer( - tokenUrl=f"{self._OIDC_SERVER_URL}/realms/{self._REALM}/protocol/openid-connect/token", - authorizationUrl=f"{self._OIDC_SERVER_URL}/realms/{self._REALM}/protocol/openid-connect/auth", - refreshUrl=f"{self._OIDC_SERVER_URL}/realms/{self._REALM}/protocol/openid-connect/token", + tokenUrl=f"{self._auth_config.auth_server_url}/realms/{self._auth_config.realm}/protocol/openid-connect/token", + authorizationUrl=f"{self._auth_config.auth_server_url}/realms/{self._auth_config.realm}/protocol/openid-connect/auth", + refreshUrl=f"{self._auth_config.auth_server_url}/realms/{self._auth_config.realm}/protocol/openid-connect/token", ) await oauth_2_scheme(request=request) @@ -70,7 +62,7 @@ async def user_details_from_access_token(self, access_token: str) -> User: except Exception as e: raise AuthenticationError(f"Invalid token: {e}") - url = f"{self._OIDC_SERVER_URL}/realms/{self._REALM}/protocol/openid-connect/certs" + url = f"{self._auth_config.auth_server_url}/realms/{self._auth_config.realm}/protocol/openid-connect/certs" optional_custom_headers = {"User-agent": "custom-user-agent"} jwks_client = PyJWKClient(url, headers=optional_custom_headers) @@ -94,15 +86,16 @@ async def user_details_from_access_token(self, access_token: str) -> User: raise AuthenticationError( "Missing resource_access field in access token." ) - if self._CLIENT_ID not in data["resource_access"]: + client_id = self._auth_config.client_id + if client_id not in data["resource_access"]: raise AuthenticationError( - f"Missing resource_access.{self._CLIENT_ID} field in access token." + f"Missing resource_access.{client_id} field in access token." ) - if "roles" not in data["resource_access"][self._CLIENT_ID]: + if "roles" not in data["resource_access"][client_id]: raise AuthenticationError( - f"Missing resource_access.{self._CLIENT_ID}.roles field in access token." + f"Missing resource_access.{client_id}.roles field in access token." ) - roles = data["resource_access"][self._CLIENT_ID]["roles"] + roles = data["resource_access"][client_id]["roles"] logger.info(f"Extracted user {current_user} and roles {roles}") return User(username=current_user, roles=roles) except jwt.exceptions.InvalidTokenError: diff --git a/sdk/python/feast/permissions/server/utils.py b/sdk/python/feast/permissions/server/utils.py index ee189a6559..51596b4baa 100644 --- a/sdk/python/feast/permissions/server/utils.py +++ b/sdk/python/feast/permissions/server/utils.py @@ -15,6 +15,7 @@ from feast.permissions.auth.oidc_token_parser import OidcTokenParser from feast.permissions.auth.token_extractor import TokenExtractor from feast.permissions.auth.token_parser import TokenParser +from feast.permissions.auth_model import AuthConfig, OidcAuthConfig from feast.permissions.security_manager import ( SecurityManager, no_security_manager, @@ -82,7 +83,9 @@ def init_security_manager(auth_type: AuthManagerType, fs: "feast.FeatureStore"): ) -def init_auth_manager(server_type: ServerType, auth_type: AuthManagerType): +def init_auth_manager( + server_type: ServerType, auth_type: AuthType, auth_config: AuthConfig +): """ Initialize the global authorization manager. Must be invoked at Feast server initialization time to create the `AuthManager` instance. @@ -111,8 +114,9 @@ def init_auth_manager(server_type: ServerType, auth_type: AuthManagerType): if auth_type == AuthManagerType.KUBERNETES: token_parser = KubernetesTokenParser() - elif auth_type == AuthManagerType.OIDC: - token_parser = OidcTokenParser() + elif auth_type == AuthType.OIDC: + assert isinstance(auth_config, OidcAuthConfig) + token_parser = OidcTokenParser(auth_config=auth_config) else: raise ValueError(f"Unmanaged authorization manager type {auth_type}") diff --git a/sdk/python/feast/registry_server.py b/sdk/python/feast/registry_server.py index 78e39d53d6..5ecb585e67 100644 --- a/sdk/python/feast/registry_server.py +++ b/sdk/python/feast/registry_server.py @@ -582,12 +582,13 @@ def Proto(self, request, context): return self.proxied_registry.proto() -def start_server(store: FeatureStore, port: int, wait_for_termination: bool = False): +def start_server(store: FeatureStore, port: int, wait_for_termination: bool = True): auth_manager_type = str_to_auth_type(store.config.auth_config.type) init_security_manager(auth_type=auth_manager_type, fs=store) init_auth_manager( auth_type=auth_manager_type, server_type=ServerType.GRPC, + auth_config=store.config.auth_config, ) server = grpc.server( From 53d7d10699bba33ab1270198d10a91039e8492ca Mon Sep 17 00:00:00 2001 From: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Date: Fri, 12 Jul 2024 11:33:35 +0200 Subject: [PATCH 070/169] adding headers and client_secret to token request Signed-off-by: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Signed-off-by: Abdul Hameed --- .../client/oidc_authentication_client_manager.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/sdk/python/feast/permissions/client/oidc_authentication_client_manager.py b/sdk/python/feast/permissions/client/oidc_authentication_client_manager.py index a16edd6ebd..871c928cf1 100644 --- a/sdk/python/feast/permissions/client/oidc_authentication_client_manager.py +++ b/sdk/python/feast/permissions/client/oidc_authentication_client_manager.py @@ -20,7 +20,9 @@ def _get_token_endpoint(self): raise RuntimeError( " OIDC token_endpoint is not available from discovery url response." ) - return oidc_config["token_endpoint"] + return oidc_config["token_endpoint"].replace( + "master", self.auth_config.realm + ) else: raise RuntimeError( f"Error fetching OIDC token endpoint configuration: {response.status_code} - {response.text}" @@ -33,11 +35,15 @@ def get_token(self): token_request_body = { "grant_type": "password", "client_id": self.auth_config.client_id, + "client_secret": self.auth_config.client_secret, "username": self.auth_config.username, "password": self.auth_config.password, } + headers = {"Content-Type": "application/x-www-form-urlencoded"} - token_response = requests.post(token_endpoint, data=token_request_body) + token_response = requests.post( + token_endpoint, data=token_request_body, headers=headers + ) if token_response.status_code == 200: access_token = token_response.json()["access_token"] if not access_token: From fcd74196a0b1bb26f6488e95ad8fac0f168df643 Mon Sep 17 00:00:00 2001 From: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Date: Fri, 12 Jul 2024 11:47:46 +0200 Subject: [PATCH 071/169] working E2E test of authenticated registy server Signed-off-by: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Signed-off-by: Abdul Hameed --- .../unit/permissions/auth/server/conftest.py | 87 ++++++++++++++++ .../permissions/auth/server/mock_utils.py | 75 ++++++++++++++ .../auth/server/test_auth_registry_server.py | 98 +++++++++++++++++++ 3 files changed, 260 insertions(+) create mode 100644 sdk/python/tests/unit/permissions/auth/server/conftest.py create mode 100644 sdk/python/tests/unit/permissions/auth/server/mock_utils.py create mode 100644 sdk/python/tests/unit/permissions/auth/server/test_auth_registry_server.py diff --git a/sdk/python/tests/unit/permissions/auth/server/conftest.py b/sdk/python/tests/unit/permissions/auth/server/conftest.py new file mode 100644 index 0000000000..4cac3f1d3c --- /dev/null +++ b/sdk/python/tests/unit/permissions/auth/server/conftest.py @@ -0,0 +1,87 @@ +import os +import tempfile +from textwrap import dedent + +import pytest +import yaml + +from feast import FeatureStore +from tests.unit.permissions.auth.server.mock_utils import PROJECT_NAME +from tests.utils.cli_repo_creator import CliRunner +from tests.utils.http_server import free_port # noqa: E402 + + +@pytest.fixture( + scope="module", + params=[ + dedent(""" + auth: + type: no_auth + """), + dedent(""" + auth: + type: kubernetes + """), + dedent(""" + auth: + type: oidc + client_id: client_id + client_secret: client_secret + username: username + password: password + realm: realm + auth_server_url: http://localhost:8080 + auth_discovery_url: http://localhost:8080/realms/master/.well-known/openid-configuration + """), + ], +) +def auth_config(request): + return request.param + + +@pytest.fixture +def temp_dir(): + with tempfile.TemporaryDirectory() as temp_dir: + print(f"Created {temp_dir}") + yield temp_dir + + +@pytest.fixture +def feature_store(temp_dir, auth_config): + print(f"Creating store at {temp_dir}") + return _default_store(str(temp_dir), auth_config) + + +@pytest.fixture +def server_port(): + return free_port() + + +def _include_auth_config(file_path, auth_config: str): + with open(file_path, "r") as file: + existing_content = yaml.safe_load(file) + new_section = yaml.safe_load(auth_config) + if isinstance(existing_content, dict) and isinstance(new_section, dict): + existing_content.update(new_section) + else: + raise ValueError("Both existing content and new section must be dictionaries.") + with open(file_path, "w") as file: + yaml.safe_dump(existing_content, file, default_flow_style=False) + print(f"Updated auth section at {file_path}") + + +def _default_store(temp_dir, auth_config: str): + runner = CliRunner() + result = runner.run(["init", PROJECT_NAME], cwd=temp_dir) + repo_path = os.path.join(temp_dir, PROJECT_NAME, "feature_repo") + assert result.returncode == 0 + + _include_auth_config( + file_path=f"{repo_path}/feature_store.yaml", auth_config=auth_config + ) + + result = runner.run(["--chdir", repo_path, "apply"], cwd=temp_dir) + assert result.returncode == 0 + + fs = FeatureStore(repo_path=repo_path) + return fs diff --git a/sdk/python/tests/unit/permissions/auth/server/mock_utils.py b/sdk/python/tests/unit/permissions/auth/server/mock_utils.py new file mode 100644 index 0000000000..49fa8e6f71 --- /dev/null +++ b/sdk/python/tests/unit/permissions/auth/server/mock_utils.py @@ -0,0 +1,75 @@ +from unittest.mock import MagicMock, Mock, mock_open + +from requests import Response + +PROJECT_NAME = "test_registry_server" + + +def _mock_oidc(request, monkeypatch, client_id): + async def mock_oath2(self, request): + return "OK" + + monkeypatch.setattr( + "feast.permissions.auth.oidc_token_parser.OAuth2AuthorizationCodeBearer.__call__", + mock_oath2, + ) + signing_key = MagicMock() + signing_key.key = "a-key" + monkeypatch.setattr( + "feast.permissions.auth.oidc_token_parser.PyJWKClient.get_signing_key_from_jwt", + lambda self, access_token: signing_key, + ) + user_data = { + "preferred_username": "my-name", + "resource_access": {client_id: {"roles": ["reader", "writer"]}}, + } + monkeypatch.setattr( + "feast.permissions.auth.oidc_token_parser.jwt.decode", + lambda self, *args, **kwargs: user_data, + ) + discovery_response = Mock(spec=Response) + discovery_response.status_code = 200 + discovery_response.json.return_value = { + "token_endpoint": "http://localhost:8080/realms/master/protocol/openid-connect/token" + } + monkeypatch.setattr( + "feast.permissions.client.oidc_authentication_client_manager.requests.get", + lambda url: discovery_response, + ) + token_response = Mock(spec=Response) + token_response.status_code = 200 + token_response.json.return_value = {"access_token": "my-token"} + monkeypatch.setattr( + "feast.permissions.client.oidc_authentication_client_manager.requests.post", + lambda url, data, headers: token_response, + ) + + +def _mock_kubernetes(request, monkeypatch): + sa_name = request.getfixturevalue("sa_name") + namespace = request.getfixturevalue("namespace") + subject = f"system:serviceaccount:{namespace}:{sa_name}" + rolebindings = request.getfixturevalue("rolebindings") + clusterrolebindings = request.getfixturevalue("clusterrolebindings") + + monkeypatch.setattr( + "feast.permissions.auth.kubernetes_token_parser.config.load_incluster_config", + lambda: None, + ) + monkeypatch.setattr( + "feast.permissions.auth.kubernetes_token_parser.jwt.decode", + lambda *args, **kwargs: {"sub": subject}, + ) + monkeypatch.setattr( + "feast.permissions.auth.kubernetes_token_parser.client.RbacAuthorizationV1Api.list_namespaced_role_binding", + lambda *args, **kwargs: rolebindings["items"], + ) + monkeypatch.setattr( + "feast.permissions.auth.kubernetes_token_parser.client.RbacAuthorizationV1Api.list_cluster_role_binding", + lambda *args, **kwargs: clusterrolebindings["items"], + ) + m = mock_open(read_data="my-token") + monkeypatch.setattr( + "builtins.open", + m, + ) diff --git a/sdk/python/tests/unit/permissions/auth/server/test_auth_registry_server.py b/sdk/python/tests/unit/permissions/auth/server/test_auth_registry_server.py new file mode 100644 index 0000000000..5904b01fa4 --- /dev/null +++ b/sdk/python/tests/unit/permissions/auth/server/test_auth_registry_server.py @@ -0,0 +1,98 @@ +import assertpy +import pytest +import yaml + +from feast import FeatureStore +from feast.infra.registry.remote import RemoteRegistryConfig +from feast.registry_server import start_server +from feast.repo_config import RepoConfig +from feast.wait import wait_retry_backoff # noqa: E402 +from tests.unit.permissions.auth.server import mock_utils +from tests.utils.http_server import check_port_open # noqa: E402 + + +@pytest.fixture +def start_registry_server( + request, + auth_config, + server_port, + feature_store, + monkeypatch, +): + if "kubernetes" in auth_config: + mock_utils._mock_kubernetes(request=request, monkeypatch=monkeypatch) + elif "oidc" in auth_config: + auth_config_yaml = yaml.safe_load(auth_config) + mock_utils._mock_oidc( + request=request, + monkeypatch=monkeypatch, + client_id=auth_config_yaml["auth"]["client_id"], + ) + + assertpy.assert_that(server_port).is_not_equal_to(0) + + print(f"Starting Registry at {server_port}") + server = start_server(feature_store, server_port, wait_for_termination=False) + print("Waiting server availability") + wait_retry_backoff( + lambda: (None, check_port_open("localhost", server_port)), + timeout_secs=10, + ) + print("Server started") + + yield server + + print("Stopping server") + server.stop(grace=None) # Teardown server + + +@pytest.fixture +def remote_feature_store(server_port, feature_store): + registry_config = RemoteRegistryConfig( + registry_type="remote", path=f"localhost:{server_port}" + ) + + store = FeatureStore( + config=RepoConfig( + project=mock_utils.PROJECT_NAME, + auth=feature_store.config.auth, + registry=registry_config, + provider="local", + entity_key_serialization_version=2, + ) + ) + return store + + +def test_remote_offline_store_apis( + auth_config, temp_dir, server_port, start_registry_server, remote_feature_store +): + print(f"Runnning for\n:{auth_config}") + _test_list_entities(remote_feature_store) + _test_list_fvs(remote_feature_store) + + +def _test_list_entities(fs: FeatureStore): + entities = fs.list_entities() + + assertpy.assert_that(entities).is_not_none() + assertpy.assert_that(len(entities)).is_equal_to(1) + + assertpy.assert_that(entities[0].name).is_equal_to("driver") + + +def _test_list_fvs(fs: FeatureStore): + fvs = fs.list_feature_views() + for fv in fvs: + print(f"{fv.name}, {type(fv).__name__}") + + assertpy.assert_that(fvs).is_not_none() + assertpy.assert_that(len(fvs)).is_equal_to(2) + + names = _to_names(fvs) + assertpy.assert_that(names).contains("driver_hourly_stats") + assertpy.assert_that(names).contains("driver_hourly_stats_fresh") + + +def _to_names(items): + return [i.name for i in items] From f3e36d2d76db06e94db4e0a529c3db07e1ae3e93 Mon Sep 17 00:00:00 2001 From: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Date: Fri, 12 Jul 2024 16:54:26 +0200 Subject: [PATCH 072/169] renamed test Signed-off-by: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Signed-off-by: Abdul Hameed --- .../unit/permissions/auth/server/test_auth_registry_server.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/python/tests/unit/permissions/auth/server/test_auth_registry_server.py b/sdk/python/tests/unit/permissions/auth/server/test_auth_registry_server.py index 5904b01fa4..be1bf0c4d8 100644 --- a/sdk/python/tests/unit/permissions/auth/server/test_auth_registry_server.py +++ b/sdk/python/tests/unit/permissions/auth/server/test_auth_registry_server.py @@ -64,7 +64,7 @@ def remote_feature_store(server_port, feature_store): return store -def test_remote_offline_store_apis( +def test_registry_apis( auth_config, temp_dir, server_port, start_registry_server, remote_feature_store ): print(f"Runnning for\n:{auth_config}") From 811dc83413fe6be77d352c4800af2b55b6db48b3 Mon Sep 17 00:00:00 2001 From: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Date: Fri, 12 Jul 2024 17:15:08 +0200 Subject: [PATCH 073/169] fixed broken test Signed-off-by: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Signed-off-by: Abdul Hameed --- .../unit/permissions/auth/test_token_parser.py | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/sdk/python/tests/unit/permissions/auth/test_token_parser.py b/sdk/python/tests/unit/permissions/auth/test_token_parser.py index ce400da182..c25cf7d3d1 100644 --- a/sdk/python/tests/unit/permissions/auth/test_token_parser.py +++ b/sdk/python/tests/unit/permissions/auth/test_token_parser.py @@ -1,7 +1,6 @@ # test_token_validator.py import asyncio -import os from unittest.mock import MagicMock, patch import assertpy @@ -18,19 +17,14 @@ _CLIENT_ID = "test" -@pytest.fixture(autouse=True) -def setup(): - os.environ["OIDC_SERVER_URL"] = "http://localhost:8080" - os.environ["REALM"] = "test" - os.environ["CLIENT_ID"] = _CLIENT_ID - - @patch( "feast.permissions.auth.oidc_token_parser.OAuth2AuthorizationCodeBearer.__call__" ) @patch("feast.permissions.auth.oidc_token_parser.PyJWKClient.get_signing_key_from_jwt") @patch("feast.permissions.auth.oidc_token_parser.jwt.decode") -def test_oidc_token_validation_success(mock_jwt, mock_signing_key, mock_oauth2): +def test_oidc_token_validation_success( + mock_jwt, mock_signing_key, mock_oauth2, oidc_config +): signing_key = MagicMock() signing_key.key = "a-key" mock_signing_key.return_value = signing_key @@ -42,7 +36,7 @@ def test_oidc_token_validation_success(mock_jwt, mock_signing_key, mock_oauth2): mock_jwt.return_value = user_data access_token = "aaa-bbb-ccc" - token_parser = OidcTokenParser() + token_parser = OidcTokenParser(auth_config=oidc_config) user = asyncio.run( token_parser.user_details_from_access_token(access_token=access_token) ) @@ -59,11 +53,11 @@ def test_oidc_token_validation_success(mock_jwt, mock_signing_key, mock_oauth2): @patch( "feast.permissions.auth.oidc_token_parser.OAuth2AuthorizationCodeBearer.__call__" ) -def test_oidc_token_validation_failure(mock_oauth2): +def test_oidc_token_validation_failure(mock_oauth2, oidc_config): mock_oauth2.side_effect = AuthenticationError("wrong token") access_token = "aaa-bbb-ccc" - token_parser = OidcTokenParser() + token_parser = OidcTokenParser(auth_config=oidc_config) with pytest.raises(AuthenticationError): asyncio.run( token_parser.user_details_from_access_token(access_token=access_token) From 7dca9566c338179e3ec103dd643bf5eef96ed14d Mon Sep 17 00:00:00 2001 From: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Date: Fri, 12 Jul 2024 19:13:24 +0200 Subject: [PATCH 074/169] fix rebase issues Signed-off-by: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Signed-off-by: Abdul Hameed --- sdk/python/feast/permissions/server/utils.py | 4 +- sdk/python/feast/registry_server.py | 7 ++- .../tests/unit/permissions/auth/conftest.py | 59 +++++++++++++++++++ .../{ => auth}/server/test_utils.py | 0 4 files changed, 66 insertions(+), 4 deletions(-) create mode 100644 sdk/python/tests/unit/permissions/auth/conftest.py rename sdk/python/tests/unit/permissions/{ => auth}/server/test_utils.py (100%) diff --git a/sdk/python/feast/permissions/server/utils.py b/sdk/python/feast/permissions/server/utils.py index 51596b4baa..34a2c0024a 100644 --- a/sdk/python/feast/permissions/server/utils.py +++ b/sdk/python/feast/permissions/server/utils.py @@ -84,7 +84,7 @@ def init_security_manager(auth_type: AuthManagerType, fs: "feast.FeatureStore"): def init_auth_manager( - server_type: ServerType, auth_type: AuthType, auth_config: AuthConfig + server_type: ServerType, auth_type: AuthManagerType, auth_config: AuthConfig ): """ Initialize the global authorization manager. @@ -114,7 +114,7 @@ def init_auth_manager( if auth_type == AuthManagerType.KUBERNETES: token_parser = KubernetesTokenParser() - elif auth_type == AuthType.OIDC: + elif auth_type == AuthManagerType.OIDC: assert isinstance(auth_config, OidcAuthConfig) token_parser = OidcTokenParser(auth_config=auth_config) else: diff --git a/sdk/python/feast/registry_server.py b/sdk/python/feast/registry_server.py index 5ecb585e67..e75942010f 100644 --- a/sdk/python/feast/registry_server.py +++ b/sdk/python/feast/registry_server.py @@ -583,7 +583,7 @@ def Proto(self, request, context): def start_server(store: FeatureStore, port: int, wait_for_termination: bool = True): - auth_manager_type = str_to_auth_type(store.config.auth_config.type) + auth_manager_type = str_to_auth_manager_type(store.config.auth_config.type) init_security_manager(auth_type=auth_manager_type, fs=store) init_auth_manager( auth_type=auth_manager_type, @@ -600,4 +600,7 @@ def start_server(store: FeatureStore, port: int, wait_for_termination: bool = Tr ) server.add_insecure_port(f"[::]:{port}") server.start() - server.wait_for_termination() + if wait_for_termination: + server.wait_for_termination() + else: + return server diff --git a/sdk/python/tests/unit/permissions/auth/conftest.py b/sdk/python/tests/unit/permissions/auth/conftest.py new file mode 100644 index 0000000000..673f2a9073 --- /dev/null +++ b/sdk/python/tests/unit/permissions/auth/conftest.py @@ -0,0 +1,59 @@ +import pytest +from kubernetes import client + + +@pytest.fixture +def sa_name(): + return "my-name" + + +@pytest.fixture +def namespace(): + return "my-ns" + + +@pytest.fixture +def rolebindings(sa_name, namespace) -> dict: + roles = ["reader", "writer"] + items = [] + for r in roles: + items.append( + client.V1RoleBinding( + metadata=client.V1ObjectMeta(name=r, namespace=namespace), + subjects=[ + client.V1Subject( + kind="ServiceAccount", + name=sa_name, + api_group="rbac.authorization.k8s.io", + ) + ], + role_ref=client.V1RoleRef( + kind="Role", name=r, api_group="rbac.authorization.k8s.io" + ), + ) + ) + return {"items": client.V1RoleBindingList(items=items), "roles": roles} + + +@pytest.fixture +def clusterrolebindings(sa_name, namespace) -> dict: + roles = ["updater"] + items = [] + for r in roles: + items.append( + client.V1ClusterRoleBinding( + metadata=client.V1ObjectMeta(name=r, namespace=namespace), + subjects=[ + client.V1Subject( + kind="ServiceAccount", + name=sa_name, + namespace=namespace, + api_group="rbac.authorization.k8s.io", + ) + ], + role_ref=client.V1RoleRef( + kind="Role", name=r, api_group="rbac.authorization.k8s.io" + ), + ) + ) + return {"items": client.V1RoleBindingList(items=items), "roles": roles} diff --git a/sdk/python/tests/unit/permissions/server/test_utils.py b/sdk/python/tests/unit/permissions/auth/server/test_utils.py similarity index 100% rename from sdk/python/tests/unit/permissions/server/test_utils.py rename to sdk/python/tests/unit/permissions/auth/server/test_utils.py From d2a9f6c8806f343002232337494d904a5463b646 Mon Sep 17 00:00:00 2001 From: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Date: Fri, 12 Jul 2024 19:19:47 +0200 Subject: [PATCH 075/169] fix rebase issues Signed-off-by: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Signed-off-by: Abdul Hameed --- .../tests/unit/permissions/auth/conftest.py | 16 ++++++ .../permissions/auth/test_token_parser.py | 55 +++++-------------- 2 files changed, 29 insertions(+), 42 deletions(-) diff --git a/sdk/python/tests/unit/permissions/auth/conftest.py b/sdk/python/tests/unit/permissions/auth/conftest.py index 673f2a9073..ea88d8e490 100644 --- a/sdk/python/tests/unit/permissions/auth/conftest.py +++ b/sdk/python/tests/unit/permissions/auth/conftest.py @@ -1,6 +1,9 @@ import pytest from kubernetes import client +from feast.permissions.auth_model import OidcAuthConfig +from tests.unit.permissions.auth.test_token_parser import _CLIENT_ID + @pytest.fixture def sa_name(): @@ -57,3 +60,16 @@ def clusterrolebindings(sa_name, namespace) -> dict: ) ) return {"items": client.V1RoleBindingList(items=items), "roles": roles} + + +@pytest.fixture +def oidc_config() -> OidcAuthConfig: + return OidcAuthConfig( + auth_server_url="", + auth_discovery_url="", + client_id=_CLIENT_ID, + client_secret="", + username="", + password="", + realm="", + ) diff --git a/sdk/python/tests/unit/permissions/auth/test_token_parser.py b/sdk/python/tests/unit/permissions/auth/test_token_parser.py index c25cf7d3d1..6ae9094f81 100644 --- a/sdk/python/tests/unit/permissions/auth/test_token_parser.py +++ b/sdk/python/tests/unit/permissions/auth/test_token_parser.py @@ -5,7 +5,6 @@ import assertpy import pytest -from kubernetes import client from starlette.authentication import ( AuthenticationError, ) @@ -73,52 +72,24 @@ def test_oidc_token_validation_failure(mock_oauth2, oidc_config): @patch( "feast.permissions.auth.kubernetes_token_parser.client.RbacAuthorizationV1Api.list_cluster_role_binding" ) -def test_k8s_token_validation_success(mock_crb, mock_rb, mock_jwt, mock_config): +def test_k8s_token_validation_success( + mock_crb, + mock_rb, + mock_jwt, + mock_config, + rolebindings, + clusterrolebindings, +): sa_name = "my-name" namespace = "my-ns" subject = f"system:serviceaccount:{namespace}:{sa_name}" mock_jwt.return_value = {"sub": subject} - roles = ["reader", "writer"] - roles_items = [] - for r in roles: - roles_items.append( - client.V1RoleBinding( - metadata=client.V1ObjectMeta(name=r, namespace=namespace), - subjects=[ - client.V1Subject( - kind="ServiceAccount", - name=sa_name, - api_group="rbac.authorization.k8s.io", - ) - ], - role_ref=client.V1RoleRef( - kind="Role", name=r, api_group="rbac.authorization.k8s.io" - ), - ) - ) - mock_rb.return_value = client.V1RoleBindingList(items=roles_items) - - croles = ["updater"] - croles_items = [] - for cr in croles: - croles_items.append( - client.V1ClusterRoleBinding( - metadata=client.V1ObjectMeta(name=r, namespace=namespace), - subjects=[ - client.V1Subject( - kind="ServiceAccount", - name=sa_name, - namespace=namespace, - api_group="rbac.authorization.k8s.io", - ) - ], - role_ref=client.V1RoleRef( - kind="Role", name=cr, api_group="rbac.authorization.k8s.io" - ), - ) - ) - mock_crb.return_value = client.V1RoleBindingList(items=croles_items) + mock_rb.return_value = rolebindings["items"] + mock_crb.return_value = clusterrolebindings["items"] + + roles = rolebindings["roles"] + croles = clusterrolebindings["roles"] access_token = "aaa-bbb-ccc" token_parser = KubernetesTokenParser() From 92198de4a77e156996420ab9282231b025b306d5 Mon Sep 17 00:00:00 2001 From: Lokesh Rangineni Date: Fri, 12 Jul 2024 16:17:29 -0400 Subject: [PATCH 076/169] Adding the auth client documentations and unit testing for auth client code. Signed-off-by: Lokesh Rangineni Signed-off-by: Lokesh Rangineni Signed-off-by: Abdul Hameed --- docs/getting-started/concepts/permission.md | 68 ++++++++++++------- .../offline-stores/remote-offline-store.md | 7 +- docs/reference/online-stores/remote.md | 20 ++++-- .../registry/registry-permissions.md | 5 +- .../local/feature_repo/feature_store.yaml | 2 + .../minimal/feature_repo/feature_store.yaml | 3 + .../infra/scaffolding/test_repo_config.py | 4 +- .../unit/permissions/test_oidc_auth_client.py | 65 ++++++++++++++++++ 8 files changed, 138 insertions(+), 36 deletions(-) create mode 100644 sdk/python/tests/unit/permissions/test_oidc_auth_client.py diff --git a/docs/getting-started/concepts/permission.md b/docs/getting-started/concepts/permission.md index 466d685b71..71e9efc629 100644 --- a/docs/getting-started/concepts/permission.md +++ b/docs/getting-started/concepts/permission.md @@ -93,29 +93,51 @@ Permission( ``` ## Authorizing Feast clients -**TODO** -Initial proposals: -* Kubernetes RBAC: +If you would like to leverage the permissions' functionality then `auth` config block should be added to feature_store.yaml. Currently, feast supports oidc and kubernetes rbac authentication/authorization. + +The default configuration if you don't mention the auth configuration is no_auth configuration. + +* No auth configuration example: +```yaml +project: foo +registry: "registry.db" +provider: local +online_store: + path: foo +entity_key_serialization_version: 2 +auth: + type: no_auth +``` + +* Kubernetes rbac authentication/authorization example: +{% hint style="info" %} +**NOTE**: This configuration will only work if you deploy feast on Openshift or Kubernetes platform. +{% endhint %} ```yaml -offline_store: - type: remote - host: localhost - port: 8815 - auth: - type: kubernetes +project: foo +registry: "registry.db" +provider: local +online_store: + path: foo +entity_key_serialization_version: 2 +auth: + type: kubernetes ``` -* OIDC authorization: +* OIDC authorization: Below configuration is an example for OIDC authorization example. ```yaml -offline_store: - type: remote - host: localhost - port: 8815 - auth: - type: oidc - server: 'http://0.0.0.0:8080' - realm: 'OIDC_REALM' - client-id: 'CLIENT_ID' - client-secret: 'CLIENT_SECRET' - username: 'USERNAME' - password: 'PASSWORD' -``` \ No newline at end of file +project: foo +auth: + type: oidc + client_id: test_client_id + client_secret: test_client_secret + username: test_user_name + password: test_password + realm: master + auth_discovery_url: http://localhost:8080/realms/master/.well-known/openid-configuration +registry: "registry.db" +provider: local +online_store: + path: foo +entity_key_serialization_version: 2 +``` +Few of the key models, classes to understand the authorization implementation from the clients can be found [here](./../../../sdk/python/feast/permissions/client). \ No newline at end of file diff --git a/docs/reference/offline-stores/remote-offline-store.md b/docs/reference/offline-stores/remote-offline-store.md index 0179e0f06f..98156a7e0c 100644 --- a/docs/reference/offline-stores/remote-offline-store.md +++ b/docs/reference/offline-stores/remote-offline-store.md @@ -16,6 +16,8 @@ offline_store: type: remote host: localhost port: 8815 +auth: + type: no_auth ``` {% endcode %} @@ -25,4 +27,7 @@ The complete example can be find under [remote-offline-store-example](../../../e ## How to configure the server -Please see the detail how to configure offline feature server [offline-feature-server.md](../feature-servers/offline-feature-server.md) \ No newline at end of file +Please see the detail how to configure offline feature server [offline-feature-server.md](../feature-servers/offline-feature-server.md) + +## How to configure Authentication and Authorization +Please refer the [page](./../../../docs/getting-started/concepts/permission.md) for more details on how to configure authentication and authorization. diff --git a/docs/reference/online-stores/remote.md b/docs/reference/online-stores/remote.md index c560fa6f22..4dd4fb65b5 100644 --- a/docs/reference/online-stores/remote.md +++ b/docs/reference/online-stores/remote.md @@ -11,11 +11,17 @@ The registry is pointing to registry of remote feature store. If it is not acces {% code title="feature_store.yaml" %} ```yaml project: my-local-project - registry: /remote/data/registry.db - provider: local - online_store: - path: http://localhost:6566 - type: remote - entity_key_serialization_version: 2 +registry: /remote/data/registry.db +provider: local +online_store: + path: http://localhost:6566 + type: remote +entity_key_serialization_version: 2 +auth: + type: no_auth ``` -{% endcode %} \ No newline at end of file +{% endcode %} + +## How to configure Authentication and Authorization +Please refer the [page](./../../../docs/getting-started/concepts/permission.md) for more details on how to configure authentication and authorization. + diff --git a/docs/reference/registry/registry-permissions.md b/docs/reference/registry/registry-permissions.md index 5c013bd155..65508ef5b2 100644 --- a/docs/reference/registry/registry-permissions.md +++ b/docs/reference/registry/registry-permissions.md @@ -41,6 +41,5 @@ | Refresh | | None | Refresh the registry | | Proto | | None | Get the proto representation of the registry | -## How to configure Authentication and Authorization ? - -TODO add the section for that \ No newline at end of file +## How to configure Authentication and Authorization +Please refer the [page](./../../../docs/getting-started/concepts/permission.md) for more details on how to configure authentication and authorization. diff --git a/sdk/python/feast/templates/local/feature_repo/feature_store.yaml b/sdk/python/feast/templates/local/feature_repo/feature_store.yaml index 3e6a360316..b5d3e4df8a 100644 --- a/sdk/python/feast/templates/local/feature_repo/feature_store.yaml +++ b/sdk/python/feast/templates/local/feature_repo/feature_store.yaml @@ -7,3 +7,5 @@ online_store: type: sqlite path: data/online_store.db entity_key_serialization_version: 2 +auth: + type: no_auth diff --git a/sdk/python/feast/templates/minimal/feature_repo/feature_store.yaml b/sdk/python/feast/templates/minimal/feature_repo/feature_store.yaml index 9808690005..122c2325db 100644 --- a/sdk/python/feast/templates/minimal/feature_repo/feature_store.yaml +++ b/sdk/python/feast/templates/minimal/feature_repo/feature_store.yaml @@ -4,3 +4,6 @@ provider: local online_store: path: /path/to/online_store.db entity_key_serialization_version: 2 +auth: + type: no_auth + diff --git a/sdk/python/tests/unit/infra/scaffolding/test_repo_config.py b/sdk/python/tests/unit/infra/scaffolding/test_repo_config.py index 37a08ca09e..229de2f913 100644 --- a/sdk/python/tests/unit/infra/scaffolding/test_repo_config.py +++ b/sdk/python/tests/unit/infra/scaffolding/test_repo_config.py @@ -260,7 +260,7 @@ def test_auth_config(): username: test_user_name password: test_password realm: master - auth_server_url: http://localhost:8712 + auth_server_url: http://localhost:8080 auth_discovery_url: http://localhost:8080/realms/master/.well-known/openid-configuration registry: "registry.db" provider: local @@ -278,7 +278,7 @@ def test_auth_config(): assert oidc_repo_config.auth_config.username == "test_user_name" assert oidc_repo_config.auth_config.password == "test_password" assert oidc_repo_config.auth_config.realm == "master" - assert oidc_repo_config.auth_config.auth_server_url == "http://localhost:8712" + assert oidc_repo_config.auth_config.auth_server_url == "http://localhost:8080" assert ( oidc_repo_config.auth_config.auth_discovery_url == "http://localhost:8080/realms/master/.well-known/openid-configuration" diff --git a/sdk/python/tests/unit/permissions/test_oidc_auth_client.py b/sdk/python/tests/unit/permissions/test_oidc_auth_client.py new file mode 100644 index 0000000000..d362b00c88 --- /dev/null +++ b/sdk/python/tests/unit/permissions/test_oidc_auth_client.py @@ -0,0 +1,65 @@ +from unittest.mock import patch + +from requests import Session + +from feast.permissions.auth_model import ( + KubernetesAuthConfig, + NoAuthConfig, + OidcAuthConfig, +) +from feast.permissions.client.http_auth_requests_wrapper import ( + AuthenticatedRequestsSession, + get_http_auth_requests_session, +) +from feast.permissions.client.kubernetes_auth_client_manager import ( + KubernetesAuthClientManager, +) +from feast.permissions.client.oidc_authentication_client_manager import ( + OidcAuthClientManager, +) + +MOCKED_TOKEN_VALUE: str = "dummy_token" + + +def _get_dummy_oidc_auth_type() -> OidcAuthConfig: + oidc_config = OidcAuthConfig( + auth_discovery_url="http://localhost:8080/realms/master/.well-known/openid-configuration", + type="oidc", + username="admin_test", + password="password_test", + client_id="dummy_client_id", + ) + return oidc_config + + +@patch.object(KubernetesAuthClientManager, "get_token", return_value=MOCKED_TOKEN_VALUE) +@patch.object(OidcAuthClientManager, "get_token", return_value=MOCKED_TOKEN_VALUE) +def test_http_auth_requests_session(mock_kubernetes_token, mock_oidc_token): + no_auth_config = NoAuthConfig() + assert isinstance(get_http_auth_requests_session(no_auth_config), Session) + + oidc_auth_config = _get_dummy_oidc_auth_type() + oidc_auth_requests_session = get_http_auth_requests_session(oidc_auth_config) + _assert_auth_requests_session(oidc_auth_requests_session, MOCKED_TOKEN_VALUE) + + kubernetes_auth_config = KubernetesAuthConfig(type="kubernetes") + kubernetes_auth_requests_session = get_http_auth_requests_session( + kubernetes_auth_config + ) + _assert_auth_requests_session(kubernetes_auth_requests_session, MOCKED_TOKEN_VALUE) + + +def _assert_auth_requests_session( + auth_req_session: AuthenticatedRequestsSession, expected_token: str +): + assert isinstance(auth_req_session, AuthenticatedRequestsSession) + assert "Authorization" in auth_req_session.headers, ( + "Authorization header is missing in object of class: " + "AuthenticatedRequestsSession " + ) + assert ( + auth_req_session.headers["Authorization"] == f"Bearer {expected_token}" + ), "Authorization token is incorrect" + + + From 2cf1f00410e71f18fb7bf3eeac63cf91e28b5c6f Mon Sep 17 00:00:00 2001 From: Lokesh Rangineni Date: Fri, 12 Jul 2024 16:17:29 -0400 Subject: [PATCH 077/169] Adding the auth client documentations and unit testing for auth client code. Signed-off-by: Lokesh Rangineni Signed-off-by: Lokesh Rangineni Signed-off-by: Abdul Hameed --- sdk/python/tests/unit/permissions/test_oidc_auth_client.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/sdk/python/tests/unit/permissions/test_oidc_auth_client.py b/sdk/python/tests/unit/permissions/test_oidc_auth_client.py index d362b00c88..22ed5b6f87 100644 --- a/sdk/python/tests/unit/permissions/test_oidc_auth_client.py +++ b/sdk/python/tests/unit/permissions/test_oidc_auth_client.py @@ -60,6 +60,3 @@ def _assert_auth_requests_session( assert ( auth_req_session.headers["Authorization"] == f"Bearer {expected_token}" ), "Authorization token is incorrect" - - - From 74fe957933380996cbd79f7d98c09b08b4abe848 Mon Sep 17 00:00:00 2001 From: Lokesh Rangineni Date: Mon, 15 Jul 2024 10:25:17 -0400 Subject: [PATCH 078/169] Incorporating code review comments. Signed-off-by: Lokesh Rangineni Signed-off-by: Lokesh Rangineni Signed-off-by: Abdul Hameed --- docs/reference/offline-stores/remote-offline-store.md | 2 -- .../feast/templates/local/feature_repo/feature_store.yaml | 1 + .../feast/templates/minimal/feature_repo/feature_store.yaml | 5 +---- 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/docs/reference/offline-stores/remote-offline-store.md b/docs/reference/offline-stores/remote-offline-store.md index 98156a7e0c..8057ae3284 100644 --- a/docs/reference/offline-stores/remote-offline-store.md +++ b/docs/reference/offline-stores/remote-offline-store.md @@ -16,8 +16,6 @@ offline_store: type: remote host: localhost port: 8815 -auth: - type: no_auth ``` {% endcode %} diff --git a/sdk/python/feast/templates/local/feature_repo/feature_store.yaml b/sdk/python/feast/templates/local/feature_repo/feature_store.yaml index b5d3e4df8a..11b339583e 100644 --- a/sdk/python/feast/templates/local/feature_repo/feature_store.yaml +++ b/sdk/python/feast/templates/local/feature_repo/feature_store.yaml @@ -7,5 +7,6 @@ online_store: type: sqlite path: data/online_store.db entity_key_serialization_version: 2 +# By default, no_auth for authentication and authorization, other possible values kubernetes and oidc. Refer the documentation for more details. auth: type: no_auth diff --git a/sdk/python/feast/templates/minimal/feature_repo/feature_store.yaml b/sdk/python/feast/templates/minimal/feature_repo/feature_store.yaml index 122c2325db..45a0ce7718 100644 --- a/sdk/python/feast/templates/minimal/feature_repo/feature_store.yaml +++ b/sdk/python/feast/templates/minimal/feature_repo/feature_store.yaml @@ -3,7 +3,4 @@ registry: /path/to/registry.db provider: local online_store: path: /path/to/online_store.db -entity_key_serialization_version: 2 -auth: - type: no_auth - +entity_key_serialization_version: 2 \ No newline at end of file From 3b43c043515d80efeab5fcd159750647c14f88cd Mon Sep 17 00:00:00 2001 From: Lokesh Rangineni Date: Mon, 15 Jul 2024 10:25:17 -0400 Subject: [PATCH 079/169] Incorporating code review comments. Signed-off-by: Lokesh Rangineni Signed-off-by: Lokesh Rangineni Signed-off-by: Abdul Hameed --- docs/reference/feature-servers/offline-feature-server.md | 2 +- docs/reference/feature-servers/python-feature-server.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/reference/feature-servers/offline-feature-server.md b/docs/reference/feature-servers/offline-feature-server.md index 8e6733e29d..28e0b0e3d3 100644 --- a/docs/reference/feature-servers/offline-feature-server.md +++ b/docs/reference/feature-servers/offline-feature-server.md @@ -49,4 +49,4 @@ The set of functionalities supported by remote offline stores is the same as tho ## How to configure Authentication and Authorization ? -TODO add the section for that \ No newline at end of file +Please refer the [page](./../../../docs/getting-started/concepts/permission.md) for more details on how to configure authentication and authorization. \ No newline at end of file diff --git a/docs/reference/feature-servers/python-feature-server.md b/docs/reference/feature-servers/python-feature-server.md index d0a62b0282..3288e86f9c 100644 --- a/docs/reference/feature-servers/python-feature-server.md +++ b/docs/reference/feature-servers/python-feature-server.md @@ -214,4 +214,4 @@ requests.post( ## How to configure Authentication and Authorization ? -TODO add the section for that \ No newline at end of file +Please refer the [page](./../../../docs/getting-started/concepts/permission.md) for more details on how to configure authentication and authorization. \ No newline at end of file From a83c5a6803efe7a8e26ed40061b3435646dc06a6 Mon Sep 17 00:00:00 2001 From: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Date: Thu, 27 Jun 2024 08:45:54 +0200 Subject: [PATCH 080/169] Introducing permission framework and authorization manager in user guide (to be continued after the code is consolidated) Signed-off-by: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Signed-off-by: Abdul Hameed --- sdk/python/docs/source/feast.rst | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/sdk/python/docs/source/feast.rst b/sdk/python/docs/source/feast.rst index f4db875995..83137574dd 100644 --- a/sdk/python/docs/source/feast.rst +++ b/sdk/python/docs/source/feast.rst @@ -252,6 +252,14 @@ feast.proto\_json module :undoc-members: :show-inheritance: +feast.prova module +------------------ + +.. automodule:: feast.prova + :members: + :undoc-members: + :show-inheritance: + feast.registry\_server module ----------------------------- From ce6413b0059b534e36cc9d46b66eddb3fd5ada25 Mon Sep 17 00:00:00 2001 From: Theodor Mihalache Date: Mon, 15 Jul 2024 15:53:11 -0400 Subject: [PATCH 081/169] CLI command "feast permissions list" - Added missing dependency Signed-off-by: Theodor Mihalache Signed-off-by: Abdul Hameed --- sdk/python/docs/source/feast.rst | 8 -------- .../tests/integration/registration/test_universal_cli.py | 4 ++++ setup.py | 1 + 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/sdk/python/docs/source/feast.rst b/sdk/python/docs/source/feast.rst index 83137574dd..f4db875995 100644 --- a/sdk/python/docs/source/feast.rst +++ b/sdk/python/docs/source/feast.rst @@ -252,14 +252,6 @@ feast.proto\_json module :undoc-members: :show-inheritance: -feast.prova module ------------------- - -.. automodule:: feast.prova - :members: - :undoc-members: - :show-inheritance: - feast.registry\_server module ----------------------------- diff --git a/sdk/python/tests/integration/registration/test_universal_cli.py b/sdk/python/tests/integration/registration/test_universal_cli.py index fc90108d78..9e02ded4e4 100644 --- a/sdk/python/tests/integration/registration/test_universal_cli.py +++ b/sdk/python/tests/integration/registration/test_universal_cli.py @@ -61,6 +61,8 @@ def test_universal_cli(): assertpy.assert_that(result.returncode).is_equal_to(0) result = runner.run(["data-sources", "list"], cwd=repo_path) assertpy.assert_that(result.returncode).is_equal_to(0) + result = runner.run(["permissions", "list"], cwd=repo_path) + assertpy.assert_that(result.returncode).is_equal_to(0) # entity & feature view describe commands should succeed when objects exist result = runner.run(["entities", "describe", "driver"], cwd=repo_path) @@ -91,6 +93,8 @@ def test_universal_cli(): assertpy.assert_that(result.returncode).is_equal_to(1) result = runner.run(["data-sources", "describe", "foo"], cwd=repo_path) assertpy.assert_that(result.returncode).is_equal_to(1) + result = runner.run(["permissions", "describe", "foo"], cwd=repo_path) + assertpy.assert_that(result.returncode).is_equal_to(1) # Doing another apply should be a no op, and should not cause errors result = runner.run(["apply"], cwd=repo_path) diff --git a/setup.py b/setup.py index 6fb5bfee61..4dad6c6f61 100644 --- a/setup.py +++ b/setup.py @@ -61,6 +61,7 @@ "dask[dataframe]>=2024.2.1", "prometheus_client", "psutil", + "bigtree>=0.19.2", ] GCP_REQUIRED = [ From a400f8f6535d1651a62e4aa0b5de7d003dcc248e Mon Sep 17 00:00:00 2001 From: Theodor Mihalache Date: Mon, 15 Jul 2024 17:40:43 -0400 Subject: [PATCH 082/169] Client module-grpc - Added missing auth header for calls to remote registry Signed-off-by: Theodor Mihalache Signed-off-by: Abdul Hameed --- sdk/python/feast/infra/registry/remote.py | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/sdk/python/feast/infra/registry/remote.py b/sdk/python/feast/infra/registry/remote.py index 7f20167e36..70c2af4c40 100644 --- a/sdk/python/feast/infra/registry/remote.py +++ b/sdk/python/feast/infra/registry/remote.py @@ -431,7 +431,11 @@ def delete_saved_dataset(self, name: str, project: str, commit: bool = True): name=name, project=project, commit=commit ) - self.stub.DeleteSavedDataset(request) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_auth_header(self.auth_config) + self.stub.DeleteSavedDataset(request, metadata=metadata) + else: + self.stub.DeleteSavedDataset(request) def get_saved_dataset( self, name: str, project: str, allow_cache: bool = False @@ -653,10 +657,18 @@ def list_permissions( ] def proto(self) -> RegistryProto: - return self.stub.Proto(Empty()) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_auth_header(self.auth_config) + return self.stub.Proto(Empty(), metadata=metadata) + else: + return self.stub.Proto(Empty()) def commit(self): - self.stub.Commit(Empty()) + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_auth_header(self.auth_config) + self.stub.Commit(Empty(), metadata=metadata) + else: + self.stub.Commit(Empty()) def refresh(self, project: Optional[str] = None): request = RegistryServer_pb2.RefreshRequest(project=str(project)) From dcec0cb2488b36710529d9f1707cca71dd5662bc Mon Sep 17 00:00:00 2001 From: Theodor Mihalache Date: Mon, 22 Jul 2024 16:25:45 -0400 Subject: [PATCH 083/169] Fix auth tests with permissions - Made changes to enforcer ana security manager permission checking logic Signed-off-by: Theodor Mihalache Signed-off-by: Abdul Hameed --- sdk/python/feast/permissions/client/utils.py | 4 +- sdk/python/feast/permissions/enforcer.py | 3 +- .../feast/permissions/security_manager.py | 11 +- sdk/python/feast/permissions/server/grpc.py | 25 +-- .../unit/permissions/auth/server/conftest.py | 94 ++++++++++- .../permissions/auth/server/mock_utils.py | 7 +- .../auth/server/test_auth_registry_server.py | 159 ++++++++++++++++-- .../unit/permissions/test_security_manager.py | 46 +++-- 8 files changed, 296 insertions(+), 53 deletions(-) diff --git a/sdk/python/feast/permissions/client/utils.py b/sdk/python/feast/permissions/client/utils.py index 13fa23726b..02c69c9d6e 100644 --- a/sdk/python/feast/permissions/client/utils.py +++ b/sdk/python/feast/permissions/client/utils.py @@ -7,11 +7,11 @@ def create_auth_header( auth_config: AuthConfig, -) -> tuple[tuple[str, str]]: +) -> list[tuple[bytes, bytes]]: auth_client_manager = get_auth_client_manager(auth_config) token = auth_client_manager.get_token() - return (("authorization", "Bearer " + token),) + return [(b"authorization", b"Bearer " + token.encode("utf-8"))] def create_flight_call_options(auth_config: AuthConfig) -> fl.FlightCallOptions: diff --git a/sdk/python/feast/permissions/enforcer.py b/sdk/python/feast/permissions/enforcer.py index 4c5c4475e0..6c4c8d868c 100644 --- a/sdk/python/feast/permissions/enforcer.py +++ b/sdk/python/feast/permissions/enforcer.py @@ -73,7 +73,6 @@ def enforce_policy( _permitted_resources.append(resource) break else: - _permitted_resources.append(resource) message = f"No permissions defined to manage {actions} on {type(resource)}/{resource.name}." - logger.info(f"**PERMISSION GRANTED**: {message}") + logger.info(f"**PERMISSION NOT GRANTED**: {message}") return _permitted_resources diff --git a/sdk/python/feast/permissions/security_manager.py b/sdk/python/feast/permissions/security_manager.py index 315904305e..b9c2efe878 100644 --- a/sdk/python/feast/permissions/security_manager.py +++ b/sdk/python/feast/permissions/security_manager.py @@ -101,14 +101,19 @@ def assert_permissions( FeastObject: The original `resource`, if permitted. Raises: - PermissionError: If the current user is not authorized to eecute the requested actions on the given resources (and `filter_only` is `False`). + PermissionError: If the current user is not authorized to execute the requested actions on the given resources (and `filter_only` is `False`). """ sm = get_security_manager() if sm is None: return resource - return sm.assert_permissions( + resources = sm.assert_permissions( resources=[resource], actions=actions, filter_only=False - )[0] + ) + + if len(resources) == 0: + raise PermissionError(f" resource {type(resource)} with actions {str(actions)}") + + return resources[0] def permitted_resources( diff --git a/sdk/python/feast/permissions/server/grpc.py b/sdk/python/feast/permissions/server/grpc.py index 2e1c5d1001..3c94240869 100644 --- a/sdk/python/feast/permissions/server/grpc.py +++ b/sdk/python/feast/permissions/server/grpc.py @@ -7,6 +7,7 @@ from feast.permissions.auth.auth_manager import ( get_auth_manager, ) +from feast.permissions.security_manager import get_security_manager from feast.permissions.server.utils import ( AuthManagerType, ) @@ -35,15 +36,19 @@ def grpc_interceptors( class AuthInterceptor(grpc.ServerInterceptor): def intercept_service(self, continuation, handler_call_details): - auth_manager = get_auth_manager() - access_token = auth_manager.token_extractor.extract_access_token( - metadata=dict(handler_call_details.invocation_metadata) - ) - - print(f"Fetching user for token: {len(access_token)}") - current_user = asyncio.run( - auth_manager.token_parser.user_details_from_access_token(access_token) - ) - print(f"User is: {current_user}") + sm = get_security_manager() + + if sm is not None: + auth_manager = get_auth_manager() + access_token = auth_manager.token_extractor.extract_access_token( + metadata=dict(handler_call_details.invocation_metadata) + ) + + print(f"Fetching user for token: {len(access_token)}") + current_user = asyncio.run( + auth_manager.token_parser.user_details_from_access_token(access_token) + ) + print(f"User is: {current_user}") + sm.set_current_user(current_user) return continuation(handler_call_details) diff --git a/sdk/python/tests/unit/permissions/auth/server/conftest.py b/sdk/python/tests/unit/permissions/auth/server/conftest.py index 4cac3f1d3c..d5cada7cc4 100644 --- a/sdk/python/tests/unit/permissions/auth/server/conftest.py +++ b/sdk/python/tests/unit/permissions/auth/server/conftest.py @@ -1,15 +1,74 @@ import os import tempfile from textwrap import dedent +from typing import Optional, Union import pytest import yaml -from feast import FeatureStore +from feast import ( + Entity, + FeatureStore, + FeatureView, + OnDemandFeatureView, + StreamFeatureView, +) +from feast.permissions.action import AuthzedAction +from feast.permissions.permission import Permission +from feast.permissions.policy import RoleBasedPolicy from tests.unit.permissions.auth.server.mock_utils import PROJECT_NAME from tests.utils.cli_repo_creator import CliRunner from tests.utils.http_server import free_port # noqa: E402 +list_permissions_perm = Permission( + name="list_permissions_perm", + types=Permission, + with_subclasses=False, + policy=RoleBasedPolicy(roles=["reader"]), + actions=[AuthzedAction.READ], +) + +list_entities_perm = Permission( + name="list_entities_perm", + types=Entity, + with_subclasses=False, + policy=RoleBasedPolicy(roles=["reader"]), + actions=[AuthzedAction.READ], +) + +list_fv_perm = Permission( + name="list_fv_perm", + types=FeatureView, + with_subclasses=False, + policy=RoleBasedPolicy(roles=["reader"]), + actions=[AuthzedAction.READ], +) + + +list_odfv__perm = Permission( + name="list_odfv_perm", + types=OnDemandFeatureView, + with_subclasses=False, + policy=RoleBasedPolicy(roles=["reader"]), + actions=[AuthzedAction.READ], +) + +list_sfv__perm = Permission( + name="list_sfv_perm", + types=StreamFeatureView, + with_subclasses=False, + policy=RoleBasedPolicy(roles=["reader"]), + actions=[AuthzedAction.READ], +) + +ALL_POSITIVE_TEST_NEEDED_PERMISSIONS = [ + list_entities_perm, + list_permissions_perm, + list_fv_perm, + list_odfv__perm, + list_sfv__perm, +] + @pytest.fixture( scope="module", @@ -47,9 +106,9 @@ def temp_dir(): @pytest.fixture -def feature_store(temp_dir, auth_config): +def feature_store(temp_dir, auth_config, applied_permissions): print(f"Creating store at {temp_dir}") - return _default_store(str(temp_dir), auth_config) + return _default_store(str(temp_dir), auth_config, applied_permissions) @pytest.fixture @@ -57,6 +116,26 @@ def server_port(): return free_port() +@pytest.fixture( + scope="module", + params=[ + [], + [ + Permission( + name="invalid_entity_perm", + types=Entity, + with_subclasses=False, + policy=RoleBasedPolicy(roles=["dancer"]), + actions=[AuthzedAction.READ], + ) + ], + ALL_POSITIVE_TEST_NEEDED_PERMISSIONS, + ], +) +def applied_permissions(request): + return request.param + + def _include_auth_config(file_path, auth_config: str): with open(file_path, "r") as file: existing_content = yaml.safe_load(file) @@ -70,7 +149,11 @@ def _include_auth_config(file_path, auth_config: str): print(f"Updated auth section at {file_path}") -def _default_store(temp_dir, auth_config: str): +def _default_store( + temp_dir, + auth_config: str, + permissions: Optional[Union[Permission, list[Permission]]], +): runner = CliRunner() result = runner.run(["init", PROJECT_NAME], cwd=temp_dir) repo_path = os.path.join(temp_dir, PROJECT_NAME, "feature_repo") @@ -84,4 +167,7 @@ def _default_store(temp_dir, auth_config: str): assert result.returncode == 0 fs = FeatureStore(repo_path=repo_path) + + fs.apply(permissions) + return fs diff --git a/sdk/python/tests/unit/permissions/auth/server/mock_utils.py b/sdk/python/tests/unit/permissions/auth/server/mock_utils.py index 49fa8e6f71..370472746a 100644 --- a/sdk/python/tests/unit/permissions/auth/server/mock_utils.py +++ b/sdk/python/tests/unit/permissions/auth/server/mock_utils.py @@ -1,4 +1,4 @@ -from unittest.mock import MagicMock, Mock, mock_open +from unittest.mock import MagicMock, Mock from requests import Response @@ -68,8 +68,7 @@ def _mock_kubernetes(request, monkeypatch): "feast.permissions.auth.kubernetes_token_parser.client.RbacAuthorizationV1Api.list_cluster_role_binding", lambda *args, **kwargs: clusterrolebindings["items"], ) - m = mock_open(read_data="my-token") monkeypatch.setattr( - "builtins.open", - m, + "feast.permissions.client.kubernetes_auth_client_manager.KubernetesAuthClientManager.get_token", + lambda self: "my-token", ) diff --git a/sdk/python/tests/unit/permissions/auth/server/test_auth_registry_server.py b/sdk/python/tests/unit/permissions/auth/server/test_auth_registry_server.py index be1bf0c4d8..0a79975f4f 100644 --- a/sdk/python/tests/unit/permissions/auth/server/test_auth_registry_server.py +++ b/sdk/python/tests/unit/permissions/auth/server/test_auth_registry_server.py @@ -1,13 +1,24 @@ +from datetime import datetime +from typing import Union + import assertpy +import pandas as pd import pytest import yaml from feast import FeatureStore from feast.infra.registry.remote import RemoteRegistryConfig +from feast.permissions.permission import Permission from feast.registry_server import start_server from feast.repo_config import RepoConfig from feast.wait import wait_retry_backoff # noqa: E402 from tests.unit.permissions.auth.server import mock_utils +from tests.unit.permissions.auth.server.conftest import ( + ALL_POSITIVE_TEST_NEEDED_PERMISSIONS, + list_entities_perm, + list_fv_perm, + list_permissions_perm, +) from tests.utils.http_server import check_port_open # noqa: E402 @@ -65,33 +76,149 @@ def remote_feature_store(server_port, feature_store): def test_registry_apis( - auth_config, temp_dir, server_port, start_registry_server, remote_feature_store + auth_config, + temp_dir, + server_port, + start_registry_server, + remote_feature_store, + applied_permissions, ): print(f"Runnning for\n:{auth_config}") - _test_list_entities(remote_feature_store) - _test_list_fvs(remote_feature_store) + permissions = _test_list_permissions(remote_feature_store, applied_permissions) + _test_list_entities(remote_feature_store, applied_permissions) + _test_list_fvs(remote_feature_store, applied_permissions) + _test_get_historical_features(permissions, remote_feature_store) -def _test_list_entities(fs: FeatureStore): - entities = fs.list_entities() +def _test_get_historical_features( + permissions: list[Permission], client_fs: FeatureStore +): + if _permissions_exist_in_permission_list( + ALL_POSITIVE_TEST_NEEDED_PERMISSIONS, permissions + ): + entity_df = pd.DataFrame.from_dict( + { + # entity's join key -> entity values + "driver_id": [1001, 1002, 1003], + # "event_timestamp" (reserved key) -> timestamps + "event_timestamp": [ + datetime(2021, 4, 12, 10, 59, 42), + datetime(2021, 4, 12, 8, 12, 10), + datetime(2021, 4, 12, 16, 40, 26), + ], + # (optional) label name -> label values. Feast does not process these + "label_driver_reported_satisfaction": [1, 5, 3], + # values we're using for an on-demand transformation + "val_to_add": [1, 2, 3], + "val_to_add_2": [10, 20, 30], + } + ) - assertpy.assert_that(entities).is_not_none() - assertpy.assert_that(len(entities)).is_equal_to(1) + training_df = client_fs.get_historical_features( + entity_df=entity_df, + features=[ + "driver_hourly_stats:conv_rate", + "driver_hourly_stats:acc_rate", + "driver_hourly_stats:avg_daily_trips", + "transformed_conv_rate:conv_rate_plus_val1", + "transformed_conv_rate:conv_rate_plus_val2", + ], + ).to_df() + assertpy.assert_that(training_df).is_not_none() + + +def _test_list_entities( + client_fs: FeatureStore, permissions: Union[Permission, list[Permission]] +): + entities = client_fs.list_entities() + + if not _is_auth_enabled(client_fs) or ( + _is_auth_enabled(client_fs) + and ( + _no_permission_retrieved(permissions) + or ( + _is_listing_permissions_allowed(permissions) + and _permissions_exist_in_permission_list( + [list_permissions_perm, list_entities_perm], permissions + ) + ) + ) + ): + assertpy.assert_that(entities).is_not_none() + assertpy.assert_that(len(entities)).is_equal_to(1) + assertpy.assert_that(entities[0].name).is_equal_to("driver") + else: + assertpy.assert_that(entities).is_not_none() + assertpy.assert_that(len(entities)).is_equal_to(0) + + +def _no_permission_retrieved(permissions: list[Permission]) -> bool: + return len(permissions) == 0 + + +def _test_list_permissions( + client_fs: FeatureStore, applied_permissions: Union[Permission, list[Permission]] +) -> list[Permission]: + permissions = client_fs.list_permissions() + + if not _is_auth_enabled(client_fs): + assertpy.assert_that(permissions).is_not_none() + assertpy.assert_that(len(permissions)).is_equal_to(len(applied_permissions)) + elif _is_auth_enabled(client_fs) and _permissions_exist_in_permission_list( + ALL_POSITIVE_TEST_NEEDED_PERMISSIONS, permissions + ): + assertpy.assert_that(permissions).is_not_none() + assertpy.assert_that(len(permissions)).is_equal_to( + len(ALL_POSITIVE_TEST_NEEDED_PERMISSIONS) + ) + elif _is_auth_enabled(client_fs) and _is_listing_permissions_allowed(permissions): + assertpy.assert_that(permissions).is_not_none() + assertpy.assert_that(len(permissions)).is_equal_to(1) - assertpy.assert_that(entities[0].name).is_equal_to("driver") + return permissions -def _test_list_fvs(fs: FeatureStore): - fvs = fs.list_feature_views() +def _is_listing_permissions_allowed(permissions: list[Permission]) -> bool: + return list_permissions_perm in permissions + + +def _is_auth_enabled(client_fs: FeatureStore) -> bool: + return client_fs.config.auth_config.type != "no_auth" + + +def _test_list_fvs( + client_fs: FeatureStore, permissions: Union[Permission, list[Permission]] +): + fvs = client_fs.list_feature_views() for fv in fvs: print(f"{fv.name}, {type(fv).__name__}") - assertpy.assert_that(fvs).is_not_none() - assertpy.assert_that(len(fvs)).is_equal_to(2) - - names = _to_names(fvs) - assertpy.assert_that(names).contains("driver_hourly_stats") - assertpy.assert_that(names).contains("driver_hourly_stats_fresh") + if not _is_auth_enabled(client_fs) or ( + _is_auth_enabled(client_fs) + and ( + _no_permission_retrieved(permissions) + or ( + _permissions_exist_in_permission_list( + [list_permissions_perm, list_fv_perm], permissions + ) + ) + ) + ): + assertpy.assert_that(fvs).is_not_none() + assertpy.assert_that(len(fvs)).is_equal_to(2) + + names = _to_names(fvs) + assertpy.assert_that(names).contains("driver_hourly_stats") + assertpy.assert_that(names).contains("driver_hourly_stats_fresh") + else: + assertpy.assert_that(fvs).is_not_none() + assertpy.assert_that(len(fvs)).is_equal_to(0) + + +def _permissions_exist_in_permission_list( + permission_to_test: list[Permission], permission_list: list[Permission] +) -> bool: + return all(e in permission_list for e in permission_to_test) def _to_names(items): diff --git a/sdk/python/tests/unit/permissions/test_security_manager.py b/sdk/python/tests/unit/permissions/test_security_manager.py index f98f31b2b1..5db60e20c9 100644 --- a/sdk/python/tests/unit/permissions/test_security_manager.py +++ b/sdk/python/tests/unit/permissions/test_security_manager.py @@ -13,18 +13,36 @@ def setup_module(): @pytest.mark.parametrize( - "username, requested_actions, allowed, allowed_single", + "username, requested_actions, allowed, allowed_single, raise_error", [ - (None, [], False, [False, False]), - ("r", [AuthzedAction.READ], False, [True, False]), - ("r", [AuthzedAction.UPDATE], False, [False, False]), - ("w", [AuthzedAction.READ], False, [False, False]), - ("w", [AuthzedAction.UPDATE], False, [True, False]), - ("rw", [AuthzedAction.READ], False, [True, False]), - ("rw", [AuthzedAction.UPDATE], False, [True, False]), - ("rw", [AuthzedAction.READ, AuthzedAction.UPDATE], False, [True, False]), - ("admin", [AuthzedAction.READ, AuthzedAction.UPDATE], True, [True, True]), - ("admin", QUERY + [AuthzedAction.UPDATE], True, [True, True]), + (None, [], False, [False, False], [True, True]), + ("r", [AuthzedAction.READ], False, [True, False], [True, True]), + ("r", [AuthzedAction.UPDATE], False, [False, False], [True, True]), + ("w", [AuthzedAction.READ], False, [False, False], [True, True]), + ("w", [AuthzedAction.UPDATE], False, [True, False], [True, True]), + ("rw", [AuthzedAction.READ], False, [True, False], [True, True]), + ("rw", [AuthzedAction.UPDATE], False, [True, False], [True, True]), + ( + "rw", + [AuthzedAction.READ, AuthzedAction.UPDATE], + False, + [False, False], + [True, True], + ), + ( + "admin", + [AuthzedAction.READ, AuthzedAction.UPDATE], + False, + [False, True], + [True, False], + ), + ( + "admin", + QUERY + [AuthzedAction.UPDATE], + False, + [False, False], + [True, True], + ), ], ) def test_access_SecuredFeatureView( @@ -35,6 +53,7 @@ def test_access_SecuredFeatureView( requested_actions, allowed, allowed_single, + raise_error, ): sm = security_manager resources = feature_views @@ -52,6 +71,9 @@ def test_access_SecuredFeatureView( if allowed_single[i]: result = assert_permissions(resource=r, actions=requested_actions) assertpy.assert_that(result).is_equal_to(r) - else: + elif raise_error[i]: with pytest.raises(PermissionError): assert_permissions(resource=r, actions=requested_actions) + else: + result = assert_permissions(resource=r, actions=requested_actions) + assertpy.assert_that(result).is_none() From db1cfd6fe65e8a6d97c3e09f953d8f0fecda6ecc Mon Sep 17 00:00:00 2001 From: Theodor Mihalache Date: Wed, 24 Jul 2024 09:40:33 -0400 Subject: [PATCH 084/169] Fix auth tests with permissions - Made changes following review Signed-off-by: Theodor Mihalache Signed-off-by: Abdul Hameed --- sdk/python/tests/unit/permissions/auth/server/conftest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/python/tests/unit/permissions/auth/server/conftest.py b/sdk/python/tests/unit/permissions/auth/server/conftest.py index d5cada7cc4..a125c9d897 100644 --- a/sdk/python/tests/unit/permissions/auth/server/conftest.py +++ b/sdk/python/tests/unit/permissions/auth/server/conftest.py @@ -152,7 +152,7 @@ def _include_auth_config(file_path, auth_config: str): def _default_store( temp_dir, auth_config: str, - permissions: Optional[Union[Permission, list[Permission]]], + permissions: list[Permission], ): runner = CliRunner() result = runner.run(["init", PROJECT_NAME], cwd=temp_dir) From 93e6f4d8f4ed66af78f7a19eb28fe26a5009dc40 Mon Sep 17 00:00:00 2001 From: Theodor Mihalache Date: Wed, 24 Jul 2024 09:41:16 -0400 Subject: [PATCH 085/169] Fix auth tests with permissions - Made changes following review Signed-off-by: Theodor Mihalache Signed-off-by: Abdul Hameed --- sdk/python/tests/unit/permissions/auth/server/conftest.py | 1 - 1 file changed, 1 deletion(-) diff --git a/sdk/python/tests/unit/permissions/auth/server/conftest.py b/sdk/python/tests/unit/permissions/auth/server/conftest.py index a125c9d897..6dc2a96821 100644 --- a/sdk/python/tests/unit/permissions/auth/server/conftest.py +++ b/sdk/python/tests/unit/permissions/auth/server/conftest.py @@ -1,7 +1,6 @@ import os import tempfile from textwrap import dedent -from typing import Optional, Union import pytest import yaml From a0a68ef213625bd15cf5e3165bdf4a2db6a5cc17 Mon Sep 17 00:00:00 2001 From: Theodor Mihalache Date: Wed, 24 Jul 2024 14:28:43 -0400 Subject: [PATCH 086/169] Fix auth tests with permissions - Made changes following review Signed-off-by: Theodor Mihalache Signed-off-by: Abdul Hameed --- sdk/python/feast/permissions/enforcer.py | 3 +- .../feast/permissions/security_manager.py | 12 +- .../unit/permissions/auth/server/conftest.py | 33 ++-- .../auth/server/test_auth_registry_server.py | 172 ++++++++++-------- .../unit/permissions/test_security_manager.py | 35 ++-- 5 files changed, 144 insertions(+), 111 deletions(-) diff --git a/sdk/python/feast/permissions/enforcer.py b/sdk/python/feast/permissions/enforcer.py index 6c4c8d868c..11db7bace0 100644 --- a/sdk/python/feast/permissions/enforcer.py +++ b/sdk/python/feast/permissions/enforcer.py @@ -74,5 +74,6 @@ def enforce_policy( break else: message = f"No permissions defined to manage {actions} on {type(resource)}/{resource.name}." - logger.info(f"**PERMISSION NOT GRANTED**: {message}") + logger.exception(f"**PERMISSION NOT GRANTED**: {message}") + raise PermissionError(message) return _permitted_resources diff --git a/sdk/python/feast/permissions/security_manager.py b/sdk/python/feast/permissions/security_manager.py index b9c2efe878..178db6e6e9 100644 --- a/sdk/python/feast/permissions/security_manager.py +++ b/sdk/python/feast/permissions/security_manager.py @@ -87,7 +87,6 @@ def assert_permissions( def assert_permissions( resource: FeastObject, actions: Union[AuthzedAction, List[AuthzedAction]], - filter_only: bool = False, ) -> FeastObject: """ A utility function to invoke the `assert_permissions` method on the global security manager. @@ -101,19 +100,14 @@ def assert_permissions( FeastObject: The original `resource`, if permitted. Raises: - PermissionError: If the current user is not authorized to execute the requested actions on the given resources (and `filter_only` is `False`). + PermissionError: If the current user is not authorized to execute the requested actions on the given resources. """ sm = get_security_manager() if sm is None: return resource - resources = sm.assert_permissions( + return sm.assert_permissions( resources=[resource], actions=actions, filter_only=False - ) - - if len(resources) == 0: - raise PermissionError(f" resource {type(resource)} with actions {str(actions)}") - - return resources[0] + )[0] def permitted_resources( diff --git a/sdk/python/tests/unit/permissions/auth/server/conftest.py b/sdk/python/tests/unit/permissions/auth/server/conftest.py index 6dc2a96821..079c5fdce0 100644 --- a/sdk/python/tests/unit/permissions/auth/server/conftest.py +++ b/sdk/python/tests/unit/permissions/auth/server/conftest.py @@ -22,7 +22,6 @@ list_permissions_perm = Permission( name="list_permissions_perm", types=Permission, - with_subclasses=False, policy=RoleBasedPolicy(roles=["reader"]), actions=[AuthzedAction.READ], ) @@ -44,7 +43,7 @@ ) -list_odfv__perm = Permission( +list_odfv_perm = Permission( name="list_odfv_perm", types=OnDemandFeatureView, with_subclasses=False, @@ -52,7 +51,7 @@ actions=[AuthzedAction.READ], ) -list_sfv__perm = Permission( +list_sfv_perm = Permission( name="list_sfv_perm", types=StreamFeatureView, with_subclasses=False, @@ -60,13 +59,13 @@ actions=[AuthzedAction.READ], ) -ALL_POSITIVE_TEST_NEEDED_PERMISSIONS = [ - list_entities_perm, - list_permissions_perm, - list_fv_perm, - list_odfv__perm, - list_sfv__perm, -] +invalid_list_entities_perm = Permission( + name="invalid_list_entity_perm", + types=Entity, + with_subclasses=False, + policy=RoleBasedPolicy(roles=["dancer"]), + actions=[AuthzedAction.READ], +) @pytest.fixture( @@ -119,16 +118,14 @@ def server_port(): scope="module", params=[ [], + [invalid_list_entities_perm], [ - Permission( - name="invalid_entity_perm", - types=Entity, - with_subclasses=False, - policy=RoleBasedPolicy(roles=["dancer"]), - actions=[AuthzedAction.READ], - ) + list_entities_perm, + list_permissions_perm, + list_fv_perm, + list_odfv_perm, + list_sfv_perm, ], - ALL_POSITIVE_TEST_NEEDED_PERMISSIONS, ], ) def applied_permissions(request): diff --git a/sdk/python/tests/unit/permissions/auth/server/test_auth_registry_server.py b/sdk/python/tests/unit/permissions/auth/server/test_auth_registry_server.py index 0a79975f4f..80dda8323b 100644 --- a/sdk/python/tests/unit/permissions/auth/server/test_auth_registry_server.py +++ b/sdk/python/tests/unit/permissions/auth/server/test_auth_registry_server.py @@ -1,5 +1,4 @@ from datetime import datetime -from typing import Union import assertpy import pandas as pd @@ -14,10 +13,12 @@ from feast.wait import wait_retry_backoff # noqa: E402 from tests.unit.permissions.auth.server import mock_utils from tests.unit.permissions.auth.server.conftest import ( - ALL_POSITIVE_TEST_NEEDED_PERMISSIONS, + invalid_list_entities_perm, list_entities_perm, list_fv_perm, + list_odfv_perm, list_permissions_perm, + list_sfv_perm, ) from tests.utils.http_server import check_port_open # noqa: E402 @@ -87,62 +88,57 @@ def test_registry_apis( permissions = _test_list_permissions(remote_feature_store, applied_permissions) _test_list_entities(remote_feature_store, applied_permissions) _test_list_fvs(remote_feature_store, applied_permissions) - _test_get_historical_features(permissions, remote_feature_store) - -def _test_get_historical_features( - permissions: list[Permission], client_fs: FeatureStore -): if _permissions_exist_in_permission_list( - ALL_POSITIVE_TEST_NEEDED_PERMISSIONS, permissions + [ + list_entities_perm, + list_permissions_perm, + list_fv_perm, + list_odfv_perm, + list_sfv_perm, + ], + permissions, ): - entity_df = pd.DataFrame.from_dict( - { - # entity's join key -> entity values - "driver_id": [1001, 1002, 1003], - # "event_timestamp" (reserved key) -> timestamps - "event_timestamp": [ - datetime(2021, 4, 12, 10, 59, 42), - datetime(2021, 4, 12, 8, 12, 10), - datetime(2021, 4, 12, 16, 40, 26), - ], - # (optional) label name -> label values. Feast does not process these - "label_driver_reported_satisfaction": [1, 5, 3], - # values we're using for an on-demand transformation - "val_to_add": [1, 2, 3], - "val_to_add_2": [10, 20, 30], - } - ) - - training_df = client_fs.get_historical_features( - entity_df=entity_df, - features=[ - "driver_hourly_stats:conv_rate", - "driver_hourly_stats:acc_rate", - "driver_hourly_stats:avg_daily_trips", - "transformed_conv_rate:conv_rate_plus_val1", - "transformed_conv_rate:conv_rate_plus_val2", + _test_get_historical_features(remote_feature_store) + + +def _test_get_historical_features(client_fs: FeatureStore): + entity_df = pd.DataFrame.from_dict( + { + # entity's join key -> entity values + "driver_id": [1001, 1002, 1003], + # "event_timestamp" (reserved key) -> timestamps + "event_timestamp": [ + datetime(2021, 4, 12, 10, 59, 42), + datetime(2021, 4, 12, 8, 12, 10), + datetime(2021, 4, 12, 16, 40, 26), ], - ).to_df() - assertpy.assert_that(training_df).is_not_none() + # (optional) label name -> label values. Feast does not process these + "label_driver_reported_satisfaction": [1, 5, 3], + # values we're using for an on-demand transformation + "val_to_add": [1, 2, 3], + "val_to_add_2": [10, 20, 30], + } + ) + training_df = client_fs.get_historical_features( + entity_df=entity_df, + features=[ + "driver_hourly_stats:conv_rate", + "driver_hourly_stats:acc_rate", + "driver_hourly_stats:avg_daily_trips", + "transformed_conv_rate:conv_rate_plus_val1", + "transformed_conv_rate:conv_rate_plus_val2", + ], + ).to_df() + assertpy.assert_that(training_df).is_not_none() -def _test_list_entities( - client_fs: FeatureStore, permissions: Union[Permission, list[Permission]] -): + +def _test_list_entities(client_fs: FeatureStore, permissions: list[Permission]): entities = client_fs.list_entities() - if not _is_auth_enabled(client_fs) or ( - _is_auth_enabled(client_fs) - and ( - _no_permission_retrieved(permissions) - or ( - _is_listing_permissions_allowed(permissions) - and _permissions_exist_in_permission_list( - [list_permissions_perm, list_entities_perm], permissions - ) - ) - ) + if not _is_auth_enabled(client_fs) or _is_permission_enabled( + client_fs, permissions, list_entities_perm ): assertpy.assert_that(entities).is_not_none() assertpy.assert_that(len(entities)).is_equal_to(1) @@ -157,19 +153,41 @@ def _no_permission_retrieved(permissions: list[Permission]) -> bool: def _test_list_permissions( - client_fs: FeatureStore, applied_permissions: Union[Permission, list[Permission]] + client_fs: FeatureStore, applied_permissions: list[Permission] ) -> list[Permission]: - permissions = client_fs.list_permissions() + if _is_auth_enabled(client_fs) and _permissions_exist_in_permission_list( + [invalid_list_entities_perm], applied_permissions + ): + with pytest.raises(Exception): + client_fs.list_permissions() + return [] + else: + permissions = client_fs.list_permissions() if not _is_auth_enabled(client_fs): assertpy.assert_that(permissions).is_not_none() assertpy.assert_that(len(permissions)).is_equal_to(len(applied_permissions)) elif _is_auth_enabled(client_fs) and _permissions_exist_in_permission_list( - ALL_POSITIVE_TEST_NEEDED_PERMISSIONS, permissions + [ + list_entities_perm, + list_permissions_perm, + list_fv_perm, + list_odfv_perm, + list_sfv_perm, + ], + permissions, ): assertpy.assert_that(permissions).is_not_none() assertpy.assert_that(len(permissions)).is_equal_to( - len(ALL_POSITIVE_TEST_NEEDED_PERMISSIONS) + len( + [ + list_entities_perm, + list_permissions_perm, + list_fv_perm, + list_odfv_perm, + list_sfv_perm, + ] + ) ) elif _is_auth_enabled(client_fs) and _is_listing_permissions_allowed(permissions): assertpy.assert_that(permissions).is_not_none() @@ -186,23 +204,20 @@ def _is_auth_enabled(client_fs: FeatureStore) -> bool: return client_fs.config.auth_config.type != "no_auth" -def _test_list_fvs( - client_fs: FeatureStore, permissions: Union[Permission, list[Permission]] -): - fvs = client_fs.list_feature_views() - for fv in fvs: - print(f"{fv.name}, {type(fv).__name__}") - - if not _is_auth_enabled(client_fs) or ( - _is_auth_enabled(client_fs) - and ( - _no_permission_retrieved(permissions) - or ( - _permissions_exist_in_permission_list( - [list_permissions_perm, list_fv_perm], permissions - ) - ) - ) +def _test_list_fvs(client_fs: FeatureStore, permissions: list[Permission]): + if _is_auth_enabled(client_fs) and _permissions_exist_in_permission_list( + [invalid_list_entities_perm], permissions + ): + with pytest.raises(Exception): + client_fs.list_feature_views() + return [] + else: + fvs = client_fs.list_feature_views() + for fv in fvs: + print(f"{fv.name}, {type(fv).__name__}") + + if not _is_auth_enabled(client_fs) or _is_permission_enabled( + client_fs, permissions, list_fv_perm ): assertpy.assert_that(fvs).is_not_none() assertpy.assert_that(len(fvs)).is_equal_to(2) @@ -221,5 +236,20 @@ def _permissions_exist_in_permission_list( return all(e in permission_list for e in permission_to_test) +def _is_permission_enabled( + client_fs: FeatureStore, + permissions: list[Permission], + permission: Permission, +): + return _is_auth_enabled(client_fs) and ( + _no_permission_retrieved(permissions) + or ( + _permissions_exist_in_permission_list( + [list_permissions_perm, permission], permissions + ) + ) + ) + + def _to_names(items): return [i.name for i in items] diff --git a/sdk/python/tests/unit/permissions/test_security_manager.py b/sdk/python/tests/unit/permissions/test_security_manager.py index 5db60e20c9..5dd0261c26 100644 --- a/sdk/python/tests/unit/permissions/test_security_manager.py +++ b/sdk/python/tests/unit/permissions/test_security_manager.py @@ -13,21 +13,22 @@ def setup_module(): @pytest.mark.parametrize( - "username, requested_actions, allowed, allowed_single, raise_error", + "username, requested_actions, allowed, allowed_single, raise_error_in_assert, raise_error_in_permit", [ - (None, [], False, [False, False], [True, True]), - ("r", [AuthzedAction.READ], False, [True, False], [True, True]), - ("r", [AuthzedAction.UPDATE], False, [False, False], [True, True]), - ("w", [AuthzedAction.READ], False, [False, False], [True, True]), - ("w", [AuthzedAction.UPDATE], False, [True, False], [True, True]), - ("rw", [AuthzedAction.READ], False, [True, False], [True, True]), - ("rw", [AuthzedAction.UPDATE], False, [True, False], [True, True]), + (None, [], False, [False, False], [True, True], False), + ("r", [AuthzedAction.READ], False, [True, False], [True, True], False), + ("r", [AuthzedAction.UPDATE], False, [False, False], [True, True], False), + ("w", [AuthzedAction.READ], False, [False, False], [True, True], False), + ("w", [AuthzedAction.UPDATE], False, [True, False], [True, True], False), + ("rw", [AuthzedAction.READ], False, [True, False], [True, True], False), + ("rw", [AuthzedAction.UPDATE], False, [True, False], [True, True], False), ( "rw", [AuthzedAction.READ, AuthzedAction.UPDATE], False, [False, False], [True, True], + True, ), ( "admin", @@ -35,6 +36,7 @@ def setup_module(): False, [False, True], [True, False], + True, ), ( "admin", @@ -42,6 +44,7 @@ def setup_module(): False, [False, False], [True, True], + True, ), ], ) @@ -53,17 +56,25 @@ def test_access_SecuredFeatureView( requested_actions, allowed, allowed_single, - raise_error, + raise_error_in_assert, + raise_error_in_permit, ): sm = security_manager resources = feature_views user = users.get(username) sm.set_current_user(user) - result = permitted_resources(resources=resources, actions=requested_actions) + + result = [] + if raise_error_in_permit: + with pytest.raises(PermissionError): + result = permitted_resources(resources=resources, actions=requested_actions) + else: + result = permitted_resources(resources=resources, actions=requested_actions) + if allowed: assertpy.assert_that(result).is_equal_to(resources) - else: + elif not raise_error_in_permit: filtered = [r for i, r in enumerate(resources) if allowed_single[i]] assertpy.assert_that(result).is_equal_to(filtered) @@ -71,7 +82,7 @@ def test_access_SecuredFeatureView( if allowed_single[i]: result = assert_permissions(resource=r, actions=requested_actions) assertpy.assert_that(result).is_equal_to(r) - elif raise_error[i]: + elif raise_error_in_assert[i]: with pytest.raises(PermissionError): assert_permissions(resource=r, actions=requested_actions) else: From b4e0e080b9b1c50b2e98b0c80c7ace90f31165bc Mon Sep 17 00:00:00 2001 From: lokeshrangineni Date: Thu, 25 Jul 2024 17:32:25 -0400 Subject: [PATCH 087/169] Moved the common fixtures to the root conftest.py or auth_permissions_util.py (#54) * Moved the common fixtures to the root conftest.py or auth_permissions_util.py Signed-off-by: Lokesh Rangineni Signed-off-by: Lokesh Rangineni * Adding missed dependency and regenerated the requirements files. Signed-off-by: Lokesh Rangineni Signed-off-by: Lokesh Rangineni * Addinig missing changes from the original PR. Signed-off-by: Lokesh Rangineni Signed-off-by: Lokesh Rangineni --------- Signed-off-by: Lokesh Rangineni Signed-off-by: Abdul Hameed --- .../permissions/auth/oidc_token_parser.py | 7 +- .../client/http_auth_requests_wrapper.py | 3 +- .../oidc_authentication_client_manager.py | 2 +- .../requirements/py3.10-ci-requirements.txt | 18 ++ .../requirements/py3.11-ci-requirements.txt | 19 +- .../requirements/py3.9-ci-requirements.txt | 19 +- sdk/python/tests/conftest.py | 31 +++ .../permissions/test_auth_permission.py | 12 + .../unit/permissions/auth/server/conftest.py | 125 +-------- .../permissions/auth/server/mock_utils.py | 6 +- .../auth/server/test_auth_registry_server.py | 30 +-- .../tests/utils/auth_permissions_util.py | 244 ++++++++++++++++++ setup.py | 2 + 13 files changed, 366 insertions(+), 152 deletions(-) create mode 100644 sdk/python/tests/integration/permissions/test_auth_permission.py create mode 100644 sdk/python/tests/utils/auth_permissions_util.py diff --git a/sdk/python/feast/permissions/auth/oidc_token_parser.py b/sdk/python/feast/permissions/auth/oidc_token_parser.py index 7e1d7da613..355004f4de 100644 --- a/sdk/python/feast/permissions/auth/oidc_token_parser.py +++ b/sdk/python/feast/permissions/auth/oidc_token_parser.py @@ -73,7 +73,11 @@ async def user_details_from_access_token(self, access_token: str) -> User: signing_key.key, algorithms=["RS256"], audience="account", - options={"verify_exp": True}, + options={ + "verify_aud": False, + "verify_signature": True, + "verify_exp": True, + }, ) if "preferred_username" not in data: @@ -99,4 +103,5 @@ async def user_details_from_access_token(self, access_token: str) -> User: logger.info(f"Extracted user {current_user} and roles {roles}") return User(username=current_user, roles=roles) except jwt.exceptions.InvalidTokenError: + logger.exception("Exception while parsing the token:") raise AuthenticationError("Invalid token.") diff --git a/sdk/python/feast/permissions/client/http_auth_requests_wrapper.py b/sdk/python/feast/permissions/client/http_auth_requests_wrapper.py index 59ec0b6418..eba9af5ead 100644 --- a/sdk/python/feast/permissions/client/http_auth_requests_wrapper.py +++ b/sdk/python/feast/permissions/client/http_auth_requests_wrapper.py @@ -11,8 +11,7 @@ class AuthenticatedRequestsSession(Session): def __init__(self, auth_token: str): super().__init__() - self.auth_token = auth_token - self.headers.update({"Authorization": f"Bearer {self.auth_token}"}) + self.headers.update({"Authorization": f"Bearer {auth_token}"}) def get_http_auth_requests_session(auth_config: AuthConfig) -> Session: diff --git a/sdk/python/feast/permissions/client/oidc_authentication_client_manager.py b/sdk/python/feast/permissions/client/oidc_authentication_client_manager.py index 871c928cf1..544764aae0 100644 --- a/sdk/python/feast/permissions/client/oidc_authentication_client_manager.py +++ b/sdk/python/feast/permissions/client/oidc_authentication_client_manager.py @@ -54,5 +54,5 @@ def get_token(self): return access_token else: raise RuntimeError( - "Failed to obtain access token: {token_response.status_code} - {token_response.text}" + f"""Failed to obtain oidc access token:url=[{token_endpoint}] {token_response.status_code} - {token_response.text}""" ) diff --git a/sdk/python/requirements/py3.10-ci-requirements.txt b/sdk/python/requirements/py3.10-ci-requirements.txt index 52525ac63b..89459d1a69 100644 --- a/sdk/python/requirements/py3.10-ci-requirements.txt +++ b/sdk/python/requirements/py3.10-ci-requirements.txt @@ -40,6 +40,8 @@ async-timeout==4.0.3 # via # aiohttp # redis +async-property==0.2.2 + # via python-keycloak atpublic==4.1.0 # via ibis-framework attrs==23.2.0 @@ -63,6 +65,8 @@ beautifulsoup4==4.12.3 # via nbconvert bidict==0.23.1 # via ibis-framework +bigtree==0.19.2 + # via feast (setup.py) bleach==6.1.0 # via nbconvert boto3==1.34.131 @@ -131,6 +135,7 @@ cryptography==42.0.8 # azure-identity # azure-storage-blob # great-expectations + # jwcrypto # moto # msal # pyjwt @@ -154,6 +159,8 @@ defusedxml==0.7.1 # via nbconvert deltalake==0.18.1 # via feast (setup.py) +deprecation==2.1.0 + # via python-keycloak dill==0.3.8 # via feast (setup.py) distlib==0.3.8 @@ -300,6 +307,7 @@ httpx==0.27.0 # feast (setup.py) # fastapi # jupyterlab + # python-keycloak ibis-framework[duckdb]==9.1.0 # via # feast (setup.py) @@ -409,6 +417,8 @@ jupyterlab-server==2.27.2 # notebook jupyterlab-widgets==3.0.11 # via ipywidgets +jwcrypto==1.5.6 + # via python-keycloak kubernetes==20.13.0 # via feast (setup.py) locket==1.0.0 @@ -502,6 +512,7 @@ packaging==24.1 # build # dask # db-dtypes + # deprecation # google-cloud-bigquery # great-expectations # gunicorn @@ -712,6 +723,8 @@ python-dotenv==1.0.1 # via uvicorn python-json-logger==2.0.7 # via jupyter-events +python-keycloak==4.2.2 + # via feast (setup.py) python-multipart==0.0.9 # via fastapi pytz==2024.1 @@ -760,7 +773,9 @@ requests==2.32.3 # kubernetes # moto # msal + # python-keycloak # requests-oauthlib + # requests-toolbelt # responses # singlestoredb # snowflake-connector-python @@ -768,6 +783,8 @@ requests==2.32.3 # trino requests-oauthlib==2.0.0 # via kubernetes +requests-toolbelt==1.0.0 + # via python-keycloak responses==0.25.3 # via moto rfc3339-validator==0.1.4 @@ -972,6 +989,7 @@ typing-extensions==4.12.2 # great-expectations # ibis-framework # ipython + # jwcrypto # mypy # psycopg # psycopg-pool diff --git a/sdk/python/requirements/py3.11-ci-requirements.txt b/sdk/python/requirements/py3.11-ci-requirements.txt index b58d12f46f..fd0b5a6d26 100644 --- a/sdk/python/requirements/py3.11-ci-requirements.txt +++ b/sdk/python/requirements/py3.11-ci-requirements.txt @@ -36,6 +36,8 @@ asttokens==2.4.1 # via stack-data async-lru==2.0.4 # via jupyterlab +async-property==0.2.2 + # via python-keycloak atpublic==4.1.0 # via ibis-framework attrs==23.2.0 @@ -59,6 +61,8 @@ beautifulsoup4==4.12.3 # via nbconvert bidict==0.23.1 # via ibis-framework +bigtree==0.19.2 + # via feast (setup.py) bleach==6.1.0 # via nbconvert boto3==1.34.131 @@ -127,6 +131,7 @@ cryptography==42.0.8 # azure-identity # azure-storage-blob # great-expectations + # jwcrypto # moto # msal # pyjwt @@ -150,6 +155,8 @@ defusedxml==0.7.1 # via nbconvert deltalake==0.18.1 # via feast (setup.py) +deprecation==2.1.0 + # via python-keycloak dill==0.3.8 # via feast (setup.py) distlib==0.3.8 @@ -291,6 +298,7 @@ httpx==0.27.0 # feast (setup.py) # fastapi # jupyterlab + # python-keycloak ibis-framework[duckdb]==9.1.0 # via # feast (setup.py) @@ -400,6 +408,8 @@ jupyterlab-server==2.27.2 # notebook jupyterlab-widgets==3.0.11 # via ipywidgets +jwcrypto==1.5.6 + # via python-keycloak kubernetes==20.13.0 # via feast (setup.py) locket==1.0.0 @@ -493,6 +503,7 @@ packaging==24.1 # build # dask # db-dtypes + # deprecation # google-cloud-bigquery # great-expectations # gunicorn @@ -703,6 +714,8 @@ python-dotenv==1.0.1 # via uvicorn python-json-logger==2.0.7 # via jupyter-events +python-keycloak==4.2.2 + # via feast (setup.py) python-multipart==0.0.9 # via fastapi pytz==2024.1 @@ -751,7 +764,9 @@ requests==2.32.3 # kubernetes # moto # msal + # python-keycloak # requests-oauthlib + # requests-toolbelt # responses # singlestoredb # snowflake-connector-python @@ -759,6 +774,8 @@ requests==2.32.3 # trino requests-oauthlib==2.0.0 # via kubernetes +requests-toolbelt==1.0.0 + # via python-keycloak responses==0.25.3 # via moto rfc3339-validator==0.1.4 @@ -951,6 +968,7 @@ typing-extensions==4.12.2 # great-expectations # ibis-framework # ipython + # jwcrypto # mypy # psycopg # psycopg-pool @@ -1028,4 +1046,3 @@ yarl==1.9.4 # via aiohttp zipp==3.19.1 # via importlib-metadata -bigtree==0.19.2 diff --git a/sdk/python/requirements/py3.9-ci-requirements.txt b/sdk/python/requirements/py3.9-ci-requirements.txt index 422fea1602..be30f032a9 100644 --- a/sdk/python/requirements/py3.9-ci-requirements.txt +++ b/sdk/python/requirements/py3.9-ci-requirements.txt @@ -40,6 +40,8 @@ async-timeout==4.0.3 # via # aiohttp # redis +async-property==0.2.2 + # via python-keycloak atpublic==4.1.0 # via ibis-framework attrs==23.2.0 @@ -63,6 +65,8 @@ beautifulsoup4==4.12.3 # via nbconvert bidict==0.23.1 # via ibis-framework +bigtree==0.19.2 + # via feast (setup.py) bleach==6.1.0 # via nbconvert boto3==1.34.131 @@ -131,6 +135,7 @@ cryptography==42.0.8 # azure-identity # azure-storage-blob # great-expectations + # jwcrypto # moto # msal # pyjwt @@ -154,6 +159,8 @@ defusedxml==0.7.1 # via nbconvert deltalake==0.18.1 # via feast (setup.py) +deprecation==2.1.0 + # via python-keycloak dill==0.3.8 # via feast (setup.py) distlib==0.3.8 @@ -300,6 +307,7 @@ httpx==0.27.0 # feast (setup.py) # fastapi # jupyterlab + # python-keycloak ibis-framework[duckdb]==9.0.0 # via # feast (setup.py) @@ -418,6 +426,8 @@ jupyterlab-server==2.27.2 # notebook jupyterlab-widgets==3.0.11 # via ipywidgets +jwcrypto==1.5.6 + # via python-keycloak kubernetes==20.13.0 # via feast (setup.py) locket==1.0.0 @@ -511,6 +521,7 @@ packaging==24.1 # build # dask # db-dtypes + # deprecation # google-cloud-bigquery # great-expectations # gunicorn @@ -721,6 +732,8 @@ python-dotenv==1.0.1 # via uvicorn python-json-logger==2.0.7 # via jupyter-events +python-keycloak==4.2.2 + # via feast (setup.py) python-multipart==0.0.9 # via fastapi pytz==2024.1 @@ -769,7 +782,9 @@ requests==2.32.3 # kubernetes # moto # msal + # python-keycloak # requests-oauthlib + # requests-toolbelt # responses # singlestoredb # snowflake-connector-python @@ -777,6 +792,8 @@ requests==2.32.3 # trino requests-oauthlib==2.0.0 # via kubernetes +requests-toolbelt==1.0.0 + # via python-keycloak responses==0.25.3 # via moto rfc3339-validator==0.1.4 @@ -984,6 +1001,7 @@ typing-extensions==4.12.2 # great-expectations # ibis-framework # ipython + # jwcrypto # mypy # psycopg # psycopg-pool @@ -1064,4 +1082,3 @@ yarl==1.9.4 # via aiohttp zipp==3.19.1 # via importlib-metadata -bigtree==0.19.2 diff --git a/sdk/python/tests/conftest.py b/sdk/python/tests/conftest.py index 1fd510d104..d42894b89f 100644 --- a/sdk/python/tests/conftest.py +++ b/sdk/python/tests/conftest.py @@ -15,6 +15,7 @@ import multiprocessing import os import random +import tempfile from datetime import timedelta from multiprocessing import Process from sys import platform @@ -24,6 +25,7 @@ import pandas as pd import pytest from _pytest.nodes import Item +from testcontainers.keycloak import KeycloakContainer from feast.data_source import DataSource from feast.feature_store import FeatureStore # noqa: E402 @@ -54,6 +56,10 @@ driver, location, ) +from tests.utils.auth_permissions_util import ( + default_store, + setup_permissions_on_keycloak, +) from tests.utils.http_server import check_port_open, free_port # noqa: E402 logger = logging.getLogger(__name__) @@ -406,3 +412,28 @@ def fake_document_data(environment: Environment) -> Tuple[pd.DataFrame, DataSour environment.feature_store.project, ) return df, data_source + + +@pytest.fixture +def temp_dir(): + with tempfile.TemporaryDirectory() as temp_dir: + print(f"Created {temp_dir}") + yield temp_dir + + +@pytest.fixture +def start_keycloak_server(): + with KeycloakContainer("quay.io/keycloak/keycloak:24.0.1") as keycloak_container: + setup_permissions_on_keycloak(keycloak_container.get_client()) + yield keycloak_container.get_url() + + +@pytest.fixture +def server_port(): + return free_port() + + +@pytest.fixture +def feature_store(temp_dir, auth_config, applied_permissions): + print(f"Creating store at {temp_dir}") + return default_store(str(temp_dir), auth_config, applied_permissions) diff --git a/sdk/python/tests/integration/permissions/test_auth_permission.py b/sdk/python/tests/integration/permissions/test_auth_permission.py new file mode 100644 index 0000000000..47f3674567 --- /dev/null +++ b/sdk/python/tests/integration/permissions/test_auth_permission.py @@ -0,0 +1,12 @@ +import pytest + + +@pytest.mark.integration +def test_oidc_auth_permissions(start_keycloak_server, temp_dir): + print("starting the test") + ## TODO: + # 1 create the store + # 2 create the permissions + # 3 Spin up feature server + # 4 test remote online read with no auth and oidc auth. + # 5 spin up the registry server and test the no auth and oidc auth on all end points. diff --git a/sdk/python/tests/unit/permissions/auth/server/conftest.py b/sdk/python/tests/unit/permissions/auth/server/conftest.py index 079c5fdce0..2b9428a70c 100644 --- a/sdk/python/tests/unit/permissions/auth/server/conftest.py +++ b/sdk/python/tests/unit/permissions/auth/server/conftest.py @@ -1,70 +1,14 @@ -import os -import tempfile from textwrap import dedent import pytest -import yaml -from feast import ( - Entity, - FeatureStore, - FeatureView, - OnDemandFeatureView, - StreamFeatureView, -) -from feast.permissions.action import AuthzedAction -from feast.permissions.permission import Permission -from feast.permissions.policy import RoleBasedPolicy -from tests.unit.permissions.auth.server.mock_utils import PROJECT_NAME -from tests.utils.cli_repo_creator import CliRunner -from tests.utils.http_server import free_port # noqa: E402 - -list_permissions_perm = Permission( - name="list_permissions_perm", - types=Permission, - policy=RoleBasedPolicy(roles=["reader"]), - actions=[AuthzedAction.READ], -) - -list_entities_perm = Permission( - name="list_entities_perm", - types=Entity, - with_subclasses=False, - policy=RoleBasedPolicy(roles=["reader"]), - actions=[AuthzedAction.READ], -) - -list_fv_perm = Permission( - name="list_fv_perm", - types=FeatureView, - with_subclasses=False, - policy=RoleBasedPolicy(roles=["reader"]), - actions=[AuthzedAction.READ], -) - - -list_odfv_perm = Permission( - name="list_odfv_perm", - types=OnDemandFeatureView, - with_subclasses=False, - policy=RoleBasedPolicy(roles=["reader"]), - actions=[AuthzedAction.READ], -) - -list_sfv_perm = Permission( - name="list_sfv_perm", - types=StreamFeatureView, - with_subclasses=False, - policy=RoleBasedPolicy(roles=["reader"]), - actions=[AuthzedAction.READ], -) - -invalid_list_entities_perm = Permission( - name="invalid_list_entity_perm", - types=Entity, - with_subclasses=False, - policy=RoleBasedPolicy(roles=["dancer"]), - actions=[AuthzedAction.READ], +from tests.utils.auth_permissions_util import ( + invalid_list_entities_perm, + list_entities_perm, + list_fv_perm, + list_odfv_perm, + list_permissions_perm, + list_sfv_perm, ) @@ -96,24 +40,6 @@ def auth_config(request): return request.param -@pytest.fixture -def temp_dir(): - with tempfile.TemporaryDirectory() as temp_dir: - print(f"Created {temp_dir}") - yield temp_dir - - -@pytest.fixture -def feature_store(temp_dir, auth_config, applied_permissions): - print(f"Creating store at {temp_dir}") - return _default_store(str(temp_dir), auth_config, applied_permissions) - - -@pytest.fixture -def server_port(): - return free_port() - - @pytest.fixture( scope="module", params=[ @@ -130,40 +56,3 @@ def server_port(): ) def applied_permissions(request): return request.param - - -def _include_auth_config(file_path, auth_config: str): - with open(file_path, "r") as file: - existing_content = yaml.safe_load(file) - new_section = yaml.safe_load(auth_config) - if isinstance(existing_content, dict) and isinstance(new_section, dict): - existing_content.update(new_section) - else: - raise ValueError("Both existing content and new section must be dictionaries.") - with open(file_path, "w") as file: - yaml.safe_dump(existing_content, file, default_flow_style=False) - print(f"Updated auth section at {file_path}") - - -def _default_store( - temp_dir, - auth_config: str, - permissions: list[Permission], -): - runner = CliRunner() - result = runner.run(["init", PROJECT_NAME], cwd=temp_dir) - repo_path = os.path.join(temp_dir, PROJECT_NAME, "feature_repo") - assert result.returncode == 0 - - _include_auth_config( - file_path=f"{repo_path}/feature_store.yaml", auth_config=auth_config - ) - - result = runner.run(["--chdir", repo_path, "apply"], cwd=temp_dir) - assert result.returncode == 0 - - fs = FeatureStore(repo_path=repo_path) - - fs.apply(permissions) - - return fs diff --git a/sdk/python/tests/unit/permissions/auth/server/mock_utils.py b/sdk/python/tests/unit/permissions/auth/server/mock_utils.py index 370472746a..8f598774ee 100644 --- a/sdk/python/tests/unit/permissions/auth/server/mock_utils.py +++ b/sdk/python/tests/unit/permissions/auth/server/mock_utils.py @@ -2,10 +2,8 @@ from requests import Response -PROJECT_NAME = "test_registry_server" - -def _mock_oidc(request, monkeypatch, client_id): +def mock_oidc(request, monkeypatch, client_id): async def mock_oath2(self, request): return "OK" @@ -45,7 +43,7 @@ async def mock_oath2(self, request): ) -def _mock_kubernetes(request, monkeypatch): +def mock_kubernetes(request, monkeypatch): sa_name = request.getfixturevalue("sa_name") namespace = request.getfixturevalue("namespace") subject = f"system:serviceaccount:{namespace}:{sa_name}" diff --git a/sdk/python/tests/unit/permissions/auth/server/test_auth_registry_server.py b/sdk/python/tests/unit/permissions/auth/server/test_auth_registry_server.py index 80dda8323b..c563333b76 100644 --- a/sdk/python/tests/unit/permissions/auth/server/test_auth_registry_server.py +++ b/sdk/python/tests/unit/permissions/auth/server/test_auth_registry_server.py @@ -6,10 +6,8 @@ import yaml from feast import FeatureStore -from feast.infra.registry.remote import RemoteRegistryConfig from feast.permissions.permission import Permission from feast.registry_server import start_server -from feast.repo_config import RepoConfig from feast.wait import wait_retry_backoff # noqa: E402 from tests.unit.permissions.auth.server import mock_utils from tests.unit.permissions.auth.server.conftest import ( @@ -20,6 +18,7 @@ list_permissions_perm, list_sfv_perm, ) +from tests.utils.auth_permissions_util import get_remote_registry_store from tests.utils.http_server import check_port_open # noqa: E402 @@ -32,10 +31,10 @@ def start_registry_server( monkeypatch, ): if "kubernetes" in auth_config: - mock_utils._mock_kubernetes(request=request, monkeypatch=monkeypatch) + mock_utils.mock_kubernetes(request=request, monkeypatch=monkeypatch) elif "oidc" in auth_config: auth_config_yaml = yaml.safe_load(auth_config) - mock_utils._mock_oidc( + mock_utils.mock_oidc( request=request, monkeypatch=monkeypatch, client_id=auth_config_yaml["auth"]["client_id"], @@ -58,33 +57,16 @@ def start_registry_server( server.stop(grace=None) # Teardown server -@pytest.fixture -def remote_feature_store(server_port, feature_store): - registry_config = RemoteRegistryConfig( - registry_type="remote", path=f"localhost:{server_port}" - ) - - store = FeatureStore( - config=RepoConfig( - project=mock_utils.PROJECT_NAME, - auth=feature_store.config.auth, - registry=registry_config, - provider="local", - entity_key_serialization_version=2, - ) - ) - return store - - def test_registry_apis( auth_config, temp_dir, server_port, start_registry_server, - remote_feature_store, + feature_store, applied_permissions, ): - print(f"Runnning for\n:{auth_config}") + print(f"Running for\n:{auth_config}") + remote_feature_store = get_remote_registry_store(server_port, feature_store) permissions = _test_list_permissions(remote_feature_store, applied_permissions) _test_list_entities(remote_feature_store, applied_permissions) _test_list_fvs(remote_feature_store, applied_permissions) diff --git a/sdk/python/tests/utils/auth_permissions_util.py b/sdk/python/tests/utils/auth_permissions_util.py new file mode 100644 index 0000000000..4f86ef7eab --- /dev/null +++ b/sdk/python/tests/utils/auth_permissions_util.py @@ -0,0 +1,244 @@ +import os + +import yaml +from keycloak import KeycloakAdmin + +from feast import ( + Entity, + FeatureStore, + FeatureView, + OnDemandFeatureView, + RepoConfig, + StreamFeatureView, +) +from feast.infra.registry.remote import RemoteRegistryConfig +from feast.permissions.action import AuthzedAction +from feast.permissions.permission import Permission +from feast.permissions.policy import RoleBasedPolicy +from tests.utils.cli_repo_creator import CliRunner + +REMOTE_REGISTRY_SERVER_PROJECT_NAME = "test_registry_server" + +list_permissions_perm = Permission( + name="list_permissions_perm", + types=Permission, + policy=RoleBasedPolicy(roles=["reader"]), + actions=[AuthzedAction.READ], +) + +list_entities_perm = Permission( + name="list_entities_perm", + types=Entity, + with_subclasses=False, + policy=RoleBasedPolicy(roles=["reader"]), + actions=[AuthzedAction.READ], +) + +list_fv_perm = Permission( + name="list_fv_perm", + types=FeatureView, + with_subclasses=False, + policy=RoleBasedPolicy(roles=["reader"]), + actions=[AuthzedAction.READ], +) + +list_odfv_perm = Permission( + name="list_odfv_perm", + types=OnDemandFeatureView, + with_subclasses=False, + policy=RoleBasedPolicy(roles=["reader"]), + actions=[AuthzedAction.READ], +) + +list_sfv_perm = Permission( + name="list_sfv_perm", + types=StreamFeatureView, + with_subclasses=False, + policy=RoleBasedPolicy(roles=["reader"]), + actions=[AuthzedAction.READ], +) + +invalid_list_entities_perm = Permission( + name="invalid_list_entity_perm", + types=Entity, + with_subclasses=False, + policy=RoleBasedPolicy(roles=["dancer"]), + actions=[AuthzedAction.READ], +) + + +def _include_auth_config(file_path, auth_config: str): + with open(file_path, "r") as file: + existing_content = yaml.safe_load(file) + new_section = yaml.safe_load(auth_config) + if isinstance(existing_content, dict) and isinstance(new_section, dict): + existing_content.update(new_section) + else: + raise ValueError("Both existing content and new section must be dictionaries.") + with open(file_path, "w") as file: + yaml.safe_dump(existing_content, file, default_flow_style=False) + print(f"Updated auth section at {file_path}") + + +def default_store( + temp_dir, + auth_config: str, + permissions: list[Permission], +): + runner = CliRunner() + result = runner.run(["init", REMOTE_REGISTRY_SERVER_PROJECT_NAME], cwd=temp_dir) + repo_path = os.path.join( + temp_dir, REMOTE_REGISTRY_SERVER_PROJECT_NAME, "feature_repo" + ) + assert result.returncode == 0 + + _include_auth_config( + file_path=f"{repo_path}/feature_store.yaml", auth_config=auth_config + ) + + result = runner.run(["--chdir", repo_path, "apply"], cwd=temp_dir) + assert result.returncode == 0 + + fs = FeatureStore(repo_path=repo_path) + + fs.apply(permissions) + + return fs + + +def get_remote_registry_store(server_port, feature_store): + registry_config = RemoteRegistryConfig( + registry_type="remote", path=f"localhost:{server_port}" + ) + + store = FeatureStore( + config=RepoConfig( + project="test_registry_server", + auth=feature_store.config.auth, + registry=registry_config, + provider="local", + entity_key_serialization_version=2, + ) + ) + return store + + +def setup_permissions_on_keycloak(keycloak_admin: KeycloakAdmin): + new_client_id = "feast-integration-client" + new_client_secret = "feast-integration-client-secret" + # Create a new client + client_representation = { + "clientId": new_client_id, + "secret": new_client_secret, + "enabled": True, + "directAccessGrantsEnabled": True, + "publicClient": False, + "redirectUris": ["*"], + "serviceAccountsEnabled": True, + "standardFlowEnabled": True, + } + keycloak_admin.create_client(client_representation) + + # Get the client ID + client_id = keycloak_admin.get_client_id(new_client_id) + + # Role representation + reader_role_rep = { + "name": "reader", + "description": "feast reader client role", + "composite": False, + "clientRole": True, + "containerId": client_id, + } + keycloak_admin.create_client_role(client_id, reader_role_rep, True) + reader_role_id = keycloak_admin.get_client_role( + client_id=client_id, role_name="reader" + ) + + # Role representation + writer_role_rep = { + "name": "writer", + "description": "feast writer client role", + "composite": False, + "clientRole": True, + "containerId": client_id, + } + keycloak_admin.create_client_role(client_id, writer_role_rep, True) + writer_role_id = keycloak_admin.get_client_role( + client_id=client_id, role_name="writer" + ) + + # Mapper representation + mapper_representation = { + "name": "client-roles-mapper", + "protocol": "openid-connect", + "protocolMapper": "oidc-usermodel-client-role-mapper", + "consentRequired": False, + "config": { + "multivalued": "true", + "userinfo.token.claim": "true", + "id.token.claim": "true", + "access.token.claim": "true", + "claim.name": "roles", + "jsonType.label": "String", + "client.id": client_id, + }, + } + + # Add predefined client roles mapper to the client + keycloak_admin.add_mapper_to_client(client_id, mapper_representation) + + reader_writer_user = { + "username": "reader_writer", + "enabled": True, + "firstName": "reader_writer fn", + "lastName": "reader_writer ln", + "email": "reader_writer@email.com", + "emailVerified": True, + "credentials": [{"value": "password", "type": "password", "temporary": False}], + } + reader_writer_user_id = keycloak_admin.create_user(reader_writer_user) + keycloak_admin.assign_client_role( + user_id=reader_writer_user_id, + client_id=client_id, + roles=[reader_role_id, writer_role_id], + ) + + reader_user = { + "username": "reader", + "enabled": True, + "firstName": "reader fn", + "lastName": "reader ln", + "email": "reader@email.com", + "emailVerified": True, + "credentials": [{"value": "password", "type": "password", "temporary": False}], + } + reader_user_id = keycloak_admin.create_user(reader_user) + keycloak_admin.assign_client_role( + user_id=reader_user_id, client_id=client_id, roles=[reader_role_id] + ) + + writer_user = { + "username": "writer", + "enabled": True, + "firstName": "writer fn", + "lastName": "writer ln", + "email": "writer@email.com", + "emailVerified": True, + "credentials": [{"value": "password", "type": "password", "temporary": False}], + } + writer_user_id = keycloak_admin.create_user(writer_user) + keycloak_admin.assign_client_role( + user_id=writer_user_id, client_id=client_id, roles=[writer_role_id] + ) + + no_roles_user = { + "username": "no_roles_user", + "enabled": True, + "firstName": "no_roles_user fn", + "lastName": "no_roles_user ln", + "email": "no_roles_user@email.com", + "emailVerified": True, + "credentials": [{"value": "password", "type": "password", "temporary": False}], + } + keycloak_admin.create_user(no_roles_user) diff --git a/setup.py b/setup.py index 4dad6c6f61..84d9354a20 100644 --- a/setup.py +++ b/setup.py @@ -184,6 +184,8 @@ "pytest-env", "Sphinx>4.0.0,<7", "testcontainers==4.4.0", + "python-keycloak==4.2.2", + "firebase-admin>=5.2.0,<6", "pre-commit<3.3.2", "assertpy==1.1", "pip-tools", From 137fed15a74818d066af780bb1a7446c00120f93 Mon Sep 17 00:00:00 2001 From: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Date: Thu, 25 Jul 2024 13:44:43 +0200 Subject: [PATCH 088/169] added check and list-roles subcommands Signed-off-by: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Signed-off-by: Abdul Hameed --- docs/reference/feast-cli-commands.md | 54 ++++++++++-- sdk/python/feast/cli.py | 115 ++++++++++++++++++++++++- sdk/python/feast/cli_utils.py | 121 ++++++++++++++++++++++++++- 3 files changed, 281 insertions(+), 9 deletions(-) diff --git a/docs/reference/feast-cli-commands.md b/docs/reference/feast-cli-commands.md index 0519e453a6..4b6452623f 100644 --- a/docs/reference/feast-cli-commands.md +++ b/docs/reference/feast-cli-commands.md @@ -165,22 +165,25 @@ List all registered permission feast permissions list Options: - --tags TEXT Filter by tags (e.g. --tags 'key:value' --tags 'key:value, - key:value, ...'). Items return when ALL tags match. - --verbose + --tags TEXT Filter by tags (e.g. --tags 'key:value' --tags 'key:value, + key:value, ...'). Items return when ALL tags match. + -v, --verbose Print the resources matching each configured permission ``` ```text NAME TYPES WITH_SUBCLASS NAME_PATTERN ACTIONS ROLES -reader_permission1234 ['FeatureView'] True transformed_conv_rate [] {'reader'} -writer_permission1234 ['FeatureView'] True transformed_conv_rate [] {'writer'} +reader_permission1234 ['FeatureView'] True transformed_conv_rate ['READ] ['reader'] +writer_permission1234 ['FeatureView'] True transformed_conv_rate ['CREATE'] ['writer'] +Note:The configured decision strategy is UNANIMOUS ``` +`verbose` option describes the resources matching each configured permission: + ```text feast permissions list -v ``` -```text +```text Permissions: permissions @@ -211,6 +214,45 @@ policy: ``` +### List of the configured roles +List all the configured roles + +```text +feast permissions list-roles + +Options: + --verbose Print the resources and actions permitted to each configured + role +``` + +```text +ROLE NAME +admin +reader +writer +``` + +`verbose` option describes the resources and actions permitted to each managed role: + +```text +feast permissions list-roles -v +``` + +```text +ROLE NAME RESOURCE NAME RESOURCE TYPE PERMITTED ACTIONS +admin driver_hourly_stats_source FileSource ['CREATE', 'DELETE', 'QUERY_OFFLINE', 'QUERY_ONLINE', 'READ', 'UPDATE'] +admin vals_to_add RequestSource ['CREATE', 'DELETE', 'QUERY_OFFLINE', 'QUERY_ONLINE', 'READ', 'UPDATE'] +admin driver_stats_push_source PushSource ['CREATE', 'DELETE', 'QUERY_OFFLINE', 'QUERY_ONLINE', 'READ', 'UPDATE'] +admin driver_hourly_stats_source FileSource ['CREATE', 'DELETE', 'QUERY_OFFLINE', 'QUERY_ONLINE', 'READ', 'UPDATE'] +admin vals_to_add RequestSource ['CREATE', 'DELETE', 'QUERY_OFFLINE', 'QUERY_ONLINE', 'READ', 'UPDATE'] +admin driver_stats_push_source PushSource ['CREATE', 'DELETE', 'QUERY_OFFLINE', 'QUERY_ONLINE', 'READ', 'UPDATE'] +reader driver_hourly_stats FeatureView ['READ'] +reader driver_hourly_stats_fresh FeatureView ['READ'] +... +Note:The configured decision strategy is UNANIMOUS +``` + + ## Teardown Tear down deployed feature store infrastructure diff --git a/sdk/python/feast/cli.py b/sdk/python/feast/cli.py index 3778cae707..b5e3dcc37c 100644 --- a/sdk/python/feast/cli.py +++ b/sdk/python/feast/cli.py @@ -36,6 +36,7 @@ from feast.errors import FeastObjectNotFoundException, FeastProviderLoginError from feast.feature_view import FeatureView from feast.on_demand_feature_view import OnDemandFeatureView +from feast.permissions.permission import Permission from feast.permissions.policy import RoleBasedPolicy from feast.repo_config import load_repo_config from feast.repo_operations import ( @@ -901,7 +902,7 @@ def feast_permissions_cmd(): ) @tagsOption @click.pass_context -def feast_permissions_command(ctx: click.Context, verbose: bool, tags: list[str]): +def feast_permissions_list_command(ctx: click.Context, verbose: bool, tags: list[str]): from tabulate import tabulate table: list[Any] = [] @@ -997,6 +998,9 @@ def feast_permissions_command(ctx: click.Context, verbose: bool, tags: list[str] tablefmt="plain", ) ) + print( + f"{Style.BRIGHT}Note:{Style.RESET_ALL}The configured decision strategy is {Permission.get_global_decision_strategy().value.upper()}" + ) else: cli_utils.print_permission_verbose_example() @@ -1027,5 +1031,114 @@ def permission_describe(ctx: click.Context, name: str): ) +@feast_permissions_cmd.command(name="check") +@click.pass_context +def feast_permissions_check_command(ctx: click.Context): + """ + Validate the permissions configuration + """ + from tabulate import tabulate + + all_unsecured_table: list[Any] = [] + store = create_feature_store(ctx) + permissions = store.list_permissions() + objects = cli_utils.fetch_all_feast_objects( + store=store, + ) + + print( + f"{Style.BRIGHT + Fore.RED}The following resources are not secured by any permission configuration:{Style.RESET_ALL}" + ) + for o in objects: + cli_utils.handle_permissions_check_command( + object=o, permissions=permissions, table=all_unsecured_table + ) + print( + tabulate( + all_unsecured_table, + headers=[ + "NAME", + "TYPE", + ], + tablefmt="plain", + ) + ) + + all_unsecured_actions_table: list[Any] = [] + print( + f"{Style.BRIGHT + Fore.RED}The following actions are not secured by any permission configuration (Note: this might not be a security concern, depending on the used APIs):{Style.RESET_ALL}" + ) + for o in objects: + cli_utils.handle_permissions_check_command_with_actions( + object=o, permissions=permissions, table=all_unsecured_actions_table + ) + print( + tabulate( + all_unsecured_actions_table, + headers=[ + "NAME", + "TYPE", + "UNSECURED ACTIONS", + ], + tablefmt="plain", + ) + ) + + +@feast_permissions_cmd.command(name="list-roles") +@click.option( + "--verbose", + "-v", + is_flag=True, + help="Print the resources and actions permitted to each configured role", +) +@click.pass_context +def feast_permissions_list_roles_command(ctx: click.Context, verbose: bool): + """ + List all the configured roles + """ + from tabulate import tabulate + + table: list[Any] = [] + store = create_feature_store(ctx) + permissions = store.list_permissions() + if not verbose: + cli_utils.handler_list_all_permissions_roles( + permissions=permissions, table=table + ) + print( + tabulate( + table, + headers=[ + "ROLE NAME", + ], + tablefmt="plain", + ) + ) + else: + objects = cli_utils.fetch_all_feast_objects( + store=store, + ) + cli_utils.handler_list_all_permissions_roles_verbose( + objects=objects, permissions=permissions, table=table + ) + print( + tabulate( + table, + headers=[ + "ROLE NAME", + "RESOURCE NAME", + "RESOURCE TYPE", + "PERMITTED ACTIONS", + ], + tablefmt="plain", + ) + ) + + print( + f"{Style.BRIGHT}Note:{Style.RESET_ALL}The configured decision strategy is {Permission.get_global_decision_strategy().value.upper()}" + ) + + if __name__ == "__main__": cli() diff --git a/sdk/python/feast/cli_utils.py b/sdk/python/feast/cli_utils.py index ad09e732bd..ba607b227a 100644 --- a/sdk/python/feast/cli_utils.py +++ b/sdk/python/feast/cli_utils.py @@ -12,8 +12,11 @@ StreamFeatureView, ) from feast.feast_object import FeastObject +from feast.permissions.action import ALL_ACTIONS +from feast.permissions.decision import DecisionEvaluator from feast.permissions.permission import Permission from feast.permissions.policy import Policy, RoleBasedPolicy +from feast.permissions.user import User def print_permission_verbose_example(): @@ -195,7 +198,121 @@ def handle_not_verbose_permissions_command( [t.__name__ for t in p.types], # type: ignore[union-attr, attr-defined] p.with_subclasses, p.name_pattern, - p.actions, - roles, + [a.value.upper() for a in p.actions], + sorted(roles), ] ) + + +def fetch_all_feast_objects(store: FeatureStore) -> list[FeastObject]: + objects: list[FeastObject] = [] + objects.extend(store.list_entities()) + objects.extend(store.list_all_feature_views()) + objects.extend(store.list_batch_feature_views()) + objects.extend(store.list_feature_services()) + objects.extend(store.list_data_sources()) + objects.extend(store.list_data_sources()) + objects.extend(store.list_validation_references()) + objects.extend(store.list_saved_datasets()) + objects.extend(store.list_permissions()) + return objects + + +def handle_permissions_check_command( + object: FeastObject, permissions: list[Permission], table: list[Any] +): + for p in permissions: + if p.match_resource(object): + return + table.append( + [ + object.name, + type(object).__name__, + ] + ) + + +def handle_permissions_check_command_with_actions( + object: FeastObject, permissions: list[Permission], table: list[Any] +): + unmatched_actions = ALL_ACTIONS.copy() + for p in permissions: + if p.match_resource(object): + for action in ALL_ACTIONS: + if p.match_actions([action]) and action in unmatched_actions: + unmatched_actions.remove(action) + + if unmatched_actions: + table.append( + [ + object.name, + type(object).__name__, + [a.value.upper() for a in unmatched_actions], + ] + ) + + +def fetch_all_permission_roles(permissions: list[Permission]) -> list[str]: + all_roles = set() + for p in permissions: + if isinstance(p.policy, RoleBasedPolicy) and len(p.policy.get_roles()) > 0: + all_roles.update(p.policy.get_roles()) + + return sorted(all_roles) + + +def handler_list_all_permissions_roles(permissions: list[Permission], table: list[Any]): + all_roles = fetch_all_permission_roles(permissions) + for role in all_roles: + table.append( + [ + role, + ] + ) + + +def handler_list_all_permissions_roles_verbose( + objects: list[FeastObject], permissions: list[Permission], table: list[Any] +): + all_roles = fetch_all_permission_roles(permissions) + + for role in all_roles: + for o in objects: + permitted_actions = ALL_ACTIONS.copy() + for action in ALL_ACTIONS: + matching_permissions = [ + p + for p in permissions + if p.match_resource(o) and p.match_actions([action]) + ] + + if matching_permissions: + evaluator = DecisionEvaluator( + Permission.get_global_decision_strategy(), + len(matching_permissions), + ) + for p in matching_permissions: + permission_grant, permission_explanation = ( + p.policy.validate_user(user=User(username="", roles=[role])) + ) + evaluator.add_grant( + permission_grant, + f"Permission {p.name} denied access: {permission_explanation}", + ) + + if evaluator.is_decided(): + grant, explanations = evaluator.grant() + if not grant: + permitted_actions.remove(action) + break + else: + permitted_actions.remove(action) + + table.append( + [ + role, + o.name, + type(o).__name__, + [a.value.upper() for a in permitted_actions], + ] + ) From 716e09999ac4d6306d724f920b9f9cddae6e693e Mon Sep 17 00:00:00 2001 From: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Date: Thu, 25 Jul 2024 16:47:15 +0200 Subject: [PATCH 089/169] typo Signed-off-by: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Signed-off-by: Abdul Hameed --- sdk/python/feast/cli_utils.py | 1 - 1 file changed, 1 deletion(-) diff --git a/sdk/python/feast/cli_utils.py b/sdk/python/feast/cli_utils.py index ba607b227a..57909b9e81 100644 --- a/sdk/python/feast/cli_utils.py +++ b/sdk/python/feast/cli_utils.py @@ -211,7 +211,6 @@ def fetch_all_feast_objects(store: FeatureStore) -> list[FeastObject]: objects.extend(store.list_batch_feature_views()) objects.extend(store.list_feature_services()) objects.extend(store.list_data_sources()) - objects.extend(store.list_data_sources()) objects.extend(store.list_validation_references()) objects.extend(store.list_saved_datasets()) objects.extend(store.list_permissions()) From bacd4a141d621dbbc278ef2f6feec1269eb9be66 Mon Sep 17 00:00:00 2001 From: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Date: Fri, 26 Jul 2024 09:44:29 +0200 Subject: [PATCH 090/169] added comment in cli_utils to remind the original function from which this logic was derived Signed-off-by: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Signed-off-by: Abdul Hameed --- sdk/python/feast/cli_utils.py | 1 + sdk/python/feast/feature_server.py | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/sdk/python/feast/cli_utils.py b/sdk/python/feast/cli_utils.py index 57909b9e81..5155eb814f 100644 --- a/sdk/python/feast/cli_utils.py +++ b/sdk/python/feast/cli_utils.py @@ -279,6 +279,7 @@ def handler_list_all_permissions_roles_verbose( for o in objects: permitted_actions = ALL_ACTIONS.copy() for action in ALL_ACTIONS: + # Following code is derived from enforcer.enforce_policy but has a different return type and does not raise PermissionError matching_permissions = [ p for p in permissions diff --git a/sdk/python/feast/feature_server.py b/sdk/python/feast/feature_server.py index 1c2d50abe3..ee16fd1c92 100644 --- a/sdk/python/feast/feature_server.py +++ b/sdk/python/feast/feature_server.py @@ -345,14 +345,17 @@ def start_server( ) monitoring_thread.start() - # TODO RBAC remove and use the auth section of the feature store config instead + print("start_server called ") auth_type = str_to_auth_manager_type(store.config.auth_config.type) + print(f"auth_type is {auth_type}") init_security_manager(auth_type=auth_type, fs=store) + print("init_security_manager OK ") init_auth_manager( auth_type=auth_type, server_type=ServerType.REST, auth_config=store.config.auth_config, ) + print("init_auth_manager OK ") if sys.platform != "win32": FeastServeApplication( From d76e3c416f4fc05d7d5cc1961b10a3d11d8b11c4 Mon Sep 17 00:00:00 2001 From: Lokesh Rangineni Date: Fri, 26 Jul 2024 15:43:16 -0400 Subject: [PATCH 091/169] 1) Updating the existing integration test with auth permissions configurations. 2) Refactored the common code and moved to the util class and common conftest.py file. Signed-off-by: Lokesh Rangineni Signed-off-by: Lokesh Rangineni Signed-off-by: Abdul Hameed --- sdk/python/tests/conftest.py | 75 ++++++++++++++++--- sdk/python/tests/integration/conftest.py | 11 +++ .../online_store/test_remote_online_store.py | 63 +++++++++------- .../unit/permissions/auth/server/conftest.py | 58 -------------- .../auth/server/test_auth_registry_server.py | 4 +- .../tests/utils/auth_permissions_util.py | 55 ++++++++++++-- 6 files changed, 159 insertions(+), 107 deletions(-) create mode 100644 sdk/python/tests/integration/conftest.py delete mode 100644 sdk/python/tests/unit/permissions/auth/server/conftest.py diff --git a/sdk/python/tests/conftest.py b/sdk/python/tests/conftest.py index d42894b89f..973d4c97d6 100644 --- a/sdk/python/tests/conftest.py +++ b/sdk/python/tests/conftest.py @@ -19,20 +19,20 @@ from datetime import timedelta from multiprocessing import Process from sys import platform +from textwrap import dedent from typing import Any, Dict, List, Tuple, no_type_check from unittest import mock import pandas as pd import pytest from _pytest.nodes import Item -from testcontainers.keycloak import KeycloakContainer from feast.data_source import DataSource from feast.feature_store import FeatureStore # noqa: E402 from feast.utils import _utc_now from feast.wait import wait_retry_backoff # noqa: E402 -from tests.data.data_creator import ( # noqa: E402 - create_basic_driver_dataset, +from tests.data.data_creator import ( + create_basic_driver_dataset, # noqa: E402 create_document_dataset, ) from tests.integration.feature_repos.integration_test_repo_config import ( @@ -58,7 +58,12 @@ ) from tests.utils.auth_permissions_util import ( default_store, - setup_permissions_on_keycloak, + invalid_list_entities_perm, + list_entities_perm, + list_fv_perm, + list_odfv_perm, + list_permissions_perm, + list_sfv_perm, ) from tests.utils.http_server import check_port_open, free_port # noqa: E402 @@ -421,13 +426,6 @@ def temp_dir(): yield temp_dir -@pytest.fixture -def start_keycloak_server(): - with KeycloakContainer("quay.io/keycloak/keycloak:24.0.1") as keycloak_container: - setup_permissions_on_keycloak(keycloak_container.get_client()) - yield keycloak_container.get_url() - - @pytest.fixture def server_port(): return free_port() @@ -437,3 +435,58 @@ def server_port(): def feature_store(temp_dir, auth_config, applied_permissions): print(f"Creating store at {temp_dir}") return default_store(str(temp_dir), auth_config, applied_permissions) + + +@pytest.fixture( + scope="module", + params=[ + dedent(""" + auth: + type: no_auth + """), + dedent(""" + auth: + type: kubernetes + """), + dedent(""" + auth: + type: oidc + client_id: feast-integration-client + client_secret: feast-integration-client-secret + username: reader_writer + password: password + realm: master + auth_server_url: KEYCLOAK_URL_PLACE_HOLDER + auth_discovery_url: KEYCLOAK_URL_PLACE_HOLDER/realms/master/.well-known/openid-configuration + """), + ], +) +def auth_config(request): + auth_configuration = request.param + is_integration_test = request.node.get_closest_marker("integration") + if is_integration_test is not None: + if "kubernetes" in auth_configuration: + pytest.skip("skipping integration tests for kubernetes platform.") + elif "oidc" in auth_configuration: + keycloak_url = request.getfixturevalue("start_keycloak_server") + return auth_configuration.replace("KEYCLOAK_URL_PLACE_HOLDER", keycloak_url) + + return auth_configuration + + +@pytest.fixture( + scope="module", + params=[ + [], + [invalid_list_entities_perm], + [ + list_entities_perm, + list_permissions_perm, + list_fv_perm, + list_odfv_perm, + list_sfv_perm, + ], + ], +) +def applied_permissions(request): + return request.param diff --git a/sdk/python/tests/integration/conftest.py b/sdk/python/tests/integration/conftest.py new file mode 100644 index 0000000000..4a48135c19 --- /dev/null +++ b/sdk/python/tests/integration/conftest.py @@ -0,0 +1,11 @@ +import pytest +from testcontainers.keycloak import KeycloakContainer + +from tests.utils.auth_permissions_util import setup_permissions_on_keycloak + + +@pytest.fixture(scope="module") +def start_keycloak_server(): + with KeycloakContainer("quay.io/keycloak/keycloak:24.0.1") as keycloak_container: + setup_permissions_on_keycloak(keycloak_container.get_client()) + yield keycloak_container.get_url() diff --git a/sdk/python/tests/integration/online_store/test_remote_online_store.py b/sdk/python/tests/integration/online_store/test_remote_online_store.py index 21ac00583b..737eaeac3e 100644 --- a/sdk/python/tests/integration/online_store/test_remote_online_store.py +++ b/sdk/python/tests/integration/online_store/test_remote_online_store.py @@ -1,28 +1,47 @@ import os -import subprocess import tempfile from textwrap import dedent import pytest from feast.feature_store import FeatureStore -from feast.utils import _utc_now -from feast.wait import wait_retry_backoff +from tests.utils.auth_permissions_util import ( + PROJECT_NAME, + default_store, + list_entities_perm, + list_fv_perm, + list_odfv_perm, + list_permissions_perm, + list_sfv_perm, + start_feature_server, +) from tests.utils.cli_repo_creator import CliRunner -from tests.utils.http_server import check_port_open, free_port +from tests.utils.http_server import free_port @pytest.mark.integration -def test_remote_online_store_read(): +def test_remote_online_store_read(auth_config): with tempfile.TemporaryDirectory() as remote_server_tmp_dir, tempfile.TemporaryDirectory() as remote_client_tmp_dir: + permissions_list = [ + list_entities_perm, + list_permissions_perm, + list_fv_perm, + list_odfv_perm, + list_sfv_perm, + ] server_store, server_url, registry_path = ( - _create_server_store_spin_feature_server(temp_dir=remote_server_tmp_dir) + _create_server_store_spin_feature_server( + temp_dir=remote_server_tmp_dir, + auth_config=auth_config, + permissions_list=permissions_list, + ) ) assert None not in (server_store, server_url, registry_path) client_store = _create_remote_client_feature_store( temp_dir=remote_client_tmp_dir, server_registry_path=str(registry_path), feature_server_url=server_url, + auth_config=auth_config, ) assert client_store is not None _assert_non_existing_entity_feature_views_entity( @@ -127,11 +146,13 @@ def _assert_client_server_online_stores_are_matching( assert online_features_from_client == online_features_from_server -def _create_server_store_spin_feature_server(temp_dir): +def _create_server_store_spin_feature_server( + temp_dir, auth_config: str, permissions_list +): + store = default_store(str(temp_dir), auth_config, permissions_list) feast_server_port = free_port() - store = _default_store(str(temp_dir), "REMOTE_ONLINE_SERVER_PROJECT") server_url = next( - _start_feature_server( + start_feature_server( repo_path=str(store.repo_path), server_port=feast_server_port ) ) @@ -139,24 +160,8 @@ def _create_server_store_spin_feature_server(temp_dir): return store, server_url, os.path.join(store.repo_path, "data", "registry.db") -def _default_store(temp_dir, project_name) -> FeatureStore: - runner = CliRunner() - result = runner.run(["init", project_name], cwd=temp_dir) - repo_path = os.path.join(temp_dir, project_name, "feature_repo") - assert result.returncode == 0 - - result = runner.run(["--chdir", repo_path, "apply"], cwd=temp_dir) - assert result.returncode == 0 - - fs = FeatureStore(repo_path=repo_path) - fs.materialize_incremental( - end_date=_utc_now(), feature_views=["driver_hourly_stats"] - ) - return fs - - def _create_remote_client_feature_store( - temp_dir, server_registry_path: str, feature_server_url: str + temp_dir, server_registry_path: str, feature_server_url: str, auth_config: str ) -> FeatureStore: project_name = "REMOTE_ONLINE_CLIENT_PROJECT" runner = CliRunner() @@ -167,6 +172,7 @@ def _create_remote_client_feature_store( repo_path=str(repo_path), registry_path=server_registry_path, feature_server_url=feature_server_url, + auth_config=auth_config, ) result = runner.run(["--chdir", repo_path, "apply"], cwd=temp_dir) @@ -176,14 +182,14 @@ def _create_remote_client_feature_store( def _overwrite_remote_client_feature_store_yaml( - repo_path: str, registry_path: str, feature_server_url: str + repo_path: str, registry_path: str, feature_server_url: str, auth_config: str ): repo_config = os.path.join(repo_path, "feature_store.yaml") with open(repo_config, "w") as repo_config: repo_config.write( dedent( f""" - project: REMOTE_ONLINE_CLIENT_PROJECT + project: {PROJECT_NAME} registry: {registry_path} provider: local online_store: @@ -192,6 +198,7 @@ def _overwrite_remote_client_feature_store_yaml( entity_key_serialization_version: 2 """ ) + + auth_config ) diff --git a/sdk/python/tests/unit/permissions/auth/server/conftest.py b/sdk/python/tests/unit/permissions/auth/server/conftest.py deleted file mode 100644 index 2b9428a70c..0000000000 --- a/sdk/python/tests/unit/permissions/auth/server/conftest.py +++ /dev/null @@ -1,58 +0,0 @@ -from textwrap import dedent - -import pytest - -from tests.utils.auth_permissions_util import ( - invalid_list_entities_perm, - list_entities_perm, - list_fv_perm, - list_odfv_perm, - list_permissions_perm, - list_sfv_perm, -) - - -@pytest.fixture( - scope="module", - params=[ - dedent(""" - auth: - type: no_auth - """), - dedent(""" - auth: - type: kubernetes - """), - dedent(""" - auth: - type: oidc - client_id: client_id - client_secret: client_secret - username: username - password: password - realm: realm - auth_server_url: http://localhost:8080 - auth_discovery_url: http://localhost:8080/realms/master/.well-known/openid-configuration - """), - ], -) -def auth_config(request): - return request.param - - -@pytest.fixture( - scope="module", - params=[ - [], - [invalid_list_entities_perm], - [ - list_entities_perm, - list_permissions_perm, - list_fv_perm, - list_odfv_perm, - list_sfv_perm, - ], - ], -) -def applied_permissions(request): - return request.param diff --git a/sdk/python/tests/unit/permissions/auth/server/test_auth_registry_server.py b/sdk/python/tests/unit/permissions/auth/server/test_auth_registry_server.py index c563333b76..af50d48ad4 100644 --- a/sdk/python/tests/unit/permissions/auth/server/test_auth_registry_server.py +++ b/sdk/python/tests/unit/permissions/auth/server/test_auth_registry_server.py @@ -10,7 +10,8 @@ from feast.registry_server import start_server from feast.wait import wait_retry_backoff # noqa: E402 from tests.unit.permissions.auth.server import mock_utils -from tests.unit.permissions.auth.server.conftest import ( +from tests.utils.auth_permissions_util import ( + get_remote_registry_store, invalid_list_entities_perm, list_entities_perm, list_fv_perm, @@ -18,7 +19,6 @@ list_permissions_perm, list_sfv_perm, ) -from tests.utils.auth_permissions_util import get_remote_registry_store from tests.utils.http_server import check_port_open # noqa: E402 diff --git a/sdk/python/tests/utils/auth_permissions_util.py b/sdk/python/tests/utils/auth_permissions_util.py index 4f86ef7eab..ce51b56a3a 100644 --- a/sdk/python/tests/utils/auth_permissions_util.py +++ b/sdk/python/tests/utils/auth_permissions_util.py @@ -1,4 +1,5 @@ import os +import subprocess import yaml from keycloak import KeycloakAdmin @@ -15,9 +16,11 @@ from feast.permissions.action import AuthzedAction from feast.permissions.permission import Permission from feast.permissions.policy import RoleBasedPolicy +from feast.wait import wait_retry_backoff from tests.utils.cli_repo_creator import CliRunner +from tests.utils.http_server import check_port_open -REMOTE_REGISTRY_SERVER_PROJECT_NAME = "test_registry_server" +PROJECT_NAME = "feast_test_project" list_permissions_perm = Permission( name="list_permissions_perm", @@ -67,7 +70,7 @@ ) -def _include_auth_config(file_path, auth_config: str): +def include_auth_config(file_path, auth_config: str): with open(file_path, "r") as file: existing_content = yaml.safe_load(file) new_section = yaml.safe_load(auth_config) @@ -86,13 +89,11 @@ def default_store( permissions: list[Permission], ): runner = CliRunner() - result = runner.run(["init", REMOTE_REGISTRY_SERVER_PROJECT_NAME], cwd=temp_dir) - repo_path = os.path.join( - temp_dir, REMOTE_REGISTRY_SERVER_PROJECT_NAME, "feature_repo" - ) + result = runner.run(["init", PROJECT_NAME], cwd=temp_dir) + repo_path = os.path.join(temp_dir, PROJECT_NAME, "feature_repo") assert result.returncode == 0 - _include_auth_config( + include_auth_config( file_path=f"{repo_path}/feature_store.yaml", auth_config=auth_config ) @@ -106,6 +107,44 @@ def default_store( return fs +def start_feature_server(repo_path: str, server_port: int): + host = "0.0.0.0" + cmd = [ + "feast", + "-c" + repo_path, + "serve", + "--host", + host, + "--port", + str(server_port), + ] + feast_server_process = subprocess.Popen( + cmd, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL + ) + _time_out_sec: int = 60 + # Wait for server to start + wait_retry_backoff( + lambda: (None, check_port_open(host, server_port)), + timeout_secs=_time_out_sec, + timeout_msg=f"Unable to start the feast server in {_time_out_sec} seconds for remote online store type, port={server_port}", + ) + + yield f"http://localhost:{server_port}" + + if feast_server_process is not None: + feast_server_process.kill() + + # wait server to free the port + wait_retry_backoff( + lambda: ( + None, + not check_port_open("localhost", server_port), + ), + timeout_msg=f"Unable to stop the feast server in {_time_out_sec} seconds for remote online store type, port={server_port}", + timeout_secs=_time_out_sec, + ) + + def get_remote_registry_store(server_port, feature_store): registry_config = RemoteRegistryConfig( registry_type="remote", path=f"localhost:{server_port}" @@ -113,7 +152,7 @@ def get_remote_registry_store(server_port, feature_store): store = FeatureStore( config=RepoConfig( - project="test_registry_server", + project=PROJECT_NAME, auth=feature_store.config.auth, registry=registry_config, provider="local", From 5fff1ff54214e3d1e48874075c120360ceb9faec Mon Sep 17 00:00:00 2001 From: Lokesh Rangineni Date: Thu, 25 Jul 2024 14:43:57 -0400 Subject: [PATCH 092/169] Moved the common fixtures to the root conftest.py or auth_permissions_util.py Signed-off-by: Lokesh Rangineni Signed-off-by: Lokesh Rangineni Signed-off-by: Abdul Hameed --- .../unit/permissions/auth/server/test_auth_registry_server.py | 1 + 1 file changed, 1 insertion(+) diff --git a/sdk/python/tests/unit/permissions/auth/server/test_auth_registry_server.py b/sdk/python/tests/unit/permissions/auth/server/test_auth_registry_server.py index af50d48ad4..3488197211 100644 --- a/sdk/python/tests/unit/permissions/auth/server/test_auth_registry_server.py +++ b/sdk/python/tests/unit/permissions/auth/server/test_auth_registry_server.py @@ -19,6 +19,7 @@ list_permissions_perm, list_sfv_perm, ) +from tests.utils.auth_permissions_util import get_remote_registry_store from tests.utils.http_server import check_port_open # noqa: E402 From 23d9a3100aa4331497a4cec39b6a9b1c723ab169 Mon Sep 17 00:00:00 2001 From: Lokesh Rangineni Date: Mon, 22 Jul 2024 12:14:30 -0400 Subject: [PATCH 093/169] Adding missed dependency and regenerated the requirements files. Signed-off-by: Lokesh Rangineni Signed-off-by: Lokesh Rangineni Signed-off-by: Abdul Hameed --- sdk/python/requirements/py3.10-ci-requirements.txt | 1 - setup.py | 2 -- 2 files changed, 3 deletions(-) diff --git a/sdk/python/requirements/py3.10-ci-requirements.txt b/sdk/python/requirements/py3.10-ci-requirements.txt index 89459d1a69..2e6aaa63dc 100644 --- a/sdk/python/requirements/py3.10-ci-requirements.txt +++ b/sdk/python/requirements/py3.10-ci-requirements.txt @@ -1068,4 +1068,3 @@ yarl==1.9.4 # via aiohttp zipp==3.19.1 # via importlib-metadata -bigtree==0.19.2 diff --git a/setup.py b/setup.py index 84d9354a20..610b50ed76 100644 --- a/setup.py +++ b/setup.py @@ -22,10 +22,8 @@ from pathlib import Path from setuptools import find_packages, setup, Command -from setuptools.command.build_ext import build_ext as _build_ext from setuptools.command.build_py import build_py from setuptools.command.develop import develop -from setuptools.command.install import install NAME = "feast" DESCRIPTION = "Python SDK for Feast" From 49fd90db707654b728c2cf93233a00a464bb3627 Mon Sep 17 00:00:00 2001 From: Lokesh Rangineni Date: Fri, 26 Jul 2024 15:43:16 -0400 Subject: [PATCH 094/169] 1) Updating the existing integration test with auth permissions configurations. 2) Refactored the common code and moved to the util class and common conftest.py file. Signed-off-by: Lokesh Rangineni Signed-off-by: Lokesh Rangineni Signed-off-by: Abdul Hameed --- .../unit/permissions/auth/server/test_auth_registry_server.py | 1 - 1 file changed, 1 deletion(-) diff --git a/sdk/python/tests/unit/permissions/auth/server/test_auth_registry_server.py b/sdk/python/tests/unit/permissions/auth/server/test_auth_registry_server.py index 3488197211..af50d48ad4 100644 --- a/sdk/python/tests/unit/permissions/auth/server/test_auth_registry_server.py +++ b/sdk/python/tests/unit/permissions/auth/server/test_auth_registry_server.py @@ -19,7 +19,6 @@ list_permissions_perm, list_sfv_perm, ) -from tests.utils.auth_permissions_util import get_remote_registry_store from tests.utils.http_server import check_port_open # noqa: E402 From 6a96e70abe3dba3229bdf6ecdf6e03debb87d061 Mon Sep 17 00:00:00 2001 From: Lokesh Rangineni Date: Sun, 28 Jul 2024 00:04:01 -0400 Subject: [PATCH 095/169] 1) Fixing an issue with the way getting markers after changing the fixture scope to module. Now looking up the markers coming from the entire module run. Signed-off-by: Lokesh Rangineni Signed-off-by: Lokesh Rangineni Signed-off-by: Abdul Hameed --- sdk/python/tests/conftest.py | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/sdk/python/tests/conftest.py b/sdk/python/tests/conftest.py index 973d4c97d6..c9ba416d6e 100644 --- a/sdk/python/tests/conftest.py +++ b/sdk/python/tests/conftest.py @@ -437,6 +437,21 @@ def feature_store(temp_dir, auth_config, applied_permissions): return default_store(str(temp_dir), auth_config, applied_permissions) +@pytest.fixture(scope="module") +def all_markers_from_module(request): + markers = set() + for item in request.session.items: + for marker in item.iter_markers(): + markers.add(marker.name) + + return markers + + +@pytest.fixture(scope="module") +def is_integration_test(all_markers_from_module): + return "integration" in all_markers_from_module + + @pytest.fixture( scope="module", params=[ @@ -461,12 +476,14 @@ def feature_store(temp_dir, auth_config, applied_permissions): """), ], ) -def auth_config(request): +def auth_config(request, is_integration_test): auth_configuration = request.param - is_integration_test = request.node.get_closest_marker("integration") - if is_integration_test is not None: + + if is_integration_test: if "kubernetes" in auth_configuration: - pytest.skip("skipping integration tests for kubernetes platform.") + pytest.skip( + "skipping integration tests for kubernetes platform, unit tests are covering this functionality." + ) elif "oidc" in auth_configuration: keycloak_url = request.getfixturevalue("start_keycloak_server") return auth_configuration.replace("KEYCLOAK_URL_PLACE_HOLDER", keycloak_url) From 930873139132b64d8f927ae1d864e400df089693 Mon Sep 17 00:00:00 2001 From: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Date: Tue, 30 Jul 2024 12:52:59 +0200 Subject: [PATCH 096/169] Fixed bug in GetPermission API Signed-off-by: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Signed-off-by: Abdul Hameed --- sdk/python/feast/registry_server.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/python/feast/registry_server.py b/sdk/python/feast/registry_server.py index e75942010f..7b88a29c41 100644 --- a/sdk/python/feast/registry_server.py +++ b/sdk/python/feast/registry_server.py @@ -534,7 +534,7 @@ def GetPermission(self, request: RegistryServer_pb2.GetPermissionRequest, contex ) permission.to_proto().project = request.project - return permission + return permission.to_proto() def ListPermissions( self, request: RegistryServer_pb2.ListPermissionsRequest, context From 6538db6330d5077ca01209856aaf4ce03db091ab Mon Sep 17 00:00:00 2001 From: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Date: Tue, 30 Jul 2024 13:00:29 +0200 Subject: [PATCH 097/169] Permission CRUD test Signed-off-by: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Signed-off-by: Abdul Hameed --- .../registration/test_universal_registry.py | 185 +++++++++++++----- 1 file changed, 137 insertions(+), 48 deletions(-) diff --git a/sdk/python/tests/integration/registration/test_universal_registry.py b/sdk/python/tests/integration/registration/test_universal_registry.py index fbd9f33c18..09e2f9744e 100644 --- a/sdk/python/tests/integration/registration/test_universal_registry.py +++ b/sdk/python/tests/integration/registration/test_universal_registry.py @@ -32,7 +32,6 @@ from feast.data_source import KafkaSource from feast.entity import Entity from feast.errors import FeatureViewNotFoundException -from feast.feast_object import ALL_RESOURCE_TYPES from feast.feature_view import FeatureView from feast.field import Field from feast.infra.infra_object import Infra @@ -572,53 +571,6 @@ def location_features_from_push(inputs: pd.DataFrame) -> pd.DataFrame: test_registry.teardown() -@pytest.mark.integration -@pytest.mark.parametrize( - "test_registry", - all_fixtures, -) -def test_apply_permissions(test_registry): - # Create Permission - permission1 = Permission( - name="reader", - types=ALL_RESOURCE_TYPES, - with_subclasses=True, - policy=RoleBasedPolicy(roles=["reader"]), - actions=[AuthzedAction.READ], - ) - - # Create Permission - permission2 = Permission( - name="writer", - types=ALL_RESOURCE_TYPES, - with_subclasses=True, - policy=RoleBasedPolicy(roles=["writer"]), - actions=[AuthzedAction.CREATE], - ) - - project = "project" - - # Register permissions - test_registry.apply_permission(permission1, project) - test_registry.apply_permission(permission2, project) - - permissions = test_registry.list_permissions(project) - assert len(permissions) == 2 - p1 = permissions[0] - p2 = permissions[1] - assert p1 == permission1 - assert p2 == permission2 - - # Delete permissions - test_registry.delete_permission(permission1.name, project) - test_registry.delete_permission(permission2.name, project) - - permissions = test_registry.list_permissions(project) - assert len(permissions) == 0 - - test_registry.teardown() - - @pytest.mark.integration @pytest.mark.parametrize( "test_registry", @@ -1398,3 +1350,140 @@ def validate_project_uuid(project_uuid, test_registry): assert len(test_registry.cached_registry_proto.project_metadata) == 1 project_metadata = test_registry.cached_registry_proto.project_metadata[0] assert project_metadata.project_uuid == project_uuid + + +@pytest.mark.integration +@pytest.mark.parametrize("test_registry", all_fixtures) +def test_apply_permission_success(test_registry): + permission = Permission( + name="read_permission", + actions=AuthzedAction.READ, + policy=RoleBasedPolicy(roles=["reader"]), + types=FeatureView, + ) + + project = "project" + + # Register Permission + test_registry.apply_permission(permission, project) + project_metadata = test_registry.list_project_metadata(project=project) + assert len(project_metadata) == 1 + project_uuid = project_metadata[0].project_uuid + assert len(project_metadata[0].project_uuid) == 36 + assert_project_uuid(project, project_uuid, test_registry) + + permissions = test_registry.list_permissions(project) + assert_project_uuid(project, project_uuid, test_registry) + + permission = permissions[0] + assert ( + len(permissions) == 1 + and permission.name == "read_permission" + and len(permission.types) == 1 + and permission.types[0] == FeatureView + and len(permission.actions) == 1 + and permission.actions[0] == AuthzedAction.READ + and isinstance(permission.policy, RoleBasedPolicy) + and len(permission.policy.roles) == 1 + and permission.policy.roles[0] == "reader" + and permission.with_subclasses + and permission.name_pattern is None + and permission.tags is None + ) + + permission = test_registry.get_permission("read_permission", project) + assert ( + permission.name == "read_permission" + and len(permission.types) == 1 + and permission.types[0] == FeatureView + and len(permission.actions) == 1 + and permission.actions[0] == AuthzedAction.READ + and isinstance(permission.policy, RoleBasedPolicy) + and len(permission.policy.roles) == 1 + and permission.policy.roles[0] == "reader" + and permission.with_subclasses + and permission.name_pattern is None + and permission.tags is None + ) + + # After the first apply, the created_timestamp should be the same as the last_update_timestamp. + # TODO: no such fields + # assert permission.created_timestamp == permission.last_updated_timestamp + + # Update permission + updated_permission = Permission( + name="read_permission", + actions=[AuthzedAction.READ, AuthzedAction.WRITE_ONLINE], + policy=RoleBasedPolicy(roles=["reader", "writer"]), + types=FeatureView, + ) + test_registry.apply_permission(updated_permission, project) + + permissions = test_registry.list_permissions(project) + assert_project_uuid(project, project_uuid, test_registry) + assert len(permissions) == 1 + + updated_permission = test_registry.get_permission("read_permission", project) + assert ( + updated_permission.name == "read_permission" + and len(updated_permission.types) == 1 + and updated_permission.types[0] == FeatureView + and len(updated_permission.actions) == 2 + and AuthzedAction.READ in updated_permission.actions + and AuthzedAction.WRITE_ONLINE in updated_permission.actions + and isinstance(updated_permission.policy, RoleBasedPolicy) + and len(updated_permission.policy.roles) == 2 + and "reader" in updated_permission.policy.roles + and "writer" in updated_permission.policy.roles + and updated_permission.with_subclasses + and updated_permission.name_pattern is None + and updated_permission.tags is None + ) + + # # The created_timestamp for the entity should be set to the created_timestamp value stored from the previous apply + # TODO: no such fields + # assert ( + # updated_entity.created_timestamp is not None + # and updated_entity.created_timestamp == entity.created_timestamp + # ) + + updated_permission = Permission( + name="read_permission", + actions=[AuthzedAction.READ, AuthzedAction.WRITE_ONLINE], + policy=RoleBasedPolicy(roles=["reader", "writer"]), + types=FeatureView, + with_subclasses=False, + name_pattern="aaa", + tags={"team": "matchmaking"}, + ) + test_registry.apply_permission(updated_permission, project) + + permissions = test_registry.list_permissions(project) + assert_project_uuid(project, project_uuid, test_registry) + assert len(permissions) == 1 + + updated_permission = test_registry.get_permission("read_permission", project) + assert ( + updated_permission.name == "read_permission" + and len(updated_permission.types) == 1 + and updated_permission.types[0] == FeatureView + and len(updated_permission.actions) == 2 + and AuthzedAction.READ in updated_permission.actions + and AuthzedAction.WRITE_ONLINE in updated_permission.actions + and isinstance(updated_permission.policy, RoleBasedPolicy) + and len(updated_permission.policy.roles) == 2 + and "reader" in updated_permission.policy.roles + and "writer" in updated_permission.policy.roles + and not updated_permission.with_subclasses + and updated_permission.name_pattern == "aaa" + and "team" in updated_permission.tags + and updated_permission.tags["team"] == "matchmaking" + ) + + test_registry.delete_permission("read_permission", project) + assert_project_uuid(project, project_uuid, test_registry) + permissions = test_registry.list_permissions(project) + assert_project_uuid(project, project_uuid, test_registry) + assert len(permissions) == 0 + + test_registry.teardown() From c9bdbbe2e621cef13f6aade09b2c82c6a4d3a0cd Mon Sep 17 00:00:00 2001 From: Abdul Hameed Date: Tue, 16 Jul 2024 22:45:44 -0400 Subject: [PATCH 098/169] Added feast-rbac example Signed-off-by: Abdul Hameed --- examples/rbac/README.md | 24 ++++ examples/rbac/__init__.py | 0 examples/rbac/client/__init__.py | 0 examples/rbac/client/feature_store.yaml | 14 ++ examples/rbac/client/test.py | 40 ++++++ examples/rbac/feature_store_remote.yaml | 28 ++++ examples/rbac/install_feast.sh | 49 +++++++ examples/rbac/server/__init__.py | 0 examples/rbac/server/feature_repo/__init__.py | 0 .../rbac/server/feature_repo/example_repo.py | 131 ++++++++++++++++++ .../server/feature_repo/feature_store.yaml | 26 ++++ 11 files changed, 312 insertions(+) create mode 100644 examples/rbac/README.md create mode 100644 examples/rbac/__init__.py create mode 100644 examples/rbac/client/__init__.py create mode 100644 examples/rbac/client/feature_store.yaml create mode 100644 examples/rbac/client/test.py create mode 100644 examples/rbac/feature_store_remote.yaml create mode 100755 examples/rbac/install_feast.sh create mode 100644 examples/rbac/server/__init__.py create mode 100644 examples/rbac/server/feature_repo/__init__.py create mode 100644 examples/rbac/server/feature_repo/example_repo.py create mode 100644 examples/rbac/server/feature_repo/feature_store.yaml diff --git a/examples/rbac/README.md b/examples/rbac/README.md new file mode 100644 index 0000000000..a45eb4bae3 --- /dev/null +++ b/examples/rbac/README.md @@ -0,0 +1,24 @@ + +/install_feast.sh + + + +# Feast Setup and Port Forwarding Instructions + +This document provides instructions for installing Feast and setting up port forwarding for various services for Kubernetes cluster. + +## Installation + +To install Feast, follow these steps: + +1. **Run the Installation Script:** + + ```sh + ./install_feast.sh + +For local testing the forward PostgreSQL Service and Feast Servers Port with below commands: + ```sh + kubectl port-forward svc/postgresql 5432:5432 + kubectl port-forward svc/feast-offline-server-feast-feature-server 8815:80 + kubectl port-forward svc/feast-registry-server-feast-feature-server 6570:80 + kubectl port-forward svc/feast-feature-server 6566:80 \ No newline at end of file diff --git a/examples/rbac/__init__.py b/examples/rbac/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/examples/rbac/client/__init__.py b/examples/rbac/client/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/examples/rbac/client/feature_store.yaml b/examples/rbac/client/feature_store.yaml new file mode 100644 index 0000000000..3edad3f4a5 --- /dev/null +++ b/examples/rbac/client/feature_store.yaml @@ -0,0 +1,14 @@ +project: server +registry: + registry_type: remote + path: localhost:6570 +offline_store: + type: remote + host: localhost + port: 8815 +online_store: + type: remote + path: http://localhost:6566 +auth: + type: kubernetes +entity_key_serialization_version: 2 diff --git a/examples/rbac/client/test.py b/examples/rbac/client/test.py new file mode 100644 index 0000000000..172ee73bf0 --- /dev/null +++ b/examples/rbac/client/test.py @@ -0,0 +1,40 @@ +from datetime import datetime +from feast import FeatureStore +import pandas as pd + +entity_df = pd.DataFrame.from_dict( + { + "driver_id": [1001, 1002, 1003], + "event_timestamp": [ + datetime(2021, 4, 12, 10, 59, 42), + datetime(2021, 4, 12, 8, 12, 10), + datetime(2021, 4, 12, 16, 40, 26), + ], + "label_driver_reported_satisfaction": [1, 5, 3], + "val_to_add": [1, 2, 3], + "val_to_add_2": [10, 20, 30], + } +) + +features = [ + "driver_hourly_stats:conv_rate", + "driver_hourly_stats:acc_rate", + "driver_hourly_stats:avg_daily_trips", + "transformed_conv_rate:conv_rate_plus_val1", + "transformed_conv_rate:conv_rate_plus_val2", +] + +store = FeatureStore(repo_path=".") + +training_df = store.get_historical_features(entity_df, features).to_df() + +print("----- Feature schema -----\n") +print(training_df.info()) + +print() +print("----- Features -----\n") +print(training_df.head()) + +print("------training_df----") + +print(training_df) diff --git a/examples/rbac/feature_store_remote.yaml b/examples/rbac/feature_store_remote.yaml new file mode 100644 index 0000000000..107a771d5a --- /dev/null +++ b/examples/rbac/feature_store_remote.yaml @@ -0,0 +1,28 @@ +project: server +provider: local +registry: + registry_type: sql + path: postgresql://feast:feast@postgresql.feast-qe.svc.cluster.local:5432/feast + cache_ttl_seconds: 60 + sqlalchemy_config_kwargs: + echo: false + pool_pre_ping: true +online_store: + type: postgres + host: postgresql.feast-qe.svc.cluster.local + port: 5432 + database: feast + db_schema: public + user: feast + password: feast +offline_store: + type: postgres + host: postgresql.feast-qe.svc.cluster.local + port: 5432 + database: feast + db_schema: public + user: feast + password: feast +auth: + type: kubernetes +entity_key_serialization_version: 2 diff --git a/examples/rbac/install_feast.sh b/examples/rbac/install_feast.sh new file mode 100755 index 0000000000..d9e61405ab --- /dev/null +++ b/examples/rbac/install_feast.sh @@ -0,0 +1,49 @@ +#!/bin/bash + +# Default paths +DEFAULT_FEATURE_STORE_YAML_PATH="feature_store_remote.yaml" +DEFAULT_HELM_CHART_PATH="../../infra/charts/feast-feature-server" + +# Accept parameters or use default values +FEATURE_STORE_YAML_PATH=${1:-$DEFAULT_FEATURE_STORE_YAML_PATH} +HELM_CHART_PATH=${2:-$DEFAULT_HELM_CHART_PATH} + +# Check if the feature_store.yaml file exists +if [ ! -f "$FEATURE_STORE_YAML_PATH" ]; then + echo "Error: File not found at $FEATURE_STORE_YAML_PATH" + exit 1 +fi + +# Print the file path +echo "File found at $FEATURE_STORE_YAML_PATH" + +# Base64 encode the feature_store.yaml file and store it in a variable +FEATURE_STORE_YAML_BASE64=$(base64 < "$FEATURE_STORE_YAML_PATH") + +# Check if base64 encoding was successful +if [ -z "$FEATURE_STORE_YAML_BASE64" ]; then + echo "Error: Failed to base64 encode the feature_store.yaml file." + exit 1 +fi + +# Print the base64 encoded content (optional, for debugging purposes) +# echo "Base64 Encoded Content: $FEATURE_STORE_YAML_BASE64" + +# Upgrade or install feast-feature-server +helm upgrade --install feast-feature-server $HELM_CHART_PATH \ + --set feature_store_yaml_base64=$FEATURE_STORE_YAML_BASE64 + +# Upgrade or install feast-offline-server +helm upgrade --install feast-offline-server $HELM_CHART_PATH \ + --set feast_mode=offline \ + --set feature_store_yaml_base64=$FEATURE_STORE_YAML_BASE64 + +# Upgrade or install feast-ui-server +helm upgrade --install feast-ui-server $HELM_CHART_PATH \ + --set feast_mode=ui \ + --set feature_store_yaml_base64=$FEATURE_STORE_YAML_BASE64 + +# Upgrade or install feast-registry-server +helm upgrade --install feast-registry-server $HELM_CHART_PATH \ + --set feast_mode=registry \ + --set feature_store_yaml_base64=$FEATURE_STORE_YAML_BASE64 diff --git a/examples/rbac/server/__init__.py b/examples/rbac/server/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/examples/rbac/server/feature_repo/__init__.py b/examples/rbac/server/feature_repo/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/examples/rbac/server/feature_repo/example_repo.py b/examples/rbac/server/feature_repo/example_repo.py new file mode 100644 index 0000000000..0d1783e1e5 --- /dev/null +++ b/examples/rbac/server/feature_repo/example_repo.py @@ -0,0 +1,131 @@ +# This is an example feature definition file + +from datetime import timedelta + +import pandas as pd + +from feast import Entity, FeatureService, FeatureView, Field, PushSource, RequestSource +from feast.infra.offline_stores.contrib.postgres_offline_store.postgres_source import ( + PostgreSQLSource, +) +from feast.on_demand_feature_view import on_demand_feature_view +from feast.types import Float32, Float64, Int64 + +# Define an entity for the driver. You can think of an entity as a primary key used to +# fetch features. +driver = Entity(name="driver", join_keys=["driver_id"]) + +driver_stats_source = PostgreSQLSource( + name="driver_hourly_stats_source", + query="SELECT * FROM feast_driver_hourly_stats", + timestamp_field="event_timestamp", + created_timestamp_column="created", +) + +# Our parquet files contain sample data that includes a driver_id column, timestamps and +# three feature column. Here we define a Feature View that will allow us to serve this +# data to our model online. +driver_stats_fv = FeatureView( + # The unique name of this feature view. Two feature views in a single + # project cannot have the same name + name="driver_hourly_stats", + entities=[driver], + ttl=timedelta(days=1), + # The list of features defined below act as a schema to both define features + # for both materialization of features into a store, and are used as references + # during retrieval for building a training dataset or serving features + schema=[ + Field(name="conv_rate", dtype=Float32), + Field(name="acc_rate", dtype=Float32), + Field(name="avg_daily_trips", dtype=Int64), + ], + online=True, + source=driver_stats_source, + # Tags are user defined key/value pairs that are attached to each + # feature view + tags={"team": "driver_performance"}, +) + +# Define a request data source which encodes features / information only +# available at request time (e.g. part of the user initiated HTTP request) +input_request = RequestSource( + name="vals_to_add", + schema=[ + Field(name="val_to_add", dtype=Int64), + Field(name="val_to_add_2", dtype=Int64), + ], +) + + +# Define an on demand feature view which can generate new features based on +# existing feature views and RequestSource features +@on_demand_feature_view( + sources=[driver_stats_fv, input_request], + schema=[ + Field(name="conv_rate_plus_val1", dtype=Float64), + Field(name="conv_rate_plus_val2", dtype=Float64), + ], +) +def transformed_conv_rate(inputs: pd.DataFrame) -> pd.DataFrame: + df = pd.DataFrame() + df["conv_rate_plus_val1"] = inputs["conv_rate"] + inputs["val_to_add"] + df["conv_rate_plus_val2"] = inputs["conv_rate"] + inputs["val_to_add_2"] + return df + + +# This groups features into a model version +driver_activity_v1 = FeatureService( + name="driver_activity_v1", + features=[ + driver_stats_fv[["conv_rate"]], # Sub-selects a feature from a feature view + transformed_conv_rate, # Selects all features from the feature view + ], +) +driver_activity_v2 = FeatureService( + name="driver_activity_v2", features=[driver_stats_fv, transformed_conv_rate] +) + +# Defines a way to push data (to be available offline, online or both) into Feast. +driver_stats_push_source = PushSource( + name="driver_stats_push_source", + batch_source=driver_stats_source, +) + +# Defines a slightly modified version of the feature view from above, where the source +# has been changed to the push source. This allows fresh features to be directly pushed +# to the online store for this feature view. +driver_stats_fresh_fv = FeatureView( + name="driver_hourly_stats_fresh", + entities=[driver], + ttl=timedelta(days=1), + schema=[ + Field(name="conv_rate", dtype=Float32), + Field(name="acc_rate", dtype=Float32), + Field(name="avg_daily_trips", dtype=Int64), + ], + online=True, + source=driver_stats_push_source, # Changed from above + tags={"team": "driver_performance"}, +) + + +# Define an on demand feature view which can generate new features based on +# existing feature views and RequestSource features +@on_demand_feature_view( + sources=[driver_stats_fresh_fv, input_request], # relies on fresh version of FV + schema=[ + Field(name="conv_rate_plus_val1", dtype=Float64), + Field(name="conv_rate_plus_val2", dtype=Float64), + ], +) +def transformed_conv_rate_fresh(inputs: pd.DataFrame) -> pd.DataFrame: + df = pd.DataFrame() + df["conv_rate_plus_val1"] = inputs["conv_rate"] + inputs["val_to_add"] + df["conv_rate_plus_val2"] = inputs["conv_rate"] + inputs["val_to_add_2"] + return df + + +driver_activity_v3 = FeatureService( + name="driver_activity_v3", + features=[driver_stats_fresh_fv, transformed_conv_rate_fresh], +) diff --git a/examples/rbac/server/feature_repo/feature_store.yaml b/examples/rbac/server/feature_repo/feature_store.yaml new file mode 100644 index 0000000000..69df528f90 --- /dev/null +++ b/examples/rbac/server/feature_repo/feature_store.yaml @@ -0,0 +1,26 @@ +project: server +provider: local +registry: + registry_type: sql + path: postgresql://feast:feast@127.0.0.1:5432/feast + cache_ttl_seconds: 60 + sqlalchemy_config_kwargs: + echo: false + pool_pre_ping: true +online_store: + type: postgres + host: localhost + port: 5432 + database: feast + db_schema: public + user: feast + password: feast +offline_store: + type: postgres + host: localhost + port: 5432 + database: feast + db_schema: public + user: feast + password: feast +entity_key_serialization_version: 2 From 3ab7087bd3b5bc093766a08fedddca27a442b650 Mon Sep 17 00:00:00 2001 From: Abdul Hameed Date: Wed, 17 Jul 2024 13:50:38 -0400 Subject: [PATCH 099/169] Added support to read the token from enviroment variable to run from local Signed-off-by: Abdul Hameed --- .../client/kubernetes_auth_client_manager.py | 29 ++++++++++++++++--- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/sdk/python/feast/permissions/client/kubernetes_auth_client_manager.py b/sdk/python/feast/permissions/client/kubernetes_auth_client_manager.py index 03b412893d..9121603d8c 100644 --- a/sdk/python/feast/permissions/client/kubernetes_auth_client_manager.py +++ b/sdk/python/feast/permissions/client/kubernetes_auth_client_manager.py @@ -1,4 +1,5 @@ import logging +import os from feast.permissions.auth_model import KubernetesAuthConfig from feast.permissions.client.auth_client_manager import AuthenticationClientManager @@ -9,14 +10,34 @@ class KubernetesAuthClientManager(AuthenticationClientManager): def __init__(self, auth_config: KubernetesAuthConfig): self.auth_config = auth_config + self.token_file_path = "/var/run/secrets/kubernetes.io/serviceaccount/token" def get_token(self): try: - with open( - "/var/run/secrets/kubernetes.io/serviceaccount/token", "r" - ) as file: + token = self._read_token_from_file() + return token + except Exception as e: + logger.exception(f"Error reading token from file: {e}") + logger.info("Attempting to read token from environment variable.") + try: + token = self._read_token_from_env() + return token + except Exception as env_e: + logger.exception( + f"Error reading token from environment variable: {env_e}" + ) + raise env_e + + def _read_token_from_file(self): + try: + with open(self.token_file_path, "r") as file: token = file.read().strip() return token except Exception as e: - logger.exception(f"Error reading token: {e}") raise e + + def _read_token_from_env(self): + token = os.getenv("LOCAL_K8S_TOKEN") + if not token: + raise FileNotFoundError("LOCAL_K8S_TOKEN environment variable is not set.") + return token From b260756634d9ba1dd3d47dad30e2e25567b1ae8f Mon Sep 17 00:00:00 2001 From: Abdul Hameed Date: Wed, 17 Jul 2024 15:42:47 -0400 Subject: [PATCH 100/169] Fix the header for arrow fligth Signed-off-by: Abdul Hameed --- sdk/python/feast/permissions/client/utils.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/sdk/python/feast/permissions/client/utils.py b/sdk/python/feast/permissions/client/utils.py index 02c69c9d6e..221be101b9 100644 --- a/sdk/python/feast/permissions/client/utils.py +++ b/sdk/python/feast/permissions/client/utils.py @@ -15,7 +15,9 @@ def create_auth_header( def create_flight_call_options(auth_config: AuthConfig) -> fl.FlightCallOptions: - if auth_config.type != AuthType.NONE.value: - headers = create_auth_header(auth_config) + if auth_config.type != AuthType.NONE: + auth_client_manager = get_auth_client_manager(auth_config) + token = auth_client_manager.get_token() + headers = [(b"authorization", b"Bearer " + token.encode('utf-8'))] return fl.FlightCallOptions(headers=headers) return fl.FlightCallOptions() From 269cc33fb9188d0991435a83848cb10d85527669 Mon Sep 17 00:00:00 2001 From: Abdul Hameed Date: Wed, 17 Jul 2024 15:58:16 -0400 Subject: [PATCH 101/169] fix the header issue Signed-off-by: Abdul Hameed --- examples/rbac/client/test.py | 4 ++++ sdk/python/feast/infra/offline_stores/remote.py | 2 +- sdk/python/feast/permissions/client/utils.py | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/examples/rbac/client/test.py b/examples/rbac/client/test.py index 172ee73bf0..dcafc3562b 100644 --- a/examples/rbac/client/test.py +++ b/examples/rbac/client/test.py @@ -1,7 +1,11 @@ +import os from datetime import datetime from feast import FeatureStore import pandas as pd + +os.environ["LOCAL_K8S_TOKEN"] = "" + entity_df = pd.DataFrame.from_dict( { "driver_id": [1001, 1002, 1003], diff --git a/sdk/python/feast/infra/offline_stores/remote.py b/sdk/python/feast/infra/offline_stores/remote.py index f24afca371..2545d47734 100644 --- a/sdk/python/feast/infra/offline_stores/remote.py +++ b/sdk/python/feast/infra/offline_stores/remote.py @@ -367,7 +367,7 @@ def _call_get( options: pa.flight.FlightCallOptions, command_descriptor: fl.FlightDescriptor, ): - flight = client.get_flight_info(command_descriptor) + flight = client.get_flight_info(command_descriptor, options) ticket = flight.endpoints[0].ticket reader = client.do_get(ticket, options) return reader.read_all() diff --git a/sdk/python/feast/permissions/client/utils.py b/sdk/python/feast/permissions/client/utils.py index 221be101b9..acb3510ba3 100644 --- a/sdk/python/feast/permissions/client/utils.py +++ b/sdk/python/feast/permissions/client/utils.py @@ -18,6 +18,6 @@ def create_flight_call_options(auth_config: AuthConfig) -> fl.FlightCallOptions: if auth_config.type != AuthType.NONE: auth_client_manager = get_auth_client_manager(auth_config) token = auth_client_manager.get_token() - headers = [(b"authorization", b"Bearer " + token.encode('utf-8'))] + headers = [(b"authorization", b"Bearer " + token.encode("utf-8"))] return fl.FlightCallOptions(headers=headers) return fl.FlightCallOptions() From 741010de630cf554ecffdd53256667e0617601ba Mon Sep 17 00:00:00 2001 From: Abdul Hameed Date: Wed, 17 Jul 2024 17:03:28 -0400 Subject: [PATCH 102/169] added permissions apply file Signed-off-by: Abdul Hameed --- examples/rbac/client/feature_store.yaml | 16 ++++---- examples/rbac/install_feast.sh | 5 --- .../server/feature_repo/feature_store.yaml | 40 +++++++++---------- .../server/feature_repo/permissions_apply.py | 18 +++++++++ 4 files changed, 46 insertions(+), 33 deletions(-) create mode 100644 examples/rbac/server/feature_repo/permissions_apply.py diff --git a/examples/rbac/client/feature_store.yaml b/examples/rbac/client/feature_store.yaml index 3edad3f4a5..e496f6a578 100644 --- a/examples/rbac/client/feature_store.yaml +++ b/examples/rbac/client/feature_store.yaml @@ -1,14 +1,14 @@ project: server registry: - registry_type: remote - path: localhost:6570 + registry_type: remote + path: localhost:6570 offline_store: - type: remote - host: localhost - port: 8815 + type: remote + host: localhost + port: 8815 online_store: - type: remote - path: http://localhost:6566 + type: remote + path: http://localhost:6566 auth: - type: kubernetes + type: kubernetes entity_key_serialization_version: 2 diff --git a/examples/rbac/install_feast.sh b/examples/rbac/install_feast.sh index d9e61405ab..3741385548 100755 --- a/examples/rbac/install_feast.sh +++ b/examples/rbac/install_feast.sh @@ -38,11 +38,6 @@ helm upgrade --install feast-offline-server $HELM_CHART_PATH \ --set feast_mode=offline \ --set feature_store_yaml_base64=$FEATURE_STORE_YAML_BASE64 -# Upgrade or install feast-ui-server -helm upgrade --install feast-ui-server $HELM_CHART_PATH \ - --set feast_mode=ui \ - --set feature_store_yaml_base64=$FEATURE_STORE_YAML_BASE64 - # Upgrade or install feast-registry-server helm upgrade --install feast-registry-server $HELM_CHART_PATH \ --set feast_mode=registry \ diff --git a/examples/rbac/server/feature_repo/feature_store.yaml b/examples/rbac/server/feature_repo/feature_store.yaml index 69df528f90..32db949634 100644 --- a/examples/rbac/server/feature_repo/feature_store.yaml +++ b/examples/rbac/server/feature_repo/feature_store.yaml @@ -1,26 +1,26 @@ project: server provider: local registry: - registry_type: sql - path: postgresql://feast:feast@127.0.0.1:5432/feast - cache_ttl_seconds: 60 - sqlalchemy_config_kwargs: - echo: false - pool_pre_ping: true + registry_type: sql + path: postgresql://feast:feast@127.0.0.1:5432/feast + cache_ttl_seconds: 60 + sqlalchemy_config_kwargs: + echo: false + pool_pre_ping: true online_store: - type: postgres - host: localhost - port: 5432 - database: feast - db_schema: public - user: feast - password: feast + type: postgres + host: localhost + port: 5432 + database: feast + db_schema: public + user: feast + password: feast offline_store: - type: postgres - host: localhost - port: 5432 - database: feast - db_schema: public - user: feast - password: feast + type: postgres + host: localhost + port: 5432 + database: feast + db_schema: public + user: feast + password: feast entity_key_serialization_version: 2 diff --git a/examples/rbac/server/feature_repo/permissions_apply.py b/examples/rbac/server/feature_repo/permissions_apply.py new file mode 100644 index 0000000000..1ff1927c29 --- /dev/null +++ b/examples/rbac/server/feature_repo/permissions_apply.py @@ -0,0 +1,18 @@ +import os +from datetime import datetime +from feast import FeatureStore +import pandas as pd +from feast.feast_object import ALL_RESOURCE_TYPES +from feast.permissions.action import AuthzedAction, QUERY, WRITE, CRUD +from feast.permissions.permission import Permission +from feast.permissions.policy import RoleBasedPolicy + + + +store = FeatureStore(repo_path=".") + +perm = Permission(name="list_permissions_perm", types=ALL_RESOURCE_TYPES, with_subclasses=False, + policy=RoleBasedPolicy(roles=["cluster-admin"]), + actions=QUERY+WRITE+CRUD) +store.apply([perm]) + From 8c1993b7dc96787dbc59487de1c75ef40012a7c4 Mon Sep 17 00:00:00 2001 From: Abdul Hameed Date: Thu, 18 Jul 2024 15:10:31 -0400 Subject: [PATCH 103/169] set the user in the grpc server Signed-off-by: Abdul Hameed --- sdk/python/feast/permissions/client/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/python/feast/permissions/client/utils.py b/sdk/python/feast/permissions/client/utils.py index acb3510ba3..88c38a18fc 100644 --- a/sdk/python/feast/permissions/client/utils.py +++ b/sdk/python/feast/permissions/client/utils.py @@ -15,7 +15,7 @@ def create_auth_header( def create_flight_call_options(auth_config: AuthConfig) -> fl.FlightCallOptions: - if auth_config.type != AuthType.NONE: + if auth_config.type != AuthType.NONE.value: auth_client_manager = get_auth_client_manager(auth_config) token = auth_client_manager.get_token() headers = [(b"authorization", b"Bearer " + token.encode("utf-8"))] From 6558760d61055fa127fca1288fa9796b95ba4714 Mon Sep 17 00:00:00 2001 From: Abdul Hameed Date: Thu, 18 Jul 2024 21:27:41 -0400 Subject: [PATCH 104/169] added roles and updated permission with all roles Signed-off-by: Abdul Hameed --- examples/rbac/cleanup_feast.sh | 20 +++++ examples/rbac/client/test.py | 7 +- examples/rbac/install_feast.sh | 29 +++++-- examples/rbac/role.yaml | 39 ++++++++++ examples/rbac/role_binding.yaml | 11 +++ .../server/feature_repo/permissions_apply.py | 75 ++++++++++++++++--- examples/rbac/service_account.yaml | 4 + 7 files changed, 165 insertions(+), 20 deletions(-) create mode 100755 examples/rbac/cleanup_feast.sh create mode 100644 examples/rbac/role.yaml create mode 100644 examples/rbac/role_binding.yaml create mode 100644 examples/rbac/service_account.yaml diff --git a/examples/rbac/cleanup_feast.sh b/examples/rbac/cleanup_feast.sh new file mode 100755 index 0000000000..3c8aa4d91c --- /dev/null +++ b/examples/rbac/cleanup_feast.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +DEFAULT_HELM_RELEASES=("feast-feature-server" "feast-offline-server" "feast-ui-server" "feast-registry-server") +NAMESPACE="feast-qe" + +HELM_RELEASES=(${1:-${DEFAULT_HELM_RELEASES[@]}}) +NAMESPACE=${2:-$NAMESPACE} + +echo "Deleting Helm releases..." +for release in "${HELM_RELEASES[@]}"; do + helm uninstall $release -n $NAMESPACE +done + +echo "Deleting Kubernetes roles, role bindings, and service accounts..." +kubectl delete -f role.yaml +kubectl delete -f role_binding.yaml +kubectl delete -f service_account.yaml + +echo "Cleanup completed." +echo "Cleanup completed." diff --git a/examples/rbac/client/test.py b/examples/rbac/client/test.py index dcafc3562b..32e6fb9e45 100644 --- a/examples/rbac/client/test.py +++ b/examples/rbac/client/test.py @@ -1,10 +1,11 @@ import os from datetime import datetime -from feast import FeatureStore -import pandas as pd +import pandas as pd +from feast import FeatureStore -os.environ["LOCAL_K8S_TOKEN"] = "" +os.environ[ + "LOCAL_K8S_TOKEN"] = "" entity_df = pd.DataFrame.from_dict( { diff --git a/examples/rbac/install_feast.sh b/examples/rbac/install_feast.sh index 3741385548..52e4d4a809 100755 --- a/examples/rbac/install_feast.sh +++ b/examples/rbac/install_feast.sh @@ -3,10 +3,12 @@ # Default paths DEFAULT_FEATURE_STORE_YAML_PATH="feature_store_remote.yaml" DEFAULT_HELM_CHART_PATH="../../infra/charts/feast-feature-server" +DEFAULT_SERVICE_ACCOUNT_NAME="feast-sa" # Accept parameters or use default values FEATURE_STORE_YAML_PATH=${1:-$DEFAULT_FEATURE_STORE_YAML_PATH} HELM_CHART_PATH=${2:-$DEFAULT_HELM_CHART_PATH} +SERVICE_ACCOUNT_NAME=${3:-$DEFAULT_SERVICE_ACCOUNT_NAME} # Check if the feature_store.yaml file exists if [ ! -f "$FEATURE_STORE_YAML_PATH" ]; then @@ -14,7 +16,6 @@ if [ ! -f "$FEATURE_STORE_YAML_PATH" ]; then exit 1 fi -# Print the file path echo "File found at $FEATURE_STORE_YAML_PATH" # Base64 encode the feature_store.yaml file and store it in a variable @@ -26,19 +27,31 @@ if [ -z "$FEATURE_STORE_YAML_BASE64" ]; then exit 1 fi -# Print the base64 encoded content (optional, for debugging purposes) # echo "Base64 Encoded Content: $FEATURE_STORE_YAML_BASE64" -# Upgrade or install feast-feature-server +# Apply Kubernetes configurations +echo "Applying service account, roles, and role bindings" +kubectl apply -f service_account.yaml +kubectl apply -f role.yaml +kubectl apply -f role_binding.yaml + +# Upgrade or install Feast components +echo "Upgrading or installing Feast components" helm upgrade --install feast-feature-server $HELM_CHART_PATH \ - --set feature_store_yaml_base64=$FEATURE_STORE_YAML_BASE64 + --set feature_store_yaml_base64=$FEATURE_STORE_YAML_BASE64 \ + --set serviceAccount.name=$SERVICE_ACCOUNT_NAME -# Upgrade or install feast-offline-server helm upgrade --install feast-offline-server $HELM_CHART_PATH \ --set feast_mode=offline \ - --set feature_store_yaml_base64=$FEATURE_STORE_YAML_BASE64 + --set feature_store_yaml_base64=$FEATURE_STORE_YAML_BASE64 \ + --set serviceAccount.name=$SERVICE_ACCOUNT_NAME + +helm upgrade --install feast-ui-server $HELM_CHART_PATH \ + --set feast_mode=ui \ + --set feature_store_yaml_base64=$FEATURE_STORE_YAML_BASE64 \ + --set serviceAccount.name=$SERVICE_ACCOUNT_NAME -# Upgrade or install feast-registry-server helm upgrade --install feast-registry-server $HELM_CHART_PATH \ --set feast_mode=registry \ - --set feature_store_yaml_base64=$FEATURE_STORE_YAML_BASE64 + --set feature_store_yaml_base64=$FEATURE_STORE_YAML_BASE64 \ + --set serviceAccount.name=$SERVICE_ACCOUNT_NAME diff --git a/examples/rbac/role.yaml b/examples/rbac/role.yaml new file mode 100644 index 0000000000..10975e15ce --- /dev/null +++ b/examples/rbac/role.yaml @@ -0,0 +1,39 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: feast-create-role +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: feast-read-role +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: feast-update-role +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: feast-delete-role +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: feast-query-online-role +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: feast-query-offline-role +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: feast-write-online-role +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: feast-write-offline-role diff --git a/examples/rbac/role_binding.yaml b/examples/rbac/role_binding.yaml new file mode 100644 index 0000000000..c0253126f7 --- /dev/null +++ b/examples/rbac/role_binding.yaml @@ -0,0 +1,11 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: feast-token-binding +subjects: + - kind: ServiceAccount + name: feast-sa +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: cluster-admin \ No newline at end of file diff --git a/examples/rbac/server/feature_repo/permissions_apply.py b/examples/rbac/server/feature_repo/permissions_apply.py index 1ff1927c29..0d0232edb9 100644 --- a/examples/rbac/server/feature_repo/permissions_apply.py +++ b/examples/rbac/server/feature_repo/permissions_apply.py @@ -1,18 +1,75 @@ -import os -from datetime import datetime from feast import FeatureStore -import pandas as pd from feast.feast_object import ALL_RESOURCE_TYPES -from feast.permissions.action import AuthzedAction, QUERY, WRITE, CRUD +from feast.permissions.action import QUERY, WRITE, CRUD from feast.permissions.permission import Permission from feast.permissions.policy import RoleBasedPolicy +store = FeatureStore(repo_path=".") +create_roles = ["feast-create-role"] +read_roles = ["feast-read-role"] +update_roles = ["feast-update-role"] +delete_roles = ["feast-delete-role"] +query_roles = ["feast-query-online-role", "feast-query-offline-role"] +write_roles = ["feast-write-online-role", "feast-write-offline-role"] -store = FeatureStore(repo_path=".") +# all roles +all_roles = create_roles + read_roles + update_roles + delete_roles + query_roles + write_roles + +create_perm = Permission( + name="feast_create_permission", + types=ALL_RESOURCE_TYPES, + with_subclasses=False, + policy=RoleBasedPolicy(roles=create_roles), + actions=CRUD +) + +read_perm = Permission( + name="feast_read_permission", + types=ALL_RESOURCE_TYPES, + with_subclasses=False, + policy=RoleBasedPolicy(roles=read_roles), + actions=QUERY +) + +update_perm = Permission( + name="feast_update_permission", + types=ALL_RESOURCE_TYPES, + with_subclasses=False, + policy=RoleBasedPolicy(roles=update_roles), + actions=CRUD +) + +delete_perm = Permission( + name="feast_delete_permission", + types=ALL_RESOURCE_TYPES, + with_subclasses=False, + policy=RoleBasedPolicy(roles=delete_roles), + actions=CRUD +) + +query_perm = Permission( + name="feast_query_permission", + types=ALL_RESOURCE_TYPES, + with_subclasses=False, + policy=RoleBasedPolicy(roles=query_roles), + actions=QUERY +) + +write_perm = Permission( + name="feast_write_permission", + types=ALL_RESOURCE_TYPES, + with_subclasses=False, + policy=RoleBasedPolicy(roles=write_roles), + actions=WRITE +) -perm = Permission(name="list_permissions_perm", types=ALL_RESOURCE_TYPES, with_subclasses=False, - policy=RoleBasedPolicy(roles=["cluster-admin"]), - actions=QUERY+WRITE+CRUD) -store.apply([perm]) +full_access_perm = Permission( + name="feast_full_access_permission", + types=ALL_RESOURCE_TYPES, + with_subclasses=False, + policy=RoleBasedPolicy(roles=all_roles), + actions=QUERY + WRITE + CRUD +) +store.apply([full_access_perm]) diff --git a/examples/rbac/service_account.yaml b/examples/rbac/service_account.yaml new file mode 100644 index 0000000000..591c142acd --- /dev/null +++ b/examples/rbac/service_account.yaml @@ -0,0 +1,4 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + name: feast-sa From cb4add7917e5c3b0d819d1e65f08524664c9d4e8 Mon Sep 17 00:00:00 2001 From: Abdul Hameed Date: Thu, 18 Jul 2024 21:29:54 -0400 Subject: [PATCH 105/169] updated chart to include the service account Signed-off-by: Abdul Hameed --- infra/charts/feast-feature-server/templates/deployment.yaml | 1 + infra/charts/feast-feature-server/values.yaml | 3 +++ 2 files changed, 4 insertions(+) diff --git a/infra/charts/feast-feature-server/templates/deployment.yaml b/infra/charts/feast-feature-server/templates/deployment.yaml index a550433db5..076f234306 100644 --- a/infra/charts/feast-feature-server/templates/deployment.yaml +++ b/infra/charts/feast-feature-server/templates/deployment.yaml @@ -21,6 +21,7 @@ spec: labels: {{- include "feast-feature-server.selectorLabels" . | nindent 8 }} spec: + serviceAccountName: {{ .Values.serviceAccount.name | default "default" }} {{- with .Values.imagePullSecrets }} imagePullSecrets: {{- toYaml . | nindent 8 }} diff --git a/infra/charts/feast-feature-server/values.yaml b/infra/charts/feast-feature-server/values.yaml index 64d805a66c..22bbdeace0 100644 --- a/infra/charts/feast-feature-server/values.yaml +++ b/infra/charts/feast-feature-server/values.yaml @@ -44,6 +44,9 @@ service: type: ClusterIP port: 80 +serviceAccount: + name: "" + resources: {} # We usually recommend not to specify default resources and to leave this as a conscious # choice for the user. This also increases chances charts run on environments with little From bf4ac902a0de53fd1621cd23ede1aecdaebc1f55 Mon Sep 17 00:00:00 2001 From: Abdul Hameed Date: Mon, 22 Jul 2024 11:40:38 -0400 Subject: [PATCH 106/169] created client example with roles and updated installation/cleanup script Signed-off-by: Abdul Hameed --- examples/rbac/README.md | 158 +++++++++++++++++- examples/rbac/admin_output.png | Bin 0 -> 206275 bytes examples/rbac/cleanup_feast.sh | 15 +- examples/rbac/client/__init__.py | 0 examples/rbac/client/admin_resources.yaml | 64 +++++++ .../client/feature_repo/feature_store.yaml | 14 ++ .../rbac/client/feature_repo/test_admin.py | 120 +++++++++++++ .../rbac/client/feature_repo/test_user.py | 126 ++++++++++++++ examples/rbac/client/feature_store.yaml | 14 -- examples/rbac/client/test.py | 45 ----- examples/rbac/client/user_resources.yaml | 65 +++++++ examples/rbac/demo.jpg | Bin 0 -> 111840 bytes examples/rbac/deployment.png | Bin 0 -> 227907 bytes examples/rbac/feature_store_remote.yaml | 28 ---- examples/rbac/install_feast.sh | 104 +++++++----- examples/rbac/permission1.png | Bin 0 -> 535376 bytes examples/rbac/permission3.png | Bin 0 -> 194266 bytes examples/rbac/permissions2.png | Bin 0 -> 91831 bytes examples/rbac/pod.png | Bin 0 -> 183379 bytes examples/rbac/role.yaml | 39 ----- examples/rbac/role_binding.yaml | 11 -- .../server/feature_repo/permissions_apply.py | 76 ++------- .../rbac/server/feature_repo/test_workflow.py | 128 ++++++++++++++ .../rbac/server/feature_store_offline.yaml | 16 ++ .../rbac/server/feature_store_online.yaml | 20 +++ .../rbac/server/feature_store_registry.yaml | 12 ++ examples/rbac/server/server_resources.yaml | 27 +++ examples/rbac/service_account.yaml | 4 - examples/rbac/user_output.png | Bin 0 -> 202585 bytes .../client/kubernetes_auth_client_manager.py | 4 +- sdk/python/feast/permissions/client/utils.py | 4 +- 31 files changed, 830 insertions(+), 264 deletions(-) create mode 100644 examples/rbac/admin_output.png delete mode 100644 examples/rbac/client/__init__.py create mode 100644 examples/rbac/client/admin_resources.yaml create mode 100644 examples/rbac/client/feature_repo/feature_store.yaml create mode 100644 examples/rbac/client/feature_repo/test_admin.py create mode 100644 examples/rbac/client/feature_repo/test_user.py delete mode 100644 examples/rbac/client/feature_store.yaml delete mode 100644 examples/rbac/client/test.py create mode 100644 examples/rbac/client/user_resources.yaml create mode 100644 examples/rbac/demo.jpg create mode 100644 examples/rbac/deployment.png delete mode 100644 examples/rbac/feature_store_remote.yaml create mode 100644 examples/rbac/permission1.png create mode 100644 examples/rbac/permission3.png create mode 100644 examples/rbac/permissions2.png create mode 100644 examples/rbac/pod.png delete mode 100644 examples/rbac/role.yaml delete mode 100644 examples/rbac/role_binding.yaml create mode 100644 examples/rbac/server/feature_repo/test_workflow.py create mode 100644 examples/rbac/server/feature_store_offline.yaml create mode 100644 examples/rbac/server/feature_store_online.yaml create mode 100644 examples/rbac/server/feature_store_registry.yaml create mode 100644 examples/rbac/server/server_resources.yaml delete mode 100644 examples/rbac/service_account.yaml create mode 100644 examples/rbac/user_output.png diff --git a/examples/rbac/README.md b/examples/rbac/README.md index a45eb4bae3..b3dd0ab031 100644 --- a/examples/rbac/README.md +++ b/examples/rbac/README.md @@ -1,24 +1,166 @@ +# Feast Feature Store Deployment with RBAC -/install_feast.sh +## Demo Summary +This demo showcases how to enable Role-Based Access Control (RBAC) for a Feast Feature Store application using Kubernetes Authentication type. +The demo steps involve deploying server components (registry, offline, online) and client examples with resources (deployment, roles, role bindings, and service accounts) within a Kubernetes environment. +The goal is to ensure secure access control based on user roles and permissions. For understanding the Feast RBAC framework read the reference document [permission.md](../../docs/getting-started/concepts/permission.md). +## Tools and Projects +- Kubernetes +- Feast +- PostgreSQL Database +## Application Environment -# Feast Setup and Port Forwarding Instructions +This demo contains the following components: -This document provides instructions for installing Feast and setting up port forwarding for various services for Kubernetes cluster. +1. Feast Remote Server components (online, offline, registry) for the Feast Feature Store. +2. Feast Remote Client RBAC example (admin and user ). +3. Configuration and test scripts. + +![demo.jpg](demo.jpg) -## Installation +### Setup Instructions -To install Feast, follow these steps: +The application works under OpenShift or Kubernetes with the following instructions assume that you are using a OpenShift or Kubernetes cluster. -1. **Run the Installation Script:** +### Prerequisites + +1. Kubernetes Cluster and Kubernetes CLI (kubectl). +2. Helm: Ensure you have Helm installed for deploying the Feast components. +3. Python environment. +4. Feast CLI latest version. + +### Steps + +#### Local Project Setup + +#### 1. **Create the Feast feature store project with PostgreSQL.** + +* Install the PostgreSQL on a Kubernetes cluster if you are using OpenShift you can install using [OpenShift Template](https://github.com/RHEcosystemAppEng/feast-workshop-team-share/tree/main/feast_postgres#1-install-postgresql-on-openshift-using-openshift-template) +* Port Forward PostgreSQL Database to your local machine. Since we are setting up the Feast project locally using the Feast CLI, so for local connection required port forward PostgreSQL: + ``` kubectl port-forward svc/postgresql 5432:5432``` +* Create a feature repository/project using cli with PostgreSQL. Please see the instruction for more details [here](https://docs.feast.dev/reference/offline-stores/postgres#getting-started). + For this example (local) setup, we create project with name [server](server) using these settings for [feature_store.yaml](server/feature_repo/feature_store.yaml). +* From `Server` create Feast objects to the registry with command `feast apply` from `feature_repo` directory. +* Verify the application is working locally + +#### Remote Server Deployment + +#### 1. **Create the Server Feature Store Files and Add Auth Section.** + +* For remote deployment on the cluster, create feature store YAML files for each server, as shown in this example. + +**Registry Server:** [feature_store_registry.yaml](server/feature_store_registry.yaml) + +**Offline Server with Remote Registry:** [feature_store_offline.yaml](server/feature_store_offline.yaml) + +**Online Server with Remote Registry and Remote Offline Store:** [feature_store_online.yaml](server/feature_store_online.yaml) + +* Enable the auth in each Server feature store by setting the auth type to Kubernetes. You can read more about RBAC/permissions in [permission.md](../../docs/getting-started/concepts/permission.md) + +```yaml +auth: + type: kubernetes +``` + +#### 2. **Deploy server components with RBAC.** + +* Run the installation script. The setup script will deploy the server components based on user confirmation. The script will deploy all the components with the namespace name `feast-dev`. + + ```sh + ./install_feast.sh + ``` + Note: You can apply permission to run the script like this: + ```sh + chmod +x install_feast.sh + ``` +* Verify that all server pods are healthy and running. The install script will create a deployment for each server. + +#### Client Setup + +#### 1. **Create Client-Side Feature Store YAML with Kubernetes Auth Type.** + +* In this example, we created the [client](client) folder which contains client-related resources. + +* Set up the client feature store with remote connection details for the registry, online, and offline store. + +* See the client remote setting example here: [feature_store.yaml](client/feature_repo/feature_store.yaml) + +#### 2. **Deploy the Client Examples** + +* As an examples, we created two users: 1. admin and 2. user, and assigned the following roles and actions on the Feast object as shown in the table below. + +##### Roles and Permissions for Examples (Admin and User) +| **User** | **Service Account** | **Roles** | **Permission** | **Feast Resources** | **Actions** | +|-----------------|---------------------|------------------|-------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------| +| admin | feast-admin-sa | feast-admin-role | feast_admin_permission | FeatureView, OnDemandFeatureView, BatchFeatureView, StreamFeatureView, Entity, FeatureService, DataSource, ValidationReference, SavedDataset, Permission | CREATE, READ, UPDATE, DELETE, QUERY_ONLINE, QUERY_OFFLINE, WRITE_ONLINE, WRITE_OFFLINE | +| user | feast-user-sa | feast-user-role | feast_user_permission | FeatureView, OnDemandFeatureView, BatchFeatureView, StreamFeatureView, Entity, FeatureService, DataSource, ValidationReference, SavedDataset, Permission | READ, QUERY_OFFLINE, QUERY_ONLINE | + +* For deploying client examples, the script will create a Deployment, roles, role bindings, and service accounts for each user. See roles configuration for admin [admin_resources.yaml](client/admin_resources.yaml) and user [user_resources.yaml](client/user_resources.yaml) +* It will also create a ConfigMap on the client side that contains the test script and client-side feature store configuration. + +* To run the script below, if the server is already deployed, type 'no' for server deployment and 'yes' for client creation. ```sh ./install_feast.sh + ``` + +* We defined two examples under the client folder: `test_admin.py` and `test_user.py`. Both examples aim to perform actions related to Historical Features, Materialize Incremental, and Online Features. + +* The applications should work without permissions setting at this point. Verify the client applications of user and admin and able to do Historical Features, Materialize Incremental, and Online Features + +The Deployment of the overall setup looks like : + +![Deployment.png](deployment.png) + +![pod.png](pod.png) + +#### Apply Permissions + +* Feast admin needs to create permissions with the server-side feature store configuration by adding Python code. See the code example in [permissions_apply.py](server/feature_repo/permissions_apply.py) +* From `Server` create Permissions with command `feast apply` from `feature_repo` directory. At this point it can done from local project setup as step1. +* verify the permission by using `feast permissions list` or `feast list-roles ` + +![permission3.png](permission3.png) + +![permissions2.png](permissions2.png) + +![permission1.png](permission1.png) + -For local testing the forward PostgreSQL Service and Feast Servers Port with below commands: +#### **Validating Permissions examples.** + +As we created two examples under the client folder: `test_admin.py` and `test_user.py`. Both examples aim to perform actions related to Historical Features, Materialize Incremental, and Online Features. +According to the roles: + +- The admin can perform all actions on all objects. +- The user can only read or query on all objects. + +The below screenshots show that the admin can perform all actions, including Materialize. However, the user can only read offline and encounters an permissions error when attempting the Materialization step because the user does not have the required role. + +**Admin Example** +![admin_output.png](admin_output.png) + +**User Example** +![user_output.png](user_output.png) + + +For local testing, port forward the services PostgreSQL Service and Feast Servers with the commands below: ```sh kubectl port-forward svc/postgresql 5432:5432 kubectl port-forward svc/feast-offline-server-feast-feature-server 8815:80 kubectl port-forward svc/feast-registry-server-feast-feature-server 6570:80 - kubectl port-forward svc/feast-feature-server 6566:80 \ No newline at end of file + kubectl port-forward svc/feast-feature-server 6566:80 + ``` + +Also, set the environment variable LOCAL_K8S_TOKEN in each example if you want to test locally. The token can be obtained from the service account i.e. feast-admin-sa and feast-user-sa. + + +**Clean up:** + +The cleanup script will remove the deployed resources. + + ```sh + ./cleanup_feast.sh + ``` diff --git a/examples/rbac/admin_output.png b/examples/rbac/admin_output.png new file mode 100644 index 0000000000000000000000000000000000000000..d0bac96808fa415295edb0e91ceee18a930a3a70 GIT binary patch literal 206275 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 F{s&q6$)W%N literal 0 HcmV?d00001 diff --git a/examples/rbac/cleanup_feast.sh b/examples/rbac/cleanup_feast.sh index 3c8aa4d91c..8d2d9dc863 100755 --- a/examples/rbac/cleanup_feast.sh +++ b/examples/rbac/cleanup_feast.sh @@ -1,7 +1,7 @@ #!/bin/bash -DEFAULT_HELM_RELEASES=("feast-feature-server" "feast-offline-server" "feast-ui-server" "feast-registry-server") -NAMESPACE="feast-qe" +DEFAULT_HELM_RELEASES=("feast-feature-server" "feast-offline-server" "feast-registry-server") +NAMESPACE="feast-dev" HELM_RELEASES=(${1:-${DEFAULT_HELM_RELEASES[@]}}) NAMESPACE=${2:-$NAMESPACE} @@ -11,10 +11,11 @@ for release in "${HELM_RELEASES[@]}"; do helm uninstall $release -n $NAMESPACE done -echo "Deleting Kubernetes roles, role bindings, and service accounts..." -kubectl delete -f role.yaml -kubectl delete -f role_binding.yaml -kubectl delete -f service_account.yaml +echo "Deleting Kubernetes roles, role bindings, and service accounts for clients" +kubectl delete -f client/admin_resources.yaml +kubectl delete -f client/user_resources.yaml +kubectl delete -f server/server_resources.yaml + kubectl delete configmap client-feature-repo-config + -echo "Cleanup completed." echo "Cleanup completed." diff --git a/examples/rbac/client/__init__.py b/examples/rbac/client/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/examples/rbac/client/admin_resources.yaml b/examples/rbac/client/admin_resources.yaml new file mode 100644 index 0000000000..07993c320b --- /dev/null +++ b/examples/rbac/client/admin_resources.yaml @@ -0,0 +1,64 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + name: feast-admin-sa + namespace: feast-dev +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: feast-admin-role + namespace: feast-dev +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: feast-admin-rolebinding + namespace: feast-dev +subjects: + - kind: ServiceAccount + name: feast-admin-sa + namespace: feast-dev +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: feast-admin-role +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: client-admin-deployment + namespace: feast-dev + labels: + app: client-admin +spec: + replicas: 1 + selector: + matchLabels: + app: client-admin + template: + metadata: + labels: + app: client-admin + spec: + serviceAccountName: feast-admin-sa + initContainers: + - name: init-client-admin + image: quay.io/ahameed/feature-server:dev + imagePullPolicy: Always + command: ["python", "/app/feature_repo/test_admin.py"] + volumeMounts: + - name: client-feature-repo-config + mountPath: /app/feature_repo + containers: + - name: client-admin-container + image: quay.io/ahameed/feature-server:dev + imagePullPolicy: Always + command: ["sleep", "infinity"] + volumeMounts: + - name: client-feature-repo-config + mountPath: /app/feature_repo + volumes: + - name: client-feature-repo-config + configMap: + name: client-feature-repo-config diff --git a/examples/rbac/client/feature_repo/feature_store.yaml b/examples/rbac/client/feature_repo/feature_store.yaml new file mode 100644 index 0000000000..0af199fc39 --- /dev/null +++ b/examples/rbac/client/feature_repo/feature_store.yaml @@ -0,0 +1,14 @@ +project: server +registry: + registry_type: remote + path: feast-registry-server-feast-feature-server.feast-dev.svc.cluster.local:80 +offline_store: + type: remote + host: feast-offline-server-feast-feature-server.feast-dev.svc.cluster.local + port: 80 +online_store: + type: remote + path: http://feast-feature-server.feast-dev.svc.cluster.local:80 +auth: + type: kubernetes +entity_key_serialization_version: 2 diff --git a/examples/rbac/client/feature_repo/test_admin.py b/examples/rbac/client/feature_repo/test_admin.py new file mode 100644 index 0000000000..831364c236 --- /dev/null +++ b/examples/rbac/client/feature_repo/test_admin.py @@ -0,0 +1,120 @@ +import os +from datetime import datetime + +import pandas as pd +from feast import FeatureStore +from feast.data_source import PushMode + + +def run_demo(): + print("\n--- This is Admin Example ---") + try: + os.environ["LOCAL_K8S_TOKEN"] = "" + + store = FeatureStore(repo_path="/app/feature_repo") + + print("\n--- Historical features for training ---") + fetch_historical_features_entity_df(store, for_batch_scoring=False) + + print("\n--- Historical features for batch scoring ---") + fetch_historical_features_entity_df(store, for_batch_scoring=True) + + print("\n--- Load features into online store ---") + store.materialize_incremental(end_date=datetime.now()) + + print("\n--- Online features ---") + fetch_online_features(store) + + print("\n--- Online features retrieved (instead) through a feature service---") + # fetch_online_features(store, source="feature_service") + + print( + "\n--- Online features retrieved (using feature service v3, which uses a feature view with a push source---" + ) + # fetch_online_features(store, source="push") + + print("\n--- Simulate a stream event ingestion of the hourly stats df ---") + event_df = pd.DataFrame.from_dict( + { + "driver_id": [1001], + "event_timestamp": [datetime.now()], + "created": [datetime.now()], + "conv_rate": [1.0], + "acc_rate": [1.0], + "avg_daily_trips": [1000], + } + ) + print(event_df) + # store.push("driver_stats_push_source", event_df, to=PushMode.ONLINE_AND_OFFLINE) + + print("\n--- Online features again with updated values from a stream push---") + # fetch_online_features(store, source="push") + + except Exception as e: + print(f"An error occurred: {e}") + + +def fetch_historical_features_entity_df(store: FeatureStore, for_batch_scoring: bool): + try: + entity_df = pd.DataFrame.from_dict( + { + "driver_id": [1001, 1002, 1003], + "event_timestamp": [ + datetime(2021, 4, 12, 10, 59, 42), + datetime(2021, 4, 12, 8, 12, 10), + datetime(2021, 4, 12, 16, 40, 26), + ], + "label_driver_reported_satisfaction": [1, 5, 3], + } + ) + if for_batch_scoring: + entity_df["event_timestamp"] = pd.to_datetime("now", utc=True) + + training_df = store.get_historical_features( + entity_df=entity_df, + features=[ + "driver_hourly_stats:conv_rate", + "driver_hourly_stats:acc_rate", + "driver_hourly_stats:avg_daily_trips", + ], + ).to_df() + print(training_df.head()) + + except Exception as e: + print(f"An error occurred while fetching historical features: {e}") + + +def fetch_online_features(store, source: str = ""): + try: + entity_rows = [ + { + "driver_id": 1001, + }, + { + "driver_id": 1002, + }, + ] + if source == "feature_service": + features_to_fetch = store.get_feature_service("driver_activity_v1") + elif source == "push": + features_to_fetch = store.get_feature_service("driver_activity_v3") + else: + features_to_fetch = [ + "driver_hourly_stats:acc_rate", + ] + returned_features = store.get_online_features( + features=features_to_fetch, + entity_rows=entity_rows, + ).to_dict() + for key, value in sorted(returned_features.items()): + print(key, " : ", value) + + except Exception as e: + print(f"An error occurred while fetching online features: {e}") + + +if __name__ == "__main__": + try: + run_demo() + except Exception as e: + print(f"An error occurred in the main execution: {e}") diff --git a/examples/rbac/client/feature_repo/test_user.py b/examples/rbac/client/feature_repo/test_user.py new file mode 100644 index 0000000000..779bff9195 --- /dev/null +++ b/examples/rbac/client/feature_repo/test_user.py @@ -0,0 +1,126 @@ +import os +from datetime import datetime + +import pandas as pd +from feast import FeatureStore +from feast.data_source import PushMode + + +def run_demo(): + try: + os.environ["LOCAL_K8S_TOKEN"] = "" + print("\n--- This is User Example ---") + + store = FeatureStore(repo_path="/app/feature_repo") + + print("\n--- Historical features for training ---") + fetch_historical_features_entity_df(store, for_batch_scoring=False) + + print("\n--- Historical features for batch scoring ---") + fetch_historical_features_entity_df(store, for_batch_scoring=True) + + print("\n--- Load features into online store ---") + store.materialize_incremental(end_date=datetime.now()) + + print("\n--- Online features ---") + fetch_online_features(store) + + print("\n--- Online features retrieved (instead) through a feature service---") + # fetch_online_features(store, source="feature_service") + + print( + "\n--- Online features retrieved (using feature service v3, which uses a feature view with a push source---" + ) + # fetch_online_features(store, source="push") + + print("\n--- Simulate a stream event ingestion of the hourly stats df ---") + event_df = pd.DataFrame.from_dict( + { + "driver_id": [1001], + "event_timestamp": [datetime.now()], + "created": [datetime.now()], + "conv_rate": [1.0], + "acc_rate": [1.0], + "avg_daily_trips": [1000], + } + ) + print(event_df) + # store.push("driver_stats_push_source", event_df, to=PushMode.ONLINE_AND_OFFLINE) + + print("\n--- Online features again with updated values from a stream push---") + # fetch_online_features(store, source="push") + + except Exception as e: + print(f"An error occurred: {e}") + + +def fetch_historical_features_entity_df(store: FeatureStore, for_batch_scoring: bool): + try: + entity_df = pd.DataFrame.from_dict( + { + "driver_id": [1001, 1002, 1003], + "event_timestamp": [ + datetime(2021, 4, 12, 10, 59, 42), + datetime(2021, 4, 12, 8, 12, 10), + datetime(2021, 4, 12, 16, 40, 26), + ], + "label_driver_reported_satisfaction": [1, 5, 3], + } + ) + if for_batch_scoring: + entity_df["event_timestamp"] = pd.to_datetime("now", utc=True) + + training_df = store.get_historical_features( + entity_df=entity_df, + features=[ + "driver_hourly_stats:conv_rate", + "driver_hourly_stats:acc_rate", + "driver_hourly_stats:avg_daily_trips", + ], + ).to_df() + print(training_df.head()) + + except Exception as e: + print(f"An error occurred while fetching historical features: {e}") + + +def fetch_online_features(store, source: str = ""): + try: + entity_rows = [ + { + "driver_id": 1001, + "val_to_add": 1000, + "val_to_add_2": 2000, + }, + { + "driver_id": 1002, + "val_to_add": 1001, + "val_to_add_2": 2002, + }, + ] + if source == "feature_service": + features_to_fetch = store.get_feature_service("driver_activity_v1") + elif source == "push": + features_to_fetch = store.get_feature_service("driver_activity_v3") + else: + features_to_fetch = [ + "driver_hourly_stats:acc_rate", + "transformed_conv_rate:conv_rate_plus_val1", + "transformed_conv_rate:conv_rate_plus_val2", + ] + returned_features = store.get_online_features( + features=features_to_fetch, + entity_rows=entity_rows, + ).to_dict() + for key, value in sorted(returned_features.items()): + print(key, " : ", value) + + except Exception as e: + print(f"An error occurred while fetching online features: {e}") + + +if __name__ == "__main__": + try: + run_demo() + except Exception as e: + print(f"An error occurred in the main execution: {e}") diff --git a/examples/rbac/client/feature_store.yaml b/examples/rbac/client/feature_store.yaml deleted file mode 100644 index e496f6a578..0000000000 --- a/examples/rbac/client/feature_store.yaml +++ /dev/null @@ -1,14 +0,0 @@ -project: server -registry: - registry_type: remote - path: localhost:6570 -offline_store: - type: remote - host: localhost - port: 8815 -online_store: - type: remote - path: http://localhost:6566 -auth: - type: kubernetes -entity_key_serialization_version: 2 diff --git a/examples/rbac/client/test.py b/examples/rbac/client/test.py deleted file mode 100644 index 32e6fb9e45..0000000000 --- a/examples/rbac/client/test.py +++ /dev/null @@ -1,45 +0,0 @@ -import os -from datetime import datetime - -import pandas as pd -from feast import FeatureStore - -os.environ[ - "LOCAL_K8S_TOKEN"] = "" - -entity_df = pd.DataFrame.from_dict( - { - "driver_id": [1001, 1002, 1003], - "event_timestamp": [ - datetime(2021, 4, 12, 10, 59, 42), - datetime(2021, 4, 12, 8, 12, 10), - datetime(2021, 4, 12, 16, 40, 26), - ], - "label_driver_reported_satisfaction": [1, 5, 3], - "val_to_add": [1, 2, 3], - "val_to_add_2": [10, 20, 30], - } -) - -features = [ - "driver_hourly_stats:conv_rate", - "driver_hourly_stats:acc_rate", - "driver_hourly_stats:avg_daily_trips", - "transformed_conv_rate:conv_rate_plus_val1", - "transformed_conv_rate:conv_rate_plus_val2", -] - -store = FeatureStore(repo_path=".") - -training_df = store.get_historical_features(entity_df, features).to_df() - -print("----- Feature schema -----\n") -print(training_df.info()) - -print() -print("----- Features -----\n") -print(training_df.head()) - -print("------training_df----") - -print(training_df) diff --git a/examples/rbac/client/user_resources.yaml b/examples/rbac/client/user_resources.yaml new file mode 100644 index 0000000000..9c74f01073 --- /dev/null +++ b/examples/rbac/client/user_resources.yaml @@ -0,0 +1,65 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + name: feast-user-sa + namespace: feast-dev +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: feast-user-role + namespace: feast-dev +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: feast-user-rolebinding + namespace: feast-dev +subjects: + - kind: ServiceAccount + name: feast-user-sa + namespace: feast-dev +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: feast-user-role +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: client-user-deployment + namespace: feast-dev + labels: + app: client-user +spec: + replicas: 1 + selector: + matchLabels: + app: client-user + template: + metadata: + labels: + app: client-user + spec: + serviceAccountName: feast-user-sa + initContainers: + - name: init-client-user + image: quay.io/ahameed/feature-server:dev + imagePullPolicy: Always + command: ["python", "/app/feature_repo/test_user.py"] + volumeMounts: + - name: client-feature-repo-config + mountPath: /app/feature_repo + containers: + - name: client-user-container + image: quay.io/ahameed/feature-server:dev + imagePullPolicy: Always + command: ["sleep", "infinity"] + volumeMounts: + - name: client-feature-repo-config + mountPath: /app/feature_repo + volumes: + - name: client-feature-repo-config + configMap: + name: client-feature-repo-config + diff --git a/examples/rbac/demo.jpg b/examples/rbac/demo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f7ee50d6b567b7de55f795c8a3def4761d9af2cb GIT binary patch literal 111840 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⋘3g+L!WlAIF8Ut2lDhW^!$PfD zMbW)})=ZuX3VG5 zBz~rnqPiE?&XDng0SrEa_apU}_!1B(f5p82Ei-<^HKnu&m$0IL?)a!fv1VY{_5QJZ zUEutbv#;K?8&lBzG1Sk8$%>zCUnE;4@3Cz0r7)E&T)OPbQ$wWHTYiS6s6XZ=u+tnN zXQn=ij;}MEq2u@5mK3Mu*P$M-dH47e3TW#>{xAz$eRX6NZE_uYmE=f`GAIf04l5X?`8M@ z{`V^fBXW?f4t1mN+BnSrtC8>x&QSZx=P}H|!vMmmQd=cIC`J`z-dna;JdP>6Js6Nq z3~N>!srd-W_e`YwvBMJ7-w?Z(y4fxs6Pk%C=dn#=Z$Dj84AIF!{(I&e(3|)cUsFAI z>^bP(tlJLQnw%-3QU13*d4IjX_584gk$_;iu=2i%-+!Kg!kMr{%|8h9sPGdHqsX0Rb*WrzSYOkh zm(5HfSxD2w!RICuYg^lM@-xfaAdYblC!V>$zftjQoKg5;SF?&-&i(E1m4Q#D3#yQ? zyZxIL>xCVV$Gj&~AC}^%b_^fK|K@|vx%)dkL|9=P{%v&ci`f1ii~_wKh7bUN({)6v z*gsbYFgm69anZlq3T8cbpYyjBH2sT-U*5LpwS$NC7o07aQfIae=Ko>apn^OR(}Zoa z74c9>fWj6@O8t#9aPQ zo%$9g!~6V4fp;ZZ1lF-g;ag+(Y7T(bztGyl%#P=*W~j0n`6C%|@kL?x<=>cirY*Jk zi1oiGfmdsy4Oy9H&Hr(Nl$i8+A8sP`tK}2V2`cM7+#|4q@Up7oaV6E>#tDaXs>{yM zXG5;~m3$v<5q+&=#YdiWwNv@FXPHZNfv^pgof#9v1Jkk8jwbwG84bip!8Dw!4WT4Dv$~vaLjYpDq4T9SDeIb}Ol2l&SYyWMx?k6S zpz(VUT{L4@j!x6R>(Un@PC+AwmA?7#4FzLd1om$M&zXcsAWGqR)vR({fxb6$*~K?T zrh7IaPsSVw(T3j)rd>?E3#zA+{(F2p^JvgPpM3_2GRyxqY2a=bKEMAq(#0|GuZ{V1!NxccgKNo^_HYvb0=yfW8OUBw0*{_ zVNFxhdS3j3?B)9*U$0i2yC#<6E_==9n)EB_&&h$VSLGXTQ(i6bo}c9m?g=J+x|7Ov zXGrE!?ZJ$A%10O7XP2xG>Jv-*ocBEsrVkMPh+*H;^@YUIZa&K-LSm7sjj4*69#O-y z)xxp-4*rOn zX1`OT-@^SjYK@0n)wBXxrmEeOwi_w8qA59AQh4Uvl1-4?4W=bh1-I?p0u&8M1uMNi zEwk??-k`uNe+cj%ir{Ah8fB9PQIY~K6kG=5xMJrmE;dhG`##_!^gY*N_#IpG#a;CL+zr$C~>1dD=Ac(V1kZM zz-czds*bh}6x;F0^ZVl(Du;Dl-?gaH?$^9U3Reb)Uqi*ZbsjE0AXMdND}u97(~?^V=$E-#KWw-0OS zK}#K)smDiqU<1m~MmfAU>AU|>zb9*lw?wZRm1?PXB8uev%(rfwHOXxm+#JS^xPF)6 zcG}mYM6b{Y1fqBV8mZX?{0(pV92?f0j%o!uk3H1w|Bvx_u%wd z5Z~@sQj2MWYC^%Yw{SU1tRI{BH=feOspltiBiS)wJyMH+s<$czN}SWeQAu;Z;DE#9 z9*7V=O3mr=t8xmwsQrkVn&7C*>xp#>ls7cc_wODFQ0_{XNNDb~{c})=Ys6FozP#wj znjX^IXaSpVu@eRVD7D*h=D|%q7$Ef>jjpmY^z8{}#nnI(#ogKt6ZV4IFO`MK^jp^Q zQWi$AL7hU&BRJ{>o+5O3XpZ!rTRRMzn;(Ay#CPMQt>r}zCmUH zVH3O!Tu6NcesdgGK#<4Gz=#Lbi3z;9^vHfnDzbj7j*Q$W#|Z3hVfbsvo8nktl8y#Q zTm*K#QloEn{6k1ZZ}QKD;$epY=|aETj|ei8G!JgQg6_@ESIpPZ16KCK?d3FDdWgfT z)H-F=-Bt?m1>5}EH@C$1lOLINv|VB}gfC_|9Pf?$TMu&}0T;W}(JW=wM?(LpfyYV) z!zd_AHob8Q+rP6YL+8k*dic0C=-p8o3i4*=gSL1)ptx?5tF^*722MTE7bp#7EQL(~ zA)F?ZkIM@z10zoq!<75!BfK#bdmH|w#8n!97HId>JDaZ0ddcBW>Y3%{$ zC@$J0O(PBru-|O+N`w+vP0dkX2IRU%6gkq@8YpOv;@fHfr{xZ5+i&i;8FU$ba~pBM z!lDq&d=q%=NO~k>wV@6{?)LvihXwWrD%#GYRDaT)$!3jMM!s*ozDIMXUDW-WBfluO ze6IquX2EYxHRw&Rj{qoC;)pbk`&izF>L+n!CaEv2Fsm3!#e!9(BtyYFe}U27ghv)V z=N3Jx*Yd=hOULyy9FzSJOat>*ziv71sAu=ZQ!kp*iag{0Y2?1~Xc;Yx`&k*K~;DT ztkKE+K3`QSUIGRraC-P5Atr;@K3)Y|GTi@#DLTCQf-kX_D;&)|#qNCbL}8<}yw6ze zd=jw}n{vGV2WXm-Ti`{3Mwb3C)K^K5oFa!})D{k7+T)>6$T^Q~f1J0+K*){sLouy1 z2T)Tn=xH?G?v3tuTaWo(a5Ma|7Mz^D1zp4X z!zr$!H@rt%Ae%v1&LZ%TJF9L$HvUrm@dm7^n;$J2U5?d1$LhEs;7tr1s8)p?2a?)B z{n_Fu0oY_Yt@%i`2>wXT)8Nm7;<>$G-=@DXR7^05h|AdZVqZFrmoayQTyxK*fr{CC zom-~e(1Of9L@X9)Puy%n`D&On^|=6K4k_-F(tHH_?)vDD1@x`AKEnGvTFvrmM^Bkc zZth${&ui3)+%Zi}6g`bdqpg`Dwb<=cgs_)Lt*6!wKAyLVPM&@j9#v~JQcG>k!~~Zl z7;miaS#|3^l?*a=ns}dgapmD?x!5;UP6djJIYVa|ssSuATDew=qMEAUCTORW1*mf;G6|21l5>jEvaYDk%UWesO`kL$;jR%p#*9+-K zeswpRt>;vfQ--P^K{mJFjtHw!u4a~uS2e@1Mj4t8&c!@XQJ0wTzaMM$d(U(_N{J!5 z@pDEy@;_Rf+f@ikaUS|YzAPDo?%RtSkKDZyS7J^{6{EfD@0FlbMvfiZw;0)W?|?BM z2g`UdlO4o?VlkILZ92r4eQ<+Vbw&;+w z7A@;(iKBsGwei9q{nv&V4tu3ZFXrE?8fs3pQ-%)l?3QsSrZwu#eD38GuvNu5>@dnm z^*4%J&lcR@z`sU`ZOAOAm2hrd!bprRUG%!KqMddY#J4OOGmnhZWPdq`R}?sJo3gV$!c)j)imgbK)l5WZXV3eLWKerDl1glU zP*#TsGv=t)%8k!`OEgR0@8Bhco+t!QJWMt?0Yn}@rr$didJ?xKn8e~T$T1La zG|1T$q0G7#Gasj{OS@n$I&3Leuzhz0e zOL_UD5UH9jnJRJgiz@x-2odj_jxR8?DISpHdk)jCl(F_r`Re(PDJMM1%zTwrWVrx! zw({?f-2qKX{T0E&h?hBAh;)z8i!izfCB91S{ZT&SIA}RFFE5kO2375VDLbxX zDVGcH0vvT`rr71i1|AENg2S#L) zjNh2;eDsO)*+Gw!a_bW(Yj{>7hCX9#J954*XTE36GybrF9iQXS@g?P)^ToZt4=KEz zj~(a!gcr}!GF}6lg}I*{2!-B?I+nDC05{ct5*Vx}ItJy+rUZIHiySEz+3b40y6s-A zmG5a!mYP^}SpF8ws#C9<*Q)psI0be$PguY!ah~4jlJ&un0`=~o92J;d5(Bz zfrn`LDx^uJAKd?5CZxz)1DCw5Y~nyr1_yX;)js@L-1i6k4(<YsrRY;XCS(#UP5i^g#!-hA+~f1FT{F zWgqQnz=lvVp=M(8@&;0>rFj1w#>FNjS}gD>9>!NlqYCmK$hk7eMK8;X4W?VKY!vYWagWbMKv|(yA);YJQ#q7A`uv!*BNs0*5JuOw4|; z2wvFz=hv%xteMgq1aZalA)l_rCq%ZkA_+Jq{(q>F z`cu1jaVSx*+i<1JZiqKCtk1iHZ-bBfrUFlP1Ixmg*v5w-RJR!Pqejj)HvsHmuIEE3d7 z{kgjt;EezDb1;Rk?gLXKU(2<|z6Sk~^bxQcfT!R%XzT3Cjr|EzRRf>5085&BI7^iZ z*a7!;+oA@dBXmWNY3ev{hev~%YvXs7tap5;v>Hgo(rDp#&q0>AoPO$DOoGDDufN#x1fu61t(cx zAesH$Vb$+7(ItC0TG7|`PpJo~=&S^5pu25M`O*7Jihh^-Cx3YiS?Jl_-v5#X8P|gy zKXP4N*an8S{DErhzBlmEu(6g&^v72fLMN3{pgpQ&r@^6czHfmLSsQ%CqZdAG92>Lo z{SXbT#FU7PRRT<3Ap6eC+V-c0s5$b=tbZ1>= zX4D&)lswk3qgqDPfW%M91GnKWG;@*Z${^>KqniCpjp&1Rk8k&tkO+e)TNy9cX7n|u zgau2fQ~ybcgQ;TdPWOq$A)6NcLiZHaNr#%(`2NcAvc_$tR5T)z6&quU3WrR;+D}{A zX<4gYdTxe>mZweq$&yQ!XZV%0tuP9Z=9pO9l!tyS_A+u?#^VJMMYoB-nD31f&(2oq zCrE6O#HD?IEhEHzyV_DF*tL2d$iY|ZOKq2jo5P!e|D4!TnuW@r*VSu4- zTRuUGo+l;?7H)t)=uW4``772FUYxgq+=Qq0EispH zryAqX*zHa6Ra3cNzJP551GowO78M5c5k<#a(MEjT=PU6X1jftlOiRu6MknQuDVOF_ z7&|P+r`;G%$q@u}Zu!hl7^|{3%%lOdN+}+3m#!(1YfCs&dTLsx-JuYpypkTWjn`QZy4nm z^w?XK3C3Tu?LA=_`iZdE*34TTJPa0mozl2u1b__o0tNuIG$#S~4ZGn!L*rXXyenFU z$c_q>G-=6x+y3)=)$0L5za+?_V|c3{V%l!O%<%IW`)Gs;cAKA-jj%tKq7%V-6p=O)c!HiXQ1Wa-&qc?aH za3!>0EAiIR&Ic(aOKm@l{B1Oi3pDbeZ^3~7y1nm~nN z3)_8kqB&Rj;JIL{hO+@qsQlC zV={%+w&@MF&yZH-QC)~t31uh>1!2TwexUARbrLksuiYO!4B7Yq7SdMeEObL}lu_BP z7W#Ns81)q;=a!BSQo3wM5yXq~ zk53NjBM`Mc(+C|7CQ>h^-nRP2(>}<&(7{mLdT3$0DxR~E zfoe~HhDU)@)OY3{vr`9~u`;}yD0dqP{5w=DfSPoKpKnK+!S$(t74Fk4`qo|EG&!Ww zf>*)~q!fvgHK?_u5chSwumfLJ!B%X|PqV20WA1MJBGorx_!Nm^BR@oQl8M)gr>7M9 zK3suGFiK`<3^!rl-mEbr2&0?S*| zN~Tn_lY^I`!BkIF1}~DvdFS^=YzBUX5}JFbC^om8*3mAV5jvfo%(IhXDvYnNIuUze zD$x*KK93KR7#29)bL>U~b+(&1p)8<4jxyI;EaMc&L&NgUEinx8U+ z^bVB7X9V~Iy;^8t#zA27*n$8#+fpJ%ElX0n!ajREu@*PX zpcj7iD0FUy-yy;xrTlljvh$|Eh&=cEaMK|g4Af#&5<{%WU~g1-wCr+n`jLed;dLC- zQSzg9pioo=^~$!SLqFrJwxeFJ#8d4~+UENMr&I~fobELahLNQ%`KN}vaZhYBSLc_` zUuHT7X7t=$&XZd2r1;1>rrXy0MSQbDS<2@#m9fcpmWuqJ<#nI+duq4pyqd^6h=}9% z;6W8q7+eWVf&@As%%+Lt?NLJK0}9_%#l`*cz(-CZy0&LaspcIQ?bzG~2D z9`C-OEs^5WBhYRW%CSX9BQh(ExVHPI@)nZmjcHpj^>mf%_5477jkzIP3$VkQcNQe_jPDDA&!ucU*LSRPhln+|)yry8W6 z)h!@)lVVUIF1w(WUhlcr)DH$m^6m;d=Fi&(lX0xi`qXvlGOF{3B$;;(n@cc`&YKjK zfg-x38w|B+kd0Xif0xV3Iq12Mts<%IUkZ2~!#tV0(plp7R(L9(RW&3|nLP_jB2I%k z)WMcry`?AWr^Z0XrSCN(LjsnPVZN=S6}&-M8^lrl>|c~+UZ}7tC8&sZtDCBJwT@S3 zB!DA=blAW6)0YVF-7v}B1HKx${dV46g>yOEAH3ra!xUL*Krc`40PuC>XFs3CNUfjn z7GLFaAyZTp?fQNLc92 zaUIi9+-1EizE$%>|6_|sBtqH#!3QL)>8;U@K|s)#W71wEm7Z;9NT_3{hXx_r=nHE@ z9Sj38ZfI~_G+BeHpQ2n=_*d7<(5%MWvyGktH^H_J&W;Z&ll3!ZoA{QlVl3NPZOPxu z+nI+R9E&R2^OR`W`G%;UmF^b3MfiX?dai{eV(k{gJXE>%nfI!7t4H|a&*WjlO@pcq zkMIvcn-vp*aVE?#?Z?y?2#qIXR9N|Ca<@mdp}j2HgGs>YBdM+T1Ja!Pq5e^ezt1kO z)l5f#q|>t$vFP3hkHH|WZn&|1rFncW%nFz1WIDB!s;xRPz~DF)(Ng&SB~T zi1&a@QaBuuH&s*l8rGARCl@ezVWZtF^ek)K1;;q~J|o{c`NBkI2EW)&-xp~2uB^c# zsc^So6}O$MnZqB=ILv3*tgsQD*k7sJ>FRc(I64^^8cG#fr(+^OLUj(NoTFK36;P~t z?N8ihwS_Sz&XRo+C&c;3?x=8t&Bk^sdno;d;d!^2no2R>umDQ(U&gn}xFWnN+8Aw@ z@x~!fJfoegg-4^U6xYL7MTpz8muq*d@R6ISGJn&*{5^W8)gNbuM&su( zUxnlHMcVqqRUv#~iy{wo?LZ45Cb@5iz>75hPbDuI25^g`AMQyd8;$KS63I-H z2-lL-WP_4Q(MHGVWhME%nE=4O<~=6X^~Jke-9`|VJ%IIhhl~Zv+#ef7 z$yN;B%@;3#zDY^5K8xi8A~3uCOuLy2R-&}Vx4F9?&!t@DDfR?p0hG*Z2jOsv#f|cI zz3NVin|0HP9_KgcsrI4tC|HFIMA-Gw$^L}1s%SZ5K3EKlsS)A$Bp44emU#Jf%N)z` z7wc4Goy6;MQuqbYw1N*|SXiA>8L8^fOj->*6L%V?ZcJb2pK=&-<^RuF(;+y{ja zzN-}N&W)0`&quYkeog1f7Qf7z(*W<%uZ;cEfb{6nBqL;z9pb9a?9*GnCiKX4{exv; zWCqi~0>8>F_OUjKB*!!r3B_`6IQB)U>$}mN$ooEX{`^0p@#gsom&WZE(pYM#(KnrZ zX|{kypp*im01tm_OUIG+6~ejtWF|S{+vj_YocRy>Dh4R)9u1%~fo@K|?qH}>PNMxs zjTs&@%*}nP*&?Y6TEZ@qjhdjjr<{x9AL-7MMSV~21az4<(^#-(BytrBma+?$h&?CH z7+J$c1zhuK>jun^zvFhUy@@r|jCV}QucWw3ll-Pe?5VxY*9iejk|3_CR5=9`u=P5M z?sav;;y-&_W(up-+&e@2$7^ZXmhE?j_a3vxeGxj0iN+R-YP%GXf_&!iLmtZ-qHLsE=?FFW~`vK4gFqza!uQt5Vz`ayzemCJhs|% z60UpW{S{BfnQT=bO{*D)HmJOAQ47{jE!J_w)S@)E<7Ku{h2|ed3t)=c{1Mj2J2`Vb zl%$`Q#RKGLXZ=H9KSuqtA6t>@ca5-^rHes-CPo8SxmkSX>9OUwVRywl$A4tHC2HNY zgbY~b^~#>zY6^KM<+$`-XbN97A`KN5shm_nTPohUOj=uxZu=7A2n({`Bu91GpIs83 z1(e=QZ}ePCAD!fa(L#I>dlF8{C_RcuR}(3LM_T^@)+x9*7P%AgAo1k}x0Gi;5wE(C z+U4d{c)|yN?7&p{$M}<@MSh00R)ju}49l3lGmF6*8K_^!-xm(6RIk#`#lh-iteBHU z-r7yd*#Fqq<*m8Tpt9cn(D#lS?W@eU0wwPQYMV1TYrZ=HNT{yX$#&Oi5B-V;e;)ni zl_K?MhZS>Q>ZBgxQ$7h5s&>$+GU6eHs=NI|RlfQ2t%XhueeJWMYIj&|*lwVH1?gF$P3win`ewyVW#`Ozx*3G{ zCZ=45sh#K+l;ISnpCPwBmtv);(9gWEvTt_Pk}ofF`l}#0dq>JQ>0a2q(0_)Ki*`A$ zDthSkMfc{N@Or$H+6C}d*`&?G%2`plwi|6qUtp6RU-j?iuQ&s?R8;}r4O>h^kh9S0}fR53-Qtg*N5|SRFoq7|r?le%tXuclgYC zN}7^m!2{}W<07dB&h7|q4I#euE(qd0LJaK91vVJS@>|G_bf1AMVPs>3tiM7oP#ur9 z0ylyo5(Tk>mU&D5R4>ChYB^!&CDXcx_co`&FTW8DE7bU^(ylO$q+W%TaJ}aA#N(hW zFu`WvU~qE`X8qR@>ofEeCpu2lpXm>ld?)-B*jMa_S-ckEvPDsWD zN8`Ou?I7nd_zi|K{8&#$v|%cF#YJaxb4*$>NpqeuTb6t5I!JWvJL$v+`Wx zj-N@*CxOG|(@iIt*!c~>ymG_(2Sk&aW$C26{#Y|w#&na3x^T+K_c&xb%cRCQo`k!oS~aIl(R%et9cLw@j}yge z#QCN>q5lVE?->tgyY_7-5hU7hsfjW{q9jTXeGt)-=tPSiy^fN|U=TzQy+rTA5WV-_ zOAth7FnS%M_ve)4TI*WxyPo@ZKVN(toK8pC_wB#!h?sSK*Ud$h;7s3P_izJQ>Xv&* zLtomj>|z6;D2W!^CqdyL+r#h*GxT-Gy*!$Rm)a(`ze94T^P`-+&kZap=p{ax*VxNJ z_6EF9%0YAt0_(ZS>t}+>QM!{(+CUn&gGVRX_WmiCZCY9q*zK$+;nCTPbX2n#9kDn~ zt+-c(%1&a6xHnFh&-**;%`!=2$Tx&}Wud$d(w=+3@W$J&UGc9byJ8yTZOP_@Su`(J zEoeIMq_Rdz(lwaOw_kt@0Ta84bx>_ccVVyUZ4PdS~{Me#V2d=twxmprSgk+^! zHZ{8G@P;PBJ9H(D9p4Szky{b5JPU-WKpY=%ojJ zSlbPkqIDJ{`gG=vI;kCUKOnOo`oHi$JA>a~E^Kn{FbWa5+b6Kg?1H)tZ5D@8CnD8H zVJSQ9D*@aM^rGgGxL~*v-Hl4EnaDMAcg#?7&*ArS0@B4Jzul)aik#IeA>Tr%-C>VA zH;j??qA)#w`)lsWqURE_va*#6oE|@XuRUJ!I4F_d|J2pPiTZAJbNfE@iCC&f+%4(2 zB+Bm2pHt6yMmv4kfjzu_1$pLR#U=HS;6*Xp*XWzZO0E5E={nrQyW(q}`5`%)lVJDs zy5q1qjhsLyEQPx^a=PAMQ=!#p^&A;@Z7R3yFYR97?fAF6x5QYY6h8u6Oa+9E<6pN$ zy|Ogg#aANJw-B{je$t*ch6Ud3JCV8rf>SuLG0Z}&$f`)X(98MW$t)e9J*X;zjMWQ) zZ|MWw!R+GpNQi^W2H{nE(CqK_Al*OOgWZk)V|!3$S*G6ni_j|Xorz~1*05S@inUoX zjhUnl8H`*9CND(W-4vu_`QV*leu}ccPnfeh0mx(E|fg!0Ja%H&?jPwA*L@Y1Ob51fwX>En{Cb5zV&7w?G)kplvWkPCu zDm65OVl1NImDErT^23XNwEHmX0*YMF-)+J^wPD5}f!VMF0pkVNgj%v^xDOWjCE^hi zQ?s}}g6eH<@Dpw0CCmR@4>n{RJ& z+(ZRo*BLP2QX&Oa5%OxXtxcr6Io(0z7NY0$f!mFO%apVOl<5!9* zK6&nZBz|=*_d_bAW@Jb;XuT1$eoU@KRLnjP8NXRs#{KqOTXNl)H~x=M)ar{Vmget&EeI-e z2m#f3vnXeJ(R$GCcc_~T$6XsTy2?xUIxWL@g;;N`dt6FCQ8rM8s_WYU1^M6^HczqP z>)5h3o=I%rsA;{V!Hz*o&4)pX>GL?C1VybW@#JNcrn=8 zV4v`4ZQ3%V%VPg!NZCBseK+&wgC1UrEhhYex-uPm%Mza8+{i ztM4p`u8>y30nz2kI?Sy)1sGyV`!h_xHGE>L!Z}?X%KVrJI!l0zi>W8awEG}!i_3-Z zIkvVcQ3}_ge;Fj8zF#|s2{{BaZ(Me>)ml2vw@P9Q<-bx{$f_Zy;uWk|gSC)$u`I$O;?vo#BI5Pp z&n6r~dfI1gZp`R3VVEkP&Q#qhFV|^o$F`!_kUct({=#k0_|%Pb1#llK?^h;ca16*f zGt(uA_BlRZHOx1~*|>Zj646aD@R!Z}s9+tdFD#l`?kWDXN@G-|m@KL_BP~!#1D&3R zc_#zM2>ImC?XVVX_1fc)J0p6ctYWm#5Rnse=a!GV)V5KLMEpP94~9xgO^B%>XGJh% zlA`WP(U#^XT*aUe8s3*2E>I>)ZbUb=-yt?!!q;UVo?Ak6LbItpxxACf8CBI4STSFt zhJ{N+fD6Vr2ep0Y>4&H}w%p`@q-Cc}*`ts)JHI32fOVH&RtbGmXvt*?(u;g7&iKNc z+=Ttkx`@jj9`b0Z!e{84f&10JFe+p{3zBX%Th1VuC*>F0&z3yPFxkQ*zQ%n2NtKuurO{%f$ z26=ql^fel$eLt01e84vqO)o>e4U9@FlnaB^8hR~eI}~YXwY@R&XcZiMTa_J9i~Pd> zLTMq%R%;^x2h}}6RCla!cTd&FO+-Zw@T%QF2b^Qh9qR1Ofbw{WxS^G@!Zc z8Tu|4rrwSa)K%?tG4p(Ehv~>1`1q&MA9u!h98SMq*vt{xlirqde%jW@%Z|UIt(RFd zlk#rAMq7BZG+^fAM~WHsHg02<7*00ap^#d-%{{?Lz@n6Z4K~>S5Tt;N4nFA0y9+-xozmWGdN#^(&0A zoMnr6QVSq7M?_$Ltgzh05zYReP{7fkWp4d~QRM_@OL8q4|Mb-78Xr4@Z06Uy6WrJ^ z#1+3W!0$c(1p_2p79kL!W;X3{R?agq>fq{I{{D2Gb63MEL`MKRnP7`Kfo%!g4Z+IQ zhe#I&5x9u1+X(t)l=^fDwyVUQwG;1~6bYcA4>Fphd|ljS>?d6HDHJUqT&9WrYVM9L zX!!8moV!DjCEmJVkL zW=C@^NP=oHaqopaggw~eTH+Eukts_Il_9<$sP&U-JXacM*94bI_?F?d=45$Ar`Ji&>ti2lB-6BG z^XGUB7rbOF|CzjxjSD;%t1sK;fg_7>^aue5&YZ8yH1GEvx4$4^f%xL=?Ch9xzo6L{_#94i3_U07ps0$kBg4D{ z_CHokwVve!N|}IbI_DbtzA%UKz!&^7><_}-pC!*Tj9cbZiIP*_`KE5ZjmjGGQXWRO zM~sm_sbR|q0wGkgtRk)P>kXF6on5M5seIjgM8?6V4{JK+#T(O)V_)IPz3lfof7@-W zv$3XG#6@HC8$DeObIE#W&$jQoBYjs9!gC1BDSz1>9mKCgKm&o<3C_%-wmll;py3sz zrJXQs*^bGzoC1>eE^c_BGU!chhQrd!mBm?lMYJFFh-mV`KsxR0w)~$&706v zII&?~x1vO!5k)mF(Ch*y_MWz}+b1|w3qWo_kRqF;B1}=gEIbPeKOMhbu)_V^U)d`$ zPUqywbh&otJ`6!ITyEhRyJ}y6_S+_-Pm)f#Vc`iY`Ro8I5Ws-@Us9Yj6zoJ4b=oWa;uh-7U5n-=hj+je<6<> zRU#|>KUCOVATLkZy~{ik0`4{P>m1QWzp@w8vgM`J)@#pV-Rl^+r<;EN=HVk75#>y} z;{jZSdPE)3@p8g$k4mx=-7^rP8|~}JRXc6$VB82d-pJO`YI`mROEcIB3bFV0GC8$F zQDCF+p;>8T3D>FHuP->$yM+ZiYZ8>c8Gd2E4TiCq`U>>+8(*Ew`PB7$S~@ax?zc$^ z0M!K>Oy%bv!fnp?Hwn9Ea^!=4oz8nTab8Fu--fB?(H+|u?q#Uo#doiT4*tBS-HP!9 zmtZxdS1uYJG%CmW%bLDLbiUItdpm`}Jj77~3s&B+EB%xF%ssHx); zB48~~R}$jV?tSOogtyQ7Czs7}S5dbj-rG&vEL-O{WGpCLCa+L(b}05~8Ru{CDIq6I z=5A3VqnxO-Ox{bie*(zAUwz1&!Hvpn#?4|LAPSp zzGCg98^_hwU8Cbznp@R|%U)M3nztcZxi3n0@1x)TNOk80WYJrPtpbB+t16%N3l_%l0nQ}XCy zNTK!3dQQ*sBEH-k?2jhzgq9==s@$zk++%n&^Z0089~kb==J}~?RZCIl)4vvCahzDm0 zIf~ zjVqYSm~L2t8p~{p3aUv2=!q;!1=}5<78XAi3-aqhRbmBpRdOEodOhgZlmnnI7=ONqV zr}MGBpRf6RcyYYQMkog;M})h9QG#5)<_gVk%0qexeT$4h!|_b22!)}L?=9fP-f@Q4 zGonIomD%#risK?oZs@|Sz|CyxtQQ-&El%NMi#qslm1VSojlw|GvolGhqdP8o3LYQJTm}(~&g?S+ z7f<_WT?0PvobIpZEMHIVOH#w!D`7~N+~uCmcDVSAIYNc3#=jJB%43oR&*vFL3g~k) z(XTNXy-L_Q8`vufI&%?dj~Tam)Lh6CZXk%$g|!EtU?W;Fa=DyEl-iYYG9+)_n5MCX zl&AYzLrcLI#Gp;9%~)Z|LrenQBqi~&7;0dq64?(QO@|AjnHTw+fAXZoi%Oq ztV4_#Xtc6Sxj)pqbnCxFXuh%x_wW`)cQ}XgB^(X} z@hSBB?)FWtF6!yAA6FD6<{sEzMlTANro5XJ$^U|O zhEgB5OWwcFWndJGKq1_|G7EoBqEyE%$UARb=B{Q=py%zA>*IOG2`LvaJhHa6@rSZ+ zH;C(9YT+SIqgt9y<|;|h*}0CQ`cd~h>yCYVaPm@j>IjaS4zba0ao$8il2JFpK)aTt zD##Jj4t_PKDf{KZFST98KcpoR8eWOY)sqk-hX*Rx3OZ9;bsrL^Dvi(?zl@B?WVZ+t zqlZFM`jrtB&aw*u80oH6volH2UN(M=WU$G{0X^@12P)CG8(`gF*}*v*mO$TMHo;>eqq3rBJGoivW)lZvX zEuws|7Q+4b7f1QG@Zo`BA;Rl0(#fDjQ`&aw85(bBd!x^pXYtMXa&C2BLTV->W2K-3 zmydfPi{aMprwMQZ_>f)72Iz__mF#=a&eLI|<$LH~GdUHVLZc zibq~Mwdf|YWfIc8Y&?69ruQ{>o!=B=C^6XSCXsmQRepWRcg{69 z6q;{MrXVmUJm-oO){@KMieQJ8>7-|^?`Pw}ve=?w2jdOlA!*yn6WY<^ihqrbgTnp9 zF914rWvX=BJ$>Kwb`+hC?t$PGn|SXSLii&|zGA@KH8Yhn5OWWiLm)ZX(+esLx{De7 zQ&i;0Kyc<|jp3HaZf^2wJ+Y%tMDsVQ`xndr=VT{r~hJ#BI3kmc~qzlw$&{Z1l zmrKO8_MU=&jWhJbmWclFy@R%iq|}2cRL#aurM(I8B4DsRcz8`i?Q=K9$*>K9EGPEh z>)?0rC$(3FShaR1&%uwkx4X2{&ff*jof##&Ip^|IPWHUFsK3~Ut{v*3bxCW_kFp{6 zQP3!ZB*PlRT-(~6b}2Ykq9!f9NZ(kD2C*yB?NAL%urhgg)xKR;Mf$htNgLEY;0+`Un0!z=3TP$~ zJ=V50n@-%KdU(5wsWgH3E5YE)sQNp6Z(47Cw;C(V+i&Ndp>hSvL|EHRGSN2ePFg{^nN z#!Bj%qygmGz1Egic+_hEA_x@Sf}d_bD)SDk{U)&MDY`!X@3?56{GYgJ=qd01Q&QYL z2hN_k;f%m1jtB6Qty^Egjl+Grzwm?JGOd;0Ihz+>@;hkX*K+jOwUI}E;VQDm!sD)?8K1>kLbXrlQhL~n6N&BRhcm~C9UFhLEKzpdf6e~((a3A&0vpu4ueaPg zp%sFTVw#pk|8`FB>6gdyws)r(_9C+*BoPs{KQQ8zQnpOioRlFX)Ra;kK{YSnW8$}n zFSe@JgA0-FM$H=a7`5-K1s>qz47JhF!{lJ*aGH`4v3awyW1|Pj0eBsmDE@qg9T;XTt!P14T6|xaK3&-BG)W zSX9?SdvXSdpd(ac&c|~#q&fr8e-zKEG3eBETzX-*cg)To60!Yk<17C-dKkzSOtbK(eC?NVFM#*b zQf4=}&L8esIKks_q3(sV=>w-5CCM|5E%8F6#`@Lgd|I4z_5qq82>QbT_Q=-`O)25J z-M$Pa1mn{s^`~%@5gLa&%I!1nK~ZwW8+MK#&P%Jzd-Ir7Us?|6quw76hF-s3*ryzu z#PM6ap;U^0kK-%t;m?BX80tYWQPeBL?1*AIzI-3;d@LMaAh=T^SPmA&G z2tkLrgDyT7wHMpXOv*y(~4;ZBN9xgZSF!=z!uFcor znZ!qqEGj-T^xdX6=tW5kvAjpRX;i*W`sA^adb*F(MAo6tpn;8&al2-l?#qza0dwzZhuc1EQQyHIE_v)Nvsa^0BfhV~%^QKo+c(GK6WwI$S?H1i-vuK_|#k!=(^2gx%%?{-9>xEq*5Zq7&dA zMeKO9Ecxz~7qbj^2XFUVc80txT)&D7JJK4B0yWtJ^k3&%_e+YBnL@?RhgGXL?$`eu z$Qd<1-y#ytl1G9>&D~rU!ip4k46Z{u-WVma%;$>9J9pXwgA zdCb7P-5BNeN$5w^S?Mi6e$GbmHsypy?Q|*o9TMP%v&C_SBCtM{N9C;$6vc9=s=HnI z%P`*h?IOS{xsKcFW~IeBHp1YNFq4P<*oj^7>8=XlXL9PUal_!o<8cKC6uS+jB_;eoPAkEpv7 zW>UrYpc=d>3JY`r=J0wv~dP znyVPfYkp4d#ya9zZDuI$)AXLq#UhfUp#6kly9r_3>gqonJ6yM_O8m^Kc}(GCwhiZe z$L&4&Lf}TE59NjUQU#(p&q3}kFg_PUTSdCRxhk``IbX9~PkJW+bcZM0baGcDz{X*v zt=d2?Odk|-VW|Ctr!yD1d^qcEOE4Go0I>~RLfU;4=l{mLe&Ti9DEr-d z&+?YIK?(FiMM;szfsNjIkcw2zSD_ zT$AWFs325{v#V$FRZ}dYGC)w4hVaW#rmZV+RgpYgHRw*eV=LfAHS=gNQoNgPqe2iMQM{yoG6so@3L%!;V-+y4}I5n zn_9AZa&3Lq(eQkp%ge@iU{?#;Lw~~K9vqAsn6FUO#y@fT*Z?84UE^FbaEh$xKunz$ z!v;bb#tD$gKH#*Trj%(NgiN2_SmWV75AS?cb4xMZ4kfsh{^y|>mrU(PAcvv?1YE8@;2`^0&tdXMI%uG5Y=?eryg2g5 z>i|X~Onloi5jWHjyE@)k(z@xekYpyd6{AnfVtDd4u+f zHtg1Y{%17P1s?icZZ2G6u^js+-42g0q@^~`C~sIV_r_A2cAmYAm%2>?u1bCEq(*~$ z)u{3;xoc3X%8OslZkJj%oL3cY`+bZvkZ_GpBI<#4roqf6E5Dp*gZ_>f9e zCrW57oBxgntoyKJ$?fFeixI^VryS8vmPDYc2D^<88(~HJT25E7B$z@qZl`MVL5IVp zs$hO=vI^~GQ!7}CwY505Q)JOwy8g`2r@HLiUu{@?FDrS?!kerf63owK*9$<49)=r% z!K0j!H{TBOvnWD#YO42ErmA)qP@5h@@fONvb48fS2>YMfQDh0M9WEjq#tWK%SuSEU zla)1Zsi%*{j0*R(a!Jr}H=Q*#3qJhq*RhwV9Us)Sjd}dORU%smbP$E&?TfXS5S|#L z;#Hg)!PMXDsj+2&rtF7RWEU+=I5)JnFtO+rFbcejHt_>uqp^UqM_+n!8*5fwz}=xV zdeIIOg(F#S4^eATr5{~`}k|63k}zqDLH?G%Q8WX9h8 zvdFuLjTFx!q(7Ru+N|fjye0HuO2kHE3zizBa9q3(Ub==Il_g6ZKZ9n(p)}a&2%P>n z8-ZJU`?{Y+SI3+uQPmtZ(Z%YG5+41^7(e{ZJw>D*67D!*MAN9?;u%+@oc!v2dA^lR zc@#4Utu8h^X&vVoi0k*}9d|;hII2ykx1C#iclkCoB+Ac7-bM#r@l15H=|O=K>#D*D z)3wosV3*--7P3p1XIt}{s#-)3i0V>gE8uL3GxO5@Pqc`Z_eb>?mCW&D@!UQzDfkt( z;`_y0J?NkGvkW3AXBlAKyEls8I>WJ}e*&DMuS@P6w1-hk4k9okp%k53cr>RgH|meY zU00MU{v4?bys^QZy7x{UN)}bC494VEf0RVS8w_&UJa#JsGe%!hRyh+t0}5G*)d`8; z4F?|#Qts_!=N>91gks*tvM)TnbI+P<=7THX0lGQJe-H0$PW$EuHrgipT`N5!4<)m_T1+2JR5Q8c?H!{x+ONGR9!xim3byr-a7 z{KreT@uH+%f%zE=gbf<_{;SF!6j7#*QH|+hE?ChOH23&v=0w|y^oS!yZFlO(X&kL= z!pH^6bb25zX&o-ayUexs^mnx;iDnTFD|hri%-d@Z<9Ri6_~cb@4AJ}2+@*6~5C@>h z86`G_JrhU+`+WCoi(v0USH!#VHh|_IKF5hG)zkEIzDHqdezB<;QZ=-jeqiPx@fS$( z6>9=#*7_>V#VSH`-pW1xIG|eKvN_&+N~{Z4K7p9apVUPpM1nt~YxhcN1i>|dC{m&n zFcNj44aX7oxF1o)0tHypbROkXuUdDg91=XzJme^=BA6r(mU0j@5q5h1{9`krMt?;= zE4wg(^t7EF*D?@=m_}e6;62{^+NGg8*OX&Il%*p$!xrJ8n^^h#wAL8dhW410>x6Rt zG;>i`NOh_BN0$CoE&b0?f~wCib8#h=IZrb6$g^TKzj#vYb7uv50pMJ9oKsl!$xTFh zX~heG?A9x5=6Y`PTdh%CgzxGUp2+|?54w@)WVaU0Px+QOWjCM?OLrFi!ef@zHb0L? zvZC~n^-GbH^a6sQ^ME21G2SP;c13D>18XvNPq8^TQJT}==Eub~soukg(}Lq71ykz! zzc_~>-YQ4)!Ln<6?`=F}TKFC8%1ooHX_ILEnlP%6HWe(+6urZ|X$64q!>?g{Ay>88 z!3ty5R{xH*PKjg{pf2k?{??i(q~q>z)4X$)T`|0!$M0yV!0m2*teKm+vw@Y5QxZLI0=vcD* zv7D0*PPnmqZdt4&NRXMTGaF5>Y~0s&RYe8{?_w$h?!Atzr=(Ea1iGg^FAN=drd|GC zfiGw`=Z8Pp6y5+@*%wy%*|I&~^Q&0KrSn*EmYMF3{;<1II9{H7|g*A zpWsp+_|pKW4qk=`mG)4S8_|vuMc2K()50pxvpkMALjQ^LVv3Yu$_Jpl!&;p2l2m5-4^&6%`_GOUjk-RT)hY5jVxa z26BEfBH>*=pq)D&dv-2?e6_KLE(2z4GM?=1{GmFz@I))mj=6;ido=&(Z7kL#Vol*ZYkt2nspLl znsDWW$WryIOr=|M)jLfO>#nG2(^*i?Q*V=4Zul-d*eJk{i>Cm%QdCrCm4Z&i;5VX%tqayM~3x!bbt;?M${n%ch~5kU5bLG9Q%pbkrPS%mxI(9wp5BWMYkp6uocgPwbJ2o zbwpp9Z#~YwUC+04?TzjFt5o~wEr$j~QZjYp?%yS$U0^fI_u<9~h`|xrq)v$f2F3A+ zBx$U{)RJwEqe6Bz6aLzNK*+-Q!Z$8Z&?kkpg6pN|e5r5x1;ormo9YSJPgNU&#LUi= zn5TxUp*|=ItYtIJ)))!ajUSDR7Yvof0rs&iYTzY*h3E*xFgFj$|(@n)nGzdBcJUq`R`q0O(4|4vK% z1!wrPhHt05{9nRLavn=M73HjZljy{5ZZFHx8lC@A@!Oy>uGVWeA`NE}qvOm*lKct{ zIqkqKAbYH+;f_3_Or!n1j@Ju8C#pnLlj%_*CqG8kslmre$Ti~QAPYim>sngPuXVv~ z{0-T`qfih+#5%8ULo8d0q!Vxz1)Tr|za>JmW%aKQWNAdHzTA-!F;$=Z-23swM;jY0 z<<2v3`f`(=5h#hmQ~F)_{&@4QV28>-utWK!>?QeyjcwucS?515beuDQNW8x}2r{q) zbcXgzSZ+%bf7c1Wc7NuVGdA_dlFn3LU4+<(rC1xl>VnZW4@;>z`Mzt_p1|c&^+0bo z_v%?J2t<0mcXSdznuY9OXLfrvr`HXT9K6}+a zQQv*@wG{45tzK}s-=zoAq3@0G-%Dc3LE&4$HyUkL`_>zAyntqMDBuPn#N>|Uqb?l5 zw4?KH=`c&^+uADZi4)=uE{b60fgro?XdFp*wcrLl=CbQ`X-5>Z^~xd3@8Vj22A1Ej zFOh`aB{P~DqR|;+c7S(NK8idru$I@xNJ7ZO8o$kE2MLDR%qgyt$G1)2py3Eq{cX^k z_jZtGHOd)j&}|XF;M;g>px*qQX<~8=CEj=@Ia4fWC2!o~hKLbs+(H8Zwys|bWmLxh zW}(cXaj#RbY~jF;G`yp9`U#K9-}@Ijz(km%&+5#Mv`i5yz=f|m6P z7ZK4b*jjJWO=F!QGrFjf#TRwKO$9sYXAo0)Arul=Bc!gX(rar)16MJh8^PdS!r0g#FU(f4njYsqFS1~-cX(l)4njSxwGmTlk!C!Y4rMK9buGg!M)y3rSJw#pvEx9Q@ zFwvH)Dhw-mJ>1QR#5|o&@z2xx0G;{3W%k_axYRRhlwY)R&#H19t3va`fRw*71^cGk zXbZcgOvTu?+m#)vfMmg4QACXY!+-psy7(q!!wTMhf)i1>j>L4*Wzi{s!U`A(o2SY>zZPfp*?S1Y;x?=P^-CqzpP9!aeh{ zC0NCM{PPf~;G>=)9c<`az*h>g9QD%lgl`Dyxk!F|8=B`<+Hl(Y!3gUCFM#Iq75MSu zxG!Vx!!bXD_;?eGp466v|FYu!-Qx)C3h9tqdw=sKpVWR`GOYHA{y=K2sO`JQv^fZ| zk$*Nh_S4zV@02E3?SH0yzWcQnI5Uoo%omEJg9}h7FU9z80-LEInzj=~OGD%9A~tuK zm;u)Hk#M~9HH$6=1_tlq<~YsVu{Wlw+Nxtp4UaWuk0amTbkWbIHD37jK56y;Yd6j_ z03Wvfa$^2}n;cg=+W)o5K@N=}^PUjW$y67gzlM22lp>H~_<^^lBAZxD@0hW7{^zn0 z-o8r;>QzX#z49QH%U)F>%rY6!!ntJVH(UTdjgi5d6l|Krdhi{eg9t+&)%4$Y?TqVT z9x^rm>s65Y_bMn@Os*PcSjtc)K#!>at5cAR6*XpebhNJS=WYrM#g-#LP`#*h_W9z< z&6zsaF#~VHp5YnyQ}**H)h^ACx0cze|E>DfH`&@1D&ymG8YjY0)w3Fdq2wh-^L3@B z?q(_`(=o}%eXR`Q*L02t|Ulg*Nn*bCLhSJ#Z!`p zOwe+|i;?bSx@Yv-!b+SQ9p0nvdE4tmlg&m)MglkA8Bnwoi3SUG ztP7^dfi+vZw4>-T>`MeG_&$h(s}sJ)Sn;0bzpTX#>2;wKg@o#j4<>IUs8W^v>)Bs2 z2$Gf1M@fv$P&4VC9IShcq~(HyE8lO68XjyY_F$2|QKGQ-Aia^eVBulFGqphgT;+;Z z*=Ksqb2{RQKEy;>D-BePdsDih8Z8}av<9zq#^maNp7gO7513bVm6M%5%KaE>y-gA>K)>N2@V1WN2_7s-aWeSn zRf*vu& z%2sSD&;~k7A5ZRZx`<1n2KC8rJ%V9IO1&!*AQ-7!A$zOi45i##eGAg7%MidlXGW!C%=HUFYk%_q@R0G{7!bzr$+Fg!0pyC3GU{+*3 zRMT|0Fb5%ONm_O0-Hxh!%Krx2;~;?E`E}>6*hv3STh>oFW8ZGKgHClo0%Ti4A2l_2 zqSH?PR}+llmTQEzgc9d7W5sxdIbX4}ib9~j;mck=_N=eRtVe2Vba-a{D{QZyW|nk^ z4dgwW`t=IG>V(~`^a~PT8)51VSzZaFkegJoWHV)@JEhnJ(XQjJsSu4X#Y0J?I|UcM z`jZAAg=cV%QwrE{4EMBpG;Bx)#jJyt_hUeg1vslRwB79vk5`=4&;a3bf1_-41_)ig z#{+z~3Rmrqp9G@HLU?uZzuVZsB7a=Rh30|tS&Kqy;UvjG_+MyqmgeTS<+m!L)bSUO z^;xcp0rwRwm>tF#sL_-0~*hG34lz^SC zT)kI}wFEcApL_sgk%QWwXsPo!d7`M2!|-`WM7Q+A!*G4_IR1o0ZFXWG0k=l`1!Yc5 z3@?v@#hCZ<@$ZyF8qA}eOHVD~V6W_tA^__AD8VdWpk7}$(Z-|59 zZl?Y#LpN|mQ?3<5Q58H?a6NfV^;=?EktJ)jewN#lznpZ6oNK}b-_p>r*P?>JyzS=w znSCl|TplI7pAodQTgx{4xSZt5r1O57*YF4(HaF`HvOt+nRmQhe+F!o906J6Pa-@65 zK!ZmEdaGu;6MLnm1qgelaX)z&FehM6g@yR;(b_1qccJ5@o0DmY`o(OO+y8}~V z6>cvlU)G=pWjQTrx|H@}sB!N*JB5B?9Ok?@dZ3>P%ky0YyX_TWC|W1x0Q2!k!W^|A z9~KGezPN26nAZ|n2#~No;PVx-40#;E&u#p-CagcGwba$&ymR`xYqv5G)Kbyl<|W;{ z1i12vfT6&i2ARluomYEb@zq(A^asg4kxS9V&?b z;5}t_-N`MmIo&<>1@X;rX98%1`O$0Ao9-;bLEK zE^h~w6Zdmvyp~)mNpy4Xm&Es%PpMapz*iG_cGzVEo;ZcZQZqq zOweE`sV|_PQ0M{S>gTB1CtN>6kfv2E<<++gRL@;xL7HNOBBr4<@eXirfPXMiPK#TJOPf+ji6$ zslt)ocNzx(*1ARdmMB%x>gmZ3`}-Hqcc*^z;f6ihGx^F|I+mimRf#%4_j~AZ#vDJX zU!`%~h|W;tClV8-b;ENTO1(@Exd@-io#EbF`N7khD9o7v$GqTmc_t8dfDangay2+Q zqa^y`_$}wF?o1e!x)>pXdXV+)T_8_Ujy1v21`LMqwi|rG?29~G@@VPdY+!LHZ79>O z^}~IApcxZDV^eZ|AiNTk1=OQ&4S{3zjEqpNd#P4VE7V0C@CYP@G_7QS11cVb7MJlu zvH+$Euw1E**3{dw4#1L-3_`8io~$YdM*X^-gud%4D{pP}PEbYKl!(d($O4 z^dEj@JixE~CqP|gggDNShj7F-1P`tVA7QR47ozeAJll6XuCpqSvhf|UgIwYoZtb3# zYv+LK%fiG5X}u|i){=H51XH5DrQI4Ovb|hSUkk5VII2EXq|8&7kOA#?;zt{NW<=Mn1 zc4OfOux~Pn2lw`rCnDZ|geF-!dW-x@XjJ}3LL;B@e8&sj*{=GcYuO(A5?>8Z%E%b=bMpLxTSB0%;mDmA1VC1?U-i0!kd}AaK1|C8qn)v*3^;jF=-n5g zs}=5%0zXps$Z>6Yh_D^TbtqR>OK?KV(3Ggp+%iR?92x zUt_gXFL4fbss_^)Z<0Ah$9u=fJf0Da*x_?r>Q(7~l69N9C2`W(^de%0kW$Z&`hK1R(-RL-78hQf zS>E>gnZGjHLHBkMbcZG&k_d-?%cg$pOzM95^8GvjdtD2s6pv^=UAXoex6&uo=Dkr;gt69u5v8yVML^~a0*~vb`lRJ zK`4$hO7ULc7`Wc>0trqKc!)23?`Z~Trfg7b(Pk~XgDJr?&X9}TtuSd(YY>=!qyuxE zu&Rlf&V$W>6*6!|IC-jrM~DX2hx&Fu^miQRM;>O>CXoKhMJ^0$_Q_2!T zytWW>Jw*$8HOj+xg>#F4&*+`s*}o$QuiY5- zioVU39@euZm4=@Mh(g$THCP=Of1xT?|3X!q{x_&fpX%RZJWhG>_UGM!%_M1Pm+v>> za&>vT(mDfrCv3ATt@C9_-Ql(2oUDU-=KG-^6;`C4uhe~e3w+7?kaCaZU}h$#8C$Au z&FyE-_UYQ;_~J{FT(XRpoZ>DTPj7vsd(M*T^R#|n+v+m8F3Igca9Ploc-A#`0g}`E z+G-?Hq~x$SY24;u!7-Q=s@J5o+`gUzs*|18_Sa2Zt^t%XTo=9-vv8%U@xNC`vCpX|O#Q>8= zCT_H`F7^put_Ilwg_Clh&u-R--Nk%GJVQ)59P9unwloHfRA!W!2zzY=NAyN%+sYUFK=ka}7MZ*q9eXP{-@rys!$>-WbyW9#(B_0-+mJLE$s|8f#8$h~ zY!X+u=?eVD+ObpWZT+mk+?+h9qrUY{TX%#aM6FNkQfKnmF;?qm%1b=17>wzb=;_9C z05AWPottmLk!Ol_D&^MO)7cD~w*&Og;IYnh?L5 zopx%7yPmsW8Yrrg(5!maJ${eMV%?{GHT zK5qPORTVd?YP3dLT3WM8?a@+Itx;`JwQJXi86!rO+Qi)Bxwtk&Ap*fc~;jxx?}JmBMtO zIO#nvt}3tNm|FH6nVx`gQ|nq*Ln(JhjV|hq<}zg*w$pM+r~e>R6qC{ikq0Ls$Fj2OsRtSS)_IJL^E4`_TK`NU_Jk&zR+7^DA0y-+pLOU_ zo+aY1drUc7r~frw zK#VGm40$%jGcpdN6mr~t^TyJiKfCvQ1s3fDtL>192cj(O>n)PGWqI<`IJCm~yW#-ApSkTgt-C>%jVNW`-0&(;`DIQW*fe zX55!TeL*ws@Au&M99GE5xPp_qEd-12#|~u-(`F&f^5j)G+czZG&0{Kd%dK`(CiA^8 z;;hCcK9Ms(@&(2WDCO~ILtne71z(+fsAyn-kVOC_kE4LEz-gl9uSge17qzYwF;tqU z0XH$6fFN!?otx?ucS#R)75M~i>P0*1q*eA!_xEe`H~MsN!b_6 zNL|g^{#d|SsEBS}$J9Y4(7%5y*m#upRFM!1N!+SL!0oFRgV9IEVBDV-kD@FkH&uEQ zF`*11u^Qq#cj9gbWVg4O+*jK1a0F6ujnAXm;<@S-&UXAqk#rn3K=QFSyB@mI3Nr#t zKU~SB6!4)a^wjbb9Im1UnFT(YMZ-_$ zFUwHK_|?DtXT{vwgggrB^S=Sw7em08eLu{W2WRay17i&jMjx|Z-KKjZGG{oFrnxM(X8D; zpx^A`pd{v_-&>3w3v?PJtCen->axFekex8gG3)yRd>T{_wL9~>KQrsT@?Z-S3PDj_ zPqe+|jR!Lbnd7)@ue7M9nO-d|;HCI7d&o2IUQ@sVIo{+0XvQ|V z=J=K~FE6|W#3lhFc0L+v}k)un<&zv^*$>MqQ;2KKw$jv2Ot9Z;i_#lJsPj0+7>cb z@FTPB%K^w``ujQcoJEVWlUQzJ!cxcpIV#GZmQW*!tXNSo@+T|{lmbyfbbaaI z({qPO($oG?#9$Q>6gD3(mX$k9znTeyw z{0{Oijc^=bMwl|8D28rj?A>qa8AQzAPVGcX!984&vN>;lh0zaizl5tN**Q)Qq7zz zw0yN1^hRsmY^=}lsX0_!Z0>ipXAjtu-2Xw#&EwPfWY%WMLA(`x)qy8OogrAjuQ8_m zB@}fOA-9)dH0sdUpNEdICB&wvW$V zYl^G2F&SY$`VAI2sPVEqzOA(W%tg0E=>zdnKeGylGr1+ z^s);%8Lh=^NEo)Z-AfjG8povZdH1DthSZ*zurU+2vJHV;@>Sr7sZx%Cz?P(ar`d!b zXl(p@Wh>2$@kkytjD4>c;&Lf7)4gk5=ja3NGFU^`>L&ov#f4p6cQrjn0!nG_ToN~O)1Q1fhc=s0NB2HfbCYfCvf?ls zrB*ndt0gwf_lt&AJP^8w&pyfEbayQist|G@VTw82$E!8Peg<-)LzjQfY|U|5dG)8O zrE5z(){u)AF_wX`}QrUj+0r1iNP(Dl5=iQFEM zh`2oe^%T2zN8u;M5QZG3#Mos{Y`H29*K-P>WZ9+GU|#WQP!12viRE!{X}93j%vg@6 zQ}=tK_9kK|hJI4A3e;io6uZ*Em9EUC;29k`@gIyK&}nEWg|rmkrlXL#npx$6j2WS`01 zihC=p1Akv%q|6}O9u?UDkG&9r@B|B(yH|kp*L{kr~Zf!RjCp zF0@@lNj&aYbyK4KM*8c>hNImM$Q1YNN0XF-!SbfnyOucjiM<1I`m*lP#?KJ0h6YAJ zdKYVZu{IA3RtA(1sU`Mx-o}|rr~l@8T|vz(>0*&TJbjVTr3ohY&JFex1O)LX98G#q zXfGO_614SfyLr}ewc`d5$f4h9ArbLNdIY_0Zd}$q$T1luIqO<@y4046b%-MJ-c6_C z@Qi^%qwH(qh_6h#F=lw#xs~onP8=@EF6hKmukB|De7HY7*W}MhDQtU%a%NWFI&(ur zX4}#CF9>g^Rz{=p!Tn^zFSOVF!xcJb*sIBX1CYtJgvUo|z)`e~t6-e&pYRBl?Vk-b zHvpFbc@A?^NYrXUm@7`|U3WjZ38cT`$EX@QpQj^H*E1MKF8OOld7nt4{xRUUpu_iTYZ)4u ziW{;|KmB$8ov=Alcv(t<<&)_}@rRBkqK@Nw>0HY0t0YgBRY|nx2XNR*_6m(b&>cm; z)-kr_AJ-FUBTRmMIE2+@7bJZ~br-MDL`dbgSxA726cy%Yks6X+L2}4hl<_B@g}~|Y zN}qc|8W|D8{Wqr2Hdu{0E?nq^>*o0fM#-#)OHb~CeE~O;!K#oIq;ik7-$JCCApHcP zwX;@(bmV`TX0!%w*;!LKQprPnCYy=#qIhA96T`D?U)~f=k7{u|?2d&A3g1LDN2!7F zwUBvP0s)n(AiV8(RKLzRJd{X2Z1=+5U6Wx>&T)xI*9)cFIFIgww!T4i&l`&E0Jaxn zQ zczwyJgaYgj_L=9}e;Wu{rTC$DIQr`NGUv3-h)aI^K`Jjo z;116x!O?xl&)EDu9WO#2kG0a*2gU(HZtgHpuO*oC-04|oE$1<(b>z1OM6_`t_4L8< z8~=NTCq0e$=YLZOq{EalK#9S|Pwc>EbN<+(IDCf|cO}z!={-{1znf`J_$QZ<_5f*x zrQGPRO>BWm5=h&OcH6yY#`FxjiQB}4EEe0>Jf7pWK+om-%RJc!7y>h*7qJxJ?&Y>W z8ta(Epm6b8f$(mhsz`o%lW(i-R;DHQdDUz}FX4OpV@GnL5`5n;3-fHE@#?CnP@@v+e4f#xS(Ijx1eh}IB?pk3W5ZwQF znDSz7&JHU5==I?ohL<0J_gB3KD0&*|y>o33t`qWRDwq+9Q&{ z_!i_+dFit&cW?i6{PfI(p}5n;jKSFd)Igov)$uHt-O--m;o4NkPNC)U8Bc#NLcV&y z$GcFzRo)7qdR~R^TWDR@kOY@%Rb{*Msa=fprsn{Te}|m4#REN-Lu`0mrwUxo_7J~$ zB4`odAIEn{)bcj%8=wXWrZl#16bxE7Waxs{)3YPm<#`7?b25UAvO z;U}2jBCVP~Vl$kOkE1cO?j`4JbG?!^Ql$LEoa?diLTt}zLf`u2>X^8}UrPp(NUqbv zny^IH2ua3#y;x4!C0c%Tj$>M;<(@@7gJUE;BAjLZo5}H6k?dxL`Q8V6C}o5P`-}lj z3|Ibw_v>Rl-kY%-zg$nz?FSo>X@fWbkq0uRe;@*uJx@lQcr|r_gzh8OzeFS+N`{7j zZsq-*y1NwmcnRNh>R5Xj$BJD^Hd!K@m$4`Ir@_6iK=P&^7Rm8thnyOjOFX&!GDgY5 zcDByt&THqLbd9Icx`yTE3|un)7h{0u{l|Mu z+Zy}N`ny1GlmT4{3h?Qnq#KLlWIF>cUDSH^&>II+fUfTdreWn%%%#Fb zvhYyQDLIPOU_&Cnl9!TYsT*Qakm0sO{Uc8x<(}eBsb6&90&CC@@J zd%oN7@pGfcg5jMW-rq0DA{1uO!+S?{hm5gA_lsBjvSIX!t(st8@K|!97kb^VouxVT zkq=T9J*^gaHt(}fhc1e&@r%p6DtND!E$qDCUNq_VHF-=N_e+3oM}KAGz)XKr!xKMu z>64Vo8P6(huVb@l$l~WZq7_p;jh~Pk{28+$?-Tv9)pd>;b|xDJ`QsRf;?$yp>s2Q7 zITTt|fO+VU>q_oETIpoUg~fKy*!hnkYU5{T$v@WmaN;evwtbx@bti(#ItX{`q{1#N z*mDHEYGvPn=wbz|F&*vN0(%^4daclC%?63C6qU=v7qc6+X`Hsb>4%YHeA#ZfCVV18 zR)(Iatqf6e5e0sq^43X=fJ6J9Z8zl>o~2eH3YlWya4R9wp?U;`+}b? z$(+aFZY)1~2f{x#^eU*A+`_OJ+r$$7RO(+^`6>c~%_GcFHr6x;lpG}m-{!HU7sL2i ziJ7U~)dc4W;27e3XZ(Zj&$KR;nWyevy$@M+HW!QRDed>qH zC4o0BUj(qe*+FFEJ;yiOPXo7qt*Eff@c2G#8CN*Izd6^P`&BfzB*NWuQ{a&#?zwi; ziYMsS-nr;9Uu5<|{2Z%^PXNZ;8w1Y$vmvG}47jK=qHVaBgExwq$i6tH!W6W>v>^}iwrPA|&H~8wmtB-Z z?9Jai0FvP#f6q&z7Q0q6c?hzAtP+res?mzOJC2!s15ev(kLUmFy?p5k4 zwtX`CG#LL|Zn&Eolznq5R@S#0tH28zgC{EGINpeim7{g2|04nas|oGB<)weqKO!o5 zTdL@MPl?JlzL2*+X9KIHc&_Cbk(o(W2sKPMjjT+V%HcLKS%;^X6JvxYruXPRYqh8? z4h!G#y(arwV%h@x6d`ouDX+ZM`5^^J2sYe3yW-FmolLXYU}@Z_b!DFM^gf`~-aVSr z?9G`0x+eSxx^Qj7e|0Q-dm)uUcsepd@?(mFIC+pZ2LAlj6YW$;)xoT2_}VO&j0NPq zk+arwW8WbZOIoCzS;R>kt$G=0@V4kbgSgD@%gIK`V|q-!j1*QcDPH(#kc_d5@{e(zh8iwkkJTUQ$D&WTE`BI9 zdVQMi(-5&AH-F~R>9KD&4?la9x4^^d#YS`RfNJD}+>_ZKh4u@K-fgvh(5ydhDJ7ttKFMysisoA%K{)GZDeC@!} zyfH?+V77DC#&e&)PB=v!8sftnCWS7zv%b6^sJJ(yjY@Dp-M-4)_OeQAU~14*{;%MJ zI%J`=l1yv;9psgPJ)Y24GsH8n6iZLL81YHBMJJ6w#lnvk)Ej}BmkaSj=G^NQE!$CA zfmkHu2$-~ck3!={&Xo^7pZjhcMfLvN?Qj0P&$Fe%_0{k1y3sz*(%W8K;;Ao}uK-BQ zx}Scw%AKyb^t9p2QIOu4E_=>zrH5(5#rO%)v5wlfVt1gAnz$`fw-}nEMzA-owFgl%oxQI3;P6xm6?$xyX)t8y=Pc_I z)i4U0%n$SPRjzi~{TY(WsbELz+3Ka>YUQ(R5Pwzpt72>Y@HOmrT49TLuIfAu z=Rq3dUS8=9W%LD6Xgeha+Qb&GDC3ep0bWUwZ2CBn>ewNDH*$-Rr6^}^%0%P`9cO28N!FwQ@ z)Th&YlJ<(yzPv`zxvv5$q}Y!f?7?X9x2F!k**VmO`XALtI7%ZfKz7YVRM)L#JQVAA zV-za0dA3j@|H?exW zGcrvBt=_$lB$?$xFNqV3u0eRi5wz50HiUxdSo3-79)9_z|D*Wv;#LZ#OzhQRgdwd& z+!SKLn2h~v!cG^I%V1H0b&_3VhbX5J$Ea)1{Yd>tv9G|0JC?XX7NOM6i{&B(tgQH} z=tvoB##B#UZ(E?r@t1kD)Gt-r1vUCb{m%Ba8$CkMnP#4LMw`j0@6?|ogbMdiEWQIv zfelrMhuCP`lDB1QXkqYnCi-kaxirSf{_FI(794plK)oyTauiD#3Qgdz|;18eJMV zU#0w#%rHMjsMd73+nlI(M}PAC1*_|M6)JT!zu8)e_r8+*bAn>J)$!*>#0_apPyZN& ze7GtLKvnL%xy#?vV05WWLF*XYAl^%PxCan#|?+&!SjG7i;2m zkG3IlgklJ7_QkJG;Jc#*+>0K1Vs74S%ZnX1E5vFLv0 z&vyH~f0k`;+K-=fZdSx>v^jM#u=3BpG5Nu-*hp->DFmlWZbd#!^1#RlN7W6 zdgPc>-aL0Kw$!F8FF~NnJijg3hgIE{xR?%~q#XGkPlu?{6lpx`%yJsmD`dBITfXb# z^C5NlY0NN+M`-VQr#!*^FpoR&1NoiqV*mTS__f}W;->?9cat|gqf|ed*Tsj@!r3cl z7DrZPbIIYw99W~3vgv-G0#>;b(=LWcXjEoBgg?IOCmc59u_}Ox6=r?iLxqT{n7!}y zYvqKHcg}r-V6TDKRY%r9m^ybX?eo2h3&G$cz_V=`l zII?4p<88q_*?Ea2OJQwApsM1y*O#m{RVjS<>L1|IO|9~;XB=tJ6M72{t*Z9g`~=R_vFCP=KW?=1 z`TDG+(}QlaP1;iSe0eB zK^nL%RKNV5=o^`NCe)UFwyc_O;a|h<8U2b-@`*@3NXmKoo0D=iOT<9i+C{Qyg21GU@rn=OH`DpwtjO(OnqqLrFkfX= zmpeQ581RA(Gp{>Wb(lkek;x-7(b<06ZvtBFD-oyw5##PIJ0*)7 z9`rFt^MG|6oiera?8%)9BB(>)D{xR;Y@U@N`dFf{spF)a6bq3tz9nLCMV_?$K}TY3 zs)CZew#-5MealRB#3;I=+HaFF-N(4|FoQj}|HQ0jPua;n$RUKbpLMakvnRS}fP>niio@B+R`=u3>dc`&S z{Pyavn-VW6J2j`4iupK?9;EK_EUAUa#QM-Zq$@iQm#M^mSOzC?(d?-4{rKm6`0PF} zw}{!m7N+K*bYnYZS84dnYk@oc{Ck3-b3Kj^I+#UHN7klO9_nx3EZU<_bNLzd@^b=k ziW;2SpsT|Q!$7dtZUJ2I+xwwDOFFF#wtKT!Wgrb)w@x&w6lle)gP={BliLUJ_vgU zTB>c{xhW8fD}aPo^`8d0ndxtQ`%sw6Grv`VXfRwmib@5z%o)H>7Xp2)g+&ZwqR6EE zpMIeVD*H5@%HLJ292LpG6BM;%`~;Qu5`?@_IbWRV+50G5`>KCdd|{)`g4cQ;9fJk9#6_A2pR>0K)p))PVnDa+T1LlAbqmV}Xm| z0CF%`j={!y87TPdZbajh|#4se>OV>J)FwBszB?{BrbsUHHZv z8a)GF=majmjK3{6`b?Aak5Bw&&l5jO=?!isnSbts-2QsF(IO^d(GCgN+Z8!z6Vgj8 zZ>IiZ?l?swy`(}_=6*`Zi~QQu)A7#6hbLxOLLO4)=OQP#aS(3pyZd?gYjZAzRocgP z$>H)3;efwig-d{%laei{R3(?TGR9rnKJ@k3vX`lQ*!QkF<=8(PBfnCWo|=G+Cx$8R z>HkG4EB=R6o?Im(m2ex>cRm?xXIQrLUfRt&O7V&uGJ@`>!JOZHwwZ@F`n#R(+rIgC zVp-K$_h?)82D7D#+freEp-aVD|2*p+x>$*FjkaFWaQm)suUP4aWH!u;MBq?(R2)F- zX!P!HUhhX1--AK~JbmQi)Yyk0t8_0wuBNO#FFApf3f7p+1v>q9b0V*QK09$iB~Z6{ zY3zM&0i?!=z7`iIgo2R$I|g6EJk!}P+Ncmng^x`iNs5=JA%#Ud)R%U$yDRAhR;quW zjrM<8_Q@NV{BiCezm)neZ;r*pM-A-cHP;8E_U}*N0Uqy4Z&VAckySe-nT+T3r@z;U z#GBsr0P`G`B=o(e$*!35pxJyQl;YpLoxj8QxEMMhMGGBOeSCmu9~4&uIr#7QcS|AjIXvF|Y!L%(b! zZ3w2ZMZaL}mvSK{Q;55qzktRrshBIvFl&PI(Nar+l3ZR9>3PgHsyzfF2407YgCdOV zxuz^|HoS&O3Lan%IHUN*dl?JyYlr-`LC`|IkyY-xB8Ktt+bk*SyPBtJaB74a`s6>y zJA##2p@8;OG|zmMkhXCDikyu_ll>tZfCh4-w);hp(Al202Pb7W32$Wk$f2(&wqdMO zpdt)>P5t)i^&##x+&fC%%W1lQEFxi+X+Qg~DbbH{)nZYCyRVKMpyFpBf+4dLh8!AV^1T_T1Gp z8S~@rP>}V{WNhOSyGm>vDk0k`@m04NgC9}DEqEbFkdOV%TiXzeqsjxTPne`x_V`P~ zj!04W&^K7mMh+>O;E{PWOEuA|r8@ZLCXv`!51q1Q-pnr*Co_AD*`?pLU(e-yRDIq> zVLc`K?7-we>$o5KgXOc0S3Iu;AH z0rHeFq?*e<*?kbQtFG|4FugS6iLTQFR@E^1y-qh-G|>6dxD9iuFdZ$`S`yEoIm*qT z{mT7fUF4X^=+nrdcT`rdz2c9npR9!+6}l`^uF2x_CXQV4ho-Ij0VLL#+wD-cBDH-8 zNNy~mwo$VjV`A~sQ?@nMx~?OzYQ(|lb`tfQhs9|u{z3kekK?NAyJqZOn2wXa!=1X8g=L>% z4l4rBZt!k~gL<96U$b`_^v=ASRZCML{xs{npRnuN^h9@jvRxg@To2d?!WGw6F=%qC zyqg(ka{p_bTlMuPSPP_W4IYgx*-3SQ_!~s$bxJjVJTfs0tg|DXWPP?B-w+u5wp*(% z8I9?A?7s*=w1M3|M-~YtV1Dh5cjr$zDgkOqKVh7nQbO z|GPSR(`qx++y4i)D!%&bK&N;oa_{U8WvZW3@0R{6f(D$wJzf-CC!b6=HYyi|8Ljnn zlW}1#_dL_KY;?$*e;p`75>7#FcW8msBQ2UyFBG;8zV~ZwQy=+QHb2BqHyrfj^*u;_ zA%@R?i2l~73a{`>aF9;?4@V}+B*rhzY#W?ka=eZlH+k>wjz~V$?EQfl^>e}8!5X^G zv8O~gy8;KY*Gu<3?|2^6!xkK{Hn==O8C>>csoC%;Le{^~cIDRISD?n{vo^B?Q(@I@ z=$I4kb0}@y_eFzU@3w+$2Nmxmfm6NNp1MC7$hhcZn9}=B{K&OZ=jrFUn$j+hwF2&_ z{(H#x8#5Mh`xJ(eAPsC$CM&x3LnXijX=K>ZtH8~WWsm=0bB2@GdjCv%4fgLjxad<& z^U^_LNHt=&+5QPDn}>D&FXJ4TkM-p0p`XmT|+J1@DsIop@r zLIoC!H)gnY4bR{0j+#iFQoEc79>?a5*)w*TtqN$CN#3^0PfhGL;Y<7- z=xqBm?+<+bE+ethXJx(pyB6Q&8-tb6pw5WNPFY5&SxG0y<2Rt&J<$zSL|xhI;c6-V zXIOy3hKOzStJG&(D(Sy7*Jb&qblS*m#|-L+eiloenPpLBwgBJEk8ol=@OV!ag`*_v zFul=QrclI9hsNkZGLdWSzw5olBc+O&9XsBe$fAFIsR{lJqC^-=#eMC4nA`vd@>~{6 z0g1OPAVl}&SOEXlRK*Lpw3wfq`-#uw7ixz%^J{$GfPVM7q^-3pOkfQelyTpfaX-t+ zr-R6w?wUj6MI7_{HMjwq#f6b3Sr3@9{CE#g*_q7tA@amRMIoYRvWpm~txi)g(c&56ic0*MQ{IynR=5 zc1c|iu;gq-Bw1xTgnU{NK_@YnGv_z!u)}-;-fps%o{Hu+NQHZp*W(^W75K7R;r z+q5+}>br&SMw@gPB(eh##$71CqZS5X3H#?v^vs{+g{zbGsGAjb znVw5e=^&I>68nRwBUeI>J*<;ztL5xfcd?}L1(6O#d9wn>S3t79e=eJN5x1w9kx(l zKgGy-aw_4kuxpVUVErzC%VXBfUL3Gvjv>GNv03L=Fw*3<0`?OaRyb4P>RX;Osdg;SM{aTkzL88XG5^70nG~{S3yEjLWM@v!Eq*=qR}k^7p;E{9_e#C zY0VH`P0{ag!lsvNcvv9xhQs&p{&Mm=1rEcC`1rWJL<-ZNq|D#DY9Q`AEqW!I29#U>k z7aEc}IaaCn!sXF_Mm^^GWtaNj{dHZ_i(;0e8WD<8Wi{LPP}*L)tY2816q`w? z7iFx5e%uV2&mktGSHw7P&HHpQTvry@DO5wgsd*!c`uK~Wfco`T*sa+$BzieauZR3O zWgmT2NwODgi9qGG;`%> z^h!}Cis3Z6ic?6euc;wrS2tab*MTeLxY!If1CStl9j?mqn?hWU7x5lP)0+zOAc~iI zV(sYSzcFWmAT4sjdz##|2lR=Vnh5gFl%A1$K@n%OZ;ee-CDs5+2Rh>nDHj-WRv-$%bIxUXNZ=XjaK24z0R*r>1 z6?3wdZ%Azn2$Si%i#SQ7R`oI9Vi(M!RqV}Q85e1gVCdWwPWBXxI6RP+WOd(ecrWMf zw==yqwcNG}?_qJjU^VzwBLj64sfRS}PaGC0kZdvc+n`=k4|AMieed~_)7uZjyg-|~ zX2Xa~e?OzhqzPs{!$tSD)O|xh!q|8Tv0?QdX{qHNhjdLBivel*7H#HQw!iTMhh}mz zL5WB%XmUfJvqjI?D^+W?bqyBcWj0qd&%2B{$Sc2VJnDPz@#BAn#{nze1?Pl5I)%O7 z^k1!hu&ZG=#S4AkOjJ zzLajVQ<*~^#mi{<+r994YA6}(j!@v4`Dj@56Ip#{ZAP`%R*S<-2`sZ!>0iwdzd!## z_Ugv3-iG6bU;ZDHw+_h7r6m<(kC6Q$5SjCDLTOHP&Y4-RM3Z^>0w(0?+%m1LpyAWS zL&eMe*&Pp@$#J~xNgH)(#RMO2UD^K29LpEsmTi>gWe8A^#l=lqIQ~(o41OekAKsz3 zK)c6iQdTLA8jaUd=tbxI_c%{8CX^8-f;uHF3-Y8;R;+Bab?Vnq=wqwShfzcV83k|; zz`dIK(qAqJ8Abb%XzhSnbL%()gUHbI3tQp)!3`#76weSXmtxsos|@yFe}5OTO&cxPGUFlR0} z^3f*bTg9$=1YlQgi>D!5yoAFFd+4?kyA8*Z7kG`6#jTotVZ16!iQz?m-w&RmO&JCZ z*)8LP$i5cBJg)UR6*{d7G5!srvV%HyzOGR05jNaevw@I>u#k<{q(XyLB{tSsTNda#}>&fhd+fjfD-m+iD7Rp5YfIfj>hdlA_p zBGVQ2R;H;93v4=Et;yDi83U-uI2(--+pR0i?ZiNp z95Fth(+Qq4uYz*K5dIkwtOR#Ieu3-UzB9A*vO6}I#)u0XSzcdpq8e=%<-EAd6Rqys z`DTapWYQQMdS*Mt-}wFGt77Wis_eGk4glM$?*e2 z4ay*fEhv6_&fvZ9_DmC50DmU4lD9(+35h_|DRZpcx!)&bBbwKGGy~4A*$kq-RX49m zC8aQ(#iS{-AsPGuR29Qu1oF9N;+|i_5Q_h$B_69&ycNY$m&I?LdB_UTvK0`_eG#u- z7xis!Y!t$|cflsoRCLw>@WY#nMmXc;51hmlk^KfO8db5lgAi48drO8@5Mk0#-hY!T<8?wCF(ABdaO5M zlRPPwxJb<>+Od5l|Itc3zWaUo6bzedh6^e%f%xBEQjk0l#?<5X1wvm$%by z3{|-3e|0d;sQ85I{3&IQoH)|-?da1yxzfn1R&WBR!Z>kr>lJ8|$htwV8E^7q#@H!M ze6Dc*9}?``o>qQ1QNPmRQ;EAxf76H8VHkl2DrfW>RdAO2z%Su_ClDpDz1(lpzX@l=B&!j;d zgD8pEw!JT-hs!Tw(tkK(lL$snQne&8`6gb_@`_68$Ite@&OwB#v2IczAtmU*7f{{k z8Li*~)17035J4)a8Z!1T4uDeT&{oyy4wytbVNg8C5qbqPRV_Qu@n;qHR{L^KrptMb zLN;A4)TB+*Ft9Q<(-UrlT`MYGH-6k1+t+=oq2p`!-v%i>zTfTHo2R}+sF2M}v@23C zrH8^Z`R9>LjQg7*+Ig!-=3Sr8?r7e_aL6Wk&>VbS+vQPs*R7TE4(>fL3i~ziO!_3L zAj!B!&N03tXx;AXKF5cHZP(%3(YQY6c2=W-iZK%FlXIlZUO2cQ1}`UPcfLeBJgfb3 zB07zDJSBp;Fbzn#mukFM$Z^n0llLl$(Cbc87^}nAJm%^l&)LnlG3q`>n7F zIPWsoHMByB4ck6oopp#Uy3J&ye}+r40>L>4$u{i8UWHRV!Y=RJ^w!qR~+#0W(BXO3u zP8cW;pV5B8NLX#Nm5!ZUymRhpSX?^1Djla4Ar9*)g={e_#V=iNpB8OQ$Bkf>kLo5r z^HuP6+-LIY}cOKFh7ElNau@TTxoJkyV@o+LKWiXCc#&9Pw~~*p04`KVk@W{6qk^LKegK zB|Y4WjDJmH#ZHXiwylj+Eq4@G_(kr7#_~2EE)zq|IOH7tg(_3zRtc+|+t>4*Ed`_G zOi)Sn+TnG1K4ReTHIgJpYsuKFj&$&ghe8n)qtX?0toZtG$BN@|z|G>n(LwtS*T#z; z{Rvp-m<*0M`uzMXTR^#*W{K{GiC+o1NK)HXR^*qdP*Nx_=b~JrJU;%b=t!~43?@2{ z@Fj+p-PNA^TZq}lL`+3+2-{NqRP0LK`d=?~DZY%1$}h1qfJnISBg%f!@=gk41(WAV zO8F4naXhf^^hUbpk|DUjXn&8@V9bFK;z`OjTmOgFN$qZK3Ynkbn&YL@GLp2Osih6M zXUwI!9as#Xx&pa(r)^+MV4q9`f0WVJY*zkZr7XFe(!mP!)R?nzUD;{5)LCu07wt(l zPD?29hr@5`-RSd9x08m)?RUjVaK_`pmGyqs%rlFy!=6uHY3S8!y_44X-Z;+QI`%qy zxK^Xc8(va$q{V4q?{yp1;V_oZXVpjilJv^ycAHQWqAtRBJ(rVC~q zE|+P}5N?K!yBREB=ewr5(cX)CQ(!=I-orjoR-RsYI_kraia&aq&GY2)u(HKxRL2|rN^rC% z-JbS+;l!$(-%B&=XCikNcvQWDD{sFS8tb$>m1bDxIk>81kO|shcxcdZM{Il6CP@=& ztl`Q@?@%3doB6A3+eTrNiJmmSZz8S2V4XtdQ|?f}yOorm`n!bufn((e0_5qy@Lg$* zE?TRm8RLqG8Bl_OCaa>Y-LWM`aof52nig{|tP{HZtE@%HY3Viwz@?hiO%DK7s{tEt zBJ%%LBf==_DgQT&j~3=${QCYdo@<~`G4J_Npa*}OMOlR`8Tz(wPS=-EKP~9fQXRfF zx-nH|(}jibcQ~{xK1m|Q;lDo~R5-IhcIL|394ESyp=<>P+^o{wL+IH+V`xBTA8jQR)r)x}pa`bcuob^nq+LT*xl zL$p11qDbk7yDANNT9D%a=cr0?o5gxapNagd;{Wq7V6HNM@#t6v?(av2zL6slF2#or zChOA2)+v(}h(UR4O;0r)I^LB3KgeP#Ui?=UvoLb{!tSkZP7`84>f)I#DT5S9`okh3 z`@7-zU$}gVNx|?xT3B=|P2~)Id{gEXowRNGmurm@a-O13-1UCBmv_fRUnjx|`ogn! zA_4Q+*FORj~&+W$0d2c zQ~_p#DLLTNsE|8?l)OUPmAnshN$h<#8oa^}} z^_kt1LDnxW!B|G@8bkbIcpeqaj3$#St)SNWN9E1eb?C3;%}=zd57QY+7!SwHt=VlP zE@&9MK<;1hBo|Fd{P*IU{#(RxcJ#P*7AA=QiV=HmfQE5lNLWjn8{LVLx?`Mw*A@u|6}bf!=hZ+w(Yen1QbvNL`pb zAXu2N$X*_7$%u~c`cL?$`P|3rqE&=-rsi$roq&tomwg6` zDJ(Nte!#NbAf+oPk|1$2geV>F`9Y+3h!`HLV@7J#se8tDJh75mkib%>MIThs>wGC=00U~ z+Vrjo73e-!akF{T?lj{B3%IIfdufb2mI@z{b9lRe8^j_#wzJf$Cf*{R6em<;`!QnJ z&br>1gt5`S&-yx}?EIB{mNdn}E*h0k-Vrz>Nes$fZi%?DNV+nJ@x3wSMDRy|wsjVp zaz;Alm$2%fOTn(y6&k;o!~uWnTNUFKrw(LSf-FnTA@Mo^;!){_SkxiTdPx~>^ z)Y|X%wO~Uv(ST?7z<-mH0ygB3s*xjE%DU;x!meq--Gu~ z1+BXK{Kmh_?t*Q7`v%aL|MjKLE1?6`VQJ2J4u3ly(NQ7A70_`tWHasHFb-(NoC9GP z{bWQ5^HZr1519;e03QHir=_S_2`#|fT&}$s35+1(sen^)iei6w_YTS@sth_Whn1Ps zFAiaunhsj-gR^q6^u%Xvb<|&;e<1%#bMj$Zf-1mst|Obwi4MLpb;5*+L?kG|wEBN( z)Yjqd9FE}{>xtPr=j}rpWZ5)YD7WEl}=j7>@CGuP?ON;{Uip_ zq?#ucSJTCb(@qoKs%^hLcSUmLy`;0@+@~}8QleGFD_Ydh(dBPq_zDcIDH?!yghg*{ z-sNeKuNwI=9&%9aiTk0Jb9?<&w<7&waJqy(V}XX)A^kry&G5C1z?%-9o$siA+CLeO z9JG6qZ>x=U*S!aSn_Vp9>`@EY?C*dD;^uvky>ELZL@MbGkjX;K)S3xWyfjpsrkJHw z@ERTAYaiR$m{RX5YSvLLhB3k>`6O0Aq2uL9H(VqNdl#qlL(WM4a0QLm@x*2QLCJGL zKAzYjp)$mpmJ4$~ai4}M)kj(E@(-)xLd6u<|81nX^kn!yBhAYf|6fL$t`5PWC#+8X zm1RFaH>5`36qrBOvSGq*;E^kx5Rq-(AIQfav>%zDKcCC7a35rUd>)W_m@EKb4|v}z zy@JjECk&)hs1@3~5)V~BR9eirg_Cvtqgb%~8!37=)+^27s=~;sGZY z!M}@9{SI|R&OFNk8<{n4%?W(X#NB483h5rCFN5+22YBk;Cjo8Y=yBMHNl|e|Fc%1m z0d$5-poX1-ohF-n7Z?Er>E3AMxwB%DWVlkspy$sTe;Q!@vzx25yX*C6w+6NtuT&@& z(q!!&O-;*Np?{F4@VIiZKW!Xz**r_1@hi*m&Y!nejI$dtHmhFeHP};t>)uiFef0;Q zTiLophB$RecbA9oTWsmsy%CK7-V-1MIB*mgo7nv;_7hzNYvapP#kD2dF2sL1dz35i zpM=zMuT?9rFq_jgyPel1arzA@31y^BVX`{c|h2r&z%qwlle+cpO)?`C_M zsqRdhvOunra>M5$ zUHq2ocWGCZ= z2*K=p*9}&<*j^lwED~rjgg9p5exj|=eDjpOV&FDm1Ij>a5Jsf=Rmq`)fH^=om;14V zwzg{|!qTUs2skz5`hawW_joy&`|<3p5|^Xgw^s29ihshN7XFpLv$Kr#-pCBlw~ zItj~&7-Q%s?3Wd%zYq%Z-D5$*V}n@$H|^LvYHZw(l7C9d@`C5z{|Kzr16OuObq^$? zU2RBbBLU%Fs0|?8>&y8WaM7dR)mfH}%EpVQq2ee0VB-D`GGdd{HjENDi%KOLK0F8~ zFuSL1%ZWiW%j9e5Za&+G-h6ehq(4I=1XMOQ5;I&y+ve?>hA~`5H2+NDF(~( zI{>C*rFmgEG(OL1+zK%M<7rkWF()5Ghd86Wr>*;qF_*TR*%WT-7g~Vj_=f2d%V@Gz zjmMMqg5ZzzGi{Zbst7wa#^FX;<+S%u&h5W+RtRxSb>zKPI)5)_SknKUoJVg=x&D)t zyH7wT8Z%%h?T7z8G2gV>GWp|Gh7ypOQph)l2l1A-Ckx7zm=#idb1GGb?K%p*dDqcv z|8`kQqqn1&y8RhYMLK3`5i~Y=q$hLBm(ScbN`I;9t&$Jak+XrhJO2GJ_NEfS0|2q; zBBBl7iu$S*_3tosD#}~*0dc^PVn&|DeD?Z1$Q8CwH#T<$eoO`J0o|FsY zgt4w}akL8M&w1;3Ry5702^6^>KbZW6+gN8HJTM(%uJ=J`?SN(LXMjkV`}gJIF{%*7 zo+Lz8NziN(iVbI7 zq==V9eNO`mgmvD!a^MX_9AX(%aW`g(?pqyl3d_y?%(0B@dT791FzcH4v;H7Ey!=#y zp*t_sLhhtx9Q`15-MFm}>z8x{A&EM^Olv5F5xi;4O;Hf8AJsIjh7g0k4Kf4J zh8_1|A+GVK$mz{^Fgr)1aEk@08=*(iR00iT%_nHNdh7{7&aFNgrw0fUXovL}`^>VG zC$+eH8@$o``0m$apbXs((%p2W)v$23U6XNx!+AKGcB(Ah031U9(QvC06d7(rS8Q$5 zM#r>m&B+gyXWxDb&sl!JY2X}mqeBJ@*)-7yd=i_Zb(mkt4A|$+2)s=BG)$7gnuTsupy<7*TN)V)%m{&lV;!Q z6&yYv_d+g(fL3oC>Hl;SE3F=KHv!OmEZLHS2KD;D-QZ#O=Cww{(ohoijgUI$u{KLq z2NT8*`{!X+wkFD$?O&7peV&+60*4+tQO*HvFHB~seaR}aJa6JP>g2QS_KQj@P;Q($ zJI&dMRKLTpuz|ieCigJR06Rx2XX^evR&8jUCBHAsiXecP_c&u)`}?1_V(<0vdH(k6 z4oVJwku)fP*@)*F7HTQ>c?&7Tzm`mm-!DzO5K+1`)-ENLo%fsv|MKYdY@MPpaG%gw zI%R_Uoqn>ONCEsh($1yjI+9>=6+jcZaOi(^rk_i8Ld|owQhSkt!|`AkA30BJb<04Y z{LVn3>G?r2H{uQdPtQ2n38`4+ZaRHLA}zv7qa=aFJ%>?XOiA01Uw`vgW6>_+u-sb8 z+rH7syAl4>b8VJ3?L|%B_4hT_miJ$G_749V6D;ttE(5lit+L0%>B?C{I(C2baUy{V z2gdjEQ=3X$C7!fqn;|zG*IsBNANP|mUnP6?xwOTa(m-cUE^nB({ZA_ceMI%~|7l2Y zU(EhR(LD#xc|sY+v!xNR^TWoiWIed|?78MiZOe~>riv*xFvr&R?-2nKQdzyX7}x6l zO^N*WfG0xG^QFAy*n@J^WKI_iWwb%ydz|wJ-??>Pa32MKl@*15J!aKFl|vFNU=2Od z5P%2TJQM z&rHzsXjYbzima&_fXASEiCq^BNS0QxsEvs1U9MU~N*w=XTi${`;U4B&9o{{hrZqmF zrVE+62?bJQ0w5+}GQjkc(NWDj{)@d~ZHz~mt5WE6$={^vgoFAy;V8|*H;1lfU1+^~fF3@XheUnQe=aihR9Cu!GOc|TzvAasVou7_cXFvZ6 z@~?`!5R3Q=1Qtd^F3l1?PVZZoo@e1-sh=o2i4gUoOtLjx>(S@D39SZBYK&}~{mzV8 zGA!dqPYeKkAFM}29qq%rV1BX4v3X^`^h|vNU>!*CZ*3S^Egwc59;IJ&26Ry=vsXgD zwo*CI^_^D;+({O)H+~GJIw%zR6v!MD*4TG{=F%sZf>5Ap0~fA1Sc+)BnLB~sso*+i zU5=^~q!z*7q_D10#$bkhOx^ILy<1Oq_nproHz$KVcP+2>CXtV~57{?H0^r@loW8*# ze9Hjb+@fK-Oz=KF{!qz5c7#Bl(Ah=@!c0HE^S!A8xfw?>rDv}PKH32w8x_rY4GSZJ zCpAniv_-ZF0yMV#zckKyZ$;~_{xdmvzaVmyG#m%4>!lFsSKmC!O0uCh(rmHQHcg=> zp?0#TQWNR!TbqBMzrwIxTxQmu#VUARnb+Dp*m&1#-v&I;qI#3smh!lyj_xeDTUAi4#FBOWYE9v43@0yDCME$*dY_$9Fj$y|ZRe z({k|ImY7@cH35~FP}}9{SD)7zW6#sAQ6!2~Yo`SFJDhz)a!U3){ietwv=MneJOS$K#PVIwb-jy$H8^{lhAa#%e4Nj&{+K2H zj_=^Ht}4Hf)x=E(!pD<8wQhI6l|KEkbfYysj^K58^YK}KW*tC+IMdnhm29Lnqizs^ z{)AY15Hs#+G9@ftU8+vO;S9xfaGUc(;Lc3hw-iML@!@oYC?*dp>6zNY)HlJ=0stz0vWFb?0gfDiG7K+H9Uw3R{xd+;_Dw|(Auv7-bbmP;^S4TuOaR0s`qQKkzEa0xYcF!`M(V z-d3rWJ6`!)+CBb-rSv#H()z%oPooFNvD%x$2I`6-mfC2mvzT=8L^oY&r7bfh<$3;@ zA3D&c*tR2`OCwm5tr{%=B-l?wowd_v?O_~}aC5Fl7wS|o*V=aghwGf1ppOS%!B_ZR z<4{v)aMiyc;?p36I_1tTq$%#k`}C$B7f{J*qs4uPd4BDch-Qt9aOIjXVH^ zzfU~2F(Sm@RR}~^E*6HWthy0|q=9I>DNUn6@pM|uAK&jU6W5JQ94oW7VIgT!V`LLl z2@y*2F@NJjDp!jOn=k$VBi@DF4p{ z_2Mq=`07bxJhSwZ1pCcgvN%B9)~4S(1BP@2X`MdKtjws2~ zAR1+b(+BRO_U9cP1SkjUxvv-8Zt~C-gZuBb@n%Gt8RTb_s9zhHgj!KhH}4%zdD+F1 zAbMyv-(h|bCfOve#;L~_?;;utfFiPhH&Thewo_MKCeUB9cU9^xP+}={dE2EpeYBejb zVp%?1^8T}G@~noFGt*BUu>5vdaA}-dZMuHA50Bm@TuJVKzOE)B3$E#;AVT*}{RDqi zRrsBBU%nqDdY+%v|FUQ5BEylJS~+}FL7ey0rulPl!@g>($fL(j>kEmk4dvZrCz#PG zN$d~TW7wlFha)x8X%j9tGvoFLG@u>9v-$_{jb2%*MNumHMA!q5UGBMF#rqCVT9(F! zAB1Ho=RNlSaMp2OR_i*?euFFbpxuZDU`@!6 zqA;20jk#Bsh;oz5`{0MJjUpes0jHi7!}Evm0gKai2G~^zc zEyveQ5!7|O`ul{k0MyzPRQGOV{-W`*#T2n%5kL?cwlBa` zgY8#vd;A*-;WNmmy7(>&Zc;O@s}l>X7Ye;lmqgzYb-qt)C^+aui+mxD@K%@mb!+2)g^xBwIjmw`RPb3U$YU z;1#n;j0(q4{|@_HQ%q+c(27xCFo@wZtl$Iu@M!?`K2g9DGyXA%V7F9sQA*Q8a7hm* z7HBq_#sOw1b-hm!TywB&@!IxZ(zta?=dSzcqLt`LtjdmN#>7I20bN1MC{3Dszcdxi znru+nM^PQ?mhhRyhVfS51D}B&0m+5t1vX0b_^vz_27yHx&9k5C9G?U?uPf0odZWhE z>xX{nSXo@GPnvYaslQMhaBYYEy4N&$x5vA556!5Mq6*;=y}R?cY3$5PoSj$y;YaLQ zeyvWsGhE7}X&0gc)3KKG>?5Tf5=K)lCN1Ca$6~=g=T#hc0RTq-qz}8wUb4FZW)Ps+ zSMK6YJ>Lx_c42yDDu0yi2hiCj4{KU3ypQBx@o=$ARETfk(e?Y{w7}1H!(qKq*`BPz zm>l9ArU7zxk}NT^lH#Z|R52dBi9%v?$ee@1r->01KY@gQ*?r ze{dyShC>YprYoVECq0W-3*CWDbKM$N!JTV;2|5N>yo&pgXliZJs>-W;_57SGkiHGt zT~s3h&asP#V1xm@GxH{ph@lbkwa72vI}+!y(Y=Q3^HLE)W}LIY`MNz5%z_E^5y*pz zj)nCe;_%n4>fW#yCTGVzC5zb7bKsnphYrQe>{&U+T1Y3u^C)?=?n54M1IA^?dquta zWe=&!mfqi6Wv-g%os1$zXyM_RJtE8Gv>1Lw*wrcw0g&Gzdd>N+Eg^)X;YNjJ;Ckwe z<*CBQ%0HRIisn7d`~8u~t>W!@)eRy@ZC5M+0-ibNjl&n@e&k$H={!Ej!vZ_i6wTGO zL2L59WY^SmU4B;r@=6HTvOLoiHR*qpe$aZJ=7TBYEi1+By4Ky6RIyofrix1@MrC{7 zYYZKCIZ5EDI^RbRwbx#@myq?#dtW`^sdonY;_QB-@jSq*rL$l#VwiBG+BE5X7(=7u z!_(w>+CfuErr#Z7<<`FkYCYP$+Bnu>DXXul&Hs(%F9WdrlHOO&yR{l{zj2VB2-<8b znN!y=ur3zt(>z06&cc}H>W7Fr=iMtOfIu2E7vc7-r07~gQS5t6!aSp)tk_|V|9hi= zdC_t`)S}N-)wf+v@Albcpho*}E$pv@JtwSMiz0ftN4zXW@zA=oBUyHEm{Xq8ql!>J z_&wLGzWo9`Yj(T%K0@ASlWDyVT|M$PT!!;+^+xIyB+-oTQ^?M z1$rYi@qcc2u2BF_ii|%+iQB!VNg65a>8jvW{f_!lT9S`cZjQt~zqz{Xvf-b+9#4kB zlh<#Tybs6J+SCaF{IM@t!FT8edp(k=x^6lMabtX?Hf|4}&AY2-8|L{XmC2OK(62ob zef;f_^|xKkayv&lC<+>nPyHF_T-5V$;OWTd>hR6BtVI|NgaZq#w<}lA+Z?%#&455&Ky~gdbD&U{mclUcK ztcgE!%s$UzxJdItktdkh`DTcJ%rtDf-E-#O;`(Nd&oZei5}%!KQPjI%BGJPA_TH!U zQgCJ8955xxk*nL!-huQ`i;M>B`SG|l=Tq%-I{Z>Wy>Y8dhYjtKQk#dgPDb1|y5Wl> zvtWK_eP2xQ^63*kHj@Ajzur1m*YFytA>Q=X(onY3oHph6ulTYo!(O01dNg3VqwWI! z$2gyBYWX%XUh`|uAo(AML1zFs`j?0#*3YE81%=`j8?Nr-BP~Hq8x3>1ADdUpoJ}G; z9@1HjeWDc67s)4`H=P?zbArR2j$cA zxBfos&|rmhCqOPwIxa)x2H*GFVECqaRcfQ@XJjw)aGt=Xl3YsD(QjA;T_PV1r3Bf$ zkPf>7cvfao^OTlhma;mRyf37voJz*!1dM|F>V>Ti2e+~Jwy=l-hvX2tH0feCp2hZv zCrt|s1{@H3{XvFmhLu2^{=`u6A??;BKl~kc-9<9I-gax0-LHRf%dfAA*ixQF2=0Zf zygJwW`^h3peNhYleBpR?kwC3I`XeXBtTOj@Ni_s+B4+HRGx32^s@ZmKp$qcnRlBqL zH5`C}x528iOPvQ-+N0KTkdy?_{XH(r)ise5XRn=z=BcbLVRK9wHwTsJ!!(TVY;ZKJ z)mOEDWtlPF#>8JSUTkpmS+$%%OaMZgNK*f&`(a@evjO%TzM*<&k-BEVRHRcDllg%8 z{)8V!N_vKG*D_goJuLS?&6tB&wTU``Pe@d!w$8*e`jkaVZFexDT09TP+7STg(^uMs zfkNw%ipOd%_l=7-;HHaV6J7!Y}94$e&OIuA14<+f88kSaNjOp zUmXBW99nvz`JLt2Gzi?$9&%6Djs-nXVGBN?-Qq&xx4JpRkmT&p(-jdBR_N)&R96M5qt%84mv%h>2Jjw+;^1>EZ_f-_$FLfO>o9D{dVb%`Wm4jvPNyRr3fL{GGC>RcEZJ|o$pWJ1$Sj9t}ZDfN_6D3ls z-gC||00Srxzf~2I;damAt6!BwKg#Y2`5d(ME$HXTx&7$hQR}e~t(&ut$+cQ7kuLN+ zNG8f9s*JHle(VV6dC{%uMho-f!xuu&`0>rsf&&>S^)+4i$sSN0j%6#D!Jk!_FZn|1 zPio7lG=L_FbkdZ6cAxJ`aHoQ>i4r{sb*2#krjGjT4*mAa6g;;?xLeCxA^|jUw9r1s z`dQYRK8iBy9yoldKm>p>f{vJFc79eZ6eC~vOlM@wlWvUYJU z1!8ROBe>sKEUY7s3>*sQW$$^;)qV6}clp)1K55wV=K7A7=CqT)f&L~FO#zg~3Fo{( zmHLUi7<2@>x3krsFU;d|Jf0w$jw6tacnA zrS}w%#!p{#jDDO(3XXc-rSvHwfdHzB{pqmvLPO`{m88qV8$B!b&zXIjiCqi*)?;TN zi2)^6w*n&k%8#TCIGre)3`NzR$bp&;o>`k=Zfj#PxW$j)GaEhu$fIQcC66k_%CcijO5(xuD>7tmXsY)DZ-!mb zM2ot)d5q~M9N*4gv*&t>dOy^XP%8IZlg&%EMGA(h0XwRzCI&mN-Lcy904a4C75sHE31tkEo%E*{ zfJvMg*0IMRaN2XhHfvfZW(`clc!?Gz()w5%L(SDtLBBX-{GOl>aXoP#|(E+K^(Lme6kgIZLWcr}~94<-q^bj7dCOp3ut%gXKfJaR6#7F|{UjV2bLdng1({ zl`_<+u_d=Zxlk4kUNC}Q-cMGYnPu4KsOG&{SA$#spbO;f5Use!r6o?Su4VFCbo+eR zN2G_M8wKCr5Dggyj+OebhdMqxa)xw|QMX>@ za#in?X8wv(KgAym7<5}twTyWhV~x|z?Zb6EZPcn}Wr66DP&dhzpz2kiVjvghmK7=L zVH&qsmNcc*8h!0Lksu;vW$ep$p8P511?z$}WX6ZmQZ-9 zi3mV8yz;>(#UKUZn>DG3gZ=le=^1B1+c-(&Ozaym)n``@k}wS8R9(XVLh^J+DAUWqve z@5%{Wfb$!;rSLf`-H+sX8Fo!$L#>?$Q{1=uywgQ2di1<@jMAB=qgDj{WomV-4`W-~ z{LTdWj2m&u2wf-0U?|i66_qPGYjLgJ-OF=EogH1D;wR*oOZZ~iN>4@~+G+CsBBOj` z>#5qzf_Z*Jix`;vt%pbdHi>)He2?4@!*dy(d$-3HzL>$YIEeVg#tgbe@>sv0W73*d z2Ty=6Vv>|kk~IGk%?wEnxZLGwA`{WKs#y+#d?9Y?9Z`wAzcHZUe$a-SZMBm6j`)lS zs@P7mN`_An;4mBt>5ULS%R9OpgIY#Y5lvt~)@FCSxX{c_Ls_579H7K+&(|(Ru(q>s z?a2k|iojoLUYT>mEF5xQKbt)%k&d~vXewV3w4_IhQfmr?gFJFe8ESd)@TYc`(i8h+*Pt@ z+-XO|^g)~_aD&GIRdT?hm>TM%Pee=Q99h8Bv`}3Hiqrltb;aUe;l#}RP)1mK%f&pjw zEtA?&&O$h((CqL8lM$1;Fq1lx4UK8HK8GbW4ZY1UQx-V>{bLdl)9-80b7*lbQS>?S zw~P*lo^aj;B}#`KUeD#wRNG$b%?r4F8a20|ZhSuFs1^xA~Q2sT_QT4HDCNfdz?_e0Qa{p;7Y3$J(h9X=z>3i`cb@Hf#faEn zrsb97Am&{%)jmrj--$;FLnwp>SY|MO3aM1WyRpzsBhO&a-tH-ZFqW6ql@=Sk-|3&x`F2 zB^F&>`AG|q$y><;SZn|A_ecT$o@6-y{?_S9Hh0B;!Ofm1WFne_@$E@=KY5eyGc4>< zTUnc(6F&1s>8|Q6;l16*PXU3-L_&!!Dy65HF#C^g86pdkgOB{^w zvU1fmth}NQ)jgxEJ}dyHkpOfKgw=v2zyovyiti+(Xv{ijD>G@tF8M0TlK+CfvLL-# z=QM6AwDOkYPzh;d`%S$&Ik{KVT681n`SPy&T2BO(&VZYVf?aPL&2zVEG768x5Qelm zMlGgKmA6FmXLF9~TD`1b9AoR}FQvR!#(6Ai6zopaG%%mutlQlS-`t<$h`~`%_HmN0( zS`2|lFVv5BMlZPcwaRtzoZygGB1*e`VbVDN13g%upen{Ng17l3`)_Dplm>5%-CBsE z*gH-lM+ycI62OH%Xg@`+Uc6^tumN*FgX*uxb0ruoMCiV~>SN3!0nO~|p-h3x8Qt8( zt+KN-TX=GNHg)r;+k&{}>pS-j!1=5G*qDlqTbM{LP#4Rbam*XE{o;2K8vF%k!Q%1Z z$?b`SSzZcCe5vm;!O$OMauxdnV?|_)gbdWnyZuHoG#3!R(O*ZpAW(CZoOvy;4yD?( z7g*R6Cv@YWMSv%0{+71xvMVt|ZvqpsM~wVOF2m9vfGvx+5!a|E;wbeE4h@!;tb9*} z?Js8|dgJE4sC~}sTnKvF`#{Cm4tpx1GvVIrqEg^Fio0k~Yjl6xOYZb?Ed~s?3AoVN zwKo0?noi>06!BsCj_SU}BA9Ltx`|O)2NucUfTvIUrSetxCtP>dBCqY_9=E>QT)$vHx2!m2OjE^kz z@2iJX@Rm(qeR1*71_T%9rPlZitm-db7Q!lHZZUw?hHXuGt;cSh!D6|`l8Qu%SNt8IY31P=@J5;}} z1sRnwEQ-#64H`Qc7WpG$skCb<_uo+a*f463c?l%;R+A^N;e_m zLgOQ4Svwgmdvf|h2y%McQ#>SA{S+pO#FC2k0Y`sWaIL=dL06lykja07F|Vmzg5_-R1{mtSQNEc^x z<(!WFttiX|6ooZwGXE$Fw>|sn07aoFbVh!+0Rf7qc)>0z9M+$myDA;J_wb)R@On)r z-8^79)Xiakp%1Y3uJcP|7VUe5cX5Uh1&i66?*wu6PQuEp6CU?Wq@!>1X6t{oS#$C$#Oy9ahA#9QSA2H$9e-{&0{Yy+Z z|BskZ^;%3A_eV@f@-H!AV~Y(SCgl13p5K?7wQ|h|giYa&nLT)(a4w3p zZ+6vUU+tZ=a19tpNX`6F@oW3S;=!Mo3`MV2T4f&Ys za<Oo5oP`T ziK8+9F%x{(@P5mCSmVdHegvuNpXo(6`gxsIHcHJ_TvZP2l0#6&!g^N0ilRyZ(R>{B(p*JVG;s!syovga* zxfiFdTljG$7I*8K!ChuBlbdo^#;k0=V)>r;0)ZJ0zAs&=eNv>P2a#T|bU)2CfLq!f z0B~z#Ikk`9{2Rc{mgbRP2mrW8hPc=0qZuQyQ{URj44}^ZoO!&2`5)^FF2{ zn%%x*8ErN7e1EVqe)RqRGWx{|nqv=-M*6k)urg&io~xC0QETEQ@6FdrW+_+YKfDBX z?HHPZNVD#12qf9GcWvJ?QMNZ$z#)Yr!ByrE=2`}1F|0% zC?Ip1GTXIQ1A$;{b)I&MW+?zc~29O5_#AydV?);La;otoGYTf4&4lXwO zWM2wJq9oD3y1?GY2Hy9g*Ng?n+tqBMGv}xko!I$TEI^`HT0a+TDtVhQ6s*P$>O>011#R%q(m5Kq zZ6;N$bxKj|V&%-pkwD+!!REGU5<&^?pI+7aHZT7GjC0sCo7N*(Y!&)C4OilQls^6t>2>;!17D_Kg%zmn#Eys6*YGaBW=C;9L)Y92H(_#;~~;g zR|eyaeO?ukp?}hs@Mi>7bf+(rf!Q^SC8fXolv}m$WrPVoG76Wf3yoLEVP)bK4qmxF zzQcEYe1|W*;7M3!pV@T5N3PZ}>x5t$lSfL&BOi0f-9S~@t{)?U^O~0)Gyag4U7y}*S_;rN zoGe|H=Wgy|vo!!t_5SV_yy5^@H>uDlIimvhTbM?0FVPlOA6R|u{a$_PT(7=buC;!@ zhie5dm;7*hI02tl$JVIjQ?%ncUi)Ier*%g6lw-_#2?gs^pvGPh&8YI!AsN1qOpdU<{{AuCHv!{6xS=8L_Y2N2jYNd)&RF-%(yPtRlk+rkR=O{E_j5f<%}`eiDOl)-n<-8iB?rrqd1#U;&+|?UAjP%#z zZ$0f&3Pml@B}({Hj7ZckTpf*l{g6?D21LS9N$s$5GwMPqB|?ak%xwY@8)s zu3f~kr!v*^u$;}i%*P-QY+p?gLg!UfMawp}1pcz?N#cOYs=Fl4Nd$G>VV_SUo2OlCEd^5hvBC}r6>W7X~7uJbhY&tGVcTlv#rrGgk zA5?jMiLc8W7CHhe0MzeDt9LVaz?|Ec#_n*cReuGUe!7-_!N*Zvm7<=cPmz8~`P`r# zxjKdFvny9wwKkNht=XE`NYHnuUHHg`&;h~Uu8XrAl@~pT<#3wCjA=NSV>Y|}x5%a* zZiO5uZva%ZO8TBr?%~HAIIa0GsvAkeQK}O&NoHw#g17i)Lsq?A{k@ocsYoc@y3kR4 zhu@auD_F~aKR({?BRKCQ?AP!{_&+h_3LotW*!S}C^2Yv5GSl>^KG;L6?%t>H^w|Ui z>lO2c3H2?Cm#};} zi|aF4vMz6iiKk&*Ggr23KqS=82U?!tEMp|`Xi`K_)1b2`-pl!rD$ljB!@uq?IH%9@ zx=b&3D@QhCgj;WV2^dWlD9gh61dE++F#z7Fk6kN>hv+nZy*m+Y#*9y;7#^Y};YmH{ zf@7+iD%CpdWt~UF;xz>ol-dU?E`v1hDb7@IO>gEx{#s_dqyrJftUT4IYm2NxC`XW+a zmt7R7w8ZPxOeekY6eGK4e-K#*$|!hslACGLAP->>e0u0b=4E(g3f-WB2+9)@B{7TJ-^>0~m-_G5nH$lb5pKg3H^8$>_Fof$2u~kB~fVJ>c)#|B* zhcl(ovo-^ZT#^g^r9iTD5Hcj}V`=9F-pnQnD^tIjN8y$K&}gd4`IxrJ4_D2nko$ID za;-8~-g-ymx;7H0!@?+YKR4tP`9PaG#UsK*%vci5%lxF>j`HztWMjeU3o_&6gQY@B zF5p6_H#UkIL4lY#W=&g7UQ>m>!4_^*P+|Hu)iKKO?K_|3Go?k28r!nNgWfH-h?l(o zJ#J{kF9Mu5f3_vO1hVxL8kvnO-A9W|h>NiR*@e|;&s4>>2SVf>S|9DGt~HagfM(L7 zFAmU5=JeabCAXnN|CGw!RsOOHlh}TN`K3b~k9J{$q_W)6=wf8wZ!Wd)HJ3W0UW)w# z8A)MEzaufbKI8kShtH=}JNcnoIJw#0;LqQjAM*I^cW1Y`HlH2of1F75FuLS~7W(v% zEsy3)VV7KwrvS;MQk`_#f9mDTDvf#GDwW#S_jO#qHIwIq+;ffd{lOzD*f*YCW;#)6 zanTpW$DG#uXw5OAR-N}>PpQ6tBw?p`ugWaNj$nTIPuW`z-wq;Rv9pdIZngm~&y;&w zR{g#_6Gk!d?{b--g{B5#eEW%)o)6`feG0bpND%Y$QM&c(uItVNo1y`IJrgs`uh4w^ zcES=}T5*21N9+L|SjegeA+*(VCu9oOUUlGZvhiGx2y0_scQUEqKIf>ZfC8wP?y@v0DtOVX0;BtaKiYS8yc=Ifzyj!?3*C;vko0-M-buB?Lc|n z`F6&Iq>?3hp_z;o{?FzuCp@+k$+JC;8a3HvOUW)M-YKv1Zr;|_b!W?ujA=%_lLkI? zqI7AY>A-|>0BZDV27pp`+;L;&B9G1Y3iCRR1tsp(EncFmBYEL_e*RyxTfKFW3_25H zSO!6bwVxXLwP3Q=@$ubVfCL&bDE6~a^*KzJtd;~;Xt z_7ziSkaRBgPO#;M2KThC6t#Zt=AO2>2U?m4wDRd5Gpne|rl z$Muxf&r*>YG|r<35^!^9f-e=6;|JPe0W)-Shl%L?WjR^q+NzZ^w6JR48N|#}oyrO* z4Q#43z>9Ox2THpW2afaln{V+I%ZT17&Am}#XV$NAe5ZpQgn0N1Fe-XMWY;br*=v?P zo*g0sR`_nD!>`0+r(AWoSDHQgUj+lFwDb9TNfAuLC%n@m&L<^1#P3R<)z)ZAtR=>k z)>RTF>s*vn{(7?ej@|z>3`D=S@qi&^L~D3fODFaFJ*j0oY_E><^k{3$k3Cw#jXJ!( z5zf}pv~S$sLlt)p<3**$Dk)@+LzY1W$Fh2?lD4b9sIVA0v)*R_BGB16pf3QoiEOn8 zJtO{O*ZONpPir%qx!jyJAzEb-(7Nuug_(Lp$ z!D)2rzJb?UhFM2*p6mUdjE;RQf4wIfH957udw+4pNi3tq4jgXaVSQ!#aFIm$NB08C z&I|;~Yl5;(jxJ2|2U+K~NnG*?-mqh_EKUYN8)~Co&#urjGM!T;H1+< zOfzMf0_WC@&tczYyy@|IjXWtRq=R>B4rc8c3x5S!s@f{5T-uZTH6EDoaN`Oky7U)^ zqVtqp&f}gZzkak+?Ai&QM{+~UcP|Wx0y)M{$C zT)#sL%7AQ~gldn7 zu7_hKTaNHg;zi?C{2vFzFP9&sJyg`8{p-YtsRNJ*wQW0IU065Q+Gpi46&0R39;o;*1@>8CE zJ(r951^`y~0U`6lACJ%r{AK%@iK(nxA0RDZq35joIf*fM1zJm=VmXB02oNEk<=Ml|FjIZiN>HJ!T9hK?!~wMa7g3j*>=Jv&f~nD$4Pd% z@~z^t9(xV>EYoxm!Gc%b!7a~^?(FA>EOwEq-2LkEOwV!AV^f=dtbB*ouU7W zwL6c8djJ22e@-PuQrRjoNyxqxS*J*{%Pz~1Em@$~N}FFtUt&mvu0V zeHn~>8C-8VopV0l-{<=Nu0O8-o0}r9?fHD(9}q)*S<;krPKS8-uIQ7ph+>bllKR7r z;Hy?TZur6`%wb$dUfIaVNRtFQXIt$u{>(7DI^$ZBF%_%gn;IdkCpkpN97vR=1nYNq z4j6h=zpQ&dwoK1@Y#tmYR_-BAe+^fm@@ei-xwx3Sbr5vUB3^Xmv+Y~8_CM3s?%+9C zH)z0Mqv)420iGJ}(TZCi8IRQ1)~he>yn@rU$fA6pF1c))(RsVnn&~vEW-6XA|1Nu+ z_SW_7j2wLp`)GUtdB|ZcKrAe+12yaX%}1W8AKflQB)gQm?YHjJEdRlA%`TS)Gm zv^&b9J^pAV3rFfdDXY)S5N%<`);8@psgR`yq@?>&eO2V5dmO{p$8?o|b0L@JOwN@1 zAz!2z9+i6M9$UDU=F8N+WOc{8kZiG21KM2ANdoW!XaUHXGv)8vJ^~oW|EuQk(~Dc= z)#MK#oBZ=>Ho52TY;ptMjmpz(@>1c847SqO`7=fm`@JKCjkvs#-(Hl=r@&y&z4S_r+oa^@v4 zm&(Hpgj`k!*Haz`9yqqL*RbyfzM2jf=BXE!oM%`F7pTte!_0rujQ_$r_*H}+}m z8L9fFy&-yUS6BoE^OXPa=2|VEQa(D*CCe$X-Ym^(PQ|q?!~-H9vqdrlF^7$|veu!K%rTEqv98!!1VZK|r#;meJMJ4UoUi3ED3%h-^VGMHy|y*n z^E_(MTJLAY!HO8*K;LcQJ67eeAb3v)hVA7?SoUSo(Y>G#?EbkW3wxHZjef2VOlTQ9 z6~%f{&Y>7M~=IdE!8%4hB!YpW*~nU40x=9aF@u zE#K0c*uEX0OF7!ngSteiT^BL=bI)%MVubY@8mAj}UD_jV99fgAYR%Dl`+2n|$t`xl zW*v@%#IUo*a{*^SelQGXe1+U~`KMdMN`?YY*#=Gyp|}JnwcC{witZyEGn?JgSx>7j z{W+s|aj&syR~SB)t=>5_Cz;ZwtIz6iU?Y4mz3zc^`GVJS9S&1mS}Ml#&Nq?V_53qx z=8Wkbd_8FIo9xn^{iP<)ejVHN=&)CVjW$VV{cGhFg)03Lr@HhGR^7S|mM=uc+TgZh zV6v=Z=6lGQ7$qCE6^8A`^@y^B<$hcnWWNfe=`iVscWRWa198)NBDdZdy!p99Rc4fP za^K1V?pwCE1tQYgYemfGfT@w4)lbVM>YMz#%E-sFL2bO8+an$jD`?8<;CSG1j+aZ| zx)Hw~9^b3L^EyNNW(mB|84k3zfL@m(`d}{Em{{-)j#W=Z2~SMwZUfs_Z(rC;QEVaE zanF>;g%UT(`%1eQEDvXA31SlH6Xk&X5Sjl%xm$RjD^!q4#dUkwBB+fUiW%8~Igi@O zLcY`tvNFS~*6qV$y;j)v4=KH;FU+NQ7I{6{TUa_oYAekM_0!VK$rX4~Q18wT>^V>0 zz;cWXps3JsBnFh)5U=PR?^W=;(W*&S_wnHz0d1poUh$bj;#KlUMXeOOMv!9Clc_BK z{59*l3Zq}7gw rr$2_n_TtSoHu)+Rj4)`93{mD`+UV4lZV(ZjP%Sg-kh%{BE>va z^~&HCtc#lyzB!^Z=rdf}OhgKXnN}m+%<%y=l<5I*$=%p)JaeEdR^7jft|9J??mmrc zixz`S0bs~*_WxLtzGfyuRGI|Z-i=MZ956Yc?a2jE<} ziDz*YC0}WAH`&eg2hz^HLQb;rZ(K%F@S>J7j=E%N77Q9Uu&{>sz;%=?~kY{ll!;Uyqt2p#fs9Va-o&M-BI%s4G zejS{Xu95^W$$DN)K_o_d1M)wv<~+_YzW>k-XU6EqyzJ)plVO}$gx$tVRL63!P*YUBgY6EI&U8R;Q_pk zbme*@OUs)Z(}5w#F%w1>&PIYg~bB!xyx32c49%B8~0?z<^&V-xap33b04yqxHM(%wy4P%g)vl(V@e z)qX(=i+ne`|0tg}-~nFps6}fdYcoyJ%)PtZ62Y=rEZV(6O{)3N_8@Z#CHOPCsXG1Dg$VWM zW^q$Fe^ZOy6exOLjPZ(C4veo6VLSg#Y=?C#ZGI|ve}BHOe*CZN+$XQ+|0;i^7SRz| zD_;kMAN_DV4Hjqva?(UwUs`lP>d+|WkAnN|Gt zxnH7)egZ%*(*yJ}C-(C%dfCUPegI>{ywc*vsCB(qs^Uryb~8eOXF-;eZ@Aw^HG`=u zU_xZp&qw`RQ`efXZcbxxqUo8&AL(_J4+p)wc}l0BrK}D7NS+ZHIV;%&Ged2f{E_k4 z;$Xlm;SYDtkzuULFsAcTqazmAN0C-sN5%x+fxXq6&FB{RR9AY@65kDc! z`-wr=C-9Q>pxJ{+vt#O_2)&+A-xhKj;N1TF%fWhEaqx|S8hHytsoo}GpWYSPxdgIX zESnJwN&VDA#&tMh*@&%cMbPT`8d`>Rq54pkWtQ$$9-tE3HDo6zeG!AvTNGO@3TALB zDd81>?S13DpA9d-1p%!)-aR53X`y^h26)FeA~$XKW@1WBJ|wdvOD2{?M;h(n>h#*# zDQeQkwdo)kr{===UBfx)DL70g9B~9LY!#17oL;gwyq%Hvv6#x2f5QWNpj<$2TI9)Y zY81Enh1hN(xg;CbnS2=JRdt9!#c8!vIp;oDxgU4aM3$_xsBpZ=&)+rly}OB3F7%2k zMXs`CADq{iq3M!G%ljkg$6gvhF!kp*gjr!zi?(NaeBrAA{Zj_IWis`ktDWnWwrJ1O z`iOjd)y@zh-wJcNgvMIt5Q(LS69zGLqzrUJPLq%)-%-@TyZxJZh6A` z$qZ6f>^Y=`$Z~vJ@9FcxGBTxdIT)7jH1D5sbAs7>TFlY?ojm2UKyeZtQKPkN@v3Hi zJvi#6wJRA-XZ(mFO7;q5{|%Z`=EWu-_Tm@83Qmz0N}A7J-nUg2o;>%XDaf5?6OrVS1hVOAI1RP z5Dd4OmPngu19O#a20xMFXyg+;97CO9&ps?fSJ)h`@x94^9RQz5(~mobWycDZ+*Pb2hpamGapNyF*gCtMNPsa3m=lPpOW;G zd~M&zomUde@-7>Vxmw$$Eqa^vP?!4A<=1itvlri`^{mt!OJXK>x&&CK?;eZG7PBa= zwI=7*_D7s0yo($q|G4G<#Pc9}HIHw$Yzaq`=xpn1s2hQz&He7W4KcamDQ*49fE2XBJ9_<)jGISBdCtktvz z`YCGL%5U?m=BEH-aHIQvXFEI{QbZzWm^{z=t>%+;X2Kes;Y1)@`(O(aF|!w(s-tlt=(*M~DhEtg13_;OS$#^O7P%#dBscJA1_Zw4`4PTgk-kP;c0MiZRd zQ94YD7Ar%J^BQ_F(s(zSbGX*ICPYq@?7^b;f*-Fj?}6r|&ZQ(#_y-W|p7#bVhs5p2 zN9Sltc4LYpD6>5$o{pvVebjaeHq79a003Ft5uA2WFOwe!N{(l-H@z-SdRSXBFngK< z6R~u@k}ceq;2t-*aG zA`|z(MGf6_otiLkl70f+KNGn!h2v>8L|gs5e<0V-*) z$f$q*90X)aFyVtq@T5a(c;c?9%4&v))-Ccsc5&$syFqV|r_dXg7s9>ASFv2Ah81;_uLYS$8W0n^z9eI4Io#cn8X^;SjoVly+s(JqWXDW0($F72NgG=7PYA4i z#ioFgpCST|nMkRD<2do>-lXghrQ4oy#ESH4!RDpn8KZprocT}eEPD2jwaxDC)$UDt zn~`6lKj-pN@{wT6SvSt>`FG`t{g}1MoXE|z*1PN80mSEnQ{uCi1;LVVLg5c=2?GCD zVRv{Tzt7^_PmT9WEK%yr$XkaxZ-D(@^zo`x`^V{@2%{T@fU&G}Vl0bRUD7KWCXY&5 zPFOZIM3fVs7@~e}33|Kl=tTk)cba^eQ6UET*;d{#4@DM`XUxS5h3S7#(~@6kAfX+T z@(a-4(A2UqRiG`D`BuINJ7W&pWx|U#s4O>QZ$b8e!y$q2n6^%No|KOFf*pxJ1InNQ z(VI*_Uy}>>ZfVPUCP$mT`c$v?`C>%;4&R&+pLo^H#pnZxzve_LS6N~Y&b$8p7r)v| z+AA8noJSF3dA{9|=dCj=o!PK?p`sU)gIVsP^!5RDMNMnp?|u;>{J_fLaw-kTM#HoB z#s#)xcXLhMbC>AT`xpTuxqD0yYOMSq>ny~PrC!i|R=x4`#m_x$T}17~Nd99>!xpC= zsw+Dq?8v@H% zYt3{7r1ABFWAHB@IsUwRBQjujmg9lM9+!vlDBO;H=712{e8?~Pw0K!RbVyGlnil)0^GNh(L_2{XQ7;D|7B z4Ps{ro1Wp{JhD?f7x>EGJaYVBJhBUU{Y{k<9$D`fk32oC>v6&($DZ=YhDK$YgKWyc z_h-+yYJHgV*Y^i%M?QLjS)JV4J|18f;Uyq1>GX3a6fEm01zQ7jMFgBNBh?vf`}I*z zJdHX1$@YZ!Qnz%9gWf#FK|36YZ-e~9XZ-8J^7&{Dza|84o}cUUGZ&fPUhy*Qyo<=?;F1%?!38g>ST03TWS{FGTdqn&nS{$pAN&z>*VQ}J3;xa3zjP8dpxlQIKu zn~;(&+f0#5UzJbwbos@I!~Rwqk>@0HMDY5r3jnBuP2Nfmzio1v^f+zUt$vw|GD#jh zl6?MMfjWWKY{cOu-I$o!@t+>eCKd)+AN++^edM)h|Jg%;%n|tMUPJyXbL7|Zi{QI` ziDZs((O}^}qivhp!q!BH zQKQ{P3-NPcjGfA|+McHT&2Oz{^RBy);WPD&wMlW5-HPjv#>q~sc~%1oIt0;cHntArMYeJ?~X&=2^3%?16P40qfG;?jEuwi`a3NDxuQr=-xK>$ zX*lZ?e8R+A!TB)XPI__tK(9lx`}ZbvL&?Pe!wu2zq?9h_s)#R zwHe@p`kyi)u2m*~GT^Ws`jAhm5V3MDO+#czw_;Qn2yg^;s}l&iZM8iX z@BAw7o1&l*fW(*lLgKp;ej=?WWoHAxOkKrHOvz_S@>oPMBZ<=UTo6LFL5zTt`0};* zjfv5SxgfsQ+rxVl(TrEHQHGhd%&!8THOHSP(HmD$Dwp-xlRZiYc_K}!A7%?sgBLS; zpAS>P4*GQE&;!tu|T2v|8?Qx8+jM)oW2@zmyk$d^Nea`{mG!| zBGI(>^^YSHxarHm=g4V!Xrv&MW~R33S^U%2L~D2kX!s(5ixNBkrtu32TO_2D)9JsK zI`+8481+UNsVN16do`70CCz?~D)cBldS&F=PYzymd&#dw+dakU=MiYVfVVL z*o#x}!06+U)Kh}*RCvIr51zAyLJ>izq^c()EcYx4!1Uw)ms-cs{~xuE9}>yZzsfUX zgAu;JobP{rys4*qxd5=29|2hR-+TGDwf)PHMbBmZ^afu)>whcI@ki_1r)QU(^4N$U$R$zB#Jl$Ay-jWMiv_F z|30><=9K3Hyg36;_X!sNh^qt3I`*i}e}sM6?gOGiey!wyiER5{pC+1L ze&D?cd~ z=dO2TZUtm?(C7ZUdfPX?0M8^#z`*LPfoe-D?)MIG%F8h!!2Ur=p<&zu1=JO{+(j{ z(&$S7qv8RoaxT=&PpeWVU=oYpc%%6Hzdm{%l+E;GV z>K8;D9T-6p8K2B*mhp3z;x2EI$aUq>Zr>FvK(#wL*-RhZeWtu) z(K=GLuKsE!-qbzUGIOL-b&J<9rtM*o(~0M3W^wQ2k{}0^u515Y1-SPRM+)ApK?6XS z0dbPDhO;ru+kp_@ip-gYrIlDoGBnoQhJw^10Gp0y={4BN$r=rd-KVr3TMR#Q1`xUwB$imv5w2wmRt#d z#jdb-ip(wJKCm(JYC*j6aKRAq?A-;G?!H6^%t~ZUKeIc)BWT!?cOBBCVH2)YleGw%OHDQ>gj|dF(H>n8+zZc{p@?RK zonT`q=gmTN%CV=d9YKcfeduz0MTqcl`j8deE2z+<$t~#+4~?bq-tSwOG>=e!5yE`e zzMRWV{Hnx-QI{GQx6gnwon`K}e5J^1`D(+`8LUHBbpbgLtzBtA`UcYj7a_gaXqHwJDL8teS&zzd=@|(G8)?AD)t(N@UkC#;{aVS zJt*qo79Tx06bo8{BlDwU9Lx0_z;5aB^Y-dd}H>j2sEF$nR<+qQVP}xZ_{0`n50y_1P zGjLk=lke0P&%b07w?$|Jmwn0(58QZuWLQTbjBx z5nYwOlNs)$s?it~gNVOfiD~>s%JECW6zKR{`OdiOY^&%Z=fuUPFazg!)sMQyiUdT> zVX5m%#SPzWlXboQv(i>u>`9AzJ+H^^bO(Q$@j3pk;+3!CeYka36;NNX?2K;HSJPPN zNpyxUO7yrt9kt9d2tG?GUa(tBiGnD`3k>%@;WhO>T!M%k^@PEyblf-RX~83JiNR%b zsPncy=2>;A%zLM^T7N3A+wJ2a7*n7G!C^9}^wAJ689sr*SA|i>%3CJYpwWfBG5w zoa@4cm`uI0hEw+wo2z}w`^ zZwHDSf7wl4t5-up=c%Sm5U$GFLhdJE*h$?(Pu2KbBp;xVMP(rxuGKT-mkzve)@aJ! z_9fb-Re0?MOC=sIa-v(<4qGh^GL=$h=gBy8b*ehX2WpNgt*m=@SJ8SdBWQp~Mwb3V zBol|eomYez>1bQfTnEe7k)Eg9jm~xaW;vZP2)SJCG@#psb(aeFGxl68b zdd74Z8d;)8`)+q6ps(IJ4&MQ)5vmn`1O%yHp1<;b(2{_eGzn9(QM!UMfmi3Xe_(q* z`h&pQyU(xM>cN~n)m*E9COAwb2tJZa_@F-GN}WWGXK@Y49xvnA-ya_>mI>v()1J&=lh&fTsi&!UawRg1KMdlm-hVwr z3weWUK*)F;^ncji-b)1bpDcQ%L!AdPSI*XvIC!4aR@N@Whb282&?!za7>4>7v*arg z)@)IGPXR9ZG1X_iTSt>&u3~LPH)6p$)Z^Uxz=lS)f2rlyUk7o!{^$3wp-!I^w+OCg zoQqRhD;4Jtt)?CjWv4!rZ4>gfr?96!zmoqyxa1-&<5MpA;x8`QYVI#C*<2@D*WrXq z2Hwew04_QIluKT3sacn)2k_BMqf;(F+Xh{ahfJLc|2AJX&uaJcms(WR=S-pBH0tY$5Vm6hZ7uFpdBX)(+xd1p{YAvhH_3s6xfIgK_7kRll zeJ)BB=Rmby8)g-E#m~U!aQ8S{!@#}4>+e7Uc)ljiJfKyi&FT4YC{YzEpVg{T^57MY zG{80cuU-+#fA@->#*?=;ISe!UZ|{;PQNJEnU# z8x$4V$ehhTA~$~?8xo7>+eum+3^uxG2;Txo>;B zWIbuG)n!+8m>fpM;PxFynwfUaLF6So-k*N&yODAlz5f2NR=P!o=`ja=d|9Fg7wQ9+ z8%XJVGx0^-NCFTm3f$HCY+1YJ!z3b11_@Nu&Y0f*lJY{2wc!E&_=Byx%Y$+Ta##l zG&x!!G~GJDzie2WJoS>Dhm6@yykxH}O;%qAhYm#A3zWp#59+x-qXDc@Jq~bM?%7r@ zxPx?Ji>4?ZIxC(PFB2Mb+`xH}GU{`cPOC{?-3j;h^$^fj;^=SbV+XL+Y!)oBb_On9ogqK)dFiB0Y`=tXzoAsDx4kA zgIWUhrt6NJn{|1%psIW0$4Ao3AtT&}q&s_aDcbs8TQrR!D>rKpMRMk?NgF>uoY1ur zu#)I4B&92y`$^ss)zzpQ$dHv9Z#4z*vg_BzVEfC-(Zj63qyD@Nm8M$Ok{`0Ws542>+ymu^ATj=KLAlY=2ogO%52Vhz`uwRIjcS>mXn zo4pEQMM)ZzFWg2)8KHJ!7@v`b4<18%lUj2zh~h5Eobo~E+o@f+yGZJx!iM|+@1ub&-n-dvYu2l$RYq;XwneLhL`%y|izWo*v{u73sN}lPG2%Y@72ys37!@jC_8Wg zGEBI}iL->VEB7&2>*GVqtl`2(->Y?No~nAJfr*EfH8y*|7dV;xo&*%fw@p$>yj-7e{_M(Y`n*MXa9^bl5(5zDs{!c;7$cY3L?8TkvRC zmY#0KfgV!IaBa}gBYJBq*3~`0b4?oEE3|$5b1`c3I5rk@cDze-W?R9dVruy1Xt`b4 z!EB!pEq2~yrB{L1W~z}J{k`T;sm&L$B3|31zGAW%m83A*leZZLnxh-y&r5k4z%-)~>hm$r@=U_7n z4DFKO9r{HlSD<5$x4h{h*|1QgtICG^RnS+4CN)iv9r#f_T#f&0t~#wIX0JPnbZUx1 zSOfXJn`zlPm>s!#B(#dv;92fg9qMQt$txSL)Im4xv!gY)KRR(v`S|su#TKHrs)fw+ z=1dNw*wsDjfCtP-&q4Z~0s3WEgfNd>#UXO(+h}4z@IL>%s516}>PRzV!LbL~%2uo) z?0flG3b^k4PA3qS$w=^CRoFLLKozV2pDLeb+;|F2-ltk~F-L&jU98<>AEJvq75Hu>`?^%kXmC zIu7WDcS0(z-&SC}_~(?!RagmA&wyxEg$9vJy{VAxU_vwSej1)-u9`c$x)XX2dR|_Z z5R+qnjfdzLqb$g{^?1+2xOCIEOpMlvSMN zZe2>2X~5|7|H3$(j9CD7vO+xT=*)BYKjY&+@|!R$+M?}Tv7CZ!A9!nID9NHTS;p^L z^e~Phrs;sF817`eFI98woQh*?x6|k!v1<}nYRYc9%u)mejC^&}>jL}(^M+!CSCows^!SpvZCZhS%MVnGG%B0HkHygS(K9e7B1vqfKF~XrISHXRXvwFv1!i4$M@g7Xyt>P3x^V>9`rJz8m=9c zv6f9lo|k1pPXy+3XAe%3crb>@B1%fn} zk*lyH)_EDB8%;j_;~uN(Touz1=FyvZZ98}Uhttu$&YrC(5~O?F-5`+NrOnCXiSDuc zx<<{u+?G_gh}SL7L_^&Q9$hnz^Y(NGZG?Q-*yuVA?jL@p;0+DFe0UMLqGeswVy?xg zz58SexD6U%&kg5ffb2glW{5K@hv~mIwflj@&TVz#M*D<5l*jh7M~+8VZ5BKRq>rmh zgX`~D9}eA1 zNEdXD`v^qmV5>U2Qak6KBw?Q1A}GG7HakEJJvTuNO)p_{69>y$axc10z7sJ2`l)yT z82(p7f`kcvXNum$dL{1dFTpvJVe1PxAp61Y*8WL;6m{4zl)QV_uud40(3dAF0nb(E zbfIJ|j%Sc5p7f_LH=unYR4BuZwre17!rP^{@L_aIM_%W|kCvkK#*5OFq9_-pTB0q8Fm3&pQ&U;PHK=*SbAxC?iCH~KS;Nl_0?>xFFH0)kDbF2&AR}cVl z4IKDkMAsBWvqFC~y2DzkBH>2^kJq#OVrj~dgZoQ;0qv#xp2M`X=gI79v;aN14()NY z_v)9P+&+g=EkkGmdUB3z?5Un?ej6J=iTFSCWU=u=1fD~GcmyL-c7XwJQ`d0OHUaIk zw0w^fh^d~>vP~`h6e214GnF3ErZynFYSHA@gV1+uUv8GPxVUMA^>v(HaS>IEPP9}krDO1Q}^Da z5}wj)zF@!yL^W3;Ol!hZ$p2xxu}%SD9JMvbb?Imdv@>#MS5pQUy6c;d6greN836KZ zW~XWmJ@A5ombMcd)>SQylAWWDeM$o^5Tl)+2|+uc%|EFwh!{ZJ%*u8kUkk5*na)hf zt9tsk@zzv@QMU1d0TB#6+bbj>k_oyyT0Z25eCGx7YjLCPtV108#G6)U(n<)!uM{Oc=@kTyFibK?+J-#+$W9k><7= zIwfv9v~dgTwhDEAj%p>Xx%iyys@O0srO@cBw3i>F>58}li+?zza0jL_tn0k0oAh&v zb-3EY#4EArSjK%O_&npQU_Hpeh#lHI!N%AoChahEqo)4yK|z}xcG+rYGA&GUc}5_M ziwVm~a z+m>`e1-0kt-D~XTl3Xgh)w7hjV+!|K-yEBGHw3;?8LFyVf6A~vy2px4DFPb1-|Vhs zOB59-)Rb3;;7zpYt+wZ0h>bPi?W%6td>8}YqVQ*^q3Q_uL1=nmOz&+=2(5NazG*JY zo4mlw`-Y20HsV^d*t=K`SLJw{V7cbjr;q0E?TV&svH%+^{kD2W?PeJ{Z?AI<s1WaXME{$lj;f4+%j zt7KK5L$H{f+o^yZfAVj_$k1?sU)Zyzw{8Yme;Iogl7cVYWENveo|&Zo-P5!;bb=&hWhYOOm{Y~eEJwm6=lesu|H{6}ryL=~v*hbTSdmOK;? z^6)idK~}daKRAtiKdk)~`MzYrjpAU`iIx@nci!=ClBG&nm8pcz*J8zVkn@s&F6_4c z{`}KqP4Adsfz-G0ji0A~b%mBQ>&TV8vA(D2rr*+1ysZ|+7Qx#g`Xgqy8VG#P2Lj*6 zaO=ntDqSRG?vsLDza>T1xYxX5{S+#>UoLbM26OaLN=NJE*<5`fMdDg_5qvMkz)FTy8Xl1F;TBxQQ3-YqY7Qm#P!u%Rh3jNt^s=ksD@zXNC1#hf1#;1OHbqAQ9)fQa z65i53C(a79?M+KYvP>ICYiey2qkwz7LzS_0&0*+~?=Eqp>%r$g>n-pDDmIC=_2c>vaA8@q`}rj+pJ*W7iMEF@aYY@3pAgEU3SX z5cWRsj4%aKgHfLxtCjR6te~X=j~nmmor|VWwFDwL6o(RB#w&y_3Jg0NDQ*Z$19vz* zbc~jvqN%2k{LgpGKaC@Lq>HE1+&>B=(b}3ehSM1M%6ct0G(4pZEUsY}`d)_{0~Q=} zs${`jr5;1FgUk?y7Bhm4lPxrOgLXp}?4GV9pSL6y%&PQRgSg(1Lg$S@Y=%ReD`tX} zgz{M5-K)<^b}uULrJW5-@jN~>$By4CyPsd#I=(6N&{lsmMG4C{Ji0<^&7qhe)X^sc z*US=D&ngbKu0>I#4^Uq8V6{{&oLJr zksuXe^Y$RLi8_e;$U1W6{eyvdhd>I-%VU8mN8+tu2~;#%JDGP*{>k z#*McK?F4ZXwi{GFRxdozj8vvBL!Ie;$F83h97=9eynar*JLf z-aivgb@$M0*`)PrMapW0*tk9x_(9mbGcmPW^iFw+l$*!e7JE!ip`X&*z9N5E7<@^B zWcY2TX9lpQ^R=>$>)ubLoIJQo9scui((!<^dAG1b zirO3($E@g_7=MY%%4$7jR&|~k9{;D_E5m-eR*Ay(y7X_(nYEwqFQk+maG(VH28B^N zP2=5j7{TRvdgCefracKW^4{fX(arAqLl4a`%rx})6Ish0VXP4Lp1murm$q-cG@NxAYgZU-Jijx{T^+%&#l@(QYKY~n} zWXb{Y(a0C%OcmhT3!>sKzz$A<=5K=4(b|Wui>6scwB6MJ%`j%{T-ze&%E7v`OHugh3)$M z{P0Zl&H6-Zk{Zr|3@^z);h% zilwRn=UP|9Wcejo>p8ky5qrOun$gkVQQuGMq;sHH}cDJs;Ai_?u4?JLS{L zXIj_qK>n+rHZx=@OZah%QVI4y{4_Przx=e9;<_e3UZ+~~8`>w|+@A4D*POZUI5Jgl zj#L!3cdBN+DfWJu(*7Kw5)Bl?=V>A`9Zys_pwW0SYue>ktKF97ulu@1;zNQUk0HYy z>2DhzsV61DA*SXgps0$n-XxP#ul&_!EH&lRqP{Kt8RS~^U7ONze`nM|n_f>$ek6|K zoZllEzN_t_Bq@A_wJh45n{1g#)`hi3qCi=}OEi$cym#~m^!TdzuwDgm0wflS*d_C@ zf+jMUZRKw4J_fGW$9%~8AQVdS*j$cSkjhC0T7Hq)M#;Ea5@ozXA8F42Mo-wLky&!{ z4kZoveA6qls)`T9zHQ%RxohM3vasc$LUf|`EOo#w;^PQmkHW%$53g`;9ua9H|CISH2Fr7ky zEaQb+r6h;tUOLY79ttUG{SP^mplL-vq{U@90Yqyv!<#!(cWeww{%7nk{o+-PeAT+N z+%J%#sr-AvK=}1-Z)xi9EXy`Z&K#QS^E0=_Zp^yY>w#}hB;0ay61*WBx=XEb_v~YY z@j9({DE=lBkh?e@HjTq?KV!x%IoXOh?9JetA8e+0zI;K5IUF~GZm&*36$J^%^rXD} zAJZ$&7#m1IT(ib#MsIak*=Ldm8;o);aR0CwA3Z5Qm34G4W53v^=*J?rbghk2zGe*K% zQjH0>_IOSkInVpt;+LUq3R^9f$qVol_G_g}T07Jf8z>kDyfvWwQI3B)RMS8HG;`ZO zNiK3_1M$@os#s98@nKu&6W9q>T|MSnPmxDLwFTvh`O@@t1c7o(jJ;%8Kc&Ki0d%W7 zSyc{~D4`+16TEQ3=6Ex!Ko;h511C8umARtUI=AemlX6Arpj+vD8^16GK96YIUv4)Q zbV%un$jWHLBd{Z7Ms+VU&O}z;5|cAp-__N7YhL*N2mSo!78j!sZ=C8gEh96X{*irP zw+ape?a58GZ%I0`V`gNq;#RY{>)X-F#P@+7(VRQnW!XNIa_DoO1V1|K)CaUTsCgxH zzvXHU0gr!k!QaE{_~?uC3u-tcRep-ZOhZhwTNw_2-VbAAXbmxtv4uOv$KL5qv2>f! zd&m{~2r>BGl9GOhVY-x#eNEuTJ?f@*EO4%K-(+boMRj;P+?Zwcii z{ve%aZl_n&`J#Uz4D&qIv*fTi<HF0xY!0EtebqS-0TgO zu>BIeVuoX%Vz8d`ue-0HLe6?ir9Wz0O+jX4G)$aX!ZNsW_pktemucv;EoXxu1)ihz z^2k!>G+I6R`I!Ltl`g1X4Uwt~YL{}S>5dMg3bbm{9UQ9WT*&Xl(dE5uy-&OZ8I1!R zlAe;L{$<0s*VkslO80>7t!8HkewnI^3C(0Tr=Z*(jJFB)fHHVi`7d}uU zHAVbCKJvaQ`QCHu*0b>f8F43u8)zX|Aox0?%{eb#8S1vT;i6$ci#n0`HiQ0hk=J#n zk%xK20PkN)TYnqXiy5Uo8HsR<;cu;|-VTD2{d3Capk4KzX_=Y$zPxp+qeoQWhYg>l zB0W#~044sT4^Z#ZUxR^aF7JV{evV|It?eN$;Z2K&e#H0FCO}`MmLS=5f}T5Vn6g5C zI!#!re)xJ#XRIf^qUH8f!r0Gby(9CARNQ)B@i*}oqRCP7JWQzXiuQ&x4$2DRy$nF4 zEl{Jy{nr}pe)Vx!_0C&FdiMHZjwSWY&qMd0p_Dq6o<90Qf5ke&=ux{!h$wEpJ;CCS zzP=u|&RuiI#`~9pbboN&mJ^65e%Jjhv*mlj(D9Z*4y<(WyWUQ+124mTSIU@|m0xx5 zYeoY3 z`0+f;y>ja-N`zY(8tJL(>kiY#^vdbEePzNIxW#_(?6uRM(-t41k~EC7DIxIO9FK@` zyv(tp=rW1h^8KiLw`GQ)QkD3t!O-R=BRkMw$OSYQ7Ao*=oUf(n@(IdoOMcnuhU4ZK zsxb1|08WSl&_{%+TsB=igEvvdUB~wtwFdhe)*llWVu%-y(jTe>3tsAeCBh#ce*Jn6 z3xvvUA|fX2C9^fUfjaUE!xayHarBd6D@v<*KVEttii@I-H=z%}^VjI1>hs?%)?L-s zc#v1|wqv|y%&fTPNE5|rPr*q!Z~HiU+vi7j!1qE{@71)D2mH*O>_Du(YG22Dx?1@s z09JB}sFO-qm}jz3l9h1(P>M$>dyeMl!MTJHpmOzA0JtZoYmE zFz0SYQWH())ySSIY8om}!d&6&lu7ki0f1~#F~lVw>VShmRz zrncuOC@6+^n1$*h*leBcBFzrBvWE54at{6<#@;%t>Hhuuzf4pFR0ISBR1hR5A)_av zgh+{W2_uCuT4FF20TE$zNQp>yjULk7jvCz!qsIo^Z`AAa`F`)?cO1X_e`0&@wexkx z^Z7WL7e|G}TG2gk5DFs1TegVp zT*hC1+#}@i-NStsn|E9Z_hu6v?kcv!#+s&=R=$i?3_={@N-;WzII}%dFfutM8=2_| z=SYi7^I~*Vi@agjb=`jGtU9y<&=;G6q3~_+&lW1Hr6K*<=VG)No89@FgvsV^%IrSV z*(>Ul93^Fi^o8}PSt4SAAvDNXI)qTAr8g`7?7)%g#x(%kmlckRuG(m13Eu8>% zgZliJx$NT=*9*P;uR_G;RFsV#Sd@wVSg(gwYJ*(XyO zL-!+NXo~EU6MDhS<0nl7^n*+cCb5$oVX-(J0NQgiz7R_XNK*66C5&?uE%aV(#Z#fb zn_hokYInR+gJHL*|JHO*;J`NkGt);qI)T<(+k%0hJ8Z-1uutpP1)eNK3?^JwR7T9! zHg-EjUOxc_)I%+bAeq^+S53@=CRJlM2~WSdW^cG*ik1_Grehu-P)Qy6HlRIuMne~k zs*;|6=0C?oII~=#ihdd;Qb$&zZ8~yFN`ARGC5L~Ou=wl@jZ!#xy2UF3F1o8!_K8kc zY^=Z(S%UPMoX!p4W7RmtLK?kGLeI-;EHCV4xxjdmd z*2aHg-KkZW@zE&_eA~NuQE^-q*b;hVH;1Cj1PvU%vU9}TS_d*n^0#j4Y7-GJVkc&r zF7f71{=?K=>dl~SZ(2SY4RrY$dEH+?)LWv*F~6-jaL(OuE7lw}q;b8aK{y zCI=MHe$ZLPDOL-jg~tTHU&09lsv-JChF@K2atdy>=}wFDo##b7HM|YBc-7@2jcohms|X z1M3pdKFbikFomM&cKPq4h%9b!i&y{i#R>$n`#_NEcR}TZ1A4kVijcb{gc%^ahuaL@ zfeXgvX!N>%FpSxIm3I11@3s#Nq3n*UU&n!kUa!hHh&DpP5H0c8&4s z54Y`k(N`%?c+6Bhr35E17lPU44>Hpa&KS$YKe_{XzFtsDH)$`3N;}0Qs}yVrlLJ!y!QrB3NDw-2!qbSBceWo;EZ{9k`)%7D~jn^-2sITEX4H>v(7|m{jzqzoI zr2%_C2{}IEe!7Mcv3z;;VwgpP`MAx*26Yu5J6}n0;~TxOp+Lp0_rGv$+$sfWj2k6~ zdMWNcFmSE<7sNrFh%5I3fcuekUQEi{Ttf{3_)Z*47ea-qFcEz$DJ#BZ=>01Y)!LLwY{(nz&+;vU;9sV`qNI+#R#Tni+1zT03X zPPl{}8hd1!6#_{j$928WoD4aQ8*Si_`R2#4X2zUARx;527{<$)72zNT>S?UVQHTqX z(2d#$Te(iZz2Fh>!RsRr%eT3VC152`On+W66`P)huvJl~@HVeQ$&hm0E427J|i}w_ASv!ph+?FeW9V@taMD+BGU8q2lS6UDEiQqCa_BTDFwdh~dw# zz#|RuZG98@wfj-IOq*#IqF8Bcg=^;9$ z`Hu2th%icWj(dLdmc7MBOX$7qihO4EryqC*WPL5UX+#6BbHu%dHc+b!={>-&Q3b*~ z=4`BhgV|iM z1eDPYW8@950WitU%)nZP+89&ZYvnCiZR$`7-DO4t1*z)Pjs%21iqds}F5awAzbi_z z)=<>Cf4(9T9JEnt-K_C~?I0^hxH0eCe3wV|R0v(GyMHrHq2uadgcE?>BE~-NFyI~; z@T;PE!8MbDxbjkXCE5JNpx@o@f=#*lC4iD#^2sEg=VvO_XR;2&63^9WPjliXuGqec z_lnW(2OBzO2`tn%6TXaskko3_5)B5YMQaq5cgfijp7^ajP}$RKOU8gNHGF*;g_x)K zAjd)xP}fXeaPN1>V&uu_ydS^hRkqbkUhNn?qiYngoOG)jnfz-(k&e%;TX72}MI+|` z_AUB3EjAruMUw5_>b07Eqf5B;5?TgJb~d!Y%zC`u68)06dMz|8r>wB+PT6#Af*nXJ zRZohcoHkJ)Q`v#3xIGAjmu-~X7IjvQ;7b3Kb-v-`xp^+%O^xYaSHo79yX4`ZXQ88-c|vPb6*tP%RpL;ot`e z$>E=GM%$a>gd|?hm#$Gf@rw{~X|)&!UcQcMf%C9>hp0-`eTwDVuSR3mPru5|Qk1$z zg;xR#Y(w=M~Xzm}>2mq4G@eeBeTlte~S$*ouE>{{i&ibWO0=OnfYjgg*zPkc1uu3=j_3 zLam9~`!{jRS1`{kklT`I70<(M47`-xWoy{ireCRaQ*yc-Uo;nq8+yxQD}ZC@%a^8K zd2(?M11h3Q+@c5r^0Z$Vio*BR26j((3sew=?jgL(cf9;z99ui;D!AqVDti_(oZOe; zwi#ifyoCL;+qdH2Du|P=HoL@Ou?E`vky{EA9JlyFWB6o!h8||T8lSYgdi2D*vsB71 z7WvqPafKs1G3~K}S{DKRtXUb08@HWc&0n({g2ef}D@S(|`q39I9~#q9yd9C*uD-gu z>3IgD;@EQ6Z&>rrp0Q!xlh)?(RfM|PLcEba3<@u_Dei4*H55lyc(Q)0%9!#RGh~wS zPE&2U#|dXk4-NRS&UuTZzfB}4LoGVIt`aYVW zaQ6~8u4lO6P)8;9>s7s}f}@szw_}|EAsHu=&;#dc?Ww5hO#}$ZjEO^YoJjPK8Q6nf zMHPf}Z=Q3(t=2#?F&-6xqq_m0zF3LlXxRnLSJjnbg-yxNXze{HWI1U=f8%%D@RU^c z6rUFmry?XYwj0^PgoQdG-%0+-QZSG4yy4^t)MV=lAO)yL*B}YLFLsuCR!`6BoSwrk z(K3_$V_~7$qrf4zl@CvmGq+>WQ@+QYY#8qE9|O;=&UB4Wym+gwmz`XLpTC8k^JXMi z<7hwO^o-)AJS%oXoISQq3CT85H)n9|YtYG9Ei#-aKu8_}2+23RT>lc1N9=M+23@4! z;)M&433n4x8hk6BW3VV^9Z)rv65?dU@dnpuEe@K_DC})izYQXMu}{RbPE)uw$i{k9 zD+RcVx6$ekXtUCejsqY|0`>ho#t*Rv8ZuwA`2; zO0AX;UM0@A$zqA)`^U@PETsGlT{CphrhB=xf^fSc>>yDQIAvq*e#pv#tQ$jMZ zrM(3QFhXIN5_jmTNppb__ejP+tq>kJwhC<- z7xvw3x&USCy)l=JlANXz+=PW&=T(mYgk(sS1KV}!TA2yK$qIRcAzj15--XCL*fSpG zOGQCJC~bQMx-{m3Tic6Ve6<19M^-sOI(Lmt z)T(>6z++DRBgl7`xq?FIqu@<6h>g+-uiV#BA_=+Whg=@=^B1I)Lu%4^Q-i}do{BA2 z?T?hWo9f?XrZpUXb2YA}sw{|-UqNeLz=#0*WD`>4n2fF`bb4Q3(e+#d!TSJZ2z7r<0WrMg+5ASFq`uTiIK?9yIsc1C7OrUy zypGX+DaaTlyCBOEB-{1zSM+!=Q*rayw1r2Y6n>y_wbd{0YQ2JTYFV5X@z%{KqghFp zJHGFonXX=`R@U#uGJ2K(bYxqY$18~riKw9Q^PJ!QTy2>Qt<4;K1yV&k^SGSu%nP~)vE|lyUuOZ*ZPWWIK408ZBE#G3T*n^iCkvZ6B21$tXvqi5};lUj3j2M+wdF9Rl0qF z+kQ?!Y;APNzIgI@HQsH0342UrQLUcig>Oe=PL4J-5Ko2LTBxJ0GqUVZo+Q1Ux{;LhXp$4!vG!`jaxrH&!Yz{zr^vfn}fAit@Nd6 zE4I5TH37i-o(n60KGjK5UKT=L4s=cVGnys3*whx?>$(6O28#~YDX(>hf|mrRL#4SblECiQNPqjfO) zA2XOO!2;JjTCQ-k&vNh$(%Dt&=DIE8k9tzGlR_k(Wri=0nlJQOrHy#u4{|)?fraYh zw5tj#Mkxt^w%0ENB=fjYQwD?Qhj~-P3Y(!kyS53djb;K`hV~f~`d-*9s?t)LgiYRl zU*FYTx}BMSZWR2p?0&|9bu9<(;b*aO=a5>?^A`X}=9Js92C{~C#`&LGo4y5mlHA^$ zMC2h#V8&Y?$I7a0h9VWTvi@#PX{QAZ8A zNs6NigOj@s{CpCg_uPE;>vmWtb` z*}rGw9+dZo+s2#fCE#XzRz_Ssl8 z)UkoHR79rIQiJ*rGLl#&Vq0&3(}O8ceWAC5OOLf15+vMwnz%GSS8v`F!}otAar4!T zmd4NOQG{`HZ*8n^O2dYwPDqyhgBWx%Cl&4M@*khTPOrGUo#Wk&6z4+M$e3MQh>YZb z;`R6jgbqoJHEIUe=`&NM6f4tndfu67I-Q>}*-c6tdNCg!Ow-l87RAp595*Yu&hrM| zWg+;nN=BsQAj)+q+@($>fZ7!6VAs1+?K*$+eu+RND`#$8xpgZRVP$ zZz({ZW$ZtAJI_5YyoxOq-nGuR^yAJetHVf^78opa6k`grjl>h22k1*`f;|tW$g=vC z#jzNCVJwPlh`3i;V>N@D!*0NoM?4ZeSH&GzHcQh$g{1)}z`^)5WTTx}@X*g_!)K#K zE;rmq>i)5%YXQpEAnAPMVR%^Q8TwYf7egX81n+anWD+v zKq=%<+Hw8(rtl~2a8UHz=ju;sJ;vf~VMh#U#>^+T<;Gn_&zf8&w+4+0bBlKWe*#asO0j4$z} zgwT!mtqTt^!>}fb){^NqG4ILG{T&g}ov6w;!;!1dWwt$Bh_Y7|n>^V2F!3zP>(;ScYVt)#Nt3)-UmRM?>+bxoXtgUK}y%h`)RM?HZ~9Saov&aJ+q9c#v}Mg8A)XVG2|@0p{V|V|+iz zU@HcEDc63xPrGB8O_^29lfS&p|e{D9EM$Vpi{Eq@82sFq`jp%J(L36 zb(5bhq#Fm!RQMMp@U%2>`K{)9cFKI4#mih-1LW81l|V%u0+^Ds;L3|iZ-izE*CcRN zs`k& z@5XQ9h(sxmk(k!#DLsU*v6H5O^CKiV`!>#@rv-G|(wq@@!KiU0EDb&E!W&BR>v)b< zY9Kc}c%rvD#csd;QispfW1G8jxU|aih1d5|t06C`p@qa3%{V)LSit)ewjdLcEDi}zg6i0G!h@oD&VB^Uav`?PKidZP z$*zc)k!GTokzhOJHuTJtN?3HRX*;&P0G2y-g*ozBMr6)h>`agFRHGg$WtN+D?PMJ&=9wb)vgmg!$f^6mwDc@VvE-%E| zdvY?0Fr)om+=7G)$vXFn=8*$1NSSe)7*lfg&rHZ4(#^FRHkkRZF&EapQ+o>WEDg1L zq`)>RlB(aMGpm(4Bdv`HU}oXFX5|Hwp`Ls)ZBcyY2{hwq06`@659-Hp|FeZEpmE-K z#=mqYt#%U~)JBqcMX@+~jlyPIKvH=W`@>q5oM(9>Mswj_5Fe0UbNyggt=eh4T;Du` zFO<+2N!763N>B;-aq*YItc{S^g7efguY{$R!+?eRT5~nSG-@3%N#1c?ym>V4C=nl} zRP!rtN8j71$-bGe8s7ElUDzwQv0-}Q`ZUrw7eaB(5$-+W5U*M+w~5-Yr5&i z6xao1k*)#fZXgph$!c+8ncnwlq_&;*J?s5l&Ygsj7plH_jW)aI-*wQx_jF%^n5(ey z{cPY(Y7~2>KtUrLo$x%7BJv)0{H^hW>-7}T2mI6l*W9-r2V8sXo3biL%~XJ=@FO`% zFZ%G>vOAp9*)tPw_k&S*Y@Lgn1gFo%ZWWs?5HJHtjP`FnptjW3d+4dcA$K_2Zk8>+ ztK~L}ZWh*4ftcC2KEGh00<*=)-8iKqXFX$Z|4?)Jn`C)F+-&oePK;472SiQdx{Nog z7GZ#wYB;QvXJ-_On;NyNH^S2R%J|%4?5Vq8&t2uqll!PD8~R<+Z80=BW3FYNu|X%# ztfl~=vB zyse^ZOK9CY`fv_Lj8)7A8B9bkGLW_2M5->zX!Ql~cYJLac_KVN;&oDYA!1_OJm6M1 z+0&@wiwOiEggwALzOi>edq&lYMV1$(67PA_EwR!hX^{8LXS<=_PbKoj-Qghd|; zx3DZ^-(|kmZ%Yebx;00{SPuv-|J2Pr6#kb5(4d5*y%6lJ+k|m@Vq#s)2(KC+-y~Yc zQ#*trzvK*uvbz>=SlgA%KK7a{i*473%g^pJ6UMJN+UD`8)h^A+&Nhbf1YM+u6g;Ui zE-Gc7EZq(v$DCqngj z4KQodtHWS|oA;06L|)U|4-~HZ9!0OviwoAsLu|=IB_#Oe`&{o11ND~ULSf@ze|;0E z)#0cy)?4g1DfyGi)Nj%g+6pgV%`D?JD5cdjWqctD5ulU#XwXE|!unQ2F!@`aX6YD;eiFDBQS<5k>Rj2CpvE4n?TUlzer=_% zlSpS2K69jhYXo<@NTwgYXN37FgAGS$tG|OJ=RCG!;P`-Sr%lzZ%GvL{N?cz=!#yLs zv+rryDB50I40#$Nz2b1eNw$;mCaTcaiKznjQBYHC<@a3vwSuQ=U(C86H?m4K!eAvU zMB?TQ0e;g|_UHWx9zIu&Z}^oa?_7JEHfD+DdM6>@R$=!NW!6(pvb3XDs}@d~Dn}#~ z-koPv3Ki**{>&|+hL*;6DQk11%Bf$GFist<~q7suujuO@YYS%CAcd4PS zG1d=c4%!J#OSA1pk4b*jAyzirUA@K)wfvzw0u<}-v8rA;0UcX530zcXJ~Sn>`aGoH znWF65fp=Yg6V@&KEU3=xT)huRd7b*N&t*!57brC_Dk&pMeqL% zDI<%2*vs2nRFKo|!nTBqe-*wsp2JtEq4AM(>B@rPkddZjS(8bi!N zSQ8HxxZnQ`#ED}f+FepupRRUWv33+))VL$Pd*{geTMFKBNY>WkUGJa?^2v~2$cn|d zL7#w9kvn*)N~!c45GqCB3V9Ic<6v09NH~Qg?*foyM|))_d_;|E64nplG33%Ug(`k5 zW-R4bzq;M*qjzqZZ%cq7e!IdBPs?1)EwN%zy*D#XiI=0>2@<`=EcR?dOi=T+-VF@f zM7SLn%*!<`B?9%ad+pme!A?Ye74{ ztuM(dc!cbfW0->kdp|n;d?Dw1AasW_Av;<6KI6lLI{_qtrQJ4v7W8V9-!KovT}XnK ziP!w&?X9iGkL?Ws$97&%8S0twez#StHkszEwpoMnS++jcvq}2m>%{~*2Exjhb9(No zD+)VEM~Q`!7D=CKhR)VsZ1vW@)bqkYdYr9(?nWX-kUp=_gK(WznbW=w@bnZl-M+5` zk4D-Ak)3u)5>LA%)c>PPawB|x)U&iEBSa?1o<{_@4v)T3-8GkWV9?9I3R*ZlJcVu4 zOlrQo!?&rz<8K3uWMGNp^i#uve=mm818NS3(>F~fhls7z*Jz$1jmO?Jkt-2bRI`Z~&3)9{Tpt3V=wCVDWr~ zAbt6$?qyJv$#>S5g0z#`ff8}r)cZg+bZOt$+S6ec+`Wub#uPV|}ybK{{nIe~RLY}7Uk$&93Gb7z&DF|Zudzor) z`9A;tCwc};$z|?lOwJ?tM~9tjR_hFycO(CZ7`hyfj%#xlaMBdnA`GI`FQM)-Eem7O6 z!1Q-OdWHQB3SE#hELIB%5Cs6q3G?h9Xlpv6LRrYO8Hd+sss)TLqJ$$7d+`rsTAqq- z>no0i8xelKWT{59ag6b>Af`hQ;Ypjs{&lp}A2-nfRV57IBi{h{$jKdVAl%Q^9=uL1 zV0QyFU&eu1+wz)W6hRbj8V%2sLv{zg-wQ#&2F{=xSg1PCBZss8;0L*`!CIpK)`)t2 zHx>Y|*Y9c845@T4Ypr?cTEhSSaQCzU#yrkF=FhKY&-e_>GHw89_{<#=BfD^6I3-jj ztHc4!1o`$IYFb{f34QRzC+gOG-NYiow}*#pOuPyt|23Dc;28%(*cGQq$7C4!DLGT8 z_CMcjT<1f1>Qd)dWZm`8bk8xw&N}@!8t_NTDqIBe#UujBzW3L=ic-ViZcTu4YZ7FfUrm* zaAF>Vrrg=)9DLUm*z2le9#@v7FnA~6KE_gYAOC*`M_P_!`EqZH52em^pO~yYlp#p% zp-11=??ICPQ~*=bmEVgoSZm1o)HS4&_(t@(sU-ECiI)8_V7b`|X8FPr&*ob_ zP6;wRkX81IPIq1ANjM)q5v+Clx?=-pc|on100@bm2^mUi&`@M}uq)sqF%3fh%$M7` zLwi;zOg|XhYFFN10VKlY6j%OI;vqoc5UP=|D8>d*;%D9$p0io8_`d_#$NOC?f8$8g zkeQM$4#m$SQQJ-cilV6Ot*6}U0CV{CvPSO;09Q5sPM-FEPAVw_oAI^Quf@S|k|6Ju z`pgWoRe87l@)U=%2hVv~<=G37<&$>@J;OC(-A11;RkuGJ z?24|66M9$FuSW;7S#2~R0Fzh^jcK18{R*&=m)VAWDCVf-ZMLGUHs#%A*k)gNf6nPn z;~OoiK2AmeK`*|*kST?-5#_=umg%wO97b8AqfF`xGB&EV0rr42!k{_mi}Etf)z zAFUp_Y2f{pHgQWqYwxUVN43N5@xQ5qEf)X|C|)Kk49q(ndNf3QL>N{@(wjWX;+P_vz2WS3b^f zH{%C@oH9)_3%Bng-z_0nQ?Wjx)`T$+;w%b$NMT&TZ|H%e=WBg<~kVSJU zB2oKK?kJj9rMoaZqaCfv3s63>zKpgv=T}{~JHc8gi7h)B2uhn=Cyd|xLEwL1Q*Z&O zeP{XUgofn#)w!ISV|VOqE4TZ=XgNv~JnpK_n=se(L2-dS! zD;cI_KbXj|yth*oPyfJWR+sEG(Ib+v@!-3P0Mg$_9Su7DvnU?y6$%byK~1 zXpp!6qb+EGsn;W`KGQ*uonE=Cp(v)tKV)Q$y%rET$bi(t=`{zL=Ej(M@B}mbKpb@L zO`@%$Yz{*5#LiNFcuR4#7!qFk4FDrwC?~l#XL$;XIB1mgD_6b(K&8lC01T?RJuhhp zKsn|1X?gv~lwbBbCb)_kRq;gq)vmO6X}{L?heiSC_XBsr8K~ZyjFe13$59N}>&3Hx z5k=lFdQ9QzShTV()OpiZHXi#o&QTedt2@~9t;A7&Qk)|<2R6mwQl~P{js^3iQ^@;h*jIV4i3YZ0LX8}mg!V%<2l!hYc=)>pjT~?q! z7q3ox;mM5(%MXrE{3Lb4I_z>uzJXJ6Jm}a;2|jZ$QVQdf8yZUFFf+bqT!|_liTH>uyHQjw(}Gem+in^#@O(D1-9& zP*~R~7WuRsoF%a-C@%n5WFrTUwMWUi_Kh@IMkj|+k~55jFay^gKw)TTxwbm^{xe7a za*6ix+={!9k<9!GCgh+mdF(8Q>@Y1G?MgB&$rPhXy=>IMM zd&K=jb9Xf|m_Or5;OE6|9DHs^ks*j!m6Wj2z^NU_C>qp@8L)dKN|{xwzpYu-R=#m! zUJ*mao>+fiKG;nD?LLQ|y;;1pU8BF`lwt0RQiPBLuT(*XvV#sy(az@m@$@nasWi&W zmlq;_*Z;wpcNLU1B80R|2##B@yNW;f^@s z-V=b`-`7V3KpuSI`(!5cK)Tk<+wyl0pCUdqk(CN(ch4*yT`g@neCDqht2SX1UuTni zDp3Zie@E57)xT-SJq11#a(WJdF9a51!TLAlV?g52_ov-|Abb5^-G8;(lp509iB>%F z*bS?KJWPHwQcRIag_x8_e#Zkt)h6h{q8utS7jxLQ992VdD_KYo%#xv!w9&TVNJPAJ z26&6k$6mzh>=FCs_^b?dtt{K>-N@zaqGMG91fE3_^?~a`*ZEs68+i!Ea^)!HrhC z!2ixT#O8VFj5&52V8vFljgIPp;pbr!__*k>KQY(QgW<|$nF1(i8vEmu(H0KDIL#|V z0(=chd$bJ!nb07@2mFJmon}h^u`#U73V^54ss={9T7Z_HC1dSg(oOp*(8~kn+uesS z#_yF=?6Eew)qu}V{SG!l%TUd8L3~0$Y*wxde4P&wYbs*w(N@O)<`|0V%mD!9$Xv54 zi6qXf98FIWR8Fgg(3zK|jzl^vwj{*h9I|pUf!RYgfYOJ-i-48M9m@+4h*aGRhb^qA z%ssi5P>vhD$v?d*y~>Fs;0=!RqL^NyQIesq=O&43;HSGcfE@^@82Uc6B6>RC(z*wNgxCEajw=I~9#GWC${cEQbzzrrJHg>DnL0ar= z&j~80{+4!+Y4@oezb9jw1`i+!0g3xVT3&SFIk%}C*j&kOyXFT%h!^UEY98V&66|#) zWg{H!1h2I>ecR-fS~t=-!q<^A8udl2u_y0EEIkW^7cQA&Cyos0PjbuZnrcqWN$vh& z+EyaWahCzRyH_}`{rVTyrkB=h`cz&oPN>v{Ylwz#Rt|$a0oko3@DgDZ>)ClLPlm29~PVFwoM*>CCVYht#lRZzps-`*Gp7TRZYJ zOZ+qpi51{i`rXx&7ZkO?<4)?kG>ln=ULoBT$x|inEUL?EjC`%434aCh0O>vCMAdW6 z+9>Ckv`_{>kr@CeGDnc)ewN!Q8m}gtLCJaE4X|z{ACRiG zu5jXL{Y2zA=xtS&uGiMAFN^16{IiJw?Q>x1B6Yh(`RU6+4O+)_@3s^~D_6M_g`DEBa**%Gz1)Y=xKA@mPXLbux@e-IC}?q!am>M(by>7sK`Z5f!xZaQuQ&76HcdUL zwp+p%8;gwW`dp3wv=D1U!KY4Wh(2M)=hc;p5~+ys9rgNngLbDWK9sv+YUhSM^dl&e zjY)1Tm@!_YP~WzLhXXTBE6MeWKS$NTA#%-MU;**lA+cMlu)8tC|5i4S8a!#v;0Y3U zu_h*nUt%^-P?U3KYW&-hJ+((1ya((N<5P?ng-5P~qx3E*>hq2HV9l@Sdd&goYFAb8 zWn%J-8oGz9v~K|YJgWD$?j46&KUnQ|@i@RCftdY%75aYN;ilx=xgrD0<%`T#*CbZ< zmvt2VVi?RB+P7Gbzde)~xsB5Xi3r~e`3`bWyXV$L=)0b+1U~H~gy*0k2LM3d;$-p% zzAhX0M>zBu|Kn-=?_1*`%2At+A}Dw9OX(b&;EksVLNAZC4~#Rw!aE9|?Nud+5rOz8 zi08jOCbSy5Ut=HcL+lcXK$hZ9IcS9R#AQM$h|*qBy>S@Qv-?tn9d)dI^D(MlY*cc= zR!+;n`T6ck58V?KT>=~&n3ro zqnYKT|IPHv%*5bk7ZRs%1b9o4zVaZcpO4J`Sx2ELv$kHrrjWw6sr`=!$na`&H_=z1 zp9Ryu&WW*2!E{N6t^lt`2z<#%c;%lg$1R1sUkQ8w*ae|Y7{jRM5mEjL)A>I0?jm#zNlXJ9BSL z9)nljPSFMoLfn3wF^Ppjo1-v0jmv82P%8j}d^$ub{in~qnaO%#x#3OaT4|oIukfwX zXK2tpNrLH4AfF7sZA9FuFimoIRy}uTr{7o)Q5z#@#Bj8R#6VRNA?jm}8@H3KSge~E zOdgj3A~2wpe(C`%C|a*rp(x@e8k|}Ixmm^m*r$z(AZ1@W|GtU*4 zo3>SWb{eSf>>o9PUieawxNQ-b9J9oy6MTQ&;XBujte@tSw}QwlF#FU^px(uyRb#pM zXk!&Z2 z##6Kp($;;N202O0askSQ_0k8@8}DjEfgAEd8?;|L>K zCq}zD8rm*`V~Utun{d@U?pD{$CWkY6qE$rj?tMy8|`30m-@PkmF6d-E$CAcjK<8JRYspIrIZ`vP5w# zDSYdxkvBWiN&d(4-;xJDu(PpX1=0obUkLgKT<^HPwDU%>~qRqK9ktG~*mXm7z5dbO+Eve{_^3H$@Hzb8qr z-nI3h6=H;3&LwHAcW9Nf`kH_a44lGKW>GKXDCXT848auOHucwg{FnHSY`94}yu&pn ztf#vE`@%po)Rk?#=REi6vTO;trJI}&XIju!K+X@xF@B`vwqFhHt^(5FqHiWEg=x`1 z{iMk7OEmqj^3lOCj7_U+yRMyJ;GjeH|Dy-d2Nbm)KjN9a4wByZF}Y-WSwQA}?^o&! zrFf45I$2eF@0e1x1lQ@y6Vr?5SSBx5bRKa&zVcjbtA$D{D+gUs9fE%Z?5|~Z%kvnE z&76zW>q_{HFn%N?^a`L8d!qqI?Q$OSsOW8-(pm-%DB>E%4Rz{m&q}A{1rR-RII8UYx+~b~{c-gppf)Njh34*&l7o(IN_HCjkDVUC+g2-9*2{JU5&&2c zyNum7FB&COFoxK+S?D(w9<$kA&dkcqF=#+U^pzy*k(cPzy{`$A?wos{p>==r)I*LCti&*6@>GORK3W@ z_>gU-Hc-V6ldZCyaC@i_Nlee_gNnp4PzW{FUCwP)$MgcUySQqFU2qmk(PNtzPNk%l;>lZ&yWx^JE0}mxwF2;-HLxh;j`t^&cEl&GfiF8u$$krj8UmQEDpycRXI?w&8ae za~?dn)mT@zfkb|ma#K(WeBWy zNAni}T$(%hrXhmxdYD5sKKP&Q!Ni=2(7jRaLmU7=QeU%lobE?&+O=_V5M$~2dKNZS zPF9e_4?XTHITkYu%h(B9g5GX5v~M(=`wjJ)JEH-kIg7sY{~*sM6Ryzp3 z-DHNPLT*;Ge~4P;uU}B_f{uiPqeM{tn@Vu^BDjiB>$EO>Y&Q$QN;Nlivbfn4QHl&5 zwyX<#RsWnXqSHKCIB6Jq9`CiJXq3O=Z{1Oc(0joNzhGH5-8@2^K>je;?~I;pwEUSaBE zMn@NROM!OrO1pK849`7q`jtnN;;*uZ`jASo!Q28q3&VUNx2-F}XiVFDwh|&YQPKlF zu~~ypWhCW*yK?A;_H04=zV1Z2LA7d8W3oVK4=k?0nr)(m*=3QNyKA>O(Y30gFAqQ= zFLXgpwwp6O<~uS5TzkJBzoUeUPM9o=0N?UQjNJ*D<45cJL+3y;WjV}+D>x9Tec`LU z^;*eb(ech(tXY(SF08uKsm81Flx0`DB*&N7EEuRn53K&E0Q@S0>!>JA;N044%H~d# zVcc_eu`tp|B&?t;w;Ir$XELseUDkUZn#S@Gb=l>pO2-+1(Q0Jj^qQ!&Arb(2J`*Th z$JQLe$aLD|uiP5+-%O_RM~_d9rECJeispn>@2Hzn$r~w?)u7B8KAUt)*{x&*w}vM* z-!#BN1~acoA9EeXB5Mr68CLvGUd{8eI!`=8-10zx)uen#OP7UI9Knl^obT~;{9`UT; ziF#zd+G}vl;$B-lO6qJq`E zPB|w*uxz^9V=bUwy7I{+_Lz{@u!_7<`NJ5HUZ#@t0kpBm;J=07eO`ORg})^lGw z40*!hmoN^mrbcTSQ+e32>tg;dMn)I;-vvHjBiv% zl%9_5c&rx486-4b2<3Y3<2x4_I}2HDJa@0zu${*jSl5zqj90h)7?TQ~^g>S@7P<)T z$2oRot`}`2SFOG~N0OzkXdmvJIS2EIl4Evj0Z_=b`(_Jkv|c^INPif46UBKi)vc$3 zBFIwQ9$9bg5+^m{`qP3&)ZnJ1eMSn&O39|SnN06)FIepP*B;(dt|gKDFm{RW*W(Z!9OS zu}||@tJ}KMxh)xcvsF;A4x)B1DB8VH=Ie#owReiteWym)tV3PGc4Ax|)cJT%&LK~z z(AdsibeS-=4N`qL)EwmUHMVPL%6#;U%XTM@q*Y81?45UE4MN!JR=Y;g;WVL9!<~Z= zZArK#xXApP565yeqt9xI*Wpqcj!+f>x~clndTpiyNt*G&9_^1CojL)6WKQNlNdIMi zqU7bTL)K;QB}K=Imo}D#OWgNO1#m-}La}g649-m2lw0rDOJ=>Q{4r*|uP^e!Sp)ix zN@11X-0=Z#i(-R!w8RH()UGp6e4Ns6Q)*Ib!D_~ufYAf_K0#r6N1fOJgp&EY<8aO_ zP3xTMpfMXsY}?5<_|g3sptF>Uq)HRrZ7hhb>I ztzs0Nmdyyi0WJoi`H$eK4VVoG{Ik2CJJ8m-RuoC9z zozQlr7vi;;c|`7wB(x{O&X7jm0M>h}9eih5cO0-N$>I?4(0br~a`gOpJ}Y2%(2m=D zs3KoM0nt=E&G1$A{HMX#$1O_-ztmL@5AHLNNjJy3Rkqpe%NHU#(2EyN+O$c04}6Ft@hWAB8O+{RI#c^2E9 zV*ub7J@QJom)&D+h0t!?p+47|QUIq?H*pHs&t!r#&z;+gEO7I2uLkhQ2<7ieI&3kP z;BEh4xTsCZoF)x!i+`cu+D|?Dr^lr=W3xwQd#kZIT?sC6$Bx5hQPCE$7D~@|Wk!Fb z`?OTI0zl;d!`ppEHMwpLquy4QBA_5mgoyNRK|)7Gq$owC8hY=M9v}pzN*9pc1OybM zL+C+zZz457AT;TO5(xD?L6>{I``hCk=X^iTZ-*E|a^Lfr<(e3yU@Pie0Tb=3=5H6= zAy;L^W{dj#8cCP=7jCBmAWG?C6!I_L8?XvKJI}+J)UU`Q18P$4wc;;_Nil`YxHN*#%G(bft9WS`C3H2h2`~7uX zQEffhyc`6fB;lfMSsE95TGygV&%6i2_YSu5QtjsOBYL5zCbX0dKq5;~@%euXY;`xJ z@IveqYwIX07Ut0^ZwJth(8Th|%YR62lBU+l7PtIOB7fc!0-Z!!&Ww;9eCaoE$N15r zlIKV)aJ1~aOddz|v6$O0^ZQx!CMp~(*9~gn=JCl6GdvyCaIswbh$Th%5+EY$wf7Da zMdUK$G~6|N5iMp~fz0TDssC3I&QNu-$!+8MY5&8k58hq%XO zx_QbMz^j%OB@y&zT-}O)U$er*CGVgVD9M9Dti|kexzI(j(MQ!0G*W2m?F`{xAo2%& z2QGf&2Y1Pd4FgPKSEU{b>`lEN(aFrrjx!YqIk-z+c6bLt=@#}87+j3`Z-a{@e!$@3 z_>(^DeSTv{c%hw1x#r3T!aZ2&mzD4^S^CH99iu7Mf$IPF9ZWoH|37vxl{&?;q^Nl{ zGEABr%og0|O=OS*(%&2&d-_L9nk!FVi4TrN_1{)|t54{N&861VDoXI&Qf%ao4NpV> z+xqN@AhNOY;oU0$h#aHUihh|R9$!@hfXGW!sl|!hVk6!A_gCA$t*%@g|30{ja{Y=K zUog95s^z)!z_VZ-b2zU#c^BB#3O;!R|1MuAlyFIbk=>us2x7PyG}!Gj!-}X`B8i-R zBXmB|$Vsp#j4lQCa;|g$0R>wN;5=t4?dwB%?Y5u8>zkGWr1lXzZH?h0p{*V{z|O&m zV~vZ-u69smen+39R(z?@fu_EtG7SLau5W@J_grL;uXP(;f_}N_u~ObG5ar$^!THH3 zP|V2XeER;JfKp+(tQlIdTQ-L!45s_QMA^7UX#X0z%DbEfwjY_jU1_*K53XxYIb_^S zWX=6r93;Sc)NiLFVWC{+;1iN)6QKrvNC<+ZRT^$pV~)n`yvI$T2IH&B{!E_R<~gfh zQ56yDHa|X}8?|g?%?LJYm))W>6(u`$kte)CgbkAR(A)3Ly-HTIE(g1!ZAwBXHsB-s z*N-xbp<^R4Ix(1md3>p`^4+=_#&u+(D#Jmd40!yt^bQ6?&~Pr3$P7OW;>lC9Epx8C z^n`KJ6;nGXg1jSptO%a8z^?`xZP~9?;y;zwmkoz)l`J!`53It!Wqk)O##KbW_1L!R z*mnEU8HiJw;&55H1~Bkw=0!T)BeuSs4amstL>U=7wE-w1?mFWJz-%abRq-Q_r$?2# zM!f2TTkGl|bR|p7a>6;_rcq;*G#Cq{9OsW#`GlARki@{N0C!^uI33(SPi`*C4XgOBxJ}{tb9&9y&m=+cmYmpO! zz}R<65LorF`{S!shibPDjD@^$vI#LhCOK@A`f=3#p*j1AW0cHvryR(Ov^y*uyc}%f z#Dfl}4p3wXMi`5kcSk_$$JgWRHR$%hIOe0Kw%@T!YB|rgq6?GbIdb&Eh!N-eaL^Rm}xHcNK>U$RPA!o>qBK-r^-3@gV52; zuj0L*zzQgMSFE^Hsq+WEM?E%?2%YmLlBQqlj`yX&1T~3DT$FEy(^(d;>|~eXsv3-x zR@f6>!Btz(c!~}1FP?E68=5b8I;{PaC+u@MRo-M@s@V<_*TUdY`$bvjbv@x2NkMT9 zz8RIegWDoUyVxGAW+;k;gOqHmB9dEq(^Y#&K<;h%)W@y0jx(twPc|AESZks?T)l^M zU3IH*cAgV^P3;5?1-desA5G71@1_SIYpohXRaXr>kJTWYSTRnU6Q>JXFg`9w8kI|? zzCwXy{vr0lC{XULd-GxbpzPc*o3ymF5J|xjcHPyzqZ z>D+UW77F4ex6C(B6rT*kGE?Q(!#w@5`fY?-h_EybE;UY*uw_r07=OY0^&IKn+|Bg9y0R4XFjxl*#_PyCAbLC@Z|yj zQYr>#vTLU9Z=0_km_amMM-BloU~AD8wT0pD^#)N~^h-$=YxmFRStQv29t5n2=~70Z za7~c@*EXRSZsw?ehp?6Ewsm6x7#p8|cGP<=Et}w+wxbiSSZc%vcVZi8DPlV?)NI|b ztZXT~mB{M;;-N^hSFF?=#1|pKDe|-5z8AmWY6s*LUGVM^U%;>Xe-xRV3wkPPQZ&TF zar{~fFp>`%l#qPxciu6oHoY_eTE%2cu&uVYFn>!dbHDC-)~PG>>7-(cX4> z>&fi6B;5gBnA5$N(DqV7`=_!uM_^;^)-9kiSj!j704xbA*m}18xi4r%k}r&3r0k+; z4`GA&XuRwbwS;LjUJKFVu>006xUWaIGK80Ky?ROvEQtpFZr(|F4~5hc=f|H#^&9j% zBc`&1Z%Gu2Zc`B#>q`&?DP>M^UktOBU**>NCT$+nZ_sHD(G_ZZ_6QkH@@Pb*Q|M=Y zN*hQ733-@ajIdsI?jK>EgS}?~dW}%9q+QTb^8!t(N6fyXMtYbYMu%w+c@s&^oY z_j-}m<0RJ+#f4r3{wF*C;g)BdYu&<;%Ya43QjKHpPIC~a^z*(vm+ z8k79aWj67p%lr1|wV*24PHy-H$CHRx9VtVzikY{=^^}UE412&eg#LeFW;t^c+l3uw zvp;duU#cRDDnHa8g|K|G9LOTX=!j1+N#3rTnAf-$t3Qg=kv^I9Sj*RgZ*;DY86*QEw1EiD!;+PDUzlN}A+bAcy%cu*_#G?0u;sP{q{n3+tsN zWs8_{^pBJ=FoO+gfHJ|5cjE%pidYG9X|UZd&>U8`nI!sDD$iiMNgQ*)pv)STaBLQw zp>VKLT~PPvwy2Q+x@AM?Esf^Lq%Xtlv%wxc6L4XrVO~>ZQ#tseJn+UN>n?4N4Ws&- zJKb_Fe0%iOH^fz>LpPfkwuYV`H43_|1lT#jugdq(*K_opZsW6UA&q!Csv?ZXx-MR* zAx+UM@xwlYi(SREyBBxDaSNHoBs{$?^ty5)W(`WK@ARU?ARQOlOu4P4cF>hAwfMjX z3OnR7MaK(h&#Ji~r>DQ*fE>LoxVF5IA>MI?tjUp^$RzjMe63`+RRS<3H|=fH#Kf>; z4X<)5AR(AfF0n$r_6!&+uctH3It;%+dpk0d!GkCLN|(z}a3?WL<^I)%J+^^in-22XN3csRF- zUw?bdqM?EEYsCKL1Wio9`v%&av!-Gwz5VbkqaWUdg1qt z!-!=R3Fs%E9@EV)GrFtYWSQ07sWi_=QgS+Xi#z?HJ+k=`Yh^OJSk&MoEAwcAT@*IK zA3^O*vTAF-iT%>W`L_9 za!qQOGTft_k!iZRIVbwQ*f1DACVDx@7JJo8P<;QdeZ62#po`U(Njsic&|SWB)8ydJ zSgC!&rYt;%mRQj(Tc&!oqj)4E_QGtG(^=oi5fQ6XDqTu~yPi<|S+WG9n(~e$;jo{1 z=tI>kQ58G>ADw~w-k*M7F}A>Hi~1L=cItKzOC4!!%>rAzP^tn)C4-HEhWNcu%uj7e z(NG;l9*}e;GqqQu0D&nEPEK@^Qxjn&<68F3i!y5Tz;r*Q#4T2#L3#dMqaIXKc69y z8{DP|vL3+h27J)uIy8_{P4s`}V|J`%zi1Ab?o}{7395Y#X_uhIU@0zVkQ&jGDX6?2 zy_J9!QTQS!ojtqI)+m%Dr=4vJz52@K&F`uHLXJPpl5Bj7e|R?f61m9EnbiNKHTD8E zBvzt1X{!mMR_IuNegRmkm4|tQZPivT9uqs>OWiI62<6YJQ_tVjU*jcE9m?CM(3sPG z>~}D_$8z^h`ZE+e_8S`?sQKwgP#_mOv*<0n5iBUMc$jIZk5pgiJOicEPr*qmL?4^b zWLDqH-dWtIDP0$qv56{u8`l?;PLcB8HCCW%nL*`Eja)?Cqgm( zadT+G#?Te8&t96O^HK^Eh#+n&I&7CyB(-bxQX{v*zJrWd8_vzwUr|+NCB&~oM+!-# zlmoUdk_PhSIV4YIfCKFsS?6eV(-p~MQ|{S?`0JYoGhM<)iqG+!|1n**DdJi+c5}4R zR@o7y+(6Yn{?`qF174T4@nusUU%|3>?k_8slz-CLmFTOqbc(c18{CV0jn{46D9}f8 zycgSRY8w(h&=Tv<8fS&rH~+}WGS+<%xm^MRzq-G)DeHBwHbEn*Y;nr?N2G~Qv2ize zrL!?5#m@Jp<;sob?s=%!GK0j~B!L;lQu>1v9{ZF@Pg-zwOH4WiZSt?&LougF5O-4E z@lR;F8&LuefV>VT4IgoJdADVhND~pno6cjW$vL#!G0xRJhoQrK6IY1eY z_90^WMVIH{u%=7OFawsY%g}DDP05Y&o3+ zZdZZ2W(vjLBy5*MJxjLBJ6GE6j-Ni$K2bZER8kUAJ`$Qw=Vhx&V!;+($ZClr0m0ks zS|;bAZz4e7zZX@uMLY4rN0+*}HtWMv8MQLo+o-c{Dp}c^-Zu#VweJ#o99gR?Osn`Gf>pqYPc*U@D;VM*9~jXk?KW$o)rVx$h6-+3!Oe3_VQHh@qZL5W3oX; z>)D#gS5XHjg>z`VmY?#)*<)8HSWJ9-cnTz_Vv_dSe1cOKd0CF{w!(`dV)gvn?7xIa zoYoo9BKwr`ZJZ+xt>j z6}6S(Y(O=i`WnNr!Q%bFXSowNp-mA-+!%+Y#MjpZN}a0gd$XLEmgN>nN=t@w6Wq_y zDl&FzKJ0G`;JpiscS_x)f#lDj3Zra;nXcqKz0I`Z%XC$XP}BeV_w--cbK14dtaKDl{Hgi%%Ao#?=&#gS+y7poA_!Z+q=PXes!wSx z+b@)ika8eGr1_*mQlF%-dDuKc$^+;qJ-18&e0kcIk>K%6H3cOY)zXm4CQ_46qr5Y={p z;z4`JdFuhsxu@TI;iIaymm5GlDXZRp-U>d;z%9|!=xE31MlMiB)8BYvo+M7(P{MFq z+G?v+Iv{g$q)=Kl#0NWCXA?q;eOYzdN%r~sJ5qL=PMt{8z`rekJC5^{sGa(c^+3!j zjt+pUmPJbFcHp1qqQP`>Tl3wHpB4PHI#TxGW++e6TZ->D)L-DvHTa8KKSX>OH--v) zn=xZj#%%IkNHLnTB{z99-erzXsKjR=6wy)%PT>;m0t{8xs2QuChs}|wCCNWSL&%kj zG6OGhliOL9*eZ@-xq5~*bH~osdmSEVz8mwj@B2h|g}wJ(cg-jY!vWKMu482xJcwj3 zVu+nR_oX~qGsQ?5JZZgCuCQ|%ZRed$N7xXt-_Ym*Qe~k_ebV~VXi$;uc}(m_yL57r zx7XB@t~4ddh6#nPoUd!|V7LerXp8c@Xe?F~3mhD%@Q=`8tHAyvYr@vi0XO_ZV)@&V z@7X`dP#g82OK1i{;u(wtzHXI$rxCBwX`+88P3boB`b)uA!I)_1?e6fmV`1P|46@{U z3irU2YR+8xg6vJX_WLZW_^njXI`sQS)B0sR&4r`Cv?U*Qz8v64*}I>uZwZn^=Gc4( zc2mtml9KFOEK^QWc2St}txfh$l$DnReA6)!PL{2R?t_MTB;J5R&^eiwFEc=1a69q( zSDj#GwDf{PZf8N(H8oz_F~WCER|~Au%pE+dw9>$P6H2>m|scAL&ttu!Ok z1E!X8b(`gkgS;@e&dVpXx=wGQ^0J4==A@E$=V?+mK%U!o2ec~#ef)0nS>=^(2H{<% z-H#u^P!SCz*#LGtfSL>S0;lJLn$zz+^w~|y#&Q&X>|%lLKQ;dE=i zq*PcG48?PTc$)S0{?h(R(jwf-aEDnWZOoyQZ$(VD`k-N)1s|GkF#wx6M`|^oDryu2 zYczVYg#W9F(lZ10VS(VnKfb=>+;E9w1luo;@ei^^3x`WjmaVE-4_xE@Qu8fIZ7njq z@Wl=t_AdRiemx^na)8+?6iDcbcLaJ~m^?Z(yQc4AdnO~;WVDX~*ZvxMrC)>F z;RcJ6aDB@=j+DZ36)YNb0~6Od`h5i`hd9rz+T>%bduwY_3~dayE@J476NMCEF8Pgf`)I7cq!Sh6&*kLc=JZ`|ZejfWh%rEV34$6sn4Z zyDP>^5GX;68(#%PJ54H+1U$TJ9fq>Ho%x_QG0@?#+&H-nO^9ufK1o;du2v(9K;#Z( zIFHG~$PUjUP(Q7f8ye&> z@3{1lTV3VXNc9)h$l0nK;Zq6g#;!%nPYy$tJv(vHkOgaT5Jd=b%Ys*L9vr&fbX&Y- zyA8w`j!U?#LO&+N^)jACP4>)v{kbr@pjwB?Hl;2fK?2XV{S4kiT0krR~CKe@bE zQJciYA7v&dLBAG%P@MKXuKnqI!5isI@Q*B z?i4}R`GX+KT!_W8q%42R^O)TOFt@T*2fJO{b4|-6qugee)$Op4o?1@1eC7H05yz~P z!bX}v@5nIm&BnoOsVxx?QTrqR?3%OE!apyeG{qpV3*R+HB?d6xFISnTC&9X9iIa4 zTog+Ajt=X6-H^*ghN@p`>Zj@U{Vpa#J*R|D-mC}>DRW9Gzl}^!+OiD}OU@~;oj}PN zpr;GHgh|gh+NN%0+mcdlH}cu}04?GQ4(_kk!#6 zR#!3BGHEhukr5hI>vHUL@bsbE%f_RsT2cRt%4zRqR43(Bn7Q;zon#=#nRxs~Tcvpa z6~2h!5e7Dp)Y415p&6vD1dhCxj>;NM2R=40!$rCioDH0P`8r;tCfXq@YX|QSLa#qi zw?b(>F-eSObSb4sgdBXWo~)`>=l5xPX7j*g`I?<@T1nteNs7<|dSrv~K?Lo3RiYQi z+wuVMG>lqgnzLJm6uqS&ShA?|<*|)?D_SKzHf7H{U4Pl=ZX^SRlU9n!zBJ7>`T-Xt z-*dCBk!+y%ppE8i{>lpzspDwdN5=D$2kuGxE?uTBOq&wHv328PHWmq9PY8ezIfk#% zFOjVS)kh73_WJ^Cy-qgC;(rdLjS{b&j`G>hj<1{7j%+Oeldx!O=tAIei-?eIBiT`+ zJY4h1B?gj_*5ul{__ZvgmaNxI_g$M#67c3QlJ9DHIZD)X-)Wg;89)0>Nd-U3&(%^M zi*Ee}E+9ubdPBPlb#D~29&S9P##l^yaF$NLvMyMKPr8`&dZBij_LMQRV#@jEkcnDC zH*`xRzy(`u8l1S|t zzAWpoVVvG^@QJjEiM_d@j?~4{qBhtLIQN-C5rW!>td9f`@2`g(0 zHWC$)$&S1+QzfN~N`oOkvYcJN#bq8ga@}T2MLj;d)T-hitLqX`zL*v;2Djd68S&WW zkeXR|97xSlrZFMEsm!~7duF(c-a~UBuLq2@_NP=f#RylAw!W{my)qq2+9H?E)*%b> zXabo{p*e^3JjxuWWf8DBx!c~}0Vwlt&Jk6GWi=)T#D|hD=)Ne34A?cZ361`uceM&= z(qHB4|1#NHaSU5TBrG>Jh2eD*fb{;vaV;&%x&a;TxXK(~qtzgs;hs@o2XqFOo&1YR z?Iz28eoP3@-Xyf{NT;6PUL5GBRL8&XB84a2_ELsCXXe5LI`z4&ms#($RXi5wttlR) z6ZUemXJj;r%TZ3DIvNmz!;_QzZ?N1ln@z+74VerswDu=U~Q{)OTa zbIc0VzdP=3<4l62Cq!RsKC}n|tu0GWwXK+D9}J=QK!cx4ng@qhyTf!CBC%D<@0TA| z=!m)7b*#^s#|y0`*u8nxbtz+`!L^-mGU7o66U*Vo)Sb2X%a@D!)~)w#y!Ze5>o3+f z26We7$-I7eE!$4U-n}4oY-)RKhyz(;SFJBrY8!kzU6|C@Ek#yFE$h}jf99*Vm@l<^ zc@F1bzBn%pNo23J9}>(t%7+SvO9RHLl~!|fffN(l8J=);BAv_~zjQ+ao2hu+gKBMb zl0P!s;R2>d%T;|aZ%<8q@ABs=4k`Uca}ivw%aw!g>RjBF9WEn&EeI$u_Fe^_FKeEo zAiQ&a9cTLk$9_Yv`cEn2-B`!FSa)Uw-ap&MqJFgP-mh$+xdm z2#SJ5?VWyiAUyOKe}F&^_j61Z$LSI_q78-H+pouNDS&M42{Mz$Bt~>vLysUoov}gr zll_{B?O_WsNDr)`nVYCP)u%W2CVYXfdX5z<3E$1QEf#^X&ym4Jf`FpZqUBAa@3?Hx zm(FE!9VraWZI-V6x1 zCVR6ne5s^3%CuO2@4IF2GmzVB)gOV;x7#SqL|Jd^A0qFRVy$kFXhdboic8C=$~S1L z8>bEEsyeai=ZLkz=fcmML7XKvo2-KY8$iA1ksC!hbd zli8LC5g0LEH)A+m|5*CniX-WDI<)gOepG5{&jfvu68vB!LpM9^BD~i|c;n30Rc<4CKBrLe8X8UpIuGC?{L|Q%*hx$UFSqQ+hY- zJ);?)$!V$W{A&CwuWCOA>kx~T1y7(!yaGB%aq)r3Wsc+Q)Oc;3*T;loW4BaK{0@h~ z=&Qwg640Hy)%8ZoGn++y61(Hou#*GV5{7AIVMY(MEab^i2={!=2E3kRg&?;(%SAHE zgdGs~*HK!^h-c?czBOWMp|O;u9=2@rEIknEe0}FZFOBnB%@+AOm3@@S2QSX(+C7XX z*5fEI64<@*;&}-GCtLo3lV4`tw6VQ62*Am%gx_#7gWcY}Q#kn`TUh{w*dOkaaXfbF zlseiT$f2vDdK8lp6O^Z-(EdHCi`-9}V!XS*?n<~yL*#TRp>(UKeEsptT(FJ!4t%n* zuIK`%wPR;pgXDaV;u1yb_BF4BWa!q$d;lfL53y=Zv2#Iu@`qbrPi8QG=@AwO*{|AP z%B|%aiAq5!NC2}O@xR>U$AFu>NDXls`yhcA>7^~Ejcp%Cpt}){1VyN1%cMr!G9*he z$)cd{BZ%bvy9+8qr0*FlIcg3hQu2I$dI`_HY;j;oc6d@JWM>Y#b4A0bxSystTuOPh z4i^dq?%4UUP&CBfCf+GAdOZf>Qkv)hOjN|kqR}P-G^vMs?I`u`Qp*XVn+)Qng`-=( zL0*^c&L9nPXLSp|X0z+m2wkObf3YxSQ*z&S%| zW%K><(_=RL1oM(lv&~L>f-~@E0(MXkKPZ!kUx%Iz^;77^{NI~8(N9hz`ChdN3 zXP%A6$SwkyqXOxFJc*hJsoCu4l+eeEq|)sw!*&CEq-L%hyxV*^eBfG;u(WCjQPbgV z?|7htO@u6r#+bu%Ehr9@t~=5=N$3LO6_Urbb0ahGkmR1d-QH~Ka&5-f(g~{}T5+>x zJ0c57woAgHsW(I$O5%C#eJ+n~aPqaEaa#_TSt&9eUeam?%x-Z%r9(mH6C?z>W6MF% zXdEeec~mV1SAif4D%r=jD`s+pfc8~hO)e}MV|0gscJ}13YNZL#IBs53SM&|Fjw--8 z;>zm?&Ty8lIh;!L5En}(g~>RvsWzyQT&kh7R~kfYHR9ty!23@sF7?)A-kqfaiH$l2 zCaim`0Glt5&){?*{g>^pgwx0Fd_J>p*L3L$&+13ZFOiW<#^;C4Jw_WKwR#(`C!96W z4T;@597#V(lX&rW%1dhL7dv4zdO!+b9qsYQL1H(Us_ESrJOV~ zWid}$MY$6YZ8VxV<;1m;UTZjW&;^6$A^WL!Wgp>mWJ>X{IN8M~)q2cD(G0=HtfAEE zwX&7>_3sWFmZQqP==;cs0iR}D{Ay+1il}+ePW0f>7!H^w;5zbK`Kql<3q0MYdCr)E zKoo_$$?NdWmU2iisg088#z!AOP39n=2f!ofW*{!PbS;r=`995j-*W8+BcV;*G)*}W zLt3zs0ny-mn<+VGvhXIvB$jnW`0IbD$(R09P44@xCUbjSQp&jn|65I_xJ+Dsqxx(8&Db5$zB?7Oy8P`w2x_A369zAfiMwyY zh-z{K&+iGj0$@V!LR2p^Fd;_|X4MSlSuQ0`$mJRdNv-9WL5dq68NE!NE#@{`oPJi5 zQen=o`Abcv`lp(#Nu(AIuMnvP1~^y`-ze^)F=NmLwf$)!7S0};@sldJWuI=KQ4jiW zHF@xlxS%philEZnY21(!KYd#C=oTEWs^#|YdwKjCK1VFEShXLkyT>CVJ@_S?prkmt z@w7`C)5UL}%n>UrZ|P-`O2D)!ur-B26d3T7m)sfy_+$I#A(K=7SVQphskd+m;5AIH zF#pqA$ou6jun@fkMR(v`)f5lrL9%-Ui7W(`mri}oEB9num<29|AqGwUCs!UwxNlov zUcCjF!>Ai%Zj$GFg#^@+R3*G(q}pFO>&>!K-C<`}M||@;_Ho(iH$L<)XUFsQ4l!+v z;(4|*K~$WKqUdsF^!YvpsE3!7rLx$4`up(U-a8>Z752*qkUR1Eu|7``?GNvxi*%=# zwLLa}2%+<3B2V6Hw;}^!?a%bBf`K;l9$oHEKO0wsA^2dZG`ziF$@T^^cG7<72Mb)l zMe>P6EArm{uoq!}qep!;@~2F;_~iUlH@h-6wlGR_CO5Es0sR2AUX$bSg86M688X+1 z=VPU#{^x`zNJSG}^i$u&iLHfJq^j;j18K=2fF^J8uDKz1x^7t>?hlzw#>(b*Co(`tETE zMZ(LQ30Y?$mud|l<`38=?-=3|`Pwf6X7ZzLTA6_2?qb_ZB=RBE)??o7&(Zvrtd;^E z3Z8XGyXARdL)$XI@<(h&=+aC}c)3V0F1S7|!P(dH=TeqW=g{lr{1T+?Gr^LZ-@OZF zv=TdO6>astAQVCmNum(f2bs}klpe_xiZ%O&GNb;-P28OZ4v__&Zhjw-_j(fPy5flk znD@l3sJUm%=Q0k-I-->J3!xIC&`J0K?0~}aZeFCe)7Sg!f^n~Uk=Nlp^X{p%H#SEp zmok$pQI8C+X&u4u=NA~AYvuK5^TkQa8>>+zZza6O#R$%J$J|94q>tcat;ERl&9@#5 zckxk9pvbfFT4hNQcwrcTHF`4F40g)yG5osbz zfF`2ipDcdU1lh@Uf$7Sc>RnPlCklRYZn@?;#k=YRCo-$IGDi}pE)l>6Q2MF)B*&tJ z4fo{4^kT9VmP|3N zi#03T&${J18MY%w-p0uXL9f>24?Jmvz~vwC1=j+^lW%Z2?=4(->HIRFB1gYoJOz_i z0n{0|j7`r3N-5{sZd8RW8OZpN>e-;66*&{%PFAqIA8y3i#>=JOKTenEmuN*4|do(#P zUcaWQNq3n#$mSs_ZByO`WpTyOv?(LiYKL^J?{h9$6y{cs`-1~Upw~j|q3RGt7~fUx z#4(6;N}DFPeNX=d_buuDHaQoSUk@mge^G(jbPX0ZKUyLIFqt*4XkP08Q9q45>Q)?z zU0aK@AcDzteA{U}i_LUqibl4~3?;U8Uen$k1<(?iD;?+3pLv}FiYD}zKG@#6q~-#GsaLd~fA5&$j|(VjgS`gXo?a&^B^!nBRJEU&p$~tRc6?74FBTl`aLsF^1VNIH(AFD%MA4dR930fuI_r2Of8fho6imaqUs#sa zEw7`wc@bSJ#9_(v!$O}Btks|wmfKK7C+e(6C52TX&(NIW zh+t-_RenCuCJ#KN-sKN?9x^?sBTe6+-vd@+(LX+mm0BTFHip>a{jZU<%6;z?tRT^N zOvnS0?b91J`a+Fi(K*|chtFdlOnGC=Pn}QB3wpkt7yWrsX1P<+HJY4nc*5fK%ZL4A z7;kZ*NtHInu-{|zWB?>N4BWq=@f%4dUfcf#Np?O(k|X{`k_-6wJx5<%k8@szQISFI zv;9aD*BSYXz|U#C&Qvj|BugXiO;Cg%TBU!eVc#?p?L=R-kudq3j5wrIDjR83VRUid zT6XBuV8EBN-g>}|4h|aLAwD0=sXFtF>pAsU142B_`#ssQCTBofQxN`ik=>^7EtC(O zy__|BwdgI~jl@sm!98xkd)s-I(#tcFEllswT~Dq+oIm+S-$V6o(S{|FN9AHmts&j{ zLad9jN-}}ftbZHH?l^kk5}hBOy9T0$4g2_s7)DP>akg3U1jiQ$`%-=nRGOvao@JM+ z;`X0Qpw42(z#0FA-$_qsKpUZ=;dug3Nte~9FSKZiB{E09{CW&@G4 zQ%hp|Pa;_mAd;W_gGko;MI?93MCP4w2IkRz9qnwVik)`(QAN4*VgH3%V`PJL_V@Ch z5bBW_--5s1!?r3*IAIeSz^?$uHdx4u|MPmKz9$qceZ|d!A5zKXadv9y{>n6RbGwVzkXSm^bfcu6zMR>9Eig zEZJqYlOfw^oSD%a0?b#T;$FwY`avDxa>gSp$M4St(V{ZMoe@pf@X~trai3c62=lTu z+K9yGPI8NyD71&^^r1epcXA{DUt?omL-|?w74{lK1*sRlEuv*a!;-u1}R@DzUuN= zs^ZC`AeK8T8>_cb(Lw{X&sb#$Yz1)*QM_`PP?t{`Lu@5`hWw8N#M5sqMr=uBKL-<+ zr;Dz$#kO9A0ixssqKJAbN=}gFQN&1|GZWQ(2$nj0N9$0PzkR$U6tKyXGS&KkZH}6( zG-Xz|dp}9qVonxB4U%e{{-8hnH7EFu;W?=ZF5vYgO9a!J6^v5A`=hT6|BP2=gPyhAfWo@9cgc;)?55b-+T(2~AwyEGZk<3Ob*+2_C@DR-wehN+CT_+OB z2FouJ@Ksomb&9!A0d9PgvM5 zF_ggqtU6=v!FW^*5Xl_^i%JBxSnNFw*=#=kx;BrMhnLB=y~~M2@`JyLWX`#Oji@#U zZ})+0t^bzX`!|uCAiyR?sU=j5&fU&Aoi94vZppa9Of}c#$Y=i&F?TL^|L6Qm$wf25 z6jk_a#ue&1sa3m9=^-CB(N5o!LP%`;X5;jCS#ZZ!e2MCZu(M`2tRrdb_^w#%B+C{j ztW1r(*Obv|=PF)%rN$a5&@K8cX3yuFO>Vw&3hXpP*CE2$CA3650A-#f&4`#*{W?1_ zV+ExkV`-Ro>=rSG)Se5}7>^e~vjE)f*JV>Z$f;RN0uafJP=H7Vs?}sv4B9!rh~)df ziR6esM6y0qQraTMXN_r+mP2tkcqE;Q|FT~B;FEw@YV2n#jl#dfLxWoSF+qD>S?5AZ z{=pl4Bdpnf|H&;J(FV2j8Fqf`IA^~|6q2p**ED)BRZaXuNM`*bBu8&;-Z`uS&d0TD@p?BaYMrn9gn{n4|H zOaKvo_LPX1_wQtr6ccvHRDp1oL#~*UqZUIUsWVC@zFpr)dsSO?&J_23)I~tNCTzRSE%jwq;%nUgqvYMlPUCYm zNvXi2T06ILDYgeby5>I=tdM%BWc8V^Y0YT zpH+~YAqayq#^c&3)|8SoGRp?tl$C_%$*Ip@k&bw+L_c2n4PCPAHUnMx2~SaWyeE#1W!=RO+u;%nl(ZXMFDbkN zO!(79kglE4r;8w`e=makx?&Q)LW^<&f*SsxwH_hxLN;yc+xwkvbJ3!~VaA4PMf*z`!Fo;!L$0FuAXN*JWia<$(v@u^C{PG=t15Bc>vCQ8qg5V!bd(k>?CIS8=eaot!1C8*sq_iY zuB(!nhA<(g_gKmnVcJ>wR8Lp5#vI+}4CPO8qcAx#wpzYOVD%se3DLwJ|j5 zp60IO$Hz=xfxtV385d)G@#pPn=OgwTlh|iD+S)6BpZkGcpYl|OUod|4eO7)^Fsse_ z_eo3&ti(yMCB8@!9`2iKWKn}Ou5W*QTh0UL! zkM?5Ih6bP6mFR)=bMFngM7?dSVO{ojik>2PV|aO6Lg<&>dnI?pExok`xHlhO2m;9x9=5@ z0UPEtZ4`fPm>ZQ&{v5f3MZAnYbhIru)z3pg|1}`Fg^BpfbF) z>&q#Q{QdlbFS$oCdwiM>fs8>qT`9p2i=L9fcVVDC+m97+tR+?fxUes1H6z$z!vKCbpS>Ak(E7%6#(9YoY z-HosNSCE>N%G$mN@4mC}Z0*fCc3NN`u?ucl|D@O&E{)751vcju50K?0ABn2qOkUN} zJez>)hR<8K!6(2s_1#M$Q%#&`?x$`W_m`UWj~%>lJ6@7`KZ0E- z7^HC>2!5a8cd>qlYuAOm1(Mm$lnmQ|5Xo6gpR*b(t?J+wd^UkOg8MB5VjqK*Pv29%|`jrV?JD{&!C4$#5+$D0ey#|O$>VWLYvnTv>?ax-D!WQY)O zbF&JoUNBY?cgOGuTj1phtYz8k3?gm~+xk6HL9YO;?XePMCsTcHW?(4o^qkx2bDG15 z@U-vlb=PrwS^Gw^;SWM_A6P++Q8t!F94Dp%=tAMcjbU1dZ5f$Tu+#}5ytx3e(}~5k zg81}~H@kzwJy)oj!F7c7W`Ow3Mh~dS(FHMjTq|IgIgHd_KwpK@W9wFJThWlK0z67$ zz;t4U&UcUqtBb29c^=SqDTf;yW_opagz-u*4fa)S@~e}Zu9isISr&Q%ZUn}Gvi8t* zM<35}+0`8(vA}3MvY%NBjtYD|jh6SPLS~0BWXwvP9IjyRrxFfSv#?Q8h@+k0UikhG zEby9~?WZp+1ca@`SFXB_q{WHuY#0H^Gft>_rTAHJ>d9gDHM7X5f);v8k;gIO5%1Q{ zgbQzyt!-)6?YotTyU2}7;^nYq-zY>(tnRvXylu{w+-V1JWQnOg9M#Ix?pbVF026n9 z8Ll~Mmf62?*)6{UMt-uFd16eOl3QJrodVCj26HK62rJq$2$W-KwTVK z`hr|4xrTTwY}E06Hah5?K~F*jDvT^<*lnmU7cKRtfYEa^G1XPmLB z=u^gFV>ql9qXn2Yh)Gj@f}#r2LA)(uiqT~+Lg@G=Vf$eMlb=j?5p zD;4>5$_4}TB2v$_#$Png32ES5ryh|U&}qyWM5W%OZ|No969iQ@d}x%{UGQJokX>w{ zVAOVMb@^Not@GrTvMo_Zw)0T0nILRv%VFFWl7Sy~0MW>LKf9OdwQps9#qE2``(DpA z(75O|W8MA>j0vw3_q5qJ`baoDfr2(KU=H&)HhABEb~unKnF#}2rXZ+WVkAqvU$d}> z)?7t7s&>kKjZHv1uVNQ<5Hw)>wPQaTKD6o=yX5&$9g1<1@4*3kPl$27Dl$s>SPKU| z!G~g%y@IUszh)GjO?izS@j7X5cApvI0koG$Y`nSI&dt{A<=X)PL(5UAOaIW3>nRYQ zM$8iP*i_&EfXvMV-*|MYBadE^=&yP@?ut1VWE>`vwFi8MUp)tM!GtFQCMO4VC!M(6 zng!411mjkhy?&DG`rEbd9=xU!6r(0*lozj`-s{k(RFUK|kMf)wxF{ku#_E)S`ziZF z$~_vHhhVu${}T{{8nI+DgBH^pf=6nr)}lj(D4tk;%V?K z@9kj@WQU6>baU3{^3oiK6rpID(Gr}yi#d6N&6bj=)^esERBkgCJHDRS!9Y-_Puxp; zDe#L&{);zH3zqQ7tyoy~gH(rJam~#f+9^5vr8A6?8=`y&Fnl&5Kn&oK!8><;@yNhA z>V&xRVRJHYN!VdSwWFD*(arui_}@IT+h)C9ET+WKD6PEHJ{`%V{hK5=*qJ8ogRwj5$vX2{)$!T{RT{V@vG2;xB9T|0a0q5{kVcnX?vym4sAa!7+7=}fU69Cd{KcKeXLfSW{`=HvCaX(Lq2(K&3>asq`8;DhdJu0@9>OuOT8GLQqhU zE={D1H0gvEdZhO*B?JhB-bsK!sNcdeGtYD1@Aq!KJMM5C8dnypT-X2nozAjAqud}{ zk+R!H<+9OmlbZHPP9SLS4M<>|Z@xqOV-CP0f3=f$w*r&0+Nr%L;tnQ&qK&v2!2*gO zJo2xFz5;{aL4p4<`Qe@VFdmGH7=~VN8~!o+aZN?WRTtkX1efn2^ewhV|EkO$1}d|C z+U76SqE`VPIS1g8fys%1PR$b@S+kfMJ@qdh*-&*%Feb-0``P`U>xyYMk0UgIUDeGT zpfWoy>?A1g_wa{}KIp=aq`-uv7BKp8aLtwl1!kHSp!qED9iq-2GJel0T4Gak?R`oS z-2uCJyZS7Z>Q5e7@PtRMTS=w(n@4V!%gCEaQnCZCU_W@|oR{c(UkD888fo8toxmvj z0t!Z;NRJg*Gy!6swIu<_%_G-Tg-?CQl5$A;pu5ETXkW> z&S5rM`)Z8-D`T{~9L@f!>uab?Ay7s^qY6Zt@EGh-`$Qu!n< z6U*1}+FF9MY^)UbyuvO}W1{Ym(U=Z1>2(%ndI8v+(euQElujcZ;K%T$`^2<$@#TCC zNvX|PTs?UvI$lOQPE$GC?R^`NeIs%i9`B{X5OYI%(8Y~tEO{l3+*EfVmEl#Wdxzd? zz^K6?*$(gsqX&?|G|eGXapeFA*!f*zKP%D|13`Km>EtY<#P*cSE|o@O-+%6Q!z=*3 zABzkAjIK7-U*{)v6ITmO5y?{96=;iiIzbD`=VO3d+w_P|xj0iMnaBQk9KvpNRfAHp z)tI5adxOLdpO?0Z9OuHRt*4AkXM%t6B z=QG9*NRCp;M_bhpMxr4m|J~k=t{*xwxzRzy^1;y#inDvKkBUXwMDvzmlOZ9K!R@7M zyy2tx=SBi({+t4}>giqTTxDe8=E4O)M=mgKBe-C_RQ3K$T$*pnc9F)*4dz#^Y3aAz zTI^Zrx}lVrKsf7Nbp0UA`@j_MD_Bdm#J>W?_`c);K3;N=fs4Xn*MX~gXidY#x3%@O zEUpvo{$XldT!8K)EwBGq@JdEe+?=;lpCtCH7lnio_F)4yHn}Rh_hY_PWK- z!wV22lqHpF@rO7%;3(Ls^37ibr?1R?udaw4f4BcKLiFSUYC6VhUH1@HCp^rcA-VDG zOrI8eX4^%^JXB4B?-vLrG7Hlof97O!`vYF~kQdlwA_)0d!=% zt|hwcUKR>nE~oBoDtUm{m04;0tRvubR$`@i-L~_{R$>}+mM&o)$|QBr+i=!9ib_hI z@z{v?kp)v}08|Z| zm~b|wO9a!|+(QwFlH7>F?PK@zyC8xF)YwQ4kWOQQa0BwM%IO`~tHmpeJJ@k1N5Rbp ztT}1$TWKM;F!bvAl@wTEn>(F8rKn z=r&l+`*7Llspe`r04T1=Hf)4 zW9kW{hIQ9lZe8$5FX>sy3}tu6fXz?m!(@&UYo+?G1=$uWgL#u+1P6Ms_Y6W=YUS}V z%l_!@_LcY^!{-O<$Bd?&&L`zQ=zNYfK5}vhf4T?fy#^YYA?dA@$kj^AvKmGcuK}f^ z!rhtUU85$iopDM2%SD%yOx%vsL{ zFF)Mv^M9zfzOkl`FMh&!!XsO75}c^mXU?YlTHPtwXJu@OWA)C!+bYQ=;aG80N66)q?752+ma?MH*rH_OyE@73EBAkW{jp9B zRF#i@!liz@0LMZtK3IK?D5p38DvaJ1k_n^}Fa{nW9Q>urAK9C$<@QFg**z0^O7A39p~RWjKeMn_wa#NmYF~{n@*v1zC`#R3sMWxSN!~|dF_sQ*(iC5$ z7>5Wq?^1cFEJCdXv<^-C@O|jyHY(~PX$DjiXe66Z@y6}CRv@EUuVV~-4qvLy9VY0Q*XF+o;GE)_#<}zTSjFFyw?}PLxSGX#J z`?SDvH1SJE4k@E&IJh={?k<+_;tgy6?c?2*DO!4PcaOw6a>&B8^Vs+!<6b0{Xd!@u zC+14$Z_tNKH-{8MeV(i?_%o!*-Qj&dV5$YuU^oOri7u87Yj>&wLSKmmq@4kk`;GiK6>~2%UI}*C)fnpQs*8>&>!41$8+N!oOrt7=e})HU{~7&{Hj|GT22F`oSA-BT8#Kfj zr%dG@Zp`FmosvaL1?WGm(F4zWZ7tAOLoY`s#18Lh;w{@&qEWgt_ z%Jf?1ZCj~Yhc~4uL>^e&4HD+!Su+DiVOZ@~1pH=102<~el>ET9r=qNoPd{+8v>h0! zx!-AQ`JR|irZUZtxOMq zXD`h49TuW(O$b8X&c=~e(M^4yaox?*vM!8%ehW-%%2Ol;Bq{5aFeQE=!(11SNIl*~ zXE$;Jfk$rf5b4_MJF&$;k%M|NRfdXGwZFB>4UWSb&ImxS3{Etm<1>hq3>v>+O+`VPawL z{+MXLNdP(krPp}}GOH$Nq@>;hI;OTj4mTk#4T#_B$?e z9M{GegdAt(FG(Bs(#?2$R{x<>t5TRqqGiyxFK=2#a6^{Tn`jdNjYLRy48fDPQ9z>c z&zR|IvHI=?AmN-d+~HGXxa&s|K-C2@rb?4EhAJfOV~qB{%si{2REsmg2oRp0$K)R2 z=wvuQEmM^`_-@6Zo`iW6liht)GY%8n)?(|1qz6Osffm?^l;c&`Z>L-!!sB$}NNjCF zWaqVE`7M9>6;EBRh>c0gdBTv$IlHP=7is%3hZc}zEwI2)uG29Z-$)8O9MlRrdfUaB zYgfWNoXA_ed8b36mQvfGbSaE$MSy3`+;P8|9%4tNdoD9xw~DB_;T3@N9=UN*0?z*Y z;v4F)?RuW0dYrRHMbZs(J>H{Ekl_nG{W4ZIHJ2+?nlBRtdT1j*M2EcYRl_?=AF*k) zAn1u2sdZbm%hv8FaeX{$%E+RB7U=g3!R> z%UP`LV=ojDBE;PU1BTju2GcLfJ^wOFqGLB|hi-7Vw1n&OxR*B??rpdaL8YlJW<9kil}|o`C}X56)htSrqrW&^r4kq zL=2jdwfI%v#VM+UI}e|fy<7h%dp}7idi|G#B8~wlv_6?xeUWfH1W!M_Mqf|;KZiD$ zE<`cDFyP(%F%Hlq{(A<>I(;yX0iU*q!NRLoBaaEp=&^f1*P;xj>9`rJf~2>`KeN@A z3we4r35eJQmJUC!`UF4rl0A`&M_@jiAlet(QBew ztcvCMy#?Ye@>wmA#r|Z(zWu(6`?r+5JImXRK+0zTQnF=`X_%KSe_v8_g8f!;ne$mF z_r?~R>Y`)A7Lam^ks?X-K_haJ6CSl6oNC6)Jw}skX3t#*qiDujc?u% z@cp%7Fdx$n@|#992_d9Vb$9;V&t9@RyW4FSU-0SJxxOKiUDR}t`}Mn_JZ1EX2HdorM(R_x}_h(rTjQ~WzYhMCIH z4CQ$mK}g>_k@4>n&)p~A>>qN!1K}aJ2$gK0Wc=PTIjF1(1?M4*LKpS?FIKiuN5tPs*8e`UHo7jOS$wCgsw%-wdbQ?O@abL#?TZ3&3a->aj)b7b)}%Oz)A za<)LbUxy?1WL@`^3?5O0iY?kLIlfkvl6&N`UbCaS_P{&)#`UJ72GG$r%)N#=Brit%@Wel&)CRndmyv<=jnLMDtWO-!MIFUb(B4bapW$q9Bo| z*+T_kG*|i{7@r2BI~A*XeHrLyQcZ+qCynhY)T@cV2}iXsdFmKQ&w{w*Z_&n4mQdM; zl_D*7UyDI(H?`$|Ny*8&H7PP}OAw&;jNqY>TuvOdJ%E6iZtbpEq86s-8_HHk?W-Qe zzhdf9gjA;gl#(-(-J1a^x#NFH$s*%U8vjVi(R?;RUjt$vu2F#XjTp=TDcRoZ=)rF( znSRsl&MzrB+R#g%6isKQDzSR}hx+q{VM_g&Ckdi`bCVA6X{J-jk)1ohDv=@4xr!1Y z7KDfl>yWP*TdWp@9K3LN>?nnq!Mj|gihW7Zj1lDeOVV`PHB3sUI6s7*bqQcI;A;o4 z7x(2HX<@Yf+g??c$?@jU^Ay`Pq`4`H{4?anEAQ|xKj~5ACyZ9GR7tj@vb_=U+=7zvH!=CujHGqlOwz!=h^XV8zGoH@AdPJS9oXhyblz8jwNT zcL%#R_{bnX?0G&vSF6gE8lle#I8<9Qf%^f9DT=`fI#yhBgwR{`XO!@)Y5h)r(jruJ z>Jba5NN4#YwfF7Z-&ArXVaRCYVPBx2hb(E~uS`5=t%9@J(vDeL(31tLS_WWN2-7UV7h?QqWMPv89!G3kdlGzLhpZX z7phPDv_%qS<3MhbS=y=>_kivhQ00h6YFZHb-qQ<0e}aA7P3xeaMrI=DEt{tW^{Hhf z`B5Lab9J^!RK~S3-v+$X=2x=x;TzEE3#xb;;`a&mvgpBq?rE~Vao1z?O6Xm7m4pQ> zR{%)l;-kyHj7q43$v3L1*Jlw916=I(^ch`lGyaBADY%xIYc;_f;BfDDc&}sR+sx%~ ztlM-*(AiD8t5B)6)pD>W-h>MLrEPvufi_Twi@Do>HDi+wyX^A1<4>ByS!CEW z+g|oUK2^^iw@=()R*n;DL(bq9iNKckwg@t!;-Io@_QoF27N~=(*jNfq?sX1sx|JSZi!1F512*{+>6kTG&gPwz?&0CWmJxkb>-olpH72M_bCYfxPn!weWC-ceKoJo1fjp8y6tI3VE9#7d3toG=^I_{eRM@J5uxjuew`7%l;eXLt>9o8_ddItl@S+_Ea ziYcg6LsZ2!?o}-wDprMyHB8*AE}Enlk61Q0O%1VfT*|BJ%6Vi|R$;vWopsF-L7PS5 zzNQ{Gdo8{M+GSk0KNad^H7XmFC9*nf?po`;2A;yl_G zgIIdUAvU9_TF%qUxztdv&(aMTR$LR6qfQh@J7Zs?+H5{yD(3#RjOS@Wc8<>2njI2R zi4NW6TE;RQn z=Y!5sfBZ_t%GYAAL6*PfYOSZ-A0b%iRCb{C0r2iR`nF6 zcuZSn=uR0J9K|H){hZI(Gn*ZoQ@~U!2C9(rsHb%f*e@WmUuYY0lDLy^y`Zh;+B@OG z&YRR8d_@$NUJmCxm`W~(2W?&zqpc&rJfDJsQueA&z3`n8R@p%`#>d ze#3_snT-s{)J5#VRrTcWBa|6%JN2nypVv#@o5b>|&xc2ofKimfiw*b7s8UtvGc}Ih zt8V+)Q8QJ0csliY|!z8-9B-uyl(s*s@fzd&oSi z`IpQ{*t5*3{?D;8>iTKA-;Y=c=Mv$210Yw#=#{I_?!09GHhEr)l=^?NlA}Wk zX{a@xJaD?V(zJ1v+8imBn?hG>cV2{bp?A@ZlXPDjffsp~9 zD^yaf`C&JhdX5y?F!nNtpiO{S!{kYthN5ZW6wnkedDCp@e1o3g*hQTG-rEcNp0JtC zl100!tmdP!(E_%!qW&d}^2zN1yYj zw1Y27C2dpv8qFbnQ!(f-{=Vg`s-(Y8IlGm@x)U=*rer@aNX zKc^BWlr?}Y#7~2cTj|<3fKPo0kzI!_=N8*L)ShU`H8&6Qk_vRrI!a68-f~D5PLcZM zRXo0VAMbc?uP&AISCASN04=$@3E1-Ft)+;VF_Rdm*Mvr-OfV@!c*F>cQ0$Qw(0YpC zs3I*#7ahGL)+8ppO4@^TKGIcma}IsqK>O*2DX=zhz3Te@XVfV<_+zD(xm()(2waDj zs|p+FU>E&HGcH))xP2;(R$D~YWg#4vysj_X&(C#RAbCeI2$p%?d+q+|FBAleXaeF2 zM4XzJi0n;1@?JssQ{=P{1|aR;<{CX>B{$BzYs~Q^_J6GjD%+XBKQ%XeeD1#rnOquSzx{*Fsx zJkf}j(rZxgBk9YxnU+11)^m$EhTPaM9r>!Fm=O>VIg)jc4*E61r1PFU{BKz+81sKSG>?7)(3#5pSDv?afHwQxt*bk zF#GY4`%Lh$ictP!K>o`cDBOS=TZ81s*+zMGrzn}*X*Ix}mGH@))n$38B#zwcrMQ|f zovcQ8p<0~Rl!13CvJ@soB*He_-LbX>F6=u4rp-sduZ>UFxHR05?I~uz7l7kucRCF zmQraPVeFpOHp}IZIt;{z+i=9(M0DgpaqHuZ74A(#SPcjVY2E zI7g&7*PkHf$dIkhtcA#wrsFDso=UrLrS|S!_`Q**mK3dF5iP5$XWhm+rx*2V)4yrt zR(HL*_#vKTrzePke}|gw%SSRHIY{QR;4fcfwIfZp&)n@!8(iV`Cjn#9K7qdRqjq}K zWp06+kS0;Ro4do_Vu@eJ>By7=>s}CoM>^wI_q{@go3e9qEfAwatS-|Lu$$XuYn9Wh zi_ILlM?;)P&1LbEcjTmDDh$=po4^8AvFOrQ6n-^qM8s!Z=_y#vAM)ZM4aXV&`S4T~ z7KwIf5y20bO5KpswjdWGW@w95T-Yyxw74{1KZcOV|79d+)5E5GWv-MVx4>tP_C1fS z!C97QJ#JI4y0_v1BkE83tc2kjKj#2ls{4M-0Y+3zea==Qec@*|3>W}eBTojUkJu?x z5Aw~SYQ13}X3vyJ3Lh3HA2u$6N68}c?n+n#LonOiDnO6&~4ud~hUx@A9%p)^^9A~hY1Ta@kzCc?3+S{LD{~WS zL8h2sM7pOxxI!eNMuExNyS#iH(N*p8BVS)##D5A-w}KX(^>3h(>8De+=yV&C5ebu; z<(%8N=3u$r8gVPPsE|qHp%2%PpT8BSCg3D@i?uYruW(%Dj@l*qH-qP1l?h1z)1MWD ze34;L;qfWM9zH|kf1G6HvL8;e#>pz_29vK-7;3PMf)iF$Cd_s^XPIBCTb&|&c zCpmHX`GhFEJ)dz{FnqEAb>xPk{3JC`q718kJftL<{~^(MxF8Lf8|}kBGg*6%DU+Vb zd!a6D*q(XQyja?%*~#k~fq@gwn;=blQYZ4U?exmlef;a#A90$VlQ@k?DDqL0cFj%9 zTQb${Pbo|Bd(%|j-=W_v2TI+#p%EH~rvoy-G`K`@?B}(o)()RDQO^1SI{|dgmyP?( zT4_JF+E*h+_4{Mj{5id!E+jTE#O!51qiS+HqEDAJ0z#d@Lo$%05sj$gPdH0Ed^zmN zwCffZC^1xD0jLzQxrl_6bT4&Lldmh9^C2tG4tWoVnW^U-rA$z8Gz*jkH6EfYF58w{MfUc!XI&rTO{_S4fg*9%@ zS}!w+!8htqqb_1pq_R`M-(W{m95-$zIVR0j*+7(_-Cvby@*Xh`dU#)fBl!T2+cesh z2cYClN>z87i&LNFNrtO-b#=EWRqdIaztgYEB2o_*4b9xzUB73i!tNWlFuLOD*T-@v z6(rH0r_eT5%Xvs=dWq4N$`*{4_6E23zTN`DYi-kr;8i7zi0lzD!`N*qVp)>tWiU`w zq*n`0x;T%Sf<6ktW%hJ!pLT!a4wg@h(3-k}xmi$%BoF15KBP+KHna#5e~&f81XPP2 zKiYT0FORo`6EB;V5!`yEuc+!@CObzrN{yX=emzM@uK@WdKoi!#bHOjjEF&oC5(cI`VjK?HR@H*Kg$>?_x+16@nMK!-hE{^ z@5`)wnNq2;s*QQWSj+ou$NFS862f_DpRYhWWyTchQkzvYpH#r(QUum58+(;wR*-}$ z_G0<$@k2@$@S{w6z#NoTJ@xs4dac!BVA(MF%(f`D=f@*&Xf69t=#>OuR*LYR99 zXu0=$ab`hsE3T?ib3)EbQ%#7n+wxxa#j7qvt)4$oYTvWeH=AzV!sM=GjWUm#8RE!Uf&pU&EetA;xbWrvkxoU!VW>a^A-$P54>$W&9`4(yaOH>Z>C*dfL4q7 zK}eHwN9<*1arQ&n!04mpGE2P6?B7;0c%R&p-ml(XY6D_I$^l4DQ@nt+uIXFRkj+Ewr|Jh+*~M}XFBTY%yz#hkKvKNfCJ zio0|pbbNZUm3MBlXNquFooVKp1*u%VL)xOb@>Ir8pnCQreYJ9!c>A1Q4!C(jLuUW1 z3|+Pkzq(CyBI|ME7hVClaxClxqIi&`<#xO_5xWmPB96v zqC^5#@){y*a2U{CmoRo~Wtg=gnIoNQE2`OE-Vce=hj4E}JHkvG(=bqziX-o+<|huL zj!Hi#1C{neO*3s|qu?h;eYBt*;zqd$Ym;;G&EYpMD_pk5qOe^(0?uQ?*_F@+UFZm-DkLX_B-5GCHNXGc#|y z%f$g73^g{Yy!(hv8%!0{PoC(6x`f2GaPk*y1+InyK_3>SW z-E12!r%I*3&>1CXG60GWKe0~a|BH2UBmU~IC85OO2;YCP6+o^!X7&GIPiQ?~eM_yf z1-afWy)Vz0Y=^mr%Q)v*vMlud^?ED?ne+?z5ow;(Wn|xqmtAM@{6a!oT2_?YbzT`M z4eFaUT*gu4>BB`wp3W!oyeyj?!6sS3=JD%ynUIfst>t7yrY}bVFLx!9noo+G-fE+} zOks{1TR>5$Fg^c;QwZ0^bUHeJCJ!BazH1G}bgz!8)@b8$-)$CEeK|W=uf&1>g!8cB zG8FmJG~{x~VRb>(+KrvOy}Hlr@>7k+TY`c?qU;Dy#sdNfxBR9`Y%gZ&vZ9Vaf=IH<1c_+yz6KT^l9|*a zu>&sq!yIBy(jI9Ut57(cij>Bw7H>kBCJvtBQhN)$R#R$Ux5SH6jaE4Iy(=@4gew_o z8+nx?&wBO`XlG@TF^LKi%+G%vQEUZEv)7mesl*qxNY9fV5OD&r7-$t5%7a?$Y8k=& z<>=K>5;c6{KDv@a%%zv>8e(O7dPHWI8n<5!w+ksui~GCNiT*fiLE zyem8F1I1i(BM&9Q$7t=MtI0oZe+M!u=WelxEioiOTr!j;dQh@O>$UvNmn06)#d7kX zNUUQH zq!Bhky#xuF<4`xW}yq>-Ls5&K8{W{n3_x4O^<8($LZcX)m)8NTHJ6=7v zoMCb%U?bi}&#k!P=qDI1TY7d*`<69Os<)$`Ddy+qTfkA2^%4YNe3T2J=r4wMCUi5{7URTRQ4PqVVz} z?h7D%L#tP&r%w@2m<9B%i>b^)%L*`(OmtGS-R11L3M z0aavkZQa3pPDOh;b^OIv_&qaWh2cZ^O2k`6e_`*9V(f>3?Lyq#*yn>*k*PWjdJ8Ms z>e{|}s{QZYBlM%^E(a0L7VDey;<6SB8E4zzAp;e){#4_j-!F57Amypw7|Kj6{S;S9NByN7b*Zb33HE~J70*0w~I%j|O-Ta6GX5EOG zd8T=N?!bm2N+mcs1$4;jP(*c=!j4X$=xGA6g zdQpt_-#Z_7J?o%fa^TmF{C~d56`Z`uY5zZYlM7~MZJWibRwwWpe(Vq}a=yWIXVcu0 z^#n>&0H)ynZ6AN6WhmV)E0{^pU$GwZm~MafJ|#mwjA>Pm^JQ@kL_L+c$A1z%_byN) zd%lOjp_|hklwfwcxiPJss=U{`H(%N#7`rjlm^6zXJtK{Qo7Zlco=%sw+!ry6|HES% zvcAr-YHi7G>IcPN_v^b3w)gTTXFqWiTY0ZrSxA&|!lZ0flSVBtrH=_9f#ngA%e?N3 zN)Uv9d}D=@dBum-Zr&9OY#foFq*r5ZIJn|Muz?BllVDZNJBiwwJa<_y71z0F+MN}0T_e|wY%L4OwZ*)DS?qaq zFrt;6qvvM)5qrkVCaFoPr!46@Ylsncv~!=(TIycxi*#GUYF)2LPr1QA_w0b(D!ga0Mb>#6;*ZR>6uK&PmA zjqTz^EcxO5qR)y$`6vv=onE4E*pE98l|ce5KFU7daAvS|tUzXUaSp0xg&)7@5Bnl+ zhIwLAu$dB|Et7j2)0?bge*K9G!C9=}L%&wDJGHOaCU5~$FQhjsg55ED5rw+%-md^6 z=E=`@#X~{R;}qTuO@W|L=efjl8q4U9K0Rpt_00#e(s~bSN(6_&=ebVjBtx6GHSH!p znN!8`!Eaj!+x#ShBK)e+0?o8fu1Xv|hP2de+ttp+#hzVNDm4BlGWb7k))qK2Ho1jRV5{Uq09rZuZl0Tm)ISbP%3dCu&u+>BW9jJTcdF|1sBI z4Os%_TFnhy*xJ>34SGqZyN7Fzl8G^i@GLQFcVELR5|;!O@Dx77&T&?5LA+TR=7@j% z$?zfAPo!@AM(?Lv1^*y*^VX#lh9|Vp*OzrcT{{%orS!YW1_|%f&lGc0D>yY9m2gzf zkGLvV($QF@eR300)1=mW^2*pW1^Xh)ESj&COjegqw-!bnT76*= zsh#?e%yYh`u&L{z{mqVAJ4;ewp0O(Yb?U*nQkX_k*HTz{gn_9{0>e_jXQv&6?r9bv(nuVUWQe9J2A+Wr&!1A_6 zCV$O-pW@4+y*tF+GZKm9+LE-#OaV3b21|d*raTCz0N~tm8p8*)!{XJsre6%)7a~5~ znQh&nZ`3WYK$%Kxnv*?l->XBMy=AN6Y1>LoQe^8EtGow=KL%ZI`)yy+8{^JYkgw=7 z33Zjx`}w8`4>8zcc}2&{P!(-^{o{<(%F{Pvf#9yR6I;!-hFpbQZZp%e)g4~_r=)F2 z+57wM_na1?ld-%KfJI2bY8(c={71B$Pw}oWYNepRV?(zppz<5?^hKlHRuT|93{Y0^ z_!1*Dqnv-Fz){ZXn~^Lit!Ld4JUP#D<`Vc&_v$@Ln-Z_hw~a$qI}@JBnkiT9Sn5|1 z-bs1r2zEDf)uBn7wl@dg9Ki7v6CYaFr3p1Ob7S@fUwj6-LRvYMiblu<;3n_f8Z2C; zz7@=~(811xYPS?UGmG+YF7HKpiSI3dX@Dd~2ue6WSbaCk?kq1z2{lA2_j3mlTwa)_ z#ewzB&2tLYym!qQzDC@-xX(W<=wbn9JM`gxOxSoBpN4->1pGHFdn|$q==_6?B4+o3 zz+}$wKq_wiOUd=Xow7MRZvbaryW%8k;M;DL(E+!_tMTBdJcriredq017GId!b+l6p zCw+qD%UCCWU~}p7c?c>SDiI4K%o zGbbX)PAQ*a>+zS?&*l}U#ZzZWn^JR`4gA(brh=oo#ZR~gpnHHy@kdo1)nA(E^x7M3 zviwQMa`!E+=@Sy0&aVF{1V_8|0=z!jci!z&Xfq!=)G%uxJW>j6^H~fvlVhJ5q{YyN zoR2BN@G~sjY@$iHt*2Lwp#Ip-vi3Hr&-br0{XK}gJop5j4uL<{&+~%c$0?rrnLvN0 zsi4vo!7LqJ;K`v0@4O!lJ?vQm6NJDOWq1>YVK?dXQIMdFEsd^0nlKSf;4QUz_Co-F zb)4;O+1(COv-M1e(Y*uznkj2L&h805+~hR{kJxiN-xP17oMXAb3`wgU79$AtXhWam z#iDciPl1x1TnA^S^lw2g(cfM+Md~+cd=D&FNu}c5Tqch87M)==_pG}BaGHBXrMLN( zhkzEMiNKFSly`nDz&aS}c^9et(VhJAKI|{L&Q~Y31wk<<6AQNiFT9K{VY0L-omcO7 zD1dvdUzuMNk0&-F~UW2-8FMui(GM@0-joOojCPVbZFf3b8R4AhWC>v=7^ zK?Mpopd7VnIQsZ!nw+`kFQ)FSLbm-o%zu(}{@=g7r4ZT3o1JqSk7Bqba!J-SGRpI( z46l0+SD;$d*cW8fL%tZ@lCE*)#@B3Jc^xT^1sD0lPYCp&AM0Uj)@_HFKUt49t|M@a zD!kHXEI$TSt}{L1c%p-?#T2DNm5AS;leeS8L&}K09PiF?2&QlM+Jf@5&e$zWM zrW{IfI0VhxORiBFuiP1u@{;fxsM;TDw=H0_Sr;$OaXDdjZ4AlVW0PP_BU0KA2EJkp=q?h`uReP!z*|4VM6>bMd4JCavj98~IYoj-hCl9! zPzod80Q05fbF58~&O%?E&NNe-G4n720(;;cJt$-w>Ul*p=J0cXBw-wE}(k{W>Q z+n`O^+K{Cp#orK{xz^${;1>kG0Vv61k5vKcY0BIkIQsq3Pn;fJubpwcbX!JDgw$4@ z4=~F{2;f!|#y%m}pa-liie)~bYVu{N?J}^>o_-2Pr7e&po1a$ay7R}orqid3zM1IU zc3UU~%??_W&0IE0tN(>0>w=jbaPoKy_W-1k;cnwiU?+dYSLte+=;;P3EDui4I*eoz zP;wi!MWZppN>${VDYg35c`;a~lkM7tu&>P?GcX{50x5S(1<26;6Ec*m2l!ShBYrTt z*u&nv7m1eNp3MKXFfT8SdzX~YS%a$VNjZ4WvFo6$;Qr`L9*4VjvGn|<=Y)k+Tx8En z(b-|)oTXbYc5fyhMUgK1cPHWBi47+JNb)0p+pW&bP#RDAH50kiJ#lqn9rE%Yo6n#) zjWD#_cA#Yb6e6fBJZU$bu>oa=xJgsf%0lp=k`lkj>tMIkKm#0fSYMb9nLk>d8k#!g ze3B~?9!Q;vp!#dkF>N&IueC&8KZ&Zf7)bfD=|rzJVZZ1nlDx6}>PNCjwI}K%S;So; zVZBj|O7b$$C#*ycI~5%CD>+=xu^gb$u3h+rB)bAgGCPGt6PNeYSeV1tZD0$n{lPCJ z`Q+<;Hu#w8xhP+UEG^{OmI>uw<6Hw{4|{PjB=tShH_j|oC=>0uj>*1^c1ts0`A}S~ zTXOgccs7PXXDKyVm1Gvb?W-!;A0}}1XraVX4^+emM2k2GR4C=dTp0!)PrKAk8yU_= ziE7`TOe^oBU8Kg36sB1#uE>g#6%tidNIJWSqVs^UMJBa={Prf z3Mf3i2^dIjRTmGY$Qx>3bvk$*7#hCaTpyOgM{8*EDd<3MPVlXT)WXq}m!x&2VIytg zOZ$zC0uk|7x~!qu7H1`{B$@*!6!~e9_!K2-Fyt9o&=f51REToB6RUW~=u12;a9O>k zl*($bk)f=^Bi)^Rg2-EdjFlC7$3yq{O^d%C=Y~grb-&1JA=sS%yM(ObcPg?IVl`>I$wiXt6c z&^c#NPl-6){6l&pg8N^2(osl%hyzfg;abS!Ho%@Rf*{Us;To#*0YiRP@aKPelX8?M zeLD|+>_Fwen~HI7S$XTPj0mgERJeI?b)x=>r^3o-$4n-f7h&#ecB3VI8_m2~7PAij z92dk8Y(UPr@LD$(cwqmcFaM=Dmx2y@{~m5#;Lsv5BV_4?+PfeuA0pshB=ZO3tmL7M z$Ck#Y{}e#9Qy$tMEU@ygY`ePQZ$Y=BsHkaF6PqGmw}ZE6FRL%h!39Cb+b|dN2bR$xNqZ zuM~X~pp)Dh4I|hHhIwAl>uIHYM-MkysEaI-_f_LH9xrLoi~0gw_AZl|%SM{&e4~QC z2)u4BVjs4cZBuO~^Md@xuFmIw)*jxF0Q>j-Izdq~dZqLP8#3{p%C-+l> zwudK{^E%wB=4-d$iwwuJTbnE(`~%hD_>wBvW%)UI$&{W_<~#Xk&gOB5V*nL?A=hYk zg4Z^Yoe6$`2I z^mnr?JcRTK_l>vCSb~}^Z0Ay87tS~Tf0VuFS5w`){`)8*Dq>U=P)bA;R0KqY(4!(C0!Bod zp-2ZIgd)AAiOXq4ypLq>ykH`rUi~_Bdml@(1Ka)>?DUd*1hT zeXj2}1vK=!auAg>ZR}p5++R%I>NDx54Eu9dx^)|fwuh=%Px8%7n;S`GuinZ~Et{SR zKB+0zcQkk)geh=duHjIThqOOzx>!guGl-(=d{@w5hf;wa4e5yzAsnz#Eh(p$GV?iFlBkb zeU+CTD|j}iJdU3sr&UVH!7m^!;;BJ;Q(Xo&ZR8nN+$D@05z1(8s3vVX;{?EtDR&nC z`#Th}5BcwRYrXuKnaTV=XYc>(b~lhHb#>fNOa3`i+e6k{tXH{hUV5MPJ#ZZi{ndgr z1(@(dKEm>{^0Tge?`6pe@M^0`;Lx_SDjn1+7}9f815M4x8s^(p%r8v)sEetX{2%LC z-2U%+9tJ4!X{!IToCKJQ~hj(wV+nLWrl#`4+>ePJl-#KgMg1GwxZMt(u{or@Py z2fqUJ02;Ez4WRxU3akXLzLiRl!x!ZShj6hs%>oTgI1qrUSktpnx%%QTMk7=-3)?;t>qJ4MZf5fw7k6{aR)b7b$4S_y`Y*l)Lfb8gzZpOhJT#UZ zn+I2g$#rLMYskeeoJ3O2RNggy3}<=c)brx`Hy)N)Phd0Zq**`o^kEVIsikMHAhPhF zTSjBTo4S67U_6p@ERj>zk5|nggQ;Oc6@60o?zVzY<=?Ky7%8G#N@D6?uoqdP$r^?RhvC%BcGZaY>aGhC*;Wn@Ph z`8B{puY7m(g{&&@$r~^;20-)4q7m+NMs_OZCy}Cnwfo0c#K&STC zxdA#SrtOel?@F4L4#K#)2|te_Lv>{ECP_I=?TdxaIQg{$06VrG{(TU{*aixVqA?1%>TeIP zm1>s~hj3a)zNGP3&vVC%)sBiQAyV40N8zS_V>?2M9{)DK^~op8+jRVhQ=90_2M~zL|Jr-BX)wZD zheh^ISJ6+O6d6*xMu(Q zRl*1AW&vu`lyfE}?>eY89-?QzBClA-u)&^U5I068LQrN<)pTN zT}@j5Tu#w^=yu(<9e1!1d3Q}UL=9GuaZ`Y2?pp>pHJKc-|CsO;GQUoUbB6j2(<-~c zHW6+8jM_4~vDMV2I9_ahEqbI*9gFSYyZ|cpUH+NzO7)v))3fH_y~_ zYA>pvakwB1mJpU%zI>FKq;}N}<$M$vz6S*2)+fA!E8ZXES z#JJ%#eQviob$PBtw}mT%-z?~3WF{`Vm!-2I1%Mmet8@iOPD69{ENW{TkfmeQvz~u= zV0FUc7WeV(!7IiWQ~F!Qzgy0waPG~(ccc$Vvy(tOykBkbvbNqEY70elyj77^nhtyk zohv=^paOBcs|JV!5YW7wRe( z+r|-17v=?_-i>9v`1T7FVAARA!EBtjay0I14ni7porn;a=M`VuA6@+S-60K>OQ#eZ z_AQ6;3MkNzrPQCy;L)>xsjL+5lwt&`M_sBm%jNU8)N( zrF>eyJ=^q?+%2x(s za%$AT+2;u%3i0QP_iXd<_vdUi@zJzQGU#w?euYlmSnkyipV%KMcCY8ezxGc z5dD#(n`{sS_l;hLC2oCN0XQSM^c{eA)r~5-kt}2OoETHar6I~DQaaGEvM0UqlTKbW zTyK?x_C{kY$>)RhB!D}wOs)24c?}SRt~Gf8=#jC3(Ck&`PX+=R_xC^O8Jgl*{<|`*e)ZR!5(lc`6oBX|;hg%-#S} z=Q75A?(%pjqNtgut9e-a)P<;J03^!)dbf-T97H!ST|H-G?ohrmcYCl`35*+_q<0Tv z-rcu4wPNwv`^)c4g5=(+Y5rEvDs-bnV;L#_qawCvzh~`bd7C^vZQ>IrvdE2C3yN`@ ztz5Oilh|mIGo2I?JEWaTe)chPcDvBU|7Ny^H`#ILqQB*jPqnokBiAyMC}g{IR@agG zPUqC#)1GT#WP%U)z;XZg2X}JJu*#m;#gMywIJ~o7X<=}2GI>{^(ZLlk<-blom^0K| z&8G&eplAhH2cAWT7k{^qcXuO_ED0Y4q-I+hy31YFzMRWy1wV(2Ja>y(RWdGgE?dy^ z$aBj6VX*JF0tmpq>9bGv&!V<`z{{NS04f$+ut5}kD)-~~d^0ti%$jH2T+VYtYd0@b zGN?L5c`=C^zcP%K8~n9(<)Ft6U_cuIkC(X2YN@d+uS5qZjd^ID8mH26hjwidj6@ZM z)C?WVw0N3o2Hm$?FCEG=*rz~7#0I-_4K~m+sh&xR;HMCyzMsgtES{fL{FrG!PAxEP zsW}JfIco^K<7u`?jYDrKV&T{LgvwF-=0s24cTGXK93|AgWwP3CWRDVL&62Y? z-zyM$iH+MqkTCTbMCxHAaLxm@R6|3*i1)Um^}eGXtU5PTR#|3RgTFw_Yp&da?w0Le@tsBqmGdb3kuD@khe2=?kS>w@vj)5y_0&%%h{=yQ$hNO(a zeye!t`U0D_Y7TnS^L}R%z#hh&O-|`&1Zd5&<ie}E+pc(?J7THg!?cy9_g2+_-B7FjzW}i8zqbENv&#Nbe|lB5GF{X94<*p45AXw# zU3TZa`s@gWTlE?!n~}&%CfYKKg5dw&L^=x|0(enM_q!pJ2eR0kF*<#`1$qUAO>y2D zA}=O641PAS8^-B-ZAu>wvQNr`pmV#XRpg?>V@z7uVu29v?Lf{PS!YzRel@rceos9; zmCIFC_#Kz`)2P#tU=HyCU52_)u;d7%!Fw}#l^-HiDeffKc|k~FypoO5_tP4f`lOM7 z%^4(R*GupZusOUnXQkA+m?Bm%nnPKJq4b0*KCKAsZgZmo)aF^-ZkupIZQ|yy<$uwY zWBO3a&J2s(zv$dA@Q2x4>@E+Pf1EG163~7QRabb^-}W;|#tu8NWc(p5`soPT*Zb^S1igk;%zk$&Jt|Q9GqGUSfBD+S0b zo5k~l6i6i}A&=rXl27U(YqUSv`b?(l)o}dk+^e4s$TYF>k~0(h>h*A2{Hnp{_f6k2 zwb}Juy-SD2R$qVSa`>5?$=%`iv-;qE^jnjO!1bIC`Ll00L~SoW&KRYvr^nWnkv>*! zVw8vh+SRF)X%Gx3n&}n58JBD?5bVGk=sSo%UjS# z^Fp`2c?N>G&K(Y;Xp2C_%@1@m*G~G*iQtZUr`G&D7t5DYcWCBIyq|gA%~aaQ1^nnq z$9D24Xb5Bu+?Txs>PiTpH<50}Ng(!q&3<|Zf^(U2rC?=|wDsl8ZVPyH)z!i8UM0J6EvGnh-XC8S7+ zXDj*%bjKGbVT8D9_7ePEl{LE)GFdd{wy1xwAUWI>?h>Wq&A?VwxZByc=r<;Uts@v9 zZT7Wx9r6R@7nLJ3cy1|8=NNn`oFZ6Rq-DiS{*w&@l0OEnprV80p+5n2X&F82+lnym zVlm--2Vq8}&A@U--D}QM#qBze<=n9X%t~88-q!a})MC|HMYq>dZ--*_7d~Jci23QU z?q0?}69q>e%boNkh5tS9RkY3*$Xi+bX>;%*l(N?~YiG#Fs7f!K-Evij=d;Y#%$a9N z!PC2r!>37%58KDPr}zt~22x^69uQ^MA5Kjyk$&&z1YEb7t;}%zn3d$kZFu3#(Jwns9s1 z5o;|2KB0(nd&q|DU_R!rVB!@tS_{4sx*dJy<&`+O+Zss>-!(Tnv@7`hW(pD@1Xi;b*4{OcG9wh&ODz{&Ic|?_4pPN*4rKg8U>uI z6G?C3T}inHm2px|?}#HNp}6CXpd2V|8H7I#nRx#I{!?NcZ=l<6yC!1>$q~-=rs5n| zx*nvA0l1#*Bft6nuoo~%KCr3;C@Q`4$>cTmY=0GDEBHI1S!CN<sDTVjie6QgDpO&N;N_k;PdE)%dNShLNlr>NwQQ;4=)5-mQBd<0I=XkgY;vd=1Wn4? zPEGQ$a6%6b4JH+QGswfzPYwe2K^=XM_0mD4x1$!Zfi+Znc+xI$S$hyqU0c0(ZrZ}N z!iuaAtE!rOSJrHtL)Ke}Epdvu8@gFHdN(0V?0#!7AcC7;^Y5(!7?T^Z@is8{OPt3h zE&KAC`Druh`6$CNR^r}n>S(b>PAG?ga z+5vD<+m~V8BP^Z!)%)Gm82)eiX8U>cJ!aIVI0Wx1Ppk(gT-v^nb8-8Qvk!Hx3On)7 zXeot?rB++#7H_!I#k=>hhx#7!E9QYNjVrgT`-36E2=}Hd*!+$1`mupET@J5V&QSD7 z#;67G@!BA%j@{#@PS>;mt3usi!dZZkK!RUtc=20}>T z?dNuL>IFM;`_;tQ)%9iPn@youN)Bu+-W`O4zqiKCP%hI4HUON2K8=c{8Rle;4pvR> zSYUL5SseRgvAg?8kljk>;=^wG8pEL2u$~5@rc+#Q&%kN$@?a=xSH3}3*0{68j)G&7 z+j`77oQFl!1SfX4dyH3LYnD4{v|!0)Ue0{TCX`6RWa<{a8uMBn2jQY7F z5U~Kt7L-1SqqYS&n>U1N}CPy9MGVz1O*IO6&_R5SSS#U}e9 z(QtCt;ob|4uI@zFk2pk0ui^sr`@4Fp{%rOKPUh#oDB5Om8<4yA zQ#G;|K1o5p)2&i`GnOBoq3fx~M_W=7po%-SxJAx=;mgI2GKc_hxTuLB=w$M}#p((= zrF;lC+%}fnBGQ+XSGd#Qr5t2P|L3t0OQ4laL>-`_U6?&@BDE77v8(v8Y8|aqI_b^y zIw$w)@Us$f`p`n!Y=}oJ_u}iLe@PH^>Xyx<5(oTCvMz5TkRDaTxL2&P=nAowV1+08 za5~Wt)mNZUan7i#vVEao^J_sf7}c>Z$-V@uP;-m_>Iwij!BrUv8;D=DJ!#T`eI?N; zA2wRFJYq7rup?`ap-yZr4{{@;Cd`MG?>r!s-=6up1GF88co^m&T|}!JCniQahO*WP zG8FT$CH$UUICuLykvnr*df1FN7DGyT;IU@|zgMU*n1ng#EOd0cS%wADlU9*^pFk_| z*3=(sc{^f5#-8zJwDsdv{1$SJNszDm`=TG|EgW{OjqF;(de+0wOB2=;zqSj&zS$ss z@QZt~0PMZAkqz!*Rg*vlBqJQy?eVHqmOP}QAis*%oxdKJ49vIJ^EW?dN8FO$v6@$Rdm zxVPXHPQEX+v`7rDcz*wc3ESjFqYWA2fZ2(XQH> z|9uOOuK_87N$a)BavN9hKN`V|?h_RZF8#&(byH<%7b|v|@w=)@ND5$t`7<7VcXHXE zU(hv``Nb@|oR^AJ;WJ*{X^%rk&MLzDWS=KvAqT}?-$d$NmfqL$ZTw;?YstHt?%8F3 z%w-dIum|$?kOYpVQU5mUU6bQpdK!jJ6Qv`e;{t(v#Wn?6erc zEauxBM608ZbL(FQ(0#nap8W2|cMG}S1|NUsnt^is((kh60l$M7C%Lbj#w!2re2usD z&#btEJ?7SUIhN{teB6|AF;wVvs!zWLKk51x<3Mmh_&-16@P! z>SRd@OMYl|v2=l)qU0$!!s;R;*$$T-4;%QX2Kf>yab+tI+LxxRLS>O18_!!&@eA!D*xY&47yo+i%89!pZMHUsuG7BW@(92yHh7GQYrGgF`z-jC z!THQseREx0#!N7NL~6W>30@sR(o$|MF4q`Owfa!76^NUli(qG5XeT;&8$fA0VjQ#Qz|X1pnaXcjkFz8 zEs5`IsUQ~x%9gqTtm)V62`J3qjw1S}c;X)>bvb#k;6)*)!6Jp_1RKNcI^gc2N850T z)h^~qoQJ&sO{M|_6^=m@Iu$@t58DC5m_5$8?6#Y0EVpe>2vwv_B-~3}?%&^wXBj`3 z;=he>pZYMAQ93ER=Nc?)RFmK6gr2nYjz*~1_tfrv^3sROTyB%wLjmj@njahFE_%YY zDrwv#$0?o^p&~q8X!m3JzK2FI=bHla0vnIxu_ft3zw8~88Ts2fIvFvD-lUa(Be(t$ zWLl)&MvvGfBZi$w7nDfXpT8;;ol)?BFU_wo`uJo>7zR3JR7j@B&&^<`gOS_x;$Wf5 z7vGBB5L+vuHS6omRguc#;`cH0^ak-eHaOow}G{pc4*xAjmG9QtfizNqNV>?-!1-I>cThQt#QQj+fh3`7j_EOQ87P!&#oczjc z5gxo%U{>ttUT6s-?X)wWCqVLSKw)2xw0#L=_Ho+HI%8(}q7q2vwNQb>r!407(G{WT4~#_)^^Zs6)YS zS$j3so;BZEYU{htUBA=#$&sQj@uPQBfoj7f$gMC5Qk)A$?kygPo*pz)uhP^W%1x3o zARZ{(kgZnVBu6{RgDM^3SYsBGI7bV1{IoZf_pz*Io!emYHO)`lfZH4-(lhx2O4Fu) zudfw9xz&Gyyt_q2n75RxZOq8-g(hLKtORllb9HELH)`ivf2!ITvL&`LLy9cgz3^iA8J<=l=S z5}ruOG2CmyFZX9wfr$!itl(mDKsniDtuf9z2Ke#Ini?BoliPEs0;b`jCvK^FBjW!#ZG&?P}Q0P=JHC%w@`|clIM5H zxxRXBW!_mzj_jVl!r(oMAWA=?3A~(N()ZlE1_<8Ja5rJSzs$l^fu74V7(3{AV7b#w z3qH&C=-EI!Fc#jFkc%;J&$860m)zGxj^yCWr-OwZ*cQrgwoD#h=0Sru(Wij6_Ulah z76z7Vb~fxl##N7HXilDZ#SYLVt7`>r83>Ghp?SC!pobTot z%!JY;rMnGR(ZDoAAV{u|5|5RvwIsy9ovrTVHQ!aiQT+27Mv7t^8RrU0B$rD+gKdXH zWU6-sliAOqSKq9K?JTqbLuQM~%8Egra*5WJSzXk%0J^mGf+f*hSVn>C0x0PFa=T2} z@dIGj$dfPxm5P2W43RRYdjtp1-ks5V2U0!CQrifoq{zk;uR`+4l1ddZP=L&u3sWm1 zTPej_ccpoiJJ0Znth|7$GswZdCoyR3HpdkU+Hy?#E|rjT&GuL0a`Yw`Llz1 zg90p^ctp$gULQJ!X#k%9E=`tRbt{zoaWD6-ky*dlo->lj+5UB?MF6*#l zfHakb7j?$FK~S&gK@Ysm9E_MV| zFnPdld%YNWAda)KfIjak0ar=CRuL{Wbs_+6T3Ohb8e+qRq@*|ggp@4`4s2LvJKdzY;psrWiz zHyqK3*xV5cbuC^J_mHB&fw|akc^nTH#*eC|)JycT7>6!vFrmKic~b>xS;CuyA5iI zm5-hJ_OaT9PK=NiATSrZGeWn7{VS+%?UjhFQ1)_q7jmBlGo($*4$nL=_@JRZAQq_h z`WAEa4O`5w?~Rd5FdRp#+RvlpP|Qn$5~qApQM^F)ykqC!@Q6l=h*qeqTzgmlYz}e# z^l%m8gAT%7axtr>R*{-p?U0ZO!P}WQ0i792Dm(5$;ydJ%3o2JOvjY^uNiSeq$zFS- z0c96^Jo=ixv{2unu17=sL!|TPYNBPA+uLMd@1f?*6XUl$Csqw6+kFTVcJ-xl8LB1r z5fDb5N9Ljz57|eJ@A`A@da49mGST_KZs-tBj4ie?ItW<#)SY0tQ;QyC0R8ehyO>IZ zRH^68Ek4-mh-`IKf#VtZGJ6%>`N!+SL6uevSV+BU`-ouz^dWM=j?epV4J}q6nIhE6rNL7h33&p|3q6 zVZF<}_hBt|jhAT^L4W&?J1|*2vtMWY%Jft908Uv8GH_vW*<(HU5&HQ2x@@|NNGaWX z7I&t-KqrwT$vJ7Ww%BUtS*UiErs`k#uTW{!7B$iRV8=QQQTCuW;ayQME(i&w_lA0= z#5F2V?jzi485ai^E@XN#+62;CFHxKD3q@o=@^It*Yl)QMlPPTIF~* zC}J6*HIrrHUQ#RbUYo^^wQMJLYnTZXa<}&iGHa`+RkWFF6)A3~)_9$HXA)RJ?;N}4 z<75jOuiDy610ep#g7qC}ePEJ@qu2bbb~G1pn%zI6rQ$1JS;lo}N^n&P>=? zy^4TtqP}BiH0EAg>Fjnhw!eu?q^&b!9G}gMMTq+D_yBn6pXG-is9q_==z{TqRX~s= zTn4G3za5Ku(AL4A9B(uaX5F#_`EF-iJZlR?M$FGP zc`)v^ZN6w8k1+T4UUlbukPI|AyGcZ3#ZZCg+8i}Za4ex@bP>B`asnAv8vM&fmFYY@9L>Mga#vuHWxwxLw2=loAdi zZgnul+BP+E3jS4n7r?VQi!u|Id+l0*Xe@qoX^l&EgQK%r*>rxWn|x*~OnBK5&>g4T z&tkfBvV`wFC&aEeiQCg+_}-VP;4cEvz9%$?)q(iDBPr3V#-(SlhveU^`gWUJvKT9( z-9kaG0Q~(k1>u^)Cu0|Y5cxvsohJe_99Kd~bv)zObG_#C+2z{wf_Vtu-i6$4p;Bk$ z+|~UGA9XvNkZ%1jD)P|jf6tMdiU}96f(GJZ(UaayG2LbS-cw?d`;>` zuOmafMwZ$45nsstn``o;rLu?Y;W;#8(QXNiW7fO@2$`IXt^yiKW5K_h6Pts-!;z%| zax5fGpLcF)2SsHhJOT9Q4WF)bzOvCcDSt=ZdBN#=Z3 zFe}@I9+(_``%qKX6ww@9STui@$nE4)@S7QkcXJUls=J7;>4zWOmOT(QLUJ@X3-mE9 zM3K|a>i#&e{MVWiH8^29{`8DOlLLh7J=mz3?Npjoe+D^54_Xvo8?Mw6kFdSzNYk`w z7bAG>hJVi1H}H7s)bsc=rBf7t>Z>X2-krj&29Q1e;rHZX-_x)~51s&6TPo|g#U#z9 zDz#{;HFyqcSO3E7H`};PwcriIagG$V!@9BE3&?)>54CNi|N0}+)~d(kzIU0vTY7Y` zcgiA&8=V@CLg#GLUoApxY&eFF;ZdmFdJCIlp#t5>?swz}dGW{d-!UbPEuNfpXct04 zWM_iKTjN-&lP2a&&$6Y!`#*qE5E)}nbfp35GYS0d$6Dc`FWuV>e z(#W|mTTruCNss9R=4YKgv(>!zj_jxb$l~&6XzI>GKWAB|&R~(TT@&zO&WcghF_)@| z6LQ^UFHRpy^1Il4PJlvy5G4e}-&5rdnx%fjsNDkyGD25F--KRh^N<`CXcDmTG$}km z^RTJnd=-=zA_a9_3GE%d6#Le4zxgC=mMu_BbWafQAOCq^A1Tn4LaJmEj4VccR z$SoCbANbRlHx$_Qrv~65a!nLm#ATYA!_?TGB0GGS%kiuu+fEP#*QTh8DppXjHAXGf zgNcxbF?#pM5)@45#+TBuw0VK&D3ctX`NuaT6-;@3yV=63Hqah0U!k7-5=PcsEd$-1 zbRo*uW~z(3~B&S5_S0q-}RQ zXg*&0(|#DG9BFa}+{(XQBH>>l7h5qrxpq>97AzO&`BCVfo$%F!5rYjnb=gP#`{%Wj z_bMJc2A4zxV|#1_=7*o5%g=RwZ5_YB47>T9Rs2f57@$s zR7rMWqG@`3nwaukx3Teq!Omfb->s6nnfQkp7Z`{!^D-s8aZH-7{U1v5^-YRcMhlUe z@vjWc*3!Al{bq0%Mji-+kHiQYTGU1!a!_ZaUJd`|EyG)Hgs)a^oW#XNl}YK|nyz2n z^~J4NLqzpZ?`)&NKcY&v5FSFK};b@MT`Om{ht}Gay%*4 zA9COGBdng^yEv?@r(I-OmpU6i>6u%`aK;`X*}58|aE;RcV-Nm`FzL0QxZzVd7kY!^ z6p^`X0J45b^yDY4_*zt$^|j&T*+B8TP4bSNn3~|=s&zcqr0YMt2eaXnYqDmJy_$Rf zHb^a9&Sny@0TJ!hx& z+L626TFi6*%K_nkGDonE<-RN+PyhasJhYeny0NxmG1`(Ku1678ky684tt+n0d@sbe z7=9!TXlnQ)4KRt~{I!@?8|w{Lbvrj5UsJ}|6A>9)UZlpZXFmfgj}`0>mT`Aykt@u4 z;lO>%d^9}Pm2XB^@8`MfSB%krOfADW86#alogUe6Y0$|L zm0YNj(%Av{Tq3SPwGp8~Wu1vP0kk5iXT+c_k$lHxuKn~yN-gq-3N%es0eK7h?%uG; zQhlp)pEadjO5bjD7AE0raAx)rSgVZ(ant3D(00`m2i}5TCj`qqzpFchv|Qr8cO-BH z)Hz7X>XXm066j?M19rXbAZ;52{gPvhf7#E+!5RV5e~o-y))BjHZU(Np_>5RY52A1D z**6iW$%i9Rf%E?s6?BSlxJbTnm~FlYjUXKxi2Vx=Cl*%z1&5bRonj-O@c6hYb!hS> zwbvn_6{Jjhlk7hlckjHE8*lti!LQrPm!{;&E5(OEv%&M zw(A>1|IBTk5{0Z=E|*@g=FPucWKKTtk4E09UV@C1x>SHD`hUH(;|_kv+$p&Jt}oxp zqXN7J;ToMyjxQQtgL@H&T|MX8V;E%+U928CYPy}6(86TsO%hPju{ab#$-(!{<2IAF zy#7g&n7=LG=S}7A(H5AlS0Fz2j=Q%^Qi!$e=Q{zr0#OV#3{(IywO;%-cjlO*D~sgf z3wZnwY6fJ7C5#0DFP|iX_JK>@82oBML!>}b)1u<~Nlw+`b)%tQV7d~u(;man)2`Ac zxhZuL6`10?DcY7F0;Rm|d>G%pw!CPOL zM6}i{Id;hvHy>|B>g=9Q_;NNi)Nhwb09BBp#bl({#RBv44U@Wj@1Z@PI=oHKWulaR zWBFxX#q7iS)+4>gvzIhwDLFqGS8TEf6>JxlC{3lZSyg{vU0gOGR$M|nkKbgSjus ze70LuLUZ4ID4!kBx*`pA&!cCrc60<@5rs{eeel8a)STDnEn?|1fGl0A4 zRHNKq?v(V@u20#_v$*}!iV14lXngRt=a(~IlD8VQU}GD~QWun3T0e`2dw=LV8B?Cx z+3plz+&yMeE4ykMcC_sI8x*2$Cb&`Ig=tLM<=|LdnJ)vLf4mEScR`BKFK`fC)9Y(7&+sBKAjGo(vyi>=4r|+S z&@($m5K;oKBNqt285jUWJgqvvlRNwNcxx7X%`^uy2xF(s zuoi<4NlbL6{5{aEL-S>NeaI%wRJJ_zvQHk!O_CXPEALi0X0|f;uB&ty6HAmn8i>LZ zrhfwc$H=@IEr8T3 z24dAXF;~{t)_)%v89x%)97FKU;;5V%g-ZB4TtJ4hp)M_nZ~QA?xL;&3=F7G6n(B0C zHbO+ECtl7s^3M+aJ?=3u89bA;^s!&j7x_k(`|pLLPLc4K7xAgUrh6pOErr!SC`ifE z2xOa{?G-KjdSQI)vU|(_9$$_;iz@Ey@+I=N8?|N}jZgy^%q5s1i$vEU) ziu(U?>!=t0s%HXKJW8=eY1UZZlNl@xTBo(MF4}ZAL@wR%dh{~-4Dz%GfiN%W`SK+z z`}iw$Rep+k3(G}sz1rE?@bMC(L(8P|bBJ>X$1BvEH9mBYxd^yEiP`-k+X^Q8L0x-O zq6q4JL_X33oAW7Jdyvlbnoh*k-KSE1En)zC^b|`9M?V-#C)HZ`*p{^~u z@ppH%aEzXDYGdU`Xx`@p&UXX2J2|R_VByd=w7eDAx1xC#u$%xC-$q`598Tzej#$Sen}bCHst)u1S4KS;&8qovUQu9 zZ(uS$)qh&zeQD4S3zX#JA4eAtW#OyfqAYs~-+B`pSZ2FLW85b15%fvyrn_DL!Xot0 zzrUc2hR(a=;lIu~vR4cJ{*Hp$qeJ(F9#Li@(S)v-_unqSJ76-~PfK^xl!s86BRs32 zV=TK8F!FDqN>1C7@CmLWaRBk%vI$gQL=f)P$s{RM2OFLAvkHCOd1!8jCn2ozt9IfFc=W_Q#8jznP6VFz{x61{bdP-Q9k=-wBzRBL$!}S=S%L zJpGf|BEHa(o%Ag5`{-vE$u^zLBa7EDD9bGdNIWQ3EfhIt+ZNA%?H`Fl^1u@CSJsAE!NZFqis{KA`BN+jR^WB`VV<;&-ov> z92VW5Mle@4_t6kRjQS+M$#QbH zWCxeVtA|%{_45r{_tNNeG|=Gl;IuxQwOgi?hi#14GJ1h&bG*gFwJj<5)whA=IpRbV z7cg|oGCDB!yl#LIDmfqsj#M&9VSg!ITTOssk-ijnO{m+?#q< zT`Ao&h~1NVN=^@*g2I5>aP5^W51sfqMta-zp_JkW1T<6hHEqj}qw-jq5@T`t$F}Eyhy5i?l8{e!XCKm)9W_DDNWKVK1?4^XmNFn0Phf^i$ zH|Eu(drv+Ra`@y|TGh*tA8W zcS3ou2Kl;NNUg`x^jDbfEv)iRR;TiI6PXL^Jcr;ww>B~%Zxd(&EC09yUI}8Ex%U=> zhxD)|dXfS}9NA2|j-^%txZU8`9W7bKi5cEkk>H1Liamn7jzskr2x%8ttFWo2Virea zE;(MDl$hQ>J$xbDGV-csm86h)OBS-=>M}==GlSyU2qpOCB5zF{#q&Tz!Vq6cWppqE1Z__QN7zMqHw z6?xd+9!pvJYl=>}^AoL|?tZUnXY$t4SsxWctXbORTn?`c=Z?~(@2{7*`>a1b36qli;5L3w=>af0IysEiFISX?Y+uqF>+M>4IKCRccJVQRI%km78-bNVPWyy+#9X^OX+D`t8>B zzOa_~U4U;@P8D@yu0sW*X@YY15kiZvj(T1s_qW-^e*U*-uEk9)!a%Z{S)?7eTg38LY&>sq_g-~F zVJ85A0LXgP#@0KTUyD_%$&9gYVRPkfJ;^t5XT~k43B@drhTrc`xM;JkpX37ngMZha zw=R$Mpmwq$)E_-o{$rf!#u+rrOy9-7l! z>$;{8M9YYX8wAI13dqCCy#6gK+|(I2!ic50^#g=#asO7 zT8)`-tHhkOlN&0`o$@gE2^#!7e zv&LEKR-muNn9|M<7ASz-tQtkUorkueZFSmQbx|Qm%_fNE$W>!bkK^H)Oo7-8Puxm0 z8lkHkgDgfBrZi@3#SBi3`7&`Y zLNDasfIPo7Ls=ZUPGT;sK3fPq-Ue+^lb$qL6seS6`xS|jw+Iv}+jWd8)3fX!sj4oD zzfv|*H@bIuQhAzh4KRD1zRWCFLl8s`DzRQ?FYw<#aYFiGA(G^dzTARA|3d#jFf^)t zojj!Pd-ofT*#r~nm_^1|#+T`ej7Uwp*)5F6=AOMN;5o?+wJ`>JO;l0F7co<~%@#EC zxN)G6SHka2yW14IaPy;OCE*$zd|~a!Ce3Q)^(w6Sb#ewYuOcK_#70@ntZhYn53vfq zyx3|GanOs!(>C_C;&E^vPe=2W*JHaCn8u5g8@N+1_C;fMEH%oyS^4R4@8@db7HhJE zb_Gi7ZY9>4=w!J;Qz?&)FSmW{iZ;AImNPRu6zs`53 zpN1xAUNe!vxxXkYyMV?y!>KQNIJ1?VgP(fc2E8pX_zDwpwiS--`O)d0=+3v-JqCHX zyX7w!ynXNSL@s((n#YjR2c>8sb@@FdMyz-ELI`NNR6h!u85sz0ai@^RHZ_CdLm3ca z@Xb%Z-ST8Ut?DU--0k1eIsdXoHNHvDI|$`sE)?HhuYIYA)c$@7G#3AFhqCmhjbrH` z8NE00?WSkEwDhK`SyK>)dH8r}%RaG}ocG5(-MeM?NlY7LMG$kUA*pV1aF%m;ZJ!d)hqJ8;Hk9V+ z;pE$TSX1D(q& zRc$DdM>}3I&-5aFe7!s0OHq_bA(I^0i~q_Kn%jb=Oxhtvx9ZiEYPwc^e6L{~9pe!< zIWY2ok>#uN2tI$%MrMlB^oBEN3c*A2%vt@!DyLDitcJ{=4JOQfPLqi*pWE{NpL^bb zd0*GAW%-;>UFGo~I|GS#w#S7^coF4NAG{5pAI*#MZmvP;@A$<-#vZdQ@9B0&SxU5? z&QM-GXgl)g+h-C0IO z)%Sb&wFB@-qy;glYD`bM60gX>_jU_Ha!vtq zdxoFuWzf|&BnSywD-yj^#t&P{7;`Bd1= zjaAO|6~#V&M#+Dc+8}k@8V=xUE+Gv3n>+xV%CT2fkihc~oQmU<4~Fq~f*ycBe_F<$ zbJj9?Td=O%H%}8B^q`4jx#p9HES27h<)$|@+F!VSOH_~WSoW97{>o5GM zaP@Sfs0WLP*>*g!E_K`PTw_lLIY*J6$mN4IKE5{|)2|Qwyc>l)s%w-c?)c<}6WB)D zLbJX|WCGjg>E1nATfCdlFZVw&kKPNvgV=7`I`W=c1f*L4w7nrzAy6cr3w5g4BV;}m z+c)?=hI=MB2!c_wKZrIy2D7PIMGM-hG!4Hwop~7v-vvP1L}A++)!T3(+&#ly;WIAu z*05c?%X#!#@qpYuX`VdV1-%9!II#C^1n2b`nbEGUjrUnz`S6yX0nqjeC>{UMCA3|q z7@=G?X%lwnGnxq%x5qS5QdR5hcRN(KpdZhABSi7(_rK`gwZE!ka!jddZ7qQTM7X8Z zQIsO{(avM!$@Hme+M7rUu=GxOkQStWTlr`?KRUTuI|W?oc`a**=$Ln?5HxOMeU z0Lah_e<pZd9y%8&Kkn{2&Sry zLIhe%KXDh(A_Zo59RPc#dy<3a{36xMhy5~KScG6p&HknimBT9ZUc2Q%pDJ8&3()3I_)x?W2umGPK# z+p4^|p19ldvyt>M@3te0Q0P~?BcoDWX`-7lpo3XLSZ4PO{A%&z3gm}Ja{RO+v5t## zYR(f8Uc5JPqP0zE%C2S8uet+(qd6iO$8$EZs7d%A|Zw$&pg|yEE&+Pg^Ij(L(OBEShd4*ZiayEjhLvMb}8-? z7EcnTpfFwE38~K(Z%&l1X}QqoMQS?~@c=UWVQ>ygv*)~ydNEkJdCT#vURhK0CtIu{gI;F9SaxUp60Wn zsE&*>k+t1DRnZZppC1*G#U5{Ho+p_Awr=&j9ImxRQ2$Z0?dq(u37ANj*~6+W$CX6y zPmBL z9xV?(&)Hn|B)2??9yFHwY{_#z(9MCGX?V9hAGMbGZQW#ekrhtN`W1D?Zwr zK94Hjq)v^Bulua+4an~v{ivyDq~;rYiN4YLjBb7uv+aKrYStcqzQ-a;S#0`HP7o2Ni}{Je>gFjo1a|X`x6)lTVy&vBJq$x z?*sdy+oGKr#vbykzS3UJ+hftRh&UZtnLwszUUR#yqcbun(llZ3oh}{M8*Ob;T4QO1 zxdIrL$&T<(&jvUT(rjeVJU0!js!-v zo92k^j0;N_n}&STq-*t)Z!!&?J#ak|e&87!*^ZGGYvg^p)qX9 zNfcgcJ81Ii=-0!ETME{1WCbC`z(`H_!`ru+r(bMO(?)s1*!inwryy;fqL!1j#xfC! zuI48E(ha-Iqo4V*CIW~`Dg6>z5$(!4Z+SzB;j*uCd{nK_rH!Qn zdH_oP?D><4VJR7o>SA>3gXz#h`blOw&8zwF8_?&d0l@8N>0}*ZbpbEEzmJ3#9F)vT z^lm%~2w8b(P(?6pj(zA#>{5uY%PVA4qdk9;p0&0_arf1x!F!j6Ps8k*QA}>3Fq%qi z`x9xzuqL4qRi?Rd6XNmN#65=SL({p&RG20=g&Y3s9|&j*7I9VkjMm|_Dl=ms?LCX@ z(zjgZ`LveN!tphwOzF*~r)X1*z^9Cqj0qeScs9oiptjNky_@!+P2e^ zrbrGlZ3!84u&SgTEA&R}d8D0>RynCpOqV;ZPfTxF8srgg?u~Xa_~I z2lED~#QXJq$Pd0@cBsJwPY0&~R3n%4kwh6WWgelSj3`IHUEj!kFzrL;HmQ0igPjL1 z5<#R>1G;{)G4i7kg9}}lGUrh_|IHQ0-b>$#r~BDp3a!fPayrkJ1|ne!2|KH3bE6Il zHS5h^yU8!QC8h(B7gt1Wba0PqT-~N{gU#1mBwPj28l2tNPlJC*FHR7NWAyerw_8r2 z3BfJf9ti@Okndrai(DMb3bnx&-kfeR^WS*jluy|nK>qtH zt+bo}E{e@VrGicu76p2iu$6?A`U9(+7OM&^avk1=Y;E3lv#S$`ubcq@!6!W@b~*>g zsY`L5#LllbUUWWe0^gV}Hcg%l&{dS}n1A&Tr1;bz=jf7i$sL1wmcT7p5%@3OF{e_& zWBohdxKM*N(Bno7rysSN-=m~9X#vP&+%Do1ci%7T@%X@G0E)wGDbI8OT50)7|Un?%R!0i zw5L20_tO;Y7X0L#s6h^3aV$}9Q_#EmLCR&Rk|lv+Fj$d z1jvy+!rBvtB4dH%KS{NN=L6M{^Uti4Ieq}9emNR*lcRHb2ODFo8IQfh#ThbIpovCK zIm>>Jp!{hQEDb6d2U9GOL7V_%6MFp2GQvVDgZ*_`*((pywtHKCp|4TtOjENTuvf;5 zY?C}GAa!F!y4g4yzWsKQFL`K|zcAIdQd9cXq|+m$JZ1*((K zBIXHOxnqjTp>kYXjtC_?H}QMa=yh?|fNh)bbJ31xi|)!|&W*1oUB!|XR*F_XxMH$% zw2n*ig9>Lk0CQGR9{K~vp3h0)GL)^F0#h5kzQ=9H1-0=<40Nll;vAL%p=zv7I6XKd zSIxTHtl;G`L~&O8!9h&bnA|d!kgMjM$c1}}sRSpgAMYcruIxCk$<73&Og8c6&*V{K zjWbfqGnjVJl36RPI`YW;s}o>Qdz_TDfecbhQ{X?MNRi9wsep+$A%=tvU-+9ZQWYq^ zmQ44dyr>}h!L)HzToZASOPZ=VldXOLGIYZ(xezTmE&hwFeUz@)1eVLo9sQd$RR4S{}- zUS^V=J*qKMrJRC)WeS4{2$u>6fMJe)vH%uqF7$6o#v0*2#rKL*pR0Y7;w$;30k`BA zq#lRVb#~b~F2}MpFy|>2D=sWw4I zCADqum6Jf_}-JGw$n77!F4r)f!RGw zgb~zk0S7tz#Vxb{^dA5$JhrNmVjy=a2Y{65B zH}O5G6?KRj_dqnkOvs?y_&>CEM;W&@F96=W)b#FIf~^E!{(l4nu0|q>EZaNM!}r{3 zUS!sFH!aoU5AkxwK8;@%(2iNMC;m0T8vh5&jBx19Jvxn(S+!Vn^>?&Bf9XI=mEJj4 zb3rS=tY^uoc%e0#5ZOr5_*N0-F(ZorHf?c_hKhy%?Z_YgX*vFjgrea{6OX#+$NIk> z>O2p579)k2z$6Xx(YnvPB0IIfB|u%>{Kn>&Xp*luz6U-awv?!p+IswPwy;Q_TwVFo z9V76oPUE9K54a&CTBDCtWG|f3?{T{^D;h7uTcn=Y^MH8`%9ElA2!NiTp3L?s!_n#wB|m=rsL{J+BO~jr3n9EA98GQ#gw1BTN;dxtxRy z$G$W&O1#i3Ncby{ox|`Sh_duAhNhyYapgO0kPk~rp|h*zLxWGay;R!>AxYn1^Y<~e zq|m2LZ^_PJV+rB=??YQ((;EiyBX|5bGZuJi><&ck(pLoTw;uh27Jt5-8rg#XpHa^z ziMfP1;Ue4r4vk;s!b;LE$6rjW1q!LL7q}W~UlCE%Qo0K82Mp=1zcS1*d=zZxu=DS=7W_LVIb zTWNVF{JD=G%i(G&z3R;=t=Lx-!;#xcD7v?DIo`@3RRwU6SV>5`puj)t?*F2z-9P){ zI@k6;(3F3DC71rc+3{p7gGHjSWTyKb5ixJA1@lT*eV^#=iCk*!?CI=0|E9-7{u4d^ zUWyve)TNUBKhfj)(*M@lo$_#bZ5Q;}U((}sf79c!LOk?FH)2^?YRH~gD>1iyO%**p z8g1oYCx~}U0bO#2OnXX24TaQ_isTkRu88OAZUR~dqf*gBt}4FIlfOhaBli9#ZH8ns zy9kK>$YSJl_RU67ko)YJm67Z`I)Cu=`f78Ca#FK}l+TEwo z$O)fV#a$t%V_FaJ1W7R5%XDp&bY)sr8V@Fe*a-OkjO<;0-@~i_zJ>`y zB~YX@c=kUYl$v2-4ys69u44@&e?+|#^EV~wMK8EZ(I!n4q*t(ISe&Mnzh^Q{6#oQJjv z;-KuAIgZX?$8~NzyWE{LH~{%Q4gI7-|F35PGJC@J8?=84fcDwi?f(U!<{YpbHoZJT z-e&Rav@iy?{=vrE z=u-)4Um9oVlR~0NVg;nm7w)lPHv&88{Wh2e=7K2s(7zA9-+0j5s3$)(S0(<9yWOIG z651n{aQYYGAR2Heh*^0u{158FPi+p_{kQc*GkfTsKGBo^@SY&C9PW&uJR-UUK;!qq zoV2Z*zSii|k$nXHW!$v?|W(X_Xq2djtyB0o*;#9-U41Cr@igg221 zws~yyMU;Jqm>8!|HhXv1NY^u!70^GEYvcUyJu*6@xzK09W@W7aGTziI)zx)@NoQr% zIqY*JS2izX?j}5!_;qFAlMzoVAfp_0j?m>wQa$YZ8E^m75l0N)32n4x@zg$a>u7Rp z1m}HdFXRH@+RIi}W>dbm@ckM+7XH+rZSD%xDXh{v&}%!HT=q{~i)991Yjxa{0M0yE zue$tce_%hUc3?^pCFUCdpGgZN{8yWU6 zuF8`?1>i|G62~$_DvBfWFK}7WIQv18Pam54{&)O%hJuRM4RYKa@&bnjw4crxPE!hl z6Q-}RMf?u{`QkqS`43aATY0105GndPk9VR>^9o+QH$hIhO)UT4+hqiU@{aFN90hb5 z-{^AgJ!?1t=<(G{xBcDv)sB8AJMJ=BV+7$N{{ZB-;KilS7~dCt`!{B}v{EKLko~CO zQ6qlL{ww?8j*xm?31m$9S}@vTd=*`T{Z9eUhOKrZb>oz#Y;0lqRa5c*N*@PY5@LV+-rfhiix4NOlt|NLAmn8N!1$!E{}(Sl=(kJW zf9Az!$h34kmql3Vw~WUR_>t~b;ty*7==t+Zx`a$re++vcpRK$4S0*@gRtg3BD=pbT z2p;d%-Qt|CC-Nzy=Y6q!%W@pB>-jI98>Qm^z2`>HfcfP`K37w|gvP(6-M*Ufn-~Ag zY`Al}@ug@exiItNXWyCQ5_TIY94{H5i%ec+xH}Es1eE3dNM3lQ#>hucuCQa(PaE$U z*k&3@u3wZ7E{mtscfyHp6}1^j2hfCKrloc zDl{q;Q)lbYOyn7K$H~nu47oqI_t9J%tLcP~KS)xPTiF*TnPMcS_gx;4mq~CcfVOw< zw$F4Lt1m`iTVksHk>R8j$vpSu!A$`YHMCq-ogK_v?=&r|p`&gWc;XYKX4g0J(qpi^ z;YxXTrDPoINT4=UEQ0jhJ*gnSX*)vg`F^H#)wY0V7}!#Xm+PD!J-u^Q8m#D}kdz?S zk1V}8O?~K~n_~Bzf6A`NYR(5uy1UdxDig_hGg8OdXYy%u7I&XYjht?rl=eyyHHmr$ z;h~v^^K;KIRYLuXmx=U;s-)F100P!Il2f}rrz|il3Z0-?e4VsucQyU)8_2rTgIx@t zG>7netdrrzDx{~aCF+*uuj5p4P9pfAZ4NK931tiiBJvWN|v(z6B|}CunX{ z?Vm;)2$SZyV2nQ|?`<-#r$jy1{p*cFVQ^#_n+LBvjwyE^YsVm!t2)C3F7?TKVw*;% zAEHXGI{UapFN}vxKHUoYNsN#9*8Zq6y|YscfvJIQ{@8>7w`O#9ZcURrALyX<%6(VLn=T(?4O;Qaz1;Kd^nWP@1|57@RQ^hwH-H}G>tiZ`IWW>{JD&?d+mVYj`Q=N5icNgTOBNsQaEAZdF|3=}O z?I7C&9;^zPxy$*{1vx$3PQUzMJWC>86yY5v_grwsrIyF?Wi!G3%8)XtXrR#6w;gN;mp3ry;@kb|ad#i;oWw;x%7C_N zAg*8OBk-(&pD+O)8UZ8q9A*B5ydU2ZBP_;+PEVK9zxi<3$NtgTZFRYHaX14EH@B?Rw&^d$#tYlZ#J{ zovX1(zo27&x@N`0j{0DI1adk<0MTch^`wj=1$Oy-dehKIEoG}Y1Z7=FDMb(=)4Us| z32Ak_ifXrG1Yx&CoWBjo3-L~Vp2(Tqs$z~JKJ%#pz%!iww1Usgkr?K2V*rBeR=%3H z&LNxLqSnUra4(o=Kjh}>kf4uN=SRkD;n?Xp=>-E=cp|GPI=-98I36yg9Z0bG zOn}yTWp=j5O_b|xw6NeR6T;OdI$cS?NyKnk_-s#Lx|L<};{>$fmjc1k{O0+|HX#^o z=h6I?>RyS+VG>9WX2&ZcpNO7uP6HLb_>8fLjrL z<)h#pTiN<-YN@Qa1oV9G*H@!^6$(8(A5wU3yRy%}apOk65yX{;h<>R3V%7GDQYQB8 zy$Q%EW)ennq`VYd)O}pyEZw}*z2VOaIW%FW=hv&J@HT;pLS(Rk_1*!dXg6fF&1zR#HeT)0TK6VYH_Up2 z=mDdG$)`@(hdwuj2F^~VAQ4-n}XvQi*}+#!H^3fC{;esGbt zM*T8whb*q(ag~X3Bls-lZ)}oQnOGKg3XDH80neluZByD?N{ly4Y4pI(O z^rL7$Cv=D%KVH+M>ylQVY`Gq&$hB80DJ*~rZUhLJA`xAOM@Yh15Xm?&oYZ1V@DRXG$ z>4dttpmWxJrzJn6&~=ez4U?NrX$I$6^D5vX0?v{ySQA5ofyuXCk4e})sfje08PmK( z&sy)@Ukq8J3M4CM?otz9ycO{e55hn94=gcz#CaJvGoaXuzuWkCRZG)~M%^h2a#mrI zI?Q$5A z`kX%)w4mhKyyXWmYm}6s@Gel*%H;zOq{%B4YnE;4L7X%$d|E)^e$8B-)%e6AENaq= z;J2f{-tkY8aBk3^j(#V2ds-WuA@{u3^@kdXK=~Jty(w^KqMJY0>MS}qPF9t+drQjG zSg0~YZ2W4HQHc_VH%%e|jz{EpK#1Rvgx3aLF6w-|H|^O(%iiq7c@)jM8CI=@3~lba z|3W8%7e0)~%N0sb+V5C6>N|v9iz_ImH>a$Pm@^?5O}Nd~zo1$VY=p6*UO3jaD)cV} zCr9b*+9g!CrurOlb6XWZ{xX{ z+GFF&+N^Qya|<cLx1c>Ly-3r;riup;~3o_9b zMIK4`cJlXhlbr}LDxrg0W2zJ1V)03ch=~y+n|C@W6WKKk4VV^NmvUGyKT=CfQq!km zL!Tq&c&pL;GjpW2YqT)DhOZN6SlPP*T5Tq(zhW)Ub@+F%B!yHvLx&r=&eAWFyf-A% z!07Ceya?*an}FHT`I_YU&UNRQqgp0RVZJ5W^@=V2{+|p*Gh{J2NHiEs$T=Kb&ftff z4{U#%a%I;inav_bijE};^{PQCkiKv+(Da-YeDm22J%fniWbYLYeNp_gI!;fC5yQRK z% zGo!a`Ze-t&hLG)7OS%h6sH>GxvbZ@gL{TyC?+nqJ(l$bXI&%h5*(J8n%#X1*>MoXG z$7aqw)=K3!S7csXC6m+P_?{+~NRMcj;0oG(0Cf}=2af|O;(XSwIqh*p*silo!hY;W zrlaEu>I$pwvWnq_A!|fr-(T4heJpE@6*RZ`);Eu`%NB2+Q9&d%wUdxe;~KqXOsA=) zRym?~j_(^;jl1Yl$ZNblmjuN{{LCV&2+^frWW+v``EVzl)TFUhMd;(L73&oW)17z1 zsFge-sE#?}_tV)`SE)!nMGvb6V@B#17%Oa@9G9GH=+x)FgHp^NkxVbV;{dwIe$4gC<<-O-*qeTwxf6Lcs@wo@OL-%lmwIVij znct}0aM7T45B+InyD?Q#-oHTpW$O(^Ks2NWf21T8Hu^OF~_Bz-cU-zsv%d3_$ zXrQkkrYV(QnM}2f;*>uLqyfu~FND9HzJD-jYc(nzx2Nq;ZQrn=9`6a5Mkr06I;kPC z3BETzKLtSRQ}tp5blG4tz;|gZM&9Y!FP*1^%LAf2w`(u~$qPQ?v3mrEIE=$L;2Q7d z%8sc((`qs&Qtx3iT=r020{E$>~#*ceCn3H1gx- zRhtbToYriMx}3cM&Z8HA#^(fcDjNB<}OWK%S-Ckgg6%8Tm>R#^W0q zP4o4DjeAtF2O%Zou3jm`2T8js`a^MUY2Jh*>~1L$qCe64yKd+pRfX5aDd+&_TXiyf3fY+OLNW zU)1Q;+1x4prp0o!xqY6%&sDvrU%s^Frs3Kee*K8&&>v!ss|kl6-#Auo4qf?dg64*; zN6n|mmj$1#+;f`ShwnZtjCGinwQvs{JWC4LkatY}lpc%k)nXmCC*@Qm)lOx6suFLG ze-5Pno=;kIt|;5yXYBC!pz8=Q+v@{`DlyEM-8tKyXs-|1AACYob>ZsEtdnZx>$yUU zua8cYuUKA#pRJ>Nj|^7(n~wR%N-ioj#;vR!7Z)RyFO??jjsXigp%Yf7GzVh<&y{vM zm?a8c;HPL~{i#p9C%4xAxi#%&jrG(rX~*m4(YM&=_BQ~af82if3g!bojepsajpd{H z&3p+`!n0#&co4Xg8-%=wJ02B301y>)clgoBpvfB=De|Qk>p#s5)gOST4Rs`D9UEY{ zJhSuY>yGyitzu-IZig$Ss`2*#~dM#tZFfo5n(m!)XKCGX-fk znV@@=x_hc6V`ooXT2BQ5TfWsaz2Q#vasIN_8ZVnAb?a%+b33*B51kTb0t%#!rlm2P zUf$QNPMx)zIogA(p~z}%dxsvSATwtO4XMMlpcuOIohLQI?F4d>3;qW1{dl7xBc$6k zhZeXN^2oLVXoLpiL2qJ%2VGIxx}q2tYR@K$Ngjp5xzi!6welGQlod2Q8&KBYIwyp@ z_@U!#1$&upf#Io7jWZ)m%lZq74cq$7#~CAQZa~Lths|g|2k3P=@L@II;`uU)+b8FoFL4_ibU$06w$4V29K@4FsZUeGhkI!jN_RZE?C z!fuBP2sfSQpIza@ar@p@kDp8X^a#W^j@Qz{67O%RREKYrKlv8uPoCMi8dS{?6GzP2 zWYd-JcI&}KhUH0uS_Ow~1vp==PCC&=Ym$Z=s6c?9$s zk?)%ce=@EhH#AUU)xPd&LN@yGz+?}0aa(IFTJDxAJc`oJ_tf{P_zphd)!Mvvqj@2^ zw|UD#1M49@$k(c#{%mzh&WyuJ6&1)@!;Ql7LsHu7`~AluoHvK0=sp-!&?HU3tXy>7 zPj;%La(I*2Vt>~ThTwNWd~;ubWtUD$)zRD~qQZC)1w&w=jNjvH*RRjSQjz@|nK1bS+$fCE+3oe3y+i8-^FSPktE-M*+1;R7GyaNKEze0HtQw?bC?4X|8`SaXz39 zntrE-!M6AJUolZQrihSG9nrJo-AMFMTo{qKEOBNCJOv|~;IQLgl#I+!KSy7DOUdxz zj2D*G`zoUVB~B?R6ZzRj3>u>KazPTsRfE&ox3<0F8SsUMm`><(FX&+5ia4nm$Nb0E z>ci2tJ?e=eBk(si|_OL zux!mu9-cC=NN`MQG2BHX(KyA{A}HjF43pNMx!-_YZ`bNa{IWy=i)E1|R4122#%E zfKWfn@#V6Fo=A=O4o`tr>%O%oRc?|I)GjKVHKGqTk)B$e)V}P+2?5rLx6N|UF5A_G z5Q}v1t#_WP3-gzd0mrDLw$7(62kcE^C`>cWu<#rz>5J4B)udKjO!vuNV77efRLS>l zl0vesVNJ_aS8EAFp^6MistCtA8yC`6VqX>P#~~>i=tJiq&peose8mkP%;S@vlgigf z(ckK77OIFS8C>>OI4Mi{gK6mQ-I|x}N_LfU{_A9Gs>(9}Jf_T9I?b^k5AZb=jC&L6 z66NDXow>=uW>&V=1QiKdX*2blOSjR+EwlzF8D%ZB{j6sd?=0B)RL$K26fa|U4X(bK z#zG?@*sWjQEh3<7f1eSPk#00E8&TvgXIoKb$}}%~i?ecGpUJ}48mZUDN7hL|K>PH~ z^y3Y-`Av$7o6vdaN`B%R4VaKVGBw)@bC2@4uPnidiRPd+@y1Yv`FO{quvElu{iMzE zH3Yi18@kwB-X&QOm!HTrSI*{RfOm$s{eW^r!O9w!;8F8<_n5K5$u@jCN?QBmponl> zzKs^};tX2c1t{xL2i&I&-~&O6A2Y8vffsY)h!~AX{SvhVoRW?|)VZUJ6P;pXRwHR~n7RxF~z#eGAG z#>(v>3Yt{vq+huj8fWYvU$?G8|6EM zTPj#MnO00oz^=%9uFJmngbb%Zt$wy^H;!}t(SY3wZ(RIgwBEX*Cs!= zS=klw2Jp0RW5DfBnIMR$LJQC;-RA80XpwzB-e!G$^B8Dxt#IFj`yw7f7xYDW8p~(_ zMP}6(qa&-%hJe42;a@w^aEH*q$hNTbR|pOT+WBQ57)7+&#E^58l47L_RGzLrtZ>TT z=b!kN+pp8xL~K1d<0ND8y2Bk`&S6j&E9ms1?H!wwGE3)!>j2R%m7q9 zkmqATG1_u(djc&gx1W!uWjz6|rY3K*kk5<~)_{K<^b_)q{?*aT=}_eSf#!bN!Ye^i zJu2o7p1H)^>_yH%-ic4Uei-S5w>ag%qFL33M_w}(=Y+pWL3jYA2(m12dd_eE^c;V? zx-3Rhc9 zvyNWOqM({I@;gVtgT(OfyWPY_Zdm6*u6lmxoMU5vcBfxeM*)03fS=+bfJd%O$xTg% z7)aJHKA1km^@%9hJf%HqWzC)ed*MmV!7{_ys~wX?kzb6g3m&rFS_^ddery$2_{xG= zEK-!nz0`{fdnf+6B&}-~YMt+?{f4`7L3k=n?*fNs+k;g~BK+x(M3_vQ)Aqmk%4CjwE zPkfaeUsr?eY7SzKyJm~MbB3bNSV~&2Qtj~}72;0|dy%vL6TZcUfei%7JoCR=Iv;C> zM8AXBX8l#unn&QQE9uhO`oxbHv{DqeFaD>qrBdb&pQQXV(wVqOz2Ldv2dh2YK~8ok z3fQwTbsg)NmWR*ylcFu$<5) znEVuVx_GrB_@jJ@%8gssXm;EQyGgZ&SMM^*M-Qf0W2^^I7iT;rjX^VX3qFvyc;#*G zj|y@l)0HuXpIDCiT$=NGLj4{Kbu=BHEVk9gE?m``*a>peN~AorF1Ti|=5`ifm$MCs zizNw~floXG^1USp_1=UwLEwY=xR}Md-PYZ-R?mAUn0C;sLA)PqYDCZkz3u$fo0geC z6{~GiaA2wprl;hzVj!e+9?u?P*0SFZ*V~Gzu$i@%5;(_guWC{`R@x>ASNIcdjI<7n ztD%msI~C$^^YVjW+nr643npr?%uYl*U}5~&+WK7?vO}DY9a|bhe&tT{6wCuD!lTal zshe1u)>_#lIGvk?P((E%w^ozT@%XO%>b(1E848{)d^C|j`MUD+W+pf^E|^fYXfZ=Y z>p_Dg{}XeX7tMt*v3d6{I)}-}lw!<;1f#N1s#@E1OeY<+U9 z6-Uvc)X5UFBT~USq>5&D1{xg=0EYM>@}c~y1gfKQ-D|Tni1KT%S3Hn{JE~c9iixhq zIy9n$71+7yonFT6QIxkam%63Z=<&QbAix<$^Fx0&dumUo_aw+udaBzDT!)X#Olvr8 zSF;^c)B|=*+46PbZrT_R(w9u6<`kS-DNeIj2Y}yMEw5H5bPU*Uj*Gxf`@CoQD^>#g zvs69AalJ|JVpp2t9qf^C`aogquimOeh8>p&vbOP`ESC%|{<1^1H}N80dl9-L+8jM0 zS`S%Y+0htrtbp9-JecsRa2~+_$Q+M7VwjUq0jSCjvEEi`%sYZ z%N+#zRBpK^$Z)LWD_)L#0jS3sUYWYlQtspH+WD&VT9C~Ov8tV~I?=Z9${zF3 z?8=;|xdd9b8<4HUIZV6#Ro?$=nM8og)Wjs%zzSS#MS5L?`SnKZ=W#)rbsKud7WU3q zTsg9&BdfjY%@XM(?OXwU$HMF;tFWQF?Ng+P2jXh{>yv5@(&22DUHn_)*@aUUiZ$pN zFQOpznfaxsC`<6+t{~Ry-N0zIi>A2{DbcYM4SmE{j_J=KYfIO6Z%rc`oo1MVgtNh2 z&h2=_QBU@w*nSewT}Xy`msH=ea{^+q8oL(~E{Tlb(S4Bm1yjC6~MA9oCIsw_L<~o3s(QQGD+?akdZQ?3*!FR`>PlW47NLEG2$J`K7 z%{8EMPIBAr$Y~1sn8LV?BSnLjjJjkZ)T@OJ9LFMyYeW)8Q;9yDmKqrT1ocOYC zwkHnts#&eqOr<}P)!R!|p(b=iTJ|qKI89I!z2mH-K8ejQuT@y{oG!hbzqFHYvZk-C zY6vXui}T$w=XIgu3ryeemz(8pZA2z0EeJ*S<6(7UoM^&3njM@K{)`1rC|5JzWoC0f z3i?6sf@gnVvqM$IzP0%^*%0NeDSW>~cJOOu+hz&R4&q4FlxlJ^`;8_E-O|GEMtiG8 z0=;SDl_0yuzM~K>jS4x;Pa-H#HVf+v6WUw(KC$eXX9DJeM=C8GkjuGXXysGY-e2iQ z-=B5`m4+YBXwpzUoZ>Oz&Y@FsWhL0N>HS6O$ZBL|scXt20=3{-SwJ$Y{(C@Z z6{kP_XNVb-^-G%Cx|V6vy0!ICz)A83-48|-{kZV^C42~LX94@x{D5@zZEn-w$lCDdl&f40P1D(=Xx~JpZg-gnO*o~fPI^o3jfMV=BS|u?tQ4FQ7 z4>5mAu1-?eH8)2#w&^=^Knd~o5MnU!sBQQ~i%p+N z$5Tv*^xj9$p*oV@0*M*C7fvCxp~XCyo7w^df_Db_#BYE_p-c99MXsz zZbZCM0DZ3M4f59EbUaVK0_&5|9tvnlB&c{|9=eopd>bBuX0!}Q*jpWtj$Ei8*raG! zXcCS5nQ`u1xIn!DiRR{j8Fi{Iww?DKH}Y|wmWGuKsash)ludmmbqxD!p4Jk7rDY%l zZ#S98lmNqEEKJ^mE!Mi`Om~tqI&V-{wZ#lS4%3fsS2~%)>!@d7p8vqvOT)aA*V&oH z&m#9$Ibr_IBlW;a&94d}w#k8D;Sm4OAaI3XJ3!GoS)+NF!f{w`PBhIt(?!m1=}x$i zQ}ltR{kpkU{>QqSZEnZuY@TnRutVs*SqXDebspJo}A5Ry_?Soqa{ABbVz_fUs;vwUl` z<2uvW`pMIy$)2LANdAL+^#||G3()nd=8gj?jWefCy9-iTQ-%pKpZ9K8OJ>VN+V6kN zlr(wNlI^{)trvOkm^Lmd{{7=&lHEbRa3+#*VoUN26uXfy*_D$DMO7Ff0a*Hl>OqED z*{9_05$%!b<1a^coA){>t*wZPj@7C;XeJ7$6-ZnozI`y49K`R?l65u?)3Xp@FDG#aP3JXEjWSxM%We#LLa zaDCIA=Y7PjCg}+`Y*_rNjiK5SajFNB?wfmA3gE!AY}L-?mb&R}FnHMyD_r8AjAW3e z*=De`$bTE=h}3gm%up=)lyGYyK~GUQu_A|1qPWCq}+1cQi zJDc>dyLpt(pg+4PR_yO4{`6{Bgno3!1-yy#e+?CART9{LzhvhN<9qJw_4WU-_m)vr z_TAp7h=NiJX#^G}p_G6$ECd8pN<^f)yJOKvcXx+`G%QL=x*O@PMRzXhT=_@|B=KE>NA%jZ8i;s%ZQ9)o>T zLvSnB>hs3S%T|cs$4=>|ahC-!apvS|GiffU9lsrENGH-b3z&LR3`HRAw2HLt<8;d^ zsg7vk^)&XWUK#g+#n-o9L0G2%@CrL`WK11BL>Z7x~!NqDmN@NJHG-vh(lL@H$7A<57l;8W%Nv zzXUv~3O{~r%3VoJjd-bHuUYPejY4rfb)t*f^WOacg)fLku9QM7NeaxgLPBQKI)mr3 zMa;(koLipxjfr9i`a&%3(E+MBU-(MWtkH zz9)m`6Pw#9u0QNg+4!%c@}zR6&=LMDg*b%m3EXE+UcP^-afcwR409WnrVk#?vzXMx zbmJ!r1mnjK?-+m^?e9W-RL`Hs+NSmZ4em{4qBuq`{u>(OK4HA$rPMf}xChmWpU zbFF$(HZExoWS*@Ee-IJzauL*)a2)v(q*l{4Qs+Ppl`wWyLnb2(>FC8#hBCgmnpDEN zgEsPeCNENpGlo=zo!}zy2)n=ATDiX9WcyS!G~X$kOH5tR6hc?lYiO?&!3jxzpHVDZ z-hc5WWnp!5Q}tcMY{`e3NtaC;LV0>k_j~}0Exi>)KN~fYvnnglYwxgx{Q)Sl#kVrP zwUv#LcaRwIANI`xh&Vm52IssbYbk(vUOIY(x!-IXH@ur48lqS+LngBTcK)cxQ}iCN zigEZKevW2W5N1IILBEL4mabpI{J^{S?#|us#N!HDeY)o{T~`D4kd|27FD=wi0-R2E zjh0Qhw$kTvzC&`st3(!Ys-&GW6-T;Ux8LwB+^bzIItf`;YASUiCaA#YPpnHH(8A-V zDg>i~%E&iJG{ciP%~ln&#b(7IuJZ3Q8xH~PUVUaS1&!Eadt>X(QQIVQ%88W} ze%6+YuZwCnJKG`ks$R)MZ?Cux3ofxvmU!T4CO5kye-BeWqj+<)n6s}z*MEuyKbMpR zoBsuuD9^Zfmle_ivC~$5?nzB)C@JB%hWow?q`Azkkx@2a-$nEJ``I@?RJiZ<@6@_9 zr6}N3j}9;i-8#SK)ig0yCk8UH=zPLM=$M2Tf57>26;qW;FBj&rflRkBs_u6UZ0eRP zmf-_s_{r&AwAK>Mo3rt-X+qe}J{1?5J|l3<)I1Ccv-0|)cV)Rk@Nfm)A}@0?8HuC= zX%$N88W9Rr#DHm!Jzt&|JW%YzvWidZep~XW%e1gD)-Oz=_HB8PWh{%~bhZ_KmP7gR z+i8;M28E=jyC})8rsK;neog39x$gyzl3F$-ie3?1J1%7R3RU^9Aq(oGx=C2|w(k7b z+!kq2g1}Sm1&s#^_Bl~4@*0xd_W5$F3f@n?a4BNn<9rc^$rlfG6j(@54|7?U`u;*! z@^R`2ZW%#;|Jp-Zow)V}_eFYM5L)W!>V!vL);GM9VB#Ak?0?7C_W#D$e(_tvp1=65 z>tFm9R;Ui}J2&DnfrG*cp$pU*Oy12-)|NNereM{802U8!;kcD%2H(y`VCs10j zc=!cD9T5ZzAAiUdIwm3Wdep>+>6xr|hap0AZw#Y}kDdv-9tcNcZa7*73#OaO7&BP# zFm^=JW_Iyg%98Ys$FuOaLv1%`xgOoZn^<0tKSd`2(1?yz?i0C<_xtx zBhRdtaI9a$W}LR|;&Mp@BhI#;Hq!P=Ej|}>xgdou79|6!ZhAn?Jz;xE%}C<8FOhCm zh}rwPx5pl3b;lr-3UltWQv|*Rkt%cz-#D0NsFYJ+J0PgELXW4aOy`dINbIH&4bl@* z?OB>FV@lE{jB%au<2)9j|6`%#B1ttnmD-}xcASLP5VyB~O*iH9V(w~Y|iz#)PMU^jMaLcaaPjE4gh_&||Ph9Z6JD=~>f@5ktWjymczw1*O^NY!35}hx1mv9aLekUlnCZaV- zdAoQ*be?%uQt(ljMfRfCD6rk3iW!=<5Yjd6S6hme?y0bod(=->zvTOs;&Ao+h&g`L zs&8wuEQ-`Xa4_yio3(!9+X}%8~?3E4XHA^V9&{rC987<{zlVMUCMZhPd zL-AJ270FerA&ay}SP$s(&lvTuV6&D)0#3p6uM!}xzHX-ATY7^5g5jgH;fx?{BfXfP z$&9!gEh@*@-Ci8uD2d;HQ#yXpISMu~z3_!JYIsdLp;5+axUkAJdW{Oj zHt(eOezA+QVZpn2i{CL8i{lA2#Ulgww2kH2!h zF|0O-yxxCD1sBp66$@C``#!pMjlTv^ZX;YVmOEQi66DK8n$g@EY_ybHv^t-X53h$# z%0jM>I4*E4SUsHmoC#Ko$ znD^G63skXC90kBGs}L78We`$lJ&O9W>=S_!40D|^eqds5LI2Inm#Au`$^A7l^Kw74 z)E^Z4`N=!CNw)lk#z#&=Pr9i~yfwp+sM*R()U3V86?!=C^xh#w7$rlPnM- zo9h^?NkR;ygUnd_-!8j}2wGh$%}&EA(=Eg=WJVVWZaPT&LXQBs``^+?J{gIA`9Px8 zI3Iui`hFb6woT-xzYR3^ok+inKIO+7WI-^9BoWT!{JKK}F0u0F&)xf`db?ESD9(k} zcYotclSj}G9g(l{`t78wR^fVm)mxy$G~E>TY^uaCdfo zWUIZOEUx68V`|HwRzN0Uxk!tZI?I2tSkmjKJ+nF5Fw`v9STqeAAwdJud9u_UJKNFt z1H{QU92q&rN)|qE={R31Iyfk8p}BNR-#+E2t{AxWDxT>_=37m$XHmb#hn*39(IMNW@-oh!`_g+;k(t)2$F zgr1yY;gP?Ev7zc|+*M>H%eqDsMde{qru4JHu%rdeuh&F3PhJN$SdzBUz@UT8GW)K92e&!gocy>I(57 ze1TC0zH_n`(V0AO<&bgXTUVL_9SQ`MxXB|5Gs4{7TuvAyGnvd=eA3bg`VloDcs0eM z>w0&ANlY@TpU~1>@Q^sk$7u+u4R^c#JgMuwLA^at3~}pgP3{Xv_q$1aCH3+CDw4 zD1BHGX@Y0h06Dz}idn-Msx!?w{ZRW z+$WwPS@-i4#i3x?O9EDROcGvxjBw6<1~>+58pQ&4Ql?FpWrD~-$HVovx>azj~@-FLXYbUN9T1-Znn*Dc(ny6rz);Aox+J6@$EcCUDFj4^|$Q|W$ptK@=Q zq)0|7FfbXffbHDo|HPOgms?rgZBrEbR-Y*)mx7#%OYQ@`LW^0=g30!KK5ca&NX=p3 z*A9=B!39-6OzTXhIVfaJ^wC@%-Idrn>J=9_c!OrQa=-Cvn=J_$b&qjnrLy!5xTm?s zV{f%v?xepoL&VQm9T{aOk1O`DV-oQCk-r?Mn#|N7;$f}tIMj zZmBc`vp5&}2AWAg5_`0Xb!SBO2A3MZmu2Mrf@VrVd4#S>8bb#fWFsI=*@fett72fJ5m<)KYJz=Kb9#c2)u>wcWyT05^M$yW$tK^}g|qTf9Fs7{c@I8ZY*F^jZB^wPwu z{KL!}%%A+#25G}#@7WjRt!ye@m{p>y3jaZfOrLIf(qe6_(N;hLojBtXi{q?9MMqYT zCzZ*gP0I-m&Hyn1&uhP~zq38fmQ@;QVWSIF`??BPu7nG{7$z^o2ig>rbwY<+c2Y0GyG~n&=^_zK%y6u{G{qa|NKHHY;%UGrqq`ha~mpndy(}tX&2d#pBqQ~ zwn8uoe=qT+kUQgkEu6yjK7j;->p`<~CM}`js*$P-qiyxv*`tN4`Pa4Bw*eznRSl;; zl`;h{-J1!K$V)rLzx!d$h>v48$=Mv7zH!br(rqVu;Ks^P@oA*6bEW*5tQRAh&zbTw zE<1JCQ#~?V`-toqH+p=NLwESa{+0^OXpR)fp@*n6G7(V(@eeul`C8+PIirBk&2|B; z73~y}tZQTU`kIzD`#NPkwkZB(*}T5|a!m6^8KSgGsA>spyGMP}Wjd~1neaX*p*CwK zXJ`gV!GTEQi^_}jca|rYDJyhc4wUv2Nv4il&}*{lZcO@3n+U;YN`(QqbjBK*Qcl70uu87GA>)m@B*ncQh|>8PqjSdFbHLrC4-v%$Mee(^4y@Sr@XG+`+~tvIN>>?);T^rzPaH67h`D=+%RqN^G0Z z{Dq1^a~8ritZ=&6neG`~i53=jt8!*}8+b~Lt8bXMd;Hu1Qxfw07ZLZtaFQxU-Uk)- z@0V6%JclyC)1=(7Q?HRN&+dm5Rm zf@glO0bb0HrLE~=#(0I`YPu|PsaLZ(mETIcbnN=RqO%n{175mXsJ_HJ3EsR2jadWn zxqy&#z~qTy&_&Oy){vuD*E(SWnOv5k+{=b)u_#=fRzhICvmK=+q5PTRqlPqr^I18I zp(bWRYQU~56f-J#M%Q=M=?ZsT3nOD7mrcF&b~}IZ)116ps$K76wt7Fli;YP=Bh=Rd zfA_^gKnp9nZJA{9h5vy20{8OU6dgL9+pEFjmg5nW8j6s$U`rhw!UBt$C1qCe4_Eok zOpeyiY*e!(C#XgOoje@3L0n~g4(fF0Xe`5NqHH8rM)xm|2L*C_rI%GOQ~1Kh_V*UO zrcZ7*vc_}8!Nga1Ac7w@jIkwCrJwItaQ-Y?-x6J@(09#Q!Q`4m#hjKnZ=bQK``P#; z2jP!xQV<;uLv5=s8plGDjKo4euHa{gIM_Q>Rp_ROOoLjQDr0QgJi!4`P9vU1a>|^ku-M{5+`5>@n`~| z62)XDB9-P-OlD!2wj90Vd}kJKMM76>x4-e~`>DH)-G8Fs6c z#6gc^qw~Jo1(|G%StcHpu?=~llS3dC#BQ-ek|+4f?KbHL4n#Gxm|Owf4&Sbq7?CS7 zN8>s*Yz+Q=rfcaQ+;2uzBWWR#cn`F^#bETbwr!tz@jse%QuP0KAi_KH>3hZ~xs6*q zDOBVkp_y8XQQudE=&xs`S4+E3*%Ga}kI1^OgZ?_sX771dVSRUHcODee;+gJjg*i_gAQjiaWs{AkXr zEw%IOw#N!&)t65(fAC(YDmMN5nJzdjbA=mr(LXx=rIBojMaoO%gwWj1t;@?WeipjHZRlS|K|luk`dE7=It7TC zNEj^dVOk60aVCZ`pjB;E|Kyyci-T^CSE|@kXXbC)?@n)ypw&#uSCx*Yhk=@P5(rub(;M6q%0-dv z=k#{>W!8)gNP}5jqr!}cH~~?|P_-t1Qy%J5L@#RK%&bFO-Fx@td^5&6eV;=q12rXD z?V`$w*d#z^zT+1?!9MpM8Xn}DvZ`}r29xPO51a`lg{Bv`hk|4W}D5@u*B=&%? zj*z8F@9PU+pU?U~=QJgmBI^meN7zrJ_XM&BZ5gX)pIX>2GNmq8%Pa5Y=lk^YM5JXp zpX@N#x<~fQVF)Bk1J9FO43$uf)qB z4>+gH-E`iSI|U9Ffv;F}yuSBG=sn(k9`C@{jTxm>uKH1;XYVK)u}CSRo1Z1^6m=Mv zd(CJxU*zn-qpx+_vWgwX+s17tKhn`YV!2&3BN|JS7$arW0k5hc?X8qqtHE)9UwMs+ z>yC#{8QcG6PZVOf+Dra9Ph~VsQHktL7(!IQEW9tS^N={&t@*mSh3AE+vl8GphKkfrjR={?zjSC5dCmv2k6GauNU##&o1P@%keU5_ z)X3ahXHIF6ZWmRZU$#2^(7mITmR`MthTBd-&mS<1Cb0Mrx)Pf;fjm@}F5V3T6I!Cyoc3Kfql6r&$hgQIrK#$qa-_027Zdq!Bys}aj`jjEK1LT3^UJd}KCpX!=w9+!4U9ff)z|6C-QDr|Cl(XN;Z2xyGig1G`nbCc=T_Ak z>no9++47jiQo3Hrvhf-Mj>EK~Ue!BjDv98Nf3Bn&wid)`>cwH%UUd(SCsri(``^}k zy}A!7&^yS)oYA!Nk%-GKA*qT$zi3j5jnPKcQKH2g0c%jn*bc_+Cw`j$^qOwU(+~BV zqh^Iy@}=PzI-_hHCuhTwI0o~N$uQ!&$IWygN8J0^qmf~)$Yj>7T%^~d5A_WiEm@xs zhHs`dHZ)$Y!#cS=icaox=wv}e=Pth&S57IX^8Zk|`Cw6zkIDw72>jV?If4>Gxc!p6 z*OW<#(eyx(DwLzr>TnM25{4RAFG-WDvYB*GHHvRbw(0AK>+Q$2K{`@;JgeL%Uzq2P zfcWVk5&?Eyp5*EUw_k! z5Zpr(-iRc-2wI@Jr)%^$G)W_<;_y8m2;L()_Vqhndb={UvN~(AO zz8NN|sb9NSyYz?))afK7sb1TD{@Jpx2qyY@@sl;v@kRi+K&UV6;EPMYfgYcSMzqM_ z#eKZ6nZnQ5y7r=zdA$%a>#mHY06Or`YT6~t_T@Jk9mfF2jsZz-l}zE4k5fzLheqyk z4P~Fk`NX4YYx%A(gr3Ip2?!dqgp))%I%Y~Pxd^Gr-sTJA}wPM6hf zz%8rVs&pduR8onwwPXvFW?s`-JoKF^+D}B>AtT{2{5X)CKT#?oZdnCfxKQpBjOyRw z63mw962J)eG9|Yx+SiQg&{=3q`(u7zj`VIt_E3 z_Pp+I`-btVAWle6x4yjQ=TBJ0*iSlcrmqcBfAw&$zj`<&315W)ozaVy(FOV;Ba~b> zHya^TBwoR7{vl$lv=h|S<@IS^5nG$OKH7;aLB#u^$tI$LjodH#VCJeGcIBH#Sb0Cz z^hgU-l=yibv9Az-gvVr~*id2TwQMX$(F0o}4+dith`rU?y?<$G3m#5=8q=wE^pB4| zo_-fS!`ijVcAM=g)u9umj6S$-H2^<-jfgcZ=RQ;R9F>=fPtc17X%xi)q|E!7e zl?69nwK4^o6~besD@%Qq)kI%4TMLv5C%lQt*hIx{zhVzP>{*88mariIape`6`y68* z|H;~b-6(fNVccK5pqBQJZ+qPETiMWk?1C_QoK5~3Z-0=xgCS@%wXqT7Phv@Rp@fbO zVtUEixm9;cA-x=#hnuJq5RF82A_L20~$%0@o z-)kn2Kf%|1mLS4iAXA{=ot6#zoG~o!tL4#WlsC6byUV}o8>Z>VeSrxLjkwq(4J+C5 z0A)3d0jXET{}e(E{w}I8@NgY)a24)I}j}3uJ=F?q0 zAhjU|DdH|J33X+@vue>TA*aEufqVC}ULF$z$*TWH{W}xsTp;e{M*W_-&kEh2rUX>y ztF;aalX{d6g2l!sJiU5NV=seg!nqW==LPzkeO#&9b6skMjX)jaFugPp{%Ae6M>h~t z^9j>93v|nxm+v{I0qX&@7t}+X8eH-I&fX05at3?MQwfbL$&kg1Sp7$=u#25X*Tg=b z1_}$}{qQ1FT?;`@=fB-Lv&-MNPPL5b2ak{JzuE~)ln5({HivhAgVuMefDr zALv&(F1=$p0;?8I9;-^G1u_v9(0KPz18`|+rO%eW;9alFNJ(F|&{@oZC#2hz$lIh`VZF^)SwpLSR|C-IO)h92+ zIpI$lKTySuh6xQ;^Bbypcj3Clm&A3tFswy{k#00!$2V9-JPb5L>IXHdd0Tw#A4#Ga z6TZnGOlHIp7*bDJpB~>DQ#u=(NPlXsRB0P@GxwL%Wbb_J*aq2AeGhoYzDGys&!@^P z#C+(`Bp6N4bw&Pk#DoRS={$Z^!JbB%6 zEDc_0ite?JZ1o}tt^%HQj%7NLbtOG`Cr*}}uwi2QFc*uR2_wEHr2 z&kPq`+@GjUP1Q&)eFGhTk&e)KBKBwpetm=7^he#W>Xg|wFcvB~w3Yn}^}8zk?yp2S zxKV#QW&?f9Q2jiJo%w{r;q|Ad9~jiZR9qa-Cs_>;?C|fEQaKCW`=35P`BXQ*w){tn zoRa}IT=q~mXWP!oGw7rkJ!JzYg}=HybbNOc`=c=Grv@yjQ(`4UhB%kk-0me=L9XC9 zmBm<^^^Zw#jLTS9mHNU(mmlJ@Uss8g$)xGZ?hmS6JI2OKrY*;tb<642@vXkwC}mww z45z2_c`|NFhVz#8=Az1Mol9P_307k|`Y}aal6h&h^7nqF6*ZJ(3h1uJv?qX0lm`EX z?g~_zA$vi;LqF1Y??&7c+>=NcasKo9GI^dLE5eTdV1+hCf645sGkX%bBz5%zki~L7 zZ?3&E1LO#rjt#K~W-nkQES&vH^;<5I8R{V0wUb6hBMgDwew3xS=Ag!pFi|C@DpP%0 zm5{S?Jn8u!k9KqV(RNXis^+IP!YUp%xL%+C454fkN7c1s#vf5wrsLNVcLR-(q(2>Q zh!oPZexHpM)L*6lCTLv?I*X`E+g+0d zk3kvPx4&l756+6;Nr9ND7$;8q{=^wzMDD$x8zxU|%+QU(lX-FT?W^PP{Dz|qI_#7( zRELpNCf#Hyx&*`jx`))gL3$YFBykxSuEjV~C-QL>*r(Cj`f(bJ!b7ZNY%I0X-X1>J zDE=_*RmNe~jeGdv`W}N9p;=#mDZBgok}1Z0f<;TMSMS6wxFg!mpgcRLQCEpZ>8h5(|v_nBzb2 zXYMD<5mo+E_1zO%OD3KJKl-dtvyO?&gMFa+$loYGa{a`=`3o`y1y&)<%Z;ZI6DR5H z1u8$3fW#@-3mHF^w}K9dc;Y0%Z_O0?u|)4>ujKarjUjD$08}sWzIGjqwE8-WMf1Qf z^Bp59J+qZ?Dq%A*4yz5RQ^H53x7A~)Qlvw@z|lc2j%`Hg{Z$R*z8cJnt3dQC{}B^t3^Q>u z@!`cfCXtOVEK-KV5bC<(CDG)YBw!iz@R3?Hk>1n@5Q8+ESp^in`Tw@?iOK$F;gdSy zbEO0gR=Y@&|6)48Z|SLJr`XoGN|upk^3Tn-4#{7eTTD zeOiOxNU80l?djWpmJ6^QX6^;#yCDGE!6|Mka#W-Nv_-JBdbWsaiMZR2__2)2IOP_l zJHkU_sFL#L9>J*q&@F0)s#UlB{>Fa(l~=%tm0iiyh=tQB$7v|^v1Us|b?Es~io_<; zCCHr^*9|`=Wd8*1Z>q!YBZG(L0SOerjScUEW*WX-+zT98dNlT3QN+G2@vrJ#( z)ERaIgsjne-3xQ`|41(Q59eg+^Aeb{(y41j(ROT2Bte4hy7 z6PQtaGT@#p+%bKMluc9N?~l=gW};oD9h4xYC#5BF)2HeQmz&4gaK+!Hpa$-dOZuSG zKP`C z({@fU$RpsVL|8&(@l%$Cp;-fmPFVD#s03C(?eur4;6dJqYY937^7!-=Cd*G0 z|86y1OOAXB-!$1?%NdJ?68!E_HZs;c+9@XlhfTAfb< zyI?;^(qBZW?MCX6ZDj6^XTN0yJO9>5M^3dPdsaT!g7==ba=GX0g=DZRn7cG_)*N`~ zSY*5fbMUl5{6{?3FHuMREUu{2?6{!yhmp%kQo+3!u^Pdm3rwDdLSrDS20_apnDM$x zR7J?W-o^ZUa(nt{CKLK%sPF(c??L&mSrglS&hGrBcH8aJ@t`2+7|!yj>1r+^M*esc zNnGn^L-79@x|HdjRjxKC>j>uImP|od0q(qjvVQE|EBfW<%9x)^La^9jN}vCH1a@0E zX=4?x30E*7@9gBE{}Bo$w-(orB}HyYhrv!1m{01lQ=883+>F=2?V7+#%8quNPdfi^kVRZN^FzG}KExaV~!XpAiHC z>wc-SVsx-wHoj7_>AlaAEA zL}qymZb7_7cxh;hhe^%dQTyN8848XcrsL6||AFzn1(%gsWC*oaogPB0b&@W=vl&cN z5B8U|F(B@9S;8V}<-M zRqlzIWb>mf$E`_XxWj*18hl~hJoACCE-NXwdbO<<7v4vp5Rz?OGPN7+1L%Ez%yrQ1 zAM`#-gJ2rl+dwfL1qiFt#idqZO30sjQ#&~8;-%9*gZKON|MKfT^pB+Mp97J(&lSaA zhyS)@A7KH(y9oH&DpVj$1Xw)gw|sdriUXVplFE;P5Ws(nxf5-!0=BtmEDej({idr= zHY=dqo7qvP{~KxizmdlO8)^LiL!_}UzTHTJi!xuoJ(Jdklw7MXd8IrwcjzwSolslihD?wT@Qb;o#cm zT%9**6kj~1OD5vA+f&&pHTXLVAopb8NvotliLpiA`&Z@#E|)qcfIp0Tl2oKkPukvWvTs{6HJdOGqwFC&(7;O zuM_#PYTm@K@|rMo(y!_pe<@^#L#@C4i4J{}^@FoQJPW?^$x_dN_qpn+mO3y|GqgO) z;F3rV$t*tvv_ti&`;sN%kYidk{PM()`O&HVmFWZOSie0I0+!J`=Tw2+?_Mx@B_+ul^=7mt|AoI|j!}njFGhscU|l4$DD$N9+9zsEx2s>Vr|fg--0LyrJc>m_Y)mDJ_9SchNg&kULmBA?5$NQbT-hEySe zzGCd{GVEsO_Di7%U=9Y00HDE>HKHWvFm9KZ)cWM7g<`=wYcR?_Rrs&qkr4$}@C5)F zxVkLTp9=rUWGPT7yL_hqM-00G=W(RNB(2I8P#?>Zw!ucw_jjwbaLL5fHiLhsf2saQ z`d3xWBX*nd+@~dW+ni{Cs-8*0&Xhv1D;F(fj?jJFKPZ+FOQ)np)yOb&}_z>{4uzhr1C2$pY7xCM}9b%qPJ7=jRp(ZTw!dyqg*@wDi_ytWr1$2xACYe2$+J~`9 zg(%gtyGy*u-LGZcJP$k~vae-#&K<{i+*?_;b=@@?x{!!7neVdd!DOO7!$8XUPn8EQ_!btgAz;C!$|P z_7@a2zbqQ`)36)oSPHUKs&zHxSa;0^MYtHnA9mYj3=58g5PKspd#msLl@Lqr=5#t; z7@&cW5&A`elLGOD(D$iMZVJ&)Tgy6K#XA!wP66GR__ChXLgUT-b&M_N-_FZws$Ow& zR|*RP)j~=u5dvr@SxmxPDSDG+v*D`ay=QAH`)>`DX=T1K;;J9R2y*h8a|C`sKBnzg!~D zbl(r2H0&F5>sAI?a2eX%ef|0e`QnsXCvU9PaDL=AJm}+oSyFm7z1xz^6T>AD2zg!M zm?r8jmL-^dPLrPlEWoIT3J^Od*ruQ83>@=Qt{AzjB@7q2CQ zQKQ>~2)koz6)}1-p^AKzpo)r!8B%k%MPO)b=*sD0I0C8^c9~+m`$6EVX_Vb3m!=XM zIhHH(Rf2;-MMXny7b5&7iQ z1}jOGCF{8#^+H5nQ&+CrLtECQgLVtI>}+*P77IB*(!R{R&S>@OQ!|%cl2=!V+46Qz zvXP(Ss(ibA&3m)SY{{PANr2c=Ucv&LF@EY`xX|>0qqjNiU$PH6_-QOKF!qZbo!W3% zFC|;p6m|b1jIxjv{W4|70&KV_4991FZNi{Lu)76TeSZTz{-fiU7+q9$r8;5lS^VvT zg+*QmL4FU7*3?amZ{Dn$#Qva?CLi*TD6;Rv8(JA+8d=P6bOW|vOxI6x{uvo73auqB zbq3VM=C@F4|5<{uGeJKVbOl|70+ig$>;GwBWa*iqZf7$XFwlahI6QXf3ah0RWhTfm zP3N*)96%zBKjiFb@j$cmC~!L?P{mh;G?@9CzyqdM6rYpjp3%3ywS53DOrW+%BZ zS(e3*Uu$n@X!xi?zdx1)Z^D~v!9@*K%N@F9-xu$-x*LPJO7&y*;Gh-cbG28;N5Ws! zve@jreT2MSSRs9}8b!PWY{ZPH)=~d>No;V-3^N-QOT%hUVsqYMeWX~3fdxWBBAB^gFG3|DRv{c#}hOs+SIf3p8 zQhahWH>x)~DcS$AsTi=|=wn{|6m+rCp35OjwH*WCKc z<5I^pA^ayhn%@C~sgD;HucE~`|M_eMPuh|3hXzf8fn3)`N|zN9@owBozD>~H;mZCa z;2NK)CKX4Vzpm{Hw(oS>3KzJ$wt2D7Xm(R6f)zs|>v}5uU>d`Mq~UmArncd7IK8F9 zo--8&SQh-6kH+BoNvBw&xiXl80_UnV@KnCF&A};PDMuRN4Yn`lf_R2mpUkoK@JJMM zqCZ5~_^{@swHqz%?qbVB^iMTJT+-N2*?N5T#`3f3-<=l2I`2B?oqx>9e==FY#gY8# zJtP7ZDaml~d`1!e;lYy!c-XRs>Y`bkc`r)=aID#wKen1Ntq>p(>YR2RCOpS=_+(c3b9~dDIa1vth2s%jitV?C zDaq?$adIhx6ex=9u@)C8sKxmgIWMDPPCQLA!Xk3gpv&7*)j}->hOSa>XVsKiuEi)U zN?n>rdGLL~f?Vi~yZ5E=&DclXtPR35F${A3$eo6C$JHzv0)I-nVK;^dP2~+R*B`V1 z3r93Vo9Vv38JrT zJwr(@@XV~VSxnDahy3{3CaSOFdyV_~tW61QfS0-y`&I9}>D@6DzNDBwG(S|rn%7V! zczp~th=X*+J(5C-OL4fQ*m2L>SpcNMY%|c4WpozWTUPfmoxJ6RHfC|~wtfH4`3dsF zLu#|+i_;P}BVN9p8eGJn+QDXJWDFHTNP zIWa|y5;t{Da{hdkaF!>l6B(u?x09Fd2X>*CYMt2!&F<^4cRmEsXZsG(ks-=jhb$}- z5NEpvI-5KOX#rU;HMpL~?dg~q4J6l!R?`%lK6a{ZHi_n59cnf0+@Oh5jW@4fLYe$I zm~!1JE@)plUY{e{5AVsVx!|C(zb z@7e&(eCNqQURG$;N&rerN#(dIU&Gln!v@zN$3jQw47r&u;faQX4*%6_MA+RyV~idm zD((8wATFr6g`Y8JRSjvY_(EqFU4t8GP{2aR;n8%?nyxwm(d5c56@T!`{xH?xlnN3c zmKD|^C}W6j@6(OgW8)R z+fU|Vi`Hof=CdOv^eJS5w* zPW5))jcdAoh^Uy_tXY8o@$28?O`UKDs|68D?y)!H2TLXy0yie#;i+|_>(tey@M@qi zwtX3`r6s>&Kb3k?+=xirJWeaA>Z}`8GDr#FKe`MVRPf6x3WXV{fP>oM)4*0Q9swWt zv+0lF{4<`p!>EIUBwvC0OJ5YM)*&~HWl?|VYYSwA$E!&neTaqXT5b#mtU8n6gp6zT z(;R0>;^zuX(WQFjZkn-hTbRl2+6jq3N9A|}#ft;qai7P*Y`3gRK(S5upY!)$?J0g! znZhCLXZx&-CF(3N-g~*45oZ$}RcsxxmT9&XVGio~EI)58H)%*1wuxh~fhRWiLR~y+ zLcKH)Ei=O0hoMofOE|+kV^El7AGFxPth;3ymFpy$(_`@##hXAe{@$)KKXchgcd&IC zTUPSLk&3Nc-m3`56w*wlc#CEhwix?5N0>~q=VkeIfH`hrDDh&ut3z9{-b!eFPE7%m zv;qg&CEg~lYW?RAKPh;ICH?q^i4Dl~ASB;(T_S|75@d)cx>qu1wwe0RUaQE;tYkSd zubd^V>{V~$`oX(`Txk01YeF!#FO{lgQ(ai7{W6_V1*8U@Q^?wJI~+&)Kv0a`McF1< z5XY828qsFvSl}mB>BFM*Tz}RoSgO^Qlgk;TmnY0Pa`Q1kj!MsIHu+`w*AcvDP1TMt ziR279BD(@dGO77U0!NKb>_3<38o&C6o$2U}c(T>9xN7~2Yz&c@g~z+GPhGRfP%bB# z!J}~@(v+jo=J+L9-71P&`QN=$f$avcZrY@AQI56KPVZ?(Nh;$Ji;m!G$ zUtv6bHRLuKB>t8swX&~0+@!d+2jbQf@X}EE;hxX&II1Swc}|k~+mfX#`m10P16-*w zGVkscSF8HolTC|d)U{K4Wf zodvmb4*6eq%%rBN(u@x1pOKU12Z`cemo^YL9=`PklGdgmw0n)1u*VM@Ib2w2H7|V; z5#nGyh|_gC4A`$Vla#KY%@&IOd8K1F32_cc0wu}S8fk`6qX@jLTzcFB>YTXWtqKDA zj=H=4jM~Ra!f|xt+99C&^_+y#0>-oE_SZ-}&l8cVr!az)16Q7~@SBH;C!RD9eEa!X1=G6vE08-$92IU_ zQZrGS_ZHmrxYhajXJR@^1yw5|+N#gZ!kud|XZl-8jTF@Bx20MP*+2bCJiEsW!tc0t zHdwlM%6p5A0IL{hLQnfsX6Dc~Z)-kJ+`1hR?G!S*=!IO_G}kWvF}Nfn;|boiTYp(Z zacg@LYwHXNArn!X;H`uP^Yly)=ez47+@Lexl|uT_sD0O~%mzx!k(8(qRXjQ8l?Wq@ z9njg70jWKHvGL&#Hs9#fmLMSD`c_HG&JlM3^9CX`8tlMJ+eZf4{muKlo; z`pIfltJ-r5M!1_I(Rm|1Jc_rRCOIgQltecTIBFHMTUuXuAVY%PTnPv)2FiS(>vlJo zF2YyLCx?J8Q)OzuZogWIY!vJ&mtvFQZDC9fT^(NgLQXd@HD5zy!_o1qii^1(MuL*j zwBE9~5+>;T@E}P}K_PB<%wT%woJW7ovek|g986Ycfje67X)|eCA!U|KEa=9M*z2{D zDN2OcPj*r+T7Mr%73f8<48s-$DM?pigbtrDH(eibLKvH_huFaF`XfXM7^5JZ`5KtS zp4bHhjSgOG>2@lwpzQ(>4GW@);=5ebiM>!i@_ROH9etQtFI?{;sS^zyFO4YGVb;mM_Tx)mM2Y<90PX)P9c-^|Cqq)ys(I#TOu#_oLX(3E4C zfR}3yMiiwPJSc7oVp(!lQhl}*#8)53^_skNSd2ua>2OE{l;jS?$!ja4oc8~?N;|tc zJwAJr#6@LMC<1XP4!nBa^R5x?>a2e^0=;gB(Ba2qBf_|#^_Cwt+TRBbQ_xXa-XjNN zit*XgwV-xxf|Rw8-PNZJ7}IhQiyQ6eJ8KWYLB0PEUvC{2b=$R#st5=us7OhPNH@|c zB8`MdcZ0;xISdK{(w!302+~M1qtwvdF#|&k4KsA_LGSx{-fzF(-hX-=!0|gSuWPMy zo$FlZqF10u@x%eY|BX!0)lts*VK4Mz8{2s0rC;}Z=Nb3&?2)dTTBXcFj7~p>)L*JK z-OSu)nQfjuK5Ka1_^m-|4S$6!xYC4473d94k8Vm+`0PTQwL}DrViLdF6?yw`%ZcJdhGBOz}MY!{MZ)2AfJ$t&YRgVx2DsFn6 zg>5jwJ?nHZJ{OcED#)P_7k&!0$H@JN;72XNiI zd^>DSzBqc0bnZ^y^hx!keV#5$^Yl(e5e|uS%bBhFq>1)NRT*MNBGK-w=l#xufxTW5 zCFUG{nqsD$(XtZzO!LgUz%zR9LFv`H0*-0KFcZpD4l}!Gm9I;rS>BKFEP&i&hZSh$Iak-(vm73A% z))QGu&E_aZfC51?)clJZHK!5V+OgzDdBv_@VBs61h-hc`dJ7UJJ&+vO{url+&{UHP zJ=3v5w6bDX$UReZbFc(#2PH~h0LA_YV!6fi3;sqK*E{R&#HzLn*O =Fj`#9~{0E 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с9fT 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 Rr_KQ%B{{X{1v0O_{|B8~IIaKy literal 0 HcmV?d00001 diff --git a/examples/rbac/permission3.png b/examples/rbac/permission3.png new file mode 100644 index 0000000000000000000000000000000000000000..93cee35ff45bf677d70f9cae5372dc3e9dd1e9d2 GIT binary patch literal 194266 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 Y*RQCK`rO-p0QkErt8_c_*5eod3rD9q?*IS* literal 0 HcmV?d00001 diff --git a/examples/rbac/permissions2.png b/examples/rbac/permissions2.png new file mode 100644 index 0000000000000000000000000000000000000000..1880483bfd3ca7e9e85eaea57d57bbb831e46157 GIT binary patch literal 91831 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 Zv9o{m(-JD>-U0BZs;v22q2k>~{{?IjnbH6N literal 0 HcmV?d00001 diff --git a/examples/rbac/role.yaml b/examples/rbac/role.yaml deleted file mode 100644 index 10975e15ce..0000000000 --- a/examples/rbac/role.yaml +++ /dev/null @@ -1,39 +0,0 @@ -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: feast-create-role ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: feast-read-role ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: feast-update-role ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: feast-delete-role ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: feast-query-online-role ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: feast-query-offline-role ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: feast-write-online-role ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: feast-write-offline-role diff --git a/examples/rbac/role_binding.yaml b/examples/rbac/role_binding.yaml deleted file mode 100644 index c0253126f7..0000000000 --- a/examples/rbac/role_binding.yaml +++ /dev/null @@ -1,11 +0,0 @@ -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: feast-token-binding -subjects: - - kind: ServiceAccount - name: feast-sa -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: cluster-admin \ No newline at end of file diff --git a/examples/rbac/server/feature_repo/permissions_apply.py b/examples/rbac/server/feature_repo/permissions_apply.py index 0d0232edb9..011e93f863 100644 --- a/examples/rbac/server/feature_repo/permissions_apply.py +++ b/examples/rbac/server/feature_repo/permissions_apply.py @@ -1,75 +1,35 @@ from feast import FeatureStore from feast.feast_object import ALL_RESOURCE_TYPES -from feast.permissions.action import QUERY, WRITE, CRUD +from feast.permissions.action import QUERY, AuthzedAction, ALL_ACTIONS +from feast.permissions.decision import DecisionStrategy from feast.permissions.permission import Permission from feast.permissions.policy import RoleBasedPolicy -store = FeatureStore(repo_path=".") +store = FeatureStore(repo_path="") -create_roles = ["feast-create-role"] -read_roles = ["feast-read-role"] -update_roles = ["feast-update-role"] -delete_roles = ["feast-delete-role"] -query_roles = ["feast-query-online-role", "feast-query-offline-role"] -write_roles = ["feast-write-online-role", "feast-write-offline-role"] -# all roles -all_roles = create_roles + read_roles + update_roles + delete_roles + query_roles + write_roles +admin_roles = ["feast-admin-role"] +user_roles = ["feast-user-role"] +cluster_roles = ["feast-cluster-role"] -create_perm = Permission( - name="feast_create_permission", - types=ALL_RESOURCE_TYPES, - with_subclasses=False, - policy=RoleBasedPolicy(roles=create_roles), - actions=CRUD -) - -read_perm = Permission( - name="feast_read_permission", - types=ALL_RESOURCE_TYPES, - with_subclasses=False, - policy=RoleBasedPolicy(roles=read_roles), - actions=QUERY -) - -update_perm = Permission( - name="feast_update_permission", - types=ALL_RESOURCE_TYPES, - with_subclasses=False, - policy=RoleBasedPolicy(roles=update_roles), - actions=CRUD -) -delete_perm = Permission( - name="feast_delete_permission", +user_perm = Permission( + name="feast_user_permission", types=ALL_RESOURCE_TYPES, - with_subclasses=False, - policy=RoleBasedPolicy(roles=delete_roles), - actions=CRUD + policy=RoleBasedPolicy(roles=user_roles + admin_roles + cluster_roles), + actions=[AuthzedAction.READ] + QUERY ) -query_perm = Permission( - name="feast_query_permission", - types=ALL_RESOURCE_TYPES, - with_subclasses=False, - policy=RoleBasedPolicy(roles=query_roles), - actions=QUERY -) -write_perm = Permission( - name="feast_write_permission", +admin_perm = Permission( + name="feast_admin_permission", types=ALL_RESOURCE_TYPES, - with_subclasses=False, - policy=RoleBasedPolicy(roles=write_roles), - actions=WRITE + policy=RoleBasedPolicy(roles=admin_roles + cluster_roles), + actions=ALL_ACTIONS ) -full_access_perm = Permission( - name="feast_full_access_permission", - types=ALL_RESOURCE_TYPES, - with_subclasses=False, - policy=RoleBasedPolicy(roles=all_roles), - actions=QUERY + WRITE + CRUD -) -store.apply([full_access_perm]) +#Permission.set_global_decision_strategy(DecisionStrategy.AFFIRMATIVE) +#store.apply([user_perm, admin_perm]) +#store.refresh_registry() +#print("Global decision strategy:", Permission.get_global_decision_strategy()) diff --git a/examples/rbac/server/feature_repo/test_workflow.py b/examples/rbac/server/feature_repo/test_workflow.py new file mode 100644 index 0000000000..e415292f4c --- /dev/null +++ b/examples/rbac/server/feature_repo/test_workflow.py @@ -0,0 +1,128 @@ +import subprocess +from datetime import datetime + +import pandas as pd + +from feast import FeatureStore +from feast.data_source import PushMode + + +def run_demo(): + + + store = FeatureStore(repo_path=".") + print("\n--- Run feast apply to setup feature store on Postgres ---") + subprocess.run(["feast", "apply"]) + + print("\n--- Historical features for training ---") + fetch_historical_features_entity_df(store, for_batch_scoring=False) + + print("\n--- Historical features for batch scoring ---") + fetch_historical_features_entity_df(store, for_batch_scoring=True) + + print("\n--- Load features into online store ---") + store.materialize_incremental(end_date=datetime.now()) + + print("\n--- Online features ---") + fetch_online_features(store) + + print("\n--- Online features retrieved (instead) through a feature service---") + fetch_online_features(store, source="feature_service") + + print( + "\n--- Online features retrieved (using feature service v3, which uses a feature view with a push source---" + ) + fetch_online_features(store, source="push") + + print("\n--- Simulate a stream event ingestion of the hourly stats df ---") + event_df = pd.DataFrame.from_dict( + { + "driver_id": [1001], + "event_timestamp": [ + datetime.now(), + ], + "created": [ + datetime.now(), + ], + "conv_rate": [1.0], + "acc_rate": [1.0], + "avg_daily_trips": [1000], + } + ) + print(event_df) + store.push("driver_stats_push_source", event_df, to=PushMode.ONLINE_AND_OFFLINE) + + print("\n--- Online features again with updated values from a stream push---") + fetch_online_features(store, source="push") + +def fetch_historical_features_entity_df(store: FeatureStore, for_batch_scoring: bool): + # Note: see https://docs.feast.dev/getting-started/concepts/feature-retrieval for more details on how to retrieve + # for all entities in the offline store instead + entity_df = pd.DataFrame.from_dict( + { + # entity's join key -> entity values + "driver_id": [1001, 1002, 1003], + # "event_timestamp" (reserved key) -> timestamps + "event_timestamp": [ + datetime(2021, 4, 12, 10, 59, 42), + datetime(2021, 4, 12, 8, 12, 10), + datetime(2021, 4, 12, 16, 40, 26), + ], + # (optional) label name -> label values. Feast does not process these + "label_driver_reported_satisfaction": [1, 5, 3], + # values we're using for an on-demand transformation + "val_to_add": [1, 2, 3], + "val_to_add_2": [10, 20, 30], + } + ) + # For batch scoring, we want the latest timestamps + if for_batch_scoring: + entity_df["event_timestamp"] = pd.to_datetime("now", utc=True) + + training_df = store.get_historical_features( + entity_df=entity_df, + features=[ + "driver_hourly_stats:conv_rate", + "driver_hourly_stats:acc_rate", + "driver_hourly_stats:avg_daily_trips", + "transformed_conv_rate:conv_rate_plus_val1", + "transformed_conv_rate:conv_rate_plus_val2", + ], + ).to_df() + print(training_df.head()) + + +def fetch_online_features(store, source: str = ""): + entity_rows = [ + # {join_key: entity_value} + { + "driver_id": 1001, + "val_to_add": 1000, + "val_to_add_2": 2000, + }, + { + "driver_id": 1002, + "val_to_add": 1001, + "val_to_add_2": 2002, + }, + ] + if source == "feature_service": + features_to_fetch = store.get_feature_service("driver_activity_v1") + elif source == "push": + features_to_fetch = store.get_feature_service("driver_activity_v3") + else: + features_to_fetch = [ + "driver_hourly_stats:acc_rate", + "transformed_conv_rate:conv_rate_plus_val1", + "transformed_conv_rate:conv_rate_plus_val2", + ] + returned_features = store.get_online_features( + features=features_to_fetch, + entity_rows=entity_rows, + ).to_dict() + for key, value in sorted(returned_features.items()): + print(key, " : ", value) + + +if __name__ == "__main__": + run_demo() diff --git a/examples/rbac/server/feature_store_offline.yaml b/examples/rbac/server/feature_store_offline.yaml new file mode 100644 index 0000000000..4fc01508bd --- /dev/null +++ b/examples/rbac/server/feature_store_offline.yaml @@ -0,0 +1,16 @@ +project: server +provider: local +registry: + registry_type: remote + path: feast-registry-server-feast-feature-server.feast-dev.svc.cluster.local:80 +offline_store: + type: postgres + host: postgresql.feast-dev.svc.cluster.local + port: 5432 + database: feast + db_schema: public + user: feast + password: feast +auth: + type: kubernetes +entity_key_serialization_version: 2 diff --git a/examples/rbac/server/feature_store_online.yaml b/examples/rbac/server/feature_store_online.yaml new file mode 100644 index 0000000000..aa167731b2 --- /dev/null +++ b/examples/rbac/server/feature_store_online.yaml @@ -0,0 +1,20 @@ +project: server +provider: local +registry: + registry_type: remote + path: feast-registry-server-feast-feature-server.feast-dev.svc.cluster.local:80 +online_store: + type: postgres + host: postgresql.feast-dev.svc.cluster.local + port: 5432 + database: feast + db_schema: public + user: feast + password: feast +offline_store: + type: remote + host: feast-offline-server-feast-feature-server.feast-dev.svc.cluster.local + port: 80 +auth: + type: kubernetes +entity_key_serialization_version: 2 diff --git a/examples/rbac/server/feature_store_registry.yaml b/examples/rbac/server/feature_store_registry.yaml new file mode 100644 index 0000000000..579141fb01 --- /dev/null +++ b/examples/rbac/server/feature_store_registry.yaml @@ -0,0 +1,12 @@ +project: server +provider: local +registry: + registry_type: sql + path: postgresql+psycopg://feast:feast@postgresql.feast-dev.svc.cluster.local:5432/feast + cache_ttl_seconds: 60 + sqlalchemy_config_kwargs: + echo: false + pool_pre_ping: true +auth: + type: kubernetes +entity_key_serialization_version: 2 diff --git a/examples/rbac/server/server_resources.yaml b/examples/rbac/server/server_resources.yaml new file mode 100644 index 0000000000..03e35495d6 --- /dev/null +++ b/examples/rbac/server/server_resources.yaml @@ -0,0 +1,27 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + name: feast-sa + namespace: feast-dev +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: feast-cluster-role +rules: + - apiGroups: ["rbac.authorization.k8s.io"] + resources: ["roles", "rolebindings", "clusterrolebindings"] + verbs: ["get", "list", "watch"] +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: feast-cluster-rolebinding +subjects: + - kind: ServiceAccount + name: feast-sa + namespace: feast-dev +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: feast-cluster-role diff --git a/examples/rbac/service_account.yaml b/examples/rbac/service_account.yaml deleted file mode 100644 index 591c142acd..0000000000 --- a/examples/rbac/service_account.yaml +++ /dev/null @@ -1,4 +0,0 @@ -apiVersion: v1 -kind: ServiceAccount -metadata: - name: feast-sa diff --git a/examples/rbac/user_output.png b/examples/rbac/user_output.png new file mode 100644 index 0000000000000000000000000000000000000000..3ab0eb38dd701026cdd70561b552f94255cd3fca GIT binary patch literal 202585 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 Zv9o{m(-JD>-U0BZs;v22q2k>~{{?IjnbH6N diff --git a/examples/rbac/server/feature_repo/permissions_apply.py b/examples/rbac/server/feature_repo/permissions_apply.py index 4cd133a6fe..b710a25cf7 100644 --- a/examples/rbac/server/feature_repo/permissions_apply.py +++ b/examples/rbac/server/feature_repo/permissions_apply.py @@ -9,13 +9,12 @@ admin_roles = ["feast-admin-role"] user_roles = ["feast-user-role"] -cluster_roles = ["feast-cluster-role"] user_perm = Permission( name="feast_user_permission", types=ALL_RESOURCE_TYPES, - policy=RoleBasedPolicy(roles=user_roles + admin_roles + cluster_roles), + policy=RoleBasedPolicy(roles=user_roles), actions=[AuthzedAction.READ] + QUERY ) @@ -23,6 +22,6 @@ admin_perm = Permission( name="feast_admin_permission", types=ALL_RESOURCE_TYPES, - policy=RoleBasedPolicy(roles=admin_roles + cluster_roles), + policy=RoleBasedPolicy(roles=admin_roles), actions=ALL_ACTIONS ) \ No newline at end of file diff --git a/examples/rbac/server/feature_repo/test_workflow.py b/examples/rbac/server/feature_repo/test_workflow.py deleted file mode 100644 index e415292f4c..0000000000 --- a/examples/rbac/server/feature_repo/test_workflow.py +++ /dev/null @@ -1,128 +0,0 @@ -import subprocess -from datetime import datetime - -import pandas as pd - -from feast import FeatureStore -from feast.data_source import PushMode - - -def run_demo(): - - - store = FeatureStore(repo_path=".") - print("\n--- Run feast apply to setup feature store on Postgres ---") - subprocess.run(["feast", "apply"]) - - print("\n--- Historical features for training ---") - fetch_historical_features_entity_df(store, for_batch_scoring=False) - - print("\n--- Historical features for batch scoring ---") - fetch_historical_features_entity_df(store, for_batch_scoring=True) - - print("\n--- Load features into online store ---") - store.materialize_incremental(end_date=datetime.now()) - - print("\n--- Online features ---") - fetch_online_features(store) - - print("\n--- Online features retrieved (instead) through a feature service---") - fetch_online_features(store, source="feature_service") - - print( - "\n--- Online features retrieved (using feature service v3, which uses a feature view with a push source---" - ) - fetch_online_features(store, source="push") - - print("\n--- Simulate a stream event ingestion of the hourly stats df ---") - event_df = pd.DataFrame.from_dict( - { - "driver_id": [1001], - "event_timestamp": [ - datetime.now(), - ], - "created": [ - datetime.now(), - ], - "conv_rate": [1.0], - "acc_rate": [1.0], - "avg_daily_trips": [1000], - } - ) - print(event_df) - store.push("driver_stats_push_source", event_df, to=PushMode.ONLINE_AND_OFFLINE) - - print("\n--- Online features again with updated values from a stream push---") - fetch_online_features(store, source="push") - -def fetch_historical_features_entity_df(store: FeatureStore, for_batch_scoring: bool): - # Note: see https://docs.feast.dev/getting-started/concepts/feature-retrieval for more details on how to retrieve - # for all entities in the offline store instead - entity_df = pd.DataFrame.from_dict( - { - # entity's join key -> entity values - "driver_id": [1001, 1002, 1003], - # "event_timestamp" (reserved key) -> timestamps - "event_timestamp": [ - datetime(2021, 4, 12, 10, 59, 42), - datetime(2021, 4, 12, 8, 12, 10), - datetime(2021, 4, 12, 16, 40, 26), - ], - # (optional) label name -> label values. Feast does not process these - "label_driver_reported_satisfaction": [1, 5, 3], - # values we're using for an on-demand transformation - "val_to_add": [1, 2, 3], - "val_to_add_2": [10, 20, 30], - } - ) - # For batch scoring, we want the latest timestamps - if for_batch_scoring: - entity_df["event_timestamp"] = pd.to_datetime("now", utc=True) - - training_df = store.get_historical_features( - entity_df=entity_df, - features=[ - "driver_hourly_stats:conv_rate", - "driver_hourly_stats:acc_rate", - "driver_hourly_stats:avg_daily_trips", - "transformed_conv_rate:conv_rate_plus_val1", - "transformed_conv_rate:conv_rate_plus_val2", - ], - ).to_df() - print(training_df.head()) - - -def fetch_online_features(store, source: str = ""): - entity_rows = [ - # {join_key: entity_value} - { - "driver_id": 1001, - "val_to_add": 1000, - "val_to_add_2": 2000, - }, - { - "driver_id": 1002, - "val_to_add": 1001, - "val_to_add_2": 2002, - }, - ] - if source == "feature_service": - features_to_fetch = store.get_feature_service("driver_activity_v1") - elif source == "push": - features_to_fetch = store.get_feature_service("driver_activity_v3") - else: - features_to_fetch = [ - "driver_hourly_stats:acc_rate", - "transformed_conv_rate:conv_rate_plus_val1", - "transformed_conv_rate:conv_rate_plus_val2", - ] - returned_features = store.get_online_features( - features=features_to_fetch, - entity_rows=entity_rows, - ).to_dict() - for key, value in sorted(returned_features.items()): - print(key, " : ", value) - - -if __name__ == "__main__": - run_demo() diff --git a/examples/rbac/unauthorized-user.png b/examples/rbac/unauthorized-user.png new file mode 100644 index 0000000000000000000000000000000000000000..689dbc5be1dd9079da45c96ec48f59a5133b915d GIT binary patch literal 223108 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±30(bmP^cCZ9?;fHzRQ}Gd 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

`P2CJTUfO{V5Tlz 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 SKU6UPU+MUN*NEJ&ng0j+dA(8q diff --git a/examples/rbac/deployment.png b/examples/rbac/deployment.png deleted file mode 100644 index 9b9a0d7b2a48039a1e716be1a12ab81ff87d68dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 98226 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 diff --git a/examples/rbac/install_feast.sh b/examples/rbac/install_feast.sh deleted file mode 100755 index 10c2728d22..0000000000 --- a/examples/rbac/install_feast.sh +++ /dev/null @@ -1,73 +0,0 @@ -#!/bin/bash - -# Default paths -FEATURE_STORE_OFFLINE_YAML_PATH="server/feature_store_offline.yaml" -FEATURE_STORE_ONLINE_YAML_PATH="server/feature_store_online.yaml" -FEATURE_STORE_REGISTRY_YAML_PATH="server/feature_store_registry.yaml" -HELM_CHART_PATH="../../infra/charts/feast-feature-server" -SERVICE_ACCOUNT_NAME="feast-sa" -CONFIG_DIR="client/feature_repo" - -# Function to check if a file exists and encode it to base64 -encode_to_base64() { - local file_path=$1 - if [ ! -f "$file_path" ]; then - echo "Error: File not found at $file_path" - exit 1 - fi - base64 < "$file_path" -} - -# Encode the YAML files to base64 -FEATURE_STORE_OFFLINE_YAML_BASE64=$(encode_to_base64 "$FEATURE_STORE_OFFLINE_YAML_PATH") -FEATURE_STORE_ONLINE_YAML_BASE64=$(encode_to_base64 "$FEATURE_STORE_ONLINE_YAML_PATH") -FEATURE_STORE_REGISTRY_YAML_BASE64=$(encode_to_base64 "$FEATURE_STORE_REGISTRY_YAML_PATH") - -# Check if base64 encoding was successful -if [ -z "$FEATURE_STORE_OFFLINE_YAML_BASE64" ] || [ -z "$FEATURE_STORE_ONLINE_YAML_BASE64" ] || [ -z "$FEATURE_STORE_REGISTRY_YAML_BASE64" ]; then - echo "Error: Failed to base64 encode one or more feature_store.yaml files." - exit 1 -fi - -# Upgrade or install Feast components -read -p "Deploy server components? (y/n) " confirm_server -if [[ $confirm_server == [yY] ]]; then - # Apply the server service accounts and role bindings - kubectl apply -f server/server_resources.yaml - - # Upgrade or install Feast components - echo "Upgrading or installing Feast server components" - - helm upgrade --install feast-registry-server $HELM_CHART_PATH \ - --set feast_mode=registry \ - --set feature_store_yaml_base64=$FEATURE_STORE_REGISTRY_YAML_BASE64 \ - --set serviceAccount.name=$SERVICE_ACCOUNT_NAME - - helm upgrade --install feast-feature-server $HELM_CHART_PATH \ - --set feature_store_yaml_base64=$FEATURE_STORE_ONLINE_YAML_BASE64 \ - --set serviceAccount.name=$SERVICE_ACCOUNT_NAME - - helm upgrade --install feast-offline-server $HELM_CHART_PATH \ - --set feast_mode=offline \ - --set feature_store_yaml_base64=$FEATURE_STORE_OFFLINE_YAML_BASE64 \ - --set serviceAccount.name=$SERVICE_ACCOUNT_NAME - - echo "Server components deployed." -else - echo "Server components not deployed." -fi - -read -p "Apply client creation examples (admin and user)? (y/n) " confirm_clients -if [[ $confirm_clients == [yY] ]]; then - kubectl delete configmap client-feature-repo-config --ignore-not-found - kubectl create configmap client-feature-repo-config --from-file=$CONFIG_DIR - kubectl apply -f client/admin_user_resources.yaml - kubectl apply -f client/readonly_user_resources.yaml - kubectl apply -f client/unauthorized_user_resources.yaml - - echo "Client resources applied." -else - echo "Client resources not applied." -fi - -echo "Setup completed." diff --git a/examples/rbac/permission1.png b/examples/rbac/permission1.png deleted file mode 100644 index 8ed8cca600ec75d7f552788dfc12d865e005f52e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 535376 zcmbTe1z1#FyFZMgq9Py`%^--NNH+{1Qqm=Yq;$v7FoZ}-jY>*)cQ;6P=TOoN!_W*c z)PI1-=kc8Peb0B!$92uc%+Qlk|v`xsxT6))W}cs07PWtBW?yE1@8-con2!ef%b36u?e%4i!o4_+msIS_jb*l zZ~-^x<~;b>n%a3i-W2Mzt|ZTdjiik22L_1WA~F;n>Jk-JA`odDJNeK9CPmiZK+7NO zS0>jEwZ4;6nqKie?x;rrmShY&tGXSG>n$Q5TOE3h^!RHRvn8iRKA0)xo}7Catw>g9 zWEwutJV!F8&6l3)z3GLS8RuH&i+zN1I^>C%331EFd47AW1@GM*ZTa(aRdkRs z-s`J~8%RrIyhOjhjd9J_7~=-|-8J-!82!S)!2IrmfrbA60R0k9xc+|-|w#_ zptoTNDhi2Y@n- z(2)oI)?D9Ko5IoD%)*Apk&p6n4<7XUi?10eDK2-hHRYpJk(Q$nvb5Hx;9y{4V4~!| zOF=;awAM4=Q4kjWt2z1;AElA4trZU=ql1G3g99srrL`d=GdDLkBNGcF3kyAZ4|*FX z3tMeRdJ7w>tAqSLj;8bu8^{`6wwbe(3MNtMk-%H2&w8ENuR| zEc693UTk4xW?*9c``GBFz>9Brn{tbRMW)9%x{{OP&pI`i=rOH1o znK_tQ{%rckrvKhl$wuE=$kH7Bo3{M_+?u}{|GDw6hCs%POaCJjS8=}l79D8*yFkXj zZyNvI4#wCi42;(p;=+RO9Ivg{VkNv%3S)O67k?xoeqF+uR`8kl*T7GAxjudV)ElUS z3($Q7de@ClM%2W$kU=OfH!S#BrvaZ@{42!=!H%~IN%&p|o2AOR{M9n?8+jWJo7J0V zHh48qa6XxAhT@1udG$(e{hTQF;435SoKB}*>%^wTjO^{^Cn-0vmz|_0UNITOQD=5c zTGk6y?T=0lmX4jZ?hP=s5_#)pd<)@!G2j+kx{_Wxs!4Nt)aNb{p>7RAP0pS{hXuhC zPZ>|1$^uIJYe})YBF@-}#$Oo|+lTQ=1y>O>nmwmo8)I4PjIjT@0;L38Lr6;i|K8B% z7CfbKG#DJm3ZClC!!Dn;H?3MOua6CX6Ib&ydFX^aLK2U^ghIm+rU5JCJ>#Kw62%%3 z4a?`Bm%v%F5UakkNP&9*E;G7nj)kQbF2^iM&iIqrl-}K)zPpVg?ts% z%*4HBQd96FA;WzRDVV1bglYUm#ObADi%Lu;B!^6n3YuV(hpmZHT!v$8nW+k}|K8nU zZZyFeD7Jfhb*kMjFM{X`$HSeC=UU0gD2@qu*Niiy=m|mZ7h;Cf5(PTx%37&xf}{R4 zJ^a?)AKELyL%i2j89G_6E*F(Cy*t5U+BSB~toj+~UP0=+yK3Vmfb{_JQ(tp@UP|5) z=RSUhwX@A#$o{{bKZW_Zw8d z=Yeu|9Onq06x+|vCrfVp{ATS0rPY*AGtl!GNy!_@lcRKH?T2@92li@Z$1^^OBs%Oazy-O-}5jkz5oPE zAZ-|U1R2Z$TGzLyidD8^lZZT)xBuD_5PZ=_wTE+l5F#|ERlPM@AXtWLwpM`Kl03=_?uUc*r8RHc~+pW>LV)a9}v5H^I~E!2xpDv=#6}6 z6CVHbIZ?%-q5Si=0>Sksw}u2Kju*=4@wMcC&{_IJNz?sV2zH8JSbX7JWB!7~t`xaE z8{d`?MziJs(VRue%4Mn?Y4h9(KCv0kr0&PE8qs5?v3+*iVr&)eWM1W`!(vO1Zd#bm zJ}4gL33iH*?qC&IC>e`~gpOh1x($nIj@!yD5|zoMQjNfG99aQVSRaMxy58>v3Dq;F z6PLU3WxbXPV%05iO{y~>*e4cS>Z^*R8P$LCo(E1Y!}ms)#OX*Z2U~0RAqN9lc>b{9 z#!Lxv5r0X(W-nxrGW~gnb^t72p5opw{Y{vs^cOfVqa`Fay^s*3sOqV!2Wb8@yc-BUQHzaMw6mpGWQnAx|bCKD5`Pw7tDuxpZ zwM}o4&ca+}z6s}z2RU92shUY*pRr8!LL-Z(>7e@eG_$&e9$626iT9$kH}^6br^r>uKCcb(g-yAsOYPv4k6voY#sSea9cw7CS#ErpqKo0K08u zsW7N*Jv`#5%_=BgkDSSKF~)MrqtC+c|94qxZA_^vnBe{R{SJ_B=)3t-mR9$v9^0?3 zMA^?VqfMd3Y!5DTa-+fLq%-eHtV(-!+!X33OPRkO>w?nwi|k(q8F}_rGC0Cyxdp~Q znf-Y6cv*qIGuaVl_&I6DTg`KAo3w{2!G?;eO4HyORI0r?+9hbs!+R7QT3TTxGi(J* z4^!O?o9rrkc|H%!tO>pj<{g3j^7 z>_G*Te*}f>=qf0P+eWhTqkjkGJXGDE{eJORT<4EP&F>CwJ|tBOJ$6zzGLk0Nf9a)r zec(_TBT{bS`(Id6A?4R5wd^0jm_ z+Igy5HpMd!49Nmz!6P21@jh{5#UBnKPHYw#0o%qyD#TA^oYdp?S5$u8$LtA+yk+tf zBs62%N=I#tbR1_F)yQn@BrkI8&w!xkCpFkJPHLxDEiqm%agAVr!n~R_uUeDX&{o3B z98}cmN=HDpgr3J9?bA0mcFKUUS*``3&@*RIm`qVtaD@&;=rPUc^K(DDB_+IdC3p&3 zEA3I#J+oyJnZ@y|I)kB95OgR%DVL`I0AFw@z&kOXYXV(R=~lWLtCrTi(}Rp^M} z>FZYQ9PHMCe1V2#APCp2Zh&?yNk{gxuK9T;T(r zpzr1`urscVD@nhal*G=8J}@n?Q5S~wPDNSMNxKge8FLk6J5zr7pKKTXm?l-7SA}NA zW#C4)c6;lvW4Uit!Heztg9Z&}Vl}sf)eR8|cixln@v;u;p@iS-;VJxL*6fR)PIM~4 zvS0~dHtA`Ri_i^{y*T`4sV60q5$i3D7bZ3ljk4@?xSq$~d|T`A@SX?Ufh*oO`EnU4 z6C*vW4?v?~#WwCv`zc9d5<94_e94xJM(8P5$qzk9#Ocodcf#d&PCmQqnC9bsj=3V! ztMz*cPCzIZie}bGmUO>8&b9r}Xkv)NcNOccb&0lHE4_KrDTU_QmVP|D`)I&(eB)4j zX=G!yf@ra+A*1s$zR(9HP?@4WLjE0fk!2%~;H$Zie!}cMUm0{@_8T-$V}AF(G9MdY z8SR*(b~0_BdvyJC{)1Zv*Pra8=YM^=SiKQ4Pz$;5MYkom=(ZmJbX)o?jwP)Qb`5V+ zg~#rZmuZi|uSTxZhf!h|JG_h(VUArk(ho3v)SG*sQFEU%5ahEk{w7&tMghiI$|71Z z_4yl?xq8iBCOYei4_ReT{WF~3Nu{=G2Qw7m_iLtl{gbYCCXv1g!QVCG=kyt*t`YVju0Z(wHjEXmfG&8nqPyE^0K0k-T!qkL`1mJUF~n z`{G7GYr6Tjp{bI;0#Qm(!?f%ZyYuT!3l>+75T5C$Y}`>PJ`*A>ibI*@RS`jp_cXW>a4eqPAC~%G*gOYUq?yCWM~g5&!Ne`NdySBSYj`uF;=T zjfN@57AWV23=$?Unz9sp7`4)DdvclIS~R_$^KM8J{myPI$rEg942wTP(LIcaMn}VG z>CVkKVt^npyVjObT`Zz5(cq<44rVY)5`_s()40!fk2^ukJr5+Y#lR zb0R0ws#_B&6FT+xsQ48}BD|X8#iJd@f$}@-L@MRW4QqldOjVFXA`UfS!P9J>8ssK|=s>Vp%d;`xfQFMOefku9){)a0n7%L<8@ zctY@^3k-vTi^vWXprWxzm3OazT8#PvxTPjh8*N-i&K)WR-`u$R`1^fM1IJX;=4XQI zm>h(NKcF+4RtuGWk9qa-jUAp;fYb*pNO$sfHz-NE8(W=U!|AAr97w#<=PX#5D4%w7 zAD!Bq=Qd(`M2p&}e2TJYCS<}&#qi{RQGrF5m@mqE-JC%@9&L0F!UXTzC=lz0x}dA7 zN#fq^@vD>N$=AQk!swwKk!$;1$)Wi%m^6zkAyuonY9|W|nPvA^qp}R>6pd7rNY9<} z+>ywdPf3B;vUIgGe-I@tcESsA7E&Ud!h z;r#6I>AZCgFPAUgE=^m5!MXw)20ZQL14(($Sr^XtlhJ6i>GuKon>d!*r^75KL5M-M zwg&+_@3#C4xfB7^ya}Quj+#Mev>dwIMBg4Gq~11M5=Q}#cE+e{oat~U?S9NQpZlnq=&YBBnoU&w4X67WKH^mEW< z%UYD^d;C8F73^{qDEk{F>9p|Q*OgJkXYf@)`_lX@JSdChZdEIy?UaK zAqdhA1FRFI$hw^9!XlIFqvA^DLWtex2jT*}CN;r7v2`uRJMak7F_8ikuJCc)!Du|b zk`77m$j_(`H0L^BE2|fz^=Hlr+vo~~^0EurzPITUo-Yf{hSoW)j}3WXt#5*$XJ3Jt z^36gaz>(oM3qCbtfyxq#>)QpUfmI6LVSIYq3Gx8+R8lr5ZXvOw;?I3YiL`%E;3A3L z`6G$x(i1ippf+jQiS$V+0%_p#k4AUi+#KK^>&h53jIm?74%x$! zF}2zf724xq02n3Ln&>6o zj{yh<`ZRJgPKfE^)y|{{%^1-D`=}PWlwI5HGqjlR6YLmW3{_Y3Q0>G9kMeL|%@FWW zm!!|ep<>&EvJ#cJW+gvn3B(&neaxhS9Kada(GT#Rn%`P?Z#I41Y&VJv8dS44Na@)7 zlG9F}(x6)tCr~Z4YlJtY_e6I%Dj<=ejW|B9W~Xt+6ieh|zrnpK1;9fG+k?1zllP=! z9EH9+_lmj5N^RdMhMLwC$iEY!;%%Q7OpfE}l`mV+l$gvIA`kHQUV$gAwHQv_fI{e~24SC9g$WG~>V8Z7#ad$5A9h-*j zUXmd5VUmwC0|rWrcP=oD(JxfH@7c~=z`NQ{9;Y=Wa0XdPHOo>Zs7^pS8+H)aT4*f+ z)C}A#Pq3d8Q8^JGXjzO<99oXHwBWW!x~;XS2Y0Dwgq)H^aD+K=PH44mORRr|U*E}6 zt^;c9XVb0EF3B)f{c6fvxz{@NRr*0Yik)MGq z!9C!IvZKjHQz!TNpj5;*ELnR*hGeS(uRtkSR;r$!oWv#O>iqqp;Q7~&BY>wr{}rrl z{*Peoz5JhGZHBO|hVIFl9~V54Zxeq&t0ST8fvY?;%I59|ltBHVE66Pf}!(%;fNfT>Uw>KU+9`fbgr-j>m|DP))ZjXGqIt<(G&M*?ve1#A=-<% zDwM->9zGzkCGvm?4|^h#coQi{z(Gy^1}Zgv?l<l=D!$!+UGOfj z6@FCA%LYL6 ztnGUD4gFP~#tFI{F3xLQViUn*FVJ;Oo))dDV;w`M8!1$(sIAKln*Er>1{!1tFzR!o z3^(})uemIeAigA%PZZ-30qDWd<@=`?;=vrTrrA@{Y>z z|E8)@FpO~uU#Z%h0jEDRB;~ph$a2`0U*`<9^28ZjiqN{23$xR1Y!)G6BsI%s1^jZ+ z_H7@H{mciW?y#2ABq85SJl%mToQQ$#E>ef6T%_la3@Epok zw4%8ZLnP#oM&KwOxqPYwOA27vfcr9pS8||%WRk-wpbej$g4ai|BjUfk!w zVqUrQWFy_JBhFUPc@~R5vaH1SZFVibV3M61wcHnvr(eCOs`}ArO||FwnyLK&R$1!3d-U`EthoA*$W7hw z;f>jGnOV6{WZA`H3qFWCX|5z)v3*<)1A5Au>k_U#3@D2CFEE7yD&_-)h`igP(DmU~ zmSL7jc8g+^vbeLz+8gZ(3g^G{sMfRS6Cec9bR^7cYW11mVL**%cj19Ll3VRbM{`IELgKh#ZBBsZl|!CgXDS`3FM{cIY}4=TK4sy?(xe8mH=bql z2Qj;t0-1x9QwR-%0Ig4ssN0x(`Q`J~ofy~zQZi`T49$>?%RQ&Y`GUU+vK56DvnNDy zu=9a_FWmmBlt*)o>Dzg(NR>LSSD=M_!F`2$yJNIHP6`Y9n^hmR<_T@tWOZv|R|4tp zNi>1o(tKt6^1h{tC2)Pqs&CexO?qkwumFLNJ=guKl4J=q?Nlq&iMSZM)oIk$Ot_)9$s;kkyzUk5=6Am z+2$8^b|8h3ea`ylOOEnoan(;My&Y23Kl|Oo+oRa^_b{0&%?PQK8#a z?f#gm#Sj$&&3%fvL-8v-Hg0ChgQetfIq^OMKZ#nOKcjiI<}Fg)-c%Oqktm`LYE48_ zR6Xc=&vArRsdQvMb2;N-S%%T9Wn|52g6E(hB`r$HN4Ao{Ax|+fHhC{vV`GMh}axhO;L~<)BDvdME-Q{d| z$f^F&TfpjrQ&<=xv1QMsjv9^=u<>?Ue?ZUleMK`^tE2)B|)7!_q>a#OtIBVwBKh9g6R#H;w50=%; zZuS$GFZQ`_6vJM~I^BKB8|OGE4#NbT$jS0A;#j`zb7^HAgqr66Ab0%bVLPIvoX+Ta zME8F31#I}7kD9*zBzY*AeE%)L7ra^9cWO~F=d(A3iM!rH*j%&yRcH|VjL62>qX+hI zCk9%f1zLK{VF5?q-`#=|*z;&F&~Z%AqyzY=z@f)M`U;ujYo0T&heK+!_9}Q-yYmEd z>W+e&>J3dIvDkj6!R7Vz<^?}dwcLEiF*dHb;QJadieX3X$EeKnLt&`fF=FV>`yng= z+X}q>705}9`{$L_WQchD$#A-Lx4*k3>Xrt(e26VtSH;~?S6ie?2#9!q_qTYl;GK`H zg)+LgyqZLK&792%j<0M&>%hCya*uK;g55cjb^6hV{l>c_Njo@AlDxqu711yXuy8Q7sT`E+%p>~vMH>p6lYozFbYArii)9i8cwZ893wXfjQCaEV zGBCpWG>9V=f&z-MU+3X`<{7RMO0zgET_?K#No4FB8r3ESUka)BJk1@?tQrq1GSEFH zWdN%Pg*chgmJj?C9$<}gbs_vF2QFm>(Cs5~+_e?!`J-X)bXlZj{K8z#damU3EWO1g zPZyYmdOjx^e+6q*{}-@UK=Xa|Rw|_RW7(iby|#6$v4C{?qyTWeL0P&M7G(Jr;(oF) zWa)l9xmVyzZ;Hnqr(2)7{e1I)AG{eGcV2@z^b%PxUj@&X-5raK*R<`&9^x_0MW8&- zXS0WpljhN9sImIA-M;$%*|#(2mB*=k2jfkQ3X%+!UWz!BdM9conbgq)ffZYF0R&V= z&#-gCeJ7&f5Q#oVl*L)YP0Ja}%9bZEdP}F`$&;?1`A8`Fe!Ey&c77cXAF>c4o$uQ7 z69$u=9ogTR?Wt3M<3kEKSLr$UVLLH~n+tfL`{1Lc2-$;KcXy~w-}Dgu*_Iytf;{h& z`=%Nem12%$j#fXt*%)iLZl0TgkTQ@WLdS&N226KZUPOg1%Kdy(Def4ZY(@gRPGJNq z@qM6)_=U!YI+~WGa&6Y{7vsK>JLRMSS>rKrwPhd^GBP$`_Q#A zRjn7PKdeR+Nt(*Uo7?y!uY_nk;;(YB;nW7(BZY_^v6p!CQT(@qgs*dt92nTxw*L zjoWXpOSiezNK&iX;d zv947#v!IkPo1^IDF+@yyjGZ;}po2e^k7|%}XAdjSC@Mcv1eKZC-J;TTXvU1|yUTwi zFl6+CCt7N+{g-OBTH0wg3Xw#Ll@P=VVS+Ak&S5Qd3xTKH6Jh+p!|#)t%0y$|1S5$K z?54&;feUYlj(-_>R#JUR>#(oN-0?`_SPEcq-Jv>1=rd`PrrYaiDI?TDldF)9k)l9^jEEp)F-oZXSb~KZICOL z=2-#O<|B{XeZ4sY&3|14povspK z{U!JDCqJ}s$^28IscF7Hn17LxaFvca&AVF6r8#_G8=_C}+z*?Ehz#R?AYC`E-HAVW zJ(+ZL}W|%_7kKEo{Us;dnEtA!3ID37J?aJn|b^`&Xac8VurDhZd9F?Ox zS@3DNz^}vpIe?6s+5WKYPRFbRiCp{Pfj6UDCXt>-1=A{UN!%7ibMDoM%Zpg&zr81X ztar_9>jnOy%Upn#_%Yu>gY8uIid6ML-5Ttx;3n`B{PG!dXi#)6~|(DW2^w z}`^@(6gP0`jlGa1SgpZhY^WIMIzZ`Y3+uc zZ;6SgCga^)F$)O)QtL@UmoyNewVkC5M$DQnD}g@N`|wqK=;hzHhSQg)9n@@|8Uxf= z#a#DIVc#Vgm=V{H+4_fi9N>E^0_PLw9&Pn2>j&y%RIN1pXPYonE#A&E*B031Z0lJ| z6jwU$-mP^YXiigB5fwoug|d*OLiAKqDlC;6T3;exv+iX_}OqL zU2aU=@sukpwOI}uUKn4fQ>Kw>(*DT zuV4SldnU@1`EqJ^!C~^PbK#zEi^xU3X=tVbtdO4v(0Wq##~b9ZYnOUbmdV17hf;~M z^uO1Wxc)B;%m!Vd<|Ax7;h6pYILou-`tO3~h(qf__LWCPdl)SIfnqa-`+8{S`%)X0NjzXXU*nVpTLAdb1@O?$%Vdd!=42|NFbxu{+qK- zLH~;PU)lgNkK53E$d#1jsYOWaDv1`{{-jf*1-JK&s1GUcMEZK8`P7vp77cC1`KKxQ z#xW~BP4W=9GjFrV=iM?xL*y0jvf|{?=E&!6@4Gxuw_d;gM&s7L$@*WUOIN^Xh%1I@ z7yt8()eS!PO)0+>=<{W{IPE9t$>G5!{#P=2hCV_1O_eK|yoP*$W6d`9O-tjhojh_u zE;|k878sHr5qOgX=KEVF*MF%Yv`enlgwB31$zPbZs+8!@CBN9+ZU+*}Dl`YtFJEIo zQ@SVG`QtGH@SCqqQ{>Y`NFv-Gr4nrPPMAFd16{(D_&V&Jo_(a^OA2M7DhExVofd!5 zqIQk{Q6wMwKZxXI&7vfhQCpiV$IjU!QJfyzVXCuy+g`SxT<=~t_kOHwg$hxWm3Elg zKHk$ge%HY*Ai!!~%U&O6d?d!W>FnZHq z7uJ$~&97co)uKp`L$RLY1Yn(=9n4&JZ@)g57_7_Pc;Mg5B zPLJQ%3Fh7S+RL+BV%v-lD3k>Pr`-A$9yNtP=%<(%B2J2k2#$%FU6vl~9o`cyQl}{ccrN&yWA$|A%Q{!OpRcdpp~iQtbwv)NNHCxraMoU5mdkFz^g6Rp zoTCc02C?b6g?y2+33YBv7wdmtk`ML-^b)Z3!o1btJu%Meq3Mo~&juiFw)wJa0DdAb zALirI({LRATu)!>$;}2VAi*SNgZiz3{)d zx{8X#4jBSo?ca(K@`k-1*G>=}olK52=wjM*8_yp7%^-A_>&WkO5Wah2x43|hqLuWo z*t5%uc;)=`^KJFOqnmds{XSp0dZ>5qMlVg@v%9Fza49>SA1zh%SMLe2A(L{^qIZL1 z!visA3_~`nEFvgc`%w}3O%$^d(3%Zchi8WAu4@B}gTcf6)b*Ey)4x<`HqDQ#rOh9+ zbBibE90`?h^a2}=(vLgMCLzV-^ED2_?$n-8iM=HqwDO||t8Dc;t}-)|Ab-39R(xyn z7ftLDSrRQlT-;i5Vd`;xBfPH@=!;fuBngpQe81OkFDlhqh^mIIGif|o8>poG!De|Ih6WE&)L_K-2 zwW~kG?&&MFTuR>ZVeNHy;5Q1rWZ$3_Z@|A(y#Igm!==J_K&yIp_Q$r4x2=m$4Q@fR zwNA74)@u(W#wLUUw8pin@@tW*$ZAq}HLfp}!1>Md<_=t>k_cU1g^sFWY$<|MR5KQh zZaNRqAasD_?f8z@sJDbC=~8Rs7a8~HDPQu>)qMRFH}k(-bFV+;==8+nU)-N{9h-*v zkXV?(j^vv8ajYk(jaM}6ZKk_4Q3@4hQ7oUW1?R3uan77vHxT4Ol&}ucoG&Qe(Ym=m zuJm3!dm>$6OUXczv9!c>enD&Ko0!{7+fA*xlJBi8b#?1#K&)Q3jT4Yf&l2Ae$f!>9 z)KsP5lj{Mtk&R8D+mEoZ+nx9Z=JAJ%>4P?L4^1b>Ow^v&!g>yQSU0u%W||_K!xwIA zo4wt6$QaSh=SVJ){9H`{*nLcOm4Yl{Yc_E+Xw~Gv{#(u%bIxWsbp4JK)wp&LNqox?hZ< z$Q;Jg1M1?^G2&>Im`TX-teF@KHTJr+kj=Y{6%F-u>zT*`qab$j%|lr?Ym?yA$fk^> zrw%2U3^{aw)1S%G5?2GGIH!g0&R;I*!Z>Xz-j2?vM9$m&Xagy=H=pVkSxVLi@Sw8> zC0%8H)E@;^-CRl#edj3~IJ3 zC=+?rb~N&Zljx--x|E<@hGhpMgw$!(OH5NmT-)>g{Ap2c?$@Eshv1@~>L<5HKLQxK zAC1~-eX$dsbc;D6Qa%XY4sy=H>FlH@a-AdAm2PrE52dZj7Q0SV2HiF+R0(HiZ09Y6 zImkJf*>w%r8oPj3zuw1HhRNm}h{M!Ls5|jpVi`D!AoN@yMJ&Q^jz67j8E<&%knFDn z#UvOFgE;*Y#y|4Qi(5DAf&^|=l*OEthNR~MWw^GiuU2ob_7 z+oD4#v&z_RcwGvC;~MPzsdG9Ea`tOr&$)~S8z49!#`$9XcF}u-*WbxGBd=V7fZr}b zVm%t7%unLIz~=%B1|!9p8oWfx{6|&ojtiZUyv_b@Rs468aTd^eGAGKj&AEL{r+t-1 zS5LLA*m9DbtIhA-j$lK3D*-R_dgX4|mwV;};$ zP>a=-g!E9{1(yh-KvtqAW4GMdM#j;Rd#tPAAG33Tpv~kohe+0O!JL>1Y(^VGrY|>z5!UsDM#&4t%h#Nz8OQtV~JvY#1IKU zQq7_^2!dx8r^iltpa}-4Yg#N6O(>R?$c9^~mrX2Z<{e-GYRw7b{QGiu^O5&&3k23p z7(|0{4qcxt)^Ce~9e;7Q?J@t{5ADYsMOq!FyvZ$#as|ICvFnp`F9(=ub-D@Z2eFTu zeP?#-9cf4epylvVSAA#|Z1UVj9coZbHiV7q461_XRS%vV?GC-9%OB+Gmc*M7Vmh<9 zL$N4K#fOT_Pw#U<79%%pWa^J=Lozoe*mXir)3_%#1FWVvrfpd{I~VM!Vso(Fiwi~6 zHt-=0)_SbYebYUaR!5IvmB)a{8Qaz9A?09{2@i7IvMRO@1~~hwi7HY)jM14+)RqAY zB{&j`68dp=x_y}C_dIjuh_&hEF4*#6x31^Q_zCIEuUw8ggCzncXabYm>16#T;l7^} zgEO$u$>-9p@DDDdJBazKmXMtQSHtl@*L^sz8Q&H>4W%s)`Y9$-N~gS~bk5Rwd&>H&GFlp+SylN^(znl2HE$4OmvFw- z^zE#{7zcO8sJ{$!^ctFZk6lYW0bniy%M`5ms@!jr1 zi{gtP-Bw-^?NHKKf0ZDY#uuV*O9WV<#or}gzC-WCf$|F@r9}_T%SchDM~tT_?`*~n zkCX0Pl{^-Bc9+nEEJwKTFzz+}V5p7drJF_bdo{;!>*D_bth3Dr8pC(+eX%)P; z`a~>WH}P<8n-4k8XKpBPa+a-i&NJtmHGme!G}8$ic6*P#-D?L}?I+n|w_-QB&bW_n zwBorP3N6^pH74wa(hR`j2hm=a@Zi%{X5*l?U3h?-(>67~pfc1lz^rs69Ja&=&K$^H z$C``RsXs1wgKEISyRe$4t_*l!-yjfPT)@VM35Vf7vaF~-uia#^h;vuC&T;4gUPR4w z&>YjKZiz>cSk^EjbOc`3qtTl7_cO;?Ky4ZQdK>JZ1T%N7F#4w^dzMJM-Im?5jg3*wl$J&lfJETU`>^+86nda}xlDOOZV+lt&->>k(JHzlj+u%g39@%Dkk}#ZqG;5 zu#xRAF&;t2^D74ZH!4D0Ki|-*_XaQspjPwKBWe~!kS~Jjk6nP>WI z7z@v6bO~_2DZ5@SbT+VpNC^opmt~@VOM}L?cUBs)5h2WI1yK>TzGBOe1J_FSu}O>> z>fu;YZHwU$688rZx3*)`y)etsaNQq)p#_A(*`$dE{qrhb8F^ke7(oA^L#F%u;+kh1~+@kNYeC&v^2u|^p;wwdmzcZhBdI^hNWf$)&mC&Wd`KYpje zi`}}s(0+*;tumXZi)QtS=DT^BO?NjZ?hyDmi6W9g%jvN*TPv=lCL*M2yfTj^S@zU* zbBwtl&U$$KoT#UGeYnQY81H7qtTV#>oKo8&%RqHy7_Hj|0xS^jH#H}%1g9@1f6T5j zb2QNE28IQ^W7#VanJSCja*NWfj97USL#SrW>Ca`9Lo(Baf~U9NSej8sjA8*4mS0 zs90^!lIMb6m$BU%<_bzGO5@nrt%)nA`;eyaJ&`3 z?R|@Y{(__tSMMqtp_Q@req^jV`QuMV`1Sbvro=u7U*gfOr?$uEOu!PLPEhg(eo z^ZPM-)0?Pt;y5$QjfJ-SZC>m`SH!9=>7-FIP3naKVCp=gzGmEw>A2X!N04hfCFDV! z>Z;&z>=zn7W1(~3*|&2Tb2?3aH5Ep`Y*Fd9m8UJ|D0puC`y$R&#=1q8b9|>mmn|WH zMEWG2t-vxfM7&yHmx%m^`~La9rOUMLOY%qRhgBab?St|7%)CEo4Y*kyi_1EHAM*z= zi#6d{C!Z<3cQQlmDA&dGqK+oc*!5Nq!qv>;+)OR)7qEKeCkMm;h=tFfg^HYTCWiBU zSYL%3qI3+Yvb)lEFy6&jU(*HW1M!6rq@17Zxlg9!^_JG<{?hXB@g-;*SC080Yess$ z!4KS;mnG+m-B0?e+rZp$trT6e&7zPX*!M1mVk{;)Cv$lIfiR>#PCl?H3zGnMKhbh*w^3RD7SLGv(M{`^czJIulOw&(k*mr|Dh z@E(Cr{wmKxcQKpDv{7K%VNyTZ{O$TWaNHNPXrzW-Dlq=a^lv`edb0>-I^Tv(^1o)y z|0PYmyJF1~2%e4Kmk6C~{dKVrgXS)T$eF(dR4TgJR{ zA}d|l7Dt-@!y2>y57ONA58EQyhOy{ejxW+>7jPPO&xEdnAXP{3Vs%*_pf~w^d+u{9 z=5{3m-&-FwE_l1W;tSuUpy14QVZVLgY)E2z2lUE2Omm|gE zGXVP(uh0hM4&~af0#=I@Ehn$Zr60F}-;ay^&ql=|v{CWll~J)z#Gncd6NTOiFoNPZ z^WA}Y=v+l`r*|kWcEXg!m6EQg7j8tbuy2K?%$a2-+$X%N?yaGr)D;gEPLNA;j1d^_ zDm67Q4L+Osalfxrx;yc|Wi7cb1{v&vtFp{7HpzS#hVs5}A*cQu7jgpT^2qOJ0sQ4i zuJT#ttMf^A-%$c8j0P4Obv249E-zeokyHFg)VeXR)?sKCa=VXWe;R$8EET}Pa7z2P z8Ts&Kw)1zy&f5l2XWEmnTPxO$T zro~PBL?BuB%VeQQ&2D7mfg9H1Sp8WTdNO!25wuZw%!&xXu9qHDKc0N*mbRwx@=18# z886fs72;a7m=v(ZOEyA{wP0+Vom*BFG`Vy3N%#AWj8laeY@}SOgUA~S_${||EP;Cv zELHm2w3I^l(Vcj4|ESLFS8IYKUJ*Q;alEhA@cU;{YJR(AlH4|e*2M|x_7Yd7Km&oF zIC5M@uB00NdTtnAC5f8NT5hT09WPcp&|C%UqGx@zZ*-~9g<8V;SH7=R>S}e(T zL3FFDCmA@Z%;Vui?UU%!GYrc&rN+Pa*ETZQD+&_hFJZuDL@)BVr_=U4uFJ+3Mt+T+ zV2S8zy`Agu#*rCL>B24_>2TlD5_a)J+4%LoQePXqAdmr;NNrEtHT%S?wKr91-~L=8 zS5Yi?Wj`XjhIrA*^Y>E@AQ2M`my1nu_Y$!-^TYYKJj6$;Ff;Ci8;2er9Tr>*d9>uH zt@d@sZCv}TVG#@2uz3Hx>iL9$f37GVjWDQi-V@uxoygGpLpa$Mnni$C&t)XL&Y2(Y z!|ACWQ~=E7F&Wo?h`N%~wQRgWKjGlk+4}dvTcw5K0=EGv5MhU$t4I#dq~EC@tyqAePF@H&UcD}>@6I2Su&A@)(TimKG=R7 zR=Jaw(F4k&wRtKKJs<9vOdeuX|Mg0PwN(KgHHy|4HA~cmn({Y7hexBPZ5H`xJJq*` zOP!`?kJLF2>gsU2D~?YSP#G~v4dw{&tMw*3;0oIKx9(BQ&}y770DVBxJfsCm3#VKu zuzN{nTyri)7Q+jB_24wx1W$6friF)QspH?sG!SpGjHXV4gTF4dF9dckYOqs)*56^Z|QCG*lU!U`B8?}$GY=K&KY&Nyl1lNi{SWv$xL6^TX zlPUG3w;BD|k2ppaZCQ;_qPK@dT@2A@Rx7cvMr_8NeCK(Q0lw&KDVBA#0|HQxU>E^= z$CT=7pGsB15QKnbnDwrqdxiHP`Kb`OcA!W#v4xsTK^q5NrF%8NFnZZhh5D^2eQQ9G zqa53WbYmCRJLw~8SxkCG;Y+HReF}}J82+G&AD&9ODt`b8Cts}HE5eL5r4nn99s77? z4jvJaxBvd_ZscOS5DjprQQ~g&s@7U{r#}_(DOzZYAX`1}@d@~^WqhYsx z$#ust@)mG|=seU>#czo% z(k(OTE#iMm`|O6Xn8MPfAn8Az2V=tDXP{mODB2*e&#q@) z+d)ihvV5%K=fg}kz#|feTmQarDaQ$ie`|*B&xE^vz2!zNrRN`&`iz$zG#p|eyCRi<{M0T8_@|QJ9wU*V(;Dqfv^2tEF+n_p z7K4)HN|@Y$_b)I3(+iqMO5yRb{!{&r151W-X0nnkES{jAHbtv@!bR>x1=6MWKVlqQ zp*$~CL*YfJ9EVk*mOq|Znlb6NWI*r#4O@x97f4!CN{W@)qpU{#{biqa<3zO~CACps znY{BqL9Q2DR(_kiJ&V9jexo&sZ_ zFYS`-UmsNWb_fw1W@e%~Xmo&_;{ogWr^53)mdcvS&I9S9ncG;M-TM9s@7v9g zoFebFqAyHyC(86+d|%jVZUTrd)aeH7>P|&H7J3H+cF{7L2EMKs*8b5?E3|(wHDRaM zKYbloQl*+(Z>KDq1P$c2vtPWAc=a)`J&~)Jv{Z3)VkZM|r5;{_^epVjFF>7WRyZZWvnX!srl{k88kk5Z0aDQ-heytq$rPw#@bNZWcH-@fmzs0&rNng~e(%l_C;DK!_J3Dx7`swxTws5;X!dYh?m z2Gw^MG+`tTcdRGcuPQL_{)$vz6 zUQ?6Xf39+zO{;$xj!Z<8P7Ue=E&Ww}ss7S>r^d_4a`*nnXLKF`U)1R1BOlammtd^e_6BtN!pp^z^tzsHda;er1F+SO1F?1}mC+_j}$L2l#xOnR8-@Rr-p@ws9XLCS;uJvmE^Esg5Wyh=> z;Z%Hy1$S|Ewx}!<*S}jc-6}|=rRwr)4FjdLdpcYcrdv#wgrh;Ajg)O4T!Q%=bK}2! z-r7}sKLGHBI1+utp7cEogDYC)N^XMLbArur5{-+5^>8VlxPx~FHkWQs3UcQ~U? zRUi5#+FM?G2fyV zswKR`KVTf^J(3V$z8?m=?R7Vn9cPv}mMQ|Xq?8<}-VK#`awV5B>7MXLc#@TpqpIql zxq<#vA_+`}9wB{n_`tVX-6pt<@nApNLrUH<3641&Kd4rwE+$6=!q$ zcly&reYrk1i=Kz%KQJnd1cF@|H>=J{yVR{F8Un9`ean)8}Ngs zg94-MeEtx@sgt0WjLvMC&p;SgWX|lDlNp000I5p*0vQYSIpsYKMmjRZ&R)Nj9SJ|4ufp3&<(_ zoy+|%Ws@$S+@{{_|B7oEypdOY;-O632H5T6c zQ646=Tk_w*#&h@g#16kiTHH>&K|7|k;~CZ{UH3r|0GJjV{lDJhRFwTM_c;FwEdOu! zILSEZ$u65))8x2CnO3|V-l~5rP{){`^k3+i^S{tDbSoz(VzJzDI@PzC#HOoUHzhU{^X|I=s!UEWjMAoi2+U-tL`s}qMy~gsk)Sf#5^{{5d=?Y>{niwRZ$O9*t}ZQ z&ixRBgEeHldpWo9E3Y69XEZobIGw+K{rk9I97Sdxil@t~_kiqBX!$GtSBm8aj3B@H zjV?t6MWk`1V^2Y4R>KtoUMZ+5DJje$1*)lxTa` z`(i{JG51K(eXuhV@ri=MuI&j<6nmi&D&vPMw^v^){)sq)j^$~*Uj^HXE53Dw-qFvr z){N1fNRszXiG1@&3}toEX2xZ`_Lv^Z2YB#PS$>1QgjNb^5uUEr@}l%#;-!psQcn zQ&^dn?WckNaBkXkyqJY|Nus17eTC)h#%K7r+-rGmDv$GkcOB&fhR|vs+d_XecxETc zC~ZSRU3AeM>hHAPeze_zJoTjwy1IC?wk-P0LUYUl*Ma=iaUCLt;&6;&MFCzoUpK)$)EGQlH*#Q}dCaK8<}%eUxbUq4kZ2$2Teo)~4ILx~{I0auO0=W$xxyEXF;Skb6t z>smWA4*A&7f1)0*aOfQ1*OVov-5%#!0wtU6-u5UV?c^CG=Wa{1avQ=TNu<`9Nw=Nh zop{Q6y&TN}&cEIIwm`||POF%fSXL)cd~)1q@wv7W-yS2`qz7r$c$wR9BU40@W7Mzk zVS>^fg2O>pXu14m$>jWroAW2|cn>r6UjBo`Kaeo@mjuf{32~8Do_3v|p9cRVQ~jlC zLnowEXg`)yMcl!mzAhhI{u79?Lh$WM{u2HR+}M3QJ)XdR^Wcm{=aFDri1c5fR{y^; zt^fRaa1(aJzyB)oPBf^@eObmKSzXLM7^4$vNXAX4_OKqV?N?O0^c8gu^hBuk6xN7| z?v@QWXthi2pEg`e3azJ<4deX2lQSatIOQFv^>z;e0cCC>KyMFnalw1bPD>s~HJ zZ65UiWiR$>blsC?6Iz{*`}luEKz1_4^!H)cfg{7Rz-Y0vrqgV3>}JH~cVC@v0Bk}> z)-`585%bieTNz<{T`{h~Itw`!-5i#MB`OFk3ilZ;H~YOGCn6=!-)!?YPx62Di|B{Z zq(e^LSc`LM;MebhmQCX)mw1|-VX9VV<>g8?c8xyJ9z!;$>vQOO{|W=GSLTy2`m zq0h_rp*`%CxcE$oF>b$ZIdXd)zAi>cfBC!o3bXBThgJ+T1e2}2++*&hxHurAj{@L8 zbK3Pd2gLBj{I&JT?I3%yWm&ovu4#Q6mQxo^LnZa2H-J`3svGgsrHz7n47$!%V8U34iL6UBwF47DCAe=gC?P^&JHG&QrsiE z&F#-X;T`wQsr%k3yr7J<=NU^;Iqf)?qfwJ;-2l$z_)Ih1el)snc)!W(`vd^KOZ*4!<*X@d#0SeJ902?Zr@?WGu1~2cS6e~rI$dHnA z!#j+n>7v-hF0I#zsZ<4sIrrppoQdoQ&~x!!B|bIUcg5LSWegE!_aQA#U=M-h8OHhT zXKKbX!)1YO74;3~;?d0Ad{?VLm@zJSDC=>`So$*ee936u>M3XBAF*cuBeW>pGATVWN!-f>26av&N3M7oo@iF5AUbOpAqv^8t8l{7#jvR61-{RZHxvn-#}OI8 zWNzBP#x~09VVxGwrZoaAf`{T|0i5ch05Ls%8j16?F=H1+M4tJQ*iTMbv%Q%3e#zZ$ zmmIIq3NUCNQm6;?lB&ZEZE6qOPcV9L)LDo4oag$~wvY0NOTB{@Iid4G&*u`0D$YqS zn+fRwGxGnj9S`6uM5pG{%Vy>6iuCre6h8P11H|>>0DQ^i+9$Y{&=MxUFriDoZvJz2 zd|=K)oMpG910X-!rE?5`Lyw~Ac@X}tyW4Y-ph-R7v@0fhF_GEJn&iZ3<;geEIYO6B z1jozhRe*;GD|S11eiAYA4Cn5=4OwN?H9o!U`JssI=#W&{{;WTt$?$VDkm+v|dBkB; zCf^0U{USA8$L`s3gklb+s!8D_OVMMR!(7T^7c+uOdz{X?6m6@j*|nkSPazC+PNPbm z*yXz-?<06x@I1X(^mLD>`Ljs)dmS)~Eo6!fBis4+ZE!{4L(SfA&EMy^!1|Q9II9^( z9gevn2|Z`kF`lrlnM?CT5pdzB~cyw~qk1eMl;Gf;!H?GK;#eHw5+7=R`KTfe&R zbUo0F)H&={y{Jm@=pXQ9hdhZ8+0GV^k1;rZ$gTTv>Z{O9V6w4t;LbbmOr5qUkst%I zsV*Jh65qlX)kQpp%dx=$=NSaRS&2+tO#6JJXeQJf@@nFQ6?N}T!4$eEodNeudh6Ej zU`x*pOtrmqVM|*2f$BBg+uN6|KOdBI7u7GEQCrLDN`&Ri?`z`%c)qFEb~iDII5?% zj{K?Zo&XKD__xAKMk9!TBI2{IEoi{06wobqqIVj3^7Fh5js?<-i?DS;f}GhRSnw}o zg*`IS!P^(Q)1Pvz&1xvdsJu;}IAR1MWH@c}D=SACf8;@i;18U^tSS5m|0w`!_Dx24 zY`kwE-yKMhBqG-NoJ{zFUkHNmWly@as8_OaHcfNW_ioi``BG>vE0r7 z2Y80#st_E^U!CxeJUKbo#kpU%$BtX*A>ye{YnvxsiDSE-Gd&ZIJ1s*pu;=U*E1%3A zgaaqkO|?}XTm)(1h%kThYLms#oILiD)^Dkj$F==ye?&|IC8?w1ky}&MR)(+KRn%;n zUlSe%(KvN0Fa3F2Hj%gOejOq~W-62q8{9NVK};h+dPkkZr`Mts7tmBL%*8yK^53Qcv79G2Zl*-)d?dh8qu3; z*L(g+!!XR#rgdZ2!thb}y*h~enNc2#V6=PNm8^twd5Uo?F72S`+U)L!50H5=O*Bw# zSX(GE!fpr~^x>a4=y=SMav)ARH#h?y%z%u#vGaEG0m$gAD-?M@@CR*qM(M0uW_7-- z!^uE^e~>sM*`Pq@0lRE%N}Ezk?Ea1h9Ia6i^j5gN46WDu{i0sK>XNf#MJdxDBxAqZ zds@NLqKyBO9f8}P2?^M0g^u2X_<>QS(NNef#j>PwHx=QTvDWfU zB=vPoGHjiUi7W6d%LmgYxSGNU_;9|)A0aP(F{LrnGllwtB;jR;vn4llE-h6gYy2^+Qv52K*M-b?1M8Xow4=(9H zVW1Xj9pNRB+Viy|;9dp6g6JO@rUm&z!QsThT^x_5mbjIaHZ1^0M+@TFhyz<0kc$p05T3SbVRA!=Zs=phn=eobjM1N(A$;5hZ z{>)yCr8BCnhK4|dIJR0{eo#^KPSHD!#)IYA7RkO%XrJD#n@(>)$0d^ktn{=>Du-1s z0NFz<19rRd@{UY19VOT7$HhN( z(0*m~m%trSvJmeH|GmjPwpLea6>6Rt@dU(bH~X^oAniN#(xCA9m0yWW$QZspX!u|3 zo5M6CxXQeB&F)SF{ei}Q9BNQ?G)89n@ z5E~zj!*C^`BJw9;l|+{ao@IzkE9GuPPeE@-H?K;%AaLr#g-~F~tJf z+gojIKPI}!!n^uvdv)owtKZEhIx9&8IHK&ifn)x0U%bOGpQz%~oZ*w}!7wB69Uz~| z0sq4OU9R*R?1?6JUiyUViF(0vm=9MT^9ys9nUq;z#M~`ctP#a2LvOXsZFo0 zHJ?@*;4nxgYc(F`$n&P^;}6FL?`t#4t%8v*7TARDvm=T4oucA#xgsdKAuELAHv_o# zFng^=>-X7G$S|%u8DUFs+jJYa=qT@EPM&W0{sT*Ly?nKF!UjA6AtVf5<`G_odt@Br;8u3f+ z&{ICHl&Xtt2IYpZS({i_ueyYV7SG%p0#14_ZK5=A5D`JUmeZjKz+M#!R|-?XYsj1q zQD~UsskRF;dM9MqrNQIdMZ<+CeK~(sJgVVNQx5FF{7yM;*jjNsnKGsB5FsU9I6SbL zGNxaH^*IG!|9FXMK@5Lj&B3=)SS#Y07c;ryhYN=aT1X;|mgR>Pg!h-w^ZJHi4Fcyl zy~PfTbJy2`YV~GJl6Qv##V?_iu#`GR9LJ;ReFyDv1u9QhJIWbRg){Hw6^!&?*LIr- z>E*<)4qrMCUA_F26KkbFCU5}9SW3nZefav#d#YigelHT$adDMUe-yh`)J!6b8mz<+ zCF9^KY93})O72ZWq!N#8>T190qud6rSv)qX)HQ|yoHMw-7C{k#C{p^(Q+MDGL=**` zTMF$}*-W$Cn=@GN1#fN?(XGPJK8hZCo`@+EkK{a&9JQYLi@9K0mC+y(i*I2|>41J; znD`QtIg{|f!QgTylepn}3lkVZpFk>p3AvKa9LJOJT;sV0+uWQY5;$%c2e@W{A1;UR zyZficn{A6N1}k9iqeMSac{Midk=T5YRZAOFy}q6lCKIUp`s;dLUP4yl?tP7$Q+^5? zUo0N}!h7@Rhpf`dk2@f?qNfb#FHI+}U__s8y?GS#itqlfo9Vu&`yV7^?>tX`u7ADm z(T|-K9+<7E87O?Ya?IT&#^bP-!ecs}DCQDbF?Qj(&`r)lspIO+Zl%y!VP|Dw9^ z3jYEbW61#Gt_=1Wcvy8*wBL{P^;B-%cVFAu%@dnc~MFco-q0b6`+ znMq_y1T1}r82&1Gnfo;aSpUMq`I4s)UPV%JI(K2*!&a7`YLvW@vty#+A-JC+{s_am zD^h^bBeVO&L-CA+Rb>KE#*3(U4nLSKqtW+%Uy2YPR{(sY=+ zZfICO@!^0={e`F{J+LZV3NDv$ke`YXMk47^G*d69ektE9`}b<`TgId4%|${yV~5q3!&27Gm8b-Y!fSvb5&vOIj7H@*oc-CK;I& zA$Anh(d6w_30A()7gq9{!j(*6qnW6k`-2o!PM_m#{EDo=wt;lc-2o&tTm0|fP)zO) zkWx3L?zrF4vK#cW98ruDMl?0m`jIywduqZzXxZ-&hg!*-7`V59{S`fz$ft61Qmpza z+Y|-q?OIh!i8uu2x2_w?q$qcB!(SP^GI}@9govXmGIr{g=Hz)`*z+{!H2gTNS4d0X zHl>y4n})`lmvG?k!7p!GWoO3jMvrPf*1^oXTPCe;`*M(T2b6qR*t{d+I2Wg)Yuqn# ztO}J-R?f$n8>h%_5Yt$kn>fXK)=VCQHBMF~$xctI2PN!6_F|N;I;Lz}mIh$;gUgH* z#ODvq8!2b(lnzg39Du@9rAnZl_J^nnmn2f}@V1-*SQ@wXEDHH_E@#fxx8ioP(a{XK zJy35s`u46~@KTzPlZ7*8Q`~+$=G;`gCJ@}szJ4yWH)l6BZ}o=JzF#RnbssrMx?i=7 zxN|TcDS9JUm;pke)_CErz+wNCgHP5yF=M`)yY9t=%>ox9LlMB8HP-QkYz78%UJgT{ z)t#5#qtFnooCsdJUq{uLtvnGMf!p#B;nkRETKLr>tFB--2ym^2LNm!&ZwG>?t|4Yb zofEn?LW7P#A+P8vkHo9@#x)1c;?+>b+Ft_)J+w}v6JV_iXJ}7j2=L;hvcZywm)y!z zMz;Ym8^D3P9}8>xJE)o_x@XVGPu;f*_93Dn+mza_(39V>NIXJXqXF&ub;B;h@bn_s z80oXrWIFc^eP~dy9X?@b6`z0^=W=DPm^6-{+mlj6pR}UEo#UN5q)L5vsy?i96!EiaK9bvnb zYphw-In90f(gvk@eHHS1uWpBXq)zb?*({;ZZc76$k2)3J2of&fn7eL-0Q%*}d`U4G zea}_UEd5`ljELCf4<0lOD{vl339K}=F1_#AtIVm3odDN7FhO(3g$%thESSz%apSSx z>Ab{DTw8)sZL}Q+nVfD< zOsv0LQEhyz0LcuCNAKbk#mv6L?B7+aY&L<~RwWO$57X$>JeGnxu-RhhgW{Ggbje@8S5?g%3CtS5kekm+YpS-^lFvevZqy#xn{dvXjf+cSWf_H^aGu-fhwCS zQF4#3ZK6HaQwAqU8yF1{yG_xf%V(NB?QXhf&3I370_UE_eDA9pD(i@nk{jk~j!I)4 z4arxoY?3Zk#ft$`15kH&#DLg^8$=vE8m+zFe2s%*cB_=gZ_(|>jSOb6i)_-E#F&o? z8)S$XybzvYuaE2i505Aax2*|pPxl3Cm+=gUjP&dugW^PRf~4F@h1>}~qoZ=CwXtZ| zn%8AhStreydC1zPX&QpF0zaiS3=HE4z-HYeWx%`L3I}EE>QjTm@ymoy0s_YL#{oePLut3R8|wY#wt6&J5J}u@xSMgE$zS<pO;Q9rV&o{!E15 zTQoE^>DF;0Qnx}Gw~O+9KT4r?O&J(^dn!M%tn?bYIw0b8_yiKYrOc?QFs{6vnDcU^ zzb_ckU)*>TLK}<@Ixd)h*JlkHP`9ab0{2#z_sug;FIH;qN<|9ONtJI*DrF+j%GbAw zIc(SIxZsSITuvwUDq=I%nr$drAwN)S*AqYC(O!q#-&myh zv@i(srsRE2o3ikDQNv;3E+75=<1e*sYiQXED$~hg{V5M-GKXRDsVd$xgz@%dibrb@ zxNKa7CU9~FQ-877XI+(M_fFP%xGO5h>AYFX?t;$w$p0`}L8R$WRZZX4d2~qTf<3Fl zO538fQ|W5Doe7jS+q(8VRI;${gqlW`ht!;BiXh3#1DP;$R1mov(ckk4ERZ$waM|r4 z;!*}V<4V08Ie%T)XlmUm;3wuGZz)3vaQ*J@uT=YnzPL`l5=ZzWI2SPTiI{Nveg0ZF zv?r-W*Gl1Rci(e@0;}8AFMMj1YzT-7qZgk$TA#K$W=HfQrtP<_2EY1(Ir;=vpq3qW zuR+~}Zd|!Dc!rYcbymH6PgBkk;T)y!<|P6-oj(iT*GYvW6r6vI+fuw)Kwiyx?34eV*rIXxxE~@~p8rJY9^Ou; zycu;|S;Brk1vfWWZbLu2nyT}!bv>ZCwb`oT>=%(mM^JPkU<_VEF|O-ZzLQ%T}yJE9;Pvje%IXhpHTkie9c zXDK;xk@3lrY||}-*Rs*f?o~@X5s5*XdpHq}@#5+wyrJC-OKGX1AiHKS z@TC(m`{+C(&yQ*JYwH^dkePf+1pEeRrx@FKfeRFGS^WYRht0W}(jVLx+e?$4ie!xi zH{GU0`Bz8gv=QJbwbz05LKfZl3%7^6?q4U{)SKh~hyt{e8E=(_<#tMQbA3r(YNSf> zKBKnG-wg5gQqjmA12GYF^idO;+P`v}dZ%fY?*E!eT|s;%O<9jAq=`C2x@VeZ*<<<{ zF9CrgybQExjES>F#uNebDY;Sh-5 zN(4&tV`uNN<}aZA-^}A2u**bGvv&O{nX7h2S+_=fh}59jo_0CXSHIX(gsSuwp6x-I zHH&oWE-hXW8CjVWFLXcU3Ai2C$38#F@EaYc>B-P&RLJ`b)cXpgH$MZ41#oH+_$Scq zI`Z~yeeD4rv+mVEFeCN0w2!p0?IZ%ARM#sX?*{`TogeAH%(tthe%PkjO(EH6@+F)i z7zmrH%a$=Cf};?T#zg9xXFH~+<#@{y2ru{8&E?#23g;5Mflmheh`d`4yCxG6Lv>bH zO*Eb;YQ-%sTP?FDf6-JweKW%i0g9PPy$mf}UV?_qmt|nHWTDFe$~Ij9rb#SU+_<~n ztCO|gJXM%&n5_tp)3yomw{qu6)Mz}CBuMQo$ie~2`uWGY_z!2SYv{`Qj=1Yq<4Sb0 zEpir6+Y|E?FwlV%8a5?OKwd(^KT{P6so6!8@!N?Xa4$Z&&AbtFn_wz(^||m=yY%~H z@L3t>P>v$KA|;J{dFtUZ{N()=ZuZ;8@zlmz1obBm^tp#a)hAH|rHb6zTCsHQ6c2u# zQ-B%o(TUdda^piD_Le1jmif|fP;G-tQ^n5T_uzXxY^UI2QSclpDlbA{wtjliGF9+> z2?pOds)Su{WZqrmWp=tpC+A?oFmO{a+A%FfeYo2=M=_jW#7+5hFn&~Oy16~s$^xvv z{`oN#pf-}%^{MK|99#d&$}mp;H;+B1J(ZIY%};%|`7LFln3`Nr8;Vl(Qv@jaledKD zpy6Y7jJuh+4J~(59~{Qd78M@E)FI(~)>9El$8m>_yWO!fSts0k{!`3LLc(qYXLGga z_2sPyOCR>CfpRIDHhKDog5;I481(i&7%x$J(ub7j%e@HasuUaM;z3GG$YoTn3(yoY zP|}h1QG~0*hZTBdz@|?VZJrn&!W~vGh8h5P>}z=PZQtOy&oI(An#&K~>0YaFlzT-JQa#EK>VHHU{dqueWez~%HoiDE;CG$IJNED*+?yS~w|8mG&F>;dHj@8i~+hkZW& z`K0z60rda@Lssj1JkX1Bv=R!G*2*jfed3-w&4EsN1%#ITzkWxn;$kMZynoXOA*yj-Yt#I4KstD|?V{#@6b~q}}1y z_PZ&a_?8xJO@=u0EnHYKzDKuc5kfnc0r(`|r99-x-BrnD*jedRD<*-vTOuZ#KP1{z zy=Mx6agFom*LptkxOcrZQJ+ZXGDBA8jUQhkAB--ezg!61n}=Scri5eK^{Kb2w~%5N zJ3y7V^%^9tWkURV3z>KVq* z+!{TsM1LJO(czmfcG5q`4e<^grJrUXI_Z7$B(N;%mS_1U>(YAr3qyf!$1L{9fOG|Y zBM-da*SIV1ryr;`ZHmj(o^R73Ar%P6o!D%7%fkbnz%TD{MYK}8s zON;^ZimTgE>mGw50CaBkZ>BV->b@*_M3=x=p< zF~xzi;jJ^pZ$XiyB))N4>yQHBN%wXhgy1#Hwkhrq=$4$_#?K2}1M6)O8#ZtUmz9>* z7oQB*zWl&X=BBd{^5ZtvPjVX%KuiTNT1v5sJFDM5=DxYXjLEzcQM`~2y_e+$Y-qNh zvg?3v5K?%Ro(El@kt?7oUSY&Bn8#oxcniVlbW^T8XqFe*X06i%TlBxcq-%iQPSQ%4 zHX52EI~hn$k>KK*wBRL_vFQKnEipl zjOgi^3HQ9}tc&hAtwt^MdqhGR7wH@5LQk@SQ5tfhJw_yVpoa%HOr}Rj{?yHzYHH(* zA+tAlRyotFm^0eBmg{)W@mR=NFOpXahOL;RNbFJLaCJ2WK`6|jvukH7l}8J~9m^hX z2f6o*qa)N>n{9yqut!pqo2RG zFB{k5Hp?>jcnM^cvs-!V8Gm^phrI^??l{T?#oxT8{PJ$-Mf8&2JM(NuhEY>d%Za ze6AHKFS%%}SblaSUs5%(6PzAP>&X#cOg&qEMnBnLl;a|x-`jW+0Tbz9z5g}%J$EX_ zV+$Nr=AdcrNBmXWC0I;dztI!dN1g>6Edh9g6ati~<7u?zs=V?f>}B=ZVm0JJb&PbI z(OSA1S?6Wqbgs_Ebw%!CTK1D%fs?s(kuA6BHl z&Z9z&wI2@0p2$u5tuvqTyO4?;Fo-W=QqGB{tbcY=e3AN+U7jg0gX6rAoolwpDeO1E zHD$NYGTJ4{#1jmul+gvl*!<{?`i={X7ylIp0(%) zxWwXn?8N7Jwsib7?zZlJTY%fygKI-BH*!ri`|rcyeYzGaMbpi>zC;8HTcCa1K)y`w za^$<+hTGvHR-10DgXWm~OyLf3aD$u0lS?5}eW8ww{;dIv%y;>naq}KM>B7o`5bYEp z{bh1(+oj+fjL&?uq6kN+!p?ovKCI!HhjsITN`>Of!C zbfZWYb>@kg>&VO5r;>4v86h4$r{4RbYrnyod!MJW5SU-$U;V_v* zak`lfELPQNGL6@YVWLV1woNMX?~D#Cdn0jups2|!2|RqnGS5V`MN#BImQ=X%j6JLT zHpR)Jb}_eZ>#O7{2_NaIW}4k^N*^EaJK|*9VzhU}S-@#FC^1{C<;!AsB~oNwV~1jV z#5v zNn(&B`GnJ+<+MmbRytQ%7Zh4?1%h3>in81X5{I-=5evQS=EaOW4pd8=e*b}3@lml- zb0uJ7UaeDLF_7g#+I4y&^SA>k;CCA}`V-m}&RsUs&x-3UK^ROIXcKD?P!H!^td;;V z_YUS8mD+WayL^Fn6`cuc4@h(zROA=I7IZXUXiwl&R5gj~Z|swwC+i_krUh%PVdAiB<`Eu$e;g02Vm_qV6Y2^6Z!ltwCTQ0Nt!kgZEmE9^1Sh6gI? z+}*jQQvdFko$e$%Gg7u*9Zx}!6mLHF{1EDG2NY-(_Y@!+X8!qv^s_t{-9vDC-!@B* z$=wFr-fkw`&c-u@X+wf}6No`p=ExskMUKRw_^d8%qnDe-v0aY)0`oUKm&5pLdlMFT z3Qc?anqU5=t6#aB93Ms?$W$*~)B1rj-7Ahr32ogSbml|KFAcREqfiiD*@a}8+R2fe`uF$v{{hn~V0}*juc`jn0bdRo?U+#OwAVIRDf3VR3Vd%)o9P*W?}|%c6I(pJTa7we7ofX=5?CDQk$rWEG;^P5A7*x-Pu%%|PV! zOtYqENn0-+|7=1>30L5h1?zOWv6;c-qoWe#gZ1uzu>ia#Iw~RkG-x}g>ovk-y>=;7 zSZK&*bR6e369usLg)&B2lrpUFMDqb4aOs=8$$~YP_Mvy!$ee9`ujXQ13SFeZToxC9 z{?WR#}xAuHrFR%i>r$O3Zo%j;xrWwuMMI@&dEvs9u+6Mrk%DOE}d$Rm7kS_RIa*!=W-i238o&ChlNHMw?d6L;t=RyVjrwQ`0ShNXASL_69!E>VZvN>A=a; zu0`QnGwy9bM$cj@dA$4pR=!sEF_d71#CWCE(CU|I*8CP`x- z(&ce>8ig#=%&-jI1;i1`d`?!mRo{1oWTxTh;_9d_j zKHZd1`(pX6%8-;mgYnr)SCLwhZntze^(qm|i&5ddDp8NNG#S>zhabpk5}V&rH!`sw zs{R&y+;&VX=dSk1vyp;)sk_KlW5;ocyWRu(Q`Fc;eJ1VWa`1E4`s=HUII_CSRzh-C z;#B?|rfz}7*rabR_ed_iVvbBHCWyD+F}oh%+-2+J>^*ccF;=*T`JxWM-zusttjqsx zhMEAs(`4^L++B2#^8PaT<_GL?{+66vrm0O7VHVb~2CMV7;g!r@Ty&L@e zZ(LQnRfMq?=zR6EBktMpZpSL%>shy)*j(`0W2wjL4;o@ooSTN9TI9Jw(&jy*WnIzW z5#Ba-SE`Sjc-fvGtC~M)>Ngi1J+`LS8T1N`>XVR6=!({@P|kxRPAy#y@0!j-A-kY9 ziF=@$KK|r-Ooh$ajV)S_`3w9!(}X5O=M<8nnST~V4th7;s?T<{aVrpC2%FvyT}Wp9 zp3cOHJ4wZ{UVnHA9oF}-JEm)m3B+iGM+{S%|B5JnJ4aEvgFT%)MIEq77;3&7iJMYp zmr?soaNc@C;UTR3o2R1Ai>+Q-Em_{r&;T#Ry&_%yA?KOk<4&It;zc$N2AA%f{(%f? z-;dTm9`rY2v&a=~RR#?@`Rm)>Rw)epkSqe1hYl^JrB@4Fv)5<6+yd(8tUC`a{C zA~Z2nX^^*-J+{B1x#wKwfdY3RzWPeE&>7McE<+d1pBLXcnpPHYr<#;2zZ;>oalR}k zrCEcl;*98)wKhk|_3(yN4@na}Hv zb|(!Z299^d;0$p`D^?DyRq^RRMxQHIGuY7?5Gf}FN2j?6J9Zvt_Y}zOmeV9ZWxK~_ zz#=2r5L+Vf=1{p=eaBEKrsYNy0*vs-gS zy$(MUx;D_Phg<%_UHA<+z;xo>K$^#%{rH?FGC%rL+dVj+ors&L}Z69S(h>ptOg>=7LG>aj(kW0au229&wrTc@Ro*;1d(B1 zvG5Ci`B^nK;qZzIQgOC~U%INQHisHub>1*J4@KtKCYfP-0>MKQHkOqe0mz%pdD$(0 zmeZd37JPkv)-jAxZ8x9Nio6f-dQMAEl=aFIB}Q~7>f5KlK?=3|o{ecR11_z_wRfRg zvXdzprun7wSHpFUlBW{a-K<5^-l2UvFX1+4eg1QG7p`YdoqgkM(~wdVvY__$U4FUG zm9h1|<^@&_9S?^Rk_5J9@IpKty)OyH(V>^j*Jn%&!+vyVmLtp)2ug&xZ{t59$*B%x?~_Jnx;?WHkBO{y`gNL&3NSziV`{#%AVL$Y==hB z(JuJ0)8JEKY^;@n2sdMbd7}dlS*mPTI|!It%(X8=iT3JF0TJZl$80NtJH^sdxTSeO z?ok~4$_HN~Z#sY`Kpuc`PrLDp|GfmUx1A#dqBR58T{KVEZ&5*@=%`U>u**q>s88+-CfD-|^WlN=bX`!P;-QS|etiHIt(`RzkkVpZhp2 zIKD~_T94`@FHX_89*(cyLC4cPz<&iUbjOA7m?Mhi5=ph(>DL?E zmumLgMPzvex1X{;mdSPSPrnMXI&JO=VPEimY-{asl`@GNi29_Eru$<4klJNNzUYu^Qc9+J_u`hOdr)&|2 zTGzZ*S{y*@iwxA(W>kR;$VD06?l@JA7Nv$vkzhyitIzdojRn6w_UTN4O!<34o7&>V zpO)0+etevxYOYB^6NS!`iZ8K}4hr}|y-NtOHylW3X8dTxJi$F=G=XxSO=;=ZgZv5z zq!@kRBmq%nN8PM&rNw2GA|uh>f#xrXgiFeX)vOC2%EeF;sz58N!aMuj)+-LJ~?0hQ-hZ`xh+)CDTrdRmD{WDdNhZ(^-y-N&wiVG6)HrUq;`Vg5E6tq|k zxz+Zdyh$`**gV~{N+#F%#5W5)&R+{SRo+iJt*&t1G$ z8>2U~NfnL=M@x2DhE-Jrg1mB-+0OZz<=bc^g;*ED@QH^RF~7iXtf?0puzf|lbdySA z>gwk2^5Aj;$Gy79aL~k#ukM?~99hpGUALiXP1;YFdhO)OB8q-ZYtI-(1kI~*>I@@F z8?K=W?~TNwLTY0eN<}B3EAiU?$uU8Z$s$Cv9p;7Nmy4D6>}jT4DQ+uwGGl(p$28iX zjVOwn=SZrc+b9+GwN~f-yITA$=Ln)3P5UpucTyUCXUgI67$SI~#klIoM*fN-w#q=h zCc}{BYF;hTe&p-j|Btq}42!CN+l5601O!A7q(!7VBnJ>FX=xDY5}Bc6Xld#0QYq4Sz#S z7DHFI_9jjJBRF}~P0WHZ>IH&_%nLA`DJ)|Ch>&<^NbGC(xKrcc>vU&e+W02oi{2|0 zNQ>l1|4W8D$>7>+xz%Tk^SCO>M%Bmf`mhBGL8(-$#IYhdX?%}hIJTu z;^`M6mL!}wY++OuaF|><9WKCdg zv80@7cI7o$H>r5Op$COHS>_Al3ImWxl{9)5OJ+y;gdM6QSJCa&2C&q;tRxe5`mCC_ z()W#8+$OvZtLoP6ah0B;VQ(B~048<*LaxtOd*MT1#P2|z{@`Yl)8`8XzaH`xriu@@ zmH1)(ktKv*E}3e}ByEM;_aJ2Fy$ck`R`j0ZYQlD^tHIcHvfdlrs3xa*4eKM-($mws zodc$VbG^#%*jM4tRC8C`9uNtJ&%ZNkxKPJWpi(CpT>Uv+^cf_T2}&pWe3W9d+47mh z073G=Gz@;XrQP!;I@|D@Bq8XBl-_q8T&=Az9dkW5_j**u0)6)Pcc<}&cIx`CG6;ts zz7DH0haK$2$%%EbxR0cw7|TMHsgOiZ?Lz20+gox5?L#pt+ZH`+mq%!}R7``s)l(8H z;z4#b!Ls3+^{Ai9w?p;PGYvx<`jC=8DiHzR4xAneNL>-U5h9anIIy!RFq&2)Y3$rM z>eIT>7Q7?wS-U&(q48>2(VP=JejvK)TpK`_9_PP2vk=kK?t&9X)JUH(MRn32f+LR4 zd%kA{E1w&Feb-HDa1QhS7BM(WxgsZnFHzn$0O9Jf^rZ23Efjh?_654ghL|e5n;|71 zOBdEHDwwcticj3lJEtd-?`MRGTM~r4;39B*q$YfK7b!k0&`)U)ajdmk({4k5`C< zhV$T2GFCQYx7K_ijcBI-BsjhMn>jV?z=MVol+7-%m9`W8h`=4u{X)D(!Jx}92x~DL zzum!oWd$Spx(D%4`~uiqDPi$z5ZtZNdVdRW=@Ybyi-6cu93)N1T>GgE@CN#)UAL2X zeUR~9xrzsr&usT~$guZ7yS$XC)#tFJ1G4^c9TM9ML{Cf9&k)*BxI8v1Rj;`U>RAVGCkIYHw)z5dXq8Ys4A#z1D z%zcb(xIeh?o-R(|zZ>pdEbM$mN;9P&yp19C$WK5jF1Tp<-TLZfw%_?XUh(U&RR}g;)e#YS;$oXd!@ayE;?^Uz$d-C}v14wQ z)*Iw+PMNqe%9!T3C~O*uxIMbBWA|R591l;D;IPclD=!?n`U3k*!3`GsE;;*h78=*A z7(t`UNIpAAz_w^bk4ERD5|C}F02(Va87sr)+|&=$o}m<6#HO;wznLxhXrp%{*cF5T zDN&%hn<_l9!vuYU_v1xu>YjEf*1uWCy(dmSijp&Nl6hmCWLH0gSC{(OGs4 z*hP-GS~cyx8mpowSozTcxmX-zY0mlQ_1vO0>hu5E`Pih0vCj6_3c$mqag`ZP?p`s@ z<|#^q=vkWB-kr(R@GHK40Z*D86T@r>WaksT{zLark0UUSpd*UBMju-siKpff&o3=Y z;tzJvG6bY)ZSeJh=0blEv%j}6Gl^kzUqHn<6VBzbqHBIaRgZsNyzmBwakTSb3?Da^|arLHLx^i6ullySlDiP$wsc~MY7 z$Z$mFH$As!4p=sQ6b_h_!YGt~q!WvNK}qt&F@5sNg2^2)aa`G1^?2Is(+srg&Ia|z z31tQF*#1Tf;cJWH`PLe_xJJ17a#6su^0HY}r0uy;=HvDAmwDZ!(jK~gcb{qOwptGF z_>H%KY2~LLInM%B6nm}FU7{Dtg*NRQ+a~T4pb|HnjtASC>sg2s6iw!{;i~h#Rvw25>a~BzvxU7f(UENiU(!l!%y+vzX>mf3 z&EUXXEE-R)n;SUC$x|_ME9--hia5bqtF9||#8(i_jwfOjOFygGVyDNBMUE!la5B?r zB~RUvVYz&hjH%S|EQc%zO)gpOc$7$JmJKyoM{4lxT87*TS9PZ9Cwscq0>5hr|{RX|HqKFqqZ|>_^3ad|8*Sm<2Ivw(2Q>bon`!%U1zvfWcZeGht zPJSL~c#4w9#`Nk}dMpHyv8VWMmB+qS80`Lw;H?~JO;XCCu2wCNU^Y%aNsx_Q-OfxZ zibh~dNJMp*Vz}A&Hl97R*jk0vAyq4=|MB%1&rKf_QS-8wI}%$PAG^)}sPOz?0lqsZ zO)Ws7ZHOEgyWE%|$4jFOQE^wpq!esFX2-2p&pW3B`f_u( zvK6nYd2;m=|2hA|%kdtZcenWt&Yz_cJ@F?%9X{ufXU%pbG8zVP+O0_`aucG9FybVmwJBB z?350v4BvwdWpniDGQ)65VtfvenmE@JJLL-7FDgLv*Tws*J)zRJy74JN{`WXy@mNF} z;~p^(vFQBsGu(NJ9I{&EZF~4tOWAfxyWW1GcjbfSDKK$9k`#!n^+k3l@#~p2)2$s?n6(+$v1iw39JodCfP+q z)Y7RGwF-4bNc#qphy68@OxroEBRKSpG{?s_N0B!#?P+FkcJYE7Hzz3VRU;Fp^vHV^M{ zT?C9dQauc;JaOVvwQo}@p;qwOi{r}XzQ^X6Jk>frB6F=V{q_EqWyyv;$sVtYvme+K zU%X19YMpws#AQ{bJhYd+Vn)Is+dDTtPQkhz)@e8H7m&9?7O>1Xx8r)9Q-5pX^{j3) zqGG;cJFP~JU*h_r%5$BhR6Fq#X0a4LPQCM=4`sHbpX^{up|w^uBDM}6n!V-q znDreq6pl1o7ot2*8?-?3M0lnsVd{Tfefh!l_h~Isil#S6Am~kccI$PG=ck)roetB1 zdUBY{s{ClSkO&^p`_r=nxj#O_x9)po3#ClyQA21y+T%U5@jd22AH3J-TO^3wKWx6N zzpeurvI!y*?T+>ia&FBpS8WjNChH#HV`ylSecznr{qk0Ttz{U;v^bp0Hw((7yn*dS z|>u z^cyBAAui{+h|qv$LyQDsR0Iv{-jv?Cv_)ESt=2_D?vR3A{LMP9D{^epWHt@v#SxMu z_Dek<(dy^FuL|9`<^eN@o^r+vr%>^pLxdRtM1^>7C)OPc^1gJbN! zQ-ILdKfi=en94`nD+B!;t+xlyTCGC7O`CfJH49>$W@EW(o*z1ofqr_N;Wa@_+H#At zz!jFcH>uu6Pxv77PK<=qnZLy8*^P_CRN*EO)}cN}*q?f?<#<41D+P+9MX;R|9;bJj zGRL1M;`ZAPv1)&?Q!|S%CiAhqJcF0zi}yEA8g7#mvoT;=s=#CG%O1Vv+53$wG`}`NSOnap&8{*DX!3%JY{5{w-87>1z2YhuD-$tC%Ga2o zs!yKUbo`3@>=q&=-8OaGyB^9n2FybTlOCfT3jllHZOZlOSFX0 zZPFd@oD90uT_O=FPk}mm@4GQgeoLrzl5666ydj9F7U<8tKV<`?oF7;`>1Qb^$|VlBe8u~w3b~NT?MO}Y+HT4aI&Sx>SXfd0i#L^ z_*C)tbVbq5Cpyb_a|`@o(-*eFvvCx02IWMvkV}L0c5n8(X}#WSW!V78CPukl8bj@d|PSf%esA!B*%8_t8~oQt}b^-~oxbC(xH z)_q$t^_7I!u7^J7F|r^UWbzg6kf65Tj4jAsA!NdwZ3|`@b_P0Wujy|& zsAj^dXTBlm-|2IAZC!WQD08MQ+* z$#u=6wJXzx65ROjGd)k4^$>MRFL)Jy78Lc3pP0qA|&?zjEUT^ z2Lc9-dD5qu)$YW3#Gl+1pB#%@9Q|b{gh7=cKzA(9zPYM&5qdaX;;YDi~>y?fdQgo^H7n0RSVLOi5l~fHB?zXjhPZC<|Kw)T_7>>;~>}W zBp7aMjMvv#RbE#MaNB^>-y}zyyqIDqT}08-y*%+k2Mw)Cd2XRVfvl|8Q*O{AmX$CUuWx?*^}C2NTH*3h$K_f{!h=Q z$x}$oYd8~ySve!mndkZ_p33xz3n=WOu!^>>>dHZR)nK16eg!y+dA{{BMM>Wvt2ceb z^?nKM|}s0z=C8*cT_#S(e8UXgyCBxi*5ZP3O7TrBhBbUIQ22#ZG13>@4V6&k1g?n>fKm4PXo7q zMf-Xh`#-w9B4f3kN8fCX*wNXgb>~+!IQorFmA9Y0;F&pPP}_T;7hvgcRo{n3YegV( zaptA!^wLorHq;})_I%i4eSBJc{b;GFZscU9$~&ck)3FVU2FkSnhb?jYdAEc3KSUAUOwzYlR~27FFU-Z%YGquhXx(3vNiwWjj<)&(Q>cF2-tNsCR*loo8R z7D!K<+p-Lciug__dI53133{^Wr}0}-$H!DZ?7C+${hHrovNp){V(5D9H5mp?yV(SZ zj>u2;Q*sQr%@0MP`T(@3H|Z^x^Mf-v^%<`|2AU4$82b&`@|(w}{zD?uws0bkHyAmL zPV)ghsLGO`Cd7_Q6RLu0FHq%27`-;FI^^>{`BR{j{`0>CEs|2{%bnG=wexlC1~u(! z2w(1}7H8jwkCz^i6sTf)a^ahLl~Rx>Glu(2yB46wBCR|zPk5RsR4g5P$iz8#zA005 z$~Mh%g@jja60o+X?RRZ6slWKdY$h`8*c>)>J-u$`} z2FvbuVHr-0V&h}*KlEuvZSC}#@kwh+kmXjmaWGZoU+-}Kf!59JlzEbVES1rn*tEnz zw0JVWUSFlXSlppuHj8dRZt2bD9HAe9Y+G+hI=^{J231_f%mR5k4J$)fcRG)F`l&eg z@fZ1@cD%Hv^A5vnv%SjCx?DJVKyaqst?jUo(~ZTpu?ooTZD-_^+ffh0`bwrlp0*xJX`vK#x$+J4yz5KoV?Y&VOfaVhitS<( zy`a%~y(*0HjQeEudgwMvI)>){k475tqAjju5weQ78UFhqvi1J9?A_IHYzP|_-35MU zfk5nW5Tt9#WkHALMUJ_9+L8?I;-+ILDnAyVf#5|ZcAH`f&m5_wpt+whVKpF9YC;;v zel;Fj9~m)Rv2Qj{3l)HSX16Yp(FBd4&?gB*yEekNy$-7`D$JTz>!T>Q3vxY|!m>o7Q*v#p+-e>p} z`AJkO*1#|{1B3~P-Xp{A8AN=C>nNu6UA<_cA&onXI4#c+G1R%NHEyKH>%FoI7wD`p z#k`qm=uLhyUP(BjkEW6R3`GM;+mofaebXu$lUQIDAajmJNBYp^aL(tLzkWPg%R2bJ z_9(`4t`qSiGYFh@+-*vdTZ-(Rg1y8Q#~cJ{mlxqB11SmLrOU)@(SJ|AEP_8d$4m@D zZQJZ(ge`z{yO{T}`P=T0Bg4lN5`D_L<;NKV%Efg{!u%AFFv^3oh~^)yQu#hSH$WTq zPGwb!{Y3Jfz7eaJEw19{D9|aBE$&r#Q?Fa)T-)pHu}CYd)__xcDSWN(J~}I#qZo}k z8h^CJzIgT}5nS+{9AMl(wj92}_i%N$_s}xB=ZuH=reVuDpYX*yNZ~O6`kC(8Ws8%1 zFIZ;g!I!wD=^v7!G>ADsLDP^n1PkM6ZnH_0f_be|^lF?cA)i6qFc!?_;qyGV0_KRM zu#``^k!U3K>6Hbpe1AIly8>`rB9mwO=t37p~vs~wTIh1Lz^&i3fe9ih^ zp!OHLy|rJZhDYxqme˱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⋘3g+L!WlAIF8Ut2lDhW^!$PfD zMbW)})=ZuX3VG5 zBz~rnqPiE?&XDng0SrEa_apU}_!1B(f5p82Ei-<^HKnu&m$0IL?)a!fv1VY{_5QJZ zUEutbv#;K?8&lBzG1Sk8$%>zCUnE;4@3Cz0r7)E&T)OPbQ$wWHTYiS6s6XZ=u+tnN zXQn=ij;}MEq2u@5mK3Mu*P$M-dH47e3TW#>{xAz$eRX6NZE_uYmE=f`GAIf04l5X?`8M@ z{`V^fBXW?f4t1mN+BnSrtC8>x&QSZx=P}H|!vMmmQd=cIC`J`z-dna;JdP>6Js6Nq z3~N>!srd-W_e`YwvBMJ7-w?Z(y4fxs6Pk%C=dn#=Z$Dj84AIF!{(I&e(3|)cUsFAI z>^bP(tlJLQnw%-3QU13*d4IjX_584gk$_;iu=2i%-+!Kg!kMr{%|8h9sPGdHqsX0Rb*WrzSYOkh zm(5HfSxD2w!RICuYg^lM@-xfaAdYblC!V>$zftjQoKg5;SF?&-&i(E1m4Q#D3#yQ? zyZxIL>xCVV$Gj&~AC}^%b_^fK|K@|vx%)dkL|9=P{%v&ci`f1ii~_wKh7bUN({)6v z*gsbYFgm69anZlq3T8cbpYyjBH2sT-U*5LpwS$NC7o07aQfIae=Ko>apn^OR(}Zoa z74c9>fWj6@O8t#9aPQ zo%$9g!~6V4fp;ZZ1lF-g;ag+(Y7T(bztGyl%#P=*W~j0n`6C%|@kL?x<=>cirY*Jk zi1oiGfmdsy4Oy9H&Hr(Nl$i8+A8sP`tK}2V2`cM7+#|4q@Up7oaV6E>#tDaXs>{yM zXG5;~m3$v<5q+&=#YdiWwNv@FXPHZNfv^pgof#9v1Jkk8jwbwG84bip!8Dw!4WT4Dv$~vaLjYpDq4T9SDeIb}Ol2l&SYyWMx?k6S zpz(VUT{L4@j!x6R>(Un@PC+AwmA?7#4FzLd1om$M&zXcsAWGqR)vR({fxb6$*~K?T zrh7IaPsSVw(T3j)rd>?E3#zA+{(F2p^JvgPpM3_2GRyxqY2a=bKEMAq(#0|GuZ{V1!NxccgKNo^_HYvb0=yfW8OUBw0*{_ zVNFxhdS3j3?B)9*U$0i2yC#<6E_==9n)EB_&&h$VSLGXTQ(i6bo}c9m?g=J+x|7Ov zXGrE!?ZJ$A%10O7XP2xG>Jv-*ocBEsrVkMPh+*H;^@YUIZa&K-LSm7sjj4*69#O-y z)xxp-4*rOn zX1`OT-@^SjYK@0n)wBXxrmEeOwi_w8qA59AQh4Uvl1-4?4W=bh1-I?p0u&8M1uMNi zEwk??-k`uNe+cj%ir{Ah8fB9PQIY~K6kG=5xMJrmE;dhG`##_!^gY*N_#IpG#a;CL+zr$C~>1dD=Ac(V1kZM zz-czds*bh}6x;F0^ZVl(Du;Dl-?gaH?$^9U3Reb)Uqi*ZbsjE0AXMdND}u97(~?^V=$E-#KWw-0OS zK}#K)smDiqU<1m~MmfAU>AU|>zb9*lw?wZRm1?PXB8uev%(rfwHOXxm+#JS^xPF)6 zcG}mYM6b{Y1fqBV8mZX?{0(pV92?f0j%o!uk3H1w|Bvx_u%wd z5Z~@sQj2MWYC^%Yw{SU1tRI{BH=feOspltiBiS)wJyMH+s<$czN}SWeQAu;Z;DE#9 z9*7V=O3mr=t8xmwsQrkVn&7C*>xp#>ls7cc_wODFQ0_{XNNDb~{c})=Ys6FozP#wj znjX^IXaSpVu@eRVD7D*h=D|%q7$Ef>jjpmY^z8{}#nnI(#ogKt6ZV4IFO`MK^jp^Q zQWi$AL7hU&BRJ{>o+5O3XpZ!rTRRMzn;(Ay#CPMQt>r}zCmUH zVH3O!Tu6NcesdgGK#<4Gz=#Lbi3z;9^vHfnDzbj7j*Q$W#|Z3hVfbsvo8nktl8y#Q zTm*K#QloEn{6k1ZZ}QKD;$epY=|aETj|ei8G!JgQg6_@ESIpPZ16KCK?d3FDdWgfT z)H-F=-Bt?m1>5}EH@C$1lOLINv|VB}gfC_|9Pf?$TMu&}0T;W}(JW=wM?(LpfyYV) z!zd_AHob8Q+rP6YL+8k*dic0C=-p8o3i4*=gSL1)ptx?5tF^*722MTE7bp#7EQL(~ zA)F?ZkIM@z10zoq!<75!BfK#bdmH|w#8n!97HId>JDaZ0ddcBW>Y3%{$ zC@$J0O(PBru-|O+N`w+vP0dkX2IRU%6gkq@8YpOv;@fHfr{xZ5+i&i;8FU$ba~pBM z!lDq&d=q%=NO~k>wV@6{?)LvihXwWrD%#GYRDaT)$!3jMM!s*ozDIMXUDW-WBfluO ze6IquX2EYxHRw&Rj{qoC;)pbk`&izF>L+n!CaEv2Fsm3!#e!9(BtyYFe}U27ghv)V z=N3Jx*Yd=hOULyy9FzSJOat>*ziv71sAu=ZQ!kp*iag{0Y2?1~Xc;Yx`&k*K~;DT ztkKE+K3`QSUIGRraC-P5Atr;@K3)Y|GTi@#DLTCQf-kX_D;&)|#qNCbL}8<}yw6ze zd=jw}n{vGV2WXm-Ti`{3Mwb3C)K^K5oFa!})D{k7+T)>6$T^Q~f1J0+K*){sLouy1 z2T)Tn=xH?G?v3tuTaWo(a5Ma|7Mz^D1zp4X z!zr$!H@rt%Ae%v1&LZ%TJF9L$HvUrm@dm7^n;$J2U5?d1$LhEs;7tr1s8)p?2a?)B z{n_Fu0oY_Yt@%i`2>wXT)8Nm7;<>$G-=@DXR7^05h|AdZVqZFrmoayQTyxK*fr{CC zom-~e(1Of9L@X9)Puy%n`D&On^|=6K4k_-F(tHH_?)vDD1@x`AKEnGvTFvrmM^Bkc zZth${&ui3)+%Zi}6g`bdqpg`Dwb<=cgs_)Lt*6!wKAyLVPM&@j9#v~JQcG>k!~~Zl z7;miaS#|3^l?*a=ns}dgapmD?x!5;UP6djJIYVa|ssSuATDew=qMEAUCTORW1*mf;G6|21l5>jEvaYDk%UWesO`kL$;jR%p#*9+-K zeswpRt>;vfQ--P^K{mJFjtHw!u4a~uS2e@1Mj4t8&c!@XQJ0wTzaMM$d(U(_N{J!5 z@pDEy@;_Rf+f@ikaUS|YzAPDo?%RtSkKDZyS7J^{6{EfD@0FlbMvfiZw;0)W?|?BM z2g`UdlO4o?VlkILZ92r4eQ<+Vbw&;+w z7A@;(iKBsGwei9q{nv&V4tu3ZFXrE?8fs3pQ-%)l?3QsSrZwu#eD38GuvNu5>@dnm z^*4%J&lcR@z`sU`ZOAOAm2hrd!bprRUG%!KqMddY#J4OOGmnhZWPdq`R}?sJo3gV$!c)j)imgbK)l5WZXV3eLWKerDl1glU zP*#TsGv=t)%8k!`OEgR0@8Bhco+t!QJWMt?0Yn}@rr$didJ?xKn8e~T$T1La zG|1T$q0G7#Gasj{OS@n$I&3Leuzhz0e zOL_UD5UH9jnJRJgiz@x-2odj_jxR8?DISpHdk)jCl(F_r`Re(PDJMM1%zTwrWVrx! zw({?f-2qKX{T0E&h?hBAh;)z8i!izfCB91S{ZT&SIA}RFFE5kO2375VDLbxX zDVGcH0vvT`rr71i1|AENg2S#L) zjNh2;eDsO)*+Gw!a_bW(Yj{>7hCX9#J954*XTE36GybrF9iQXS@g?P)^ToZt4=KEz zj~(a!gcr}!GF}6lg}I*{2!-B?I+nDC05{ct5*Vx}ItJy+rUZIHiySEz+3b40y6s-A zmG5a!mYP^}SpF8ws#C9<*Q)psI0be$PguY!ah~4jlJ&un0`=~o92J;d5(Bz zfrn`LDx^uJAKd?5CZxz)1DCw5Y~nyr1_yX;)js@L-1i6k4(<YsrRY;XCS(#UP5i^g#!-hA+~f1FT{F zWgqQnz=lvVp=M(8@&;0>rFj1w#>FNjS}gD>9>!NlqYCmK$hk7eMK8;X4W?VKY!vYWagWbMKv|(yA);YJQ#q7A`uv!*BNs0*5JuOw4|; z2wvFz=hv%xteMgq1aZalA)l_rCq%ZkA_+Jq{(q>F z`cu1jaVSx*+i<1JZiqKCtk1iHZ-bBfrUFlP1Ixmg*v5w-RJR!Pqejj)HvsHmuIEE3d7 z{kgjt;EezDb1;Rk?gLXKU(2<|z6Sk~^bxQcfT!R%XzT3Cjr|EzRRf>5085&BI7^iZ z*a7!;+oA@dBXmWNY3ev{hev~%YvXs7tap5;v>Hgo(rDp#&q0>AoPO$DOoGDDufN#x1fu61t(cx zAesH$Vb$+7(ItC0TG7|`PpJo~=&S^5pu25M`O*7Jihh^-Cx3YiS?Jl_-v5#X8P|gy zKXP4N*an8S{DErhzBlmEu(6g&^v72fLMN3{pgpQ&r@^6czHfmLSsQ%CqZdAG92>Lo z{SXbT#FU7PRRT<3Ap6eC+V-c0s5$b=tbZ1>= zX4D&)lswk3qgqDPfW%M91GnKWG;@*Z${^>KqniCpjp&1Rk8k&tkO+e)TNy9cX7n|u zgau2fQ~ybcgQ;TdPWOq$A)6NcLiZHaNr#%(`2NcAvc_$tR5T)z6&quU3WrR;+D}{A zX<4gYdTxe>mZweq$&yQ!XZV%0tuP9Z=9pO9l!tyS_A+u?#^VJMMYoB-nD31f&(2oq zCrE6O#HD?IEhEHzyV_DF*tL2d$iY|ZOKq2jo5P!e|D4!TnuW@r*VSu4- zTRuUGo+l;?7H)t)=uW4``772FUYxgq+=Qq0EispH zryAqX*zHa6Ra3cNzJP551GowO78M5c5k<#a(MEjT=PU6X1jftlOiRu6MknQuDVOF_ z7&|P+r`;G%$q@u}Zu!hl7^|{3%%lOdN+}+3m#!(1YfCs&dTLsx-JuYpypkTWjn`QZy4nm z^w?XK3C3Tu?LA=_`iZdE*34TTJPa0mozl2u1b__o0tNuIG$#S~4ZGn!L*rXXyenFU z$c_q>G-=6x+y3)=)$0L5za+?_V|c3{V%l!O%<%IW`)Gs;cAKA-jj%tKq7%V-6p=O)c!HiXQ1Wa-&qc?aH za3!>0EAiIR&Ic(aOKm@l{B1Oi3pDbeZ^3~7y1nm~nN z3)_8kqB&Rj;JIL{hO+@qsQlC zV={%+w&@MF&yZH-QC)~t31uh>1!2TwexUARbrLksuiYO!4B7Yq7SdMeEObL}lu_BP z7W#Ns81)q;=a!BSQo3wM5yXq~ zk53NjBM`Mc(+C|7CQ>h^-nRP2(>}<&(7{mLdT3$0DxR~E zfoe~HhDU)@)OY3{vr`9~u`;}yD0dqP{5w=DfSPoKpKnK+!S$(t74Fk4`qo|EG&!Ww zf>*)~q!fvgHK?_u5chSwumfLJ!B%X|PqV20WA1MJBGorx_!Nm^BR@oQl8M)gr>7M9 zK3suGFiK`<3^!rl-mEbr2&0?S*| zN~Tn_lY^I`!BkIF1}~DvdFS^=YzBUX5}JFbC^om8*3mAV5jvfo%(IhXDvYnNIuUze zD$x*KK93KR7#29)bL>U~b+(&1p)8<4jxyI;EaMc&L&NgUEinx8U+ z^bVB7X9V~Iy;^8t#zA27*n$8#+fpJ%ElX0n!ajREu@*PX zpcj7iD0FUy-yy;xrTlljvh$|Eh&=cEaMK|g4Af#&5<{%WU~g1-wCr+n`jLed;dLC- zQSzg9pioo=^~$!SLqFrJwxeFJ#8d4~+UENMr&I~fobELahLNQ%`KN}vaZhYBSLc_` zUuHT7X7t=$&XZd2r1;1>rrXy0MSQbDS<2@#m9fcpmWuqJ<#nI+duq4pyqd^6h=}9% z;6W8q7+eWVf&@As%%+Lt?NLJK0}9_%#l`*cz(-CZy0&LaspcIQ?bzG~2D z9`C-OEs^5WBhYRW%CSX9BQh(ExVHPI@)nZmjcHpj^>mf%_5477jkzIP3$VkQcNQe_jPDDA&!ucU*LSRPhln+|)yry8W6 z)h!@)lVVUIF1w(WUhlcr)DH$m^6m;d=Fi&(lX0xi`qXvlGOF{3B$;;(n@cc`&YKjK zfg-x38w|B+kd0Xif0xV3Iq12Mts<%IUkZ2~!#tV0(plp7R(L9(RW&3|nLP_jB2I%k z)WMcry`?AWr^Z0XrSCN(LjsnPVZN=S6}&-M8^lrl>|c~+UZ}7tC8&sZtDCBJwT@S3 zB!DA=blAW6)0YVF-7v}B1HKx${dV46g>yOEAH3ra!xUL*Krc`40PuC>XFs3CNUfjn z7GLFaAyZTp?fQNLc92 zaUIi9+-1EizE$%>|6_|sBtqH#!3QL)>8;U@K|s)#W71wEm7Z;9NT_3{hXx_r=nHE@ z9Sj38ZfI~_G+BeHpQ2n=_*d7<(5%MWvyGktH^H_J&W;Z&ll3!ZoA{QlVl3NPZOPxu z+nI+R9E&R2^OR`W`G%;UmF^b3MfiX?dai{eV(k{gJXE>%nfI!7t4H|a&*WjlO@pcq zkMIvcn-vp*aVE?#?Z?y?2#qIXR9N|Ca<@mdp}j2HgGs>YBdM+T1Ja!Pq5e^ezt1kO z)l5f#q|>t$vFP3hkHH|WZn&|1rFncW%nFz1WIDB!s;xRPz~DF)(Ng&SB~T zi1&a@QaBuuH&s*l8rGARCl@ezVWZtF^ek)K1;;q~J|o{c`NBkI2EW)&-xp~2uB^c# zsc^So6}O$MnZqB=ILv3*tgsQD*k7sJ>FRc(I64^^8cG#fr(+^OLUj(NoTFK36;P~t z?N8ihwS_Sz&XRo+C&c;3?x=8t&Bk^sdno;d;d!^2no2R>umDQ(U&gn}xFWnN+8Aw@ z@x~!fJfoegg-4^U6xYL7MTpz8muq*d@R6ISGJn&*{5^W8)gNbuM&su( zUxnlHMcVqqRUv#~iy{wo?LZ45Cb@5iz>75hPbDuI25^g`AMQyd8;$KS63I-H z2-lL-WP_4Q(MHGVWhME%nE=4O<~=6X^~Jke-9`|VJ%IIhhl~Zv+#ef7 z$yN;B%@;3#zDY^5K8xi8A~3uCOuLy2R-&}Vx4F9?&!t@DDfR?p0hG*Z2jOsv#f|cI zz3NVin|0HP9_KgcsrI4tC|HFIMA-Gw$^L}1s%SZ5K3EKlsS)A$Bp44emU#Jf%N)z` z7wc4Goy6;MQuqbYw1N*|SXiA>8L8^fOj->*6L%V?ZcJb2pK=&-<^RuF(;+y{ja zzN-}N&W)0`&quYkeog1f7Qf7z(*W<%uZ;cEfb{6nBqL;z9pb9a?9*GnCiKX4{exv; zWCqi~0>8>F_OUjKB*!!r3B_`6IQB)U>$}mN$ooEX{`^0p@#gsom&WZE(pYM#(KnrZ zX|{kypp*im01tm_OUIG+6~ejtWF|S{+vj_YocRy>Dh4R)9u1%~fo@K|?qH}>PNMxs zjTs&@%*}nP*&?Y6TEZ@qjhdjjr<{x9AL-7MMSV~21az4<(^#-(BytrBma+?$h&?CH z7+J$c1zhuK>jun^zvFhUy@@r|jCV}QucWw3ll-Pe?5VxY*9iejk|3_CR5=9`u=P5M z?sav;;y-&_W(up-+&e@2$7^ZXmhE?j_a3vxeGxj0iN+R-YP%GXf_&!iLmtZ-qHLsE=?FFW~`vK4gFqza!uQt5Vz`ayzemCJhs|% z60UpW{S{BfnQT=bO{*D)HmJOAQ47{jE!J_w)S@)E<7Ku{h2|ed3t)=c{1Mj2J2`Vb zl%$`Q#RKGLXZ=H9KSuqtA6t>@ca5-^rHes-CPo8SxmkSX>9OUwVRywl$A4tHC2HNY zgbY~b^~#>zY6^KM<+$`-XbN97A`KN5shm_nTPohUOj=uxZu=7A2n({`Bu91GpIs83 z1(e=QZ}ePCAD!fa(L#I>dlF8{C_RcuR}(3LM_T^@)+x9*7P%AgAo1k}x0Gi;5wE(C z+U4d{c)|yN?7&p{$M}<@MSh00R)ju}49l3lGmF6*8K_^!-xm(6RIk#`#lh-iteBHU z-r7yd*#Fqq<*m8Tpt9cn(D#lS?W@eU0wwPQYMV1TYrZ=HNT{yX$#&Oi5B-V;e;)ni zl_K?MhZS>Q>ZBgxQ$7h5s&>$+GU6eHs=NI|RlfQ2t%XhueeJWMYIj&|*lwVH1?gF$P3win`ewyVW#`Ozx*3G{ zCZ=45sh#K+l;ISnpCPwBmtv);(9gWEvTt_Pk}ofF`l}#0dq>JQ>0a2q(0_)Ki*`A$ zDthSkMfc{N@Or$H+6C}d*`&?G%2`plwi|6qUtp6RU-j?iuQ&s?R8;}r4O>h^kh9S0}fR53-Qtg*N5|SRFoq7|r?le%tXuclgYC zN}7^m!2{}W<07dB&h7|q4I#euE(qd0LJaK91vVJS@>|G_bf1AMVPs>3tiM7oP#ur9 z0ylyo5(Tk>mU&D5R4>ChYB^!&CDXcx_co`&FTW8DE7bU^(ylO$q+W%TaJ}aA#N(hW zFu`WvU~qE`X8qR@>ofEeCpu2lpXm>ld?)-B*jMa_S-ckEvPDsWD zN8`Ou?I7nd_zi|K{8&#$v|%cF#YJaxb4*$>NpqeuTb6t5I!JWvJL$v+`Wx zj-N@*CxOG|(@iIt*!c~>ymG_(2Sk&aW$C26{#Y|w#&na3x^T+K_c&xb%cRCQo`k!oS~aIl(R%et9cLw@j}yge z#QCN>q5lVE?->tgyY_7-5hU7hsfjW{q9jTXeGt)-=tPSiy^fN|U=TzQy+rTA5WV-_ zOAth7FnS%M_ve)4TI*WxyPo@ZKVN(toK8pC_wB#!h?sSK*Ud$h;7s3P_izJQ>Xv&* zLtomj>|z6;D2W!^CqdyL+r#h*GxT-Gy*!$Rm)a(`ze94T^P`-+&kZap=p{ax*VxNJ z_6EF9%0YAt0_(ZS>t}+>QM!{(+CUn&gGVRX_WmiCZCY9q*zK$+;nCTPbX2n#9kDn~ zt+-c(%1&a6xHnFh&-**;%`!=2$Tx&}Wud$d(w=+3@W$J&UGc9byJ8yTZOP_@Su`(J zEoeIMq_Rdz(lwaOw_kt@0Ta84bx>_ccVVyUZ4PdS~{Me#V2d=twxmprSgk+^! zHZ{8G@P;PBJ9H(D9p4Szky{b5JPU-WKpY=%ojJ zSlbPkqIDJ{`gG=vI;kCUKOnOo`oHi$JA>a~E^Kn{FbWa5+b6Kg?1H)tZ5D@8CnD8H zVJSQ9D*@aM^rGgGxL~*v-Hl4EnaDMAcg#?7&*ArS0@B4Jzul)aik#IeA>Tr%-C>VA zH;j??qA)#w`)lsWqURE_va*#6oE|@XuRUJ!I4F_d|J2pPiTZAJbNfE@iCC&f+%4(2 zB+Bm2pHt6yMmv4kfjzu_1$pLR#U=HS;6*Xp*XWzZO0E5E={nrQyW(q}`5`%)lVJDs zy5q1qjhsLyEQPx^a=PAMQ=!#p^&A;@Z7R3yFYR97?fAF6x5QYY6h8u6Oa+9E<6pN$ zy|Ogg#aANJw-B{je$t*ch6Ud3JCV8rf>SuLG0Z}&$f`)X(98MW$t)e9J*X;zjMWQ) zZ|MWw!R+GpNQi^W2H{nE(CqK_Al*OOgWZk)V|!3$S*G6ni_j|Xorz~1*05S@inUoX zjhUnl8H`*9CND(W-4vu_`QV*leu}ccPnfeh0mx(E|fg!0Ja%H&?jPwA*L@Y1Ob51fwX>En{Cb5zV&7w?G)kplvWkPCu zDm65OVl1NImDErT^23XNwEHmX0*YMF-)+J^wPD5}f!VMF0pkVNgj%v^xDOWjCE^hi zQ?s}}g6eH<@Dpw0CCmR@4>n{RJ& z+(ZRo*BLP2QX&Oa5%OxXtxcr6Io(0z7NY0$f!mFO%apVOl<5!9* zK6&nZBz|=*_d_bAW@Jb;XuT1$eoU@KRLnjP8NXRs#{KqOTXNl)H~x=M)ar{Vmget&EeI-e z2m#f3vnXeJ(R$GCcc_~T$6XsTy2?xUIxWL@g;;N`dt6FCQ8rM8s_WYU1^M6^HczqP z>)5h3o=I%rsA;{V!Hz*o&4)pX>GL?C1VybW@#JNcrn=8 zV4v`4ZQ3%V%VPg!NZCBseK+&wgC1UrEhhYex-uPm%Mza8+{i ztM4p`u8>y30nz2kI?Sy)1sGyV`!h_xHGE>L!Z}?X%KVrJI!l0zi>W8awEG}!i_3-Z zIkvVcQ3}_ge;Fj8zF#|s2{{BaZ(Me>)ml2vw@P9Q<-bx{$f_Zy;uWk|gSC)$u`I$O;?vo#BI5Pp z&n6r~dfI1gZp`R3VVEkP&Q#qhFV|^o$F`!_kUct({=#k0_|%Pb1#llK?^h;ca16*f zGt(uA_BlRZHOx1~*|>Zj646aD@R!Z}s9+tdFD#l`?kWDXN@G-|m@KL_BP~!#1D&3R zc_#zM2>ImC?XVVX_1fc)J0p6ctYWm#5Rnse=a!GV)V5KLMEpP94~9xgO^B%>XGJh% zlA`WP(U#^XT*aUe8s3*2E>I>)ZbUb=-yt?!!q;UVo?Ak6LbItpxxACf8CBI4STSFt zhJ{N+fD6Vr2ep0Y>4&H}w%p`@q-Cc}*`ts)JHI32fOVH&RtbGmXvt*?(u;g7&iKNc z+=Ttkx`@jj9`b0Z!e{84f&10JFe+p{3zBX%Th1VuC*>F0&z3yPFxkQ*zQ%n2NtKuurO{%f$ z26=ql^fel$eLt01e84vqO)o>e4U9@FlnaB^8hR~eI}~YXwY@R&XcZiMTa_J9i~Pd> zLTMq%R%;^x2h}}6RCla!cTd&FO+-Zw@T%QF2b^Qh9qR1Ofbw{WxS^G@!Zc z8Tu|4rrwSa)K%?tG4p(Ehv~>1`1q&MA9u!h98SMq*vt{xlirqde%jW@%Z|UIt(RFd zlk#rAMq7BZG+^fAM~WHsHg02<7*00ap^#d-%{{?Lz@n6Z4K~>S5Tt;N4nFA0y9+-xozmWGdN#^(&0A zoMnr6QVSq7M?_$Ltgzh05zYReP{7fkWp4d~QRM_@OL8q4|Mb-78Xr4@Z06Uy6WrJ^ z#1+3W!0$c(1p_2p79kL!W;X3{R?agq>fq{I{{D2Gb63MEL`MKRnP7`Kfo%!g4Z+IQ zhe#I&5x9u1+X(t)l=^fDwyVUQwG;1~6bYcA4>Fphd|ljS>?d6HDHJUqT&9WrYVM9L zX!!8moV!DjCEmJVkL zW=C@^NP=oHaqopaggw~eTH+Eukts_Il_9<$sP&U-JXacM*94bI_?F?d=45$Ar`Ji&>ti2lB-6BG z^XGUB7rbOF|CzjxjSD;%t1sK;fg_7>^aue5&YZ8yH1GEvx4$4^f%xL=?Ch9xzo6L{_#94i3_U07ps0$kBg4D{ z_CHokwVve!N|}IbI_DbtzA%UKz!&^7><_}-pC!*Tj9cbZiIP*_`KE5ZjmjGGQXWRO zM~sm_sbR|q0wGkgtRk)P>kXF6on5M5seIjgM8?6V4{JK+#T(O)V_)IPz3lfof7@-W zv$3XG#6@HC8$DeObIE#W&$jQoBYjs9!gC1BDSz1>9mKCgKm&o<3C_%-wmll;py3sz zrJXQs*^bGzoC1>eE^c_BGU!chhQrd!mBm?lMYJFFh-mV`KsxR0w)~$&706v zII&?~x1vO!5k)mF(Ch*y_MWz}+b1|w3qWo_kRqF;B1}=gEIbPeKOMhbu)_V^U)d`$ zPUqywbh&otJ`6!ITyEhRyJ}y6_S+_-Pm)f#Vc`iY`Ro8I5Ws-@Us9Yj6zoJ4b=oWa;uh-7U5n-=hj+je<6<> zRU#|>KUCOVATLkZy~{ik0`4{P>m1QWzp@w8vgM`J)@#pV-Rl^+r<;EN=HVk75#>y} z;{jZSdPE)3@p8g$k4mx=-7^rP8|~}JRXc6$VB82d-pJO`YI`mROEcIB3bFV0GC8$F zQDCF+p;>8T3D>FHuP->$yM+ZiYZ8>c8Gd2E4TiCq`U>>+8(*Ew`PB7$S~@ax?zc$^ z0M!K>Oy%bv!fnp?Hwn9Ea^!=4oz8nTab8Fu--fB?(H+|u?q#Uo#doiT4*tBS-HP!9 zmtZxdS1uYJG%CmW%bLDLbiUItdpm`}Jj77~3s&B+EB%xF%ssHx); zB48~~R}$jV?tSOogtyQ7Czs7}S5dbj-rG&vEL-O{WGpCLCa+L(b}05~8Ru{CDIq6I z=5A3VqnxO-Ox{bie*(zAUwz1&!Hvpn#?4|LAPSp zzGCg98^_hwU8Cbznp@R|%U)M3nztcZxi3n0@1x)TNOk80WYJrPtpbB+t16%N3l_%l0nQ}XCy zNTK!3dQQ*sBEH-k?2jhzgq9==s@$zk++%n&^Z0089~kb==J}~?RZCIl)4vvCahzDm0 zIf~ zjVqYSm~L2t8p~{p3aUv2=!q;!1=}5<78XAi3-aqhRbmBpRdOEodOhgZlmnnI7=ONqV zr}MGBpRf6RcyYYQMkog;M})h9QG#5)<_gVk%0qexeT$4h!|_b22!)}L?=9fP-f@Q4 zGonIomD%#risK?oZs@|Sz|CyxtQQ-&El%NMi#qslm1VSojlw|GvolGhqdP8o3LYQJTm}(~&g?S+ z7f<_WT?0PvobIpZEMHIVOH#w!D`7~N+~uCmcDVSAIYNc3#=jJB%43oR&*vFL3g~k) z(XTNXy-L_Q8`vufI&%?dj~Tam)Lh6CZXk%$g|!EtU?W;Fa=DyEl-iYYG9+)_n5MCX zl&AYzLrcLI#Gp;9%~)Z|LrenQBqi~&7;0dq64?(QO@|AjnHTw+fAXZoi%Oq ztV4_#Xtc6Sxj)pqbnCxFXuh%x_wW`)cQ}XgB^(X} z@hSBB?)FWtF6!yAA6FD6<{sEzMlTANro5XJ$^U|O zhEgB5OWwcFWndJGKq1_|G7EoBqEyE%$UARb=B{Q=py%zA>*IOG2`LvaJhHa6@rSZ+ zH;C(9YT+SIqgt9y<|;|h*}0CQ`cd~h>yCYVaPm@j>IjaS4zba0ao$8il2JFpK)aTt zD##Jj4t_PKDf{KZFST98KcpoR8eWOY)sqk-hX*Rx3OZ9;bsrL^Dvi(?zl@B?WVZ+t zqlZFM`jrtB&aw*u80oH6volH2UN(M=WU$G{0X^@12P)CG8(`gF*}*v*mO$TMHo;>eqq3rBJGoivW)lZvX zEuws|7Q+4b7f1QG@Zo`BA;Rl0(#fDjQ`&aw85(bBd!x^pXYtMXa&C2BLTV->W2K-3 zmydfPi{aMprwMQZ_>f)72Iz__mF#=a&eLI|<$LH~GdUHVLZc zibq~Mwdf|YWfIc8Y&?69ruQ{>o!=B=C^6XSCXsmQRepWRcg{69 z6q;{MrXVmUJm-oO){@KMieQJ8>7-|^?`Pw}ve=?w2jdOlA!*yn6WY<^ihqrbgTnp9 zF914rWvX=BJ$>Kwb`+hC?t$PGn|SXSLii&|zGA@KH8Yhn5OWWiLm)ZX(+esLx{De7 zQ&i;0Kyc<|jp3HaZf^2wJ+Y%tMDsVQ`xndr=VT{r~hJ#BI3kmc~qzlw$&{Z1l zmrKO8_MU=&jWhJbmWclFy@R%iq|}2cRL#aurM(I8B4DsRcz8`i?Q=K9$*>K9EGPEh z>)?0rC$(3FShaR1&%uwkx4X2{&ff*jof##&Ip^|IPWHUFsK3~Ut{v*3bxCW_kFp{6 zQP3!ZB*PlRT-(~6b}2Ykq9!f9NZ(kD2C*yB?NAL%urhgg)xKR;Mf$htNgLEY;0+`Un0!z=3TP$~ zJ=V50n@-%KdU(5wsWgH3E5YE)sQNp6Z(47Cw;C(V+i&Ndp>hSvL|EHRGSN2ePFg{^nN z#!Bj%qygmGz1Egic+_hEA_x@Sf}d_bD)SDk{U)&MDY`!X@3?56{GYgJ=qd01Q&QYL z2hN_k;f%m1jtB6Qty^Egjl+Grzwm?JGOd;0Ihz+>@;hkX*K+jOwUI}E;VQDm!sD)?8K1>kLbXrlQhL~n6N&BRhcm~C9UFhLEKzpdf6e~((a3A&0vpu4ueaPg zp%sFTVw#pk|8`FB>6gdyws)r(_9C+*BoPs{KQQ8zQnpOioRlFX)Ra;kK{YSnW8$}n zFSe@JgA0-FM$H=a7`5-K1s>qz47JhF!{lJ*aGH`4v3awyW1|Pj0eBsmDE@qg9T;XTt!P14T6|xaK3&-BG)W zSX9?SdvXSdpd(ac&c|~#q&fr8e-zKEG3eBETzX-*cg)To60!Yk<17C-dKkzSOtbK(eC?NVFM#*b zQf4=}&L8esIKks_q3(sV=>w-5CCM|5E%8F6#`@Lgd|I4z_5qq82>QbT_Q=-`O)25J z-M$Pa1mn{s^`~%@5gLa&%I!1nK~ZwW8+MK#&P%Jzd-Ir7Us?|6quw76hF-s3*ryzu z#PM6ap;U^0kK-%t;m?BX80tYWQPeBL?1*AIzI-3;d@LMaAh=T^SPmA&G z2tkLrgDyT7wHMpXOv*y(~4;ZBN9xgZSF!=z!uFcor znZ!qqEGj-T^xdX6=tW5kvAjpRX;i*W`sA^adb*F(MAo6tpn;8&al2-l?#qza0dwzZhuc1EQQyHIE_v)Nvsa^0BfhV~%^QKo+c(GK6WwI$S?H1i-vuK_|#k!=(^2gx%%?{-9>xEq*5Zq7&dA zMeKO9Ecxz~7qbj^2XFUVc80txT)&D7JJK4B0yWtJ^k3&%_e+YBnL@?RhgGXL?$`eu z$Qd<1-y#ytl1G9>&D~rU!ip4k46Z{u-WVma%;$>9J9pXwgA zdCb7P-5BNeN$5w^S?Mi6e$GbmHsypy?Q|*o9TMP%v&C_SBCtM{N9C;$6vc9=s=HnI z%P`*h?IOS{xsKcFW~IeBHp1YNFq4P<*oj^7>8=XlXL9PUal_!o<8cKC6uS+jB_;eoPAkEpv7 zW>UrYpc=d>3JY`r=J0wv~dP znyVPfYkp4d#ya9zZDuI$)AXLq#UhfUp#6kly9r_3>gqonJ6yM_O8m^Kc}(GCwhiZe z$L&4&Lf}TE59NjUQU#(p&q3}kFg_PUTSdCRxhk``IbX9~PkJW+bcZM0baGcDz{X*v zt=d2?Odk|-VW|Ctr!yD1d^qcEOE4Go0I>~RLfU;4=l{mLe&Ti9DEr-d z&+?YIK?(FiMM;szfsNjIkcw2zSD_ zT$AWFs325{v#V$FRZ}dYGC)w4hVaW#rmZV+RgpYgHRw*eV=LfAHS=gNQoNgPqe2iMQM{yoG6so@3L%!;V-+y4}I5n zn_9AZa&3Lq(eQkp%ge@iU{?#;Lw~~K9vqAsn6FUO#y@fT*Z?84UE^FbaEh$xKunz$ z!v;bb#tD$gKH#*Trj%(NgiN2_SmWV75AS?cb4xMZ4kfsh{^y|>mrU(PAcvv?1YE8@;2`^0&tdXMI%uG5Y=?eryg2g5 z>i|X~Onloi5jWHjyE@)k(z@xekYpyd6{AnfVtDd4u+f zHtg1Y{%17P1s?icZZ2G6u^js+-42g0q@^~`C~sIV_r_A2cAmYAm%2>?u1bCEq(*~$ z)u{3;xoc3X%8OslZkJj%oL3cY`+bZvkZ_GpBI<#4roqf6E5Dp*gZ_>f9e zCrW57oBxgntoyKJ$?fFeixI^VryS8vmPDYc2D^<88(~HJT25E7B$z@qZl`MVL5IVp zs$hO=vI^~GQ!7}CwY505Q)JOwy8g`2r@HLiUu{@?FDrS?!kerf63owK*9$<49)=r% z!K0j!H{TBOvnWD#YO42ErmA)qP@5h@@fONvb48fS2>YMfQDh0M9WEjq#tWK%SuSEU zla)1Zsi%*{j0*R(a!Jr}H=Q*#3qJhq*RhwV9Us)Sjd}dORU%smbP$E&?TfXS5S|#L z;#Hg)!PMXDsj+2&rtF7RWEU+=I5)JnFtO+rFbcejHt_>uqp^UqM_+n!8*5fwz}=xV zdeIIOg(F#S4^eATr5{~`}k|63k}zqDLH?G%Q8WX9h8 zvdFuLjTFx!q(7Ru+N|fjye0HuO2kHE3zizBa9q3(Ub==Il_g6ZKZ9n(p)}a&2%P>n z8-ZJU`?{Y+SI3+uQPmtZ(Z%YG5+41^7(e{ZJw>D*67D!*MAN9?;u%+@oc!v2dA^lR zc@#4Utu8h^X&vVoi0k*}9d|;hII2ykx1C#iclkCoB+Ac7-bM#r@l15H=|O=K>#D*D z)3wosV3*--7P3p1XIt}{s#-)3i0V>gE8uL3GxO5@Pqc`Z_eb>?mCW&D@!UQzDfkt( z;`_y0J?NkGvkW3AXBlAKyEls8I>WJ}e*&DMuS@P6w1-hk4k9okp%k53cr>RgH|meY zU00MU{v4?bys^QZy7x{UN)}bC494VEf0RVS8w_&UJa#JsGe%!hRyh+t0}5G*)d`8; z4F?|#Qts_!=N>91gks*tvM)TnbI+P<=7THX0lGQJe-H0$PW$EuHrgipT`N5!4<)m_T1+2JR5Q8c?H!{x+ONGR9!xim3byr-a7 z{KreT@uH+%f%zE=gbf<_{;SF!6j7#*QH|+hE?ChOH23&v=0w|y^oS!yZFlO(X&kL= z!pH^6bb25zX&o-ayUexs^mnx;iDnTFD|hri%-d@Z<9Ri6_~cb@4AJ}2+@*6~5C@>h z86`G_JrhU+`+WCoi(v0USH!#VHh|_IKF5hG)zkEIzDHqdezB<;QZ=-jeqiPx@fS$( z6>9=#*7_>V#VSH`-pW1xIG|eKvN_&+N~{Z4K7p9apVUPpM1nt~YxhcN1i>|dC{m&n zFcNj44aX7oxF1o)0tHypbROkXuUdDg91=XzJme^=BA6r(mU0j@5q5h1{9`krMt?;= zE4wg(^t7EF*D?@=m_}e6;62{^+NGg8*OX&Il%*p$!xrJ8n^^h#wAL8dhW410>x6Rt zG;>i`NOh_BN0$CoE&b0?f~wCib8#h=IZrb6$g^TKzj#vYb7uv50pMJ9oKsl!$xTFh zX~heG?A9x5=6Y`PTdh%CgzxGUp2+|?54w@)WVaU0Px+QOWjCM?OLrFi!ef@zHb0L? zvZC~n^-GbH^a6sQ^ME21G2SP;c13D>18XvNPq8^TQJT}==Eub~soukg(}Lq71ykz! zzc_~>-YQ4)!Ln<6?`=F}TKFC8%1ooHX_ILEnlP%6HWe(+6urZ|X$64q!>?g{Ay>88 z!3ty5R{xH*PKjg{pf2k?{??i(q~q>z)4X$)T`|0!$M0yV!0m2*teKm+vw@Y5QxZLI0=vcD* zv7D0*PPnmqZdt4&NRXMTGaF5>Y~0s&RYe8{?_w$h?!Atzr=(Ea1iGg^FAN=drd|GC zfiGw`=Z8Pp6y5+@*%wy%*|I&~^Q&0KrSn*EmYMF3{;<1II9{H7|g*A zpWsp+_|pKW4qk=`mG)4S8_|vuMc2K()50pxvpkMALjQ^LVv3Yu$_Jpl!&;p2l2m5-4^&6%`_GOUjk-RT)hY5jVxa z26BEfBH>*=pq)D&dv-2?e6_KLE(2z4GM?=1{GmFz@I))mj=6;ido=&(Z7kL#Vol*ZYkt2nspLl znsDWW$WryIOr=|M)jLfO>#nG2(^*i?Q*V=4Zul-d*eJk{i>Cm%QdCrCm4Z&i;5VX%tqayM~3x!bbt;?M${n%ch~5kU5bLG9Q%pbkrPS%mxI(9wp5BWMYkp6uocgPwbJ2o zbwpp9Z#~YwUC+04?TzjFt5o~wEr$j~QZjYp?%yS$U0^fI_u<9~h`|xrq)v$f2F3A+ zBx$U{)RJwEqe6Bz6aLzNK*+-Q!Z$8Z&?kkpg6pN|e5r5x1;ormo9YSJPgNU&#LUi= zn5TxUp*|=ItYtIJ)))!ajUSDR7Yvof0rs&iYTzY*h3E*xFgFj$|(@n)nGzdBcJUq`R`q0O(4|4vK% z1!wrPhHt05{9nRLavn=M73HjZljy{5ZZFHx8lC@A@!Oy>uGVWeA`NE}qvOm*lKct{ zIqkqKAbYH+;f_3_Or!n1j@Ju8C#pnLlj%_*CqG8kslmre$Ti~QAPYim>sngPuXVv~ z{0-T`qfih+#5%8ULo8d0q!Vxz1)Tr|za>JmW%aKQWNAdHzTA-!F;$=Z-23swM;jY0 z<<2v3`f`(=5h#hmQ~F)_{&@4QV28>-utWK!>?QeyjcwucS?515beuDQNW8x}2r{q) zbcXgzSZ+%bf7c1Wc7NuVGdA_dlFn3LU4+<(rC1xl>VnZW4@;>z`Mzt_p1|c&^+0bo z_v%?J2t<0mcXSdznuY9OXLfrvr`HXT9K6}+a zQQv*@wG{45tzK}s-=zoAq3@0G-%Dc3LE&4$HyUkL`_>zAyntqMDBuPn#N>|Uqb?l5 zw4?KH=`c&^+uADZi4)=uE{b60fgro?XdFp*wcrLl=CbQ`X-5>Z^~xd3@8Vj22A1Ej zFOh`aB{P~DqR|;+c7S(NK8idru$I@xNJ7ZO8o$kE2MLDR%qgyt$G1)2py3Eq{cX^k z_jZtGHOd)j&}|XF;M;g>px*qQX<~8=CEj=@Ia4fWC2!o~hKLbs+(H8Zwys|bWmLxh zW}(cXaj#RbY~jF;G`yp9`U#K9-}@Ijz(km%&+5#Mv`i5yz=f|m6P z7ZK4b*jjJWO=F!QGrFjf#TRwKO$9sYXAo0)Arul=Bc!gX(rar)16MJh8^PdS!r0g#FU(f4njYsqFS1~-cX(l)4njSxwGmTlk!C!Y4rMK9buGg!M)y3rSJw#pvEx9Q@ zFwvH)Dhw-mJ>1QR#5|o&@z2xx0G;{3W%k_axYRRhlwY)R&#H19t3va`fRw*71^cGk zXbZcgOvTu?+m#)vfMmg4QACXY!+-psy7(q!!wTMhf)i1>j>L4*Wzi{s!U`A(o2SY>zZPfp*?S1Y;x?=P^-CqzpP9!aeh{ zC0NCM{PPf~;G>=)9c<`az*h>g9QD%lgl`Dyxk!F|8=B`<+Hl(Y!3gUCFM#Iq75MSu zxG!Vx!!bXD_;?eGp466v|FYu!-Qx)C3h9tqdw=sKpVWR`GOYHA{y=K2sO`JQv^fZ| zk$*Nh_S4zV@02E3?SH0yzWcQnI5Uoo%omEJg9}h7FU9z80-LEInzj=~OGD%9A~tuK zm;u)Hk#M~9HH$6=1_tlq<~YsVu{Wlw+Nxtp4UaWuk0amTbkWbIHD37jK56y;Yd6j_ z03Wvfa$^2}n;cg=+W)o5K@N=}^PUjW$y67gzlM22lp>H~_<^^lBAZxD@0hW7{^zn0 z-o8r;>QzX#z49QH%U)F>%rY6!!ntJVH(UTdjgi5d6l|Krdhi{eg9t+&)%4$Y?TqVT z9x^rm>s65Y_bMn@Os*PcSjtc)K#!>at5cAR6*XpebhNJS=WYrM#g-#LP`#*h_W9z< z&6zsaF#~VHp5YnyQ}**H)h^ACx0cze|E>DfH`&@1D&ymG8YjY0)w3Fdq2wh-^L3@B z?q(_`(=o}%eXR`Q*L02t|Ulg*Nn*bCLhSJ#Z!`p zOwe+|i;?bSx@Yv-!b+SQ9p0nvdE4tmlg&m)MglkA8Bnwoi3SUG ztP7^dfi+vZw4>-T>`MeG_&$h(s}sJ)Sn;0bzpTX#>2;wKg@o#j4<>IUs8W^v>)Bs2 z2$Gf1M@fv$P&4VC9IShcq~(HyE8lO68XjyY_F$2|QKGQ-Aia^eVBulFGqphgT;+;Z z*=Ksqb2{RQKEy;>D-BePdsDih8Z8}av<9zq#^maNp7gO7513bVm6M%5%KaE>y-gA>K)>N2@V1WN2_7s-aWeSn zRf*vu& z%2sSD&;~k7A5ZRZx`<1n2KC8rJ%V9IO1&!*AQ-7!A$zOi45i##eGAg7%MidlXGW!C%=HUFYk%_q@R0G{7!bzr$+Fg!0pyC3GU{+*3 zRMT|0Fb5%ONm_O0-Hxh!%Krx2;~;?E`E}>6*hv3STh>oFW8ZGKgHClo0%Ti4A2l_2 zqSH?PR}+llmTQEzgc9d7W5sxdIbX4}ib9~j;mck=_N=eRtVe2Vba-a{D{QZyW|nk^ z4dgwW`t=IG>V(~`^a~PT8)51VSzZaFkegJoWHV)@JEhnJ(XQjJsSu4X#Y0J?I|UcM z`jZAAg=cV%QwrE{4EMBpG;Bx)#jJyt_hUeg1vslRwB79vk5`=4&;a3bf1_-41_)ig z#{+z~3Rmrqp9G@HLU?uZzuVZsB7a=Rh30|tS&Kqy;UvjG_+MyqmgeTS<+m!L)bSUO z^;xcp0rwRwm>tF#sL_-0~*hG34lz^SC zT)kI}wFEcApL_sgk%QWwXsPo!d7`M2!|-`WM7Q+A!*G4_IR1o0ZFXWG0k=l`1!Yc5 z3@?v@#hCZ<@$ZyF8qA}eOHVD~V6W_tA^__AD8VdWpk7}$(Z-|59 zZl?Y#LpN|mQ?3<5Q58H?a6NfV^;=?EktJ)jewN#lznpZ6oNK}b-_p>r*P?>JyzS=w znSCl|TplI7pAodQTgx{4xSZt5r1O57*YF4(HaF`HvOt+nRmQhe+F!o906J6Pa-@65 zK!ZmEdaGu;6MLnm1qgelaX)z&FehM6g@yR;(b_1qccJ5@o0DmY`o(OO+y8}~V z6>cvlU)G=pWjQTrx|H@}sB!N*JB5B?9Ok?@dZ3>P%ky0YyX_TWC|W1x0Q2!k!W^|A z9~KGezPN26nAZ|n2#~No;PVx-40#;E&u#p-CagcGwba$&ymR`xYqv5G)Kbyl<|W;{ z1i12vfT6&i2ARluomYEb@zq(A^asg4kxS9V&?b z;5}t_-N`MmIo&<>1@X;rX98%1`O$0Ao9-;bLEK zE^h~w6Zdmvyp~)mNpy4Xm&Es%PpMapz*iG_cGzVEo;ZcZQZqq zOweE`sV|_PQ0M{S>gTB1CtN>6kfv2E<<++gRL@;xL7HNOBBr4<@eXirfPXMiPK#TJOPf+ji6$ zslt)ocNzx(*1ARdmMB%x>gmZ3`}-Hqcc*^z;f6ihGx^F|I+mimRf#%4_j~AZ#vDJX zU!`%~h|W;tClV8-b;ENTO1(@Exd@-io#EbF`N7khD9o7v$GqTmc_t8dfDangay2+Q zqa^y`_$}wF?o1e!x)>pXdXV+)T_8_Ujy1v21`LMqwi|rG?29~G@@VPdY+!LHZ79>O z^}~IApcxZDV^eZ|AiNTk1=OQ&4S{3zjEqpNd#P4VE7V0C@CYP@G_7QS11cVb7MJlu zvH+$Euw1E**3{dw4#1L-3_`8io~$YdM*X^-gud%4D{pP}PEbYKl!(d($O4 z^dEj@JixE~CqP|gggDNShj7F-1P`tVA7QR47ozeAJll6XuCpqSvhf|UgIwYoZtb3# zYv+LK%fiG5X}u|i){=H51XH5DrQI4Ovb|hSUkk5VII2EXq|8&7kOA#?;zt{NW<=Mn1 zc4OfOux~Pn2lw`rCnDZ|geF-!dW-x@XjJ}3LL;B@e8&sj*{=GcYuO(A5?>8Z%E%b=bMpLxTSB0%;mDmA1VC1?U-i0!kd}AaK1|C8qn)v*3^;jF=-n5g zs}=5%0zXps$Z>6Yh_D^TbtqR>OK?KV(3Ggp+%iR?92x zUt_gXFL4fbss_^)Z<0Ah$9u=fJf0Da*x_?r>Q(7~l69N9C2`W(^de%0kW$Z&`hK1R(-RL-78hQf zS>E>gnZGjHLHBkMbcZG&k_d-?%cg$pOzM95^8GvjdtD2s6pv^=UAXoex6&uo=Dkr;gt69u5v8yVML^~a0*~vb`lRJ zK`4$hO7ULc7`Wc>0trqKc!)23?`Z~Trfg7b(Pk~XgDJr?&X9}TtuSd(YY>=!qyuxE zu&Rlf&V$W>6*6!|IC-jrM~DX2hx&Fu^miQRM;>O>CXoKhMJ^0$_Q_2!T zytWW>Jw*$8HOj+xg>#F4&*+`s*}o$QuiY5- zioVU39@euZm4=@Mh(g$THCP=Of1xT?|3X!q{x_&fpX%RZJWhG>_UGM!%_M1Pm+v>> za&>vT(mDfrCv3ATt@C9_-Ql(2oUDU-=KG-^6;`C4uhe~e3w+7?kaCaZU}h$#8C$Au z&FyE-_UYQ;_~J{FT(XRpoZ>DTPj7vsd(M*T^R#|n+v+m8F3Igca9Ploc-A#`0g}`E z+G-?Hq~x$SY24;u!7-Q=s@J5o+`gUzs*|18_Sa2Zt^t%XTo=9-vv8%U@xNC`vCpX|O#Q>8= zCT_H`F7^put_Ilwg_Clh&u-R--Nk%GJVQ)59P9unwloHfRA!W!2zzY=NAyN%+sYUFK=ka}7MZ*q9eXP{-@rys!$>-WbyW9#(B_0-+mJLE$s|8f#8$h~ zY!X+u=?eVD+ObpWZT+mk+?+h9qrUY{TX%#aM6FNkQfKnmF;?qm%1b=17>wzb=;_9C z05AWPottmLk!Ol_D&^MO)7cD~w*&Og;IYnh?L5 zopx%7yPmsW8Yrrg(5!maJ${eMV%?{GHT zK5qPORTVd?YP3dLT3WM8?a@+Itx;`JwQJXi86!rO+Qi)Bxwtk&Ap*fc~;jxx?}JmBMtO zIO#nvt}3tNm|FH6nVx`gQ|nq*Ln(JhjV|hq<}zg*w$pM+r~e>R6qC{ikq0Ls$Fj2OsRtSS)_IJL^E4`_TK`NU_Jk&zR+7^DA0y-+pLOU_ zo+aY1drUc7r~frw zK#VGm40$%jGcpdN6mr~t^TyJiKfCvQ1s3fDtL>192cj(O>n)PGWqI<`IJCm~yW#-ApSkTgt-C>%jVNW`-0&(;`DIQW*fe zX55!TeL*ws@Au&M99GE5xPp_qEd-12#|~u-(`F&f^5j)G+czZG&0{Kd%dK`(CiA^8 z;;hCcK9Ms(@&(2WDCO~ILtne71z(+fsAyn-kVOC_kE4LEz-gl9uSge17qzYwF;tqU z0XH$6fFN!?otx?ucS#R)75M~i>P0*1q*eA!_xEe`H~MsN!b_6 zNL|g^{#d|SsEBS}$J9Y4(7%5y*m#upRFM!1N!+SL!0oFRgV9IEVBDV-kD@FkH&uEQ zF`*11u^Qq#cj9gbWVg4O+*jK1a0F6ujnAXm;<@S-&UXAqk#rn3K=QFSyB@mI3Nr#t zKU~SB6!4)a^wjbb9Im1UnFT(YMZ-_$ zFUwHK_|?DtXT{vwgggrB^S=Sw7em08eLu{W2WRay17i&jMjx|Z-KKjZGG{oFrnxM(X8D; zpx^A`pd{v_-&>3w3v?PJtCen->axFekex8gG3)yRd>T{_wL9~>KQrsT@?Z-S3PDj_ zPqe+|jR!Lbnd7)@ue7M9nO-d|;HCI7d&o2IUQ@sVIo{+0XvQ|V z=J=K~FE6|W#3lhFc0L+v}k)un<&zv^*$>MqQ;2KKw$jv2Ot9Z;i_#lJsPj0+7>cb z@FTPB%K^w``ujQcoJEVWlUQzJ!cxcpIV#GZmQW*!tXNSo@+T|{lmbyfbbaaI z({qPO($oG?#9$Q>6gD3(mX$k9znTeyw z{0{Oijc^=bMwl|8D28rj?A>qa8AQzAPVGcX!984&vN>;lh0zaizl5tN**Q)Qq7zz zw0yN1^hRsmY^=}lsX0_!Z0>ipXAjtu-2Xw#&EwPfWY%WMLA(`x)qy8OogrAjuQ8_m zB@}fOA-9)dH0sdUpNEdICB&wvW$V zYl^G2F&SY$`VAI2sPVEqzOA(W%tg0E=>zdnKeGylGr1+ z^s);%8Lh=^NEo)Z-AfjG8povZdH1DthSZ*zurU+2vJHV;@>Sr7sZx%Cz?P(ar`d!b zXl(p@Wh>2$@kkytjD4>c;&Lf7)4gk5=ja3NGFU^`>L&ov#f4p6cQrjn0!nG_ToN~O)1Q1fhc=s0NB2HfbCYfCvf?ls zrB*ndt0gwf_lt&AJP^8w&pyfEbayQist|G@VTw82$E!8Peg<-)LzjQfY|U|5dG)8O zrE5z(){u)AF_wX`}QrUj+0r1iNP(Dl5=iQFEM zh`2oe^%T2zN8u;M5QZG3#Mos{Y`H29*K-P>WZ9+GU|#WQP!12viRE!{X}93j%vg@6 zQ}=tK_9kK|hJI4A3e;io6uZ*Em9EUC;29k`@gIyK&}nEWg|rmkrlXL#npx$6j2WS`01 zihC=p1Akv%q|6}O9u?UDkG&9r@B|B(yH|kp*L{kr~Zf!RjCp zF0@@lNj&aYbyK4KM*8c>hNImM$Q1YNN0XF-!SbfnyOucjiM<1I`m*lP#?KJ0h6YAJ zdKYVZu{IA3RtA(1sU`Mx-o}|rr~l@8T|vz(>0*&TJbjVTr3ohY&JFex1O)LX98G#q zXfGO_614SfyLr}ewc`d5$f4h9ArbLNdIY_0Zd}$q$T1luIqO<@y4046b%-MJ-c6_C z@Qi^%qwH(qh_6h#F=lw#xs~onP8=@EF6hKmukB|De7HY7*W}MhDQtU%a%NWFI&(ur zX4}#CF9>g^Rz{=p!Tn^zFSOVF!xcJb*sIBX1CYtJgvUo|z)`e~t6-e&pYRBl?Vk-b zHvpFbc@A?^NYrXUm@7`|U3WjZ38cT`$EX@QpQj^H*E1MKF8OOld7nt4{xRUUpu_iTYZ)4u ziW{;|KmB$8ov=Alcv(t<<&)_}@rRBkqK@Nw>0HY0t0YgBRY|nx2XNR*_6m(b&>cm; z)-kr_AJ-FUBTRmMIE2+@7bJZ~br-MDL`dbgSxA726cy%Yks6X+L2}4hl<_B@g}~|Y zN}qc|8W|D8{Wqr2Hdu{0E?nq^>*o0fM#-#)OHb~CeE~O;!K#oIq;ik7-$JCCApHcP zwX;@(bmV`TX0!%w*;!LKQprPnCYy=#qIhA96T`D?U)~f=k7{u|?2d&A3g1LDN2!7F zwUBvP0s)n(AiV8(RKLzRJd{X2Z1=+5U6Wx>&T)xI*9)cFIFIgww!T4i&l`&E0Jaxn zQ zczwyJgaYgj_L=9}e;Wu{rTC$DIQr`NGUv3-h)aI^K`Jjo z;116x!O?xl&)EDu9WO#2kG0a*2gU(HZtgHpuO*oC-04|oE$1<(b>z1OM6_`t_4L8< z8~=NTCq0e$=YLZOq{EalK#9S|Pwc>EbN<+(IDCf|cO}z!={-{1znf`J_$QZ<_5f*x zrQGPRO>BWm5=h&OcH6yY#`FxjiQB}4EEe0>Jf7pWK+om-%RJc!7y>h*7qJxJ?&Y>W z8ta(Epm6b8f$(mhsz`o%lW(i-R;DHQdDUz}FX4OpV@GnL5`5n;3-fHE@#?CnP@@v+e4f#xS(Ijx1eh}IB?pk3W5ZwQF znDSz7&JHU5==I?ohL<0J_gB3KD0&*|y>o33t`qWRDwq+9Q&{ z_!i_+dFit&cW?i6{PfI(p}5n;jKSFd)Igov)$uHt-O--m;o4NkPNC)U8Bc#NLcV&y z$GcFzRo)7qdR~R^TWDR@kOY@%Rb{*Msa=fprsn{Te}|m4#REN-Lu`0mrwUxo_7J~$ zB4`odAIEn{)bcj%8=wXWrZl#16bxE7Waxs{)3YPm<#`7?b25UAvO z;U}2jBCVP~Vl$kOkE1cO?j`4JbG?!^Ql$LEoa?diLTt}zLf`u2>X^8}UrPp(NUqbv zny^IH2ua3#y;x4!C0c%Tj$>M;<(@@7gJUE;BAjLZo5}H6k?dxL`Q8V6C}o5P`-}lj z3|Ibw_v>Rl-kY%-zg$nz?FSo>X@fWbkq0uRe;@*uJx@lQcr|r_gzh8OzeFS+N`{7j zZsq-*y1NwmcnRNh>R5Xj$BJD^Hd!K@m$4`Ir@_6iK=P&^7Rm8thnyOjOFX&!GDgY5 zcDByt&THqLbd9Icx`yTE3|un)7h{0u{l|Mu z+Zy}N`ny1GlmT4{3h?Qnq#KLlWIF>cUDSH^&>II+fUfTdreWn%%%#Fb zvhYyQDLIPOU_&Cnl9!TYsT*Qakm0sO{Uc8x<(}eBsb6&90&CC@@J zd%oN7@pGfcg5jMW-rq0DA{1uO!+S?{hm5gA_lsBjvSIX!t(st8@K|!97kb^VouxVT zkq=T9J*^gaHt(}fhc1e&@r%p6DtND!E$qDCUNq_VHF-=N_e+3oM}KAGz)XKr!xKMu z>64Vo8P6(huVb@l$l~WZq7_p;jh~Pk{28+$?-Tv9)pd>;b|xDJ`QsRf;?$yp>s2Q7 zITTt|fO+VU>q_oETIpoUg~fKy*!hnkYU5{T$v@WmaN;evwtbx@bti(#ItX{`q{1#N z*mDHEYGvPn=wbz|F&*vN0(%^4daclC%?63C6qU=v7qc6+X`Hsb>4%YHeA#ZfCVV18 zR)(Iatqf6e5e0sq^43X=fJ6J9Z8zl>o~2eH3YlWya4R9wp?U;`+}b? z$(+aFZY)1~2f{x#^eU*A+`_OJ+r$$7RO(+^`6>c~%_GcFHr6x;lpG}m-{!HU7sL2i ziJ7U~)dc4W;27e3XZ(Zj&$KR;nWyevy$@M+HW!QRDed>qH zC4o0BUj(qe*+FFEJ;yiOPXo7qt*Eff@c2G#8CN*Izd6^P`&BfzB*NWuQ{a&#?zwi; ziYMsS-nr;9Uu5<|{2Z%^PXNZ;8w1Y$vmvG}47jK=qHVaBgExwq$i6tH!W6W>v>^}iwrPA|&H~8wmtB-Z z?9Jai0FvP#f6q&z7Q0q6c?hzAtP+res?mzOJC2!s15ev(kLUmFy?p5k4 zwtX`CG#LL|Zn&Eolznq5R@S#0tH28zgC{EGINpeim7{g2|04nas|oGB<)weqKO!o5 zTdL@MPl?JlzL2*+X9KIHc&_Cbk(o(W2sKPMjjT+V%HcLKS%;^X6JvxYruXPRYqh8? z4h!G#y(arwV%h@x6d`ouDX+ZM`5^^J2sYe3yW-FmolLXYU}@Z_b!DFM^gf`~-aVSr z?9G`0x+eSxx^Qj7e|0Q-dm)uUcsepd@?(mFIC+pZ2LAlj6YW$;)xoT2_}VO&j0NPq zk+arwW8WbZOIoCzS;R>kt$G=0@V4kbgSgD@%gIK`V|q-!j1*QcDPH(#kc_d5@{e(zh8iwkkJTUQ$D&WTE`BI9 zdVQMi(-5&AH-F~R>9KD&4?la9x4^^d#YS`RfNJD}+>_ZKh4u@K-fgvh(5ydhDJ7ttKFMysisoA%K{)GZDeC@!} zyfH?+V77DC#&e&)PB=v!8sftnCWS7zv%b6^sJJ(yjY@Dp-M-4)_OeQAU~14*{;%MJ zI%J`=l1yv;9psgPJ)Y24GsH8n6iZLL81YHBMJJ6w#lnvk)Ej}BmkaSj=G^NQE!$CA zfmkHu2$-~ck3!={&Xo^7pZjhcMfLvN?Qj0P&$Fe%_0{k1y3sz*(%W8K;;Ao}uK-BQ zx}Scw%AKyb^t9p2QIOu4E_=>zrH5(5#rO%)v5wlfVt1gAnz$`fw-}nEMzA-owFgl%oxQI3;P6xm6?$xyX)t8y=Pc_I z)i4U0%n$SPRjzi~{TY(WsbELz+3Ka>YUQ(R5Pwzpt72>Y@HOmrT49TLuIfAu z=Rq3dUS8=9W%LD6Xgeha+Qb&GDC3ep0bWUwZ2CBn>ewNDH*$-Rr6^}^%0%P`9cO28N!FwQ@ z)Th&YlJ<(yzPv`zxvv5$q}Y!f?7?X9x2F!k**VmO`XALtI7%ZfKz7YVRM)L#JQVAA zV-za0dA3j@|H?exW zGcrvBt=_$lB$?$xFNqV3u0eRi5wz50HiUxdSo3-79)9_z|D*Wv;#LZ#OzhQRgdwd& z+!SKLn2h~v!cG^I%V1H0b&_3VhbX5J$Ea)1{Yd>tv9G|0JC?XX7NOM6i{&B(tgQH} z=tvoB##B#UZ(E?r@t1kD)Gt-r1vUCb{m%Ba8$CkMnP#4LMw`j0@6?|ogbMdiEWQIv zfelrMhuCP`lDB1QXkqYnCi-kaxirSf{_FI(794plK)oyTauiD#3Qgdz|;18eJMV zU#0w#%rHMjsMd73+nlI(M}PAC1*_|M6)JT!zu8)e_r8+*bAn>J)$!*>#0_apPyZN& ze7GtLKvnL%xy#?vV05WWLF*XYAl^%PxCan#|?+&!SjG7i;2m zkG3IlgklJ7_QkJG;Jc#*+>0K1Vs74S%ZnX1E5vFLv0 z&vyH~f0k`;+K-=fZdSx>v^jM#u=3BpG5Nu-*hp->DFmlWZbd#!^1#RlN7W6 zdgPc>-aL0Kw$!F8FF~NnJijg3hgIE{xR?%~q#XGkPlu?{6lpx`%yJsmD`dBITfXb# z^C5NlY0NN+M`-VQr#!*^FpoR&1NoiqV*mTS__f}W;->?9cat|gqf|ed*Tsj@!r3cl z7DrZPbIIYw99W~3vgv-G0#>;b(=LWcXjEoBgg?IOCmc59u_}Ox6=r?iLxqT{n7!}y zYvqKHcg}r-V6TDKRY%r9m^ybX?eo2h3&G$cz_V=`l zII?4p<88q_*?Ea2OJQwApsM1y*O#m{RVjS<>L1|IO|9~;XB=tJ6M72{t*Z9g`~=R_vFCP=KW?=1 z`TDG+(}QlaP1;iSe0eB zK^nL%RKNV5=o^`NCe)UFwyc_O;a|h<8U2b-@`*@3NXmKoo0D=iOT<9i+C{Qyg21GU@rn=OH`DpwtjO(OnqqLrFkfX= zmpeQ581RA(Gp{>Wb(lkek;x-7(b<06ZvtBFD-oyw5##PIJ0*)7 z9`rFt^MG|6oiera?8%)9BB(>)D{xR;Y@U@N`dFf{spF)a6bq3tz9nLCMV_?$K}TY3 zs)CZew#-5MealRB#3;I=+HaFF-N(4|FoQj}|HQ0jPua;n$RUKbpLMakvnRS}fP>niio@B+R`=u3>dc`&S z{Pyavn-VW6J2j`4iupK?9;EK_EUAUa#QM-Zq$@iQm#M^mSOzC?(d?-4{rKm6`0PF} zw}{!m7N+K*bYnYZS84dnYk@oc{Ck3-b3Kj^I+#UHN7klO9_nx3EZU<_bNLzd@^b=k ziW;2SpsT|Q!$7dtZUJ2I+xwwDOFFF#wtKT!Wgrb)w@x&w6lle)gP={BliLUJ_vgU zTB>c{xhW8fD}aPo^`8d0ndxtQ`%sw6Grv`VXfRwmib@5z%o)H>7Xp2)g+&ZwqR6EE zpMIeVD*H5@%HLJ292LpG6BM;%`~;Qu5`?@_IbWRV+50G5`>KCdd|{)`g4cQ;9fJk9#6_A2pR>0K)p))PVnDa+T1LlAbqmV}Xm| z0CF%`j={!y87TPdZbajh|#4se>OV>J)FwBszB?{BrbsUHHZv z8a)GF=majmjK3{6`b?Aak5Bw&&l5jO=?!isnSbts-2QsF(IO^d(GCgN+Z8!z6Vgj8 zZ>IiZ?l?swy`(}_=6*`Zi~QQu)A7#6hbLxOLLO4)=OQP#aS(3pyZd?gYjZAzRocgP z$>H)3;efwig-d{%laei{R3(?TGR9rnKJ@k3vX`lQ*!QkF<=8(PBfnCWo|=G+Cx$8R z>HkG4EB=R6o?Im(m2ex>cRm?xXIQrLUfRt&O7V&uGJ@`>!JOZHwwZ@F`n#R(+rIgC zVp-K$_h?)82D7D#+freEp-aVD|2*p+x>$*FjkaFWaQm)suUP4aWH!u;MBq?(R2)F- zX!P!HUhhX1--AK~JbmQi)Yyk0t8_0wuBNO#FFApf3f7p+1v>q9b0V*QK09$iB~Z6{ zY3zM&0i?!=z7`iIgo2R$I|g6EJk!}P+Ncmng^x`iNs5=JA%#Ud)R%U$yDRAhR;quW zjrM<8_Q@NV{BiCezm)neZ;r*pM-A-cHP;8E_U}*N0Uqy4Z&VAckySe-nT+T3r@z;U z#GBsr0P`G`B=o(e$*!35pxJyQl;YpLoxj8QxEMMhMGGBOeSCmu9~4&uIr#7QcS|AjIXvF|Y!L%(b! zZ3w2ZMZaL}mvSK{Q;55qzktRrshBIvFl&PI(Nar+l3ZR9>3PgHsyzfF2407YgCdOV zxuz^|HoS&O3Lan%IHUN*dl?JyYlr-`LC`|IkyY-xB8Ktt+bk*SyPBtJaB74a`s6>y zJA##2p@8;OG|zmMkhXCDikyu_ll>tZfCh4-w);hp(Al202Pb7W32$Wk$f2(&wqdMO zpdt)>P5t)i^&##x+&fC%%W1lQEFxi+X+Qg~DbbH{)nZYCyRVKMpyFpBf+4dLh8!AV^1T_T1Gp z8S~@rP>}V{WNhOSyGm>vDk0k`@m04NgC9}DEqEbFkdOV%TiXzeqsjxTPne`x_V`P~ zj!04W&^K7mMh+>O;E{PWOEuA|r8@ZLCXv`!51q1Q-pnr*Co_AD*`?pLU(e-yRDIq> zVLc`K?7-we>$o5KgXOc0S3Iu;AH z0rHeFq?*e<*?kbQtFG|4FugS6iLTQFR@E^1y-qh-G|>6dxD9iuFdZ$`S`yEoIm*qT z{mT7fUF4X^=+nrdcT`rdz2c9npR9!+6}l`^uF2x_CXQV4ho-Ij0VLL#+wD-cBDH-8 zNNy~mwo$VjV`A~sQ?@nMx~?OzYQ(|lb`tfQhs9|u{z3kekK?NAyJqZOn2wXa!=1X8g=L>% z4l4rBZt!k~gL<96U$b`_^v=ASRZCML{xs{npRnuN^h9@jvRxg@To2d?!WGw6F=%qC zyqg(ka{p_bTlMuPSPP_W4IYgx*-3SQ_!~s$bxJjVJTfs0tg|DXWPP?B-w+u5wp*(% z8I9?A?7s*=w1M3|M-~YtV1Dh5cjr$zDgkOqKVh7nQbO z|GPSR(`qx++y4i)D!%&bK&N;oa_{U8WvZW3@0R{6f(D$wJzf-CC!b6=HYyi|8Ljnn zlW}1#_dL_KY;?$*e;p`75>7#FcW8msBQ2UyFBG;8zV~ZwQy=+QHb2BqHyrfj^*u;_ zA%@R?i2l~73a{`>aF9;?4@V}+B*rhzY#W?ka=eZlH+k>wjz~V$?EQfl^>e}8!5X^G zv8O~gy8;KY*Gu<3?|2^6!xkK{Hn==O8C>>csoC%;Le{^~cIDRISD?n{vo^B?Q(@I@ z=$I4kb0}@y_eFzU@3w+$2Nmxmfm6NNp1MC7$hhcZn9}=B{K&OZ=jrFUn$j+hwF2&_ z{(H#x8#5Mh`xJ(eAPsC$CM&x3LnXijX=K>ZtH8~WWsm=0bB2@GdjCv%4fgLjxad<& z^U^_LNHt=&+5QPDn}>D&FXJ4TkM-p0p`XmT|+J1@DsIop@r zLIoC!H)gnY4bR{0j+#iFQoEc79>?a5*)w*TtqN$CN#3^0PfhGL;Y<7- z=xqBm?+<+bE+ethXJx(pyB6Q&8-tb6pw5WNPFY5&SxG0y<2Rt&J<$zSL|xhI;c6-V zXIOy3hKOzStJG&(D(Sy7*Jb&qblS*m#|-L+eiloenPpLBwgBJEk8ol=@OV!ag`*_v zFul=QrclI9hsNkZGLdWSzw5olBc+O&9XsBe$fAFIsR{lJqC^-=#eMC4nA`vd@>~{6 z0g1OPAVl}&SOEXlRK*Lpw3wfq`-#uw7ixz%^J{$GfPVM7q^-3pOkfQelyTpfaX-t+ zr-R6w?wUj6MI7_{HMjwq#f6b3Sr3@9{CE#g*_q7tA@amRMIoYRvWpm~txi)g(c&56ic0*MQ{IynR=5 zc1c|iu;gq-Bw1xTgnU{NK_@YnGv_z!u)}-;-fps%o{Hu+NQHZp*W(^W75K7R;r z+q5+}>br&SMw@gPB(eh##$71CqZS5X3H#?v^vs{+g{zbGsGAjb znVw5e=^&I>68nRwBUeI>J*<;ztL5xfcd?}L1(6O#d9wn>S3t79e=eJN5x1w9kx(l zKgGy-aw_4kuxpVUVErzC%VXBfUL3Gvjv>GNv03L=Fw*3<0`?OaRyb4P>RX;Osdg;SM{aTkzL88XG5^70nG~{S3yEjLWM@v!Eq*=qR}k^7p;E{9_e#C zY0VH`P0{ag!lsvNcvv9xhQs&p{&Mm=1rEcC`1rWJL<-ZNq|D#DY9Q`AEqW!I29#U>k z7aEc}IaaCn!sXF_Mm^^GWtaNj{dHZ_i(;0e8WD<8Wi{LPP}*L)tY2816q`w? z7iFx5e%uV2&mktGSHw7P&HHpQTvry@DO5wgsd*!c`uK~Wfco`T*sa+$BzieauZR3O zWgmT2NwODgi9qGG;`%> z^h!}Cis3Z6ic?6euc;wrS2tab*MTeLxY!If1CStl9j?mqn?hWU7x5lP)0+zOAc~iI zV(sYSzcFWmAT4sjdz##|2lR=Vnh5gFl%A1$K@n%OZ;ee-CDs5+2Rh>nDHj-WRv-$%bIxUXNZ=XjaK24z0R*r>1 z6?3wdZ%Azn2$Si%i#SQ7R`oI9Vi(M!RqV}Q85e1gVCdWwPWBXxI6RP+WOd(ecrWMf zw==yqwcNG}?_qJjU^VzwBLj64sfRS}PaGC0kZdvc+n`=k4|AMieed~_)7uZjyg-|~ zX2Xa~e?OzhqzPs{!$tSD)O|xh!q|8Tv0?QdX{qHNhjdLBivel*7H#HQw!iTMhh}mz zL5WB%XmUfJvqjI?D^+W?bqyBcWj0qd&%2B{$Sc2VJnDPz@#BAn#{nze1?Pl5I)%O7 z^k1!hu&ZG=#S4AkOjJ zzLajVQ<*~^#mi{<+r994YA6}(j!@v4`Dj@56Ip#{ZAP`%R*S<-2`sZ!>0iwdzd!## z_Ugv3-iG6bU;ZDHw+_h7r6m<(kC6Q$5SjCDLTOHP&Y4-RM3Z^>0w(0?+%m1LpyAWS zL&eMe*&Pp@$#J~xNgH)(#RMO2UD^K29LpEsmTi>gWe8A^#l=lqIQ~(o41OekAKsz3 zK)c6iQdTLA8jaUd=tbxI_c%{8CX^8-f;uHF3-Y8;R;+Bab?Vnq=wqwShfzcV83k|; zz`dIK(qAqJ8Abb%XzhSnbL%()gUHbI3tQp)!3`#76weSXmtxsos|@yFe}5OTO&cxPGUFlR0} z^3f*bTg9$=1YlQgi>D!5yoAFFd+4?kyA8*Z7kG`6#jTotVZ16!iQz?m-w&RmO&JCZ z*)8LP$i5cBJg)UR6*{d7G5!srvV%HyzOGR05jNaevw@I>u#k<{q(XyLB{tSsTNda#}>&fhd+fjfD-m+iD7Rp5YfIfj>hdlA_p zBGVQ2R;H;93v4=Et;yDi83U-uI2(--+pR0i?ZiNp z95Fth(+Qq4uYz*K5dIkwtOR#Ieu3-UzB9A*vO6}I#)u0XSzcdpq8e=%<-EAd6Rqys z`DTapWYQQMdS*Mt-}wFGt77Wis_eGk4glM$?*e2 z4ay*fEhv6_&fvZ9_DmC50DmU4lD9(+35h_|DRZpcx!)&bBbwKGGy~4A*$kq-RX49m zC8aQ(#iS{-AsPGuR29Qu1oF9N;+|i_5Q_h$B_69&ycNY$m&I?LdB_UTvK0`_eG#u- z7xis!Y!t$|cflsoRCLw>@WY#nMmXc;51hmlk^KfO8db5lgAi48drO8@5Mk0#-hY!T<8?wCF(ABdaO5M zlRPPwxJb<>+Od5l|Itc3zWaUo6bzedh6^e%f%xBEQjk0l#?<5X1wvm$%by z3{|-3e|0d;sQ85I{3&IQoH)|-?da1yxzfn1R&WBR!Z>kr>lJ8|$htwV8E^7q#@H!M ze6Dc*9}?``o>qQ1QNPmRQ;EAxf76H8VHkl2DrfW>RdAO2z%Su_ClDpDz1(lpzX@l=B&!j;d zgD8pEw!JT-hs!Tw(tkK(lL$snQne&8`6gb_@`_68$Ite@&OwB#v2IczAtmU*7f{{k z8Li*~)17035J4)a8Z!1T4uDeT&{oyy4wytbVNg8C5qbqPRV_Qu@n;qHR{L^KrptMb zLN;A4)TB+*Ft9Q<(-UrlT`MYGH-6k1+t+=oq2p`!-v%i>zTfTHo2R}+sF2M}v@23C zrH8^Z`R9>LjQg7*+Ig!-=3Sr8?r7e_aL6Wk&>VbS+vQPs*R7TE4(>fL3i~ziO!_3L zAj!B!&N03tXx;AXKF5cHZP(%3(YQY6c2=W-iZK%FlXIlZUO2cQ1}`UPcfLeBJgfb3 zB07zDJSBp;Fbzn#mukFM$Z^n0llLl$(Cbc87^}nAJm%^l&)LnlG3q`>n7F zIPWsoHMByB4ck6oopp#Uy3J&ye}+r40>L>4$u{i8UWHRV!Y=RJ^w!qR~+#0W(BXO3u zP8cW;pV5B8NLX#Nm5!ZUymRhpSX?^1Djla4Ar9*)g={e_#V=iNpB8OQ$Bkf>kLo5r z^HuP6+-LIY}cOKFh7ElNau@TTxoJkyV@o+LKWiXCc#&9Pw~~*p04`KVk@W{6qk^LKegK zB|Y4WjDJmH#ZHXiwylj+Eq4@G_(kr7#_~2EE)zq|IOH7tg(_3zRtc+|+t>4*Ed`_G zOi)Sn+TnG1K4ReTHIgJpYsuKFj&$&ghe8n)qtX?0toZtG$BN@|z|G>n(LwtS*T#z; z{Rvp-m<*0M`uzMXTR^#*W{K{GiC+o1NK)HXR^*qdP*Nx_=b~JrJU;%b=t!~43?@2{ z@Fj+p-PNA^TZq}lL`+3+2-{NqRP0LK`d=?~DZY%1$}h1qfJnISBg%f!@=gk41(WAV zO8F4naXhf^^hUbpk|DUjXn&8@V9bFK;z`OjTmOgFN$qZK3Ynkbn&YL@GLp2Osih6M zXUwI!9as#Xx&pa(r)^+MV4q9`f0WVJY*zkZr7XFe(!mP!)R?nzUD;{5)LCu07wt(l zPD?29hr@5`-RSd9x08m)?RUjVaK_`pmGyqs%rlFy!=6uHY3S8!y_44X-Z;+QI`%qy zxK^Xc8(va$q{V4q?{yp1;V_oZXVpjilJv^ycAHQWqAtRBJ(rVC~q zE|+P}5N?K!yBREB=ewr5(cX)CQ(!=I-orjoR-RsYI_kraia&aq&GY2)u(HKxRL2|rN^rC% z-JbS+;l!$(-%B&=XCikNcvQWDD{sFS8tb$>m1bDxIk>81kO|shcxcdZM{Il6CP@=& ztl`Q@?@%3doB6A3+eTrNiJmmSZz8S2V4XtdQ|?f}yOorm`n!bufn((e0_5qy@Lg$* zE?TRm8RLqG8Bl_OCaa>Y-LWM`aof52nig{|tP{HZtE@%HY3Viwz@?hiO%DK7s{tEt zBJ%%LBf==_DgQT&j~3=${QCYdo@<~`G4J_Npa*}OMOlR`8Tz(wPS=-EKP~9fQXRfF zx-nH|(}jibcQ~{xK1m|Q;lDo~R5-IhcIL|394ESyp=<>P+^o{wL+IH+V`xBTA8jQR)r)x}pa`bcuob^nq+LT*xl zL$p11qDbk7yDANNT9D%a=cr0?o5gxapNagd;{Wq7V6HNM@#t6v?(av2zL6slF2#or zChOA2)+v(}h(UR4O;0r)I^LB3KgeP#Ui?=UvoLb{!tSkZP7`84>f)I#DT5S9`okh3 z`@7-zU$}gVNx|?xT3B=|P2~)Id{gEXowRNGmurm@a-O13-1UCBmv_fRUnjx|`ogn! zA_4Q+*FORj~&+W$0d2c zQ~_p#DLLTNsE|8?l)OUPmAnshN$h<#8oa^}} z^_kt1LDnxW!B|G@8bkbIcpeqaj3$#St)SNWN9E1eb?C3;%}=zd57QY+7!SwHt=VlP zE@&9MK<;1hBo|Fd{P*IU{#(RxcJ#P*7AA=QiV=HmfQE5lNLWjn8{LVLx?`Mw*A@u|6}bf!=hZ+w(Yen1QbvNL`pb zAXu2N$X*_7$%u~c`cL?$`P|3rqE&=-rsi$roq&tomwg6` zDJ(Nte!#NbAf+oPk|1$2geV>F`9Y+3h!`HLV@7J#se8tDJh75mkib%>MIThs>wGC=00U~ z+Vrjo73e-!akF{T?lj{B3%IIfdufb2mI@z{b9lRe8^j_#wzJf$Cf*{R6em<;`!QnJ z&br>1gt5`S&-yx}?EIB{mNdn}E*h0k-Vrz>Nes$fZi%?DNV+nJ@x3wSMDRy|wsjVp zaz;Alm$2%fOTn(y6&k;o!~uWnTNUFKrw(LSf-FnTA@Mo^;!){_SkxiTdPx~>^ z)Y|X%wO~Uv(ST?7z<-mH0ygB3s*xjE%DU;x!meq--Gu~ z1+BXK{Kmh_?t*Q7`v%aL|MjKLE1?6`VQJ2J4u3ly(NQ7A70_`tWHasHFb-(NoC9GP z{bWQ5^HZr1519;e03QHir=_S_2`#|fT&}$s35+1(sen^)iei6w_YTS@sth_Whn1Ps zFAiaunhsj-gR^q6^u%Xvb<|&;e<1%#bMj$Zf-1mst|Obwi4MLpb;5*+L?kG|wEBN( z)Yjqd9FE}{>xtPr=j}rpWZ5)YD7WEl}=j7>@CGuP?ON;{Uip_ zq?#ucSJTCb(@qoKs%^hLcSUmLy`;0@+@~}8QleGFD_Ydh(dBPq_zDcIDH?!yghg*{ z-sNeKuNwI=9&%9aiTk0Jb9?<&w<7&waJqy(V}XX)A^kry&G5C1z?%-9o$siA+CLeO z9JG6qZ>x=U*S!aSn_Vp9>`@EY?C*dD;^uvky>ELZL@MbGkjX;K)S3xWyfjpsrkJHw z@ERTAYaiR$m{RX5YSvLLhB3k>`6O0Aq2uL9H(VqNdl#qlL(WM4a0QLm@x*2QLCJGL zKAzYjp)$mpmJ4$~ai4}M)kj(E@(-)xLd6u<|81nX^kn!yBhAYf|6fL$t`5PWC#+8X zm1RFaH>5`36qrBOvSGq*;E^kx5Rq-(AIQfav>%zDKcCC7a35rUd>)W_m@EKb4|v}z zy@JjECk&)hs1@3~5)V~BR9eirg_Cvtqgb%~8!37=)+^27s=~;sGZY z!M}@9{SI|R&OFNk8<{n4%?W(X#NB483h5rCFN5+22YBk;Cjo8Y=yBMHNl|e|Fc%1m z0d$5-poX1-ohF-n7Z?Er>E3AMxwB%DWVlkspy$sTe;Q!@vzx25yX*C6w+6NtuT&@& z(q!!&O-;*Np?{F4@VIiZKW!Xz**r_1@hi*m&Y!nejI$dtHmhFeHP};t>)uiFef0;Q zTiLophB$RecbA9oTWsmsy%CK7-V-1MIB*mgo7nv;_7hzNYvapP#kD2dF2sL1dz35i zpM=zMuT?9rFq_jgyPel1arzA@31y^BVX`{c|h2r&z%qwlle+cpO)?`C_M zsqRdhvOunra>M5$ zUHq2ocWGCZ= z2*K=p*9}&<*j^lwED~rjgg9p5exj|=eDjpOV&FDm1Ij>a5Jsf=Rmq`)fH^=om;14V zwzg{|!qTUs2skz5`hawW_joy&`|<3p5|^Xgw^s29ihshN7XFpLv$Kr#-pCBlw~ zItj~&7-Q%s?3Wd%zYq%Z-D5$*V}n@$H|^LvYHZw(l7C9d@`C5z{|Kzr16OuObq^$? zU2RBbBLU%Fs0|?8>&y8WaM7dR)mfH}%EpVQq2ee0VB-D`GGdd{HjENDi%KOLK0F8~ zFuSL1%ZWiW%j9e5Za&+G-h6ehq(4I=1XMOQ5;I&y+ve?>hA~`5H2+NDF(~( zI{>C*rFmgEG(OL1+zK%M<7rkWF()5Ghd86Wr>*;qF_*TR*%WT-7g~Vj_=f2d%V@Gz zjmMMqg5ZzzGi{Zbst7wa#^FX;<+S%u&h5W+RtRxSb>zKPI)5)_SknKUoJVg=x&D)t zyH7wT8Z%%h?T7z8G2gV>GWp|Gh7ypOQph)l2l1A-Ckx7zm=#idb1GGb?K%p*dDqcv z|8`kQqqn1&y8RhYMLK3`5i~Y=q$hLBm(ScbN`I;9t&$Jak+XrhJO2GJ_NEfS0|2q; zBBBl7iu$S*_3tosD#}~*0dc^PVn&|DeD?Z1$Q8CwH#T<$eoO`J0o|FsY zgt4w}akL8M&w1;3Ry5702^6^>KbZW6+gN8HJTM(%uJ=J`?SN(LXMjkV`}gJIF{%*7 zo+Lz8NziN(iVbI7 zq==V9eNO`mgmvD!a^MX_9AX(%aW`g(?pqyl3d_y?%(0B@dT791FzcH4v;H7Ey!=#y zp*t_sLhhtx9Q`15-MFm}>z8x{A&EM^Olv5F5xi;4O;Hf8AJsIjh7g0k4Kf4J zh8_1|A+GVK$mz{^Fgr)1aEk@08=*(iR00iT%_nHNdh7{7&aFNgrw0fUXovL}`^>VG zC$+eH8@$o``0m$apbXs((%p2W)v$23U6XNx!+AKGcB(Ah031U9(QvC06d7(rS8Q$5 zM#r>m&B+gyXWxDb&sl!JY2X}mqeBJ@*)-7yd=i_Zb(mkt4A|$+2)s=BG)$7gnuTsupy<7*TN)V)%m{&lV;!Q z6&yYv_d+g(fL3oC>Hl;SE3F=KHv!OmEZLHS2KD;D-QZ#O=Cww{(ohoijgUI$u{KLq z2NT8*`{!X+wkFD$?O&7peV&+60*4+tQO*HvFHB~seaR}aJa6JP>g2QS_KQj@P;Q($ zJI&dMRKLTpuz|ieCigJR06Rx2XX^evR&8jUCBHAsiXecP_c&u)`}?1_V(<0vdH(k6 z4oVJwku)fP*@)*F7HTQ>c?&7Tzm`mm-!DzO5K+1`)-ENLo%fsv|MKYdY@MPpaG%gw zI%R_Uoqn>ONCEsh($1yjI+9>=6+jcZaOi(^rk_i8Ld|owQhSkt!|`AkA30BJb<04Y z{LVn3>G?r2H{uQdPtQ2n38`4+ZaRHLA}zv7qa=aFJ%>?XOiA01Uw`vgW6>_+u-sb8 z+rH7syAl4>b8VJ3?L|%B_4hT_miJ$G_749V6D;ttE(5lit+L0%>B?C{I(C2baUy{V z2gdjEQ=3X$C7!fqn;|zG*IsBNANP|mUnP6?xwOTa(m-cUE^nB({ZA_ceMI%~|7l2Y zU(EhR(LD#xc|sY+v!xNR^TWoiWIed|?78MiZOe~>riv*xFvr&R?-2nKQdzyX7}x6l zO^N*WfG0xG^QFAy*n@J^WKI_iWwb%ydz|wJ-??>Pa32MKl@*15J!aKFl|vFNU=2Od z5P%2TJQM z&rHzsXjYbzima&_fXASEiCq^BNS0QxsEvs1U9MU~N*w=XTi${`;U4B&9o{{hrZqmF zrVE+62?bJQ0w5+}GQjkc(NWDj{)@d~ZHz~mt5WE6$={^vgoFAy;V8|*H;1lfU1+^~fF3@XheUnQe=aihR9Cu!GOc|TzvAasVou7_cXFvZ6 z@~?`!5R3Q=1Qtd^F3l1?PVZZoo@e1-sh=o2i4gUoOtLjx>(S@D39SZBYK&}~{mzV8 zGA!dqPYeKkAFM}29qq%rV1BX4v3X^`^h|vNU>!*CZ*3S^Egwc59;IJ&26Ry=vsXgD zwo*CI^_^D;+({O)H+~GJIw%zR6v!MD*4TG{=F%sZf>5Ap0~fA1Sc+)BnLB~sso*+i zU5=^~q!z*7q_D10#$bkhOx^ILy<1Oq_nproHz$KVcP+2>CXtV~57{?H0^r@loW8*# ze9Hjb+@fK-Oz=KF{!qz5c7#Bl(Ah=@!c0HE^S!A8xfw?>rDv}PKH32w8x_rY4GSZJ zCpAniv_-ZF0yMV#zckKyZ$;~_{xdmvzaVmyG#m%4>!lFsSKmC!O0uCh(rmHQHcg=> zp?0#TQWNR!TbqBMzrwIxTxQmu#VUARnb+Dp*m&1#-v&I;qI#3smh!lyj_xeDTUAi4#FBOWYE9v43@0yDCME$*dY_$9Fj$y|ZRe z({k|ImY7@cH35~FP}}9{SD)7zW6#sAQ6!2~Yo`SFJDhz)a!U3){ietwv=MneJOS$K#PVIwb-jy$H8^{lhAa#%e4Nj&{+K2H zj_=^Ht}4Hf)x=E(!pD<8wQhI6l|KEkbfYysj^K58^YK}KW*tC+IMdnhm29Lnqizs^ z{)AY15Hs#+G9@ftU8+vO;S9xfaGUc(;Lc3hw-iML@!@oYC?*dp>6zNY)HlJ=0stz0vWFb?0gfDiG7K+H9Uw3R{xd+;_Dw|(Auv7-bbmP;^S4TuOaR0s`qQKkzEa0xYcF!`M(V z-d3rWJ6`!)+CBb-rSv#H()z%oPooFNvD%x$2I`6-mfC2mvzT=8L^oY&r7bfh<$3;@ zA3D&c*tR2`OCwm5tr{%=B-l?wowd_v?O_~}aC5Fl7wS|o*V=aghwGf1ppOS%!B_ZR z<4{v)aMiyc;?p36I_1tTq$%#k`}C$B7f{J*qs4uPd4BDch-Qt9aOIjXVH^ zzfU~2F(Sm@RR}~^E*6HWthy0|q=9I>DNUn6@pM|uAK&jU6W5JQ94oW7VIgT!V`LLl z2@y*2F@NJjDp!jOn=k$VBi@DF4p{ z_2Mq=`07bxJhSwZ1pCcgvN%B9)~4S(1BP@2X`MdKtjws2~ zAR1+b(+BRO_U9cP1SkjUxvv-8Zt~C-gZuBb@n%Gt8RTb_s9zhHgj!KhH}4%zdD+F1 zAbMyv-(h|bCfOve#;L~_?;;utfFiPhH&Thewo_MKCeUB9cU9^xP+}={dE2EpeYBejb zVp%?1^8T}G@~noFGt*BUu>5vdaA}-dZMuHA50Bm@TuJVKzOE)B3$E#;AVT*}{RDqi zRrsBBU%nqDdY+%v|FUQ5BEylJS~+}FL7ey0rulPl!@g>($fL(j>kEmk4dvZrCz#PG zN$d~TW7wlFha)x8X%j9tGvoFLG@u>9v-$_{jb2%*MNumHMA!q5UGBMF#rqCVT9(F! zAB1Ho=RNlSaMp2OR_i*?euFFbpxuZDU`@!6 zqA;20jk#Bsh;oz5`{0MJjUpes0jHi7!}Evm0gKai2G~^zc zEyveQ5!7|O`ul{k0MyzPRQGOV{-W`*#T2n%5kL?cwlBa` zgY8#vd;A*-;WNmmy7(>&Zc;O@s}l>X7Ye;lmqgzYb-qt)C^+aui+mxD@K%@mb!+2)g^xBwIjmw`RPb3U$YU z;1#n;j0(q4{|@_HQ%q+c(27xCFo@wZtl$Iu@M!?`K2g9DGyXA%V7F9sQA*Q8a7hm* z7HBq_#sOw1b-hm!TywB&@!IxZ(zta?=dSzcqLt`LtjdmN#>7I20bN1MC{3Dszcdxi znru+nM^PQ?mhhRyhVfS51D}B&0m+5t1vX0b_^vz_27yHx&9k5C9G?U?uPf0odZWhE z>xX{nSXo@GPnvYaslQMhaBYYEy4N&$x5vA556!5Mq6*;=y}R?cY3$5PoSj$y;YaLQ zeyvWsGhE7}X&0gc)3KKG>?5Tf5=K)lCN1Ca$6~=g=T#hc0RTq-qz}8wUb4FZW)Ps+ zSMK6YJ>Lx_c42yDDu0yi2hiCj4{KU3ypQBx@o=$ARETfk(e?Y{w7}1H!(qKq*`BPz zm>l9ArU7zxk}NT^lH#Z|R52dBi9%v?$ee@1r->01KY@gQ*?r ze{dyShC>YprYoVECq0W-3*CWDbKM$N!JTV;2|5N>yo&pgXliZJs>-W;_57SGkiHGt zT~s3h&asP#V1xm@GxH{ph@lbkwa72vI}+!y(Y=Q3^HLE)W}LIY`MNz5%z_E^5y*pz zj)nCe;_%n4>fW#yCTGVzC5zb7bKsnphYrQe>{&U+T1Y3u^C)?=?n54M1IA^?dquta zWe=&!mfqi6Wv-g%os1$zXyM_RJtE8Gv>1Lw*wrcw0g&Gzdd>N+Eg^)X;YNjJ;Ckwe z<*CBQ%0HRIisn7d`~8u~t>W!@)eRy@ZC5M+0-ibNjl&n@e&k$H={!Ej!vZ_i6wTGO zL2L59WY^SmU4B;r@=6HTvOLoiHR*qpe$aZJ=7TBYEi1+By4Ky6RIyofrix1@MrC{7 zYYZKCIZ5EDI^RbRwbx#@myq?#dtW`^sdonY;_QB-@jSq*rL$l#VwiBG+BE5X7(=7u z!_(w>+CfuErr#Z7<<`FkYCYP$+Bnu>DXXul&Hs(%F9WdrlHOO&yR{l{zj2VB2-<8b znN!y=ur3zt(>z06&cc}H>W7Fr=iMtOfIu2E7vc7-r07~gQS5t6!aSp)tk_|V|9hi= zdC_t`)S}N-)wf+v@Albcpho*}E$pv@JtwSMiz0ftN4zXW@zA=oBUyHEm{Xq8ql!>J z_&wLGzWo9`Yj(T%K0@ASlWDyVT|M$PT!!;+^+xIyB+-oTQ^?M z1$rYi@qcc2u2BF_ii|%+iQB!VNg65a>8jvW{f_!lT9S`cZjQt~zqz{Xvf-b+9#4kB zlh<#Tybs6J+SCaF{IM@t!FT8edp(k=x^6lMabtX?Hf|4}&AY2-8|L{XmC2OK(62ob zef;f_^|xKkayv&lC<+>nPyHF_T-5V$;OWTd>hR6BtVI|NgaZq#w<}lA+Z?%#&455&Ky~gdbD&U{mclUcK ztcgE!%s$UzxJdItktdkh`DTcJ%rtDf-E-#O;`(Nd&oZei5}%!KQPjI%BGJPA_TH!U zQgCJ8955xxk*nL!-huQ`i;M>B`SG|l=Tq%-I{Z>Wy>Y8dhYjtKQk#dgPDb1|y5Wl> zvtWK_eP2xQ^63*kHj@Ajzur1m*YFytA>Q=X(onY3oHph6ulTYo!(O01dNg3VqwWI! z$2gyBYWX%XUh`|uAo(AML1zFs`j?0#*3YE81%=`j8?Nr-BP~Hq8x3>1ADdUpoJ}G; z9@1HjeWDc67s)4`H=P?zbArR2j$cA zxBfos&|rmhCqOPwIxa)x2H*GFVECqaRcfQ@XJjw)aGt=Xl3YsD(QjA;T_PV1r3Bf$ zkPf>7cvfao^OTlhma;mRyf37voJz*!1dM|F>V>Ti2e+~Jwy=l-hvX2tH0feCp2hZv zCrt|s1{@H3{XvFmhLu2^{=`u6A??;BKl~kc-9<9I-gax0-LHRf%dfAA*ixQF2=0Zf zygJwW`^h3peNhYleBpR?kwC3I`XeXBtTOj@Ni_s+B4+HRGx32^s@ZmKp$qcnRlBqL zH5`C}x528iOPvQ-+N0KTkdy?_{XH(r)ise5XRn=z=BcbLVRK9wHwTsJ!!(TVY;ZKJ z)mOEDWtlPF#>8JSUTkpmS+$%%OaMZgNK*f&`(a@evjO%TzM*<&k-BEVRHRcDllg%8 z{)8V!N_vKG*D_goJuLS?&6tB&wTU``Pe@d!w$8*e`jkaVZFexDT09TP+7STg(^uMs zfkNw%ipOd%_l=7-;HHaV6J7!Y}94$e&OIuA14<+f88kSaNjOp zUmXBW99nvz`JLt2Gzi?$9&%6Djs-nXVGBN?-Qq&xx4JpRkmT&p(-jdBR_N)&R96M5qt%84mv%h>2Jjw+;^1>EZ_f-_$FLfO>o9D{dVb%`Wm4jvPNyRr3fL{GGC>RcEZJ|o$pWJ1$Sj9t}ZDfN_6D3ls z-gC||00Srxzf~2I;damAt6!BwKg#Y2`5d(ME$HXTx&7$hQR}e~t(&ut$+cQ7kuLN+ zNG8f9s*JHle(VV6dC{%uMho-f!xuu&`0>rsf&&>S^)+4i$sSN0j%6#D!Jk!_FZn|1 zPio7lG=L_FbkdZ6cAxJ`aHoQ>i4r{sb*2#krjGjT4*mAa6g;;?xLeCxA^|jUw9r1s z`dQYRK8iBy9yoldKm>p>f{vJFc79eZ6eC~vOlM@wlWvUYJU z1!8ROBe>sKEUY7s3>*sQW$$^;)qV6}clp)1K55wV=K7A7=CqT)f&L~FO#zg~3Fo{( zmHLUi7<2@>x3krsFU;d|Jf0w$jw6tacnA zrS}w%#!p{#jDDO(3XXc-rSvHwfdHzB{pqmvLPO`{m88qV8$B!b&zXIjiCqi*)?;TN zi2)^6w*n&k%8#TCIGre)3`NzR$bp&;o>`k=Zfj#PxW$j)GaEhu$fIQcC66k_%CcijO5(xuD>7tmXsY)DZ-!mb zM2ot)d5q~M9N*4gv*&t>dOy^XP%8IZlg&%EMGA(h0XwRzCI&mN-Lcy904a4C75sHE31tkEo%E*{ zfJvMg*0IMRaN2XhHfvfZW(`clc!?Gz()w5%L(SDtLBBX-{GOl>aXoP#|(E+K^(Lme6kgIZLWcr}~94<-q^bj7dCOp3ut%gXKfJaR6#7F|{UjV2bLdng1({ zl`_<+u_d=Zxlk4kUNC}Q-cMGYnPu4KsOG&{SA$#spbO;f5Use!r6o?Su4VFCbo+eR zN2G_M8wKCr5Dggyj+OebhdMqxa)xw|QMX>@ za#in?X8wv(KgAym7<5}twTyWhV~x|z?Zb6EZPcn}Wr66DP&dhzpz2kiVjvghmK7=L zVH&qsmNcc*8h!0Lksu;vW$ep$p8P511?z$}WX6ZmQZ-9 zi3mV8yz;>(#UKUZn>DG3gZ=le=^1B1+c-(&Ozaym)n``@k}wS8R9(XVLh^J+DAUWqve z@5%{Wfb$!;rSLf`-H+sX8Fo!$L#>?$Q{1=uywgQ2di1<@jMAB=qgDj{WomV-4`W-~ z{LTdWj2m&u2wf-0U?|i66_qPGYjLgJ-OF=EogH1D;wR*oOZZ~iN>4@~+G+CsBBOj` z>#5qzf_Z*Jix`;vt%pbdHi>)He2?4@!*dy(d$-3HzL>$YIEeVg#tgbe@>sv0W73*d z2Ty=6Vv>|kk~IGk%?wEnxZLGwA`{WKs#y+#d?9Y?9Z`wAzcHZUe$a-SZMBm6j`)lS zs@P7mN`_An;4mBt>5ULS%R9OpgIY#Y5lvt~)@FCSxX{c_Ls_579H7K+&(|(Ru(q>s z?a2k|iojoLUYT>mEF5xQKbt)%k&d~vXewV3w4_IhQfmr?gFJFe8ESd)@TYc`(i8h+*Pt@ z+-XO|^g)~_aD&GIRdT?hm>TM%Pee=Q99h8Bv`}3Hiqrltb;aUe;l#}RP)1mK%f&pjw zEtA?&&O$h((CqL8lM$1;Fq1lx4UK8HK8GbW4ZY1UQx-V>{bLdl)9-80b7*lbQS>?S zw~P*lo^aj;B}#`KUeD#wRNG$b%?r4F8a20|ZhSuFs1^xA~Q2sT_QT4HDCNfdz?_e0Qa{p;7Y3$J(h9X=z>3i`cb@Hf#faEn zrsb97Am&{%)jmrj--$;FLnwp>SY|MO3aM1WyRpzsBhO&a-tH-ZFqW6ql@=Sk-|3&x`F2 zB^F&>`AG|q$y><;SZn|A_ecT$o@6-y{?_S9Hh0B;!Ofm1WFne_@$E@=KY5eyGc4>< zTUnc(6F&1s>8|Q6;l16*PXU3-L_&!!Dy65HF#C^g86pdkgOB{^w zvU1fmth}NQ)jgxEJ}dyHkpOfKgw=v2zyovyiti+(Xv{ijD>G@tF8M0TlK+CfvLL-# z=QM6AwDOkYPzh;d`%S$&Ik{KVT681n`SPy&T2BO(&VZYVf?aPL&2zVEG768x5Qelm zMlGgKmA6FmXLF9~TD`1b9AoR}FQvR!#(6Ai6zopaG%%mutlQlS-`t<$h`~`%_HmN0( zS`2|lFVv5BMlZPcwaRtzoZygGB1*e`VbVDN13g%upen{Ng17l3`)_Dplm>5%-CBsE z*gH-lM+ycI62OH%Xg@`+Uc6^tumN*FgX*uxb0ruoMCiV~>SN3!0nO~|p-h3x8Qt8( zt+KN-TX=GNHg)r;+k&{}>pS-j!1=5G*qDlqTbM{LP#4Rbam*XE{o;2K8vF%k!Q%1Z z$?b`SSzZcCe5vm;!O$OMauxdnV?|_)gbdWnyZuHoG#3!R(O*ZpAW(CZoOvy;4yD?( z7g*R6Cv@YWMSv%0{+71xvMVt|ZvqpsM~wVOF2m9vfGvx+5!a|E;wbeE4h@!;tb9*} z?Js8|dgJE4sC~}sTnKvF`#{Cm4tpx1GvVIrqEg^Fio0k~Yjl6xOYZb?Ed~s?3AoVN zwKo0?noi>06!BsCj_SU}BA9Ltx`|O)2NucUfTvIUrSetxCtP>dBCqY_9=E>QT)$vHx2!m2OjE^kz z@2iJX@Rm(qeR1*71_T%9rPlZitm-db7Q!lHZZUw?hHXuGt;cSh!D6|`l8Qu%SNt8IY31P=@J5;}} z1sRnwEQ-#64H`Qc7WpG$skCb<_uo+a*f463c?l%;R+A^N;e_m zLgOQ4Svwgmdvf|h2y%McQ#>SA{S+pO#FC2k0Y`sWaIL=dL06lykja07F|Vmzg5_-R1{mtSQNEc^x z<(!WFttiX|6ooZwGXE$Fw>|sn07aoFbVh!+0Rf7qc)>0z9M+$myDA;J_wb)R@On)r z-8^79)Xiakp%1Y3uJcP|7VUe5cX5Uh1&i66?*wu6PQuEp6CU?Wq@!>1X6t{oS#$C$#Oy9ahA#9QSA2H$9e-{&0{Yy+Z z|BskZ^;%3A_eV@f@-H!AV~Y(SCgl13p5K?7wQ|h|giYa&nLT)(a4w3p zZ+6vUU+tZ=a19tpNX`6F@oW3S;=!Mo3`MV2T4f&Ys za<Oo5oP`T ziK8+9F%x{(@P5mCSmVdHegvuNpXo(6`gxsIHcHJ_TvZP2l0#6&!g^N0ilRyZ(R>{B(p*JVG;s!syovga* zxfiFdTljG$7I*8K!ChuBlbdo^#;k0=V)>r;0)ZJ0zAs&=eNv>P2a#T|bU)2CfLq!f z0B~z#Ikk`9{2Rc{mgbRP2mrW8hPc=0qZuQyQ{URj44}^ZoO!&2`5)^FF2{ zn%%x*8ErN7e1EVqe)RqRGWx{|nqv=-M*6k)urg&io~xC0QETEQ@6FdrW+_+YKfDBX z?HHPZNVD#12qf9GcWvJ?QMNZ$z#)Yr!ByrE=2`}1F|0% zC?Ip1GTXIQ1A$;{b)I&MW+?zc~29O5_#AydV?);La;otoGYTf4&4lXwO zWM2wJq9oD3y1?GY2Hy9g*Ng?n+tqBMGv}xko!I$TEI^`HT0a+TDtVhQ6s*P$>O>011#R%q(m5Kq zZ6;N$bxKj|V&%-pkwD+!!REGU5<&^?pI+7aHZT7GjC0sCo7N*(Y!&)C4OilQls^6t>2>;!17D_Kg%zmn#Eys6*YGaBW=C;9L)Y92H(_#;~~;g zR|eyaeO?ukp?}hs@Mi>7bf+(rf!Q^SC8fXolv}m$WrPVoG76Wf3yoLEVP)bK4qmxF zzQcEYe1|W*;7M3!pV@T5N3PZ}>x5t$lSfL&BOi0f-9S~@t{)?U^O~0)Gyag4U7y}*S_;rN zoGe|H=Wgy|vo!!t_5SV_yy5^@H>uDlIimvhTbM?0FVPlOA6R|u{a$_PT(7=buC;!@ zhie5dm;7*hI02tl$JVIjQ?%ncUi)Ier*%g6lw-_#2?gs^pvGPh&8YI!AsN1qOpdU<{{AuCHv!{6xS=8L_Y2N2jYNd)&RF-%(yPtRlk+rkR=O{E_j5f<%}`eiDOl)-n<-8iB?rrqd1#U;&+|?UAjP%#z zZ$0f&3Pml@B}({Hj7ZckTpf*l{g6?D21LS9N$s$5GwMPqB|?ak%xwY@8)s zu3f~kr!v*^u$;}i%*P-QY+p?gLg!UfMawp}1pcz?N#cOYs=Fl4Nd$G>VV_SUo2OlCEd^5hvBC}r6>W7X~7uJbhY&tGVcTlv#rrGgk zA5?jMiLc8W7CHhe0MzeDt9LVaz?|Ec#_n*cReuGUe!7-_!N*Zvm7<=cPmz8~`P`r# zxjKdFvny9wwKkNht=XE`NYHnuUHHg`&;h~Uu8XrAl@~pT<#3wCjA=NSV>Y|}x5%a* zZiO5uZva%ZO8TBr?%~HAIIa0GsvAkeQK}O&NoHw#g17i)Lsq?A{k@ocsYoc@y3kR4 zhu@auD_F~aKR({?BRKCQ?AP!{_&+h_3LotW*!S}C^2Yv5GSl>^KG;L6?%t>H^w|Ui z>lO2c3H2?Cm#};} zi|aF4vMz6iiKk&*Ggr23KqS=82U?!tEMp|`Xi`K_)1b2`-pl!rD$ljB!@uq?IH%9@ zx=b&3D@QhCgj;WV2^dWlD9gh61dE++F#z7Fk6kN>hv+nZy*m+Y#*9y;7#^Y};YmH{ zf@7+iD%CpdWt~UF;xz>ol-dU?E`v1hDb7@IO>gEx{#s_dqyrJftUT4IYm2NxC`XW+a zmt7R7w8ZPxOeekY6eGK4e-K#*$|!hslACGLAP->>e0u0b=4E(g3f-WB2+9)@B{7TJ-^>0~m-_G5nH$lb5pKg3H^8$>_Fof$2u~kB~fVJ>c)#|B* zhcl(ovo-^ZT#^g^r9iTD5Hcj}V`=9F-pnQnD^tIjN8y$K&}gd4`IxrJ4_D2nko$ID za;-8~-g-ymx;7H0!@?+YKR4tP`9PaG#UsK*%vci5%lxF>j`HztWMjeU3o_&6gQY@B zF5p6_H#UkIL4lY#W=&g7UQ>m>!4_^*P+|Hu)iKKO?K_|3Go?k28r!nNgWfH-h?l(o zJ#J{kF9Mu5f3_vO1hVxL8kvnO-A9W|h>NiR*@e|;&s4>>2SVf>S|9DGt~HagfM(L7 zFAmU5=JeabCAXnN|CGw!RsOOHlh}TN`K3b~k9J{$q_W)6=wf8wZ!Wd)HJ3W0UW)w# z8A)MEzaufbKI8kShtH=}JNcnoIJw#0;LqQjAM*I^cW1Y`HlH2of1F75FuLS~7W(v% zEsy3)VV7KwrvS;MQk`_#f9mDTDvf#GDwW#S_jO#qHIwIq+;ffd{lOzD*f*YCW;#)6 zanTpW$DG#uXw5OAR-N}>PpQ6tBw?p`ugWaNj$nTIPuW`z-wq;Rv9pdIZngm~&y;&w zR{g#_6Gk!d?{b--g{B5#eEW%)o)6`feG0bpND%Y$QM&c(uItVNo1y`IJrgs`uh4w^ zcES=}T5*21N9+L|SjegeA+*(VCu9oOUUlGZvhiGx2y0_scQUEqKIf>ZfC8wP?y@v0DtOVX0;BtaKiYS8yc=Ifzyj!?3*C;vko0-M-buB?Lc|n z`F6&Iq>?3hp_z;o{?FzuCp@+k$+JC;8a3HvOUW)M-YKv1Zr;|_b!W?ujA=%_lLkI? zqI7AY>A-|>0BZDV27pp`+;L;&B9G1Y3iCRR1tsp(EncFmBYEL_e*RyxTfKFW3_25H zSO!6bwVxXLwP3Q=@$ubVfCL&bDE6~a^*KzJtd;~;Xt z_7ziSkaRBgPO#;M2KThC6t#Zt=AO2>2U?m4wDRd5Gpne|rl z$Muxf&r*>YG|r<35^!^9f-e=6;|JPe0W)-Shl%L?WjR^q+NzZ^w6JR48N|#}oyrO* z4Q#43z>9Ox2THpW2afaln{V+I%ZT17&Am}#XV$NAe5ZpQgn0N1Fe-XMWY;br*=v?P zo*g0sR`_nD!>`0+r(AWoSDHQgUj+lFwDb9TNfAuLC%n@m&L<^1#P3R<)z)ZAtR=>k z)>RTF>s*vn{(7?ej@|z>3`D=S@qi&^L~D3fODFaFJ*j0oY_E><^k{3$k3Cw#jXJ!( z5zf}pv~S$sLlt)p<3**$Dk)@+LzY1W$Fh2?lD4b9sIVA0v)*R_BGB16pf3QoiEOn8 zJtO{O*ZONpPir%qx!jyJAzEb-(7Nuug_(Lp$ z!D)2rzJb?UhFM2*p6mUdjE;RQf4wIfH957udw+4pNi3tq4jgXaVSQ!#aFIm$NB08C z&I|;~Yl5;(jxJ2|2U+K~NnG*?-mqh_EKUYN8)~Co&#urjGM!T;H1+< zOfzMf0_WC@&tczYyy@|IjXWtRq=R>B4rc8c3x5S!s@f{5T-uZTH6EDoaN`Oky7U)^ zqVtqp&f}gZzkak+?Ai&QM{+~UcP|Wx0y)M{$C zT)#sL%7AQ~gldn7 zu7_hKTaNHg;zi?C{2vFzFP9&sJyg`8{p-YtsRNJ*wQW0IU065Q+Gpi46&0R39;o;*1@>8CE zJ(r951^`y~0U`6lACJ%r{AK%@iK(nxA0RDZq35joIf*fM1zJm=VmXB02oNEk<=Ml|FjIZiN>HJ!T9hK?!~wMa7g3j*>=Jv&f~nD$4Pd% z@~z^t9(xV>EYoxm!Gc%b!7a~^?(FA>EOwEq-2LkEOwV!AV^f=dtbB*ouU7W zwL6c8djJ22e@-PuQrRjoNyxqxS*J*{%Pz~1Em@$~N}FFtUt&mvu0V zeHn~>8C-8VopV0l-{<=Nu0O8-o0}r9?fHD(9}q)*S<;krPKS8-uIQ7ph+>bllKR7r z;Hy?TZur6`%wb$dUfIaVNRtFQXIt$u{>(7DI^$ZBF%_%gn;IdkCpkpN97vR=1nYNq z4j6h=zpQ&dwoK1@Y#tmYR_-BAe+^fm@@ei-xwx3Sbr5vUB3^Xmv+Y~8_CM3s?%+9C zH)z0Mqv)420iGJ}(TZCi8IRQ1)~he>yn@rU$fA6pF1c))(RsVnn&~vEW-6XA|1Nu+ z_SW_7j2wLp`)GUtdB|ZcKrAe+12yaX%}1W8AKflQB)gQm?YHjJEdRlA%`TS)Gm zv^&b9J^pAV3rFfdDXY)S5N%<`);8@psgR`yq@?>&eO2V5dmO{p$8?o|b0L@JOwN@1 zAz!2z9+i6M9$UDU=F8N+WOc{8kZiG21KM2ANdoW!XaUHXGv)8vJ^~oW|EuQk(~Dc= z)#MK#oBZ=>Ho52TY;ptMjmpz(@>1c847SqO`7=fm`@JKCjkvs#-(Hl=r@&y&z4S_r+oa^@v4 zm&(Hpgj`k!*Haz`9yqqL*RbyfzM2jf=BXE!oM%`F7pTte!_0rujQ_$r_*H}+}m z8L9fFy&-yUS6BoE^OXPa=2|VEQa(D*CCe$X-Ym^(PQ|q?!~-H9vqdrlF^7$|veu!K%rTEqv98!!1VZK|r#;meJMJ4UoUi3ED3%h-^VGMHy|y*n z^E_(MTJLAY!HO8*K;LcQJ67eeAb3v)hVA7?SoUSo(Y>G#?EbkW3wxHZjef2VOlTQ9 z6~%f{&Y>7M~=IdE!8%4hB!YpW*~nU40x=9aF@u zE#K0c*uEX0OF7!ngSteiT^BL=bI)%MVubY@8mAj}UD_jV99fgAYR%Dl`+2n|$t`xl zW*v@%#IUo*a{*^SelQGXe1+U~`KMdMN`?YY*#=Gyp|}JnwcC{witZyEGn?JgSx>7j z{W+s|aj&syR~SB)t=>5_Cz;ZwtIz6iU?Y4mz3zc^`GVJS9S&1mS}Ml#&Nq?V_53qx z=8Wkbd_8FIo9xn^{iP<)ejVHN=&)CVjW$VV{cGhFg)03Lr@HhGR^7S|mM=uc+TgZh zV6v=Z=6lGQ7$qCE6^8A`^@y^B<$hcnWWNfe=`iVscWRWa198)NBDdZdy!p99Rc4fP za^K1V?pwCE1tQYgYemfGfT@w4)lbVM>YMz#%E-sFL2bO8+an$jD`?8<;CSG1j+aZ| zx)Hw~9^b3L^EyNNW(mB|84k3zfL@m(`d}{Em{{-)j#W=Z2~SMwZUfs_Z(rC;QEVaE zanF>;g%UT(`%1eQEDvXA31SlH6Xk&X5Sjl%xm$RjD^!q4#dUkwBB+fUiW%8~Igi@O zLcY`tvNFS~*6qV$y;j)v4=KH;FU+NQ7I{6{TUa_oYAekM_0!VK$rX4~Q18wT>^V>0 zz;cWXps3JsBnFh)5U=PR?^W=;(W*&S_wnHz0d1poUh$bj;#KlUMXeOOMv!9Clc_BK z{59*l3Zq}7gw rr$2_n_TtSoHu)+Rj4)`93{mD`+UV4lZV(ZjP%Sg-kh%{BE>va z^~&HCtc#lyzB!^Z=rdf}OhgKXnN}m+%<%y=l<5I*$=%p)JaeEdR^7jft|9J??mmrc zixz`S0bs~*_WxLtzGfyuRGI|Z-i=MZ956Yc?a2jE<} ziDz*YC0}WAH`&eg2hz^HLQb;rZ(K%F@S>J7j=E%N77Q9Uu&{>sz;%=?~kY{ll!;Uyqt2p#fs9Va-o&M-BI%s4G zejS{Xu95^W$$DN)K_o_d1M)wv<~+_YzW>k-XU6EqyzJ)plVO}$gx$tVRL63!P*YUBgY6EI&U8R;Q_pk zbme*@OUs)Z(}5w#F%w1>&PIYg~bB!xyx32c49%B8~0?z<^&V-xap33b04yqxHM(%wy4P%g)vl(V@e z)qX(=i+ne`|0tg}-~nFps6}fdYcoyJ%)PtZ62Y=rEZV(6O{)3N_8@Z#CHOPCsXG1Dg$VWM zW^q$Fe^ZOy6exOLjPZ(C4veo6VLSg#Y=?C#ZGI|ve}BHOe*CZN+$XQ+|0;i^7SRz| zD_;kMAN_DV4Hjqva?(UwUs`lP>d+|WkAnN|Gt zxnH7)egZ%*(*yJ}C-(C%dfCUPegI>{ywc*vsCB(qs^Uryb~8eOXF-;eZ@Aw^HG`=u zU_xZp&qw`RQ`efXZcbxxqUo8&AL(_J4+p)wc}l0BrK}D7NS+ZHIV;%&Ged2f{E_k4 z;$Xlm;SYDtkzuULFsAcTqazmAN0C-sN5%x+fxXq6&FB{RR9AY@65kDc! z`-wr=C-9Q>pxJ{+vt#O_2)&+A-xhKj;N1TF%fWhEaqx|S8hHytsoo}GpWYSPxdgIX zESnJwN&VDA#&tMh*@&%cMbPT`8d`>Rq54pkWtQ$$9-tE3HDo6zeG!AvTNGO@3TALB zDd81>?S13DpA9d-1p%!)-aR53X`y^h26)FeA~$XKW@1WBJ|wdvOD2{?M;h(n>h#*# zDQeQkwdo)kr{===UBfx)DL70g9B~9LY!#17oL;gwyq%Hvv6#x2f5QWNpj<$2TI9)Y zY81Enh1hN(xg;CbnS2=JRdt9!#c8!vIp;oDxgU4aM3$_xsBpZ=&)+rly}OB3F7%2k zMXs`CADq{iq3M!G%ljkg$6gvhF!kp*gjr!zi?(NaeBrAA{Zj_IWis`ktDWnWwrJ1O z`iOjd)y@zh-wJcNgvMIt5Q(LS69zGLqzrUJPLq%)-%-@TyZxJZh6A` z$qZ6f>^Y=`$Z~vJ@9FcxGBTxdIT)7jH1D5sbAs7>TFlY?ojm2UKyeZtQKPkN@v3Hi zJvi#6wJRA-XZ(mFO7;q5{|%Z`=EWu-_Tm@83Qmz0N}A7J-nUg2o;>%XDaf5?6OrVS1hVOAI1RP z5Dd4OmPngu19O#a20xMFXyg+;97CO9&ps?fSJ)h`@x94^9RQz5(~mobWycDZ+*Pb2hpamGapNyF*gCtMNPsa3m=lPpOW;G zd~M&zomUde@-7>Vxmw$$Eqa^vP?!4A<=1itvlri`^{mt!OJXK>x&&CK?;eZG7PBa= zwI=7*_D7s0yo($q|G4G<#Pc9}HIHw$Yzaq`=xpn1s2hQz&He7W4KcamDQ*49fE2XBJ9_<)jGISBdCtktvz z`YCGL%5U?m=BEH-aHIQvXFEI{QbZzWm^{z=t>%+;X2Kes;Y1)@`(O(aF|!w(s-tlt=(*M~DhEtg13_;OS$#^O7P%#dBscJA1_Zw4`4PTgk-kP;c0MiZRd zQ94YD7Ar%J^BQ_F(s(zSbGX*ICPYq@?7^b;f*-Fj?}6r|&ZQ(#_y-W|p7#bVhs5p2 zN9Sltc4LYpD6>5$o{pvVebjaeHq79a003Ft5uA2WFOwe!N{(l-H@z-SdRSXBFngK< z6R~u@k}ceq;2t-*aG zA`|z(MGf6_otiLkl70f+KNGn!h2v>8L|gs5e<0V-*) z$f$q*90X)aFyVtq@T5a(c;c?9%4&v))-Ccsc5&$syFqV|r_dXg7s9>ASFv2Ah81;_uLYS$8W0n^z9eI4Io#cn8X^;SjoVly+s(JqWXDW0($F72NgG=7PYA4i z#ioFgpCST|nMkRD<2do>-lXghrQ4oy#ESH4!RDpn8KZprocT}eEPD2jwaxDC)$UDt zn~`6lKj-pN@{wT6SvSt>`FG`t{g}1MoXE|z*1PN80mSEnQ{uCi1;LVVLg5c=2?GCD zVRv{Tzt7^_PmT9WEK%yr$XkaxZ-D(@^zo`x`^V{@2%{T@fU&G}Vl0bRUD7KWCXY&5 zPFOZIM3fVs7@~e}33|Kl=tTk)cba^eQ6UET*;d{#4@DM`XUxS5h3S7#(~@6kAfX+T z@(a-4(A2UqRiG`D`BuINJ7W&pWx|U#s4O>QZ$b8e!y$q2n6^%No|KOFf*pxJ1InNQ z(VI*_Uy}>>ZfVPUCP$mT`c$v?`C>%;4&R&+pLo^H#pnZxzve_LS6N~Y&b$8p7r)v| z+AA8noJSF3dA{9|=dCj=o!PK?p`sU)gIVsP^!5RDMNMnp?|u;>{J_fLaw-kTM#HoB z#s#)xcXLhMbC>AT`xpTuxqD0yYOMSq>ny~PrC!i|R=x4`#m_x$T}17~Nd99>!xpC= zsw+Dq?8v@H% zYt3{7r1ABFWAHB@IsUwRBQjujmg9lM9+!vlDBO;H=712{e8?~Pw0K!RbVyGlnil)0^GNh(L_2{XQ7;D|7B z4Ps{ro1Wp{JhD?f7x>EGJaYVBJhBUU{Y{k<9$D`fk32oC>v6&($DZ=YhDK$YgKWyc z_h-+yYJHgV*Y^i%M?QLjS)JV4J|18f;Uyq1>GX3a6fEm01zQ7jMFgBNBh?vf`}I*z zJdHX1$@YZ!Qnz%9gWf#FK|36YZ-e~9XZ-8J^7&{Dza|84o}cUUGZ&fPUhy*Qyo<=?;F1%?!38g>ST03TWS{FGTdqn&nS{$pAN&z>*VQ}J3;xa3zjP8dpxlQIKu zn~;(&+f0#5UzJbwbos@I!~Rwqk>@0HMDY5r3jnBuP2Nfmzio1v^f+zUt$vw|GD#jh zl6?MMfjWWKY{cOu-I$o!@t+>eCKd)+AN++^edM)h|Jg%;%n|tMUPJyXbL7|Zi{QI` ziDZs((O}^}qivhp!q!BH zQKQ{P3-NPcjGfA|+McHT&2Oz{^RBy);WPD&wMlW5-HPjv#>q~sc~%1oIt0;cHntArMYeJ?~X&=2^3%?16P40qfG;?jEuwi`a3NDxuQr=-xK>$ zX*lZ?e8R+A!TB)XPI__tK(9lx`}ZbvL&?Pe!wu2zq?9h_s)#R zwHe@p`kyi)u2m*~GT^Ws`jAhm5V3MDO+#czw_;Qn2yg^;s}l&iZM8iX z@BAw7o1&l*fW(*lLgKp;ej=?WWoHAxOkKrHOvz_S@>oPMBZ<=UTo6LFL5zTt`0};* zjfv5SxgfsQ+rxVl(TrEHQHGhd%&!8THOHSP(HmD$Dwp-xlRZiYc_K}!A7%?sgBLS; zpAS>P4*GQE&;!tu|T2v|8?Qx8+jM)oW2@zmyk$d^Nea`{mG!| zBGI(>^^YSHxarHm=g4V!Xrv&MW~R33S^U%2L~D2kX!s(5ixNBkrtu32TO_2D)9JsK zI`+8481+UNsVN16do`70CCz?~D)cBldS&F=PYzymd&#dw+dakU=MiYVfVVL z*o#x}!06+U)Kh}*RCvIr51zAyLJ>izq^c()EcYx4!1Uw)ms-cs{~xuE9}>yZzsfUX zgAu;JobP{rys4*qxd5=29|2hR-+TGDwf)PHMbBmZ^afu)>whcI@ki_1r)QU(^4N$U$R$zB#Jl$Ay-jWMiv_F z|30><=9K3Hyg36;_X!sNh^qt3I`*i}e}sM6?gOGiey!wyiER5{pC+1L ze&D?cd~ z=dO2TZUtm?(C7ZUdfPX?0M8^#z`*LPfoe-D?)MIG%F8h!!2Ur=p<&zu1=JO{+(j{ z(&$S7qv8RoaxT=&PpeWVU=oYpc%%6Hzdm{%l+E;GV z>K8;D9T-6p8K2B*mhp3z;x2EI$aUq>Zr>FvK(#wL*-RhZeWtu) z(K=GLuKsE!-qbzUGIOL-b&J<9rtM*o(~0M3W^wQ2k{}0^u515Y1-SPRM+)ApK?6XS z0dbPDhO;ru+kp_@ip-gYrIlDoGBnoQhJw^10Gp0y={4BN$r=rd-KVr3TMR#Q1`xUwB$imv5w2wmRt#d z#jdb-ip(wJKCm(JYC*j6aKRAq?A-;G?!H6^%t~ZUKeIc)BWT!?cOBBCVH2)YleGw%OHDQ>gj|dF(H>n8+zZc{p@?RK zonT`q=gmTN%CV=d9YKcfeduz0MTqcl`j8deE2z+<$t~#+4~?bq-tSwOG>=e!5yE`e zzMRWV{Hnx-QI{GQx6gnwon`K}e5J^1`D(+`8LUHBbpbgLtzBtA`UcYj7a_gaXqHwJDL8teS&zzd=@|(G8)?AD)t(N@UkC#;{aVS zJt*qo79Tx06bo8{BlDwU9Lx0_z;5aB^Y-dd}H>j2sEF$nR<+qQVP}xZ_{0`n50y_1P zGjLk=lke0P&%b07w?$|Jmwn0(58QZuWLQTbjBx z5nYwOlNs)$s?it~gNVOfiD~>s%JECW6zKR{`OdiOY^&%Z=fuUPFazg!)sMQyiUdT> zVX5m%#SPzWlXboQv(i>u>`9AzJ+H^^bO(Q$@j3pk;+3!CeYka36;NNX?2K;HSJPPN zNpyxUO7yrt9kt9d2tG?GUa(tBiGnD`3k>%@;WhO>T!M%k^@PEyblf-RX~83JiNR%b zsPncy=2>;A%zLM^T7N3A+wJ2a7*n7G!C^9}^wAJ689sr*SA|i>%3CJYpwWfBG5w zoa@4cm`uI0hEw+wo2z}w`^ zZwHDSf7wl4t5-up=c%Sm5U$GFLhdJE*h$?(Pu2KbBp;xVMP(rxuGKT-mkzve)@aJ! z_9fb-Re0?MOC=sIa-v(<4qGh^GL=$h=gBy8b*ehX2WpNgt*m=@SJ8SdBWQp~Mwb3V zBol|eomYez>1bQfTnEe7k)Eg9jm~xaW;vZP2)SJCG@#psb(aeFGxl68b zdd74Z8d;)8`)+q6ps(IJ4&MQ)5vmn`1O%yHp1<;b(2{_eGzn9(QM!UMfmi3Xe_(q* z`h&pQyU(xM>cN~n)m*E9COAwb2tJZa_@F-GN}WWGXK@Y49xvnA-ya_>mI>v()1J&=lh&fTsi&!UawRg1KMdlm-hVwr z3weWUK*)F;^ncji-b)1bpDcQ%L!AdPSI*XvIC!4aR@N@Whb282&?!za7>4>7v*arg z)@)IGPXR9ZG1X_iTSt>&u3~LPH)6p$)Z^Uxz=lS)f2rlyUk7o!{^$3wp-!I^w+OCg zoQqRhD;4Jtt)?CjWv4!rZ4>gfr?96!zmoqyxa1-&<5MpA;x8`QYVI#C*<2@D*WrXq z2Hwew04_QIluKT3sacn)2k_BMqf;(F+Xh{ahfJLc|2AJX&uaJcms(WR=S-pBH0tY$5Vm6hZ7uFpdBX)(+xd1p{YAvhH_3s6xfIgK_7kRll zeJ)BB=Rmby8)g-E#m~U!aQ8S{!@#}4>+e7Uc)ljiJfKyi&FT4YC{YzEpVg{T^57MY zG{80cuU-+#fA@->#*?=;ISe!UZ|{;PQNJEnU# z8x$4V$ehhTA~$~?8xo7>+eum+3^uxG2;Txo>;B zWIbuG)n!+8m>fpM;PxFynwfUaLF6So-k*N&yODAlz5f2NR=P!o=`ja=d|9Fg7wQ9+ z8%XJVGx0^-NCFTm3f$HCY+1YJ!z3b11_@Nu&Y0f*lJY{2wc!E&_=Byx%Y$+Ta##l zG&x!!G~GJDzie2WJoS>Dhm6@yykxH}O;%qAhYm#A3zWp#59+x-qXDc@Jq~bM?%7r@ zxPx?Ji>4?ZIxC(PFB2Mb+`xH}GU{`cPOC{?-3j;h^$^fj;^=SbV+XL+Y!)oBb_On9ogqK)dFiB0Y`=tXzoAsDx4kA zgIWUhrt6NJn{|1%psIW0$4Ao3AtT&}q&s_aDcbs8TQrR!D>rKpMRMk?NgF>uoY1ur zu#)I4B&92y`$^ss)zzpQ$dHv9Z#4z*vg_BzVEfC-(Zj63qyD@Nm8M$Ok{`0Ws542>+ymu^ATj=KLAlY=2ogO%52Vhz`uwRIjcS>mXn zo4pEQMM)ZzFWg2)8KHJ!7@v`b4<18%lUj2zh~h5Eobo~E+o@f+yGZJx!iM|+@1ub&-n-dvYu2l$RYq;XwneLhL`%y|izWo*v{u73sN}lPG2%Y@72ys37!@jC_8Wg zGEBI}iL->VEB7&2>*GVqtl`2(->Y?No~nAJfr*EfH8y*|7dV;xo&*%fw@p$>yj-7e{_M(Y`n*MXa9^bl5(5zDs{!c;7$cY3L?8TkvRC zmY#0KfgV!IaBa}gBYJBq*3~`0b4?oEE3|$5b1`c3I5rk@cDze-W?R9dVruy1Xt`b4 z!EB!pEq2~yrB{L1W~z}J{k`T;sm&L$B3|31zGAW%m83A*leZZLnxh-y&r5k4z%-)~>hm$r@=U_7n z4DFKO9r{HlSD<5$x4h{h*|1QgtICG^RnS+4CN)iv9r#f_T#f&0t~#wIX0JPnbZUx1 zSOfXJn`zlPm>s!#B(#dv;92fg9qMQt$txSL)Im4xv!gY)KRR(v`S|su#TKHrs)fw+ z=1dNw*wsDjfCtP-&q4Z~0s3WEgfNd>#UXO(+h}4z@IL>%s516}>PRzV!LbL~%2uo) z?0flG3b^k4PA3qS$w=^CRoFLLKozV2pDLeb+;|F2-ltk~F-L&jU98<>AEJvq75Hu>`?^%kXmC zIu7WDcS0(z-&SC}_~(?!RagmA&wyxEg$9vJy{VAxU_vwSej1)-u9`c$x)XX2dR|_Z z5R+qnjfdzLqb$g{^?1+2xOCIEOpMlvSMN zZe2>2X~5|7|H3$(j9CD7vO+xT=*)BYKjY&+@|!R$+M?}Tv7CZ!A9!nID9NHTS;p^L z^e~Phrs;sF817`eFI98woQh*?x6|k!v1<}nYRYc9%u)mejC^&}>jL}(^M+!CSCows^!SpvZCZhS%MVnGG%B0HkHygS(K9e7B1vqfKF~XrISHXRXvwFv1!i4$M@g7Xyt>P3x^V>9`rJz8m=9c zv6f9lo|k1pPXy+3XAe%3crb>@B1%fn} zk*lyH)_EDB8%;j_;~uN(Touz1=FyvZZ98}Uhttu$&YrC(5~O?F-5`+NrOnCXiSDuc zx<<{u+?G_gh}SL7L_^&Q9$hnz^Y(NGZG?Q-*yuVA?jL@p;0+DFe0UMLqGeswVy?xg zz58SexD6U%&kg5ffb2glW{5K@hv~mIwflj@&TVz#M*D<5l*jh7M~+8VZ5BKRq>rmh zgX`~D9}eA1 zNEdXD`v^qmV5>U2Qak6KBw?Q1A}GG7HakEJJvTuNO)p_{69>y$axc10z7sJ2`l)yT z82(p7f`kcvXNum$dL{1dFTpvJVe1PxAp61Y*8WL;6m{4zl)QV_uud40(3dAF0nb(E zbfIJ|j%Sc5p7f_LH=unYR4BuZwre17!rP^{@L_aIM_%W|kCvkK#*5OFq9_-pTB0q8Fm3&pQ&U;PHK=*SbAxC?iCH~KS;Nl_0?>xFFH0)kDbF2&AR}cVl z4IKDkMAsBWvqFC~y2DzkBH>2^kJq#OVrj~dgZoQ;0qv#xp2M`X=gI79v;aN14()NY z_v)9P+&+g=EkkGmdUB3z?5Un?ej6J=iTFSCWU=u=1fD~GcmyL-c7XwJQ`d0OHUaIk zw0w^fh^d~>vP~`h6e214GnF3ErZynFYSHA@gV1+uUv8GPxVUMA^>v(HaS>IEPP9}krDO1Q}^Da z5}wj)zF@!yL^W3;Ol!hZ$p2xxu}%SD9JMvbb?Imdv@>#MS5pQUy6c;d6greN836KZ zW~XWmJ@A5ombMcd)>SQylAWWDeM$o^5Tl)+2|+uc%|EFwh!{ZJ%*u8kUkk5*na)hf zt9tsk@zzv@QMU1d0TB#6+bbj>k_oyyT0Z25eCGx7YjLCPtV108#G6)U(n<)!uM{Oc=@kTyFibK?+J-#+$W9k><7= zIwfv9v~dgTwhDEAj%p>Xx%iyys@O0srO@cBw3i>F>58}li+?zza0jL_tn0k0oAh&v zb-3EY#4EArSjK%O_&npQU_Hpeh#lHI!N%AoChahEqo)4yK|z}xcG+rYGA&GUc}5_M ziwVm~a z+m>`e1-0kt-D~XTl3Xgh)w7hjV+!|K-yEBGHw3;?8LFyVf6A~vy2px4DFPb1-|Vhs zOB59-)Rb3;;7zpYt+wZ0h>bPi?W%6td>8}YqVQ*^q3Q_uL1=nmOz&+=2(5NazG*JY zo4mlw`-Y20HsV^d*t=K`SLJw{V7cbjr;q0E?TV&svH%+^{kD2W?PeJ{Z?AI<s1WaXME{$lj;f4+%j zt7KK5L$H{f+o^yZfAVj_$k1?sU)Zyzw{8Yme;Iogl7cVYWENveo|&Zo-P5!;bb=&hWhYOOm{Y~eEJwm6=lesu|H{6}ryL=~v*hbTSdmOK;? z^6)idK~}daKRAtiKdk)~`MzYrjpAU`iIx@nci!=ClBG&nm8pcz*J8zVkn@s&F6_4c z{`}KqP4Adsfz-G0ji0A~b%mBQ>&TV8vA(D2rr*+1ysZ|+7Qx#g`Xgqy8VG#P2Lj*6 zaO=ntDqSRG?vsLDza>T1xYxX5{S+#>UoLbM26OaLN=NJE*<5`fMdDg_5qvMkz)FTy8Xl1F;TBxQQ3-YqY7Qm#P!u%Rh3jNt^s=ksD@zXNC1#hf1#;1OHbqAQ9)fQa z65i53C(a79?M+KYvP>ICYiey2qkwz7LzS_0&0*+~?=Eqp>%r$g>n-pDDmIC=_2c>vaA8@q`}rj+pJ*W7iMEF@aYY@3pAgEU3SX z5cWRsj4%aKgHfLxtCjR6te~X=j~nmmor|VWwFDwL6o(RB#w&y_3Jg0NDQ*Z$19vz* zbc~jvqN%2k{LgpGKaC@Lq>HE1+&>B=(b}3ehSM1M%6ct0G(4pZEUsY}`d)_{0~Q=} zs${`jr5;1FgUk?y7Bhm4lPxrOgLXp}?4GV9pSL6y%&PQRgSg(1Lg$S@Y=%ReD`tX} zgz{M5-K)<^b}uULrJW5-@jN~>$By4CyPsd#I=(6N&{lsmMG4C{Ji0<^&7qhe)X^sc z*US=D&ngbKu0>I#4^Uq8V6{{&oLJr zksuXe^Y$RLi8_e;$U1W6{eyvdhd>I-%VU8mN8+tu2~;#%JDGP*{>k z#*McK?F4ZXwi{GFRxdozj8vvBL!Ie;$F83h97=9eynar*JLf z-aivgb@$M0*`)PrMapW0*tk9x_(9mbGcmPW^iFw+l$*!e7JE!ip`X&*z9N5E7<@^B zWcY2TX9lpQ^R=>$>)ubLoIJQo9scui((!<^dAG1b zirO3($E@g_7=MY%%4$7jR&|~k9{;D_E5m-eR*Ay(y7X_(nYEwqFQk+maG(VH28B^N zP2=5j7{TRvdgCefracKW^4{fX(arAqLl4a`%rx})6Ish0VXP4Lp1murm$q-cG@NxAYgZU-Jijx{T^+%&#l@(QYKY~n} zWXb{Y(a0C%OcmhT3!>sKzz$A<=5K=4(b|Wui>6scwB6MJ%`j%{T-ze&%E7v`OHugh3)$M z{P0Zl&H6-Zk{Zr|3@^z);h% zilwRn=UP|9Wcejo>p8ky5qrOun$gkVQQuGMq;sHH}cDJs;Ai_?u4?JLS{L zXIj_qK>n+rHZx=@OZah%QVI4y{4_Przx=e9;<_e3UZ+~~8`>w|+@A4D*POZUI5Jgl zj#L!3cdBN+DfWJu(*7Kw5)Bl?=V>A`9Zys_pwW0SYue>ktKF97ulu@1;zNQUk0HYy z>2DhzsV61DA*SXgps0$n-XxP#ul&_!EH&lRqP{Kt8RS~^U7ONze`nM|n_f>$ek6|K zoZllEzN_t_Bq@A_wJh45n{1g#)`hi3qCi=}OEi$cym#~m^!TdzuwDgm0wflS*d_C@ zf+jMUZRKw4J_fGW$9%~8AQVdS*j$cSkjhC0T7Hq)M#;Ea5@ozXA8F42Mo-wLky&!{ z4kZoveA6qls)`T9zHQ%RxohM3vasc$LUf|`EOo#w;^PQmkHW%$53g`;9ua9H|CISH2Fr7ky zEaQb+r6h;tUOLY79ttUG{SP^mplL-vq{U@90Yqyv!<#!(cWeww{%7nk{o+-PeAT+N z+%J%#sr-AvK=}1-Z)xi9EXy`Z&K#QS^E0=_Zp^yY>w#}hB;0ay61*WBx=XEb_v~YY z@j9({DE=lBkh?e@HjTq?KV!x%IoXOh?9JetA8e+0zI;K5IUF~GZm&*36$J^%^rXD} zAJZ$&7#m1IT(ib#MsIak*=Ldm8;o);aR0CwA3Z5Qm34G4W53v^=*J?rbghk2zGe*K% zQjH0>_IOSkInVpt;+LUq3R^9f$qVol_G_g}T07Jf8z>kDyfvWwQI3B)RMS8HG;`ZO zNiK3_1M$@os#s98@nKu&6W9q>T|MSnPmxDLwFTvh`O@@t1c7o(jJ;%8Kc&Ki0d%W7 zSyc{~D4`+16TEQ3=6Ex!Ko;h511C8umARtUI=AemlX6Arpj+vD8^16GK96YIUv4)Q zbV%un$jWHLBd{Z7Ms+VU&O}z;5|cAp-__N7YhL*N2mSo!78j!sZ=C8gEh96X{*irP zw+ape?a58GZ%I0`V`gNq;#RY{>)X-F#P@+7(VRQnW!XNIa_DoO1V1|K)CaUTsCgxH zzvXHU0gr!k!QaE{_~?uC3u-tcRep-ZOhZhwTNw_2-VbAAXbmxtv4uOv$KL5qv2>f! zd&m{~2r>BGl9GOhVY-x#eNEuTJ?f@*EO4%K-(+boMRj;P+?Zwcii z{ve%aZl_n&`J#Uz4D&qIv*fTi<HF0xY!0EtebqS-0TgO zu>BIeVuoX%Vz8d`ue-0HLe6?ir9Wz0O+jX4G)$aX!ZNsW_pktemucv;EoXxu1)ihz z^2k!>G+I6R`I!Ltl`g1X4Uwt~YL{}S>5dMg3bbm{9UQ9WT*&Xl(dE5uy-&OZ8I1!R zlAe;L{$<0s*VkslO80>7t!8HkewnI^3C(0Tr=Z*(jJFB)fHHVi`7d}uU zHAVbCKJvaQ`QCHu*0b>f8F43u8)zX|Aox0?%{eb#8S1vT;i6$ci#n0`HiQ0hk=J#n zk%xK20PkN)TYnqXiy5Uo8HsR<;cu;|-VTD2{d3Capk4KzX_=Y$zPxp+qeoQWhYg>l zB0W#~044sT4^Z#ZUxR^aF7JV{evV|It?eN$;Z2K&e#H0FCO}`MmLS=5f}T5Vn6g5C zI!#!re)xJ#XRIf^qUH8f!r0Gby(9CARNQ)B@i*}oqRCP7JWQzXiuQ&x4$2DRy$nF4 zEl{Jy{nr}pe)Vx!_0C&FdiMHZjwSWY&qMd0p_Dq6o<90Qf5ke&=ux{!h$wEpJ;CCS zzP=u|&RuiI#`~9pbboN&mJ^65e%Jjhv*mlj(D9Z*4y<(WyWUQ+124mTSIU@|m0xx5 zYeoY3 z`0+f;y>ja-N`zY(8tJL(>kiY#^vdbEePzNIxW#_(?6uRM(-t41k~EC7DIxIO9FK@` zyv(tp=rW1h^8KiLw`GQ)QkD3t!O-R=BRkMw$OSYQ7Ao*=oUf(n@(IdoOMcnuhU4ZK zsxb1|08WSl&_{%+TsB=igEvvdUB~wtwFdhe)*llWVu%-y(jTe>3tsAeCBh#ce*Jn6 z3xvvUA|fX2C9^fUfjaUE!xayHarBd6D@v<*KVEttii@I-H=z%}^VjI1>hs?%)?L-s zc#v1|wqv|y%&fTPNE5|rPr*q!Z~HiU+vi7j!1qE{@71)D2mH*O>_Du(YG22Dx?1@s z09JB}sFO-qm}jz3l9h1(P>M$>dyeMl!MTJHpmOzA0JtZoYmE zFz0SYQWH())ySSIY8om}!d&6&lu7ki0f1~#F~lVw>VShmRz zrncuOC@6+^n1$*h*leBcBFzrBvWE54at{6<#@;%t>Hhuuzf4pFR0ISBR1hR5A)_av zgh+{W2_uCuT4FF20TE$zNQp>yjULk7jvCz!qsIo^Z`AAa`F`)?cO1X_e`0&@wexkx z^Z7WL7e|G}TG2gk5DFs1TegVp zT*hC1+#}@i-NStsn|E9Z_hu6v?kcv!#+s&=R=$i?3_={@N-;WzII}%dFfutM8=2_| z=SYi7^I~*Vi@agjb=`jGtU9y<&=;G6q3~_+&lW1Hr6K*<=VG)No89@FgvsV^%IrSV z*(>Ul93^Fi^o8}PSt4SAAvDNXI)qTAr8g`7?7)%g#x(%kmlckRuG(m13Eu8>% zgZliJx$NT=*9*P;uR_G;RFsV#Sd@wVSg(gwYJ*(XyO zL-!+NXo~EU6MDhS<0nl7^n*+cCb5$oVX-(J0NQgiz7R_XNK*66C5&?uE%aV(#Z#fb zn_hokYInR+gJHL*|JHO*;J`NkGt);qI)T<(+k%0hJ8Z-1uutpP1)eNK3?^JwR7T9! zHg-EjUOxc_)I%+bAeq^+S53@=CRJlM2~WSdW^cG*ik1_Grehu-P)Qy6HlRIuMne~k zs*;|6=0C?oII~=#ihdd;Qb$&zZ8~yFN`ARGC5L~Ou=wl@jZ!#xy2UF3F1o8!_K8kc zY^=Z(S%UPMoX!p4W7RmtLK?kGLeI-;EHCV4xxjdmd z*2aHg-KkZW@zE&_eA~NuQE^-q*b;hVH;1Cj1PvU%vU9}TS_d*n^0#j4Y7-GJVkc&r zF7f71{=?K=>dl~SZ(2SY4RrY$dEH+?)LWv*F~6-jaL(OuE7lw}q;b8aK{y zCI=MHe$ZLPDOL-jg~tTHU&09lsv-JChF@K2atdy>=}wFDo##b7HM|YBc-7@2jcohms|X z1M3pdKFbikFomM&cKPq4h%9b!i&y{i#R>$n`#_NEcR}TZ1A4kVijcb{gc%^ahuaL@ zfeXgvX!N>%FpSxIm3I11@3s#Nq3n*UU&n!kUa!hHh&DpP5H0c8&4s z54Y`k(N`%?c+6Bhr35E17lPU44>Hpa&KS$YKe_{XzFtsDH)$`3N;}0Qs}yVrlLJ!y!QrB3NDw-2!qbSBceWo;EZ{9k`)%7D~jn^-2sITEX4H>v(7|m{jzqzoI zr2%_C2{}IEe!7Mcv3z;;VwgpP`MAx*26Yu5J6}n0;~TxOp+Lp0_rGv$+$sfWj2k6~ zdMWNcFmSE<7sNrFh%5I3fcuekUQEi{Ttf{3_)Z*47ea-qFcEz$DJ#BZ=>01Y)!LLwY{(nz&+;vU;9sV`qNI+#R#Tni+1zT03X zPPl{}8hd1!6#_{j$928WoD4aQ8*Si_`R2#4X2zUARx;527{<$)72zNT>S?UVQHTqX z(2d#$Te(iZz2Fh>!RsRr%eT3VC152`On+W66`P)huvJl~@HVeQ$&hm0E427J|i}w_ASv!ph+?FeW9V@taMD+BGU8q2lS6UDEiQqCa_BTDFwdh~dw# zz#|RuZG98@wfj-IOq*#IqF8Bcg=^;9$ z`Hu2th%icWj(dLdmc7MBOX$7qihO4EryqC*WPL5UX+#6BbHu%dHc+b!={>-&Q3b*~ z=4`BhgV|iM z1eDPYW8@950WitU%)nZP+89&ZYvnCiZR$`7-DO4t1*z)Pjs%21iqds}F5awAzbi_z z)=<>Cf4(9T9JEnt-K_C~?I0^hxH0eCe3wV|R0v(GyMHrHq2uadgcE?>BE~-NFyI~; z@T;PE!8MbDxbjkXCE5JNpx@o@f=#*lC4iD#^2sEg=VvO_XR;2&63^9WPjliXuGqec z_lnW(2OBzO2`tn%6TXaskko3_5)B5YMQaq5cgfijp7^ajP}$RKOU8gNHGF*;g_x)K zAjd)xP}fXeaPN1>V&uu_ydS^hRkqbkUhNn?qiYngoOG)jnfz-(k&e%;TX72}MI+|` z_AUB3EjAruMUw5_>b07Eqf5B;5?TgJb~d!Y%zC`u68)06dMz|8r>wB+PT6#Af*nXJ zRZohcoHkJ)Q`v#3xIGAjmu-~X7IjvQ;7b3Kb-v-`xp^+%O^xYaSHo79yX4`ZXQ88-c|vPb6*tP%RpL;ot`e z$>E=GM%$a>gd|?hm#$Gf@rw{~X|)&!UcQcMf%C9>hp0-`eTwDVuSR3mPru5|Qk1$z zg;xR#Y(w=M~Xzm}>2mq4G@eeBeTlte~S$*ouE>{{i&ibWO0=OnfYjgg*zPkc1uu3=j_3 zLam9~`!{jRS1`{kklT`I70<(M47`-xWoy{ireCRaQ*yc-Uo;nq8+yxQD}ZC@%a^8K zd2(?M11h3Q+@c5r^0Z$Vio*BR26j((3sew=?jgL(cf9;z99ui;D!AqVDti_(oZOe; zwi#ifyoCL;+qdH2Du|P=HoL@Ou?E`vky{EA9JlyFWB6o!h8||T8lSYgdi2D*vsB71 z7WvqPafKs1G3~K}S{DKRtXUb08@HWc&0n({g2ef}D@S(|`q39I9~#q9yd9C*uD-gu z>3IgD;@EQ6Z&>rrp0Q!xlh)?(RfM|PLcEba3<@u_Dei4*H55lyc(Q)0%9!#RGh~wS zPE&2U#|dXk4-NRS&UuTZzfB}4LoGVIt`aYVW zaQ6~8u4lO6P)8;9>s7s}f}@szw_}|EAsHu=&;#dc?Ww5hO#}$ZjEO^YoJjPK8Q6nf zMHPf}Z=Q3(t=2#?F&-6xqq_m0zF3LlXxRnLSJjnbg-yxNXze{HWI1U=f8%%D@RU^c z6rUFmry?XYwj0^PgoQdG-%0+-QZSG4yy4^t)MV=lAO)yL*B}YLFLsuCR!`6BoSwrk z(K3_$V_~7$qrf4zl@CvmGq+>WQ@+QYY#8qE9|O;=&UB4Wym+gwmz`XLpTC8k^JXMi z<7hwO^o-)AJS%oXoISQq3CT85H)n9|YtYG9Ei#-aKu8_}2+23RT>lc1N9=M+23@4! z;)M&433n4x8hk6BW3VV^9Z)rv65?dU@dnpuEe@K_DC})izYQXMu}{RbPE)uw$i{k9 zD+RcVx6$ekXtUCejsqY|0`>ho#t*Rv8ZuwA`2; zO0AX;UM0@A$zqA)`^U@PETsGlT{CphrhB=xf^fSc>>yDQIAvq*e#pv#tQ$jMZ zrM(3QFhXIN5_jmTNppb__ejP+tq>kJwhC<- z7xvw3x&USCy)l=JlANXz+=PW&=T(mYgk(sS1KV}!TA2yK$qIRcAzj15--XCL*fSpG zOGQCJC~bQMx-{m3Tic6Ve6<19M^-sOI(Lmt z)T(>6z++DRBgl7`xq?FIqu@<6h>g+-uiV#BA_=+Whg=@=^B1I)Lu%4^Q-i}do{BA2 z?T?hWo9f?XrZpUXb2YA}sw{|-UqNeLz=#0*WD`>4n2fF`bb4Q3(e+#d!TSJZ2z7r<0WrMg+5ASFq`uTiIK?9yIsc1C7OrUy zypGX+DaaTlyCBOEB-{1zSM+!=Q*rayw1r2Y6n>y_wbd{0YQ2JTYFV5X@z%{KqghFp zJHGFonXX=`R@U#uGJ2K(bYxqY$18~riKw9Q^PJ!QTy2>Qt<4;K1yV&k^SGSu%nP~)vE|lyUuOZ*ZPWWIK408ZBE#G3T*n^iCkvZ6B21$tXvqi5};lUj3j2M+wdF9Rl0qF z+kQ?!Y;APNzIgI@HQsH0342UrQLUcig>Oe=PL4J-5Ko2LTBxJ0GqUVZo+Q1Ux{;LhXp$4!vG!`jaxrH&!Yz{zr^vfn}fAit@Nd6 zE4I5TH37i-o(n60KGjK5UKT=L4s=cVGnys3*whx?>$(6O28#~YDX(>hf|mrRL#4SblECiQNPqjfO) zA2XOO!2;JjTCQ-k&vNh$(%Dt&=DIE8k9tzGlR_k(Wri=0nlJQOrHy#u4{|)?fraYh zw5tj#Mkxt^w%0ENB=fjYQwD?Qhj~-P3Y(!kyS53djb;K`hV~f~`d-*9s?t)LgiYRl zU*FYTx}BMSZWR2p?0&|9bu9<(;b*aO=a5>?^A`X}=9Js92C{~C#`&LGo4y5mlHA^$ zMC2h#V8&Y?$I7a0h9VWTvi@#PX{QAZ8A zNs6NigOj@s{CpCg_uPE;>vmWtb` z*}rGw9+dZo+s2#fCE#XzRz_Ssl8 z)UkoHR79rIQiJ*rGLl#&Vq0&3(}O8ceWAC5OOLf15+vMwnz%GSS8v`F!}otAar4!T zmd4NOQG{`HZ*8n^O2dYwPDqyhgBWx%Cl&4M@*khTPOrGUo#Wk&6z4+M$e3MQh>YZb z;`R6jgbqoJHEIUe=`&NM6f4tndfu67I-Q>}*-c6tdNCg!Ow-l87RAp595*Yu&hrM| zWg+;nN=BsQAj)+q+@($>fZ7!6VAs1+?K*$+eu+RND`#$8xpgZRVP$ zZz({ZW$ZtAJI_5YyoxOq-nGuR^yAJetHVf^78opa6k`grjl>h22k1*`f;|tW$g=vC z#jzNCVJwPlh`3i;V>N@D!*0NoM?4ZeSH&GzHcQh$g{1)}z`^)5WTTx}@X*g_!)K#K zE;rmq>i)5%YXQpEAnAPMVR%^Q8TwYf7egX81n+anWD+v zKq=%<+Hw8(rtl~2a8UHz=ju;sJ;vf~VMh#U#>^+T<;Gn_&zf8&w+4+0bBlKWe*#asO0j4$z} zgwT!mtqTt^!>}fb){^NqG4ILG{T&g}ov6w;!;!1dWwt$Bh_Y7|n>^V2F!3zP>(;ScYVt)#Nt3)-UmRM?>+bxoXtgUK}y%h`)RM?HZ~9Saov&aJ+q9c#v}Mg8A)XVG2|@0p{V|V|+iz zU@HcEDc63xPrGB8O_^29lfS&p|e{D9EM$Vpi{Eq@82sFq`jp%J(L36 zb(5bhq#Fm!RQMMp@U%2>`K{)9cFKI4#mih-1LW81l|V%u0+^Ds;L3|iZ-izE*CcRN zs`k& z@5XQ9h(sxmk(k!#DLsU*v6H5O^CKiV`!>#@rv-G|(wq@@!KiU0EDb&E!W&BR>v)b< zY9Kc}c%rvD#csd;QispfW1G8jxU|aih1d5|t06C`p@qa3%{V)LSit)ewjdLcEDi}zg6i0G!h@oD&VB^Uav`?PKidZP z$*zc)k!GTokzhOJHuTJtN?3HRX*;&P0G2y-g*ozBMr6)h>`agFRHGg$WtN+D?PMJ&=9wb)vgmg!$f^6mwDc@VvE-%E| zdvY?0Fr)om+=7G)$vXFn=8*$1NSSe)7*lfg&rHZ4(#^FRHkkRZF&EapQ+o>WEDg1L zq`)>RlB(aMGpm(4Bdv`HU}oXFX5|Hwp`Ls)ZBcyY2{hwq06`@659-Hp|FeZEpmE-K z#=mqYt#%U~)JBqcMX@+~jlyPIKvH=W`@>q5oM(9>Mswj_5Fe0UbNyggt=eh4T;Du` zFO<+2N!763N>B;-aq*YItc{S^g7efguY{$R!+?eRT5~nSG-@3%N#1c?ym>V4C=nl} zRP!rtN8j71$-bGe8s7ElUDzwQv0-}Q`ZUrw7eaB(5$-+W5U*M+w~5-Yr5&i z6xao1k*)#fZXgph$!c+8ncnwlq_&;*J?s5l&Ygsj7plH_jW)aI-*wQx_jF%^n5(ey z{cPY(Y7~2>KtUrLo$x%7BJv)0{H^hW>-7}T2mI6l*W9-r2V8sXo3biL%~XJ=@FO`% zFZ%G>vOAp9*)tPw_k&S*Y@Lgn1gFo%ZWWs?5HJHtjP`FnptjW3d+4dcA$K_2Zk8>+ ztK~L}ZWh*4ftcC2KEGh00<*=)-8iKqXFX$Z|4?)Jn`C)F+-&oePK;472SiQdx{Nog z7GZ#wYB;QvXJ-_On;NyNH^S2R%J|%4?5Vq8&t2uqll!PD8~R<+Z80=BW3FYNu|X%# ztfl~=vB zyse^ZOK9CY`fv_Lj8)7A8B9bkGLW_2M5->zX!Ql~cYJLac_KVN;&oDYA!1_OJm6M1 z+0&@wiwOiEggwALzOi>edq&lYMV1$(67PA_EwR!hX^{8LXS<=_PbKoj-Qghd|; zx3DZ^-(|kmZ%Yebx;00{SPuv-|J2Pr6#kb5(4d5*y%6lJ+k|m@Vq#s)2(KC+-y~Yc zQ#*trzvK*uvbz>=SlgA%KK7a{i*473%g^pJ6UMJN+UD`8)h^A+&Nhbf1YM+u6g;Ui zE-Gc7EZq(v$DCqngj z4KQodtHWS|oA;06L|)U|4-~HZ9!0OviwoAsLu|=IB_#Oe`&{o11ND~ULSf@ze|;0E z)#0cy)?4g1DfyGi)Nj%g+6pgV%`D?JD5cdjWqctD5ulU#XwXE|!unQ2F!@`aX6YD;eiFDBQS<5k>Rj2CpvE4n?TUlzer=_% zlSpS2K69jhYXo<@NTwgYXN37FgAGS$tG|OJ=RCG!;P`-Sr%lzZ%GvL{N?cz=!#yLs zv+rryDB50I40#$Nz2b1eNw$;mCaTcaiKznjQBYHC<@a3vwSuQ=U(C86H?m4K!eAvU zMB?TQ0e;g|_UHWx9zIu&Z}^oa?_7JEHfD+DdM6>@R$=!NW!6(pvb3XDs}@d~Dn}#~ z-koPv3Ki**{>&|+hL*;6DQk11%Bf$GFist<~q7suujuO@YYS%CAcd4PS zG1d=c4%!J#OSA1pk4b*jAyzirUA@K)wfvzw0u<}-v8rA;0UcX530zcXJ~Sn>`aGoH znWF65fp=Yg6V@&KEU3=xT)huRd7b*N&t*!57brC_Dk&pMeqL% zDI<%2*vs2nRFKo|!nTBqe-*wsp2JtEq4AM(>B@rPkddZjS(8bi!N zSQ8HxxZnQ`#ED}f+FepupRRUWv33+))VL$Pd*{geTMFKBNY>WkUGJa?^2v~2$cn|d zL7#w9kvn*)N~!c45GqCB3V9Ic<6v09NH~Qg?*foyM|))_d_;|E64nplG33%Ug(`k5 zW-R4bzq;M*qjzqZZ%cq7e!IdBPs?1)EwN%zy*D#XiI=0>2@<`=EcR?dOi=T+-VF@f zM7SLn%*!<`B?9%ad+pme!A?Ye74{ ztuM(dc!cbfW0->kdp|n;d?Dw1AasW_Av;<6KI6lLI{_qtrQJ4v7W8V9-!KovT}XnK ziP!w&?X9iGkL?Ws$97&%8S0twez#StHkszEwpoMnS++jcvq}2m>%{~*2Exjhb9(No zD+)VEM~Q`!7D=CKhR)VsZ1vW@)bqkYdYr9(?nWX-kUp=_gK(WznbW=w@bnZl-M+5` zk4D-Ak)3u)5>LA%)c>PPawB|x)U&iEBSa?1o<{_@4v)T3-8GkWV9?9I3R*ZlJcVu4 zOlrQo!?&rz<8K3uWMGNp^i#uve=mm818NS3(>F~fhls7z*Jz$1jmO?Jkt-2bRI`Z~&3)9{Tpt3V=wCVDWr~ zAbt6$?qyJv$#>S5g0z#`ff8}r)cZg+bZOt$+S6ec+`Wub#uPV|}ybK{{nIe~RLY}7Uk$&93Gb7z&DF|Zudzor) z`9A;tCwc};$z|?lOwJ?tM~9tjR_hFycO(CZ7`hyfj%#xlaMBdnA`GI`FQM)-Eem7O6 z!1Q-OdWHQB3SE#hELIB%5Cs6q3G?h9Xlpv6LRrYO8Hd+sss)TLqJ$$7d+`rsTAqq- z>no0i8xelKWT{59ag6b>Af`hQ;Ypjs{&lp}A2-nfRV57IBi{h{$jKdVAl%Q^9=uL1 zV0QyFU&eu1+wz)W6hRbj8V%2sLv{zg-wQ#&2F{=xSg1PCBZss8;0L*`!CIpK)`)t2 zHx>Y|*Y9c845@T4Ypr?cTEhSSaQCzU#yrkF=FhKY&-e_>GHw89_{<#=BfD^6I3-jj ztHc4!1o`$IYFb{f34QRzC+gOG-NYiow}*#pOuPyt|23Dc;28%(*cGQq$7C4!DLGT8 z_CMcjT<1f1>Qd)dWZm`8bk8xw&N}@!8t_NTDqIBe#UujBzW3L=ic-ViZcTu4YZ7FfUrm* zaAF>Vrrg=)9DLUm*z2le9#@v7FnA~6KE_gYAOC*`M_P_!`EqZH52em^pO~yYlp#p% zp-11=??ICPQ~*=bmEVgoSZm1o)HS4&_(t@(sU-ECiI)8_V7b`|X8FPr&*ob_ zP6;wRkX81IPIq1ANjM)q5v+Clx?=-pc|on100@bm2^mUi&`@M}uq)sqF%3fh%$M7` zLwi;zOg|XhYFFN10VKlY6j%OI;vqoc5UP=|D8>d*;%D9$p0io8_`d_#$NOC?f8$8g zkeQM$4#m$SQQJ-cilV6Ot*6}U0CV{CvPSO;09Q5sPM-FEPAVw_oAI^Quf@S|k|6Ju z`pgWoRe87l@)U=%2hVv~<=G37<&$>@J;OC(-A11;RkuGJ z?24|66M9$FuSW;7S#2~R0Fzh^jcK18{R*&=m)VAWDCVf-ZMLGUHs#%A*k)gNf6nPn z;~OoiK2AmeK`*|*kST?-5#_=umg%wO97b8AqfF`xGB&EV0rr42!k{_mi}Etf)z zAFUp_Y2f{pHgQWqYwxUVN43N5@xQ5qEf)X|C|)Kk49q(ndNf3QL>N{@(wjWX;+P_vz2WS3b^f zH{%C@oH9)_3%Bng-z_0nQ?Wjx)`T$+;w%b$NMT&TZ|H%e=WBg<~kVSJU zB2oKK?kJj9rMoaZqaCfv3s63>zKpgv=T}{~JHc8gi7h)B2uhn=Cyd|xLEwL1Q*Z&O zeP{XUgofn#)w!ISV|VOqE4TZ=XgNv~JnpK_n=se(L2-dS! zD;cI_KbXj|yth*oPyfJWR+sEG(Ib+v@!-3P0Mg$_9Su7DvnU?y6$%byK~1 zXpp!6qb+EGsn;W`KGQ*uonE=Cp(v)tKV)Q$y%rET$bi(t=`{zL=Ej(M@B}mbKpb@L zO`@%$Yz{*5#LiNFcuR4#7!qFk4FDrwC?~l#XL$;XIB1mgD_6b(K&8lC01T?RJuhhp zKsn|1X?gv~lwbBbCb)_kRq;gq)vmO6X}{L?heiSC_XBsr8K~ZyjFe13$59N}>&3Hx z5k=lFdQ9QzShTV()OpiZHXi#o&QTedt2@~9t;A7&Qk)|<2R6mwQl~P{js^3iQ^@;h*jIV4i3YZ0LX8}mg!V%<2l!hYc=)>pjT~?q! z7q3ox;mM5(%MXrE{3Lb4I_z>uzJXJ6Jm}a;2|jZ$QVQdf8yZUFFf+bqT!|_liTH>uyHQjw(}Gem+in^#@O(D1-9& zP*~R~7WuRsoF%a-C@%n5WFrTUwMWUi_Kh@IMkj|+k~55jFay^gKw)TTxwbm^{xe7a za*6ix+={!9k<9!GCgh+mdF(8Q>@Y1G?MgB&$rPhXy=>IMM zd&K=jb9Xf|m_Or5;OE6|9DHs^ks*j!m6Wj2z^NU_C>qp@8L)dKN|{xwzpYu-R=#m! zUJ*mao>+fiKG;nD?LLQ|y;;1pU8BF`lwt0RQiPBLuT(*XvV#sy(az@m@$@nasWi&W zmlq;_*Z;wpcNLU1B80R|2##B@yNW;f^@s z-V=b`-`7V3KpuSI`(!5cK)Tk<+wyl0pCUdqk(CN(ch4*yT`g@neCDqht2SX1UuTni zDp3Zie@E57)xT-SJq11#a(WJdF9a51!TLAlV?g52_ov-|Abb5^-G8;(lp509iB>%F z*bS?KJWPHwQcRIag_x8_e#Zkt)h6h{q8utS7jxLQ992VdD_KYo%#xv!w9&TVNJPAJ z26&6k$6mzh>=FCs_^b?dtt{K>-N@zaqGMG91fE3_^?~a`*ZEs68+i!Ea^)!HrhC z!2ixT#O8VFj5&52V8vFljgIPp;pbr!__*k>KQY(QgW<|$nF1(i8vEmu(H0KDIL#|V z0(=chd$bJ!nb07@2mFJmon}h^u`#U73V^54ss={9T7Z_HC1dSg(oOp*(8~kn+uesS z#_yF=?6Eew)qu}V{SG!l%TUd8L3~0$Y*wxde4P&wYbs*w(N@O)<`|0V%mD!9$Xv54 zi6qXf98FIWR8Fgg(3zK|jzl^vwj{*h9I|pUf!RYgfYOJ-i-48M9m@+4h*aGRhb^qA z%ssi5P>vhD$v?d*y~>Fs;0=!RqL^NyQIesq=O&43;HSGcfE@^@82Uc6B6>RC(z*wNgxCEajw=I~9#GWC${cEQbzzrrJHg>DnL0ar= z&j~80{+4!+Y4@oezb9jw1`i+!0g3xVT3&SFIk%}C*j&kOyXFT%h!^UEY98V&66|#) zWg{H!1h2I>ecR-fS~t=-!q<^A8udl2u_y0EEIkW^7cQA&Cyos0PjbuZnrcqWN$vh& z+EyaWahCzRyH_}`{rVTyrkB=h`cz&oPN>v{Ylwz#Rt|$a0oko3@DgDZ>)ClLPlm29~PVFwoM*>CCVYht#lRZzps-`*Gp7TRZYJ zOZ+qpi51{i`rXx&7ZkO?<4)?kG>ln=ULoBT$x|inEUL?EjC`%434aCh0O>vCMAdW6 z+9>Ckv`_{>kr@CeGDnc)ewN!Q8m}gtLCJaE4X|z{ACRiG zu5jXL{Y2zA=xtS&uGiMAFN^16{IiJw?Q>x1B6Yh(`RU6+4O+)_@3s^~D_6M_g`DEBa**%Gz1)Y=xKA@mPXLbux@e-IC}?q!am>M(by>7sK`Z5f!xZaQuQ&76HcdUL zwp+p%8;gwW`dp3wv=D1U!KY4Wh(2M)=hc;p5~+ys9rgNngLbDWK9sv+YUhSM^dl&e zjY)1Tm@!_YP~WzLhXXTBE6MeWKS$NTA#%-MU;**lA+cMlu)8tC|5i4S8a!#v;0Y3U zu_h*nUt%^-P?U3KYW&-hJ+((1ya((N<5P?ng-5P~qx3E*>hq2HV9l@Sdd&goYFAb8 zWn%J-8oGz9v~K|YJgWD$?j46&KUnQ|@i@RCftdY%75aYN;ilx=xgrD0<%`T#*CbZ< zmvt2VVi?RB+P7Gbzde)~xsB5Xi3r~e`3`bWyXV$L=)0b+1U~H~gy*0k2LM3d;$-p% zzAhX0M>zBu|Kn-=?_1*`%2At+A}Dw9OX(b&;EksVLNAZC4~#Rw!aE9|?Nud+5rOz8 zi08jOCbSy5Ut=HcL+lcXK$hZ9IcS9R#AQM$h|*qBy>S@Qv-?tn9d)dI^D(MlY*cc= zR!+;n`T6ck58V?KT>=~&n3ro zqnYKT|IPHv%*5bk7ZRs%1b9o4zVaZcpO4J`Sx2ELv$kHrrjWw6sr`=!$na`&H_=z1 zp9Ryu&WW*2!E{N6t^lt`2z<#%c;%lg$1R1sUkQ8w*ae|Y7{jRM5mEjL)A>I0?jm#zNlXJ9BSL z9)nljPSFMoLfn3wF^Ppjo1-v0jmv82P%8j}d^$ub{in~qnaO%#x#3OaT4|oIukfwX zXK2tpNrLH4AfF7sZA9FuFimoIRy}uTr{7o)Q5z#@#Bj8R#6VRNA?jm}8@H3KSge~E zOdgj3A~2wpe(C`%C|a*rp(x@e8k|}Ixmm^m*r$z(AZ1@W|GtU*4 zo3>SWb{eSf>>o9PUieawxNQ-b9J9oy6MTQ&;XBujte@tSw}QwlF#FU^px(uyRb#pM zXk!&Z2 z##6Kp($;;N202O0askSQ_0k8@8}DjEfgAEd8?;|L>K zCq}zD8rm*`V~Utun{d@U?pD{$CWkY6qE$rj?tMy8|`30m-@PkmF6d-E$CAcjK<8JRYspIrIZ`vP5w# zDSYdxkvBWiN&d(4-;xJDu(PpX1=0obUkLgKT<^HPwDU%>~qRqK9ktG~*mXm7z5dbO+Eve{_^3H$@Hzb8qr z-nI3h6=H;3&LwHAcW9Nf`kH_a44lGKW>GKXDCXT848auOHucwg{FnHSY`94}yu&pn ztf#vE`@%po)Rk?#=REi6vTO;trJI}&XIju!K+X@xF@B`vwqFhHt^(5FqHiWEg=x`1 z{iMk7OEmqj^3lOCj7_U+yRMyJ;GjeH|Dy-d2Nbm)KjN9a4wByZF}Y-WSwQA}?^o&! zrFf45I$2eF@0e1x1lQ@y6Vr?5SSBx5bRKa&zVcjbtA$D{D+gUs9fE%Z?5|~Z%kvnE z&76zW>q_{HFn%N?^a`L8d!qqI?Q$OSsOW8-(pm-%DB>E%4Rz{m&q}A{1rR-RII8UYx+~b~{c-gppf)Njh34*&l7o(IN_HCjkDVUC+g2-9*2{JU5&&2c zyNum7FB&COFoxK+S?D(w9<$kA&dkcqF=#+U^pzy*k(cPzy{`$A?wos{p>==r)I*LCti&*6@>GORK3W@ z_>gU-Hc-V6ldZCyaC@i_Nlee_gNnp4PzW{FUCwP)$MgcUySQqFU2qmk(PNtzPNk%l;>lZ&yWx^JE0}mxwF2;-HLxh;j`t^&cEl&GfiF8u$$krj8UmQEDpycRXI?w&8ae za~?dn)mT@zfkb|ma#K(WeBWy zNAni}T$(%hrXhmxdYD5sKKP&Q!Ni=2(7jRaLmU7=QeU%lobE?&+O=_V5M$~2dKNZS zPF9e_4?XTHITkYu%h(B9g5GX5v~M(=`wjJ)JEH-kIg7sY{~*sM6Ryzp3 z-DHNPLT*;Ge~4P;uU}B_f{uiPqeM{tn@Vu^BDjiB>$EO>Y&Q$QN;Nlivbfn4QHl&5 zwyX<#RsWnXqSHKCIB6Jq9`CiJXq3O=Z{1Oc(0joNzhGH5-8@2^K>je;?~I;pwEUSaBE zMn@NROM!OrO1pK849`7q`jtnN;;*uZ`jASo!Q28q3&VUNx2-F}XiVFDwh|&YQPKlF zu~~ypWhCW*yK?A;_H04=zV1Z2LA7d8W3oVK4=k?0nr)(m*=3QNyKA>O(Y30gFAqQ= zFLXgpwwp6O<~uS5TzkJBzoUeUPM9o=0N?UQjNJ*D<45cJL+3y;WjV}+D>x9Tec`LU z^;*eb(ech(tXY(SF08uKsm81Flx0`DB*&N7EEuRn53K&E0Q@S0>!>JA;N044%H~d# zVcc_eu`tp|B&?t;w;Ir$XELseUDkUZn#S@Gb=l>pO2-+1(Q0Jj^qQ!&Arb(2J`*Th z$JQLe$aLD|uiP5+-%O_RM~_d9rECJeispn>@2Hzn$r~w?)u7B8KAUt)*{x&*w}vM* z-!#BN1~acoA9EeXB5Mr68CLvGUd{8eI!`=8-10zx)uen#OP7UI9Knl^obT~;{9`UT; ziF#zd+G}vl;$B-lO6qJq`E zPB|w*uxz^9V=bUwy7I{+_Lz{@u!_7<`NJ5HUZ#@t0kpBm;J=07eO`ORg})^lGw z40*!hmoN^mrbcTSQ+e32>tg;dMn)I;-vvHjBiv% zl%9_5c&rx486-4b2<3Y3<2x4_I}2HDJa@0zu${*jSl5zqj90h)7?TQ~^g>S@7P<)T z$2oRot`}`2SFOG~N0OzkXdmvJIS2EIl4Evj0Z_=b`(_Jkv|c^INPif46UBKi)vc$3 zBFIwQ9$9bg5+^m{`qP3&)ZnJ1eMSn&O39|SnN06)FIepP*B;(dt|gKDFm{RW*W(Z!9OS zu}||@tJ}KMxh)xcvsF;A4x)B1DB8VH=Ie#owReiteWym)tV3PGc4Ax|)cJT%&LK~z z(AdsibeS-=4N`qL)EwmUHMVPL%6#;U%XTM@q*Y81?45UE4MN!JR=Y;g;WVL9!<~Z= zZArK#xXApP565yeqt9xI*Wpqcj!+f>x~clndTpiyNt*G&9_^1CojL)6WKQNlNdIMi zqU7bTL)K;QB}K=Imo}D#OWgNO1#m-}La}g649-m2lw0rDOJ=>Q{4r*|uP^e!Sp)ix zN@11X-0=Z#i(-R!w8RH()UGp6e4Ns6Q)*Ib!D_~ufYAf_K0#r6N1fOJgp&EY<8aO_ zP3xTMpfMXsY}?5<_|g3sptF>Uq)HRrZ7hhb>I ztzs0Nmdyyi0WJoi`H$eK4VVoG{Ik2CJJ8m-RuoC9z zozQlr7vi;;c|`7wB(x{O&X7jm0M>h}9eih5cO0-N$>I?4(0br~a`gOpJ}Y2%(2m=D zs3KoM0nt=E&G1$A{HMX#$1O_-ztmL@5AHLNNjJy3Rkqpe%NHU#(2EyN+O$c04}6Ft@hWAB8O+{RI#c^2E9 zV*ub7J@QJom)&D+h0t!?p+47|QUIq?H*pHs&t!r#&z;+gEO7I2uLkhQ2<7ieI&3kP z;BEh4xTsCZoF)x!i+`cu+D|?Dr^lr=W3xwQd#kZIT?sC6$Bx5hQPCE$7D~@|Wk!Fb z`?OTI0zl;d!`ppEHMwpLquy4QBA_5mgoyNRK|)7Gq$owC8hY=M9v}pzN*9pc1OybM zL+C+zZz457AT;TO5(xD?L6>{I``hCk=X^iTZ-*E|a^Lfr<(e3yU@Pie0Tb=3=5H6= zAy;L^W{dj#8cCP=7jCBmAWG?C6!I_L8?XvKJI}+J)UU`Q18P$4wc;;_Nil`YxHN*#%G(bft9WS`C3H2h2`~7uX zQEffhyc`6fB;lfMSsE95TGygV&%6i2_YSu5QtjsOBYL5zCbX0dKq5;~@%euXY;`xJ z@IveqYwIX07Ut0^ZwJth(8Th|%YR62lBU+l7PtIOB7fc!0-Z!!&Ww;9eCaoE$N15r zlIKV)aJ1~aOddz|v6$O0^ZQx!CMp~(*9~gn=JCl6GdvyCaIswbh$Th%5+EY$wf7Da zMdUK$G~6|N5iMp~fz0TDssC3I&QNu-$!+8MY5&8k58hq%XO zx_QbMz^j%OB@y&zT-}O)U$er*CGVgVD9M9Dti|kexzI(j(MQ!0G*W2m?F`{xAo2%& z2QGf&2Y1Pd4FgPKSEU{b>`lEN(aFrrjx!YqIk-z+c6bLt=@#}87+j3`Z-a{@e!$@3 z_>(^DeSTv{c%hw1x#r3T!aZ2&mzD4^S^CH99iu7Mf$IPF9ZWoH|37vxl{&?;q^Nl{ zGEABr%og0|O=OS*(%&2&d-_L9nk!FVi4TrN_1{)|t54{N&861VDoXI&Qf%ao4NpV> z+xqN@AhNOY;oU0$h#aHUihh|R9$!@hfXGW!sl|!hVk6!A_gCA$t*%@g|30{ja{Y=K zUog95s^z)!z_VZ-b2zU#c^BB#3O;!R|1MuAlyFIbk=>us2x7PyG}!Gj!-}X`B8i-R zBXmB|$Vsp#j4lQCa;|g$0R>wN;5=t4?dwB%?Y5u8>zkGWr1lXzZH?h0p{*V{z|O&m zV~vZ-u69smen+39R(z?@fu_EtG7SLau5W@J_grL;uXP(;f_}N_u~ObG5ar$^!THH3 zP|V2XeER;JfKp+(tQlIdTQ-L!45s_QMA^7UX#X0z%DbEfwjY_jU1_*K53XxYIb_^S zWX=6r93;Sc)NiLFVWC{+;1iN)6QKrvNC<+ZRT^$pV~)n`yvI$T2IH&B{!E_R<~gfh zQ56yDHa|X}8?|g?%?LJYm))W>6(u`$kte)CgbkAR(A)3Ly-HTIE(g1!ZAwBXHsB-s z*N-xbp<^R4Ix(1md3>p`^4+=_#&u+(D#Jmd40!yt^bQ6?&~Pr3$P7OW;>lC9Epx8C z^n`KJ6;nGXg1jSptO%a8z^?`xZP~9?;y;zwmkoz)l`J!`53It!Wqk)O##KbW_1L!R z*mnEU8HiJw;&55H1~Bkw=0!T)BeuSs4amstL>U=7wE-w1?mFWJz-%abRq-Q_r$?2# zM!f2TTkGl|bR|p7a>6;_rcq;*G#Cq{9OsW#`GlARki@{N0C!^uI33(SPi`*C4XgOBxJ}{tb9&9y&m=+cmYmpO! zz}R<65LorF`{S!shibPDjD@^$vI#LhCOK@A`f=3#p*j1AW0cHvryR(Ov^y*uyc}%f z#Dfl}4p3wXMi`5kcSk_$$JgWRHR$%hIOe0Kw%@T!YB|rgq6?GbIdb&Eh!N-eaL^Rm}xHcNK>U$RPA!o>qBK-r^-3@gV52; zuj0L*zzQgMSFE^Hsq+WEM?E%?2%YmLlBQqlj`yX&1T~3DT$FEy(^(d;>|~eXsv3-x zR@f6>!Btz(c!~}1FP?E68=5b8I;{PaC+u@MRo-M@s@V<_*TUdY`$bvjbv@x2NkMT9 zz8RIegWDoUyVxGAW+;k;gOqHmB9dEq(^Y#&K<;h%)W@y0jx(twPc|AESZks?T)l^M zU3IH*cAgV^P3;5?1-desA5G71@1_SIYpohXRaXr>kJTWYSTRnU6Q>JXFg`9w8kI|? zzCwXy{vr0lC{XULd-GxbpzPc*o3ymF5J|xjcHPyzqZ z>D+UW77F4ex6C(B6rT*kGE?Q(!#w@5`fY?-h_EybE;UY*uw_r07=OY0^&IKn+|Bg9y0R4XFjxl*#_PyCAbLC@Z|yj zQYr>#vTLU9Z=0_km_amMM-BloU~AD8wT0pD^#)N~^h-$=YxmFRStQv29t5n2=~70Z za7~c@*EXRSZsw?ehp?6Ewsm6x7#p8|cGP<=Et}w+wxbiSSZc%vcVZi8DPlV?)NI|b ztZXT~mB{M;;-N^hSFF?=#1|pKDe|-5z8AmWY6s*LUGVM^U%;>Xe-xRV3wkPPQZ&TF zar{~fFp>`%l#qPxciu6oHoY_eTE%2cu&uVYFn>!dbHDC-)~PG>>7-(cX4> z>&fi6B;5gBnA5$N(DqV7`=_!uM_^;^)-9kiSj!j704xbA*m}18xi4r%k}r&3r0k+; z4`GA&XuRwbwS;LjUJKFVu>006xUWaIGK80Ky?ROvEQtpFZr(|F4~5hc=f|H#^&9j% zBc`&1Z%Gu2Zc`B#>q`&?DP>M^UktOBU**>NCT$+nZ_sHD(G_ZZ_6QkH@@Pb*Q|M=Y zN*hQ733-@ajIdsI?jK>EgS}?~dW}%9q+QTb^8!t(N6fyXMtYbYMu%w+c@s&^oY z_j-}m<0RJ+#f4r3{wF*C;g)BdYu&<;%Ya43QjKHpPIC~a^z*(vm+ z8k79aWj67p%lr1|wV*24PHy-H$CHRx9VtVzikY{=^^}UE412&eg#LeFW;t^c+l3uw zvp;duU#cRDDnHa8g|K|G9LOTX=!j1+N#3rTnAf-$t3Qg=kv^I9Sj*RgZ*;DY86*QEw1EiD!;+PDUzlN}A+bAcy%cu*_#G?0u;sP{q{n3+tsN zWs8_{^pBJ=FoO+gfHJ|5cjE%pidYG9X|UZd&>U8`nI!sDD$iiMNgQ*)pv)STaBLQw zp>VKLT~PPvwy2Q+x@AM?Esf^Lq%Xtlv%wxc6L4XrVO~>ZQ#tseJn+UN>n?4N4Ws&- zJKb_Fe0%iOH^fz>LpPfkwuYV`H43_|1lT#jugdq(*K_opZsW6UA&q!Csv?ZXx-MR* zAx+UM@xwlYi(SREyBBxDaSNHoBs{$?^ty5)W(`WK@ARU?ARQOlOu4P4cF>hAwfMjX z3OnR7MaK(h&#Ji~r>DQ*fE>LoxVF5IA>MI?tjUp^$RzjMe63`+RRS<3H|=fH#Kf>; z4X<)5AR(AfF0n$r_6!&+uctH3It;%+dpk0d!GkCLN|(z}a3?WL<^I)%J+^^in-22XN3csRF- zUw?bdqM?EEYsCKL1Wio9`v%&av!-Gwz5VbkqaWUdg1qt z!-!=R3Fs%E9@EV)GrFtYWSQ07sWi_=QgS+Xi#z?HJ+k=`Yh^OJSk&MoEAwcAT@*IK zA3^O*vTAF-iT%>W`L_9 za!qQOGTft_k!iZRIVbwQ*f1DACVDx@7JJo8P<;QdeZ62#po`U(Njsic&|SWB)8ydJ zSgC!&rYt;%mRQj(Tc&!oqj)4E_QGtG(^=oi5fQ6XDqTu~yPi<|S+WG9n(~e$;jo{1 z=tI>kQ58G>ADw~w-k*M7F}A>Hi~1L=cItKzOC4!!%>rAzP^tn)C4-HEhWNcu%uj7e z(NG;l9*}e;GqqQu0D&nEPEK@^Qxjn&<68F3i!y5Tz;r*Q#4T2#L3#dMqaIXKc69y z8{DP|vL3+h27J)uIy8_{P4s`}V|J`%zi1Ab?o}{7395Y#X_uhIU@0zVkQ&jGDX6?2 zy_J9!QTQS!ojtqI)+m%Dr=4vJz52@K&F`uHLXJPpl5Bj7e|R?f61m9EnbiNKHTD8E zBvzt1X{!mMR_IuNegRmkm4|tQZPivT9uqs>OWiI62<6YJQ_tVjU*jcE9m?CM(3sPG z>~}D_$8z^h`ZE+e_8S`?sQKwgP#_mOv*<0n5iBUMc$jIZk5pgiJOicEPr*qmL?4^b zWLDqH-dWtIDP0$qv56{u8`l?;PLcB8HCCW%nL*`Eja)?Cqgm( zadT+G#?Te8&t96O^HK^Eh#+n&I&7CyB(-bxQX{v*zJrWd8_vzwUr|+NCB&~oM+!-# zlmoUdk_PhSIV4YIfCKFsS?6eV(-p~MQ|{S?`0JYoGhM<)iqG+!|1n**DdJi+c5}4R zR@o7y+(6Yn{?`qF174T4@nusUU%|3>?k_8slz-CLmFTOqbc(c18{CV0jn{46D9}f8 zycgSRY8w(h&=Tv<8fS&rH~+}WGS+<%xm^MRzq-G)DeHBwHbEn*Y;nr?N2G~Qv2ize zrL!?5#m@Jp<;sob?s=%!GK0j~B!L;lQu>1v9{ZF@Pg-zwOH4WiZSt?&LougF5O-4E z@lR;F8&LuefV>VT4IgoJdADVhND~pno6cjW$vL#!G0xRJhoQrK6IY1eY z_90^WMVIH{u%=7OFawsY%g}DDP05Y&o3+ zZdZZ2W(vjLBy5*MJxjLBJ6GE6j-Ni$K2bZER8kUAJ`$Qw=Vhx&V!;+($ZClr0m0ks zS|;bAZz4e7zZX@uMLY4rN0+*}HtWMv8MQLo+o-c{Dp}c^-Zu#VweJ#o99gR?Osn`Gf>pqYPc*U@D;VM*9~jXk?KW$o)rVx$h6-+3!Oe3_VQHh@qZL5W3oX; z>)D#gS5XHjg>z`VmY?#)*<)8HSWJ9-cnTz_Vv_dSe1cOKd0CF{w!(`dV)gvn?7xIa zoYoo9BKwr`ZJZ+xt>j z6}6S(Y(O=i`WnNr!Q%bFXSowNp-mA-+!%+Y#MjpZN}a0gd$XLEmgN>nN=t@w6Wq_y zDl&FzKJ0G`;JpiscS_x)f#lDj3Zra;nXcqKz0I`Z%XC$XP}BeV_w--cbK14dtaKDl{Hgi%%Ao#?=&#gS+y7poA_!Z+q=PXes!wSx z+b@)ika8eGr1_*mQlF%-dDuKc$^+;qJ-18&e0kcIk>K%6H3cOY)zXm4CQ_46qr5Y={p z;z4`JdFuhsxu@TI;iIaymm5GlDXZRp-U>d;z%9|!=xE31MlMiB)8BYvo+M7(P{MFq z+G?v+Iv{g$q)=Kl#0NWCXA?q;eOYzdN%r~sJ5qL=PMt{8z`rekJC5^{sGa(c^+3!j zjt+pUmPJbFcHp1qqQP`>Tl3wHpB4PHI#TxGW++e6TZ->D)L-DvHTa8KKSX>OH--v) zn=xZj#%%IkNHLnTB{z99-erzXsKjR=6wy)%PT>;m0t{8xs2QuChs}|wCCNWSL&%kj zG6OGhliOL9*eZ@-xq5~*bH~osdmSEVz8mwj@B2h|g}wJ(cg-jY!vWKMu482xJcwj3 zVu+nR_oX~qGsQ?5JZZgCuCQ|%ZRed$N7xXt-_Ym*Qe~k_ebV~VXi$;uc}(m_yL57r zx7XB@t~4ddh6#nPoUd!|V7LerXp8c@Xe?F~3mhD%@Q=`8tHAyvYr@vi0XO_ZV)@&V z@7X`dP#g82OK1i{;u(wtzHXI$rxCBwX`+88P3boB`b)uA!I)_1?e6fmV`1P|46@{U z3irU2YR+8xg6vJX_WLZW_^njXI`sQS)B0sR&4r`Cv?U*Qz8v64*}I>uZwZn^=Gc4( zc2mtml9KFOEK^QWc2St}txfh$l$DnReA6)!PL{2R?t_MTB;J5R&^eiwFEc=1a69q( zSDj#GwDf{PZf8N(H8oz_F~WCER|~Au%pE+dw9>$P6H2>m|scAL&ttu!Ok z1E!X8b(`gkgS;@e&dVpXx=wGQ^0J4==A@E$=V?+mK%U!o2ec~#ef)0nS>=^(2H{<% z-H#u^P!SCz*#LGtfSL>S0;lJLn$zz+^w~|y#&Q&X>|%lLKQ;dE=i zq*PcG48?PTc$)S0{?h(R(jwf-aEDnWZOoyQZ$(VD`k-N)1s|GkF#wx6M`|^oDryu2 zYczVYg#W9F(lZ10VS(VnKfb=>+;E9w1luo;@ei^^3x`WjmaVE-4_xE@Qu8fIZ7njq z@Wl=t_AdRiemx^na)8+?6iDcbcLaJ~m^?Z(yQc4AdnO~;WVDX~*ZvxMrC)>F z;RcJ6aDB@=j+DZ36)YNb0~6Od`h5i`hd9rz+T>%bduwY_3~dayE@J476NMCEF8Pgf`)I7cq!Sh6&*kLc=JZ`|ZejfWh%rEV34$6sn4Z zyDP>^5GX;68(#%PJ54H+1U$TJ9fq>Ho%x_QG0@?#+&H-nO^9ufK1o;du2v(9K;#Z( zIFHG~$PUjUP(Q7f8ye&> z@3{1lTV3VXNc9)h$l0nK;Zq6g#;!%nPYy$tJv(vHkOgaT5Jd=b%Ys*L9vr&fbX&Y- zyA8w`j!U?#LO&+N^)jACP4>)v{kbr@pjwB?Hl;2fK?2XV{S4kiT0krR~CKe@bE zQJciYA7v&dLBAG%P@MKXuKnqI!5isI@Q*B z?i4}R`GX+KT!_W8q%42R^O)TOFt@T*2fJO{b4|-6qugee)$Op4o?1@1eC7H05yz~P z!bX}v@5nIm&BnoOsVxx?QTrqR?3%OE!apyeG{qpV3*R+HB?d6xFISnTC&9X9iIa4 zTog+Ajt=X6-H^*ghN@p`>Zj@U{Vpa#J*R|D-mC}>DRW9Gzl}^!+OiD}OU@~;oj}PN zpr;GHgh|gh+NN%0+mcdlH}cu}04?GQ4(_kk!#6 zR#!3BGHEhukr5hI>vHUL@bsbE%f_RsT2cRt%4zRqR43(Bn7Q;zon#=#nRxs~Tcvpa z6~2h!5e7Dp)Y415p&6vD1dhCxj>;NM2R=40!$rCioDH0P`8r;tCfXq@YX|QSLa#qi zw?b(>F-eSObSb4sgdBXWo~)`>=l5xPX7j*g`I?<@T1nteNs7<|dSrv~K?Lo3RiYQi z+wuVMG>lqgnzLJm6uqS&ShA?|<*|)?D_SKzHf7H{U4Pl=ZX^SRlU9n!zBJ7>`T-Xt z-*dCBk!+y%ppE8i{>lpzspDwdN5=D$2kuGxE?uTBOq&wHv328PHWmq9PY8ezIfk#% zFOjVS)kh73_WJ^Cy-qgC;(rdLjS{b&j`G>hj<1{7j%+Oeldx!O=tAIei-?eIBiT`+ zJY4h1B?gj_*5ul{__ZvgmaNxI_g$M#67c3QlJ9DHIZD)X-)Wg;89)0>Nd-U3&(%^M zi*Ee}E+9ubdPBPlb#D~29&S9P##l^yaF$NLvMyMKPr8`&dZBij_LMQRV#@jEkcnDC zH*`xRzy(`u8l1S|t zzAWpoVVvG^@QJjEiM_d@j?~4{qBhtLIQN-C5rW!>td9f`@2`g(0 zHWC$)$&S1+QzfN~N`oOkvYcJN#bq8ga@}T2MLj;d)T-hitLqX`zL*v;2Djd68S&WW zkeXR|97xSlrZFMEsm!~7duF(c-a~UBuLq2@_NP=f#RylAw!W{my)qq2+9H?E)*%b> zXabo{p*e^3JjxuWWf8DBx!c~}0Vwlt&Jk6GWi=)T#D|hD=)Ne34A?cZ361`uceM&= z(qHB4|1#NHaSU5TBrG>Jh2eD*fb{;vaV;&%x&a;TxXK(~qtzgs;hs@o2XqFOo&1YR z?Iz28eoP3@-Xyf{NT;6PUL5GBRL8&XB84a2_ELsCXXe5LI`z4&ms#($RXi5wttlR) z6ZUemXJj;r%TZ3DIvNmz!;_QzZ?N1ln@z+74VerswDu=U~Q{)OTa zbIc0VzdP=3<4l62Cq!RsKC}n|tu0GWwXK+D9}J=QK!cx4ng@qhyTf!CBC%D<@0TA| z=!m)7b*#^s#|y0`*u8nxbtz+`!L^-mGU7o66U*Vo)Sb2X%a@D!)~)w#y!Ze5>o3+f z26We7$-I7eE!$4U-n}4oY-)RKhyz(;SFJBrY8!kzU6|C@Ek#yFE$h}jf99*Vm@l<^ zc@F1bzBn%pNo23J9}>(t%7+SvO9RHLl~!|fffN(l8J=);BAv_~zjQ+ao2hu+gKBMb zl0P!s;R2>d%T;|aZ%<8q@ABs=4k`Uca}ivw%aw!g>RjBF9WEn&EeI$u_Fe^_FKeEo zAiQ&a9cTLk$9_Yv`cEn2-B`!FSa)Uw-ap&MqJFgP-mh$+xdm z2#SJ5?VWyiAUyOKe}F&^_j61Z$LSI_q78-H+pouNDS&M42{Mz$Bt~>vLysUoov}gr zll_{B?O_WsNDr)`nVYCP)u%W2CVYXfdX5z<3E$1QEf#^X&ym4Jf`FpZqUBAa@3?Hx zm(FE!9VraWZI-V6x1 zCVR6ne5s^3%CuO2@4IF2GmzVB)gOV;x7#SqL|Jd^A0qFRVy$kFXhdboic8C=$~S1L z8>bEEsyeai=ZLkz=fcmML7XKvo2-KY8$iA1ksC!hbd zli8LC5g0LEH)A+m|5*CniX-WDI<)gOepG5{&jfvu68vB!LpM9^BD~i|c;n30Rc<4CKBrLe8X8UpIuGC?{L|Q%*hx$UFSqQ+hY- zJ);?)$!V$W{A&CwuWCOA>kx~T1y7(!yaGB%aq)r3Wsc+Q)Oc;3*T;loW4BaK{0@h~ z=&Qwg640Hy)%8ZoGn++y61(Hou#*GV5{7AIVMY(MEab^i2={!=2E3kRg&?;(%SAHE zgdGs~*HK!^h-c?czBOWMp|O;u9=2@rEIknEe0}FZFOBnB%@+AOm3@@S2QSX(+C7XX z*5fEI64<@*;&}-GCtLo3lV4`tw6VQ62*Am%gx_#7gWcY}Q#kn`TUh{w*dOkaaXfbF zlseiT$f2vDdK8lp6O^Z-(EdHCi`-9}V!XS*?n<~yL*#TRp>(UKeEsptT(FJ!4t%n* zuIK`%wPR;pgXDaV;u1yb_BF4BWa!q$d;lfL53y=Zv2#Iu@`qbrPi8QG=@AwO*{|AP z%B|%aiAq5!NC2}O@xR>U$AFu>NDXls`yhcA>7^~Ejcp%Cpt}){1VyN1%cMr!G9*he z$)cd{BZ%bvy9+8qr0*FlIcg3hQu2I$dI`_HY;j;oc6d@JWM>Y#b4A0bxSystTuOPh z4i^dq?%4UUP&CBfCf+GAdOZf>Qkv)hOjN|kqR}P-G^vMs?I`u`Qp*XVn+)Qng`-=( zL0*^c&L9nPXLSp|X0z+m2wkObf3YxSQ*z&S%| zW%K><(_=RL1oM(lv&~L>f-~@E0(MXkKPZ!kUx%Iz^;77^{NI~8(N9hz`ChdN3 zXP%A6$SwkyqXOxFJc*hJsoCu4l+eeEq|)sw!*&CEq-L%hyxV*^eBfG;u(WCjQPbgV z?|7htO@u6r#+bu%Ehr9@t~=5=N$3LO6_Urbb0ahGkmR1d-QH~Ka&5-f(g~{}T5+>x zJ0c57woAgHsW(I$O5%C#eJ+n~aPqaEaa#_TSt&9eUeam?%x-Z%r9(mH6C?z>W6MF% zXdEeec~mV1SAif4D%r=jD`s+pfc8~hO)e}MV|0gscJ}13YNZL#IBs53SM&|Fjw--8 z;>zm?&Ty8lIh;!L5En}(g~>RvsWzyQT&kh7R~kfYHR9ty!23@sF7?)A-kqfaiH$l2 zCaim`0Glt5&){?*{g>^pgwx0Fd_J>p*L3L$&+13ZFOiW<#^;C4Jw_WKwR#(`C!96W z4T;@597#V(lX&rW%1dhL7dv4zdO!+b9qsYQL1H(Us_ESrJOV~ zWid}$MY$6YZ8VxV<;1m;UTZjW&;^6$A^WL!Wgp>mWJ>X{IN8M~)q2cD(G0=HtfAEE zwX&7>_3sWFmZQqP==;cs0iR}D{Ay+1il}+ePW0f>7!H^w;5zbK`Kql<3q0MYdCr)E zKoo_$$?NdWmU2iisg088#z!AOP39n=2f!ofW*{!PbS;r=`995j-*W8+BcV;*G)*}W zLt3zs0ny-mn<+VGvhXIvB$jnW`0IbD$(R09P44@xCUbjSQp&jn|65I_xJ+Dsqxx(8&Db5$zB?7Oy8P`w2x_A369zAfiMwyY zh-z{K&+iGj0$@V!LR2p^Fd;_|X4MSlSuQ0`$mJRdNv-9WL5dq68NE!NE#@{`oPJi5 zQen=o`Abcv`lp(#Nu(AIuMnvP1~^y`-ze^)F=NmLwf$)!7S0};@sldJWuI=KQ4jiW zHF@xlxS%philEZnY21(!KYd#C=oTEWs^#|YdwKjCK1VFEShXLkyT>CVJ@_S?prkmt z@w7`C)5UL}%n>UrZ|P-`O2D)!ur-B26d3T7m)sfy_+$I#A(K=7SVQphskd+m;5AIH zF#pqA$ou6jun@fkMR(v`)f5lrL9%-Ui7W(`mri}oEB9num<29|AqGwUCs!UwxNlov zUcCjF!>Ai%Zj$GFg#^@+R3*G(q}pFO>&>!K-C<`}M||@;_Ho(iH$L<)XUFsQ4l!+v z;(4|*K~$WKqUdsF^!YvpsE3!7rLx$4`up(U-a8>Z752*qkUR1Eu|7``?GNvxi*%=# zwLLa}2%+<3B2V6Hw;}^!?a%bBf`K;l9$oHEKO0wsA^2dZG`ziF$@T^^cG7<72Mb)l zMe>P6EArm{uoq!}qep!;@~2F;_~iUlH@h-6wlGR_CO5Es0sR2AUX$bSg86M688X+1 z=VPU#{^x`zNJSG}^i$u&iLHfJq^j;j18K=2fF^J8uDKz1x^7t>?hlzw#>(b*Co(`tETE zMZ(LQ30Y?$mud|l<`38=?-=3|`Pwf6X7ZzLTA6_2?qb_ZB=RBE)??o7&(Zvrtd;^E z3Z8XGyXARdL)$XI@<(h&=+aC}c)3V0F1S7|!P(dH=TeqW=g{lr{1T+?Gr^LZ-@OZF zv=TdO6>astAQVCmNum(f2bs}klpe_xiZ%O&GNb;-P28OZ4v__&Zhjw-_j(fPy5flk znD@l3sJUm%=Q0k-I-->J3!xIC&`J0K?0~}aZeFCe)7Sg!f^n~Uk=Nlp^X{p%H#SEp zmok$pQI8C+X&u4u=NA~AYvuK5^TkQa8>>+zZza6O#R$%J$J|94q>tcat;ERl&9@#5 zckxk9pvbfFT4hNQcwrcTHF`4F40g)yG5osbz zfF`2ipDcdU1lh@Uf$7Sc>RnPlCklRYZn@?;#k=YRCo-$IGDi}pE)l>6Q2MF)B*&tJ z4fo{4^kT9VmP|3N zi#03T&${J18MY%w-p0uXL9f>24?Jmvz~vwC1=j+^lW%Z2?=4(->HIRFB1gYoJOz_i z0n{0|j7`r3N-5{sZd8RW8OZpN>e-;66*&{%PFAqIA8y3i#>=JOKTenEmuN*4|do(#P zUcaWQNq3n#$mSs_ZByO`WpTyOv?(LiYKL^J?{h9$6y{cs`-1~Upw~j|q3RGt7~fUx z#4(6;N}DFPeNX=d_buuDHaQoSUk@mge^G(jbPX0ZKUyLIFqt*4XkP08Q9q45>Q)?z zU0aK@AcDzteA{U}i_LUqibl4~3?;U8Uen$k1<(?iD;?+3pLv}FiYD}zKG@#6q~-#GsaLd~fA5&$j|(VjgS`gXo?a&^B^!nBRJEU&p$~tRc6?74FBTl`aLsF^1VNIH(AFD%MA4dR930fuI_r2Of8fho6imaqUs#sa zEw7`wc@bSJ#9_(v!$O}Btks|wmfKK7C+e(6C52TX&(NIW zh+t-_RenCuCJ#KN-sKN?9x^?sBTe6+-vd@+(LX+mm0BTFHip>a{jZU<%6;z?tRT^N zOvnS0?b91J`a+Fi(K*|chtFdlOnGC=Pn}QB3wpkt7yWrsX1P<+HJY4nc*5fK%ZL4A z7;kZ*NtHInu-{|zWB?>N4BWq=@f%4dUfcf#Np?O(k|X{`k_-6wJx5<%k8@szQISFI zv;9aD*BSYXz|U#C&Qvj|BugXiO;Cg%TBU!eVc#?p?L=R-kudq3j5wrIDjR83VRUid zT6XBuV8EBN-g>}|4h|aLAwD0=sXFtF>pAsU142B_`#ssQCTBofQxN`ik=>^7EtC(O zy__|BwdgI~jl@sm!98xkd)s-I(#tcFEllswT~Dq+oIm+S-$V6o(S{|FN9AHmts&j{ zLad9jN-}}ftbZHH?l^kk5}hBOy9T0$4g2_s7)DP>akg3U1jiQ$`%-=nRGOvao@JM+ z;`X0Qpw42(z#0FA-$_qsKpUZ=;dug3Nte~9FSKZiB{E09{CW&@G4 zQ%hp|Pa;_mAd;W_gGko;MI?93MCP4w2IkRz9qnwVik)`(QAN4*VgH3%V`PJL_V@Ch z5bBW_--5s1!?r3*IAIeSz^?$uHdx4u|MPmKz9$qceZ|d!A5zKXadv9y{>n6RbGwVzkXSm^bfcu6zMR>9Eig zEZJqYlOfw^oSD%a0?b#T;$FwY`avDxa>gSp$M4St(V{ZMoe@pf@X~trai3c62=lTu z+K9yGPI8NyD71&^^r1epcXA{DUt?omL-|?w74{lK1*sRlEuv*a!;-u1}R@DzUuN= zs^ZC`AeK8T8>_cb(Lw{X&sb#$Yz1)*QM_`PP?t{`Lu@5`hWw8N#M5sqMr=uBKL-<+ zr;Dz$#kO9A0ixssqKJAbN=}gFQN&1|GZWQ(2$nj0N9$0PzkR$U6tKyXGS&KkZH}6( zG-Xz|dp}9qVonxB4U%e{{-8hnH7EFu;W?=ZF5vYgO9a!J6^v5A`=hT6|BP2=gPyhAfWo@9cgc;)?55b-+T(2~AwyEGZk<3Ob*+2_C@DR-wehN+CT_+OB z2FouJ@Ksomb&9!A0d9PgvM5 zF_ggqtU6=v!FW^*5Xl_^i%JBxSnNFw*=#=kx;BrMhnLB=y~~M2@`JyLWX`#Oji@#U zZ})+0t^bzX`!|uCAiyR?sU=j5&fU&Aoi94vZppa9Of}c#$Y=i&F?TL^|L6Qm$wf25 z6jk_a#ue&1sa3m9=^-CB(N5o!LP%`;X5;jCS#ZZ!e2MCZu(M`2tRrdb_^w#%B+C{j ztW1r(*Obv|=PF)%rN$a5&@K8cX3yuFO>Vw&3hXpP*CE2$CA3650A-#f&4`#*{W?1_ zV+ExkV`-Ro>=rSG)Se5}7>^e~vjE)f*JV>Z$f;RN0uafJP=H7Vs?}sv4B9!rh~)df ziR6esM6y0qQraTMXN_r+mP2tkcqE;Q|FT~B;FEw@YV2n#jl#dfLxWoSF+qD>S?5AZ z{=pl4Bdpnf|H&;J(FV2j8Fqf`IA^~|6q2p**ED)BRZaXuNM`*bBu8&;-Z`uS&d0TD@p?BaYMrn9gn{n4|H zOaKvo_LPX1_wQtr6ccvHRDp1oL#~*UqZUIUsWVC@zFpr)dsSO?&J_23)I~tNCTzRSE%jwq;%nUgqvYMlPUCYm zNvXi2T06ILDYgeby5>I=tdM%BWc8V^Y0YT zpH+~YAqayq#^c&3)|8SoGRp?tl$C_%$*Ip@k&bw+L_c2n4PCPAHUnMx2~SaWyeE#1W!=RO+u;%nl(ZXMFDbkN zO!(79kglE4r;8w`e=makx?&Q)LW^<&f*SsxwH_hxLN;yc+xwkvbJ3!~VaA4PMf*z`!Fo;!L$0FuAXN*JWia<$(v@u^C{PG=t15Bc>vCQ8qg5V!bd(k>?CIS8=eaot!1C8*sq_iY zuB(!nhA<(g_gKmnVcJ>wR8Lp5#vI+}4CPO8qcAx#wpzYOVD%se3DLwJ|j5 zp60IO$Hz=xfxtV385d)G@#pPn=OgwTlh|iD+S)6BpZkGcpYl|OUod|4eO7)^Fsse_ z_eo3&ti(yMCB8@!9`2iKWKn}Ou5W*QTh0UL! zkM?5Ih6bP6mFR)=bMFngM7?dSVO{ojik>2PV|aO6Lg<&>dnI?pExok`xHlhO2m;9x9=5@ z0UPEtZ4`fPm>ZQ&{v5f3MZAnYbhIru)z3pg|1}`Fg^BpfbF) z>&q#Q{QdlbFS$oCdwiM>fs8>qT`9p2i=L9fcVVDC+m97+tR+?fxUes1H6z$z!vKCbpS>Ak(E7%6#(9YoY z-HosNSCE>N%G$mN@4mC}Z0*fCc3NN`u?ucl|D@O&E{)751vcju50K?0ABn2qOkUN} zJez>)hR<8K!6(2s_1#M$Q%#&`?x$`W_m`UWj~%>lJ6@7`KZ0E- z7^HC>2!5a8cd>qlYuAOm1(Mm$lnmQ|5Xo6gpR*b(t?J+wd^UkOg8MB5VjqK*Pv29%|`jrV?JD{&!C4$#5+$D0ey#|O$>VWLYvnTv>?ax-D!WQY)O zbF&JoUNBY?cgOGuTj1phtYz8k3?gm~+xk6HL9YO;?XePMCsTcHW?(4o^qkx2bDG15 z@U-vlb=PrwS^Gw^;SWM_A6P++Q8t!F94Dp%=tAMcjbU1dZ5f$Tu+#}5ytx3e(}~5k zg81}~H@kzwJy)oj!F7c7W`Ow3Mh~dS(FHMjTq|IgIgHd_KwpK@W9wFJThWlK0z67$ zz;t4U&UcUqtBb29c^=SqDTf;yW_opagz-u*4fa)S@~e}Zu9isISr&Q%ZUn}Gvi8t* zM<35}+0`8(vA}3MvY%NBjtYD|jh6SPLS~0BWXwvP9IjyRrxFfSv#?Q8h@+k0UikhG zEby9~?WZp+1ca@`SFXB_q{WHuY#0H^Gft>_rTAHJ>d9gDHM7X5f);v8k;gIO5%1Q{ zgbQzyt!-)6?YotTyU2}7;^nYq-zY>(tnRvXylu{w+-V1JWQnOg9M#Ix?pbVF026n9 z8Ll~Mmf62?*)6{UMt-uFd16eOl3QJrodVCj26HK62rJq$2$W-KwTVK z`hr|4xrTTwY}E06Hah5?K~F*jDvT^<*lnmU7cKRtfYEa^G1XPmLB z=u^gFV>ql9qXn2Yh)Gj@f}#r2LA)(uiqT~+Lg@G=Vf$eMlb=j?5p zD;4>5$_4}TB2v$_#$Png32ES5ryh|U&}qyWM5W%OZ|No969iQ@d}x%{UGQJokX>w{ zVAOVMb@^Not@GrTvMo_Zw)0T0nILRv%VFFWl7Sy~0MW>LKf9OdwQps9#qE2``(DpA z(75O|W8MA>j0vw3_q5qJ`baoDfr2(KU=H&)HhABEb~unKnF#}2rXZ+WVkAqvU$d}> z)?7t7s&>kKjZHv1uVNQ<5Hw)>wPQaTKD6o=yX5&$9g1<1@4*3kPl$27Dl$s>SPKU| z!G~g%y@IUszh)GjO?izS@j7X5cApvI0koG$Y`nSI&dt{A<=X)PL(5UAOaIW3>nRYQ zM$8iP*i_&EfXvMV-*|MYBadE^=&yP@?ut1VWE>`vwFi8MUp)tM!GtFQCMO4VC!M(6 zng!411mjkhy?&DG`rEbd9=xU!6r(0*lozj`-s{k(RFUK|kMf)wxF{ku#_E)S`ziZF z$~_vHhhVu${}T{{8nI+DgBH^pf=6nr)}lj(D4tk;%V?K z@9kj@WQU6>baU3{^3oiK6rpID(Gr}yi#d6N&6bj=)^esERBkgCJHDRS!9Y-_Puxp; zDe#L&{);zH3zqQ7tyoy~gH(rJam~#f+9^5vr8A6?8=`y&Fnl&5Kn&oK!8><;@yNhA z>V&xRVRJHYN!VdSwWFD*(arui_}@IT+h)C9ET+WKD6PEHJ{`%V{hK5=*qJ8ogRwj5$vX2{)$!T{RT{V@vG2;xB9T|0a0q5{kVcnX?vym4sAa!7+7=}fU69Cd{KcKeXLfSW{`=HvCaX(Lq2(K&3>asq`8;DhdJu0@9>OuOT8GLQqhU zE={D1H0gvEdZhO*B?JhB-bsK!sNcdeGtYD1@Aq!KJMM5C8dnypT-X2nozAjAqud}{ zk+R!H<+9OmlbZHPP9SLS4M<>|Z@xqOV-CP0f3=f$w*r&0+Nr%L;tnQ&qK&v2!2*gO zJo2xFz5;{aL4p4<`Qe@VFdmGH7=~VN8~!o+aZN?WRTtkX1efn2^ewhV|EkO$1}d|C z+U76SqE`VPIS1g8fys%1PR$b@S+kfMJ@qdh*-&*%Feb-0``P`U>xyYMk0UgIUDeGT zpfWoy>?A1g_wa{}KIp=aq`-uv7BKp8aLtwl1!kHSp!qED9iq-2GJel0T4Gak?R`oS z-2uCJyZS7Z>Q5e7@PtRMTS=w(n@4V!%gCEaQnCZCU_W@|oR{c(UkD888fo8toxmvj z0t!Z;NRJg*Gy!6swIu<_%_G-Tg-?CQl5$A;pu5ETXkW> z&S5rM`)Z8-D`T{~9L@f!>uab?Ay7s^qY6Zt@EGh-`$Qu!n< z6U*1}+FF9MY^)UbyuvO}W1{Ym(U=Z1>2(%ndI8v+(euQElujcZ;K%T$`^2<$@#TCC zNvX|PTs?UvI$lOQPE$GC?R^`NeIs%i9`B{X5OYI%(8Y~tEO{l3+*EfVmEl#Wdxzd? zz^K6?*$(gsqX&?|G|eGXapeFA*!f*zKP%D|13`Km>EtY<#P*cSE|o@O-+%6Q!z=*3 zABzkAjIK7-U*{)v6ITmO5y?{96=;iiIzbD`=VO3d+w_P|xj0iMnaBQk9KvpNRfAHp z)tI5adxOLdpO?0Z9OuHRt*4AkXM%t6B z=QG9*NRCp;M_bhpMxr4m|J~k=t{*xwxzRzy^1;y#inDvKkBUXwMDvzmlOZ9K!R@7M zyy2tx=SBi({+t4}>giqTTxDe8=E4O)M=mgKBe-C_RQ3K$T$*pnc9F)*4dz#^Y3aAz zTI^Zrx}lVrKsf7Nbp0UA`@j_MD_Bdm#J>W?_`c);K3;N=fs4Xn*MX~gXidY#x3%@O zEUpvo{$XldT!8K)EwBGq@JdEe+?=;lpCtCH7lnio_F)4yHn}Rh_hY_PWK- z!wV22lqHpF@rO7%;3(Ls^37ibr?1R?udaw4f4BcKLiFSUYC6VhUH1@HCp^rcA-VDG zOrI8eX4^%^JXB4B?-vLrG7Hlof97O!`vYF~kQdlwA_)0d!=% zt|hwcUKR>nE~oBoDtUm{m04;0tRvubR$`@i-L~_{R$>}+mM&o)$|QBr+i=!9ib_hI z@z{v?kp)v}08|Z| zm~b|wO9a!|+(QwFlH7>F?PK@zyC8xF)YwQ4kWOQQa0BwM%IO`~tHmpeJJ@k1N5Rbp ztT}1$TWKM;F!bvAl@wTEn>(F8rKn z=r&l+`*7Llspe`r04T1=Hf)4 zW9kW{hIQ9lZe8$5FX>sy3}tu6fXz?m!(@&UYo+?G1=$uWgL#u+1P6Ms_Y6W=YUS}V z%l_!@_LcY^!{-O<$Bd?&&L`zQ=zNYfK5}vhf4T?fy#^YYA?dA@$kj^AvKmGcuK}f^ z!rhtUU85$iopDM2%SD%yOx%vsL{ zFF)Mv^M9zfzOkl`FMh&!!XsO75}c^mXU?YlTHPtwXJu@OWA)C!+bYQ=;aG80N66)q?752+ma?MH*rH_OyE@73EBAkW{jp9B zRF#i@!liz@0LMZtK3IK?D5p38DvaJ1k_n^}Fa{nW9Q>urAK9C$<@QFg**z0^O7A39p~RWjKeMn_wa#NmYF~{n@*v1zC`#R3sMWxSN!~|dF_sQ*(iC5$ z7>5Wq?^1cFEJCdXv<^-C@O|jyHY(~PX$DjiXe66Z@y6}CRv@EUuVV~-4qvLy9VY0Q*XF+o;GE)_#<}zTSjFFyw?}PLxSGX#J z`?SDvH1SJE4k@E&IJh={?k<+_;tgy6?c?2*DO!4PcaOw6a>&B8^Vs+!<6b0{Xd!@u zC+14$Z_tNKH-{8MeV(i?_%o!*-Qj&dV5$YuU^oOri7u87Yj>&wLSKmmq@4kk`;GiK6>~2%UI}*C)fnpQs*8>&>!41$8+N!oOrt7=e})HU{~7&{Hj|GT22F`oSA-BT8#Kfj zr%dG@Zp`FmosvaL1?WGm(F4zWZ7tAOLoY`s#18Lh;w{@&qEWgt_ z%Jf?1ZCj~Yhc~4uL>^e&4HD+!Su+DiVOZ@~1pH=102<~el>ET9r=qNoPd{+8v>h0! zx!-AQ`JR|irZUZtxOMq zXD`h49TuW(O$b8X&c=~e(M^4yaox?*vM!8%ehW-%%2Ol;Bq{5aFeQE=!(11SNIl*~ zXE$;Jfk$rf5b4_MJF&$;k%M|NRfdXGwZFB>4UWSb&ImxS3{Etm<1>hq3>v>+O+`VPawL z{+MXLNdP(krPp}}GOH$Nq@>;hI;OTj4mTk#4T#_B$?e z9M{GegdAt(FG(Bs(#?2$R{x<>t5TRqqGiyxFK=2#a6^{Tn`jdNjYLRy48fDPQ9z>c z&zR|IvHI=?AmN-d+~HGXxa&s|K-C2@rb?4EhAJfOV~qB{%si{2REsmg2oRp0$K)R2 z=wvuQEmM^`_-@6Zo`iW6liht)GY%8n)?(|1qz6Osffm?^l;c&`Z>L-!!sB$}NNjCF zWaqVE`7M9>6;EBRh>c0gdBTv$IlHP=7is%3hZc}zEwI2)uG29Z-$)8O9MlRrdfUaB zYgfWNoXA_ed8b36mQvfGbSaE$MSy3`+;P8|9%4tNdoD9xw~DB_;T3@N9=UN*0?z*Y z;v4F)?RuW0dYrRHMbZs(J>H{Ekl_nG{W4ZIHJ2+?nlBRtdT1j*M2EcYRl_?=AF*k) zAn1u2sdZbm%hv8FaeX{$%E+RB7U=g3!R> z%UP`LV=ojDBE;PU1BTju2GcLfJ^wOFqGLB|hi-7Vw1n&OxR*B??rpdaL8YlJW<9kil}|o`C}X56)htSrqrW&^r4kq zL=2jdwfI%v#VM+UI}e|fy<7h%dp}7idi|G#B8~wlv_6?xeUWfH1W!M_Mqf|;KZiD$ zE<`cDFyP(%F%Hlq{(A<>I(;yX0iU*q!NRLoBaaEp=&^f1*P;xj>9`rJf~2>`KeN@A z3we4r35eJQmJUC!`UF4rl0A`&M_@jiAlet(QBew ztcvCMy#?Ye@>wmA#r|Z(zWu(6`?r+5JImXRK+0zTQnF=`X_%KSe_v8_g8f!;ne$mF z_r?~R>Y`)A7Lam^ks?X-K_haJ6CSl6oNC6)Jw}skX3t#*qiDujc?u% z@cp%7Fdx$n@|#992_d9Vb$9;V&t9@RyW4FSU-0SJxxOKiUDR}t`}Mn_JZ1EX2HdorM(R_x}_h(rTjQ~WzYhMCIH z4CQ$mK}g>_k@4>n&)p~A>>qN!1K}aJ2$gK0Wc=PTIjF1(1?M4*LKpS?FIKiuN5tPs*8e`UHo7jOS$wCgsw%-wdbQ?O@abL#?TZ3&3a->aj)b7b)}%Oz)A za<)LbUxy?1WL@`^3?5O0iY?kLIlfkvl6&N`UbCaS_P{&)#`UJ72GG$r%)N#=Brit%@Wel&)CRndmyv<=jnLMDtWO-!MIFUb(B4bapW$q9Bo| z*+T_kG*|i{7@r2BI~A*XeHrLyQcZ+qCynhY)T@cV2}iXsdFmKQ&w{w*Z_&n4mQdM; zl_D*7UyDI(H?`$|Ny*8&H7PP}OAw&;jNqY>TuvOdJ%E6iZtbpEq86s-8_HHk?W-Qe zzhdf9gjA;gl#(-(-J1a^x#NFH$s*%U8vjVi(R?;RUjt$vu2F#XjTp=TDcRoZ=)rF( znSRsl&MzrB+R#g%6isKQDzSR}hx+q{VM_g&Ckdi`bCVA6X{J-jk)1ohDv=@4xr!1Y z7KDfl>yWP*TdWp@9K3LN>?nnq!Mj|gihW7Zj1lDeOVV`PHB3sUI6s7*bqQcI;A;o4 z7x(2HX<@Yf+g??c$?@jU^Ay`Pq`4`H{4?anEAQ|xKj~5ACyZ9GR7tj@vb_=U+=7zvH!=CujHGqlOwz!=h^XV8zGoH@AdPJS9oXhyblz8jwNT zcL%#R_{bnX?0G&vSF6gE8lle#I8<9Qf%^f9DT=`fI#yhBgwR{`XO!@)Y5h)r(jruJ z>Jba5NN4#YwfF7Z-&ArXVaRCYVPBx2hb(E~uS`5=t%9@J(vDeL(31tLS_WWN2-7UV7h?QqWMPv89!G3kdlGzLhpZX z7phPDv_%qS<3MhbS=y=>_kivhQ00h6YFZHb-qQ<0e}aA7P3xeaMrI=DEt{tW^{Hhf z`B5Lab9J^!RK~S3-v+$X=2x=x;TzEE3#xb;;`a&mvgpBq?rE~Vao1z?O6Xm7m4pQ> zR{%)l;-kyHj7q43$v3L1*Jlw916=I(^ch`lGyaBADY%xIYc;_f;BfDDc&}sR+sx%~ ztlM-*(AiD8t5B)6)pD>W-h>MLrEPvufi_Twi@Do>HDi+wyX^A1<4>ByS!CEW z+g|oUK2^^iw@=()R*n;DL(bq9iNKckwg@t!;-Io@_QoF27N~=(*jNfq?sX1sx|JSZi!1F512*{+>6kTG&gPwz?&0CWmJxkb>-olpH72M_bCYfxPn!weWC-ceKoJo1fjp8y6tI3VE9#7d3toG=^I_{eRM@J5uxjuew`7%l;eXLt>9o8_ddItl@S+_Ea ziYcg6LsZ2!?o}-wDprMyHB8*AE}Enlk61Q0O%1VfT*|BJ%6Vi|R$;vWopsF-L7PS5 zzNQ{Gdo8{M+GSk0KNad^H7XmFC9*nf?po`;2A;yl_G zgIIdUAvU9_TF%qUxztdv&(aMTR$LR6qfQh@J7Zs?+H5{yD(3#RjOS@Wc8<>2njI2R zi4NW6TE;RQn z=Y!5sfBZ_t%GYAAL6*PfYOSZ-A0b%iRCb{C0r2iR`nF6 zcuZSn=uR0J9K|H){hZI(Gn*ZoQ@~U!2C9(rsHb%f*e@WmUuYY0lDLy^y`Zh;+B@OG z&YRR8d_@$NUJmCxm`W~(2W?&zqpc&rJfDJsQueA&z3`n8R@p%`#>d ze#3_snT-s{)J5#VRrTcWBa|6%JN2nypVv#@o5b>|&xc2ofKimfiw*b7s8UtvGc}Ih zt8V+)Q8QJ0csliY|!z8-9B-uyl(s*s@fzd&oSi z`IpQ{*t5*3{?D;8>iTKA-;Y=c=Mv$210Yw#=#{I_?!09GHhEr)l=^?NlA}Wk zX{a@xJaD?V(zJ1v+8imBn?hG>cV2{bp?A@ZlXPDjffsp~9 zD^yaf`C&JhdX5y?F!nNtpiO{S!{kYthN5ZW6wnkedDCp@e1o3g*hQTG-rEcNp0JtC zl100!tmdP!(E_%!qW&d}^2zN1yYj zw1Y27C2dpv8qFbnQ!(f-{=Vg`s-(Y8IlGm@x)U=*rer@aNX zKc^BWlr?}Y#7~2cTj|<3fKPo0kzI!_=N8*L)ShU`H8&6Qk_vRrI!a68-f~D5PLcZM zRXo0VAMbc?uP&AISCASN04=$@3E1-Ft)+;VF_Rdm*Mvr-OfV@!c*F>cQ0$Qw(0YpC zs3I*#7ahGL)+8ppO4@^TKGIcma}IsqK>O*2DX=zhz3Te@XVfV<_+zD(xm()(2waDj zs|p+FU>E&HGcH))xP2;(R$D~YWg#4vysj_X&(C#RAbCeI2$p%?d+q+|FBAleXaeF2 zM4XzJi0n;1@?JssQ{=P{1|aR;<{CX>B{$BzYs~Q^_J6GjD%+XBKQ%XeeD1#rnOquSzx{*Fsx zJkf}j(rZxgBk9YxnU+11)^m$EhTPaM9r>!Fm=O>VIg)jc4*E61r1PFU{BKz+81sKSG>?7)(3#5pSDv?afHwQxt*bk zF#GY4`%Lh$ictP!K>o`cDBOS=TZ81s*+zMGrzn}*X*Ix}mGH@))n$38B#zwcrMQ|f zovcQ8p<0~Rl!13CvJ@soB*He_-LbX>F6=u4rp-sduZ>UFxHR05?I~uz7l7kucRCF zmQraPVeFpOHp}IZIt;{z+i=9(M0DgpaqHuZ74A(#SPcjVY2E zI7g&7*PkHf$dIkhtcA#wrsFDso=UrLrS|S!_`Q**mK3dF5iP5$XWhm+rx*2V)4yrt zR(HL*_#vKTrzePke}|gw%SSRHIY{QR;4fcfwIfZp&)n@!8(iV`Cjn#9K7qdRqjq}K zWp06+kS0;Ro4do_Vu@eJ>By7=>s}CoM>^wI_q{@go3e9qEfAwatS-|Lu$$XuYn9Wh zi_ILlM?;)P&1LbEcjTmDDh$=po4^8AvFOrQ6n-^qM8s!Z=_y#vAM)ZM4aXV&`S4T~ z7KwIf5y20bO5KpswjdWGW@w95T-Yyxw74{1KZcOV|79d+)5E5GWv-MVx4>tP_C1fS z!C97QJ#JI4y0_v1BkE83tc2kjKj#2ls{4M-0Y+3zea==Qec@*|3>W}eBTojUkJu?x z5Aw~SYQ13}X3vyJ3Lh3HA2u$6N68}c?n+n#LonOiDnO6&~4ud~hUx@A9%p)^^9A~hY1Ta@kzCc?3+S{LD{~WS zL8h2sM7pOxxI!eNMuExNyS#iH(N*p8BVS)##D5A-w}KX(^>3h(>8De+=yV&C5ebu; z<(%8N=3u$r8gVPPsE|qHp%2%PpT8BSCg3D@i?uYruW(%Dj@l*qH-qP1l?h1z)1MWD ze34;L;qfWM9zH|kf1G6HvL8;e#>pz_29vK-7;3PMf)iF$Cd_s^XPIBCTb&|&c zCpmHX`GhFEJ)dz{FnqEAb>xPk{3JC`q718kJftL<{~^(MxF8Lf8|}kBGg*6%DU+Vb zd!a6D*q(XQyja?%*~#k~fq@gwn;=blQYZ4U?exmlef;a#A90$VlQ@k?DDqL0cFj%9 zTQb${Pbo|Bd(%|j-=W_v2TI+#p%EH~rvoy-G`K`@?B}(o)()RDQO^1SI{|dgmyP?( zT4_JF+E*h+_4{Mj{5id!E+jTE#O!51qiS+HqEDAJ0z#d@Lo$%05sj$gPdH0Ed^zmN zwCffZC^1xD0jLzQxrl_6bT4&Lldmh9^C2tG4tWoVnW^U-rA$z8Gz*jkH6EfYF58w{MfUc!XI&rTO{_S4fg*9%@ zS}!w+!8htqqb_1pq_R`M-(W{m95-$zIVR0j*+7(_-Cvby@*Xh`dU#)fBl!T2+cesh z2cYClN>z87i&LNFNrtO-b#=EWRqdIaztgYEB2o_*4b9xzUB73i!tNWlFuLOD*T-@v z6(rH0r_eT5%Xvs=dWq4N$`*{4_6E23zTN`DYi-kr;8i7zi0lzD!`N*qVp)>tWiU`w zq*n`0x;T%Sf<6ktW%hJ!pLT!a4wg@h(3-k}xmi$%BoF15KBP+KHna#5e~&f81XPP2 zKiYT0FORo`6EB;V5!`yEuc+!@CObzrN{yX=emzM@uK@WdKoi!#bHOjjEF&oC5(cI`VjK?HR@H*Kg$>?_x+16@nMK!-hE{^ z@5`)wnNq2;s*QQWSj+ou$NFS862f_DpRYhWWyTchQkzvYpH#r(QUum58+(;wR*-}$ z_G0<$@k2@$@S{w6z#NoTJ@xs4dac!BVA(MF%(f`D=f@*&Xf69t=#>OuR*LYR99 zXu0=$ab`hsE3T?ib3)EbQ%#7n+wxxa#j7qvt)4$oYTvWeH=AzV!sM=GjWUm#8RE!Uf&pU&EetA;xbWrvkxoU!VW>a^A-$P54>$W&9`4(yaOH>Z>C*dfL4q7 zK}eHwN9<*1arQ&n!04mpGE2P6?B7;0c%R&p-ml(XY6D_I$^l4DQ@nt+uIXFRkj+Ewr|Jh+*~M}XFBTY%yz#hkKvKNfCJ zio0|pbbNZUm3MBlXNquFooVKp1*u%VL)xOb@>Ir8pnCQreYJ9!c>A1Q4!C(jLuUW1 z3|+Pkzq(CyBI|ME7hVClaxClxqIi&`<#xO_5xWmPB96v zqC^5#@){y*a2U{CmoRo~Wtg=gnIoNQE2`OE-Vce=hj4E}JHkvG(=bqziX-o+<|huL zj!Hi#1C{neO*3s|qu?h;eYBt*;zqd$Ym;;G&EYpMD_pk5qOe^(0?uQ?*_F@+UFZm-DkLX_B-5GCHNXGc#|y z%f$g73^g{Yy!(hv8%!0{PoC(6x`f2GaPk*y1+InyK_3>SW z-E12!r%I*3&>1CXG60GWKe0~a|BH2UBmU~IC85OO2;YCP6+o^!X7&GIPiQ?~eM_yf z1-afWy)Vz0Y=^mr%Q)v*vMlud^?ED?ne+?z5ow;(Wn|xqmtAM@{6a!oT2_?YbzT`M z4eFaUT*gu4>BB`wp3W!oyeyj?!6sS3=JD%ynUIfst>t7yrY}bVFLx!9noo+G-fE+} zOks{1TR>5$Fg^c;QwZ0^bUHeJCJ!BazH1G}bgz!8)@b8$-)$CEeK|W=uf&1>g!8cB zG8FmJG~{x~VRb>(+KrvOy}Hlr@>7k+TY`c?qU;Dy#sdNfxBR9`Y%gZ&vZ9Vaf=IH<1c_+yz6KT^l9|*a zu>&sq!yIBy(jI9Ut57(cij>Bw7H>kBCJvtBQhN)$R#R$Ux5SH6jaE4Iy(=@4gew_o z8+nx?&wBO`XlG@TF^LKi%+G%vQEUZEv)7mesl*qxNY9fV5OD&r7-$t5%7a?$Y8k=& z<>=K>5;c6{KDv@a%%zv>8e(O7dPHWI8n<5!w+ksui~GCNiT*fiLE zyem8F1I1i(BM&9Q$7t=MtI0oZe+M!u=WelxEioiOTr!j;dQh@O>$UvNmn06)#d7kX zNUUQH zq!Bhky#xuF<4`xW}yq>-Ls5&K8{W{n3_x4O^<8($LZcX)m)8NTHJ6=7v zoMCb%U?bi}&#k!P=qDI1TY7d*`<69Os<)$`Ddy+qTfkA2^%4YNe3T2J=r4wMCUi5{7URTRQ4PqVVz} z?h7D%L#tP&r%w@2m<9B%i>b^)%L*`(OmtGS-R11L3M z0aavkZQa3pPDOh;b^OIv_&qaWh2cZ^O2k`6e_`*9V(f>3?Lyq#*yn>*k*PWjdJ8Ms z>e{|}s{QZYBlM%^E(a0L7VDey;<6SB8E4zzAp;e){#4_j-!F57Amypw7|Kj6{S;S9NByN7b*Zb33HE~J70*0w~I%j|O-Ta6GX5EOG zd8T=N?!bm2N+mcs1$4;jP(*c=!j4X$=xGA6g zdQpt_-#Z_7J?o%fa^TmF{C~d56`Z`uY5zZYlM7~MZJWibRwwWpe(Vq}a=yWIXVcu0 z^#n>&0H)ynZ6AN6WhmV)E0{^pU$GwZm~MafJ|#mwjA>Pm^JQ@kL_L+c$A1z%_byN) zd%lOjp_|hklwfwcxiPJss=U{`H(%N#7`rjlm^6zXJtK{Qo7Zlco=%sw+!ry6|HES% zvcAr-YHi7G>IcPN_v^b3w)gTTXFqWiTY0ZrSxA&|!lZ0flSVBtrH=_9f#ngA%e?N3 zN)Uv9d}D=@dBum-Zr&9OY#foFq*r5ZIJn|Muz?BllVDZNJBiwwJa<_y71z0F+MN}0T_e|wY%L4OwZ*)DS?qaq zFrt;6qvvM)5qrkVCaFoPr!46@Ylsncv~!=(TIycxi*#GUYF)2LPr1QA_w0b(D!ga0Mb>#6;*ZR>6uK&PmA zjqTz^EcxO5qR)y$`6vv=onE4E*pE98l|ce5KFU7daAvS|tUzXUaSp0xg&)7@5Bnl+ zhIwLAu$dB|Et7j2)0?bge*K9G!C9=}L%&wDJGHOaCU5~$FQhjsg55ED5rw+%-md^6 z=E=`@#X~{R;}qTuO@W|L=efjl8q4U9K0Rpt_00#e(s~bSN(6_&=ebVjBtx6GHSH!p znN!8`!Eaj!+x#ShBK)e+0?o8fu1Xv|hP2de+ttp+#hzVNDm4BlGWb7k))qK2Ho1jRV5{Uq09rZuZl0Tm)ISbP%3dCu&u+>BW9jJTcdF|1sBI z4Os%_TFnhy*xJ>34SGqZyN7Fzl8G^i@GLQFcVELR5|;!O@Dx77&T&?5LA+TR=7@j% z$?zfAPo!@AM(?Lv1^*y*^VX#lh9|Vp*OzrcT{{%orS!YW1_|%f&lGc0D>yY9m2gzf zkGLvV($QF@eR300)1=mW^2*pW1^Xh)ESj&COjegqw-!bnT76*= zsh#?e%yYh`u&L{z{mqVAJ4;ewp0O(Yb?U*nQkX_k*HTz{gn_9{0>e_jXQv&6?r9bv(nuVUWQe9J2A+Wr&!1A_6 zCV$O-pW@4+y*tF+GZKm9+LE-#OaV3b21|d*raTCz0N~tm8p8*)!{XJsre6%)7a~5~ znQh&nZ`3WYK$%Kxnv*?l->XBMy=AN6Y1>LoQe^8EtGow=KL%ZI`)yy+8{^JYkgw=7 z33Zjx`}w8`4>8zcc}2&{P!(-^{o{<(%F{Pvf#9yR6I;!-hFpbQZZp%e)g4~_r=)F2 z+57wM_na1?ld-%KfJI2bY8(c={71B$Pw}oWYNepRV?(zppz<5?^hKlHRuT|93{Y0^ z_!1*Dqnv-Fz){ZXn~^Lit!Ld4JUP#D<`Vc&_v$@Ln-Z_hw~a$qI}@JBnkiT9Sn5|1 z-bs1r2zEDf)uBn7wl@dg9Ki7v6CYaFr3p1Ob7S@fUwj6-LRvYMiblu<;3n_f8Z2C; zz7@=~(811xYPS?UGmG+YF7HKpiSI3dX@Dd~2ue6WSbaCk?kq1z2{lA2_j3mlTwa)_ z#ewzB&2tLYym!qQzDC@-xX(W<=wbn9JM`gxOxSoBpN4->1pGHFdn|$q==_6?B4+o3 zz+}$wKq_wiOUd=Xow7MRZvbaryW%8k;M;DL(E+!_tMTBdJcriredq017GId!b+l6p zCw+qD%UCCWU~}p7c?c>SDiI4K%o zGbbX)PAQ*a>+zS?&*l}U#ZzZWn^JR`4gA(brh=oo#ZR~gpnHHy@kdo1)nA(E^x7M3 zviwQMa`!E+=@Sy0&aVF{1V_8|0=z!jci!z&Xfq!=)G%uxJW>j6^H~fvlVhJ5q{YyN zoR2BN@G~sjY@$iHt*2Lwp#Ip-vi3Hr&-br0{XK}gJop5j4uL<{&+~%c$0?rrnLvN0 zsi4vo!7LqJ;K`v0@4O!lJ?vQm6NJDOWq1>YVK?dXQIMdFEsd^0nlKSf;4QUz_Co-F zb)4;O+1(COv-M1e(Y*uznkj2L&h805+~hR{kJxiN-xP17oMXAb3`wgU79$AtXhWam z#iDciPl1x1TnA^S^lw2g(cfM+Md~+cd=D&FNu}c5Tqch87M)==_pG}BaGHBXrMLN( zhkzEMiNKFSly`nDz&aS}c^9et(VhJAKI|{L&Q~Y31wk<<6AQNiFT9K{VY0L-omcO7 zD1dvdUzuMNk0&-F~UW2-8FMui(GM@0-joOojCPVbZFf3b8R4AhWC>v=7^ zK?Mpopd7VnIQsZ!nw+`kFQ)FSLbm-o%zu(}{@=g7r4ZT3o1JqSk7Bqba!J-SGRpI( z46l0+SD;$d*cW8fL%tZ@lCE*)#@B3Jc^xT^1sD0lPYCp&AM0Uj)@_HFKUt49t|M@a zD!kHXEI$TSt}{L1c%p-?#T2DNm5AS;leeS8L&}K09PiF?2&QlM+Jf@5&e$zWM zrW{IfI0VhxORiBFuiP1u@{;fxsM;TDw=H0_Sr;$OaXDdjZ4AlVW0PP_BU0KA2EJkp=q?h`uReP!z*|4VM6>bMd4JCavj98~IYoj-hCl9! zPzod80Q05fbF58~&O%?E&NNe-G4n720(;;cJt$-w>Ul*p=J0cXBw-wE}(k{W>Q z+n`O^+K{Cp#orK{xz^${;1>kG0Vv61k5vKcY0BIkIQsq3Pn;fJubpwcbX!JDgw$4@ z4=~F{2;f!|#y%m}pa-liie)~bYVu{N?J}^>o_-2Pr7e&po1a$ay7R}orqid3zM1IU zc3UU~%??_W&0IE0tN(>0>w=jbaPoKy_W-1k;cnwiU?+dYSLte+=;;P3EDui4I*eoz zP;wi!MWZppN>${VDYg35c`;a~lkM7tu&>P?GcX{50x5S(1<26;6Ec*m2l!ShBYrTt z*u&nv7m1eNp3MKXFfT8SdzX~YS%a$VNjZ4WvFo6$;Qr`L9*4VjvGn|<=Y)k+Tx8En z(b-|)oTXbYc5fyhMUgK1cPHWBi47+JNb)0p+pW&bP#RDAH50kiJ#lqn9rE%Yo6n#) zjWD#_cA#Yb6e6fBJZU$bu>oa=xJgsf%0lp=k`lkj>tMIkKm#0fSYMb9nLk>d8k#!g ze3B~?9!Q;vp!#dkF>N&IueC&8KZ&Zf7)bfD=|rzJVZZ1nlDx6}>PNCjwI}K%S;So; zVZBj|O7b$$C#*ycI~5%CD>+=xu^gb$u3h+rB)bAgGCPGt6PNeYSeV1tZD0$n{lPCJ z`Q+<;Hu#w8xhP+UEG^{OmI>uw<6Hw{4|{PjB=tShH_j|oC=>0uj>*1^c1ts0`A}S~ zTXOgccs7PXXDKyVm1Gvb?W-!;A0}}1XraVX4^+emM2k2GR4C=dTp0!)PrKAk8yU_= ziE7`TOe^oBU8Kg36sB1#uE>g#6%tidNIJWSqVs^UMJBa={Prf z3Mf3i2^dIjRTmGY$Qx>3bvk$*7#hCaTpyOgM{8*EDd<3MPVlXT)WXq}m!x&2VIytg zOZ$zC0uk|7x~!qu7H1`{B$@*!6!~e9_!K2-Fyt9o&=f51REToB6RUW~=u12;a9O>k zl*($bk)f=^Bi)^Rg2-EdjFlC7$3yq{O^d%C=Y~grb-&1JA=sS%yM(ObcPg?IVl`>I$wiXt6c z&^c#NPl-6){6l&pg8N^2(osl%hyzfg;abS!Ho%@Rf*{Us;To#*0YiRP@aKPelX8?M zeLD|+>_Fwen~HI7S$XTPj0mgERJeI?b)x=>r^3o-$4n-f7h&#ecB3VI8_m2~7PAij z92dk8Y(UPr@LD$(cwqmcFaM=Dmx2y@{~m5#;Lsv5BV_4?+PfeuA0pshB=ZO3tmL7M z$Ck#Y{}e#9Qy$tMEU@ygY`ePQZ$Y=BsHkaF6PqGmw}ZE6FRL%h!39Cb+b|dN2bR$xNqZ zuM~X~pp)Dh4I|hHhIwAl>uIHYM-MkysEaI-_f_LH9xrLoi~0gw_AZl|%SM{&e4~QC z2)u4BVjs4cZBuO~^Md@xuFmIw)*jxF0Q>j-Izdq~dZqLP8#3{p%C-+l> zwudK{^E%wB=4-d$iwwuJTbnE(`~%hD_>wBvW%)UI$&{W_<~#Xk&gOB5V*nL?A=hYk zg4Z^Yoe6$`2I z^mnr?JcRTK_l>vCSb~}^Z0Ay87tS~Tf0VuFS5w`){`)8*Dq>U=P)bA;R0KqY(4!(C0!Bod zp-2ZIgd)AAiOXq4ypLq>ykH`rUi~_Bdml@(1Ka)>?DUd*1hT zeXj2}1vK=!auAg>ZR}p5++R%I>NDx54Eu9dx^)|fwuh=%Px8%7n;S`GuinZ~Et{SR zKB+0zcQkk)geh=duHjIThqOOzx>!guGl-(=d{@w5hf;wa4e5yzAsnz#Eh(p$GV?iFlBkb zeU+CTD|j}iJdU3sr&UVH!7m^!;;BJ;Q(Xo&ZR8nN+$D@05z1(8s3vVX;{?EtDR&nC z`#Th}5BcwRYrXuKnaTV=XYc>(b~lhHb#>fNOa3`i+e6k{tXH{hUV5MPJ#ZZi{ndgr z1(@(dKEm>{^0Tge?`6pe@M^0`;Lx_SDjn1+7}9f815M4x8s^(p%r8v)sEetX{2%LC z-2U%+9tJ4!X{!IToCKJQ~hj(wV+nLWrl#`4+>ePJl-#KgMg1GwxZMt(u{or@Py z2fqUJ02;Ez4WRxU3akXLzLiRl!x!ZShj6hs%>oTgI1qrUSktpnx%%QTMk7=-3)?;t>qJ4MZf5fw7k6{aR)b7b$4S_y`Y*l)Lfb8gzZpOhJT#UZ zn+I2g$#rLMYskeeoJ3O2RNggy3}<=c)brx`Hy)N)Phd0Zq**`o^kEVIsikMHAhPhF zTSjBTo4S67U_6p@ERj>zk5|nggQ;Oc6@60o?zVzY<=?Ky7%8G#N@D6?uoqdP$r^?RhvC%BcGZaY>aGhC*;Wn@Ph z`8B{puY7m(g{&&@$r~^;20-)4q7m+NMs_OZCy}Cnwfo0c#K&STC zxdA#SrtOel?@F4L4#K#)2|te_Lv>{ECP_I=?TdxaIQg{$06VrG{(TU{*aixVqA?1%>TeIP zm1>s~hj3a)zNGP3&vVC%)sBiQAyV40N8zS_V>?2M9{)DK^~op8+jRVhQ=90_2M~zL|Jr-BX)wZD zheh^ISJ6+O6d6*xMu(Q zRl*1AW&vu`lyfE}?>eY89-?QzBClA-u)&^U5I068LQrN<)pTN zT}@j5Tu#w^=yu(<9e1!1d3Q}UL=9GuaZ`Y2?pp>pHJKc-|CsO;GQUoUbB6j2(<-~c zHW6+8jM_4~vDMV2I9_ahEqbI*9gFSYyZ|cpUH+NzO7)v))3fH_y~_ zYA>pvakwB1mJpU%zI>FKq;}N}<$M$vz6S*2)+fA!E8ZXES z#JJ%#eQviob$PBtw}mT%-z?~3WF{`Vm!-2I1%Mmet8@iOPD69{ENW{TkfmeQvz~u= zV0FUc7WeV(!7IiWQ~F!Qzgy0waPG~(ccc$Vvy(tOykBkbvbNqEY70elyj77^nhtyk zohv=^paOBcs|JV!5YW7wRe( z+r|-17v=?_-i>9v`1T7FVAARA!EBtjay0I14ni7porn;a=M`VuA6@+S-60K>OQ#eZ z_AQ6;3MkNzrPQCy;L)>xsjL+5lwt&`M_sBm%jNU8)N( zrF>eyJ=^q?+%2x(s za%$AT+2;u%3i0QP_iXd<_vdUi@zJzQGU#w?euYlmSnkyipV%KMcCY8ezxGc z5dD#(n`{sS_l;hLC2oCN0XQSM^c{eA)r~5-kt}2OoETHar6I~DQaaGEvM0UqlTKbW zTyK?x_C{kY$>)RhB!D}wOs)24c?}SRt~Gf8=#jC3(Ck&`PX+=R_xC^O8Jgl*{<|`*e)ZR!5(lc`6oBX|;hg%-#S} z=Q75A?(%pjqNtgut9e-a)P<;J03^!)dbf-T97H!ST|H-G?ohrmcYCl`35*+_q<0Tv z-rcu4wPNwv`^)c4g5=(+Y5rEvDs-bnV;L#_qawCvzh~`bd7C^vZQ>IrvdE2C3yN`@ ztz5Oilh|mIGo2I?JEWaTe)chPcDvBU|7Ny^H`#ILqQB*jPqnokBiAyMC}g{IR@agG zPUqC#)1GT#WP%U)z;XZg2X}JJu*#m;#gMywIJ~o7X<=}2GI>{^(ZLlk<-blom^0K| z&8G&eplAhH2cAWT7k{^qcXuO_ED0Y4q-I+hy31YFzMRWy1wV(2Ja>y(RWdGgE?dy^ z$aBj6VX*JF0tmpq>9bGv&!V<`z{{NS04f$+ut5}kD)-~~d^0ti%$jH2T+VYtYd0@b zGN?L5c`=C^zcP%K8~n9(<)Ft6U_cuIkC(X2YN@d+uS5qZjd^ID8mH26hjwidj6@ZM z)C?WVw0N3o2Hm$?FCEG=*rz~7#0I-_4K~m+sh&xR;HMCyzMsgtES{fL{FrG!PAxEP zsW}JfIco^K<7u`?jYDrKV&T{LgvwF-=0s24cTGXK93|AgWwP3CWRDVL&62Y? z-zyM$iH+MqkTCTbMCxHAaLxm@R6|3*i1)Um^}eGXtU5PTR#|3RgTFw_Yp&da?w0Le@tsBqmGdb3kuD@khe2=?kS>w@vj)5y_0&%%h{=yQ$hNO(a zeye!t`U0D_Y7TnS^L}R%z#hh&O-|`&1Zd5&<ie}E+pc(?J7THg!?cy9_g2+_-B7FjzW}i8zqbENv&#Nbe|lB5GF{X94<*p45AXw# zU3TZa`s@gWTlE?!n~}&%CfYKKg5dw&L^=x|0(enM_q!pJ2eR0kF*<#`1$qUAO>y2D zA}=O641PAS8^-B-ZAu>wvQNr`pmV#XRpg?>V@z7uVu29v?Lf{PS!YzRel@rceos9; zmCIFC_#Kz`)2P#tU=HyCU52_)u;d7%!Fw}#l^-HiDeffKc|k~FypoO5_tP4f`lOM7 z%^4(R*GupZusOUnXQkA+m?Bm%nnPKJq4b0*KCKAsZgZmo)aF^-ZkupIZQ|yy<$uwY zWBO3a&J2s(zv$dA@Q2x4>@E+Pf1EG163~7QRabb^-}W;|#tu8NWc(p5`soPT*Zb^S1igk;%zk$&Jt|Q9GqGUSfBD+S0b zo5k~l6i6i}A&=rXl27U(YqUSv`b?(l)o}dk+^e4s$TYF>k~0(h>h*A2{Hnp{_f6k2 zwb}Juy-SD2R$qVSa`>5?$=%`iv-;qE^jnjO!1bIC`Ll00L~SoW&KRYvr^nWnkv>*! zVw8vh+SRF)X%Gx3n&}n58JBD?5bVGk=sSo%UjS# z^Fp`2c?N>G&K(Y;Xp2C_%@1@m*G~G*iQtZUr`G&D7t5DYcWCBIyq|gA%~aaQ1^nnq z$9D24Xb5Bu+?Txs>PiTpH<50}Ng(!q&3<|Zf^(U2rC?=|wDsl8ZVPyH)z!i8UM0J6EvGnh-XC8S7+ zXDj*%bjKGbVT8D9_7ePEl{LE)GFdd{wy1xwAUWI>?h>Wq&A?VwxZByc=r<;Uts@v9 zZT7Wx9r6R@7nLJ3cy1|8=NNn`oFZ6Rq-DiS{*w&@l0OEnprV80p+5n2X&F82+lnym zVlm--2Vq8}&A@U--D}QM#qBze<=n9X%t~88-q!a})MC|HMYq>dZ--*_7d~Jci23QU z?q0?}69q>e%boNkh5tS9RkY3*$Xi+bX>;%*l(N?~YiG#Fs7f!K-Evij=d;Y#%$a9N z!PC2r!>37%58KDPr}zt~22x^69uQ^MA5Kjyk$&&z1YEb7t;}%zn3d$kZFu3#(Jwns9s1 z5o;|2KB0(nd&q|DU_R!rVB!@tS_{4sx*dJy<&`+O+Zss>-!(Tnv@7`hW(pD@1Xi;b*4{OcG9wh&ODz{&Ic|?_4pPN*4rKg8U>uI z6G?C3T}inHm2px|?}#HNp}6CXpd2V|8H7I#nRx#I{!?NcZ=l<6yC!1>$q~-=rs5n| zx*nvA0l1#*Bft6nuoo~%KCr3;C@Q`4$>cTmY=0GDEBHI1S!CN<sDTVjie6QgDpO&N;N_k;PdE)%dNShLNlr>NwQQ;4=)5-mQBd<0I=XkgY;vd=1Wn4? zPEGQ$a6%6b4JH+QGswfzPYwe2K^=XM_0mD4x1$!Zfi+Znc+xI$S$hyqU0c0(ZrZ}N z!iuaAtE!rOSJrHtL)Ke}Epdvu8@gFHdN(0V?0#!7AcC7;^Y5(!7?T^Z@is8{OPt3h zE&KAC`Druh`6$CNR^r}n>S(b>PAG?ga z+5vD<+m~V8BP^Z!)%)Gm82)eiX8U>cJ!aIVI0Wx1Ppk(gT-v^nb8-8Qvk!Hx3On)7 zXeot?rB++#7H_!I#k=>hhx#7!E9QYNjVrgT`-36E2=}Hd*!+$1`mupET@J5V&QSD7 z#;67G@!BA%j@{#@PS>;mt3usi!dZZkK!RUtc=20}>T z?dNuL>IFM;`_;tQ)%9iPn@youN)Bu+-W`O4zqiKCP%hI4HUON2K8=c{8Rle;4pvR> zSYUL5SseRgvAg?8kljk>;=^wG8pEL2u$~5@rc+#Q&%kN$@?a=xSH3}3*0{68j)G&7 z+j`77oQFl!1SfX4dyH3LYnD4{v|!0)Ue0{TCX`6RWa<{a8uMBn2jQY7F z5U~Kt7L-1SqqYS&n>U1N}CPy9MGVz1O*IO6&_R5SSS#U}e9 z(QtCt;ob|4uI@zFk2pk0ui^sr`@4Fp{%rOKPUh#oDB5Om8<4yA zQ#G;|K1o5p)2&i`GnOBoq3fx~M_W=7po%-SxJAx=;mgI2GKc_hxTuLB=w$M}#p((= zrF;lC+%}fnBGQ+XSGd#Qr5t2P|L3t0OQ4laL>-`_U6?&@BDE77v8(v8Y8|aqI_b^y zIw$w)@Us$f`p`n!Y=}oJ_u}iLe@PH^>Xyx<5(oTCvMz5TkRDaTxL2&P=nAowV1+08 za5~Wt)mNZUan7i#vVEao^J_sf7}c>Z$-V@uP;-m_>Iwij!BrUv8;D=DJ!#T`eI?N; zA2wRFJYq7rup?`ap-yZr4{{@;Cd`MG?>r!s-=6up1GF88co^m&T|}!JCniQahO*WP zG8FT$CH$UUICuLykvnr*df1FN7DGyT;IU@|zgMU*n1ng#EOd0cS%wADlU9*^pFk_| z*3=(sc{^f5#-8zJwDsdv{1$SJNszDm`=TG|EgW{OjqF;(de+0wOB2=;zqSj&zS$ss z@QZt~0PMZAkqz!*Rg*vlBqJQy?eVHqmOP}QAis*%oxdKJ49vIJ^EW?dN8FO$v6@$Rdm zxVPXHPQEX+v`7rDcz*wc3ESjFqYWA2fZ2(XQH> z|9uOOuK_87N$a)BavN9hKN`V|?h_RZF8#&(byH<%7b|v|@w=)@ND5$t`7<7VcXHXE zU(hv``Nb@|oR^AJ;WJ*{X^%rk&MLzDWS=KvAqT}?-$d$NmfqL$ZTw;?YstHt?%8F3 z%w-dIum|$?kOYpVQU5mUU6bQpdK!jJ6Qv`e;{t(v#Wn?6erc zEauxBM608ZbL(FQ(0#nap8W2|cMG}S1|NUsnt^is((kh60l$M7C%Lbj#w!2re2usD z&#btEJ?7SUIhN{teB6|AF;wVvs!zWLKk51x<3Mmh_&-16@P! z>SRd@OMYl|v2=l)qU0$!!s;R;*$$T-4;%QX2Kf>yab+tI+LxxRLS>O18_!!&@eA!D*xY&47yo+i%89!pZMHUsuG7BW@(92yHh7GQYrGgF`z-jC z!THQseREx0#!N7NL~6W>30@sR(o$|MF4q`Owfa!76^NUli(qG5XeT;&8$fA0VjQ#Qz|X1pnaXcjkFz8 zEs5`IsUQ~x%9gqTtm)V62`J3qjw1S}c;X)>bvb#k;6)*)!6Jp_1RKNcI^gc2N850T z)h^~qoQJ&sO{M|_6^=m@Iu$@t58DC5m_5$8?6#Y0EVpe>2vwv_B-~3}?%&^wXBj`3 z;=he>pZYMAQ93ER=Nc?)RFmK6gr2nYjz*~1_tfrv^3sROTyB%wLjmj@njahFE_%YY zDrwv#$0?o^p&~q8X!m3JzK2FI=bHla0vnIxu_ft3zw8~88Ts2fIvFvD-lUa(Be(t$ zWLl)&MvvGfBZi$w7nDfXpT8;;ol)?BFU_wo`uJo>7zR3JR7j@B&&^<`gOS_x;$Wf5 z7vGBB5L+vuHS6omRguc#;`cH0^ak-eHaOow}G{pc4*xAjmG9QtfizNqNV>?-!1-I>cThQt#QQj+fh3`7j_EOQ87P!&#oczjc z5gxo%U{>ttUT6s-?X)wWCqVLSKw)2xw0#L=_Ho+HI%8(}q7q2vwNQb>r!407(G{WT4~#_)^^Zs6)YS zS$j3so;BZEYU{htUBA=#$&sQj@uPQBfoj7f$gMC5Qk)A$?kygPo*pz)uhP^W%1x3o zARZ{(kgZnVBu6{RgDM^3SYsBGI7bV1{IoZf_pz*Io!emYHO)`lfZH4-(lhx2O4Fu) zudfw9xz&Gyyt_q2n75RxZOq8-g(hLKtORllb9HELH)`ivf2!ITvL&`LLy9cgz3^iA8J<=l=S z5}ruOG2CmyFZX9wfr$!itl(mDKsniDtuf9z2Ke#Ini?BoliPEs0;b`jCvK^FBjW!#ZG&?P}Q0P=JHC%w@`|clIM5H zxxRXBW!_mzj_jVl!r(oMAWA=?3A~(N()ZlE1_<8Ja5rJSzs$l^fu74V7(3{AV7b#w z3qH&C=-EI!Fc#jFkc%;J&$860m)zGxj^yCWr-OwZ*cQrgwoD#h=0Sru(Wij6_Ulah z76z7Vb~fxl##N7HXilDZ#SYLVt7`>r83>Ghp?SC!pobTot z%!JY;rMnGR(ZDoAAV{u|5|5RvwIsy9ovrTVHQ!aiQT+27Mv7t^8RrU0B$rD+gKdXH zWU6-sliAOqSKq9K?JTqbLuQM~%8Egra*5WJSzXk%0J^mGf+f*hSVn>C0x0PFa=T2} z@dIGj$dfPxm5P2W43RRYdjtp1-ks5V2U0!CQrifoq{zk;uR`+4l1ddZP=L&u3sWm1 zTPej_ccpoiJJ0Znth|7$GswZdCoyR3HpdkU+Hy?#E|rjT&GuL0a`Yw`Llz1 zg90p^ctp$gULQJ!X#k%9E=`tRbt{zoaWD6-ky*dlo->lj+5UB?MF6*#l zfHakb7j?$FK~S&gK@Ysm9E_MV| zFnPdld%YNWAda)KfIjak0ar=CRuL{Wbs_+6T3Ohb8e+qRq@*|ggp@4`4s2LvJKdzY;psrWiz zHyqK3*xV5cbuC^J_mHB&fw|akc^nTH#*eC|)JycT7>6!vFrmKic~b>xS;CuyA5iI zm5-hJ_OaT9PK=NiATSrZGeWn7{VS+%?UjhFQ1)_q7jmBlGo($*4$nL=_@JRZAQq_h z`WAEa4O`5w?~Rd5FdRp#+RvlpP|Qn$5~qApQM^F)ykqC!@Q6l=h*qeqTzgmlYz}e# z^l%m8gAT%7axtr>R*{-p?U0ZO!P}WQ0i792Dm(5$;ydJ%3o2JOvjY^uNiSeq$zFS- z0c96^Jo=ixv{2unu17=sL!|TPYNBPA+uLMd@1f?*6XUl$Csqw6+kFTVcJ-xl8LB1r z5fDb5N9Ljz57|eJ@A`A@da49mGST_KZs-tBj4ie?ItW<#)SY0tQ;QyC0R8ehyO>IZ zRH^68Ek4-mh-`IKf#VtZGJ6%>`N!+SL6uevSV+BU`-ouz^dWM=j?epV4J}q6nIhE6rNL7h33&p|3q6 zVZF<}_hBt|jhAT^L4W&?J1|*2vtMWY%Jft908Uv8GH_vW*<(HU5&HQ2x@@|NNGaWX z7I&t-KqrwT$vJ7Ww%BUtS*UiErs`k#uTW{!7B$iRV8=QQQTCuW;ayQME(i&w_lA0= z#5F2V?jzi485ai^E@XN#+62;CFHxKD3q@o=@^It*Yl)QMlPPTIF~* zC}J6*HIrrHUQ#RbUYo^^wQMJLYnTZXa<}&iGHa`+RkWFF6)A3~)_9$HXA)RJ?;N}4 z<75jOuiDy610ep#g7qC}ePEJ@qu2bbb~G1pn%zI6rQ$1JS;lo}N^n&P>=? zy^4TtqP}BiH0EAg>Fjnhw!eu?q^&b!9G}gMMTq+D_yBn6pXG-is9q_==z{TqRX~s= zTn4G3za5Ku(AL4A9B(uaX5F#_`EF-iJZlR?M$FGP zc`)v^ZN6w8k1+T4UUlbukPI|AyGcZ3#ZZCg+8i}Za4ex@bP>B`asnAv8vM&fmFYY@9L>Mga#vuHWxwxLw2=loAdi zZgnul+BP+E3jS4n7r?VQi!u|Id+l0*Xe@qoX^l&EgQK%r*>rxWn|x*~OnBK5&>g4T z&tkfBvV`wFC&aEeiQCg+_}-VP;4cEvz9%$?)q(iDBPr3V#-(SlhveU^`gWUJvKT9( z-9kaG0Q~(k1>u^)Cu0|Y5cxvsohJe_99Kd~bv)zObG_#C+2z{wf_Vtu-i6$4p;Bk$ z+|~UGA9XvNkZ%1jD)P|jf6tMdiU}96f(GJZ(UaayG2LbS-cw?d`;>` zuOmafMwZ$45nsstn``o;rLu?Y;W;#8(QXNiW7fO@2$`IXt^yiKW5K_h6Pts-!;z%| zax5fGpLcF)2SsHhJOT9Q4WF)bzOvCcDSt=ZdBN#=Z3 zFe}@I9+(_``%qKX6ww@9STui@$nE4)@S7QkcXJUls=J7;>4zWOmOT(QLUJ@X3-mE9 zM3K|a>i#&e{MVWiH8^29{`8DOlLLh7J=mz3?Npjoe+D^54_Xvo8?Mw6kFdSzNYk`w z7bAG>hJVi1H}H7s)bsc=rBf7t>Z>X2-krj&29Q1e;rHZX-_x)~51s&6TPo|g#U#z9 zDz#{;HFyqcSO3E7H`};PwcriIagG$V!@9BE3&?)>54CNi|N0}+)~d(kzIU0vTY7Y` zcgiA&8=V@CLg#GLUoApxY&eFF;ZdmFdJCIlp#t5>?swz}dGW{d-!UbPEuNfpXct04 zWM_iKTjN-&lP2a&&$6Y!`#*qE5E)}nbfp35GYS0d$6Dc`FWuV>e z(#W|mTTruCNss9R=4YKgv(>!zj_jxb$l~&6XzI>GKWAB|&R~(TT@&zO&WcghF_)@| z6LQ^UFHRpy^1Il4PJlvy5G4e}-&5rdnx%fjsNDkyGD25F--KRh^N<`CXcDmTG$}km z^RTJnd=-=zA_a9_3GE%d6#Le4zxgC=mMu_BbWafQAOCq^A1Tn4LaJmEj4VccR z$SoCbANbRlHx$_Qrv~65a!nLm#ATYA!_?TGB0GGS%kiuu+fEP#*QTh8DppXjHAXGf zgNcxbF?#pM5)@45#+TBuw0VK&D3ctX`NuaT6-;@3yV=63Hqah0U!k7-5=PcsEd$-1 zbRo*uW~z(3~B&S5_S0q-}RQ zXg*&0(|#DG9BFa}+{(XQBH>>l7h5qrxpq>97AzO&`BCVfo$%F!5rYjnb=gP#`{%Wj z_bMJc2A4zxV|#1_=7*o5%g=RwZ5_YB47>T9Rs2f57@$s zR7rMWqG@`3nwaukx3Teq!Omfb->s6nnfQkp7Z`{!^D-s8aZH-7{U1v5^-YRcMhlUe z@vjWc*3!Al{bq0%Mji-+kHiQYTGU1!a!_ZaUJd`|EyG)Hgs)a^oW#XNl}YK|nyz2n z^~J4NLqzpZ?`)&NKcY&v5FSFK};b@MT`Om{ht}Gay%*4 zA9COGBdng^yEv?@r(I-OmpU6i>6u%`aK;`X*}58|aE;RcV-Nm`FzL0QxZzVd7kY!^ z6p^`X0J45b^yDY4_*zt$^|j&T*+B8TP4bSNn3~|=s&zcqr0YMt2eaXnYqDmJy_$Rf zHb^a9&Sny@0TJ!hx& z+L626TFi6*%K_nkGDonE<-RN+PyhasJhYeny0NxmG1`(Ku1678ky684tt+n0d@sbe z7=9!TXlnQ)4KRt~{I!@?8|w{Lbvrj5UsJ}|6A>9)UZlpZXFmfgj}`0>mT`Aykt@u4 z;lO>%d^9}Pm2XB^@8`MfSB%krOfADW86#alogUe6Y0$|L zm0YNj(%Av{Tq3SPwGp8~Wu1vP0kk5iXT+c_k$lHxuKn~yN-gq-3N%es0eK7h?%uG; zQhlp)pEadjO5bjD7AE0raAx)rSgVZ(ant3D(00`m2i}5TCj`qqzpFchv|Qr8cO-BH z)Hz7X>XXm066j?M19rXbAZ;52{gPvhf7#E+!5RV5e~o-y))BjHZU(Np_>5RY52A1D z**6iW$%i9Rf%E?s6?BSlxJbTnm~FlYjUXKxi2Vx=Cl*%z1&5bRonj-O@c6hYb!hS> zwbvn_6{Jjhlk7hlckjHE8*lti!LQrPm!{;&E5(OEv%&M zw(A>1|IBTk5{0Z=E|*@g=FPucWKKTtk4E09UV@C1x>SHD`hUH(;|_kv+$p&Jt}oxp zqXN7J;ToMyjxQQtgL@H&T|MX8V;E%+U928CYPy}6(86TsO%hPju{ab#$-(!{<2IAF zy#7g&n7=LG=S}7A(H5AlS0Fz2j=Q%^Qi!$e=Q{zr0#OV#3{(IywO;%-cjlO*D~sgf z3wZnwY6fJ7C5#0DFP|iX_JK>@82oBML!>}b)1u<~Nlw+`b)%tQV7d~u(;man)2`Ac zxhZuL6`10?DcY7F0;Rm|d>G%pw!CPOL zM6}i{Id;hvHy>|B>g=9Q_;NNi)Nhwb09BBp#bl({#RBv44U@Wj@1Z@PI=oHKWulaR zWBFxX#q7iS)+4>gvzIhwDLFqGS8TEf6>JxlC{3lZSyg{vU0gOGR$M|nkKbgSjus ze70LuLUZ4ID4!kBx*`pA&!cCrc60<@5rs{eeel8a)STDnEn?|1fGl0A4 zRHNKq?v(V@u20#_v$*}!iV14lXngRt=a(~IlD8VQU}GD~QWun3T0e`2dw=LV8B?Cx z+3plz+&yMeE4ykMcC_sI8x*2$Cb&`Ig=tLM<=|LdnJ)vLf4mEScR`BKFK`fC)9Y(7&+sBKAjGo(vyi>=4r|+S z&@($m5K;oKBNqt285jUWJgqvvlRNwNcxx7X%`^uy2xF(s zuoi<4NlbL6{5{aEL-S>NeaI%wRJJ_zvQHk!O_CXPEALi0X0|f;uB&ty6HAmn8i>LZ zrhfwc$H=@IEr8T3 z24dAXF;~{t)_)%v89x%)97FKU;;5V%g-ZB4TtJ4hp)M_nZ~QA?xL;&3=F7G6n(B0C zHbO+ECtl7s^3M+aJ?=3u89bA;^s!&j7x_k(`|pLLPLc4K7xAgUrh6pOErr!SC`ifE z2xOa{?G-KjdSQI)vU|(_9$$_;iz@Ey@+I=N8?|N}jZgy^%q5s1i$vEU) ziu(U?>!=t0s%HXKJW8=eY1UZZlNl@xTBo(MF4}ZAL@wR%dh{~-4Dz%GfiN%W`SK+z z`}iw$Rep+k3(G}sz1rE?@bMC(L(8P|bBJ>X$1BvEH9mBYxd^yEiP`-k+X^Q8L0x-O zq6q4JL_X33oAW7Jdyvlbnoh*k-KSE1En)zC^b|`9M?V-#C)HZ`*p{^~u z@ppH%aEzXDYGdU`Xx`@p&UXX2J2|R_VByd=w7eDAx1xC#u$%xC-$q`598Tzej#$Sen}bCHst)u1S4KS;&8qovUQu9 zZ(uS$)qh&zeQD4S3zX#JA4eAtW#OyfqAYs~-+B`pSZ2FLW85b15%fvyrn_DL!Xot0 zzrUc2hR(a=;lIu~vR4cJ{*Hp$qeJ(F9#Li@(S)v-_unqSJ76-~PfK^xl!s86BRs32 zV=TK8F!FDqN>1C7@CmLWaRBk%vI$gQL=f)P$s{RM2OFLAvkHCOd1!8jCn2ozt9IfFc=W_Q#8jznP6VFz{x61{bdP-Q9k=-wBzRBL$!}S=S%L zJpGf|BEHa(o%Ag5`{-vE$u^zLBa7EDD9bGdNIWQ3EfhIt+ZNA%?H`Fl^1u@CSJsAE!NZFqis{KA`BN+jR^WB`VV<;&-ov> z92VW5Mle@4_t6kRjQS+M$#QbH zWCxeVtA|%{_45r{_tNNeG|=Gl;IuxQwOgi?hi#14GJ1h&bG*gFwJj<5)whA=IpRbV z7cg|oGCDB!yl#LIDmfqsj#M&9VSg!ITTOssk-ijnO{m+?#q< zT`Ao&h~1NVN=^@*g2I5>aP5^W51sfqMta-zp_JkW1T<6hHEqj}qw-jq5@T`t$F}Eyhy5i?l8{e!XCKm)9W_DDNWKVK1?4^XmNFn0Phf^i$ zH|Eu(drv+Ra`@y|TGh*tA8W zcS3ou2Kl;NNUg`x^jDbfEv)iRR;TiI6PXL^Jcr;ww>B~%Zxd(&EC09yUI}8Ex%U=> zhxD)|dXfS}9NA2|j-^%txZU8`9W7bKi5cEkk>H1Liamn7jzskr2x%8ttFWo2Virea zE;(MDl$hQ>J$xbDGV-csm86h)OBS-=>M}==GlSyU2qpOCB5zF{#q&Tz!Vq6cWppqE1Z__QN7zMqHw z6?xd+9!pvJYl=>}^AoL|?tZUnXY$t4SsxWctXbORTn?`c=Z?~(@2{7*`>a1b36qli;5L3w=>af0IysEiFISX?Y+uqF>+M>4IKCRccJVQRI%km78-bNVPWyy+#9X^OX+D`t8>B zzOa_~U4U;@P8D@yu0sW*X@YY15kiZvj(T1s_qW-^e*U*-uEk9)!a%Z{S)?7eTg38LY&>sq_g-~F zVJ85A0LXgP#@0KTUyD_%$&9gYVRPkfJ;^t5XT~k43B@drhTrc`xM;JkpX37ngMZha zw=R$Mpmwq$)E_-o{$rf!#u+rrOy9-7l! z>$;{8M9YYX8wAI13dqCCy#6gK+|(I2!ic50^#g=#asO7 zT8)`-tHhkOlN&0`o$@gE2^#!7e zv&LEKR-muNn9|M<7ASz-tQtkUorkueZFSmQbx|Qm%_fNE$W>!bkK^H)Oo7-8Puxm0 z8lkHkgDgfBrZi@3#SBi3`7&`Y zLNDasfIPo7Ls=ZUPGT;sK3fPq-Ue+^lb$qL6seS6`xS|jw+Iv}+jWd8)3fX!sj4oD zzfv|*H@bIuQhAzh4KRD1zRWCFLl8s`DzRQ?FYw<#aYFiGA(G^dzTARA|3d#jFf^)t zojj!Pd-ofT*#r~nm_^1|#+T`ej7Uwp*)5F6=AOMN;5o?+wJ`>JO;l0F7co<~%@#EC zxN)G6SHka2yW14IaPy;OCE*$zd|~a!Ce3Q)^(w6Sb#ewYuOcK_#70@ntZhYn53vfq zyx3|GanOs!(>C_C;&E^vPe=2W*JHaCn8u5g8@N+1_C;fMEH%oyS^4R4@8@db7HhJE zb_Gi7ZY9>4=w!J;Qz?&)FSmW{iZ;AImNPRu6zs`53 zpN1xAUNe!vxxXkYyMV?y!>KQNIJ1?VgP(fc2E8pX_zDwpwiS--`O)d0=+3v-JqCHX zyX7w!ynXNSL@s((n#YjR2c>8sb@@FdMyz-ELI`NNR6h!u85sz0ai@^RHZ_CdLm3ca z@Xb%Z-ST8Ut?DU--0k1eIsdXoHNHvDI|$`sE)?HhuYIYA)c$@7G#3AFhqCmhjbrH` z8NE00?WSkEwDhK`SyK>)dH8r}%RaG}ocG5(-MeM?NlY7LMG$kUA*pV1aF%m;ZJ!d)hqJ8;Hk9V+ z;pE$TSX1D(q& zRc$DdM>}3I&-5aFe7!s0OHq_bA(I^0i~q_Kn%jb=Oxhtvx9ZiEYPwc^e6L{~9pe!< zIWY2ok>#uN2tI$%MrMlB^oBEN3c*A2%vt@!DyLDitcJ{=4JOQfPLqi*pWE{NpL^bb zd0*GAW%-;>UFGo~I|GS#w#S7^coF4NAG{5pAI*#MZmvP;@A$<-#vZdQ@9B0&SxU5? z&QM-GXgl)g+h-C0IO z)%Sb&wFB@-qy;glYD`bM60gX>_jU_Ha!vtq zdxoFuWzf|&BnSywD-yj^#t&P{7;`Bd1= zjaAO|6~#V&M#+Dc+8}k@8V=xUE+Gv3n>+xV%CT2fkihc~oQmU<4~Fq~f*ycBe_F<$ zbJj9?Td=O%H%}8B^q`4jx#p9HES27h<)$|@+F!VSOH_~WSoW97{>o5GM zaP@Sfs0WLP*>*g!E_K`PTw_lLIY*J6$mN4IKE5{|)2|Qwyc>l)s%w-c?)c<}6WB)D zLbJX|WCGjg>E1nATfCdlFZVw&kKPNvgV=7`I`W=c1f*L4w7nrzAy6cr3w5g4BV;}m z+c)?=hI=MB2!c_wKZrIy2D7PIMGM-hG!4Hwop~7v-vvP1L}A++)!T3(+&#ly;WIAu z*05c?%X#!#@qpYuX`VdV1-%9!II#C^1n2b`nbEGUjrUnz`S6yX0nqjeC>{UMCA3|q z7@=G?X%lwnGnxq%x5qS5QdR5hcRN(KpdZhABSi7(_rK`gwZE!ka!jddZ7qQTM7X8Z zQIsO{(avM!$@Hme+M7rUu=GxOkQStWTlr`?KRUTuI|W?oc`a**=$Ln?5HxOMeU z0Lah_e<pZd9y%8&Kkn{2&Sry zLIhe%KXDh(A_Zo59RPc#dy<3a{36xMhy5~KScG6p&HknimBT9ZUc2Q%pDJ8&3()3I_)x?W2umGPK# z+p4^|p19ldvyt>M@3te0Q0P~?BcoDWX`-7lpo3XLSZ4PO{A%&z3gm}Ja{RO+v5t## zYR(f8Uc5JPqP0zE%C2S8uet+(qd6iO$8$EZs7d%A|Zw$&pg|yEE&+Pg^Ij(L(OBEShd4*ZiayEjhLvMb}8-? z7EcnTpfFwE38~K(Z%&l1X}QqoMQS?~@c=UWVQ>ygv*)~ydNEkJdCT#vURhK0CtIu{gI;F9SaxUp60Wn zsE&*>k+t1DRnZZppC1*G#U5{Ho+p_Awr=&j9ImxRQ2$Z0?dq(u37ANj*~6+W$CX6y zPmBL z9xV?(&)Hn|B)2??9yFHwY{_#z(9MCGX?V9hAGMbGZQW#ekrhtN`W1D?Zwr zK94Hjq)v^Bulua+4an~v{ivyDq~;rYiN4YLjBb7uv+aKrYStcqzQ-a;S#0`HP7o2Ni}{Je>gFjo1a|X`x6)lTVy&vBJq$x z?*sdy+oGKr#vbykzS3UJ+hftRh&UZtnLwszUUR#yqcbun(llZ3oh}{M8*Ob;T4QO1 zxdIrL$&T<(&jvUT(rjeVJU0!js!-v zo92k^j0;N_n}&STq-*t)Z!!&?J#ak|e&87!*^ZGGYvg^p)qX9 zNfcgcJ81Ii=-0!ETME{1WCbC`z(`H_!`ru+r(bMO(?)s1*!inwryy;fqL!1j#xfC! zuI48E(ha-Iqo4V*CIW~`Dg6>z5$(!4Z+SzB;j*uCd{nK_rH!Qn zdH_oP?D><4VJR7o>SA>3gXz#h`blOw&8zwF8_?&d0l@8N>0}*ZbpbEEzmJ3#9F)vT z^lm%~2w8b(P(?6pj(zA#>{5uY%PVA4qdk9;p0&0_arf1x!F!j6Ps8k*QA}>3Fq%qi z`x9xzuqL4qRi?Rd6XNmN#65=SL({p&RG20=g&Y3s9|&j*7I9VkjMm|_Dl=ms?LCX@ z(zjgZ`LveN!tphwOzF*~r)X1*z^9Cqj0qeScs9oiptjNky_@!+P2e^ zrbrGlZ3!84u&SgTEA&R}d8D0>RynCpOqV;ZPfTxF8srgg?u~Xa_~I z2lED~#QXJq$Pd0@cBsJwPY0&~R3n%4kwh6WWgelSj3`IHUEj!kFzrL;HmQ0igPjL1 z5<#R>1G;{)G4i7kg9}}lGUrh_|IHQ0-b>$#r~BDp3a!fPayrkJ1|ne!2|KH3bE6Il zHS5h^yU8!QC8h(B7gt1Wba0PqT-~N{gU#1mBwPj28l2tNPlJC*FHR7NWAyerw_8r2 z3BfJf9ti@Okndrai(DMb3bnx&-kfeR^WS*jluy|nK>qtH zt+bo}E{e@VrGicu76p2iu$6?A`U9(+7OM&^avk1=Y;E3lv#S$`ubcq@!6!W@b~*>g zsY`L5#LllbUUWWe0^gV}Hcg%l&{dS}n1A&Tr1;bz=jf7i$sL1wmcT7p5%@3OF{e_& zWBohdxKM*N(Bno7rysSN-=m~9X#vP&+%Do1ci%7T@%X@G0E)wGDbI8OT50)7|Un?%R!0i zw5L20_tO;Y7X0L#s6h^3aV$}9Q_#EmLCR&Rk|lv+Fj$d z1jvy+!rBvtB4dH%KS{NN=L6M{^Uti4Ieq}9emNR*lcRHb2ODFo8IQfh#ThbIpovCK zIm>>Jp!{hQEDb6d2U9GOL7V_%6MFp2GQvVDgZ*_`*((pywtHKCp|4TtOjENTuvf;5 zY?C}GAa!F!y4g4yzWsKQFL`K|zcAIdQd9cXq|+m$JZ1*((K zBIXHOxnqjTp>kYXjtC_?H}QMa=yh?|fNh)bbJ31xi|)!|&W*1oUB!|XR*F_XxMH$% zw2n*ig9>Lk0CQGR9{K~vp3h0)GL)^F0#h5kzQ=9H1-0=<40Nll;vAL%p=zv7I6XKd zSIxTHtl;G`L~&O8!9h&bnA|d!kgMjM$c1}}sRSpgAMYcruIxCk$<73&Og8c6&*V{K zjWbfqGnjVJl36RPI`YW;s}o>Qdz_TDfecbhQ{X?MNRi9wsep+$A%=tvU-+9ZQWYq^ zmQ44dyr>}h!L)HzToZASOPZ=VldXOLGIYZ(xezTmE&hwFeUz@)1eVLo9sQd$RR4S{}- zUS^V=J*qKMrJRC)WeS4{2$u>6fMJe)vH%uqF7$6o#v0*2#rKL*pR0Y7;w$;30k`BA zq#lRVb#~b~F2}MpFy|>2D=sWw4I zCADqum6Jf_}-JGw$n77!F4r)f!RGw zgb~zk0S7tz#Vxb{^dA5$JhrNmVjy=a2Y{65B zH}O5G6?KRj_dqnkOvs?y_&>CEM;W&@F96=W)b#FIf~^E!{(l4nu0|q>EZaNM!}r{3 zUS!sFH!aoU5AkxwK8;@%(2iNMC;m0T8vh5&jBx19Jvxn(S+!Vn^>?&Bf9XI=mEJj4 zb3rS=tY^uoc%e0#5ZOr5_*N0-F(ZorHf?c_hKhy%?Z_YgX*vFjgrea{6OX#+$NIk> z>O2p579)k2z$6Xx(YnvPB0IIfB|u%>{Kn>&Xp*luz6U-awv?!p+IswPwy;Q_TwVFo z9V76oPUE9K54a&CTBDCtWG|f3?{T{^D;h7uTcn=Y^MH8`%9ElA2!NiTp3L?s!_n#wB|m=rsL{J+BO~jr3n9EA98GQ#gw1BTN;dxtxRy z$G$W&O1#i3Ncby{ox|`Sh_duAhNhyYapgO0kPk~rp|h*zLxWGay;R!>AxYn1^Y<~e zq|m2LZ^_PJV+rB=??YQ((;EiyBX|5bGZuJi><&ck(pLoTw;uh27Jt5-8rg#XpHa^z ziMfP1;Ue4r4vk;s!b;LE$6rjW1q!LL7q}W~UlCE%Qo0K82Mp=1zcS1*d=zZxu=DS=7W_LVIb zTWNVF{JD=G%i(G&z3R;=t=Lx-!;#xcD7v?DIo`@3RRwU6SV>5`puj)t?*F2z-9P){ zI@k6;(3F3DC71rc+3{p7gGHjSWTyKb5ixJA1@lT*eV^#=iCk*!?CI=0|E9-7{u4d^ zUWyve)TNUBKhfj)(*M@lo$_#bZ5Q;}U((}sf79c!LOk?FH)2^?YRH~gD>1iyO%**p z8g1oYCx~}U0bO#2OnXX24TaQ_isTkRu88OAZUR~dqf*gBt}4FIlfOhaBli9#ZH8ns zy9kK>$YSJl_RU67ko)YJm67Z`I)Cu=`f78Ca#FK}l+TEwo z$O)fV#a$t%V_FaJ1W7R5%XDp&bY)sr8V@Fe*a-OkjO<;0-@~i_zJ>`y zB~YX@c=kUYl$v2-4ys69u44@&e?+|#^EV~wMK8EZ(I!n4q*t(ISe&Mnzh^Q{6#oQJjv z;-KuAIgZX?$8~NzyWE{LH~{%Q4gI7-|F35PGJC@J8?=84fcDwi?f(U!<{YpbHoZJT z-e&Rav@iy?{=vrE z=u-)4Um9oVlR~0NVg;nm7w)lPHv&88{Wh2e=7K2s(7zA9-+0j5s3$)(S0(<9yWOIG z651n{aQYYGAR2Heh*^0u{158FPi+p_{kQc*GkfTsKGBo^@SY&C9PW&uJR-UUK;!qq zoV2Z*zSii|k$nXHW!$v?|W(X_Xq2djtyB0o*;#9-U41Cr@igg221 zws~yyMU;Jqm>8!|HhXv1NY^u!70^GEYvcUyJu*6@xzK09W@W7aGTziI)zx)@NoQr% zIqY*JS2izX?j}5!_;qFAlMzoVAfp_0j?m>wQa$YZ8E^m75l0N)32n4x@zg$a>u7Rp z1m}HdFXRH@+RIi}W>dbm@ckM+7XH+rZSD%xDXh{v&}%!HT=q{~i)991Yjxa{0M0yE zue$tce_%hUc3?^pCFUCdpGgZN{8yWU6 zuF8`?1>i|G62~$_DvBfWFK}7WIQv18Pam54{&)O%hJuRM4RYKa@&bnjw4crxPE!hl z6Q-}RMf?u{`QkqS`43aATY0105GndPk9VR>^9o+QH$hIhO)UT4+hqiU@{aFN90hb5 z-{^AgJ!?1t=<(G{xBcDv)sB8AJMJ=BV+7$N{{ZB-;KilS7~dCt`!{B}v{EKLko~CO zQ6qlL{ww?8j*xm?31m$9S}@vTd=*`T{Z9eUhOKrZb>oz#Y;0lqRa5c*N*@PY5@LV+-rfhiix4NOlt|NLAmn8N!1$!E{}(Sl=(kJW zf9Az!$h34kmql3Vw~WUR_>t~b;ty*7==t+Zx`a$re++vcpRK$4S0*@gRtg3BD=pbT z2p;d%-Qt|CC-Nzy=Y6q!%W@pB>-jI98>Qm^z2`>HfcfP`K37w|gvP(6-M*Ufn-~Ag zY`Al}@ug@exiItNXWyCQ5_TIY94{H5i%ec+xH}Es1eE3dNM3lQ#>hucuCQa(PaE$U z*k&3@u3wZ7E{mtscfyHp6}1^j2hfCKrloc zDl{q;Q)lbYOyn7K$H~nu47oqI_t9J%tLcP~KS)xPTiF*TnPMcS_gx;4mq~CcfVOw< zw$F4Lt1m`iTVksHk>R8j$vpSu!A$`YHMCq-ogK_v?=&r|p`&gWc;XYKX4g0J(qpi^ z;YxXTrDPoINT4=UEQ0jhJ*gnSX*)vg`F^H#)wY0V7}!#Xm+PD!J-u^Q8m#D}kdz?S zk1V}8O?~K~n_~Bzf6A`NYR(5uy1UdxDig_hGg8OdXYy%u7I&XYjht?rl=eyyHHmr$ z;h~v^^K;KIRYLuXmx=U;s-)F100P!Il2f}rrz|il3Z0-?e4VsucQyU)8_2rTgIx@t zG>7netdrrzDx{~aCF+*uuj5p4P9pfAZ4NK931tiiBJvWN|v(z6B|}CunX{ z?Vm;)2$SZyV2nQ|?`<-#r$jy1{p*cFVQ^#_n+LBvjwyE^YsVm!t2)C3F7?TKVw*;% zAEHXGI{UapFN}vxKHUoYNsN#9*8Zq6y|YscfvJIQ{@8>7w`O#9ZcURrALyX<%6(VLn=T(?4O;Qaz1;Kd^nWP@1|57@RQ^hwH-H}G>tiZ`IWW>{JD&?d+mVYj`Q=N5icNgTOBNsQaEAZdF|3=}O z?I7C&9;^zPxy$*{1vx$3PQUzMJWC>86yY5v_grwsrIyF?Wi!G3%8)XtXrR#6w;gN;mp3ry;@kb|ad#i;oWw;x%7C_N zAg*8OBk-(&pD+O)8UZ8q9A*B5ydU2ZBP_;+PEVK9zxi<3$NtgTZFRYHaX14EH@B?Rw&^d$#tYlZ#J{ zovX1(zo27&x@N`0j{0DI1adk<0MTch^`wj=1$Oy-dehKIEoG}Y1Z7=FDMb(=)4Us| z32Ak_ifXrG1Yx&CoWBjo3-L~Vp2(Tqs$z~JKJ%#pz%!iww1Usgkr?K2V*rBeR=%3H z&LNxLqSnUra4(o=Kjh}>kf4uN=SRkD;n?Xp=>-E=cp|GPI=-98I36yg9Z0bG zOn}yTWp=j5O_b|xw6NeR6T;OdI$cS?NyKnk_-s#Lx|L<};{>$fmjc1k{O0+|HX#^o z=h6I?>RyS+VG>9WX2&ZcpNO7uP6HLb_>8fLjrL z<)h#pTiN<-YN@Qa1oV9G*H@!^6$(8(A5wU3yRy%}apOk65yX{;h<>R3V%7GDQYQB8 zy$Q%EW)ennq`VYd)O}pyEZw}*z2VOaIW%FW=hv&J@HT;pLS(Rk_1*!dXg6fF&1zR#HeT)0TK6VYH_Up2 z=mDdG$)`@(hdwuj2F^~VAQ4-n}XvQi*}+#!H^3fC{;esGbt zM*T8whb*q(ag~X3Bls-lZ)}oQnOGKg3XDH80neluZByD?N{ly4Y4pI(O z^rL7$Cv=D%KVH+M>ylQVY`Gq&$hB80DJ*~rZUhLJA`xAOM@Yh15Xm?&oYZ1V@DRXG$ z>4dttpmWxJrzJn6&~=ez4U?NrX$I$6^D5vX0?v{ySQA5ofyuXCk4e})sfje08PmK( z&sy)@Ukq8J3M4CM?otz9ycO{e55hn94=gcz#CaJvGoaXuzuWkCRZG)~M%^h2a#mrI zI?Q$5A z`kX%)w4mhKyyXWmYm}6s@Gel*%H;zOq{%B4YnE;4L7X%$d|E)^e$8B-)%e6AENaq= z;J2f{-tkY8aBk3^j(#V2ds-WuA@{u3^@kdXK=~Jty(w^KqMJY0>MS}qPF9t+drQjG zSg0~YZ2W4HQHc_VH%%e|jz{EpK#1Rvgx3aLF6w-|H|^O(%iiq7c@)jM8CI=@3~lba z|3W8%7e0)~%N0sb+V5C6>N|v9iz_ImH>a$Pm@^?5O}Nd~zo1$VY=p6*UO3jaD)cV} zCr9b*+9g!CrurOlb6XWZ{xX{ z+GFF&+N^Qya|<cLx1c>Ly-3r;riup;~3o_9b zMIK4`cJlXhlbr}LDxrg0W2zJ1V)03ch=~y+n|C@W6WKKk4VV^NmvUGyKT=CfQq!km zL!Tq&c&pL;GjpW2YqT)DhOZN6SlPP*T5Tq(zhW)Ub@+F%B!yHvLx&r=&eAWFyf-A% z!07Ceya?*an}FHT`I_YU&UNRQqgp0RVZJ5W^@=V2{+|p*Gh{J2NHiEs$T=Kb&ftff z4{U#%a%I;inav_bijE};^{PQCkiKv+(Da-YeDm22J%fniWbYLYeNp_gI!;fC5yQRK z% zGo!a`Ze-t&hLG)7OS%h6sH>GxvbZ@gL{TyC?+nqJ(l$bXI&%h5*(J8n%#X1*>MoXG z$7aqw)=K3!S7csXC6m+P_?{+~NRMcj;0oG(0Cf}=2af|O;(XSwIqh*p*silo!hY;W zrlaEu>I$pwvWnq_A!|fr-(T4heJpE@6*RZ`);Eu`%NB2+Q9&d%wUdxe;~KqXOsA=) zRym?~j_(^;jl1Yl$ZNblmjuN{{LCV&2+^frWW+v``EVzl)TFUhMd;(L73&oW)17z1 zsFge-sE#?}_tV)`SE)!nMGvb6V@B#17%Oa@9G9GH=+x)FgHp^NkxVbV;{dwIe$4gC<<-O-*qeTwxf6Lcs@wo@OL-%lmwIVij znct}0aM7T45B+InyD?Q#-oHTpW$O(^Ks2NWf21T8Hu^OF~_Bz-cU-zsv%d3_$ zXrQkkrYV(QnM}2f;*>uLqyfu~FND9HzJD-jYc(nzx2Nq;ZQrn=9`6a5Mkr06I;kPC z3BETzKLtSRQ}tp5blG4tz;|gZM&9Y!FP*1^%LAf2w`(u~$qPQ?v3mrEIE=$L;2Q7d z%8sc((`qs&Qtx3iT=r020{E$>~#*ceCn3H1gx- zRhtbToYriMx}3cM&Z8HA#^(fcDjNB<}OWK%S-Ckgg6%8Tm>R#^W0q zP4o4DjeAtF2O%Zou3jm`2T8js`a^MUY2Jh*>~1L$qCe64yKd+pRfX5aDd+&_TXiyf3fY+OLNW zU)1Q;+1x4prp0o!xqY6%&sDvrU%s^Frs3Kee*K8&&>v!ss|kl6-#Auo4qf?dg64*; zN6n|mmj$1#+;f`ShwnZtjCGinwQvs{JWC4LkatY}lpc%k)nXmCC*@Qm)lOx6suFLG ze-5Pno=;kIt|;5yXYBC!pz8=Q+v@{`DlyEM-8tKyXs-|1AACYob>ZsEtdnZx>$yUU zua8cYuUKA#pRJ>Nj|^7(n~wR%N-ioj#;vR!7Z)RyFO??jjsXigp%Yf7GzVh<&y{vM zm?a8c;HPL~{i#p9C%4xAxi#%&jrG(rX~*m4(YM&=_BQ~af82if3g!bojepsajpd{H z&3p+`!n0#&co4Xg8-%=wJ02B301y>)clgoBpvfB=De|Qk>p#s5)gOST4Rs`D9UEY{ zJhSuY>yGyitzu-IZig$Ss`2*#~dM#tZFfo5n(m!)XKCGX-fk znV@@=x_hc6V`ooXT2BQ5TfWsaz2Q#vasIN_8ZVnAb?a%+b33*B51kTb0t%#!rlm2P zUf$QNPMx)zIogA(p~z}%dxsvSATwtO4XMMlpcuOIohLQI?F4d>3;qW1{dl7xBc$6k zhZeXN^2oLVXoLpiL2qJ%2VGIxx}q2tYR@K$Ngjp5xzi!6welGQlod2Q8&KBYIwyp@ z_@U!#1$&upf#Io7jWZ)m%lZq74cq$7#~CAQZa~Lths|g|2k3P=@L@II;`uU)+b8FoFL4_ibU$06w$4V29K@4FsZUeGhkI!jN_RZE?C z!fuBP2sfSQpIza@ar@p@kDp8X^a#W^j@Qz{67O%RREKYrKlv8uPoCMi8dS{?6GzP2 zWYd-JcI&}KhUH0uS_Ow~1vp==PCC&=Ym$Z=s6c?9$s zk?)%ce=@EhH#AUU)xPd&LN@yGz+?}0aa(IFTJDxAJc`oJ_tf{P_zphd)!Mvvqj@2^ zw|UD#1M49@$k(c#{%mzh&WyuJ6&1)@!;Ql7LsHu7`~AluoHvK0=sp-!&?HU3tXy>7 zPj;%La(I*2Vt>~ThTwNWd~;ubWtUD$)zRD~qQZC)1w&w=jNjvH*RRjSQjz@|nK1bS+$fCE+3oe3y+i8-^FSPktE-M*+1;R7GyaNKEze0HtQw?bC?4X|8`SaXz39 zntrE-!M6AJUolZQrihSG9nrJo-AMFMTo{qKEOBNCJOv|~;IQLgl#I+!KSy7DOUdxz zj2D*G`zoUVB~B?R6ZzRj3>u>KazPTsRfE&ox3<0F8SsUMm`><(FX&+5ia4nm$Nb0E z>ci2tJ?e=eBk(si|_OL zux!mu9-cC=NN`MQG2BHX(KyA{A}HjF43pNMx!-_YZ`bNa{IWy=i)E1|R4122#%E zfKWfn@#V6Fo=A=O4o`tr>%O%oRc?|I)GjKVHKGqTk)B$e)V}P+2?5rLx6N|UF5A_G z5Q}v1t#_WP3-gzd0mrDLw$7(62kcE^C`>cWu<#rz>5J4B)udKjO!vuNV77efRLS>l zl0vesVNJ_aS8EAFp^6MistCtA8yC`6VqX>P#~~>i=tJiq&peose8mkP%;S@vlgigf z(ckK77OIFS8C>>OI4Mi{gK6mQ-I|x}N_LfU{_A9Gs>(9}Jf_T9I?b^k5AZb=jC&L6 z66NDXow>=uW>&V=1QiKdX*2blOSjR+EwlzF8D%ZB{j6sd?=0B)RL$K26fa|U4X(bK z#zG?@*sWjQEh3<7f1eSPk#00E8&TvgXIoKb$}}%~i?ecGpUJ}48mZUDN7hL|K>PH~ z^y3Y-`Av$7o6vdaN`B%R4VaKVGBw)@bC2@4uPnidiRPd+@y1Yv`FO{quvElu{iMzE zH3Yi18@kwB-X&QOm!HTrSI*{RfOm$s{eW^r!O9w!;8F8<_n5K5$u@jCN?QBmponl> zzKs^};tX2c1t{xL2i&I&-~&O6A2Y8vffsY)h!~AX{SvhVoRW?|)VZUJ6P;pXRwHR~n7RxF~z#eGAG z#>(v>3Yt{vq+huj8fWYvU$?G8|6EM zTPj#MnO00oz^=%9uFJmngbb%Zt$wy^H;!}t(SY3wZ(RIgwBEX*Cs!= zS=klw2Jp0RW5DfBnIMR$LJQC;-RA80XpwzB-e!G$^B8Dxt#IFj`yw7f7xYDW8p~(_ zMP}6(qa&-%hJe42;a@w^aEH*q$hNTbR|pOT+WBQ57)7+&#E^58l47L_RGzLrtZ>TT z=b!kN+pp8xL~K1d<0ND8y2Bk`&S6j&E9ms1?H!wwGE3)!>j2R%m7q9 zkmqATG1_u(djc&gx1W!uWjz6|rY3K*kk5<~)_{K<^b_)q{?*aT=}_eSf#!bN!Ye^i zJu2o7p1H)^>_yH%-ic4Uei-S5w>ag%qFL33M_w}(=Y+pWL3jYA2(m12dd_eE^c;V? zx-3Rhc9 zvyNWOqM({I@;gVtgT(OfyWPY_Zdm6*u6lmxoMU5vcBfxeM*)03fS=+bfJd%O$xTg% z7)aJHKA1km^@%9hJf%HqWzC)ed*MmV!7{_ys~wX?kzb6g3m&rFS_^ddery$2_{xG= zEK-!nz0`{fdnf+6B&}-~YMt+?{f4`7L3k=n?*fNs+k;g~BK+x(M3_vQ)Aqmk%4CjwE zPkfaeUsr?eY7SzKyJm~MbB3bNSV~&2Qtj~}72;0|dy%vL6TZcUfei%7JoCR=Iv;C> zM8AXBX8l#unn&QQE9uhO`oxbHv{DqeFaD>qrBdb&pQQXV(wVqOz2Ldv2dh2YK~8ok z3fQwTbsg)NmWR*ylcFu$<5) znEVuVx_GrB_@jJ@%8gssXm;EQyGgZ&SMM^*M-Qf0W2^^I7iT;rjX^VX3qFvyc;#*G zj|y@l)0HuXpIDCiT$=NGLj4{Kbu=BHEVk9gE?m``*a>peN~AorF1Ti|=5`ifm$MCs zizNw~floXG^1USp_1=UwLEwY=xR}Md-PYZ-R?mAUn0C;sLA)PqYDCZkz3u$fo0geC z6{~GiaA2wprl;hzVj!e+9?u?P*0SFZ*V~Gzu$i@%5;(_guWC{`R@x>ASNIcdjI<7n ztD%msI~C$^^YVjW+nr643npr?%uYl*U}5~&+WK7?vO}DY9a|bhe&tT{6wCuD!lTal zshe1u)>_#lIGvk?P((E%w^ozT@%XO%>b(1E848{)d^C|j`MUD+W+pf^E|^fYXfZ=Y z>p_Dg{}XeX7tMt*v3d6{I)}-}lw!<;1f#N1s#@E1OeY<+U9 z6-Uvc)X5UFBT~USq>5&D1{xg=0EYM>@}c~y1gfKQ-D|Tni1KT%S3Hn{JE~c9iixhq zIy9n$71+7yonFT6QIxkam%63Z=<&QbAix<$^Fx0&dumUo_aw+udaBzDT!)X#Olvr8 zSF;^c)B|=*+46PbZrT_R(w9u6<`kS-DNeIj2Y}yMEw5H5bPU*Uj*Gxf`@CoQD^>#g zvs69AalJ|JVpp2t9qf^C`aogquimOeh8>p&vbOP`ESC%|{<1^1H}N80dl9-L+8jM0 zS`S%Y+0htrtbp9-JecsRa2~+_$Q+M7VwjUq0jSCjvEEi`%sYZ z%N+#zRBpK^$Z)LWD_)L#0jS3sUYWYlQtspH+WD&VT9C~Ov8tV~I?=Z9${zF3 z?8=;|xdd9b8<4HUIZV6#Ro?$=nM8og)Wjs%zzSS#MS5L?`SnKZ=W#)rbsKud7WU3q zTsg9&BdfjY%@XM(?OXwU$HMF;tFWQF?Ng+P2jXh{>yv5@(&22DUHn_)*@aUUiZ$pN zFQOpznfaxsC`<6+t{~Ry-N0zIi>A2{DbcYM4SmE{j_J=KYfIO6Z%rc`oo1MVgtNh2 z&h2=_QBU@w*nSewT}Xy`msH=ea{^+q8oL(~E{Tlb(S4Bm1yjC6~MA9oCIsw_L<~o3s(QQGD+?akdZQ?3*!FR`>PlW47NLEG2$J`K7 z%{8EMPIBAr$Y~1sn8LV?BSnLjjJjkZ)T@OJ9LFMyYeW)8Q;9yDmKqrT1ocOYC zwkHnts#&eqOr<}P)!R!|p(b=iTJ|qKI89I!z2mH-K8ejQuT@y{oG!hbzqFHYvZk-C zY6vXui}T$w=XIgu3ryeemz(8pZA2z0EeJ*S<6(7UoM^&3njM@K{)`1rC|5JzWoC0f z3i?6sf@gnVvqM$IzP0%^*%0NeDSW>~cJOOu+hz&R4&q4FlxlJ^`;8_E-O|GEMtiG8 z0=;SDl_0yuzM~K>jS4x;Pa-H#HVf+v6WUw(KC$eXX9DJeM=C8GkjuGXXysGY-e2iQ z-=B5`m4+YBXwpzUoZ>Oz&Y@FsWhL0N>HS6O$ZBL|scXt20=3{-SwJ$Y{(C@Z z6{kP_XNVb-^-G%Cx|V6vy0!ICz)A83-48|-{kZV^C42~LX94@x{D5@zZEn-w$lCDdl&f40P1D(=Xx~JpZg-gnO*o~fPI^o3jfMV=BS|u?tQ4FQ7 z4>5mAu1-?eH8)2#w&^=^Knd~o5MnU!sBQQ~i%p+N z$5Tv*^xj9$p*oV@0*M*C7fvCxp~XCyo7w^df_Db_#BYE_p-c99MXsz zZbZCM0DZ3M4f59EbUaVK0_&5|9tvnlB&c{|9=eopd>bBuX0!}Q*jpWtj$Ei8*raG! zXcCS5nQ`u1xIn!DiRR{j8Fi{Iww?DKH}Y|wmWGuKsash)ludmmbqxD!p4Jk7rDY%l zZ#S98lmNqEEKJ^mE!Mi`Om~tqI&V-{wZ#lS4%3fsS2~%)>!@d7p8vqvOT)aA*V&oH z&m#9$Ibr_IBlW;a&94d}w#k8D;Sm4OAaI3XJ3!GoS)+NF!f{w`PBhIt(?!m1=}x$i zQ}ltR{kpkU{>QqSZEnZuY@TnRutVs*SqXDebspJo}A5Ry_?Soqa{ABbVz_fUs;vwUl` z<2uvW`pMIy$)2LANdAL+^#||G3()nd=8gj?jWefCy9-iTQ-%pKpZ9K8OJ>VN+V6kN zlr(wNlI^{)trvOkm^Lmd{{7=&lHEbRa3+#*VoUN26uXfy*_D$DMO7Ff0a*Hl>OqED z*{9_05$%!b<1a^coA){>t*wZPj@7C;XeJ7$6-ZnozI`y49K`R?l65u?)3Xp@FDG#aP3JXEjWSxM%We#LLa zaDCIA=Y7PjCg}+`Y*_rNjiK5SajFNB?wfmA3gE!AY}L-?mb&R}FnHMyD_r8AjAW3e z*=De`$bTE=h}3gm%up=)lyGYyK~GUQu_A|1qPWCq}+1cQi zJDc>dyLpt(pg+4PR_yO4{`6{Bgno3!1-yy#e+?CART9{LzhvhN<9qJw_4WU-_m)vr z_TAp7h=NiJX#^G}p_G6$ECd8pN<^f)yJOKvcXx+`G%QL=x*O@PMRzXhT=_@|B=KE>NA%jZ8i;s%ZQ9)o>T zLvSnB>hs3S%T|cs$4=>|ahC-!apvS|GiffU9lsrENGH-b3z&LR3`HRAw2HLt<8;d^ zsg7vk^)&XWUK#g+#n-o9L0G2%@CrL`WK11BL>Z7x~!NqDmN@NJHG-vh(lL@H$7A<57l;8W%Nv zzXUv~3O{~r%3VoJjd-bHuUYPejY4rfb)t*f^WOacg)fLku9QM7NeaxgLPBQKI)mr3 zMa;(koLipxjfr9i`a&%3(E+MBU-(MWtkH zz9)m`6Pw#9u0QNg+4!%c@}zR6&=LMDg*b%m3EXE+UcP^-afcwR409WnrVk#?vzXMx zbmJ!r1mnjK?-+m^?e9W-RL`Hs+NSmZ4em{4qBuq`{u>(OK4HA$rPMf}xChmWpU zbFF$(HZExoWS*@Ee-IJzauL*)a2)v(q*l{4Qs+Ppl`wWyLnb2(>FC8#hBCgmnpDEN zgEsPeCNENpGlo=zo!}zy2)n=ATDiX9WcyS!G~X$kOH5tR6hc?lYiO?&!3jxzpHVDZ z-hc5WWnp!5Q}tcMY{`e3NtaC;LV0>k_j~}0Exi>)KN~fYvnnglYwxgx{Q)Sl#kVrP zwUv#LcaRwIANI`xh&Vm52IssbYbk(vUOIY(x!-IXH@ur48lqS+LngBTcK)cxQ}iCN zigEZKevW2W5N1IILBEL4mabpI{J^{S?#|us#N!HDeY)o{T~`D4kd|27FD=wi0-R2E zjh0Qhw$kTvzC&`st3(!Ys-&GW6-T;Ux8LwB+^bzIItf`;YASUiCaA#YPpnHH(8A-V zDg>i~%E&iJG{ciP%~ln&#b(7IuJZ3Q8xH~PUVUaS1&!Eadt>X(QQIVQ%88W} ze%6+YuZwCnJKG`ks$R)MZ?Cux3ofxvmU!T4CO5kye-BeWqj+<)n6s}z*MEuyKbMpR zoBsuuD9^Zfmle_ivC~$5?nzB)C@JB%hWow?q`Azkkx@2a-$nEJ``I@?RJiZ<@6@_9 zr6}N3j}9;i-8#SK)ig0yCk8UH=zPLM=$M2Tf57>26;qW;FBj&rflRkBs_u6UZ0eRP zmf-_s_{r&AwAK>Mo3rt-X+qe}J{1?5J|l3<)I1Ccv-0|)cV)Rk@Nfm)A}@0?8HuC= zX%$N88W9Rr#DHm!Jzt&|JW%YzvWidZep~XW%e1gD)-Oz=_HB8PWh{%~bhZ_KmP7gR z+i8;M28E=jyC})8rsK;neog39x$gyzl3F$-ie3?1J1%7R3RU^9Aq(oGx=C2|w(k7b z+!kq2g1}Sm1&s#^_Bl~4@*0xd_W5$F3f@n?a4BNn<9rc^$rlfG6j(@54|7?U`u;*! z@^R`2ZW%#;|Jp-Zow)V}_eFYM5L)W!>V!vL);GM9VB#Ak?0?7C_W#D$e(_tvp1=65 z>tFm9R;Ui}J2&DnfrG*cp$pU*Oy12-)|NNereM{802U8!;kcD%2H(y`VCs10j zc=!cD9T5ZzAAiUdIwm3Wdep>+>6xr|hap0AZw#Y}kDdv-9tcNcZa7*73#OaO7&BP# zFm^=JW_Iyg%98Ys$FuOaLv1%`xgOoZn^<0tKSd`2(1?yz?i0C<_xtx zBhRdtaI9a$W}LR|;&Mp@BhI#;Hq!P=Ej|}>xgdou79|6!ZhAn?Jz;xE%}C<8FOhCm zh}rwPx5pl3b;lr-3UltWQv|*Rkt%cz-#D0NsFYJ+J0PgELXW4aOy`dINbIH&4bl@* z?OB>FV@lE{jB%au<2)9j|6`%#B1ttnmD-}xcASLP5VyB~O*iH9V(w~Y|iz#)PMU^jMaLcaaPjE4gh_&||Ph9Z6JD=~>f@5ktWjymczw1*O^NY!35}hx1mv9aLekUlnCZaV- zdAoQ*be?%uQt(ljMfRfCD6rk3iW!=<5Yjd6S6hme?y0bod(=->zvTOs;&Ao+h&g`L zs&8wuEQ-`Xa4_yio3(!9+X}%8~?3E4XHA^V9&{rC987<{zlVMUCMZhPd zL-AJ270FerA&ay}SP$s(&lvTuV6&D)0#3p6uM!}xzHX-ATY7^5g5jgH;fx?{BfXfP z$&9!gEh@*@-Ci8uD2d;HQ#yXpISMu~z3_!JYIsdLp;5+axUkAJdW{Oj zHt(eOezA+QVZpn2i{CL8i{lA2#Ulgww2kH2!h zF|0O-yxxCD1sBp66$@C``#!pMjlTv^ZX;YVmOEQi66DK8n$g@EY_ybHv^t-X53h$# z%0jM>I4*E4SUsHmoC#Ko$ znD^G63skXC90kBGs}L78We`$lJ&O9W>=S_!40D|^eqds5LI2Inm#Au`$^A7l^Kw74 z)E^Z4`N=!CNw)lk#z#&=Pr9i~yfwp+sM*R()U3V86?!=C^xh#w7$rlPnM- zo9h^?NkR;ygUnd_-!8j}2wGh$%}&EA(=Eg=WJVVWZaPT&LXQBs``^+?J{gIA`9Px8 zI3Iui`hFb6woT-xzYR3^ok+inKIO+7WI-^9BoWT!{JKK}F0u0F&)xf`db?ESD9(k} zcYotclSj}G9g(l{`t78wR^fVm)mxy$G~E>TY^uaCdfo zWUIZOEUx68V`|HwRzN0Uxk!tZI?I2tSkmjKJ+nF5Fw`v9STqeAAwdJud9u_UJKNFt z1H{QU92q&rN)|qE={R31Iyfk8p}BNR-#+E2t{AxWDxT>_=37m$XHmb#hn*39(IMNW@-oh!`_g+;k(t)2$F zgr1yY;gP?Ev7zc|+*M>H%eqDsMde{qru4JHu%rdeuh&F3PhJN$SdzBUz@UT8GW)K92e&!gocy>I(57 ze1TC0zH_n`(V0AO<&bgXTUVL_9SQ`MxXB|5Gs4{7TuvAyGnvd=eA3bg`VloDcs0eM z>w0&ANlY@TpU~1>@Q^sk$7u+u4R^c#JgMuwLA^at3~}pgP3{Xv_q$1aCH3+CDw4 zD1BHGX@Y0h06Dz}idn-Msx!?w{ZRW z+$WwPS@-i4#i3x?O9EDROcGvxjBw6<1~>+58pQ&4Ql?FpWrD~-$HVovx>azj~@-FLXYbUN9T1-Znn*Dc(ny6rz);Aox+J6@$EcCUDFj4^|$Q|W$ptK@=Q zq)0|7FfbXffbHDo|HPOgms?rgZBrEbR-Y*)mx7#%OYQ@`LW^0=g30!KK5ca&NX=p3 z*A9=B!39-6OzTXhIVfaJ^wC@%-Idrn>J=9_c!OrQa=-Cvn=J_$b&qjnrLy!5xTm?s zV{f%v?xepoL&VQm9T{aOk1O`DV-oQCk-r?Mn#|N7;$f}tIMj zZmBc`vp5&}2AWAg5_`0Xb!SBO2A3MZmu2Mrf@VrVd4#S>8bb#fWFsI=*@fett72fJ5m<)KYJz=Kb9#c2)u>wcWyT05^M$yW$tK^}g|qTf9Fs7{c@I8ZY*F^jZB^wPwu z{KL!}%%A+#25G}#@7WjRt!ye@m{p>y3jaZfOrLIf(qe6_(N;hLojBtXi{q?9MMqYT zCzZ*gP0I-m&Hyn1&uhP~zq38fmQ@;QVWSIF`??BPu7nG{7$z^o2ig>rbwY<+c2Y0GyG~n&=^_zK%y6u{G{qa|NKHHY;%UGrqq`ha~mpndy(}tX&2d#pBqQ~ zwn8uoe=qT+kUQgkEu6yjK7j;->p`<~CM}`js*$P-qiyxv*`tN4`Pa4Bw*eznRSl;; zl`;h{-J1!K$V)rLzx!d$h>v48$=Mv7zH!br(rqVu;Ks^P@oA*6bEW*5tQRAh&zbTw zE<1JCQ#~?V`-toqH+p=NLwESa{+0^OXpR)fp@*n6G7(V(@eeul`C8+PIirBk&2|B; z73~y}tZQTU`kIzD`#NPkwkZB(*}T5|a!m6^8KSgGsA>spyGMP}Wjd~1neaX*p*CwK zXJ`gV!GTEQi^_}jca|rYDJyhc4wUv2Nv4il&}*{lZcO@3n+U;YN`(QqbjBK*Qcl70uu87GA>)m@B*ncQh|>8PqjSdFbHLrC4-v%$Mee(^4y@Sr@XG+`+~tvIN>>?);T^rzPaH67h`D=+%RqN^G0Z z{Dq1^a~8ritZ=&6neG`~i53=jt8!*}8+b~Lt8bXMd;Hu1Qxfw07ZLZtaFQxU-Uk)- z@0V6%JclyC)1=(7Q?HRN&+dm5Rm zf@glO0bb0HrLE~=#(0I`YPu|PsaLZ(mETIcbnN=RqO%n{175mXsJ_HJ3EsR2jadWn zxqy&#z~qTy&_&Oy){vuD*E(SWnOv5k+{=b)u_#=fRzhICvmK=+q5PTRqlPqr^I18I zp(bWRYQU~56f-J#M%Q=M=?ZsT3nOD7mrcF&b~}IZ)116ps$K76wt7Fli;YP=Bh=Rd zfA_^gKnp9nZJA{9h5vy20{8OU6dgL9+pEFjmg5nW8j6s$U`rhw!UBt$C1qCe4_Eok zOpeyiY*e!(C#XgOoje@3L0n~g4(fF0Xe`5NqHH8rM)xm|2L*C_rI%GOQ~1Kh_V*UO zrcZ7*vc_}8!Nga1Ac7w@jIkwCrJwItaQ-Y?-x6J@(09#Q!Q`4m#hjKnZ=bQK``P#; z2jP!xQV<;uLv5=s8plGDjKo4euHa{gIM_Q>Rp_ROOoLjQDr0QgJi!4`P9vU1a>|^ku-M{5+`5>@n`~| z62)XDB9-P-OlD!2wj90Vd}kJKMM76>x4-e~`>DH)-G8Fs6c z#6gc^qw~Jo1(|G%StcHpu?=~llS3dC#BQ-ek|+4f?KbHL4n#Gxm|Owf4&Sbq7?CS7 zN8>s*Yz+Q=rfcaQ+;2uzBWWR#cn`F^#bETbwr!tz@jse%QuP0KAi_KH>3hZ~xs6*q zDOBVkp_y8XQQudE=&xs`S4+E3*%Ga}kI1^OgZ?_sX771dVSRUHcODee;+gJjg*i_gAQjiaWs{AkXr zEw%IOw#N!&)t65(fAC(YDmMN5nJzdjbA=mr(LXx=rIBojMaoO%gwWj1t;@?WeipjHZRlS|K|luk`dE7=It7TC zNEj^dVOk60aVCZ`pjB;E|Kyyci-T^CSE|@kXXbC)?@n)ypw&#uSCx*Yhk=@P5(rub(;M6q%0-dv z=k#{>W!8)gNP}5jqr!}cH~~?|P_-t1Qy%J5L@#RK%&bFO-Fx@td^5&6eV;=q12rXD z?V`$w*d#z^zT+1?!9MpM8Xn}DvZ`}r29xPO51a`lg{Bv`hk|4W}D5@u*B=&%? zj*z8F@9PU+pU?U~=QJgmBI^meN7zrJ_XM&BZ5gX)pIX>2GNmq8%Pa5Y=lk^YM5JXp zpX@N#x<~fQVF)Bk1J9FO43$uf)qB z4>+gH-E`iSI|U9Ffv;F}yuSBG=sn(k9`C@{jTxm>uKH1;XYVK)u}CSRo1Z1^6m=Mv zd(CJxU*zn-qpx+_vWgwX+s17tKhn`YV!2&3BN|JS7$arW0k5hc?X8qqtHE)9UwMs+ z>yC#{8QcG6PZVOf+Dra9Ph~VsQHktL7(!IQEW9tS^N={&t@*mSh3AE+vl8GphKkfrjR={?zjSC5dCmv2k6GauNU##&o1P@%keU5_ z)X3ahXHIF6ZWmRZU$#2^(7mITmR`MthTBd-&mS<1Cb0Mrx)Pf;fjm@}F5V3T6I!Cyoc3Kfql6r&$hgQIrK#$qa-_027Zdq!Bys}aj`jjEK1LT3^UJd}KCpX!=w9+!4U9ff)z|6C-QDr|Cl(XN;Z2xyGig1G`nbCc=T_Ak z>no9++47jiQo3Hrvhf-Mj>EK~Ue!BjDv98Nf3Bn&wid)`>cwH%UUd(SCsri(``^}k zy}A!7&^yS)oYA!Nk%-GKA*qT$zi3j5jnPKcQKH2g0c%jn*bc_+Cw`j$^qOwU(+~BV zqh^Iy@}=PzI-_hHCuhTwI0o~N$uQ!&$IWygN8J0^qmf~)$Yj>7T%^~d5A_WiEm@xs zhHs`dHZ)$Y!#cS=icaox=wv}e=Pth&S57IX^8Zk|`Cw6zkIDw72>jV?If4>Gxc!p6 z*OW<#(eyx(DwLzr>TnM25{4RAFG-WDvYB*GHHvRbw(0AK>+Q$2K{`@;JgeL%Uzq2P zfcWVk5&?Eyp5*EUw_k! z5Zpr(-iRc-2wI@Jr)%^$G)W_<;_y8m2;L()_Vqhndb={UvN~(AO zz8NN|sb9NSyYz?))afK7sb1TD{@Jpx2qyY@@sl;v@kRi+K&UV6;EPMYfgYcSMzqM_ z#eKZ6nZnQ5y7r=zdA$%a>#mHY06Or`YT6~t_T@Jk9mfF2jsZz-l}zE4k5fzLheqyk z4P~Fk`NX4YYx%A(gr3Ip2?!dqgp))%I%Y~Pxd^Gr-sTJA}wPM6hf zz%8rVs&pduR8onwwPXvFW?s`-JoKF^+D}B>AtT{2{5X)CKT#?oZdnCfxKQpBjOyRw z63mw962J)eG9|Yx+SiQg&{=3q`(u7zj`VIt_E3 z_Pp+I`-btVAWle6x4yjQ=TBJ0*iSlcrmqcBfAw&$zj`<&315W)ozaVy(FOV;Ba~b> zHya^TBwoR7{vl$lv=h|S<@IS^5nG$OKH7;aLB#u^$tI$LjodH#VCJeGcIBH#Sb0Cz z^hgU-l=yibv9Az-gvVr~*id2TwQMX$(F0o}4+dith`rU?y?<$G3m#5=8q=wE^pB4| zo_-fS!`ijVcAM=g)u9umj6S$-H2^<-jfgcZ=RQ;R9F>=fPtc17X%xi)q|E!7e zl?69nwK4^o6~besD@%Qq)kI%4TMLv5C%lQt*hIx{zhVzP>{*88mariIape`6`y68* z|H;~b-6(fNVccK5pqBQJZ+qPETiMWk?1C_QoK5~3Z-0=xgCS@%wXqT7Phv@Rp@fbO zVtUEixm9;cA-x=#hnuJq5RF82A_L20~$%0@o z-)kn2Kf%|1mLS4iAXA{=ot6#zoG~o!tL4#WlsC6byUV}o8>Z>VeSrxLjkwq(4J+C5 z0A)3d0jXET{}e(E{w}I8@NgY)a24)I}j}3uJ=F?q0 zAhjU|DdH|J33X+@vue>TA*aEufqVC}ULF$z$*TWH{W}xsTp;e{M*W_-&kEh2rUX>y ztF;aalX{d6g2l!sJiU5NV=seg!nqW==LPzkeO#&9b6skMjX)jaFugPp{%Ae6M>h~t z^9j>93v|nxm+v{I0qX&@7t}+X8eH-I&fX05at3?MQwfbL$&kg1Sp7$=u#25X*Tg=b z1_}$}{qQ1FT?;`@=fB-Lv&-MNPPL5b2ak{JzuE~)ln5({HivhAgVuMefDr zALv&(F1=$p0;?8I9;-^G1u_v9(0KPz18`|+rO%eW;9alFNJ(F|&{@oZC#2hz$lIh`VZF^)SwpLSR|C-IO)h92+ zIpI$lKTySuh6xQ;^Bbypcj3Clm&A3tFswy{k#00!$2V9-JPb5L>IXHdd0Tw#A4#Ga z6TZnGOlHIp7*bDJpB~>DQ#u=(NPlXsRB0P@GxwL%Wbb_J*aq2AeGhoYzDGys&!@^P z#C+(`Bp6N4bw&Pk#DoRS={$Z^!JbB%6 zEDc_0ite?JZ1o}tt^%HQj%7NLbtOG`Cr*}}uwi2QFc*uR2_wEHr2 z&kPq`+@GjUP1Q&)eFGhTk&e)KBKBwpetm=7^he#W>Xg|wFcvB~w3Yn}^}8zk?yp2S zxKV#QW&?f9Q2jiJo%w{r;q|Ad9~jiZR9qa-Cs_>;?C|fEQaKCW`=35P`BXQ*w){tn zoRa}IT=q~mXWP!oGw7rkJ!JzYg}=HybbNOc`=c=Grv@yjQ(`4UhB%kk-0me=L9XC9 zmBm<^^^Zw#jLTS9mHNU(mmlJ@Uss8g$)xGZ?hmS6JI2OKrY*;tb<642@vXkwC}mww z45z2_c`|NFhVz#8=Az1Mol9P_307k|`Y}aal6h&h^7nqF6*ZJ(3h1uJv?qX0lm`EX z?g~_zA$vi;LqF1Y??&7c+>=NcasKo9GI^dLE5eTdV1+hCf645sGkX%bBz5%zki~L7 zZ?3&E1LO#rjt#K~W-nkQES&vH^;<5I8R{V0wUb6hBMgDwew3xS=Ag!pFi|C@DpP%0 zm5{S?Jn8u!k9KqV(RNXis^+IP!YUp%xL%+C454fkN7c1s#vf5wrsLNVcLR-(q(2>Q zh!oPZexHpM)L*6lCTLv?I*X`E+g+0d zk3kvPx4&l756+6;Nr9ND7$;8q{=^wzMDD$x8zxU|%+QU(lX-FT?W^PP{Dz|qI_#7( zRELpNCf#Hyx&*`jx`))gL3$YFBykxSuEjV~C-QL>*r(Cj`f(bJ!b7ZNY%I0X-X1>J zDE=_*RmNe~jeGdv`W}N9p;=#mDZBgok}1Z0f<;TMSMS6wxFg!mpgcRLQCEpZ>8h5(|v_nBzb2 zXYMD<5mo+E_1zO%OD3KJKl-dtvyO?&gMFa+$loYGa{a`=`3o`y1y&)<%Z;ZI6DR5H z1u8$3fW#@-3mHF^w}K9dc;Y0%Z_O0?u|)4>ujKarjUjD$08}sWzIGjqwE8-WMf1Qf z^Bp59J+qZ?Dq%A*4yz5RQ^H53x7A~)Qlvw@z|lc2j%`Hg{Z$R*z8cJnt3dQC{}B^t3^Q>u z@!`cfCXtOVEK-KV5bC<(CDG)YBw!iz@R3?Hk>1n@5Q8+ESp^in`Tw@?iOK$F;gdSy zbEO0gR=Y@&|6)48Z|SLJr`XoGN|upk^3Tn-4#{7eTTD zeOiOxNU80l?djWpmJ6^QX6^;#yCDGE!6|Mka#W-Nv_-JBdbWsaiMZR2__2)2IOP_l zJHkU_sFL#L9>J*q&@F0)s#UlB{>Fa(l~=%tm0iiyh=tQB$7v|^v1Us|b?Es~io_<; zCCHr^*9|`=Wd8*1Z>q!YBZG(L0SOerjScUEW*WX-+zT98dNlT3QN+G2@vrJ#( z)ERaIgsjne-3xQ`|41(Q59eg+^Aeb{(y41j(ROT2Bte4hy7 z6PQtaGT@#p+%bKMluc9N?~l=gW};oD9h4xYC#5BF)2HeQmz&4gaK+!Hpa$-dOZuSG zKP`C z({@fU$RpsVL|8&(@l%$Cp;-fmPFVD#s03C(?eur4;6dJqYY937^7!-=Cd*G0 z|86y1OOAXB-!$1?%NdJ?68!E_HZs;c+9@XlhfTAfb< zyI?;^(qBZW?MCX6ZDj6^XTN0yJO9>5M^3dPdsaT!g7==ba=GX0g=DZRn7cG_)*N`~ zSY*5fbMUl5{6{?3FHuMREUu{2?6{!yhmp%kQo+3!u^Pdm3rwDdLSrDS20_apnDM$x zR7J?W-o^ZUa(nt{CKLK%sPF(c??L&mSrglS&hGrBcH8aJ@t`2+7|!yj>1r+^M*esc zNnGn^L-79@x|HdjRjxKC>j>uImP|od0q(qjvVQE|EBfW<%9x)^La^9jN}vCH1a@0E zX=4?x30E*7@9gBE{}Bo$w-(orB}HyYhrv!1m{01lQ=883+>F=2?V7+#%8quNPdfi^kVRZN^FzG}KExaV~!XpAiHC z>wc-SVsx-wHoj7_>AlaAEA zL}qymZb7_7cxh;hhe^%dQTyN8848XcrsL6||AFzn1(%gsWC*oaogPB0b&@W=vl&cN z5B8U|F(B@9S;8V}<-M zRqlzIWb>mf$E`_XxWj*18hl~hJoACCE-NXwdbO<<7v4vp5Rz?OGPN7+1L%Ez%yrQ1 zAM`#-gJ2rl+dwfL1qiFt#idqZO30sjQ#&~8;-%9*gZKON|MKfT^pB+Mp97J(&lSaA zhyS)@A7KH(y9oH&DpVj$1Xw)gw|sdriUXVplFE;P5Ws(nxf5-!0=BtmEDej({idr= zHY=dqo7qvP{~KxizmdlO8)^LiL!_}UzTHTJi!xuoJ(Jdklw7MXd8IrwcjzwSolslihD?wT@Qb;o#cm zT%9**6kj~1OD5vA+f&&pHTXLVAopb8NvotliLpiA`&Z@#E|)qcfIp0Tl2oKkPukvWvTs{6HJdOGqwFC&(7;O zuM_#PYTm@K@|rMo(y!_pe<@^#L#@C4i4J{}^@FoQJPW?^$x_dN_qpn+mO3y|GqgO) z;F3rV$t*tvv_ti&`;sN%kYidk{PM()`O&HVmFWZOSie0I0+!J`=Tw2+?_Mx@B_+ul^=7mt|AoI|j!}njFGhscU|l4$DD$N9+9zsEx2s>Vr|fg--0LyrJc>m_Y)mDJ_9SchNg&kULmBA?5$NQbT-hEySe zzGCd{GVEsO_Di7%U=9Y00HDE>HKHWvFm9KZ)cWM7g<`=wYcR?_Rrs&qkr4$}@C5)F zxVkLTp9=rUWGPT7yL_hqM-00G=W(RNB(2I8P#?>Zw!ucw_jjwbaLL5fHiLhsf2saQ z`d3xWBX*nd+@~dW+ni{Cs-8*0&Xhv1D;F(fj?jJFKPZ+FOQ)np)yOb&}_z>{4uzhr1C2$pY7xCM}9b%qPJ7=jRp(ZTw!dyqg*@wDi_ytWr1$2xACYe2$+J~`9 zg(%gtyGy*u-LGZcJP$k~vae-#&K<{i+*?_;b=@@?x{!!7neVdd!DOO7!$8XUPn8EQ_!btgAz;C!$|P z_7@a2zbqQ`)36)oSPHUKs&zHxSa;0^MYtHnA9mYj3=58g5PKspd#msLl@Lqr=5#t; z7@&cW5&A`elLGOD(D$iMZVJ&)Tgy6K#XA!wP66GR__ChXLgUT-b&M_N-_FZws$Ow& zR|*RP)j~=u5dvr@SxmxPDSDG+v*D`ay=QAH`)>`DX=T1K;;J9R2y*h8a|C`sKBnzg!~D zbl(r2H0&F5>sAI?a2eX%ef|0e`QnsXCvU9PaDL=AJm}+oSyFm7z1xz^6T>AD2zg!M zm?r8jmL-^dPLrPlEWoIT3J^Od*ruQ83>@=Qt{AzjB@7q2CQ zQKQ>~2)koz6)}1-p^AKzpo)r!8B%k%MPO)b=*sD0I0C8^c9~+m`$6EVX_Vb3m!=XM zIhHH(Rf2;-MMXny7b5&7iQ z1}jOGCF{8#^+H5nQ&+CrLtECQgLVtI>}+*P77IB*(!R{R&S>@OQ!|%cl2=!V+46Qz zvXP(Ss(ibA&3m)SY{{PANr2c=Ucv&LF@EY`xX|>0qqjNiU$PH6_-QOKF!qZbo!W3% zFC|;p6m|b1jIxjv{W4|70&KV_4991FZNi{Lu)76TeSZTz{-fiU7+q9$r8;5lS^VvT zg+*QmL4FU7*3?amZ{Dn$#Qva?CLi*TD6;Rv8(JA+8d=P6bOW|vOxI6x{uvo73auqB zbq3VM=C@F4|5<{uGeJKVbOl|70+ig$>;GwBWa*iqZf7$XFwlahI6QXf3ah0RWhTfm zP3N*)96%zBKjiFb@j$cmC~!L?P{mh;G?@9CzyqdM6rYpjp3%3ywS53DOrW+%BZ zS(e3*Uu$n@X!xi?zdx1)Z^D~v!9@*K%N@F9-xu$-x*LPJO7&y*;Gh-cbG28;N5Ws! zve@jreT2MSSRs9}8b!PWY{ZPH)=~d>No;V-3^N-QOT%hUVsqYMeWX~3fdxWBBAB^gFG3|DRv{c#}hOs+SIf3p8 zQhahWH>x)~DcS$AsTi=|=wn{|6m+rCp35OjwH*WCKc z<5I^pA^ayhn%@C~sgD;HucE~`|M_eMPuh|3hXzf8fn3)`N|zN9@owBozD>~H;mZCa z;2NK)CKX4Vzpm{Hw(oS>3KzJ$wt2D7Xm(R6f)zs|>v}5uU>d`Mq~UmArncd7IK8F9 zo--8&SQh-6kH+BoNvBw&xiXl80_UnV@KnCF&A};PDMuRN4Yn`lf_R2mpUkoK@JJMM zqCZ5~_^{@swHqz%?qbVB^iMTJT+-N2*?N5T#`3f3-<=l2I`2B?oqx>9e==FY#gY8# zJtP7ZDaml~d`1!e;lYy!c-XRs>Y`bkc`r)=aID#wKen1Ntq>p(>YR2RCOpS=_+(c3b9~dDIa1vth2s%jitV?C zDaq?$adIhx6ex=9u@)C8sKxmgIWMDPPCQLA!Xk3gpv&7*)j}->hOSa>XVsKiuEi)U zN?n>rdGLL~f?Vi~yZ5E=&DclXtPR35F${A3$eo6C$JHzv0)I-nVK;^dP2~+R*B`V1 z3r93Vo9Vv38JrT zJwr(@@XV~VSxnDahy3{3CaSOFdyV_~tW61QfS0-y`&I9}>D@6DzNDBwG(S|rn%7V! zczp~th=X*+J(5C-OL4fQ*m2L>SpcNMY%|c4WpozWTUPfmoxJ6RHfC|~wtfH4`3dsF zLu#|+i_;P}BVN9p8eGJn+QDXJWDFHTNP zIWa|y5;t{Da{hdkaF!>l6B(u?x09Fd2X>*CYMt2!&F<^4cRmEsXZsG(ks-=jhb$}- z5NEpvI-5KOX#rU;HMpL~?dg~q4J6l!R?`%lK6a{ZHi_n59cnf0+@Oh5jW@4fLYe$I zm~!1JE@)plUY{e{5AVsVx!|C(zb z@7e&(eCNqQURG$;N&rerN#(dIU&Gln!v@zN$3jQw47r&u;faQX4*%6_MA+RyV~idm zD((8wATFr6g`Y8JRSjvY_(EqFU4t8GP{2aR;n8%?nyxwm(d5c56@T!`{xH?xlnN3c zmKD|^C}W6j@6(OgW8)R z+fU|Vi`Hof=CdOv^eJS5w* zPW5))jcdAoh^Uy_tXY8o@$28?O`UKDs|68D?y)!H2TLXy0yie#;i+|_>(tey@M@qi zwtX3`r6s>&Kb3k?+=xirJWeaA>Z}`8GDr#FKe`MVRPf6x3WXV{fP>oM)4*0Q9swWt zv+0lF{4<`p!>EIUBwvC0OJ5YM)*&~HWl?|VYYSwA$E!&neTaqXT5b#mtU8n6gp6zT z(;R0>;^zuX(WQFjZkn-hTbRl2+6jq3N9A|}#ft;qai7P*Y`3gRK(S5upY!)$?J0g! znZhCLXZx&-CF(3N-g~*45oZ$}RcsxxmT9&XVGio~EI)58H)%*1wuxh~fhRWiLR~y+ zLcKH)Ei=O0hoMofOE|+kV^El7AGFxPth;3ymFpy$(_`@##hXAe{@$)KKXchgcd&IC zTUPSLk&3Nc-m3`56w*wlc#CEhwix?5N0>~q=VkeIfH`hrDDh&ut3z9{-b!eFPE7%m zv;qg&CEg~lYW?RAKPh;ICH?q^i4Dl~ASB;(T_S|75@d)cx>qu1wwe0RUaQE;tYkSd zubd^V>{V~$`oX(`Txk01YeF!#FO{lgQ(ai7{W6_V1*8U@Q^?wJI~+&)Kv0a`McF1< z5XY828qsFvSl}mB>BFM*Tz}RoSgO^Qlgk;TmnY0Pa`Q1kj!MsIHu+`w*AcvDP1TMt ziR279BD(@dGO77U0!NKb>_3<38o&C6o$2U}c(T>9xN7~2Yz&c@g~z+GPhGRfP%bB# z!J}~@(v+jo=J+L9-71P&`QN=$f$avcZrY@AQI56KPVZ?(Nh;$Ji;m!G$ zUtv6bHRLuKB>t8swX&~0+@!d+2jbQf@X}EE;hxX&II1Swc}|k~+mfX#`m10P16-*w zGVkscSF8HolTC|d)U{K4Wf zodvmb4*6eq%%rBN(u@x1pOKU12Z`cemo^YL9=`PklGdgmw0n)1u*VM@Ib2w2H7|V; z5#nGyh|_gC4A`$Vla#KY%@&IOd8K1F32_cc0wu}S8fk`6qX@jLTzcFB>YTXWtqKDA zj=H=4jM~Ra!f|xt+99C&^_+y#0>-oE_SZ-}&l8cVr!az)16Q7~@SBH;C!RD9eEa!X1=G6vE08-$92IU_ zQZrGS_ZHmrxYhajXJR@^1yw5|+N#gZ!kud|XZl-8jTF@Bx20MP*+2bCJiEsW!tc0t zHdwlM%6p5A0IL{hLQnfsX6Dc~Z)-kJ+`1hR?G!S*=!IO_G}kWvF}Nfn;|boiTYp(Z zacg@LYwHXNArn!X;H`uP^Yly)=ez47+@Lexl|uT_sD0O~%mzx!k(8(qRXjQ8l?Wq@ z9njg70jWKHvGL&#Hs9#fmLMSD`c_HG&JlM3^9CX`8tlMJ+eZf4{muKlo; z`pIfltJ-r5M!1_I(Rm|1Jc_rRCOIgQltecTIBFHMTUuXuAVY%PTnPv)2FiS(>vlJo zF2YyLCx?J8Q)OzuZogWIY!vJ&mtvFQZDC9fT^(NgLQXd@HD5zy!_o1qii^1(MuL*j zwBE9~5+>;T@E}P}K_PB<%wT%woJW7ovek|g986Ycfje67X)|eCA!U|KEa=9M*z2{D zDN2OcPj*r+T7Mr%73f8<48s-$DM?pigbtrDH(eibLKvH_huFaF`XfXM7^5JZ`5KtS zp4bHhjSgOG>2@lwpzQ(>4GW@);=5ebiM>!i@_ROH9etQtFI?{;sS^zyFO4YGVb;mM_Tx)mM2Y<90PX)P9c-^|Cqq)ys(I#TOu#_oLX(3E4C zfR}3yMiiwPJSc7oVp(!lQhl}*#8)53^_skNSd2ua>2OE{l;jS?$!ja4oc8~?N;|tc zJwAJr#6@LMC<1XP4!nBa^R5x?>a2e^0=;gB(Ba2qBf_|#^_Cwt+TRBbQ_xXa-XjNN zit*XgwV-xxf|Rw8-PNZJ7}IhQiyQ6eJ8KWYLB0PEUvC{2b=$R#st5=us7OhPNH@|c zB8`MdcZ0;xISdK{(w!302+~M1qtwvdF#|&k4KsA_LGSx{-fzF(-hX-=!0|gSuWPMy zo$FlZqF10u@x%eY|BX!0)lts*VK4Mz8{2s0rC;}Z=Nb3&?2)dTTBXcFj7~p>)L*JK z-OSu)nQfjuK5Ka1_^m-|4S$6!xYC4473d94k8Vm+`0PTQwL}DrViLdF6?yw`%ZcJdhGBOz}MY!{MZ)2AfJ$t&YRgVx2DsFn6 zg>5jwJ?nHZJ{OcED#)P_7k&!0$H@JN;72XNiI zd^>DSzBqc0bnZ^y^hx!keV#5$^Yl(e5e|uS%bBhFq>1)NRT*MNBGK-w=l#xufxTW5 zCFUG{nqsD$(XtZzO!LgUz%zR9LFv`H0*-0KFcZpD4l}!Gm9I;rS>BKFEP&i&hZSh$Iak-(vm73A% z))QGu&E_aZfC51?)clJZHK!5V+OgzDdBv_@VBs61h-hc`dJ7UJJ&+vO{url+&{UHP zJ=3v5w6bDX$UReZbFc(#2PH~h0LA_YV!6fi3;sqK*E{R&#HzLn*O =Fj`#9~{0E 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с9fT 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 Rr_KQ%B{{X{1v0O_{|B8~IIaKy diff --git a/examples/rbac/permission3.png b/examples/rbac/permission3.png deleted file mode 100644 index 93cee35ff45bf677d70f9cae5372dc3e9dd1e9d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 194266 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 Y*RQCK`rO-p0QkErt8_c_*5eod3rD9q?*IS* diff --git a/examples/rbac/permissions2.png b/examples/rbac/permissions2.png deleted file mode 100644 index 1880483bfd3ca7e9e85eaea57d57bbb831e46157..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 91831 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 d;9u+1r^=@qmBsgZZv#J< pd.DataFrame: - df = pd.DataFrame() - df["conv_rate_plus_val1"] = inputs["conv_rate"] + inputs["val_to_add"] - df["conv_rate_plus_val2"] = inputs["conv_rate"] + inputs["val_to_add_2"] - return df - - -# This groups features into a model version -driver_activity_v1 = FeatureService( - name="driver_activity_v1", - features=[ - driver_stats_fv[["conv_rate"]], # Sub-selects a feature from a feature view - transformed_conv_rate, # Selects all features from the feature view - ], -) -driver_activity_v2 = FeatureService( - name="driver_activity_v2", features=[driver_stats_fv, transformed_conv_rate] -) - -# Defines a way to push data (to be available offline, online or both) into Feast. -driver_stats_push_source = PushSource( - name="driver_stats_push_source", - batch_source=driver_stats_source, -) - -# Defines a slightly modified version of the feature view from above, where the source -# has been changed to the push source. This allows fresh features to be directly pushed -# to the online store for this feature view. -driver_stats_fresh_fv = FeatureView( - name="driver_hourly_stats_fresh", - entities=[driver], - ttl=timedelta(days=1), - schema=[ - Field(name="conv_rate", dtype=Float32), - Field(name="acc_rate", dtype=Float32), - Field(name="avg_daily_trips", dtype=Int64), - ], - online=True, - source=driver_stats_push_source, # Changed from above - tags={"team": "driver_performance"}, -) - - -# Define an on demand feature view which can generate new features based on -# existing feature views and RequestSource features -@on_demand_feature_view( - sources=[driver_stats_fresh_fv, input_request], # relies on fresh version of FV - schema=[ - Field(name="conv_rate_plus_val1", dtype=Float64), - Field(name="conv_rate_plus_val2", dtype=Float64), - ], -) -def transformed_conv_rate_fresh(inputs: pd.DataFrame) -> pd.DataFrame: - df = pd.DataFrame() - df["conv_rate_plus_val1"] = inputs["conv_rate"] + inputs["val_to_add"] - df["conv_rate_plus_val2"] = inputs["conv_rate"] + inputs["val_to_add_2"] - return df - - -driver_activity_v3 = FeatureService( - name="driver_activity_v3", - features=[driver_stats_fresh_fv, transformed_conv_rate_fresh], -) diff --git a/examples/rbac/server/feature_repo/feature_store.yaml b/examples/rbac/server/feature_repo/feature_store.yaml deleted file mode 100644 index 32db949634..0000000000 --- a/examples/rbac/server/feature_repo/feature_store.yaml +++ /dev/null @@ -1,26 +0,0 @@ -project: server -provider: local -registry: - registry_type: sql - path: postgresql://feast:feast@127.0.0.1:5432/feast - cache_ttl_seconds: 60 - sqlalchemy_config_kwargs: - echo: false - pool_pre_ping: true -online_store: - type: postgres - host: localhost - port: 5432 - database: feast - db_schema: public - user: feast - password: feast -offline_store: - type: postgres - host: localhost - port: 5432 - database: feast - db_schema: public - user: feast - password: feast -entity_key_serialization_version: 2 diff --git a/examples/rbac/server/feature_repo/permissions_apply.py b/examples/rbac/server/feature_repo/permissions_apply.py deleted file mode 100644 index b710a25cf7..0000000000 --- a/examples/rbac/server/feature_repo/permissions_apply.py +++ /dev/null @@ -1,27 +0,0 @@ -from feast import FeatureStore -from feast.feast_object import ALL_RESOURCE_TYPES -from feast.permissions.action import QUERY, AuthzedAction, ALL_ACTIONS -from feast.permissions.permission import Permission -from feast.permissions.policy import RoleBasedPolicy - -store = FeatureStore(repo_path="") - - -admin_roles = ["feast-admin-role"] -user_roles = ["feast-user-role"] - - -user_perm = Permission( - name="feast_user_permission", - types=ALL_RESOURCE_TYPES, - policy=RoleBasedPolicy(roles=user_roles), - actions=[AuthzedAction.READ] + QUERY -) - - -admin_perm = Permission( - name="feast_admin_permission", - types=ALL_RESOURCE_TYPES, - policy=RoleBasedPolicy(roles=admin_roles), - actions=ALL_ACTIONS -) \ No newline at end of file diff --git a/examples/rbac/server/feature_store_offline.yaml b/examples/rbac/server/feature_store_offline.yaml deleted file mode 100644 index 4fc01508bd..0000000000 --- a/examples/rbac/server/feature_store_offline.yaml +++ /dev/null @@ -1,16 +0,0 @@ -project: server -provider: local -registry: - registry_type: remote - path: feast-registry-server-feast-feature-server.feast-dev.svc.cluster.local:80 -offline_store: - type: postgres - host: postgresql.feast-dev.svc.cluster.local - port: 5432 - database: feast - db_schema: public - user: feast - password: feast -auth: - type: kubernetes -entity_key_serialization_version: 2 diff --git a/examples/rbac/server/feature_store_online.yaml b/examples/rbac/server/feature_store_online.yaml deleted file mode 100644 index aa167731b2..0000000000 --- a/examples/rbac/server/feature_store_online.yaml +++ /dev/null @@ -1,20 +0,0 @@ -project: server -provider: local -registry: - registry_type: remote - path: feast-registry-server-feast-feature-server.feast-dev.svc.cluster.local:80 -online_store: - type: postgres - host: postgresql.feast-dev.svc.cluster.local - port: 5432 - database: feast - db_schema: public - user: feast - password: feast -offline_store: - type: remote - host: feast-offline-server-feast-feature-server.feast-dev.svc.cluster.local - port: 80 -auth: - type: kubernetes -entity_key_serialization_version: 2 diff --git a/examples/rbac/server/feature_store_registry.yaml b/examples/rbac/server/feature_store_registry.yaml deleted file mode 100644 index 579141fb01..0000000000 --- a/examples/rbac/server/feature_store_registry.yaml +++ /dev/null @@ -1,12 +0,0 @@ -project: server -provider: local -registry: - registry_type: sql - path: postgresql+psycopg://feast:feast@postgresql.feast-dev.svc.cluster.local:5432/feast - cache_ttl_seconds: 60 - sqlalchemy_config_kwargs: - echo: false - pool_pre_ping: true -auth: - type: kubernetes -entity_key_serialization_version: 2 diff --git a/examples/rbac/server/server_resources.yaml b/examples/rbac/server/server_resources.yaml deleted file mode 100644 index 03e35495d6..0000000000 --- a/examples/rbac/server/server_resources.yaml +++ /dev/null @@ -1,27 +0,0 @@ -apiVersion: v1 -kind: ServiceAccount -metadata: - name: feast-sa - namespace: feast-dev ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: feast-cluster-role -rules: - - apiGroups: ["rbac.authorization.k8s.io"] - resources: ["roles", "rolebindings", "clusterrolebindings"] - verbs: ["get", "list", "watch"] ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: feast-cluster-rolebinding -subjects: - - kind: ServiceAccount - name: feast-sa - namespace: feast-dev -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: feast-cluster-role diff --git a/examples/rbac/unauthorized-user.png b/examples/rbac/unauthorized-user.png deleted file mode 100644 index 689dbc5be1dd9079da45c96ec48f59a5133b915d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 223108 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±30(bmP^cCZ9?;fHzRQ}Gd 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

`P2CJTUfO{V5Tlz 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 diff --git a/examples/rbac/user_output.png b/examples/rbac/user_output.png deleted file mode 100644 index 3ab0eb38dd701026cdd70561b552f94255cd3fca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 202585 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

_6V@fqi{DxmFA{!+fF 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%0DJ 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
%NIwF-+sr1~`Bj(o3 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 literal 0 HcmV?d00001 diff --git a/docs/getting-started/architecture/rbac.md b/docs/getting-started/architecture/rbac.md new file mode 100644 index 0000000000..9b07019a7c --- /dev/null +++ b/docs/getting-started/architecture/rbac.md @@ -0,0 +1,133 @@ +# Role-Based Access Control (RBAC) in Feast Feature Store + +## Introduction + +Role-Based Access Control (RBAC) is a security mechanism that restricts access to resources based on the roles of individual users within an organization. In the context of the Feast Feature Store, RBAC ensures that only authorized users or groups can access or modify specific resources, thereby maintaining data security and operational integrity. + +## Functional Requirements + +The RBAC implementation in Feast Feature Store is designed to: + +- **Assign Permissions**: Allow administrators to assign permissions for various operations and resources to users or groups based on their roles. +- **Seamless Integration**: Integrate smoothly with existing business code without requiring significant modifications. +- **Backward Compatibility**: Maintain support for non-authorized models as the default to ensure backward compatibility. + +## Business Goals + +The primary business goals of implementing RBAC in the Feast Feature Store are: + +1. **Feature Sharing**: Enable multiple teams to share the feature store while ensuring controlled access to data partitions. This allows for collaborative work without compromising data security. + +2. **Access Control Management**: Prevent unauthorized access to team-specific resources and spaces, governing the operations that each user or group can perform. + +## Reference Architecture + +The Feast Feature Store operates as a collection of connected services, each enforcing authorization permissions. The architecture is designed as a distributed microservices system with the following key components: + +- **Service Endpoints**: These enforce authorization permissions, ensuring that only authorized requests are processed. +- **Client Integration**: Clients interact with the feature store by automatically adding authorization headers to their requests, simplifying the process for users. +- **Service-to-Service Communication**: This is always granted, ensuring smooth operation across the distributed system. +![rbac.jpg](rbac.jpg) + +## Permission Model + +The RBAC system in Feast uses a permission model that defines the following concepts: + +- **Resource**: An object within Feast that needs to be secured against unauthorized access. +- **Action**: A logical operation performed on a resource, such as Create, Describe, Update, Delete, query, or write operations. +- **Policy**: A set of rules that enforce authorization decisions on resources. The default implementation uses role-based policies. + +### Configuring Permissions + +Permissions in Feast are configured as follows: + +- **Resource Identification**: Resources are identified by type, optional name patterns, and tags. +- **Allowed Operations**: Defined by the `AuthzedAction` enumeration, which specifies the actions that can be performed on the resource. +- **RBAC Policies**: These are specified by the list of required roles, which are then registered in the Feast Registry. + +Example: +```python +Permission( + name="ds-writer", + types=[DataSource], + required_tags={"risk_level": "hi"}, + actions=[AuthzedAction.WRITE_ONLINE, AuthzedAction.WRITE_OFFLINE], + policy=RoleBasedPolicy(roles=["admin", "data_team"]), +) +``` + +### Enforcing Permission Policy + +Authorization is enforced using assert-style code within service endpoint functions. Unauthorized requests result in a `PermissionError` or an HTTP 403-Forbidden response. + +Example: +```python +assert_permissions( + resource=feature_service, + actions=[AuthzedAction.QUERY_ONLINE] +) +``` + +## Use Cases + +### Tag-Based Permission +Permit team1 to access feature views `fv1` and `fv2` with role `role1`: +```python +Permission( + name="team1-fvs", + types=[FeatureView], + required_tags={"team": "team1"}, + actions=[CRUD, WRITE, QUERY], + policy=RoleBasedPolicy(roles=["role1"]), +) +``` + +### Name-Based Permission +Permit team1 to access feature views `fv1` and `fv2` with role `role1` using explicit name matching: +```python +Permission( + name="team1-fv1", + types=[FeatureView], + name_filter="fv1", + actions=[CRUD, WRITE, QUERY], + policy=RoleBasedPolicy(roles=["role1"]), +) +``` + +## Authorization Architecture + +The authorization architecture in Feast is built with the following components: + +1. **Token Extractor**: Extracts the authorization token from the request header. +2. **Token Parser**: Parses the token to retrieve user details. +3. **Policy Enforcer**: Validates the secured endpoint against the retrieved user details. +4. **Token Injector**: Adds the authorization token to each secured request header. + +### OIDC Authorization + +OpenID Connect (OIDC) authorization in Feast is supported by configuring the OIDC server to export user roles within a JWT token. The client then connects to the OIDC server to fetch this token, which is parsed by the server to extract the user's roles. + +Example configuration: +```yaml +auth: + type: oidc + client_id: _CLIENT_ID_ + client_secret: _CLIENT_SECRET_ + username: _USERNAME_ + password: _PASSWORD_ + realm: _REALM_ + auth_server_url: _OIDC_SERVER_URL_ +``` + +### Kubernetes Authorization + +In Kubernetes environments, all clients and servers run in the same cluster. The policy roles are mapped one-to-one with Kubernetes RBAC roles. The client injects the JWT token of its ServiceAccount, and the server extracts the service account name parsed from the token to look for the associated Role and ClusterRole. + +Example configuration: +```yaml +auth: + type: kubernetes +``` + + + diff --git a/sdk/python/feast/permissions/action.py b/sdk/python/feast/permissions/action.py index a181f61f9b..eba9ce1134 100644 --- a/sdk/python/feast/permissions/action.py +++ b/sdk/python/feast/permissions/action.py @@ -9,7 +9,7 @@ class AuthzedAction(enum.Enum): CREATE = "create" # Create an instance DESCRIBE = "describe" # Access the instance state UPDATE = "update" # Update the instance state - DELETE = "delete" # Deelete an instance + DELETE = "delete" # Delete an instance QUERY_ONLINE = "query_online" # Query the online store only QUERY_OFFLINE = "query_offline" # Query the offline store only WRITE_ONLINE = "write_online" # Write to the online store only diff --git a/sdk/python/feast/permissions/decision.py b/sdk/python/feast/permissions/decision.py index 4467f0e809..963befe831 100644 --- a/sdk/python/feast/permissions/decision.py +++ b/sdk/python/feast/permissions/decision.py @@ -89,7 +89,7 @@ def grant(self) -> tuple[bool, list[str]]: def add_grant(self, grant: bool, explanation: str): """ Add a single vote to the decision computation, with a possible denial reason. - If the evalluation process already ended, additional votes are discarded. + If the evaluation process already ended, additional votes are discarded. Args: grant: `True` is the decision is accepted, `False` otherwise. diff --git a/sdk/python/feast/repo_config.py b/sdk/python/feast/repo_config.py index 92c63b52d6..069b579999 100644 --- a/sdk/python/feast/repo_config.py +++ b/sdk/python/feast/repo_config.py @@ -341,17 +341,17 @@ def _validate_auth_config(cls, values: Any) -> Any: if isinstance(values["auth"], Dict): if values["auth"].get("type") is None: raise ValueError( - f"auth configuration is not having authentication type. Possible values={allowed_auth_types}" + f"auth configuration is missing authentication type. Possible values={allowed_auth_types}" ) elif values["auth"]["type"] not in allowed_auth_types: raise ValueError( - f'auth configuration is having invalid authentication type={values["auth"]["type"]}. Possible ' + f'auth configuration has invalid authentication type={values["auth"]["type"]}. Possible ' f'values={allowed_auth_types}' ) elif isinstance(values["auth"], AuthConfig): if values["auth"].type not in allowed_auth_types: raise ValueError( - f'auth configuration is having invalid authentication type={values["auth"].type}. Possible ' + f'auth configuration has invalid authentication type={values["auth"].type}. Possible ' f'values={allowed_auth_types}' ) return values diff --git a/sdk/python/tests/unit/infra/scaffolding/test_repo_config.py b/sdk/python/tests/unit/infra/scaffolding/test_repo_config.py index 229de2f913..0725d6d261 100644 --- a/sdk/python/tests/unit/infra/scaffolding/test_repo_config.py +++ b/sdk/python/tests/unit/infra/scaffolding/test_repo_config.py @@ -223,7 +223,7 @@ def test_auth_config(): entity_key_serialization_version: 2 """ ), - expect_error="not having authentication type", + expect_error="missing authentication type", ) _test_config( From 5534044bc43d070e53bb4e9175562708fe9c34b6 Mon Sep 17 00:00:00 2001 From: Lokesh Rangineni <19699092+lokeshrangineni@users.noreply.github.com> Date: Tue, 20 Aug 2024 15:56:00 -0400 Subject: [PATCH 166/169] Reducing the markers from 8 to 4 to see if it fixes the issues with memory. Signed-off-by: Lokesh Rangineni <19699092+lokeshrangineni@users.noreply.github.com> --- Makefile | 2 +- README.md | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 3909d92161..7851c1f1c5 100644 --- a/Makefile +++ b/Makefile @@ -86,7 +86,7 @@ test-python-unit: python -m pytest -n 8 --color=yes sdk/python/tests test-python-integration: - python -m pytest -n 8 --integration --color=yes --durations=10 --timeout=1200 --timeout_method=thread \ + python -m pytest -n 4 --integration --color=yes --durations=10 --timeout=1200 --timeout_method=thread \ -k "(not snowflake or not test_historical_features_main)" \ sdk/python/tests diff --git a/README.md b/README.md index ede28c4c95..a1e06774da 100644 --- a/README.md +++ b/README.md @@ -16,9 +16,6 @@ [![License](https://img.shields.io/badge/License-Apache%202.0-blue)](https://github.com/feast-dev/feast/blob/master/LICENSE) [![GitHub Release](https://img.shields.io/github/v/release/feast-dev/feast.svg?style=flat&sort=semver&color=blue)](https://github.com/feast-dev/feast/releases) -## Join us on Slack! -👋👋👋 [Come say hi on Slack!](https://join.slack.com/t/feastopensource/signup) - ## Overview Feast (**Fea**ture **St**ore) is an open source feature store for machine learning. Feast is the fastest path to manage existing infrastructure to productionize analytic data for model training and online inference. From 09893af3e58d36f3f4d404bbf23ee010e6c69ac4 Mon Sep 17 00:00:00 2001 From: Abdul Hameed Date: Tue, 20 Aug 2024 16:32:34 -0400 Subject: [PATCH 167/169] addresses feedback on rbac doc Signed-off-by: Abdul Hameed --- README.md | 3 + docs/SUMMARY.md | 2 +- docs/getting-started/architecture/overview.md | 2 +- docs/getting-started/architecture/rbac.md | 105 +++--------------- 4 files changed, 19 insertions(+), 93 deletions(-) diff --git a/README.md b/README.md index a1e06774da..ede28c4c95 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,9 @@ [![License](https://img.shields.io/badge/License-Apache%202.0-blue)](https://github.com/feast-dev/feast/blob/master/LICENSE) [![GitHub Release](https://img.shields.io/github/v/release/feast-dev/feast.svg?style=flat&sort=semver&color=blue)](https://github.com/feast-dev/feast/releases) +## Join us on Slack! +👋👋👋 [Come say hi on Slack!](https://join.slack.com/t/feastopensource/signup) + ## Overview Feast (**Fea**ture **St**ore) is an open source feature store for machine learning. Feast is the fastest path to manage existing infrastructure to productionize analytic data for model training and online inference. diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index 9d5ba276be..bba4929749 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -16,7 +16,7 @@ * [Feature retrieval](getting-started/concepts/feature-retrieval.md) * [Point-in-time joins](getting-started/concepts/point-in-time-joins.md) * [Registry](getting-started/concepts/registry.md) - * [Permissions](getting-started/concepts/permissions.md) + * [Role-Based Access Control (RBAC)](getting-started/architecture/rbac.md) * [\[Alpha\] Saved dataset](getting-started/concepts/dataset.md) * [Architecture](getting-started/architecture/README.md) * [Overview](getting-started/architecture/overview.md) diff --git a/docs/getting-started/architecture/overview.md b/docs/getting-started/architecture/overview.md index 3a8ba67dcf..86ee75aaa6 100644 --- a/docs/getting-started/architecture/overview.md +++ b/docs/getting-started/architecture/overview.md @@ -18,6 +18,6 @@ typically your Offline Store). We are exploring adding a default streaming engin * We recommend [using Python](language.md) for your Feature Store microservice. As mentioned in the document, precomputing features is the recommended optimal path to ensure low latency performance. Reducing feature serving to a lightweight database lookup is the ideal pattern, which means the marginal overhead of Python should be tolerable. Because of this we believe the pros of Python outweigh the costs, as reimplementing feature logic is undesirable. Java and Go Clients are also available for online feature retrieval. -* Role-Based Access Control (RBAC)[rbac.md](rbac.md) is a security mechanism that restricts access to resources based on the roles of individual users within an organization. In the context of the Feast Feature Store, RBAC ensures that only authorized users or groups can access or modify specific resources, thereby maintaining data security and operational integrity. +* [Role-Based Access Control (RBAC)](rbac.md) is a security mechanism that restricts access to resources based on the roles of individual users within an organization. In the context of the Feast, RBAC ensures that only authorized users or groups can access or modify specific resources, thereby maintaining data security and operational integrity. diff --git a/docs/getting-started/architecture/rbac.md b/docs/getting-started/architecture/rbac.md index 9b07019a7c..5db10a4916 100644 --- a/docs/getting-started/architecture/rbac.md +++ b/docs/getting-started/architecture/rbac.md @@ -1,12 +1,12 @@ -# Role-Based Access Control (RBAC) in Feast Feature Store +# Role-Based Access Control (RBAC) in Feast ## Introduction -Role-Based Access Control (RBAC) is a security mechanism that restricts access to resources based on the roles of individual users within an organization. In the context of the Feast Feature Store, RBAC ensures that only authorized users or groups can access or modify specific resources, thereby maintaining data security and operational integrity. +Role-Based Access Control (RBAC) is a security mechanism that restricts access to resources based on the roles of individual users within an organization. In the context of the Feast, RBAC ensures that only authorized users or groups can access or modify specific resources, thereby maintaining data security and operational integrity. ## Functional Requirements -The RBAC implementation in Feast Feature Store is designed to: +The RBAC implementation in Feast is designed to: - **Assign Permissions**: Allow administrators to assign permissions for various operations and resources to users or groups based on their roles. - **Seamless Integration**: Integrate smoothly with existing business code without requiring significant modifications. @@ -14,19 +14,19 @@ The RBAC implementation in Feast Feature Store is designed to: ## Business Goals -The primary business goals of implementing RBAC in the Feast Feature Store are: - -1. **Feature Sharing**: Enable multiple teams to share the feature store while ensuring controlled access to data partitions. This allows for collaborative work without compromising data security. +The primary business goals of implementing RBAC in the Feast are: +1. **Feature Sharing**: Enable multiple teams to share the feature store while ensuring controlled access. This allows for collaborative work without compromising data security. 2. **Access Control Management**: Prevent unauthorized access to team-specific resources and spaces, governing the operations that each user or group can perform. ## Reference Architecture -The Feast Feature Store operates as a collection of connected services, each enforcing authorization permissions. The architecture is designed as a distributed microservices system with the following key components: +Feast operates as a collection of connected services, each enforcing authorization permissions. The architecture is designed as a distributed microservices system with the following key components: - **Service Endpoints**: These enforce authorization permissions, ensuring that only authorized requests are processed. -- **Client Integration**: Clients interact with the feature store by automatically adding authorization headers to their requests, simplifying the process for users. -- **Service-to-Service Communication**: This is always granted, ensuring smooth operation across the distributed system. +- **Client Integration**: Clients authenticate with feature servers by attaching authorization token to each request. +- **Service-to-Service Communication**: This is always granted. + ![rbac.jpg](rbac.jpg) ## Permission Model @@ -37,97 +37,20 @@ The RBAC system in Feast uses a permission model that defines the following conc - **Action**: A logical operation performed on a resource, such as Create, Describe, Update, Delete, query, or write operations. - **Policy**: A set of rules that enforce authorization decisions on resources. The default implementation uses role-based policies. -### Configuring Permissions - -Permissions in Feast are configured as follows: - -- **Resource Identification**: Resources are identified by type, optional name patterns, and tags. -- **Allowed Operations**: Defined by the `AuthzedAction` enumeration, which specifies the actions that can be performed on the resource. -- **RBAC Policies**: These are specified by the list of required roles, which are then registered in the Feast Registry. - -Example: -```python -Permission( - name="ds-writer", - types=[DataSource], - required_tags={"risk_level": "hi"}, - actions=[AuthzedAction.WRITE_ONLINE, AuthzedAction.WRITE_OFFLINE], - policy=RoleBasedPolicy(roles=["admin", "data_team"]), -) -``` - -### Enforcing Permission Policy - -Authorization is enforced using assert-style code within service endpoint functions. Unauthorized requests result in a `PermissionError` or an HTTP 403-Forbidden response. - -Example: -```python -assert_permissions( - resource=feature_service, - actions=[AuthzedAction.QUERY_ONLINE] -) -``` - -## Use Cases - -### Tag-Based Permission -Permit team1 to access feature views `fv1` and `fv2` with role `role1`: -```python -Permission( - name="team1-fvs", - types=[FeatureView], - required_tags={"team": "team1"}, - actions=[CRUD, WRITE, QUERY], - policy=RoleBasedPolicy(roles=["role1"]), -) -``` - -### Name-Based Permission -Permit team1 to access feature views `fv1` and `fv2` with role `role1` using explicit name matching: -```python -Permission( - name="team1-fv1", - types=[FeatureView], - name_filter="fv1", - actions=[CRUD, WRITE, QUERY], - policy=RoleBasedPolicy(roles=["role1"]), -) -``` + ## Authorization Architecture The authorization architecture in Feast is built with the following components: -1. **Token Extractor**: Extracts the authorization token from the request header. -2. **Token Parser**: Parses the token to retrieve user details. -3. **Policy Enforcer**: Validates the secured endpoint against the retrieved user details. -4. **Token Injector**: Adds the authorization token to each secured request header. - -### OIDC Authorization - -OpenID Connect (OIDC) authorization in Feast is supported by configuring the OIDC server to export user roles within a JWT token. The client then connects to the OIDC server to fetch this token, which is parsed by the server to extract the user's roles. +- **Token Extractor**: Extracts the authorization token from the request header. +- **Token Parser**: Parses the token to retrieve user details. +- **Policy Enforcer**: Validates the secured endpoint against the retrieved user details. +- **Token Injector**: Adds the authorization token to each secured request header. -Example configuration: -```yaml -auth: - type: oidc - client_id: _CLIENT_ID_ - client_secret: _CLIENT_SECRET_ - username: _USERNAME_ - password: _PASSWORD_ - realm: _REALM_ - auth_server_url: _OIDC_SERVER_URL_ -``` -### Kubernetes Authorization -In Kubernetes environments, all clients and servers run in the same cluster. The policy roles are mapped one-to-one with Kubernetes RBAC roles. The client injects the JWT token of its ServiceAccount, and the server extracts the service account name parsed from the token to look for the associated Role and ClusterRole. -Example configuration: -```yaml -auth: - type: kubernetes -``` From 2581335fe4e7780fc84a8f1de913cb53151b1d1d Mon Sep 17 00:00:00 2001 From: Abdul Hameed Date: Tue, 20 Aug 2024 17:58:59 -0400 Subject: [PATCH 168/169] rename action name from QUERY to READ Signed-off-by: Abdul Hameed --- docs/getting-started/architecture/rbac.md | 2 +- docs/getting-started/concepts/permission.md | 15 ++++++++------- .../feature-servers/offline-feature-server.md | 16 ++++++++-------- .../feature-servers/python-feature-server.md | 2 +- protos/feast/core/Permission.proto | 4 ++-- sdk/python/feast/feature_server.py | 6 +++--- sdk/python/feast/offline_server.py | 6 +++--- sdk/python/feast/permissions/action.py | 12 ++++++------ .../feature_repos/repo_configuration.py | 10 +++++----- .../online_store/test_remote_online_store.py | 6 +++--- .../unit/permissions/test_security_manager.py | 4 ++-- 11 files changed, 42 insertions(+), 41 deletions(-) diff --git a/docs/getting-started/architecture/rbac.md b/docs/getting-started/architecture/rbac.md index 5db10a4916..9a51fba6ac 100644 --- a/docs/getting-started/architecture/rbac.md +++ b/docs/getting-started/architecture/rbac.md @@ -34,7 +34,7 @@ Feast operates as a collection of connected services, each enforcing authorizati The RBAC system in Feast uses a permission model that defines the following concepts: - **Resource**: An object within Feast that needs to be secured against unauthorized access. -- **Action**: A logical operation performed on a resource, such as Create, Describe, Update, Delete, query, or write operations. +- **Action**: A logical operation performed on a resource, such as Create, Describe, Update, Delete, Read, or write operations. - **Policy**: A set of rules that enforce authorization decisions on resources. The default implementation uses role-based policies. diff --git a/docs/getting-started/concepts/permission.md b/docs/getting-started/concepts/permission.md index 0d3ad997b4..adeaa068b3 100644 --- a/docs/getting-started/concepts/permission.md +++ b/docs/getting-started/concepts/permission.md @@ -23,9 +23,9 @@ The permission model is based on the following components: - `describe`: Access the instance state. - `update`: Update the instance state. - `delete`: Delete an instance. - - `query`: Query both online and offline stores. - - `query_online`: Query the online store. - - `query_offline`: Query the offline store. + - `read`: Read both online and offline stores. + - `read_online`: Read the online store. + - `read_offline`: Read the offline store. - `write`: Write on any store. - `write_online`: Write to the online store. - `write_offline`: Write to the offline store. @@ -48,7 +48,7 @@ To simplify configuration, several constants are defined to streamline the permi `OnDemandFeatureView`. - In module `feast.permissions.action`: - `ALL_ACTIONS` is the list of all managed actions. - - `QUERY` includes all the query actions for online and offline store. + - `READ` includes all the read actions for online and offline store. - `WRITE` includes all the write actions for online and offline store. - `CRUD` includes all the state management actions to create, describe, update or delete a Feast resource. @@ -69,7 +69,7 @@ Permission( name="feature-reader", types=[FeatureView, FeatureService], policy=RoleBasedPolicy(roles=["super-reader"]), - actions=[AuthzedAction.DESCRIBE, QUERY], + actions=[AuthzedAction.DESCRIBE, READ], ) ``` @@ -89,14 +89,15 @@ Permission( {% endhint %} -The following permission grants authorization to query the offline store of all the feature views including `risky` in the name, to users with role `trusted`: +The following permission grants authorization to read the offline store of all the feature views including `risky` in the name, to users with role `trusted`: + ```py Permission( name="reader", types=[FeatureView], name_pattern=".*risky.*", policy=RoleBasedPolicy(roles=["trusted"]), - actions=[AuthzedAction.QUERY_OFFLINE], + actions=[AuthzedAction.READ_OFFLINE], ) ``` diff --git a/docs/reference/feature-servers/offline-feature-server.md b/docs/reference/feature-servers/offline-feature-server.md index 28e0b0e3d3..cded04b4e5 100644 --- a/docs/reference/feature-servers/offline-feature-server.md +++ b/docs/reference/feature-servers/offline-feature-server.md @@ -37,14 +37,14 @@ The set of functionalities supported by remote offline stores is the same as tho ## API Endpoints and Permissions -| Endpoint | Resource Type |Permission | Description | -| ------------------------------------- |------------------|---------------|-----------------------------------------------------| -| offline_write_batch | FeatureView | Write Offline | Write a batch of data to the offline store | -| write_logged_features | FeatureService | Write Offline | Write logged features to the offline store | -| persist | DataSource | Write Offline | Persist the result of a query in the offline store | -| get_historical_features | FeatureView | Query Offline | Retrieve historical features | -| pull_all_from_table_or_query | DataSource | Query Offline | Pull all data from a table or query it | -| pull_latest_from_table_or_query | DataSource | Query Offline | Pull the latest data from a table or query it | +| Endpoint | Resource Type | Permission | Description | +| ------------------------------------- |------------------|---------------|----------------------------------------------------| +| offline_write_batch | FeatureView | Write Offline | Write a batch of data to the offline store | +| write_logged_features | FeatureService | Write Offline | Write logged features to the offline store | +| persist | DataSource | Write Offline | Persist the result of a query in the offline store | +| get_historical_features | FeatureView | Read Offline | Retrieve historical features | +| pull_all_from_table_or_query | DataSource | Read Offline | Pull all data from a table or read it | +| pull_latest_from_table_or_query | DataSource | Read Offline | Pull the latest data from a table or read it | ## How to configure Authentication and Authorization ? diff --git a/docs/reference/feature-servers/python-feature-server.md b/docs/reference/feature-servers/python-feature-server.md index 3288e86f9c..255b85e606 100644 --- a/docs/reference/feature-servers/python-feature-server.md +++ b/docs/reference/feature-servers/python-feature-server.md @@ -206,7 +206,7 @@ requests.post( | Endpoint | Resource Type | Permission | Description | | ---------------------------- |---------------------------------|-------------------------------------------------------| ------------------------------------------------------------------------ | -| /get-online-features | FeatureView,OnDemandFeatureView | Query Online | Get online features from the feature store | +| /get-online-features | FeatureView,OnDemandFeatureView | Read Online | Get online features from the feature store | | /push | FeatureView | Write Online, Write Offline, Write Online and Offline | Push features to the feature store (online, offline, or both) | | /write-to-online-store | FeatureView | Write Online | Write features to the online store | | /materialize | FeatureView | Write Online | Materialize features within a specified time range | diff --git a/protos/feast/core/Permission.proto b/protos/feast/core/Permission.proto index 127744826c..57958d3d81 100644 --- a/protos/feast/core/Permission.proto +++ b/protos/feast/core/Permission.proto @@ -22,8 +22,8 @@ message PermissionSpec { DESCRIBE = 1; UPDATE = 2; DELETE = 3; - QUERY_ONLINE = 4; - QUERY_OFFLINE = 5; + READ_ONLINE = 4; + READ_OFFLINE = 5; WRITE_ONLINE = 6; WRITE_OFFLINE = 7; } diff --git a/sdk/python/feast/feature_server.py b/sdk/python/feast/feature_server.py index 3fe090d00b..7f24580b7a 100644 --- a/sdk/python/feast/feature_server.py +++ b/sdk/python/feast/feature_server.py @@ -117,7 +117,7 @@ def get_online_features(body=Depends(get_body)): body["feature_service"], allow_cache=True ) assert_permissions( - resource=feature_service, actions=[AuthzedAction.QUERY_ONLINE] + resource=feature_service, actions=[AuthzedAction.READ_ONLINE] ) features = feature_service else: @@ -133,11 +133,11 @@ def get_online_features(body=Depends(get_body)): ) for feature_view in all_feature_views: assert_permissions( - resource=feature_view, actions=[AuthzedAction.QUERY_ONLINE] + resource=feature_view, actions=[AuthzedAction.READ_ONLINE] ) for od_feature_view in all_on_demand_feature_views: assert_permissions( - resource=od_feature_view, actions=[AuthzedAction.QUERY_ONLINE] + resource=od_feature_view, actions=[AuthzedAction.READ_ONLINE] ) response_proto = store.get_online_features( diff --git a/sdk/python/feast/offline_server.py b/sdk/python/feast/offline_server.py index cbf91f551a..839acada93 100644 --- a/sdk/python/feast/offline_server.py +++ b/sdk/python/feast/offline_server.py @@ -296,7 +296,7 @@ def _validate_pull_all_from_table_or_query_parameters(self, command: dict): def pull_all_from_table_or_query(self, command: dict): self._validate_pull_all_from_table_or_query_parameters(command) data_source = self.store.get_data_source(command["data_source_name"]) - assert_permissions(data_source, actions=[AuthzedAction.QUERY_OFFLINE]) + assert_permissions(data_source, actions=[AuthzedAction.READ_OFFLINE]) return self.offline_store.pull_all_from_table_or_query( self.store.config, @@ -325,7 +325,7 @@ def _validate_pull_latest_from_table_or_query_parameters(self, command: dict): def pull_latest_from_table_or_query(self, command: dict): self._validate_pull_latest_from_table_or_query_parameters(command) data_source = self.store.get_data_source(command["data_source_name"]) - assert_permissions(resource=data_source, actions=[AuthzedAction.QUERY_OFFLINE]) + assert_permissions(resource=data_source, actions=[AuthzedAction.READ_OFFLINE]) return self.offline_store.pull_latest_from_table_or_query( self.store.config, data_source, @@ -383,7 +383,7 @@ def get_historical_features(self, command: dict, key: str): for feature_view in feature_views: assert_permissions( - resource=feature_view, actions=[AuthzedAction.QUERY_OFFLINE] + resource=feature_view, actions=[AuthzedAction.READ_OFFLINE] ) retJob = self.offline_store.get_historical_features( diff --git a/sdk/python/feast/permissions/action.py b/sdk/python/feast/permissions/action.py index eba9ce1134..0e85c1685f 100644 --- a/sdk/python/feast/permissions/action.py +++ b/sdk/python/feast/permissions/action.py @@ -10,8 +10,8 @@ class AuthzedAction(enum.Enum): DESCRIBE = "describe" # Access the instance state UPDATE = "update" # Update the instance state DELETE = "delete" # Delete an instance - QUERY_ONLINE = "query_online" # Query the online store only - QUERY_OFFLINE = "query_offline" # Query the offline store only + READ_ONLINE = "read_online" # Read the online store only + READ_OFFLINE = "read_offline" # Read the offline store only WRITE_ONLINE = "write_online" # Write to the online store only WRITE_OFFLINE = "write_offline" # Write to the offline store only @@ -19,10 +19,10 @@ class AuthzedAction(enum.Enum): # Alias for all available actions ALL_ACTIONS = [a for a in AuthzedAction.__members__.values()] -# Alias for all query actions -QUERY = [ - AuthzedAction.QUERY_OFFLINE, - AuthzedAction.QUERY_ONLINE, +# Alias for all read actions +READ = [ + AuthzedAction.READ_OFFLINE, + AuthzedAction.READ_ONLINE, ] # Alias for all write actions WRITE = [ diff --git a/sdk/python/tests/integration/feature_repos/repo_configuration.py b/sdk/python/tests/integration/feature_repos/repo_configuration.py index 4272d7fd9d..235c909d5f 100644 --- a/sdk/python/tests/integration/feature_repos/repo_configuration.py +++ b/sdk/python/tests/integration/feature_repos/repo_configuration.py @@ -489,31 +489,31 @@ def setup(self): name="offline_fv_perm", types=FeatureView, policy=RoleBasedPolicy(roles=["writer"]), - actions=[AuthzedAction.QUERY_OFFLINE, AuthzedAction.WRITE_OFFLINE], + actions=[AuthzedAction.READ_OFFLINE, AuthzedAction.WRITE_OFFLINE], ), Permission( name="offline_odfv_perm", types=OnDemandFeatureView, policy=RoleBasedPolicy(roles=["writer"]), - actions=[AuthzedAction.QUERY_OFFLINE, AuthzedAction.WRITE_OFFLINE], + actions=[AuthzedAction.READ_OFFLINE, AuthzedAction.WRITE_OFFLINE], ), Permission( name="offline_sfv_perm", types=StreamFeatureView, policy=RoleBasedPolicy(roles=["writer"]), - actions=[AuthzedAction.QUERY_OFFLINE, AuthzedAction.WRITE_OFFLINE], + actions=[AuthzedAction.READ_OFFLINE, AuthzedAction.WRITE_OFFLINE], ), Permission( name="offline_fs_perm", types=FeatureService, policy=RoleBasedPolicy(roles=["writer"]), - actions=[AuthzedAction.QUERY_OFFLINE, AuthzedAction.WRITE_OFFLINE], + actions=[AuthzedAction.READ_OFFLINE, AuthzedAction.WRITE_OFFLINE], ), Permission( name="offline_datasource_perm", types=DataSource, policy=RoleBasedPolicy(roles=["writer"]), - actions=[AuthzedAction.QUERY_OFFLINE, AuthzedAction.WRITE_OFFLINE], + actions=[AuthzedAction.READ_OFFLINE, AuthzedAction.WRITE_OFFLINE], ), ] self.feature_store.apply(permissions_list) diff --git a/sdk/python/tests/integration/online_store/test_remote_online_store.py b/sdk/python/tests/integration/online_store/test_remote_online_store.py index 9a85894606..f74fb14a86 100644 --- a/sdk/python/tests/integration/online_store/test_remote_online_store.py +++ b/sdk/python/tests/integration/online_store/test_remote_online_store.py @@ -26,19 +26,19 @@ def test_remote_online_store_read(auth_config): name="online_list_fv_perm", types=FeatureView, policy=RoleBasedPolicy(roles=["reader"]), - actions=[AuthzedAction.QUERY_ONLINE], + actions=[AuthzedAction.READ_ONLINE], ), Permission( name="online_list_odfv_perm", types=OnDemandFeatureView, policy=RoleBasedPolicy(roles=["reader"]), - actions=[AuthzedAction.QUERY_ONLINE], + actions=[AuthzedAction.READ_ONLINE], ), Permission( name="online_list_sfv_perm", types=StreamFeatureView, policy=RoleBasedPolicy(roles=["reader"]), - actions=[AuthzedAction.QUERY_ONLINE], + actions=[AuthzedAction.READ_ONLINE], ), ] server_store, server_url, registry_path = ( diff --git a/sdk/python/tests/unit/permissions/test_security_manager.py b/sdk/python/tests/unit/permissions/test_security_manager.py index 5f73a7a72f..192542da78 100644 --- a/sdk/python/tests/unit/permissions/test_security_manager.py +++ b/sdk/python/tests/unit/permissions/test_security_manager.py @@ -1,7 +1,7 @@ import assertpy import pytest -from feast.permissions.action import QUERY, AuthzedAction +from feast.permissions.action import READ, AuthzedAction from feast.permissions.security_manager import assert_permissions, permitted_resources @@ -33,7 +33,7 @@ ), ( "admin", - QUERY + [AuthzedAction.UPDATE], + READ + [AuthzedAction.UPDATE], False, [False, False], [True, True], From 3f1cd9c86651ec1290e3a250b84810bd3866cfd2 Mon Sep 17 00:00:00 2001 From: Abdul Hameed Date: Wed, 21 Aug 2024 09:12:22 -0400 Subject: [PATCH 169/169] fix the doc to replace query with read Signed-off-by: Abdul Hameed --- docs/getting-started/concepts/permission.md | 4 ++-- .../feature-servers/offline-feature-server.md | 16 ++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/getting-started/concepts/permission.md b/docs/getting-started/concepts/permission.md index adeaa068b3..5bca1bd568 100644 --- a/docs/getting-started/concepts/permission.md +++ b/docs/getting-started/concepts/permission.md @@ -62,8 +62,8 @@ The `feast` CLI includes a new `permissions` command to list the registered perm {% endhint %} ## Definition examples -This permission definition grants access to the resource state and the ability to query all the stores for any feature view or -feature service to all users with role `super-reader`: +This permission definition grants access to the resource state and the ability to read all of the stores for any feature view or +feature service to all users with the role `super-reader`: ```py Permission( name="feature-reader", diff --git a/docs/reference/feature-servers/offline-feature-server.md b/docs/reference/feature-servers/offline-feature-server.md index cded04b4e5..1db5adacd8 100644 --- a/docs/reference/feature-servers/offline-feature-server.md +++ b/docs/reference/feature-servers/offline-feature-server.md @@ -37,14 +37,14 @@ The set of functionalities supported by remote offline stores is the same as tho ## API Endpoints and Permissions -| Endpoint | Resource Type | Permission | Description | -| ------------------------------------- |------------------|---------------|----------------------------------------------------| -| offline_write_batch | FeatureView | Write Offline | Write a batch of data to the offline store | -| write_logged_features | FeatureService | Write Offline | Write logged features to the offline store | -| persist | DataSource | Write Offline | Persist the result of a query in the offline store | -| get_historical_features | FeatureView | Read Offline | Retrieve historical features | -| pull_all_from_table_or_query | DataSource | Read Offline | Pull all data from a table or read it | -| pull_latest_from_table_or_query | DataSource | Read Offline | Pull the latest data from a table or read it | +| Endpoint | Resource Type | Permission | Description | +| ------------------------------------- |------------------|---------------|---------------------------------------------------| +| offline_write_batch | FeatureView | Write Offline | Write a batch of data to the offline store | +| write_logged_features | FeatureService | Write Offline | Write logged features to the offline store | +| persist | DataSource | Write Offline | Persist the result of a read in the offline store | +| get_historical_features | FeatureView | Read Offline | Retrieve historical features | +| pull_all_from_table_or_query | DataSource | Read Offline | Pull all data from a table or read it | +| pull_latest_from_table_or_query | DataSource | Read Offline | Pull the latest data from a table or read it | ## How to configure Authentication and Authorization ?

}hz1$Bmq&AQ_x}A{ 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 diff --git a/examples/remote-offline-store/offline_server/feature_repo/data/driver_stats.parquet b/examples/remote-offline-store/offline_server/feature_repo/data/driver_stats.parquet index 592a2f5cab93744cc036d2b18c5015e25ae38246..19279202d84a63a921306eb5fcd8b88603fb54b6 100644 GIT binary patch delta 23786 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 E0igfu)Bpeg delta 23930 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 Htj0e8Y^Jqj diff --git a/examples/remote-offline-store/offline_server/feature_repo/data/online_store.db b/examples/remote-offline-store/offline_server/feature_repo/data/online_store.db index d3cb8ee0a9ceaf98a797bc62c018f66bbb95306a..d230f45b934c6f347589b35d87f58efa2ba4aa6d 100644 GIT binary patch delta 100 zcmZp8z}WDBaYB+<+ACiE9}H~V#SDCT{B69mc=UNqxr;Xo3jF4p?908EkC}yCJTQ>4 zsjwt5DJOMuBe&9IE1s6gru>1Mm3XZf`9vAn#baX`n`$BQ2YEFnPvV=f*_8iu0ssp) B9}NHi delta 113 zcmZp8z}WDBaYB+}FG5D@HyIMt1SoSjJ{$xU%_t(_qRrYw}-D F004@@BG~`{ diff --git a/examples/remote-offline-store/offline_server/feature_repo/example_repo.py b/examples/remote-offline-store/offline_server/feature_repo/example_repo.py index d9a25e1a37..c06ebc788b 100644 --- a/examples/remote-offline-store/offline_server/feature_repo/example_repo.py +++ b/examples/remote-offline-store/offline_server/feature_repo/example_repo.py @@ -3,6 +3,7 @@ from datetime import timedelta import pandas as pd +import os from feast import ( Entity, @@ -13,8 +14,6 @@ PushSource, RequestSource, ) -from feast.feature_logging import LoggingConfig -from feast.infra.offline_stores.file_source import FileLoggingDestination from feast.on_demand_feature_view import on_demand_feature_view from feast.types import Float32, Float64, Int64 @@ -90,9 +89,6 @@ def transformed_conv_rate(inputs: pd.DataFrame) -> pd.DataFrame: driver_stats_fv[["conv_rate"]], # Sub-selects a feature from a feature view transformed_conv_rate, # Selects all features from the feature view ], - logging_config=LoggingConfig( - destination=FileLoggingDestination(path=f"{os.path.dirname(os.path.abspath(__file__))}/data") - ), ) driver_activity_v2 = FeatureService( name="driver_activity_v2", features=[driver_stats_fv, transformed_conv_rate] diff --git a/infra/charts/feast-feature-server/templates/deployment.yaml b/infra/charts/feast-feature-server/templates/deployment.yaml index 076f234306..a550433db5 100644 --- a/infra/charts/feast-feature-server/templates/deployment.yaml +++ b/infra/charts/feast-feature-server/templates/deployment.yaml @@ -21,7 +21,6 @@ spec: labels: {{- include "feast-feature-server.selectorLabels" . | nindent 8 }} spec: - serviceAccountName: {{ .Values.serviceAccount.name | default "default" }} {{- with .Values.imagePullSecrets }} imagePullSecrets: {{- toYaml . | nindent 8 }} diff --git a/infra/charts/feast-feature-server/values.yaml b/infra/charts/feast-feature-server/values.yaml index 22bbdeace0..64d805a66c 100644 --- a/infra/charts/feast-feature-server/values.yaml +++ b/infra/charts/feast-feature-server/values.yaml @@ -44,9 +44,6 @@ service: type: ClusterIP port: 80 -serviceAccount: - name: "" - resources: {} # We usually recommend not to specify default resources and to leave this as a conscious # choice for the user. This also increases chances charts run on environments with little From 7c9389dcf6094f4accd4e872fab5437dd33e95a8 Mon Sep 17 00:00:00 2001 From: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Date: Wed, 14 Aug 2024 18:57:56 +0200 Subject: [PATCH 155/169] Integrated comment Signed-off-by: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> --- docs/getting-started/concepts/permission.md | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/getting-started/concepts/permission.md b/docs/getting-started/concepts/permission.md index 14f4df8007..57e702ad0c 100644 --- a/docs/getting-started/concepts/permission.md +++ b/docs/getting-started/concepts/permission.md @@ -72,7 +72,6 @@ Permission( actions=[AuthzedAction.READ, QUERY], ) ``` -Please note that all sub-classes of `FeatureView` are also included. This example grants permission to write on all the data sources with `risk_level` tag set to `high` only to users with role `admin` or `data_team`: ```py From 3ff811ea74d57ee652573b7b41350d1046eaa222 Mon Sep 17 00:00:00 2001 From: Abdul Hameed Date: Wed, 14 Aug 2024 14:32:22 -0400 Subject: [PATCH 156/169] removed the firebase depdency and fix the doc conflicts Signed-off-by: Abdul Hameed --- .../getting-started/components/authz_manager.md | 17 +++++++++++++++++ setup.py | 1 - 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/docs/getting-started/components/authz_manager.md b/docs/getting-started/components/authz_manager.md index e69de29bb2..fb0babd1e1 100644 --- a/docs/getting-started/components/authz_manager.md +++ b/docs/getting-started/components/authz_manager.md @@ -0,0 +1,17 @@ +# Authorization manager +**TODO** Complete and validate once the code is consolidated + +An authorization manager is an implementation of the `AuthManager` interface that is plugged into one of the Feast servers to extract user details from the current request and inject them into the [permissions](../../getting-started/concepts/permissions.md) framework. + +{% hint style="info" %} +**Note**: Feast does not provide authentication capabilities; it is the client's responsibility to manage the authentication token and pass it to +the Feast server, which then validates the token and extracts user details from the configured authentication server. +{% endhint %} + +Two implementations are provided out-of-the-box: +* The `OidcAuthManager` implementation, using a configurable OIDC server to extract the user details. +* The `KubernetesAuthManager` implementation, using the Kubernetes RBAC resources to extract the user details. + +**TODO** Working assumptions for the auth manager implementations (e.g. bearer tokens) +**TODO** Instruct how to configure it in the servers +**TODO** Instruct how to configure it in the helm releases diff --git a/setup.py b/setup.py index f852e5b02a..d53aee1002 100644 --- a/setup.py +++ b/setup.py @@ -187,7 +187,6 @@ "Sphinx>4.0.0,<7", "testcontainers==4.4.0", "python-keycloak==4.2.2", - "firebase-admin>=5.2.0,<6", "pre-commit<3.3.2", "assertpy==1.1", "pip-tools", From 0498d3fb410c74126a400f1aab414a7d8cb222f6 Mon Sep 17 00:00:00 2001 From: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Date: Thu, 27 Jun 2024 08:45:54 +0200 Subject: [PATCH 157/169] Introducing permission framework and authorization manager in user guide (to be continued after the code is consolidated) Signed-off-by: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Signed-off-by: Abdul Hameed --- sdk/python/docs/source/feast.rst | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/sdk/python/docs/source/feast.rst b/sdk/python/docs/source/feast.rst index f4db875995..83137574dd 100644 --- a/sdk/python/docs/source/feast.rst +++ b/sdk/python/docs/source/feast.rst @@ -252,6 +252,14 @@ feast.proto\_json module :undoc-members: :show-inheritance: +feast.prova module +------------------ + +.. automodule:: feast.prova + :members: + :undoc-members: + :show-inheritance: + feast.registry\_server module ----------------------------- From 23c829f521414ba517495fd95382e7c90e385100 Mon Sep 17 00:00:00 2001 From: Theodor Mihalache Date: Wed, 14 Aug 2024 15:26:18 -0400 Subject: [PATCH 158/169] Permission resources miss the created_timestamp and last_updated_timestamp fields Signed-off-by: Theodor Mihalache --- protos/feast/core/Permission.proto | 43 ++++++++++------ sdk/python/feast/diff/registry_diff.py | 6 +-- sdk/python/feast/feast_object.py | 4 +- .../feast/infra/registry/base_registry.py | 3 ++ .../infra/registry/proto_registry_utils.py | 13 +++-- sdk/python/feast/infra/registry/registry.py | 20 ++++++-- sdk/python/feast/infra/registry/remote.py | 2 +- sdk/python/feast/infra/registry/sql.py | 1 + sdk/python/feast/permissions/permission.py | 49 ++++++++++++++----- sdk/python/feast/registry_server.py | 2 +- .../registration/test_universal_registry.py | 18 +++---- 11 files changed, 106 insertions(+), 55 deletions(-) diff --git a/protos/feast/core/Permission.proto b/protos/feast/core/Permission.proto index 302b7ad70a..f9f4f3a5d9 100644 --- a/protos/feast/core/Permission.proto +++ b/protos/feast/core/Permission.proto @@ -6,9 +6,17 @@ option java_outer_classname = "PermissionProto"; option java_package = "feast.proto.core"; import "feast/core/Policy.proto"; +import "google/protobuf/timestamp.proto"; message Permission { + // User-specified specifications of this permission. + PermissionSpec spec = 1; + // System-populated metadata for this permission. + PermissionMeta meta = 2; +} + +message PermissionSpec { enum AuthzedAction { CREATE = 0; READ = 1; @@ -27,30 +35,35 @@ message Permission { string project = 2; enum Type { - FEATURE_VIEW = 0; - ON_DEMAND_FEATURE_VIEW = 1; - BATCH_FEATURE_VIEW = 2; - STREAM_FEATURE_VIEW= 3; - ENTITY = 4; - FEATURE_SERVICE = 5; - DATA_SOURCE = 6; - VALIDATION_REFERENCE = 7; - SAVED_DATASET = 8; - PERMISSION = 9; + FEATURE_VIEW = 0; + ON_DEMAND_FEATURE_VIEW = 1; + BATCH_FEATURE_VIEW = 2; + STREAM_FEATURE_VIEW= 3; + ENTITY = 4; + FEATURE_SERVICE = 5; + DATA_SOURCE = 6; + VALIDATION_REFERENCE = 7; + SAVED_DATASET = 8; + PERMISSION = 9; } repeated Type types = 3; - string name_pattern = 5; + string name_pattern = 4; - map required_tags = 6; + map required_tags = 5; // List of actions. - repeated AuthzedAction actions = 7; + repeated AuthzedAction actions = 6; // the policy. - Policy policy = 8; + Policy policy = 7; // User defined metadata - map tags = 9; + map tags = 8; +} + +message PermissionMeta { + google.protobuf.Timestamp created_timestamp = 1; + google.protobuf.Timestamp last_updated_timestamp = 2; } diff --git a/sdk/python/feast/diff/registry_diff.py b/sdk/python/feast/diff/registry_diff.py index 49e6efbd6b..6235025adc 100644 --- a/sdk/python/feast/diff/registry_diff.py +++ b/sdk/python/feast/diff/registry_diff.py @@ -132,10 +132,8 @@ def diff_registry_objects( current_spec: FeastObjectSpecProto new_spec: FeastObjectSpecProto if isinstance( - current_proto, (DataSourceProto, ValidationReferenceProto, PermissionProto) - ) or isinstance( - new_proto, (DataSourceProto, ValidationReferenceProto, PermissionProto) - ): + current_proto, (DataSourceProto, ValidationReferenceProto) + ) or isinstance(new_proto, (DataSourceProto, ValidationReferenceProto)): assert type(current_proto) == type(new_proto) current_spec = cast(DataSourceProto, current_proto) new_spec = cast(DataSourceProto, new_proto) diff --git a/sdk/python/feast/feast_object.py b/sdk/python/feast/feast_object.py index b272be5a4f..dfe29b7128 100644 --- a/sdk/python/feast/feast_object.py +++ b/sdk/python/feast/feast_object.py @@ -12,7 +12,7 @@ from .protos.feast.core.FeatureService_pb2 import FeatureServiceSpec from .protos.feast.core.FeatureView_pb2 import FeatureViewSpec from .protos.feast.core.OnDemandFeatureView_pb2 import OnDemandFeatureViewSpec -from .protos.feast.core.Permission_pb2 import Permission as PermissionProto +from .protos.feast.core.Permission_pb2 import PermissionSpec as PermissionSpec from .protos.feast.core.SavedDataset_pb2 import SavedDatasetSpec from .protos.feast.core.StreamFeatureView_pb2 import StreamFeatureViewSpec from .protos.feast.core.ValidationProfile_pb2 import ( @@ -44,7 +44,7 @@ DataSourceProto, ValidationReferenceProto, SavedDatasetSpec, - PermissionProto, + PermissionSpec, ] ALL_RESOURCE_TYPES = list(get_args(FeastObject)) diff --git a/sdk/python/feast/infra/registry/base_registry.py b/sdk/python/feast/infra/registry/base_registry.py index 5ba9cbedb9..33adb6b7c9 100644 --- a/sdk/python/feast/infra/registry/base_registry.py +++ b/sdk/python/feast/infra/registry/base_registry.py @@ -38,6 +38,7 @@ from feast.protos.feast.core.OnDemandFeatureView_pb2 import ( OnDemandFeatureView as OnDemandFeatureViewProto, ) +from feast.protos.feast.core.Permission_pb2 import Permission as PermissionProto from feast.protos.feast.core.Registry_pb2 import Registry as RegistryProto from feast.protos.feast.core.SavedDataset_pb2 import SavedDataset as SavedDatasetProto from feast.protos.feast.core.StreamFeatureView_pb2 import ( @@ -811,4 +812,6 @@ def deserialize_registry_values(serialized_proto, feast_obj_type) -> Any: return OnDemandFeatureViewProto.FromString(serialized_proto) if feast_obj_type == FeatureService: return FeatureServiceProto.FromString(serialized_proto) + if feast_obj_type == Permission: + return PermissionProto.FromString(serialized_proto) return None diff --git a/sdk/python/feast/infra/registry/proto_registry_utils.py b/sdk/python/feast/infra/registry/proto_registry_utils.py index 09e39d3c3e..f67808aab5 100644 --- a/sdk/python/feast/infra/registry/proto_registry_utils.py +++ b/sdk/python/feast/infra/registry/proto_registry_utils.py @@ -299,8 +299,8 @@ def list_permissions( ) -> List[Permission]: permissions = [] for permission_proto in registry_proto.permissions: - if permission_proto.project == project and utils.has_all_tags( - permission_proto.tags, tags + if permission_proto.spec.project == project and utils.has_all_tags( + permission_proto.spec.tags, tags ): permissions.append(Permission.from_proto(permission_proto)) return permissions @@ -309,7 +309,10 @@ def list_permissions( def get_permission( registry_proto: RegistryProto, name: str, project: str ) -> Permission: - for permission in registry_proto.permissions: - if permission.project == project and permission.name == name: - return Permission.from_proto(permission) + for permission_proto in registry_proto.permissions: + if ( + permission_proto.spec.project == project + and permission_proto.spec.name == name + ): + return Permission.from_proto(permission_proto) raise PermissionObjectNotFoundException(name=name, project=project) diff --git a/sdk/python/feast/infra/registry/registry.py b/sdk/python/feast/infra/registry/registry.py index fa9d436400..366f3aacaa 100644 --- a/sdk/python/feast/infra/registry/registry.py +++ b/sdk/python/feast/infra/registry/registry.py @@ -942,15 +942,24 @@ def list_permissions( def apply_permission( self, permission: Permission, project: str, commit: bool = True ): + now = _utc_now() + if not permission.created_timestamp: + permission.created_timestamp = now + permission.last_updated_timestamp = now + registry = self._prepare_registry_for_changes(project) for idx, existing_permission_proto in enumerate(registry.permissions): if ( - existing_permission_proto.name == permission.name - and existing_permission_proto.project == project + existing_permission_proto.spec.name == permission.name + and existing_permission_proto.spec.project == project ): + permission.created_timestamp = ( + existing_permission_proto.meta.created_timestamp.ToDatetime() + ) del registry.permissions[idx] + permission_proto = permission.to_proto() - permission_proto.project = project + permission_proto.spec.project = project registry.permissions.append(permission_proto) if commit: self.commit() @@ -960,7 +969,10 @@ def delete_permission(self, name: str, project: str, commit: bool = True): assert self.cached_registry_proto for idx, permission_proto in enumerate(self.cached_registry_proto.permissions): - if permission_proto.name == name and permission_proto.project == project: + if ( + permission_proto.spec.name == name + and permission_proto.spec.project == project + ): del self.cached_registry_proto.permissions[idx] if commit: self.commit() diff --git a/sdk/python/feast/infra/registry/remote.py b/sdk/python/feast/infra/registry/remote.py index b8665d0cf6..618628bc07 100644 --- a/sdk/python/feast/infra/registry/remote.py +++ b/sdk/python/feast/infra/registry/remote.py @@ -413,7 +413,7 @@ def apply_permission( self, permission: Permission, project: str, commit: bool = True ): permission_proto = permission.to_proto() - permission_proto.project = project + permission_proto.spec.project = project request = RegistryServer_pb2.ApplyPermissionRequest( permission=permission_proto, project=project, commit=commit diff --git a/sdk/python/feast/infra/registry/sql.py b/sdk/python/feast/infra/registry/sql.py index cd6d2e2bb3..90c6e82e7d 100644 --- a/sdk/python/feast/infra/registry/sql.py +++ b/sdk/python/feast/infra/registry/sql.py @@ -741,6 +741,7 @@ def _apply_object( "saved_dataset_proto", "feature_view_proto", "feature_service_proto", + "permission_proto", ]: deserialized_proto = self.deserialize_registry_values( row._mapping[proto_field_name], type(obj) diff --git a/sdk/python/feast/permissions/permission.py b/sdk/python/feast/permissions/permission.py index 824fcd063f..1117a3ee82 100644 --- a/sdk/python/feast/permissions/permission.py +++ b/sdk/python/feast/permissions/permission.py @@ -1,6 +1,7 @@ import logging import re from abc import ABC +from datetime import datetime from typing import TYPE_CHECKING, Any, Dict, Optional, Union from google.protobuf.json_format import MessageToJson @@ -10,6 +11,8 @@ from feast.permissions.matcher import actions_match_config, resource_match_config from feast.permissions.policy import AllowAll, Policy from feast.protos.feast.core.Permission_pb2 import Permission as PermissionProto +from feast.protos.feast.core.Permission_pb2 import PermissionMeta as PermissionMetaProto +from feast.protos.feast.core.Permission_pb2 import PermissionSpec as PermissionSpecProto if TYPE_CHECKING: from feast.feast_object import FeastObject @@ -45,6 +48,8 @@ class Permission(ABC): _policy: Policy _tags: Dict[str, str] _required_tags: dict[str, str] + created_timestamp: Optional[datetime] + last_updated_timestamp: Optional[datetime] def __init__( self, @@ -74,6 +79,8 @@ def __init__( self._policy = policy self._tags = _normalize_tags(tags) self._required_tags = _normalize_tags(required_tags) + self.created_timestamp = None + self.last_updated_timestamp = None def __eq__(self, other): if not isinstance(other, Permission): @@ -164,25 +171,34 @@ def from_proto(permission_proto: PermissionProto) -> Any: types = [ get_type_class_from_permission_type( - _PERMISSION_TYPES[PermissionProto.Type.Name(t)] + _PERMISSION_TYPES[PermissionSpecProto.Type.Name(t)] ) - for t in permission_proto.types + for t in permission_proto.spec.types ] actions = [ - AuthzedAction[PermissionProto.AuthzedAction.Name(action)] - for action in permission_proto.actions + AuthzedAction[PermissionSpecProto.AuthzedAction.Name(action)] + for action in permission_proto.spec.actions ] permission = Permission( - permission_proto.name, + permission_proto.spec.name, types, - permission_proto.name_pattern or None, + permission_proto.spec.name_pattern or None, actions, - Policy.from_proto(permission_proto.policy), - dict(permission_proto.tags) or None, - dict(permission_proto.required_tags) or None, + Policy.from_proto(permission_proto.spec.policy), + dict(permission_proto.spec.tags) or None, + dict(permission_proto.spec.required_tags) or None, ) + if permission_proto.meta.HasField("created_timestamp"): + permission.created_timestamp = ( + permission_proto.meta.created_timestamp.ToDatetime() + ) + if permission_proto.meta.HasField("last_updated_timestamp"): + permission.last_updated_timestamp = ( + permission_proto.meta.last_updated_timestamp.ToDatetime() + ) + return permission def to_proto(self) -> PermissionProto: @@ -190,17 +206,18 @@ def to_proto(self) -> PermissionProto: Converts a PermissionProto object to its protobuf representation. """ types = [ - PermissionProto.Type.Value( + PermissionSpecProto.Type.Value( re.sub(r"([a-z])([A-Z])", r"\1_\2", t.__name__).upper() # type: ignore[union-attr] ) for t in self.types ] actions = [ - PermissionProto.AuthzedAction.Value(action.name) for action in self.actions + PermissionSpecProto.AuthzedAction.Value(action.name) + for action in self.actions ] - permission_proto = PermissionProto( + permission_spec = PermissionSpecProto( name=self.name, types=types, name_pattern=self.name_pattern if self.name_pattern is not None else "", @@ -210,7 +227,13 @@ def to_proto(self) -> PermissionProto: required_tags=self.required_tags, ) - return permission_proto + meta = PermissionMetaProto() + if self.created_timestamp: + meta.created_timestamp.FromDatetime(self.created_timestamp) + if self.last_updated_timestamp: + meta.last_updated_timestamp.FromDatetime(self.last_updated_timestamp) + + return PermissionProto(spec=permission_spec, meta=meta) def _normalize_name_pattern(name_pattern: Optional[str]): diff --git a/sdk/python/feast/registry_server.py b/sdk/python/feast/registry_server.py index 6dee96f5f9..6671439d72 100644 --- a/sdk/python/feast/registry_server.py +++ b/sdk/python/feast/registry_server.py @@ -566,7 +566,7 @@ def GetPermission(self, request: RegistryServer_pb2.GetPermissionRequest, contex resource=permission, actions=[AuthzedAction.READ], ) - permission.to_proto().project = request.project + permission.to_proto().spec.project = request.project return permission.to_proto() diff --git a/sdk/python/tests/integration/registration/test_universal_registry.py b/sdk/python/tests/integration/registration/test_universal_registry.py index 198a82d40a..a0319512a5 100644 --- a/sdk/python/tests/integration/registration/test_universal_registry.py +++ b/sdk/python/tests/integration/registration/test_universal_registry.py @@ -1391,6 +1391,9 @@ def test_apply_permission_success(test_registry): and permission.required_tags is None ) + # After the first apply, the created_timestamp should be the same as the last_update_timestamp. + assert permission.created_timestamp == permission.last_updated_timestamp + permission = test_registry.get_permission("read_permission", project) assert ( permission.name == "read_permission" @@ -1406,10 +1409,6 @@ def test_apply_permission_success(test_registry): and permission.required_tags is None ) - # After the first apply, the created_timestamp should be the same as the last_update_timestamp. - # TODO: no such fields - # assert permission.created_timestamp == permission.last_updated_timestamp - # Update permission updated_permission = Permission( name="read_permission", @@ -1440,12 +1439,11 @@ def test_apply_permission_success(test_registry): and updated_permission.required_tags is None ) - # # The created_timestamp for the entity should be set to the created_timestamp value stored from the previous apply - # TODO: no such fields - # assert ( - # updated_entity.created_timestamp is not None - # and updated_entity.created_timestamp == entity.created_timestamp - # ) + # The created_timestamp for the entity should be set to the created_timestamp value stored from the previous apply + assert ( + updated_permission.created_timestamp is not None + and updated_permission.created_timestamp == permission.created_timestamp + ) updated_permission = Permission( name="read_permission", From 6c5e2c7bbc1d3916ede5522cc9c38e54e0cbb96c Mon Sep 17 00:00:00 2001 From: Abdul Hameed Date: Fri, 16 Aug 2024 10:35:07 -0400 Subject: [PATCH 159/169] remove error incase if user has no roles assinged incase unthorized user Signed-off-by: Abdul Hameed --- .../feast/permissions/auth/oidc_token_parser.py | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/sdk/python/feast/permissions/auth/oidc_token_parser.py b/sdk/python/feast/permissions/auth/oidc_token_parser.py index 91d3709744..921a585bc2 100644 --- a/sdk/python/feast/permissions/auth/oidc_token_parser.py +++ b/sdk/python/feast/permissions/auth/oidc_token_parser.py @@ -88,19 +88,16 @@ async def user_details_from_access_token(self, access_token: str) -> User: current_user = data["preferred_username"] if "resource_access" not in data: - raise AuthenticationError( - "Missing resource_access field in access token." - ) + logger.warning("Missing resource_access field in access token.") client_id = self._auth_config.client_id if client_id not in data["resource_access"]: - raise AuthenticationError( - f"Missing resource_access.{client_id} field in access token." + logger.warning( + f"Missing resource_access.{client_id} field in access token. Defaulting to empty roles." ) - if "roles" not in data["resource_access"][client_id]: - raise AuthenticationError( - f"Missing resource_access.{client_id}.roles field in access token." - ) - roles = data["resource_access"][client_id]["roles"] + roles = [] + else: + roles = data["resource_access"][client_id]["roles"] + logger.info(f"Extracted user {current_user} and roles {roles}") return User(username=current_user, roles=roles) except jwt.exceptions.InvalidTokenError: From 8409014da183a9441cd075a7269156fd26801881 Mon Sep 17 00:00:00 2001 From: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Date: Mon, 19 Aug 2024 10:31:17 +0200 Subject: [PATCH 160/169] renamed READ action to DESCRIBE Signed-off-by: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> --- docs/getting-started/concepts/permission.md | 2 +- docs/reference/feast-cli-commands.md | 22 ++++++------ protos/feast/core/Permission.proto | 2 +- sdk/python/feast/permissions/action.py | 4 +-- sdk/python/feast/registry_server.py | 36 +++++++++---------- .../registration/test_universal_registry.py | 14 ++++---- .../tests/unit/diff/test_registry_diff.py | 2 +- .../test_local_feature_store.py | 2 +- .../permissions/auth/server/test_utils.py | 12 +++---- sdk/python/tests/unit/permissions/conftest.py | 6 ++-- .../unit/permissions/test_security_manager.py | 10 +++--- 11 files changed, 56 insertions(+), 56 deletions(-) diff --git a/docs/getting-started/concepts/permission.md b/docs/getting-started/concepts/permission.md index 57e702ad0c..a5c13ecb73 100644 --- a/docs/getting-started/concepts/permission.md +++ b/docs/getting-started/concepts/permission.md @@ -69,7 +69,7 @@ Permission( name="feature-reader", types=[FeatureView, FeatureService], policy=RoleBasedPolicy(roles=["super-reader"]), - actions=[AuthzedAction.READ, QUERY], + actions=[AuthzedAction.DESCRIBE, QUERY], ) ``` diff --git a/docs/reference/feast-cli-commands.md b/docs/reference/feast-cli-commands.md index 37a078f9fd..3a743c0332 100644 --- a/docs/reference/feast-cli-commands.md +++ b/docs/reference/feast-cli-commands.md @@ -174,11 +174,11 @@ Options: +-----------------------+-------------+-----------------------+-----------+----------------+-------------------------+ | NAME | TYPES | NAME_PATTERN | ACTIONS | ROLES | REQUIRED_TAGS | +=======================+=============+=======================+===========+================+================+========+ -| reader_permission1234 | FeatureView | transformed_conv_rate | READ | reader | - | +| reader_permission1234 | FeatureView | transformed_conv_rate | DESCRIBE | reader | - | +-----------------------+-------------+-----------------------+-----------+----------------+-------------------------+ | writer_permission1234 | FeatureView | transformed_conv_rate | CREATE | writer | - | +-----------------------+-------------+-----------------------+-----------+----------------+-------------------------+ -| special | FeatureView | special.* | READ | admin | test-key2 : test-value2 | +| special | FeatureView | special.* | DESCRIBE | admin | test-key2 : test-value2 | | | | | UPDATE | special-reader | test-key : test-value | +-----------------------+-------------+-----------------------+-----------+----------------+-------------------------+ ``` @@ -215,7 +215,7 @@ requiredTags: required1: required-value1 required2: required-value2 actions: -- READ +- DESCRIBE policy: roleBasedPolicy: roles: @@ -256,40 +256,40 @@ admin driver_hourly_stats_source FileSource CREATE DELETE QUERY_OFFLINE QUERY_ONLINE - READ + DESCRIBE UPDATE admin vals_to_add RequestSource CREATE DELETE QUERY_OFFLINE QUERY_ONLINE - READ + DESCRIBE UPDATE admin driver_stats_push_source PushSource CREATE DELETE QUERY_OFFLINE QUERY_ONLINE - READ + DESCRIBE UPDATE admin driver_hourly_stats_source FileSource CREATE DELETE QUERY_OFFLINE QUERY_ONLINE - READ + DESCRIBE UPDATE admin vals_to_add RequestSource CREATE DELETE QUERY_OFFLINE QUERY_ONLINE - READ + DESCRIBE UPDATE admin driver_stats_push_source PushSource CREATE DELETE QUERY_OFFLINE QUERY_ONLINE - READ + DESCRIBE UPDATE -reader driver_hourly_stats FeatureView READ -reader driver_hourly_stats_fresh FeatureView READ +reader driver_hourly_stats FeatureView DESCRIBE +reader driver_hourly_stats_fresh FeatureView DESCRIBE ... ``` diff --git a/protos/feast/core/Permission.proto b/protos/feast/core/Permission.proto index f9f4f3a5d9..127744826c 100644 --- a/protos/feast/core/Permission.proto +++ b/protos/feast/core/Permission.proto @@ -19,7 +19,7 @@ message Permission { message PermissionSpec { enum AuthzedAction { CREATE = 0; - READ = 1; + DESCRIBE = 1; UPDATE = 2; DELETE = 3; QUERY_ONLINE = 4; diff --git a/sdk/python/feast/permissions/action.py b/sdk/python/feast/permissions/action.py index 09bce94511..a181f61f9b 100644 --- a/sdk/python/feast/permissions/action.py +++ b/sdk/python/feast/permissions/action.py @@ -7,7 +7,7 @@ class AuthzedAction(enum.Enum): """ CREATE = "create" # Create an instance - READ = "read" # Access the instance state + DESCRIBE = "describe" # Access the instance state UPDATE = "update" # Update the instance state DELETE = "delete" # Deelete an instance QUERY_ONLINE = "query_online" # Query the online store only @@ -34,7 +34,7 @@ class AuthzedAction(enum.Enum): # Alias for CRUD actions CRUD = [ AuthzedAction.CREATE, - AuthzedAction.READ, + AuthzedAction.DESCRIBE, AuthzedAction.UPDATE, AuthzedAction.DELETE, ] diff --git a/sdk/python/feast/registry_server.py b/sdk/python/feast/registry_server.py index 6671439d72..f231e27abc 100644 --- a/sdk/python/feast/registry_server.py +++ b/sdk/python/feast/registry_server.py @@ -57,7 +57,7 @@ def GetEntity(self, request: RegistryServer_pb2.GetEntityRequest, context): project=request.project, allow_cache=request.allow_cache, ), - actions=[AuthzedAction.READ], + actions=[AuthzedAction.DESCRIBE], ).to_proto() def ListEntities(self, request: RegistryServer_pb2.ListEntitiesRequest, context): @@ -73,7 +73,7 @@ def ListEntities(self, request: RegistryServer_pb2.ListEntitiesRequest, context) tags=dict(request.tags), ), ), - actions=AuthzedAction.READ, + actions=AuthzedAction.DESCRIBE, ) ] ) @@ -117,7 +117,7 @@ def GetDataSource(self, request: RegistryServer_pb2.GetDataSourceRequest, contex project=request.project, allow_cache=request.allow_cache, ), - actions=AuthzedAction.READ, + actions=AuthzedAction.DESCRIBE, ).to_proto() def ListDataSources( @@ -135,7 +135,7 @@ def ListDataSources( tags=dict(request.tags), ), ), - actions=AuthzedAction.READ, + actions=AuthzedAction.DESCRIBE, ) ] ) @@ -165,7 +165,7 @@ def GetFeatureView( project=request.project, allow_cache=request.allow_cache, ), - actions=[AuthzedAction.READ], + actions=[AuthzedAction.DESCRIBE], ).to_proto() def ApplyFeatureView( @@ -209,7 +209,7 @@ def ListFeatureViews( tags=dict(request.tags), ), ), - actions=AuthzedAction.READ, + actions=AuthzedAction.DESCRIBE, ) ] ) @@ -246,7 +246,7 @@ def GetStreamFeatureView( project=request.project, allow_cache=request.allow_cache, ), - actions=[AuthzedAction.READ], + actions=[AuthzedAction.DESCRIBE], ).to_proto() def ListStreamFeatureViews( @@ -264,7 +264,7 @@ def ListStreamFeatureViews( tags=dict(request.tags), ), ), - actions=AuthzedAction.READ, + actions=AuthzedAction.DESCRIBE, ) ] ) @@ -278,7 +278,7 @@ def GetOnDemandFeatureView( project=request.project, allow_cache=request.allow_cache, ), - actions=[AuthzedAction.READ], + actions=[AuthzedAction.DESCRIBE], ).to_proto() def ListOnDemandFeatureViews( @@ -296,7 +296,7 @@ def ListOnDemandFeatureViews( tags=dict(request.tags), ), ), - actions=AuthzedAction.READ, + actions=AuthzedAction.DESCRIBE, ) ] ) @@ -327,7 +327,7 @@ def GetFeatureService( project=request.project, allow_cache=request.allow_cache, ), - actions=[AuthzedAction.READ], + actions=[AuthzedAction.DESCRIBE], ).to_proto() def ListFeatureServices( @@ -345,7 +345,7 @@ def ListFeatureServices( tags=dict(request.tags), ), ), - actions=AuthzedAction.READ, + actions=AuthzedAction.DESCRIBE, ) ] ) @@ -395,7 +395,7 @@ def GetSavedDataset( project=request.project, allow_cache=request.allow_cache, ), - actions=[AuthzedAction.READ], + actions=[AuthzedAction.DESCRIBE], ).to_proto() def ListSavedDatasets( @@ -413,7 +413,7 @@ def ListSavedDatasets( tags=dict(request.tags), ), ), - actions=AuthzedAction.READ, + actions=AuthzedAction.DESCRIBE, ) ] ) @@ -459,7 +459,7 @@ def GetValidationReference( project=request.project, allow_cache=request.allow_cache, ), - actions=[AuthzedAction.READ], + actions=[AuthzedAction.DESCRIBE], ).to_proto() def ListValidationReferences( @@ -477,7 +477,7 @@ def ListValidationReferences( tags=dict(request.tags), ), ), - actions=AuthzedAction.READ, + actions=AuthzedAction.DESCRIBE, ) ] ) @@ -564,7 +564,7 @@ def GetPermission(self, request: RegistryServer_pb2.GetPermissionRequest, contex ) assert_permissions( resource=permission, - actions=[AuthzedAction.READ], + actions=[AuthzedAction.DESCRIBE], ) permission.to_proto().spec.project = request.project @@ -583,7 +583,7 @@ def ListPermissions( project=request.project, allow_cache=request.allow_cache ), ), - actions=AuthzedAction.READ, + actions=AuthzedAction.DESCRIBE, ) ] ) diff --git a/sdk/python/tests/integration/registration/test_universal_registry.py b/sdk/python/tests/integration/registration/test_universal_registry.py index a0319512a5..c528cee4a8 100644 --- a/sdk/python/tests/integration/registration/test_universal_registry.py +++ b/sdk/python/tests/integration/registration/test_universal_registry.py @@ -1357,7 +1357,7 @@ def validate_project_uuid(project_uuid, test_registry): def test_apply_permission_success(test_registry): permission = Permission( name="read_permission", - actions=AuthzedAction.READ, + actions=AuthzedAction.DESCRIBE, policy=RoleBasedPolicy(roles=["reader"]), types=FeatureView, ) @@ -1382,7 +1382,7 @@ def test_apply_permission_success(test_registry): and len(permission.types) == 1 and permission.types[0] == FeatureView and len(permission.actions) == 1 - and permission.actions[0] == AuthzedAction.READ + and permission.actions[0] == AuthzedAction.DESCRIBE and isinstance(permission.policy, RoleBasedPolicy) and len(permission.policy.roles) == 1 and permission.policy.roles[0] == "reader" @@ -1400,7 +1400,7 @@ def test_apply_permission_success(test_registry): and len(permission.types) == 1 and permission.types[0] == FeatureView and len(permission.actions) == 1 - and permission.actions[0] == AuthzedAction.READ + and permission.actions[0] == AuthzedAction.DESCRIBE and isinstance(permission.policy, RoleBasedPolicy) and len(permission.policy.roles) == 1 and permission.policy.roles[0] == "reader" @@ -1412,7 +1412,7 @@ def test_apply_permission_success(test_registry): # Update permission updated_permission = Permission( name="read_permission", - actions=[AuthzedAction.READ, AuthzedAction.WRITE_ONLINE], + actions=[AuthzedAction.DESCRIBE, AuthzedAction.WRITE_ONLINE], policy=RoleBasedPolicy(roles=["reader", "writer"]), types=FeatureView, ) @@ -1428,7 +1428,7 @@ def test_apply_permission_success(test_registry): and len(updated_permission.types) == 1 and updated_permission.types[0] == FeatureView and len(updated_permission.actions) == 2 - and AuthzedAction.READ in updated_permission.actions + and AuthzedAction.DESCRIBE in updated_permission.actions and AuthzedAction.WRITE_ONLINE in updated_permission.actions and isinstance(updated_permission.policy, RoleBasedPolicy) and len(updated_permission.policy.roles) == 2 @@ -1447,7 +1447,7 @@ def test_apply_permission_success(test_registry): updated_permission = Permission( name="read_permission", - actions=[AuthzedAction.READ, AuthzedAction.WRITE_ONLINE], + actions=[AuthzedAction.DESCRIBE, AuthzedAction.WRITE_ONLINE], policy=RoleBasedPolicy(roles=["reader", "writer"]), types=FeatureView, name_pattern="aaa", @@ -1466,7 +1466,7 @@ def test_apply_permission_success(test_registry): and len(updated_permission.types) == 1 and updated_permission.types[0] == FeatureView and len(updated_permission.actions) == 2 - and AuthzedAction.READ in updated_permission.actions + and AuthzedAction.DESCRIBE in updated_permission.actions and AuthzedAction.WRITE_ONLINE in updated_permission.actions and isinstance(updated_permission.policy, RoleBasedPolicy) and len(updated_permission.policy.roles) == 2 diff --git a/sdk/python/tests/unit/diff/test_registry_diff.py b/sdk/python/tests/unit/diff/test_registry_diff.py index f30df2a2d2..2834c57800 100644 --- a/sdk/python/tests/unit/diff/test_registry_diff.py +++ b/sdk/python/tests/unit/diff/test_registry_diff.py @@ -181,7 +181,7 @@ def test_diff_registry_objects_permissions(): name="reader", types=ALL_RESOURCE_TYPES, policy=RoleBasedPolicy(roles=["reader"]), - actions=[AuthzedAction.READ], + actions=[AuthzedAction.DESCRIBE], ) post_changed = Permission( name="reader", diff --git a/sdk/python/tests/unit/local_feast_tests/test_local_feature_store.py b/sdk/python/tests/unit/local_feast_tests/test_local_feature_store.py index 0cf0292b3f..c86441d56c 100644 --- a/sdk/python/tests/unit/local_feast_tests/test_local_feature_store.py +++ b/sdk/python/tests/unit/local_feast_tests/test_local_feature_store.py @@ -353,7 +353,7 @@ def test_apply_permissions(test_feature_store): name="reader", types=ALL_RESOURCE_TYPES, policy=RoleBasedPolicy(roles=["reader"]), - actions=[AuthzedAction.READ], + actions=[AuthzedAction.DESCRIBE], ) # Register Permission diff --git a/sdk/python/tests/unit/permissions/auth/server/test_utils.py b/sdk/python/tests/unit/permissions/auth/server/test_utils.py index 2053880dd5..5d781919a0 100644 --- a/sdk/python/tests/unit/permissions/auth/server/test_utils.py +++ b/sdk/python/tests/unit/permissions/auth/server/test_utils.py @@ -11,42 +11,42 @@ name="read_permissions_perm", types=Permission, policy=RoleBasedPolicy(roles=["reader"]), - actions=[AuthzedAction.READ], + actions=[AuthzedAction.DESCRIBE], ) read_entities_perm = Permission( name="read_entities_perm", types=Entity, policy=RoleBasedPolicy(roles=["reader"]), - actions=[AuthzedAction.READ], + actions=[AuthzedAction.DESCRIBE], ) read_fv_perm = Permission( name="read_fv_perm", types=FeatureView, policy=RoleBasedPolicy(roles=["reader"]), - actions=[AuthzedAction.READ], + actions=[AuthzedAction.DESCRIBE], ) read_odfv_perm = Permission( name="read_odfv_perm", types=OnDemandFeatureView, policy=RoleBasedPolicy(roles=["reader"]), - actions=[AuthzedAction.READ], + actions=[AuthzedAction.DESCRIBE], ) read_sfv_perm = Permission( name="read_sfv_perm", types=StreamFeatureView, policy=RoleBasedPolicy(roles=["reader"]), - actions=[AuthzedAction.READ], + actions=[AuthzedAction.DESCRIBE], ) invalid_list_entities_perm = Permission( name="invalid_list_entity_perm", types=Entity, policy=RoleBasedPolicy(roles=["dancer"]), - actions=[AuthzedAction.READ], + actions=[AuthzedAction.DESCRIBE], ) diff --git a/sdk/python/tests/unit/permissions/conftest.py b/sdk/python/tests/unit/permissions/conftest.py index fd4113873e..7cd944fb47 100644 --- a/sdk/python/tests/unit/permissions/conftest.py +++ b/sdk/python/tests/unit/permissions/conftest.py @@ -22,7 +22,7 @@ def __init__(self, name, tags): tags=tags, ) - @require_permissions(actions=[AuthzedAction.READ]) + @require_permissions(actions=[AuthzedAction.DESCRIBE]) def read_protected(self) -> bool: return True @@ -60,7 +60,7 @@ def security_manager() -> SecurityManager: name="reader", types=FeatureView, policy=RoleBasedPolicy(roles=["reader"]), - actions=[AuthzedAction.READ], + actions=[AuthzedAction.DESCRIBE], ) ) permissions.append( @@ -77,7 +77,7 @@ def security_manager() -> SecurityManager: types=FeatureView, name_pattern="special.*", policy=RoleBasedPolicy(roles=["admin", "special-reader"]), - actions=[AuthzedAction.READ, AuthzedAction.UPDATE], + actions=[AuthzedAction.DESCRIBE, AuthzedAction.UPDATE], ) ) diff --git a/sdk/python/tests/unit/permissions/test_security_manager.py b/sdk/python/tests/unit/permissions/test_security_manager.py index 0380d4772c..5f73a7a72f 100644 --- a/sdk/python/tests/unit/permissions/test_security_manager.py +++ b/sdk/python/tests/unit/permissions/test_security_manager.py @@ -9,15 +9,15 @@ "username, requested_actions, allowed, allowed_single, raise_error_in_assert, raise_error_in_permit", [ (None, [], False, [False, False], [True, True], False), - ("r", [AuthzedAction.READ], True, [True, True], [False, False], False), + ("r", [AuthzedAction.DESCRIBE], True, [True, True], [False, False], False), ("r", [AuthzedAction.UPDATE], False, [False, False], [True, True], False), - ("w", [AuthzedAction.READ], False, [False, False], [True, True], False), + ("w", [AuthzedAction.DESCRIBE], False, [False, False], [True, True], False), ("w", [AuthzedAction.UPDATE], False, [True, True], [False, False], False), - ("rw", [AuthzedAction.READ], False, [True, True], [False, False], False), + ("rw", [AuthzedAction.DESCRIBE], False, [True, True], [False, False], False), ("rw", [AuthzedAction.UPDATE], False, [True, True], [False, False], False), ( "rw", - [AuthzedAction.READ, AuthzedAction.UPDATE], + [AuthzedAction.DESCRIBE, AuthzedAction.UPDATE], False, [False, False], [True, True], @@ -25,7 +25,7 @@ ), ( "admin", - [AuthzedAction.READ, AuthzedAction.UPDATE], + [AuthzedAction.DESCRIBE, AuthzedAction.UPDATE], False, [False, True], [True, False], From fdf331f825f64aaedf97fbc5b57c7a0bb2782a14 Mon Sep 17 00:00:00 2001 From: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Date: Mon, 19 Aug 2024 12:26:12 +0200 Subject: [PATCH 161/169] Specified authorization manager and authorization configuration Signed-off-by: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> --- .../components/authz_manager.md | 105 ++++++++++++++++-- docs/getting-started/concepts/permission.md | 64 ++--------- 2 files changed, 107 insertions(+), 62 deletions(-) diff --git a/docs/getting-started/components/authz_manager.md b/docs/getting-started/components/authz_manager.md index fb0babd1e1..09ca4d1366 100644 --- a/docs/getting-started/components/authz_manager.md +++ b/docs/getting-started/components/authz_manager.md @@ -1,17 +1,102 @@ -# Authorization manager -**TODO** Complete and validate once the code is consolidated - -An authorization manager is an implementation of the `AuthManager` interface that is plugged into one of the Feast servers to extract user details from the current request and inject them into the [permissions](../../getting-started/concepts/permissions.md) framework. +# Authorization Manager +An Authorization Manager is an instance of the `AuthManager` class that is plugged into one of the Feast servers to extract user details from the current request and inject them into the [permissions](../../getting-started/concepts/permissions.md) framework. {% hint style="info" %} **Note**: Feast does not provide authentication capabilities; it is the client's responsibility to manage the authentication token and pass it to the Feast server, which then validates the token and extracts user details from the configured authentication server. {% endhint %} -Two implementations are provided out-of-the-box: -* The `OidcAuthManager` implementation, using a configurable OIDC server to extract the user details. -* The `KubernetesAuthManager` implementation, using the Kubernetes RBAC resources to extract the user details. +Two authorization managers are supported out-of-the-box: +* One using a configurable OIDC server to extract the user details. +* One using the Kubernetes RBAC resources to extract the user details. + +These instances are created when the Feast servers are initialized, according to the authorization configuration defined in +their own `feature_store.yaml`. + +Feast servers and clients must have consistent authorization configuration, so that the client proxies can automatically inject +the authorization tokens that the server can properly identify and use to enforce permission validations. + + +## Design notes +The server-side implementation of the authorization functionality is defined [here](./../../../sdk/python/feast/permissions/server). +Few of the key models, classes to understand the authorization implementation on the client side can be found [here](./../../../sdk/python/feast/permissions/client). + +## Configuring Authorization +The authorization is configured using a dedicated `auth` section in the `feature_store.yaml` configuration. + +**Note**: As a consequence, when deploying the Feast servers with the Helm [charts](../../../infra/charts/feast-feature-server/README.md), +the `feature_store_yaml_base64` value must include the `auth` section to specify the authorization configuration. + +### No Authorization +This configuration applies the default `no_auth` authorization: +```yaml +project: my-project +auth: + type: no_auth +... +``` + +### OIDC Authorization +With OIDC authorization, the Feast client proxies retrieve the JWT token from an OIDC server (or [Identity Provider](https://openid.net/developers/how-connect-works/)) +and append it in every request to a Feast server, using an [Authorization Bearer Token](https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication#bearer). + +The server, in turn, uses the same OIDC server to validate the token and extract the user roles from the token itself. + +Some assumptions are made in the OIDC server configuration: +* The OIDC token refers to a client with roles matching the RBAC roles of the configured `Permission`s (*) +* The roles are exposed in the access token passed to the server + +(*) Please note that **the role match is case-sensitive**, e.g. the name of the role in the OIDC server and in the `Permission` configuration +must be exactly the same. + +For example, the access token for a client `app` of a user with `reader` role should have the following `resource_access` section: +```json +{ + "resource_access": { + "app": { + "roles": [ + "reader" + ] + }, +} +``` + +An example of OIDC authorization configuration is the following: +```yaml +project: my-project +auth: + type: oidc + client_id: _CLIENT_ID__ + client_secret: _CLIENT_SECRET__ + realm: _REALM__ + auth_server_url: _OIDC_SERVER_URL_ + auth_discovery_url: _OIDC_SERVER_URL_/realms/master/.well-known/openid-configuration +... +``` + +In case of client configuration, the following settings must be added to specify the current user: +```yaml +auth: + ... + username: _USERNAME_ + password: _PASSWORD_ +``` + +### Kubernetes RBAC Authorization +With Kubernetes RBAC Authorization, the client uses the service account token as the authorizarion bearer token, and the +server fetches the associated roles from the Kubernetes RBAC resources. + +An example of Kubernetes RBAC authorization configuration is the following: +{% hint style="info" %} +**NOTE**: This configuration will only work if you deploy feast on Openshift or a Kubernetes platform. +{% endhint %} +```yaml +project: my-project +auth: + type: kubernetes +... +``` -**TODO** Working assumptions for the auth manager implementations (e.g. bearer tokens) -**TODO** Instruct how to configure it in the servers -**TODO** Instruct how to configure it in the helm releases +In case the client cannot run on the same cluster as the servers, the client token can be injected using the `LOCAL_K8S_TOKEN` +environment variable on the client side. The value must refer to the token of a service account created on the servers cluster +and linked to the desired RBAC roles. \ No newline at end of file diff --git a/docs/getting-started/concepts/permission.md b/docs/getting-started/concepts/permission.md index a5c13ecb73..1b8060a2e4 100644 --- a/docs/getting-started/concepts/permission.md +++ b/docs/getting-started/concepts/permission.md @@ -20,7 +20,7 @@ The permission model is based on the following components: - We assume that the resource has a `name` attribute and optional dictionary of associated key-value `tags`. - An `action` is a logical operation executed on the secured resource, like: - `create`: Create an instance. - - `read`: Access the instance state. + - `describe`: Access the instance state. - `update`: Update the instance state. - `delete`: Delete an instance. - `query`: Query both online and offline stores. @@ -61,9 +61,9 @@ The `feast` CLI includes a new `permissions` command to list the registered perm **Note**: Feast resources that do not match any of the configured permissions are not secured by any authorization policy, meaning any user can execute any action on such resources. {% endhint %} -## Configuration examples -This permission configuration allows access to the resource state and the ability to query all the stores for any feature view or feature service -to all users with role `super-reader`: +## Definition examples +This permission definition grants access to the resource state and the ability to query all the stores for any feature view or +feature service to all users with role `super-reader`: ```py Permission( name="feature-reader", @@ -100,52 +100,12 @@ Permission( ) ``` -## Authorizing Feast clients -If you would like to leverage the permissions' functionality then `auth` config block should be added to feature_store.yaml. Currently, feast supports oidc and kubernetes rbac authentication/authorization. - -The default configuration if you don't mention the auth configuration is no_auth configuration. - -* No auth configuration example: -```yaml -project: foo -registry: "registry.db" -provider: local -online_store: - path: foo -entity_key_serialization_version: 2 -auth: - type: no_auth -``` +## Authorization configuration +In order to leverage the permission functionality, the `auth` section is needed in the `feature_store.yaml` configuration. +Currently, Feast supports OIDC and Kubernetes RBAC authorization protocols. -* Kubernetes rbac authentication/authorization example: -{% hint style="info" %} -**NOTE**: This configuration will only work if you deploy feast on Openshift or a Kubernetes platform. -{% endhint %} -```yaml -project: foo -registry: "registry.db" -provider: local -online_store: - path: foo -entity_key_serialization_version: 2 -auth: - type: kubernetes -``` -* OIDC authorization: Below configuration is an example for OIDC authorization example. -```yaml -project: foo -auth: - type: oidc - client_id: test_client_id - client_secret: test_client_secret - username: test_user_name - password: test_password - realm: master - auth_discovery_url: http://localhost:8080/realms/master/.well-known/openid-configuration -registry: "registry.db" -provider: local -online_store: - path: foo -entity_key_serialization_version: 2 -``` -Few of the key models, classes to understand the authorization implementation from the clients can be found [here](./../../../sdk/python/feast/permissions/client). \ No newline at end of file +The default configuration, if you don't specify the `auth` configuration section, is `no_auth`, indicating that no permission +enforcement is applied. + +The `auth` section includes a `type` field specifying the actual authorization protocol, and protocol-specific fields that +are specified in [Authorization Manager](../components/authz_manager.md). From 3a4f1220a077bfaf00e8ffcbe73b411894335f2e Mon Sep 17 00:00:00 2001 From: Abdul Hameed Date: Mon, 19 Aug 2024 12:25:17 -0400 Subject: [PATCH 162/169] fix the linter and remove subclass from doc Signed-off-by: Abdul Hameed --- docs/reference/feast-cli-commands.md | 1 - sdk/python/feast/registry_server.py | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/docs/reference/feast-cli-commands.md b/docs/reference/feast-cli-commands.md index 3a743c0332..be31720034 100644 --- a/docs/reference/feast-cli-commands.md +++ b/docs/reference/feast-cli-commands.md @@ -209,7 +209,6 @@ feast permissions describe permission-name name: permission-name types: - FEATURE_VIEW -withSubclasses: true namePattern: transformed_conv_rate requiredTags: required1: required-value1 diff --git a/sdk/python/feast/registry_server.py b/sdk/python/feast/registry_server.py index f231e27abc..497036dfa3 100644 --- a/sdk/python/feast/registry_server.py +++ b/sdk/python/feast/registry_server.py @@ -1,7 +1,6 @@ from concurrent import futures -from datetime import datetime -from typing import Union, cast from datetime import datetime, timezone +from typing import Union, cast import grpc from google.protobuf.empty_pb2 import Empty From acf2190235fb8bb80ea86702ea2b2013ada37edb Mon Sep 17 00:00:00 2001 From: Abdul Hameed Date: Tue, 20 Aug 2024 09:44:32 -0400 Subject: [PATCH 163/169] addressed the pr reivew comments Signed-off-by: Abdul Hameed --- docs/getting-started/concepts/permission.md | 4 ++-- sdk/python/feast/feature_server.py | 20 ++++++++++---------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/getting-started/concepts/permission.md b/docs/getting-started/concepts/permission.md index 1b8060a2e4..0d3ad997b4 100644 --- a/docs/getting-started/concepts/permission.md +++ b/docs/getting-started/concepts/permission.md @@ -26,7 +26,7 @@ The permission model is based on the following components: - `query`: Query both online and offline stores. - `query_online`: Query the online store. - `query_offline`: Query the offline store. - - `write`: Query on any store. + - `write`: Write on any store. - `write_online`: Write to the online store. - `write_offline`: Write to the offline store. - A `policy` identifies the rule for enforcing authorization decisions on secured resources, based on the current user. @@ -50,7 +50,7 @@ To simplify configuration, several constants are defined to streamline the permi - `ALL_ACTIONS` is the list of all managed actions. - `QUERY` includes all the query actions for online and offline store. - `WRITE` includes all the write actions for online and offline store. - - `CRUD` includes all the state management actions to create, read, update or delete a Feast resource. + - `CRUD` includes all the state management actions to create, describe, update or delete a Feast resource. Given the above definitions, the feature store can be configured with granular control over each resource, enabling partitioned access by teams to meet organizational requirements for service and data sharing, and protection of sensitive information. diff --git a/sdk/python/feast/feature_server.py b/sdk/python/feast/feature_server.py index ee16fd1c92..3fe090d00b 100644 --- a/sdk/python/feast/feature_server.py +++ b/sdk/python/feast/feature_server.py @@ -311,15 +311,15 @@ def load(self): def monitor_resources(self, interval: int = 5): """Function to monitor and update CPU and memory usage metrics.""" - print(f"Start monitor_resources({interval})") + logger.debug(f"Starting resource monitoring with interval {interval} seconds") p = psutil.Process() - print(f"PID is {p.pid}") + logger.debug(f"PID is {p.pid}") while True: with p.oneshot(): cpu_usage = p.cpu_percent() memory_usage = p.memory_percent() - print(f"cpu_usage is {cpu_usage}") - print(f"memory_usage is {memory_usage}") + logger.debug(f"CPU usage: {cpu_usage}%, Memory usage: {memory_usage}%") + logger.debug(f"CPU usage: {cpu_usage}%, Memory usage: {memory_usage}%") cpu_usage_gauge.set(cpu_usage) memory_usage_gauge.set(memory_usage) time.sleep(interval) @@ -336,26 +336,26 @@ def start_server( metrics: bool, ): if metrics: - print("Start Prometheus Server") + logger.info("Starting Prometheus Server") start_http_server(8000) - print("Start a background thread to monitor CPU and memory usage") + logger.debug("Starting background thread to monitor CPU and memory usage") monitoring_thread = threading.Thread( target=monitor_resources, args=(5,), daemon=True ) monitoring_thread.start() - print("start_server called ") + logger.debug("start_server called") auth_type = str_to_auth_manager_type(store.config.auth_config.type) - print(f"auth_type is {auth_type}") + logger.info(f"Auth type: {auth_type}") init_security_manager(auth_type=auth_type, fs=store) - print("init_security_manager OK ") + logger.debug("Security manager initialized successfully") init_auth_manager( auth_type=auth_type, server_type=ServerType.REST, auth_config=store.config.auth_config, ) - print("init_auth_manager OK ") + logger.debug("Auth manager initialized successfully") if sys.platform != "win32": FeastServeApplication( From 136719e469e2a5360edf8013f75c1f03adb129e1 Mon Sep 17 00:00:00 2001 From: Lokesh Rangineni <19699092+lokeshrangineni@users.noreply.github.com> Date: Mon, 19 Aug 2024 16:31:14 -0400 Subject: [PATCH 164/169] Incorporating code review comment and this file is not needed. Signed-off-by: Lokesh Rangineni <19699092+lokeshrangineni@users.noreply.github.com> --- .../integration/permissions/test_auth_permission.py | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 sdk/python/tests/integration/permissions/test_auth_permission.py diff --git a/sdk/python/tests/integration/permissions/test_auth_permission.py b/sdk/python/tests/integration/permissions/test_auth_permission.py deleted file mode 100644 index 32b8795952..0000000000 --- a/sdk/python/tests/integration/permissions/test_auth_permission.py +++ /dev/null @@ -1,9 +0,0 @@ -# @pytest.mark.integration -# def test_oidc_auth_permissions(start_keycloak_server, temp_dir): -# print("starting the test") -# ## TODO: -# # 1 create the store -# # 2 create the permissions -# # 3 Spin up feature server -# # 4 test remote online read with no auth and oidc auth. -# # 5 spin up the registry server and test the no auth and oidc auth on all end points. From 9e3efe2ee62cacac39f84166055e6382a783ab2f Mon Sep 17 00:00:00 2001 From: Abdul Hameed Date: Tue, 20 Aug 2024 13:59:19 -0400 Subject: [PATCH 165/169] Addressed the review comments on the PR Signed-off-by: Abdul Hameed --- docs/getting-started/architecture/README.md | 4 + docs/getting-started/architecture/overview.md | 4 + docs/getting-started/architecture/rbac.jpg | Bin 0 -> 251818 bytes docs/getting-started/architecture/rbac.md | 133 ++++++++++++++++++ sdk/python/feast/permissions/action.py | 2 +- sdk/python/feast/permissions/decision.py | 2 +- sdk/python/feast/repo_config.py | 6 +- .../infra/scaffolding/test_repo_config.py | 2 +- 8 files changed, 147 insertions(+), 6 deletions(-) create mode 100644 docs/getting-started/architecture/rbac.jpg create mode 100644 docs/getting-started/architecture/rbac.md diff --git a/docs/getting-started/architecture/README.md b/docs/getting-started/architecture/README.md index f824164339..030bc62f4c 100644 --- a/docs/getting-started/architecture/README.md +++ b/docs/getting-started/architecture/README.md @@ -23,3 +23,7 @@ {% content-ref url="model-inference.md" %} [model-inference.md](model-inference.md) {% endcontent-ref %} + +{% content-ref url="rbac.md" %} +[rbac.md](rbac.md) +{% endcontent-ref %} \ No newline at end of file diff --git a/docs/getting-started/architecture/overview.md b/docs/getting-started/architecture/overview.md index 44fa5ac260..3a8ba67dcf 100644 --- a/docs/getting-started/architecture/overview.md +++ b/docs/getting-started/architecture/overview.md @@ -17,3 +17,7 @@ typically your Offline Store). We are exploring adding a default streaming engin write patterns](write-patterns.md) to your application * We recommend [using Python](language.md) for your Feature Store microservice. As mentioned in the document, precomputing features is the recommended optimal path to ensure low latency performance. Reducing feature serving to a lightweight database lookup is the ideal pattern, which means the marginal overhead of Python should be tolerable. Because of this we believe the pros of Python outweigh the costs, as reimplementing feature logic is undesirable. Java and Go Clients are also available for online feature retrieval. + +* Role-Based Access Control (RBAC)[rbac.md](rbac.md) is a security mechanism that restricts access to resources based on the roles of individual users within an organization. In the context of the Feast Feature Store, RBAC ensures that only authorized users or groups can access or modify specific resources, thereby maintaining data security and operational integrity. + + diff --git a/docs/getting-started/architecture/rbac.jpg b/docs/getting-started/architecture/rbac.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0de87d1718cdbe012f0c83021d406b83b0ce1442 GIT binary patch literal 251818 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�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%0A2|e;UV5T!! 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%0D#B8 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 = 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 literal 0 HcmV?d00001 From 444ae715d236c141652883b374e3e414529099e4 Mon Sep 17 00:00:00 2001 From: Lokesh Rangineni Date: Fri, 2 Aug 2024 00:23:53 -0400 Subject: [PATCH 115/169] Adding permissions directly instead of from the common place for the online read integration tests. Cleaned up some minor changes to fix the unpredictable issue with the feature server process. Signed-off-by: Lokesh Rangineni Signed-off-by: Lokesh Rangineni Signed-off-by: Abdul Hameed --- sdk/python/feast/feature_server.py | 3 +- .../feast/infra/online_stores/remote.py | 8 +-- .../online_store/test_remote_online_store.py | 59 +++++++++++++------ .../tests/utils/auth_permissions_util.py | 2 +- 4 files changed, 49 insertions(+), 23 deletions(-) diff --git a/sdk/python/feast/feature_server.py b/sdk/python/feast/feature_server.py index ee16fd1c92..3016476bd7 100644 --- a/sdk/python/feast/feature_server.py +++ b/sdk/python/feast/feature_server.py @@ -19,7 +19,8 @@ from feast import proto_json, utils from feast.constants import DEFAULT_FEATURE_SERVER_REGISTRY_TTL from feast.data_source import PushMode -from feast.errors import FeatureViewNotFoundException, PushSourceNotFoundException +from feast.errors import (FeatureViewNotFoundException, + PushSourceNotFoundException) from feast.permissions.action import WRITE, AuthzedAction from feast.permissions.security_manager import assert_permissions from feast.permissions.server.rest import inject_user_details diff --git a/sdk/python/feast/infra/online_stores/remote.py b/sdk/python/feast/infra/online_stores/remote.py index 93fbcaf771..f7efd8ac7c 100644 --- a/sdk/python/feast/infra/online_stores/remote.py +++ b/sdk/python/feast/infra/online_stores/remote.py @@ -14,15 +14,15 @@ import json import logging from datetime import datetime -from typing import Any, Callable, Dict, List, Literal, Optional, Sequence, Tuple +from typing import (Any, Callable, Dict, List, Literal, Optional, Sequence, + Tuple) from pydantic import StrictStr from feast import Entity, FeatureView, RepoConfig from feast.infra.online_stores.online_store import OnlineStore -from feast.permissions.client.http_auth_requests_wrapper import ( - get_http_auth_requests_session, -) +from feast.permissions.client.http_auth_requests_wrapper import \ + get_http_auth_requests_session from feast.protos.feast.types.EntityKey_pb2 import EntityKey as EntityKeyProto from feast.protos.feast.types.Value_pb2 import Value as ValueProto from feast.repo_config import FeastConfigBaseModel diff --git a/sdk/python/tests/integration/online_store/test_remote_online_store.py b/sdk/python/tests/integration/online_store/test_remote_online_store.py index 737eaeac3e..a4d1216298 100644 --- a/sdk/python/tests/integration/online_store/test_remote_online_store.py +++ b/sdk/python/tests/integration/online_store/test_remote_online_store.py @@ -3,31 +3,56 @@ from textwrap import dedent import pytest - -from feast.feature_store import FeatureStore -from tests.utils.auth_permissions_util import ( - PROJECT_NAME, - default_store, - list_entities_perm, - list_fv_perm, - list_odfv_perm, - list_permissions_perm, - list_sfv_perm, - start_feature_server, -) +from tests.utils.auth_permissions_util import (PROJECT_NAME, default_store, + start_feature_server) from tests.utils.cli_repo_creator import CliRunner from tests.utils.http_server import free_port +from feast import Entity, FeatureView, OnDemandFeatureView, StreamFeatureView +from feast.feature_store import FeatureStore +from feast.permissions.action import AuthzedAction +from feast.permissions.permission import Permission +from feast.permissions.policy import RoleBasedPolicy + @pytest.mark.integration def test_remote_online_store_read(auth_config): with tempfile.TemporaryDirectory() as remote_server_tmp_dir, tempfile.TemporaryDirectory() as remote_client_tmp_dir: permissions_list = [ - list_entities_perm, - list_permissions_perm, - list_fv_perm, - list_odfv_perm, - list_sfv_perm, + Permission( + name="online_list_entities_perm", + types=Entity, + with_subclasses=False, + policy=RoleBasedPolicy(roles=["reader"]), + actions=[AuthzedAction.READ, AuthzedAction.QUERY_OFFLINE], + ), + Permission( + name="online_list_permissions_perm", + types=Permission, + policy=RoleBasedPolicy(roles=["reader"]), + actions=[AuthzedAction.READ, AuthzedAction.QUERY_OFFLINE], + ), + Permission( + name="online_list_fv_perm", + types=FeatureView, + with_subclasses=False, + policy=RoleBasedPolicy(roles=["reader"]), + actions=[AuthzedAction.READ, AuthzedAction.QUERY_OFFLINE], + ), + Permission( + name="online_list_odfv_perm", + types=OnDemandFeatureView, + with_subclasses=False, + policy=RoleBasedPolicy(roles=["reader"]), + actions=[AuthzedAction.READ, AuthzedAction.QUERY_OFFLINE], + ), + Permission( + name="online_list_sfv_perm", + types=StreamFeatureView, + with_subclasses=False, + policy=RoleBasedPolicy(roles=["reader"]), + actions=[AuthzedAction.READ, AuthzedAction.QUERY_OFFLINE], + ), ] server_store, server_url, registry_path = ( _create_server_store_spin_feature_server( diff --git a/sdk/python/tests/utils/auth_permissions_util.py b/sdk/python/tests/utils/auth_permissions_util.py index ce51b56a3a..b7873c1f4d 100644 --- a/sdk/python/tests/utils/auth_permissions_util.py +++ b/sdk/python/tests/utils/auth_permissions_util.py @@ -119,7 +119,7 @@ def start_feature_server(repo_path: str, server_port: int): str(server_port), ] feast_server_process = subprocess.Popen( - cmd, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL + cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE ) _time_out_sec: int = 60 # Wait for server to start From 86ec1334d8e5a9b22532dcfd4da91d01f4b1294f Mon Sep 17 00:00:00 2001 From: Lokesh Rangineni Date: Fri, 2 Aug 2024 01:04:54 -0400 Subject: [PATCH 116/169] Initial Draft version to the tests with remote offline server with OIDC authentication permissions. Happy path only. Signed-off-by: Lokesh Rangineni Signed-off-by: Abdul Hameed --- .../feature_repos/repo_configuration.py | 161 +++++++++-------- .../universal/data_sources/file.py | 169 ++++++++++++++---- .../test_universal_historical_retrieval.py | 43 ++--- .../tests/utils/auth_permissions_util.py | 12 +- 4 files changed, 245 insertions(+), 140 deletions(-) diff --git a/sdk/python/tests/integration/feature_repos/repo_configuration.py b/sdk/python/tests/integration/feature_repos/repo_configuration.py index 48f5070f1e..4776328f42 100644 --- a/sdk/python/tests/integration/feature_repos/repo_configuration.py +++ b/sdk/python/tests/integration/feature_repos/repo_configuration.py @@ -10,67 +10,55 @@ import pandas as pd import pytest - -from feast import FeatureStore, FeatureView, OnDemandFeatureView, driver_test_data -from feast.constants import FULL_REPO_CONFIGS_MODULE_ENV_NAME -from feast.data_source import DataSource -from feast.errors import FeastModuleImportError -from feast.infra.feature_servers.base_config import ( - BaseFeatureServerConfig, - FeatureLoggingConfig, -) -from feast.infra.feature_servers.local_process.config import LocalFeatureServerConfig -from feast.repo_config import RegistryConfig, RepoConfig -from feast.utils import _utc_now from tests.integration.feature_repos.integration_test_repo_config import ( - IntegrationTestRepoConfig, - RegistryLocation, -) -from tests.integration.feature_repos.universal.data_source_creator import ( - DataSourceCreator, -) -from tests.integration.feature_repos.universal.data_sources.bigquery import ( - BigQueryDataSourceCreator, -) + IntegrationTestRepoConfig, RegistryLocation) +from tests.integration.feature_repos.universal.data_source_creator import \ + DataSourceCreator +from tests.integration.feature_repos.universal.data_sources.bigquery import \ + BigQueryDataSourceCreator from tests.integration.feature_repos.universal.data_sources.file import ( - DuckDBDataSourceCreator, - DuckDBDeltaDataSourceCreator, - FileDataSourceCreator, - RemoteOfflineStoreDataSourceCreator, -) -from tests.integration.feature_repos.universal.data_sources.redshift import ( - RedshiftDataSourceCreator, -) -from tests.integration.feature_repos.universal.data_sources.snowflake import ( - SnowflakeDataSourceCreator, -) + DuckDBDataSourceCreator, DuckDBDeltaDataSourceCreator, + FileDataSourceCreator, RemoteOfflineOidcAuthStoreDataSourceCreator, + RemoteOfflineStoreDataSourceCreator) +from tests.integration.feature_repos.universal.data_sources.redshift import \ + RedshiftDataSourceCreator +from tests.integration.feature_repos.universal.data_sources.snowflake import \ + SnowflakeDataSourceCreator from tests.integration.feature_repos.universal.feature_views import ( - conv_rate_plus_100_feature_view, - create_conv_rate_request_source, + conv_rate_plus_100_feature_view, create_conv_rate_request_source, create_customer_daily_profile_feature_view, create_driver_hourly_stats_batch_feature_view, - create_driver_hourly_stats_feature_view, - create_field_mapping_feature_view, - create_global_stats_feature_view, - create_location_stats_feature_view, - create_order_feature_view, - create_pushable_feature_view, -) -from tests.integration.feature_repos.universal.online_store.bigtable import ( - BigtableOnlineStoreCreator, -) -from tests.integration.feature_repos.universal.online_store.datastore import ( - DatastoreOnlineStoreCreator, -) -from tests.integration.feature_repos.universal.online_store.dynamodb import ( - DynamoDBOnlineStoreCreator, -) -from tests.integration.feature_repos.universal.online_store.redis import ( - RedisOnlineStoreCreator, -) -from tests.integration.feature_repos.universal.online_store_creator import ( - OnlineStoreCreator, -) + create_driver_hourly_stats_feature_view, create_field_mapping_feature_view, + create_global_stats_feature_view, create_location_stats_feature_view, + create_order_feature_view, create_pushable_feature_view) +from tests.integration.feature_repos.universal.online_store.bigtable import \ + BigtableOnlineStoreCreator +from tests.integration.feature_repos.universal.online_store.datastore import \ + DatastoreOnlineStoreCreator +from tests.integration.feature_repos.universal.online_store.dynamodb import \ + DynamoDBOnlineStoreCreator +from tests.integration.feature_repos.universal.online_store.redis import \ + RedisOnlineStoreCreator +from tests.integration.feature_repos.universal.online_store_creator import \ + OnlineStoreCreator +from tests.utils.auth_permissions_util import ( + list_entities_perm, + list_fv_perm, list_odfv_perm, + list_permissions_perm, + list_sfv_perm) + +from feast import (FeatureStore, FeatureView, OnDemandFeatureView, + driver_test_data) +from feast.constants import FULL_REPO_CONFIGS_MODULE_ENV_NAME +from feast.data_source import DataSource +from feast.errors import FeastModuleImportError +from feast.infra.feature_servers.base_config import (BaseFeatureServerConfig, + FeatureLoggingConfig) +from feast.infra.feature_servers.local_process.config import \ + LocalFeatureServerConfig +from feast.permissions.auth_model import OidcAuthConfig +from feast.repo_config import RegistryConfig, RepoConfig +from feast.utils import _utc_now DYNAMO_CONFIG = {"type": "dynamodb", "region": "us-west-2"} REDIS_CONFIG = {"type": "redis", "connection_string": "localhost:6379,db=0"} @@ -124,6 +112,7 @@ ("local", DuckDBDataSourceCreator), ("local", DuckDBDeltaDataSourceCreator), ("local", RemoteOfflineStoreDataSourceCreator), + ("local", RemoteOfflineOidcAuthStoreDataSourceCreator), ] if os.getenv("FEAST_IS_LOCAL_TEST", "False") == "True": @@ -134,7 +123,6 @@ ] ) - AVAILABLE_ONLINE_STORES: Dict[ str, Tuple[Union[str, Dict[Any, Any]], Optional[Type[OnlineStoreCreator]]] ] = {"sqlite": ({"type": "sqlite"}, None)} @@ -164,7 +152,6 @@ # containerized version of IKV. # AVAILABLE_ONLINE_STORES["ikv"] = (IKV_CONFIG, None) - full_repo_configs_module = os.environ.get(FULL_REPO_CONFIGS_MODULE_ENV_NAME) if full_repo_configs_module is not None: try: @@ -200,7 +187,6 @@ for c in FULL_REPO_CONFIGS } - # Replace online stores with emulated online stores if we're running local integration tests if os.getenv("FEAST_LOCAL_ONLINE_CONTAINER", "False").lower() == "true": replacements: Dict[ @@ -244,7 +230,7 @@ class UniversalDatasets: def construct_universal_datasets( - entities: UniversalEntities, start_time: datetime, end_time: datetime + entities: UniversalEntities, start_time: datetime, end_time: datetime ) -> UniversalDatasets: customer_df = driver_test_data.create_customer_daily_profile_df( entities.customer_vals, start_time, end_time @@ -301,7 +287,7 @@ def values(self): def construct_universal_data_sources( - datasets: UniversalDatasets, data_source_creator: DataSourceCreator + datasets: UniversalDatasets, data_source_creator: DataSourceCreator ) -> UniversalDataSources: customer_ds = data_source_creator.create_data_source( datasets.customer_df, @@ -366,9 +352,9 @@ def values(self): def construct_universal_feature_views( - data_sources: UniversalDataSources, - with_odfv: bool = True, - use_substrait_odfv: bool = False, + data_sources: UniversalDataSources, + with_odfv: bool = True, + use_substrait_odfv: bool = False, ) -> UniversalFeatureViews: driver_hourly_stats = create_driver_hourly_stats_feature_view(data_sources.driver) driver_hourly_stats_base_feature_view = ( @@ -411,6 +397,7 @@ class Environment: entity_key_serialization_version: int repo_dir_name: str fixture_request: Optional[pytest.FixtureRequest] = None + permissions: Optional[List] = None def __post_init__(self): self.end_date = _utc_now().replace(microsecond=0, second=0, minute=0) @@ -432,7 +419,30 @@ def setup(self): feature_server=self.feature_server, entity_key_serialization_version=self.entity_key_serialization_version, ) - self.feature_store = FeatureStore(config=self.config) + + if isinstance( + self.data_source_creator, RemoteOfflineOidcAuthStoreDataSourceCreator + ): + keycloak_url = self.data_source_creator.get_keycloak_url() + auth_config = OidcAuthConfig(client_id="feast-integration-client", + client_secret="feast-integration-client-secret", + username="reader_writer", password="password", realm="master", + type="oidc", + auth_server_url=self.data_source_creator.get_keycloak_url(), + auth_discovery_url=f"{keycloak_url}/realms/master/.well-known" + f"/openid-configuration") + self.config.auth = auth_config + self.feature_store = FeatureStore(config=self.config) + permissions_list = [ + list_entities_perm, + list_permissions_perm, + list_fv_perm, + list_odfv_perm, + list_sfv_perm, + ] + self.feature_store.apply(permissions_list) + else: + self.feature_store = FeatureStore(config=self.config) def teardown(self): self.feature_store.teardown() @@ -441,6 +451,15 @@ def teardown(self): self.online_store_creator.teardown() +@dataclass +class PermissionsEnvironment(Environment): + def setup(self): + super().setup() + + + + + def table_name_from_data_source(ds: DataSource) -> Optional[str]: if hasattr(ds, "table_ref"): return ds.table_ref # type: ignore @@ -450,11 +469,12 @@ def table_name_from_data_source(ds: DataSource) -> Optional[str]: def construct_test_environment( - test_repo_config: IntegrationTestRepoConfig, - fixture_request: Optional[pytest.FixtureRequest], - test_suite_name: str = "integration_test", - worker_id: str = "worker_id", - entity_key_serialization_version: int = 2, + test_repo_config: IntegrationTestRepoConfig, + fixture_request: Optional[pytest.FixtureRequest], + permissions: Optional[List] = None, + test_suite_name: str = "integration_test", + worker_id: str = "worker_id", + entity_key_serialization_version: int = 2, ) -> Environment: _uuid = str(uuid.uuid4()).replace("-", "")[:6] @@ -506,6 +526,7 @@ def construct_test_environment( repo_dir_name=repo_dir_name, batch_engine=test_repo_config.batch_engine, online_store=test_repo_config.online_store, + permissions=permissions ) return environment diff --git a/sdk/python/tests/integration/feature_repos/universal/data_sources/file.py b/sdk/python/tests/integration/feature_repos/universal/data_sources/file.py index e505986350..fdb25e4efb 100644 --- a/sdk/python/tests/integration/feature_repos/universal/data_sources/file.py +++ b/sdk/python/tests/integration/feature_repos/universal/data_sources/file.py @@ -15,7 +15,13 @@ from minio import Minio from testcontainers.core.generic import DockerContainer from testcontainers.core.waiting_utils import wait_for_logs +from testcontainers.keycloak import KeycloakContainer from testcontainers.minio import MinioContainer +from tests.integration.feature_repos.universal.data_source_creator import \ + DataSourceCreator +from tests.utils.auth_permissions_util import (include_auth_config, + setup_permissions_on_keycloak) +from tests.utils.http_server import check_port_open, free_port # noqa: E402 from feast import FileSource, RepoConfig from feast.data_format import DeltaFormat, ParquetFormat @@ -23,17 +29,11 @@ from feast.feature_logging import LoggingDestination from feast.infra.offline_stores.dask import DaskOfflineStoreConfig from feast.infra.offline_stores.duckdb import DuckDBOfflineStoreConfig -from feast.infra.offline_stores.file_source import ( - FileLoggingDestination, - SavedDatasetFileStorage, -) +from feast.infra.offline_stores.file_source import (FileLoggingDestination, + SavedDatasetFileStorage) from feast.infra.offline_stores.remote import RemoteOfflineStoreConfig from feast.repo_config import FeastConfigBaseModel, RegistryConfig from feast.wait import wait_retry_backoff # noqa: E402 -from tests.integration.feature_repos.universal.data_source_creator import ( - DataSourceCreator, -) -from tests.utils.http_server import check_port_open, free_port # noqa: E402 logger = logging.getLogger(__name__) @@ -50,12 +50,12 @@ def __init__(self, project_name: str, *args, **kwargs): self.keep = [] def create_data_source( - self, - df: pd.DataFrame, - destination_name: str, - created_timestamp_column="created_ts", - field_mapping: Optional[Dict[str, str]] = None, - timestamp_field: Optional[str] = "ts", + self, + df: pd.DataFrame, + destination_name: str, + created_timestamp_column="created_ts", + field_mapping: Optional[Dict[str, str]] = None, + timestamp_field: Optional[str] = "ts", ) -> DataSource: destination_name = self.get_prefixed_table_name(destination_name) @@ -104,12 +104,12 @@ def teardown(self): class DeltaFileSourceCreator(FileDataSourceCreator): def create_data_source( - self, - df: pd.DataFrame, - destination_name: str, - created_timestamp_column="created_ts", - field_mapping: Optional[Dict[str, str]] = None, - timestamp_field: Optional[str] = "ts", + self, + df: pd.DataFrame, + destination_name: str, + created_timestamp_column="created_ts", + field_mapping: Optional[Dict[str, str]] = None, + timestamp_field: Optional[str] = "ts", ) -> DataSource: from deltalake.writer import write_deltalake @@ -167,12 +167,12 @@ def __init__(self, project_name: str, *args, **kwargs): } def create_data_source( - self, - df: pd.DataFrame, - destination_name: str, - created_timestamp_column="created_ts", - field_mapping: Optional[Dict[str, str]] = None, - timestamp_field: Optional[str] = "ts", + self, + df: pd.DataFrame, + destination_name: str, + created_timestamp_column="created_ts", + field_mapping: Optional[Dict[str, str]] = None, + timestamp_field: Optional[str] = "ts", ) -> DataSource: from deltalake.writer import write_deltalake @@ -216,12 +216,12 @@ def teardown(self): class FileParquetDatasetSourceCreator(FileDataSourceCreator): def create_data_source( - self, - df: pd.DataFrame, - destination_name: str, - created_timestamp_column="created_ts", - field_mapping: Optional[Dict[str, str]] = None, - timestamp_field: Optional[str] = "ts", + self, + df: pd.DataFrame, + destination_name: str, + created_timestamp_column="created_ts", + field_mapping: Optional[Dict[str, str]] = None, + timestamp_field: Optional[str] = "ts", ) -> DataSource: destination_name = self.get_prefixed_table_name(destination_name) @@ -289,12 +289,12 @@ def _upload_parquet_file(self, df, file_name, minio_endpoint): ) def create_data_source( - self, - df: pd.DataFrame, - destination_name: str, - created_timestamp_column="created_ts", - field_mapping: Optional[Dict[str, str]] = None, - timestamp_field: Optional[str] = "ts", + self, + df: pd.DataFrame, + destination_name: str, + created_timestamp_column="created_ts", + field_mapping: Optional[Dict[str, str]] = None, + timestamp_field: Optional[str] = "ts", ) -> DataSource: filename = f"{destination_name}.parquet" port = self.minio.get_exposed_port("9000") @@ -428,3 +428,96 @@ def teardown(self): ), timeout_secs=30, ) + + +class RemoteOfflineOidcAuthStoreDataSourceCreator(FileDataSourceCreator): + def __init__(self, project_name: str, *args, **kwargs): + super().__init__(project_name) + keycloak_url = self._setup_keycloak() + auth_config_template = """ +auth: + type: oidc + client_id: feast-integration-client + client_secret: feast-integration-client-secret + username: reader_writer + password: password + realm: master + auth_server_url: {keycloak_url} + auth_discovery_url: {keycloak_url}/realms/master/.well-known/openid-configuration +""" + self.auth_config = auth_config_template.format(keycloak_url=keycloak_url) + self.server_port: int = 0 + self.proc = None + + def _setup_keycloak(self): + self.keycloak_container = KeycloakContainer("quay.io/keycloak/keycloak:24.0.1") + self.keycloak_container.start() + setup_permissions_on_keycloak(self.keycloak_container.get_client()) + return self.keycloak_container.get_url() + + def setup(self, registry: RegistryConfig): + parent_offline_config = super().create_offline_store_config() + config = RepoConfig( + project=self.project_name, + provider="local", + offline_store=parent_offline_config, + registry=registry.path, + entity_key_serialization_version=2, + ) + + repo_path = Path(tempfile.mkdtemp()) + with open(repo_path / "feature_store.yaml", "w") as outfile: + yaml.dump(config.model_dump(by_alias=True), outfile) + repo_path = str(repo_path.resolve()) + + include_auth_config( + file_path=f"{repo_path}/feature_store.yaml", auth_config=self.auth_config + ) + + self.server_port = free_port() + host = "0.0.0.0" + cmd = [ + "feast", + "-c" + repo_path, + "serve_offline", + "--host", + host, + "--port", + str(self.server_port), + ] + self.proc = subprocess.Popen( + cmd, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL + ) + + _time_out_sec: int = 60 + # Wait for server to start + wait_retry_backoff( + lambda: (None, check_port_open(host, self.server_port)), + timeout_secs=_time_out_sec, + timeout_msg=f"Unable to start the feast remote offline server in {_time_out_sec} seconds at port={self.server_port}", + ) + return "grpc+tcp://{}:{}".format(host, self.server_port) + + def create_offline_store_config(self) -> FeastConfigBaseModel: + self.remote_offline_store_config = RemoteOfflineStoreConfig( + type="remote", host="0.0.0.0", port=self.server_port + ) + return self.remote_offline_store_config + + def get_keycloak_url(self): + return self.keycloak_container.get_url() + + def teardown(self): + super().teardown() + self.keycloak_container.stop() + if self.proc is not None: + self.proc.kill() + + # wait server to free the port + wait_retry_backoff( + lambda: ( + None, + not check_port_open("localhost", self.server_port), + ), + timeout_secs=30, + ) diff --git a/sdk/python/tests/integration/offline_store/test_universal_historical_retrieval.py b/sdk/python/tests/integration/offline_store/test_universal_historical_retrieval.py index ecaa5f40db..e6363fa0b2 100644 --- a/sdk/python/tests/integration/offline_store/test_universal_historical_retrieval.py +++ b/sdk/python/tests/integration/offline_store/test_universal_historical_retrieval.py @@ -5,39 +5,30 @@ import numpy as np import pandas as pd import pytest +from tests.integration.feature_repos.repo_configuration import ( + construct_universal_feature_views, table_name_from_data_source) +from tests.integration.feature_repos.universal.data_sources.file import ( + RemoteOfflineOidcAuthStoreDataSourceCreator, + RemoteOfflineStoreDataSourceCreator) +from tests.integration.feature_repos.universal.data_sources.snowflake import \ + SnowflakeDataSourceCreator +from tests.integration.feature_repos.universal.entities import (customer, + driver, + location) +from tests.utils.feature_records import ( + assert_feature_service_correctness, + assert_feature_service_entity_mapping_correctness, + get_expected_training_df, get_response_feature_name, validate_dataframes) from feast.entity import Entity from feast.errors import RequestDataNotFoundInEntityDfException from feast.feature_service import FeatureService from feast.feature_view import FeatureView from feast.field import Field -from feast.infra.offline_stores.offline_utils import ( - DEFAULT_ENTITY_DF_EVENT_TIMESTAMP_COL, -) +from feast.infra.offline_stores.offline_utils import \ + DEFAULT_ENTITY_DF_EVENT_TIMESTAMP_COL from feast.types import Float32, Int32 from feast.utils import _utc_now -from tests.integration.feature_repos.repo_configuration import ( - construct_universal_feature_views, - table_name_from_data_source, -) -from tests.integration.feature_repos.universal.data_sources.file import ( - RemoteOfflineStoreDataSourceCreator, -) -from tests.integration.feature_repos.universal.data_sources.snowflake import ( - SnowflakeDataSourceCreator, -) -from tests.integration.feature_repos.universal.entities import ( - customer, - driver, - location, -) -from tests.utils.feature_records import ( - assert_feature_service_correctness, - assert_feature_service_entity_mapping_correctness, - get_expected_training_df, - get_response_feature_name, - validate_dataframes, -) np.random.seed(0) @@ -162,7 +153,7 @@ def test_historical_features_main( ) if not isinstance( - environment.data_source_creator, RemoteOfflineStoreDataSourceCreator + environment.data_source_creator, (RemoteOfflineStoreDataSourceCreator, RemoteOfflineOidcAuthStoreDataSourceCreator) ): assert_feature_service_correctness( store, diff --git a/sdk/python/tests/utils/auth_permissions_util.py b/sdk/python/tests/utils/auth_permissions_util.py index b7873c1f4d..ec3693c376 100644 --- a/sdk/python/tests/utils/auth_permissions_util.py +++ b/sdk/python/tests/utils/auth_permissions_util.py @@ -26,7 +26,7 @@ name="list_permissions_perm", types=Permission, policy=RoleBasedPolicy(roles=["reader"]), - actions=[AuthzedAction.READ], + actions=[AuthzedAction.READ, AuthzedAction.QUERY_OFFLINE], ) list_entities_perm = Permission( @@ -34,7 +34,7 @@ types=Entity, with_subclasses=False, policy=RoleBasedPolicy(roles=["reader"]), - actions=[AuthzedAction.READ], + actions=[AuthzedAction.READ, AuthzedAction.QUERY_OFFLINE], ) list_fv_perm = Permission( @@ -42,7 +42,7 @@ types=FeatureView, with_subclasses=False, policy=RoleBasedPolicy(roles=["reader"]), - actions=[AuthzedAction.READ], + actions=[AuthzedAction.READ, AuthzedAction.QUERY_OFFLINE], ) list_odfv_perm = Permission( @@ -50,7 +50,7 @@ types=OnDemandFeatureView, with_subclasses=False, policy=RoleBasedPolicy(roles=["reader"]), - actions=[AuthzedAction.READ], + actions=[AuthzedAction.READ, AuthzedAction.QUERY_OFFLINE], ) list_sfv_perm = Permission( @@ -58,7 +58,7 @@ types=StreamFeatureView, with_subclasses=False, policy=RoleBasedPolicy(roles=["reader"]), - actions=[AuthzedAction.READ], + actions=[AuthzedAction.READ, AuthzedAction.QUERY_OFFLINE], ) invalid_list_entities_perm = Permission( @@ -66,7 +66,7 @@ types=Entity, with_subclasses=False, policy=RoleBasedPolicy(roles=["dancer"]), - actions=[AuthzedAction.READ], + actions=[AuthzedAction.READ, AuthzedAction.QUERY_OFFLINE], ) From 1fcb89d2658967c4e7973df06dfe74353d1dbb8c Mon Sep 17 00:00:00 2001 From: Lokesh Rangineni Date: Fri, 2 Aug 2024 02:46:52 -0400 Subject: [PATCH 117/169] Abstracting the specific code for Offline Permissions by creating new class for PermissionsEnvironment. Signed-off-by: Lokesh Rangineni Signed-off-by: Abdul Hameed --- .../feature_repos/repo_configuration.py | 103 ++++++++++-------- 1 file changed, 56 insertions(+), 47 deletions(-) diff --git a/sdk/python/tests/integration/feature_repos/repo_configuration.py b/sdk/python/tests/integration/feature_repos/repo_configuration.py index 4776328f42..fb345fc4d0 100644 --- a/sdk/python/tests/integration/feature_repos/repo_configuration.py +++ b/sdk/python/tests/integration/feature_repos/repo_configuration.py @@ -41,8 +41,7 @@ RedisOnlineStoreCreator from tests.integration.feature_repos.universal.online_store_creator import \ OnlineStoreCreator -from tests.utils.auth_permissions_util import ( - list_entities_perm, +from tests.utils.auth_permissions_util import (list_entities_perm, list_fv_perm, list_odfv_perm, list_permissions_perm, list_sfv_perm) @@ -420,29 +419,7 @@ def setup(self): entity_key_serialization_version=self.entity_key_serialization_version, ) - if isinstance( - self.data_source_creator, RemoteOfflineOidcAuthStoreDataSourceCreator - ): - keycloak_url = self.data_source_creator.get_keycloak_url() - auth_config = OidcAuthConfig(client_id="feast-integration-client", - client_secret="feast-integration-client-secret", - username="reader_writer", password="password", realm="master", - type="oidc", - auth_server_url=self.data_source_creator.get_keycloak_url(), - auth_discovery_url=f"{keycloak_url}/realms/master/.well-known" - f"/openid-configuration") - self.config.auth = auth_config - self.feature_store = FeatureStore(config=self.config) - permissions_list = [ - list_entities_perm, - list_permissions_perm, - list_fv_perm, - list_odfv_perm, - list_sfv_perm, - ] - self.feature_store.apply(permissions_list) - else: - self.feature_store = FeatureStore(config=self.config) + self.feature_store = FeatureStore(config=self.config) def teardown(self): self.feature_store.teardown() @@ -452,12 +429,42 @@ def teardown(self): @dataclass -class PermissionsEnvironment(Environment): - def setup(self): - super().setup() - +class OfflineServerPermissionsEnvironment(Environment): + def setup(self): + self.data_source_creator.setup(self.registry) + keycloak_url = self.data_source_creator.get_keycloak_url() + auth_config = OidcAuthConfig(client_id="feast-integration-client", + client_secret="feast-integration-client-secret", + username="reader_writer", password="password", realm="master", + type="oidc", + auth_server_url=self.data_source_creator.get_keycloak_url(), + auth_discovery_url=f"{keycloak_url}/realms/master/.well-known" + f"/openid-configuration") + self.config = RepoConfig( + registry=self.registry, + project=self.project, + provider=self.provider, + offline_store=self.data_source_creator.create_offline_store_config(), + online_store=self.online_store_creator.create_online_store() + if self.online_store_creator + else self.online_store, + batch_engine=self.batch_engine, + repo_path=self.repo_dir_name, + feature_server=self.feature_server, + entity_key_serialization_version=self.entity_key_serialization_version, + auth=auth_config + ) + self.feature_store = FeatureStore(config=self.config) + permissions_list = [ + list_entities_perm, + list_permissions_perm, + list_fv_perm, + list_odfv_perm, + list_sfv_perm, + ] + self.feature_store.apply(permissions_list) def table_name_from_data_source(ds: DataSource) -> Optional[str]: @@ -471,7 +478,6 @@ def table_name_from_data_source(ds: DataSource) -> Optional[str]: def construct_test_environment( test_repo_config: IntegrationTestRepoConfig, fixture_request: Optional[pytest.FixtureRequest], - permissions: Optional[List] = None, test_suite_name: str = "integration_test", worker_id: str = "worker_id", entity_key_serialization_version: int = 2, @@ -511,24 +517,27 @@ def construct_test_environment( cache_ttl_seconds=1, ) - environment = Environment( - name=project, - provider=test_repo_config.provider, - data_source_creator=offline_creator, - python_feature_server=test_repo_config.python_feature_server, - worker_id=worker_id, - online_store_creator=online_creator, - fixture_request=fixture_request, - project=project, - registry=registry, - feature_server=feature_server, - entity_key_serialization_version=entity_key_serialization_version, - repo_dir_name=repo_dir_name, - batch_engine=test_repo_config.batch_engine, - online_store=test_repo_config.online_store, - permissions=permissions - ) + environment_params = { + 'name': project, + 'provider': test_repo_config.provider, + 'data_source_creator': offline_creator, + 'python_feature_server': test_repo_config.python_feature_server, + 'worker_id': worker_id, + 'online_store_creator': online_creator, + 'fixture_request': fixture_request, + 'project': project, + 'registry': registry, + 'feature_server': feature_server, + 'entity_key_serialization_version': entity_key_serialization_version, + 'repo_dir_name': repo_dir_name, + 'batch_engine': test_repo_config.batch_engine, + 'online_store': test_repo_config.online_store, + } + if not isinstance(offline_creator, RemoteOfflineOidcAuthStoreDataSourceCreator): + environment = Environment(**environment_params) + else: + environment = OfflineServerPermissionsEnvironment(**environment_params) return environment From 787105b31a90bcd2abe93a1ea2a5735b0a38f3eb Mon Sep 17 00:00:00 2001 From: Lokesh Rangineni Date: Fri, 2 Aug 2024 02:49:02 -0400 Subject: [PATCH 118/169] Formatting the python files using make format-python. Signed-off-by: Lokesh Rangineni Signed-off-by: Abdul Hameed --- sdk/python/feast/feature_server.py | 3 +- .../feast/infra/online_stores/remote.py | 8 +- .../feature_repos/repo_configuration.py | 175 ++++++++++-------- .../universal/data_sources/file.py | 81 ++++---- .../test_universal_historical_retrieval.py | 48 +++-- .../online_store/test_remote_online_store.py | 11 +- .../tests/utils/auth_permissions_util.py | 2 +- 7 files changed, 187 insertions(+), 141 deletions(-) diff --git a/sdk/python/feast/feature_server.py b/sdk/python/feast/feature_server.py index 3016476bd7..ee16fd1c92 100644 --- a/sdk/python/feast/feature_server.py +++ b/sdk/python/feast/feature_server.py @@ -19,8 +19,7 @@ from feast import proto_json, utils from feast.constants import DEFAULT_FEATURE_SERVER_REGISTRY_TTL from feast.data_source import PushMode -from feast.errors import (FeatureViewNotFoundException, - PushSourceNotFoundException) +from feast.errors import FeatureViewNotFoundException, PushSourceNotFoundException from feast.permissions.action import WRITE, AuthzedAction from feast.permissions.security_manager import assert_permissions from feast.permissions.server.rest import inject_user_details diff --git a/sdk/python/feast/infra/online_stores/remote.py b/sdk/python/feast/infra/online_stores/remote.py index f7efd8ac7c..93fbcaf771 100644 --- a/sdk/python/feast/infra/online_stores/remote.py +++ b/sdk/python/feast/infra/online_stores/remote.py @@ -14,15 +14,15 @@ import json import logging from datetime import datetime -from typing import (Any, Callable, Dict, List, Literal, Optional, Sequence, - Tuple) +from typing import Any, Callable, Dict, List, Literal, Optional, Sequence, Tuple from pydantic import StrictStr from feast import Entity, FeatureView, RepoConfig from feast.infra.online_stores.online_store import OnlineStore -from feast.permissions.client.http_auth_requests_wrapper import \ - get_http_auth_requests_session +from feast.permissions.client.http_auth_requests_wrapper import ( + get_http_auth_requests_session, +) from feast.protos.feast.types.EntityKey_pb2 import EntityKey as EntityKeyProto from feast.protos.feast.types.Value_pb2 import Value as ValueProto from feast.repo_config import FeastConfigBaseModel diff --git a/sdk/python/tests/integration/feature_repos/repo_configuration.py b/sdk/python/tests/integration/feature_repos/repo_configuration.py index fb345fc4d0..740a0688a1 100644 --- a/sdk/python/tests/integration/feature_repos/repo_configuration.py +++ b/sdk/python/tests/integration/feature_repos/repo_configuration.py @@ -10,54 +10,76 @@ import pandas as pd import pytest -from tests.integration.feature_repos.integration_test_repo_config import ( - IntegrationTestRepoConfig, RegistryLocation) -from tests.integration.feature_repos.universal.data_source_creator import \ - DataSourceCreator -from tests.integration.feature_repos.universal.data_sources.bigquery import \ - BigQueryDataSourceCreator -from tests.integration.feature_repos.universal.data_sources.file import ( - DuckDBDataSourceCreator, DuckDBDeltaDataSourceCreator, - FileDataSourceCreator, RemoteOfflineOidcAuthStoreDataSourceCreator, - RemoteOfflineStoreDataSourceCreator) -from tests.integration.feature_repos.universal.data_sources.redshift import \ - RedshiftDataSourceCreator -from tests.integration.feature_repos.universal.data_sources.snowflake import \ - SnowflakeDataSourceCreator -from tests.integration.feature_repos.universal.feature_views import ( - conv_rate_plus_100_feature_view, create_conv_rate_request_source, - create_customer_daily_profile_feature_view, - create_driver_hourly_stats_batch_feature_view, - create_driver_hourly_stats_feature_view, create_field_mapping_feature_view, - create_global_stats_feature_view, create_location_stats_feature_view, - create_order_feature_view, create_pushable_feature_view) -from tests.integration.feature_repos.universal.online_store.bigtable import \ - BigtableOnlineStoreCreator -from tests.integration.feature_repos.universal.online_store.datastore import \ - DatastoreOnlineStoreCreator -from tests.integration.feature_repos.universal.online_store.dynamodb import \ - DynamoDBOnlineStoreCreator -from tests.integration.feature_repos.universal.online_store.redis import \ - RedisOnlineStoreCreator -from tests.integration.feature_repos.universal.online_store_creator import \ - OnlineStoreCreator -from tests.utils.auth_permissions_util import (list_entities_perm, - list_fv_perm, list_odfv_perm, - list_permissions_perm, - list_sfv_perm) - -from feast import (FeatureStore, FeatureView, OnDemandFeatureView, - driver_test_data) + +from feast import FeatureStore, FeatureView, OnDemandFeatureView, driver_test_data from feast.constants import FULL_REPO_CONFIGS_MODULE_ENV_NAME from feast.data_source import DataSource from feast.errors import FeastModuleImportError -from feast.infra.feature_servers.base_config import (BaseFeatureServerConfig, - FeatureLoggingConfig) -from feast.infra.feature_servers.local_process.config import \ - LocalFeatureServerConfig +from feast.infra.feature_servers.base_config import ( + BaseFeatureServerConfig, + FeatureLoggingConfig, +) +from feast.infra.feature_servers.local_process.config import LocalFeatureServerConfig from feast.permissions.auth_model import OidcAuthConfig from feast.repo_config import RegistryConfig, RepoConfig from feast.utils import _utc_now +from tests.integration.feature_repos.integration_test_repo_config import ( + IntegrationTestRepoConfig, + RegistryLocation, +) +from tests.integration.feature_repos.universal.data_source_creator import ( + DataSourceCreator, +) +from tests.integration.feature_repos.universal.data_sources.bigquery import ( + BigQueryDataSourceCreator, +) +from tests.integration.feature_repos.universal.data_sources.file import ( + DuckDBDataSourceCreator, + DuckDBDeltaDataSourceCreator, + FileDataSourceCreator, + RemoteOfflineOidcAuthStoreDataSourceCreator, + RemoteOfflineStoreDataSourceCreator, +) +from tests.integration.feature_repos.universal.data_sources.redshift import ( + RedshiftDataSourceCreator, +) +from tests.integration.feature_repos.universal.data_sources.snowflake import ( + SnowflakeDataSourceCreator, +) +from tests.integration.feature_repos.universal.feature_views import ( + conv_rate_plus_100_feature_view, + create_conv_rate_request_source, + create_customer_daily_profile_feature_view, + create_driver_hourly_stats_batch_feature_view, + create_driver_hourly_stats_feature_view, + create_field_mapping_feature_view, + create_global_stats_feature_view, + create_location_stats_feature_view, + create_order_feature_view, + create_pushable_feature_view, +) +from tests.integration.feature_repos.universal.online_store.bigtable import ( + BigtableOnlineStoreCreator, +) +from tests.integration.feature_repos.universal.online_store.datastore import ( + DatastoreOnlineStoreCreator, +) +from tests.integration.feature_repos.universal.online_store.dynamodb import ( + DynamoDBOnlineStoreCreator, +) +from tests.integration.feature_repos.universal.online_store.redis import ( + RedisOnlineStoreCreator, +) +from tests.integration.feature_repos.universal.online_store_creator import ( + OnlineStoreCreator, +) +from tests.utils.auth_permissions_util import ( + list_entities_perm, + list_fv_perm, + list_odfv_perm, + list_permissions_perm, + list_sfv_perm, +) DYNAMO_CONFIG = {"type": "dynamodb", "region": "us-west-2"} REDIS_CONFIG = {"type": "redis", "connection_string": "localhost:6379,db=0"} @@ -229,7 +251,7 @@ class UniversalDatasets: def construct_universal_datasets( - entities: UniversalEntities, start_time: datetime, end_time: datetime + entities: UniversalEntities, start_time: datetime, end_time: datetime ) -> UniversalDatasets: customer_df = driver_test_data.create_customer_daily_profile_df( entities.customer_vals, start_time, end_time @@ -286,7 +308,7 @@ def values(self): def construct_universal_data_sources( - datasets: UniversalDatasets, data_source_creator: DataSourceCreator + datasets: UniversalDatasets, data_source_creator: DataSourceCreator ) -> UniversalDataSources: customer_ds = data_source_creator.create_data_source( datasets.customer_df, @@ -351,9 +373,9 @@ def values(self): def construct_universal_feature_views( - data_sources: UniversalDataSources, - with_odfv: bool = True, - use_substrait_odfv: bool = False, + data_sources: UniversalDataSources, + with_odfv: bool = True, + use_substrait_odfv: bool = False, ) -> UniversalFeatureViews: driver_hourly_stats = create_driver_hourly_stats_feature_view(data_sources.driver) driver_hourly_stats_base_feature_view = ( @@ -430,17 +452,20 @@ def teardown(self): @dataclass class OfflineServerPermissionsEnvironment(Environment): - def setup(self): self.data_source_creator.setup(self.registry) keycloak_url = self.data_source_creator.get_keycloak_url() - auth_config = OidcAuthConfig(client_id="feast-integration-client", - client_secret="feast-integration-client-secret", - username="reader_writer", password="password", realm="master", - type="oidc", - auth_server_url=self.data_source_creator.get_keycloak_url(), - auth_discovery_url=f"{keycloak_url}/realms/master/.well-known" - f"/openid-configuration") + auth_config = OidcAuthConfig( + client_id="feast-integration-client", + client_secret="feast-integration-client-secret", + username="reader_writer", + password="password", + realm="master", + type="oidc", + auth_server_url=self.data_source_creator.get_keycloak_url(), + auth_discovery_url=f"{keycloak_url}/realms/master/.well-known" + f"/openid-configuration", + ) self.config = RepoConfig( registry=self.registry, project=self.project, @@ -453,7 +478,7 @@ def setup(self): repo_path=self.repo_dir_name, feature_server=self.feature_server, entity_key_serialization_version=self.entity_key_serialization_version, - auth=auth_config + auth=auth_config, ) self.feature_store = FeatureStore(config=self.config) @@ -476,11 +501,11 @@ def table_name_from_data_source(ds: DataSource) -> Optional[str]: def construct_test_environment( - test_repo_config: IntegrationTestRepoConfig, - fixture_request: Optional[pytest.FixtureRequest], - test_suite_name: str = "integration_test", - worker_id: str = "worker_id", - entity_key_serialization_version: int = 2, + test_repo_config: IntegrationTestRepoConfig, + fixture_request: Optional[pytest.FixtureRequest], + test_suite_name: str = "integration_test", + worker_id: str = "worker_id", + entity_key_serialization_version: int = 2, ) -> Environment: _uuid = str(uuid.uuid4()).replace("-", "")[:6] @@ -518,20 +543,20 @@ def construct_test_environment( ) environment_params = { - 'name': project, - 'provider': test_repo_config.provider, - 'data_source_creator': offline_creator, - 'python_feature_server': test_repo_config.python_feature_server, - 'worker_id': worker_id, - 'online_store_creator': online_creator, - 'fixture_request': fixture_request, - 'project': project, - 'registry': registry, - 'feature_server': feature_server, - 'entity_key_serialization_version': entity_key_serialization_version, - 'repo_dir_name': repo_dir_name, - 'batch_engine': test_repo_config.batch_engine, - 'online_store': test_repo_config.online_store, + "name": project, + "provider": test_repo_config.provider, + "data_source_creator": offline_creator, + "python_feature_server": test_repo_config.python_feature_server, + "worker_id": worker_id, + "online_store_creator": online_creator, + "fixture_request": fixture_request, + "project": project, + "registry": registry, + "feature_server": feature_server, + "entity_key_serialization_version": entity_key_serialization_version, + "repo_dir_name": repo_dir_name, + "batch_engine": test_repo_config.batch_engine, + "online_store": test_repo_config.online_store, } if not isinstance(offline_creator, RemoteOfflineOidcAuthStoreDataSourceCreator): diff --git a/sdk/python/tests/integration/feature_repos/universal/data_sources/file.py b/sdk/python/tests/integration/feature_repos/universal/data_sources/file.py index fdb25e4efb..e751edd35c 100644 --- a/sdk/python/tests/integration/feature_repos/universal/data_sources/file.py +++ b/sdk/python/tests/integration/feature_repos/universal/data_sources/file.py @@ -17,11 +17,6 @@ from testcontainers.core.waiting_utils import wait_for_logs from testcontainers.keycloak import KeycloakContainer from testcontainers.minio import MinioContainer -from tests.integration.feature_repos.universal.data_source_creator import \ - DataSourceCreator -from tests.utils.auth_permissions_util import (include_auth_config, - setup_permissions_on_keycloak) -from tests.utils.http_server import check_port_open, free_port # noqa: E402 from feast import FileSource, RepoConfig from feast.data_format import DeltaFormat, ParquetFormat @@ -29,11 +24,21 @@ from feast.feature_logging import LoggingDestination from feast.infra.offline_stores.dask import DaskOfflineStoreConfig from feast.infra.offline_stores.duckdb import DuckDBOfflineStoreConfig -from feast.infra.offline_stores.file_source import (FileLoggingDestination, - SavedDatasetFileStorage) +from feast.infra.offline_stores.file_source import ( + FileLoggingDestination, + SavedDatasetFileStorage, +) from feast.infra.offline_stores.remote import RemoteOfflineStoreConfig from feast.repo_config import FeastConfigBaseModel, RegistryConfig from feast.wait import wait_retry_backoff # noqa: E402 +from tests.integration.feature_repos.universal.data_source_creator import ( + DataSourceCreator, +) +from tests.utils.auth_permissions_util import ( + include_auth_config, + setup_permissions_on_keycloak, +) +from tests.utils.http_server import check_port_open, free_port # noqa: E402 logger = logging.getLogger(__name__) @@ -50,12 +55,12 @@ def __init__(self, project_name: str, *args, **kwargs): self.keep = [] def create_data_source( - self, - df: pd.DataFrame, - destination_name: str, - created_timestamp_column="created_ts", - field_mapping: Optional[Dict[str, str]] = None, - timestamp_field: Optional[str] = "ts", + self, + df: pd.DataFrame, + destination_name: str, + created_timestamp_column="created_ts", + field_mapping: Optional[Dict[str, str]] = None, + timestamp_field: Optional[str] = "ts", ) -> DataSource: destination_name = self.get_prefixed_table_name(destination_name) @@ -104,12 +109,12 @@ def teardown(self): class DeltaFileSourceCreator(FileDataSourceCreator): def create_data_source( - self, - df: pd.DataFrame, - destination_name: str, - created_timestamp_column="created_ts", - field_mapping: Optional[Dict[str, str]] = None, - timestamp_field: Optional[str] = "ts", + self, + df: pd.DataFrame, + destination_name: str, + created_timestamp_column="created_ts", + field_mapping: Optional[Dict[str, str]] = None, + timestamp_field: Optional[str] = "ts", ) -> DataSource: from deltalake.writer import write_deltalake @@ -167,12 +172,12 @@ def __init__(self, project_name: str, *args, **kwargs): } def create_data_source( - self, - df: pd.DataFrame, - destination_name: str, - created_timestamp_column="created_ts", - field_mapping: Optional[Dict[str, str]] = None, - timestamp_field: Optional[str] = "ts", + self, + df: pd.DataFrame, + destination_name: str, + created_timestamp_column="created_ts", + field_mapping: Optional[Dict[str, str]] = None, + timestamp_field: Optional[str] = "ts", ) -> DataSource: from deltalake.writer import write_deltalake @@ -216,12 +221,12 @@ def teardown(self): class FileParquetDatasetSourceCreator(FileDataSourceCreator): def create_data_source( - self, - df: pd.DataFrame, - destination_name: str, - created_timestamp_column="created_ts", - field_mapping: Optional[Dict[str, str]] = None, - timestamp_field: Optional[str] = "ts", + self, + df: pd.DataFrame, + destination_name: str, + created_timestamp_column="created_ts", + field_mapping: Optional[Dict[str, str]] = None, + timestamp_field: Optional[str] = "ts", ) -> DataSource: destination_name = self.get_prefixed_table_name(destination_name) @@ -289,12 +294,12 @@ def _upload_parquet_file(self, df, file_name, minio_endpoint): ) def create_data_source( - self, - df: pd.DataFrame, - destination_name: str, - created_timestamp_column="created_ts", - field_mapping: Optional[Dict[str, str]] = None, - timestamp_field: Optional[str] = "ts", + self, + df: pd.DataFrame, + destination_name: str, + created_timestamp_column="created_ts", + field_mapping: Optional[Dict[str, str]] = None, + timestamp_field: Optional[str] = "ts", ) -> DataSource: filename = f"{destination_name}.parquet" port = self.minio.get_exposed_port("9000") @@ -503,7 +508,7 @@ def create_offline_store_config(self) -> FeastConfigBaseModel: type="remote", host="0.0.0.0", port=self.server_port ) return self.remote_offline_store_config - + def get_keycloak_url(self): return self.keycloak_container.get_url() diff --git a/sdk/python/tests/integration/offline_store/test_universal_historical_retrieval.py b/sdk/python/tests/integration/offline_store/test_universal_historical_retrieval.py index e6363fa0b2..97ad54251f 100644 --- a/sdk/python/tests/integration/offline_store/test_universal_historical_retrieval.py +++ b/sdk/python/tests/integration/offline_store/test_universal_historical_retrieval.py @@ -5,30 +5,40 @@ import numpy as np import pandas as pd import pytest -from tests.integration.feature_repos.repo_configuration import ( - construct_universal_feature_views, table_name_from_data_source) -from tests.integration.feature_repos.universal.data_sources.file import ( - RemoteOfflineOidcAuthStoreDataSourceCreator, - RemoteOfflineStoreDataSourceCreator) -from tests.integration.feature_repos.universal.data_sources.snowflake import \ - SnowflakeDataSourceCreator -from tests.integration.feature_repos.universal.entities import (customer, - driver, - location) -from tests.utils.feature_records import ( - assert_feature_service_correctness, - assert_feature_service_entity_mapping_correctness, - get_expected_training_df, get_response_feature_name, validate_dataframes) from feast.entity import Entity from feast.errors import RequestDataNotFoundInEntityDfException from feast.feature_service import FeatureService from feast.feature_view import FeatureView from feast.field import Field -from feast.infra.offline_stores.offline_utils import \ - DEFAULT_ENTITY_DF_EVENT_TIMESTAMP_COL +from feast.infra.offline_stores.offline_utils import ( + DEFAULT_ENTITY_DF_EVENT_TIMESTAMP_COL, +) from feast.types import Float32, Int32 from feast.utils import _utc_now +from tests.integration.feature_repos.repo_configuration import ( + construct_universal_feature_views, + table_name_from_data_source, +) +from tests.integration.feature_repos.universal.data_sources.file import ( + RemoteOfflineOidcAuthStoreDataSourceCreator, + RemoteOfflineStoreDataSourceCreator, +) +from tests.integration.feature_repos.universal.data_sources.snowflake import ( + SnowflakeDataSourceCreator, +) +from tests.integration.feature_repos.universal.entities import ( + customer, + driver, + location, +) +from tests.utils.feature_records import ( + assert_feature_service_correctness, + assert_feature_service_entity_mapping_correctness, + get_expected_training_df, + get_response_feature_name, + validate_dataframes, +) np.random.seed(0) @@ -153,7 +163,11 @@ def test_historical_features_main( ) if not isinstance( - environment.data_source_creator, (RemoteOfflineStoreDataSourceCreator, RemoteOfflineOidcAuthStoreDataSourceCreator) + environment.data_source_creator, + ( + RemoteOfflineStoreDataSourceCreator, + RemoteOfflineOidcAuthStoreDataSourceCreator, + ), ): assert_feature_service_correctness( store, diff --git a/sdk/python/tests/integration/online_store/test_remote_online_store.py b/sdk/python/tests/integration/online_store/test_remote_online_store.py index a4d1216298..3151a819a4 100644 --- a/sdk/python/tests/integration/online_store/test_remote_online_store.py +++ b/sdk/python/tests/integration/online_store/test_remote_online_store.py @@ -3,16 +3,19 @@ from textwrap import dedent import pytest -from tests.utils.auth_permissions_util import (PROJECT_NAME, default_store, - start_feature_server) -from tests.utils.cli_repo_creator import CliRunner -from tests.utils.http_server import free_port from feast import Entity, FeatureView, OnDemandFeatureView, StreamFeatureView from feast.feature_store import FeatureStore from feast.permissions.action import AuthzedAction from feast.permissions.permission import Permission from feast.permissions.policy import RoleBasedPolicy +from tests.utils.auth_permissions_util import ( + PROJECT_NAME, + default_store, + start_feature_server, +) +from tests.utils.cli_repo_creator import CliRunner +from tests.utils.http_server import free_port @pytest.mark.integration diff --git a/sdk/python/tests/utils/auth_permissions_util.py b/sdk/python/tests/utils/auth_permissions_util.py index ec3693c376..d9acd1d133 100644 --- a/sdk/python/tests/utils/auth_permissions_util.py +++ b/sdk/python/tests/utils/auth_permissions_util.py @@ -119,7 +119,7 @@ def start_feature_server(repo_path: str, server_port: int): str(server_port), ] feast_server_process = subprocess.Popen( - cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE + cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE ) _time_out_sec: int = 60 # Wait for server to start From 2f169df515ee8481c19a3f3a1c96f5edc0400d6d Mon Sep 17 00:00:00 2001 From: Lokesh Rangineni Date: Fri, 2 Aug 2024 10:16:07 -0400 Subject: [PATCH 119/169] Separated the permissions for online, offline and registry servers. moved the fixtures scope accordingly as we can't reuse the permissions for all the test cases. Signed-off-by: Lokesh Rangineni Signed-off-by: Abdul Hameed --- sdk/python/tests/conftest.py | 24 -------- .../feature_repos/repo_configuration.py | 60 ++++++++++++++----- .../online_store/test_remote_online_store.py | 10 ++-- .../tests/unit/permissions/auth/conftest.py | 26 ++++++++ .../auth/server/test_auth_registry_server.py | 56 ++++++++--------- .../permissions/auth/server/test_utils.py | 51 ++++++++++++++++ .../tests/utils/auth_permissions_util.py | 53 ---------------- 7 files changed, 157 insertions(+), 123 deletions(-) diff --git a/sdk/python/tests/conftest.py b/sdk/python/tests/conftest.py index c9ba416d6e..c26688836c 100644 --- a/sdk/python/tests/conftest.py +++ b/sdk/python/tests/conftest.py @@ -58,12 +58,6 @@ ) from tests.utils.auth_permissions_util import ( default_store, - invalid_list_entities_perm, - list_entities_perm, - list_fv_perm, - list_odfv_perm, - list_permissions_perm, - list_sfv_perm, ) from tests.utils.http_server import check_port_open, free_port # noqa: E402 @@ -489,21 +483,3 @@ def auth_config(request, is_integration_test): return auth_configuration.replace("KEYCLOAK_URL_PLACE_HOLDER", keycloak_url) return auth_configuration - - -@pytest.fixture( - scope="module", - params=[ - [], - [invalid_list_entities_perm], - [ - list_entities_perm, - list_permissions_perm, - list_fv_perm, - list_odfv_perm, - list_sfv_perm, - ], - ], -) -def applied_permissions(request): - return request.param diff --git a/sdk/python/tests/integration/feature_repos/repo_configuration.py b/sdk/python/tests/integration/feature_repos/repo_configuration.py index 740a0688a1..345093def3 100644 --- a/sdk/python/tests/integration/feature_repos/repo_configuration.py +++ b/sdk/python/tests/integration/feature_repos/repo_configuration.py @@ -11,7 +11,14 @@ import pandas as pd import pytest -from feast import FeatureStore, FeatureView, OnDemandFeatureView, driver_test_data +from feast import ( + Entity, + FeatureStore, + FeatureView, + OnDemandFeatureView, + StreamFeatureView, + driver_test_data, +) from feast.constants import FULL_REPO_CONFIGS_MODULE_ENV_NAME from feast.data_source import DataSource from feast.errors import FeastModuleImportError @@ -20,7 +27,10 @@ FeatureLoggingConfig, ) from feast.infra.feature_servers.local_process.config import LocalFeatureServerConfig +from feast.permissions.action import AuthzedAction from feast.permissions.auth_model import OidcAuthConfig +from feast.permissions.permission import Permission +from feast.permissions.policy import RoleBasedPolicy from feast.repo_config import RegistryConfig, RepoConfig from feast.utils import _utc_now from tests.integration.feature_repos.integration_test_repo_config import ( @@ -73,13 +83,6 @@ from tests.integration.feature_repos.universal.online_store_creator import ( OnlineStoreCreator, ) -from tests.utils.auth_permissions_util import ( - list_entities_perm, - list_fv_perm, - list_odfv_perm, - list_permissions_perm, - list_sfv_perm, -) DYNAMO_CONFIG = {"type": "dynamodb", "region": "us-west-2"} REDIS_CONFIG = {"type": "redis", "connection_string": "localhost:6379,db=0"} @@ -462,7 +465,7 @@ def setup(self): password="password", realm="master", type="oidc", - auth_server_url=self.data_source_creator.get_keycloak_url(), + auth_server_url=keycloak_url, auth_discovery_url=f"{keycloak_url}/realms/master/.well-known" f"/openid-configuration", ) @@ -483,11 +486,40 @@ def setup(self): self.feature_store = FeatureStore(config=self.config) permissions_list = [ - list_entities_perm, - list_permissions_perm, - list_fv_perm, - list_odfv_perm, - list_sfv_perm, + Permission( + name="offline_permissions_perm", + types=Permission, + policy=RoleBasedPolicy(roles=["reader"]), + actions=[AuthzedAction.QUERY_OFFLINE], + ), + Permission( + name="offline_entities_perm", + types=Entity, + with_subclasses=False, + policy=RoleBasedPolicy(roles=["reader"]), + actions=[AuthzedAction.QUERY_OFFLINE], + ), + Permission( + name="offline_fv_perm", + types=FeatureView, + with_subclasses=False, + policy=RoleBasedPolicy(roles=["reader"]), + actions=[AuthzedAction.QUERY_OFFLINE], + ), + Permission( + name="offline_odfv_perm", + types=OnDemandFeatureView, + with_subclasses=False, + policy=RoleBasedPolicy(roles=["reader"]), + actions=[AuthzedAction.QUERY_OFFLINE], + ), + Permission( + name="offline_sfv_perm", + types=StreamFeatureView, + with_subclasses=False, + policy=RoleBasedPolicy(roles=["reader"]), + actions=[AuthzedAction.QUERY_OFFLINE], + ), ] self.feature_store.apply(permissions_list) diff --git a/sdk/python/tests/integration/online_store/test_remote_online_store.py b/sdk/python/tests/integration/online_store/test_remote_online_store.py index 3151a819a4..ebb8a0099e 100644 --- a/sdk/python/tests/integration/online_store/test_remote_online_store.py +++ b/sdk/python/tests/integration/online_store/test_remote_online_store.py @@ -27,34 +27,34 @@ def test_remote_online_store_read(auth_config): types=Entity, with_subclasses=False, policy=RoleBasedPolicy(roles=["reader"]), - actions=[AuthzedAction.READ, AuthzedAction.QUERY_OFFLINE], + actions=[AuthzedAction.READ], ), Permission( name="online_list_permissions_perm", types=Permission, policy=RoleBasedPolicy(roles=["reader"]), - actions=[AuthzedAction.READ, AuthzedAction.QUERY_OFFLINE], + actions=[AuthzedAction.READ], ), Permission( name="online_list_fv_perm", types=FeatureView, with_subclasses=False, policy=RoleBasedPolicy(roles=["reader"]), - actions=[AuthzedAction.READ, AuthzedAction.QUERY_OFFLINE], + actions=[AuthzedAction.READ], ), Permission( name="online_list_odfv_perm", types=OnDemandFeatureView, with_subclasses=False, policy=RoleBasedPolicy(roles=["reader"]), - actions=[AuthzedAction.READ, AuthzedAction.QUERY_OFFLINE], + actions=[AuthzedAction.READ], ), Permission( name="online_list_sfv_perm", types=StreamFeatureView, with_subclasses=False, policy=RoleBasedPolicy(roles=["reader"]), - actions=[AuthzedAction.READ, AuthzedAction.QUERY_OFFLINE], + actions=[AuthzedAction.READ], ), ] server_store, server_url, registry_path = ( diff --git a/sdk/python/tests/unit/permissions/auth/conftest.py b/sdk/python/tests/unit/permissions/auth/conftest.py index ea88d8e490..dc71aba23b 100644 --- a/sdk/python/tests/unit/permissions/auth/conftest.py +++ b/sdk/python/tests/unit/permissions/auth/conftest.py @@ -2,6 +2,14 @@ from kubernetes import client from feast.permissions.auth_model import OidcAuthConfig +from tests.unit.permissions.auth.server.test_utils import ( + invalid_list_entities_perm, + read_entities_perm, + read_fv_perm, + read_odfv_perm, + read_permissions_perm, + read_sfv_perm, +) from tests.unit.permissions.auth.test_token_parser import _CLIENT_ID @@ -73,3 +81,21 @@ def oidc_config() -> OidcAuthConfig: password="", realm="", ) + + +@pytest.fixture( + scope="module", + params=[ + [], + [invalid_list_entities_perm], + [ + read_entities_perm, + read_permissions_perm, + read_fv_perm, + read_odfv_perm, + read_sfv_perm, + ], + ], +) +def applied_permissions(request): + return request.param diff --git a/sdk/python/tests/unit/permissions/auth/server/test_auth_registry_server.py b/sdk/python/tests/unit/permissions/auth/server/test_auth_registry_server.py index af50d48ad4..bc16bdac3b 100644 --- a/sdk/python/tests/unit/permissions/auth/server/test_auth_registry_server.py +++ b/sdk/python/tests/unit/permissions/auth/server/test_auth_registry_server.py @@ -5,20 +5,22 @@ import pytest import yaml -from feast import FeatureStore +from feast import ( + FeatureStore, +) from feast.permissions.permission import Permission from feast.registry_server import start_server from feast.wait import wait_retry_backoff # noqa: E402 from tests.unit.permissions.auth.server import mock_utils -from tests.utils.auth_permissions_util import ( - get_remote_registry_store, +from tests.unit.permissions.auth.server.test_utils import ( invalid_list_entities_perm, - list_entities_perm, - list_fv_perm, - list_odfv_perm, - list_permissions_perm, - list_sfv_perm, + read_entities_perm, + read_fv_perm, + read_odfv_perm, + read_permissions_perm, + read_sfv_perm, ) +from tests.utils.auth_permissions_util import get_remote_registry_store from tests.utils.http_server import check_port_open # noqa: E402 @@ -73,11 +75,11 @@ def test_registry_apis( if _permissions_exist_in_permission_list( [ - list_entities_perm, - list_permissions_perm, - list_fv_perm, - list_odfv_perm, - list_sfv_perm, + read_entities_perm, + read_permissions_perm, + read_fv_perm, + read_odfv_perm, + read_sfv_perm, ], permissions, ): @@ -120,7 +122,7 @@ def _test_list_entities(client_fs: FeatureStore, permissions: list[Permission]): entities = client_fs.list_entities() if not _is_auth_enabled(client_fs) or _is_permission_enabled( - client_fs, permissions, list_entities_perm + client_fs, permissions, read_entities_perm ): assertpy.assert_that(entities).is_not_none() assertpy.assert_that(len(entities)).is_equal_to(1) @@ -151,11 +153,11 @@ def _test_list_permissions( assertpy.assert_that(len(permissions)).is_equal_to(len(applied_permissions)) elif _is_auth_enabled(client_fs) and _permissions_exist_in_permission_list( [ - list_entities_perm, - list_permissions_perm, - list_fv_perm, - list_odfv_perm, - list_sfv_perm, + read_entities_perm, + read_permissions_perm, + read_fv_perm, + read_odfv_perm, + read_sfv_perm, ], permissions, ): @@ -163,11 +165,11 @@ def _test_list_permissions( assertpy.assert_that(len(permissions)).is_equal_to( len( [ - list_entities_perm, - list_permissions_perm, - list_fv_perm, - list_odfv_perm, - list_sfv_perm, + read_entities_perm, + read_permissions_perm, + read_fv_perm, + read_odfv_perm, + read_sfv_perm, ] ) ) @@ -179,7 +181,7 @@ def _test_list_permissions( def _is_listing_permissions_allowed(permissions: list[Permission]) -> bool: - return list_permissions_perm in permissions + return read_permissions_perm in permissions def _is_auth_enabled(client_fs: FeatureStore) -> bool: @@ -199,7 +201,7 @@ def _test_list_fvs(client_fs: FeatureStore, permissions: list[Permission]): print(f"{fv.name}, {type(fv).__name__}") if not _is_auth_enabled(client_fs) or _is_permission_enabled( - client_fs, permissions, list_fv_perm + client_fs, permissions, read_fv_perm ): assertpy.assert_that(fvs).is_not_none() assertpy.assert_that(len(fvs)).is_equal_to(2) @@ -227,7 +229,7 @@ def _is_permission_enabled( _no_permission_retrieved(permissions) or ( _permissions_exist_in_permission_list( - [list_permissions_perm, permission], permissions + [read_permissions_perm, permission], permissions ) ) ) diff --git a/sdk/python/tests/unit/permissions/auth/server/test_utils.py b/sdk/python/tests/unit/permissions/auth/server/test_utils.py index 00047f0135..36b9d3ef82 100644 --- a/sdk/python/tests/unit/permissions/auth/server/test_utils.py +++ b/sdk/python/tests/unit/permissions/auth/server/test_utils.py @@ -1,8 +1,59 @@ import assertpy import pytest +from feast import Entity, FeatureView, OnDemandFeatureView, StreamFeatureView +from feast.permissions.action import AuthzedAction +from feast.permissions.permission import Permission +from feast.permissions.policy import RoleBasedPolicy from feast.permissions.server.utils import AuthManagerType, str_to_auth_manager_type +read_permissions_perm = Permission( + name="read_permissions_perm", + types=Permission, + policy=RoleBasedPolicy(roles=["reader"]), + actions=[AuthzedAction.READ], +) + +read_entities_perm = Permission( + name="read_entities_perm", + types=Entity, + with_subclasses=False, + policy=RoleBasedPolicy(roles=["reader"]), + actions=[AuthzedAction.READ], +) + +read_fv_perm = Permission( + name="read_fv_perm", + types=FeatureView, + with_subclasses=False, + policy=RoleBasedPolicy(roles=["reader"]), + actions=[AuthzedAction.READ], +) + +read_odfv_perm = Permission( + name="read_odfv_perm", + types=OnDemandFeatureView, + with_subclasses=False, + policy=RoleBasedPolicy(roles=["reader"]), + actions=[AuthzedAction.READ], +) + +read_sfv_perm = Permission( + name="read_sfv_perm", + types=StreamFeatureView, + with_subclasses=False, + policy=RoleBasedPolicy(roles=["reader"]), + actions=[AuthzedAction.READ], +) + +invalid_list_entities_perm = Permission( + name="invalid_list_entity_perm", + types=Entity, + with_subclasses=False, + policy=RoleBasedPolicy(roles=["dancer"]), + actions=[AuthzedAction.READ], +) + @pytest.mark.parametrize( "label, value", diff --git a/sdk/python/tests/utils/auth_permissions_util.py b/sdk/python/tests/utils/auth_permissions_util.py index d9acd1d133..8f4044bc6a 100644 --- a/sdk/python/tests/utils/auth_permissions_util.py +++ b/sdk/python/tests/utils/auth_permissions_util.py @@ -5,70 +5,17 @@ from keycloak import KeycloakAdmin from feast import ( - Entity, FeatureStore, - FeatureView, - OnDemandFeatureView, RepoConfig, - StreamFeatureView, ) from feast.infra.registry.remote import RemoteRegistryConfig -from feast.permissions.action import AuthzedAction from feast.permissions.permission import Permission -from feast.permissions.policy import RoleBasedPolicy from feast.wait import wait_retry_backoff from tests.utils.cli_repo_creator import CliRunner from tests.utils.http_server import check_port_open PROJECT_NAME = "feast_test_project" -list_permissions_perm = Permission( - name="list_permissions_perm", - types=Permission, - policy=RoleBasedPolicy(roles=["reader"]), - actions=[AuthzedAction.READ, AuthzedAction.QUERY_OFFLINE], -) - -list_entities_perm = Permission( - name="list_entities_perm", - types=Entity, - with_subclasses=False, - policy=RoleBasedPolicy(roles=["reader"]), - actions=[AuthzedAction.READ, AuthzedAction.QUERY_OFFLINE], -) - -list_fv_perm = Permission( - name="list_fv_perm", - types=FeatureView, - with_subclasses=False, - policy=RoleBasedPolicy(roles=["reader"]), - actions=[AuthzedAction.READ, AuthzedAction.QUERY_OFFLINE], -) - -list_odfv_perm = Permission( - name="list_odfv_perm", - types=OnDemandFeatureView, - with_subclasses=False, - policy=RoleBasedPolicy(roles=["reader"]), - actions=[AuthzedAction.READ, AuthzedAction.QUERY_OFFLINE], -) - -list_sfv_perm = Permission( - name="list_sfv_perm", - types=StreamFeatureView, - with_subclasses=False, - policy=RoleBasedPolicy(roles=["reader"]), - actions=[AuthzedAction.READ, AuthzedAction.QUERY_OFFLINE], -) - -invalid_list_entities_perm = Permission( - name="invalid_list_entity_perm", - types=Entity, - with_subclasses=False, - policy=RoleBasedPolicy(roles=["dancer"]), - actions=[AuthzedAction.READ, AuthzedAction.QUERY_OFFLINE], -) - def include_auth_config(file_path, auth_config: str): with open(file_path, "r") as file: From af35739c51cc4e56f5e0119c3d76cabb966a59af Mon Sep 17 00:00:00 2001 From: Lokesh Rangineni Date: Fri, 2 Aug 2024 10:16:07 -0400 Subject: [PATCH 120/169] Separated the permissions for online, offline and registry servers. moved the fixtures scope accordingly as we can't reuse the permissions for all the test cases. Signed-off-by: Lokesh Rangineni Signed-off-by: Abdul Hameed --- sdk/python/tests/integration/feature_repos/repo_configuration.py | 1 - 1 file changed, 1 deletion(-) diff --git a/sdk/python/tests/integration/feature_repos/repo_configuration.py b/sdk/python/tests/integration/feature_repos/repo_configuration.py index 345093def3..e34ece8474 100644 --- a/sdk/python/tests/integration/feature_repos/repo_configuration.py +++ b/sdk/python/tests/integration/feature_repos/repo_configuration.py @@ -421,7 +421,6 @@ class Environment: entity_key_serialization_version: int repo_dir_name: str fixture_request: Optional[pytest.FixtureRequest] = None - permissions: Optional[List] = None def __post_init__(self): self.end_date = _utc_now().replace(microsecond=0, second=0, minute=0) From 0333c56d7b6f47d57c2478cf984db7be667488e7 Mon Sep 17 00:00:00 2001 From: Lokesh Rangineni Date: Fri, 2 Aug 2024 17:28:57 -0400 Subject: [PATCH 121/169] Created the grpc client auth header interceptor and removed the manual injection of the header. Signed-off-by: Lokesh Rangineni Signed-off-by: Abdul Hameed --- sdk/python/feast/infra/registry/remote.py | 313 +++--------------- .../client/grpc_client_auth_interceptor.py | 58 ++++ 2 files changed, 105 insertions(+), 266 deletions(-) create mode 100644 sdk/python/feast/permissions/client/grpc_client_auth_interceptor.py diff --git a/sdk/python/feast/infra/registry/remote.py b/sdk/python/feast/infra/registry/remote.py index 70c2af4c40..9a4a8eadb8 100644 --- a/sdk/python/feast/infra/registry/remote.py +++ b/sdk/python/feast/infra/registry/remote.py @@ -15,13 +15,12 @@ from feast.infra.infra_object import Infra from feast.infra.registry.base_registry import BaseRegistry from feast.on_demand_feature_view import OnDemandFeatureView -from feast.permissions.auth.auth_type import AuthType from feast.permissions.auth_model import ( AuthConfig, NoAuthConfig, ) -from feast.permissions.client.utils import ( - create_auth_header, +from feast.permissions.client.grpc_client_auth_interceptor import ( + GrpcClientAuthHeaderInterceptor, ) from feast.permissions.permission import Permission from feast.project_metadata import ProjectMetadata @@ -49,43 +48,31 @@ def __init__( repo_path: Optional[Path], auth_config: AuthConfig = NoAuthConfig(), ): + auth_header_interceptor = GrpcClientAuthHeaderInterceptor(auth_config) self.auth_config = auth_config - self.channel = grpc.insecure_channel(registry_config.path) - self.stub = RegistryServer_pb2_grpc.RegistryServerStub(self.channel) + channel = grpc.insecure_channel(registry_config.path) + self.intercepted_channel = grpc.intercept_channel( + channel, auth_header_interceptor + ) + self.stub = RegistryServer_pb2_grpc.RegistryServerStub(self.intercepted_channel) def apply_entity(self, entity: Entity, project: str, commit: bool = True): request = RegistryServer_pb2.ApplyEntityRequest( entity=entity.to_proto(), project=project, commit=commit ) - - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_auth_header(self.auth_config) - self.stub.ApplyEntity(request=request, metadata=metadata) - else: - self.stub.ApplyEntity(request) + self.stub.ApplyEntity(request) def delete_entity(self, name: str, project: str, commit: bool = True): request = RegistryServer_pb2.DeleteEntityRequest( name=name, project=project, commit=commit ) - - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_auth_header(self.auth_config) - self.stub.DeleteEntity(request=request, metadata=metadata) - else: - self.stub.DeleteEntity(request) + self.stub.DeleteEntity(request) def get_entity(self, name: str, project: str, allow_cache: bool = False) -> Entity: request = RegistryServer_pb2.GetEntityRequest( name=name, project=project, allow_cache=allow_cache ) - - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_auth_header(self.auth_config) - response = self.stub.GetEntity(request=request, metadata=metadata) - else: - response = self.stub.GetEntity(request) - + response = self.stub.GetEntity(request) return Entity.from_proto(response) def list_entities( @@ -97,13 +84,7 @@ def list_entities( request = RegistryServer_pb2.ListEntitiesRequest( project=project, allow_cache=allow_cache, tags=tags ) - - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_auth_header(self.auth_config) - response = self.stub.ListEntities(request=request, metadata=metadata) - else: - response = self.stub.ListEntities(request) - + response = self.stub.ListEntities(request) return [Entity.from_proto(entity) for entity in response.entities] def apply_data_source( @@ -112,23 +93,13 @@ def apply_data_source( request = RegistryServer_pb2.ApplyDataSourceRequest( data_source=data_source.to_proto(), project=project, commit=commit ) - - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_auth_header(self.auth_config) - self.stub.ApplyDataSource(request=request, metadata=metadata) - else: - self.stub.ApplyDataSource(request) + self.stub.ApplyDataSource(request) def delete_data_source(self, name: str, project: str, commit: bool = True): request = RegistryServer_pb2.DeleteDataSourceRequest( name=name, project=project, commit=commit ) - - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_auth_header(self.auth_config) - self.stub.DeleteDataSource(request=request, metadata=metadata) - else: - self.stub.DeleteDataSource(request) + self.stub.DeleteDataSource(request) def get_data_source( self, name: str, project: str, allow_cache: bool = False @@ -136,13 +107,7 @@ def get_data_source( request = RegistryServer_pb2.GetDataSourceRequest( name=name, project=project, allow_cache=allow_cache ) - - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_auth_header(self.auth_config) - response = self.stub.GetDataSource(request=request, metadata=metadata) - else: - response = self.stub.GetDataSource(request) - + response = self.stub.GetDataSource(request) return DataSource.from_proto(response) def list_data_sources( @@ -154,13 +119,7 @@ def list_data_sources( request = RegistryServer_pb2.ListDataSourcesRequest( project=project, allow_cache=allow_cache, tags=tags ) - - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_auth_header(self.auth_config) - response = self.stub.ListDataSources(request=request, metadata=metadata) - else: - response = self.stub.ListDataSources(request) - + response = self.stub.ListDataSources(request) return [ DataSource.from_proto(data_source) for data_source in response.data_sources ] @@ -171,23 +130,13 @@ def apply_feature_service( request = RegistryServer_pb2.ApplyFeatureServiceRequest( feature_service=feature_service.to_proto(), project=project, commit=commit ) - - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_auth_header(self.auth_config) - self.stub.ApplyFeatureService(request=request, metadata=metadata) - else: - self.stub.ApplyFeatureService(request) + self.stub.ApplyFeatureService(request) def delete_feature_service(self, name: str, project: str, commit: bool = True): request = RegistryServer_pb2.DeleteFeatureServiceRequest( name=name, project=project, commit=commit ) - - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_auth_header(self.auth_config) - self.stub.DeleteFeatureService(request=request, metadata=metadata) - else: - self.stub.DeleteFeatureService(request) + self.stub.DeleteFeatureService(request) def get_feature_service( self, name: str, project: str, allow_cache: bool = False @@ -195,13 +144,7 @@ def get_feature_service( request = RegistryServer_pb2.GetFeatureServiceRequest( name=name, project=project, allow_cache=allow_cache ) - - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_auth_header(self.auth_config) - response = self.stub.GetFeatureService(request=request, metadata=metadata) - else: - response = self.stub.GetFeatureService(request) - + response = self.stub.GetFeatureService(request) return FeatureService.from_proto(response) def list_feature_services( @@ -213,13 +156,7 @@ def list_feature_services( request = RegistryServer_pb2.ListFeatureServicesRequest( project=project, allow_cache=allow_cache, tags=tags ) - - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_auth_header(self.auth_config) - response = self.stub.ListFeatureServices(request=request, metadata=metadata) - else: - response = self.stub.ListFeatureServices(request) - + response = self.stub.ListFeatureServices(request) return [ FeatureService.from_proto(feature_service) for feature_service in response.feature_services @@ -249,22 +186,13 @@ def apply_feature_view( commit=commit, ) - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_auth_header(self.auth_config) - self.stub.ApplyFeatureView(request=request, metadata=metadata) - else: - self.stub.ApplyFeatureView(request) + self.stub.ApplyFeatureView(request) def delete_feature_view(self, name: str, project: str, commit: bool = True): request = RegistryServer_pb2.DeleteFeatureViewRequest( name=name, project=project, commit=commit ) - - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_auth_header(self.auth_config) - self.stub.DeleteFeatureView(request=request, metadata=metadata) - else: - self.stub.DeleteFeatureView(request) + self.stub.DeleteFeatureView(request) def get_stream_feature_view( self, name: str, project: str, allow_cache: bool = False @@ -272,15 +200,7 @@ def get_stream_feature_view( request = RegistryServer_pb2.GetStreamFeatureViewRequest( name=name, project=project, allow_cache=allow_cache ) - - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_auth_header(self.auth_config) - response = self.stub.GetStreamFeatureView( - request=request, metadata=metadata - ) - else: - response = self.stub.GetStreamFeatureView(request) - + response = self.stub.GetStreamFeatureView(request) return StreamFeatureView.from_proto(response) def list_stream_feature_views( @@ -292,15 +212,7 @@ def list_stream_feature_views( request = RegistryServer_pb2.ListStreamFeatureViewsRequest( project=project, allow_cache=allow_cache, tags=tags ) - - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_auth_header(self.auth_config) - response = self.stub.ListStreamFeatureViews( - request=request, metadata=metadata - ) - else: - response = self.stub.ListStreamFeatureViews(request) - + response = self.stub.ListStreamFeatureViews(request) return [ StreamFeatureView.from_proto(stream_feature_view) for stream_feature_view in response.stream_feature_views @@ -312,15 +224,7 @@ def get_on_demand_feature_view( request = RegistryServer_pb2.GetOnDemandFeatureViewRequest( name=name, project=project, allow_cache=allow_cache ) - - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_auth_header(self.auth_config) - response = self.stub.GetOnDemandFeatureView( - request=request, metadata=metadata - ) - else: - response = self.stub.GetOnDemandFeatureView(request) - + response = self.stub.GetOnDemandFeatureView(request) return OnDemandFeatureView.from_proto(response) def list_on_demand_feature_views( @@ -332,15 +236,7 @@ def list_on_demand_feature_views( request = RegistryServer_pb2.ListOnDemandFeatureViewsRequest( project=project, allow_cache=allow_cache, tags=tags ) - - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_auth_header(self.auth_config) - response = self.stub.ListOnDemandFeatureViews( - request=request, metadata=metadata - ) - else: - response = self.stub.ListOnDemandFeatureViews(request) - + response = self.stub.ListOnDemandFeatureViews(request) return [ OnDemandFeatureView.from_proto(on_demand_feature_view) for on_demand_feature_view in response.on_demand_feature_views @@ -352,13 +248,7 @@ def get_feature_view( request = RegistryServer_pb2.GetFeatureViewRequest( name=name, project=project, allow_cache=allow_cache ) - - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_auth_header(self.auth_config) - response = self.stub.GetFeatureView(request=request, metadata=metadata) - else: - response = self.stub.GetFeatureView(request) - + response = self.stub.GetFeatureView(request) return FeatureView.from_proto(response) def list_feature_views( @@ -370,12 +260,7 @@ def list_feature_views( request = RegistryServer_pb2.ListFeatureViewsRequest( project=project, allow_cache=allow_cache, tags=tags ) - - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_auth_header(self.auth_config) - response = self.stub.ListFeatureViews(request=request, metadata=metadata) - else: - response = self.stub.ListFeatureViews(request) + response = self.stub.ListFeatureViews(request) return [ FeatureView.from_proto(feature_view) @@ -403,12 +288,7 @@ def apply_materialization( end_date=end_date_timestamp, commit=commit, ) - - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_auth_header(self.auth_config) - self.stub.ApplyMaterialization(request=request, metadata=metadata) - else: - self.stub.ApplyMaterialization(request) + self.stub.ApplyMaterialization(request) def apply_saved_dataset( self, @@ -419,23 +299,13 @@ def apply_saved_dataset( request = RegistryServer_pb2.ApplySavedDatasetRequest( saved_dataset=saved_dataset.to_proto(), project=project, commit=commit ) - - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_auth_header(self.auth_config) - self.stub.ApplyFeatureService(request=request, metadata=metadata) - else: - self.stub.ApplyFeatureService(request) + self.stub.ApplyFeatureService(request) def delete_saved_dataset(self, name: str, project: str, commit: bool = True): request = RegistryServer_pb2.DeleteSavedDatasetRequest( name=name, project=project, commit=commit ) - - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_auth_header(self.auth_config) - self.stub.DeleteSavedDataset(request, metadata=metadata) - else: - self.stub.DeleteSavedDataset(request) + self.stub.DeleteSavedDataset(request) def get_saved_dataset( self, name: str, project: str, allow_cache: bool = False @@ -443,13 +313,7 @@ def get_saved_dataset( request = RegistryServer_pb2.GetSavedDatasetRequest( name=name, project=project, allow_cache=allow_cache ) - - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_auth_header(self.auth_config) - response = self.stub.GetSavedDataset(request=request, metadata=metadata) - else: - response = self.stub.GetSavedDataset(request) - + response = self.stub.GetSavedDataset(request) return SavedDataset.from_proto(response) def list_saved_datasets( @@ -461,13 +325,7 @@ def list_saved_datasets( request = RegistryServer_pb2.ListSavedDatasetsRequest( project=project, allow_cache=allow_cache, tags=tags ) - - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_auth_header(self.auth_config) - response = self.stub.ListSavedDatasets(request=request, metadata=metadata) - else: - response = self.stub.ListSavedDatasets(request) - + response = self.stub.ListSavedDatasets(request) return [ SavedDataset.from_proto(saved_dataset) for saved_dataset in response.saved_datasets @@ -484,23 +342,13 @@ def apply_validation_reference( project=project, commit=commit, ) - - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_auth_header(self.auth_config) - self.stub.ApplyValidationReference(request=request, metadata=metadata) - else: - self.stub.ApplyValidationReference(request) + self.stub.ApplyValidationReference(request) def delete_validation_reference(self, name: str, project: str, commit: bool = True): request = RegistryServer_pb2.DeleteValidationReferenceRequest( name=name, project=project, commit=commit ) - - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_auth_header(self.auth_config) - self.stub.DeleteValidationReference(request=request, metadata=metadata) - else: - self.stub.DeleteValidationReference(request) + self.stub.DeleteValidationReference(request) def get_validation_reference( self, name: str, project: str, allow_cache: bool = False @@ -508,15 +356,7 @@ def get_validation_reference( request = RegistryServer_pb2.GetValidationReferenceRequest( name=name, project=project, allow_cache=allow_cache ) - - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_auth_header(self.auth_config) - response = self.stub.GetValidationReference( - request=request, metadata=metadata - ) - else: - response = self.stub.GetValidationReference(request) - + response = self.stub.GetValidationReference(request) return ValidationReference.from_proto(response) def list_validation_references( @@ -528,15 +368,7 @@ def list_validation_references( request = RegistryServer_pb2.ListValidationReferencesRequest( project=project, allow_cache=allow_cache, tags=tags ) - - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_auth_header(self.auth_config) - response = self.stub.ListValidationReferences( - request=request, metadata=metadata - ) - else: - response = self.stub.ListValidationReferences(request) - + response = self.stub.ListValidationReferences(request) return [ ValidationReference.from_proto(validation_reference) for validation_reference in response.validation_references @@ -548,37 +380,20 @@ def list_project_metadata( request = RegistryServer_pb2.ListProjectMetadataRequest( project=project, allow_cache=allow_cache ) - - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_auth_header(self.auth_config) - response = self.stub.ListProjectMetadata(request=request, metadata=metadata) - else: - response = self.stub.ListProjectMetadata(request) - + response = self.stub.ListProjectMetadata(request) return [ProjectMetadata.from_proto(pm) for pm in response.project_metadata] def update_infra(self, infra: Infra, project: str, commit: bool = True): request = RegistryServer_pb2.UpdateInfraRequest( infra=infra.to_proto(), project=project, commit=commit ) - - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_auth_header(self.auth_config) - self.stub.UpdateInfra(request=request, metadata=metadata) - else: - self.stub.UpdateInfra(request) + self.stub.UpdateInfra(request) def get_infra(self, project: str, allow_cache: bool = False) -> Infra: request = RegistryServer_pb2.GetInfraRequest( project=project, allow_cache=allow_cache ) - - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_auth_header(self.auth_config) - response = self.stub.GetInfra(request=request, metadata=metadata) - else: - response = self.stub.GetInfra(request) - + response = self.stub.GetInfra(request) return Infra.from_proto(response) def apply_user_metadata( @@ -603,23 +418,13 @@ def apply_permission( request = RegistryServer_pb2.ApplyPermissionRequest( permission=permission_proto, project=project, commit=commit ) - - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_auth_header(self.auth_config) - self.stub.ApplyPermission(request=request, metadata=metadata) - else: - self.stub.ApplyPermission(request) + self.stub.ApplyPermission(request) def delete_permission(self, name: str, project: str, commit: bool = True): request = RegistryServer_pb2.DeletePermissionRequest( name=name, project=project, commit=commit ) - - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_auth_header(self.auth_config) - self.stub.DeletePermission(request=request, metadata=metadata) - else: - self.stub.DeletePermission(request) + self.stub.DeletePermission(request) def get_permission( self, name: str, project: str, allow_cache: bool = False @@ -627,12 +432,7 @@ def get_permission( request = RegistryServer_pb2.GetPermissionRequest( name=name, project=project, allow_cache=allow_cache ) - - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_auth_header(self.auth_config) - response = self.stub.GetPermission(request=request, metadata=metadata) - else: - response = self.stub.GetPermission(request) + response = self.stub.GetPermission(request) return Permission.from_proto(response) @@ -645,39 +445,20 @@ def list_permissions( request = RegistryServer_pb2.ListPermissionsRequest( project=project, allow_cache=allow_cache, tags=tags ) - - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_auth_header(self.auth_config) - response = self.stub.ListPermissions(request=request, metadata=metadata) - else: - response = self.stub.ListPermissions(request) - + response = self.stub.ListPermissions(request) return [ Permission.from_proto(permission) for permission in response.permissions ] def proto(self) -> RegistryProto: - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_auth_header(self.auth_config) - return self.stub.Proto(Empty(), metadata=metadata) - else: - return self.stub.Proto(Empty()) + return self.stub.Proto(Empty()) def commit(self): - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_auth_header(self.auth_config) - self.stub.Commit(Empty(), metadata=metadata) - else: - self.stub.Commit(Empty()) + self.stub.Commit(Empty()) def refresh(self, project: Optional[str] = None): request = RegistryServer_pb2.RefreshRequest(project=str(project)) - - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_auth_header(self.auth_config) - self.stub.Refresh(request=request, metadata=metadata) - else: - self.stub.Refresh(request) + self.stub.Refresh(request) def teardown(self): pass diff --git a/sdk/python/feast/permissions/client/grpc_client_auth_interceptor.py b/sdk/python/feast/permissions/client/grpc_client_auth_interceptor.py new file mode 100644 index 0000000000..c3e6ead584 --- /dev/null +++ b/sdk/python/feast/permissions/client/grpc_client_auth_interceptor.py @@ -0,0 +1,58 @@ +import logging + +import grpc + +from feast.permissions.auth.auth_type import AuthType +from feast.permissions.auth_model import AuthConfig +from feast.permissions.client.auth_client_manager import get_auth_client_manager + +logger = logging.getLogger(__name__) + + +class GrpcClientAuthHeaderInterceptor( + grpc.UnaryUnaryClientInterceptor, + grpc.UnaryStreamClientInterceptor, + grpc.StreamUnaryClientInterceptor, + grpc.StreamStreamClientInterceptor, +): + def __init__(self, auth_type: AuthConfig): + self._auth_type = auth_type + + def intercept_unary_unary( + self, continuation, client_call_details, request_iterator + ): + client_call_details = self._append_auth_header_metadata(client_call_details) + return continuation(client_call_details, request_iterator) + + def intercept_unary_stream( + self, continuation, client_call_details, request_iterator + ): + client_call_details = self._append_auth_header_metadata(client_call_details) + return continuation(client_call_details, request_iterator) + + def intercept_stream_unary( + self, continuation, client_call_details, request_iterator + ): + client_call_details = self._append_auth_header_metadata(client_call_details) + return continuation(client_call_details, request_iterator) + + def intercept_stream_stream( + self, continuation, client_call_details, request_iterator + ): + client_call_details = self._append_auth_header_metadata(client_call_details) + return continuation(client_call_details, request_iterator) + + def _append_auth_header_metadata(self, client_call_details): + if self._auth_type.type is not AuthType.NONE.value: + logger.info( + f"Intercepted the grpc api method {client_call_details.method} call to inject Authorization header " + f"token. " + ) + metadata = client_call_details.metadata or [] + auth_client_manager = get_auth_client_manager(self._auth_type) + access_token = auth_client_manager.get_token() + metadata.append( + (b"Authorization", b"Bearer " + access_token.encode("utf-8")) + ) + client_call_details = client_call_details._replace(metadata=metadata) + return client_call_details From 9c42cfb43237bafaadae5dbaea239280152cb02c Mon Sep 17 00:00:00 2001 From: Lokesh Rangineni Date: Fri, 2 Aug 2024 17:28:57 -0400 Subject: [PATCH 122/169] Created the grpc client auth header interceptor and removed the manual injection of the header. Signed-off-by: Lokesh Rangineni Signed-off-by: Abdul Hameed --- .../feast/permissions/client/grpc_client_auth_interceptor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/python/feast/permissions/client/grpc_client_auth_interceptor.py b/sdk/python/feast/permissions/client/grpc_client_auth_interceptor.py index c3e6ead584..f10b8d911a 100644 --- a/sdk/python/feast/permissions/client/grpc_client_auth_interceptor.py +++ b/sdk/python/feast/permissions/client/grpc_client_auth_interceptor.py @@ -52,7 +52,7 @@ def _append_auth_header_metadata(self, client_call_details): auth_client_manager = get_auth_client_manager(self._auth_type) access_token = auth_client_manager.get_token() metadata.append( - (b"Authorization", b"Bearer " + access_token.encode("utf-8")) + (b"authorization", b"Bearer " + access_token.encode("utf-8")) ) client_call_details = client_call_details._replace(metadata=metadata) return client_call_details From b51e58c692f477b3a818a71af59bcc29681b5784 Mon Sep 17 00:00:00 2001 From: Theodor Mihalache Date: Tue, 6 Aug 2024 10:51:04 -0400 Subject: [PATCH 123/169] fix: java to proto failing - changed java_outer_classname for Permission.proto and Policy.proto - removed experimental optional from permission proto Signed-off-by: Theodor Mihalache Signed-off-by: Abdul Hameed --- protos/feast/core/Permission.proto | 4 ++-- protos/feast/core/Policy.proto | 2 +- sdk/python/feast/permissions/permission.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/protos/feast/core/Permission.proto b/protos/feast/core/Permission.proto index aba9f0bb40..e464164afa 100644 --- a/protos/feast/core/Permission.proto +++ b/protos/feast/core/Permission.proto @@ -2,7 +2,7 @@ syntax = "proto3"; package feast.core; option go_package = "github.com/feast-dev/feast/go/protos/feast/core"; -option java_outer_classname = "Permission"; +option java_outer_classname = "PermissionProto"; option java_package = "feast.proto.core"; import "feast/core/Policy.proto"; @@ -43,7 +43,7 @@ message Permission { bool with_subclasses = 4; - optional string name_pattern = 5; + string name_pattern = 5; map required_tags = 6; diff --git a/protos/feast/core/Policy.proto b/protos/feast/core/Policy.proto index e4313535ec..7ad42b9797 100644 --- a/protos/feast/core/Policy.proto +++ b/protos/feast/core/Policy.proto @@ -2,7 +2,7 @@ syntax = "proto3"; package feast.core; option go_package = "github.com/feast-dev/feast/go/protos/feast/core"; -option java_outer_classname = "Policy"; +option java_outer_classname = "PolicyProto"; option java_package = "feast.proto.core"; message Policy { diff --git a/sdk/python/feast/permissions/permission.py b/sdk/python/feast/permissions/permission.py index cb2e1250f5..b62fa7c01a 100644 --- a/sdk/python/feast/permissions/permission.py +++ b/sdk/python/feast/permissions/permission.py @@ -206,7 +206,7 @@ def to_proto(self) -> PermissionProto: name=self.name, types=types, with_subclasses=self.with_subclasses, - name_pattern=self.name_pattern if self.name_pattern is not None else None, + name_pattern=self.name_pattern if self.name_pattern is not None else "", actions=actions, policy=self.policy.to_proto(), tags=self._tags if self._tags is not None else None, From bc1f30ca95a3f88e43bfed4dc7b47e2cd9e66e5c Mon Sep 17 00:00:00 2001 From: Theodor Mihalache Date: Mon, 8 Jul 2024 10:48:55 -0400 Subject: [PATCH 124/169] CLI command "feast permissions list" Added cli command permissions Added tags parameter to list_validation_references and list_saved_datasets in registry Added list_validation_references and list_saved_datasets apis to feature_store Added missing tags parameters to registry_server methods Signed-off-by: Theodor Mihalache Signed-off-by: Abdul Hameed --- sdk/python/requirements/py3.10-ci-requirements.txt | 1 + sdk/python/requirements/py3.11-ci-requirements.txt | 1 + sdk/python/requirements/py3.9-ci-requirements.txt | 1 + 3 files changed, 3 insertions(+) diff --git a/sdk/python/requirements/py3.10-ci-requirements.txt b/sdk/python/requirements/py3.10-ci-requirements.txt index 2e6aaa63dc..89459d1a69 100644 --- a/sdk/python/requirements/py3.10-ci-requirements.txt +++ b/sdk/python/requirements/py3.10-ci-requirements.txt @@ -1068,3 +1068,4 @@ yarl==1.9.4 # via aiohttp zipp==3.19.1 # via importlib-metadata +bigtree==0.19.2 diff --git a/sdk/python/requirements/py3.11-ci-requirements.txt b/sdk/python/requirements/py3.11-ci-requirements.txt index fd0b5a6d26..c554ec6ae7 100644 --- a/sdk/python/requirements/py3.11-ci-requirements.txt +++ b/sdk/python/requirements/py3.11-ci-requirements.txt @@ -1046,3 +1046,4 @@ yarl==1.9.4 # via aiohttp zipp==3.19.1 # via importlib-metadata +bigtree==0.19.2 diff --git a/sdk/python/requirements/py3.9-ci-requirements.txt b/sdk/python/requirements/py3.9-ci-requirements.txt index be30f032a9..bae0a23376 100644 --- a/sdk/python/requirements/py3.9-ci-requirements.txt +++ b/sdk/python/requirements/py3.9-ci-requirements.txt @@ -1082,3 +1082,4 @@ yarl==1.9.4 # via aiohttp zipp==3.19.1 # via importlib-metadata +bigtree==0.19.2 From 63fa1e81affd35d22ff46ad55f2e8c44e67b782d Mon Sep 17 00:00:00 2001 From: lokeshrangineni Date: Thu, 25 Jul 2024 17:32:25 -0400 Subject: [PATCH 125/169] Moved the common fixtures to the root conftest.py or auth_permissions_util.py (#54) * Moved the common fixtures to the root conftest.py or auth_permissions_util.py Signed-off-by: Lokesh Rangineni Signed-off-by: Lokesh Rangineni * Adding missed dependency and regenerated the requirements files. Signed-off-by: Lokesh Rangineni Signed-off-by: Lokesh Rangineni * Addinig missing changes from the original PR. Signed-off-by: Lokesh Rangineni Signed-off-by: Lokesh Rangineni --------- Signed-off-by: Lokesh Rangineni Signed-off-by: Abdul Hameed --- sdk/python/requirements/py3.11-ci-requirements.txt | 1 - sdk/python/requirements/py3.9-ci-requirements.txt | 1 - 2 files changed, 2 deletions(-) diff --git a/sdk/python/requirements/py3.11-ci-requirements.txt b/sdk/python/requirements/py3.11-ci-requirements.txt index c554ec6ae7..fd0b5a6d26 100644 --- a/sdk/python/requirements/py3.11-ci-requirements.txt +++ b/sdk/python/requirements/py3.11-ci-requirements.txt @@ -1046,4 +1046,3 @@ yarl==1.9.4 # via aiohttp zipp==3.19.1 # via importlib-metadata -bigtree==0.19.2 diff --git a/sdk/python/requirements/py3.9-ci-requirements.txt b/sdk/python/requirements/py3.9-ci-requirements.txt index bae0a23376..be30f032a9 100644 --- a/sdk/python/requirements/py3.9-ci-requirements.txt +++ b/sdk/python/requirements/py3.9-ci-requirements.txt @@ -1082,4 +1082,3 @@ yarl==1.9.4 # via aiohttp zipp==3.19.1 # via importlib-metadata -bigtree==0.19.2 From 8c17cf8d022fb257aa457207122f445b168500d7 Mon Sep 17 00:00:00 2001 From: Theodor Mihalache Date: Tue, 6 Aug 2024 11:50:02 -0400 Subject: [PATCH 126/169] fix: java to proto failing - changed java_outer_classname for Permission.proto and Policy.proto - removed experimental optional from permission proto Signed-off-by: Theodor Mihalache Signed-off-by: Abdul Hameed --- .../online_store/test_remote_online_store.py | 53 ------------------- .../tests/utils/auth_permissions_util.py | 17 +++++- 2 files changed, 16 insertions(+), 54 deletions(-) diff --git a/sdk/python/tests/integration/online_store/test_remote_online_store.py b/sdk/python/tests/integration/online_store/test_remote_online_store.py index ebb8a0099e..199c76940f 100644 --- a/sdk/python/tests/integration/online_store/test_remote_online_store.py +++ b/sdk/python/tests/integration/online_store/test_remote_online_store.py @@ -228,56 +228,3 @@ def _overwrite_remote_client_feature_store_yaml( ) + auth_config ) - - -def _start_feature_server(repo_path: str, server_port: int, metrics: bool = False): - host = "0.0.0.0" - cmd = [ - "feast", - "-c" + repo_path, - "serve", - "--host", - host, - "--port", - str(server_port), - ] - feast_server_process = subprocess.Popen( - cmd, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL - ) - _time_out_sec: int = 60 - # Wait for server to start - wait_retry_backoff( - lambda: (None, check_port_open(host, server_port)), - timeout_secs=_time_out_sec, - timeout_msg=f"Unable to start the feast server in {_time_out_sec} seconds for remote online store type, port={server_port}", - ) - - if metrics: - cmd.append("--metrics") - - # Check if metrics are enabled and Prometheus server is running - if metrics: - wait_retry_backoff( - lambda: (None, check_port_open("localhost", 8000)), - timeout_secs=_time_out_sec, - timeout_msg="Unable to start the Prometheus server in 60 seconds.", - ) - else: - assert not check_port_open( - "localhost", 8000 - ), "Prometheus server is running when it should be disabled." - - yield f"http://localhost:{server_port}" - - if feast_server_process is not None: - feast_server_process.kill() - - # wait server to free the port - wait_retry_backoff( - lambda: ( - None, - not check_port_open("localhost", server_port), - ), - timeout_msg=f"Unable to stop the feast server in {_time_out_sec} seconds for remote online store type, port={server_port}", - timeout_secs=_time_out_sec, - ) diff --git a/sdk/python/tests/utils/auth_permissions_util.py b/sdk/python/tests/utils/auth_permissions_util.py index 8f4044bc6a..3b5e589812 100644 --- a/sdk/python/tests/utils/auth_permissions_util.py +++ b/sdk/python/tests/utils/auth_permissions_util.py @@ -54,7 +54,7 @@ def default_store( return fs -def start_feature_server(repo_path: str, server_port: int): +def start_feature_server(repo_path: str, server_port: int, metrics: bool = False): host = "0.0.0.0" cmd = [ "feast", @@ -76,6 +76,21 @@ def start_feature_server(repo_path: str, server_port: int): timeout_msg=f"Unable to start the feast server in {_time_out_sec} seconds for remote online store type, port={server_port}", ) + if metrics: + cmd.append("--metrics") + + # Check if metrics are enabled and Prometheus server is running + if metrics: + wait_retry_backoff( + lambda: (None, check_port_open("localhost", 8000)), + timeout_secs=_time_out_sec, + timeout_msg="Unable to start the Prometheus server in 60 seconds.", + ) + else: + assert not check_port_open( + "localhost", 8000 + ), "Prometheus server is running when it should be disabled." + yield f"http://localhost:{server_port}" if feast_server_process is not None: From 035f19779e6cab61b6b936be334fb6917fd98185 Mon Sep 17 00:00:00 2001 From: Lokesh Rangineni <19699092+lokeshrangineni@users.noreply.github.com> Date: Tue, 6 Aug 2024 13:05:51 -0400 Subject: [PATCH 127/169] Adding the extra writer permission to fix the integration test issue with offline server. Signed-off-by: Lokesh Rangineni <19699092+lokeshrangineni@users.noreply.github.com> Signed-off-by: Abdul Hameed --- .../feature_repos/repo_configuration.py | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/sdk/python/tests/integration/feature_repos/repo_configuration.py b/sdk/python/tests/integration/feature_repos/repo_configuration.py index e34ece8474..9a0784b3af 100644 --- a/sdk/python/tests/integration/feature_repos/repo_configuration.py +++ b/sdk/python/tests/integration/feature_repos/repo_configuration.py @@ -488,36 +488,36 @@ def setup(self): Permission( name="offline_permissions_perm", types=Permission, - policy=RoleBasedPolicy(roles=["reader"]), - actions=[AuthzedAction.QUERY_OFFLINE], + policy=RoleBasedPolicy(roles=["reader", "writer"]), + actions=[AuthzedAction.QUERY_OFFLINE, AuthzedAction.WRITE_OFFLINE], ), Permission( name="offline_entities_perm", types=Entity, with_subclasses=False, - policy=RoleBasedPolicy(roles=["reader"]), - actions=[AuthzedAction.QUERY_OFFLINE], + policy=RoleBasedPolicy(roles=["reader", "writer"]), + actions=[AuthzedAction.QUERY_OFFLINE, AuthzedAction.WRITE_OFFLINE], ), Permission( name="offline_fv_perm", types=FeatureView, with_subclasses=False, - policy=RoleBasedPolicy(roles=["reader"]), - actions=[AuthzedAction.QUERY_OFFLINE], + policy=RoleBasedPolicy(roles=["reader", "writer"]), + actions=[AuthzedAction.QUERY_OFFLINE, AuthzedAction.WRITE_OFFLINE], ), Permission( name="offline_odfv_perm", types=OnDemandFeatureView, with_subclasses=False, - policy=RoleBasedPolicy(roles=["reader"]), - actions=[AuthzedAction.QUERY_OFFLINE], + policy=RoleBasedPolicy(roles=["reader", "writer"]), + actions=[AuthzedAction.QUERY_OFFLINE, AuthzedAction.WRITE_OFFLINE], ), Permission( name="offline_sfv_perm", types=StreamFeatureView, with_subclasses=False, - policy=RoleBasedPolicy(roles=["reader"]), - actions=[AuthzedAction.QUERY_OFFLINE], + policy=RoleBasedPolicy(roles=["reader", "writer"]), + actions=[AuthzedAction.QUERY_OFFLINE, AuthzedAction.WRITE_OFFLINE], ), ] self.feature_store.apply(permissions_list) From f98b8d14345305e0ba034461e312ee24fc31d4c4 Mon Sep 17 00:00:00 2001 From: Theodor Mihalache Date: Tue, 6 Aug 2024 13:25:20 -0400 Subject: [PATCH 128/169] Try to fix java integration test - ModuleNotFoundError: No module named 'feast.permissions.server' Signed-off-by: Theodor Mihalache Signed-off-by: Abdul Hameed --- sdk/python/feast/permissions/client/__init__.py | 0 sdk/python/feast/permissions/server/__init__.py | 0 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 sdk/python/feast/permissions/client/__init__.py create mode 100644 sdk/python/feast/permissions/server/__init__.py diff --git a/sdk/python/feast/permissions/client/__init__.py b/sdk/python/feast/permissions/client/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/sdk/python/feast/permissions/server/__init__.py b/sdk/python/feast/permissions/server/__init__.py new file mode 100644 index 0000000000..e69de29bb2 From 7c7ec376cac0d32df16f810de503e12f02621786 Mon Sep 17 00:00:00 2001 From: Theodor Mihalache Date: Tue, 6 Aug 2024 13:56:54 -0400 Subject: [PATCH 129/169] fix java integration test - ModuleNotFoundError: No module named 'jwt' Signed-off-by: Theodor Mihalache Signed-off-by: Abdul Hameed --- setup.py | 1 + 1 file changed, 1 insertion(+) diff --git a/setup.py b/setup.py index 84d9354a20..aed885216f 100644 --- a/setup.py +++ b/setup.py @@ -62,6 +62,7 @@ "prometheus_client", "psutil", "bigtree>=0.19.2", + "pyjwt", ] GCP_REQUIRED = [ From 414cd48cfe536d2a7de353d789363e23ebc0c7fa Mon Sep 17 00:00:00 2001 From: Theodor Mihalache Date: Tue, 6 Aug 2024 14:31:45 -0400 Subject: [PATCH 130/169] fix java integration test - ModuleNotFoundError: No module named 'kubernetes' Signed-off-by: Theodor Mihalache Signed-off-by: Abdul Hameed --- setup.py | 1 + 1 file changed, 1 insertion(+) diff --git a/setup.py b/setup.py index aed885216f..f852e5b02a 100644 --- a/setup.py +++ b/setup.py @@ -63,6 +63,7 @@ "psutil", "bigtree>=0.19.2", "pyjwt", + "kubernetes<=20.13.0", ] GCP_REQUIRED = [ From 763109941e5f8d03520ddbbac5307304d67fe960 Mon Sep 17 00:00:00 2001 From: lokeshrangineni <19699092+lokeshrangineni@users.noreply.github.com> Date: Tue, 6 Aug 2024 19:39:58 -0400 Subject: [PATCH 131/169] Adding missing permissions for offline store test cases - classes FileSource, FeatureService classes. (#64) Signed-off-by: Lokesh Rangineni <19699092+lokeshrangineni@users.noreply.github.com> Signed-off-by: Abdul Hameed --- .../feature_repos/repo_configuration.py | 26 +++++++++++++++---- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/sdk/python/tests/integration/feature_repos/repo_configuration.py b/sdk/python/tests/integration/feature_repos/repo_configuration.py index 9a0784b3af..b83378c26c 100644 --- a/sdk/python/tests/integration/feature_repos/repo_configuration.py +++ b/sdk/python/tests/integration/feature_repos/repo_configuration.py @@ -22,11 +22,13 @@ from feast.constants import FULL_REPO_CONFIGS_MODULE_ENV_NAME from feast.data_source import DataSource from feast.errors import FeastModuleImportError +from feast.feature_service import FeatureService from feast.infra.feature_servers.base_config import ( BaseFeatureServerConfig, FeatureLoggingConfig, ) from feast.infra.feature_servers.local_process.config import LocalFeatureServerConfig +from feast.infra.offline_stores.file_source import FileSource from feast.permissions.action import AuthzedAction from feast.permissions.auth_model import OidcAuthConfig from feast.permissions.permission import Permission @@ -488,35 +490,49 @@ def setup(self): Permission( name="offline_permissions_perm", types=Permission, - policy=RoleBasedPolicy(roles=["reader", "writer"]), + policy=RoleBasedPolicy(roles=["writer"]), actions=[AuthzedAction.QUERY_OFFLINE, AuthzedAction.WRITE_OFFLINE], ), Permission( name="offline_entities_perm", types=Entity, with_subclasses=False, - policy=RoleBasedPolicy(roles=["reader", "writer"]), + policy=RoleBasedPolicy(roles=["writer"]), actions=[AuthzedAction.QUERY_OFFLINE, AuthzedAction.WRITE_OFFLINE], ), Permission( name="offline_fv_perm", types=FeatureView, with_subclasses=False, - policy=RoleBasedPolicy(roles=["reader", "writer"]), + policy=RoleBasedPolicy(roles=["writer"]), actions=[AuthzedAction.QUERY_OFFLINE, AuthzedAction.WRITE_OFFLINE], ), Permission( name="offline_odfv_perm", types=OnDemandFeatureView, with_subclasses=False, - policy=RoleBasedPolicy(roles=["reader", "writer"]), + policy=RoleBasedPolicy(roles=["writer"]), actions=[AuthzedAction.QUERY_OFFLINE, AuthzedAction.WRITE_OFFLINE], ), Permission( name="offline_sfv_perm", types=StreamFeatureView, with_subclasses=False, - policy=RoleBasedPolicy(roles=["reader", "writer"]), + policy=RoleBasedPolicy(roles=["writer"]), + actions=[AuthzedAction.QUERY_OFFLINE, AuthzedAction.WRITE_OFFLINE], + ), + Permission( + name="offline_fs_perm", + types=FeatureService, + with_subclasses=False, + policy=RoleBasedPolicy(roles=["writer"]), + actions=[AuthzedAction.QUERY_OFFLINE, AuthzedAction.WRITE_OFFLINE], + ), + Permission( + name="offline_filesource_perm", + types=FileSource, + with_subclasses=False, + policy=RoleBasedPolicy(roles=["writer"]), actions=[AuthzedAction.QUERY_OFFLINE, AuthzedAction.WRITE_OFFLINE], ), ] From 54a83929b999d05db08b49ec58551130befeaec8 Mon Sep 17 00:00:00 2001 From: Lokesh Rangineni <19699092+lokeshrangineni@users.noreply.github.com> Date: Wed, 7 Aug 2024 10:37:18 -0400 Subject: [PATCH 132/169] Updating the offline integration test permissions. Signed-off-by: Lokesh Rangineni <19699092+lokeshrangineni@users.noreply.github.com> Signed-off-by: Abdul Hameed --- .../tests/integration/feature_repos/repo_configuration.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/sdk/python/tests/integration/feature_repos/repo_configuration.py b/sdk/python/tests/integration/feature_repos/repo_configuration.py index b83378c26c..8659a78551 100644 --- a/sdk/python/tests/integration/feature_repos/repo_configuration.py +++ b/sdk/python/tests/integration/feature_repos/repo_configuration.py @@ -28,7 +28,6 @@ FeatureLoggingConfig, ) from feast.infra.feature_servers.local_process.config import LocalFeatureServerConfig -from feast.infra.offline_stores.file_source import FileSource from feast.permissions.action import AuthzedAction from feast.permissions.auth_model import OidcAuthConfig from feast.permissions.permission import Permission @@ -529,9 +528,9 @@ def setup(self): actions=[AuthzedAction.QUERY_OFFLINE, AuthzedAction.WRITE_OFFLINE], ), Permission( - name="offline_filesource_perm", - types=FileSource, - with_subclasses=False, + name="offline_datasource_perm", + types=DataSource, + with_subclasses=True, policy=RoleBasedPolicy(roles=["writer"]), actions=[AuthzedAction.QUERY_OFFLINE, AuthzedAction.WRITE_OFFLINE], ), From 366e288ddb7c587e3f17089a9a3d795898b06f28 Mon Sep 17 00:00:00 2001 From: Abdul Hameed Date: Wed, 7 Aug 2024 15:20:16 -0400 Subject: [PATCH 133/169] updated test.py file for rbac-example Signed-off-by: Abdul Hameed --- examples/rbac/client/feature_repo/test.py | 28 +++++++++++++++++------ 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/examples/rbac/client/feature_repo/test.py b/examples/rbac/client/feature_repo/test.py index 8ea2c559fe..082061435e 100644 --- a/examples/rbac/client/feature_repo/test.py +++ b/examples/rbac/client/feature_repo/test.py @@ -18,8 +18,16 @@ def run_demo(): print("\n--- Historical features for batch scoring ---") fetch_historical_features_entity_df(store, for_batch_scoring=True) - print("\n--- Load features into online store ---") - store.materialize_incremental(end_date=datetime.now()) + try: + print("\n--- Load features into online store/materialize_incremental ---") + feature_views= store.list_feature_views() + if not feature_views: + raise PermissionError("No access to feature-views or no feature-views available.") + store.materialize_incremental(end_date=datetime.now()) + except PermissionError as pe: + print(f"Permission error: {pe}") + except Exception as e: + print(f"An occurred while performing materialize incremental: {e}") print("\n--- Online features ---") fetch_online_features(store) @@ -43,7 +51,6 @@ def run_demo(): "avg_daily_trips": [1000], } ) - print(event_df) store.push("driver_stats_push_source", event_df, to=PushMode.ONLINE_AND_OFFLINE) print("\n--- Online features again with updated values from a stream push---") @@ -65,8 +72,8 @@ def fetch_historical_features_entity_df(store: FeatureStore, for_batch_scoring: ], "label_driver_reported_satisfaction": [1, 5, 3], # values we're using for an on-demand transformation - # "val_to_add": [1, 2, 3], - # "val_to_add_2": [10, 20, 30], + "val_to_add": [1, 2, 3], + "val_to_add_2": [10, 20, 30], } @@ -80,8 +87,8 @@ def fetch_historical_features_entity_df(store: FeatureStore, for_batch_scoring: "driver_hourly_stats:conv_rate", "driver_hourly_stats:acc_rate", "driver_hourly_stats:avg_daily_trips", - # "transformed_conv_rate:conv_rate_plus_val1", - # "transformed_conv_rate:conv_rate_plus_val2", + "transformed_conv_rate:conv_rate_plus_val1", + "transformed_conv_rate:conv_rate_plus_val2", ], ).to_df() print(training_df.head()) @@ -93,11 +100,16 @@ def fetch_historical_features_entity_df(store: FeatureStore, for_batch_scoring: def fetch_online_features(store, source: str = ""): try: entity_rows = [ + # {join_key: entity_value} { "driver_id": 1001, + "val_to_add": 1000, + "val_to_add_2": 2000, }, { "driver_id": 1002, + "val_to_add": 1001, + "val_to_add_2": 2002, }, ] if source == "feature_service": @@ -107,6 +119,8 @@ def fetch_online_features(store, source: str = ""): else: features_to_fetch = [ "driver_hourly_stats:acc_rate", + "transformed_conv_rate:conv_rate_plus_val1", + "transformed_conv_rate:conv_rate_plus_val2", ] returned_features = store.get_online_features( features=features_to_fetch, From cdb19faed861cdbfe2a17c91089acf0cde7c8aa8 Mon Sep 17 00:00:00 2001 From: Abdul Hameed Date: Wed, 7 Aug 2024 16:06:15 -0400 Subject: [PATCH 134/169] fix the DeleteFeatureView function to handle stream feature view type Signed-off-by: Abdul Hameed --- sdk/python/feast/registry_server.py | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/sdk/python/feast/registry_server.py b/sdk/python/feast/registry_server.py index 7b88a29c41..8be333264f 100644 --- a/sdk/python/feast/registry_server.py +++ b/sdk/python/feast/registry_server.py @@ -1,6 +1,6 @@ from concurrent import futures from datetime import datetime -from typing import cast +from typing import Union, cast from datetime import datetime, timezone import grpc @@ -9,6 +9,7 @@ from feast import FeatureService, FeatureStore from feast.data_source import DataSource from feast.entity import Entity +from feast.errors import FeatureViewNotFoundException from feast.feast_object import FeastObject from feast.feature_view import FeatureView from feast.infra.infra_object import Infra @@ -203,10 +204,19 @@ def ListFeatureViews( def DeleteFeatureView( self, request: RegistryServer_pb2.DeleteFeatureViewRequest, context ): + feature_view: Union[StreamFeatureView, FeatureView] + + try: + feature_view = self.proxied_registry.get_stream_feature_view( + name=request.name, project=request.project, allow_cache=False + ) + except FeatureViewNotFoundException: + feature_view = self.proxied_registry.get_feature_view( + name=request.name, project=request.project, allow_cache=False + ) + assert_permissions( - resource=self.proxied_registry.get_feature_view( - name=request.name, project=request.project - ), + resource=feature_view, actions=[AuthzedAction.DELETE], ) self.proxied_registry.delete_feature_view( From 3b06316c541d355c7d0d01044c05ac56a27ba38d Mon Sep 17 00:00:00 2001 From: Lokesh Rangineni <19699092+lokeshrangineni@users.noreply.github.com> Date: Wed, 7 Aug 2024 23:55:25 -0400 Subject: [PATCH 135/169] Updating permissions of the integration test cases to address code review comments and also check if the online_read integration test fixes. Signed-off-by: Lokesh Rangineni <19699092+lokeshrangineni@users.noreply.github.com> Signed-off-by: Abdul Hameed --- .../feature_repos/repo_configuration.py | 14 ------------- .../online_store/test_remote_online_store.py | 21 ++++--------------- 2 files changed, 4 insertions(+), 31 deletions(-) diff --git a/sdk/python/tests/integration/feature_repos/repo_configuration.py b/sdk/python/tests/integration/feature_repos/repo_configuration.py index 8659a78551..6ba2b20347 100644 --- a/sdk/python/tests/integration/feature_repos/repo_configuration.py +++ b/sdk/python/tests/integration/feature_repos/repo_configuration.py @@ -12,7 +12,6 @@ import pytest from feast import ( - Entity, FeatureStore, FeatureView, OnDemandFeatureView, @@ -486,19 +485,6 @@ def setup(self): self.feature_store = FeatureStore(config=self.config) permissions_list = [ - Permission( - name="offline_permissions_perm", - types=Permission, - policy=RoleBasedPolicy(roles=["writer"]), - actions=[AuthzedAction.QUERY_OFFLINE, AuthzedAction.WRITE_OFFLINE], - ), - Permission( - name="offline_entities_perm", - types=Entity, - with_subclasses=False, - policy=RoleBasedPolicy(roles=["writer"]), - actions=[AuthzedAction.QUERY_OFFLINE, AuthzedAction.WRITE_OFFLINE], - ), Permission( name="offline_fv_perm", types=FeatureView, diff --git a/sdk/python/tests/integration/online_store/test_remote_online_store.py b/sdk/python/tests/integration/online_store/test_remote_online_store.py index 199c76940f..57bafc6d5e 100644 --- a/sdk/python/tests/integration/online_store/test_remote_online_store.py +++ b/sdk/python/tests/integration/online_store/test_remote_online_store.py @@ -4,7 +4,7 @@ import pytest -from feast import Entity, FeatureView, OnDemandFeatureView, StreamFeatureView +from feast import FeatureView, OnDemandFeatureView, StreamFeatureView from feast.feature_store import FeatureStore from feast.permissions.action import AuthzedAction from feast.permissions.permission import Permission @@ -22,39 +22,26 @@ def test_remote_online_store_read(auth_config): with tempfile.TemporaryDirectory() as remote_server_tmp_dir, tempfile.TemporaryDirectory() as remote_client_tmp_dir: permissions_list = [ - Permission( - name="online_list_entities_perm", - types=Entity, - with_subclasses=False, - policy=RoleBasedPolicy(roles=["reader"]), - actions=[AuthzedAction.READ], - ), - Permission( - name="online_list_permissions_perm", - types=Permission, - policy=RoleBasedPolicy(roles=["reader"]), - actions=[AuthzedAction.READ], - ), Permission( name="online_list_fv_perm", types=FeatureView, with_subclasses=False, policy=RoleBasedPolicy(roles=["reader"]), - actions=[AuthzedAction.READ], + actions=[AuthzedAction.QUERY_ONLINE], ), Permission( name="online_list_odfv_perm", types=OnDemandFeatureView, with_subclasses=False, policy=RoleBasedPolicy(roles=["reader"]), - actions=[AuthzedAction.READ], + actions=[AuthzedAction.QUERY_ONLINE], ), Permission( name="online_list_sfv_perm", types=StreamFeatureView, with_subclasses=False, policy=RoleBasedPolicy(roles=["reader"]), - actions=[AuthzedAction.READ], + actions=[AuthzedAction.QUERY_ONLINE], ), ] server_store, server_url, registry_path = ( From 61f5ef107f032721c487ece414ba040c5280c840 Mon Sep 17 00:00:00 2001 From: Lokesh Rangineni <19699092+lokeshrangineni@users.noreply.github.com> Date: Thu, 8 Aug 2024 00:30:33 -0400 Subject: [PATCH 136/169] Incorporating the code review comments from Francisco on upstream PR. Signed-off-by: Lokesh Rangineni <19699092+lokeshrangineni@users.noreply.github.com> Signed-off-by: Abdul Hameed --- docs/getting-started/concepts/permission.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/getting-started/concepts/permission.md b/docs/getting-started/concepts/permission.md index 71e9efc629..1902427c35 100644 --- a/docs/getting-started/concepts/permission.md +++ b/docs/getting-started/concepts/permission.md @@ -52,7 +52,7 @@ The `feast` CLI includes a new `permissions` command to list the registered perm {% endhint %} ## Configuration examples -This permission configuration allows to access the resource state and query all the stores for any feature view or feature service +This permission configuration allows access to the resource state and the ability to query all the stores for any feature view or feature service to all users with role `super-reader`: ```py Permission( @@ -64,12 +64,12 @@ Permission( ``` Please note that all sub-classes of `FeatureView` are also included since the default for the `with_subclasses` parameter is `True`. -This example grants permission to write on all the data sources with `risk_level` tag set to `hi` only to users with role `admin` or `data_team`: +This example grants permission to write on all the data sources with `risk_level` tag set to `high` only to users with role `admin` or `data_team`: ```py Permission( name="ds-writer", types=[DataSource], - required_tags={"risk_level": "hi"}, + required_tags={"risk_level": "high"}, policy=RoleBasedPolicy(roles=["admin", "data_team"]), actions=[AuthzedAction.WRITE], ) @@ -111,7 +111,7 @@ auth: * Kubernetes rbac authentication/authorization example: {% hint style="info" %} -**NOTE**: This configuration will only work if you deploy feast on Openshift or Kubernetes platform. +**NOTE**: This configuration will only work if you deploy feast on Openshift or a Kubernetes platform. {% endhint %} ```yaml project: foo From 5b67a6ccbee75d34703a962790f246caf235f9f0 Mon Sep 17 00:00:00 2001 From: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Date: Thu, 8 Aug 2024 10:25:28 +0200 Subject: [PATCH 137/169] Update docs/getting-started/concepts/permission.md Co-authored-by: Francisco Arceo Signed-off-by: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Signed-off-by: Abdul Hameed --- docs/getting-started/concepts/permission.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/getting-started/concepts/permission.md b/docs/getting-started/concepts/permission.md index 1902427c35..27d2485be4 100644 --- a/docs/getting-started/concepts/permission.md +++ b/docs/getting-started/concepts/permission.md @@ -9,7 +9,7 @@ The configured permissions are stored in the Feast registry and accessible throu The permission authorization enforcement is performed when requests are executed through one of the Feast (Python) servers - The online feature server (REST) - The offline feature server (Arrow Flight) -- The registry server (grpc) +- The registry server (gRPC) On the contrary, there is no permission enforcement when accessing the Feast API with a local provider. From ab454beeea590207b968f7c9af2060dc4f3c637b Mon Sep 17 00:00:00 2001 From: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Date: Thu, 8 Aug 2024 10:26:46 +0200 Subject: [PATCH 138/169] Update docs/getting-started/concepts/permission.md Co-authored-by: Francisco Arceo Signed-off-by: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Signed-off-by: Abdul Hameed --- docs/getting-started/concepts/permission.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/getting-started/concepts/permission.md b/docs/getting-started/concepts/permission.md index 27d2485be4..64e02479b4 100644 --- a/docs/getting-started/concepts/permission.md +++ b/docs/getting-started/concepts/permission.md @@ -25,7 +25,7 @@ The permission model is based on the following components: - `delete`: Delete an instance. - `query`: Query both online and offline stores. - `query_online`: Query the online store. - - `query_offline`: Query the o ffline store. + - `query_offline`: Query the offline store. - `write`: Query on any store. - `write_online`: Write to the online store. - `write_offline`: Write to the offline store. From 8cfe18fa09e451b10b1f10b78db732cf4bd43c06 Mon Sep 17 00:00:00 2001 From: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Date: Thu, 8 Aug 2024 10:27:31 +0200 Subject: [PATCH 139/169] Update docs/getting-started/concepts/permission.md Co-authored-by: Francisco Arceo Signed-off-by: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Signed-off-by: Abdul Hameed --- docs/getting-started/concepts/permission.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/getting-started/concepts/permission.md b/docs/getting-started/concepts/permission.md index 64e02479b4..957356add8 100644 --- a/docs/getting-started/concepts/permission.md +++ b/docs/getting-started/concepts/permission.md @@ -11,7 +11,7 @@ The permission authorization enforcement is performed when requests are executed - The offline feature server (Arrow Flight) - The registry server (gRPC) -On the contrary, there is no permission enforcement when accessing the Feast API with a local provider. +Note that there is no permission enforcement when accessing the Feast API with a local provider. ## Concepts From 7e8bfaa8ad5d0f3cb0034e0ad24a9f126aca2fa7 Mon Sep 17 00:00:00 2001 From: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Date: Thu, 8 Aug 2024 18:21:42 +0200 Subject: [PATCH 140/169] Small fixes (#71) * Improved permission denial log Signed-off-by: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> * Added leeway option to accept tokens released in the past (up to 10") Signed-off-by: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> --------- Signed-off-by: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Signed-off-by: Abdul Hameed --- sdk/python/feast/permissions/auth/oidc_token_parser.py | 1 + sdk/python/feast/permissions/enforcer.py | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/sdk/python/feast/permissions/auth/oidc_token_parser.py b/sdk/python/feast/permissions/auth/oidc_token_parser.py index 355004f4de..91d3709744 100644 --- a/sdk/python/feast/permissions/auth/oidc_token_parser.py +++ b/sdk/python/feast/permissions/auth/oidc_token_parser.py @@ -78,6 +78,7 @@ async def user_details_from_access_token(self, access_token: str) -> User: "verify_signature": True, "verify_exp": True, }, + leeway=10, # accepts tokens generated up to 10 seconds in the past, in case of clock skew ) if "preferred_username" not in data: diff --git a/sdk/python/feast/permissions/enforcer.py b/sdk/python/feast/permissions/enforcer.py index f2b700b01d..af41d12a2c 100644 --- a/sdk/python/feast/permissions/enforcer.py +++ b/sdk/python/feast/permissions/enforcer.py @@ -44,7 +44,7 @@ def enforce_policy( _permitted_resources: list[FeastObject] = [] for resource in resources: logger.debug( - f"Enforcing permission policies for {type(resource)}:{resource.name} to execute {actions}" + f"Enforcing permission policies for {type(resource).__name__}:{resource.name} to execute {actions}" ) matching_permissions = [ p @@ -60,7 +60,7 @@ def enforce_policy( ) evaluator.add_grant( permission_grant, - f"Permission {p.name} denied access: {permission_explanation}", + f"Permission {p.name} denied execution of {[a.value.upper() for a in actions]} to {type(resource).__name__}:{resource.name}: {permission_explanation}", ) if evaluator.is_decided(): From 64185497fa3d352bb3b9b70b37370c8bc34e4ef0 Mon Sep 17 00:00:00 2001 From: Abdul Hameed Date: Thu, 8 Aug 2024 14:04:09 -0400 Subject: [PATCH 141/169] commented/removed oidc tests to verify integration test commented/removed test_auth_permission.py file Signed-off-by: Abdul Hameed --- sdk/python/tests/conftest.py | 22 +++++++++---------- .../feature_repos/repo_configuration.py | 2 +- .../permissions/test_auth_permission.py | 21 ++++++++---------- 3 files changed, 21 insertions(+), 24 deletions(-) diff --git a/sdk/python/tests/conftest.py b/sdk/python/tests/conftest.py index c26688836c..e852221c06 100644 --- a/sdk/python/tests/conftest.py +++ b/sdk/python/tests/conftest.py @@ -457,17 +457,17 @@ def is_integration_test(all_markers_from_module): auth: type: kubernetes """), - dedent(""" - auth: - type: oidc - client_id: feast-integration-client - client_secret: feast-integration-client-secret - username: reader_writer - password: password - realm: master - auth_server_url: KEYCLOAK_URL_PLACE_HOLDER - auth_discovery_url: KEYCLOAK_URL_PLACE_HOLDER/realms/master/.well-known/openid-configuration - """), + # dedent(""" + # auth: + # type: oidc + # client_id: feast-integration-client + # client_secret: feast-integration-client-secret + # username: reader_writer + # password: password + # realm: master + # auth_server_url: KEYCLOAK_URL_PLACE_HOLDER + # auth_discovery_url: KEYCLOAK_URL_PLACE_HOLDER/realms/master/.well-known/openid-configuration + # """), ], ) def auth_config(request, is_integration_test): diff --git a/sdk/python/tests/integration/feature_repos/repo_configuration.py b/sdk/python/tests/integration/feature_repos/repo_configuration.py index 6ba2b20347..79e1086dfc 100644 --- a/sdk/python/tests/integration/feature_repos/repo_configuration.py +++ b/sdk/python/tests/integration/feature_repos/repo_configuration.py @@ -136,7 +136,7 @@ ("local", DuckDBDataSourceCreator), ("local", DuckDBDeltaDataSourceCreator), ("local", RemoteOfflineStoreDataSourceCreator), - ("local", RemoteOfflineOidcAuthStoreDataSourceCreator), + # ("local", RemoteOfflineOidcAuthStoreDataSourceCreator), ] if os.getenv("FEAST_IS_LOCAL_TEST", "False") == "True": diff --git a/sdk/python/tests/integration/permissions/test_auth_permission.py b/sdk/python/tests/integration/permissions/test_auth_permission.py index 47f3674567..32b8795952 100644 --- a/sdk/python/tests/integration/permissions/test_auth_permission.py +++ b/sdk/python/tests/integration/permissions/test_auth_permission.py @@ -1,12 +1,9 @@ -import pytest - - -@pytest.mark.integration -def test_oidc_auth_permissions(start_keycloak_server, temp_dir): - print("starting the test") - ## TODO: - # 1 create the store - # 2 create the permissions - # 3 Spin up feature server - # 4 test remote online read with no auth and oidc auth. - # 5 spin up the registry server and test the no auth and oidc auth on all end points. +# @pytest.mark.integration +# def test_oidc_auth_permissions(start_keycloak_server, temp_dir): +# print("starting the test") +# ## TODO: +# # 1 create the store +# # 2 create the permissions +# # 3 Spin up feature server +# # 4 test remote online read with no auth and oidc auth. +# # 5 spin up the registry server and test the no auth and oidc auth on all end points. From f79b6ec4210a5e35c75e891b3c5290c5b9fe0b3a Mon Sep 17 00:00:00 2001 From: Lokesh Rangineni <19699092+lokeshrangineni@users.noreply.github.com> Date: Thu, 8 Aug 2024 15:55:21 -0400 Subject: [PATCH 142/169] Enabling the keycloak related integration tests and also initializing the keycloak only once in the entire run. Reduced the number of works and increased the duration as well. Signed-off-by: Lokesh Rangineni <19699092+lokeshrangineni@users.noreply.github.com> Signed-off-by: Abdul Hameed --- Makefile | 4 +-- sdk/python/tests/conftest.py | 26 +++++++++---------- sdk/python/tests/integration/conftest.py | 2 +- .../feature_repos/repo_configuration.py | 2 +- 4 files changed, 16 insertions(+), 18 deletions(-) diff --git a/Makefile b/Makefile index 7119bad856..f5895ae9c6 100644 --- a/Makefile +++ b/Makefile @@ -93,8 +93,8 @@ test-python-integration: test-python-integration-local: FEAST_IS_LOCAL_TEST=True \ FEAST_LOCAL_ONLINE_CONTAINER=True \ - python -m pytest -n 8 --color=yes --integration --durations=5 --dist loadgroup \ - -k "not test_lambda_materialization and not test_snowflake_materialization" \ + python -m pytest -n 4 --color=yes --integration --durations=20 --timeout=1200 --timeout_method=thread --dist loadgroup \ + -k "not test_lambda_materialization and not test_snowflake_materialization and not test_remote_online_store_read" \ sdk/python/tests test-python-integration-container: diff --git a/sdk/python/tests/conftest.py b/sdk/python/tests/conftest.py index e852221c06..74aa68e984 100644 --- a/sdk/python/tests/conftest.py +++ b/sdk/python/tests/conftest.py @@ -56,9 +56,7 @@ driver, location, ) -from tests.utils.auth_permissions_util import ( - default_store, -) +from tests.utils.auth_permissions_util import default_store from tests.utils.http_server import check_port_open, free_port # noqa: E402 logger = logging.getLogger(__name__) @@ -457,17 +455,17 @@ def is_integration_test(all_markers_from_module): auth: type: kubernetes """), - # dedent(""" - # auth: - # type: oidc - # client_id: feast-integration-client - # client_secret: feast-integration-client-secret - # username: reader_writer - # password: password - # realm: master - # auth_server_url: KEYCLOAK_URL_PLACE_HOLDER - # auth_discovery_url: KEYCLOAK_URL_PLACE_HOLDER/realms/master/.well-known/openid-configuration - # """), + dedent(""" + auth: + type: oidc + client_id: feast-integration-client + client_secret: feast-integration-client-secret + username: reader_writer + password: password + realm: master + auth_server_url: KEYCLOAK_URL_PLACE_HOLDER + auth_discovery_url: KEYCLOAK_URL_PLACE_HOLDER/realms/master/.well-known/openid-configuration + """), ], ) def auth_config(request, is_integration_test): diff --git a/sdk/python/tests/integration/conftest.py b/sdk/python/tests/integration/conftest.py index 4a48135c19..a7342279bf 100644 --- a/sdk/python/tests/integration/conftest.py +++ b/sdk/python/tests/integration/conftest.py @@ -4,7 +4,7 @@ from tests.utils.auth_permissions_util import setup_permissions_on_keycloak -@pytest.fixture(scope="module") +@pytest.fixture(scope="session") def start_keycloak_server(): with KeycloakContainer("quay.io/keycloak/keycloak:24.0.1") as keycloak_container: setup_permissions_on_keycloak(keycloak_container.get_client()) diff --git a/sdk/python/tests/integration/feature_repos/repo_configuration.py b/sdk/python/tests/integration/feature_repos/repo_configuration.py index 79e1086dfc..6ba2b20347 100644 --- a/sdk/python/tests/integration/feature_repos/repo_configuration.py +++ b/sdk/python/tests/integration/feature_repos/repo_configuration.py @@ -136,7 +136,7 @@ ("local", DuckDBDataSourceCreator), ("local", DuckDBDeltaDataSourceCreator), ("local", RemoteOfflineStoreDataSourceCreator), - # ("local", RemoteOfflineOidcAuthStoreDataSourceCreator), + ("local", RemoteOfflineOidcAuthStoreDataSourceCreator), ] if os.getenv("FEAST_IS_LOCAL_TEST", "False") == "True": From bebd2921cbe44d42c2a21892b3651951344ef514 Mon Sep 17 00:00:00 2001 From: Lokesh Rangineni <19699092+lokeshrangineni@users.noreply.github.com> Date: Thu, 8 Aug 2024 16:22:53 -0400 Subject: [PATCH 143/169] Making number of workers back to 8 and enabled the test_remote_online_store_read Signed-off-by: Lokesh Rangineni <19699092+lokeshrangineni@users.noreply.github.com> Signed-off-by: Abdul Hameed --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index f5895ae9c6..cc9164e986 100644 --- a/Makefile +++ b/Makefile @@ -93,8 +93,8 @@ test-python-integration: test-python-integration-local: FEAST_IS_LOCAL_TEST=True \ FEAST_LOCAL_ONLINE_CONTAINER=True \ - python -m pytest -n 4 --color=yes --integration --durations=20 --timeout=1200 --timeout_method=thread --dist loadgroup \ - -k "not test_lambda_materialization and not test_snowflake_materialization and not test_remote_online_store_read" \ + python -m pytest -n 8 --color=yes --integration --durations=10 --timeout=1200 --timeout_method=thread --dist loadgroup \ + -k "not test_lambda_materialization and not test_snowflake_materialization" \ sdk/python/tests test-python-integration-container: From e6b5e4cff7e295d2b4f8f564615deb2455f06216 Mon Sep 17 00:00:00 2001 From: Lokesh Rangineni <19699092+lokeshrangineni@users.noreply.github.com> Date: Thu, 8 Aug 2024 18:14:12 -0400 Subject: [PATCH 144/169] Making number of workers to 4. Signed-off-by: Lokesh Rangineni <19699092+lokeshrangineni@users.noreply.github.com> Signed-off-by: Abdul Hameed --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index cc9164e986..3909d92161 100644 --- a/Makefile +++ b/Makefile @@ -93,7 +93,7 @@ test-python-integration: test-python-integration-local: FEAST_IS_LOCAL_TEST=True \ FEAST_LOCAL_ONLINE_CONTAINER=True \ - python -m pytest -n 8 --color=yes --integration --durations=10 --timeout=1200 --timeout_method=thread --dist loadgroup \ + python -m pytest -n 4 --color=yes --integration --durations=10 --timeout=1200 --timeout_method=thread --dist loadgroup \ -k "not test_lambda_materialization and not test_snowflake_materialization" \ sdk/python/tests From 33bb445cba85698a542f35a7443815e53f9716fe Mon Sep 17 00:00:00 2001 From: Lokesh Rangineni <19699092+lokeshrangineni@users.noreply.github.com> Date: Fri, 9 Aug 2024 13:29:22 -0400 Subject: [PATCH 145/169] Incorporating the code review comments from Tornike to use @pytest.mark.xdist_group(name="keycloak"). Reverting number of markers from 4 to 8 for the make file target test-python-integration-local. Signed-off-by: Lokesh Rangineni <19699092+lokeshrangineni@users.noreply.github.com> Signed-off-by: Abdul Hameed --- Makefile | 2 +- sdk/python/tests/integration/conftest.py | 6 +++++ .../universal/data_sources/file.py | 25 ++++++++----------- 3 files changed, 17 insertions(+), 16 deletions(-) diff --git a/Makefile b/Makefile index 3909d92161..cc9164e986 100644 --- a/Makefile +++ b/Makefile @@ -93,7 +93,7 @@ test-python-integration: test-python-integration-local: FEAST_IS_LOCAL_TEST=True \ FEAST_LOCAL_ONLINE_CONTAINER=True \ - python -m pytest -n 4 --color=yes --integration --durations=10 --timeout=1200 --timeout_method=thread --dist loadgroup \ + python -m pytest -n 8 --color=yes --integration --durations=10 --timeout=1200 --timeout_method=thread --dist loadgroup \ -k "not test_lambda_materialization and not test_snowflake_materialization" \ sdk/python/tests diff --git a/sdk/python/tests/integration/conftest.py b/sdk/python/tests/integration/conftest.py index a7342279bf..1773423df4 100644 --- a/sdk/python/tests/integration/conftest.py +++ b/sdk/python/tests/integration/conftest.py @@ -1,11 +1,17 @@ +import logging + import pytest from testcontainers.keycloak import KeycloakContainer from tests.utils.auth_permissions_util import setup_permissions_on_keycloak +logger = logging.getLogger(__name__) + +@pytest.mark.xdist_group(name="keycloak") @pytest.fixture(scope="session") def start_keycloak_server(): + logger.info("Starting keycloak instance") with KeycloakContainer("quay.io/keycloak/keycloak:24.0.1") as keycloak_container: setup_permissions_on_keycloak(keycloak_container.get_client()) yield keycloak_container.get_url() diff --git a/sdk/python/tests/integration/feature_repos/universal/data_sources/file.py b/sdk/python/tests/integration/feature_repos/universal/data_sources/file.py index e751edd35c..b600699f81 100644 --- a/sdk/python/tests/integration/feature_repos/universal/data_sources/file.py +++ b/sdk/python/tests/integration/feature_repos/universal/data_sources/file.py @@ -15,7 +15,6 @@ from minio import Minio from testcontainers.core.generic import DockerContainer from testcontainers.core.waiting_utils import wait_for_logs -from testcontainers.keycloak import KeycloakContainer from testcontainers.minio import MinioContainer from feast import FileSource, RepoConfig @@ -34,10 +33,7 @@ from tests.integration.feature_repos.universal.data_source_creator import ( DataSourceCreator, ) -from tests.utils.auth_permissions_util import ( - include_auth_config, - setup_permissions_on_keycloak, -) +from tests.utils.auth_permissions_util import include_auth_config from tests.utils.http_server import check_port_open, free_port # noqa: E402 logger = logging.getLogger(__name__) @@ -438,7 +434,13 @@ def teardown(self): class RemoteOfflineOidcAuthStoreDataSourceCreator(FileDataSourceCreator): def __init__(self, project_name: str, *args, **kwargs): super().__init__(project_name) - keycloak_url = self._setup_keycloak() + if "fixture_request" in kwargs: + request = kwargs["fixture_request"] + self.keycloak_url = request.getfixturevalue("start_keycloak_server") + else: + raise RuntimeError( + "fixture_request object is not passed to inject keycloak fixture dynamically." + ) auth_config_template = """ auth: type: oidc @@ -450,16 +452,10 @@ def __init__(self, project_name: str, *args, **kwargs): auth_server_url: {keycloak_url} auth_discovery_url: {keycloak_url}/realms/master/.well-known/openid-configuration """ - self.auth_config = auth_config_template.format(keycloak_url=keycloak_url) + self.auth_config = auth_config_template.format(keycloak_url=self.keycloak_url) self.server_port: int = 0 self.proc = None - def _setup_keycloak(self): - self.keycloak_container = KeycloakContainer("quay.io/keycloak/keycloak:24.0.1") - self.keycloak_container.start() - setup_permissions_on_keycloak(self.keycloak_container.get_client()) - return self.keycloak_container.get_url() - def setup(self, registry: RegistryConfig): parent_offline_config = super().create_offline_store_config() config = RepoConfig( @@ -510,11 +506,10 @@ def create_offline_store_config(self) -> FeastConfigBaseModel: return self.remote_offline_store_config def get_keycloak_url(self): - return self.keycloak_container.get_url() + return self.keycloak_url def teardown(self): super().teardown() - self.keycloak_container.stop() if self.proc is not None: self.proc.kill() From 12895c00e75b7e5c617b5c2fa857817ab34d5b9e Mon Sep 17 00:00:00 2001 From: Lokesh Rangineni <19699092+lokeshrangineni@users.noreply.github.com> Date: Fri, 9 Aug 2024 14:29:02 -0400 Subject: [PATCH 146/169] Reverting number of workers from 8 to 4. Signed-off-by: Lokesh Rangineni <19699092+lokeshrangineni@users.noreply.github.com> Signed-off-by: Lokesh Rangineni <19699092+lokeshrangineni@users.noreply.github.com> Signed-off-by: Abdul Hameed --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index cc9164e986..bd98f2d7e0 100644 --- a/Makefile +++ b/Makefile @@ -86,7 +86,7 @@ test-python-unit: python -m pytest -n 8 --color=yes sdk/python/tests test-python-integration: - python -m pytest -n 8 --integration --color=yes --durations=10 --timeout=1200 --timeout_method=thread \ + python -m pytest -n 4 --integration --color=yes --durations=10 --timeout=1200 --timeout_method=thread \ -k "(not snowflake or not test_historical_features_main)" \ sdk/python/tests From 99514894679b3578bff05179f3e727dcba47873c Mon Sep 17 00:00:00 2001 From: Lokesh Rangineni <19699092+lokeshrangineni@users.noreply.github.com> Date: Fri, 9 Aug 2024 15:10:26 -0400 Subject: [PATCH 147/169] Reverting number of workers from 8 to 4. Reverting the marker @pytest.mark.xdist_group(name="keycloak") Signed-off-by: Lokesh Rangineni <19699092+lokeshrangineni@users.noreply.github.com> Signed-off-by: Lokesh Rangineni <19699092+lokeshrangineni@users.noreply.github.com> Signed-off-by: Abdul Hameed --- sdk/python/tests/integration/conftest.py | 1 - 1 file changed, 1 deletion(-) diff --git a/sdk/python/tests/integration/conftest.py b/sdk/python/tests/integration/conftest.py index 1773423df4..5c34a448e2 100644 --- a/sdk/python/tests/integration/conftest.py +++ b/sdk/python/tests/integration/conftest.py @@ -8,7 +8,6 @@ logger = logging.getLogger(__name__) -@pytest.mark.xdist_group(name="keycloak") @pytest.fixture(scope="session") def start_keycloak_server(): logger.info("Starting keycloak instance") From 71e404411cdd308bf1126a8eec631394aa5704e8 Mon Sep 17 00:00:00 2001 From: Lokesh Rangineni <19699092+lokeshrangineni@users.noreply.github.com> Date: Fri, 9 Aug 2024 15:38:49 -0400 Subject: [PATCH 148/169] Reverting number of workers from 8 to 4 for make target test-python-integration-local Signed-off-by: Lokesh Rangineni <19699092+lokeshrangineni@users.noreply.github.com> Signed-off-by: Abdul Hameed --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index bd98f2d7e0..3909d92161 100644 --- a/Makefile +++ b/Makefile @@ -86,14 +86,14 @@ test-python-unit: python -m pytest -n 8 --color=yes sdk/python/tests test-python-integration: - python -m pytest -n 4 --integration --color=yes --durations=10 --timeout=1200 --timeout_method=thread \ + python -m pytest -n 8 --integration --color=yes --durations=10 --timeout=1200 --timeout_method=thread \ -k "(not snowflake or not test_historical_features_main)" \ sdk/python/tests test-python-integration-local: FEAST_IS_LOCAL_TEST=True \ FEAST_LOCAL_ONLINE_CONTAINER=True \ - python -m pytest -n 8 --color=yes --integration --durations=10 --timeout=1200 --timeout_method=thread --dist loadgroup \ + python -m pytest -n 4 --color=yes --integration --durations=10 --timeout=1200 --timeout_method=thread --dist loadgroup \ -k "not test_lambda_materialization and not test_snowflake_materialization" \ sdk/python/tests From fd1243b769e910c161b56b4650116925788180a5 Mon Sep 17 00:00:00 2001 From: lokeshrangineni <19699092+lokeshrangineni@users.noreply.github.com> Date: Sat, 10 Aug 2024 23:30:39 -0400 Subject: [PATCH 149/169] Added the arrow flight interceptor to inject the auth header. (#68) * * Added the arrow flight interceptor to inject the auth header. * Injecting grpc interceptor if it is needed when auth type is not NO_AUTH. Signed-off-by: Lokesh Rangineni <19699092+lokeshrangineni@users.noreply.github.com> * Fixing the failing integration test cases by setting the header in binary format. Signed-off-by: Lokesh Rangineni <19699092+lokeshrangineni@users.noreply.github.com> * Refactored method and moved to factory class to incorporate code review comment. Fixed lint error by removing the type of port. and other minor changes. Signed-off-by: Lokesh Rangineni <19699092+lokeshrangineni@users.noreply.github.com> * Incorproating code review comments from Daniel. Signed-off-by: Lokesh Rangineni <19699092+lokeshrangineni@users.noreply.github.com> --------- Signed-off-by: Lokesh Rangineni <19699092+lokeshrangineni@users.noreply.github.com> Signed-off-by: Abdul Hameed --- .../feast/infra/offline_stores/remote.py | 61 +++++++------------ sdk/python/feast/infra/registry/remote.py | 10 +-- .../client/arrow_flight_auth_interceptor.py | 38 ++++++++++++ .../permissions/client/auth_client_manager.py | 30 --------- .../client/auth_client_manager_factory.py | 30 +++++++++ .../client/grpc_client_auth_interceptor.py | 22 +++---- .../client/http_auth_requests_wrapper.py | 5 +- sdk/python/feast/permissions/client/utils.py | 21 ------- .../offline_stores/test_offline_store.py | 2 - 9 files changed, 106 insertions(+), 113 deletions(-) create mode 100644 sdk/python/feast/permissions/client/arrow_flight_auth_interceptor.py create mode 100644 sdk/python/feast/permissions/client/auth_client_manager_factory.py delete mode 100644 sdk/python/feast/permissions/client/utils.py diff --git a/sdk/python/feast/infra/offline_stores/remote.py b/sdk/python/feast/infra/offline_stores/remote.py index 2545d47734..40239c8950 100644 --- a/sdk/python/feast/infra/offline_stores/remote.py +++ b/sdk/python/feast/infra/offline_stores/remote.py @@ -27,7 +27,9 @@ RetrievalMetadata, ) from feast.infra.registry.base_registry import BaseRegistry -from feast.permissions.client.utils import create_flight_call_options +from feast.permissions.client.arrow_flight_auth_interceptor import ( + build_arrow_flight_client, +) from feast.repo_config import FeastConfigBaseModel, RepoConfig from feast.saved_dataset import SavedDatasetStorage @@ -47,7 +49,6 @@ class RemoteRetrievalJob(RetrievalJob): def __init__( self, client: fl.FlightClient, - options: pa.flight.FlightCallOptions, api: str, api_parameters: Dict[str, Any], entity_df: Union[pd.DataFrame, str] = None, @@ -56,7 +57,6 @@ def __init__( ): # Initialize the client connection self.client = client - self.options = options self.api = api self.api_parameters = api_parameters self.entity_df = entity_df @@ -77,7 +77,6 @@ def _to_arrow_internal(self, timeout: Optional[int] = None) -> pa.Table: self.entity_df, self.table, self.client, - self.options, ) @property @@ -118,7 +117,6 @@ def persist( api=RemoteRetrievalJob.persist.__name__, api_parameters=api_parameters, client=self.client, - options=self.options, table=self.table, entity_df=self.entity_df, ) @@ -137,9 +135,9 @@ def get_historical_features( ) -> RemoteRetrievalJob: assert isinstance(config.offline_store, RemoteOfflineStoreConfig) - # Initialize the client connection - client = RemoteOfflineStore.init_client(config) - options = create_flight_call_options(config.auth_config) + client = build_arrow_flight_client( + config.offline_store.host, config.offline_store.port, config.auth_config + ) feature_view_names = [fv.name for fv in feature_views] name_aliases = [fv.projection.name_alias for fv in feature_views] @@ -154,7 +152,6 @@ def get_historical_features( return RemoteRetrievalJob( client=client, - options=options, api=OfflineStore.get_historical_features.__name__, api_parameters=api_parameters, entity_df=entity_df, @@ -174,8 +171,9 @@ def pull_all_from_table_or_query( assert isinstance(config.offline_store, RemoteOfflineStoreConfig) # Initialize the client connection - client = RemoteOfflineStore.init_client(config) - options = create_flight_call_options(config.auth_config) + client = build_arrow_flight_client( + config.offline_store.host, config.offline_store.port, config.auth_config + ) api_parameters = { "data_source_name": data_source.name, @@ -188,7 +186,6 @@ def pull_all_from_table_or_query( return RemoteRetrievalJob( client=client, - options=options, api=OfflineStore.pull_all_from_table_or_query.__name__, api_parameters=api_parameters, ) @@ -207,8 +204,9 @@ def pull_latest_from_table_or_query( assert isinstance(config.offline_store, RemoteOfflineStoreConfig) # Initialize the client connection - client = RemoteOfflineStore.init_client(config) - options = create_flight_call_options(config.auth_config) + client = build_arrow_flight_client( + config.offline_store.host, config.offline_store.port, config.auth_config + ) api_parameters = { "data_source_name": data_source.name, @@ -222,7 +220,6 @@ def pull_latest_from_table_or_query( return RemoteRetrievalJob( client=client, - options=options, api=OfflineStore.pull_latest_from_table_or_query.__name__, api_parameters=api_parameters, ) @@ -242,8 +239,9 @@ def write_logged_features( data = pyarrow.parquet.read_table(data, use_threads=False, pre_buffer=False) # Initialize the client connection - client = RemoteOfflineStore.init_client(config) - options = create_flight_call_options(config.auth_config) + client = build_arrow_flight_client( + config.offline_store.host, config.offline_store.port, config.auth_config + ) api_parameters = { "feature_service_name": source._feature_service.name, @@ -253,7 +251,6 @@ def write_logged_features( api=OfflineStore.write_logged_features.__name__, api_parameters=api_parameters, client=client, - options=options, table=data, entity_df=None, ) @@ -268,8 +265,9 @@ def offline_write_batch( assert isinstance(config.offline_store, RemoteOfflineStoreConfig) # Initialize the client connection - client = RemoteOfflineStore.init_client(config) - options = create_flight_call_options(config.auth_config) + client = build_arrow_flight_client( + config.offline_store.host, config.offline_store.port, config.auth_config + ) feature_view_names = [feature_view.name] name_aliases = [feature_view.projection.name_alias] @@ -284,18 +282,10 @@ def offline_write_batch( api=OfflineStore.offline_write_batch.__name__, api_parameters=api_parameters, client=client, - options=options, table=table, entity_df=None, ) - @staticmethod - def init_client(config): - location = f"grpc://{config.offline_store.host}:{config.offline_store.port}" - client = fl.connect(location=location) - logger.info(f"Connecting FlightClient at {location}") - return client - def _create_retrieval_metadata(feature_refs: List[str], entity_df: pd.DataFrame): entity_schema = _get_entity_schema( @@ -349,27 +339,24 @@ def _send_retrieve_remote( entity_df: Union[pd.DataFrame, str], table: pa.Table, client: fl.FlightClient, - options: pa.flight.FlightCallOptions, ): command_descriptor = _call_put( api, api_parameters, client, - options, entity_df, table, ) - return _call_get(client, options, command_descriptor) + return _call_get(client, command_descriptor) def _call_get( client: fl.FlightClient, - options: pa.flight.FlightCallOptions, command_descriptor: fl.FlightDescriptor, ): - flight = client.get_flight_info(command_descriptor, options) + flight = client.get_flight_info(command_descriptor) ticket = flight.endpoints[0].ticket - reader = client.do_get(ticket, options) + reader = client.do_get(ticket) return reader.read_all() @@ -377,7 +364,6 @@ def _call_put( api: str, api_parameters: Dict[str, Any], client: fl.FlightClient, - options: pa.flight.FlightCallOptions, entity_df: Union[pd.DataFrame, str], table: pa.Table, ): @@ -397,7 +383,7 @@ def _call_put( ) ) - _put_parameters(command_descriptor, entity_df, table, client, options) + _put_parameters(command_descriptor, entity_df, table, client) return command_descriptor @@ -406,7 +392,6 @@ def _put_parameters( entity_df: Union[pd.DataFrame, str], table: pa.Table, client: fl.FlightClient, - options: pa.flight.FlightCallOptions, ): updatedTable: pa.Table @@ -417,7 +402,7 @@ def _put_parameters( else: updatedTable = _create_empty_table() - writer, _ = client.do_put(command_descriptor, updatedTable.schema, options) + writer, _ = client.do_put(command_descriptor, updatedTable.schema) writer.write_table(updatedTable) writer.close() diff --git a/sdk/python/feast/infra/registry/remote.py b/sdk/python/feast/infra/registry/remote.py index 9a4a8eadb8..b8665d0cf6 100644 --- a/sdk/python/feast/infra/registry/remote.py +++ b/sdk/python/feast/infra/registry/remote.py @@ -15,6 +15,7 @@ from feast.infra.infra_object import Infra from feast.infra.registry.base_registry import BaseRegistry from feast.on_demand_feature_view import OnDemandFeatureView +from feast.permissions.auth.auth_type import AuthType from feast.permissions.auth_model import ( AuthConfig, NoAuthConfig, @@ -48,13 +49,12 @@ def __init__( repo_path: Optional[Path], auth_config: AuthConfig = NoAuthConfig(), ): - auth_header_interceptor = GrpcClientAuthHeaderInterceptor(auth_config) self.auth_config = auth_config channel = grpc.insecure_channel(registry_config.path) - self.intercepted_channel = grpc.intercept_channel( - channel, auth_header_interceptor - ) - self.stub = RegistryServer_pb2_grpc.RegistryServerStub(self.intercepted_channel) + if self.auth_config.type != AuthType.NONE.value: + auth_header_interceptor = GrpcClientAuthHeaderInterceptor(auth_config) + channel = grpc.intercept_channel(channel, auth_header_interceptor) + self.stub = RegistryServer_pb2_grpc.RegistryServerStub(channel) def apply_entity(self, entity: Entity, project: str, commit: bool = True): request = RegistryServer_pb2.ApplyEntityRequest( diff --git a/sdk/python/feast/permissions/client/arrow_flight_auth_interceptor.py b/sdk/python/feast/permissions/client/arrow_flight_auth_interceptor.py new file mode 100644 index 0000000000..724c7df5ca --- /dev/null +++ b/sdk/python/feast/permissions/client/arrow_flight_auth_interceptor.py @@ -0,0 +1,38 @@ +import pyarrow.flight as fl + +from feast.permissions.auth.auth_type import AuthType +from feast.permissions.auth_model import AuthConfig +from feast.permissions.client.auth_client_manager_factory import get_auth_token + + +class FlightBearerTokenInterceptor(fl.ClientMiddleware): + def __init__(self, auth_config: AuthConfig): + super().__init__() + self.auth_config = auth_config + + def call_completed(self, exception): + pass + + def received_headers(self, headers): + pass + + def sending_headers(self): + access_token = get_auth_token(self.auth_config) + return {b"authorization": b"Bearer " + access_token.encode("utf-8")} + + +class FlightAuthInterceptorFactory(fl.ClientMiddlewareFactory): + def __init__(self, auth_config: AuthConfig): + super().__init__() + self.auth_config = auth_config + + def start_call(self, info): + return FlightBearerTokenInterceptor(self.auth_config) + + +def build_arrow_flight_client(host: str, port, auth_config: AuthConfig): + if auth_config.type != AuthType.NONE.value: + middleware_factory = FlightAuthInterceptorFactory(auth_config) + return fl.FlightClient(f"grpc://{host}:{port}", middleware=[middleware_factory]) + else: + return fl.FlightClient(f"grpc://{host}:{port}") diff --git a/sdk/python/feast/permissions/client/auth_client_manager.py b/sdk/python/feast/permissions/client/auth_client_manager.py index ef8a9715ec..82f9b7433e 100644 --- a/sdk/python/feast/permissions/client/auth_client_manager.py +++ b/sdk/python/feast/permissions/client/auth_client_manager.py @@ -1,38 +1,8 @@ from abc import ABC, abstractmethod -from feast.permissions.auth.auth_type import AuthType -from feast.permissions.auth_model import ( - AuthConfig, - KubernetesAuthConfig, - OidcAuthConfig, -) - class AuthenticationClientManager(ABC): @abstractmethod def get_token(self) -> str: """Retrieves the token based on the authentication type configuration""" pass - - -def get_auth_client_manager(auth_config: AuthConfig) -> AuthenticationClientManager: - if auth_config.type == AuthType.OIDC.value: - assert isinstance(auth_config, OidcAuthConfig) - - from feast.permissions.client.oidc_authentication_client_manager import ( - OidcAuthClientManager, - ) - - return OidcAuthClientManager(auth_config) - elif auth_config.type == AuthType.KUBERNETES.value: - assert isinstance(auth_config, KubernetesAuthConfig) - - from feast.permissions.client.kubernetes_auth_client_manager import ( - KubernetesAuthClientManager, - ) - - return KubernetesAuthClientManager(auth_config) - else: - raise RuntimeError( - f"No Auth client manager implemented for the auth type:${auth_config.type}" - ) diff --git a/sdk/python/feast/permissions/client/auth_client_manager_factory.py b/sdk/python/feast/permissions/client/auth_client_manager_factory.py new file mode 100644 index 0000000000..4e49802047 --- /dev/null +++ b/sdk/python/feast/permissions/client/auth_client_manager_factory.py @@ -0,0 +1,30 @@ +from feast.permissions.auth.auth_type import AuthType +from feast.permissions.auth_model import ( + AuthConfig, + KubernetesAuthConfig, + OidcAuthConfig, +) +from feast.permissions.client.auth_client_manager import AuthenticationClientManager +from feast.permissions.client.kubernetes_auth_client_manager import ( + KubernetesAuthClientManager, +) +from feast.permissions.client.oidc_authentication_client_manager import ( + OidcAuthClientManager, +) + + +def get_auth_client_manager(auth_config: AuthConfig) -> AuthenticationClientManager: + if auth_config.type == AuthType.OIDC.value: + assert isinstance(auth_config, OidcAuthConfig) + return OidcAuthClientManager(auth_config) + elif auth_config.type == AuthType.KUBERNETES.value: + assert isinstance(auth_config, KubernetesAuthConfig) + return KubernetesAuthClientManager(auth_config) + else: + raise RuntimeError( + f"No Auth client manager implemented for the auth type:${auth_config.type}" + ) + + +def get_auth_token(auth_config: AuthConfig) -> str: + return get_auth_client_manager(auth_config).get_token() diff --git a/sdk/python/feast/permissions/client/grpc_client_auth_interceptor.py b/sdk/python/feast/permissions/client/grpc_client_auth_interceptor.py index f10b8d911a..98cc445c7b 100644 --- a/sdk/python/feast/permissions/client/grpc_client_auth_interceptor.py +++ b/sdk/python/feast/permissions/client/grpc_client_auth_interceptor.py @@ -2,9 +2,8 @@ import grpc -from feast.permissions.auth.auth_type import AuthType from feast.permissions.auth_model import AuthConfig -from feast.permissions.client.auth_client_manager import get_auth_client_manager +from feast.permissions.client.auth_client_manager_factory import get_auth_token logger = logging.getLogger(__name__) @@ -43,16 +42,11 @@ def intercept_stream_stream( return continuation(client_call_details, request_iterator) def _append_auth_header_metadata(self, client_call_details): - if self._auth_type.type is not AuthType.NONE.value: - logger.info( - f"Intercepted the grpc api method {client_call_details.method} call to inject Authorization header " - f"token. " - ) - metadata = client_call_details.metadata or [] - auth_client_manager = get_auth_client_manager(self._auth_type) - access_token = auth_client_manager.get_token() - metadata.append( - (b"authorization", b"Bearer " + access_token.encode("utf-8")) - ) - client_call_details = client_call_details._replace(metadata=metadata) + logger.debug( + "Intercepted the grpc api method call to inject Authorization header " + ) + metadata = client_call_details.metadata or [] + access_token = get_auth_token(self._auth_type) + metadata.append((b"authorization", b"Bearer " + access_token.encode("utf-8"))) + client_call_details = client_call_details._replace(metadata=metadata) return client_call_details diff --git a/sdk/python/feast/permissions/client/http_auth_requests_wrapper.py b/sdk/python/feast/permissions/client/http_auth_requests_wrapper.py index eba9af5ead..3232e25025 100644 --- a/sdk/python/feast/permissions/client/http_auth_requests_wrapper.py +++ b/sdk/python/feast/permissions/client/http_auth_requests_wrapper.py @@ -5,7 +5,7 @@ from feast.permissions.auth_model import ( AuthConfig, ) -from feast.permissions.client.auth_client_manager import get_auth_client_manager +from feast.permissions.client.auth_client_manager_factory import get_auth_token class AuthenticatedRequestsSession(Session): @@ -18,6 +18,5 @@ def get_http_auth_requests_session(auth_config: AuthConfig) -> Session: if auth_config.type == AuthType.NONE.value: request_session = requests.session() else: - auth_client_manager = get_auth_client_manager(auth_config) - request_session = AuthenticatedRequestsSession(auth_client_manager.get_token()) + request_session = AuthenticatedRequestsSession(get_auth_token(auth_config)) return request_session diff --git a/sdk/python/feast/permissions/client/utils.py b/sdk/python/feast/permissions/client/utils.py deleted file mode 100644 index 02c69c9d6e..0000000000 --- a/sdk/python/feast/permissions/client/utils.py +++ /dev/null @@ -1,21 +0,0 @@ -import pyarrow.flight as fl - -from feast.permissions.auth.auth_type import AuthType -from feast.permissions.auth_model import AuthConfig -from feast.permissions.client.auth_client_manager import get_auth_client_manager - - -def create_auth_header( - auth_config: AuthConfig, -) -> list[tuple[bytes, bytes]]: - auth_client_manager = get_auth_client_manager(auth_config) - token = auth_client_manager.get_token() - - return [(b"authorization", b"Bearer " + token.encode("utf-8"))] - - -def create_flight_call_options(auth_config: AuthConfig) -> fl.FlightCallOptions: - if auth_config.type != AuthType.NONE.value: - headers = create_auth_header(auth_config) - return fl.FlightCallOptions(headers=headers) - return fl.FlightCallOptions() diff --git a/sdk/python/tests/unit/infra/offline_stores/test_offline_store.py b/sdk/python/tests/unit/infra/offline_stores/test_offline_store.py index dea5304ff4..6d5eeb90c7 100644 --- a/sdk/python/tests/unit/infra/offline_stores/test_offline_store.py +++ b/sdk/python/tests/unit/infra/offline_stores/test_offline_store.py @@ -3,7 +3,6 @@ import pandas as pd import pyarrow -import pyarrow.flight as fl import pytest from feast.infra.offline_stores.contrib.athena_offline_store.athena import ( @@ -216,7 +215,6 @@ def retrieval_job(request, environment): return RemoteRetrievalJob( client=MagicMock(), - options=fl.FlightCallOptions(), api_parameters={ "str": "str", }, From 807c0f5614e2451763c288b3a8c473858fc81a7e Mon Sep 17 00:00:00 2001 From: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Date: Mon, 12 Aug 2024 14:13:30 +0200 Subject: [PATCH 150/169] removed with_subclasses option (it's the default and unique behavior) Signed-off-by: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Signed-off-by: Abdul Hameed --- docs/getting-started/concepts/permission.md | 17 +++-- docs/reference/feast-cli-commands.md | 6 +- protos/feast/core/Permission.proto | 2 - sdk/python/feast/cli.py | 1 - sdk/python/feast/cli_utils.py | 1 - sdk/python/feast/feast_object.py | 6 ++ sdk/python/feast/permissions/matcher.py | 43 ++----------- sdk/python/feast/permissions/permission.py | 15 +---- .../feature_repos/repo_configuration.py | 5 -- .../online_store/test_remote_online_store.py | 3 - .../registration/test_universal_registry.py | 5 -- .../tests/unit/diff/test_registry_diff.py | 2 - .../test_local_feature_store.py | 1 - .../permissions/auth/server/test_utils.py | 5 -- sdk/python/tests/unit/permissions/conftest.py | 3 - .../tests/unit/permissions/test_permission.py | 64 +------------------ 16 files changed, 30 insertions(+), 149 deletions(-) diff --git a/docs/getting-started/concepts/permission.md b/docs/getting-started/concepts/permission.md index 957356add8..14f4df8007 100644 --- a/docs/getting-started/concepts/permission.md +++ b/docs/getting-started/concepts/permission.md @@ -35,13 +35,23 @@ The permission model is based on the following components: The `Permission` class identifies a single permission configured on the feature store and is identified by these attributes: - `name`: The permission name. -- `types`: The list of protected resource types. Defaults to all managed types, e.g. the `ALL_RESOURCE_TYPES` alias -- `with_subclasses`: Specify if sub-classes are included in the resource match or not. Defaults to `True`. +- `types`: The list of protected resource types. Defaults to all managed types, e.g. the `ALL_RESOURCE_TYPES` alias. All sub-classes are included in the resource match. - `name_pattern`: A regex to match the resource name. Defaults to `None`, meaning that no name filtering is applied - `required_tags`: Dictionary of key-value pairs that must match the resource tags. Defaults to `None`, meaning that no tags filtering is applied. - `actions`: The actions authorized by this permission. Defaults to `ALL_VALUES`, an alias defined in the `action` module. - `policy`: The policy to be applied to validate a client request. +To simplify configuration, several constants are defined to streamline the permissions setup: +- In module `feast.feast_object`: + - `ALL_RESOURCE_TYPES` is the list of all the `FeastObject` types. + - `ALL_FEATURE_VIEW_TYPES` is the list of all the feature view types, including those not inheriting from `FeatureView` type like + `OnDemandFeatureView`. +- In module `feast.permissions.action`: + - `ALL_ACTIONS` is the list of all managed actions. + - `QUERY` includes all the query actions for online and offline store. + - `WRITE` includes all the write actions for online and offline store. + - `CRUD` includes all the state management actions to create, read, update or delete a Feast resource. + Given the above definitions, the feature store can be configured with granular control over each resource, enabling partitioned access by teams to meet organizational requirements for service and data sharing, and protection of sensitive information. @@ -62,7 +72,7 @@ Permission( actions=[AuthzedAction.READ, QUERY], ) ``` -Please note that all sub-classes of `FeatureView` are also included since the default for the `with_subclasses` parameter is `True`. +Please note that all sub-classes of `FeatureView` are also included. This example grants permission to write on all the data sources with `risk_level` tag set to `high` only to users with role `admin` or `data_team`: ```py @@ -85,7 +95,6 @@ The following permission grants authorization to query the offline store of all Permission( name="reader", types=[FeatureView], - with_subclasses=False, # exclude sub-classes name_pattern=".*risky.*", policy=RoleBasedPolicy(roles=["trusted"]), actions=[AuthzedAction.QUERY_OFFLINE], diff --git a/docs/reference/feast-cli-commands.md b/docs/reference/feast-cli-commands.md index e3f08936d0..ff71c342b2 100644 --- a/docs/reference/feast-cli-commands.md +++ b/docs/reference/feast-cli-commands.md @@ -171,10 +171,10 @@ Options: ``` ```text -NAME TYPES WITH_SUBCLASS NAME_PATTERN ACTIONS ROLES -reader_permission1234 FeatureView True transformed_conv_rate READ reader +NAME TYPES NAME_PATTERN ACTIONS ROLES +reader_permission1234 FeatureView transformed_conv_rate READ reader FeaduteService -writer_permission1234 FeatureView True transformed_conv_rate CREATE writer +writer_permission1234 FeatureView transformed_conv_rate CREATE writer ``` `verbose` option describes the resources matching each configured permission: diff --git a/protos/feast/core/Permission.proto b/protos/feast/core/Permission.proto index e464164afa..302b7ad70a 100644 --- a/protos/feast/core/Permission.proto +++ b/protos/feast/core/Permission.proto @@ -41,8 +41,6 @@ message Permission { repeated Type types = 3; - bool with_subclasses = 4; - string name_pattern = 5; map required_tags = 6; diff --git a/sdk/python/feast/cli.py b/sdk/python/feast/cli.py index 349130d8b4..9a89ecd32b 100644 --- a/sdk/python/feast/cli.py +++ b/sdk/python/feast/cli.py @@ -989,7 +989,6 @@ def feast_permissions_list_command(ctx: click.Context, verbose: bool, tags: list headers=[ "NAME", "TYPES", - "WITH_SUBCLASS", "NAME_PATTERN", "ACTIONS", "ROLES", diff --git a/sdk/python/feast/cli_utils.py b/sdk/python/feast/cli_utils.py index b7711c2ff4..e88fcea543 100644 --- a/sdk/python/feast/cli_utils.py +++ b/sdk/python/feast/cli_utils.py @@ -196,7 +196,6 @@ def handle_not_verbose_permissions_command( [ p.name, _to_multi_line([t.__name__ for t in p.types]), # type: ignore[union-attr, attr-defined] - p.with_subclasses, p.name_pattern, _to_multi_line([a.value.upper() for a in p.actions]), _to_multi_line(sorted(roles)), diff --git a/sdk/python/feast/feast_object.py b/sdk/python/feast/feast_object.py index 3e0c48d3d4..b272be5a4f 100644 --- a/sdk/python/feast/feast_object.py +++ b/sdk/python/feast/feast_object.py @@ -48,3 +48,9 @@ ] ALL_RESOURCE_TYPES = list(get_args(FeastObject)) +ALL_FEATURE_VIEW_TYPES = [ + FeatureView, + OnDemandFeatureView, + BatchFeatureView, + StreamFeatureView, +] diff --git a/sdk/python/feast/permissions/matcher.py b/sdk/python/feast/permissions/matcher.py index 00a820d641..10bed12e79 100644 --- a/sdk/python/feast/permissions/matcher.py +++ b/sdk/python/feast/permissions/matcher.py @@ -41,14 +41,9 @@ def _get_type(resource: "FeastObject") -> Any: return getattr(resource, "_spec_class", None) -def _is_abstract_type(type: Any) -> bool: - return bool(getattr(type, "__abstractmethods__", False)) - - def resource_match_config( resource: "FeastObject", expected_types: list["FeastObject"], - with_subclasses: bool = True, name_pattern: Optional[str] = None, required_tags: Optional[dict[str, str]] = None, ) -> bool: @@ -57,8 +52,7 @@ def resource_match_config( Args: resource: A FeastObject instance to match agains the permission. - expected_types: The list of object types configured in the permission. - with_subclasses: `True` if the type match includes sub-classes, `False` if the type match is exact. + expected_types: The list of object types configured in the permission. Type match also includes all the sub-classes. name_pattern: The optional name pattern filter configured in the permission. required_tags: The optional dicstionary of required tags configured in the permission. @@ -74,37 +68,12 @@ def resource_match_config( logger.warning(f"Given resource is not of a managed type but {_type}") return False - is_abstract = _is_abstract_type(_type) - if is_abstract and not with_subclasses: - logger.debug( - f"Overriding default configuration for abstract type {_type}: with_subclasses=True" + # mypy check ignored because of https://github.com/python/mypy/issues/11673, or it raises "Argument 2 to "isinstance" has incompatible type "tuple[Featu ..." + if not isinstance(resource, tuple(expected_types)): # type: ignore + logger.info( + f"Resource does not match any of the expected type {expected_types}" ) - with_subclasses = True - - if with_subclasses: - # mypy check ignored because of https://github.com/python/mypy/issues/11673, or it raises "Argument 2 to "isinstance" has incompatible type "tuple[Featu ..." - if not isinstance(resource, tuple(expected_types)): # type: ignore - logger.info( - f"Resource does not match any of the expected type {expected_types} (with_subclasses={with_subclasses})" - ) - return False - else: - is_mock = isinstance(resource, Mock) - exact_type_match = False - for t in expected_types: - if not is_mock: - if type(resource) is t: - exact_type_match = True - break - else: - if getattr(resource, "_spec_class", None) is t: - exact_type_match = True - break - if not exact_type_match: - logger.info( - f"Resource does not match any of the expected type {expected_types} (with_subclasses={with_subclasses})" - ) - return False + return False if name_pattern is not None: if hasattr(resource, "name"): diff --git a/sdk/python/feast/permissions/permission.py b/sdk/python/feast/permissions/permission.py index b62fa7c01a..b942f3b10e 100644 --- a/sdk/python/feast/permissions/permission.py +++ b/sdk/python/feast/permissions/permission.py @@ -28,10 +28,8 @@ class Permission(ABC): Attributes: name: The permission name (can be duplicated, used for logging troubleshooting). - types: The list of protected resource types as defined by the `FeastObject` type. + types: The list of protected resource types as defined by the `FeastObject` type. The match includes all the sub-classes of the given types. Defaults to all managed types (e.g. the `ALL_RESOURCE_TYPES` constant) - with_subclasses: If `True`, it includes sub-classes of the given types in the match, otherwise only exact type match is applied. - Defaults to `True`. name_pattern: A regex to match the resource name. Defaults to None, meaning that no name filtering is applied be present in a resource tags with the given value. Defaults to None, meaning that no tags filtering is applied. actions: The actions authorized by this permission. Defaults to `ALL_ACTIONS`. @@ -41,7 +39,6 @@ class Permission(ABC): _name: str _types: list["FeastObject"] - _with_subclasses: bool _name_pattern: Optional[str] _actions: list[AuthzedAction] _policy: Policy @@ -51,7 +48,6 @@ def __init__( self, name: str, types: Optional[Union[list["FeastObject"], "FeastObject"]] = None, - with_subclasses: bool = True, name_pattern: Optional[str] = None, actions: Union[list[AuthzedAction], AuthzedAction] = ALL_ACTIONS, policy: Policy = AllowAll, @@ -70,7 +66,6 @@ def __init__( raise ValueError("The list 'policy' must be non-empty.") self._name = name self._types = types if isinstance(types, list) else [types] - self._with_subclasses = with_subclasses self._name_pattern = _normalize_name_pattern(name_pattern) self._actions = actions if isinstance(actions, list) else [actions] self._policy = policy @@ -82,7 +77,6 @@ def __eq__(self, other): if ( self.name != other.name - or self.with_subclasses != other.with_subclasses or self.name_pattern != other.name_pattern or self.tags != other.tags or self.policy != other.policy @@ -109,10 +103,6 @@ def name(self) -> str: def types(self) -> list["FeastObject"]: return self._types - @property - def with_subclasses(self) -> bool: - return self._with_subclasses - @property def name_pattern(self) -> Optional[str]: return self._name_pattern @@ -137,7 +127,6 @@ def match_resource(self, resource: "FeastObject") -> bool: return resource_match_config( resource=resource, expected_types=self.types, - with_subclasses=self.with_subclasses, name_pattern=self.name_pattern, required_tags=self.tags, ) @@ -178,7 +167,6 @@ def from_proto(permission_proto: PermissionProto) -> Any: permission = Permission( permission_proto.name, types, - permission_proto.with_subclasses, permission_proto.name_pattern or None, actions, Policy.from_proto(permission_proto.policy), @@ -205,7 +193,6 @@ def to_proto(self) -> PermissionProto: permission_proto = PermissionProto( name=self.name, types=types, - with_subclasses=self.with_subclasses, name_pattern=self.name_pattern if self.name_pattern is not None else "", actions=actions, policy=self.policy.to_proto(), diff --git a/sdk/python/tests/integration/feature_repos/repo_configuration.py b/sdk/python/tests/integration/feature_repos/repo_configuration.py index 6ba2b20347..4272d7fd9d 100644 --- a/sdk/python/tests/integration/feature_repos/repo_configuration.py +++ b/sdk/python/tests/integration/feature_repos/repo_configuration.py @@ -488,35 +488,30 @@ def setup(self): Permission( name="offline_fv_perm", types=FeatureView, - with_subclasses=False, policy=RoleBasedPolicy(roles=["writer"]), actions=[AuthzedAction.QUERY_OFFLINE, AuthzedAction.WRITE_OFFLINE], ), Permission( name="offline_odfv_perm", types=OnDemandFeatureView, - with_subclasses=False, policy=RoleBasedPolicy(roles=["writer"]), actions=[AuthzedAction.QUERY_OFFLINE, AuthzedAction.WRITE_OFFLINE], ), Permission( name="offline_sfv_perm", types=StreamFeatureView, - with_subclasses=False, policy=RoleBasedPolicy(roles=["writer"]), actions=[AuthzedAction.QUERY_OFFLINE, AuthzedAction.WRITE_OFFLINE], ), Permission( name="offline_fs_perm", types=FeatureService, - with_subclasses=False, policy=RoleBasedPolicy(roles=["writer"]), actions=[AuthzedAction.QUERY_OFFLINE, AuthzedAction.WRITE_OFFLINE], ), Permission( name="offline_datasource_perm", types=DataSource, - with_subclasses=True, policy=RoleBasedPolicy(roles=["writer"]), actions=[AuthzedAction.QUERY_OFFLINE, AuthzedAction.WRITE_OFFLINE], ), diff --git a/sdk/python/tests/integration/online_store/test_remote_online_store.py b/sdk/python/tests/integration/online_store/test_remote_online_store.py index 57bafc6d5e..9a85894606 100644 --- a/sdk/python/tests/integration/online_store/test_remote_online_store.py +++ b/sdk/python/tests/integration/online_store/test_remote_online_store.py @@ -25,21 +25,18 @@ def test_remote_online_store_read(auth_config): Permission( name="online_list_fv_perm", types=FeatureView, - with_subclasses=False, policy=RoleBasedPolicy(roles=["reader"]), actions=[AuthzedAction.QUERY_ONLINE], ), Permission( name="online_list_odfv_perm", types=OnDemandFeatureView, - with_subclasses=False, policy=RoleBasedPolicy(roles=["reader"]), actions=[AuthzedAction.QUERY_ONLINE], ), Permission( name="online_list_sfv_perm", types=StreamFeatureView, - with_subclasses=False, policy=RoleBasedPolicy(roles=["reader"]), actions=[AuthzedAction.QUERY_ONLINE], ), diff --git a/sdk/python/tests/integration/registration/test_universal_registry.py b/sdk/python/tests/integration/registration/test_universal_registry.py index 09e2f9744e..fbcfa3b9b8 100644 --- a/sdk/python/tests/integration/registration/test_universal_registry.py +++ b/sdk/python/tests/integration/registration/test_universal_registry.py @@ -1386,7 +1386,6 @@ def test_apply_permission_success(test_registry): and isinstance(permission.policy, RoleBasedPolicy) and len(permission.policy.roles) == 1 and permission.policy.roles[0] == "reader" - and permission.with_subclasses and permission.name_pattern is None and permission.tags is None ) @@ -1401,7 +1400,6 @@ def test_apply_permission_success(test_registry): and isinstance(permission.policy, RoleBasedPolicy) and len(permission.policy.roles) == 1 and permission.policy.roles[0] == "reader" - and permission.with_subclasses and permission.name_pattern is None and permission.tags is None ) @@ -1435,7 +1433,6 @@ def test_apply_permission_success(test_registry): and len(updated_permission.policy.roles) == 2 and "reader" in updated_permission.policy.roles and "writer" in updated_permission.policy.roles - and updated_permission.with_subclasses and updated_permission.name_pattern is None and updated_permission.tags is None ) @@ -1452,7 +1449,6 @@ def test_apply_permission_success(test_registry): actions=[AuthzedAction.READ, AuthzedAction.WRITE_ONLINE], policy=RoleBasedPolicy(roles=["reader", "writer"]), types=FeatureView, - with_subclasses=False, name_pattern="aaa", tags={"team": "matchmaking"}, ) @@ -1474,7 +1470,6 @@ def test_apply_permission_success(test_registry): and len(updated_permission.policy.roles) == 2 and "reader" in updated_permission.policy.roles and "writer" in updated_permission.policy.roles - and not updated_permission.with_subclasses and updated_permission.name_pattern == "aaa" and "team" in updated_permission.tags and updated_permission.tags["team"] == "matchmaking" diff --git a/sdk/python/tests/unit/diff/test_registry_diff.py b/sdk/python/tests/unit/diff/test_registry_diff.py index 08d33c2366..f30df2a2d2 100644 --- a/sdk/python/tests/unit/diff/test_registry_diff.py +++ b/sdk/python/tests/unit/diff/test_registry_diff.py @@ -180,14 +180,12 @@ def test_diff_registry_objects_permissions(): pre_changed = Permission( name="reader", types=ALL_RESOURCE_TYPES, - with_subclasses=True, policy=RoleBasedPolicy(roles=["reader"]), actions=[AuthzedAction.READ], ) post_changed = Permission( name="reader", types=ALL_RESOURCE_TYPES, - with_subclasses=True, policy=RoleBasedPolicy(roles=["reader"]), actions=[AuthzedAction.CREATE], ) diff --git a/sdk/python/tests/unit/local_feast_tests/test_local_feature_store.py b/sdk/python/tests/unit/local_feast_tests/test_local_feature_store.py index 10fc265d2e..0cf0292b3f 100644 --- a/sdk/python/tests/unit/local_feast_tests/test_local_feature_store.py +++ b/sdk/python/tests/unit/local_feast_tests/test_local_feature_store.py @@ -352,7 +352,6 @@ def test_apply_permissions(test_feature_store): permission = Permission( name="reader", types=ALL_RESOURCE_TYPES, - with_subclasses=True, policy=RoleBasedPolicy(roles=["reader"]), actions=[AuthzedAction.READ], ) diff --git a/sdk/python/tests/unit/permissions/auth/server/test_utils.py b/sdk/python/tests/unit/permissions/auth/server/test_utils.py index 36b9d3ef82..2053880dd5 100644 --- a/sdk/python/tests/unit/permissions/auth/server/test_utils.py +++ b/sdk/python/tests/unit/permissions/auth/server/test_utils.py @@ -17,7 +17,6 @@ read_entities_perm = Permission( name="read_entities_perm", types=Entity, - with_subclasses=False, policy=RoleBasedPolicy(roles=["reader"]), actions=[AuthzedAction.READ], ) @@ -25,7 +24,6 @@ read_fv_perm = Permission( name="read_fv_perm", types=FeatureView, - with_subclasses=False, policy=RoleBasedPolicy(roles=["reader"]), actions=[AuthzedAction.READ], ) @@ -33,7 +31,6 @@ read_odfv_perm = Permission( name="read_odfv_perm", types=OnDemandFeatureView, - with_subclasses=False, policy=RoleBasedPolicy(roles=["reader"]), actions=[AuthzedAction.READ], ) @@ -41,7 +38,6 @@ read_sfv_perm = Permission( name="read_sfv_perm", types=StreamFeatureView, - with_subclasses=False, policy=RoleBasedPolicy(roles=["reader"]), actions=[AuthzedAction.READ], ) @@ -49,7 +45,6 @@ invalid_list_entities_perm = Permission( name="invalid_list_entity_perm", types=Entity, - with_subclasses=False, policy=RoleBasedPolicy(roles=["dancer"]), actions=[AuthzedAction.READ], ) diff --git a/sdk/python/tests/unit/permissions/conftest.py b/sdk/python/tests/unit/permissions/conftest.py index c85ebb1596..fd4113873e 100644 --- a/sdk/python/tests/unit/permissions/conftest.py +++ b/sdk/python/tests/unit/permissions/conftest.py @@ -59,7 +59,6 @@ def security_manager() -> SecurityManager: Permission( name="reader", types=FeatureView, - with_subclasses=True, policy=RoleBasedPolicy(roles=["reader"]), actions=[AuthzedAction.READ], ) @@ -68,7 +67,6 @@ def security_manager() -> SecurityManager: Permission( name="writer", types=FeatureView, - with_subclasses=True, policy=RoleBasedPolicy(roles=["writer"]), actions=[AuthzedAction.UPDATE], ) @@ -77,7 +75,6 @@ def security_manager() -> SecurityManager: Permission( name="special", types=FeatureView, - with_subclasses=True, name_pattern="special.*", policy=RoleBasedPolicy(roles=["admin", "special-reader"]), actions=[AuthzedAction.READ, AuthzedAction.UPDATE], diff --git a/sdk/python/tests/unit/permissions/test_permission.py b/sdk/python/tests/unit/permissions/test_permission.py index dd0e0ae411..120f1923b6 100644 --- a/sdk/python/tests/unit/permissions/test_permission.py +++ b/sdk/python/tests/unit/permissions/test_permission.py @@ -23,7 +23,6 @@ def test_defaults(): p = Permission(name="test") assertpy.assert_that(type(p.types)).is_equal_to(list) assertpy.assert_that(p.types).is_equal_to(ALL_RESOURCE_TYPES) - assertpy.assert_that(p.with_subclasses).is_true() assertpy.assert_that(p.name_pattern).is_none() assertpy.assert_that(p.tags).is_none() assertpy.assert_that(type(p.actions)).is_equal_to(list) @@ -139,68 +138,7 @@ def test_normalized_args(): + [(Mock(spec=t), [t], True) for t in ALL_RESOURCE_TYPES], ) def test_match_resource_with_subclasses(resource, types, result): - p = Permission(name="test", types=types, with_subclasses=True) - assertpy.assert_that(p.match_resource(resource)).is_equal_to(result) - - -@pytest.mark.parametrize( - "resource, types, result", - [ - (None, ALL_RESOURCE_TYPES, False), - ("invalid string", ALL_RESOURCE_TYPES, False), - ("ALL", ALL_RESOURCE_TYPES, False), - ("ALL", ALL_RESOURCE_TYPES, False), - ( - Mock(spec=FeatureView), - [t for t in ALL_RESOURCE_TYPES if t not in [FeatureView]], - False, - ), - ( - Mock(spec=OnDemandFeatureView), - [t for t in ALL_RESOURCE_TYPES if t not in [OnDemandFeatureView]], - False, - ), - ( - Mock(spec=BatchFeatureView), - [t for t in ALL_RESOURCE_TYPES if t not in [BatchFeatureView]], - False, - ), - ( - Mock(spec=StreamFeatureView), - [t for t in ALL_RESOURCE_TYPES if t not in [StreamFeatureView]], - False, - ), - ( - Mock(spec=Entity), - [t for t in ALL_RESOURCE_TYPES if t not in [Entity]], - False, - ), - ( - Mock(spec=FeatureService), - [t for t in ALL_RESOURCE_TYPES if t not in [FeatureService]], - False, - ), - ( - Mock(spec=DataSource), - [t for t in ALL_RESOURCE_TYPES if t not in [DataSource]], - False, - ), - ( - Mock(spec=ValidationReference), - [t for t in ALL_RESOURCE_TYPES if t not in [ValidationReference]], - False, - ), - ( - Mock(spec=Permission), - [t for t in ALL_RESOURCE_TYPES if t not in [Permission]], - False, - ), - ] - + [(Mock(spec=t), ALL_RESOURCE_TYPES, True) for t in ALL_RESOURCE_TYPES] - + [(Mock(spec=t), [t], True) for t in ALL_RESOURCE_TYPES], -) -def test_match_resource_no_subclasses(resource, types, result): - p = Permission(name="test", types=types, with_subclasses=False) + p = Permission(name="test", types=types) assertpy.assert_that(p.match_resource(resource)).is_equal_to(result) From a8abd21048ed9a2edf9ebc6d3fdb6a0188d84ca4 Mon Sep 17 00:00:00 2001 From: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Date: Fri, 9 Aug 2024 10:29:25 +0200 Subject: [PATCH 151/169] a full, minimal, reproducible example of the RBAC feature Signed-off-by: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Signed-off-by: Abdul Hameed --- examples/rbac-local/01.1-start-keycloak.ipynb | 95 ++ examples/rbac-local/01.2-setup-keycloak.ipynb | 439 +++++++ examples/rbac-local/01.3-setup-feast.ipynb | 1069 +++++++++++++++++ examples/rbac-local/02-registry_server.ipynb | 370 ++++++ examples/rbac-local/03-online_server.ipynb | 126 ++ examples/rbac-local/04-offline_server.ipynb | 263 ++++ examples/rbac-local/README.md | 57 + examples/rbac-local/client.ipynb | 837 +++++++++++++ examples/rbac-local/client/feature_store.yaml | 21 + 9 files changed, 3277 insertions(+) create mode 100644 examples/rbac-local/01.1-start-keycloak.ipynb create mode 100644 examples/rbac-local/01.2-setup-keycloak.ipynb create mode 100644 examples/rbac-local/01.3-setup-feast.ipynb create mode 100644 examples/rbac-local/02-registry_server.ipynb create mode 100644 examples/rbac-local/03-online_server.ipynb create mode 100644 examples/rbac-local/04-offline_server.ipynb create mode 100644 examples/rbac-local/README.md create mode 100644 examples/rbac-local/client.ipynb create mode 100644 examples/rbac-local/client/feature_store.yaml diff --git a/examples/rbac-local/01.1-start-keycloak.ipynb b/examples/rbac-local/01.1-start-keycloak.ipynb new file mode 100644 index 0000000000..51167dcf46 --- /dev/null +++ b/examples/rbac-local/01.1-start-keycloak.ipynb @@ -0,0 +1,95 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "e46a65b1-7cf0-4cc2-8aca-529d659630a4", + "metadata": {}, + "source": [ + "# Start Keycloak server" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "374e8693-7e47-4985-b7f6-a9b818b0b4d0", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Updating the configuration and installing your custom providers, if any. Please wait.\n", + "2024-08-08 15:11:17,793 WARN [io.qua.dep.ind.IndexWrapper] (build-129) Failed to index jakarta.jms.Connection: Class does not exist in ClassLoader QuarkusClassLoader:Deployment Class Loader: PROD for keycloak@273c947f\n", + "2024-08-08 15:11:18,013 WARN [io.qua.dep.ind.IndexWrapper] (build-129) Failed to index io.mashona.logwriting.ArrayStore: Class does not exist in ClassLoader QuarkusClassLoader:Deployment Class Loader: PROD for keycloak@273c947f\n", + "2024-08-08 15:11:18,090 WARN [io.qua.dep.ind.IndexWrapper] (build-129) Failed to index org.apache.activemq.artemis.core.journal.RecordInfo: Class does not exist in ClassLoader QuarkusClassLoader:Deployment Class Loader: PROD for keycloak@273c947f\n", + "2024-08-08 15:11:18,097 WARN [io.qua.dep.ind.IndexWrapper] (build-129) Failed to index org.apache.activemq.artemis.core.journal.Journal: Class does not exist in ClassLoader QuarkusClassLoader:Deployment Class Loader: PROD for keycloak@273c947f\n", + "2024-08-08 15:11:18,272 WARN [io.qua.dep.ind.IndexWrapper] (build-129) Failed to index jakarta.jms.XAConnection: Class does not exist in ClassLoader QuarkusClassLoader:Deployment Class Loader: PROD for keycloak@273c947f\n", + "2024-08-08 15:11:18,289 WARN [io.qua.dep.ind.IndexWrapper] (build-129) Failed to index jakarta.jms.XASession: Class does not exist in ClassLoader QuarkusClassLoader:Deployment Class Loader: PROD for keycloak@273c947f\n", + "2024-08-08 15:11:18,298 WARN [io.qua.dep.ind.IndexWrapper] (build-129) Failed to index jakarta.jms.XAConnectionFactory: Class does not exist in ClassLoader QuarkusClassLoader:Deployment Class Loader: PROD for keycloak@273c947f\n", + "2024-08-08 15:11:18,514 WARN [io.qua.dep.ind.IndexWrapper] (build-129) Failed to index org.apache.tools.ant.Task: Class does not exist in ClassLoader QuarkusClassLoader:Deployment Class Loader: PROD for keycloak@273c947f\n", + "2024-08-08 15:11:19,217 WARN [io.qua.dep.ind.IndexWrapper] (build-129) Failed to index org.springframework.core.io.DefaultResourceLoader: Class does not exist in ClassLoader QuarkusClassLoader:Deployment Class Loader: PROD for keycloak@273c947f\n", + "2024-08-08 15:11:19,227 WARN [io.qua.dep.ind.IndexWrapper] (build-129) Failed to index org.springframework.core.io.ResourceLoader: Class does not exist in ClassLoader QuarkusClassLoader:Deployment Class Loader: PROD for keycloak@273c947f\n", + "2024-08-08 15:11:19,252 WARN [io.qua.dep.ind.IndexWrapper] (build-129) Failed to index org.springframework.core.io.Resource: Class does not exist in ClassLoader QuarkusClassLoader:Deployment Class Loader: PROD for keycloak@273c947f\n", + "2024-08-08 15:12:54,690 INFO [io.qua.dep.QuarkusAugmentor] (main) Quarkus augmentation completed in 256049ms\n", + "2024-08-08 15:13:43,822 WARN [org.infinispan.CONFIG] (keycloak-cache-init) ISPN000569: Unable to persist Infinispan internal caches as no global state enabled\n", + "2024-08-08 15:13:45,998 INFO [org.infinispan.CONTAINER] (keycloak-cache-init) ISPN000556: Starting user marshaller 'org.infinispan.jboss.marshalling.core.JBossUserMarshaller'\n", + "2024-08-08 15:13:48,154 INFO [org.keycloak.quarkus.runtime.hostname.DefaultHostnameProvider] (main) Hostname settings: Base URL: , Hostname: , Strict HTTPS: false, Path: , Strict BackChannel: false, Admin URL: , Admin: , Port: -1, Proxied: false\n", + "2024-08-08 15:14:19,526 WARN [io.quarkus.agroal.runtime.DataSources] (JPA Startup Thread) Datasource enables XA but transaction recovery is not enabled. Please enable transaction recovery by setting quarkus.transaction-manager.enable-recovery=true, otherwise data may be lost if the application is terminated abruptly\n", + "2024-08-08 15:14:31,108 INFO [org.keycloak.broker.provider.AbstractIdentityProviderMapper] (main) Registering class org.keycloak.broker.provider.mappersync.ConfigSyncEventListener\n", + "2024-08-08 15:14:31,306 INFO [org.keycloak.connections.infinispan.DefaultInfinispanConnectionProviderFactory] (main) Node name: node_864586, Site name: null\n", + "2024-08-08 15:14:45,216 INFO [org.keycloak.quarkus.runtime.storage.legacy.liquibase.QuarkusJpaUpdaterProvider] (main) Initializing database schema. Using changelog META-INF/jpa-changelog-master.xml\n", + "\n", + "UPDATE SUMMARY\n", + "Run: 124\n", + "Previously run: 0\n", + "Filtered out: 0\n", + "-------------------------------\n", + "Total change sets: 124\n", + "\n", + "2024-08-08 15:15:26,602 INFO [org.keycloak.services] (main) KC-SERVICES0050: Initializing master realm\n", + "2024-08-08 15:15:39,561 INFO [org.keycloak.services] (main) KC-SERVICES0009: Added user 'admin' to realm 'master'\n", + "2024-08-08 15:15:40,191 INFO [io.quarkus] (main) Keycloak 24.0.4 on JVM (powered by Quarkus 3.8.4) started in 162.787s. Listening on: http://0.0.0.0:8080\n", + "2024-08-08 15:15:40,196 INFO [io.quarkus] (main) Profile dev activated. \n", + "2024-08-08 15:15:40,198 INFO [io.quarkus] (main) Installed features: [agroal, cdi, hibernate-orm, jdbc-h2, keycloak, logging-gelf, narayana-jta, reactive-routes, resteasy-reactive, resteasy-reactive-jackson, smallrye-context-propagation, vertx]\n", + "2024-08-08 15:15:40,226 WARN [org.keycloak.quarkus.runtime.KeycloakMain] (main) Running the server in development mode. DO NOT use this configuration in production.\n", + "^C\n" + ] + } + ], + "source": [ + "!docker run --rm -p 9999:8080 --name my-keycloak \\\n", + "-e KEYCLOAK_ADMIN=admin -e KEYCLOAK_ADMIN_PASSWORD=admin \\\n", + "quay.io/keycloak/keycloak:24.0.4 start-dev" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d2d1e035-85b3-4d77-abb3-13af5e31ef37", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/rbac-local/01.2-setup-keycloak.ipynb b/examples/rbac-local/01.2-setup-keycloak.ipynb new file mode 100644 index 0000000000..db2eb6768d --- /dev/null +++ b/examples/rbac-local/01.2-setup-keycloak.ipynb @@ -0,0 +1,439 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "e8952066-7a10-4c9b-a4b7-27be074ae269", + "metadata": {}, + "source": [ + "## Create Keycloak resources" + ] + }, + { + "cell_type": "markdown", + "id": "7252812d-90eb-4752-91a7-d46b400bacd8", + "metadata": {}, + "source": [ + "Wait until Keycloak is running" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "e5d13f76-f184-44f6-8542-54a61060e531", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[1;39m{\n", + " \u001b[0m\u001b[1;34m\"Status\"\u001b[0m\u001b[1;39m: \u001b[0m\u001b[0;32m\"running\"\u001b[0m\u001b[1;39m,\n", + " \u001b[0m\u001b[1;34m\"Running\"\u001b[0m\u001b[1;39m: \u001b[0m\u001b[0;39mtrue\u001b[0m\u001b[1;39m,\n", + " \u001b[0m\u001b[1;34m\"Paused\"\u001b[0m\u001b[1;39m: \u001b[0m\u001b[0;39mfalse\u001b[0m\u001b[1;39m,\n", + " \u001b[0m\u001b[1;34m\"Restarting\"\u001b[0m\u001b[1;39m: \u001b[0m\u001b[0;39mfalse\u001b[0m\u001b[1;39m,\n", + " \u001b[0m\u001b[1;34m\"OOMKilled\"\u001b[0m\u001b[1;39m: \u001b[0m\u001b[0;39mfalse\u001b[0m\u001b[1;39m,\n", + " \u001b[0m\u001b[1;34m\"Dead\"\u001b[0m\u001b[1;39m: \u001b[0m\u001b[0;39mfalse\u001b[0m\u001b[1;39m,\n", + " \u001b[0m\u001b[1;34m\"Pid\"\u001b[0m\u001b[1;39m: \u001b[0m\u001b[0;39m8917\u001b[0m\u001b[1;39m,\n", + " \u001b[0m\u001b[1;34m\"ExitCode\"\u001b[0m\u001b[1;39m: \u001b[0m\u001b[0;39m0\u001b[0m\u001b[1;39m,\n", + " \u001b[0m\u001b[1;34m\"Error\"\u001b[0m\u001b[1;39m: \u001b[0m\u001b[0;32m\"\"\u001b[0m\u001b[1;39m,\n", + " \u001b[0m\u001b[1;34m\"StartedAt\"\u001b[0m\u001b[1;39m: \u001b[0m\u001b[0;32m\"2024-08-08T15:07:40.162311318Z\"\u001b[0m\u001b[1;39m,\n", + " \u001b[0m\u001b[1;34m\"FinishedAt\"\u001b[0m\u001b[1;39m: \u001b[0m\u001b[0;32m\"0001-01-01T00:00:00Z\"\u001b[0m\u001b[1;39m\n", + "\u001b[1;39m}\u001b[0m\n" + ] + } + ], + "source": [ + "!docker inspect --format='json' my-keycloak | yq '.[0].State'" + ] + }, + { + "cell_type": "markdown", + "id": "cc9a6329-4e89-464c-ac48-dbbadaf72a2b", + "metadata": {}, + "source": [ + "Then create a sample realm and client with some roles and users matching the test environment." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "d5c60591-f41d-4a5e-9b18-93385a889495", + "metadata": {}, + "outputs": [], + "source": [ + "import requests\n", + "import json\n", + "from dotenv import set_key\n", + "\n", + "OIDC_SERVER_URL = \"http://0.0.0.0:9999\"\n", + "ADMIN_USERNAME = \"admin\"\n", + "ADMIN_PASSWORD = \"admin\"\n", + "\n", + "access_token: str = \"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "d16969bc-423a-4d18-afa3-97a791b84b13", + "metadata": {}, + "outputs": [], + "source": [ + "def get_token():\n", + " token_url = f\"{OIDC_SERVER_URL}/realms/master/protocol/openid-connect/token\"\n", + "\n", + " token_data = {\n", + " \"grant_type\": \"password\",\n", + " \"client_id\": \"admin-cli\",\n", + " \"username\": ADMIN_USERNAME,\n", + " \"password\": ADMIN_PASSWORD,\n", + " }\n", + "\n", + " token_response = requests.post(token_url, data=token_data)\n", + " if token_response.status_code == 200:\n", + " global access_token\n", + " access_token = token_response.json()[\"access_token\"]\n", + " return access_token\n", + " else:\n", + " print(\n", + " f\"Failed to obtain access token: {token_response.status_code} - {token_response.text}\"\n", + " )\n", + " raise Exception(\"Not authenticated\")\n", + "\n", + "\n", + "def keycloak_post(endpoint, data=None):\n", + " url = f\"{OIDC_SERVER_URL}/admin/{endpoint}\"\n", + " print(f\"Creating {endpoint}\")\n", + " global access_token\n", + " headers = {\n", + " \"Content-Type\": \"application/json\",\n", + " \"Authorization\": f\"Bearer {access_token}\",\n", + " }\n", + " response = requests.request(\"POST\", url, headers=headers, data=json.dumps(data))\n", + " print(f\"POST response.status_code is {response.status_code}\")\n", + " return response.status_code\n", + "\n", + "\n", + "def keycloak_get(endpoint):\n", + " url = f\"{OIDC_SERVER_URL}/admin/{endpoint}\"\n", + " global access_token\n", + " headers = {\n", + " \"Content-Type\": \"application/json\",\n", + " \"Authorization\": f\"Bearer {access_token}\",\n", + " }\n", + " response = requests.request(\"GET\", url, headers=headers)\n", + " print(f\"GET response.status_code is {response.status_code}\")\n", + " return response.json()\n", + "\n", + "\n", + "def create_realm(realm_name):\n", + " data = {\"realm\": realm_name, \"enabled\": \"true\"}\n", + " keycloak_post(\"realms\", data=data)\n", + " response = keycloak_get(f\"realms/{realm_name}\")\n", + " return response[\"id\"]\n", + "\n", + "\n", + "def create_client(realm_name, client_name):\n", + " data = {\n", + " \"clientId\": client_name,\n", + " \"enabled\": \"true\",\n", + " \"redirectUris\": [\n", + " \"http://localhost:8000/*\",\n", + " \"http://127.0.0.1:8000/*\",\n", + " \"http://0.0.0.0:8000/*\",\n", + " ],\n", + " \"publicClient\": False,\n", + " \"authorizationServicesEnabled\": True,\n", + " \"protocol\": \"openid-connect\",\n", + " \"standardFlowEnabled\": True,\n", + " \"directAccessGrantsEnabled\": True,\n", + " \"serviceAccountsEnabled\": True,\n", + " }\n", + " keycloak_post(f\"realms/{realm_name}/clients\", data=data)\n", + " response = keycloak_get(f\"realms/{realm_name}/clients\")\n", + " client = None\n", + " for c in response:\n", + " if c[\"clientId\"] == client_name:\n", + " client = c\n", + " break\n", + " client_id = client[\"id\"]\n", + " client_secret = client[\"secret\"]\n", + " return client_id, client_secret\n", + "\n", + "\n", + "def create_client_roles(realm_name, client_id, roles):\n", + " for role_name in roles:\n", + " data = {\"name\": role_name, \"clientRole\": True}\n", + " keycloak_post(f\"realms/{realm_name}/clients/{client_id}/roles\", data=data)\n", + "\n", + " response = keycloak_get(f\"realms/{realm_name}/clients/{client_id}/roles\")\n", + " roles_by_name = dict((role[\"name\"], role[\"id\"]) for role in response)\n", + " print(roles_by_name)\n", + " return roles_by_name\n", + "\n", + "\n", + "def create_user_with_roles(\n", + " realm_name, username, password, client_id, roles_by_name, roles\n", + "):\n", + " data = {\n", + " \"username\": username,\n", + " \"enabled\": True,\n", + " \"email\": f\"{username}@poc.com\",\n", + " \"emailVerified\": True,\n", + " \"firstName\": \"user\",\n", + " \"lastName\": f\"{username}\",\n", + " \"credentials\": [{\"type\": \"password\", \"value\": password}],\n", + " \"realmRoles\": [],\n", + " }\n", + " keycloak_post(f\"realms/{realm_name}/users\", data=data)\n", + " response = keycloak_get(f\"realms/{realm_name}/users\")\n", + " user = None\n", + " for u in response:\n", + " if u[\"username\"] == username:\n", + " user = u\n", + " break\n", + " user_id = user[\"id\"]\n", + "\n", + " data = [\n", + " {\n", + " \"id\": roles_by_name[role_name],\n", + " \"name\": role_name,\n", + " }\n", + " for role_name in roles\n", + " ]\n", + " keycloak_post(\n", + " f\"realms/{realm_name}/users/{user_id}/role-mappings/clients/{client_id}\",\n", + " data=data,\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "e097fac1-f2c3-4afe-b78c-2c8279e3a84e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICIweUNoR2N3ZG1ZNXRSNkJ5MGtVQjRmZDVPZTVqM2JLak5pX2hKUmc2ejdFIn0.eyJleHAiOjE3MjMxMzAyNTgsImlhdCI6MTcyMzEzMDE5OCwianRpIjoiNGNkOWRmMTQtZTYzYy00YTFiLTg1ODQtMGE4OGZkYTFiOGI2IiwiaXNzIjoiaHR0cDovLzAuMC4wLjA6OTk5OS9yZWFsbXMvbWFzdGVyIiwic3ViIjoiOTAyM2FjMTEtZWI0Yi00YjlkLTk2MDItNWJlMWRkMGU0NzRjIiwidHlwIjoiQmVhcmVyIiwiYXpwIjoiYWRtaW4tY2xpIiwic2Vzc2lvbl9zdGF0ZSI6ImNhYzg5YjAxLTMxOTYtNDMzZi1iMGJiLTBmZGY3MDUyNmZmNiIsImFjciI6IjEiLCJzY29wZSI6InByb2ZpbGUgZW1haWwiLCJzaWQiOiJjYWM4OWIwMS0zMTk2LTQzM2YtYjBiYi0wZmRmNzA1MjZmZjYiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsInByZWZlcnJlZF91c2VybmFtZSI6ImFkbWluIn0.xrLurTh9eiU4Kyqk6EGER5qaf9MPDJFT34xkUMYbl2ZmzUz8VnKSsJtFlkPSSgMhAprecjlPWLrKqRdAK35YKnXBFUBxEznCTa6fykdHh_3tuTbwt3vtLRxAogTDghnVsRL3VK295jnclUgQzaJUIoFGXgapfxihfn6em6PqBaYWEcKlbd0lhNA_BmAe-XFOnz2o6kUd0TGKCD43plhhL0QfpHmiJ509rqGkuywTgo5WTXFP52Zc6v9b3eReSNXefyuMtZA9gsyCxzhFl1azZh8CPe6UuadcTd1O0d4mbIRiIu2aUrjlplkFrB1KMSGSBD1MaS88PibetMth6P5xgg'" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "get_token()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "f114fa41-8cea-486f-baf4-998cbf69fea4", + "metadata": {}, + "outputs": [], + "source": [ + "realm_name = \"rbac_example\"\n", + "client_name = \"app\"\n", + "password = \"password\"" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "0f889548-9b60-448b-beed-ac3fc1890b13", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Creating realms\n", + "POST response.status_code is 201\n", + "GET response.status_code is 200\n", + "Creating realms/rbac_example/clients\n", + "POST response.status_code is 201\n", + "GET response.status_code is 200\n", + "Creating realms/rbac_example/clients/1fcdfed3-9b28-421f-883d-cde6b000c26d/roles\n", + "POST response.status_code is 201\n", + "Creating realms/rbac_example/clients/1fcdfed3-9b28-421f-883d-cde6b000c26d/roles\n", + "POST response.status_code is 201\n", + "Creating realms/rbac_example/clients/1fcdfed3-9b28-421f-883d-cde6b000c26d/roles\n", + "POST response.status_code is 201\n", + "Creating realms/rbac_example/clients/1fcdfed3-9b28-421f-883d-cde6b000c26d/roles\n", + "POST response.status_code is 201\n", + "GET response.status_code is 200\n", + "{'fresh_writer': '1d2cdaa5-efd7-471f-9b10-b68de2f11cd1', 'reader': '856f4a68-687a-4319-9441-588a6c18fb13', 'batch_admin': '42b414ab-4e43-4b3e-83a0-011393f2952a', 'store_admin': '9ad09a29-0493-47f5-83ad-5de081025c04', 'uma_protection': '0752be64-28bb-430e-8d3c-38ad0c8b1d1b'}\n" + ] + } + ], + "source": [ + "realm_id = create_realm(realm_name)\n", + "client_id, client_secret = create_client(realm_name, client_name)\n", + "\n", + "roles_by_name = create_client_roles(\n", + " realm_name, client_id, [\"reader\", \"fresh_writer\", \"store_admin\", \"batch_admin\"]\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "a3430d83-107d-44ad-acf2-0df810dff0ff", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Creating realms/rbac_example/users\n", + "POST response.status_code is 201\n", + "GET response.status_code is 200\n", + "Creating realms/rbac_example/users/345ce240-c1d6-4df7-8f86-f6717a24ae19/role-mappings/clients/1fcdfed3-9b28-421f-883d-cde6b000c26d\n", + "POST response.status_code is 204\n", + "Creating realms/rbac_example/users\n", + "POST response.status_code is 201\n", + "GET response.status_code is 200\n", + "Creating realms/rbac_example/users/34a9dd95-8504-41f4-89f5-e243a9581f55/role-mappings/clients/1fcdfed3-9b28-421f-883d-cde6b000c26d\n", + "POST response.status_code is 204\n", + "Creating realms/rbac_example/users\n", + "POST response.status_code is 201\n", + "GET response.status_code is 200\n", + "Creating realms/rbac_example/users/2b57245d-7cdf-4fef-b455-b1f1551c0bf3/role-mappings/clients/1fcdfed3-9b28-421f-883d-cde6b000c26d\n", + "POST response.status_code is 204\n", + "Creating realms/rbac_example/users\n", + "POST response.status_code is 201\n", + "GET response.status_code is 200\n", + "Creating realms/rbac_example/users/c01fd547-036f-4efa-896c-9e8f3cf1f31e/role-mappings/clients/1fcdfed3-9b28-421f-883d-cde6b000c26d\n", + "POST response.status_code is 204\n" + ] + } + ], + "source": [ + "create_user_with_roles(\n", + " realm_name, \"reader\", password, client_id, roles_by_name, [\"reader\"]\n", + ")\n", + "create_user_with_roles(\n", + " realm_name,\n", + " \"writer\",\n", + " password,\n", + " client_id,\n", + " roles_by_name,\n", + " [\"fresh_writer\"],\n", + ")\n", + "create_user_with_roles(\n", + " realm_name,\n", + " \"batch_admin\",\n", + " password,\n", + " client_id,\n", + " roles_by_name,\n", + " [\"batch_admin\"],\n", + ")\n", + "create_user_with_roles(\n", + " realm_name,\n", + " \"admin\",\n", + " password,\n", + " client_id,\n", + " roles_by_name,\n", + " [\"store_admin\"],\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "54317f9e-476b-4b8e-864a-a07c54b549f4", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Realm rbac_example setup completed.\n", + "Client app created with ID 1fcdfed3-9b28-421f-883d-cde6b000c26d and secret eFGTp6ZJ0tARKYPbdMKUZ1J8PJNWfXR8\n", + "Settings configured in .env\n" + ] + } + ], + "source": [ + "print(f\"Realm {realm_name} setup completed.\")\n", + "print(\n", + " f\"Client {client_name} created with ID {client_id} and secret {client_secret}\"\n", + ")\n", + "\n", + "env_file = \".env\"\n", + "with open(env_file, \"w\") as file:\n", + " pass\n", + "\n", + "# Write property P=1 to the .env file\n", + "set_key(env_file, \"OIDC_SERVER_URL\", OIDC_SERVER_URL)\n", + "set_key(env_file, \"REALM\", realm_name)\n", + "set_key(env_file, \"CLIENT_ID\", client_name)\n", + "set_key(env_file, \"CLIENT_SECRET\", client_secret)\n", + "set_key(env_file, \"PASSWORD\", password)\n", + "print(f\"Settings configured in {env_file}\")" + ] + }, + { + "cell_type": "markdown", + "id": "35dcd5ed-4004-4570-965f-0f68668605d8", + "metadata": {}, + "source": [ + "The [.env](.env) file contains the settings of the created realm, including the client secret to be used to connect the server." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "46a1e2c7-e379-461d-b0bf-82354378e830", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "OIDC_SERVER_URL='http://0.0.0.0:9999'\n", + "REALM='rbac_example'\n", + "CLIENT_ID='app'\n", + "CLIENT_SECRET='eFGTp6ZJ0tARKYPbdMKUZ1J8PJNWfXR8'\n", + "PASSWORD='password'\n" + ] + } + ], + "source": [ + "!cat .env" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d035826b-64d6-47cc-a48e-26eb29b31fc7", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/rbac-local/01.3-setup-feast.ipynb b/examples/rbac-local/01.3-setup-feast.ipynb new file mode 100644 index 0000000000..7395c28442 --- /dev/null +++ b/examples/rbac-local/01.3-setup-feast.ipynb @@ -0,0 +1,1069 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "a7b2570a-bdf1-477a-8799-0aefe81a0e28", + "metadata": {}, + "source": [ + "## Setup Feast\n", + "Create a sample `rbac` project with local storage." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "74c1ee91-1816-4338-aabf-7851b655b061", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Creating a new Feast repository in \u001b[1m\u001b[32m/Users/dmartino/projects/mlops/feast/rh-feast/examples/rbac-local/rbac\u001b[0m.\n", + "\n" + ] + } + ], + "source": [ + "!rm -rf rbac\n", + "!feast init rbac" + ] + }, + { + "cell_type": "markdown", + "id": "e3215797-198a-49af-a241-7e0117634897", + "metadata": {}, + "source": [ + "Update the `feature_store.yaml` with an `auth` section derived from the Keycloak setup file [.env](.env)" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "a09d2198-9e3a-48f6-8c9d-72d62d20cd57", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "OIDC_SERVER_URL='http://0.0.0.0:9999'\n", + "REALM='rbac_example'\n", + "CLIENT_ID='app'\n", + "CLIENT_SECRET='eFGTp6ZJ0tARKYPbdMKUZ1J8PJNWfXR8'\n", + "PASSWORD='password'\n" + ] + } + ], + "source": [ + "!cat .env" + ] + }, + { + "cell_type": "markdown", + "id": "6cd89872-a6c6-4be0-a6e3-8fd60d448b7b", + "metadata": {}, + "source": [ + "### Update the server YAML\n", + "Update the server YAML to use OIDC authorization" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "e16d5a44-ab0c-4ca8-8491-e7d9073469f8", + "metadata": {}, + "outputs": [], + "source": [ + "from dotenv import load_dotenv\n", + "import os\n", + "import yaml\n", + "\n", + "def load_config_file(path):\n", + " load_dotenv()\n", + "\n", + " with open(path, 'r') as file:\n", + " config = yaml.safe_load(file) or {}\n", + " return config" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "cd30523b-4e1c-4d56-9c72-84aacb46b29d", + "metadata": {}, + "outputs": [], + "source": [ + "def update_config_with_auth(config):\n", + " config['auth']['type']='oidc'\n", + " config['auth']['auth_server_url']=os.getenv('OIDC_SERVER_URL')\n", + " config['auth']['auth_discovery_url']=f\"{os.getenv('OIDC_SERVER_URL')}/realms/{os.getenv('REALM')}/.well-known/openid-configuration\"\n", + " config['auth']['client_id']=os.getenv('CLIENT_ID')\n", + " config['auth']['client_secret']=os.getenv('CLIENT_SECRET')\n", + " config['auth']['realm']=os.getenv('REALM')\n", + " config['auth']['username']=''\n", + " config['auth']['password']='password'" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "1631a8c8-f635-4970-8653-06c147b1c128", + "metadata": {}, + "outputs": [], + "source": [ + "def update_config_file(path):\n", + " with open(path, 'w') as file:\n", + " yaml.safe_dump(config, file, default_flow_style=False)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "78898d46-1185-4528-8f08-b137dd49246a", + "metadata": {}, + "outputs": [], + "source": [ + "config = load_config_file('rbac/feature_repo/feature_store.yaml')\n", + "update_config_with_auth(config)\n", + "update_config_file('rbac/feature_repo/feature_store.yaml')" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "e2437286-2907-4818-87ad-a2293f21311e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "auth:\n", + " auth_discovery_url: http://0.0.0.0:9999/realms/rbac_example/.well-known/openid-configuration\n", + " auth_server_url: http://0.0.0.0:9999\n", + " client_id: app\n", + " client_secret: eFGTp6ZJ0tARKYPbdMKUZ1J8PJNWfXR8\n", + " password: password\n", + " realm: rbac_example\n", + " type: oidc\n", + " username: ''\n", + "entity_key_serialization_version: 2\n", + "online_store:\n", + " path: data/online_store.db\n", + " type: sqlite\n", + "project: rbac\n", + "provider: local\n", + "registry: data/registry.db\n" + ] + } + ], + "source": [ + "!cat rbac/feature_repo/feature_store.yaml" + ] + }, + { + "cell_type": "markdown", + "id": "fa715453-8c41-4f57-8cf2-c96f6a211cde", + "metadata": {}, + "source": [ + "### Update the client YAML\n", + "Update the client YAML to use OIDC authorization" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "886a558a-1746-44fa-9e38-0e381b3b3deb", + "metadata": {}, + "outputs": [], + "source": [ + "config = load_config_file('client/feature_store.yaml')\n", + "update_config_with_auth(config)\n", + "update_config_file('client/feature_store.yaml')" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "267a72e4-443a-4b08-bd59-84d475a29e2a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "auth:\n", + " auth_discovery_url: http://0.0.0.0:9999/realms/rbac_example/.well-known/openid-configuration\n", + " auth_server_url: http://0.0.0.0:9999\n", + " client_id: app\n", + " client_secret: eFGTp6ZJ0tARKYPbdMKUZ1J8PJNWfXR8\n", + " password: password\n", + " realm: rbac_example\n", + " type: oidc\n", + " username: ''\n", + "entity_key_serialization_version: 2\n", + "offline_store:\n", + " host: localhost\n", + " port: 8815\n", + " type: remote\n", + "online_store:\n", + " path: http://localhost:6566\n", + " type: remote\n", + "project: rbac\n", + "registry:\n", + " path: localhost:6570\n", + " registry_type: remote\n" + ] + } + ], + "source": [ + "!cat client/feature_store.yaml" + ] + }, + { + "cell_type": "markdown", + "id": "f71f5189-4423-4720-bbd2-fcb9b778a26b", + "metadata": {}, + "source": [ + "### Apply the configuration" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "e0c24e05-6e38-4ff1-9c39-73818fe41f18", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/Users/dmartino/projects/mlops/feast/rh-feast/sdk/python/feast/feature_store.py:601: RuntimeWarning: On demand feature view is an experimental feature. This API is stable, but the functionality does not scale well for offline retrieval\n", + " warnings.warn(\n", + "Created entity \u001b[1m\u001b[32mdriver\u001b[0m\n", + "Created feature view \u001b[1m\u001b[32mdriver_hourly_stats\u001b[0m\n", + "Created feature view \u001b[1m\u001b[32mdriver_hourly_stats_fresh\u001b[0m\n", + "Created on demand feature view \u001b[1m\u001b[32mtransformed_conv_rate_fresh\u001b[0m\n", + "Created on demand feature view \u001b[1m\u001b[32mtransformed_conv_rate\u001b[0m\n", + "Created feature service \u001b[1m\u001b[32mdriver_activity_v2\u001b[0m\n", + "Created feature service \u001b[1m\u001b[32mdriver_activity_v1\u001b[0m\n", + "Created feature service \u001b[1m\u001b[32mdriver_activity_v3\u001b[0m\n", + "\n", + "Created sqlite table \u001b[1m\u001b[32mrbac_driver_hourly_stats_fresh\u001b[0m\n", + "Created sqlite table \u001b[1m\u001b[32mrbac_driver_hourly_stats\u001b[0m\n", + "\n" + ] + } + ], + "source": [ + "!feast -c rbac/feature_repo apply" + ] + }, + { + "cell_type": "markdown", + "id": "69b9857a-e32b-47ed-a120-57919ecb6b5d", + "metadata": {}, + "source": [ + "### Validate permissions" + ] + }, + { + "cell_type": "markdown", + "id": "867f565d-9740-4790-8d11-31001d920358", + "metadata": {}, + "source": [ + "There are no permissions after applying the example:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "004f16bf-d125-4aec-b683-3e9653815a27", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "NAME TYPES WITH_SUBCLASS NAME_PATTERN ACTIONS ROLES\n" + ] + } + ], + "source": [ + "!feast -c rbac/feature_repo permissions list" + ] + }, + { + "cell_type": "markdown", + "id": "f2276488-39ec-4ae8-bb69-08dce7ad1bd4", + "metadata": {}, + "source": [ + "The `permissions check` command identifies the resources that have no permissions matching their type, name or tags." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "9fdd2660-c0f5-4dc9-a2da-d45751dcfa01", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "08/08/2024 05:20:22 PM root WARNING: _list_feature_views will make breaking changes. Please use _list_batch_feature_views instead. _list_feature_views will behave like _list_all_feature_views in the future.\n", + "\u001b[1m\u001b[31mThe following resources are not secured by any permission configuration:\u001b[0m\n", + "NAME TYPE\n", + "driver Entity\n", + "driver_hourly_stats FeatureView\n", + "driver_hourly_stats_fresh FeatureView\n", + "transformed_conv_rate_fresh OnDemandFeatureView\n", + "transformed_conv_rate OnDemandFeatureView\n", + "driver_hourly_stats FeatureView\n", + "driver_hourly_stats_fresh FeatureView\n", + "driver_activity_v2 FeatureService\n", + "driver_activity_v1 FeatureService\n", + "driver_activity_v3 FeatureService\n", + "driver_hourly_stats_source FileSource\n", + "vals_to_add RequestSource\n", + "driver_stats_push_source PushSource\n", + "\u001b[1m\u001b[31mThe following actions are not secured by any permission configuration (Note: this might not be a security concern, depending on the used APIs):\u001b[0m\n", + "NAME TYPE UNSECURED ACTIONS\n", + "driver Entity CREATE\n", + " READ\n", + " UPDATE\n", + " DELETE\n", + " QUERY_ONLINE\n", + " QUERY_OFFLINE\n", + " WRITE_ONLINE\n", + " WRITE_OFFLINE\n", + "driver_hourly_stats FeatureView CREATE\n", + " READ\n", + " UPDATE\n", + " DELETE\n", + " QUERY_ONLINE\n", + " QUERY_OFFLINE\n", + " WRITE_ONLINE\n", + " WRITE_OFFLINE\n", + "driver_hourly_stats_fresh FeatureView CREATE\n", + " READ\n", + " UPDATE\n", + " DELETE\n", + " QUERY_ONLINE\n", + " QUERY_OFFLINE\n", + " WRITE_ONLINE\n", + " WRITE_OFFLINE\n", + "transformed_conv_rate_fresh OnDemandFeatureView CREATE\n", + " READ\n", + " UPDATE\n", + " DELETE\n", + " QUERY_ONLINE\n", + " QUERY_OFFLINE\n", + " WRITE_ONLINE\n", + " WRITE_OFFLINE\n", + "transformed_conv_rate OnDemandFeatureView CREATE\n", + " READ\n", + " UPDATE\n", + " DELETE\n", + " QUERY_ONLINE\n", + " QUERY_OFFLINE\n", + " WRITE_ONLINE\n", + " WRITE_OFFLINE\n", + "driver_hourly_stats FeatureView CREATE\n", + " READ\n", + " UPDATE\n", + " DELETE\n", + " QUERY_ONLINE\n", + " QUERY_OFFLINE\n", + " WRITE_ONLINE\n", + " WRITE_OFFLINE\n", + "driver_hourly_stats_fresh FeatureView CREATE\n", + " READ\n", + " UPDATE\n", + " DELETE\n", + " QUERY_ONLINE\n", + " QUERY_OFFLINE\n", + " WRITE_ONLINE\n", + " WRITE_OFFLINE\n", + "driver_activity_v2 FeatureService CREATE\n", + " READ\n", + " UPDATE\n", + " DELETE\n", + " QUERY_ONLINE\n", + " QUERY_OFFLINE\n", + " WRITE_ONLINE\n", + " WRITE_OFFLINE\n", + "driver_activity_v1 FeatureService CREATE\n", + " READ\n", + " UPDATE\n", + " DELETE\n", + " QUERY_ONLINE\n", + " QUERY_OFFLINE\n", + " WRITE_ONLINE\n", + " WRITE_OFFLINE\n", + "driver_activity_v3 FeatureService CREATE\n", + " READ\n", + " UPDATE\n", + " DELETE\n", + " QUERY_ONLINE\n", + " QUERY_OFFLINE\n", + " WRITE_ONLINE\n", + " WRITE_OFFLINE\n", + "driver_hourly_stats_source FileSource CREATE\n", + " READ\n", + " UPDATE\n", + " DELETE\n", + " QUERY_ONLINE\n", + " QUERY_OFFLINE\n", + " WRITE_ONLINE\n", + " WRITE_OFFLINE\n", + "vals_to_add RequestSource CREATE\n", + " READ\n", + " UPDATE\n", + " DELETE\n", + " QUERY_ONLINE\n", + " QUERY_OFFLINE\n", + " WRITE_ONLINE\n", + " WRITE_OFFLINE\n", + "driver_stats_push_source PushSource CREATE\n", + " READ\n", + " UPDATE\n", + " DELETE\n", + " QUERY_ONLINE\n", + " QUERY_OFFLINE\n", + " WRITE_ONLINE\n", + " WRITE_OFFLINE\n" + ] + } + ], + "source": [ + "!feast -c rbac/feature_repo permissions check" + ] + }, + { + "cell_type": "markdown", + "id": "eb65649d-7ba7-494f-9e01-772842304ca1", + "metadata": {}, + "source": [ + "### Applying permissions\n", + "Let's create some Permissions to cover basic scenarios.\n", + "\n", + "First a simple permission to read the status of all the objects." + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "3e910c5d-2f27-4f19-b324-c00347133da7", + "metadata": {}, + "outputs": [], + "source": [ + "from feast import FeatureStore\n", + "from feast.feast_object import ALL_RESOURCE_TYPES\n", + "from feast.permissions.action import CRUD, QUERY, AuthzedAction, ALL_ACTIONS\n", + "from feast.permissions.permission import Permission\n", + "from feast.permissions.policy import RoleBasedPolicy" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "9e85bb35-cf12-4860-90d6-d1cd4830049c", + "metadata": {}, + "outputs": [], + "source": [ + "store = FeatureStore(\"rbac/feature_repo\")" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "87cc7c4f-48af-4158-adee-b1ccd8a72ea7", + "metadata": {}, + "outputs": [], + "source": [ + "read_permission = Permission(\n", + " name=\"read_permission\",\n", + " types=ALL_RESOURCE_TYPES,\n", + " policy=RoleBasedPolicy(roles=[\"reader\"]),\n", + " actions=AuthzedAction.READ\n", + ")\n", + "store.registry.apply_permission(read_permission, store.project)" + ] + }, + { + "cell_type": "markdown", + "id": "e1dcb0d3-21e3-44b7-9ad5-c6b2b1e45b33", + "metadata": {}, + "source": [ + "Now a specific permission to write online data (e.g. `materialize`) the `FeatureView`s whose name ends by `fresh`" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "1c2fecdd-056e-4462-b1ad-eec123e282dd", + "metadata": {}, + "outputs": [], + "source": [ + "from feast.feature_view import FeatureView\n", + "write_fresh_permission = Permission(\n", + " name=\"write_fresh_permission\",\n", + " types=FeatureView,\n", + " name_pattern=\".*_fresh\",\n", + " policy=RoleBasedPolicy(roles=[\"fresh_writer\"]),\n", + " actions=AuthzedAction.WRITE_ONLINE\n", + ")\n", + "store.registry.apply_permission(write_fresh_permission, store.project)" + ] + }, + { + "cell_type": "markdown", + "id": "71edd0ea-67b5-4845-b8ae-602ed3883bb7", + "metadata": {}, + "source": [ + "Another one to match allow access to OFFLINE functions." + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "c74e677c-3959-4963-b683-a5289c8238c9", + "metadata": {}, + "outputs": [], + "source": [ + "from feast.feature_view import FeatureView\n", + "from feast.feature_service import FeatureService\n", + "from feast.on_demand_feature_view import OnDemandFeatureView\n", + "offline_permission = Permission(\n", + " name=\"offline_permission\",\n", + " types=[FeatureView, OnDemandFeatureView, FeatureService],\n", + " policy=RoleBasedPolicy(roles=[\"batch_admin\"]),\n", + " actions= CRUD + [AuthzedAction.WRITE_OFFLINE, AuthzedAction.QUERY_OFFLINE]\n", + ")\n", + "store.registry.apply_permission(offline_permission, store.project)" + ] + }, + { + "cell_type": "markdown", + "id": "3edc08f5-40e1-488a-b749-9b1f5fc31061", + "metadata": {}, + "source": [ + "Finally, ad `admin` permission to manage all the resources" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "739a26ee-e08e-461a-9f75-59158328fc90", + "metadata": {}, + "outputs": [], + "source": [ + "admin_permission = Permission(\n", + " name=\"admin_permission\",\n", + " types=ALL_RESOURCE_TYPES,\n", + " policy=RoleBasedPolicy(roles=[\"store_admin\"]),\n", + " actions=ALL_ACTIONS\n", + ")\n", + "store.registry.apply_permission(admin_permission, store.project)" + ] + }, + { + "cell_type": "markdown", + "id": "916c9399-866e-4796-9858-a890ceb29e48", + "metadata": {}, + "source": [ + "## Validate registered permissions" + ] + }, + { + "cell_type": "markdown", + "id": "aed869b3-c567-428f-8a69-9c322b62f7c6", + "metadata": {}, + "source": [ + "List all the permissions." + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "cd284369-1cef-4cf6-859f-ea79d1450ed2", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "NAME TYPES WITH_SUBCLASS NAME_PATTERN ACTIONS ROLES\n", + "read_permission FeatureView True READ reader\n", + " OnDemandFeatureView\n", + " BatchFeatureView\n", + " StreamFeatureView\n", + " Entity\n", + " FeatureService\n", + " DataSource\n", + " ValidationReference\n", + " SavedDataset\n", + " Permission\n", + "write_fresh_permission FeatureView True .*_fresh WRITE_ONLINE fresh_writer\n", + "offline_permission FeatureView True CREATE batch_admin\n", + " OnDemandFeatureView READ\n", + " FeatureService UPDATE\n", + " DELETE\n", + " WRITE_OFFLINE\n", + " QUERY_OFFLINE\n", + "admin_permission FeatureView True CREATE store_admin\n", + " OnDemandFeatureView READ\n", + " BatchFeatureView UPDATE\n", + " StreamFeatureView DELETE\n", + " Entity QUERY_ONLINE\n", + " FeatureService QUERY_OFFLINE\n", + " DataSource WRITE_ONLINE\n", + " ValidationReference WRITE_OFFLINE\n", + " SavedDataset\n", + " Permission\n" + ] + } + ], + "source": [ + "!feast -c rbac/feature_repo permissions list" + ] + }, + { + "cell_type": "markdown", + "id": "be3873ee-2514-4aec-8fe8-8b54a3602651", + "metadata": {}, + "source": [ + "List all the resources matching each configured permission." + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "419df226-36df-4d19-be0d-ba82813fef80", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "08/09/2024 10:10:26 AM root WARNING: _list_feature_views will make breaking changes. Please use _list_batch_feature_views instead. _list_feature_views will behave like _list_all_feature_views in the future.\n", + "08/09/2024 10:10:26 AM root WARNING: _list_feature_views will make breaking changes. Please use _list_batch_feature_views instead. _list_feature_views will behave like _list_all_feature_views in the future.\n", + "08/09/2024 10:10:26 AM root WARNING: _list_feature_views will make breaking changes. Please use _list_batch_feature_views instead. _list_feature_views will behave like _list_all_feature_views in the future.\n", + "08/09/2024 10:10:26 AM root WARNING: _list_feature_views will make breaking changes. Please use _list_batch_feature_views instead. _list_feature_views will behave like _list_all_feature_views in the future.\n", + "\n", + "\u001b[1m\u001b[32mThe structure of the \u001b[1m\u001b[37mfeast-permissions list --verbose \u001b[1m\u001b[32mcommand will be as in the following example:\n", + "\n", + "\u001b[2mFor example: \u001b[0m\u001b[1m\u001b[32m\n", + "\n", + "permissions\n", + "├── permission_1 ['role names list']\n", + "│ ├── FeatureView: ['feature view names']\n", + "│ ├── FeatureService: none\n", + "│ └── ..\n", + "├── permission_2 ['role names list']\n", + "└── ..\n", + "\n", + "-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\u001b[0m\n", + " \n", + "Permissions:\n", + "\n", + "permissions\n", + "├── read_permission ['reader']\n", + "│ ├── FeatureView ['driver_hourly_stats_fresh', 'transformed_conv_rate', 'transformed_conv_rate_fresh', 'driver_hourly_stats']\n", + "│ ├── OnDemandFeatureView ['transformed_conv_rate_fresh', 'transformed_conv_rate']\n", + "│ ├── BatchFeatureView ['driver_hourly_stats_fresh', 'driver_hourly_stats']\n", + "│ ├── StreamFeatureView: none\n", + "│ ├── Entity: ['driver']\n", + "│ ├── FeatureService: ['driver_activity_v2', 'driver_activity_v3', 'driver_activity_v1']\n", + "│ ├── DataSource: ['driver_stats_push_source', 'driver_hourly_stats_source', 'vals_to_add']\n", + "│ ├── ValidationReference: none\n", + "│ └── SavedDataset: none\n", + "├── write_fresh_permission ['fresh_writer']\n", + "│ └── FeatureView ['driver_hourly_stats_fresh']\n", + "├── offline_permission ['batch_admin']\n", + "│ ├── FeatureView ['driver_hourly_stats_fresh', 'transformed_conv_rate', 'transformed_conv_rate_fresh', 'driver_hourly_stats']\n", + "│ ├── OnDemandFeatureView ['transformed_conv_rate_fresh', 'transformed_conv_rate']\n", + "│ └── FeatureService: ['driver_activity_v2', 'driver_activity_v3', 'driver_activity_v1']\n", + "└── admin_permission ['store_admin']\n", + " ├── FeatureView ['driver_hourly_stats_fresh', 'transformed_conv_rate', 'transformed_conv_rate_fresh', 'driver_hourly_stats']\n", + " ├── OnDemandFeatureView ['transformed_conv_rate_fresh', 'transformed_conv_rate']\n", + " ├── BatchFeatureView ['driver_hourly_stats_fresh', 'driver_hourly_stats']\n", + " ├── StreamFeatureView: none\n", + " ├── Entity: ['driver']\n", + " ├── FeatureService: ['driver_activity_v2', 'driver_activity_v3', 'driver_activity_v1']\n", + " ├── DataSource: ['driver_stats_push_source', 'driver_hourly_stats_source', 'vals_to_add']\n", + " ├── ValidationReference: none\n", + " └── SavedDataset: none\n" + ] + } + ], + "source": [ + "!feast -c rbac/feature_repo permissions list -v" + ] + }, + { + "cell_type": "markdown", + "id": "90319f10-abce-4a18-9891-7428c8781187", + "metadata": {}, + "source": [ + "Describe one of the permissions." + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "cec436ce-5d1c-455e-a6d7-80f84380e83a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "name: admin_permission\n", + "types:\n", + "- FEATURE_VIEW\n", + "- ON_DEMAND_FEATURE_VIEW\n", + "- BATCH_FEATURE_VIEW\n", + "- STREAM_FEATURE_VIEW\n", + "- ENTITY\n", + "- FEATURE_SERVICE\n", + "- DATA_SOURCE\n", + "- VALIDATION_REFERENCE\n", + "- SAVED_DATASET\n", + "- PERMISSION\n", + "withSubclasses: true\n", + "namePattern: ''\n", + "actions:\n", + "- CREATE\n", + "- READ\n", + "- UPDATE\n", + "- DELETE\n", + "- QUERY_ONLINE\n", + "- QUERY_OFFLINE\n", + "- WRITE_ONLINE\n", + "- WRITE_OFFLINE\n", + "policy:\n", + " roleBasedPolicy:\n", + " roles:\n", + " - store_admin\n", + "\n" + ] + } + ], + "source": [ + "!feast -c rbac/feature_repo permissions describe admin_permission" + ] + }, + { + "cell_type": "markdown", + "id": "a267a3bb-9861-43eb-9f7b-33f5d5a23e81", + "metadata": {}, + "source": [ + "List the roles specified by these permissions." + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "b6a3f4a6-e3ab-4aaa-9a15-69ea63246b45", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ROLE NAME\n", + "batch_admin\n", + "fresh_writer\n", + "reader\n", + "store_admin\n" + ] + } + ], + "source": [ + "!feast -c rbac/feature_repo permissions list-roles" + ] + }, + { + "cell_type": "markdown", + "id": "0dbb31d3-edc9-4146-a46c-146d7f59532a", + "metadata": {}, + "source": [ + "For each configured role, list all the resources and operations that are allowed to a user impersonating this role." + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "45832f21-43c6-4784-ba88-1e65fa8479b5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "08/08/2024 06:05:28 PM root WARNING: _list_feature_views will make breaking changes. Please use _list_batch_feature_views instead. _list_feature_views will behave like _list_all_feature_views in the future.\n", + "ROLE NAME RESOURCE NAME RESOURCE TYPE PERMITTED ACTIONS\n", + "batch_admin driver Entity -\n", + "batch_admin driver_hourly_stats FeatureView CREATE\n", + " READ\n", + " UPDATE\n", + " DELETE\n", + " QUERY_OFFLINE\n", + " WRITE_OFFLINE\n", + "batch_admin driver_hourly_stats_fresh FeatureView CREATE\n", + " READ\n", + " UPDATE\n", + " DELETE\n", + " QUERY_OFFLINE\n", + " WRITE_OFFLINE\n", + "batch_admin transformed_conv_rate_fresh OnDemandFeatureView -\n", + "batch_admin transformed_conv_rate OnDemandFeatureView -\n", + "batch_admin driver_hourly_stats FeatureView CREATE\n", + " READ\n", + " UPDATE\n", + " DELETE\n", + " QUERY_OFFLINE\n", + " WRITE_OFFLINE\n", + "batch_admin driver_hourly_stats_fresh FeatureView CREATE\n", + " READ\n", + " UPDATE\n", + " DELETE\n", + " QUERY_OFFLINE\n", + " WRITE_OFFLINE\n", + "batch_admin driver_activity_v2 FeatureService CREATE\n", + " READ\n", + " UPDATE\n", + " DELETE\n", + " QUERY_OFFLINE\n", + " WRITE_OFFLINE\n", + "batch_admin driver_activity_v1 FeatureService CREATE\n", + " READ\n", + " UPDATE\n", + " DELETE\n", + " QUERY_OFFLINE\n", + " WRITE_OFFLINE\n", + "batch_admin driver_activity_v3 FeatureService CREATE\n", + " READ\n", + " UPDATE\n", + " DELETE\n", + " QUERY_OFFLINE\n", + " WRITE_OFFLINE\n", + "batch_admin driver_hourly_stats_source FileSource -\n", + "batch_admin vals_to_add RequestSource -\n", + "batch_admin driver_stats_push_source PushSource -\n", + "batch_admin read_permission Permission -\n", + "batch_admin write_fresh_permission Permission -\n", + "batch_admin offline_permission Permission -\n", + "batch_admin admin_permission Permission -\n", + "fresh_writer driver Entity -\n", + "fresh_writer driver_hourly_stats FeatureView -\n", + "fresh_writer driver_hourly_stats_fresh FeatureView WRITE_ONLINE\n", + "fresh_writer transformed_conv_rate_fresh OnDemandFeatureView -\n", + "fresh_writer transformed_conv_rate OnDemandFeatureView -\n", + "fresh_writer driver_hourly_stats FeatureView -\n", + "fresh_writer driver_hourly_stats_fresh FeatureView WRITE_ONLINE\n", + "fresh_writer driver_activity_v2 FeatureService -\n", + "fresh_writer driver_activity_v1 FeatureService -\n", + "fresh_writer driver_activity_v3 FeatureService -\n", + "fresh_writer driver_hourly_stats_source FileSource -\n", + "fresh_writer vals_to_add RequestSource -\n", + "fresh_writer driver_stats_push_source PushSource -\n", + "fresh_writer read_permission Permission -\n", + "fresh_writer write_fresh_permission Permission -\n", + "fresh_writer offline_permission Permission -\n", + "fresh_writer admin_permission Permission -\n", + "reader driver Entity READ\n", + "reader driver_hourly_stats FeatureView READ\n", + "reader driver_hourly_stats_fresh FeatureView READ\n", + "reader transformed_conv_rate_fresh OnDemandFeatureView READ\n", + "reader transformed_conv_rate OnDemandFeatureView READ\n", + "reader driver_hourly_stats FeatureView READ\n", + "reader driver_hourly_stats_fresh FeatureView READ\n", + "reader driver_activity_v2 FeatureService READ\n", + "reader driver_activity_v1 FeatureService READ\n", + "reader driver_activity_v3 FeatureService READ\n", + "reader driver_hourly_stats_source FileSource READ\n", + "reader vals_to_add RequestSource READ\n", + "reader driver_stats_push_source PushSource READ\n", + "reader read_permission Permission READ\n", + "reader write_fresh_permission Permission READ\n", + "reader offline_permission Permission READ\n", + "reader admin_permission Permission READ\n", + "store_admin driver Entity CREATE\n", + " READ\n", + " UPDATE\n", + " DELETE\n", + " QUERY_ONLINE\n", + " QUERY_OFFLINE\n", + " WRITE_ONLINE\n", + " WRITE_OFFLINE\n", + "store_admin driver_hourly_stats FeatureView CREATE\n", + " READ\n", + " UPDATE\n", + " DELETE\n", + " QUERY_ONLINE\n", + " QUERY_OFFLINE\n", + " WRITE_ONLINE\n", + " WRITE_OFFLINE\n", + "store_admin driver_hourly_stats_fresh FeatureView CREATE\n", + " READ\n", + " UPDATE\n", + " DELETE\n", + " QUERY_ONLINE\n", + " QUERY_OFFLINE\n", + " WRITE_ONLINE\n", + " WRITE_OFFLINE\n", + "store_admin transformed_conv_rate_fresh OnDemandFeatureView CREATE\n", + " READ\n", + " UPDATE\n", + " DELETE\n", + " QUERY_ONLINE\n", + " QUERY_OFFLINE\n", + " WRITE_ONLINE\n", + " WRITE_OFFLINE\n", + "store_admin transformed_conv_rate OnDemandFeatureView CREATE\n", + " READ\n", + " UPDATE\n", + " DELETE\n", + " QUERY_ONLINE\n", + " QUERY_OFFLINE\n", + " WRITE_ONLINE\n", + " WRITE_OFFLINE\n", + "store_admin driver_hourly_stats FeatureView CREATE\n", + " READ\n", + " UPDATE\n", + " DELETE\n", + " QUERY_ONLINE\n", + " QUERY_OFFLINE\n", + " WRITE_ONLINE\n", + " WRITE_OFFLINE\n", + "store_admin driver_hourly_stats_fresh FeatureView CREATE\n", + " READ\n", + " UPDATE\n", + " DELETE\n", + " QUERY_ONLINE\n", + " QUERY_OFFLINE\n", + " WRITE_ONLINE\n", + " WRITE_OFFLINE\n", + "store_admin driver_activity_v2 FeatureService CREATE\n", + " READ\n", + " UPDATE\n", + " DELETE\n", + " QUERY_ONLINE\n", + " QUERY_OFFLINE\n", + " WRITE_ONLINE\n", + " WRITE_OFFLINE\n", + "store_admin driver_activity_v1 FeatureService CREATE\n", + " READ\n", + " UPDATE\n", + " DELETE\n", + " QUERY_ONLINE\n", + " QUERY_OFFLINE\n", + " WRITE_ONLINE\n", + " WRITE_OFFLINE\n", + "store_admin driver_activity_v3 FeatureService CREATE\n", + " READ\n", + " UPDATE\n", + " DELETE\n", + " QUERY_ONLINE\n", + " QUERY_OFFLINE\n", + " WRITE_ONLINE\n", + " WRITE_OFFLINE\n", + "store_admin driver_hourly_stats_source FileSource CREATE\n", + " READ\n", + " UPDATE\n", + " DELETE\n", + " QUERY_ONLINE\n", + " QUERY_OFFLINE\n", + " WRITE_ONLINE\n", + " WRITE_OFFLINE\n", + "store_admin vals_to_add RequestSource CREATE\n", + " READ\n", + " UPDATE\n", + " DELETE\n", + " QUERY_ONLINE\n", + " QUERY_OFFLINE\n", + " WRITE_ONLINE\n", + " WRITE_OFFLINE\n", + "store_admin driver_stats_push_source PushSource CREATE\n", + " READ\n", + " UPDATE\n", + " DELETE\n", + " QUERY_ONLINE\n", + " QUERY_OFFLINE\n", + " WRITE_ONLINE\n", + " WRITE_OFFLINE\n", + "store_admin read_permission Permission CREATE\n", + " READ\n", + " UPDATE\n", + " DELETE\n", + " QUERY_ONLINE\n", + " QUERY_OFFLINE\n", + " WRITE_ONLINE\n", + " WRITE_OFFLINE\n", + "store_admin write_fresh_permission Permission CREATE\n", + " READ\n", + " UPDATE\n", + " DELETE\n", + " QUERY_ONLINE\n", + " QUERY_OFFLINE\n", + " WRITE_ONLINE\n", + " WRITE_OFFLINE\n", + "store_admin offline_permission Permission CREATE\n", + " READ\n", + " UPDATE\n", + " DELETE\n", + " QUERY_ONLINE\n", + " QUERY_OFFLINE\n", + " WRITE_ONLINE\n", + " WRITE_OFFLINE\n", + "store_admin admin_permission Permission CREATE\n", + " READ\n", + " UPDATE\n", + " DELETE\n", + " QUERY_ONLINE\n", + " QUERY_OFFLINE\n", + " WRITE_ONLINE\n", + " WRITE_OFFLINE\n" + ] + } + ], + "source": [ + "!feast -c rbac/feature_repo permissions list-roles -v" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c7960d2c-e43f-46b4-8cb3-5c6fc9dbaba8", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/rbac-local/02-registry_server.ipynb b/examples/rbac-local/02-registry_server.ipynb new file mode 100644 index 0000000000..8af27c19b9 --- /dev/null +++ b/examples/rbac-local/02-registry_server.ipynb @@ -0,0 +1,370 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "70df4877-177b-441a-a745-f0cd091e0a3a", + "metadata": {}, + "source": [ + "## Registry server" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "ef9f796d-f9d7-47d0-96c2-03b38a219d83", + "metadata": {}, + "outputs": [], + "source": [ + "!lsof -i :6570\n", + "# !kill -9 64859 98087" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "bd303508-9f32-4bdb-87c2-729e3ab62b4f", + "metadata": {}, + "outputs": [], + "source": [ + "from feast import FeatureStore\n", + "store = FeatureStore(repo_path=\"rbac/feature_repo\")" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "29127952-f9d5-44c4-b7c3-437e0b55c4b0", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Fetching user for token: 1519\n", + "User is: reader (['reader'])\n", + "Fetching user for token: 1519\n", + "User is: reader (['reader'])\n", + "Fetching user for token: 1519\n", + "User is: reader (['reader'])\n", + "Fetching user for token: 1519\n", + "User is: reader (['reader'])\n", + "Fetching user for token: 1519\n", + "User is: reader (['reader'])\n", + "Fetching user for token: 1519\n", + "User is: reader (['reader'])\n", + "Fetching user for token: 1519\n", + "User is: reader (['reader'])\n", + "Fetching user for token: 1519\n", + "User is: reader (['reader'])\n", + "Fetching user for token: 1519\n", + "User is: reader (['reader'])\n", + "Fetching user for token: 1519\n", + "User is: reader (['reader'])\n", + "Fetching user for token: 1519\n", + "User is: reader (['reader'])\n", + "Fetching user for token: 1519\n", + "User is: reader (['reader'])\n", + "Fetching user for token: 1519\n", + "User is: reader (['reader'])\n", + "Fetching user for token: 1519\n", + "User is: reader (['reader'])\n", + "Fetching user for token: 1519\n", + "User is: reader (['reader'])\n", + "Fetching user for token: 1519\n", + "User is: reader (['reader'])\n", + "Fetching user for token: 1519\n", + "User is: reader (['reader'])\n", + "Fetching user for token: 1519\n", + "User is: reader (['reader'])\n", + "Fetching user for token: 1519\n", + "User is: reader (['reader'])\n", + "Fetching user for token: 1519\n", + "User is: reader (['reader'])\n", + "Fetching user for token: 1519\n", + "User is: reader (['reader'])\n", + "Fetching user for token: 1527\n", + "User is: writer (['fresh_writer'])\n", + "Fetching user for token: 1527\n", + "User is: writer (['fresh_writer'])\n", + "Fetching user for token: 1527\n", + "User is: writer (['fresh_writer'])\n", + "Fetching user for token: 1527\n", + "User is: writer (['fresh_writer'])\n", + "Fetching user for token: 1527\n", + "User is: writer (['fresh_writer'])\n", + "Fetching user for token: 1527\n", + "User is: writer (['fresh_writer'])\n", + "Fetching user for token: 1527\n", + "User is: writer (['fresh_writer'])\n", + "Fetching user for token: 1527\n", + "User is: writer (['fresh_writer'])\n", + "Fetching user for token: 1527\n", + "User is: writer (['fresh_writer'])\n", + "Fetching user for token: 1527\n", + "User is: writer (['fresh_writer'])\n", + "Fetching user for token: 1527\n", + "User is: writer (['fresh_writer'])\n", + "Fetching user for token: 1527\n", + "User is: writer (['fresh_writer'])\n", + "Fetching user for token: 1527\n", + "User is: writer (['fresh_writer'])\n", + "Fetching user for token: 1527\n", + "User is: writer (['fresh_writer'])\n", + "Fetching user for token: 1527\n", + "User is: writer (['fresh_writer'])\n", + "Fetching user for token: 1527\n", + "User is: writer (['fresh_writer'])\n", + "Fetching user for token: 1527\n", + "User is: writer (['fresh_writer'])\n", + "Fetching user for token: 1527\n", + "User is: writer (['fresh_writer'])\n", + "Fetching user for token: 1527\n", + "User is: writer (['fresh_writer'])\n", + "Fetching user for token: 1527\n", + "User is: writer (['fresh_writer'])\n", + "Fetching user for token: 1527\n", + "User is: writer (['fresh_writer'])\n", + "Fetching user for token: 1527\n", + "User is: writer (['fresh_writer'])\n", + "Fetching user for token: 1527\n", + "User is: writer (['fresh_writer'])\n", + "Fetching user for token: 1527\n", + "User is: writer (['fresh_writer'])\n", + "Fetching user for token: 1527\n", + "User is: writer (['fresh_writer'])\n", + "Fetching user for token: 1527\n", + "User is: writer (['fresh_writer'])\n", + "Fetching user for token: 1527\n", + "User is: writer (['fresh_writer'])\n", + "Fetching user for token: 1527\n", + "User is: writer (['fresh_writer'])\n", + "Fetching user for token: 1527\n", + "User is: writer (['fresh_writer'])\n", + "Fetching user for token: 1553\n", + "User is: batch_admin (['batch_admin'])\n", + "Fetching user for token: 1553\n", + "User is: batch_admin (['batch_admin'])\n", + "Fetching user for token: 1553\n", + "User is: batch_admin (['batch_admin'])\n", + "Fetching user for token: 1553\n", + "User is: batch_admin (['batch_admin'])\n", + "Fetching user for token: 1553\n", + "User is: batch_admin (['batch_admin'])\n", + "Fetching user for token: 1553\n", + "User is: batch_admin (['batch_admin'])\n", + "Fetching user for token: 1553\n", + "User is: batch_admin (['batch_admin'])\n", + "Fetching user for token: 1553\n", + "User is: batch_admin (['batch_admin'])\n", + "Fetching user for token: 1553\n", + "User is: batch_admin (['batch_admin'])\n", + "Fetching user for token: 1553\n", + "User is: batch_admin (['batch_admin'])\n", + "Fetching user for token: 1553\n", + "User is: batch_admin (['batch_admin'])\n", + "Fetching user for token: 1553\n", + "User is: batch_admin (['batch_admin'])\n", + "Fetching user for token: 1553\n", + "User is: batch_admin (['batch_admin'])\n", + "Fetching user for token: 1553\n", + "User is: batch_admin (['batch_admin'])\n", + "Fetching user for token: 1553\n", + "User is: batch_admin (['batch_admin'])\n", + "Fetching user for token: 1553\n", + "User is: batch_admin (['batch_admin'])\n", + "Fetching user for token: 1553\n", + "User is: batch_admin (['batch_admin'])\n", + "Fetching user for token: 1553\n", + "User is: batch_admin (['batch_admin'])\n", + "Fetching user for token: 1553\n", + "User is: batch_admin (['batch_admin'])\n", + "Fetching user for token: 1553\n", + "User is: batch_admin (['batch_admin'])\n", + "Fetching user for token: 1553\n", + "User is: batch_admin (['batch_admin'])\n", + "Fetching user for token: 1553\n", + "User is: batch_admin (['batch_admin'])\n", + "Fetching user for token: 1553\n", + "User is: batch_admin (['batch_admin'])\n", + "Fetching user for token: 1553\n", + "User is: batch_admin (['batch_admin'])\n", + "Fetching user for token: 1553\n", + "User is: batch_admin (['batch_admin'])\n", + "Fetching user for token: 1553\n", + "User is: batch_admin (['batch_admin'])\n", + "Fetching user for token: 1553\n", + "User is: batch_admin (['batch_admin'])\n", + "Fetching user for token: 1553\n", + "User is: batch_admin (['batch_admin'])\n", + "Fetching user for token: 1553\n", + "User is: batch_admin (['batch_admin'])\n", + "Fetching user for token: 1553\n", + "User is: batch_admin (['batch_admin'])\n", + "Fetching user for token: 1553\n", + "User is: batch_admin (['batch_admin'])\n", + "Fetching user for token: 1553\n", + "User is: batch_admin (['batch_admin'])\n", + "Fetching user for token: 1553\n", + "User is: batch_admin (['batch_admin'])\n", + "Fetching user for token: 1553\n", + "User is: batch_admin (['batch_admin'])\n", + "Fetching user for token: 1553\n", + "User is: batch_admin (['batch_admin'])\n", + "Fetching user for token: 1553\n", + "User is: batch_admin (['batch_admin'])\n", + "Fetching user for token: 1553\n", + "User is: batch_admin (['batch_admin'])\n", + "Fetching user for token: 1553\n", + "User is: batch_admin (['batch_admin'])\n", + "Fetching user for token: 1553\n", + "User is: batch_admin (['batch_admin'])\n", + "Fetching user for token: 1553\n", + "User is: batch_admin (['batch_admin'])\n", + "Fetching user for token: 1553\n", + "User is: batch_admin (['batch_admin'])\n", + "Fetching user for token: 1553\n", + "User is: batch_admin (['batch_admin'])\n", + "Fetching user for token: 1553\n", + "User is: batch_admin (['batch_admin'])\n", + "Fetching user for token: 1553\n", + "User is: batch_admin (['batch_admin'])\n", + "Fetching user for token: 1521\n", + "User is: admin (['store_admin'])\n", + "Fetching user for token: 1521\n", + "User is: admin (['store_admin'])\n", + "Fetching user for token: 1521\n", + "User is: admin (['store_admin'])\n", + "Fetching user for token: 1521\n", + "User is: admin (['store_admin'])\n", + "Fetching user for token: 1521\n", + "User is: admin (['store_admin'])\n", + "Fetching user for token: 1521\n", + "User is: admin (['store_admin'])\n", + "Fetching user for token: 1521\n", + "User is: admin (['store_admin'])\n", + "Fetching user for token: 1521\n", + "User is: admin (['store_admin'])\n", + "Fetching user for token: 1521\n", + "User is: admin (['store_admin'])\n", + "Fetching user for token: 1521\n", + "User is: admin (['store_admin'])\n", + "Fetching user for token: 1521\n", + "User is: admin (['store_admin'])\n", + "Fetching user for token: 1521\n", + "User is: admin (['store_admin'])\n", + "Fetching user for token: 1521\n", + "User is: admin (['store_admin'])\n", + "Fetching user for token: 1521\n", + "User is: admin (['store_admin'])\n", + "Fetching user for token: 1521\n", + "User is: admin (['store_admin'])\n", + "Fetching user for token: 1521\n", + "User is: admin (['store_admin'])\n", + "Fetching user for token: 1521\n", + "User is: admin (['store_admin'])\n", + "Fetching user for token: 1521\n", + "User is: admin (['store_admin'])\n", + "Fetching user for token: 1521\n", + "User is: admin (['store_admin'])\n", + "Fetching user for token: 1521\n", + "User is: admin (['store_admin'])\n", + "Fetching user for token: 1521\n", + "User is: admin (['store_admin'])\n", + "Fetching user for token: 1521\n", + "User is: admin (['store_admin'])\n", + "Fetching user for token: 1521\n", + "User is: admin (['store_admin'])\n", + "Fetching user for token: 1521\n", + "User is: admin (['store_admin'])\n", + "Fetching user for token: 1521\n", + "User is: admin (['store_admin'])\n", + "Fetching user for token: 1521\n", + "User is: admin (['store_admin'])\n", + "Fetching user for token: 1521\n", + "User is: admin (['store_admin'])\n", + "Fetching user for token: 1521\n", + "User is: admin (['store_admin'])\n", + "Fetching user for token: 1521\n", + "User is: admin (['store_admin'])\n", + "Fetching user for token: 1521\n", + "User is: admin (['store_admin'])\n", + "Fetching user for token: 1521\n", + "User is: admin (['store_admin'])\n", + "Fetching user for token: 1521\n", + "User is: admin (['store_admin'])\n", + "Fetching user for token: 1521\n", + "User is: admin (['store_admin'])\n", + "Fetching user for token: 1521\n", + "User is: admin (['store_admin'])\n", + "Fetching user for token: 1521\n", + "User is: admin (['store_admin'])\n", + "Fetching user for token: 1521\n", + "User is: admin (['store_admin'])\n", + "Fetching user for token: 1521\n", + "User is: admin (['store_admin'])\n", + "Fetching user for token: 1521\n", + "User is: admin (['store_admin'])\n", + "Fetching user for token: 1521\n", + "User is: admin (['store_admin'])\n", + "Fetching user for token: 1521\n", + "User is: admin (['store_admin'])\n", + "Fetching user for token: 1521\n", + "User is: admin (['store_admin'])\n", + "Fetching user for token: 1521\n", + "User is: admin (['store_admin'])\n" + ] + }, + { + "ename": "KeyboardInterrupt", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[3], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mstore\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mserve_registry\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m6570\u001b[39;49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/projects/mlops/feast/rh-feast/sdk/python/feast/feature_store.py:1822\u001b[0m, in \u001b[0;36mFeatureStore.serve_registry\u001b[0;34m(self, port)\u001b[0m\n\u001b[1;32m 1819\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"Start registry server locally on a given port.\"\"\"\u001b[39;00m\n\u001b[1;32m 1820\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mfeast\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m registry_server\n\u001b[0;32m-> 1822\u001b[0m \u001b[43mregistry_server\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mstart_server\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mport\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/projects/mlops/feast/rh-feast/sdk/python/feast/registry_server.py:613\u001b[0m, in \u001b[0;36mstart_server\u001b[0;34m(store, port, wait_for_termination)\u001b[0m\n\u001b[1;32m 611\u001b[0m server\u001b[38;5;241m.\u001b[39mstart()\n\u001b[1;32m 612\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m wait_for_termination:\n\u001b[0;32m--> 613\u001b[0m \u001b[43mserver\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mwait_for_termination\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 614\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 615\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m server\n", + "File \u001b[0;32m~/miniconda3/envs/feast3.11/lib/python3.11/site-packages/grpc/_server.py:1485\u001b[0m, in \u001b[0;36m_Server.wait_for_termination\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m 1481\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mwait_for_termination\u001b[39m(\u001b[38;5;28mself\u001b[39m, timeout: Optional[\u001b[38;5;28mfloat\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m \u001b[38;5;28mbool\u001b[39m:\n\u001b[1;32m 1482\u001b[0m \u001b[38;5;66;03m# NOTE(https://bugs.python.org/issue35935)\u001b[39;00m\n\u001b[1;32m 1483\u001b[0m \u001b[38;5;66;03m# Remove this workaround once threading.Event.wait() is working with\u001b[39;00m\n\u001b[1;32m 1484\u001b[0m \u001b[38;5;66;03m# CTRL+C across platforms.\u001b[39;00m\n\u001b[0;32m-> 1485\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43m_common\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mwait\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 1486\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_state\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtermination_event\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mwait\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1487\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_state\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtermination_event\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mis_set\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1488\u001b[0m \u001b[43m \u001b[49m\u001b[43mtimeout\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtimeout\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1489\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/miniconda3/envs/feast3.11/lib/python3.11/site-packages/grpc/_common.py:156\u001b[0m, in \u001b[0;36mwait\u001b[0;34m(wait_fn, wait_complete_fn, timeout, spin_cb)\u001b[0m\n\u001b[1;32m 154\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m timeout \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 155\u001b[0m \u001b[38;5;28;01mwhile\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m wait_complete_fn():\n\u001b[0;32m--> 156\u001b[0m \u001b[43m_wait_once\u001b[49m\u001b[43m(\u001b[49m\u001b[43mwait_fn\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mMAXIMUM_WAIT_TIMEOUT\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mspin_cb\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 157\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 158\u001b[0m end \u001b[38;5;241m=\u001b[39m time\u001b[38;5;241m.\u001b[39mtime() \u001b[38;5;241m+\u001b[39m timeout\n", + "File \u001b[0;32m~/miniconda3/envs/feast3.11/lib/python3.11/site-packages/grpc/_common.py:116\u001b[0m, in \u001b[0;36m_wait_once\u001b[0;34m(wait_fn, timeout, spin_cb)\u001b[0m\n\u001b[1;32m 111\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_wait_once\u001b[39m(\n\u001b[1;32m 112\u001b[0m wait_fn: Callable[\u001b[38;5;241m.\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;241m.\u001b[39m, \u001b[38;5;28mbool\u001b[39m],\n\u001b[1;32m 113\u001b[0m timeout: \u001b[38;5;28mfloat\u001b[39m,\n\u001b[1;32m 114\u001b[0m spin_cb: Optional[Callable[[], \u001b[38;5;28;01mNone\u001b[39;00m]],\n\u001b[1;32m 115\u001b[0m ):\n\u001b[0;32m--> 116\u001b[0m \u001b[43mwait_fn\u001b[49m\u001b[43m(\u001b[49m\u001b[43mtimeout\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtimeout\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 117\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m spin_cb \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 118\u001b[0m spin_cb()\n", + "File \u001b[0;32m~/miniconda3/envs/feast3.11/lib/python3.11/threading.py:629\u001b[0m, in \u001b[0;36mEvent.wait\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m 627\u001b[0m signaled \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_flag\n\u001b[1;32m 628\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m signaled:\n\u001b[0;32m--> 629\u001b[0m signaled \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_cond\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mwait\u001b[49m\u001b[43m(\u001b[49m\u001b[43mtimeout\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 630\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m signaled\n", + "File \u001b[0;32m~/miniconda3/envs/feast3.11/lib/python3.11/threading.py:331\u001b[0m, in \u001b[0;36mCondition.wait\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m 329\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 330\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m timeout \u001b[38;5;241m>\u001b[39m \u001b[38;5;241m0\u001b[39m:\n\u001b[0;32m--> 331\u001b[0m gotit \u001b[38;5;241m=\u001b[39m \u001b[43mwaiter\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43macquire\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtimeout\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 332\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 333\u001b[0m gotit \u001b[38;5;241m=\u001b[39m waiter\u001b[38;5;241m.\u001b[39macquire(\u001b[38;5;28;01mFalse\u001b[39;00m)\n", + "\u001b[0;31mKeyboardInterrupt\u001b[0m: " + ] + } + ], + "source": [ + "store.serve_registry(6570)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5c285fb3-442b-4bb4-bf34-2a61ae5fe76a", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/rbac-local/03-online_server.ipynb b/examples/rbac-local/03-online_server.ipynb new file mode 100644 index 0000000000..f2800741bc --- /dev/null +++ b/examples/rbac-local/03-online_server.ipynb @@ -0,0 +1,126 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "d75bb824-a6cf-493e-87a8-2ae1095cf918", + "metadata": {}, + "source": [ + "## Online server" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "27a17dd4-08f5-4f01-b5a4-a76aa99952a1", + "metadata": {}, + "outputs": [], + "source": [ + "!lsof -i :6566\n", + "# !kill -9 64859 98087" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "897f5979-da53-4441-ac31-f5cd40abf6cd", + "metadata": {}, + "outputs": [], + "source": [ + "!echo $OBJC_DISABLE_INITIALIZE_FORK_SAFETY" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "73b219c3-7782-4e09-9897-d01f44ccae2d", + "metadata": {}, + "outputs": [], + "source": [ + "from feast import FeatureStore\n", + "store = FeatureStore(repo_path=\"rbac/feature_repo\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d1619739-f763-45bb-a1f1-53f6452bc60a", + "metadata": {}, + "outputs": [], + "source": [ + "store.serve(\n", + " host=\"localhost\",\n", + " port=6566,\n", + " type_=\"http\",\n", + " no_access_log=False,\n", + " workers=1,\n", + " metrics=False,\n", + " keep_alive_timeout=5,\n", + " registry_ttl_sec=5,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "bc804040-9cd0-4dbc-a63d-a81de9422605", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "08/09/2024 10:13:28 AM root WARNING: _list_feature_views will make breaking changes. Please use _list_batch_feature_views instead. _list_feature_views will behave like _list_all_feature_views in the future.\n", + "08/09/2024 10:13:28 AM root WARNING: _list_feature_views will make breaking changes. Please use _list_batch_feature_views instead. _list_feature_views will behave like _list_all_feature_views in the future.\n", + "127.0.0.1:56098 - \"POST /get-online-features HTTP/1.1\" 200\n", + "08/09/2024 10:13:31 AM root WARNING: _list_feature_views will make breaking changes. Please use _list_batch_feature_views instead. _list_feature_views will behave like _list_all_feature_views in the future.\n", + "08/09/2024 10:13:31 AM root WARNING: _list_feature_views will make breaking changes. Please use _list_batch_feature_views instead. _list_feature_views will behave like _list_all_feature_views in the future.\n", + "127.0.0.1:56127 - \"POST /get-online-features HTTP/1.1\" 200\n", + "08/09/2024 10:13:34 AM root WARNING: _list_feature_views will make breaking changes. Please use _list_batch_feature_views instead. _list_feature_views will behave like _list_all_feature_views in the future.\n", + "08/09/2024 10:13:34 AM root WARNING: _list_feature_views will make breaking changes. Please use _list_batch_feature_views instead. _list_feature_views will behave like _list_all_feature_views in the future.\n", + "127.0.0.1:56157 - \"POST /get-online-features HTTP/1.1\" 200\n", + "^C\n", + "[2024-08-09 10:14:48 +0200] [77213] [INFO] Handling signal: int\n", + "[2024-08-09 10:14:48 +0200] [21977] [INFO] Shutting down\n", + "[2024-08-09 10:14:48 +0200] [21977] [INFO] Error while closing socket [Errno 9] Bad file descriptor\n", + "[2024-08-09 10:14:48 +0200] [21977] [INFO] Waiting for application shutdown.\n", + "[2024-08-09 10:14:48 +0200] [21977] [INFO] Application shutdown complete.\n", + "[2024-08-09 10:14:48 +0200] [21977] [INFO] Finished server process [21977]\n", + "[2024-08-09 10:14:48 +0200] [77213] [ERROR] Worker (pid:21977) was sent SIGINT!\n" + ] + } + ], + "source": [ + "!feast -c rbac/feature_repo serve" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c3bc63e7-cf7c-4132-b39b-3cd75a1d6755", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/rbac-local/04-offline_server.ipynb b/examples/rbac-local/04-offline_server.ipynb new file mode 100644 index 0000000000..d7939aced5 --- /dev/null +++ b/examples/rbac-local/04-offline_server.ipynb @@ -0,0 +1,263 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "36f5d04f-b456-4e65-91a8-482c91f854c1", + "metadata": {}, + "source": [ + "## Offline server" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "86924e3b-d7dc-46e1-a9f4-05c8abee4da8", + "metadata": {}, + "outputs": [], + "source": [ + "!lsof -i :8815\n", + "# !kill -9 64859 98087" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "73b219c3-7782-4e09-9897-d01f44ccae2d", + "metadata": {}, + "outputs": [], + "source": [ + "from feast import FeatureStore\n", + "store = FeatureStore(repo_path=\"rbac/feature_repo\")" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "5400ee1b-de0a-4fe9-9003-83d0af0863e6", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:feast.permissions.auth.oidc_token_parser:Validated token\n", + "INFO:feast.permissions.auth.oidc_token_parser:Extracted user batch_admin and roles ['batch_admin']\n", + "INFO:feast.permissions.auth.oidc_token_parser:Validated token\n", + "INFO:feast.permissions.auth.oidc_token_parser:Extracted user batch_admin and roles ['batch_admin']\n", + "INFO:feast.permissions.auth.oidc_token_parser:Validated token\n", + "INFO:feast.permissions.auth.oidc_token_parser:Extracted user batch_admin and roles ['batch_admin']\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "extracted user: batch_admin (['batch_admin'])\n", + "extracted user: batch_admin (['batch_admin'])\n", + "extracted user: batch_admin (['batch_admin'])\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:feast.permissions.auth.oidc_token_parser:Validated token\n", + "INFO:feast.permissions.auth.oidc_token_parser:Extracted user batch_admin and roles ['batch_admin']\n", + "INFO:feast.permissions.auth.oidc_token_parser:Validated token\n", + "INFO:feast.permissions.auth.oidc_token_parser:Extracted user batch_admin and roles ['batch_admin']\n", + "INFO:feast.permissions.auth.oidc_token_parser:Validated token\n", + "INFO:feast.permissions.auth.oidc_token_parser:Extracted user batch_admin and roles ['batch_admin']\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "extracted user: batch_admin (['batch_admin'])\n", + "extracted user: batch_admin (['batch_admin'])\n", + "extracted user: batch_admin (['batch_admin'])\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:feast.permissions.auth.oidc_token_parser:Validated token\n", + "INFO:feast.permissions.auth.oidc_token_parser:Extracted user admin and roles ['store_admin']\n", + "INFO:feast.permissions.auth.oidc_token_parser:Validated token\n", + "INFO:feast.permissions.auth.oidc_token_parser:Extracted user admin and roles ['store_admin']\n", + "INFO:feast.permissions.auth.oidc_token_parser:Validated token\n", + "INFO:feast.permissions.auth.oidc_token_parser:Extracted user admin and roles ['store_admin']\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "extracted user: admin (['store_admin'])\n", + "extracted user: admin (['store_admin'])\n", + "extracted user: admin (['store_admin'])\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:feast.permissions.auth.oidc_token_parser:Validated token\n", + "INFO:feast.permissions.auth.oidc_token_parser:Extracted user admin and roles ['store_admin']\n", + "INFO:feast.permissions.auth.oidc_token_parser:Validated token\n", + "INFO:feast.permissions.auth.oidc_token_parser:Extracted user admin and roles ['store_admin']\n", + "INFO:feast.permissions.auth.oidc_token_parser:Validated token\n", + "INFO:feast.permissions.auth.oidc_token_parser:Extracted user admin and roles ['store_admin']\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "extracted user: admin (['store_admin'])\n", + "extracted user: admin (['store_admin'])\n", + "extracted user: admin (['store_admin'])\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:feast.permissions.auth.oidc_token_parser:Validated token\n", + "INFO:feast.permissions.auth.oidc_token_parser:Extracted user admin and roles ['store_admin']\n", + "INFO:feast.permissions.auth.oidc_token_parser:Validated token\n", + "INFO:feast.permissions.auth.oidc_token_parser:Extracted user admin and roles ['store_admin']\n", + "INFO:feast.permissions.auth.oidc_token_parser:Validated token\n", + "INFO:feast.permissions.auth.oidc_token_parser:Extracted user admin and roles ['store_admin']\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "extracted user: admin (['store_admin'])\n", + "extracted user: admin (['store_admin'])\n", + "extracted user: admin (['store_admin'])\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:feast.permissions.auth.oidc_token_parser:Validated token\n", + "INFO:feast.permissions.auth.oidc_token_parser:Extracted user admin and roles ['store_admin']\n", + "INFO:feast.permissions.auth.oidc_token_parser:Validated token\n", + "INFO:feast.permissions.auth.oidc_token_parser:Extracted user admin and roles ['store_admin']\n", + "INFO:feast.permissions.auth.oidc_token_parser:Validated token\n", + "INFO:feast.permissions.auth.oidc_token_parser:Extracted user admin and roles ['store_admin']\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "extracted user: admin (['store_admin'])\n", + "extracted user: admin (['store_admin'])\n", + "extracted user: admin (['store_admin'])\n" + ] + }, + { + "ename": "KeyboardInterrupt", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[6], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mstore\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mserve_offline\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mlocalhost\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m8815\u001b[39;49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/projects/mlops/feast/rh-feast/sdk/python/feast/feature_store.py:1828\u001b[0m, in \u001b[0;36mFeatureStore.serve_offline\u001b[0;34m(self, host, port)\u001b[0m\n\u001b[1;32m 1825\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"Start offline server locally on a given port.\"\"\"\u001b[39;00m\n\u001b[1;32m 1826\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mfeast\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m offline_server\n\u001b[0;32m-> 1828\u001b[0m \u001b[43moffline_server\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mstart_server\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mhost\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mport\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/projects/mlops/feast/rh-feast/sdk/python/feast/offline_server.py:471\u001b[0m, in \u001b[0;36mstart_server\u001b[0;34m(store, host, port)\u001b[0m\n\u001b[1;32m 469\u001b[0m server \u001b[38;5;241m=\u001b[39m OfflineServer(store, location)\n\u001b[1;32m 470\u001b[0m logger\u001b[38;5;241m.\u001b[39minfo(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mOffline store server serving on \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mlocation\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m--> 471\u001b[0m \u001b[43mserver\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mserve\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/miniconda3/envs/feast3.11/lib/python3.11/site-packages/pyarrow/_flight.pyx:3109\u001b[0m, in \u001b[0;36mpyarrow._flight.FlightServerBase.serve\u001b[0;34m()\u001b[0m\n", + "\u001b[0;31mKeyboardInterrupt\u001b[0m: " + ] + } + ], + "source": [ + "store.serve_offline(\"localhost\", 8815)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "8b822d5c-41d9-477a-8b42-c4701784bac2", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING:root:_list_feature_views will make breaking changes. Please use _list_batch_feature_views instead. _list_feature_views will behave like _list_all_feature_views in the future.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Materializing \u001b[1m\u001b[32m2\u001b[0m feature views to \u001b[1m\u001b[32m2024-08-08 17:24:56+02:00\u001b[0m into the \u001b[1m\u001b[32msqlite\u001b[0m online store.\n", + "\n", + "\u001b[1m\u001b[32mdriver_hourly_stats\u001b[0m from \u001b[1m\u001b[32m2024-08-07 17:24:56+02:00\u001b[0m to \u001b[1m\u001b[32m2024-08-08 17:24:56+02:00\u001b[0m:\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|████████████████████████████████████████████████████████████████| 5/5 [00:00<00:00, 394.32it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[1m\u001b[32mdriver_hourly_stats_fresh\u001b[0m from \u001b[1m\u001b[32m2024-08-07 17:24:56+02:00\u001b[0m to \u001b[1m\u001b[32m2024-08-08 19:24:56+02:00\u001b[0m:\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|███████████████████████████████████████████████████████████████| 5/5 [00:00<00:00, 1378.98it/s]\n" + ] + } + ], + "source": [ + "from datetime import datetime\n", + "store.materialize_incremental(end_date=datetime.now())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ff854a14-4649-4d40-94fa-b6e2b8577afa", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/rbac-local/README.md b/examples/rbac-local/README.md new file mode 100644 index 0000000000..0da594fd97 --- /dev/null +++ b/examples/rbac-local/README.md @@ -0,0 +1,57 @@ +# RBAC demo +RBAC demo with local environment. + +## System Requirements +* Clone of the Feast repo +* Docker +* yq + +## Architecture +The demo creates the following components: +* An OIDC authorization server using a Keycloak docker container and initialized for demo purposes with a sample realm. +* A sample feature store using `feast init`, later adapted to use the `oidc` authorization against the sample realm. +* Three servers running the registry, online and offline stores. +* A client application connected to the servers to run test code. + +## Setup the environment +Run the sample notebooks to setup the environment: +* [01.1-startkeycloak](./01.1-startkeycloak.ipynb) to start a Keycloak container. +* [01.2-setup-keycloak.ipynb](./01.2-setup-keycloak.ipynb) to configure Keycloak with all the needed resources for the next steps. +* [01.3-setup-feast.ipynb](./01.3-setup-feast.ipynb) to create the sample Feast store and inject the authoprization settings +* [02-registry_server.ipynb](./02-registry_server.ipynb) to start the Registry server +* [03-online_server.ipynb](./03-online_server.ipynb) to start the Online store server +* [04-offline_server.ipynb](04-offline_server.ipynb) to start the Offline store server + +**Note**: For MacOs users, you must set this environment variable before launching the notebook server: +```bash +OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES +``` + +## Goal +Once the environment is defined, we can use the [client.ipynb](./client.ipynb) notebook to verify how the behavior changes +according to the configured user. + +In particular, given the configured permissions: +| Permission | Types | Name pattern | Actions | Roles | +|------------|-------|--------------|---------|-------| +| read_permission | ALL | | READ | reader | +| write_fresh_permission | FeatureView1 | .*_fresh | WRITE_ONLINE | fresh_writer | +| offline_permission | FeatureView, OnDemandFeatureView, FeatureService | | CRUD, WRITE_OFFLINE, QUERY_OFFLINE | batch_admin | +| admin_permission | ALL | | ALL | store_admin | + +and the user roles defined in Keycloak: +| User | Roles | +|------|-------| +| reader | reader | +| writer | fresh_writer | +| batch_admin | batch_admin | +| admin | store_admin | + +We should expect the following behavior for each test section of the [client notebook](./client.ipynb): +| User | Basic validation | Historical | Materialization | Online | Stream push | +|------|------------------|------------|-------------------|--------|-------------| +| reader | Ok | Denied | Denied | Denied | Denied | +| writer | Empty | Denied | Ok | Denied | Denied | +| batch_admin | No Entities and Permissions | Ok | Denied | Denied | Denied | +| admin | Ok | Ok | Ok | Ok | Ok | + diff --git a/examples/rbac-local/client.ipynb b/examples/rbac-local/client.ipynb new file mode 100644 index 0000000000..2e6c03659c --- /dev/null +++ b/examples/rbac-local/client.ipynb @@ -0,0 +1,837 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "bee9388f-8ffc-4fcd-930f-197ec3c2dd96", + "metadata": {}, + "source": [ + "# Test client" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "eceb50b4-c516-4224-a0b1-efd31bb78c29", + "metadata": {}, + "outputs": [], + "source": [ + "import yaml\n", + "def update_username(username):\n", + " path = 'client/feature_store.yaml'\n", + " with open(path, 'r') as file:\n", + " config = yaml.safe_load(file) or {}\n", + " config['auth']['username'] = username\n", + " with open(path, 'w') as file:\n", + " yaml.safe_dump(config, file, default_flow_style=False)" + ] + }, + { + "cell_type": "markdown", + "id": "08a4020a-10ad-476a-af25-26a09d3d4786", + "metadata": {}, + "source": [ + "# Update test user\n", + "Use one of `reader`, `writer`, `batch_admin` or `admin` (password is fixed) as the current `username`." + ] + }, + { + "cell_type": "code", + "execution_count": 86, + "id": "564849f9-c95a-4278-9fa7-fa09694e5d93", + "metadata": {}, + "outputs": [], + "source": [ + "username = 'admin'\n", + "update_username(username)" + ] + }, + { + "cell_type": "code", + "execution_count": 87, + "id": "6ffb2c42-5a5d-495c-92c5-0729f0144fb8", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "auth:\n", + " auth_discovery_url: http://0.0.0.0:9999/realms/rbac_example/.well-known/openid-configuration\n", + " auth_server_url: http://0.0.0.0:9999\n", + " client_id: app\n", + " client_secret: eFGTp6ZJ0tARKYPbdMKUZ1J8PJNWfXR8\n", + " password: password\n", + " realm: rbac_example\n", + " type: oidc\n", + " username: admin\n", + "entity_key_serialization_version: 2\n", + "offline_store:\n", + " host: localhost\n", + " port: 8815\n", + " type: remote\n", + "online_store:\n", + " path: http://localhost:6566\n", + " type: remote\n", + "project: rbac\n", + "registry:\n", + " path: localhost:6570\n", + " registry_type: remote\n" + ] + } + ], + "source": [ + "!cat client/feature_store.yaml" + ] + }, + { + "cell_type": "markdown", + "id": "664b6f52-d8cf-4145-bf7a-fcce111a34da", + "metadata": {}, + "source": [ + "## Updating logger\n", + "The following is needed to log in the notebook the output the messages logged by th Feast application." + ] + }, + { + "cell_type": "code", + "execution_count": 88, + "id": "3a6fe206-63f8-486f-88cb-b4e888cb6855", + "metadata": {}, + "outputs": [], + "source": [ + "import logging\n", + "import sys\n", + "from io import StringIO\n", + "logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(message)s')\n", + "logger = logging.getLogger()" + ] + }, + { + "cell_type": "markdown", + "id": "a1eb1495-1f38-4165-a6a4-26a2087f1635", + "metadata": {}, + "source": [ + "## Setup Feast client\n", + "Initialize the Feast store from the [client configuration](./client/feature_store.yaml)" + ] + }, + { + "cell_type": "code", + "execution_count": 89, + "id": "b2292e78-cf30-441c-b67f-36e1f1a81923", + "metadata": {}, + "outputs": [], + "source": [ + "from feast.feature_store import FeatureStore" + ] + }, + { + "cell_type": "code", + "execution_count": 90, + "id": "bb653327-9eb3-448f-b320-625337851522", + "metadata": {}, + "outputs": [], + "source": [ + "store = FeatureStore(repo_path=\"client\")" + ] + }, + { + "cell_type": "markdown", + "id": "7e826371-3df5-483a-878d-ce79e8b907e3", + "metadata": {}, + "source": [ + "## Basic validation\n", + "Verify the authorization config and run some GET APIs on the registry." + ] + }, + { + "cell_type": "code", + "execution_count": 91, + "id": "a59979af-a438-436d-918c-3174d94ade5b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Authorization config is: {'auth_discovery_url': 'http://0.0.0.0:9999/realms/rbac_example/.well-known/openid-configuration', 'auth_server_url': 'http://0.0.0.0:9999', 'client_id': 'app', 'client_secret': 'eFGTp6ZJ0tARKYPbdMKUZ1J8PJNWfXR8', 'password': 'password', 'realm': 'rbac_example', 'type': 'oidc', 'username': 'admin'}\n" + ] + } + ], + "source": [ + "print(f\"Authorization config is: {store.config.auth}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 92, + "id": "bf0af19c-6609-4cb4-86f3-a976528c3966", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-08-09 10:12:55,608 - Intercepted the grpc api method /feast.registry.RegistryServer/ListEntities call to inject Authorization header token. \n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Entity found driver\n" + ] + } + ], + "source": [ + "for e in store.list_entities():\n", + " print(f\"Entity found {e.name}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 93, + "id": "0494a65f-64bf-45f0-a772-ee6d8b89c91e", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-08-09 10:12:57,920 - _list_feature_views will make breaking changes. Please use _list_batch_feature_views instead. _list_feature_views will behave like _list_all_feature_views in the future.\n", + "2024-08-09 10:12:57,921 - Intercepted the grpc api method /feast.registry.RegistryServer/ListFeatureViews call to inject Authorization header token. \n", + "2024-08-09 10:12:58,307 - Intercepted the grpc api method /feast.registry.RegistryServer/ListStreamFeatureViews call to inject Authorization header token. \n", + "2024-08-09 10:12:58,602 - Intercepted the grpc api method /feast.registry.RegistryServer/ListOnDemandFeatureViews call to inject Authorization header token. \n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "FeatureView found driver_hourly_stats of type FeatureView\n", + "FeatureView found driver_hourly_stats_fresh of type FeatureView\n", + "FeatureView found transformed_conv_rate_fresh of type OnDemandFeatureView\n", + "FeatureView found transformed_conv_rate of type OnDemandFeatureView\n" + ] + } + ], + "source": [ + "for fv in store.list_all_feature_views():\n", + " print(f\"FeatureView found {fv.name} of type {type(fv).__name__}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 94, + "id": "0832822f-e954-4d43-a96f-de5cf05acb2b", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-08-09 10:13:01,877 - Intercepted the grpc api method /feast.registry.RegistryServer/ListFeatureServices call to inject Authorization header token. \n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "FeatureService found driver_activity_v2 of type FeatureService\n", + "FeatureService found driver_activity_v1 of type FeatureService\n", + "FeatureService found driver_activity_v3 of type FeatureService\n" + ] + } + ], + "source": [ + "for fs in store.list_feature_services():\n", + " print(f\"FeatureService found {fs.name} of type {type(fs).__name__}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 95, + "id": "98fd0767-4305-4b18-a50b-298fa7103815", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "NAME TYPES WITH_SUBCLASS NAME_PATTERN ACTIONS ROLES\n", + "read_permission FeatureView True READ reader\n", + " OnDemandFeatureView\n", + " BatchFeatureView\n", + " StreamFeatureView\n", + " Entity\n", + " FeatureService\n", + " DataSource\n", + " ValidationReference\n", + " SavedDataset\n", + " Permission\n", + "write_fresh_permission FeatureView True .*_fresh WRITE_ONLINE fresh_writer\n", + "offline_permission FeatureView True CREATE batch_admin\n", + " OnDemandFeatureView READ\n", + " FeatureService UPDATE\n", + " DELETE\n", + " WRITE_OFFLINE\n", + " QUERY_OFFLINE\n", + "admin_permission FeatureView True CREATE store_admin\n", + " OnDemandFeatureView READ\n", + " BatchFeatureView UPDATE\n", + " StreamFeatureView DELETE\n", + " Entity QUERY_ONLINE\n", + " FeatureService QUERY_OFFLINE\n", + " DataSource WRITE_ONLINE\n", + " ValidationReference WRITE_OFFLINE\n", + " SavedDataset\n", + " Permission\n" + ] + } + ], + "source": [ + "!feast -c client permissions list" + ] + }, + { + "cell_type": "markdown", + "id": "ad2d56ee-e7a9-463e-a597-932c10f8df1c", + "metadata": {}, + "source": [ + "## Validating with test_workflow.py\n", + "The following test functions were copied from the `test_workflow.py` template but we added `try` blocks to print only \n", + "the relevant error messages, since we expect to receive errors from the permission enforcement modules." + ] + }, + { + "cell_type": "code", + "execution_count": 96, + "id": "930f7e8c-c2a0-4425-99c2-c9958a5a7632", + "metadata": {}, + "outputs": [], + "source": [ + "import subprocess\n", + "from datetime import datetime\n", + "\n", + "import pandas as pd\n", + "\n", + "from feast import FeatureStore\n", + "from feast.data_source import PushMode\n", + "\n", + "def fetch_historical_features_entity_df(store: FeatureStore, for_batch_scoring: bool):\n", + " # Note: see https://docs.feast.dev/getting-started/concepts/feature-retrieval for more details on how to retrieve\n", + " # for all entities in the offline store instead\n", + " entity_df = pd.DataFrame.from_dict(\n", + " {\n", + " # entity's join key -> entity values\n", + " \"driver_id\": [1001, 1002, 1003],\n", + " # \"event_timestamp\" (reserved key) -> timestamps\n", + " \"event_timestamp\": [\n", + " datetime(2021, 4, 12, 10, 59, 42),\n", + " datetime(2021, 4, 12, 8, 12, 10),\n", + " datetime(2021, 4, 12, 16, 40, 26),\n", + " ],\n", + " # (optional) label name -> label values. Feast does not process these\n", + " \"label_driver_reported_satisfaction\": [1, 5, 3],\n", + " # values we're using for an on-demand transformation\n", + " \"val_to_add\": [1, 2, 3],\n", + " \"val_to_add_2\": [10, 20, 30],\n", + " }\n", + " )\n", + " # For batch scoring, we want the latest timestamps\n", + " if for_batch_scoring:\n", + " entity_df[\"event_timestamp\"] = pd.to_datetime(\"now\", utc=True)\n", + "\n", + " try:\n", + " training_df = store.get_historical_features(\n", + " entity_df=entity_df,\n", + " features=[\n", + " \"driver_hourly_stats:conv_rate\",\n", + " \"driver_hourly_stats:acc_rate\",\n", + " \"driver_hourly_stats:avg_daily_trips\",\n", + " \"transformed_conv_rate:conv_rate_plus_val1\",\n", + " \"transformed_conv_rate:conv_rate_plus_val2\",\n", + " ],\n", + " ).to_df()\n", + " print(training_df.head())\n", + " except Exception as e:\n", + " print(f\"Failed to run `store.get_historical_features`: {e}\")\n", + "\n", + "\n", + "def fetch_online_features(store, source: str = \"\"):\n", + " entity_rows = [\n", + " # {join_key: entity_value}\n", + " {\n", + " \"driver_id\": 1001,\n", + " \"val_to_add\": 1000,\n", + " \"val_to_add_2\": 2000,\n", + " },\n", + " {\n", + " \"driver_id\": 1002,\n", + " \"val_to_add\": 1001,\n", + " \"val_to_add_2\": 2002,\n", + " },\n", + " ]\n", + " if source == \"feature_service\":\n", + " try:\n", + " features_to_fetch = store.get_feature_service(\"driver_activity_v1\")\n", + " except Exception as e:\n", + " print(f\"Failed to run `store.get_feature_service`: {e}\")\n", + " elif source == \"push\":\n", + " try:\n", + " features_to_fetch = store.get_feature_service(\"driver_activity_v3\")\n", + " except Exception as e:\n", + " print(f\"Failed to run `store.get_feature_service`: {e}\")\n", + " else:\n", + " features_to_fetch = [\n", + " \"driver_hourly_stats:acc_rate\",\n", + " \"transformed_conv_rate:conv_rate_plus_val1\",\n", + " \"transformed_conv_rate:conv_rate_plus_val2\",\n", + " ]\n", + " try:\n", + " returned_features = store.get_online_features(\n", + " features=features_to_fetch,\n", + " entity_rows=entity_rows,\n", + " ).to_dict()\n", + " for key, value in sorted(returned_features.items()):\n", + " print(key, \" : \", value)\n", + " except Exception as e:\n", + " print(f\"Failed to run `store.get_online_features`: {e}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 97, + "id": "86359ae5-e723-4976-89bb-e772f597ed60", + "metadata": {}, + "outputs": [], + "source": [ + "store = FeatureStore(repo_path=\"client\")" + ] + }, + { + "cell_type": "markdown", + "id": "c0fed355-a1ac-4515-ae27-9d0feca886f4", + "metadata": {}, + "source": [ + "### Historical features" + ] + }, + { + "cell_type": "code", + "execution_count": 98, + "id": "e18dba03-6199-4b48-a9cb-23e3fa51a505", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-08-09 10:13:15,551 - _list_feature_views will make breaking changes. Please use _list_batch_feature_views instead. _list_feature_views will behave like _list_all_feature_views in the future.\n", + "2024-08-09 10:13:15,552 - Intercepted the grpc api method /feast.registry.RegistryServer/ListFeatureViews call to inject Authorization header token. \n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "--- Historical features for training ---\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-08-09 10:13:15,893 - Intercepted the grpc api method /feast.registry.RegistryServer/ListStreamFeatureViews call to inject Authorization header token. \n", + "2024-08-09 10:13:16,196 - Intercepted the grpc api method /feast.registry.RegistryServer/ListOnDemandFeatureViews call to inject Authorization header token. \n", + "2024-08-09 10:13:16,511 - Connecting FlightClient at grpc://localhost:8815\n", + "2024-08-09 10:13:16,924 - _list_feature_views will make breaking changes. Please use _list_batch_feature_views instead. _list_feature_views will behave like _list_all_feature_views in the future.\n", + "2024-08-09 10:13:16,925 - Intercepted the grpc api method /feast.registry.RegistryServer/ListFeatureViews call to inject Authorization header token. \n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " driver_id event_timestamp label_driver_reported_satisfaction \\\n", + "0 1001 2021-04-12 10:59:42+00:00 1 \n", + "1 1002 2021-04-12 08:12:10+00:00 5 \n", + "2 1003 2021-04-12 16:40:26+00:00 3 \n", + "\n", + " val_to_add val_to_add_2 conv_rate acc_rate avg_daily_trips \\\n", + "0 1 10 0.928541 0.695293 818 \n", + "1 2 20 0.491019 0.712657 233 \n", + "2 3 30 0.504265 0.638185 738 \n", + "\n", + " conv_rate_plus_val1 conv_rate_plus_val2 \n", + "0 1.928541 10.928541 \n", + "1 2.491019 20.491019 \n", + "2 3.504265 30.504265 \n", + "\n", + "--- Historical features for batch scoring ---\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-08-09 10:13:17,229 - Intercepted the grpc api method /feast.registry.RegistryServer/ListStreamFeatureViews call to inject Authorization header token. \n", + "2024-08-09 10:13:17,585 - Intercepted the grpc api method /feast.registry.RegistryServer/ListOnDemandFeatureViews call to inject Authorization header token. \n", + "2024-08-09 10:13:17,937 - Connecting FlightClient at grpc://localhost:8815\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " driver_id event_timestamp \\\n", + "0 1002 2024-08-09 08:13:16.924405+00:00 \n", + "1 1001 2024-08-09 08:13:16.924405+00:00 \n", + "2 1003 2024-08-09 08:13:16.924405+00:00 \n", + "\n", + " label_driver_reported_satisfaction val_to_add val_to_add_2 conv_rate \\\n", + "0 5 2 20 0.709591 \n", + "1 1 1 10 0.304952 \n", + "2 3 3 30 0.062595 \n", + "\n", + " acc_rate avg_daily_trips conv_rate_plus_val1 conv_rate_plus_val2 \n", + "0 0.446933 543 2.709591 20.709591 \n", + "1 0.228232 765 1.304952 10.304952 \n", + "2 0.787014 147 3.062595 30.062595 \n" + ] + } + ], + "source": [ + "print(\"\\n--- Historical features for training ---\")\n", + "fetch_historical_features_entity_df(store, for_batch_scoring=False)\n", + "\n", + "print(\"\\n--- Historical features for batch scoring ---\")\n", + "fetch_historical_features_entity_df(store, for_batch_scoring=True)" + ] + }, + { + "cell_type": "markdown", + "id": "83bdd1a1-7071-4c51-bf69-9b2bade572a1", + "metadata": {}, + "source": [ + "### Materialization" + ] + }, + { + "cell_type": "code", + "execution_count": 99, + "id": "baeed80c-d2bf-4ac2-ae97-dc689c32e797", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-08-09 10:13:20,397 - _list_feature_views will make breaking changes. Please use _list_batch_feature_views instead. _list_feature_views will behave like _list_all_feature_views in the future.\n", + "2024-08-09 10:13:20,398 - Intercepted the grpc api method /feast.registry.RegistryServer/ListFeatureViews call to inject Authorization header token. \n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "--- Load features into online store ---\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-08-09 10:13:20,731 - Intercepted the grpc api method /feast.registry.RegistryServer/ListStreamFeatureViews call to inject Authorization header token. \n", + "2024-08-09 10:13:21,034 - Intercepted the grpc api method /feast.registry.RegistryServer/GetEntity call to inject Authorization header token. \n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Materializing \u001b[1m\u001b[32m2\u001b[0m feature views to \u001b[1m\u001b[32m2024-08-09 10:13:20+02:00\u001b[0m into the \u001b[1m\u001b[32mremote\u001b[0m online store.\n", + "\n", + "\u001b[1m\u001b[32mdriver_hourly_stats\u001b[0m from \u001b[1m\u001b[32m2024-08-08 19:25:13+02:00\u001b[0m to \u001b[1m\u001b[32m2024-08-09 10:13:20+02:00\u001b[0m:\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-08-09 10:13:21,345 - Connecting FlightClient at grpc://localhost:8815\n", + "0it [00:00, ?it/s]\n", + "2024-08-09 10:13:23,864 - Intercepted the grpc api method /feast.registry.RegistryServer/ApplyMaterialization call to inject Authorization header token. \n", + "2024-08-09 10:13:24,183 - Intercepted the grpc api method /feast.registry.RegistryServer/GetEntity call to inject Authorization header token. \n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[1m\u001b[32mdriver_hourly_stats_fresh\u001b[0m from \u001b[1m\u001b[32m2024-08-08 19:25:13+02:00\u001b[0m to \u001b[1m\u001b[32m2024-08-09 12:13:20+02:00\u001b[0m:\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-08-09 10:13:24,484 - Connecting FlightClient at grpc://localhost:8815\n", + "0it [00:00, ?it/s]\n", + "2024-08-09 10:13:24,848 - Intercepted the grpc api method /feast.registry.RegistryServer/ApplyMaterialization call to inject Authorization header token. \n" + ] + } + ], + "source": [ + "print(\"\\n--- Load features into online store ---\")\n", + "try:\n", + " store.materialize_incremental(end_date=datetime.now())\n", + "except Exception as e:\n", + " print(f\"Failed to run `store.materialize_incremental`: {e}\")" + ] + }, + { + "cell_type": "markdown", + "id": "f3ef1e87-a98e-447e-893a-d10e205d87c5", + "metadata": {}, + "source": [ + "### Online features" + ] + }, + { + "cell_type": "code", + "execution_count": 100, + "id": "feb552de-77da-4177-bc4e-4c882ca91fe8", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-08-09 10:13:26,503 - _list_feature_views will make breaking changes. Please use _list_batch_feature_views instead. _list_feature_views will behave like _list_all_feature_views in the future.\n", + "2024-08-09 10:13:26,504 - Intercepted the grpc api method /feast.registry.RegistryServer/ListFeatureViews call to inject Authorization header token. \n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "--- Online features ---\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-08-09 10:13:26,844 - Intercepted the grpc api method /feast.registry.RegistryServer/ListStreamFeatureViews call to inject Authorization header token. \n", + "2024-08-09 10:13:27,139 - Intercepted the grpc api method /feast.registry.RegistryServer/ListOnDemandFeatureViews call to inject Authorization header token. \n", + "2024-08-09 10:13:27,588 - Intercepted the grpc api method /feast.registry.RegistryServer/ListEntities call to inject Authorization header token. \n", + "2024-08-09 10:13:27,943 - Intercepted the grpc api method /feast.registry.RegistryServer/GetEntity call to inject Authorization header token. \n", + "2024-08-09 10:13:28,262 - Intercepted the grpc api method /feast.registry.RegistryServer/GetEntity call to inject Authorization header token. \n", + "2024-08-09 10:13:28,928 - Intercepted the grpc api method /feast.registry.RegistryServer/GetFeatureService call to inject Authorization header token. \n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "acc_rate : [0.22823210060596466, 0.44693297147750854]\n", + "conv_rate_plus_val1 : [1000.3049515485764, 1001.7095908522606]\n", + "conv_rate_plus_val2 : [2000.3049515485764, 2002.7095908522606]\n", + "driver_id : [1001, 1002]\n", + "\n", + "--- Online features retrieved (instead) through a feature service---\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-08-09 10:13:29,223 - Intercepted the grpc api method /feast.registry.RegistryServer/GetFeatureService call to inject Authorization header token. \n", + "2024-08-09 10:13:29,513 - _list_feature_views will make breaking changes. Please use _list_batch_feature_views instead. _list_feature_views will behave like _list_all_feature_views in the future.\n", + "2024-08-09 10:13:29,513 - Intercepted the grpc api method /feast.registry.RegistryServer/ListFeatureViews call to inject Authorization header token. \n", + "2024-08-09 10:13:29,822 - Intercepted the grpc api method /feast.registry.RegistryServer/ListStreamFeatureViews call to inject Authorization header token. \n", + "2024-08-09 10:13:30,166 - Intercepted the grpc api method /feast.registry.RegistryServer/ListOnDemandFeatureViews call to inject Authorization header token. \n", + "2024-08-09 10:13:30,517 - Intercepted the grpc api method /feast.registry.RegistryServer/ListEntities call to inject Authorization header token. \n", + "2024-08-09 10:13:30,820 - Intercepted the grpc api method /feast.registry.RegistryServer/GetEntity call to inject Authorization header token. \n", + "2024-08-09 10:13:31,189 - Intercepted the grpc api method /feast.registry.RegistryServer/GetEntity call to inject Authorization header token. \n", + "2024-08-09 10:13:31,813 - Intercepted the grpc api method /feast.registry.RegistryServer/GetFeatureService call to inject Authorization header token. \n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "conv_rate : [0.304951548576355, 0.7095908522605896]\n", + "conv_rate_plus_val1 : [1000.3049515485764, 1001.7095908522606]\n", + "conv_rate_plus_val2 : [2000.3049515485764, 2002.7095908522606]\n", + "driver_id : [1001, 1002]\n", + "\n", + "--- Online features retrieved (using feature service v3, which uses a feature view with a push source---\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-08-09 10:13:32,117 - Intercepted the grpc api method /feast.registry.RegistryServer/GetFeatureService call to inject Authorization header token. \n", + "2024-08-09 10:13:32,413 - _list_feature_views will make breaking changes. Please use _list_batch_feature_views instead. _list_feature_views will behave like _list_all_feature_views in the future.\n", + "2024-08-09 10:13:32,414 - Intercepted the grpc api method /feast.registry.RegistryServer/ListFeatureViews call to inject Authorization header token. \n", + "2024-08-09 10:13:32,736 - Intercepted the grpc api method /feast.registry.RegistryServer/ListStreamFeatureViews call to inject Authorization header token. \n", + "2024-08-09 10:13:33,029 - Intercepted the grpc api method /feast.registry.RegistryServer/ListOnDemandFeatureViews call to inject Authorization header token. \n", + "2024-08-09 10:13:33,322 - Intercepted the grpc api method /feast.registry.RegistryServer/ListEntities call to inject Authorization header token. \n", + "2024-08-09 10:13:33,611 - Intercepted the grpc api method /feast.registry.RegistryServer/GetEntity call to inject Authorization header token. \n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "acc_rate : [0.22823210060596466, 0.44693297147750854]\n", + "avg_daily_trips : [765, 543]\n", + "conv_rate : [0.304951548576355, 0.7095908522605896]\n", + "conv_rate_plus_val1 : [1000.3049515485764, 1001.7095908522606]\n", + "conv_rate_plus_val2 : [2000.3049515485764, 2002.7095908522606]\n", + "driver_id : [1001, 1002]\n" + ] + } + ], + "source": [ + "print(\"\\n--- Online features ---\")\n", + "fetch_online_features(store)\n", + "\n", + "print(\"\\n--- Online features retrieved (instead) through a feature service---\")\n", + "fetch_online_features(store, source=\"feature_service\")\n", + "\n", + "print(\n", + " \"\\n--- Online features retrieved (using feature service v3, which uses a feature view with a push source---\"\n", + ")\n", + "fetch_online_features(store, source=\"push\")" + ] + }, + { + "cell_type": "markdown", + "id": "7ce5704c-86ef-4d00-a111-b86e853f2cca", + "metadata": {}, + "source": [ + "### Stream push" + ] + }, + { + "cell_type": "code", + "execution_count": 101, + "id": "e53317fc-8e6b-4dc3-89ca-28d6be04b98a", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-08-09 10:13:34,231 - list_feature_views will make breaking changes. Please use list_batch_feature_views instead. list_feature_views will behave like list_all_feature_views in the future.\n", + "2024-08-09 10:13:34,232 - _list_feature_views will make breaking changes. Please use _list_batch_feature_views instead. _list_feature_views will behave like _list_all_feature_views in the future.\n", + "2024-08-09 10:13:34,233 - Intercepted the grpc api method /feast.registry.RegistryServer/ListFeatureViews call to inject Authorization header token. \n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "--- Simulate a stream event ingestion of the hourly stats df ---\n", + " driver_id event_timestamp created conv_rate \\\n", + "0 1001 2024-08-09 10:13:34.227334 2024-08-09 10:13:34.227339 1.0 \n", + "\n", + " acc_rate avg_daily_trips \n", + "0 1.0 1000 \n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-08-09 10:13:34,534 - Intercepted the grpc api method /feast.registry.RegistryServer/ListStreamFeatureViews call to inject Authorization header token. \n", + "2024-08-09 10:13:34,838 - Intercepted the grpc api method /feast.registry.RegistryServer/GetStreamFeatureView call to inject Authorization header token. \n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Failed to run `store.push`: <_InactiveRpcError of RPC that terminated with:\n", + "\tstatus = StatusCode.UNKNOWN\n", + "\tdetails = \"Exception calling application: Feature view driver_hourly_stats_fresh does not exist in project rbac\"\n", + "\tdebug_error_string = \"UNKNOWN:Error received from peer {grpc_message:\"Exception calling application: Feature view driver_hourly_stats_fresh does not exist in project rbac\", grpc_status:2, created_time:\"2024-08-09T10:13:35.137923+02:00\"}\"\n", + ">\n" + ] + } + ], + "source": [ + "print(\"\\n--- Simulate a stream event ingestion of the hourly stats df ---\")\n", + "event_df = pd.DataFrame.from_dict(\n", + " {\n", + " \"driver_id\": [1001],\n", + " \"event_timestamp\": [\n", + " datetime.now(),\n", + " ],\n", + " \"created\": [\n", + " datetime.now(),\n", + " ],\n", + " \"conv_rate\": [1.0],\n", + " \"acc_rate\": [1.0],\n", + " \"avg_daily_trips\": [1000],\n", + " }\n", + ")\n", + "print(event_df)\n", + "try:\n", + " store.push(\"driver_stats_push_source\", event_df, to=PushMode.ONLINE_AND_OFFLINE)\n", + " print(\"\\n--- Online features again with updated values from a stream push---\")\n", + " fetch_online_features(store, source=\"push\")\n", + "except Exception as e:\n", + " print(f\"Failed to run `store.push`: {e}\")" + ] + }, + { + "cell_type": "markdown", + "id": "5709f71b-ddff-4048-9db1-98d4090326e1", + "metadata": {}, + "source": [ + "**Note** If you see the following error, it is likely due to the issue [#4392: Remote registry client does not map application errors](https://github.com/feast-dev/feast/issues/4392):\n", + "```\n", + "Feature view driver_hourly_stats_fresh does not exist in project rbac\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "573d9e29-4ba8-41f4-b6a1-82a24d4550b5", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/rbac-local/client/feature_store.yaml b/examples/rbac-local/client/feature_store.yaml new file mode 100644 index 0000000000..fd4b39d31d --- /dev/null +++ b/examples/rbac-local/client/feature_store.yaml @@ -0,0 +1,21 @@ +auth: + auth_discovery_url: http://0.0.0.0:9999/realms/rbac_example/.well-known/openid-configuration + auth_server_url: http://0.0.0.0:9999 + client_id: app + client_secret: eFGTp6ZJ0tARKYPbdMKUZ1J8PJNWfXR8 + password: password + realm: rbac_example + type: oidc + username: admin +entity_key_serialization_version: 2 +offline_store: + host: localhost + port: 8815 + type: remote +online_store: + path: http://localhost:6566 + type: remote +project: rbac +registry: + path: localhost:6570 + registry_type: remote From 1183fbd188eec8a453e43d91bb0d32fee18455ac Mon Sep 17 00:00:00 2001 From: Theodor Mihalache Date: Tue, 13 Aug 2024 09:11:09 -0400 Subject: [PATCH 152/169] Add missing required_tags to permission object and cli info - Add missing required_tags to permission object - added required_tags to cli info Signed-off-by: Theodor Mihalache Signed-off-by: Abdul Hameed --- docs/reference/feast-cli-commands.md | 20 +++++++++++++++---- sdk/python/feast/cli.py | 3 ++- sdk/python/feast/cli_utils.py | 9 ++++++++- sdk/python/feast/permissions/matcher.py | 14 ++++++------- sdk/python/feast/permissions/permission.py | 17 +++++++++++++--- .../registration/test_universal_registry.py | 5 +++++ .../tests/unit/permissions/test_permission.py | 4 ++-- 7 files changed, 54 insertions(+), 18 deletions(-) diff --git a/docs/reference/feast-cli-commands.md b/docs/reference/feast-cli-commands.md index ff71c342b2..37a078f9fd 100644 --- a/docs/reference/feast-cli-commands.md +++ b/docs/reference/feast-cli-commands.md @@ -171,10 +171,16 @@ Options: ``` ```text -NAME TYPES NAME_PATTERN ACTIONS ROLES -reader_permission1234 FeatureView transformed_conv_rate READ reader - FeaduteService -writer_permission1234 FeatureView transformed_conv_rate CREATE writer ++-----------------------+-------------+-----------------------+-----------+----------------+-------------------------+ +| NAME | TYPES | NAME_PATTERN | ACTIONS | ROLES | REQUIRED_TAGS | ++=======================+=============+=======================+===========+================+================+========+ +| reader_permission1234 | FeatureView | transformed_conv_rate | READ | reader | - | ++-----------------------+-------------+-----------------------+-----------+----------------+-------------------------+ +| writer_permission1234 | FeatureView | transformed_conv_rate | CREATE | writer | - | ++-----------------------+-------------+-----------------------+-----------+----------------+-------------------------+ +| special | FeatureView | special.* | READ | admin | test-key2 : test-value2 | +| | | | UPDATE | special-reader | test-key : test-value | ++-----------------------+-------------+-----------------------+-----------+----------------+-------------------------+ ``` `verbose` option describes the resources matching each configured permission: @@ -205,12 +211,18 @@ types: - FEATURE_VIEW withSubclasses: true namePattern: transformed_conv_rate +requiredTags: + required1: required-value1 + required2: required-value2 actions: - READ policy: roleBasedPolicy: roles: - reader +tags: + key1: value1 + key2: value2 ``` diff --git a/sdk/python/feast/cli.py b/sdk/python/feast/cli.py index 9a89ecd32b..737704dd36 100644 --- a/sdk/python/feast/cli.py +++ b/sdk/python/feast/cli.py @@ -992,6 +992,7 @@ def feast_permissions_list_command(ctx: click.Context, verbose: bool, tags: list "NAME_PATTERN", "ACTIONS", "ROLES", + "REQUIRED_TAGS", ], tablefmt="plain", ) @@ -1107,7 +1108,7 @@ def feast_permissions_list_roles_command(ctx: click.Context, verbose: bool): headers=[ "ROLE NAME", ], - tablefmt="plain", + tablefmt="grid", ) ) else: diff --git a/sdk/python/feast/cli_utils.py b/sdk/python/feast/cli_utils.py index e88fcea543..edfdab93e3 100644 --- a/sdk/python/feast/cli_utils.py +++ b/sdk/python/feast/cli_utils.py @@ -199,7 +199,8 @@ def handle_not_verbose_permissions_command( p.name_pattern, _to_multi_line([a.value.upper() for a in p.actions]), _to_multi_line(sorted(roles)), - ] + _dict_to_multi_line(p.required_tags), + ], ) @@ -320,3 +321,9 @@ def _to_multi_line(values: list[str]) -> str: if not values: return "-" return "\n".join(values) + + +def _dict_to_multi_line(values: dict[str, str]) -> str: + if not values: + return "-" + return "\n".join([f"{key} : {value}" for key, value in values.items()]) diff --git a/sdk/python/feast/permissions/matcher.py b/sdk/python/feast/permissions/matcher.py index 10bed12e79..337bfd5c57 100644 --- a/sdk/python/feast/permissions/matcher.py +++ b/sdk/python/feast/permissions/matcher.py @@ -54,7 +54,7 @@ def resource_match_config( resource: A FeastObject instance to match agains the permission. expected_types: The list of object types configured in the permission. Type match also includes all the sub-classes. name_pattern: The optional name pattern filter configured in the permission. - required_tags: The optional dicstionary of required tags configured in the permission. + required_tags: The optional dictionary of required tags configured in the permission. Returns: bool: `True` if the resource matches the configured permission filters. @@ -92,22 +92,22 @@ def resource_match_config( logger.warning(f"Resource {resource} has no `name` attribute") if required_tags: - if hasattr(resource, "tags"): - if isinstance(resource.tags, dict): + if hasattr(resource, "required_tags"): + if isinstance(resource.required_tags, dict): for tag in required_tags.keys(): required_value = required_tags.get(tag) - actual_value = resource.tags.get(tag) + actual_value = resource.required_tags.get(tag) if required_value != actual_value: logger.info( - f"Unmatched value {actual_value} for tag {tag}: expected {required_value}" + f"Unmatched value {actual_value} for required tag {tag}: expected {required_value}" ) return False else: logger.warning( - f"Resource {resource} has no `tags` attribute of unexpected type {type(resource.tags)}" + f"Resource {resource} has no `required_tags` attribute of unexpected type {type(resource.required_tags)}" ) else: - logger.warning(f"Resource {resource} has no `tags` attribute") + logger.warning(f"Resource {resource} has no `required_tags` attribute") return True diff --git a/sdk/python/feast/permissions/permission.py b/sdk/python/feast/permissions/permission.py index b942f3b10e..824fcd063f 100644 --- a/sdk/python/feast/permissions/permission.py +++ b/sdk/python/feast/permissions/permission.py @@ -34,7 +34,8 @@ class Permission(ABC): be present in a resource tags with the given value. Defaults to None, meaning that no tags filtering is applied. actions: The actions authorized by this permission. Defaults to `ALL_ACTIONS`. policy: The policy to be applied to validate a client request. - tags: Dictionary of key-value pairs that must match the resource tags. All these tags must + tags: A dictionary of key-value pairs to store arbitrary metadata. + required_tags: Dictionary of key-value pairs that must match the resource tags. All these tags must """ _name: str @@ -43,6 +44,7 @@ class Permission(ABC): _actions: list[AuthzedAction] _policy: Policy _tags: Dict[str, str] + _required_tags: dict[str, str] def __init__( self, @@ -52,6 +54,7 @@ def __init__( actions: Union[list[AuthzedAction], AuthzedAction] = ALL_ACTIONS, policy: Policy = AllowAll, tags: Optional[dict[str, str]] = None, + required_tags: Optional[dict[str, str]] = None, ): from feast.feast_object import ALL_RESOURCE_TYPES @@ -70,6 +73,7 @@ def __init__( self._actions = actions if isinstance(actions, list) else [actions] self._policy = policy self._tags = _normalize_tags(tags) + self._required_tags = _normalize_tags(required_tags) def __eq__(self, other): if not isinstance(other, Permission): @@ -81,6 +85,7 @@ def __eq__(self, other): or self.tags != other.tags or self.policy != other.policy or self.actions != other.actions + or self.required_tags != other.required_tags ): return False @@ -119,6 +124,10 @@ def policy(self) -> Policy: def tags(self) -> Dict[str, str]: return self._tags + @property + def required_tags(self) -> Dict[str, str]: + return self._required_tags + def match_resource(self, resource: "FeastObject") -> bool: """ Returns: @@ -128,7 +137,7 @@ def match_resource(self, resource: "FeastObject") -> bool: resource=resource, expected_types=self.types, name_pattern=self.name_pattern, - required_tags=self.tags, + required_tags=self.required_tags, ) def match_actions(self, requested_actions: list[AuthzedAction]) -> bool: @@ -171,6 +180,7 @@ def from_proto(permission_proto: PermissionProto) -> Any: actions, Policy.from_proto(permission_proto.policy), dict(permission_proto.tags) or None, + dict(permission_proto.required_tags) or None, ) return permission @@ -196,7 +206,8 @@ def to_proto(self) -> PermissionProto: name_pattern=self.name_pattern if self.name_pattern is not None else "", actions=actions, policy=self.policy.to_proto(), - tags=self._tags if self._tags is not None else None, + tags=self.tags, + required_tags=self.required_tags, ) return permission_proto diff --git a/sdk/python/tests/integration/registration/test_universal_registry.py b/sdk/python/tests/integration/registration/test_universal_registry.py index fbcfa3b9b8..198a82d40a 100644 --- a/sdk/python/tests/integration/registration/test_universal_registry.py +++ b/sdk/python/tests/integration/registration/test_universal_registry.py @@ -1388,6 +1388,7 @@ def test_apply_permission_success(test_registry): and permission.policy.roles[0] == "reader" and permission.name_pattern is None and permission.tags is None + and permission.required_tags is None ) permission = test_registry.get_permission("read_permission", project) @@ -1402,6 +1403,7 @@ def test_apply_permission_success(test_registry): and permission.policy.roles[0] == "reader" and permission.name_pattern is None and permission.tags is None + and permission.required_tags is None ) # After the first apply, the created_timestamp should be the same as the last_update_timestamp. @@ -1435,6 +1437,7 @@ def test_apply_permission_success(test_registry): and "writer" in updated_permission.policy.roles and updated_permission.name_pattern is None and updated_permission.tags is None + and updated_permission.required_tags is None ) # # The created_timestamp for the entity should be set to the created_timestamp value stored from the previous apply @@ -1451,6 +1454,7 @@ def test_apply_permission_success(test_registry): types=FeatureView, name_pattern="aaa", tags={"team": "matchmaking"}, + required_tags={"tag1": "tag1-value"}, ) test_registry.apply_permission(updated_permission, project) @@ -1473,6 +1477,7 @@ def test_apply_permission_success(test_registry): and updated_permission.name_pattern == "aaa" and "team" in updated_permission.tags and updated_permission.tags["team"] == "matchmaking" + and updated_permission.required_tags["tag1"] == "tag1-value" ) test_registry.delete_permission("read_permission", project) diff --git a/sdk/python/tests/unit/permissions/test_permission.py b/sdk/python/tests/unit/permissions/test_permission.py index 120f1923b6..606d750d81 100644 --- a/sdk/python/tests/unit/permissions/test_permission.py +++ b/sdk/python/tests/unit/permissions/test_permission.py @@ -171,11 +171,11 @@ def test_resource_match_with_name_filter(pattern, name, match): ) def test_resource_match_with_tags(required_tags, tags, result): # Missing tags - p = Permission(name="test", tags=required_tags) + p = Permission(name="test", required_tags=required_tags) for t in ALL_RESOURCE_TYPES: resource = Mock(spec=t) resource.name = "test" - resource.tags = tags + resource.required_tags = tags assertpy.assert_that(p.match_resource(resource)).is_equal_to(result) From 063a87f12ae5698a55c29d0b4810158538cc1c23 Mon Sep 17 00:00:00 2001 From: Abdul Hameed Date: Mon, 12 Aug 2024 16:14:03 -0400 Subject: [PATCH 153/169] Fixed the registry apply function assertation Signed-off-by: Abdul Hameed --- sdk/python/feast/registry_server.py | 98 ++++++++++++++++++----------- 1 file changed, 61 insertions(+), 37 deletions(-) diff --git a/sdk/python/feast/registry_server.py b/sdk/python/feast/registry_server.py index 8be333264f..6dee96f5f9 100644 --- a/sdk/python/feast/registry_server.py +++ b/sdk/python/feast/registry_server.py @@ -36,14 +36,18 @@ def __init__(self, registry: BaseRegistry) -> None: self.proxied_registry = registry def ApplyEntity(self, request: RegistryServer_pb2.ApplyEntityRequest, context): - assert_permissions( - resource=self.proxied_registry.apply_entity( - entity=Entity.from_proto(request.entity), - project=request.project, - commit=request.commit, + self.proxied_registry.apply_entity( + entity=cast( + Entity, + assert_permissions( + resource=Entity.from_proto(request.entity), + actions=CRUD, + ), ), - actions=CRUD, + project=request.project, + commit=request.commit, ) + return Empty() def GetEntity(self, request: RegistryServer_pb2.GetEntityRequest, context): @@ -90,14 +94,20 @@ def DeleteEntity(self, request: RegistryServer_pb2.DeleteEntityRequest, context) def ApplyDataSource( self, request: RegistryServer_pb2.ApplyDataSourceRequest, context ): - assert_permissions( - resource=self.proxied_registry.apply_data_source( - data_source=DataSource.from_proto(request.data_source), + ( + self.proxied_registry.apply_data_source( + data_source=cast( + DataSource, + assert_permissions( + resource=DataSource.from_proto(request.data_source), + actions=CRUD, + ), + ), project=request.project, commit=request.commit, ), - actions=CRUD, ) + return Empty() def GetDataSource(self, request: RegistryServer_pb2.GetDataSourceRequest, context): @@ -171,14 +181,17 @@ def ApplyFeatureView( elif feature_view_type == "stream_feature_view": feature_view = StreamFeatureView.from_proto(request.stream_feature_view) - assert_permissions( - resource=self.proxied_registry.apply_feature_view( - feature_view=feature_view, + ( + self.proxied_registry.apply_feature_view( + feature_view=cast( + FeatureView, + assert_permissions(resource=feature_view, actions=CRUD), + ), project=request.project, commit=request.commit, ), - actions=CRUD, ) + return Empty() def ListFeatureViews( @@ -291,13 +304,16 @@ def ListOnDemandFeatureViews( def ApplyFeatureService( self, request: RegistryServer_pb2.ApplyFeatureServiceRequest, context ): - assert_permissions( - resource=self.proxied_registry.apply_feature_service( - feature_service=FeatureService.from_proto(request.feature_service), - project=request.project, - commit=request.commit, + self.proxied_registry.apply_feature_service( + feature_service=cast( + FeatureService, + assert_permissions( + resource=FeatureService.from_proto(request.feature_service), + actions=CRUD, + ), ), - actions=CRUD, + project=request.project, + commit=request.commit, ) return Empty() @@ -354,13 +370,18 @@ def DeleteFeatureService( def ApplySavedDataset( self, request: RegistryServer_pb2.ApplySavedDatasetRequest, context ): - assert_permissions( - resource=self.proxied_registry.apply_saved_dataset( - saved_dataset=SavedDataset.from_proto(request.saved_dataset), + ( + self.proxied_registry.apply_saved_dataset( + saved_dataset=cast( + SavedDataset, + assert_permissions( + resource=SavedDataset.from_proto(request.saved_dataset), + actions=CRUD, + ), + ), project=request.project, commit=request.commit, ), - actions=CRUD, ) return Empty() @@ -415,15 +436,16 @@ def DeleteSavedDataset( def ApplyValidationReference( self, request: RegistryServer_pb2.ApplyValidationReferenceRequest, context ): - assert_permissions( - resource=self.proxied_registry.apply_validation_reference( - validation_reference=ValidationReference.from_proto( - request.validation_reference + self.proxied_registry.apply_validation_reference( + validation_reference=cast( + ValidationReference, + assert_permissions( + ValidationReference.from_proto(request.validation_reference), + actions=CRUD, ), - project=request.project, - commit=request.commit, ), - actions=CRUD, + project=request.project, + commit=request.commit, ) return Empty() @@ -524,13 +546,15 @@ def GetInfra(self, request: RegistryServer_pb2.GetInfraRequest, context): def ApplyPermission( self, request: RegistryServer_pb2.ApplyPermissionRequest, context ): - assert_permissions( - self.proxied_registry.apply_permission( - permission=Permission.from_proto(request.permission), - project=request.project, - commit=request.commit, + self.proxied_registry.apply_permission( + permission=cast( + Permission, + assert_permissions( + Permission.from_proto(request.permission), actions=CRUD + ), ), - actions=CRUD, + project=request.project, + commit=request.commit, ) return Empty() From 4922b8b122d6940e105bd75965245ddf1240e5c8 Mon Sep 17 00:00:00 2001 From: Abdul Hameed Date: Wed, 14 Aug 2024 10:46:26 -0400 Subject: [PATCH 154/169] removed the examples Signed-off-by: Abdul Hameed --- examples/rbac-local/01.1-start-keycloak.ipynb | 95 -- examples/rbac-local/01.2-setup-keycloak.ipynb | 439 ------- examples/rbac-local/01.3-setup-feast.ipynb | 1069 ----------------- examples/rbac-local/02-registry_server.ipynb | 370 ------ examples/rbac-local/03-online_server.ipynb | 126 -- examples/rbac-local/04-offline_server.ipynb | 263 ---- examples/rbac-local/README.md | 57 - examples/rbac-local/client.ipynb | 837 ------------- examples/rbac-local/client/feature_store.yaml | 21 - examples/rbac/README.md | 169 --- examples/rbac/__init__.py | 0 examples/rbac/admin_output.png | Bin 206275 -> 0 bytes examples/rbac/cleanup_feast.sh | 22 - .../rbac/client/admin_user_resources.yaml | 64 - .../client/feature_repo/feature_store.yaml | 14 - examples/rbac/client/feature_repo/test.py | 140 --- .../rbac/client/readonly_user_resources.yaml | 65 - .../client/unauthorized_user_resources.yaml | 44 - examples/rbac/demo.jpg | Bin 111840 -> 0 bytes examples/rbac/deployment.png | Bin 98226 -> 0 bytes examples/rbac/install_feast.sh | 73 -- examples/rbac/permission1.png | Bin 535376 -> 0 bytes examples/rbac/permission3.png | Bin 194266 -> 0 bytes examples/rbac/permissions2.png | Bin 91831 -> 0 bytes examples/rbac/server/__init__.py | 0 examples/rbac/server/feature_repo/__init__.py | 0 .../rbac/server/feature_repo/example_repo.py | 131 -- .../server/feature_repo/feature_store.yaml | 26 - .../server/feature_repo/permissions_apply.py | 27 - .../rbac/server/feature_store_offline.yaml | 16 - .../rbac/server/feature_store_online.yaml | 20 - .../rbac/server/feature_store_registry.yaml | 12 - examples/rbac/server/server_resources.yaml | 27 - examples/rbac/unauthorized-user.png | Bin 223108 -> 0 bytes examples/rbac/user_output.png | Bin 202585 -> 0 bytes .../feature_repo/data/driver_stats.parquet | Bin 35105 -> 35102 bytes .../feature_repo/data/online_store.db | Bin 28672 -> 28672 bytes .../feature_repo/example_repo.py | 6 +- .../templates/deployment.yaml | 1 - infra/charts/feast-feature-server/values.yaml | 3 - 40 files changed, 1 insertion(+), 4136 deletions(-) delete mode 100644 examples/rbac-local/01.1-start-keycloak.ipynb delete mode 100644 examples/rbac-local/01.2-setup-keycloak.ipynb delete mode 100644 examples/rbac-local/01.3-setup-feast.ipynb delete mode 100644 examples/rbac-local/02-registry_server.ipynb delete mode 100644 examples/rbac-local/03-online_server.ipynb delete mode 100644 examples/rbac-local/04-offline_server.ipynb delete mode 100644 examples/rbac-local/README.md delete mode 100644 examples/rbac-local/client.ipynb delete mode 100644 examples/rbac-local/client/feature_store.yaml delete mode 100644 examples/rbac/README.md delete mode 100644 examples/rbac/__init__.py delete mode 100644 examples/rbac/admin_output.png delete mode 100755 examples/rbac/cleanup_feast.sh delete mode 100644 examples/rbac/client/admin_user_resources.yaml delete mode 100644 examples/rbac/client/feature_repo/feature_store.yaml delete mode 100644 examples/rbac/client/feature_repo/test.py delete mode 100644 examples/rbac/client/readonly_user_resources.yaml delete mode 100644 examples/rbac/client/unauthorized_user_resources.yaml delete mode 100644 examples/rbac/demo.jpg delete mode 100644 examples/rbac/deployment.png delete mode 100755 examples/rbac/install_feast.sh delete mode 100644 examples/rbac/permission1.png delete mode 100644 examples/rbac/permission3.png delete mode 100644 examples/rbac/permissions2.png delete mode 100644 examples/rbac/server/__init__.py delete mode 100644 examples/rbac/server/feature_repo/__init__.py delete mode 100644 examples/rbac/server/feature_repo/example_repo.py delete mode 100644 examples/rbac/server/feature_repo/feature_store.yaml delete mode 100644 examples/rbac/server/feature_repo/permissions_apply.py delete mode 100644 examples/rbac/server/feature_store_offline.yaml delete mode 100644 examples/rbac/server/feature_store_online.yaml delete mode 100644 examples/rbac/server/feature_store_registry.yaml delete mode 100644 examples/rbac/server/server_resources.yaml delete mode 100644 examples/rbac/unauthorized-user.png delete mode 100644 examples/rbac/user_output.png diff --git a/examples/rbac-local/01.1-start-keycloak.ipynb b/examples/rbac-local/01.1-start-keycloak.ipynb deleted file mode 100644 index 51167dcf46..0000000000 --- a/examples/rbac-local/01.1-start-keycloak.ipynb +++ /dev/null @@ -1,95 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "e46a65b1-7cf0-4cc2-8aca-529d659630a4", - "metadata": {}, - "source": [ - "# Start Keycloak server" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "374e8693-7e47-4985-b7f6-a9b818b0b4d0", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Updating the configuration and installing your custom providers, if any. Please wait.\n", - "2024-08-08 15:11:17,793 WARN [io.qua.dep.ind.IndexWrapper] (build-129) Failed to index jakarta.jms.Connection: Class does not exist in ClassLoader QuarkusClassLoader:Deployment Class Loader: PROD for keycloak@273c947f\n", - "2024-08-08 15:11:18,013 WARN [io.qua.dep.ind.IndexWrapper] (build-129) Failed to index io.mashona.logwriting.ArrayStore: Class does not exist in ClassLoader QuarkusClassLoader:Deployment Class Loader: PROD for keycloak@273c947f\n", - "2024-08-08 15:11:18,090 WARN [io.qua.dep.ind.IndexWrapper] (build-129) Failed to index org.apache.activemq.artemis.core.journal.RecordInfo: Class does not exist in ClassLoader QuarkusClassLoader:Deployment Class Loader: PROD for keycloak@273c947f\n", - "2024-08-08 15:11:18,097 WARN [io.qua.dep.ind.IndexWrapper] (build-129) Failed to index org.apache.activemq.artemis.core.journal.Journal: Class does not exist in ClassLoader QuarkusClassLoader:Deployment Class Loader: PROD for keycloak@273c947f\n", - "2024-08-08 15:11:18,272 WARN [io.qua.dep.ind.IndexWrapper] (build-129) Failed to index jakarta.jms.XAConnection: Class does not exist in ClassLoader QuarkusClassLoader:Deployment Class Loader: PROD for keycloak@273c947f\n", - "2024-08-08 15:11:18,289 WARN [io.qua.dep.ind.IndexWrapper] (build-129) Failed to index jakarta.jms.XASession: Class does not exist in ClassLoader QuarkusClassLoader:Deployment Class Loader: PROD for keycloak@273c947f\n", - "2024-08-08 15:11:18,298 WARN [io.qua.dep.ind.IndexWrapper] (build-129) Failed to index jakarta.jms.XAConnectionFactory: Class does not exist in ClassLoader QuarkusClassLoader:Deployment Class Loader: PROD for keycloak@273c947f\n", - "2024-08-08 15:11:18,514 WARN [io.qua.dep.ind.IndexWrapper] (build-129) Failed to index org.apache.tools.ant.Task: Class does not exist in ClassLoader QuarkusClassLoader:Deployment Class Loader: PROD for keycloak@273c947f\n", - "2024-08-08 15:11:19,217 WARN [io.qua.dep.ind.IndexWrapper] (build-129) Failed to index org.springframework.core.io.DefaultResourceLoader: Class does not exist in ClassLoader QuarkusClassLoader:Deployment Class Loader: PROD for keycloak@273c947f\n", - "2024-08-08 15:11:19,227 WARN [io.qua.dep.ind.IndexWrapper] (build-129) Failed to index org.springframework.core.io.ResourceLoader: Class does not exist in ClassLoader QuarkusClassLoader:Deployment Class Loader: PROD for keycloak@273c947f\n", - "2024-08-08 15:11:19,252 WARN [io.qua.dep.ind.IndexWrapper] (build-129) Failed to index org.springframework.core.io.Resource: Class does not exist in ClassLoader QuarkusClassLoader:Deployment Class Loader: PROD for keycloak@273c947f\n", - "2024-08-08 15:12:54,690 INFO [io.qua.dep.QuarkusAugmentor] (main) Quarkus augmentation completed in 256049ms\n", - "2024-08-08 15:13:43,822 WARN [org.infinispan.CONFIG] (keycloak-cache-init) ISPN000569: Unable to persist Infinispan internal caches as no global state enabled\n", - "2024-08-08 15:13:45,998 INFO [org.infinispan.CONTAINER] (keycloak-cache-init) ISPN000556: Starting user marshaller 'org.infinispan.jboss.marshalling.core.JBossUserMarshaller'\n", - "2024-08-08 15:13:48,154 INFO [org.keycloak.quarkus.runtime.hostname.DefaultHostnameProvider] (main) Hostname settings: Base URL: , Hostname: , Strict HTTPS: false, Path: , Strict BackChannel: false, Admin URL: , Admin: , Port: -1, Proxied: false\n", - "2024-08-08 15:14:19,526 WARN [io.quarkus.agroal.runtime.DataSources] (JPA Startup Thread) Datasource enables XA but transaction recovery is not enabled. Please enable transaction recovery by setting quarkus.transaction-manager.enable-recovery=true, otherwise data may be lost if the application is terminated abruptly\n", - "2024-08-08 15:14:31,108 INFO [org.keycloak.broker.provider.AbstractIdentityProviderMapper] (main) Registering class org.keycloak.broker.provider.mappersync.ConfigSyncEventListener\n", - "2024-08-08 15:14:31,306 INFO [org.keycloak.connections.infinispan.DefaultInfinispanConnectionProviderFactory] (main) Node name: node_864586, Site name: null\n", - "2024-08-08 15:14:45,216 INFO [org.keycloak.quarkus.runtime.storage.legacy.liquibase.QuarkusJpaUpdaterProvider] (main) Initializing database schema. Using changelog META-INF/jpa-changelog-master.xml\n", - "\n", - "UPDATE SUMMARY\n", - "Run: 124\n", - "Previously run: 0\n", - "Filtered out: 0\n", - "-------------------------------\n", - "Total change sets: 124\n", - "\n", - "2024-08-08 15:15:26,602 INFO [org.keycloak.services] (main) KC-SERVICES0050: Initializing master realm\n", - "2024-08-08 15:15:39,561 INFO [org.keycloak.services] (main) KC-SERVICES0009: Added user 'admin' to realm 'master'\n", - "2024-08-08 15:15:40,191 INFO [io.quarkus] (main) Keycloak 24.0.4 on JVM (powered by Quarkus 3.8.4) started in 162.787s. Listening on: http://0.0.0.0:8080\n", - "2024-08-08 15:15:40,196 INFO [io.quarkus] (main) Profile dev activated. \n", - "2024-08-08 15:15:40,198 INFO [io.quarkus] (main) Installed features: [agroal, cdi, hibernate-orm, jdbc-h2, keycloak, logging-gelf, narayana-jta, reactive-routes, resteasy-reactive, resteasy-reactive-jackson, smallrye-context-propagation, vertx]\n", - "2024-08-08 15:15:40,226 WARN [org.keycloak.quarkus.runtime.KeycloakMain] (main) Running the server in development mode. DO NOT use this configuration in production.\n", - "^C\n" - ] - } - ], - "source": [ - "!docker run --rm -p 9999:8080 --name my-keycloak \\\n", - "-e KEYCLOAK_ADMIN=admin -e KEYCLOAK_ADMIN_PASSWORD=admin \\\n", - "quay.io/keycloak/keycloak:24.0.4 start-dev" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d2d1e035-85b3-4d77-abb3-13af5e31ef37", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.9" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/examples/rbac-local/01.2-setup-keycloak.ipynb b/examples/rbac-local/01.2-setup-keycloak.ipynb deleted file mode 100644 index db2eb6768d..0000000000 --- a/examples/rbac-local/01.2-setup-keycloak.ipynb +++ /dev/null @@ -1,439 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "e8952066-7a10-4c9b-a4b7-27be074ae269", - "metadata": {}, - "source": [ - "## Create Keycloak resources" - ] - }, - { - "cell_type": "markdown", - "id": "7252812d-90eb-4752-91a7-d46b400bacd8", - "metadata": {}, - "source": [ - "Wait until Keycloak is running" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "e5d13f76-f184-44f6-8542-54a61060e531", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[1;39m{\n", - " \u001b[0m\u001b[1;34m\"Status\"\u001b[0m\u001b[1;39m: \u001b[0m\u001b[0;32m\"running\"\u001b[0m\u001b[1;39m,\n", - " \u001b[0m\u001b[1;34m\"Running\"\u001b[0m\u001b[1;39m: \u001b[0m\u001b[0;39mtrue\u001b[0m\u001b[1;39m,\n", - " \u001b[0m\u001b[1;34m\"Paused\"\u001b[0m\u001b[1;39m: \u001b[0m\u001b[0;39mfalse\u001b[0m\u001b[1;39m,\n", - " \u001b[0m\u001b[1;34m\"Restarting\"\u001b[0m\u001b[1;39m: \u001b[0m\u001b[0;39mfalse\u001b[0m\u001b[1;39m,\n", - " \u001b[0m\u001b[1;34m\"OOMKilled\"\u001b[0m\u001b[1;39m: \u001b[0m\u001b[0;39mfalse\u001b[0m\u001b[1;39m,\n", - " \u001b[0m\u001b[1;34m\"Dead\"\u001b[0m\u001b[1;39m: \u001b[0m\u001b[0;39mfalse\u001b[0m\u001b[1;39m,\n", - " \u001b[0m\u001b[1;34m\"Pid\"\u001b[0m\u001b[1;39m: \u001b[0m\u001b[0;39m8917\u001b[0m\u001b[1;39m,\n", - " \u001b[0m\u001b[1;34m\"ExitCode\"\u001b[0m\u001b[1;39m: \u001b[0m\u001b[0;39m0\u001b[0m\u001b[1;39m,\n", - " \u001b[0m\u001b[1;34m\"Error\"\u001b[0m\u001b[1;39m: \u001b[0m\u001b[0;32m\"\"\u001b[0m\u001b[1;39m,\n", - " \u001b[0m\u001b[1;34m\"StartedAt\"\u001b[0m\u001b[1;39m: \u001b[0m\u001b[0;32m\"2024-08-08T15:07:40.162311318Z\"\u001b[0m\u001b[1;39m,\n", - " \u001b[0m\u001b[1;34m\"FinishedAt\"\u001b[0m\u001b[1;39m: \u001b[0m\u001b[0;32m\"0001-01-01T00:00:00Z\"\u001b[0m\u001b[1;39m\n", - "\u001b[1;39m}\u001b[0m\n" - ] - } - ], - "source": [ - "!docker inspect --format='json' my-keycloak | yq '.[0].State'" - ] - }, - { - "cell_type": "markdown", - "id": "cc9a6329-4e89-464c-ac48-dbbadaf72a2b", - "metadata": {}, - "source": [ - "Then create a sample realm and client with some roles and users matching the test environment." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "d5c60591-f41d-4a5e-9b18-93385a889495", - "metadata": {}, - "outputs": [], - "source": [ - "import requests\n", - "import json\n", - "from dotenv import set_key\n", - "\n", - "OIDC_SERVER_URL = \"http://0.0.0.0:9999\"\n", - "ADMIN_USERNAME = \"admin\"\n", - "ADMIN_PASSWORD = \"admin\"\n", - "\n", - "access_token: str = \"\"" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "d16969bc-423a-4d18-afa3-97a791b84b13", - "metadata": {}, - "outputs": [], - "source": [ - "def get_token():\n", - " token_url = f\"{OIDC_SERVER_URL}/realms/master/protocol/openid-connect/token\"\n", - "\n", - " token_data = {\n", - " \"grant_type\": \"password\",\n", - " \"client_id\": \"admin-cli\",\n", - " \"username\": ADMIN_USERNAME,\n", - " \"password\": ADMIN_PASSWORD,\n", - " }\n", - "\n", - " token_response = requests.post(token_url, data=token_data)\n", - " if token_response.status_code == 200:\n", - " global access_token\n", - " access_token = token_response.json()[\"access_token\"]\n", - " return access_token\n", - " else:\n", - " print(\n", - " f\"Failed to obtain access token: {token_response.status_code} - {token_response.text}\"\n", - " )\n", - " raise Exception(\"Not authenticated\")\n", - "\n", - "\n", - "def keycloak_post(endpoint, data=None):\n", - " url = f\"{OIDC_SERVER_URL}/admin/{endpoint}\"\n", - " print(f\"Creating {endpoint}\")\n", - " global access_token\n", - " headers = {\n", - " \"Content-Type\": \"application/json\",\n", - " \"Authorization\": f\"Bearer {access_token}\",\n", - " }\n", - " response = requests.request(\"POST\", url, headers=headers, data=json.dumps(data))\n", - " print(f\"POST response.status_code is {response.status_code}\")\n", - " return response.status_code\n", - "\n", - "\n", - "def keycloak_get(endpoint):\n", - " url = f\"{OIDC_SERVER_URL}/admin/{endpoint}\"\n", - " global access_token\n", - " headers = {\n", - " \"Content-Type\": \"application/json\",\n", - " \"Authorization\": f\"Bearer {access_token}\",\n", - " }\n", - " response = requests.request(\"GET\", url, headers=headers)\n", - " print(f\"GET response.status_code is {response.status_code}\")\n", - " return response.json()\n", - "\n", - "\n", - "def create_realm(realm_name):\n", - " data = {\"realm\": realm_name, \"enabled\": \"true\"}\n", - " keycloak_post(\"realms\", data=data)\n", - " response = keycloak_get(f\"realms/{realm_name}\")\n", - " return response[\"id\"]\n", - "\n", - "\n", - "def create_client(realm_name, client_name):\n", - " data = {\n", - " \"clientId\": client_name,\n", - " \"enabled\": \"true\",\n", - " \"redirectUris\": [\n", - " \"http://localhost:8000/*\",\n", - " \"http://127.0.0.1:8000/*\",\n", - " \"http://0.0.0.0:8000/*\",\n", - " ],\n", - " \"publicClient\": False,\n", - " \"authorizationServicesEnabled\": True,\n", - " \"protocol\": \"openid-connect\",\n", - " \"standardFlowEnabled\": True,\n", - " \"directAccessGrantsEnabled\": True,\n", - " \"serviceAccountsEnabled\": True,\n", - " }\n", - " keycloak_post(f\"realms/{realm_name}/clients\", data=data)\n", - " response = keycloak_get(f\"realms/{realm_name}/clients\")\n", - " client = None\n", - " for c in response:\n", - " if c[\"clientId\"] == client_name:\n", - " client = c\n", - " break\n", - " client_id = client[\"id\"]\n", - " client_secret = client[\"secret\"]\n", - " return client_id, client_secret\n", - "\n", - "\n", - "def create_client_roles(realm_name, client_id, roles):\n", - " for role_name in roles:\n", - " data = {\"name\": role_name, \"clientRole\": True}\n", - " keycloak_post(f\"realms/{realm_name}/clients/{client_id}/roles\", data=data)\n", - "\n", - " response = keycloak_get(f\"realms/{realm_name}/clients/{client_id}/roles\")\n", - " roles_by_name = dict((role[\"name\"], role[\"id\"]) for role in response)\n", - " print(roles_by_name)\n", - " return roles_by_name\n", - "\n", - "\n", - "def create_user_with_roles(\n", - " realm_name, username, password, client_id, roles_by_name, roles\n", - "):\n", - " data = {\n", - " \"username\": username,\n", - " \"enabled\": True,\n", - " \"email\": f\"{username}@poc.com\",\n", - " \"emailVerified\": True,\n", - " \"firstName\": \"user\",\n", - " \"lastName\": f\"{username}\",\n", - " \"credentials\": [{\"type\": \"password\", \"value\": password}],\n", - " \"realmRoles\": [],\n", - " }\n", - " keycloak_post(f\"realms/{realm_name}/users\", data=data)\n", - " response = keycloak_get(f\"realms/{realm_name}/users\")\n", - " user = None\n", - " for u in response:\n", - " if u[\"username\"] == username:\n", - " user = u\n", - " break\n", - " user_id = user[\"id\"]\n", - "\n", - " data = [\n", - " {\n", - " \"id\": roles_by_name[role_name],\n", - " \"name\": role_name,\n", - " }\n", - " for role_name in roles\n", - " ]\n", - " keycloak_post(\n", - " f\"realms/{realm_name}/users/{user_id}/role-mappings/clients/{client_id}\",\n", - " data=data,\n", - " )" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "e097fac1-f2c3-4afe-b78c-2c8279e3a84e", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICIweUNoR2N3ZG1ZNXRSNkJ5MGtVQjRmZDVPZTVqM2JLak5pX2hKUmc2ejdFIn0.eyJleHAiOjE3MjMxMzAyNTgsImlhdCI6MTcyMzEzMDE5OCwianRpIjoiNGNkOWRmMTQtZTYzYy00YTFiLTg1ODQtMGE4OGZkYTFiOGI2IiwiaXNzIjoiaHR0cDovLzAuMC4wLjA6OTk5OS9yZWFsbXMvbWFzdGVyIiwic3ViIjoiOTAyM2FjMTEtZWI0Yi00YjlkLTk2MDItNWJlMWRkMGU0NzRjIiwidHlwIjoiQmVhcmVyIiwiYXpwIjoiYWRtaW4tY2xpIiwic2Vzc2lvbl9zdGF0ZSI6ImNhYzg5YjAxLTMxOTYtNDMzZi1iMGJiLTBmZGY3MDUyNmZmNiIsImFjciI6IjEiLCJzY29wZSI6InByb2ZpbGUgZW1haWwiLCJzaWQiOiJjYWM4OWIwMS0zMTk2LTQzM2YtYjBiYi0wZmRmNzA1MjZmZjYiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsInByZWZlcnJlZF91c2VybmFtZSI6ImFkbWluIn0.xrLurTh9eiU4Kyqk6EGER5qaf9MPDJFT34xkUMYbl2ZmzUz8VnKSsJtFlkPSSgMhAprecjlPWLrKqRdAK35YKnXBFUBxEznCTa6fykdHh_3tuTbwt3vtLRxAogTDghnVsRL3VK295jnclUgQzaJUIoFGXgapfxihfn6em6PqBaYWEcKlbd0lhNA_BmAe-XFOnz2o6kUd0TGKCD43plhhL0QfpHmiJ509rqGkuywTgo5WTXFP52Zc6v9b3eReSNXefyuMtZA9gsyCxzhFl1azZh8CPe6UuadcTd1O0d4mbIRiIu2aUrjlplkFrB1KMSGSBD1MaS88PibetMth6P5xgg'" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "get_token()" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "f114fa41-8cea-486f-baf4-998cbf69fea4", - "metadata": {}, - "outputs": [], - "source": [ - "realm_name = \"rbac_example\"\n", - "client_name = \"app\"\n", - "password = \"password\"" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "0f889548-9b60-448b-beed-ac3fc1890b13", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Creating realms\n", - "POST response.status_code is 201\n", - "GET response.status_code is 200\n", - "Creating realms/rbac_example/clients\n", - "POST response.status_code is 201\n", - "GET response.status_code is 200\n", - "Creating realms/rbac_example/clients/1fcdfed3-9b28-421f-883d-cde6b000c26d/roles\n", - "POST response.status_code is 201\n", - "Creating realms/rbac_example/clients/1fcdfed3-9b28-421f-883d-cde6b000c26d/roles\n", - "POST response.status_code is 201\n", - "Creating realms/rbac_example/clients/1fcdfed3-9b28-421f-883d-cde6b000c26d/roles\n", - "POST response.status_code is 201\n", - "Creating realms/rbac_example/clients/1fcdfed3-9b28-421f-883d-cde6b000c26d/roles\n", - "POST response.status_code is 201\n", - "GET response.status_code is 200\n", - "{'fresh_writer': '1d2cdaa5-efd7-471f-9b10-b68de2f11cd1', 'reader': '856f4a68-687a-4319-9441-588a6c18fb13', 'batch_admin': '42b414ab-4e43-4b3e-83a0-011393f2952a', 'store_admin': '9ad09a29-0493-47f5-83ad-5de081025c04', 'uma_protection': '0752be64-28bb-430e-8d3c-38ad0c8b1d1b'}\n" - ] - } - ], - "source": [ - "realm_id = create_realm(realm_name)\n", - "client_id, client_secret = create_client(realm_name, client_name)\n", - "\n", - "roles_by_name = create_client_roles(\n", - " realm_name, client_id, [\"reader\", \"fresh_writer\", \"store_admin\", \"batch_admin\"]\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "a3430d83-107d-44ad-acf2-0df810dff0ff", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Creating realms/rbac_example/users\n", - "POST response.status_code is 201\n", - "GET response.status_code is 200\n", - "Creating realms/rbac_example/users/345ce240-c1d6-4df7-8f86-f6717a24ae19/role-mappings/clients/1fcdfed3-9b28-421f-883d-cde6b000c26d\n", - "POST response.status_code is 204\n", - "Creating realms/rbac_example/users\n", - "POST response.status_code is 201\n", - "GET response.status_code is 200\n", - "Creating realms/rbac_example/users/34a9dd95-8504-41f4-89f5-e243a9581f55/role-mappings/clients/1fcdfed3-9b28-421f-883d-cde6b000c26d\n", - "POST response.status_code is 204\n", - "Creating realms/rbac_example/users\n", - "POST response.status_code is 201\n", - "GET response.status_code is 200\n", - "Creating realms/rbac_example/users/2b57245d-7cdf-4fef-b455-b1f1551c0bf3/role-mappings/clients/1fcdfed3-9b28-421f-883d-cde6b000c26d\n", - "POST response.status_code is 204\n", - "Creating realms/rbac_example/users\n", - "POST response.status_code is 201\n", - "GET response.status_code is 200\n", - "Creating realms/rbac_example/users/c01fd547-036f-4efa-896c-9e8f3cf1f31e/role-mappings/clients/1fcdfed3-9b28-421f-883d-cde6b000c26d\n", - "POST response.status_code is 204\n" - ] - } - ], - "source": [ - "create_user_with_roles(\n", - " realm_name, \"reader\", password, client_id, roles_by_name, [\"reader\"]\n", - ")\n", - "create_user_with_roles(\n", - " realm_name,\n", - " \"writer\",\n", - " password,\n", - " client_id,\n", - " roles_by_name,\n", - " [\"fresh_writer\"],\n", - ")\n", - "create_user_with_roles(\n", - " realm_name,\n", - " \"batch_admin\",\n", - " password,\n", - " client_id,\n", - " roles_by_name,\n", - " [\"batch_admin\"],\n", - ")\n", - "create_user_with_roles(\n", - " realm_name,\n", - " \"admin\",\n", - " password,\n", - " client_id,\n", - " roles_by_name,\n", - " [\"store_admin\"],\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "54317f9e-476b-4b8e-864a-a07c54b549f4", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Realm rbac_example setup completed.\n", - "Client app created with ID 1fcdfed3-9b28-421f-883d-cde6b000c26d and secret eFGTp6ZJ0tARKYPbdMKUZ1J8PJNWfXR8\n", - "Settings configured in .env\n" - ] - } - ], - "source": [ - "print(f\"Realm {realm_name} setup completed.\")\n", - "print(\n", - " f\"Client {client_name} created with ID {client_id} and secret {client_secret}\"\n", - ")\n", - "\n", - "env_file = \".env\"\n", - "with open(env_file, \"w\") as file:\n", - " pass\n", - "\n", - "# Write property P=1 to the .env file\n", - "set_key(env_file, \"OIDC_SERVER_URL\", OIDC_SERVER_URL)\n", - "set_key(env_file, \"REALM\", realm_name)\n", - "set_key(env_file, \"CLIENT_ID\", client_name)\n", - "set_key(env_file, \"CLIENT_SECRET\", client_secret)\n", - "set_key(env_file, \"PASSWORD\", password)\n", - "print(f\"Settings configured in {env_file}\")" - ] - }, - { - "cell_type": "markdown", - "id": "35dcd5ed-4004-4570-965f-0f68668605d8", - "metadata": {}, - "source": [ - "The [.env](.env) file contains the settings of the created realm, including the client secret to be used to connect the server." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "46a1e2c7-e379-461d-b0bf-82354378e830", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "OIDC_SERVER_URL='http://0.0.0.0:9999'\n", - "REALM='rbac_example'\n", - "CLIENT_ID='app'\n", - "CLIENT_SECRET='eFGTp6ZJ0tARKYPbdMKUZ1J8PJNWfXR8'\n", - "PASSWORD='password'\n" - ] - } - ], - "source": [ - "!cat .env" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d035826b-64d6-47cc-a48e-26eb29b31fc7", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.9" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/examples/rbac-local/01.3-setup-feast.ipynb b/examples/rbac-local/01.3-setup-feast.ipynb deleted file mode 100644 index 7395c28442..0000000000 --- a/examples/rbac-local/01.3-setup-feast.ipynb +++ /dev/null @@ -1,1069 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "a7b2570a-bdf1-477a-8799-0aefe81a0e28", - "metadata": {}, - "source": [ - "## Setup Feast\n", - "Create a sample `rbac` project with local storage." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "74c1ee91-1816-4338-aabf-7851b655b061", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Creating a new Feast repository in \u001b[1m\u001b[32m/Users/dmartino/projects/mlops/feast/rh-feast/examples/rbac-local/rbac\u001b[0m.\n", - "\n" - ] - } - ], - "source": [ - "!rm -rf rbac\n", - "!feast init rbac" - ] - }, - { - "cell_type": "markdown", - "id": "e3215797-198a-49af-a241-7e0117634897", - "metadata": {}, - "source": [ - "Update the `feature_store.yaml` with an `auth` section derived from the Keycloak setup file [.env](.env)" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "id": "a09d2198-9e3a-48f6-8c9d-72d62d20cd57", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "OIDC_SERVER_URL='http://0.0.0.0:9999'\n", - "REALM='rbac_example'\n", - "CLIENT_ID='app'\n", - "CLIENT_SECRET='eFGTp6ZJ0tARKYPbdMKUZ1J8PJNWfXR8'\n", - "PASSWORD='password'\n" - ] - } - ], - "source": [ - "!cat .env" - ] - }, - { - "cell_type": "markdown", - "id": "6cd89872-a6c6-4be0-a6e3-8fd60d448b7b", - "metadata": {}, - "source": [ - "### Update the server YAML\n", - "Update the server YAML to use OIDC authorization" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "e16d5a44-ab0c-4ca8-8491-e7d9073469f8", - "metadata": {}, - "outputs": [], - "source": [ - "from dotenv import load_dotenv\n", - "import os\n", - "import yaml\n", - "\n", - "def load_config_file(path):\n", - " load_dotenv()\n", - "\n", - " with open(path, 'r') as file:\n", - " config = yaml.safe_load(file) or {}\n", - " return config" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "cd30523b-4e1c-4d56-9c72-84aacb46b29d", - "metadata": {}, - "outputs": [], - "source": [ - "def update_config_with_auth(config):\n", - " config['auth']['type']='oidc'\n", - " config['auth']['auth_server_url']=os.getenv('OIDC_SERVER_URL')\n", - " config['auth']['auth_discovery_url']=f\"{os.getenv('OIDC_SERVER_URL')}/realms/{os.getenv('REALM')}/.well-known/openid-configuration\"\n", - " config['auth']['client_id']=os.getenv('CLIENT_ID')\n", - " config['auth']['client_secret']=os.getenv('CLIENT_SECRET')\n", - " config['auth']['realm']=os.getenv('REALM')\n", - " config['auth']['username']=''\n", - " config['auth']['password']='password'" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "1631a8c8-f635-4970-8653-06c147b1c128", - "metadata": {}, - "outputs": [], - "source": [ - "def update_config_file(path):\n", - " with open(path, 'w') as file:\n", - " yaml.safe_dump(config, file, default_flow_style=False)" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "78898d46-1185-4528-8f08-b137dd49246a", - "metadata": {}, - "outputs": [], - "source": [ - "config = load_config_file('rbac/feature_repo/feature_store.yaml')\n", - "update_config_with_auth(config)\n", - "update_config_file('rbac/feature_repo/feature_store.yaml')" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "e2437286-2907-4818-87ad-a2293f21311e", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "auth:\n", - " auth_discovery_url: http://0.0.0.0:9999/realms/rbac_example/.well-known/openid-configuration\n", - " auth_server_url: http://0.0.0.0:9999\n", - " client_id: app\n", - " client_secret: eFGTp6ZJ0tARKYPbdMKUZ1J8PJNWfXR8\n", - " password: password\n", - " realm: rbac_example\n", - " type: oidc\n", - " username: ''\n", - "entity_key_serialization_version: 2\n", - "online_store:\n", - " path: data/online_store.db\n", - " type: sqlite\n", - "project: rbac\n", - "provider: local\n", - "registry: data/registry.db\n" - ] - } - ], - "source": [ - "!cat rbac/feature_repo/feature_store.yaml" - ] - }, - { - "cell_type": "markdown", - "id": "fa715453-8c41-4f57-8cf2-c96f6a211cde", - "metadata": {}, - "source": [ - "### Update the client YAML\n", - "Update the client YAML to use OIDC authorization" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "886a558a-1746-44fa-9e38-0e381b3b3deb", - "metadata": {}, - "outputs": [], - "source": [ - "config = load_config_file('client/feature_store.yaml')\n", - "update_config_with_auth(config)\n", - "update_config_file('client/feature_store.yaml')" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "267a72e4-443a-4b08-bd59-84d475a29e2a", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "auth:\n", - " auth_discovery_url: http://0.0.0.0:9999/realms/rbac_example/.well-known/openid-configuration\n", - " auth_server_url: http://0.0.0.0:9999\n", - " client_id: app\n", - " client_secret: eFGTp6ZJ0tARKYPbdMKUZ1J8PJNWfXR8\n", - " password: password\n", - " realm: rbac_example\n", - " type: oidc\n", - " username: ''\n", - "entity_key_serialization_version: 2\n", - "offline_store:\n", - " host: localhost\n", - " port: 8815\n", - " type: remote\n", - "online_store:\n", - " path: http://localhost:6566\n", - " type: remote\n", - "project: rbac\n", - "registry:\n", - " path: localhost:6570\n", - " registry_type: remote\n" - ] - } - ], - "source": [ - "!cat client/feature_store.yaml" - ] - }, - { - "cell_type": "markdown", - "id": "f71f5189-4423-4720-bbd2-fcb9b778a26b", - "metadata": {}, - "source": [ - "### Apply the configuration" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "e0c24e05-6e38-4ff1-9c39-73818fe41f18", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "/Users/dmartino/projects/mlops/feast/rh-feast/sdk/python/feast/feature_store.py:601: RuntimeWarning: On demand feature view is an experimental feature. This API is stable, but the functionality does not scale well for offline retrieval\n", - " warnings.warn(\n", - "Created entity \u001b[1m\u001b[32mdriver\u001b[0m\n", - "Created feature view \u001b[1m\u001b[32mdriver_hourly_stats\u001b[0m\n", - "Created feature view \u001b[1m\u001b[32mdriver_hourly_stats_fresh\u001b[0m\n", - "Created on demand feature view \u001b[1m\u001b[32mtransformed_conv_rate_fresh\u001b[0m\n", - "Created on demand feature view \u001b[1m\u001b[32mtransformed_conv_rate\u001b[0m\n", - "Created feature service \u001b[1m\u001b[32mdriver_activity_v2\u001b[0m\n", - "Created feature service \u001b[1m\u001b[32mdriver_activity_v1\u001b[0m\n", - "Created feature service \u001b[1m\u001b[32mdriver_activity_v3\u001b[0m\n", - "\n", - "Created sqlite table \u001b[1m\u001b[32mrbac_driver_hourly_stats_fresh\u001b[0m\n", - "Created sqlite table \u001b[1m\u001b[32mrbac_driver_hourly_stats\u001b[0m\n", - "\n" - ] - } - ], - "source": [ - "!feast -c rbac/feature_repo apply" - ] - }, - { - "cell_type": "markdown", - "id": "69b9857a-e32b-47ed-a120-57919ecb6b5d", - "metadata": {}, - "source": [ - "### Validate permissions" - ] - }, - { - "cell_type": "markdown", - "id": "867f565d-9740-4790-8d11-31001d920358", - "metadata": {}, - "source": [ - "There are no permissions after applying the example:" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "004f16bf-d125-4aec-b683-3e9653815a27", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "NAME TYPES WITH_SUBCLASS NAME_PATTERN ACTIONS ROLES\n" - ] - } - ], - "source": [ - "!feast -c rbac/feature_repo permissions list" - ] - }, - { - "cell_type": "markdown", - "id": "f2276488-39ec-4ae8-bb69-08dce7ad1bd4", - "metadata": {}, - "source": [ - "The `permissions check` command identifies the resources that have no permissions matching their type, name or tags." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "9fdd2660-c0f5-4dc9-a2da-d45751dcfa01", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "08/08/2024 05:20:22 PM root WARNING: _list_feature_views will make breaking changes. Please use _list_batch_feature_views instead. _list_feature_views will behave like _list_all_feature_views in the future.\n", - "\u001b[1m\u001b[31mThe following resources are not secured by any permission configuration:\u001b[0m\n", - "NAME TYPE\n", - "driver Entity\n", - "driver_hourly_stats FeatureView\n", - "driver_hourly_stats_fresh FeatureView\n", - "transformed_conv_rate_fresh OnDemandFeatureView\n", - "transformed_conv_rate OnDemandFeatureView\n", - "driver_hourly_stats FeatureView\n", - "driver_hourly_stats_fresh FeatureView\n", - "driver_activity_v2 FeatureService\n", - "driver_activity_v1 FeatureService\n", - "driver_activity_v3 FeatureService\n", - "driver_hourly_stats_source FileSource\n", - "vals_to_add RequestSource\n", - "driver_stats_push_source PushSource\n", - "\u001b[1m\u001b[31mThe following actions are not secured by any permission configuration (Note: this might not be a security concern, depending on the used APIs):\u001b[0m\n", - "NAME TYPE UNSECURED ACTIONS\n", - "driver Entity CREATE\n", - " READ\n", - " UPDATE\n", - " DELETE\n", - " QUERY_ONLINE\n", - " QUERY_OFFLINE\n", - " WRITE_ONLINE\n", - " WRITE_OFFLINE\n", - "driver_hourly_stats FeatureView CREATE\n", - " READ\n", - " UPDATE\n", - " DELETE\n", - " QUERY_ONLINE\n", - " QUERY_OFFLINE\n", - " WRITE_ONLINE\n", - " WRITE_OFFLINE\n", - "driver_hourly_stats_fresh FeatureView CREATE\n", - " READ\n", - " UPDATE\n", - " DELETE\n", - " QUERY_ONLINE\n", - " QUERY_OFFLINE\n", - " WRITE_ONLINE\n", - " WRITE_OFFLINE\n", - "transformed_conv_rate_fresh OnDemandFeatureView CREATE\n", - " READ\n", - " UPDATE\n", - " DELETE\n", - " QUERY_ONLINE\n", - " QUERY_OFFLINE\n", - " WRITE_ONLINE\n", - " WRITE_OFFLINE\n", - "transformed_conv_rate OnDemandFeatureView CREATE\n", - " READ\n", - " UPDATE\n", - " DELETE\n", - " QUERY_ONLINE\n", - " QUERY_OFFLINE\n", - " WRITE_ONLINE\n", - " WRITE_OFFLINE\n", - "driver_hourly_stats FeatureView CREATE\n", - " READ\n", - " UPDATE\n", - " DELETE\n", - " QUERY_ONLINE\n", - " QUERY_OFFLINE\n", - " WRITE_ONLINE\n", - " WRITE_OFFLINE\n", - "driver_hourly_stats_fresh FeatureView CREATE\n", - " READ\n", - " UPDATE\n", - " DELETE\n", - " QUERY_ONLINE\n", - " QUERY_OFFLINE\n", - " WRITE_ONLINE\n", - " WRITE_OFFLINE\n", - "driver_activity_v2 FeatureService CREATE\n", - " READ\n", - " UPDATE\n", - " DELETE\n", - " QUERY_ONLINE\n", - " QUERY_OFFLINE\n", - " WRITE_ONLINE\n", - " WRITE_OFFLINE\n", - "driver_activity_v1 FeatureService CREATE\n", - " READ\n", - " UPDATE\n", - " DELETE\n", - " QUERY_ONLINE\n", - " QUERY_OFFLINE\n", - " WRITE_ONLINE\n", - " WRITE_OFFLINE\n", - "driver_activity_v3 FeatureService CREATE\n", - " READ\n", - " UPDATE\n", - " DELETE\n", - " QUERY_ONLINE\n", - " QUERY_OFFLINE\n", - " WRITE_ONLINE\n", - " WRITE_OFFLINE\n", - "driver_hourly_stats_source FileSource CREATE\n", - " READ\n", - " UPDATE\n", - " DELETE\n", - " QUERY_ONLINE\n", - " QUERY_OFFLINE\n", - " WRITE_ONLINE\n", - " WRITE_OFFLINE\n", - "vals_to_add RequestSource CREATE\n", - " READ\n", - " UPDATE\n", - " DELETE\n", - " QUERY_ONLINE\n", - " QUERY_OFFLINE\n", - " WRITE_ONLINE\n", - " WRITE_OFFLINE\n", - "driver_stats_push_source PushSource CREATE\n", - " READ\n", - " UPDATE\n", - " DELETE\n", - " QUERY_ONLINE\n", - " QUERY_OFFLINE\n", - " WRITE_ONLINE\n", - " WRITE_OFFLINE\n" - ] - } - ], - "source": [ - "!feast -c rbac/feature_repo permissions check" - ] - }, - { - "cell_type": "markdown", - "id": "eb65649d-7ba7-494f-9e01-772842304ca1", - "metadata": {}, - "source": [ - "### Applying permissions\n", - "Let's create some Permissions to cover basic scenarios.\n", - "\n", - "First a simple permission to read the status of all the objects." - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "id": "3e910c5d-2f27-4f19-b324-c00347133da7", - "metadata": {}, - "outputs": [], - "source": [ - "from feast import FeatureStore\n", - "from feast.feast_object import ALL_RESOURCE_TYPES\n", - "from feast.permissions.action import CRUD, QUERY, AuthzedAction, ALL_ACTIONS\n", - "from feast.permissions.permission import Permission\n", - "from feast.permissions.policy import RoleBasedPolicy" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "id": "9e85bb35-cf12-4860-90d6-d1cd4830049c", - "metadata": {}, - "outputs": [], - "source": [ - "store = FeatureStore(\"rbac/feature_repo\")" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "id": "87cc7c4f-48af-4158-adee-b1ccd8a72ea7", - "metadata": {}, - "outputs": [], - "source": [ - "read_permission = Permission(\n", - " name=\"read_permission\",\n", - " types=ALL_RESOURCE_TYPES,\n", - " policy=RoleBasedPolicy(roles=[\"reader\"]),\n", - " actions=AuthzedAction.READ\n", - ")\n", - "store.registry.apply_permission(read_permission, store.project)" - ] - }, - { - "cell_type": "markdown", - "id": "e1dcb0d3-21e3-44b7-9ad5-c6b2b1e45b33", - "metadata": {}, - "source": [ - "Now a specific permission to write online data (e.g. `materialize`) the `FeatureView`s whose name ends by `fresh`" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "id": "1c2fecdd-056e-4462-b1ad-eec123e282dd", - "metadata": {}, - "outputs": [], - "source": [ - "from feast.feature_view import FeatureView\n", - "write_fresh_permission = Permission(\n", - " name=\"write_fresh_permission\",\n", - " types=FeatureView,\n", - " name_pattern=\".*_fresh\",\n", - " policy=RoleBasedPolicy(roles=[\"fresh_writer\"]),\n", - " actions=AuthzedAction.WRITE_ONLINE\n", - ")\n", - "store.registry.apply_permission(write_fresh_permission, store.project)" - ] - }, - { - "cell_type": "markdown", - "id": "71edd0ea-67b5-4845-b8ae-602ed3883bb7", - "metadata": {}, - "source": [ - "Another one to match allow access to OFFLINE functions." - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "id": "c74e677c-3959-4963-b683-a5289c8238c9", - "metadata": {}, - "outputs": [], - "source": [ - "from feast.feature_view import FeatureView\n", - "from feast.feature_service import FeatureService\n", - "from feast.on_demand_feature_view import OnDemandFeatureView\n", - "offline_permission = Permission(\n", - " name=\"offline_permission\",\n", - " types=[FeatureView, OnDemandFeatureView, FeatureService],\n", - " policy=RoleBasedPolicy(roles=[\"batch_admin\"]),\n", - " actions= CRUD + [AuthzedAction.WRITE_OFFLINE, AuthzedAction.QUERY_OFFLINE]\n", - ")\n", - "store.registry.apply_permission(offline_permission, store.project)" - ] - }, - { - "cell_type": "markdown", - "id": "3edc08f5-40e1-488a-b749-9b1f5fc31061", - "metadata": {}, - "source": [ - "Finally, ad `admin` permission to manage all the resources" - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "id": "739a26ee-e08e-461a-9f75-59158328fc90", - "metadata": {}, - "outputs": [], - "source": [ - "admin_permission = Permission(\n", - " name=\"admin_permission\",\n", - " types=ALL_RESOURCE_TYPES,\n", - " policy=RoleBasedPolicy(roles=[\"store_admin\"]),\n", - " actions=ALL_ACTIONS\n", - ")\n", - "store.registry.apply_permission(admin_permission, store.project)" - ] - }, - { - "cell_type": "markdown", - "id": "916c9399-866e-4796-9858-a890ceb29e48", - "metadata": {}, - "source": [ - "## Validate registered permissions" - ] - }, - { - "cell_type": "markdown", - "id": "aed869b3-c567-428f-8a69-9c322b62f7c6", - "metadata": {}, - "source": [ - "List all the permissions." - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "id": "cd284369-1cef-4cf6-859f-ea79d1450ed2", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "NAME TYPES WITH_SUBCLASS NAME_PATTERN ACTIONS ROLES\n", - "read_permission FeatureView True READ reader\n", - " OnDemandFeatureView\n", - " BatchFeatureView\n", - " StreamFeatureView\n", - " Entity\n", - " FeatureService\n", - " DataSource\n", - " ValidationReference\n", - " SavedDataset\n", - " Permission\n", - "write_fresh_permission FeatureView True .*_fresh WRITE_ONLINE fresh_writer\n", - "offline_permission FeatureView True CREATE batch_admin\n", - " OnDemandFeatureView READ\n", - " FeatureService UPDATE\n", - " DELETE\n", - " WRITE_OFFLINE\n", - " QUERY_OFFLINE\n", - "admin_permission FeatureView True CREATE store_admin\n", - " OnDemandFeatureView READ\n", - " BatchFeatureView UPDATE\n", - " StreamFeatureView DELETE\n", - " Entity QUERY_ONLINE\n", - " FeatureService QUERY_OFFLINE\n", - " DataSource WRITE_ONLINE\n", - " ValidationReference WRITE_OFFLINE\n", - " SavedDataset\n", - " Permission\n" - ] - } - ], - "source": [ - "!feast -c rbac/feature_repo permissions list" - ] - }, - { - "cell_type": "markdown", - "id": "be3873ee-2514-4aec-8fe8-8b54a3602651", - "metadata": {}, - "source": [ - "List all the resources matching each configured permission." - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "id": "419df226-36df-4d19-be0d-ba82813fef80", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "08/09/2024 10:10:26 AM root WARNING: _list_feature_views will make breaking changes. Please use _list_batch_feature_views instead. _list_feature_views will behave like _list_all_feature_views in the future.\n", - "08/09/2024 10:10:26 AM root WARNING: _list_feature_views will make breaking changes. Please use _list_batch_feature_views instead. _list_feature_views will behave like _list_all_feature_views in the future.\n", - "08/09/2024 10:10:26 AM root WARNING: _list_feature_views will make breaking changes. Please use _list_batch_feature_views instead. _list_feature_views will behave like _list_all_feature_views in the future.\n", - "08/09/2024 10:10:26 AM root WARNING: _list_feature_views will make breaking changes. Please use _list_batch_feature_views instead. _list_feature_views will behave like _list_all_feature_views in the future.\n", - "\n", - "\u001b[1m\u001b[32mThe structure of the \u001b[1m\u001b[37mfeast-permissions list --verbose \u001b[1m\u001b[32mcommand will be as in the following example:\n", - "\n", - "\u001b[2mFor example: \u001b[0m\u001b[1m\u001b[32m\n", - "\n", - "permissions\n", - "├── permission_1 ['role names list']\n", - "│ ├── FeatureView: ['feature view names']\n", - "│ ├── FeatureService: none\n", - "│ └── ..\n", - "├── permission_2 ['role names list']\n", - "└── ..\n", - "\n", - "-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\u001b[0m\n", - " \n", - "Permissions:\n", - "\n", - "permissions\n", - "├── read_permission ['reader']\n", - "│ ├── FeatureView ['driver_hourly_stats_fresh', 'transformed_conv_rate', 'transformed_conv_rate_fresh', 'driver_hourly_stats']\n", - "│ ├── OnDemandFeatureView ['transformed_conv_rate_fresh', 'transformed_conv_rate']\n", - "│ ├── BatchFeatureView ['driver_hourly_stats_fresh', 'driver_hourly_stats']\n", - "│ ├── StreamFeatureView: none\n", - "│ ├── Entity: ['driver']\n", - "│ ├── FeatureService: ['driver_activity_v2', 'driver_activity_v3', 'driver_activity_v1']\n", - "│ ├── DataSource: ['driver_stats_push_source', 'driver_hourly_stats_source', 'vals_to_add']\n", - "│ ├── ValidationReference: none\n", - "│ └── SavedDataset: none\n", - "├── write_fresh_permission ['fresh_writer']\n", - "│ └── FeatureView ['driver_hourly_stats_fresh']\n", - "├── offline_permission ['batch_admin']\n", - "│ ├── FeatureView ['driver_hourly_stats_fresh', 'transformed_conv_rate', 'transformed_conv_rate_fresh', 'driver_hourly_stats']\n", - "│ ├── OnDemandFeatureView ['transformed_conv_rate_fresh', 'transformed_conv_rate']\n", - "│ └── FeatureService: ['driver_activity_v2', 'driver_activity_v3', 'driver_activity_v1']\n", - "└── admin_permission ['store_admin']\n", - " ├── FeatureView ['driver_hourly_stats_fresh', 'transformed_conv_rate', 'transformed_conv_rate_fresh', 'driver_hourly_stats']\n", - " ├── OnDemandFeatureView ['transformed_conv_rate_fresh', 'transformed_conv_rate']\n", - " ├── BatchFeatureView ['driver_hourly_stats_fresh', 'driver_hourly_stats']\n", - " ├── StreamFeatureView: none\n", - " ├── Entity: ['driver']\n", - " ├── FeatureService: ['driver_activity_v2', 'driver_activity_v3', 'driver_activity_v1']\n", - " ├── DataSource: ['driver_stats_push_source', 'driver_hourly_stats_source', 'vals_to_add']\n", - " ├── ValidationReference: none\n", - " └── SavedDataset: none\n" - ] - } - ], - "source": [ - "!feast -c rbac/feature_repo permissions list -v" - ] - }, - { - "cell_type": "markdown", - "id": "90319f10-abce-4a18-9891-7428c8781187", - "metadata": {}, - "source": [ - "Describe one of the permissions." - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "id": "cec436ce-5d1c-455e-a6d7-80f84380e83a", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "name: admin_permission\n", - "types:\n", - "- FEATURE_VIEW\n", - "- ON_DEMAND_FEATURE_VIEW\n", - "- BATCH_FEATURE_VIEW\n", - "- STREAM_FEATURE_VIEW\n", - "- ENTITY\n", - "- FEATURE_SERVICE\n", - "- DATA_SOURCE\n", - "- VALIDATION_REFERENCE\n", - "- SAVED_DATASET\n", - "- PERMISSION\n", - "withSubclasses: true\n", - "namePattern: ''\n", - "actions:\n", - "- CREATE\n", - "- READ\n", - "- UPDATE\n", - "- DELETE\n", - "- QUERY_ONLINE\n", - "- QUERY_OFFLINE\n", - "- WRITE_ONLINE\n", - "- WRITE_OFFLINE\n", - "policy:\n", - " roleBasedPolicy:\n", - " roles:\n", - " - store_admin\n", - "\n" - ] - } - ], - "source": [ - "!feast -c rbac/feature_repo permissions describe admin_permission" - ] - }, - { - "cell_type": "markdown", - "id": "a267a3bb-9861-43eb-9f7b-33f5d5a23e81", - "metadata": {}, - "source": [ - "List the roles specified by these permissions." - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "id": "b6a3f4a6-e3ab-4aaa-9a15-69ea63246b45", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ROLE NAME\n", - "batch_admin\n", - "fresh_writer\n", - "reader\n", - "store_admin\n" - ] - } - ], - "source": [ - "!feast -c rbac/feature_repo permissions list-roles" - ] - }, - { - "cell_type": "markdown", - "id": "0dbb31d3-edc9-4146-a46c-146d7f59532a", - "metadata": {}, - "source": [ - "For each configured role, list all the resources and operations that are allowed to a user impersonating this role." - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "id": "45832f21-43c6-4784-ba88-1e65fa8479b5", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "08/08/2024 06:05:28 PM root WARNING: _list_feature_views will make breaking changes. Please use _list_batch_feature_views instead. _list_feature_views will behave like _list_all_feature_views in the future.\n", - "ROLE NAME RESOURCE NAME RESOURCE TYPE PERMITTED ACTIONS\n", - "batch_admin driver Entity -\n", - "batch_admin driver_hourly_stats FeatureView CREATE\n", - " READ\n", - " UPDATE\n", - " DELETE\n", - " QUERY_OFFLINE\n", - " WRITE_OFFLINE\n", - "batch_admin driver_hourly_stats_fresh FeatureView CREATE\n", - " READ\n", - " UPDATE\n", - " DELETE\n", - " QUERY_OFFLINE\n", - " WRITE_OFFLINE\n", - "batch_admin transformed_conv_rate_fresh OnDemandFeatureView -\n", - "batch_admin transformed_conv_rate OnDemandFeatureView -\n", - "batch_admin driver_hourly_stats FeatureView CREATE\n", - " READ\n", - " UPDATE\n", - " DELETE\n", - " QUERY_OFFLINE\n", - " WRITE_OFFLINE\n", - "batch_admin driver_hourly_stats_fresh FeatureView CREATE\n", - " READ\n", - " UPDATE\n", - " DELETE\n", - " QUERY_OFFLINE\n", - " WRITE_OFFLINE\n", - "batch_admin driver_activity_v2 FeatureService CREATE\n", - " READ\n", - " UPDATE\n", - " DELETE\n", - " QUERY_OFFLINE\n", - " WRITE_OFFLINE\n", - "batch_admin driver_activity_v1 FeatureService CREATE\n", - " READ\n", - " UPDATE\n", - " DELETE\n", - " QUERY_OFFLINE\n", - " WRITE_OFFLINE\n", - "batch_admin driver_activity_v3 FeatureService CREATE\n", - " READ\n", - " UPDATE\n", - " DELETE\n", - " QUERY_OFFLINE\n", - " WRITE_OFFLINE\n", - "batch_admin driver_hourly_stats_source FileSource -\n", - "batch_admin vals_to_add RequestSource -\n", - "batch_admin driver_stats_push_source PushSource -\n", - "batch_admin read_permission Permission -\n", - "batch_admin write_fresh_permission Permission -\n", - "batch_admin offline_permission Permission -\n", - "batch_admin admin_permission Permission -\n", - "fresh_writer driver Entity -\n", - "fresh_writer driver_hourly_stats FeatureView -\n", - "fresh_writer driver_hourly_stats_fresh FeatureView WRITE_ONLINE\n", - "fresh_writer transformed_conv_rate_fresh OnDemandFeatureView -\n", - "fresh_writer transformed_conv_rate OnDemandFeatureView -\n", - "fresh_writer driver_hourly_stats FeatureView -\n", - "fresh_writer driver_hourly_stats_fresh FeatureView WRITE_ONLINE\n", - "fresh_writer driver_activity_v2 FeatureService -\n", - "fresh_writer driver_activity_v1 FeatureService -\n", - "fresh_writer driver_activity_v3 FeatureService -\n", - "fresh_writer driver_hourly_stats_source FileSource -\n", - "fresh_writer vals_to_add RequestSource -\n", - "fresh_writer driver_stats_push_source PushSource -\n", - "fresh_writer read_permission Permission -\n", - "fresh_writer write_fresh_permission Permission -\n", - "fresh_writer offline_permission Permission -\n", - "fresh_writer admin_permission Permission -\n", - "reader driver Entity READ\n", - "reader driver_hourly_stats FeatureView READ\n", - "reader driver_hourly_stats_fresh FeatureView READ\n", - "reader transformed_conv_rate_fresh OnDemandFeatureView READ\n", - "reader transformed_conv_rate OnDemandFeatureView READ\n", - "reader driver_hourly_stats FeatureView READ\n", - "reader driver_hourly_stats_fresh FeatureView READ\n", - "reader driver_activity_v2 FeatureService READ\n", - "reader driver_activity_v1 FeatureService READ\n", - "reader driver_activity_v3 FeatureService READ\n", - "reader driver_hourly_stats_source FileSource READ\n", - "reader vals_to_add RequestSource READ\n", - "reader driver_stats_push_source PushSource READ\n", - "reader read_permission Permission READ\n", - "reader write_fresh_permission Permission READ\n", - "reader offline_permission Permission READ\n", - "reader admin_permission Permission READ\n", - "store_admin driver Entity CREATE\n", - " READ\n", - " UPDATE\n", - " DELETE\n", - " QUERY_ONLINE\n", - " QUERY_OFFLINE\n", - " WRITE_ONLINE\n", - " WRITE_OFFLINE\n", - "store_admin driver_hourly_stats FeatureView CREATE\n", - " READ\n", - " UPDATE\n", - " DELETE\n", - " QUERY_ONLINE\n", - " QUERY_OFFLINE\n", - " WRITE_ONLINE\n", - " WRITE_OFFLINE\n", - "store_admin driver_hourly_stats_fresh FeatureView CREATE\n", - " READ\n", - " UPDATE\n", - " DELETE\n", - " QUERY_ONLINE\n", - " QUERY_OFFLINE\n", - " WRITE_ONLINE\n", - " WRITE_OFFLINE\n", - "store_admin transformed_conv_rate_fresh OnDemandFeatureView CREATE\n", - " READ\n", - " UPDATE\n", - " DELETE\n", - " QUERY_ONLINE\n", - " QUERY_OFFLINE\n", - " WRITE_ONLINE\n", - " WRITE_OFFLINE\n", - "store_admin transformed_conv_rate OnDemandFeatureView CREATE\n", - " READ\n", - " UPDATE\n", - " DELETE\n", - " QUERY_ONLINE\n", - " QUERY_OFFLINE\n", - " WRITE_ONLINE\n", - " WRITE_OFFLINE\n", - "store_admin driver_hourly_stats FeatureView CREATE\n", - " READ\n", - " UPDATE\n", - " DELETE\n", - " QUERY_ONLINE\n", - " QUERY_OFFLINE\n", - " WRITE_ONLINE\n", - " WRITE_OFFLINE\n", - "store_admin driver_hourly_stats_fresh FeatureView CREATE\n", - " READ\n", - " UPDATE\n", - " DELETE\n", - " QUERY_ONLINE\n", - " QUERY_OFFLINE\n", - " WRITE_ONLINE\n", - " WRITE_OFFLINE\n", - "store_admin driver_activity_v2 FeatureService CREATE\n", - " READ\n", - " UPDATE\n", - " DELETE\n", - " QUERY_ONLINE\n", - " QUERY_OFFLINE\n", - " WRITE_ONLINE\n", - " WRITE_OFFLINE\n", - "store_admin driver_activity_v1 FeatureService CREATE\n", - " READ\n", - " UPDATE\n", - " DELETE\n", - " QUERY_ONLINE\n", - " QUERY_OFFLINE\n", - " WRITE_ONLINE\n", - " WRITE_OFFLINE\n", - "store_admin driver_activity_v3 FeatureService CREATE\n", - " READ\n", - " UPDATE\n", - " DELETE\n", - " QUERY_ONLINE\n", - " QUERY_OFFLINE\n", - " WRITE_ONLINE\n", - " WRITE_OFFLINE\n", - "store_admin driver_hourly_stats_source FileSource CREATE\n", - " READ\n", - " UPDATE\n", - " DELETE\n", - " QUERY_ONLINE\n", - " QUERY_OFFLINE\n", - " WRITE_ONLINE\n", - " WRITE_OFFLINE\n", - "store_admin vals_to_add RequestSource CREATE\n", - " READ\n", - " UPDATE\n", - " DELETE\n", - " QUERY_ONLINE\n", - " QUERY_OFFLINE\n", - " WRITE_ONLINE\n", - " WRITE_OFFLINE\n", - "store_admin driver_stats_push_source PushSource CREATE\n", - " READ\n", - " UPDATE\n", - " DELETE\n", - " QUERY_ONLINE\n", - " QUERY_OFFLINE\n", - " WRITE_ONLINE\n", - " WRITE_OFFLINE\n", - "store_admin read_permission Permission CREATE\n", - " READ\n", - " UPDATE\n", - " DELETE\n", - " QUERY_ONLINE\n", - " QUERY_OFFLINE\n", - " WRITE_ONLINE\n", - " WRITE_OFFLINE\n", - "store_admin write_fresh_permission Permission CREATE\n", - " READ\n", - " UPDATE\n", - " DELETE\n", - " QUERY_ONLINE\n", - " QUERY_OFFLINE\n", - " WRITE_ONLINE\n", - " WRITE_OFFLINE\n", - "store_admin offline_permission Permission CREATE\n", - " READ\n", - " UPDATE\n", - " DELETE\n", - " QUERY_ONLINE\n", - " QUERY_OFFLINE\n", - " WRITE_ONLINE\n", - " WRITE_OFFLINE\n", - "store_admin admin_permission Permission CREATE\n", - " READ\n", - " UPDATE\n", - " DELETE\n", - " QUERY_ONLINE\n", - " QUERY_OFFLINE\n", - " WRITE_ONLINE\n", - " WRITE_OFFLINE\n" - ] - } - ], - "source": [ - "!feast -c rbac/feature_repo permissions list-roles -v" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "c7960d2c-e43f-46b4-8cb3-5c6fc9dbaba8", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.9" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/examples/rbac-local/02-registry_server.ipynb b/examples/rbac-local/02-registry_server.ipynb deleted file mode 100644 index 8af27c19b9..0000000000 --- a/examples/rbac-local/02-registry_server.ipynb +++ /dev/null @@ -1,370 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "70df4877-177b-441a-a745-f0cd091e0a3a", - "metadata": {}, - "source": [ - "## Registry server" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "ef9f796d-f9d7-47d0-96c2-03b38a219d83", - "metadata": {}, - "outputs": [], - "source": [ - "!lsof -i :6570\n", - "# !kill -9 64859 98087" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "bd303508-9f32-4bdb-87c2-729e3ab62b4f", - "metadata": {}, - "outputs": [], - "source": [ - "from feast import FeatureStore\n", - "store = FeatureStore(repo_path=\"rbac/feature_repo\")" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "29127952-f9d5-44c4-b7c3-437e0b55c4b0", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Fetching user for token: 1519\n", - "User is: reader (['reader'])\n", - "Fetching user for token: 1519\n", - "User is: reader (['reader'])\n", - "Fetching user for token: 1519\n", - "User is: reader (['reader'])\n", - "Fetching user for token: 1519\n", - "User is: reader (['reader'])\n", - "Fetching user for token: 1519\n", - "User is: reader (['reader'])\n", - "Fetching user for token: 1519\n", - "User is: reader (['reader'])\n", - "Fetching user for token: 1519\n", - "User is: reader (['reader'])\n", - "Fetching user for token: 1519\n", - "User is: reader (['reader'])\n", - "Fetching user for token: 1519\n", - "User is: reader (['reader'])\n", - "Fetching user for token: 1519\n", - "User is: reader (['reader'])\n", - "Fetching user for token: 1519\n", - "User is: reader (['reader'])\n", - "Fetching user for token: 1519\n", - "User is: reader (['reader'])\n", - "Fetching user for token: 1519\n", - "User is: reader (['reader'])\n", - "Fetching user for token: 1519\n", - "User is: reader (['reader'])\n", - "Fetching user for token: 1519\n", - "User is: reader (['reader'])\n", - "Fetching user for token: 1519\n", - "User is: reader (['reader'])\n", - "Fetching user for token: 1519\n", - "User is: reader (['reader'])\n", - "Fetching user for token: 1519\n", - "User is: reader (['reader'])\n", - "Fetching user for token: 1519\n", - "User is: reader (['reader'])\n", - "Fetching user for token: 1519\n", - "User is: reader (['reader'])\n", - "Fetching user for token: 1519\n", - "User is: reader (['reader'])\n", - "Fetching user for token: 1527\n", - "User is: writer (['fresh_writer'])\n", - "Fetching user for token: 1527\n", - "User is: writer (['fresh_writer'])\n", - "Fetching user for token: 1527\n", - "User is: writer (['fresh_writer'])\n", - "Fetching user for token: 1527\n", - "User is: writer (['fresh_writer'])\n", - "Fetching user for token: 1527\n", - "User is: writer (['fresh_writer'])\n", - "Fetching user for token: 1527\n", - "User is: writer (['fresh_writer'])\n", - "Fetching user for token: 1527\n", - "User is: writer (['fresh_writer'])\n", - "Fetching user for token: 1527\n", - "User is: writer (['fresh_writer'])\n", - "Fetching user for token: 1527\n", - "User is: writer (['fresh_writer'])\n", - "Fetching user for token: 1527\n", - "User is: writer (['fresh_writer'])\n", - "Fetching user for token: 1527\n", - "User is: writer (['fresh_writer'])\n", - "Fetching user for token: 1527\n", - "User is: writer (['fresh_writer'])\n", - "Fetching user for token: 1527\n", - "User is: writer (['fresh_writer'])\n", - "Fetching user for token: 1527\n", - "User is: writer (['fresh_writer'])\n", - "Fetching user for token: 1527\n", - "User is: writer (['fresh_writer'])\n", - "Fetching user for token: 1527\n", - "User is: writer (['fresh_writer'])\n", - "Fetching user for token: 1527\n", - "User is: writer (['fresh_writer'])\n", - "Fetching user for token: 1527\n", - "User is: writer (['fresh_writer'])\n", - "Fetching user for token: 1527\n", - "User is: writer (['fresh_writer'])\n", - "Fetching user for token: 1527\n", - "User is: writer (['fresh_writer'])\n", - "Fetching user for token: 1527\n", - "User is: writer (['fresh_writer'])\n", - "Fetching user for token: 1527\n", - "User is: writer (['fresh_writer'])\n", - "Fetching user for token: 1527\n", - "User is: writer (['fresh_writer'])\n", - "Fetching user for token: 1527\n", - "User is: writer (['fresh_writer'])\n", - "Fetching user for token: 1527\n", - "User is: writer (['fresh_writer'])\n", - "Fetching user for token: 1527\n", - "User is: writer (['fresh_writer'])\n", - "Fetching user for token: 1527\n", - "User is: writer (['fresh_writer'])\n", - "Fetching user for token: 1527\n", - "User is: writer (['fresh_writer'])\n", - "Fetching user for token: 1527\n", - "User is: writer (['fresh_writer'])\n", - "Fetching user for token: 1553\n", - "User is: batch_admin (['batch_admin'])\n", - "Fetching user for token: 1553\n", - "User is: batch_admin (['batch_admin'])\n", - "Fetching user for token: 1553\n", - "User is: batch_admin (['batch_admin'])\n", - "Fetching user for token: 1553\n", - "User is: batch_admin (['batch_admin'])\n", - "Fetching user for token: 1553\n", - "User is: batch_admin (['batch_admin'])\n", - "Fetching user for token: 1553\n", - "User is: batch_admin (['batch_admin'])\n", - "Fetching user for token: 1553\n", - "User is: batch_admin (['batch_admin'])\n", - "Fetching user for token: 1553\n", - "User is: batch_admin (['batch_admin'])\n", - "Fetching user for token: 1553\n", - "User is: batch_admin (['batch_admin'])\n", - "Fetching user for token: 1553\n", - "User is: batch_admin (['batch_admin'])\n", - "Fetching user for token: 1553\n", - "User is: batch_admin (['batch_admin'])\n", - "Fetching user for token: 1553\n", - "User is: batch_admin (['batch_admin'])\n", - "Fetching user for token: 1553\n", - "User is: batch_admin (['batch_admin'])\n", - "Fetching user for token: 1553\n", - "User is: batch_admin (['batch_admin'])\n", - "Fetching user for token: 1553\n", - "User is: batch_admin (['batch_admin'])\n", - "Fetching user for token: 1553\n", - "User is: batch_admin (['batch_admin'])\n", - "Fetching user for token: 1553\n", - "User is: batch_admin (['batch_admin'])\n", - "Fetching user for token: 1553\n", - "User is: batch_admin (['batch_admin'])\n", - "Fetching user for token: 1553\n", - "User is: batch_admin (['batch_admin'])\n", - "Fetching user for token: 1553\n", - "User is: batch_admin (['batch_admin'])\n", - "Fetching user for token: 1553\n", - "User is: batch_admin (['batch_admin'])\n", - "Fetching user for token: 1553\n", - "User is: batch_admin (['batch_admin'])\n", - "Fetching user for token: 1553\n", - "User is: batch_admin (['batch_admin'])\n", - "Fetching user for token: 1553\n", - "User is: batch_admin (['batch_admin'])\n", - "Fetching user for token: 1553\n", - "User is: batch_admin (['batch_admin'])\n", - "Fetching user for token: 1553\n", - "User is: batch_admin (['batch_admin'])\n", - "Fetching user for token: 1553\n", - "User is: batch_admin (['batch_admin'])\n", - "Fetching user for token: 1553\n", - "User is: batch_admin (['batch_admin'])\n", - "Fetching user for token: 1553\n", - "User is: batch_admin (['batch_admin'])\n", - "Fetching user for token: 1553\n", - "User is: batch_admin (['batch_admin'])\n", - "Fetching user for token: 1553\n", - "User is: batch_admin (['batch_admin'])\n", - "Fetching user for token: 1553\n", - "User is: batch_admin (['batch_admin'])\n", - "Fetching user for token: 1553\n", - "User is: batch_admin (['batch_admin'])\n", - "Fetching user for token: 1553\n", - "User is: batch_admin (['batch_admin'])\n", - "Fetching user for token: 1553\n", - "User is: batch_admin (['batch_admin'])\n", - "Fetching user for token: 1553\n", - "User is: batch_admin (['batch_admin'])\n", - "Fetching user for token: 1553\n", - "User is: batch_admin (['batch_admin'])\n", - "Fetching user for token: 1553\n", - "User is: batch_admin (['batch_admin'])\n", - "Fetching user for token: 1553\n", - "User is: batch_admin (['batch_admin'])\n", - "Fetching user for token: 1553\n", - "User is: batch_admin (['batch_admin'])\n", - "Fetching user for token: 1553\n", - "User is: batch_admin (['batch_admin'])\n", - "Fetching user for token: 1553\n", - "User is: batch_admin (['batch_admin'])\n", - "Fetching user for token: 1553\n", - "User is: batch_admin (['batch_admin'])\n", - "Fetching user for token: 1553\n", - "User is: batch_admin (['batch_admin'])\n", - "Fetching user for token: 1521\n", - "User is: admin (['store_admin'])\n", - "Fetching user for token: 1521\n", - "User is: admin (['store_admin'])\n", - "Fetching user for token: 1521\n", - "User is: admin (['store_admin'])\n", - "Fetching user for token: 1521\n", - "User is: admin (['store_admin'])\n", - "Fetching user for token: 1521\n", - "User is: admin (['store_admin'])\n", - "Fetching user for token: 1521\n", - "User is: admin (['store_admin'])\n", - "Fetching user for token: 1521\n", - "User is: admin (['store_admin'])\n", - "Fetching user for token: 1521\n", - "User is: admin (['store_admin'])\n", - "Fetching user for token: 1521\n", - "User is: admin (['store_admin'])\n", - "Fetching user for token: 1521\n", - "User is: admin (['store_admin'])\n", - "Fetching user for token: 1521\n", - "User is: admin (['store_admin'])\n", - "Fetching user for token: 1521\n", - "User is: admin (['store_admin'])\n", - "Fetching user for token: 1521\n", - "User is: admin (['store_admin'])\n", - "Fetching user for token: 1521\n", - "User is: admin (['store_admin'])\n", - "Fetching user for token: 1521\n", - "User is: admin (['store_admin'])\n", - "Fetching user for token: 1521\n", - "User is: admin (['store_admin'])\n", - "Fetching user for token: 1521\n", - "User is: admin (['store_admin'])\n", - "Fetching user for token: 1521\n", - "User is: admin (['store_admin'])\n", - "Fetching user for token: 1521\n", - "User is: admin (['store_admin'])\n", - "Fetching user for token: 1521\n", - "User is: admin (['store_admin'])\n", - "Fetching user for token: 1521\n", - "User is: admin (['store_admin'])\n", - "Fetching user for token: 1521\n", - "User is: admin (['store_admin'])\n", - "Fetching user for token: 1521\n", - "User is: admin (['store_admin'])\n", - "Fetching user for token: 1521\n", - "User is: admin (['store_admin'])\n", - "Fetching user for token: 1521\n", - "User is: admin (['store_admin'])\n", - "Fetching user for token: 1521\n", - "User is: admin (['store_admin'])\n", - "Fetching user for token: 1521\n", - "User is: admin (['store_admin'])\n", - "Fetching user for token: 1521\n", - "User is: admin (['store_admin'])\n", - "Fetching user for token: 1521\n", - "User is: admin (['store_admin'])\n", - "Fetching user for token: 1521\n", - "User is: admin (['store_admin'])\n", - "Fetching user for token: 1521\n", - "User is: admin (['store_admin'])\n", - "Fetching user for token: 1521\n", - "User is: admin (['store_admin'])\n", - "Fetching user for token: 1521\n", - "User is: admin (['store_admin'])\n", - "Fetching user for token: 1521\n", - "User is: admin (['store_admin'])\n", - "Fetching user for token: 1521\n", - "User is: admin (['store_admin'])\n", - "Fetching user for token: 1521\n", - "User is: admin (['store_admin'])\n", - "Fetching user for token: 1521\n", - "User is: admin (['store_admin'])\n", - "Fetching user for token: 1521\n", - "User is: admin (['store_admin'])\n", - "Fetching user for token: 1521\n", - "User is: admin (['store_admin'])\n", - "Fetching user for token: 1521\n", - "User is: admin (['store_admin'])\n", - "Fetching user for token: 1521\n", - "User is: admin (['store_admin'])\n", - "Fetching user for token: 1521\n", - "User is: admin (['store_admin'])\n" - ] - }, - { - "ename": "KeyboardInterrupt", - "evalue": "", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[3], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mstore\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mserve_registry\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m6570\u001b[39;49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/projects/mlops/feast/rh-feast/sdk/python/feast/feature_store.py:1822\u001b[0m, in \u001b[0;36mFeatureStore.serve_registry\u001b[0;34m(self, port)\u001b[0m\n\u001b[1;32m 1819\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"Start registry server locally on a given port.\"\"\"\u001b[39;00m\n\u001b[1;32m 1820\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mfeast\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m registry_server\n\u001b[0;32m-> 1822\u001b[0m \u001b[43mregistry_server\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mstart_server\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mport\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/projects/mlops/feast/rh-feast/sdk/python/feast/registry_server.py:613\u001b[0m, in \u001b[0;36mstart_server\u001b[0;34m(store, port, wait_for_termination)\u001b[0m\n\u001b[1;32m 611\u001b[0m server\u001b[38;5;241m.\u001b[39mstart()\n\u001b[1;32m 612\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m wait_for_termination:\n\u001b[0;32m--> 613\u001b[0m \u001b[43mserver\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mwait_for_termination\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 614\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 615\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m server\n", - "File \u001b[0;32m~/miniconda3/envs/feast3.11/lib/python3.11/site-packages/grpc/_server.py:1485\u001b[0m, in \u001b[0;36m_Server.wait_for_termination\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m 1481\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mwait_for_termination\u001b[39m(\u001b[38;5;28mself\u001b[39m, timeout: Optional[\u001b[38;5;28mfloat\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m \u001b[38;5;28mbool\u001b[39m:\n\u001b[1;32m 1482\u001b[0m \u001b[38;5;66;03m# NOTE(https://bugs.python.org/issue35935)\u001b[39;00m\n\u001b[1;32m 1483\u001b[0m \u001b[38;5;66;03m# Remove this workaround once threading.Event.wait() is working with\u001b[39;00m\n\u001b[1;32m 1484\u001b[0m \u001b[38;5;66;03m# CTRL+C across platforms.\u001b[39;00m\n\u001b[0;32m-> 1485\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43m_common\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mwait\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 1486\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_state\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtermination_event\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mwait\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1487\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_state\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtermination_event\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mis_set\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1488\u001b[0m \u001b[43m \u001b[49m\u001b[43mtimeout\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtimeout\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1489\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/miniconda3/envs/feast3.11/lib/python3.11/site-packages/grpc/_common.py:156\u001b[0m, in \u001b[0;36mwait\u001b[0;34m(wait_fn, wait_complete_fn, timeout, spin_cb)\u001b[0m\n\u001b[1;32m 154\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m timeout \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 155\u001b[0m \u001b[38;5;28;01mwhile\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m wait_complete_fn():\n\u001b[0;32m--> 156\u001b[0m \u001b[43m_wait_once\u001b[49m\u001b[43m(\u001b[49m\u001b[43mwait_fn\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mMAXIMUM_WAIT_TIMEOUT\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mspin_cb\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 157\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 158\u001b[0m end \u001b[38;5;241m=\u001b[39m time\u001b[38;5;241m.\u001b[39mtime() \u001b[38;5;241m+\u001b[39m timeout\n", - "File \u001b[0;32m~/miniconda3/envs/feast3.11/lib/python3.11/site-packages/grpc/_common.py:116\u001b[0m, in \u001b[0;36m_wait_once\u001b[0;34m(wait_fn, timeout, spin_cb)\u001b[0m\n\u001b[1;32m 111\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_wait_once\u001b[39m(\n\u001b[1;32m 112\u001b[0m wait_fn: Callable[\u001b[38;5;241m.\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;241m.\u001b[39m, \u001b[38;5;28mbool\u001b[39m],\n\u001b[1;32m 113\u001b[0m timeout: \u001b[38;5;28mfloat\u001b[39m,\n\u001b[1;32m 114\u001b[0m spin_cb: Optional[Callable[[], \u001b[38;5;28;01mNone\u001b[39;00m]],\n\u001b[1;32m 115\u001b[0m ):\n\u001b[0;32m--> 116\u001b[0m \u001b[43mwait_fn\u001b[49m\u001b[43m(\u001b[49m\u001b[43mtimeout\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtimeout\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 117\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m spin_cb \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 118\u001b[0m spin_cb()\n", - "File \u001b[0;32m~/miniconda3/envs/feast3.11/lib/python3.11/threading.py:629\u001b[0m, in \u001b[0;36mEvent.wait\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m 627\u001b[0m signaled \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_flag\n\u001b[1;32m 628\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m signaled:\n\u001b[0;32m--> 629\u001b[0m signaled \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_cond\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mwait\u001b[49m\u001b[43m(\u001b[49m\u001b[43mtimeout\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 630\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m signaled\n", - "File \u001b[0;32m~/miniconda3/envs/feast3.11/lib/python3.11/threading.py:331\u001b[0m, in \u001b[0;36mCondition.wait\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m 329\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 330\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m timeout \u001b[38;5;241m>\u001b[39m \u001b[38;5;241m0\u001b[39m:\n\u001b[0;32m--> 331\u001b[0m gotit \u001b[38;5;241m=\u001b[39m \u001b[43mwaiter\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43macquire\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtimeout\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 332\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 333\u001b[0m gotit \u001b[38;5;241m=\u001b[39m waiter\u001b[38;5;241m.\u001b[39macquire(\u001b[38;5;28;01mFalse\u001b[39;00m)\n", - "\u001b[0;31mKeyboardInterrupt\u001b[0m: " - ] - } - ], - "source": [ - "store.serve_registry(6570)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "5c285fb3-442b-4bb4-bf34-2a61ae5fe76a", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.9" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/examples/rbac-local/03-online_server.ipynb b/examples/rbac-local/03-online_server.ipynb deleted file mode 100644 index f2800741bc..0000000000 --- a/examples/rbac-local/03-online_server.ipynb +++ /dev/null @@ -1,126 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "d75bb824-a6cf-493e-87a8-2ae1095cf918", - "metadata": {}, - "source": [ - "## Online server" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "27a17dd4-08f5-4f01-b5a4-a76aa99952a1", - "metadata": {}, - "outputs": [], - "source": [ - "!lsof -i :6566\n", - "# !kill -9 64859 98087" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "897f5979-da53-4441-ac31-f5cd40abf6cd", - "metadata": {}, - "outputs": [], - "source": [ - "!echo $OBJC_DISABLE_INITIALIZE_FORK_SAFETY" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "73b219c3-7782-4e09-9897-d01f44ccae2d", - "metadata": {}, - "outputs": [], - "source": [ - "from feast import FeatureStore\n", - "store = FeatureStore(repo_path=\"rbac/feature_repo\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d1619739-f763-45bb-a1f1-53f6452bc60a", - "metadata": {}, - "outputs": [], - "source": [ - "store.serve(\n", - " host=\"localhost\",\n", - " port=6566,\n", - " type_=\"http\",\n", - " no_access_log=False,\n", - " workers=1,\n", - " metrics=False,\n", - " keep_alive_timeout=5,\n", - " registry_ttl_sec=5,\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "bc804040-9cd0-4dbc-a63d-a81de9422605", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "08/09/2024 10:13:28 AM root WARNING: _list_feature_views will make breaking changes. Please use _list_batch_feature_views instead. _list_feature_views will behave like _list_all_feature_views in the future.\n", - "08/09/2024 10:13:28 AM root WARNING: _list_feature_views will make breaking changes. Please use _list_batch_feature_views instead. _list_feature_views will behave like _list_all_feature_views in the future.\n", - "127.0.0.1:56098 - \"POST /get-online-features HTTP/1.1\" 200\n", - "08/09/2024 10:13:31 AM root WARNING: _list_feature_views will make breaking changes. Please use _list_batch_feature_views instead. _list_feature_views will behave like _list_all_feature_views in the future.\n", - "08/09/2024 10:13:31 AM root WARNING: _list_feature_views will make breaking changes. Please use _list_batch_feature_views instead. _list_feature_views will behave like _list_all_feature_views in the future.\n", - "127.0.0.1:56127 - \"POST /get-online-features HTTP/1.1\" 200\n", - "08/09/2024 10:13:34 AM root WARNING: _list_feature_views will make breaking changes. Please use _list_batch_feature_views instead. _list_feature_views will behave like _list_all_feature_views in the future.\n", - "08/09/2024 10:13:34 AM root WARNING: _list_feature_views will make breaking changes. Please use _list_batch_feature_views instead. _list_feature_views will behave like _list_all_feature_views in the future.\n", - "127.0.0.1:56157 - \"POST /get-online-features HTTP/1.1\" 200\n", - "^C\n", - "[2024-08-09 10:14:48 +0200] [77213] [INFO] Handling signal: int\n", - "[2024-08-09 10:14:48 +0200] [21977] [INFO] Shutting down\n", - "[2024-08-09 10:14:48 +0200] [21977] [INFO] Error while closing socket [Errno 9] Bad file descriptor\n", - "[2024-08-09 10:14:48 +0200] [21977] [INFO] Waiting for application shutdown.\n", - "[2024-08-09 10:14:48 +0200] [21977] [INFO] Application shutdown complete.\n", - "[2024-08-09 10:14:48 +0200] [21977] [INFO] Finished server process [21977]\n", - "[2024-08-09 10:14:48 +0200] [77213] [ERROR] Worker (pid:21977) was sent SIGINT!\n" - ] - } - ], - "source": [ - "!feast -c rbac/feature_repo serve" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "c3bc63e7-cf7c-4132-b39b-3cd75a1d6755", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.9" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/examples/rbac-local/04-offline_server.ipynb b/examples/rbac-local/04-offline_server.ipynb deleted file mode 100644 index d7939aced5..0000000000 --- a/examples/rbac-local/04-offline_server.ipynb +++ /dev/null @@ -1,263 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "36f5d04f-b456-4e65-91a8-482c91f854c1", - "metadata": {}, - "source": [ - "## Offline server" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "86924e3b-d7dc-46e1-a9f4-05c8abee4da8", - "metadata": {}, - "outputs": [], - "source": [ - "!lsof -i :8815\n", - "# !kill -9 64859 98087" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "73b219c3-7782-4e09-9897-d01f44ccae2d", - "metadata": {}, - "outputs": [], - "source": [ - "from feast import FeatureStore\n", - "store = FeatureStore(repo_path=\"rbac/feature_repo\")" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "5400ee1b-de0a-4fe9-9003-83d0af0863e6", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO:feast.permissions.auth.oidc_token_parser:Validated token\n", - "INFO:feast.permissions.auth.oidc_token_parser:Extracted user batch_admin and roles ['batch_admin']\n", - "INFO:feast.permissions.auth.oidc_token_parser:Validated token\n", - "INFO:feast.permissions.auth.oidc_token_parser:Extracted user batch_admin and roles ['batch_admin']\n", - "INFO:feast.permissions.auth.oidc_token_parser:Validated token\n", - "INFO:feast.permissions.auth.oidc_token_parser:Extracted user batch_admin and roles ['batch_admin']\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "extracted user: batch_admin (['batch_admin'])\n", - "extracted user: batch_admin (['batch_admin'])\n", - "extracted user: batch_admin (['batch_admin'])\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO:feast.permissions.auth.oidc_token_parser:Validated token\n", - "INFO:feast.permissions.auth.oidc_token_parser:Extracted user batch_admin and roles ['batch_admin']\n", - "INFO:feast.permissions.auth.oidc_token_parser:Validated token\n", - "INFO:feast.permissions.auth.oidc_token_parser:Extracted user batch_admin and roles ['batch_admin']\n", - "INFO:feast.permissions.auth.oidc_token_parser:Validated token\n", - "INFO:feast.permissions.auth.oidc_token_parser:Extracted user batch_admin and roles ['batch_admin']\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "extracted user: batch_admin (['batch_admin'])\n", - "extracted user: batch_admin (['batch_admin'])\n", - "extracted user: batch_admin (['batch_admin'])\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO:feast.permissions.auth.oidc_token_parser:Validated token\n", - "INFO:feast.permissions.auth.oidc_token_parser:Extracted user admin and roles ['store_admin']\n", - "INFO:feast.permissions.auth.oidc_token_parser:Validated token\n", - "INFO:feast.permissions.auth.oidc_token_parser:Extracted user admin and roles ['store_admin']\n", - "INFO:feast.permissions.auth.oidc_token_parser:Validated token\n", - "INFO:feast.permissions.auth.oidc_token_parser:Extracted user admin and roles ['store_admin']\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "extracted user: admin (['store_admin'])\n", - "extracted user: admin (['store_admin'])\n", - "extracted user: admin (['store_admin'])\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO:feast.permissions.auth.oidc_token_parser:Validated token\n", - "INFO:feast.permissions.auth.oidc_token_parser:Extracted user admin and roles ['store_admin']\n", - "INFO:feast.permissions.auth.oidc_token_parser:Validated token\n", - "INFO:feast.permissions.auth.oidc_token_parser:Extracted user admin and roles ['store_admin']\n", - "INFO:feast.permissions.auth.oidc_token_parser:Validated token\n", - "INFO:feast.permissions.auth.oidc_token_parser:Extracted user admin and roles ['store_admin']\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "extracted user: admin (['store_admin'])\n", - "extracted user: admin (['store_admin'])\n", - "extracted user: admin (['store_admin'])\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO:feast.permissions.auth.oidc_token_parser:Validated token\n", - "INFO:feast.permissions.auth.oidc_token_parser:Extracted user admin and roles ['store_admin']\n", - "INFO:feast.permissions.auth.oidc_token_parser:Validated token\n", - "INFO:feast.permissions.auth.oidc_token_parser:Extracted user admin and roles ['store_admin']\n", - "INFO:feast.permissions.auth.oidc_token_parser:Validated token\n", - "INFO:feast.permissions.auth.oidc_token_parser:Extracted user admin and roles ['store_admin']\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "extracted user: admin (['store_admin'])\n", - "extracted user: admin (['store_admin'])\n", - "extracted user: admin (['store_admin'])\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "INFO:feast.permissions.auth.oidc_token_parser:Validated token\n", - "INFO:feast.permissions.auth.oidc_token_parser:Extracted user admin and roles ['store_admin']\n", - "INFO:feast.permissions.auth.oidc_token_parser:Validated token\n", - "INFO:feast.permissions.auth.oidc_token_parser:Extracted user admin and roles ['store_admin']\n", - "INFO:feast.permissions.auth.oidc_token_parser:Validated token\n", - "INFO:feast.permissions.auth.oidc_token_parser:Extracted user admin and roles ['store_admin']\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "extracted user: admin (['store_admin'])\n", - "extracted user: admin (['store_admin'])\n", - "extracted user: admin (['store_admin'])\n" - ] - }, - { - "ename": "KeyboardInterrupt", - "evalue": "", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[6], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mstore\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mserve_offline\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mlocalhost\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m8815\u001b[39;49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/projects/mlops/feast/rh-feast/sdk/python/feast/feature_store.py:1828\u001b[0m, in \u001b[0;36mFeatureStore.serve_offline\u001b[0;34m(self, host, port)\u001b[0m\n\u001b[1;32m 1825\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"Start offline server locally on a given port.\"\"\"\u001b[39;00m\n\u001b[1;32m 1826\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mfeast\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m offline_server\n\u001b[0;32m-> 1828\u001b[0m \u001b[43moffline_server\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mstart_server\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mhost\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mport\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/projects/mlops/feast/rh-feast/sdk/python/feast/offline_server.py:471\u001b[0m, in \u001b[0;36mstart_server\u001b[0;34m(store, host, port)\u001b[0m\n\u001b[1;32m 469\u001b[0m server \u001b[38;5;241m=\u001b[39m OfflineServer(store, location)\n\u001b[1;32m 470\u001b[0m logger\u001b[38;5;241m.\u001b[39minfo(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mOffline store server serving on \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mlocation\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m--> 471\u001b[0m \u001b[43mserver\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mserve\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/miniconda3/envs/feast3.11/lib/python3.11/site-packages/pyarrow/_flight.pyx:3109\u001b[0m, in \u001b[0;36mpyarrow._flight.FlightServerBase.serve\u001b[0;34m()\u001b[0m\n", - "\u001b[0;31mKeyboardInterrupt\u001b[0m: " - ] - } - ], - "source": [ - "store.serve_offline(\"localhost\", 8815)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "8b822d5c-41d9-477a-8b42-c4701784bac2", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "WARNING:root:_list_feature_views will make breaking changes. Please use _list_batch_feature_views instead. _list_feature_views will behave like _list_all_feature_views in the future.\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Materializing \u001b[1m\u001b[32m2\u001b[0m feature views to \u001b[1m\u001b[32m2024-08-08 17:24:56+02:00\u001b[0m into the \u001b[1m\u001b[32msqlite\u001b[0m online store.\n", - "\n", - "\u001b[1m\u001b[32mdriver_hourly_stats\u001b[0m from \u001b[1m\u001b[32m2024-08-07 17:24:56+02:00\u001b[0m to \u001b[1m\u001b[32m2024-08-08 17:24:56+02:00\u001b[0m:\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|████████████████████████████████████████████████████████████████| 5/5 [00:00<00:00, 394.32it/s]\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[1m\u001b[32mdriver_hourly_stats_fresh\u001b[0m from \u001b[1m\u001b[32m2024-08-07 17:24:56+02:00\u001b[0m to \u001b[1m\u001b[32m2024-08-08 19:24:56+02:00\u001b[0m:\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100%|███████████████████████████████████████████████████████████████| 5/5 [00:00<00:00, 1378.98it/s]\n" - ] - } - ], - "source": [ - "from datetime import datetime\n", - "store.materialize_incremental(end_date=datetime.now())" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ff854a14-4649-4d40-94fa-b6e2b8577afa", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.9" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/examples/rbac-local/README.md b/examples/rbac-local/README.md deleted file mode 100644 index 0da594fd97..0000000000 --- a/examples/rbac-local/README.md +++ /dev/null @@ -1,57 +0,0 @@ -# RBAC demo -RBAC demo with local environment. - -## System Requirements -* Clone of the Feast repo -* Docker -* yq - -## Architecture -The demo creates the following components: -* An OIDC authorization server using a Keycloak docker container and initialized for demo purposes with a sample realm. -* A sample feature store using `feast init`, later adapted to use the `oidc` authorization against the sample realm. -* Three servers running the registry, online and offline stores. -* A client application connected to the servers to run test code. - -## Setup the environment -Run the sample notebooks to setup the environment: -* [01.1-startkeycloak](./01.1-startkeycloak.ipynb) to start a Keycloak container. -* [01.2-setup-keycloak.ipynb](./01.2-setup-keycloak.ipynb) to configure Keycloak with all the needed resources for the next steps. -* [01.3-setup-feast.ipynb](./01.3-setup-feast.ipynb) to create the sample Feast store and inject the authoprization settings -* [02-registry_server.ipynb](./02-registry_server.ipynb) to start the Registry server -* [03-online_server.ipynb](./03-online_server.ipynb) to start the Online store server -* [04-offline_server.ipynb](04-offline_server.ipynb) to start the Offline store server - -**Note**: For MacOs users, you must set this environment variable before launching the notebook server: -```bash -OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES -``` - -## Goal -Once the environment is defined, we can use the [client.ipynb](./client.ipynb) notebook to verify how the behavior changes -according to the configured user. - -In particular, given the configured permissions: -| Permission | Types | Name pattern | Actions | Roles | -|------------|-------|--------------|---------|-------| -| read_permission | ALL | | READ | reader | -| write_fresh_permission | FeatureView1 | .*_fresh | WRITE_ONLINE | fresh_writer | -| offline_permission | FeatureView, OnDemandFeatureView, FeatureService | | CRUD, WRITE_OFFLINE, QUERY_OFFLINE | batch_admin | -| admin_permission | ALL | | ALL | store_admin | - -and the user roles defined in Keycloak: -| User | Roles | -|------|-------| -| reader | reader | -| writer | fresh_writer | -| batch_admin | batch_admin | -| admin | store_admin | - -We should expect the following behavior for each test section of the [client notebook](./client.ipynb): -| User | Basic validation | Historical | Materialization | Online | Stream push | -|------|------------------|------------|-------------------|--------|-------------| -| reader | Ok | Denied | Denied | Denied | Denied | -| writer | Empty | Denied | Ok | Denied | Denied | -| batch_admin | No Entities and Permissions | Ok | Denied | Denied | Denied | -| admin | Ok | Ok | Ok | Ok | Ok | - diff --git a/examples/rbac-local/client.ipynb b/examples/rbac-local/client.ipynb deleted file mode 100644 index 2e6c03659c..0000000000 --- a/examples/rbac-local/client.ipynb +++ /dev/null @@ -1,837 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "bee9388f-8ffc-4fcd-930f-197ec3c2dd96", - "metadata": {}, - "source": [ - "# Test client" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "id": "eceb50b4-c516-4224-a0b1-efd31bb78c29", - "metadata": {}, - "outputs": [], - "source": [ - "import yaml\n", - "def update_username(username):\n", - " path = 'client/feature_store.yaml'\n", - " with open(path, 'r') as file:\n", - " config = yaml.safe_load(file) or {}\n", - " config['auth']['username'] = username\n", - " with open(path, 'w') as file:\n", - " yaml.safe_dump(config, file, default_flow_style=False)" - ] - }, - { - "cell_type": "markdown", - "id": "08a4020a-10ad-476a-af25-26a09d3d4786", - "metadata": {}, - "source": [ - "# Update test user\n", - "Use one of `reader`, `writer`, `batch_admin` or `admin` (password is fixed) as the current `username`." - ] - }, - { - "cell_type": "code", - "execution_count": 86, - "id": "564849f9-c95a-4278-9fa7-fa09694e5d93", - "metadata": {}, - "outputs": [], - "source": [ - "username = 'admin'\n", - "update_username(username)" - ] - }, - { - "cell_type": "code", - "execution_count": 87, - "id": "6ffb2c42-5a5d-495c-92c5-0729f0144fb8", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "auth:\n", - " auth_discovery_url: http://0.0.0.0:9999/realms/rbac_example/.well-known/openid-configuration\n", - " auth_server_url: http://0.0.0.0:9999\n", - " client_id: app\n", - " client_secret: eFGTp6ZJ0tARKYPbdMKUZ1J8PJNWfXR8\n", - " password: password\n", - " realm: rbac_example\n", - " type: oidc\n", - " username: admin\n", - "entity_key_serialization_version: 2\n", - "offline_store:\n", - " host: localhost\n", - " port: 8815\n", - " type: remote\n", - "online_store:\n", - " path: http://localhost:6566\n", - " type: remote\n", - "project: rbac\n", - "registry:\n", - " path: localhost:6570\n", - " registry_type: remote\n" - ] - } - ], - "source": [ - "!cat client/feature_store.yaml" - ] - }, - { - "cell_type": "markdown", - "id": "664b6f52-d8cf-4145-bf7a-fcce111a34da", - "metadata": {}, - "source": [ - "## Updating logger\n", - "The following is needed to log in the notebook the output the messages logged by th Feast application." - ] - }, - { - "cell_type": "code", - "execution_count": 88, - "id": "3a6fe206-63f8-486f-88cb-b4e888cb6855", - "metadata": {}, - "outputs": [], - "source": [ - "import logging\n", - "import sys\n", - "from io import StringIO\n", - "logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(message)s')\n", - "logger = logging.getLogger()" - ] - }, - { - "cell_type": "markdown", - "id": "a1eb1495-1f38-4165-a6a4-26a2087f1635", - "metadata": {}, - "source": [ - "## Setup Feast client\n", - "Initialize the Feast store from the [client configuration](./client/feature_store.yaml)" - ] - }, - { - "cell_type": "code", - "execution_count": 89, - "id": "b2292e78-cf30-441c-b67f-36e1f1a81923", - "metadata": {}, - "outputs": [], - "source": [ - "from feast.feature_store import FeatureStore" - ] - }, - { - "cell_type": "code", - "execution_count": 90, - "id": "bb653327-9eb3-448f-b320-625337851522", - "metadata": {}, - "outputs": [], - "source": [ - "store = FeatureStore(repo_path=\"client\")" - ] - }, - { - "cell_type": "markdown", - "id": "7e826371-3df5-483a-878d-ce79e8b907e3", - "metadata": {}, - "source": [ - "## Basic validation\n", - "Verify the authorization config and run some GET APIs on the registry." - ] - }, - { - "cell_type": "code", - "execution_count": 91, - "id": "a59979af-a438-436d-918c-3174d94ade5b", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Authorization config is: {'auth_discovery_url': 'http://0.0.0.0:9999/realms/rbac_example/.well-known/openid-configuration', 'auth_server_url': 'http://0.0.0.0:9999', 'client_id': 'app', 'client_secret': 'eFGTp6ZJ0tARKYPbdMKUZ1J8PJNWfXR8', 'password': 'password', 'realm': 'rbac_example', 'type': 'oidc', 'username': 'admin'}\n" - ] - } - ], - "source": [ - "print(f\"Authorization config is: {store.config.auth}\")" - ] - }, - { - "cell_type": "code", - "execution_count": 92, - "id": "bf0af19c-6609-4cb4-86f3-a976528c3966", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2024-08-09 10:12:55,608 - Intercepted the grpc api method /feast.registry.RegistryServer/ListEntities call to inject Authorization header token. \n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Entity found driver\n" - ] - } - ], - "source": [ - "for e in store.list_entities():\n", - " print(f\"Entity found {e.name}\")" - ] - }, - { - "cell_type": "code", - "execution_count": 93, - "id": "0494a65f-64bf-45f0-a772-ee6d8b89c91e", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2024-08-09 10:12:57,920 - _list_feature_views will make breaking changes. Please use _list_batch_feature_views instead. _list_feature_views will behave like _list_all_feature_views in the future.\n", - "2024-08-09 10:12:57,921 - Intercepted the grpc api method /feast.registry.RegistryServer/ListFeatureViews call to inject Authorization header token. \n", - "2024-08-09 10:12:58,307 - Intercepted the grpc api method /feast.registry.RegistryServer/ListStreamFeatureViews call to inject Authorization header token. \n", - "2024-08-09 10:12:58,602 - Intercepted the grpc api method /feast.registry.RegistryServer/ListOnDemandFeatureViews call to inject Authorization header token. \n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "FeatureView found driver_hourly_stats of type FeatureView\n", - "FeatureView found driver_hourly_stats_fresh of type FeatureView\n", - "FeatureView found transformed_conv_rate_fresh of type OnDemandFeatureView\n", - "FeatureView found transformed_conv_rate of type OnDemandFeatureView\n" - ] - } - ], - "source": [ - "for fv in store.list_all_feature_views():\n", - " print(f\"FeatureView found {fv.name} of type {type(fv).__name__}\")" - ] - }, - { - "cell_type": "code", - "execution_count": 94, - "id": "0832822f-e954-4d43-a96f-de5cf05acb2b", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2024-08-09 10:13:01,877 - Intercepted the grpc api method /feast.registry.RegistryServer/ListFeatureServices call to inject Authorization header token. \n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "FeatureService found driver_activity_v2 of type FeatureService\n", - "FeatureService found driver_activity_v1 of type FeatureService\n", - "FeatureService found driver_activity_v3 of type FeatureService\n" - ] - } - ], - "source": [ - "for fs in store.list_feature_services():\n", - " print(f\"FeatureService found {fs.name} of type {type(fs).__name__}\")" - ] - }, - { - "cell_type": "code", - "execution_count": 95, - "id": "98fd0767-4305-4b18-a50b-298fa7103815", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "NAME TYPES WITH_SUBCLASS NAME_PATTERN ACTIONS ROLES\n", - "read_permission FeatureView True READ reader\n", - " OnDemandFeatureView\n", - " BatchFeatureView\n", - " StreamFeatureView\n", - " Entity\n", - " FeatureService\n", - " DataSource\n", - " ValidationReference\n", - " SavedDataset\n", - " Permission\n", - "write_fresh_permission FeatureView True .*_fresh WRITE_ONLINE fresh_writer\n", - "offline_permission FeatureView True CREATE batch_admin\n", - " OnDemandFeatureView READ\n", - " FeatureService UPDATE\n", - " DELETE\n", - " WRITE_OFFLINE\n", - " QUERY_OFFLINE\n", - "admin_permission FeatureView True CREATE store_admin\n", - " OnDemandFeatureView READ\n", - " BatchFeatureView UPDATE\n", - " StreamFeatureView DELETE\n", - " Entity QUERY_ONLINE\n", - " FeatureService QUERY_OFFLINE\n", - " DataSource WRITE_ONLINE\n", - " ValidationReference WRITE_OFFLINE\n", - " SavedDataset\n", - " Permission\n" - ] - } - ], - "source": [ - "!feast -c client permissions list" - ] - }, - { - "cell_type": "markdown", - "id": "ad2d56ee-e7a9-463e-a597-932c10f8df1c", - "metadata": {}, - "source": [ - "## Validating with test_workflow.py\n", - "The following test functions were copied from the `test_workflow.py` template but we added `try` blocks to print only \n", - "the relevant error messages, since we expect to receive errors from the permission enforcement modules." - ] - }, - { - "cell_type": "code", - "execution_count": 96, - "id": "930f7e8c-c2a0-4425-99c2-c9958a5a7632", - "metadata": {}, - "outputs": [], - "source": [ - "import subprocess\n", - "from datetime import datetime\n", - "\n", - "import pandas as pd\n", - "\n", - "from feast import FeatureStore\n", - "from feast.data_source import PushMode\n", - "\n", - "def fetch_historical_features_entity_df(store: FeatureStore, for_batch_scoring: bool):\n", - " # Note: see https://docs.feast.dev/getting-started/concepts/feature-retrieval for more details on how to retrieve\n", - " # for all entities in the offline store instead\n", - " entity_df = pd.DataFrame.from_dict(\n", - " {\n", - " # entity's join key -> entity values\n", - " \"driver_id\": [1001, 1002, 1003],\n", - " # \"event_timestamp\" (reserved key) -> timestamps\n", - " \"event_timestamp\": [\n", - " datetime(2021, 4, 12, 10, 59, 42),\n", - " datetime(2021, 4, 12, 8, 12, 10),\n", - " datetime(2021, 4, 12, 16, 40, 26),\n", - " ],\n", - " # (optional) label name -> label values. Feast does not process these\n", - " \"label_driver_reported_satisfaction\": [1, 5, 3],\n", - " # values we're using for an on-demand transformation\n", - " \"val_to_add\": [1, 2, 3],\n", - " \"val_to_add_2\": [10, 20, 30],\n", - " }\n", - " )\n", - " # For batch scoring, we want the latest timestamps\n", - " if for_batch_scoring:\n", - " entity_df[\"event_timestamp\"] = pd.to_datetime(\"now\", utc=True)\n", - "\n", - " try:\n", - " training_df = store.get_historical_features(\n", - " entity_df=entity_df,\n", - " features=[\n", - " \"driver_hourly_stats:conv_rate\",\n", - " \"driver_hourly_stats:acc_rate\",\n", - " \"driver_hourly_stats:avg_daily_trips\",\n", - " \"transformed_conv_rate:conv_rate_plus_val1\",\n", - " \"transformed_conv_rate:conv_rate_plus_val2\",\n", - " ],\n", - " ).to_df()\n", - " print(training_df.head())\n", - " except Exception as e:\n", - " print(f\"Failed to run `store.get_historical_features`: {e}\")\n", - "\n", - "\n", - "def fetch_online_features(store, source: str = \"\"):\n", - " entity_rows = [\n", - " # {join_key: entity_value}\n", - " {\n", - " \"driver_id\": 1001,\n", - " \"val_to_add\": 1000,\n", - " \"val_to_add_2\": 2000,\n", - " },\n", - " {\n", - " \"driver_id\": 1002,\n", - " \"val_to_add\": 1001,\n", - " \"val_to_add_2\": 2002,\n", - " },\n", - " ]\n", - " if source == \"feature_service\":\n", - " try:\n", - " features_to_fetch = store.get_feature_service(\"driver_activity_v1\")\n", - " except Exception as e:\n", - " print(f\"Failed to run `store.get_feature_service`: {e}\")\n", - " elif source == \"push\":\n", - " try:\n", - " features_to_fetch = store.get_feature_service(\"driver_activity_v3\")\n", - " except Exception as e:\n", - " print(f\"Failed to run `store.get_feature_service`: {e}\")\n", - " else:\n", - " features_to_fetch = [\n", - " \"driver_hourly_stats:acc_rate\",\n", - " \"transformed_conv_rate:conv_rate_plus_val1\",\n", - " \"transformed_conv_rate:conv_rate_plus_val2\",\n", - " ]\n", - " try:\n", - " returned_features = store.get_online_features(\n", - " features=features_to_fetch,\n", - " entity_rows=entity_rows,\n", - " ).to_dict()\n", - " for key, value in sorted(returned_features.items()):\n", - " print(key, \" : \", value)\n", - " except Exception as e:\n", - " print(f\"Failed to run `store.get_online_features`: {e}\")" - ] - }, - { - "cell_type": "code", - "execution_count": 97, - "id": "86359ae5-e723-4976-89bb-e772f597ed60", - "metadata": {}, - "outputs": [], - "source": [ - "store = FeatureStore(repo_path=\"client\")" - ] - }, - { - "cell_type": "markdown", - "id": "c0fed355-a1ac-4515-ae27-9d0feca886f4", - "metadata": {}, - "source": [ - "### Historical features" - ] - }, - { - "cell_type": "code", - "execution_count": 98, - "id": "e18dba03-6199-4b48-a9cb-23e3fa51a505", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2024-08-09 10:13:15,551 - _list_feature_views will make breaking changes. Please use _list_batch_feature_views instead. _list_feature_views will behave like _list_all_feature_views in the future.\n", - "2024-08-09 10:13:15,552 - Intercepted the grpc api method /feast.registry.RegistryServer/ListFeatureViews call to inject Authorization header token. \n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "--- Historical features for training ---\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2024-08-09 10:13:15,893 - Intercepted the grpc api method /feast.registry.RegistryServer/ListStreamFeatureViews call to inject Authorization header token. \n", - "2024-08-09 10:13:16,196 - Intercepted the grpc api method /feast.registry.RegistryServer/ListOnDemandFeatureViews call to inject Authorization header token. \n", - "2024-08-09 10:13:16,511 - Connecting FlightClient at grpc://localhost:8815\n", - "2024-08-09 10:13:16,924 - _list_feature_views will make breaking changes. Please use _list_batch_feature_views instead. _list_feature_views will behave like _list_all_feature_views in the future.\n", - "2024-08-09 10:13:16,925 - Intercepted the grpc api method /feast.registry.RegistryServer/ListFeatureViews call to inject Authorization header token. \n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - " driver_id event_timestamp label_driver_reported_satisfaction \\\n", - "0 1001 2021-04-12 10:59:42+00:00 1 \n", - "1 1002 2021-04-12 08:12:10+00:00 5 \n", - "2 1003 2021-04-12 16:40:26+00:00 3 \n", - "\n", - " val_to_add val_to_add_2 conv_rate acc_rate avg_daily_trips \\\n", - "0 1 10 0.928541 0.695293 818 \n", - "1 2 20 0.491019 0.712657 233 \n", - "2 3 30 0.504265 0.638185 738 \n", - "\n", - " conv_rate_plus_val1 conv_rate_plus_val2 \n", - "0 1.928541 10.928541 \n", - "1 2.491019 20.491019 \n", - "2 3.504265 30.504265 \n", - "\n", - "--- Historical features for batch scoring ---\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2024-08-09 10:13:17,229 - Intercepted the grpc api method /feast.registry.RegistryServer/ListStreamFeatureViews call to inject Authorization header token. \n", - "2024-08-09 10:13:17,585 - Intercepted the grpc api method /feast.registry.RegistryServer/ListOnDemandFeatureViews call to inject Authorization header token. \n", - "2024-08-09 10:13:17,937 - Connecting FlightClient at grpc://localhost:8815\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - " driver_id event_timestamp \\\n", - "0 1002 2024-08-09 08:13:16.924405+00:00 \n", - "1 1001 2024-08-09 08:13:16.924405+00:00 \n", - "2 1003 2024-08-09 08:13:16.924405+00:00 \n", - "\n", - " label_driver_reported_satisfaction val_to_add val_to_add_2 conv_rate \\\n", - "0 5 2 20 0.709591 \n", - "1 1 1 10 0.304952 \n", - "2 3 3 30 0.062595 \n", - "\n", - " acc_rate avg_daily_trips conv_rate_plus_val1 conv_rate_plus_val2 \n", - "0 0.446933 543 2.709591 20.709591 \n", - "1 0.228232 765 1.304952 10.304952 \n", - "2 0.787014 147 3.062595 30.062595 \n" - ] - } - ], - "source": [ - "print(\"\\n--- Historical features for training ---\")\n", - "fetch_historical_features_entity_df(store, for_batch_scoring=False)\n", - "\n", - "print(\"\\n--- Historical features for batch scoring ---\")\n", - "fetch_historical_features_entity_df(store, for_batch_scoring=True)" - ] - }, - { - "cell_type": "markdown", - "id": "83bdd1a1-7071-4c51-bf69-9b2bade572a1", - "metadata": {}, - "source": [ - "### Materialization" - ] - }, - { - "cell_type": "code", - "execution_count": 99, - "id": "baeed80c-d2bf-4ac2-ae97-dc689c32e797", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2024-08-09 10:13:20,397 - _list_feature_views will make breaking changes. Please use _list_batch_feature_views instead. _list_feature_views will behave like _list_all_feature_views in the future.\n", - "2024-08-09 10:13:20,398 - Intercepted the grpc api method /feast.registry.RegistryServer/ListFeatureViews call to inject Authorization header token. \n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "--- Load features into online store ---\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2024-08-09 10:13:20,731 - Intercepted the grpc api method /feast.registry.RegistryServer/ListStreamFeatureViews call to inject Authorization header token. \n", - "2024-08-09 10:13:21,034 - Intercepted the grpc api method /feast.registry.RegistryServer/GetEntity call to inject Authorization header token. \n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Materializing \u001b[1m\u001b[32m2\u001b[0m feature views to \u001b[1m\u001b[32m2024-08-09 10:13:20+02:00\u001b[0m into the \u001b[1m\u001b[32mremote\u001b[0m online store.\n", - "\n", - "\u001b[1m\u001b[32mdriver_hourly_stats\u001b[0m from \u001b[1m\u001b[32m2024-08-08 19:25:13+02:00\u001b[0m to \u001b[1m\u001b[32m2024-08-09 10:13:20+02:00\u001b[0m:\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2024-08-09 10:13:21,345 - Connecting FlightClient at grpc://localhost:8815\n", - "0it [00:00, ?it/s]\n", - "2024-08-09 10:13:23,864 - Intercepted the grpc api method /feast.registry.RegistryServer/ApplyMaterialization call to inject Authorization header token. \n", - "2024-08-09 10:13:24,183 - Intercepted the grpc api method /feast.registry.RegistryServer/GetEntity call to inject Authorization header token. \n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[1m\u001b[32mdriver_hourly_stats_fresh\u001b[0m from \u001b[1m\u001b[32m2024-08-08 19:25:13+02:00\u001b[0m to \u001b[1m\u001b[32m2024-08-09 12:13:20+02:00\u001b[0m:\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2024-08-09 10:13:24,484 - Connecting FlightClient at grpc://localhost:8815\n", - "0it [00:00, ?it/s]\n", - "2024-08-09 10:13:24,848 - Intercepted the grpc api method /feast.registry.RegistryServer/ApplyMaterialization call to inject Authorization header token. \n" - ] - } - ], - "source": [ - "print(\"\\n--- Load features into online store ---\")\n", - "try:\n", - " store.materialize_incremental(end_date=datetime.now())\n", - "except Exception as e:\n", - " print(f\"Failed to run `store.materialize_incremental`: {e}\")" - ] - }, - { - "cell_type": "markdown", - "id": "f3ef1e87-a98e-447e-893a-d10e205d87c5", - "metadata": {}, - "source": [ - "### Online features" - ] - }, - { - "cell_type": "code", - "execution_count": 100, - "id": "feb552de-77da-4177-bc4e-4c882ca91fe8", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2024-08-09 10:13:26,503 - _list_feature_views will make breaking changes. Please use _list_batch_feature_views instead. _list_feature_views will behave like _list_all_feature_views in the future.\n", - "2024-08-09 10:13:26,504 - Intercepted the grpc api method /feast.registry.RegistryServer/ListFeatureViews call to inject Authorization header token. \n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "--- Online features ---\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2024-08-09 10:13:26,844 - Intercepted the grpc api method /feast.registry.RegistryServer/ListStreamFeatureViews call to inject Authorization header token. \n", - "2024-08-09 10:13:27,139 - Intercepted the grpc api method /feast.registry.RegistryServer/ListOnDemandFeatureViews call to inject Authorization header token. \n", - "2024-08-09 10:13:27,588 - Intercepted the grpc api method /feast.registry.RegistryServer/ListEntities call to inject Authorization header token. \n", - "2024-08-09 10:13:27,943 - Intercepted the grpc api method /feast.registry.RegistryServer/GetEntity call to inject Authorization header token. \n", - "2024-08-09 10:13:28,262 - Intercepted the grpc api method /feast.registry.RegistryServer/GetEntity call to inject Authorization header token. \n", - "2024-08-09 10:13:28,928 - Intercepted the grpc api method /feast.registry.RegistryServer/GetFeatureService call to inject Authorization header token. \n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "acc_rate : [0.22823210060596466, 0.44693297147750854]\n", - "conv_rate_plus_val1 : [1000.3049515485764, 1001.7095908522606]\n", - "conv_rate_plus_val2 : [2000.3049515485764, 2002.7095908522606]\n", - "driver_id : [1001, 1002]\n", - "\n", - "--- Online features retrieved (instead) through a feature service---\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2024-08-09 10:13:29,223 - Intercepted the grpc api method /feast.registry.RegistryServer/GetFeatureService call to inject Authorization header token. \n", - "2024-08-09 10:13:29,513 - _list_feature_views will make breaking changes. Please use _list_batch_feature_views instead. _list_feature_views will behave like _list_all_feature_views in the future.\n", - "2024-08-09 10:13:29,513 - Intercepted the grpc api method /feast.registry.RegistryServer/ListFeatureViews call to inject Authorization header token. \n", - "2024-08-09 10:13:29,822 - Intercepted the grpc api method /feast.registry.RegistryServer/ListStreamFeatureViews call to inject Authorization header token. \n", - "2024-08-09 10:13:30,166 - Intercepted the grpc api method /feast.registry.RegistryServer/ListOnDemandFeatureViews call to inject Authorization header token. \n", - "2024-08-09 10:13:30,517 - Intercepted the grpc api method /feast.registry.RegistryServer/ListEntities call to inject Authorization header token. \n", - "2024-08-09 10:13:30,820 - Intercepted the grpc api method /feast.registry.RegistryServer/GetEntity call to inject Authorization header token. \n", - "2024-08-09 10:13:31,189 - Intercepted the grpc api method /feast.registry.RegistryServer/GetEntity call to inject Authorization header token. \n", - "2024-08-09 10:13:31,813 - Intercepted the grpc api method /feast.registry.RegistryServer/GetFeatureService call to inject Authorization header token. \n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "conv_rate : [0.304951548576355, 0.7095908522605896]\n", - "conv_rate_plus_val1 : [1000.3049515485764, 1001.7095908522606]\n", - "conv_rate_plus_val2 : [2000.3049515485764, 2002.7095908522606]\n", - "driver_id : [1001, 1002]\n", - "\n", - "--- Online features retrieved (using feature service v3, which uses a feature view with a push source---\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2024-08-09 10:13:32,117 - Intercepted the grpc api method /feast.registry.RegistryServer/GetFeatureService call to inject Authorization header token. \n", - "2024-08-09 10:13:32,413 - _list_feature_views will make breaking changes. Please use _list_batch_feature_views instead. _list_feature_views will behave like _list_all_feature_views in the future.\n", - "2024-08-09 10:13:32,414 - Intercepted the grpc api method /feast.registry.RegistryServer/ListFeatureViews call to inject Authorization header token. \n", - "2024-08-09 10:13:32,736 - Intercepted the grpc api method /feast.registry.RegistryServer/ListStreamFeatureViews call to inject Authorization header token. \n", - "2024-08-09 10:13:33,029 - Intercepted the grpc api method /feast.registry.RegistryServer/ListOnDemandFeatureViews call to inject Authorization header token. \n", - "2024-08-09 10:13:33,322 - Intercepted the grpc api method /feast.registry.RegistryServer/ListEntities call to inject Authorization header token. \n", - "2024-08-09 10:13:33,611 - Intercepted the grpc api method /feast.registry.RegistryServer/GetEntity call to inject Authorization header token. \n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "acc_rate : [0.22823210060596466, 0.44693297147750854]\n", - "avg_daily_trips : [765, 543]\n", - "conv_rate : [0.304951548576355, 0.7095908522605896]\n", - "conv_rate_plus_val1 : [1000.3049515485764, 1001.7095908522606]\n", - "conv_rate_plus_val2 : [2000.3049515485764, 2002.7095908522606]\n", - "driver_id : [1001, 1002]\n" - ] - } - ], - "source": [ - "print(\"\\n--- Online features ---\")\n", - "fetch_online_features(store)\n", - "\n", - "print(\"\\n--- Online features retrieved (instead) through a feature service---\")\n", - "fetch_online_features(store, source=\"feature_service\")\n", - "\n", - "print(\n", - " \"\\n--- Online features retrieved (using feature service v3, which uses a feature view with a push source---\"\n", - ")\n", - "fetch_online_features(store, source=\"push\")" - ] - }, - { - "cell_type": "markdown", - "id": "7ce5704c-86ef-4d00-a111-b86e853f2cca", - "metadata": {}, - "source": [ - "### Stream push" - ] - }, - { - "cell_type": "code", - "execution_count": 101, - "id": "e53317fc-8e6b-4dc3-89ca-28d6be04b98a", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2024-08-09 10:13:34,231 - list_feature_views will make breaking changes. Please use list_batch_feature_views instead. list_feature_views will behave like list_all_feature_views in the future.\n", - "2024-08-09 10:13:34,232 - _list_feature_views will make breaking changes. Please use _list_batch_feature_views instead. _list_feature_views will behave like _list_all_feature_views in the future.\n", - "2024-08-09 10:13:34,233 - Intercepted the grpc api method /feast.registry.RegistryServer/ListFeatureViews call to inject Authorization header token. \n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "--- Simulate a stream event ingestion of the hourly stats df ---\n", - " driver_id event_timestamp created conv_rate \\\n", - "0 1001 2024-08-09 10:13:34.227334 2024-08-09 10:13:34.227339 1.0 \n", - "\n", - " acc_rate avg_daily_trips \n", - "0 1.0 1000 \n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2024-08-09 10:13:34,534 - Intercepted the grpc api method /feast.registry.RegistryServer/ListStreamFeatureViews call to inject Authorization header token. \n", - "2024-08-09 10:13:34,838 - Intercepted the grpc api method /feast.registry.RegistryServer/GetStreamFeatureView call to inject Authorization header token. \n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Failed to run `store.push`: <_InactiveRpcError of RPC that terminated with:\n", - "\tstatus = StatusCode.UNKNOWN\n", - "\tdetails = \"Exception calling application: Feature view driver_hourly_stats_fresh does not exist in project rbac\"\n", - "\tdebug_error_string = \"UNKNOWN:Error received from peer {grpc_message:\"Exception calling application: Feature view driver_hourly_stats_fresh does not exist in project rbac\", grpc_status:2, created_time:\"2024-08-09T10:13:35.137923+02:00\"}\"\n", - ">\n" - ] - } - ], - "source": [ - "print(\"\\n--- Simulate a stream event ingestion of the hourly stats df ---\")\n", - "event_df = pd.DataFrame.from_dict(\n", - " {\n", - " \"driver_id\": [1001],\n", - " \"event_timestamp\": [\n", - " datetime.now(),\n", - " ],\n", - " \"created\": [\n", - " datetime.now(),\n", - " ],\n", - " \"conv_rate\": [1.0],\n", - " \"acc_rate\": [1.0],\n", - " \"avg_daily_trips\": [1000],\n", - " }\n", - ")\n", - "print(event_df)\n", - "try:\n", - " store.push(\"driver_stats_push_source\", event_df, to=PushMode.ONLINE_AND_OFFLINE)\n", - " print(\"\\n--- Online features again with updated values from a stream push---\")\n", - " fetch_online_features(store, source=\"push\")\n", - "except Exception as e:\n", - " print(f\"Failed to run `store.push`: {e}\")" - ] - }, - { - "cell_type": "markdown", - "id": "5709f71b-ddff-4048-9db1-98d4090326e1", - "metadata": {}, - "source": [ - "**Note** If you see the following error, it is likely due to the issue [#4392: Remote registry client does not map application errors](https://github.com/feast-dev/feast/issues/4392):\n", - "```\n", - "Feature view driver_hourly_stats_fresh does not exist in project rbac\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "573d9e29-4ba8-41f4-b6a1-82a24d4550b5", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.9" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/examples/rbac-local/client/feature_store.yaml b/examples/rbac-local/client/feature_store.yaml deleted file mode 100644 index fd4b39d31d..0000000000 --- a/examples/rbac-local/client/feature_store.yaml +++ /dev/null @@ -1,21 +0,0 @@ -auth: - auth_discovery_url: http://0.0.0.0:9999/realms/rbac_example/.well-known/openid-configuration - auth_server_url: http://0.0.0.0:9999 - client_id: app - client_secret: eFGTp6ZJ0tARKYPbdMKUZ1J8PJNWfXR8 - password: password - realm: rbac_example - type: oidc - username: admin -entity_key_serialization_version: 2 -offline_store: - host: localhost - port: 8815 - type: remote -online_store: - path: http://localhost:6566 - type: remote -project: rbac -registry: - path: localhost:6570 - registry_type: remote diff --git a/examples/rbac/README.md b/examples/rbac/README.md deleted file mode 100644 index a62787e984..0000000000 --- a/examples/rbac/README.md +++ /dev/null @@ -1,169 +0,0 @@ -# Feast Feature Store Deployment with RBAC - -## Demo Summary -This demo showcases how to enable Role-Based Access Control (RBAC) for a Feast Feature Store application using Kubernetes Authentication type. -The demo steps involve deploying server components (registry, offline, online) and client examples with resources (deployment, roles, role bindings, and service accounts) within a Kubernetes environment. -The goal is to ensure secure access control based on user roles and permissions. For understanding the Feast RBAC framework read the reference document [permission.md](../../docs/getting-started/concepts/permission.md). - -## Tools and Projects -- Kubernetes -- Feast -- PostgreSQL Database - -## Application Environment - -This demo contains the following components: - -1. Feast Remote Server components (online, offline, registry) for the Feast Feature Store. -2. Feast Remote Client RBAC example (admin and user ). -3. Configuration and test scripts. - -![demo.jpg](demo.jpg) - -### Setup Instructions - -The application works under OpenShift or Kubernetes with the following instructions assume that you are using a OpenShift or Kubernetes cluster. - -### Prerequisites - -1. Kubernetes Cluster and Kubernetes CLI (kubectl). -2. Helm: Ensure you have Helm installed for deploying the Feast components. -3. Python environment. -4. Feast CLI latest version. - -### Steps - -#### Local Project Setup - -#### 1. **Create the Feast feature store project with PostgreSQL.** - -* Install the PostgreSQL on a Kubernetes cluster if you are using OpenShift you can install using [OpenShift Template](https://github.com/RHEcosystemAppEng/feast-workshop-team-share/tree/main/feast_postgres#1-install-postgresql-on-openshift-using-openshift-template) -* Port Forward PostgreSQL Database to your local machine. Since we are setting up the Feast project locally using the Feast CLI, so for local connection required port forward PostgreSQL: - ``` kubectl port-forward svc/postgresql 5432:5432``` -* Create a feature repository/project using cli with PostgreSQL. Please see the instruction for more details [here](https://docs.feast.dev/reference/offline-stores/postgres#getting-started). - For this example (local) setup, we create project with name [server](server) using these settings for [feature_store.yaml](server/feature_repo/feature_store.yaml). -* From `Server` create Feast objects to the registry with command `feast apply` from `feature_repo` directory. -* Verify the application is working locally - -#### Remote Server Deployment - -#### 1. **Create the Server Feature Store Files and Add Auth Section.** - -* For remote deployment on the cluster, create feature store YAML files for each server, as shown in this example. - -**Registry Server:** [feature_store_registry.yaml](server/feature_store_registry.yaml) - -**Offline Server with Remote Registry:** [feature_store_offline.yaml](server/feature_store_offline.yaml) - -**Online Server with Remote Registry and Remote Offline Store:** [feature_store_online.yaml](server/feature_store_online.yaml) - -* Enable the auth in each Server feature store by setting the auth type to Kubernetes. You can read more about RBAC/permissions in [permission.md](../../docs/getting-started/concepts/permission.md) - -```yaml -auth: - type: kubernetes -``` - -#### 2. **Deploy server components with RBAC.** - -* Run the installation script. The setup script will deploy the server components based on user confirmation. The script will deploy all the components with the namespace name `feast-dev`. - - ```sh - ./install_feast.sh - ``` - Note: You can apply permission to run the script like this: - ```sh - chmod +x install_feast.sh - ``` -* Verify that all server pods are healthy and running. The install script will create a deployment for each server. - -#### Client Setup - -#### 1. **Create Client-Side Feature Store YAML with Kubernetes Auth Type.** - -* In this example, we created the [client](client) folder which contains client-related resources. - -* Set up the client feature store with remote connection details for the registry, online, and offline store. - -* See the client remote setting example here: [feature_store.yaml](client/feature_repo/feature_store.yaml) - -#### 2. **Deploy the Client Examples** - -* As an examples, we created different users: 1. admin-user, 2. readonly-user and 3. unauthorized-user and assigned the following roles and actions on the Feast object as shown in the table below. - -##### Roles and Permissions for Examples (Admin and User) -| **User** | **Service Account** | **Roles** | **Permission** | **Feast Resources** | **Actions** | -|-----------------|----------------------------|------------------|--------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------| -| admin | feast-admin-sa | feast-admin-role | feast_admin_permission | FeatureView, OnDemandFeatureView, BatchFeatureView, StreamFeatureView, Entity, FeatureService, DataSource, ValidationReference, SavedDataset, Permission | CREATE, READ, UPDATE, DELETE, QUERY_ONLINE, QUERY_OFFLINE, WRITE_ONLINE, WRITE_OFFLINE | -| user | feast-user-sa | feast-user-role | feast_user_permission | FeatureView, OnDemandFeatureView, BatchFeatureView, StreamFeatureView, Entity, FeatureService, DataSource, ValidationReference, SavedDataset, Permission | READ, QUERY_OFFLINE, QUERY_ONLINE | -|unauthorized-user| feast-unauthorized-user-sa | | | | | -* For deploying client examples, the script will create a Deployment, roles, role bindings, and service accounts for each user. See roles configuration for admin [admin_resources.yaml](client/admin_resources.yaml) and user [user_resources.yaml](client/user_resources.yaml) -* It will also create a ConfigMap on the client side that contains the test script and client-side feature store configuration. - -* To run the script below, if the server is already deployed, type 'no' for server deployment and 'yes' for client creation. - - ```sh - ./install_feast.sh - ``` - -* We defined example under the client/feature_repo with file [test.py](client/feature_repo/test.py) here test example try to fetch Historical Features, do Materialize Incremental, and fetch Online Features and push to online/offline. - -* The applications should work without permissions setting at this point. Verify the client applications of user and admin and able to do Historical Features, Materialize Incremental, and Online Features - -The Deployment of the overall setup looks like : - -![Deployment.png](deployment.png) - - -#### Apply Permissions - -* Feast admin needs to create permissions with the server-side feature store configuration by adding Python code. See the code example in [permissions_apply.py](server/feature_repo/permissions_apply.py) -* From `Server` create Permissions with command `feast apply` from `feature_repo` directory. At this point it can done from local project setup as step1. -* verify the permission by using `feast permissions list` or `feast list-roles ` - -![permission3.png](permission3.png) - -![permissions2.png](permissions2.png) - -![permission1.png](permission1.png) - - -#### **Validating Permissions examples.** - -* As in the [test.py](client/feature_repo/test.py), the try example attempts to fetch Historical Features, perform Materialize Incremental, fetch Online Features, and push to online/offline storage based on user roles. - -- The admin-user can perform all actions on all objects. -- The readonly-user can only read or query on all objects. -- unauthorized should not able to fetch or query any resources as there no role define. - -The below screenshots show that the admin can perform all actions, including Materialize. However, the user can only read offline and encounters an permissions error when attempting the Materialization step because the user does not have the required role. -While Unauthorized User shows feature view not found and permission error mean can't perform any action. - -**Admin User Example** -![admin_output.png](admin_output.png) - -**Readonly User Example** -![user_output.png](user_output.png) - -**Unauthorized User** -![unauthorized-user.png](unauthorized-user.png) - - -For local testing, port forward the services PostgreSQL Service and Feast Servers with the commands below: - ```sh - kubectl port-forward svc/postgresql 5432:5432 - kubectl port-forward svc/feast-offline-server-feast-feature-server 8815:80 - kubectl port-forward svc/feast-registry-server-feast-feature-server 6570:80 - kubectl port-forward svc/feast-feature-server 6566:80 - ``` - -Also, set the environment variable LOCAL_K8S_TOKEN in each example if you want to test locally. The token can be obtained from the service account i.e. feast-admin-sa and feast-user-sa. - - -**Clean up:** - -The cleanup script will remove the deployed resources. - - ```sh - ./cleanup_feast.sh - ``` diff --git a/examples/rbac/__init__.py b/examples/rbac/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/examples/rbac/admin_output.png b/examples/rbac/admin_output.png deleted file mode 100644 index d0bac96808fa415295edb0e91ceee18a930a3a70..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 206275 zcmZ^L1z1#F*EWI@GK3&7fOI!QNOvP4DlH8nB8@OZcMcr_5)ulM(g;JtP)dgq14Bqj z4Im-$AD-|1{^z~k?|Jo_>m1KHd!KXmUTf`pt@}PkKh{wrx=V8x3k!=#LtXg^7S`$NZ91wB%!@;e>qE+wHiQcMIOLk!FQNe3n~EbyTt$eJr9Z(x}GI*630H zr0md5oFwu@3V|4nEZDxo@pw{;r5b!(Sy|z0CeW18(+yUNF_~sLIIU4X&2626c36$H zaQ&Hfb7B&0oI(63d8_vGguFKJSVlBsAYDI`VLU)zOw08&Y(?s$bFD~WL<*!-Vg@u9dorGm?J1g*QVW!jpb%USIw*d_FLQXNSCt!76z{ zKCTuRW&=ATjThS5SlqxqKGv;B2dvw`-Ywuq1N?y5NRGh51GZ$qPx(Fe|DL@a@gC=Y z_i=J>E>w7`q@e+9pW3+F**SZ>bn#^TTGt75HRJHi$kRw$OVY;0iQmfB#oCS^>g0OU z1WOt!3G6!Ad0H_-onAY8NJ3?p|GGjF*uOa}z|8p9C7zBl%tqRe8I@ez?HC{O3-Svx z%id*VWR!NdeIfZoS@mDdfq%&`zx4EUl@t*0_V(uY7Up+xw-3JC}a@c~!x zdBB`Kt)P6)9xVUU$^Z7FZ0BL)?%?X_;Nr}9)324a%NtJ_X6Bn4{r^Az^PF~2hrjRS z?D4PH0$xzy=8OP@Ur^xx_YE|azBwxS*a2$y+F04a2^b#W9B2Q~%ji-^0#b$;An{r>E@SQ}eIJ|9~ z%ifh1`2Uk8dpAs<&=dQt5uC$hmx` zCWc*CQfc|72b9@i-61WHT)j^&Pa1bE4t>_YX^qSd`NH(`Ms~mIm>#>7mbH|X`TD|z zhs7z@9Y&X!DqZs8nnZ&v|!uY#@T%$WIXesJz0;CTHc z-s#6@+_@A7S4rwk1^RaBr)+x58DeZjiyj^c;Sbgwm-Yhk#t^B$TE(uCy)5n z8s^;}iT$umnMy$jek)9n+-!^A^qhQvI?|gT^q-;#+NLBcv!>Q(V*Y@w*seh;Mh>0PZk5)CwFqZQEpjk_xAR+&uLu{5UQD?&mr$383M#%fe0~I z2NTeCx6!Au#cS?;w zun%A{(KpcyMAtq{aRP{%$BI8?ElQ*U(-6uMhfNwDcL2Nd;PFm z&{LyZ!zH3wH86Xle}Fqy*GKPLKKH7uVm>eMYEuvzCbFLG(Hu%5`(5Vx;?ViaTDr&F z>)JT5X_vUliG}}h+MIPPUk|59=WTNFYh73UF$kqw1W5!B6mhy7yWrA(X+TlDfoHlX z7<9C^Xn}|jG~&zw%+0ys#|w|^i*>n$_N!xoFEfI}W7OXBZh&2xt)u);%=)~l7rf@a zY0I9iI_LTSPI{?=NRavcJvrcb%5bDte~7yoAkB?}HHxn8`!@?`6G@Wp(?hcdGm7LkLW}1bO)y zzFS*+0&{W@=8XtRBoJI$cycW?+2~^74freJ$owMkSk6_gzq#wpsC)>6No%bv`85QoYON8ywJCgM2|QycJb?zOOYADwr< zi*)Si1z>hNF;7^C%z2@2mzcVXc`pz87_7yYzGm@`^XY>f%zZZ5Ac}UqLq5pPIYPd= zM6lMrPiIH>wB!d01EbDhG&+)jKS6N$E2QrM4et!#Q--JokqNC8e!wLlsT)>95Y)hX z{F%}a_W%UoqRZckI-!g52wH^e)j>jF(@w*jj&z9NXRaKtSqE#|IoEEYh2%&4T&73+ zA}GomyA|j9l)m%-{bS*&t_+)-bL;W6^6&2vGsU_L-qXhR8b)JO z^ct@hx+fgZ*4|Q~1i9%wzCzq{_4Q`s9?q)66OG*jAES>Wl7wRM^BgO`%ooJ+XHonj zmii?)L*1}!CuC1T^iMHdk`7y27{vFv1Dn_-L*x=OB!DU5^jnVR7{2WL%&Vl`46kXA zBw@%^W?MW;uVfW`bNGACC6jonjwz+{R{lymzLGLP9`A;@QLhy9C*cMEXE~rBw z1{W)Y8%ie&W}#sp!xVl3;cG1Kiy?8%@SjL&#MDwfXSS0o3|+^@^3N;Sd)~hWpt^@F z+z#3GLv!j?S7D*~a*(a;Yq90L_WiHoD{$eS&=QoiC>@dpA)hf>OGmJmORg)e*O2Fs zjo6Nt+U1;E6!iMccbA2v$4ltcE|z+(B(=-eKfTRb`cpVfr>Mbj{fs$JL^j~M(?rxl z$_-uNZ&v-dq`er2{g+>}A9vh694>ph0SoQKU3skTLn?vWkSM<72P}{S$MXa$ANPLH z^c6>0qg5REzW%eHaK_3vO4^j*-*4zV=qwqnwb%V(I6?;E$H4`W?$HiYj|WQfZ0mR%)H;c zeeNFppy(T=&~WZD*2{(@h1Y7`CCY7CjkoXnRex~Z7|kbB8e!5@>vQe<)7g)d8{%tP z3aLpW6%ZSiequw434;vv|MP5aaN{5C=W^A!y!;D-F&ujJ`?^6-EJ>H1QzIg>w6l#v z^MkwLZ_1tt4;lF#^!A<}15sN(^sGdbB-Z6WkjTH_37q@3>Z62wgP>@IjZFJo2bJmM_2RsMt<$=g@6HdK z$&huboJW*pq6`h0GUpqG_3X8${{U-%&g6^bJBGnq_p3THHeTLtyE=C~0alTL#qZvp zKMZpJ%Q9+ADwvQzjA4f-5UXGbFcHT+{4dzESs42#WHM*5ZEE44$58Ngvncip@YZzI zBKLoJRWSAf^(|r0oApMQH~$4Qf`Xmnf~X^!kGC5KY5y5EMaX-rc7T)?&UQ=}{xQS? z*!jIFi)BQ<^W}L3=C8r>q`S@j?zK?k?^(x28|bV<@tank<5ws1^#2DV%0CGH2#!F4 zZ9rl_Gi+X@BR#s(niw3*tB>s6+2}`VyOP!Kh*|l36^8D7g#~PTXvfryU*$+LkBqWo5E>ox+qivmmCs0nARnb$+~U zsQX02WAnq?<`3y6r5}&%j(a}7bKZ)VyE@In#H;Xc;aEF35-^CnzHj+eGc?PV>D2IJ zp3Zw7oo?p!!^_H!fiY!C79B>Ou04){LSPBUboD|}Ag8)9)q3{r@q=v#N3-TGwv1w; zasYQYAM{dH(GZ6FK>T$ZB-@5)eI1|%Cga;TaN@j0Vs>| z=yaU!YC`t!0ELMr8(596B`A-2oveO|5W_5iCZs)aNM1+17o{1{rS?e zN*eY!lyCH{Uy`XhgZQsKtZIMvwk*6=#oER3mA2FAhgs-irDB=_Zl$w9oVRYWZA4 zBG?lwWv-DEZjGVemU>muXJG22KQ%I))y9JyadfP1m<15t$yebKcrte%)G_Rn@QCyT z0BY=afhhcjMCK?F9&2FX|0Yt0@YwpCzI*GPOB?n`X%PV0$i%ae zLW*T^tRNHQuD(}ieAt0dR@!}^`rFmFl-_eia)R<@GfSYCSse^g(J)LEf$!V_1|av(+FOhH zKYQ&0Ct7Wy^cP80Pnx<~$2EBd!j{k0^Sr^XO9wySxp-+=zf%EHoW{v_?u|fVQ2IJS z8l#>$DO^3kjH|76-dSPLeEEBhZAV*d;hE!;*u{Z+mW;#ieOq=KJOa;#EV5*O?7^p8 zK1c@wfZI9e&9sKJe+D@JsbcF>%9J=U)OP?bI`0(NWarw%OUwgfIM2`P_j!Q*U7c`l zB-;1{@TpsP4@TMIdJvJo`?Ac;5#Vq&)6$ufCBxmL_04`rJm=0W_MV(&SjxYH-9Pc@V=>naF&DTv;EffBqOvfVb&$ytM}8 zxBAA%*82YaiA?%>#`o+;YkMh8pUDUu;&e~dj>z(CPDJDjZJJUy;oydKT6YW)+V5-TZb2e~g`T%cZ@dp>&GxaG_XCp0c_4DWTV+^@)1Y?f z&+}OTQhAM8A+bli)nR{tfxKfX&HocX{H)X{hW@%Xs?QVqnJ=<5R@I3rug_=NSHp`1YY@e_+M|HRM10*e* z%-&DH<{q)j^jL+{B7V@s&=V2_K#NBKG{Fm7`T{1Cj6Je!x;o#ERKRF0a@iHHec^UT zCIEq34?_>J4r|#ch%L1iyv4eAq}KRCl$#vn9E3-fI9{dPu^I03OYbk+P zugb`i+EnSC%8^4q1?6uaWQ14(n@laGGV>LrA*!~E6p769yEXzl7ZJCp4ww z$a=}#2qb-v{MtrqvsA14BgpKMb1RzazSJG?QC6P)d$f9`WC@=wugVI7?TE7QDK3S3-j|5%`)3r{zu#bS$ z#g&+}K>&JQa(bq$1?B^fL_*vI&99w$O6{V3}cvHj=ope zO;jRIQh1PJ0)mpJQ~;J~ilRVDZV3TdO*%K361~I8g0}^v-}2Pv*rhnfEBQ!kNql=1 zFaXc_TK`0alFHMSA05;8P!dRP_E~NcTT;Tl?|nh<2-rfOtzzV^&k|DOylHXq5jcs) zr`Z4|p9cwleHksVZ5Z~;0rqgf^rABrO-xd`$J35 zpe5?U;9T|2Jw9ZRYf|i-4tfxnaoqlBj=^Tkcxh54i*x>k+_vYXD z*8J@BI6?t##gkhOKK3Llcf(X}=uxV^90F@3Qf+-RV0?)GV!yb6?}nLjw()RJ9>3yX%@R@CB(64 zVvBz1l?R~TV5!ZaL2HX1+GFllj$u?u&b_v734HIsa9So$)}xvBE71X5iTsfnlFJv( zyBDfdR?n=**tM(oJ^lVT{hc_t-JTuET6UQ2wOk&Mr=EGm?sxIxL*|sdfguw+wH7Y8 zPB6&cwQ09`+hDC8GsrU(!@P?GO;6Z=7A)xr4by;D^yI!lFshe@x_=Apl;8;<4HaGR z3h#@pe18wwkvl+uGi#!b2L~5}Z&$D3Boqw^v?J1An~)jGgiIQB+olij@U)kg2n9>8 zr9QPy?3cgSZO+$|i348Az!!$tjShEE!a5RzgA=Eq?7ZdT!uiMy9Mxv+L<0PE1#}ku z6W#|(tf8*#{;%t;^^=ueF|osn>=jjIEP$$zgs#G2!of#!C3Y6A0?7XUr*Ofh52m4#XZ2!YyE)|A2L^GA9WnudC}OjumWsXrLP{_W8J_L6{AK zP_SR<_p)fGZ9PiZZ67M1%QVdK<8|$~BH0Vo^i#|C>g0QHZ{h=;(;W8WN-eo{Z|di@ z!7Wi@*F+hlBWSWSM`h z98bdpZ?lZh`c$3MMlI3xSjR$rLGX6L+c5}OW^ml0IEP(T#2}9(4g#CWkzC1(db1V7xvZZ|@X6f-P<$s0eBW5%>D&JEo9?c(pK@~_D zG>_IFYS0ILts4PT98dxP69GXmGh~-VR40(26c8)G(jt|PFcUwgl6gQ=a28j-cF(;x z(pw{Q^T3=}TEN2B`EO(G#TV%nRK5oiKfsJlSr`mwc5MB=4`Kp6Iq0{1k6cO`P!w0N z!Rj(##$|!R1l>lRUZr+2#zfx=m0wWpKCB6gBqNtF@Kfq~EDB87AWK8slK%LJuQa5e zh+rhn2OkHFV`re1W>oPD6u|_y&d(>DaRw=Y&nBbDbSNiBi;tts-dGP?CJt~IDW%5Z z-Abw1mv>_4)cVELpi~_*EdOo*jOjVUd%eg-K8!^}-PPZ}^e#F_#|Ru|6E;3Tg-lDd zMnEi8;uFcGJxVxm>s)zEGAyS3H!g#+g~u{_U8KfpzZmfmRpDZ4h~0+|u&|e)Sw#iR zQHSX6NDc*XkYIu5?X=E%J=y)iZlf5q{K)T@&)D}Hf+uTJ{{Zz$&4#E^lAc-S14!F4 zVFeeciAZWIlO28oZ#5X-@V*aE(n7E;ZcASXr*mn!t&oN`DLg)0h~K_7D44 z7dAZc&V8NY{mcYCzh8L1_xT=nDW54c`sVdL#p3Rk2Am^Gr^nF`lbv1Sw!|AmLiuua z`bp`F!77|Qmsb;#I%lt@L?c?#hoHDmSTuY(HCLwG3ZCfv{?!>L1crsfPJmWxec2J3=4l(G zuT`1vR>7I=S+2d0 z`?!}x#D>@e3r@s)7T{hn@y{2J^o|{&DNx;kONH^1v_Evn$(s{9QoY06_|3dB2@F8q ze6fhM{r&eSO*_|bDfSpkMJ1`V6t=@Ug|3We(@OcEnJjaTtBov^65h&HakJTua zcv8BrUhE%K?G#)6CY7T6Akv{MLJW?vgLtYA(lZ$R9G&)*hnSze0)HNK3#9nNd%;Q> zer4-Vc}YaCte1wFXYczH?WFk$AodlbKl*4++#ir~gQ{(|DK);XmJxeB1hrQLZ+TWn zEY>^I7VP0Vp5KOxyh_wKj7ModEtDiCp&eWRYQw!sQL-Qb5d`l<>a^SDK4P)Dp)}&8 zEmpDp}T?^Gh=Y0Jwy!C0WUDS;C`O1%f zOFdsHy`L4*Go3B{u4P1RTcaNn%x_L~fvk<>A$O7Vl*T#gzWvZ;Eo$dZ`R$L5B-IPS zoefvvpM*L)?uYQMH2W<_v`>U3FQdIl|%*a zW`1lr$g!3BwVt`po%l2x&@-qZMC1Jxlb*|!=%=@0lVQkgK^@d(M=(yWcn2jIW6*so z@=eWn%orgEvIH^q-S5P+qh$ z-f`E303MBIL~uSgw1UJ41}_C2xKhyLFqwkq>w_h41|P7avO0qJJ}TqN0CrT>wR`Q)2I&ou9uyE z8eA|-RkU~?~NM3}}NH9;#yf@0pM)Jrn7%!II&*<}~Ug&5^ z{KSs+#z&Ucq_@>QyeJkj78`2Kp}_CcBK~@&Z1K(#eNi#-^3LzUyJVj_tE5rZPJ9Nu zgo5CO?}O@dcCW+mN@=pKHwn~`5TS{6Yx!PZ(Ti^2u^nWRhTlP0ahZ{lulaPJ@=DV! z2K-&Al)rszG1~AH^u?~^`LTC}p&aLl&8TKCtu8Br9Ao-oK#1`{sNRI=78`K5w0I?0Rm!7*Y{FUMmnf-4>ulj6yBymgf`D)pg9YApKdCdZsmmd5OH%u#Hu z;`Ql|Tq>6@$JvvqDgdR=(z_?PpJFWH?$a-cni>3RTqM>zNO=PE{1He|`+Ot&h1>dP zXoHgxmrE7P99U$;$bhM~WsU?5s9t8kAH7~(PB#9%8C@Ul0K$mXwK!4CyzX-HIhnk) zoJ0EO8`^Gpi)wEu?@e+l9pTCPS60|l7Z=2*Q~goaR=FWg*!pC&_wvZ7MprEKkRD3| zwZCq7#B=pLg4O9Be;CuFfY^5i+N(rgrac4nEk5fopT0|CQDaBZdI(%}tr64dO;kRB_83A4Vj5xuq@cn}oH9U8uJOJkDFyrPY&t)hYTY z7p*k(9?M1ExvzGSlF2SKu)k5xh8@j?IIuTSmu{z1qmSI_rj_PK)jsMPvoTI}E<)9{W$+eoy_439Dvty5P&jo26lZZy~Ezd6RG7#Q*e>C2qZe+*IMwIDjd zeY}YyLVg7DXGUKw9hVBW_v#eDy6swgRtKccR*&hfw5pZY9nY@d<*Y6)zh?Rh*3m?* z#Rw|1%L272spDA1{&eF!*tS*jZnzOH>*7rd$ft0WlW;!ZIM-u~c z(t6F0gXE_tVu@1(l@9aVm0ny=(G%Z&yS}x*X zVs@PW`CC6IPeNuXMI!=@+MZhv%%!lej<_iwXhgiQ<|mOLn{fI2Ttsa#I< zlr}T4#&8hwe1kTN#P-uB2pLQth##i3vpO1B{djTQu=pyqo`Rb)z7e+!J;{^6nJ47x zz25P2zdVi^wa;n!=gvj?kL5IdS#vEY;VODKxT!oQ^ijpS6k5M8oeqOLXF`Db9@1s- zXum3aaA}u_YgxN+UE1O5TZjH3%|fLeAkoU9O(Hn$Vgc0gd<>24x#%9?Y zI^}%t^9Rv=a|w4>t`ywo?bL!o(PK`Ge0+%BOb;ZkX@{$Zy%e=6-w`Q>lFI1^5QyZ1 z+vCybOo zIiYSJNnjr|Harq$w{WwyU!(SY2yjgez8r|cMD|>$b>kp+S<@Y==YoFO^Pwj|s=D?9 z;2c&nQTz0;Jb;Rdc;|;1ICg8xor>8$=yK6dd0D>lUX2;F*)y?Ru%RenQRcu+HiXSLxtkkXq8y@7OtaNy( zRM#hMR(R07{ANO1>`fm-pr4_wf9k&9u*7;3zz0b;{vzaW>L8+%d?wrKdomnn$Zomy zshCnG^hu*>`OYz{Byvqx@U|dMezFS1`UK*LOFw zuJ{IGn}xjCO7hCYBWYfSvRbyAqP!wxeHZ;t-bB*-ylm`g=P~ek)~}`2#})r=nQuiPfx>vDMSFk-fflbS9E_GdUBWp5OraT& zB+Y-5yS~sk1!#g_vgaEtCqQ9&Nb?k^_3nY?xq7=q%~ADHV&gqshnO`OywM1%hYE87 zG$p$L(clWStZmt@Y$+`W^_ccGwhE_UMFF+dotwh)rV&Hnh1Bg#Ef?=&d zku&5Z@amA^(rK;_GaKWvQZWnmjRQHUGw@jylT|27~*U61j=Qv&fSVH%_gTU&)csrtLnsN$(j=zqB@^(edO@^ zZiVOYE=^Mv+r}XGdCl1_*IzB+_~_MbM3c>&fP>}U%%moiZf91(KxNw(ZL@9r*)lSbQB#0 z*vBDMTMvPPs{sWaVO7lY^#oPBpTM(v;L$@Zb3P=X28_zzyI7AEM*-v}PtrhvI3=Z8 zP`JYE1VG4SIJ|U@pyy)QGjozAQ)@T?-xNl9pNZx^b#w>o`+FI^18AdRh?np=1Ge4l zY)Q|n|FJLnxP8iHlt}j|z-`@-Z!+HBL}&05%8d@+5s37}{H5;l2F9u1GHRd~V7cQ6zAghQG(b@K0&2RmkV;l2kR@coh7>Fx)0O@LyK92MjI z5KwU57XIArdZ+sQc5jzWQ|JLUA@7oN%g)2j1dX~ja!heHy^K#2ppN)nfxryLQ@HTG zi^g&LGy?FriQC4Cvc~sQGRsBiE?)x#PdamP)+=sEd8s+U*%IAn%^CfYk_tV%t)?F@ z-hBan-yja}`4$1@LF3rkXBlwT)P@|^mlz^ss4xH3e8>nT@3@R?z zpE5Aj#$Y0ltbu#^jC&mAx<7pPV9%KR%`Xb}MRxn~Ryl@~^G@hX2WM#4i~Pg(#%a;q zC?1yRM!--9F9`(@j}LNb1`egKy4LIawKDh->vVej%BH`ke}>_;*FXMT&`SQ3=q^S3 zD-Lv>zimIQ#OgU<&iXGcCNnQ!7GY%pOSuVR_u0;TNlIh#qzC$FnNrq^PUh%%P_^2& z;LClW7GQv2s^Qi#N;s0)Lz4XBDGEp2t6z@G(>OO0KRdfsy8nx)RHNBb;v&9YbW7o^ zhp&tyig1_8%u~ zY*&gKhV;FWfTrwwo>eabnpkya7X+<~ybcDFYecbk%n42+@h8FL`{1AX03n=}_`4q< z)unKW(jK3XMbps}a8!!TvZGfwsl>Sh^a__{49MXC;m;7gLM2TGQ-0Xp+(FeG?AQ9X zY=dD{A~mj{c}$1%9SQ6`-o;>DD!S2%%?bZ=eMOj4l8;YlP7#}biISr1;qLZY+y#QF z+EV+=V9TOv#!|O$k${31e(|;LijHg;tPq;413OmL>7rZf~7xn_yo?13?!Te}Eeat1`j~&@ZfY4F#C-jk8 zQ2TRdDCR^~7bB2tKWO_}nfB_W{hF_t>W4Mr)5ZPpLc)5BWlf8s%_e%co_oxMs~Wzz z?XJ8AtRq&k#wP(P#-0sZf=9}nhAKX+Jncud1pyTJyvUo4-K# zYdnJSe16Ym^(m{cag!7uVk&}3Qc)CJ5RDdFZ5+ej_XKmQv&(}hFT8{Z7QN=2ctGq- z9rmA*YmF;5AQ8b|6*Je>W zt?8QD_W-z1gK*)`Htwn>s2t*`3u-b<<%Jg~*IQRf?mcV1%}XybjY7M#3JWsbI13da zg{%TsNkerhiDhAVWv@C!jUf%iePXY!x@sUUaO!P*D$dnp&-63_F^gCTzF6vC{RwEG zl236EWBT34nuV29f<+ErkhbjbvJ&} z>e(ZcuGV6sa34hwh@dYhOpipO_-g)8uba#*QE6G}mGU#xC`VB@=aS5P(JvE}#BorE z|4#i(<%57zw7zP(k+|PuF-~3csFa!MbRh8F#q2ejYtqk74{i})KDO1-Ez zJix(H=NPvv#l>r%dS=U?Dz#i@6{R7uM{8mo&DI0`=3gPbDW#7i3{booT3Gpje7uTT zSgU`OZ^MCZ-e;sghUU2g3#oLz4LHi`!T3d{^1*N-Tl-tnt%$ZM*UBTaQQ%7ho&ZAa zUSAf24LE_)B2&VKge(3;e&I`w4VkED0wgJXxhHmti0&3_1n`(5iZ*>YUjao2THXx# zSpy?2J$k5`Wv6_mE9gEAWy`}ZT9`2OH>#Ba9=qCWnQ>CIR(e2zBhid))+06T+R8k# zNkE5-XPfMe#}8VHD#npWv$qZRQvZ@TC=6Ra{$b)gCi)Qv@}#<>cQspsEbMC-3<;8} z-WROe&%JYJb=ZZfY}8;Zd_!wFH7S!B<>1kOZ!bpnkzM>9IgC9o7MI)=Lj9~2P|5TQ z2japnkgi(h2wJ!Xjhq+XmT4jmerv@Uqs{CIW9Z{tdM2Vv;;;ZLvDv0Y+1ypb`|)k) z9Hzs^;=x^?L;Qq(hwFM`6-DG{NIUvtD#6E0=Y;KSW=Et*E;CoIaTXXXVkGul=A0ca z8({h}{0 zWZ3ss%|z(Ak`2d8&8@S0d_&dfuDKVF%^}W;IC#YOLrH7Yd`B;qoQn2Fj>KY*NcTeR zRhs&cZoIMuw1QdrC;GY@^YTMqTaeI%0bvBoHCPxtA)kNnp=2a}ssc_wQ1*6Nvt5g! zV268^5AgP*O%=a;24PYj9;@WAale<_OXcmfNtr@U+Cu})lm|K&%+E7Zo`|hd(5bWp zJ(EjmQ-5JC$&WNO@UO{T+iYS+^%twZsBzsB>?RF;%Im7e;9mza5!4aUN^@Rl}@ z&kl6*cZ3U|Y({$CNuniUyD#g>q5{6v(UpQEPrb zUN@=TivdJ>Cp8BG?0u@Ww<(as zf&25k{8v3S!b-41JyiODp3$GApB4c)%{({E``ol@QcNa)VnEF1mcNT-DJq!vSs3PP z58)FS`yN8pbcnB+a#LQruP5Ume$j_(4}R_dp2cwT1_i=!mlW>(0jjTY`wI7YNZxVKUQaKIBTibu1+Ip15xes zePD-ySbc*p-HzekV|2A8814s+q_3Kv|`qMxN6q@MG*}xf+NN)Ivalq zkL#*;FPPRC}8+^=)nZm50(1;$63h1O}Mf`mHao^htHTVfLOtnfW z-;l;eqr$Xb$smue%#>P&Ed3rz*dlzi{XDxl0?}(*kR)q%zUpW%v z>B0nPxk7P1DlISOUnm<4BMzo}OV96(@Z3IAs{uX%QY0og4z<##+ykhF&r9F0Pk|4} zhW@Z%M~>ybnKpL6nvCYi-MHxKgsHIXW$!a*a*_|j_$GVBOx8J6pWtEEpQgX~9hvUl zmh5fzO^b?fq$|hc9iyCE`uU;r<=xB&Kg+JYK0>ub#+03JM6flTpM?|mNV6F_Y?t%# zY<)vrx=QzYK2$`mTb$kU0-&ywT5cTKna7enl+?u}J$7*E0mty0SqDVj~sr@!t7eW0n0ep$YyH}%A zOfZ}e4~mAFw)%P3Un`)*ISl12QyeQSmUiQW3QWbrG7`jA@ny5#o|Jk7=ye_lgaxRS zEx^e4RTpo;R_dR(7UyLHj4RwY(yKZvk3*k8kAb*BXD`Qh=c%R88I zJ{5EMm3W>)FCniwlq?o9K<)Ct?+VD5CFL>&-aQ)@jYXUH%mMl?o^zD0kIFSOIjIrP z*}zAXdYb3a@x0q-rrRL0z(iuz z1-2)$L@p;IX-}H!vPb2z8@s6CM~wmQ?Dhd^TuoDmiN(X*v3p0Meu(_{AV&;IjxsN> zDtZiyp#79x_i@Q3`Vu_tW@!#K62xgC3D#)iP4I-!uDpu^3TjBf$3CK;Bpd(@tyhxc z`V@bd^4y=*UTQoy-{eTWd~qc~Ym^V3B(7zC4dnJ}4Cj5E*=z)78a2;bZ)qcaHugo_ zyx5+p$`wzfpP8kf2*EzA0EEujfLC%VMA-h*L(L;A8Q2NM1qf# z)bmi4@0S#)=Ot#+ytG?_Ns!Evi`#dFQXbYsG`?6T$h zFMJ+W|LQ8=h}yU~?StUr`MBn{;ll;Mj2By_oC25L-0U#WDWfFbo+wkOEgX#MVjIc) zd_Vk=WvAiI>SjD)bZY-FN-3cpCmukzZ$Xz-fsTU;JzC$Nor;uyrRcOwT$PcSRXIUn zyQ^ng{Lm)OomNMX(~y(%6BlFBorqp}+l>c9BIEJL6-YyI*>KfnA;DvER|h0#r11w4 zop*55O4Qj0!$Q+6GFeJVjcn9G(Ms z8O6Hk2yq>#Txo^9BD*^`=BAE0bXB;L6LpITtB; zvg;<3(_PSh+>{3($i<`g#OH^emKhDXzOzjhY#PZ=UStVAIHS0KHrfC&#}wm$r5M>^ z7Zt$K-9oC2ju|Dbr6gZEsO?&(@9JU@R80#BA+}0FmlNHo>G zozHrTZKs@RpWY$AwY;(j-5vFf8&bq(fb(6zIsn}-%QfZODUz2otq%ujFPU(7DTx`0 z_bmn(BXRk=?%q8ST`ZCGzDvPD0ND9`c@rXP2MZMESF7y5@ zusA!shkW7y8{v5eVUwiR>WZd4cmpz4m18jl_hUF8C8Vy&=%Nk>m%msu&=Q7UDi{Qy zQZ$iRmfabjLBV(SLV7)L zJgp$VNqI8Dw{XHXYea9?Ko)Uc;LI|4Thk4;w42*&O-Ed&^Z2JeuSQvmyk}9pw73=@EJ88-wpat`s;>O0owi4zek9B#Ch=!K%>4u+4T5^zE~1$`!rtBGAg+ zviqDQQPMDb;CsBp0m&3q%o728x{N=UNy!2zGH_MKq=Jf&9(#7MAYwea+GlXJzhzPr zb>3^67H=A7e4fn{YPfgBo8qeZrX?iMT%p??MF_ARs0otdM&MA9TYYKVNcfRd`|p3 z?|0*>&WkPj)p8DvTlKS*&H6E(E}0*La9r6lu0VwAjl3_eOv#~#!)K8dB9PM%3s3-< z2>kqWbH#l^4tgHWjbP6!6{k4Qekn``D*?+L`VcK*NNV~N`RY>=tEF2?>`yjOfOfu3 zkQUzGpR-u=7_5skCEh9j;8J&vbNg1L>{4qtEhd84ss^wr#p}}w#Sn7z5ybQ8)e#eM z^H|<7^A4_AM0J)*Bp!p`C|bLRHO=QK2b}8FB&!o#FpDL0qpi*lIgZ?-e5Bjta|=RU z$S~fZ0KR5av*^Iu1yIIP68LP59W%x0($BwwE!$uFo7SotYG;Lzzb;s>k-h-q2)-=j z+X}n=#pa@eG3}&Rs>Af{Egofyu0bh(k{V=-_EYn`ocOoLE$VosXa+i>-!S*#t~=-S z^arlXF7{*XBq)`be+Sw24d>vVRM%DRotKlT+I{DNw+U>{xCn_oTPa_h=bsqyC_3C z(yey)lh`G0EE$68+{~8navH?Fbz(%i2K=W25 z06YEHhe;)H^#5b;t)rs)-u`bDC8VT5N~F6(7(k?v5S8wd?wTP*x*J3hq>*kBhwkp~ zlJ4$jk9R)5@8`bP^T+e&kHuQ9HO`zloU_l~`?{|8`*p2hBCFi-tOyOPU_5BLSt)B0 zMP~4xW1zY+LG!(q5Ps1eAOPY+`aR7SQgg$_ZH4zs&+5fAp^A$h&=-Yj+gAzhCa zP38JZR}xhhQXr8pzq{>8l5Y7>44VB5ONP+vyzeW`lO!woEfk8U0v2=HFYr2xN6heF zkfb0Pq8%Y6>NXq=Hy*H38TQwHvYzbUFc zR_xvakGkEk@a29l39tDfGs(`T^h`nIm{1RO9H=ZTa`*W^?qrV7B*RL>I64d9cv1f8 z_!{rYiqJNVi1oK-?&j-B>^(KH{1hB4HjNc}9$ccN!&v>`C6u;w`lxyiTP(tW1!j*v z;lS#P```Sw5^vqLff??+F`h<&GViHjI?Qp@rBg$hsxy z7ka)G9@i2t)d$P@8aP-flhxWBMF;Rb!{wQZHPrfa9-lli{fMy12SEJH857HK2kuu; z&t*|w%XxWydTv?(EylU%o#fM3dK%54i7&R;}|ZT#G+?MF#4S00&b);bi0Ej7Cjt}%sXrrkDkU1EoS zb+-27?+ZsaNjbas1Kvzp&4k0hm5g)S+UovZhG(kcu=5w|0%^>x;}1QjD5N@G3=Q7_ zg)eov{bK@>;}CKgEw^q;!yhY{@eZdd3DQ9l#Qc~F12~#5aZAWc2Mcn-OzC?Vb zJvo1~TYJFTnd+q!%!g{9@@&;{?ybzRhCzM8AI_WKxweDVVXvQU7WN-&()72a zd9I&J4f~C!+hJAqfs{GE2(dSV5BUy(7th^u*q8uJt#5mUg@|@acA`CDlp1zHbP^gi zJZLJHeD{Fr_ewkE$CqDz>W#$DGvPtjSd^ivuZVJc5(fKM?njQiJNcdpr!&D#$pQ&p z=6={A1!-iDxUYfwDKTV}dEvkQB=$+jBK?9BG==VuDWJW_{Zt}X)I z^?4ozdAeiIMqAy~B769naZK?aJ*V(RMNKT`v9b-*=Ibw1+%Ria7WyrbHg^oQJ?k&) z&y4+Do8fxhOfgBHBSH_dOJm81{Q&&spC3B4gWoUR~Qh;;VSW zdqu&HuNqVG9hPR3Sc~$eFQ>!N+laQoH|lp5BjH?8!-5#1ULB?K#~ShPhwO~=w8T{7 zJ<)tsjh4K}WA+8-&@R6fdY7fmO_ZU|$yXp-fDjp&#`_f-LUoKgwQ33?ZZW+(R8ru} z_ZLy}mJ;R%;jLXp1jzlQ5T2&;S3KnT3s7tmfAeHjoyA^ko>pc*g6WDauL5n=i3Lh* zbLM;-CgR(^r zN>O_P>^?5@CV}w7wkrF++@si9j_DPOeq}f&RLP4Y0mAMs?ykQ@C&)8XCGU1jKZj8` zB&HvmgLEKcNL#Ei7h`hpj6xT-uyjY9PEKcXXddS(`jOzK`!Vdx03+17Zs#Y41L0fY z5t;d+T*!EHadzW$^l68CXU20_-|LM2gETMQ^mN@HIbPGuS;WQ3{q*$c@#)Ok6AsfA>`~ zd>!YHLYT?KZpt`2;ep0T4!2iJbEIGf`evGx{oW>*_+3kq>Gp_BDvBC*%9m_qZQfM3 zB1x{;zT##~adYJDpMT{ny|3;inpLqcICT1jThq*aVb?kopm5C^vyc&_tUT!+?f^>tPMo1D2x9eyzt_!#&o&4eAQ(+MoC{yHlif zZ+=@@S)Ei#DQB&c!FDXd^)6AyCfPmtK4x#u@p%{jgLCdr*)IbCrGZ{%P?OxY;H-5C7Mns%wFP$|;G;NoAZE_Su9j z7HFnq;aDvVU%ZvM!QUYGAepK;i5!N1TduF0+;^VbC=is|n zUT_fWtC64mFS?`u zvaP=)1^On7=BC~Mg&3uZ`q>~?tJWsJ;D0`lHR3&(=)bxDndS7?Q%{BP)SuK8mi^Ci zs|v(>_*l04{!8Qkf1H?)jX%QRKe|=b_4I!*_JZ57TI{oei3lE3<&GACA9i;(Vz$%67giNl-491<37j^Hr7X8V;nt?!E& zl1>-^$T%$r8nD&)SwQD{NBncFL3LS^S+uex)uD@V7Q}rEF7uwQoZovOM?IA^whU~@ zH9+!Ll?E{kj&4^`)8Qp#<%Sa+CTm0q|09bom((Z4IcIwX?SS~xao#qCUBi7FfZiBQ z<<$Y2Hv2Omf*Oy@PUt{{!B;?tHUs_~_19%h)d;!evLjG8Ro8i55w@{D)<)nOfTV1X zX<1A8TC+(r+>#YO@)RNINuYVBz#ESM3Ro!2z45?sBEHd-{c2Sf><+H>7E?OGp*9h9 z!as6fo)P&BHW@MebP;O+;+gfo9(cnRRM$aCqDNGBzlHyiuom3hat@RYE^H~OOdHcf#^9p;1q8koY+vhxF5 zgdh9&QV8=5{yTZ9{u4`J!guDMvGctG)C0eI1ht492pDkT9nV8i=i|`#h>Ji009#>d z{{(O&#Ky+C3@;CBOIO zxJtzUDaUou+iQ}j^G6p5h7OYN6P@e7Ch{9x0YW0Bxo&V@{{V};BHD630152^KuJ7L zraMqW#+FQA5>q1qEm-~5U`F88O03e#Pqz%Xk9h#fA^5;}Ih;S?dLB?6T!FlmPKr5rq=Cqk zOW7ssZ8RF>Y!l|UMzBUC1~jveI21^)*nWanLzUz9xww3(;!i(8@(Rr77CNpni#o1=K8{`ulRah)VRJv% z1mwfNC_Xc8D-|SfRM;|0zR+%UGsr`E*)%>P!l$77=Jd9AuIL}P4+;|B&9yoKY;s~3 zLV4cu&d1R+r0MExZ|^UA&SKHt;doHmG$4x-JYYG&<0!}vF?i(sI44_Pn-=~0Gt} zfa@73KX+91$i4_0nNpZKh#MBi;iYfogMvXuoWGB%0q}yYu~N&U?wCJu7L^Ic$TN`I ziorxRu~_?HanQF>I$WIi-hM%ooxd6uGM#XbK!7DH#P|Ljtz7aCKTa%mDhv{jh9@GN z9E%$MIoQ`nBDren{2)sbLWF)WdD?#UI>-7w-C@`23kq|O{e~vHST-T~(7*(@>PPeGxH(StQ}3>GpjrE$cle;Paa0g?wz_k}@nSvEz|sdPN%|D-+odKkp(x0) z)>(jbB28CL?DML5;5B>gNFPI{`C*Y2LDNT0tBH~xhU+cjX}8Z|1j-zHvI?92;PNxeR`#;wILJ<0vzT`{BRu^=|2A z1dqJm}&Qu~*S*pcCZXo{;hI?f(mV50gtNO50ZdpyyayJpKuk|hD(Xli^^-8EO`dX z1wtFOk+ntMt(nX+F1$anbvfHo3_H9zFax`$X$9Hom|M0Q!;$a}oZG^Ie_R{CWBLqk zhNV?mRMs~)d|Z?3PZ2iZ>J_F8DpW(H)OV!hWDIBm};Wj#GWB0?ib0bkmN>J@@0F?BXLJyl}D;;4IML5_wKxcD~x=-qwI@#XgW z=Yx)>0@ArGJ~u$kzs5K3;n;pk!x7NFzi@!?pq(3r&H!v6l}2DdZkdTmtL1yTvO{^% z=GTvvNcY7kh7Z3)6xSPZ`D*85!~{6{oa^x2eTFboYK#Nyfp(X{H0fSp!ML8P?&&`= z0G~xPm{}6PjeJ;ZxNXplJ{|J;+Oa>d+)O|_5h?8jJ2Lh+un_hv?xbs_;!9N}7!)jq zQPPbQ$35$lS+xE00{l1#H#)Mp3i zY|Cgv%VWR*!9rV3rtG4^M6t>zQmSF;d%UDqCx8-MO{TBIoORTKj%rHWv!6nl?u60dM6Ws;78ZTihQp#urx+Y5XIi8Sx(j=wxS z|N6Oy47%VWd-aUm8tGzX!8waVZ?}0~@~~isGprwA1SiFb;pZq2$k&lAw&R(16x;tu z<{c1tAPgt^xQ#~g*Cu9~(dM|F{z8AhvHX$mgSJn=?vEx#7seqtSV*4==Yd}6hc!KG zmJp`tlUlsDeLVjw&|VW3NrZbx*6Ko0_0hkjKGYx#LGNvD&)WMziu}o`&V+m6jV&bM zJm*(MX(a1MvbVy9EkOzJa@B4L4UDp-aEqkQCE3&;{1m31J7wK$OQo3xF1-H~4VzIQ zLT-wLgjld!=ed9X);_#EO&~Q7?3@g(Fz!wY&?MCf|6!sfesCB0au_R>PvYNF703^W z1IF~cJv&3ZPr9!{FFwSX!2T<+|4$Foz$^|&^BdR1d-?TL1D#J$`+YWz3rK|i;S0iC zP{XPMl_FhiyO@msb<_0kM|>HJI9}}i%I*InGXHP5QUF8*>41DV5T7+ySn#%U?D&SoyRx-Y0gs|A%`iaY-YocL_m_Ra(LM zm240|!c(K&-DRngPIoH+JSRH!UN>Jp8)>P6B`}bbL;vNpFBUvQVX$hzlk*ieOXbMh zQZsVGx_{r(WjA+i$v^VH(IwPFfB}b6+|G8t5wxa^`uz1YEx1h>1g`#x%35}y=4V_$ zU}^!d4HoN=&-(R4RV$#HPIJ<|0Jv*QBSW4@PXGg~D!{hDuj%X2N~%#1J{cLp?gPuB zNjg7S4)<1ciNhG7IM3AX?=raQ0R^dEV*EIt-_$N$s)vKQR?q5Y+J{rtlQ_LNIzC&p z;Sb@diCQ)#$(q3*hQ)(F2Gzi1Kb$fO+GsdjlQds0PRX`|Ib7}*$@u^ zMnXiLQP;QA^S5;N6kg{BXMiJJ4WgwfR)8^-J__~00(gfxOLR|+;FjlU+GPvj!v`l<+Eb__rQEuMrA6ikZ9b6 zBs?7jEC*K%Tl9u1HUzewSEtVXkR$nm^MGa$V1C#@A@O#4Sg9E)4>r5Iz*u9Ji>aa2 zljx_~>FyQWi{7~;%vZ<8T&$t3$lc2`R7I$+?^Cd_UjE^Pb@0<>(37t}{WQQB_(6JP zTWRWdpyip`>i!Nx9N;XIwZz31{~P#+5ygW5{^9DI5hrv2T-@|uBsZXr6H?gL zU3>_9=1OR2=ciIS=>$v)^Z6@Yo1=BGu`6n;2 zOEwKgUOa(iXQ9MgAQ9mmdSDImK1Kc~W;4pcmT|vuaX3Eh0SFbXp^HbH>H*k{9CaEhw~yym z(pG6kmJo{olax&T8(W0})<4waOt60TQW%v6yuEGQWVI5e?Gm1Bc$82=_|5t{`R`?i z-WMZQQ9t-F8WX>U*s-Q8`y*M`-<+07Zo!ZG@cLsBfnLhiIGE8^ckA!G0z;>%BOyy| z*Ne9xTcVgAl@jo=m0N*0Stf84 z5%D{N>z{3uh5Z^P1GcUBO6e?-K0uQ#-_@MI2BKx>g1ItYq$c81z{l?>2cE@2AGHo? z<#P~6vYUKjwJCyf9lQWkzE@+wXrO{)d42y@AK_mVq9dc4H*Re~>d9rN40Dh(fsLPU zY$0qC&XN%vL*}!M_nQVf2yyq@n708OkYG9f4^lle^+!7~vRr%)v90>BI1)ZHJHqEQ zD#zk*PYDEH)mI=m$w~$e#e96*E~Bw{F-ntOzzLV-=<+KY3B_V(Iw$>iT3!s)tsJl; zX(2w1z`n#HMx+Z(>qu`KX0{H$c4`Qwdb9Pg&ZJ7fUIt5t;fj> z>MpYe&tGA`vw$ zUV)6HY?E1ciyHYODS40hr>nvNLcTu$b5qGU@u5U+y1wh9HO0i2+Fb7jau=f)n8u^9ojr7bn_A zf<-cPWDLc@=u1IaFsWvEi!$i1`Eljn@FB4hE z!lK0i9&KH7Gl7o$T?4-nrk!Nsz!)RSH=TqKsJQ7zqZF^~FoFH$;?5YJ^m_rq}s$h1l&ySeI^}SIJg6XI-Z2NWtt_ceNZHbHC-*8V?GUnA2EeQ9fX+JDkRzVy^Rz!S;CR^+5Xo=`v)Vi_YF-jiJ9*64L2gt=p(} zjV_Y{BYGdahSD1kMsDGf&@;3nJpT}WiB4g2xB;zfteWfQgPnSyBw4zYjqp(ejm(qStq@!ITUXJ0vWFiN;rqY-e92#;e@RfB$*eorEnHuFC^OV-i(?Br zK}*#G+22n}=V9)9k5mt08$$U1$lhFUimUvB(~Az~gY5UyrmvI>G>axMrNkfgH%!qh zXd+&pVn)bQf|k|r{po>jYE9+(UfB`~uk3~Hebws=?07J_)Gc9}6Bzfn#^F*d_ohx$ z!g#+_ z5`^9Zpj`3l%(!n0(4t`!*FgD2Fu6LX1kW3SiZetq--fX^hPjKvWQU;sIs|$bGJ3U~ zSxfPrzpFbCOAB*P3g`s97SB{o#tru&ItpKrPCb3ZkjJI`Nf69>h$}?8QO1 zn%?}()>sC5&vHue0Jb+bL3oS4i?jFmzOiUgZ4MI&*!m1XO$+ zsw5a~yQiTx3HWPFImr$o9Z%F)b8^9hg$jZ0J-O5xb~u?9l=y=xw3(Zc*K|!2-kv^h zX1VSI!pA_L>ObmL!;$eLUw?_WpqRb37sfox|IxD7=)78=3vx z_xd7}dWQ6&q<3_Ls~?5G9&0(yoKdy=PxBx7XI_Qpg`Md+*DKVFTCm)+5Xj~I>J@3v z4Yg;s#JNnqXN&!$d2WQuv)FM=USFZDN_|XTA7hSp=JaVUzH6mHgmH%ZC7q?t#JxBf z7n9DMfE$>mKJ+q0YT6LT)_~Xux1J+rKhprn|LE}6%`c(Hp?c3=UkZC;ssDDUfbYvu zqQa1(!d`R)*1cTj8Di&~B8(4&Gh6%BP#1@dR<9+sNk?*wiQSzau^ETu-aNJsani;Z zNAzA;B1()Y8@P%}=&dwM1}?Q8de6wd0Qj2wTZ%nSGWwz2^`niSO=~MEBV!9mJR4jj zo|6Ae;M93+qN~CT(DV$mj2rWQDj}(gP0(4jV9Ae zh4->@3-hd6+Qwmrc^l zS!UNBU_Xo`*}4}JEfR3co^09Xr2Qq*%_|UoW;Ic^!rj2N6V8U^swCPNHLv@lBSc7* zJ;+)M>Q$l{lJ%s!QnMKVI1NRAsr8gC1)sffONB6F7qFCk(P6d+NKo3$)+=fn(Fq(& z!F~Y`&7Ue4V!6xPRJ5w0`vQ$$86z)`H>g$LV4gjoH!pG6+!R{FElEddZSq9IXTJw0 z+NVRU#jC(5GJ&EmC)S>|;lJ2J3pF7ujgM3zV()0u>d@1eD?eN%Nzw99Z#<0ca&bQU z#FAiI(ui~~^4ZLX1I^~8E&^RqkXv}P97JUQQs1P8g-UeA9#p6VutfbpkAgIpPR7{sjeVIK5MF%apX+pQ3Psk) z78M(tyloaTj{oL`o|otf;SaSNzh*=y4&*HIfur+>HcMuuzNq6AV;RX)wqdNkmmIi|An8Y zg{p=|zf6u1QPuY&toWxJM5NZCUE*^DN)Kp_1q+0%iG)8TKDqpet(&_p)Mf&$04wr` zg*)dThfZ*ieX+7($}03alA}r-8Cv{?0sETG*F9REgYtW^O22m7 zTQZ#i4aB0Xni&YqG2b?HX8HTX!9(r#{yuT))8d8J(Z8gvtoq#Hi%13-#zxTiF{Da(bMv=cD+|Pp&!87Uik> zNDi5Ub^*K~KH^I-Rm&I)a$$84cl3wv@}?qN1?63Q3`-n?hTZ6~YKqeB&?Pk~RNM!- z(OyDCuQJyN&DE2bZ7j&H{j^MEi1QGY3RsKr0Rp&ty@eDT7y3=@T!8;E zZJsakr#EiEbywArPAw7e=CM4Xa)rsk^_`)d&iPtuRM$RXTYrrxC1qWNQLXP(bmi+!!6HE9U-lBpZzP zbHf=r8XG9`9gB&Lg1$;q0v-*bYy}x#Cb%Bkt7tTw`_3&b2p4yO)d(Bdo7NPU~d)piiX={_0InxF(*JG_W zwQ$g#LqN`ZxfYGw*IERaU9%>TmPd(0n^vL8^+xES!UPhy%Qn2$HuXi3Si@`yPTVF&jIOagyo|*V zxno5fan2FZ6xH`Yvz$RmlxQPbeUfv=h|4GKYiSy;=X+Bw3`RYT@rVIxjnzYzG1oY9 z+m%(lQ<$1%s7YJ6_>8rGcmm_gOR_(7ngL6p!bL2;fx%l32v|d(Jp4t z4Xg@Db+jxQJvYQA&*OuAW16M|`od}l<@-oJm-piv7PG{X&}lFjA#X(OlK-K2)Vq)> zhCz;t{0v`SW}DhrU$5WCuV7+{wINSUU^0W{_9h4`VboYPYvavO%S-$Wwdx$5@Wd*!G-6meok$M1 zL&u?&+DZCUO7aWl0*ff(m~Ch*g$P6l#z%p#foBjY)9T<5H$%$&)V2&qRA7G^(7RkDv1s^X@0V(jDSz zCb1}};%dOctmB+%E<4<9)SOPE;7b*Wl``S(5%0%pFrxR^WBO^bCFQ=@FaromC4cIJ z6_+n@;Zb~YNYPC0wV~w1)!l^T zZA)=#c^r!X-*}k0R^na;a-AbRQk^JAUB-g=;V+X5%U!h&e|&_|$MF&W=X2q~T&xkd zb;_3?iFQ~s)9Z3btT|bj_fp)J?6sL&jXzyS$r46xQt@`h5MnE~Jq;Utx`UXaPevq% z*MX#+X2gERXo59=`OwZp{%IHS#Rugv0d`>H71=O_9+$moZizYwaVyGM&hl>mJ8bWz z+Zq_QZ3-GaJh5vt>s<-zB)Q?;(Gi{*Ugf=VjiwkZ8_b;Zbpwa@5BE=Vy4K4G;@z&-u7AgFctz{Pgsy$0j?wa#+iJXncx@Nl*9*;} zqCX=1DCEz3P8cEbYme4Htfef(u17gqpx$h|wEtw-z7*0O5C~t>dfN5p^zLB&^M={E zr37-Udg*z%DYjae6h>bu)+UNr#}V6sySK@kxVg4ZUs-))kLRoHc^V}H+c%FzGNc`u0-sp43zwb1h-BA+7|s!;>|G@zR%*wJGWU5x z->K1vs#i}KZa$}tf2+co-;JVsHwjyODsmhh;;?QN%oJpaFw#$UV)!>WH4lBc%(SBRU{dxW2$-)ptN9y^M`Qq%_ z*_GT}0UNje*cmGcz6U32tFKRI2Lc%%fVbcLRqRKQYk2cQd}r9aH%q|Ev1%IxHhO%b ztpN*o)7SBKE`f528%gdM`7jG*sm+eP886o6&?gWew?d;8v7=bzB2$c`{O?D0QW76g zoJ0+kIWK>do8pmrRmE5)d0(!ZIKbPOtuU|*DnYle`&<-a8da`I2PaP6c(NVkoW?87J4FtL;S@x~1cgcbxmU1Q>idG{-Y%+H?=n%S0N6jb4#vu!hR% zi`D;d(8*lx>UelP5J;78btC5TLrJ5_7nz!KFWjGlH-K*n5ifKfrV?N;GkS)K@+)1^ zmq?A9&#SApuP(}gBwHLO;hh7zjR|9$R+7iL_!AftK=WI6m?C{ZQ;o3%3G41PBBiV#5T9RgrexHKC z647O}4Bf-&t5Ox`@Cq2+a$$t@lYZlryIn@vJLH6l_~TMoLgsWX(@nQizTnS1@${Qr+{&4U!u@|4hCX(mYOQb?;TF&rcy& znGwFJ*VHK(7PZM?Q$5*P)Xgb6yw3dA8G&+BM-Z=u%|1P3n_=CWbU%ZoyZPCUNcq}zPdwntnwDX|P}T$Y5tqq7nlT_-UN<#1DX3amUj zCqlV$QQYRBY4@NPIkq~`@oM+6kKqfodp^h!PZnxxZgn7x9(0#3Ia1VlWK4=ePe_L1 z*9oJb(0SuXbWRPKGke`X9P#d})qM`ppG?V6`;WGv5cj8bC6zhK*v&z6ZJghJT1K zuisFR2)iZJdxn-(Hg*rvamIFu)}))?I@ATOfm_o(?Vw{{V!k1T@jog{V&3GSbjeTcckq<8n&QyGwPCX`>Uyr!6cB$8tZlTC#Rz zwqiv@iy9L~K$=EOjVROwH)nHdY1&Yzb-GGmVcl@hbrW;dzxBZpjmte&&rNc4XpM;d zcf+--y$O<%)*M;iDnXHRt3?~^;;FU>iL!k@^M-)6$7_=8^jNg8t4gTO>fBJu?-Bvt zrIRY1+3sp-_M8AW8C_7cP)}#Rlot2NA6vc7he8Eb2Z>TojbPK~Tp6J*_-P)nWUkre zDNW2Cjbx%UT?a1}p+Or`C}_Z_J}sRxBH8tv@|)dkev0tUh-80;MfdaJ1AjG#$c)9_ zV`j_c%{a8f)#m#fPU`s8a+FPruY?v~P3H8ktW{lUTjj9TV5w+rx^5TH3%Yxx*jA96 z!1Xzc1?~om0}`%Rj1F6CWcN;ubxoo{v9%hrT6?y9R%4tS0D#9+A8Dc zZ|=YHj6@O#7}ZGO$n~s&D9A-@c3`4)zEi$MYW@^X|5yJBMj})rBvIYA+C2Gz;=?QX z8pzR;%as%_p`G#^<;tB-7r(m1Ge$G{pe?vZT)KFvK^ZSD{ zuwl8VKxHd7OD^=)O9jg3rFYRwYNmagf%9W}ioQ0DI^|_GJs0i3EUvKLTR6&Vjp~Z!x7+V*z7F~v_I)vjt^IVj?p=>2BH}BJwXnT~Iqrn2thM$ENqM&1 z5GQVYnBShJrPK8g! z{2(+H3O7C~b~~-mA}YUd-gLE%L#tk6`hx-cRjP+U86F42VTju zWJZsi6P(TV&syfj3^Uh`xf6PL=_ab=%voRXgYA#w;GkIS%l!TnDwN*t_%UZxj=bvpLED*_+;HVZAr8K@E4j51_0Z#bicLwunp5 zcfaf7FNt7u)!gYZOV`>9dtUsSOmxn#;rA`uRT)<$>?1-tm}14%yZgbQ-Hsysz_T_r zr{=R>_IskEU+e4NWxtP_MnVFRd#_jvC0{<2_}Aa>)(=iZ9S2=h<^J{m{_U0T>^M;d zx$Lu;8_yp+fA$Z*wK6XQ(sca_3;yBo;1K^me11LGz$`Z{;PGVr2R1%;wt5swxNn#Ty(jND(ahcyY#hR@mbkHbSsu~C@g;JE1Xgd~;5p9AM>b|*T@+`(Q02KnqPtTm)=Oae9poidM z2@qoAXG@Tlg0CbBSbJnwTR~;=7Nku1bbG$`h{CrH6Q}F$D>AsYc?6<;b z7zzB5{iSR35Hv|z=yaYwlxNG|npGU|k$WKNnbn0S^dxQ8C7s^6_(*&E-UHfb@$UuX zoxyXZ;@>>jia^ibv~7Qt_PE_;v~Yl_9jgOZ;MyRZcWfQUdfHlAQzg$vv}p9WyDwiT zfmIGks1u0q@eo4BeQ;m>5vA3}9|87vK$=NO0iKL~FnR-kmhLA5qmYQPxfz}hAQGlv z=0Ycq5MAy30DZPKOw7jbvsrp@&!(Jomq`Z|sY*lW8t5T>rcZkB(6@0CxD5!aKq2d; zAaQz8-Q^|+K#J1a=es~j#R5Ono{XWZft#&z91)-d^ebZ;7W9J%c?PW!G0X-$fQx{* zf(2B3_Cid@9lwOOOMJ705Nb(8&vq>e$r?~+@AawozPpxg!#qvjqsSObQB^Zn>kpy@0jO~B_*W)oK`%}+;vU~W!0%r zWTJgD8WEQ=^Fe=-yS6v;t}JI6)~h$xnGySP3f$z;tpB>ny{~-*+gNhJ6Us9n+NSRc zc6NRsk_-d_{Tav!d-cKt(!1r8wgRe4p%oaY&#lsuG;uUz47bjI+_Ehzyt8rs4V(?G zRD=4lnMC0nE-Wr=ztioXzvyc;Bd?g3CbRczO#;>BSi5m5zD>f@V(%MfG{h%<--5q< zh2I`XgU*TsO4dXCs}`YT5>p3y-Z!H|!EGp4I}x1o5%2NT)bG15CH;lX{4_c8x;c1PV|N9>k9lz z<3HCoW+t+WC%gUD8Y^3U#Kr-6HgR1|l@1bFW-Vl52#&WKqHEuVDKa=+z>IZ{H@no( zFo7^D$WHpL0-(69eV$V!lC}``e&!tzR@2M=-u?m!6O>AF2bz*?kD&>muVf7uumeZo zcTr+^eGsmkIKBnMKfjqZ3wCPKOZ%Dx&cJb$4o&B~$GgsS5ebM9D7qe4rLu| zD&VeQaH`0Xb?K5-&@N^wk0`c?rDT!n$dN8x@s<}d^{Y7J*jzXIS8)_-k;^n26o zV9dbDgDEiEJ~`nOuYm_Z&w+KPf_miJxUPHe@t?UCerz2*j|0gVmoLh5UdO5x?q7%! zK#>b}T?_!enQY~$B7uUWIfXQ<9CfUv)u1DUFlf-F`sc8E+&tBsbm?_O0A%>$%8R+i z(MCfj%ae(T+u6x=Hl#|MXgttP52or)N?dzbK!ziwal}P{avRUmQLLD>ICVIMGsSrr z`i*=z@*4K%o%FS)8B)dpl{vE+5!Q>9D4JyGfyu`#@!FH4GOZNK8KJ2{E8_a2ri?&K zem<~z**M(dzGg8v`RcR?dWoL7q_J;|ZYaf7_N!Ry&+%qP#tUm*|56`O%X9nSE&}+> zWUblEbsCDFp~Rk;-fZny*5U%%Fv1J&Ph9K$Sbgm7RnSY5X|5vYsrmFe+W3Itnl{rk$~>ld`}ko+9wiY)km+To>CZIIL` z&0ZeYyUgkNyIa@a5l-`rbx_`$+VFx5cjYT>Ct)vm9yyinq+{e2E=blNO6f5wE-O~s zc?sQEj+dLgt`AYDtjcNI#uy z-m?1j2QFf!F`w$xT|Lg&pQ+4~KwDrogPT(}UCyVt!`%mwt_~ozg%5hQZ+H{#T0dQ; z^%H^NMC$TlSeLdEW=FXWoi8Gh@?#7x)PYLcY5U8Et;=5@3fcN%^2xBRgmL$k7;T^& zC`*%@v=d`wvkUb7*wO@>v)}1i!%du!eId;_R*H@17z`h!SH(Yo7P{y;V(Fl-LutXM z`}hY~T>KBIJp0m)B*b0@0&PS0VTk2Z4YI@4ew2N4;m}i9^*fEu#6D?33S@?dHo)j- zPK0g#*dIvSqz;$G6n&R2np=j`r~?K*N+eFRAxGKxg<8@(*?WS0QZa%2(++|7=P$;G zJEjj`N)v@y%v=F;&+wrS-T|l6ckGMUqOCv3QGzwGipnNSPdC1&0FzyUZB0QGUz5He z*gll-oMV~}6)@q!#=nY;*(5D^rA^-s4#arRVbftqrw}-5%&b+lI1B>aW0LQP5wR7#&#$BM;7Y(eP0K zOdMX3W|R@ar|QhEal+%Z7O$rzuYcZpPxmF<7dwS4tq8|4j*lpO&f2=a1_Yj$ZSg2n zVP@3P=cg@0?8~~NBFzMgu-H-FtKS5(`I{C(HKsr#9p3m{ak1n+#FxSE{u6sxf^r0L z#XuW0DTIP2o<*QuF^SPanj_`eN^QT$m3mI{dQHV@Jg%YHGLbq6h3V(w z_4DQ@XF;W9YmMrh))f{xucS%KKO9eQ)yaDwQ@Rb%g=v@+U9jtkJ>p#clapLUhl&<)I{j; ztCbJ!OV7AlUfIIhvC0(e^=lr#LqjNCOIBiD2MC;Vxo)6}NJOH2U6Rto$t#S>jItJKeSKSs-_#zHrV7BRy{rtOLP}}r-wk+Ymw4oRrkbybyTPJub+TU;D?o6 z|C0K{knMj0G4y$CSy-8%uo#L|{-khegTeob)Ve~M>n3u;x5sj&j#H0cB=eP($95e@ zYxkbAVCe@ZrPQ^nOtjdEq!aPkDwbD$*N!w#Wtukgi){+>yCi=4aiM%Z4XSucXBgO! z4Uy_cb$moa{^uB|_X@W8P)#_oc(&E8-diE|3JD3I{#yo>KL{fqe4?Opq%Xi z7bONZWdCEl=L{`l{RoO*i4`mY376TZRNTnYYeAO;^HUX@0@?W#OmgSpOmsS9Ah^Mb z5qBY*&lfq2N;QkZAFX{J+kBhl&chc7$d|$`5zwY&_wa!a2kp+098IXR)lWdXTff8h ziefVfTE^c26TwwCA8u>+o6u#Qruu4LY2O+K=1en|HtWB8W1k^;E^yxxCo3yR2+kl5 z#+LW`vpN%5`tcF3q+RE!Bvt3)44Uz9X0C0+oW4y8%QC9L&z4$;IorltUmhh~=WBhC z5uJ{Z5dWUlQyzBv;8pD+iStr0{gmw#>J;G=7EPUTne`>*7U|F~KDZQ8ik7aq<*>K- zDJc&m@2Gp}p7L0EiEdd8?ou7=Kog{v<2T-prRG|scIM||wx}epS*A$zKX&8~lpZW^ zO>G8oS)QqjZr!92Xwq}e^(-l`(=$ye;JvWclDS7-BHDg z4EIstNF=g+HA&AA!Twg3;q>_eZfQ!g1Ly0m>asCu4ISeb=zH{K`Ybmj-gPn3+$MBN z{FlB6>*I;{#;}BM0_(7thFF)=Ssm`d;go4aqO6M0+mo4$*{r>uDTcWF$El#tjFl$F zPKKjpmbZe|n=!@xndhF_HDzRv`#*#2r_iq%rrG>zdNhLV^UBqDv>}9+ztCzQzAXNn zBZys=wbHDjQiQ+Tvg8fVtGi!CcGfFOHC`0&3WR7gXDx)@wh9*->0Tvc*}Bx{?di4F z=0U~>bIfL%eii6JK#xyN&&3NuJ-N@UpExL82lY(J`S$`_64M{9$rS^%_Q$3!{U?u( z{IEPLM))2|+7e$WEblFm6Jak4NQD;|G%qJw-1K|P&v*<`k;^~$-B+U!61+!D1MO(#m#SL&<*J=O zl=J<0kBL*Tt#`rV;XIN%DQi#gV~%|;RTa9J*vBqYjCdF$QRjT3vchgy6His%U-Ecw zzE#b0Y8U8+yc2xvw7I0^OzJ@nJaChla^AzyX~R*3-U|^tLo%2rjBbw~@$bj{Kg@k) zSd?qqwTKcj2&ljSf*>L)HMG(p2vQ2tIW*D|4yiQK3J6FksdVQkF$hRYN=ixzQc5WD zowN7zyzlY&?C2hY#OQzggvACUy7EPb&2sd-3RR6g`0 z>3tfV)B@?+i-tS-+jbw6GKHhikD&&q{yaR^n`cF~cK2iDfcBh)3DtwRw-x-cAVn56jUa3H%qt*}l#WN(9e=Nj6b9q66L8gz{R*&>EL?U z#zfoeNEi*R-`ZMt!%+s&hr96y+uIs9bxOvxX%<{|LX^wbsrZD9oKp3 zUo1)JSj**nv^W;N5J^PXds2&FSDKN+O5`|3tmTb0OP$nMx)*cI8w#Q)b3bh?HdJTH zuMjp=&`OJ_s;z4zl{E{Z3m1*{4>JP7-wShL2uqz@Q$%9C<)WO7Z>9+QI=JOLFf&=n z+Q?xjDpdH$T%V_WZ(&F^$%*hJ(G8xq-}2)2=VXW&%Uh1(@U%`*e>@DG#Lvfh)J6u3Q})%J}sQ^K_lb zsA7SOmC%yLtEKPOc#4qLfk)g`gm||CY@x-_S?K?s=uVJHDpMa~zjy0Us?|`%^=zZGTA^1i}^}cc=US;@27{4HC{g{wxNB=p{sD)?&|H#9_L3< z)4XE^PR83=E2C#}Z^DQ#QUT%Y~9hhdR{Sv++Z6%^tiV1flMUKaNMs&_ukKZAjva9fGcRQs=R!(yYrG z@8-tdoJf)`b?|s7?{50V`0i)PvxVcmP(x0A#Gc#v*%a=v?#A9~pt*J;z^db+LFOQq z8)=)9eS4R0Jxz5KQ(U0zB(cah-FBs=e7vnCaG(G5t)Lwx>ShBJ{eAzh^)ZtD+UGJhqCP!+BzpTmQ{Z{wtdVA#__wlB zyN@+NRmV3=FaDq&<7-_fu|Fnb9OBIA&xKpN=FYrb>>QX*YWIbm?yinc<6}{#hVlU6 z{s`Nr0_W25ykB2AcZ$dkq3Yx}p8+cT&0r1Z3plg3NF=!*n`BR{cWYIb)klgIuTPYeiGN*vtoPz6<7%__3%sW$gfxIL%Azn3(?%laFBZ?)(G0z?zgy&Qk zR)k{@Gm11U6Mdi3hzTv7HBZlvV;r+~onQ0T%4;s)9B4?o-6M65mB9YO_b4n1$*g(! zL}blHmmzVOt^V_RIa{*PM@J$y#2HMFlek2x==h^o;+fpJ<8Lwq#(k>pITzl46uxu& zLaw9ijd{<3UThxUQ`JoNADu;os*=&m92HcE^KU<^)T%1wuiX@h{OUU-UYsdvLnBVB zd;8doy{H*kntitd-H6C?%mw=s!S`~AK006wmu^BlR0R6`9A({>|9H0Hq+;&tZ{Ix5 z+2^NuZM=ND7)=`?_Nc!fv?{5pQxa+VBqDrip|%wQH}m^b+bt$Yc^JOM$CLJ0jNLJ4 zYj3UH37Oz{io(j&v~}s=!|4k+H)jJ%Ysd~|zl~c(8ofiD(lD`U!xTN}YP*+46f9yi z=ybtko+oO98>jRB!T{14sh|W)jd6V$yY-{9#_Jc>*Ff`g1GG~;eqd``v89|da3ncK zZw9}wYWx)BDf^j-MaAgSD?)kEcSTAUL`2<7+JEy1$yD9BS8vP~-umoQj$4Axv3l>B zg&mpKr2(c-eKzkIdyBa5JPXP<5U%>Dp1`Tx{^TRaOAb9&hS@Da?n`=h3{hSpoJ^5> z8OpvXTx6f*$m)W&dGyHZXB!9l(JWniRT8AzC#B6o2Aa*#YR#XX$aCuNTu+tw={%h@ zPsMR3AnN0uh0XjjlcTll!EeIL-soeS*x7O7pWPSV`9|1#|1>di_M zh{`?VmYF_Z7MM6o6JdsKcBL=PG+*A1#`dGXW>OfFb}%gpFYxIV#BPs1aa84UaE-6x zA*YHKk*}Zm&L>gAse1mNKner7=;YQDimCa0vgNX~6lG&9USeTcd4yfebhSVQu6apysECOsn)16IT`UNo{MTaqH84f_UF&( zlsPwA?Z*CGtkbsF4Hb0Pxi+^=O|v2@Bax*vlb;mXfX?VJ4G=`cf+`;5(ct^(oJYPl+S!CWDMkw&pQCw{m7 zFZ#uMbJBu|DH&=tb#QH-S7aeRi zD!Cpp-7qr#c)CVK;jCWnA=fI$Qywy2){4kcUsd2YC-SU3Ke}Z{ z(*lE2RG62(_`SWD{PeQ-sAFa7hHIE>aowV3U99h@3$JQ&saLDy0lPxok@C1-pRkjm zkN*3iIcod2pB?F19(`1plzYL{kk=Kr{KaPPty$AU$=0fe~F3wx}sPs75C`kMVpoc4#m$eFcTrJNtaId8Xa8DioD7CEc-$v?T0qW zrF33ZwcYp>(#1acFY(Fn-eIE47HzpbL51brbL*R12hM@<-w#QFPJ>g_vC6|tH!2}g zU*|-+6??Pzt9Kik4r&QMDI95AshFNuGe!g;pK!l@Af@9nbW}%I`|&l8!=~61YQbGD zB?-9n5eBm7H+EnJU&*r-Yu3!_&n)P|6UeB$hrTusoDSYMkm$j=}GoL6cvV1ws zETyATW%VDu$-YU{uc&E}p_RjR(!rF%wpdH*Wub`8&-WX&Up&E8@MqXR~<3P zX26h4#W{|-p#EhRmzAW!#hqraEZfBJSY))o=^JLXiNSsN{cWYcPN~{r>?YbLNUKBc zK<~vQ`?tNu>S`^c;1?>HxwG}`WR8z~2tKKPdH=m^LwI1td+n8Kwy~DBX#B0aB3O&r zwMT~0Eg7z1QPt{}*1H+#&pG!>VlEn`%XN7qD|+YP?y~0v+JapxlmAD|CoWG-O!e8@ zr#B|%BYnQcxF-)752tU`4aKgxi1t2zrnDaaQY)RytwyV|Va>=yH_2LfEpHpnjJ)(V z5e9D^e@{B%3!1uaV%V=~+RH}Sh*if;gHDOn{GRO%z9Obv>u}m@7XE@IVZ(<@ANU5~ zVH&x&iy3mE=yl7%-kiHxeM$6V!}@dUm19hEar-+VVd_m^*ffNUl-umxf$w~MJC;xU zQm!Lw?pQIB>z_-!%K+2K-O=lpIrz`CMCmEYj0LtkG0onxjsnpZIQwjME!_ky1o18#Mo7S8{8ewgHK25jy}-@CpBE1 zD|`5Lw1cYC%6rZcP*MK<$M2oe%Msf2_4+GWNhE`;Ko*M%3;S5+j@-GOTj)cDM4s5V z{KVmP)$cP*2An!m2@&bYU>&d1GvV}d>7-1^ufOv=sx&M&I+{hRhlKYmx;C$K^9yMP zC1e+({{0pNRLFaz?Pk_@-n#Vb|C7u`>crS36ef9b)%AaW>oug7yGygz@d`u_4YsOXiO;Cm~nl~o^x4MB%zQ0;ZKDUsASwpSG@oE10Zjbwxa|> zr>?)@`Ui;(e5AEAOT4%~9kWPk?uK7mC}2;73g=)Hl@XfbQ8~SE6Cd;Wdp!`X1x zZy&_s|MTVu5x~A2So=mF2T`(~zV8tqn#*`akdPOCdiN+qSRo zL-PyDZiAHvyC-kkfi6B^bOtQ!iXSyIQ@X_6l_$kVAU7uNf*44!kQahGQY^~Awt|Rg z=Peh=Pu!GRKTHj4><_W`Id~MN54@x+e_d3Y&<7uFkd=1$Nu5@fSM-&Fn}6K;2&p#E zR$cJkZ~`UDi;v(q{RqJhb40=|KoD!~;l(lF&2d%&4#W+}4Gsb61^<)XekGnDo_Bi} zQ(#sY4HrTw$`S6+3`~F`&Z=HVKS0b;*>r5OsTLDtFElF@aj4i=C2;!q(e}wqrvxFa~k{Qedr$F9o>pYl! ze4p-L0|CVSO{+w7aO0pfW~&4)Xd?go(T40n(% zP&&ZaKKkW(R?Rx_J9GHp))bGW5dDf0tu8)FhHnrn(pafM3;u!QM3tLbuL_*(e}S+> zAKgNAOL_JVG4`~^=K+IQg_EKdZl$-Y^S1PIyUx9~2Z-L?$XuAq|A=Zunq68<7^(!DnI5o8qJ*wMRd64WHsfQF!2vfU zR|W-DGa2h();! z5Vn9OW0BrK9^S0+B_)m^ASP01?1~A>3GGw@#D5@_Jd!2i#+O9j>jq#VhOU_j<_~yw z!MtPxF7l-`IZU0&Jeo0?(ft!kgwU8Zfmu{%jO=L}4=|`4o&m1~61e}hCh`uZsx8TWbxPw55ztMYiK(uyN$@5r57OyK z=3c!Q5bQV^%rcz*psD_`o6dC4i+c_Q%qh}bb*MYHJ}o-JTvEm7UwBtaJI`?l7&ak# zjW;IcJ=PJ-*EjJx!5L-J2{7Y4-iD8JPSzV88q)lEzjMVj-a&JrGOz32Rb8#i zc`Fy~r`46Xs2yPKK9+s})^z23Th$GRh1c}Sitpb7%Z*(pNYxI4-0t2L61OieY>O28 zx$|umv;0%>4}BL1v=sNVCmYXF&S}LDzOl`cKFq~#B4CVBykHVPD$ljg2Q5(gHHKw0 zrkUhclKK6Dn}2M3O!y~hDdGrRB>kGGreqL(VJCVK!&Ih?y~7KjoU4$IKl;HXPmH+0 zQCRVevDt+HM@%Sa4i-1%(!_+C2pJ7!-XL;!y2R|yug}s_WW(rGUj!w-1Kz0gCWH!E)*`1HR^ivvoSbk2m>BqeeoVk z+gpv8_s9B!J|lD#!wDXZZLdHGH-9hTELg3E`+Z)Qo?oQ3-@L*iVT6F^BzbL{fiQ~f zr;}M@DtqAm!A)dN`#5nw@&Wvks8YK0HKsEL^~IY45Y4Rn>^v?Y?7>5@cpc|;m7x_g zr2Mh(1p=+F!bddvcD($Y+;vMCU#JP&b}|+%>O3w^IMUER6O#dvc*qjbl;~Nt`<=LNQtkN*GO1nOb(0j-{JtRm_dt_ZcFU?he>sFUT`_m@|mYd~a&}4vt9`=FrEv zJdSTR2=!T%gqI%UiNZH-SvaPYAF3lGOd>o%qV&vs;OB=X|5TAW5a+G^xa`=wk?lu`IW6Cr5i2O}=D43BR-|=& zI*Vf_L4G~r+DL=hegBV$Ue@2wbuE+hv;&==HeIpRMKibPA8*R+$W{=huv*p7LK$U< zGAYB&kTN+}2Q`Xa2P4tFz=NQYsdK^UczaS`tD~9ykfum!U(sjUwE3^Vp^YM69`$IAk8GU+E8V@(R^bB07}7%kzMC>V#bLbdGLQCrK|IksS7h6*+R3 z$eD+7_^1gJ^V`f*S`S6!s*cf*)K)rJwOu~U!>%kv?NZ2}$!RamIb(aH7Ug6nVsP+c z^fMGgVz(D)SdTR~)=@VNyj+jNmhC8pNS3E;=Kb`CsNLmxzOD4}F+Y}19@zYDhPu*3A**RP^NufwSS?QM&8fDZ;oC{- zBN2_!l{z{tNy}#Vu=>>X5!J~IY;Dt(WFbOFnrn{QTlhU|UiY5SYFrXu>T2ARvN{F* zSfQK3+wl!~?tu?fb;ajnWbHh!tQ}i>^|`!kwIld0J1WEK~P*0aCS8IhOx>;7QUUTBJA$?0$sNAl_@&Eu6+TW6#M4knw;ulV!V;)_0Fn<$ELnhV>{rC?86<=>? z&LI46T!_xIJb~lvsu@Y?94xKaYu+5RSz-8kqm>3N?X<$)b;SiltfeaCw{t(P_{KYA z>1!F~cPJ+rxpmysHOxZX`SB(^PHFg#t$fEAReD;7cxF*4(^D^u2b0?>{i+Y|_h_$9 zPjzlEXG`F^qAK3nS<-VLwLmj$VH-;3g)-}d85Kc7 z#s~&P7w;L~wZ>dxs^0JIo#O*n$F?e&Mh^Z%)(NqjCg>8S(T(pRV&p_y zh#Fl~($*6KQZ&~^u^v>xQ*NRwSZf3J&z>T3`q=qIf83amGXDdfs*JtmxwMdkZdc?_ z%^9Z8bNk=&xHP`i41*2HHB@S6gUsUc^!J-dtsLzmA$nj`eYP02PAq>cXYKA6)N7|l zt6|2)iwP3Nw}qqi@4;=0NKdZ@%HCJ?t|1l%47w9#3|qE8bRO5Zw5p&hDkEM8?(c=a z%GGY<7Uj}CAF6cy&G}4~;ltZ*Rj=>wCw-D7itjhPF535)*sXZyn_~ahzTbu>rWi9H zI~k#XtiJSLn?6yvqo)0OPqy}H65FCW_3w1lyc^7o41RtGjg&{HXo-TRn2@NqgqbS& z`&F5ut!IdCBKB(C(}#Ic>(aT~E&Tq==E#D6dETui!q7^?>phJnx=rCE0o3xDmh<2m zT~XZN%ss(dWU@macS4PQ_#}t^Eu!da*Z|bUTIsgpr+gu8XGSKM4~%XJkFYxGYgum1 z=0;cQT^1up)R4%JL-6RuP4(@KJbPVH|AdPJM=1Fpfzv00pE8;$83t&nEj?8&S2e_G z#FX8x4|%2i$K1%Bbg4FS+3)4+47{6L)3!!({t0K&!Ni<2z$_htNY@bbbYj0X*~E1Y z^ZDA1symcXb8NP$=tMo={e^DUkRK=2o@3p7Qdp)uyXn~vCsghB`7Ri5nR`|4R6)UH z{Bys;`W3wc2W#X1sL@2!rg^^c4tiwWzWX2l{y*ms5&3aOeQ(dc8UvfF{|xyrPMImM}YV#A$cc&0~uMnr_md&P6}JuO9M1mEr4*s7h5n&%eR zTPS5eeSgsXJ0VhX%sMj&EEqW>#J1W;U*`D6`c`$tegVt*^EptQ=Jc;{JoO3_O|fRZ z!oQ&wo^ZFp_?=2QBcwHaoxpoJGPv~T;ZpfT!I3??ylA30GkJA&yaG1yTpS1WofCgj zFG~c+87rsG<4Zw2UWW01lfBR&E5+#8^osq;D9zbCjnzF^H>p4sBK;vj^Jlx)&Xz-HFN=! z1`;=@30nX!otM~~4%mRXq)&p%;L%9a^?QI&<5>yhLRz&wxE77?6X`-VFoR^Uc7p(BgGEP9T99QcVs8qQe1m z_g&w{1YH*E|J<=hS*;A z>36OLK*!Y$7yqglWD?AP%@&zUw_pPC?y|kwgIuP5p+5OLmeYVbV4g%}J^nL))zQI7 z17`=kyzTcVF0Wmj48dvq*Up{yK0tGni(M_p+YTP0FXgdJ7z|GN-8yv%#k1B^VoN|IVjyrel;2 zcoq9&!hl$VvlEO&;A+#(z&@!gb{Y>UAMZAE*MB`DH0i3ruY;zPLYkW)n-zjfNmzRz z271gy$^#4+ao{1Gj4U7mi_-I4TNFbJzWs{qL3q{i8Jkw6SIX5-<>{|Zz>`3r_8Nda zj%bCWphV^qeD|&R?(>r{H50+nT31w58AxWKq+mp<6~m4CG`@#(W2lI5H$6=UBDpa%|yVB;dxTMl9w+OcnH{3 z5jj!~543RLYRI4Wa!1IoDdUzBZIY4a!sC)Jc^s7~M?hRy%O^J+t~m;QGL?!Vn1v#O z0yq^Zi#p7iX|BhcL~4)0X`TH%V0iZ_AQJ8a@;yf9${T8h>R}FFR??igPTqltlafCieaK+KDMakAv zYFVV06C1HnV!oqQryqWrwQFnYr3iSKESJnydSU0V zoe~F9@X;As9*&L?2(h3pW0G5nO85jfkYN}MR_jCNXz8- z9zhPgZSKp0zUOz|p^nXt2F}nHx4{4PIWdJ|X zF47kD91AmX?pNJ%ZBUa$JegumnS^MmkcUkWQbP+-BMat*>3L2)@2?DAZQ>x3Jwd2< zqL(fw6fM=5ybNr0>rY`keH_netp;I0gJy; zAUd#}o^FHFgpq#7ne}$O(MHR_B{h=#*&bI>qSAuGXDY;w$(d0i*LZCB9ZIXz4V%iX zfwSZfpbc(PRbVVCux+`=l#{W4xPjfAFzsgVN55dT{b=CSbW(_#G@1q5k6JguZ2Wv` zR2}9z-R9#3R?}j-+Prg{b@)Tteg5o-y3mgmx`5UxE_K9o z0|*bizufisn(ZqO-nFKIA#ChNn5AGen%3Ic`Etbs*=UT=CG+ajToy= z^n3AqR1E4cY?)KehM&2ZqrfF_mpHgFvoZQs-&WuQ9)qzNSN_$rrbl!U33(c#C97`m)q4Alq@dHLgIIarNnD$lWJ^d>;D=aCuB5 zakmd@^}OnueTy5swXQuJnykv<_y|Iz_{=EMqPV~Qbj%5!C8&kEfe0amVVhZ)Z~NTgPb3$l;h1B@u2U8k;&tffcK&-#fd-m@XM&GZQ6nm6{&C=dxoTV#7EVP0qUn z95=4y=)4dR!ar?5v?8IiIAzk(V)C5kT~wQEPB?d6JHnVrUT;DhK~56PBBqOSszH-D zQVz%Yxp0uFxroO-9KK;{Usw=x*@z$0x9@4d6jJ=b5DZa&oHeueT*+v=IyO9Gl&vqa z#<}Z?)TkqA3t;EMd|_EKx-|IcolL9VT_^YAqKoU^PosWDkDOizT>Z=Yu`QXmXPQf1 zzvcLjh0FoTl&Qz8kvhg&@qY^afBj%$LbX?%{gSYDt~&r#^JP^VbdotL-)_JVmE}Ubu(*^?}ieHq)`G*@nUFa|9~c>YYpQzRCp(63 zKH;1@YFsRoM$K2Ad6_f?d3CY(@E*e?DKg~HpXu6{rb~oSqxyxlyR^FIRAjyMnj|4? zi(9uw9pzV?c=`*&L^XbxoMK~8*7qa3c7>s{Op^HeqH zkTA0IUbyoIGG#ta7%tWJ?sn_R4G+&89cDx*5;JmmKusujp+@)k(a{AahO8!&u%>!7 zI&|u3qPK`sPxG8|Fy_SV%ItakL6^Q6Y_)`k^7x>wWrT%KnUI(q(jgS(M&8GsGr-D zus{J`1p1iFR#EsIatuW@NQKqSN%!^CFF;bfEWj`+>vzzf88FCm?ak2-@p|f@Ie~{h zX3M)LGcQglb1tpRBxOvLz81FK$vTPS*AOz?NW}F$p{1Nv7MrNiwJ15o8Y_uXxt2mZ`r}bq9j~MLUFC0_1k=X5cRs`i+F7fWS)y3?o z#`y-kOC~yKF1m);;VZM~U2-TMrH$+G#0yi`I8 zF%;Mt2+siDPWEuh!)gy^!kVF5o}SX$_ygZp2XTQk26{JN=>fITlP%WaJEsHt&{HG@ z<61osN6^woXdojYoojXjJQ&6+`I#N%@l%)s-|%ff0ig*e+{D0VNQ~To>L>`N=Ea1? zzL_LBtUX|B;G3+?Eq-^9=j;Pk9nH{trwJ>vH(4^$nu1PwT9MDPPJNvQ&jqiqy!pjO zU+|Ot4heV<4ZzKNO)Iym8!?YXZhO3i<2=@6g{Q6m5rD=9+mM9##Y<10F(RH+$U?dP zp#M4ErsV@2p35GRt6IW<@`McyZP#K$ju9y@X%8bH2%b5u{fRpo8=3n+@&bUG68RG7 z6t!3R`S~`zaS$>l@D*;;2WDsR?6;eC2A7q;`sJM1jpms+4OLP^YY+I2TvFBDQ(%oe zw+=Jm+eV<0xnXyw3fk6z5RY{EMuVLdRN0lb$v_FNEI2;ZmsVo?o=07-WReS)C4dqJmS&9QZ& z_Z{AL#=q?Q42=Jl9>~;AJHi(1sF1;lEl?J?q`ol+7A>T3p$x7AGlT;n4>i6)Zc7pR z4p3xbE~Q0W6~P?k_o=reyub0L9Wy||cDd33P*&5=n4sIv<4A3czABKkg8xUg;|Zw7d&il&PMNTXIJFFOWGxG&KJ z0cV1Xp`c;?if22h1D)F~fZw8c^mF`kGq6a@A@>~>qniY$IAH!ijV=(Wz;EJ)J~aU- z`3$stuS?$Z($CSaH^_GlVPRr}6@3c>E+@^I(GvGto1Wfcy74jnO#mjqXMZ7qfY3-! zEBWk-_pxVlR_%vX&UrWB|($9j~cH3WrGs9oL&`o2Hnb z(53xL@Z$#KEIOuAN0Nf)D=q>%fxx&c%IL>)}Q+!0b3 zZqvZ*uPkwL^TtO935+<(z%CFGRlWCuxUaD=yiNxT+MCIa0=YrS|GFb`_&dVu^au`N zJ+0I??3ns_QpYb;IcH}SOC}z4j@~<+W5c33Lv!`JBTT%O85h1QY#R?H;9w#kN#j?h z!bt@Q4*Q6rO4RVrA%*mayTI)jgIrArU(jiWsg&4#$I zY*q`;`kD^^(Tk6Ty6`~5p4Ifl=lwZ}^&yZknFTiim=mf!p|jPtlU18gTm_#F&~Xz&8MOUj~u9=IqJi9pW?J(7N~eLy@AX+5jhSjPsY+022w zIoDDI{R|QvDnW6SgeH=`UEVw$Exit+AR1IFGx8Gh*ev;DJVd91r-|X2)r{`2lJo`P z41t^N`=zkcjWdg|U!iPeW)lBoC2f#XXp&``ce>fN9`7uLJ&%mYJxLLQ$L>B?M%!xM zkKK05riKeShYkYT#Rg&ZYsMpLK6c%-s5vuv#%}i5cREM0F@_v}(B>JS!9z-rwHH1nI@rGB!^Ln;Q>HLZ86SLG z^hO$antwsJAm|VEJS^%`|B$FiogljGC*6!{!6QXlLX{kqO?jrKc6Dk8syWHw3iK(m z;Il+&-5szm*=SVgC_P!e$gOOM?h7Xf<_W+jThX+b4ss*!qpDCP=J!cQ?%qP}WWD7A zQA**-Z*&MTWH2%`mR)01r-h-IWmup|$=|QQOY0Q}nRB@U=I$6c4A_d~_aAE2K3`T1 zo-iv4BDgVSUNG(o8o?JVp>AoE2xkNReD&;~0LlB*`=KqXM7rCoxVF^esYhb#>0BH` zt!?meg=x26+3SGCLC~uT_%nW*R6y@lHT(-{k}G8L7jm-E$6Cf)gHEoqN44HT zgm~M;@TpU;FIJUhtFj=KKL$yTUHomGtfNnoNolbHMG1;fKpypjH;@G>w2vc;{PCDC z%J1GkAd$vtLXJ7hEepygsK=&-%wnX8dH!g^H>cQ72MA&@8!~A7S7MGQW~oW#S!im( zSI4DWiJ6gtkhqQ!=+Q4Hc|pjhhq67xf(+UVqYseY>M43+`t;QA(#xla(y)>_pV8-V z{C+!hq5KN+d!7sd4p{4&AF$bq*#W~x(|S*gX3FwyHrDkc* zbt}Xv{!s>Vs2>k;GV8ptjm=In2)VU#p^2deUbi@#^H!eEv;!6kgDlVzTZ~( zhifTyi(D28En^+9So_K)XZ|v!`WB80_@@C|9zDe`2t2rbX z1heK0QVDg67dZ}bH;>U;+DZ_fS0x(O2b32DB;PT?OspG<$86a?c}zL)YFmecuW2zeN32PxhsPce-8 z-UVYPnHna9s#}(FwL3hqQ4Zcg2ntRy)f#Qi<54BUah-7LIi{&&lx94hJy%_dlJ>7i z&@p}D+Fxb-SFu(dcT?-04)A>kDiggAC1kW`1A)zTD^*vqQEVrA^oDW}^u{CA&vRq<9vuVxpSq|7o+3w~iT*PMZ~F6<*- zDQHh=PoS}o_$-X7^DS*HjFZTlBU~^v7nRv%r%%O#O^YH8+aL3Q+ z5=uv){nKs+&)*{l@naqIYJ`uVD&dWM(^J7k98>V`*vEzx7|WwK~S*XnihKBq1upH{g=So<)MsUk(G|ynD?v?WA=itxj_5 zNc1ajUN$I%e<%*Nn6y+}50v&COU^u7XXe^sT?+Lxg8C0dif~Iv0Om|3(k!DXl)=vhT=Hxx-C27+LE6%}p zfoLE&Wk3ZF$Q3$YD4zMV0zm5Eq4Y{*xJhF;?`vxjElrFXL{O!w74XaDR|hrm86gm# zl2b2_jMrIi=l3%b(%Jc3Q~UAj-7hbb=TF>gEAmCB{3pg$M~D$>nBQ0^iK}w7eu(75 zxLxvLh$Lj}pAv?Ps1j1dgWy+w=0-z`Hn^3$ zfS0p6Gg`#m6-lkg4(SQ!EK^8?%w#>)blVH2p)3!2(*boi!;(s8&~h(PO^Ns$M@GOiiBd* zXa5U3i=GH8BvHxn1kc8hZw*HhVqg=A4?#N(%_Vz4S&a8{{n2wEP$o6@`L4MK>#rGd zoClp8AWE|tfD^qDv>Z3!7lJ`9UW!H;(?pf7z`vi07TZ#QMkYfuURpjLjJWN4&yXQt z2p|jRU&f9=@mJd>g7}eB4ydjrZ-}xC!s7zGN{7Y%W|Ormc&5CFG7t?Ivz&)5RQQL% zg^}8i@(c@U_z1Q@=!){%fe%&fj0bV2t3LeL40}C{ZvD`m+lLnq!3*bklA6u%brJ>+ z5a^+UuyS%1&)DT`b5&2ANrP4JS6H@wN**C{Zh8x70%0Vlww?_e9z#ZlK)d@gUhA)^ z$TkD6K%uF9;vY(AA9i%O#M8r$QZUKWq5Gq^H(Nqtr%!eUI`HIRx)yYy%AQ(#-Au^P z7jNk3?rS(1-f=U4?}lWDYc5Et4_1feCqc!jRn_knS+$ABNOdw^n*ah|5L{(vVEmJ9 z@-t$^V`(Ui830^$p~mgXgCH-J&*ai|5HsN5a~iLj;_KoPpge-W4f69W1$eEIFHQnK zfd+J4;x`Bl^z)D;x`h|Tu{n1%^Pb?HZppL+Sw98dH1%!eXQ+ptZFjoo6|F&|3xPRi z(lrKvwc8|!g%JI+L$DA&H#+Z4&M9y)RZjd1KVLzLftzOS2E6vC8{qksXutXkCu$31 z5pU*Mqf^N1s*;C0fS#9uE4qsQTH021sS_Jk=J9-4s9%9K2yeK_3BVmatZP--^c$uL zkX2Bk+ws*l2m|rq1nVuiDFv0r7j2he3L!Q@p%C5I}j}|_8d08yf-X=pl1pdKwtIg*p+~{sh zdu^OJ;u2;Eaw;h%v6gu?>cjoZX4U{5jhpcjh`b>f8&(Dr6Ju^Mc=wi|Y#)^DW&s`eCUyo&kPPIa`in0EPM?BEPXi3Bgk}J@Hj66P zX9BAV547Fv0R!rR0EMDikv-L1k@xX=s}yHDJ-R6bvXi@Z{>(Pb7--VFDE$Fn!^$E@ z>K0+QZUcI*2S`I4am}{)tvd!FwjE^{l{u*E75kZwRD>r5@Pe8TrFEhfb%wC6(LvN& zD2h_(c3ieAX(D>gDW4(YZ#7ympvsVw=DD%~n)rvJK?HDn8ti|Ch9{gnKj802P|Suf zMN*eNfLPB@CgP&U+8(zxo>z?{OHWJuBCm(hefk^Jm;*7cnn|xSy=47;mTtj_toqqv zX{^OBN2uRWbFgmq)kLXTse&0-i0#VN-&5mab0bHl;fWkEF?a(OdP(go&khZy{BI*(SsiF7F|+q zcs^{33iLl3)${mhS_VW;?#(6=twIu}Q%LTO7mZ~8Z|;ZkH<>+Ic7ZZK+VEkyhd?Gn zni9#BvD*n;BS$e-9q9%ETx8&O5TX)`YYe{Y2qQy|p}mbSB!@{lJd;YN1^{T$p;~z> zdAZ&hQOOfw-=Mhp3P}Ux^b&_}9W1F|9_71xYqxBN$Wn(No^v&Xcu6jzt`S>gUYpY^ z3SIWE?5%ebu1$7!1m@nY;u=V`DS;~7^+BE25-1zYKk!CW;3M2sZY*5aP+tVW?o zcS1pL&0zZ#C5Q-+tDj|(K@#J6P?SmIV<&vOpbW8;-z@$p=T!|l_zkBvnebIGrwJai- zmDyC(_6tPV8PnQ^aGM=wkyj#uBo5*mu?x-95Spi;Q z?YoPkB;?7l<<<0W!sMPPK6WDd=}8)$#vEE+>d<24zu7Pf+%ZB0tnJF}(Mn!TA_~S~ zZW-ELqUJq+lXIRxvD=~AFAjAhq8X~|roQ~-0YO1YXIjo(MVu_)50DP9VNuY$E`Lpo zY-2tNICd4uoRq;s$i1oDZ*KM0L{MCKSM^>Z_ym?f=MpU|IiaiTV=^LYS~2|^E#nya zfOwvQHRrG@j0H2Mu_WgM9)B9qV}_?SaRPittQ04ri>?L4%0(P?xZ+6OPd}IDUd3{j zww!UdUr(C1iLqvDJIA+Ah z!(3O#O`$^UXNx))ab>V>$aqq~WKz+Lk<*n$DVPPC8=|n&uLF>j+lX5p9;=D}C7L_o z*EDNV6CPNMbTZVj&tA~)3Fv*XNG?SeF|-{@s^=kAcPNGlGE|mDgw< zTABpK1w8B~kOU*duI%0PW_(j8L{z=hD#%pT=ZUgYG;YC#r%cQhUX|pk=#z1KR_*8F z*<_?@+GHESf*jI`J8#C&T#3$7UitDq3-9Cc0E%-0}+9IG7%f*Cu&@In{0tB zla1-x@1Yyba9J29!4i8-5{9FGjJga~j(9%j1H;Q*q z-pop~7#W@YCFb7J_VX%FgiHS#iQ7n|tTLOj662(}uTj!QNrruzZ;|Lo7;$|}iM701-fP=)xtVed#@%q;x#9uKmi+UbH_~(E78$idM zUHU)ly>(ZWZM!#mt278mr<8P;G$@EDCEXp;Ey7eny1PS=?nXihrMslNJ15=yyzcd^ zckI2M``I7h9qTX0a7OWoXm*oh~YUQanObOHIBdkYx^UXxg4uS)xa`i=t_NoNkA2!3p~OA0TL zUd`JF2x(AB=%E1p-TwWTyUBcSmrU1}#79l%XiEe>no(rOpmp~Ja1>I4{ zsGAu7v#f!DEidthBG2P?q5cl=z*^Bq02n1Yr2GN!rM&~l&Hxm)W;l21^TZ${zcuEa zC^6(ou>Ws}1oYBR8@)|{V;%!cTxcTR1tU1x^}4H)WM2~*`r3o{`rIk_-=LnqPo&Xj zLqL8hEDZ36+E-y9T7u#46bK-4#sZ>816NSZKkCQ?I0;|SvHDy+5Dc_J-JUH#a{l&` zsH$nw&H|jJ(R&5BI?y2Mn25vRMcL|vHC=25kVt1u{lWYHx@rD(PJKi2ddiJqdi>r! zk$ZrjrU5dWgO80;JO8Ojk{EYByTh2s10|1#RACYE8EPYZ2F1+XE93rFT)QeJ{&&xn55jbB9bXWZ#8UFg(s~;c-KoK%&gf(`igQ_4@w4@1r$ zKO>OW1K=yKm--k= z&~x0{?TiUT6e7|DLi8s;;{mlS!~)8N_q!wjY1j>gG@GSc%OUKTAXwou5$HtZYO5V` zDJ_ITmuvwGC6j4j;Ka@zjwNz31W?3}95k~4AG3K~(*Jy>Z@D$`GZb_(as8_Q@!kW`Cr>rqe!L+i!0KS&0KDb2cZ;mCr5c!A@s8WO+<9xFES;FH zv~D@r9uiVbG*Fw4lumcRDW$Xr50A*=&8|18L8lc}FG6;f|)rv}=YVbM(XgmbU)rPSp zFru=N&H+XR09;4uJXEQM|XQt&n!28hy!dYnX`H6~%e@r41vQNP>uUTxQ>oQT2fUpO1X zENmeo5Dd+bY#K29(be0#fMOQ~ZJY-ORx)tOFWy(UU@pd!$x$3UBQ-Xjsj<=4-{q_M zDmOn_vlnJFGu~0--gGyXl6;aR^hZR>DZp%f7AcVtoIpd5T6&UZF%Sro>1?_~jB|8^Do8>pLkD ztJ<+Fk@uscZiyfIf1xr!A^M;Hyii8@P-MigiYDgmq2 znsNs{KY(Ye2Au)j*ZX0`v~PH5CAO8nX1l?m%;=)<0sje14hW(&v9;$YS@Og)Z!+P( z>_A9Occzhp%In3i>eEjMa}MCu_+*)o ziKl}mtA*SHrbT;$U|8ZqL3J}_4SadAnW<@0fM6Jkg`+Cy2;bkbGl_VI!AZ?nFKx=$?oSN3#nudzUm?89YmiRJ* z&!5K%0@yZZ2D}3D1h9%mfD|Fv+p}4xL4lg-J#gIHg8Plox{L3AjQa++;(Iu&Avk}- zcIJN8W_Mc4vQ`W3v2yJmTAflaIfP(G^uz0BBiSh?vvc`5j zmBbTGMv)NkH@4dZP9+@XZ-BLs-3J~Mvng(d&jis!_XVd4MC{c}mWVE_t>OQ?M88lC z2|x5X-5!%UyVMywN2={$Vt$^k9I3>rd&rj+PmkaPI8jmb2=826UvZ=zsyQRo?-(_T z{Xj37X|S|oa_duWE}rqHD`8q(bZWgFD_wefN2;|VvSo`8jZ$^eTqBOAhf7p>L3Uc> zj&W8o(XjgjZHi*Gi;9v$;|vL7Q;GZ`ov{?W5?fmbz^AGpU|Fvs}V~D}upUkoA2R$!flYUb96J_o{ zB?MFWa)kgb_H*_Cl@C%cyMPQOp0!Gb-L6?O~Iu{ZI_k;e;7W9kZl41V3Kpq~xkQu_Z4MLCR&1YXf5(=}*y5Yg` z4CU;w2MlS@45;eobe#Iv=ztIPbu=G7G=}X16vdPRnD}JrvY_O4chKB@04Jp5>XS|0a_TSb*x6Dg8-TOkh3xl@)|>pG$NUMJjLHn2uvblhBcBD_ z`4VJJe;qBkG7s#S;S1nBuYk(^tNE;$b9{S#8O3T$>WrG?vDHSjD%Gyu4bB^3m)8N1JpFSi3pU25b!gjVjw) zOuW+#v24vZ<0L{MCy;5VF2amOQAA|!2r?%#e0R1BMX^z{rCwSuM z%_Migq1@~4>T?e%%9Y1+>=Da=om{#KN2UyN*Z*8!1@wtM7#!*U6G)&D2rmp$@O^Ve z!L-mAkp$3k_R4X#x#`d(O2JS z1)`r=L30yrimzkL^~A~w+9$$)n%u8@p1`1~S==x`FVKc5uM){d+Qim@hTOdP2f_P) z*cB144ZbO1EN!fTEfk~gQPc~{TLuqB1%y!EaSdlIKgm6iIzTH;I%fn2l6X^xNx>>0 z8xC4t1CKPpsdNFhK_27;avlSzQF1^zv%3T^k7q|)xLVALbkej02i8(Tz+-NrD2K%2 zc7Jex_b!$UbTbVM-zr;fyTP}z0nPbz0gdnv&_zv?yDoZ#BeL-Tre46+D1}J$i-HHl z9Vd-QQ-42%RPJxxt-dG!+{#T^B@>gwj#s~6_f}{CE7rl*3z5JcFvrcaD+jI|NF z{VXzlS}#CXn3ouJp!QyHhizNdU4jI>oLm|W580aH)zleSZZfgpt@p|Cj;VO_29voR z>j2lXrsIu3#;!K7qRfGIlJAuQXNH18B@CBo z40xZD5MXi1gQZx;AW3_76Iv-}Qs8&qo7iE|sDMY9{4eY!+2XY<85v1+eqRG{h5&|4 zQFEH{g@^0k%VUEVlHY8!yV-#CK``VYB7&HhwPCQ|0cgbbK}kFO%(;_L&y}hwya1h{ z&VZC)ToBTL?7Sv(Xk!@%%ZtwLUXiT)8z!n1L7*R%8mmTX{ut^xIB{W^nScF~erWpQ z4KVqYvk(Ai^GU_R>~cN{r+J2i;lK%EfLawjrxc4vY&G3c{_HveZ|M_m@C~N zKVw55MDZsTrddpoOt%t0ArIrFf$H@pmR%jUg(jjNSK$w@xkbZ)jsp7(}6^ zjpu?L|58!~e}X!Rp{Hz9k3nWNOIxUdOk7@NiG)cm1de);b5*CpZzGj%m&m?>E6efn zE?$@Pe|F_xs1%63Y8d@LQ0b{TGU>!&m~IKVQ|uskxY^zSKqY2RUgNRB%WU88=xUNM zqa(=AVpe-vqqkvsuinbH^QA7WO5?%FEFow4%E!godM0yofx*q#ZE)1AN5-HP{ zXUCp*Z)RB9?ahkleVujkFGea0m$jbZCQEH=sPW+ibfKtucBuz?GQBIVR&v*2x&gW= zS$yNAf9Sk;LVqnj&Let(yC{UP6Q$Sqsr!s-;PNE{+u@847D(DZ+y$Myl4PfoxnH)7zjak27<;*vJ4q3pj zad^qHT!0&*>Xuc`S{8UX;Vr%nOnKNlPvI7E8u^uh5O{1Fg5?T{xRS7_z85C~30%7X zr@VVeK8AYDL0|Aj(FYDd%Kh0Og4?_)vj!;bg2W?i-dHOt2?9{Smz_g}e&W)s z)PYo_h6z`-M;jcyh`4U(OFQeJAWJX-!QmL^G4g_M;lK59L_H$ofbc*yT=hb_J!okl zo;5ZR0v#@LTgsjUi)^EP54I{SX?GP{xXu=zk1{sFkve+)58oWdCJIJ%Fx6aTj#LfT zQ9D}=e#ON`Dn*mIhRTXtGCz?ibW-17)N+ZfP113|W2KAJ0rFw0-+BVq*%-fR(M5Xy{LBhUEmevRkY~ z)46miW|w6Qt(nEQyuK@@bup(?I817Fj#IEmDInc~FrpTk9xB>cjYB_bBd}d#%#h2% z6cnej?SSb1@UI1pS5z(<@k=+Pg-p1nbt`h>W*Me~a(!jUYoE%kd*oHpk)_nIG;Cv1h&-1NBS9 zJ)%v&{01`sp;ApVSp0{}3yzc%q-AFDRiH+K&K%dxJ!G)6Rynt5F&x*$1DH%@6U-JY zbR@_^1}cPGa4>17#nD++HjIlIn&!Cw{R;h-M-8xnv@4TPc2ItAI-o3`qxACPg<8|M zUUA%98AcdS68*!?OX>AuCiNYCPldtXMLUu!!lZvU*wo?-fdKXodC(-U_V1V-QS}p! z_MvaLHzj9ar4Ie|&{V(9iV{7<@}G(|af5HpqH|da&)@%N%wp3ECDAA!SrpH>`#%E` z`!4{nG3QkoXZY`b=3ijP3#?b*H6n)@L^A)dh5iMsd_V^1$2Mkc3C6$mDgS~{I1oNj zLa*_{YS;LO@9bYl<~Jd1^AIC*z_YkWU~s;oYM!On2|A_xc-LXxP9jX=l#r3)zVyAOcdow;NV%-dT5RE!&63kpqa$Ck-o zYe330wGSAek2GOCO7tNl-{5)xs-6RVi0F%>;y!{SQBZQ4!UJ`na3>PoaFFiHrbx;z zFSzxr7BqXcoSmLk(_kad0&eNzAk0=cOK!LZ%2_ulfX1Px0A?-b=m&EPNaxyxM6>%$ zrBZRY;h!Z#zk()2^Rt#kPF!&2WFsB+B;d%nb zB)z#`Z5%*Mmvi4+d7#SdNF?eqJ^)+@IjN79Un%{uT8^!87;k*250qaXx5?VM)qVR$ zL%=G8isU{Gs|&8z_Sw=yS5@y`a&w^y9JX@P1XlI$^S>I)aIbZaWRJ5NPG?>ogG1w> z6j&*9Pbm!V!qNzj?#eoHhiAPnASWMWRP+(L7a|9J&Mas(wlVn^zp(6rxNk?uu*g7M znR4g*`HBW27xo%?#QBKuRR#Ot__aTv@!8n1*`0 z)BQOiW;kd7K7hOvi;s;!ODB^GD)U(p01NB`p1>a9%lZWK&F>P)bRF99ZOk4?Vhy62 zPJ%vACs_>rH|Q89!UVVTa~ygeYOT40sCg&$hC^>{KvVtQUHg+*=2vEtG%YaMJtmx7 zM*x6((~M;^414u;s7{XekLD;UK3fofwyoAA{S^yP)cyv1gKdtoc)BB!oKpgnZPWf9)yQl>IVop2B_Hc|r! zC;!aF)y9uutli$pfstCZzM2I6=>?=ac4KC~M?&sk0cqn&uuOkG-Ci3K_TvE+VHa%= z0g6l-IHd>1EO`Tv1m8hTytYvg?JQ7fvq%#o*_#6$Z_EmyI~kAXT7+GiU z-{MZZzF-OIedtY?BoZaqPP&7nNATEsbjt%lX7Ts4rmz2<1pvM%oesbE6;(AF;W~M% zjSX#Qet1V|$@=PX6K4(r2CK2)Nqpb5INqS1pUEWp1UTC4c~Gua%>b|YS_!RP8fXe$ z*GC{?w$0dAD>E3nN{Ec9D0jQxuI$nGd;`t?9}$q-Zwnr;12BmABY1+wDZDm)X+}Y= z^9cO)4O966f*7Nhvm{}TL6T> zm7!)agMR>)k2+wXkSPAdkX~DB-T#GX6zKiQ>jRe2iV7klG%kP-gvxXP9J*X@TcU#~ zi2U$YSVJc^1ui@RhUATk9v*22ZwcN3%8A$?ie`BH(yFkDi%XgwrtM&|FfgCiao{`C zt^!Y`A3{R~+6pnqAK2D>ei$-T)J{ZT!t{=DekfPjj&{Dm4S+Pxc1BT;E;6caKsl97 zMqr^3%on5ruLYQgjAlclQl?&Pj@pL?PG7OrG}e!>X#gg2rTtn2AW=L6u&&2<8HtM8 zgxxTZg5;c(%9BNH(-7S0eU6Co(DGTl1H&I5(*P7P&sJUjE#l>SRR=ju2v5_%q~>1y z2+i8HWnL?xhRcgeo7P#mZg-KA785U_C-t1Wlr_MEv-Fqu7~N6D+}}4izhIQtVtEEI zBik*B?|rYg{l^}_JpdtO>A1Dv+EiWCz=czvcMlbBIc~8xAbMRgo}k^&-(l6X1t1KO zetGf$Cp02f&nF!8-{_L@jr`?je<2ExluF8JuA|?66hsw=s+Mu*c>5rcGLiv%F=Yc$ ze(%{8Vuwae?8pF2vl5^*s!Y@!LMsBnSR6ipjM@vQYQG9nyLwR*2`5vuW&~UtFT5xU1Og)Fl?u2+zV_Z!6wWe4m z*9&d`YSvkBVLJBfqn#(pmOrfrm$78pCa~~zYCgC<%8v6u=!4~AvpfC@ua{Jn{@y-0 z`I4A(7P-Af!`WljS{q|ya*2CjaL?F=S9YSnX?^L0ySf&deqbA}W!lHKBL&_klT~4? zaBVR1l~?7Zlc-%y$`kbsu>w)H^rkf{ySK_K6XzY;tN9aQWVhmT&5^}pH+QYce5MIb z3s1&wG7Hx!JmT36A-2EYs=^AeS1$ePqUhJ);<5CgqM7i}R_=E(g8N`?0*b%nGQ4md zSvqK?wyfK|IkE>%S*qVR)*#OCbAwO~XYgIJmB+6lm<%QAHGrHfJu;a$vVj6YKR&m3 ze-sfQMqhulfz|n$HuMS#tLL>_Q#vM)*VN2DZ9=gG9OjSFIri68!iza9v(1+!FsJS0 zbe_?h<<|rCXWr2{0SiQSrl+U}*QgPTxbrKsF7J7pyYgYCX`^-^ma>F7VdDf`{1Z3N z5tsJBb=%ic1W#jEE^Ay?fFq=X3tp^9Ncc(TyIf!T)vjxmd>Eo?znyMhPc!hySVF3F zn>5&Z0W_O~*QAeG>6vhQioS;Qd{2ny4)w%6h`g`7iF(xaPQgkKRpVIOYgNOKufKM4 zGfrK18rcR}VC+KJv)MfIY#pC(%Dv_G3~?#sc~u9ARbZb}D|6hdj{@hxr9XJ)e}vEQ zmVLqN<3C3$W9bKgga)DhWf#S*N%nf&Pu*o|8US`Q%tjoQUQ#(lE_|M$WnYf%F3M#W zEX26(j;|)1E)T_Pjv&7sA5K=kLYvp) zR5(T_AQp0!&;C=hP2Z?=o}l;XZ4W*95_re~C;Hhd#KRFSW${yJ2aL0~Mta-ZwXeZr z(%8zo2?;E=Udx!Gfo~FeL{pra>UcGLx78&U#%kUy_?fUgcTJiPlNp`{E+`G{_erLe z6?57>Z$wW@6g0)6w$qKBa}NT*tdOiwv$Q_|Sx?sO>_}6aF$%5a2o(tOOo~0qHmne3 zqs2Y>6MA&QuD6vM_8HV}ZV8Un4ToJsD6sS|TpN@W_i#3unVz~yOKprx7QwtQ1((&h zdXkOVKXoTGea@SnKypBuM6+Edo~l8S&@#rJX$7irO*MjB(QH$v?1O;dbr|D(iyM67 zWNHYE(TI!dbi&vOsut>S>%lyTQ7at}5LT$m&VP(7OxES{*b>^AkWLUp_xZCndPi z5;esB@ZM8`CBpj5FP+dJ@~*Ub}e1euvRRj|N@|@_We!E4}IQ z?^r|EpJcm>I?y8+{6A2K$`(XN_V{x>dir6s3&ZWYHime?KyKl;yImuV^B*pwI;+%4 zMSO`Lf4y3I^gANg*ywkaN>0GMdJZ8vg8Mo{JRGj4#&GeiqTGWE>bk1G6-{u)jc^&0U5~_Ylv&%w+r*}PMkR%zvJHHR zike*X*Rd=NYo~q;w`ELmiZ7x&{qNS)?o6$ol$o9fyULsn7I^qpDpCK8u)@}6KZaC*%J?S6|lys@OA^6^2Xe>p%-_!eToWNqC;L@QA?2%bLhYgKU zHC|!fX8G=-b=;>>h;PEUQH(tbgKtL@zivx)u|FRSDJdxIaneZ7bRwtd9cRtkJPgq6`eUq-tah{B4bi0rkKc zhOGWnJWuzt82;wKNSy`){$|%mcD6-wawqe-+}8+wQbE0ENMam!%8sW#6qMxQ>2Pg3 z4y)r3yY8-cZtO6-?z!8NMJcH2Vvvp=5hOvdLW(=67w z=8ws@!L=IGYAuIK2l(8THtkrH16b9%HA&Uco|;;HT#ZA$HK;c-j1}%f?8$4A9=aGB@~mHue-mr+Ru)&liFV? zIl@lRCKjWf8-&F+4V07KTP1}iq_jy(uA}UQrav=1Q|K)kj1>ABf8xde^wNBOQ+XP- z=VCo~9Amz;z`XBR@$){KH4FP+eqa@p_i5+G|%`bBD8IyB1qLDsHXM?1KZ zsuH8*-PJ}CICB{|?XpWgBiiNMY5(E<%#ys3<7&*7N_}+=_(Lr>eJ=H!gZCk-!Adq^ zB{Y5X7p};6Mw430glv_Fz0KvZyGdeK31|b&7;zNG4C{Y|2JB^4-U*CHWcSD~rA4ET zaPz4cg)$x6UTB6%ALRgrj10Hi4s>2D8mYcnQhukE-`19Mht;vq=j0G%@dw)eF5jSPu z5D_FXJT;8+3zb8<9ysrJw>yk++09mwJwq~GbN_Q}Hxxua98tet-tDGLI)BPFl+C8V z@t+Hhe}b={``vl&GkIozf&}??MxMlr+AOY$?rX`nM|$xtyP_dx9Iv7Rurd!f7D7WD zALhkDMe@b77JZ~asjqQX^QH~3UW}kj(YQk~)z>iOY{vN>z}{rN@>&4Mnv|QyQmgdIjTQuKBHxOlza`lJ@MilO;jW;pHa`-P)dpL(2wPeoC5IqJ zW;GZytiL5>n?^T@W=jK7gw#j z<-D68qC>#ck9|F^*pYQ(hU4vxgqChq)sSbON7jMcLApIijc`x7RM)}3#cH$`p!8i) z+(LqQJ~&f_(bo}~_Wc{ic}4T#fyKC>n6n4L+QsSS-?2=*(K$7J7rhW|-c(fNk=t;B zcb4kGI;gHWd*~re7Z@T7hvyS7`=#LAK5%-xuF|E>ykb-Yj(5xTz-8P_G1P1R0mWUl zy_Ft&)BT>rylh;@#&McKVbJozk3ve1RyspSnr*Z@2xA*n8OFvx{O+3kHQAEb-YdM0 zQfPf{x7Yrb(`g5a*n>NIUAnj^6jKbtx0)%*Nl!h{&SPZ{qa|Xsorz0Hizs~lez6foLkb?Tg?1im_F>QZ<<3}$#{`bg@G@D(UyHY zqxWj7HM=mM#&p;h5fQzkuua0W#VbqfDNl$K0sXcDCw}RgYcp#mw!~J;i};N);&~ps zaF*4i!z!ZHsgwOVZEqNoY>#uxs@&M`A@oeeHJ z?}Z;$>Mm#GN-R#xZ-Ed6ve2EB{qj(*`4c&k0iCEUz`9e)#tTOr#mnBjL*Q9qp=)do z7R)O`@ZlUptk3!CFo3nJ={R`MOIY-n?z6_xQ3v)i>od%Tt=X+FUFjG6w0`EF=W7F2 z!+Z=_wi)u!hW9HB3@Qgwq*>N}VRc$bbI$W(#;6l;%f>5i|2BSO3Mc8XI3bfHKse}9 zno79Zd=Vtm?B!MFBcr_pz&zdx3yG_4JGctZBG;P$>kZDEsfV&<% zL%Fye4GMKhI))HV3{AL-dYl zFWTyBXYO?Jf+PJ33A)rYk}=mxvzD|HfyRhBSLb_{f{|KgAI^Cm`63R5ym(MH6mp z`3=RjV$e#Qu;v^u)@jxXzFBnW?P=SoUG$Ed!r~0ovuV`pci(qMhnZ)d2@oxAAi{Bf zu($`i^g~*$gbm40Wg0yrR<2PEmKwuRpDx>TS66DYgYRjUsc1YRahgTuy(5-=-RM~d z7~DHk<-rxNW;3j3WOCcLCr!8eMgck{a?aM%(O_h>oMJBt3U-~H=; zsXB)L;#u&RoI8fa!a5=1vP{rNpN7S(lE6tq`Mc_$_6K#IR000%PMB3J+d=?yM!*^Si8w_ezh5WJnk075*rD6u+IW zd>a_wPx4p&7Y)+QTOw#r>E#S2xiyL>`|!_B+-Ps5^G1wT#N47dv42$_3dnWs4oH9? zyQmi3ULw31BTJ82X>Hm5J!Ko!bo9>2n;)`zttXdGHd3K$()_C9Frp)4=g)YwjF4nWjGq4<6fwsotG` ztivz)^CeBK7FN*l^Xuu79F^V6F*2ca7banf<~*Haq-2ph>wrU_H?<%M2b;jcgNvp) z^1*!m5gnn`_xFLUY90zDGXe8&L^Dl_{gtmv!-`kBONby&a!b2JJF8)J#pm%}(5EAR6!f&$ zfoEM2d<$VlD}>{i+&0Y$w%J`Qw!!CIv#>M|rDsi_P9D3*TVM$=u8^M*;U3lJ+$D;~ z7o9-I?#Y72VPU(B#`BGW3IO9KvX|*j%u(SkhOZfOi&m)lt49d5+lSd@+X`{f zo#!k4M=dD=8m>`ct+yd?>=n6{58IQ{+ADiJw|}YKg`Jg@jOR&ynB;e;`4UK4n&I z%lDMf*;dc{o0CUEK$tvhrH-?4NW`g9jo7&xyXWzq`qKBA=Cr!*Ug8^lM2bjKZR`z3 zS3}-50s6U}VU`ndjaU1+ctrziu^IKypAFbJLC9Liv=JxUN0(o(zD-r+C9gz2z>RsC zX61$vD{z3AdT50)_n1JMVm>n=>Qfp!I)%c)iV)3*y0kK6QN2(MFR#ZBiU}^FvG2y3 zK;GyPjDwQF&lU3#*TJI{GG{6GPw={_7?_Mm%7dhHl{urOi{QhVYw4_5&DJ=&@-I&# zUc5`+(9~ujpt1^SubZ5Efa~?X^Jx_k2}gRZgUx^D-Fs0~?)xNrB{h-$Gw)9HPz3dX zGRA3ko?*j(_BafMK~ezH-!+;4KXQS$&}-;L9&u{yk__vba z3_#hBta*m1JWr3``Hfs=<^X6%dx+nlnHp~=2hn4Yy>SEN30u|z7In<;^dtmC6#XFw zN;SDEfqtGpbwH@7y)6o|oOr*!qsIvc_~d>dO*r;Er21x)#5-zQ^hW;yGO6S|pz*y4 zJfD23fl9WC6l7AJ#FIbvVt5Efi3Mu|W8N$fu2F>XQ6kk$NAM_{T^(iK=^hIL*L_t@ z12AcB?Xh(NG4O;9@D=LrciKWU>pn2g21^#;A>9L8XCNfa-d=WzKL6ppo0)}j=w_@! z(6n3GE7J06#xH|@dG$$|t_x!H_nRjM&=B1;5U}|?r zCiCAhKNd?-jzx@i?kA~-9)Z|i%R!S;()wvYZ&cm61L4k2N3@W>${0+Cp1!w7~>q!iu?rjhtEMm!-T1R zhfr|Z|63SeDub&xq%p4RqRR)SK>F8SU&Dkm?K}_t)(<%=yHEj!LoHw>8@&ydA zyDcar%5a>>dnF06juCCjq{q<^>qHd~m@EQrgM4B7$9)^ysf&uyQ|FXCkdq{EM3o z%7F^6AydWxc=@N{no_sP3c-h_PC45GJQP)99+@!>>coU8W%W6sRM>!B+R}P#wNdv* zAOExA7*p9J=_|kj>0X^f6SGQy!JFLh=a@&fW^UoYN^-wgeCf7U4GY%EGsr0W8E9eV z08eoM#mNa~B?GNMJ2XIRAJSof-1V}as9V-cYEAf`{+t$8W7f=Mjjqql(9U^bR3lna^}rPw43~tHu!rxuzk0dfT3#pz!B;Up~-&>=b^DW6+dH$YTV9k_rJic$rsLkXQXp_Sw zE6S0cFr+Z^Cdw%fYwytuc7Kj@s3?%u&SZF4;PEWEuKm|!;=Iwgk2M@}P#^V@!m4p2 z)vlx7!wLi=te)R%{3x`V$`m#?-u3=@JpEFNXC-?uzn3 zM05R_cJ{OIG82MQVb>6BRA{Dj6-OCy(JgpOQ@jq4J}P-4c&ve|aQ_Z?kD1PIGbP|h zJ;?QE!8t5x$QA2^WH@(#wj75fP%M4umV4kNj)4ch5H7puXcV15mw+06nCGj@A}@t*bTP^oTTFo{z~v?cJMzuhnQl( zSfftJH=cXrV4z`9Dw2~3~f%7H7BkxX69OwyR!s| zlTC|AqTm$Pu>nGg0oP-a_rLeShwd@KWw|wAa8PQvMl8*KzZ)4*xYdJ69mM5WmSt0FCKu)c?EQ0_R# zdX-eb+k9~J68H}KN5IM}=WUkb3Gvyzhp$H{{KiD;BFnAAZ8~t=PjpCo$HX1+*1J}CpauMm5L$}qlH6VjVlmf`C)$@B zr6Dc1y+v%34d9E_yrPZQ5TE9|^gaMvUd6{9H~M&9>U z0w9in%t-loriELUC$!!_yjR<<(OH+jZhohenw%!`CArX>L2f2eZJzr{PJgSoyISkg zHllW?2V$)0P2|Mm_4cxKZ(>OP@GfL#4H!rAc}%N055yE|Tc$ytk+G}O9eP-dm~kz9 z*itNNS>&|OxFN4YvTPAgbM%KS$8Q8U*_QU{Q+H(7tG%wN$&gf>v=-H41|e$puBsZo zX}{XU{vP>mSz^2SZN2R$17B}K)R*+HyO#YNDtAaKWmpL2DL+I9MMp#nYOlLTI=94A(!{Q zg_U&Tw?mR?e0K}4-jo9fN$l!i+a4qm1iGGy95Z=+9(p4Tj171(&5~rV<#!6kR^4Ov zopj!Yo+v@W{+Gs1p75|GJ;}80ENfO7jj12)&Aw3;9|6&blS(X=@8iiyGXXr-VZK)B z9iLE*xMT4RjcdvI3i!?yms1_^;e`e>4~qx}}J)5b+Rf!O+6D zVJ}HChPp+ZvxSiy1@TxZWO*p)jIhZA`Q8>)d{LpD1<4L7SstK@i$I|x&*oF^9kF~W zDTVaG^<_avRWnG$%qFv^77fO{$Z&(J&Z|67@^gVRTFH(^p>9K>vo-%p@p9_>G+NzXc>4tZ}~b+gr72oaX!ghLKus#MAkr& z!(v`FyqYsV-7atb(>pr3uE!R{ZA;{|NMCV+Rq%p+8-YNN>q*vQafXJgvpwd)bbFhf zQGD3@Z(bUG*x{k}6q$pI)6I|jT&3z!IW?5nudtC^N4Cp~)A>O{F6|!B4#c*P@sKIQ zQ!PUn7%1(Sn4P~ha{jU;W}L_8M$)oNVjN5|dvn!Imm*tkFx;LgJrm7_5%@=1EORjM zZVB?N*Grtmo{vT~gA&%f8oG~@n{EBiRkUsV&V@ZCCm2{72I(|^RRwx${PiTE0z<%PSezn@ix((0 z=_@GR@sk*Lq!iL##6pUc-t1JXE0U6caC%S`S%q~!If4%cd7v1{j(=E+@=(!7^F2Rp zU`h4B6?R?kBji^{{3}GJgZt{`71I^zvct25Q8(%_F=e%4ES34*@QMmrUUliPDXsUi zoUiVswf%``cpgg;EMgl!#RZ`ln3)bn#vvVyLb>*Gr_HOqI*2`kaW~_FOK}cTy#QOw z7<2~EJ1*%T-oZ*^%hFir6zC+n1KO65k%yNOUd0X7)9{qm|`0<3GXXM_s*^^iA3wP7@O;&JUn`_qB^W&A`_%J2B zhX;kw36N|Cp^4cYB6xrG&A{pso+aM*eW5wTSK~i z&#psVl3(kOI`sdDApF?HWK4B2OwZY2bu;;7>f0bKR@wtJ+6ySWW_u)o(ckrTaol%| z@!*V+!Z?p-enO`4r-ME3;%H6>2VW{X-2?0rrq@MT@ zNrzJ4QTw%G^monqH&VS5#$dy5ZW<)}KYFB~$Jv${g!o8|PNz+o`57H)Pu)50v#nN1 zs^pLJbUO&LE89_i4}GI04jfD>f;qln3{(8djKW-r5(}Y5LVQEmBKw9)aGuMGMAgmj zlK0a9LY*vU_T*3`m8!itF@s(_gJn03cv9U8OvB@| zV%`WMH0E{U9SB|;DozG^D;;li`95e+c~D?jEfrXcIvuaV_+sV@pDNDqx`uD&>X$@W z1FB!{1KlwLk259ya4ixWeH;4x$t0>Xn><9UX9Fep3&hu}$MR5qlivu`_FTEFxU+3puPlwL~S_FTH2_r#NsbfU#O>*78l zN{@Q1E2|b2G?}>Xo{B%tno6T!JEc<~J!f<*jHeUI%;0x&xfWpxv<(e;Y4rd_`pR#* zk{Ldg9MSV8$_S;s9;iexCRDVaVd3qsR%EC@FObYw*Oh#)!l}|mYK0#t$qLJyln~{) zCpsX>EA|{e9IYs(cpLV4wHF;l?}{VsxP`Q(C#YO)eWJkQA@l1u8yyUADw|$t59M)$ zbR$^6re2D*)en4iF3q~N<=2;wBlNF&>ODFwh=D$sqKff-BqG~BpjqRd3{D}Gw=nSc zPGPF+T-Ce`Dlvs538vwXD#HB}`7-UOWKZ$?yz)uiAMd;#f2(DiV0?sBH86KdfUs;& zBIP96me6uzQpScN^#}XTD;AXN7DOBTCCd{GVFK%k1MFnmWK>svCC864OxA>uj>KM& z*(I$&0Yddds>%rF}RC@1RN9#dUFGN8aNXezUws)cj#Wiv7a_Are-#@a>_w zcaGcBF$bexd$K7epOqdow^5PEuTzO_3c20`wRVn(W5g%i!IVu$V%jqMm&2@0UGX}O z-7KZ*Mxz4S8%Y6!x-?gkfvL*@=%H{G)ih(9VRr1QA5cJ63-g-F68V&Gr|>#VRJ)#S znLKHQ*+x$>-85|WqE=?gISzN4&_i-s&dtKhLlRX?k-q@50OOoPepsOL5iIAuqJ8hV zl1<#hLcoRmUMA$oQ%PY?^tfT4CyTo zt2RIZuh-Lke;H)7o?g^58U1cScS7%XG``>N${%#;FxC?(Q)jbMe~AGuouZTG9+fE_ zROD|Lc8ix+esNuS>TYilrAL{5D;)GFzHrAx>Gu( z><{m74F_w82={%}d0fZ&JM7v`n{JyubMo#@S!Fxwy5+$=^bF?A zoKL#NKhf;p)n_FjM?E$LI=DBE#$FrXb=BrxOr+t;nMSd+D_>ly!*g)B?;#&Rf=fIPqd zh7(LR5+|TGvYY9X8~Wqb;m6no3PcrmqdOI~)3;5z1cLEo)x96YpO52GmC6^u+|TYv z5qLca^C7J|LlI&xPe)6z5_VJ#|57vcPyg|Hw_A*4(!UPl=+ix7`im9wXaN|DYqXta zPHt!?9WEuy4fnBEUBria{M`$zxA@q2`8XWATX@&l9vCg~Jf8p#Z`fm=^*1W4Y&QnL=u-DkIScNBKkfSIl1Y|(@V(h$3a#e1*5(1p`cTSS8aY;z;;XXqv7zkVEfbL*| zUEm)*sa+KBA6Tf-MDQ+Q@LSHs>ijS!@b;Zm3~JwN`|eLvfQ}h((@arkXNx&`KIk7J zsdMgO#PEwJnYKYd$Hpb4qJTSr^U#aden~Cc#_9>!LpopPQoh$~BiQ9l=W=JD+IxH| zAckeTAZvCf-#TPpRmrNJ^RAEvbNk?kj!kB}fz#1W$PJdzAcakolKP~INf)rBLuWBg zR45sWEG}m3aC-og<(8En)ymNa(6%2%;TVJbShJ(AIzZ@mNRnG?5gc)SRN0!fpT<}4 zkp-L;q(MqqFPt-{Z_4UJ56)E0_E8y#9L0z8+LRKWukf>eXt>VVB&d zJd-x6>*Jm3=yGi;CdqtoAVi7`!K6tS+gej0CHH^IbL$2t2Hl1UGx9OM4OW)#(gx|6 zz2t|FqTzPjhD>}TR#DINZ{Iosp5C}y1SE3YjFAj44nHxzRKK(0hM=J$PM2bJvJ z_3l|UHmXK^s$%zKBo~}PvfON;5qTfOicJhZQtMQNRc}|3y)qX--g$YIPQBv&{C#%( zuQv-2MWGgMa(yebRX=bgo{E!Yax~=LF=@lfQrka`T;!6f!pXdP{RH&$>80jxN?#`z z=(`d!u|tk;IZ%c{;CZ3G8V6KlJ+3si$X>LD`L>;5*rk}DN z=l=R_td##tquV3ehxJMz&8s}#oGi;1?@=6g@OEe9=vI=NZHHB5(AGFMucvhuPxe=S z>{5`YOrJf!ntE>(Vt}|x3z?isj)|Q!4m*s7#A<1txLWsZH4j^-Bvf1&Q7Cf%0@OCd zz>&q(KaOw~7dFdXYNI1MsTyTDi1$?_y=)9w?pH7cx z+88sw>D(ZpKT*1@z_efMz|;Q>_f;toVCzUI=^zLYlHB!{)_k|^f3}_8%809-jIke3 zCDA2+Oi-{yqIa@v$UwRKLdMn0sdL%DyEhl9bZs8*_s&J{Er-Ah`5n!ptfaG5ppGF6HN47Pcz1sQ%p;D7#oD| zo$xPxGt65_SG{(g<@1q=*Ugupv~ItZh&Qc+CXCFiq1Bu*U;pGeXKjQHSq7MQM@oCO zgA+1geyW+(POFAhsVpd`$q*K9VS ztP48+F0mFh;AFb2$u5k4si5*UFofy*Pv7DbM5A2xE-C$}V`)6jy^cWJNrj@FBWj8T z;hHet8A)o+T@g1RY<}e=}#5<;mW3<}y+ss=r-ulo&T-4t6lKvbm z$kqJXc4+5UirEV#qAk<6==F~te6zUM6H{}fG2G@#4n^l$hIuhoH$j(kH0QW$$A#i$ zpprctXx#LrlQxSqWO@$vG`>q-+w*?{@;B(*Geu-2)nzIT% z4b&!LE%PnVdHLk5k;`u{in1#{>u!gEG#c-1mI1kqZ_5cz!#2g`U5k@%!-nday3XGl zu9oaw=AEXJHG{~?R=UvfuRb}MO)~3x>YXY0t`jeI^Qt2ex z+e5RGS?Bl2$j2lU#TM?3D&@}}nbZ$&)fHvUsxVxyV0*pKF_E%mc-ce0St>sFvx9E+X@Y^t<0I@SVALUT2_uTBdUL;1?nv#ZSm2 zDV+6oKqg7kh~cedGM%m!?n;&B?Q|}pOzMwO%_A))SLeE=C*~bxl#rL$=#`S6pKcAu zl35tX#PPHwoa@x;uLN0nuynN%2`WxUYDOhyrK!Vsg$pBmQ!-xmrs#O7_3l;C*-u6< zJ?%XpdH51+@%@sm636XrN)67+nN&eNn%Qm_>eE;GMYK$Rr=j)cQ|P>=crlM;T#1aB zHRG~gyrOhXkC2vdReG_gW=J;GePY{dy!=*aSN4se3^C2&c1FH$Xxs_qfbF-{vxmpL z5>J($NfT3@{#u?jm~Tf6i`vwZyzi&;7ye2wtWMR@jj`hysF7CqgE_DfmGYAHr8|L{ zB6Xj*JcrC}VyvRep0Z>FL5@0cM8(UxsJ^JP_t!e7X>_d_E*S}jRxB>d(h@}ite;P` zoIEGpe0O0~!GnIZ!;#)jME?4eguYpdrT^ib_S|ajL#s9NGpgc1q^-PPQ&GuM_a2rj z%McN@z9(($YxbD;tA3%zRw-nAPxI(~;udknL}VhXGDNB}?Zl-TfuB0Klq@hOYVI57Hc9DtwfnsdH#%7AQbOi|4TlNOK}4=@~t!N zQk|bV<&Vy^%o?=FNdl^C>tiXPFKHEW6d zX-l<)>b3rS)0NAfgabWr71x>@Bc=ws5UqP0F&q1O-v+g)XXZdn|60>i<#M8HB-iVg zS^MMmR8DAL&|jlXiqhZHC`kAT%9Cav%)o2sxS#4brr!ySlhOMvfx=p{d@;P=X$UhnW@hb9gXQsANstM|mmXqR##|39OIxTskLHL(cdOSkMNX&a0_Uksr z_To&hR_i4(dCHOV>b)*aTCb-cy@Eq|9o{N@-9)!{twhUm350(1Xz=1b6|ftgc-;`% z>aISTeAD%-wVM5(tP-;QN{!s%Pd7jE_x&H780^~SakW*xA0elrECI3wv;;fPHFY$=kZr7i6=R*n0S$!bx;0}-%&6< z^lv>~&*N|VKm1_a*XVTd0QK1L4+H~5E@&1O1x@Y~01i9pR=;_-99&@51M-;Y!$Hsi zwg|DS?B2-n{Bb)Ar~pUV`pzXE;NOI<^&T+WIB!5mq)(IHug~-WSE2BD)fz1@C1F&! z_;*tc-YT}II=|2?l0=-G0fK!uQ+@yfwF}s@T}2=H+!}$Pd?4$IoW}uNySO`+RqG3B zXx@ZEuO`54+aEB$!Vz)s_a{K~E7ASWAZ6`yS=TFH$|na>?1#vW2_;fLDd{NpKQ3taoc*}mQu2_fnH zKy=#Yik4L+DA*C=A-v5rzY-}1%rJGpYcX*jB>indiCt+{q^jIQR#l+woo&8lK!oPb zr00)1;0&lAT}XY8#q_Nhb7JVk)N z3L{leF?T1Y~ z;{3oR{_3tM#OMN@uj!NHP^Y&f$0g|W?n8r{mo-!0MY7|jY0$5o2FLL4-GpE(F!H{s1r(TVHCxVQnNw3m(-rh&&c z&nXsQ6Su#Zmv_$nHw$22CxRAS2Y3S)N2%$I>Zl5>J2HP`B?z?pdko!pE8*-8oJb{B zKqs{htKR_#;ll}R=Ges69DF;P!Y>iEkDse*SUU5!8mpR?bg1JPKapT1c~=v;ZUQdL z2QGsi~WJR#Y#KHZ3He*vYLnT92M}Y1LQ2 z0zL#llYygOz$Y{VoQBye8=~Xv1rRl;VEtSI6tYn|awPizcic4vX6gjsrtsiChawSl zG3-#4%(#RIh{m@@`k)00ikXC*4L7Nh8QzG<^G_MsX@JY!%5#N1B;o26_xP<$&{^BL zgV*Q<(D82Uj*Q6~>>bht5*>NIq+f1O* zl`ix&pL@=#^=iVKJwOHNuk?HqYHT-~jCn$WE*}gAR!7PT?t!p<&~MG2D!tIpM21Q2 zwOl6$#aPlB+2tO|Z)!*%Ti2;jBcNmf6E0VP*Qqzzi};WNFr!@%($g|H_=y#uvUZ`Z zQ1h~-cei63uXHdS~6B10);T(aB>5<>IdSmH@*}S@BWa?Z$4D~1~OU&M0Hu*vuVY^b0GE&UlwY+-cmgWB!7{6Rt`jGN-zMvUYy*<-ZQb13C61{0zcBhTPm?BWQ0Co8#~ zs}>cx587UbdssWdk-NlG+KsFv!`5zxf#F3bItlyJ-fhL(8kI9I2yi zvDd_sdyDa$RHzofmiKtEu(a&U8qe_2+!%;vWloi6j~IFH^iQbqPng|n%SfD{Ut3I7 zsE&^zm#NA)T+F39<%y$!9ytNl#Vn)Hw`AD3k3gO+@1;`lxAX#S`slg68tO~odi)5{ zSzk!~CY$p0OL&3dcq^G1^mIN-ZH0_ZvhUD2*4k;ZG49K|< z%v=3jW+K1MlxR!yM;=ECW8(VZ>zZn%%lTf61cozN1Hv#_(YPTh8_B7g9)_}?qWu|! zcavpX*D;k(V^mE4QG)czTPG{7=%kzNmht;e?;MeaikHA}8ZrzzQ(svWda3wEqAc7E z6pv!jmIZp84lx{4>>t&k?Jjni6A*7>4DrJ?Mk=0^sDhEJ^bKq#aB?Z9PBaC{d5-kQ z;zd}(9e&W+?R_r zkv^`}MT5&v-fQv^7Hs$?&wR#NVo_w5tdtXF^)n=h&i_O!Fe`|=fc^Cbr+NGG9NQ~v z;s`*tNnNXvn9GkWQ{)yfGO6edm86EBB_@WS*zJqKX1&-&ePKs0&m?|5$wNU1S(+r`_H8U%Dcbr8s z-HKAT?O50RN@v4&Zl%q46O{Cr^P?Fuh3)rlUa47-GkD~cQYBK}-j%@IG9)v`mIn6# zDYWi2VVX=;+b`$hO0B>W@`}>&k1-868~)D&#+aT&UHeQF{hPU7D#bRumAwBh52`A* z*cm^_>}VpFw>2wy061+o%5Ue>S#c~Z ze~xZ@j4{wwXwegbZ${?dtNaP~7m@xTwPFI?Pn6k4fWbFy7 zepXVhqu&;5$N_M!=2)y`iTqGs5f&SE0nxv-cT;cM{FVXPH!ZJtG>nbFp+XY3tKh=P zOZ!q~p(&tTKB`InzI)3j9V*_32dZ3Uw~Q6GJ za*;B^!z*gYQxiO%p0H;+Pu&xYHn^K$Q9tNwWc!jjC9R1-UHs zhG(Gx3qu|Ms0;_N@s@bFt+)F00$kl3ODiqKm6&djV;DM@8?H0to6TA_{g}kPPJWBs zC7tIJ*_3vwmUN)|+s`g*zZm+nCv8?!c}XpEbYh>BE2BT*9{$wHe!g45ghu1E>M(mk zUiIPWMmi;Um(V%WL+0cC{#rxv70dcq!kQ!tx_z)EKkhP(Q=1%}Qv5PLIaRV<=ub*# zC7??xgBmVXx1(owgVXxBg0R@ipW4mEv{vWX`q55$_+(3ZyQS1vB@CreTF(sh?DTp+ zk0QXa##rgO-pQAn!KvpjtKGjh_iSsut-<$GO`#_G@1Y~IwlK;Co^bK&C5!(8r2KDEWIw1K`-=Pm_2Lx%ankz_ z1`;nA2IPb=yOFwoVIu#phZ_om!ZeWdHF`h)F|hu->iEC*WrAzC!o$H)Sp*c3^-Wl= zenaTPTS@A3fTZ`PoWN`O-FAHkz6lnl?dH9r46$065I0&L}S!?X7XBj7bM{gMA>m!V~mc zbV;p}F%KlB9+1{dLb^ky0ymFEmEQnlcsF`ro#iK)Kni>zoUZ>&ISQ7efleUh`Jt7G_PrI~LZ1F!)uT8cGIsR>T|OvoElsgSQb=2=1y7GL zh6J~LF1YpfkRpgg(4|<5;!b*z1X`NfGQ5V2EbA(PpaSJZ3_#d%C|oUxlr0mHYp9>y zGX{>2iWXt=SLE##Gax>u2tbs6wu%>1=5{kIUtR%qs}Cq@3@^O*#ls}XS=bf!+e0qF zoALk!ldO;#e!dITKedhOmp&CGbz^5?EY*NYTW$ZGa^KCmorN;AzhC~^JMVtiH z+c*q3T(lYAgXE6QRAZOt-p_RGz`NQAksy~T#^88S0tSLebNIe01kE%C;q$HXvCBC6 zkc5OG!qlH`rYXjG!@NW>fD!-4>2Y3Lo*9Itt~B3tH1z&Bqj)N~O>2{^eJi~1M|p_# zD9<9`4SZBzZ~5oy6nqUjuE^Urq65I=bq7^bFgwz)2Xu?w#%%Te5>^cxH$cQ>vXSes zhXC%6xb}7|=(8XWE92JUJOdLg6?1#UDq#amB&mBpI;O#=tU_sT+WzJ^Auq5kafz#d zEKm!kU`Gb%nt2k(6kR!@A6`vhoC7k`1uCdzjh+oWbC!qyUiqPte7pV%VYB5j#{@vf zO8Y?lE`(eqpkfj+UTEL_Sq|p#G;nb%SneQo*1$>5)9F>HR!EM}3>B1=I7;47+)uk! z0_hsbYzs8Rln^)Fk_UMWDV|Mw%^+DtSgt<~DYd4BckOB)iT%mR*cu=3Pi2 zX33}AY5}OuMMa!Q76SbTfX^y#!@{v*Rl5Z;CKQRnegJWhE7iB^3zROlxrap#K=Tvu zOC=;rYF9g0WwVq(={3}`529Xp`b{g!IQxwrORZx#%8fOqJH9vS813e5;MSKj+-2kf ztBZXG)2n^<#VUN#$2w0)!ni$wgi6r{@QtPw1am4f)DK@3Ab5KQU8w&_l~0rfbt#;D zjXT@u%={QVgkzU(UwE&4yI}^*19|d8rRTy4P(;^RW+_Mjto(BCQ&2v-lcZJlvmKa% zsjYWZne0GXX0o$B`&+|(P$z-yfLts*2&|}C++#+GTsg9q6$t~8&JJ-}%(V>eEkrMb zyYiLofIv#pNVah!f+86&CRQI+u}>O3A(6DU2jVJO5!C55_{PGIQFnU^1>2Hqzqf6I1-k(sr@KS zq|;5ZtAax_7f(#K*alV+{fE{Kf#-_uor2Bs?6;C%fl-m^6!!)UCPA(WK7wVX-8Tt8 zlHO|%?yQ$9b1~H{S5!NKObu88wJH!QCq-hO0-Z!{yq&sITmCpIH;N~gy=f2WWa{}{ z$>qBeg%@b^%IV+?c&8KX6KDHx@m(G0 z^kIPeO2$QwHli&;3uk%LYQN7;GarBb@Je=~EJxvm>7XU+)~(mAjPBd7KZ4A)$Lr-s z%|4p7_Z6=PUO z1bK`5%&MD#{Aty9kkcZEXs%>WHb|D6kpgwa&G$J8OuZ%QnZl?ddVpfWtN0?QITPN% zy&5kA=dM@+1D=~&U(u=B*dmNa7*78 zVv5Am;s28{ZifMFCR(xC`Li41sk}!&<*0&XGWGBA@IaiMiV*Y9W1zi*doiQ)*v47yr>InM8CzpD955>qIldivfLOXBJhs|9E+J8w2S+ zB(D>xy#X?X85r`LGwtu_FzBPZAyL#OkvH|Ws^RDCGdWgLU3>*{?bR6)9FPMNbEFnh zyxS+Ac?J=rduwu-Q!Qrh(L3onAiLZML3YOYoLC?jsJY3^LCFN{WQlZqic96(x+RPt zl;UE9p#4rK2qMuLD-KV>GG@@OeIcSR#I7LEnY7HOp(&+86oaR|m8ez8q{-f=RSRjI z#BVOg=)bmTZJJ9Bvga70IkAHba>6K%v(NISth^#ERmrj?uNMeR2~Yg}>LT z{qFxw4y#i$HKq}EJMDYAH%z-1vJp+p&{6<6945pHO)h*LuMH94YMBX+lz+Wy-L{7B6bEe^`mc6|x#R*OtKEA|V!@zpI>*8bytn_)u< zZ6EHfUF0IM#by7L(X&qNe2dyUIGgXWnkFYhKV$g#_(WWZzfxyoXSJxUGju>lMZshc%Jm)DiK3a)0R469sC&`MI|!q-H*2)aic7V#_K{bje#NClCdRUK zYnJ#)GL*&qEn8hy7~|o6%2g0gnG(Zx!?k{;Rse4vRG7E*7{qH)N`ygqeGOteG+Q*{ z@A0ZF?Wj%Rcqwuy>^)b~Fx{)jTf2GlDz-0vv%EB^d@%V7#dLG_UZYvx2jIaxz}Z70 zaq@P?8r7`)E?tdFe`puYcjWiuy|bc+i|^zwPq%=BjYN+kA(BwqQX+3zS2$be(pU^IetCgTamrj zUGZ2dk}tWtqRk^rLr5X$20rzm*-TeN(8W#V0NyYAI_=WmzT3J`#7l)-)34cF z7xZN&zQyxlGm?YW3Z=UJ;HEPxw(dgf!U}e9Cn}~kiJZQtOvwa8zIOgR^t-pbpJk_S zv)jiR%y7omZSfXD#XgWlGFlhyL)Lbth#i0wgbSd_EwMfP$*OI;vs;EaOG+(I``l{s zzo*Wi*?KU^5<-8`qMP4n?`#XK^$@llQ!Uvu-G`+Cr903u6j5SB6#{o|Ah(D-kUfog zd0&igiFT&`+M!$A-643{W~b;0&)*~M3viAIY{E1fB(O#V&feRsv@(9c#21;SDm$_e zE!f+?+$MWbV;C;!uhK9l<&n!LLz+J~U8-_S5q64`lUHTYdU;(dS=u$|$H0q-EW(xn zKe^nw>CFfyt|`HyIf?h=snurdY7bup=VbA+3QO|hlii))ywvNd@oReTnVCG#)>MXo z-yY-LdZ)Kzs+`!0J^I&k|cT2Z&`#aSt?T<6lGc)!+| z8$7#*XgSh$Tp8^&iWH};JlTf1urI2T8n5d85~#XE>L2JHR-H5D9q~V7S&9g+?)VJS zqg?pnpEEoiVM;(e5|cK48;$;wNcv*zMg1l?cxu;DoIFIH21%D31!+?4jz>l8yw_~b6_}aR z1+K;PcapTmy|=_D3l1-*9*=jKsGNNpi>3(7tuieyIqLk$6HwdcTk(##76yCIQS~af z-ge_-4Piq=RH*1%{J;OQ{uInQlg;#dV|dzmz~jq6h>pJERJNeW&3=M#|LU4qmZrqF zM{cDEDy7+-+OjY41_UHR?UyH?tGhe8K0Ke;`Pvi{jFT3C<(14igBePJm8t#nqGXKy z70aEOfHr$Y&jQZy_Kr8iJ*0_VcYY&CeMGq#q zq|KaH3khz2*~8lQJu1549j&|#WRSkoTEL9ST-wv;Z_8rzeVP79Oa9OA8HutbxC$AG zIo?JX|0{`H_AehOt6eL*)Beq_?y$J(Uy|ZMQn#n&HR5pbou=XUe_wh2Scp7bpg%s` z8J_z0KmPyq-_Fb619$6!b%0#Ky7zW5tRFBwTmbRGhvdGH_T!V%XZ&rH%{*U^<{+8N z3p#H(R6z!ZUZ9G+vl#S+y7C2k_!JxvBO?WB6vNey!`mPCUx@PnV@UkIJ2UTU=2^=; zX<5HOH@6D_DLes6LVs+1<2Bq`sLByU4P7~~t!O3pfJB6!M)@0l4_V`iPk~hPOCL}T zKw-aEKxSN97I_K^-6e1;5mpiNZL83%iLv&(8?FgL{Jh^cN>M2r*^GObej#Q3`vSwX z-A`ioj%m;+3&aGq;Zq5;Kwb7OGmXJ|i{a(&&~+v#>81u4+#0X)4D^f6$8Lfn=@Tfl z@Dw-{CcvR^N|VYFrtxhdbqU(Rgs5)^H3PA8>tMu zAD^MnIDyupx8Fv(Kx~TDZyF)H#DZxc*5qpKLP3wp$J`*bMEeaY1-NaRR{h%Pd}={p zK>HUUuMo&F8TMyNmGywj!oG8G!>|cXr8sg0slLuPa$*j)K_UaS*{-dz5p*T0JnD+^ z-aM}K6f`-^K-8Q+vi+Juu|Uyx+Q;){e<0@<+J@*5P&zsxD8wd^Z)%>n09VPNr2R5& z&>ZGCsMu9z(G~d05)pLEH#gGj4}X1c4k@wkhc_Hlo`FZVK2`~gI4XMe=Lh4?G^Z)H z`Lp$H$D|agGRF%f5(K{XIP)mB0I=)lzO4$VahHrP&8(+bEOR4*UH#L4!F~6$eXjo%(@taSOt~C$ZObM!s&+#z-2%C&BuP&F?R|} zk!w_v(0y18(Lh*vvi0{ut%irI^ftL}#3>cPBr~FT z3rQ#`2aDnhXS4vV=TWC1k7N=&OV2~*zmnvWAnAHHIFHTUYA)&zjg zi;_H&$C9K^{Sn!Qr5Kwf0|jL$F2O#I8!`Q^ca)ihZ~NjzkrG0S})p-9SU(K(7z2 z!Pxsad*9+nMH?ZYDe1(AN_OB!#r<+(CbmG_f?r|O`o5xo(MbN#4sP7m0ANK_Bz(UT zv8+s)#7`rY@pMbtVE16kzdYyMTN25*`J$G+K*-OSW=p<<(^}c5I~FmsZV0hAPr5i# zC3`YLe?0+`?byW+UnLZW6j(|;E$}oVNNalu_;*P?+85sx8iZAmN|DrO~?LD(Tx?6WsY_N*D4_^1iiv%pk0cQ{DcJn zf$tal>f%c?mt|>F-=EaEobn_JltfKQ%Ht^TA|`>jY&|F3AXXGg_EW0mhtA(0b1^hK zw1mU-X+#j%vt`dH6oKf|6BFkDiulLly>wu4*6jNQ4>SD(se82m0D(9NdYW@L2?ZzUxT21v&X8dJmsaYOD(oTO7Tb zKeA7m5{1r4fxU@l_=r{s{-N}M7CpX3Y>{@SWxFrGDeky(#Ak^FP2w2Ek{X#itJI?P z8LVKRFh78R&zq)?Xp?5VC==pUrU1I$VOWs0-gbm7_m-(|)9xz$oE^vCPX<3>lsw3s z8GCmiL%ycKXfA|uT*fsOQ**bkAdeBSP{dxJiQLaIaNE2>0JQS8!B!<&$*V9r%JeqW zZ8=YKb`3t%qqH>YeuBB#-r(nK9%OLu4e+zvp-tETw!qitp;WoJ3i|`nh#!o1;qkLS zpS2V1QNgeAH+fH_anrbmL{)`8m*z36;b+h(hdgzP@THm@1v<&HuOR0-CWNgI=pUB3 zxS0}A?)BY=!^HH#xR&%b=7@TX=5frOh&x1S;e2U~t9)$4^o-asJui_dWfFA0yWrAd zS)oRcX9q8o&6iL89d-8{Jq7tI*O>VuFkI6?@KYo~WnRL?dQnw`5+Egzi-W=4&!_;Uj8|K41RQ=>d72F_^i(B;A)vt#o zyf*Yut2(?KX#m@M)GCGQz}iXLqxztLe8>3g30{cJPbsA1KOa6Zc=&LX317GqzX2>m zApF`aM<`hs36?hY)zBP$L{7f14ve=O<^~W)2pUrbTL~Au%Ul<1gF#H9Ykpu+aJt7v zt^MrNWilO-``Rm?8=5a6sa(9+Vv1Qj%2S<6139cb77-L{X^2OUiP)Jr4=%b&o;E^w zsbovu#2P8?WNZ4W%6~NVPOy+d8atsYF*kyMAH}WyB$fgvSJ9CYP5t{BPlk6_+ckrs z6`?GU;B|nLbX+Ob3)_bEmREX3&>Rc4>s5zuqiOkR6;S0b!iNb+a^}mDZ0~Khd;vSV z6N0)qZreOB4vw%~XKNsmK4Qe*r)7=vh}{dnL%#I66D%|PMh!dO zmeV^ZHR?iO}B;RrklX?KN*l^;b3 zQ6l%gv(xiBW_V;+Avp>k-2aiHWWIYSXdOVjK(Rk(9J)Yx7gdu^|R4nQxR z<=K0oD$8Wr*qYZao@7?}qb1=MXgk!M?SYZ0O9h%W&%qT@ffYf8&uJ==8j|)z#s8v{ zY)yUPxk=B5pk$=vJ6i-N()bqxIYl2I-I7(rQ7+}K>|i?Rcg?qLfRV!}DIG%jvGD0k zP_!d5OOGrJC&AfRkSStL$@F!ONxX0-muD{3iJ;xLY;q6nS!YZG>9aipzEwYv1SNhD z953zh`P+($R%6#tMgZ%U5aCBu{f{ZpHblzIJJKBbWZ8^iqG;DXn3_%UM! zmN!0Rsf%ZFKRnzEHhju^_rcltx!vc(o_9y_C1Exj6sIrr3n{$08Dz}V9T29}#7~K` ziPOSrFU(q;65^m$wAKPm6ni`Au6o5ZfSZqsiY^{3h<=GSA*v z>|rVP=-7bI1ed9h-SY+tf?QG4qbM}$t@SA_<_Q_^y55|7*WhGKR4S&|y-gL<$sgzr z_CP%IsN)<9p55Eclb3!e1&c9O3la1+9n7W%@d*^gxo*6-l1~sKa!S8r82S^X9Xso0m!qS*_NMM?OTTfQ zvMLs^?ntzI%@A+2vxlcwt8sMit@GzY+Sq~9AlHx1v@xXu&E7ICALqid*fS~CIRl?~ zsWJ2!@ZK4%z$U{U2IEG1QbFt?K||KRswT;<*Y7vVE3Jb2^6~uTrv;b=L7Ysc#CTEB zgzeG81?-aapQ?vH?R$2 z2CnzNb-2{yd1bIGVyZ>^15{}S86s1+5J5A-3MYKloTkdmYxKNDslO#R2Wed47j|(>RJ~sF}j*V~Kx9(LYvim%{ef-SHa^ zPOLXti%n8_%;xWl$A6V(cG$uC8CGxM!Ve1nBeneP1AI86#ap;x%DaD8RjPu3Y%+Gq zuY>>hQT|_pJ{yj43r`rMM1btiwcvj~4nEM7MQfePC>Q7a`_~sjK11e&o9q1#-`}?j zoV%0`m+g0jN&oXT|NKF4IA|2H0Np!nZZW)HYyU8Z7+S^sOuPv-Be;P3$Ic!JE|l8K z+b&=`@&=+oJt#~%1%B9KCXaslk3?dmwG2^Hd-=08|xSb^Y+?5=?j{Upyn z6_`KRHKw|NUBmqM7vPMakk~@aPk}QtIr`y0M3ByIm*n#QR)FGk8DiXYwLSn1g61{OohM=n`2;6s#?Qj7}e*Wr<75{VHeMfZ|f`-@o74Ti3AD2RtKR)ID?e;t@}P zB}y^FKvET^fQ}%z1S;4HJ@Bwh_$x5}Px=SuI52>GcLtiE3%H&q?DTjEI!V5K21wld z*d-4*Q_Uosz!Ah|wztQ8S zpH<6=W`0IDZj|GGY*H6k6#Aw2cYqguZg|`$N!Z<*yRE={uv=B!|HLQ4h=*)0LLL zdI4G0xw&h5$bx+k*uv~guSa4=-iTCi2jtgzbx$0+ZG_>JxFvo_C#Ygqpne(>mXs-8%*7XfbGh3?=ky4jX=|{@O3c8yr4D~UrD$FKArd=zcqmZhJsKw_eeNA zFlRkcWr(=H5>(Q|EhM{fG2Gz=Lj;S<6lB1Pn(Z2EQ#(1jQ&*6j76sucjC{23o$Zd@a!@~ZkH*?%;V^#3oK z$jr$-zgCGz!ex(%?$WoL?_N3N{dK-Q!zP8<30trm_1&OxGN;o~%oR8QEpmp-(mb0c z9=$fNp&RbKeIuaEI3aW?FSJSNcO@^5=6k!ZxzdZ9V$)R{KAC1sGrvajI80Wlh>+-t zv0YA>a%Uja%jj9T^1tF6OcZuX@Pl;blD6Gv8>dW6ouAfuzq@N?$K8PVeN$T7^ewO~3>{)UR^VP>TU4rn0H!j%aC7^|JMw zgMFHuc&iAJhv~DAI=;OJI$NKju;Mg8Sc^wL1$}tqUicqS4){AHIZ^P~$eDY2&Y%IR z+NB^x{|SKIW>o9-t(Yr$5$;s|eJ>7nz!p-Zlz*1J*Y~Y_I~A3#$})e05RM|-4*3Q8 za(pXb34QL`h>ipcy&UH5#9XtWb771W)4~m!5R5tXv@I4y4+dd+qS*hIO76VQZk~|Z zv0#F40|ujePw0ySIW2k8#_Lgt$@7J8>&&^TIvtJIBM3O?buDV?r|#GvSK<>En)6u^ zF9Is%z*1(D1U9ZI$>8;?Aq2u6^Lz^*gx8y}7^>h;`GBgOG+A8o-eFYZ&tl07XZ#Ps z;hQsI;oBp5Duiq6NwrRsRKS;l7#?(}ss@UUAoY;mohZ$b0@B8N$|}1!?`&ydbA9X?6M>WyC^CD`?q=?F1^1BI4Rp&O!W%~D zN)RjgDgvj%5f}!ma`c?0!P>jd&;xr!>5_8L^!kR}O?SKxHzea>0kGh-c@7tKjCj!| z6SbzhS*g6^X@ndj^nU9WxiF9MZ#j>p+1J6XLk&x&C}bv$x{cTzWU4h%j^agN+y>kA zhZH$d$w%Oy4mnbIjjgUgsSfi>Bf%krA(fWY(4abumplf`)gFAjI294zlq5-6_#n>4 zJpnhS=ToaYSetn71G9=EmLldD0iL}FA{FxkqoM#(CcK$n{Y6en)hn0=JzjvK8;dK- z4yG`d`ZIIheQZtKRJ1CGFJEYog(k*7ny3PtR7V81PA$*@zrI(4ykI4#$~1k1Vk z-_l8>GG&IMcp)Ae+L3vqSw@+k`$obw6k_|L@y8Wh_4SC$T)`M~5=FWi!4K*WzdEVC zmQ9DNCr60jkV{5Tnv%1MwZ&j)=L+Ll#64|H)sV2U3g%k#OxF~h#W+QF`j2KlruD#p zfwg~D`J%^NuMCdjQ^9M8@s{S#R_}p*OUYEdb9-B&Gh@TR#61jO)9Q$5%D1XwyZ^89 z37+pq>$h~_ZfQb&AUk@@Fl~$VgB05j+w->ZsDSnoK6}J%qPC(43X`NZ#ZkEA=KZAD zmxnapef!?``oHf6piS;45-yI2lt(!)yN(VU+0vcn_ZB?Ym-`pLNhIl?{3gsg z-#H4ee_42;_VAqYLhsZCbr$OVE8S&zDDy#vI?I`xJwXsIFT`i&P zrN_BgXe+lQbImcv`~K>k5a2-jx6z*_vGoqdV4+A?e1k26j;a2mHSzvKYx3-5RcexP z_PI9FNPen729_$(f3ax(j3875v%;cLLXYKxt9*{9K)BDJx%daxSL@)~3q#wzSIY3} zbM${<$JWyGXP=1Nc?_VFTHE1fpAd#l(;wddlA7G};gD~s*N)ij#XT}0C7%-sAN*Ab zzkRX2nN}ims#D@%08|gYnKQkulP8ucmSwO)Q{+_sC}Ye`40eqmxdrTPcZL?!Q^ zK$F^XHF;`oOafXf4@6(E6%A({$^f1EFyyS(k*EdTs6w_P^M#`Ale|GmZZj$>tNJLe z=qyXY`Tp*D5{0ZR+VnStZbE#U_wH0%7jrpW+=jF)_xB5B=+RZqUNuk1{XLm(J?_GB zodFhn0Ho}fVjW$2X`nBg%@;<>RuK}58*d^gb5ot+h_kq_PODx76!(*uyhlH{H1&~_ zN3Yhtml7iH72f7orxGxeFX2+_HS z1@_?8>(#-@dNYFodm|xAZd_8=8wLG^o~a!@36E*owp?T+cz*5Ae=JWuAT50I{@3Bg zw$P7C1M7!Bl7jz51(|Y7}ETa1@K=`%Ezq# z*HB6VfKp1I{R33Ncom-oKq)#E9pp+E#);|{p|B~AD*FjLqT$@}e>3^>I-#@%T62Idc z<}2yc`ZEXiuU~gk_zE_B^Yl2=?H{hs2X2oVsX_JUHT^Fg;Db{(@N~Qx7)F%;{`%Ci z;P#sOZ=3!Dlr;yQPU$u(Z8GRj!oq)FzX=Q69!$ra>;DAF{?Hk1CV;1N=g3ynlM~6Dqf1#qlJ7)*~%+%NqOiQ+)mTKXTeqko&N78FUS)G$%ABX+;y}A{f#@A+LIo=13sr3=r&T{d{Iw60Apv? zKYsi;-Jb%VfkYYJHy$(n-3#>Y(Pv|L#{~#Pt$xIwc=z@(&^|dLh$KMD{NV{?1_OOC zvA_FDG|)?pft_m{2wF7rUtL}RaB9{CB+noc7^y()3P637EPZD{huY6(uJNoLfeKrN z##TT7z>)uV%lg5itN5hIotP~wu4n!38;I^E>6rqF-fLfgb+LzX30AQV@EkANO z!Sv~X1fVmT0mjE=3Il|3IlxmYAp?+-BOZ+JJ9v0r`G)mAc25mT{rizfd>RcqffmaD z-Uj~ond9MS&Y=$TI?dv1vcgPu!lMXd1|c0pYF`#uP`Ng&RW1U4$tZ|&7T zr{zsU`H`DL;A^Efe+2>nM8#8qux!~%cN7N@I-MZEfqLwlrAnLRq98_E@o255I}|}N zE-sFB3;aTfxbML_&{bn z02B%yGF{-^={EXFoOthsanffVeOaMuok}_K!Qj9B9(pij5BqI;Q@x~+ieO}vIor#h zB}2+vz*OT3Asj#OK-A9d@~x^3(Ppyd*hpp3j%ES@7*M3L)MyqMXtaU}Q`8+T zeF5;j=~P;bM38sg1gV5pTAB-m{FqmcCxGZD*Pffi?Ce3{1dxbMlPGX4@PMIIP*_hj z=-viqfR#YVjE6F?5O$t0B4QiCY>~@Yj7NR9{cst4884u55kdM;D#Vux zAnvkDwy#*Y0YS5s*zBMB*C{A11&Yghu-t+7%Z}{&8*YS0kvC8Sya3|0WKXNDeJor+- zL-;l+&YjRK9UFUlA!0xCLSVZa@CyQ1Y!w8M2o)4I;{5J+0UE-vQ-G3912xG#o zM<7Q>mlop|o1pAHZ1^mZ0OYj{(8NnFMhXvuY^LXpkhNhOnz~gEG-T0_CA+x3Y1Le( z(E8rYv+fLRrxkz`7>B}VK)NJVvz{`RJ>E#u;;aIK1wf~k1WW`?A(lW{CUk|9zVE8d zabp_LobfmVSzdmS6ckEhnxC4lUoBhNaGv|Ew|EY~SEZ0oZj+&PeVLy8^FQ1^R!LS{ zKftAJ8ZoX8fKNA(l0S|uE-tmq1iUiy46x?ebuf4=z2`^(itO11^0(tn&AmWa`5AyL zGe3ndYy4M<;h&E&`H-D-3erAn?7KO&)(+=`|8ckn??7! zOZ_0p99uqQr&&?;&s1;C!F-4fpMQKutBFes#!MOKzgfzIc5b{K9gI)jgu)KF1fNNG z-*)QQR|I}mI67}n^+VzBPUX*RSM6@&wb%p_y|n{k33QMDM)yqQ-4%*PqG!JRWVlzb z3!(s^Kcoa8P6!8f$Fpoyz*PAN?p{n<*ntLF#ZMM;;!N~1E;%C?8m1P$k6`Eb3p)@v z1ZzO61W*So!QlvB4zi=FpsS>uAP_0s?%~?wJG&o&r812XS!Ik+ZVB5R>U=u~ti&WT zEhvtz`9!kKz!0k_bA-r9lLV)s-QVwDZ2cCEM5H9Bq9*AMMJ#V%JJs5Zi_I`FO=7HZ z1%&sBt=p`J>}_#UP(T6z`ZOm%~o$Reiop8#yP2NG0B zjvLeCQ3BlJTE!4(&Of~M`Wk^_7f*F=5!2jKeG>nDV)zD(LOQ zfatSd{f;)mpcXqP)>HKY=WlPdogLh2KNxjlc4_Y)fIBOw=nGtE?A7!9k%m1BDTp*P zk7Qe5(iaNdfYhNP4lsh&xjIv@IhUSuQuq?>UGnkY1>??<;|(|44ZYC*rWG{I@__ia z^I;Box94Bs1Q>+L8p&>l<_o6&!gIh6^*$022o&+y`Dtvxa`8UYTO7no$;!5C!^w02 zWVp#YLp(9=(4075(=!<1AMC~p_S;fycE%iGQvKGq)nuN1861ByR(}?|!POX8Z zUuFmBBJ&q`#o_*}`-TmkKrpeTu10wD1o;=R>-Vy&l+Jiu zIj|v;h`L4LHOIOLjE}M~U%XkkaiIEy08Ca8>@)G-8|x#_Ns)4-zRH4^!xRPVO*O}S z8BgOj*!@sUE$MSu4;~g`8=J=jnx83ob6fB2@-BuOA=!sOm7v?L8x@<;__rl|C$Uu^ zUvodJ=pL4I-~$2T%;?{wDEGLT@ce_SY?j{-zL}XJG2LaKSrg@yw9=n}7W~B`W~R{7&h#-~PVLT^k2wwChh)PVGN*0g9lC z7Z~99lceE~zZDe%RWjY_@$>D!y%%Z5NKj=f-o^Ppl)-rp%$i1vTpJpitzTE zjK&i2u3u|M}Mc{Mv&TUNn?%_}{JvArYNtN`leVpy-<6 z`qur_)dPf7#{8bp2sDAZu9M-P=E3@N12gB~0TV4ih&KyWT!#w?%L%|CK~d+ZRuFuU z%Q4CGH*EqwOTV#S3ZxMB2AXC3Yvg?hB$b6DbUdUzGYp%7Lbm#V;5~Saezj1PD66|p#JywA;mg0 z^0gAQBQKU(-3mtyD$B0j&G!9s_44nD^vmcmPfPmJMJUyKvX^mN=ORXorLOY&?3OjEtbIm z4mZd|QVqsIgyFjyWzuS>35#dUdaTl+9{;X^7>qtQi5r3B3-ElHGKH{oG|&gkNG_d& zp0658SPgFU`Ho)=NeSm5Vu`~G1YkJ9k$6Q_PSf*z;Gf7X$Z$dfbL;%r&T2$5%49|20dXQqK``uUk_*{UvT4u2mByy~eYMJ5(P__f| z?B@#L;9Zh@k8%9N8DAlZ2rsqvKt} z&cO6VGu7br*0Xz92EY*UQP(_LeHvs)lJ!+N(!Bw%ahYRJPfs}0OD9wX6VeO3NvEe?W}g~%L8XH={PLt19VU&^+T$a%g3jD*##0k7yBopU?Wd!yLM((6FF;y!wVczK)`)*2?%512xC zNW%dcOd&mks^>C7;1zM}PBjSYpBfMXLxaZ=6!9B;5+FWJu>>1FVE~W;4j&uG7S3=l zq8!+w{FH2ScKMbnYbohG95xcLhxgQkV1Y*A1|;t{|JK7M{6=LMW#cOB?!0wK+R zLcIlOIRpzZG3fD(vEF3mN&r?(RjtMV5`U}-yYwr9;k+wFP2zXFh`v&28C?ko+ym($ zV#v=6SNzKHW|^=Q6}XE0mftwOValD?C+VBIntd##W}KgDWWIhwvnG}!xj2VA`Q*(p zBXv5}2^dnnZVx2oY(9*B*VA&Lq!gb;b#mT>6!Sn~kW}EB@yR*3MH^_AY2jO)u%^lR z?wf;AN*94`vM6H*z=S7S%?su0qZ z#0}Y7XTYRLK>&i7ooOp2GqVuL_=%Gvn>B8Lhi>MzM4Pr%HVVKNsW-pGRIwPW=(7_| z>^4@$*n(y}F&}#PdG?5jSF55eP z4@jkSvFMJB@H}uxF9uI6Iq(x*k<5@FBUP2xHpQRfIluHeSV*~#Va199b?r2!#U|qR zzO`WYVS_PYFcA@juM%DTEoT20_K)ZKjUqfa?^RT1i1H3++zp`tz~fKYFkVALc~)*c zwUPMn1Ii8-Lbob%SKo(Ua6LZKmkYZ4R9a@4V16+OO za|^gmn5OsWknLkSt$evgjt^iB7Rlajy37xWQz>bZhpp=%veyWV{c;aMt41sxuoiA{z>`-+?euL^VsmN6ElT8RYk1v zS$rw5^o$#)j0oY2#ewTLdfj{R0d4!y?8Bp6mM%vgB-?djUxF<#IfO)=39%tfv##X< za6vA?RCO2yd0+TR=-SRAmG2nNfou(qE3OkU_s(yRs7)FGVn=G%D@tH}RZn%MolJ#a z5{nH>8gJDkPEXgv5QCUkgp3pKOA~wzi~=q?w}io@WZrW~o2|qLhg?V0eHSlb?J8`h z+|0Ha%V#wSr}j7fXki@3Fe~lEn^jVwJ+2rTZ#QU?bU;L2wjQFh>bbTeqjOl#5gspm9f!DBLSlA6y*HohH zXR0O&DOWm;t#qg37^xgG0rWL{L6LZ3snZp=9oUfyj$9YHxh$7Aef~oXMGSmQR=vnd#5bx+4~T%LP5pO_IDn#cbilzeI!#G+3Hy>-*xT50+aQ z*QqPWWSOkv_ruvvf|}9~&Yvd67$*nnj`d}wrKTU;tpd?Dd3oOxjNcp2W~Ej!2@J*< zx9nsyy0t{;rd5pU9;JFe`^#$)_`nrIG>Xs962I}$Srb6HIDy44+k<9jTR9L5FGU0- zBZpE%-at(}WIqADs#`-26T+79M!%}X1qG7Le}Ugv8-MqmrF_#9)|D?0ryt;%Y_ZgQ zBnsfWpb7~JBj(uAGtr`TRa$A{W0by*e9N!x66c9LiP{O3qOAtIWA{|MK)CmNO@aHq zA?vcV7})DFiBQUHg4f5Y7=AY9);j@&O~2yW<6SQ#2oy#+^TL}=8*QZ-!f#zw=UXYG zcIoEdjAJ%hz$aY^!f`5&=~ieKzo!_gREMC~2k6xM0Oewy1$Ql^7nN_TxEzF^l@{#u znd8Zs84`!`P14t+C&9d=kb@nXKK>g2ox#*RMlR+D{>J7Ie`oBhDB065t%bsGOP|Hl z4AGU)6A_m3MtOi|i7?RlYwMqx{2=mZun>LQ`}Dv)VPCJ{f_BP@0D(Qwuv#z?&%kbt zAocHc76_f|M*C_i#Hp}xD@#l@);lsu-xT|CRt-Dg-9UfH#XLoR_uEkmSst+iheA=M zYtqa0Ecv@RUqWTSJiOWDnHhs>-H{q!!1q5MnZ@G|6lF$exY!aC#~9lo&MUC?qa{VZOp;o{}27@XBXnNC-4r@v6P|N;J+t!yg|o0(x#I2*K0#< zqEQJeqp?+q#Ea~|zHGl=Z&(iWoZe?qI)4XnJ;0FF1r4w46g(sNA9$<(?;oGXjOY4e zu*G$AQjq-W6gFY&FPLd4v5&06Vvz(lS8&uf5*3EspxA`S5}AGgdjAA$2b#jwo;c<0 zxfXcoWGWdxfDun6bmNMlAo zIrhRo>D73v4)w|fPK8F)o=tc=g7@?mY3?E(Mr21vBm{dPgzS3h}BQWc?Qo87}r zaS3fWpo37b?b;dn@in0rs`2vyc&|DR%Jx+#y`PjSHO$A~ZUJs^4U^yn6v-xY0{WV1 z5Y@N2NLU7XooYL%RpIId+c)VK!V_^&QNVaiE!74QBAAvqjx*iCxHA8?I zhVclb8CF1~827hs0oCLCwT(>!fT)>XA9=90aE}QIb$szBL&Vd79GC`?NFS-#IX}-< z0j#ul3pA*1P*9XE5RgrSCmXM>HZrx5r#o`J%-I)GQf~q)N!}-$DYIA&_h!9G6y%16 zm=#sOl;X`&RnJ0T;H?5hWiiu)0~i5e4~*)z^0PAWkX+U+kBj9Ps)_8Q)irK)7WXs) z&5sO3DV1t_Y-W814s@QXZKq@}Ag!l0kuC(X*U?_~-Y6Q#kw#M#&-H8dKZ$VLye6#FZbLZwPou$;>(5nI4Gi`FThE4}$YA^jMW${s` z(!yfA^$O^U%Te)}5;|$?Wnlb6g{FbWmxXF^5K}(xT{zlnQ%Y{T?`j65{!YMCE~~%# zuD9i9+GOTolD^4?fBH!6+DVnIr&10`hf=m)9R(nCEQMZ0Ug;LM|Md}~l*~DjK7q}X zc<;1Jy8TeZnQTGENUb{14Q$uI6)%NpX?^MNcKM9pFsf(9sWjn5-1V7jNcrf zRu}$-U&FO-HM+KemGm8&kvK#7+&sgDKS3{T($g&{kMhI6*J zKFT?sIaqL&`{yN_N1*vz1M+5ePn(W}Rp20>D?`0`ix#4F#UTdd4>*Pc>AK^R(elcD5+6v2SOYWr&O%__k{G_JV-0DWFl3n{drZW5m zoPsQb#BL)mh+yP&0ikY%0XN0tkH2#Op>#-FjvL(tM4<7fG!YjFdn~jZ08D4RuBZ>| zUPI@oM6(JHan88r)JUUTwEF~XBP^gK0pUZ#x(zAjg78K^%< zAiDNBQ<)Fc$alCpftJX^j-M*oCG3oYrW)Wdsrx(Jcbc(F#ggP|LJ^fRt`QkFJqN(c zI@lt?RngjS@zzmE8)DEs2nH?Y-9Q6vM!>n8$Gn;7}1Do#Kvn5WgYRG42bzF)kvg3&V+Ccfz>up`s>Ksj|qqKuBtx`O`mZ& zKL_|ru9x%$VDGpehd2^9YV8Uv0D>#5F+`)vecS$s{4m6{$!UpIYIS3PQG1_aS%JC1EsJ?~z4x4U;hM#8 z;$gdETg9?I`+DUK0lz3zU?KTWzyiDKmA_q{@eF*nT?y;VGS_|))@4KbNsRVce#R%u z+`X*UkSpkGKD1(!?q_7r9fP4e7qz z78o63qoS99;*ChVdeIR5GM|NSHO{1_{S93og?ZkZUU#+o6IuGBUIb5!w`Bf-Ug&+( zwg{))3CV4}une1F(Y^&e%X@P`m0Lv7mubE=p*{A#X0=AZJ3IAIkC$-&P44Qd*({zg zi#_7vR#hwO(AfEu=b+m0eznVM?xyYMF?DHMhVmM>ea?(qs*9(p>WS37GO`y5eWG}c zp>))iobl+Dm6hPR6AoL@^OMiLFPihwde&mt{1Yxw2o?Q{ylUjH(n{|69DlSsqRZkS zT>RCm*MciGAT(E0jJQatTy#K?Z)2Mo1D?vY<^I~FsP!yRjc_Q9)_vn02cs4F9#4bG z9PN$c_0T4>SgUt?w&~XGkP;sr-%fDC+MaHSrK!>nvvN+?pX4Fj*MnbKWghp2{S2uVTs89hFZgd?0-r=4Ey$*f2ARUy05%Fx zvobZ1FWO11Itl->Ot-!`S2ey36a=iD$!@PtFo%OFuWyBMI4LSmTax*ddq_Q)!40Q5B-C}Q zbIeDY%Ad0KfTjNw?SiFUsn^6e7ZkGon@z9lqRX^*TXVi;dJif|BY8>ave0aKK-SuF z_D+5aKf9zCf4=4g+jCcx4oc!juD54O_Tu&9V9FP{_(gcjOPe&S*KQDoi?tqzrJGkm zYU%_QC}_`yc;z~k(9}VgOW20ks-e6}tyTRrix>O%MQ7!JotiHUqB`i*0`y_ygBEwK zpR)~4%=-5<&*24|r(i>Vz8o381A%S%hUqAn6Wy1(lD|UwG{cFJtH*Cgk zT{1J@78_0(W!)TbKjXT87<-DdQtPT4)qvhfOrn?yUf)`!$wa6ObiUlk)6{n95lr)} zK8h;xswgwj2GGWa%dDi!W?R{u&uL~aZ3fV^u>VSQ-_APH>(0>?549w@6u6cB46CcU zmAn)?e`p$2S%(-9soDm3Fd{9Av@?Xa64S&-`GMyOBg5q`4@eL3E}C`WH|Q&I?Ik`; zJnZ~NyoK-Rjl~j|=$h_5;l4t> z?MUllpVg7PwO^my>Ck&0v}ksQIA9Eu*BCAZ1haLCk7|S#0$jD~N(8sO7YycWZ>64n zJFFBe7hV*-n$e%XcDXZEPjsu+&|}qPp!S-O$F$f+rPj(x#i$Fvc-M-=l#AYO?@0gG zkfefdlQ#0nW$AjMr|&7tHc#Ho?S}*zzUbqr3SW{~B|pgOELkn_er(^hQSK%=Ym1ESidbM^x_zP;%EF@0|G&qDCINMflt0_qM64h4VQkv_=@_W9xT;XbavQ3 zfte7~3sH!3VA}DvG?_8Gvm53rq~_l+s0o+;z}b zY%uzA!2h*uFsnb4sONAEG7f3m@M5uu(au!*sc-@0T-ukbuARQbSohI z=~LL^bXp>dB9d^kr`|gE`?Wm>G}s|4joM`N3f6Q#fzrldYe6-ys%um&}aJ-j5 zn85jhEi>ZC!byRCgn zkq@8VDH2Ef?kt6cVLl&3{;Jt7*j{i)I5~nm7}!xp7c^m@XU)*9Ll4*zdff-R|~#IZ~Z2;Y{FCpQ>*Jm@=c1Ii^>W zHcw%^Qn5(h~k#&aPtGKB5cV->}ASB>ZE0S?O1 zR-CDv9&(@4@f>HY_FdWNsfo>}kQ4$Bg-On_IRvd}DNIVQqSfh=&A#SNlxrBShq+Up zEbOu5YIL4%CVcXPY4dqx;Z7=>(&zcABr@b~Z)v}=wAsTbLSE_0iyNv`S3ZcB?eUg> z;ME;k|5(bMXD>6hn!15y&SY!U;oRli_nh<+82@x?6qj1KV_GG&-E1!Ghh6 zM}K`y3^CuP)1HRwi%wOxpXl#<=|SsfLekMP-Yp-w1De&;L+afiUTa(}$6m(J)gi{8 zlr!H#@>!N*k3PkYW!wf<`P0ZU`mG4!A&-Ja29 z#rL0U74QJ#=hEN3qbl$mc7$7rSz`^4Y0^y>GnV>krYF5trv!Eh$9wOGYSVea?caM0 zhSkY@zFZI!6C&fO^9F2MS#q5zk)4G+De8;y6S6IbQPrxN=+vs^FL~^t+UvD^rcD}W z_{}FYn;cDw>mBzwx$WcY2Br$JS7LEmcOK4JmnGw&Q}FpQ8aeY61c!;8Zn&3dsHwU~Xwd%vG}Jt4Ux#99cGa+Lwk zsbSwhT`2TJcN}8aJ=?A#^;LqUbq$}@)@&MC%=l|vp#$?ZmZoi3)ha`3-i1MhLbLs8 zG9FdSeA7wr$wr}mIjptionlNO7(tAy(wlfgcyb`rM=}-!k}*=-ziXQjxQ+I&F5hO< zQtV~z_VgA(CSjP~qgvIOhQRaF4#!BoB|j!zgL{RW=12I#7Kr0=8uU+vyf${s1424C zJNA_N1rXw(C4E99=ql&#vX{?Fa5kN;)tVYNaleQ{poG4gclUBktVM zDoUp#!YARcZlIEX)-am4#hhxMA#|>_ASyL5x!9MfUq8TV?K3lj%D&uM`q6h|@s|z$CkB>a-?2 z-9}y0*F<;=RMdx)@_g-f$iEVz!zsSHKQS8+%v@`UgTC(iTjy$Qt6FVNtx`32B5=i`p0$ z{{+VcSGKOW{bZHqmdl=sLQ@$a>RQ?SkwLG-o)ZdncmV1$DcXJ3O|*|sy4{o@^|-B` zO4!Nw5vK~sB20)3JQ27jXEK)PJ1%Qc6I8kR>kCMYD^y=rV2gOo4m;z@tohF;yUW(_is1))Jh6oZiRqD zBSpECi&&CBpB-&OyMa}0Uf`sy=i#=TM9C%oE?~~MgI@)ZCLhp4K6fG*c%PpY+Ev#x z9>x@>Wdd$vE0_T`vpzRAogt!>YnD_>=3DY;*={(*iv+6)eRlyTlpBTzDuX zrZBf;y1*fzGsU^Q>qXZcFQom7aNhz_qe2^79>5}O%P@FmUG>Tr1_~Lz{<<9)h zlNVu}o!@K`HCupQb243#ZGsDj1t$>KCxf{gx`QypJwk^P?Lnf&R}UHHu84;sI3B+= z(X0i)fv=5rbVJ~ijP%-N2aRbdc#f6>Gt?2 z5>sCn(G*2K`q>w4UG3Srh{#s6{E{?~cia+5o)0QlK6D@!2kHgexfeM%n?5V7m6mdn zdzEU#i!YpY>a4VvCcGZDrOYe1i^0DIMV5hB9#;tGZ7<9ld|xbcK~? z41ZEHj;K7)Gyaz&!Qg^STuKkRzZ(N3gXH)Q1~~e=OL(mkw$iroJ+hwgZmJG{3TD?dCzdJDtk5p8J|cRL8k28UF`(Uf^fD_Z&r(%^C_xvB9j!K-i^aF>TIIEP0UGSHWs>xwec;)G@qtQ6oAj4y-7_y= zw^zP`W1?*OEu99a;tJ>b<%#!}To;1EB9-1ciH&8cRsIMM1-7M@u1LyT)0iO3v4Uct zNg|1_SHUM>bv)Ijhp_V7DK(v3FaB1?^yS-(o8}E4Y*_oorxiN&rr_82)+rXvxIx8} zj(cP>`)iLRcDImuOUBOEk}S!(QudUIW;CA*HLj_vmrUbImy+DzBpbLQ+UcDsmR6|E}Y6aiwui z_jdHwOtl>9i#K~o%RSANjfTc%6~%t4^`;LZ;%5n0Y2dvTT|_GmMls>Mtz^YB_xYr! z8iVV9Oe|HO0Yk0)HUkHDFy+@&yIJqPR;_@NI=BUCx&K`*@6~4CA+|+x1I(4`pfuXbtqM4U#y*G{q#rdtjgs`s z03At8nOVJ;<x|ig!jC=|&PD6102B-OW#yZ&&xs z$mN#PY`;NV8g~zjQu*SOJGuyU;r}2+WGU{5oz^{nB$WGz(4Tnh*e5;jP5{*&=k>Sv zdyYh7A&X@q>A0sPz3Sn1XTNAxU^uIGwIGRPODvAN7v8x`S5I-;Q_H9|&v5v~>X9ej zp5Ic-0ig+bej03(v$-dynlf95&ys*5bnnAH5JiBqs{2uEDIrQPof|2FbL;+e1hz`` z(Xb284M`aVw)jKdnpD$nznOGwyTq!Nunm`Zp@;NmP7lNxR_=3U6D~L|h!TgE_1$?U zue|>(fXed7m&w8>M{Fdi0{_l3 zKb~56sg^MyVFz0wC)*yKW|$@0rMO#R%D%^gqtfcYTkmnL2lfgHKTeQO(8N_?6dycm z3iVzjpAVyUa7Jt7w7^W39kRJwQ#2!03}&)BGGZ!fRL$EXw?jX&C)f8!^&-o0YSjI# zcbqvA5qBeC$mkmYW^&J<--_}VrsvtLdDyC(qmx#PQjL$PoAu5qwD%*e_!x3s54k}gu(SJtr|*3uNGIv#7xWYHfD-rVJUrvNIyjq4 z&1Uk49Mkaj9)D3Eu4n4~q{+@*R~Gbr?ZIo~`!AkSQ3P=E!w-(nRrFtF8w-h!)qXrz zn_j?}-1Gh>F_xEk9@^{5J6T@icu662q>VH-^5~QD@Zik#Cb8P?^AM#RnhNV}dBHO& z`jRB`VD_2);=6&!M;QfzE_h~2v$&s*>-kFrxuh9pQ!TaQJR~{2Ud;4PQ=zfPB2OD= zc?F2qtT1+T=9B&63^#!duTX?g7E?74#RqS)@#I6VIom#0PEnyWml`ZXzlB|Lv?`t$@{qfPKxc2H9R|eV{K$j=%VW+P6R$ zeE)CZbB$FVgHXOp^cMLl+mW{LNR0PbzWxlP53q-3UjwV*aLgl2C3TeqnB9BD#i?P% zIwhsJBFwr(^{+<@rWt+_{NlL+iG>ZBmc!$emV zyE`cyhO6C&w2Ne1AobU(9H7Kx&Cl;QK>V@Tf*O?wGwtGj15ls&dP zSW_ST@r>VaT?JwckRa}~1>)x20KaXo2C`hHO{Z?)!HDcQb$~e4dKySA79jn0YNlX- z12AH$<5KEZy>J5Bhr|Ss-7o{mtatrVfU|TG%2p8^A$({Jq^r(A?rW{|!{*W5+#^2W z{a-2e;}bp}6HkQqcT@5OYz`7fRU}WE6P;SA*n*)!Ii+f>f=aq2LBqbfPNouespL8Q zk2Qc0xljxw*UL>9jNO=f5nzCt8i=k_N?e{A9`X4x6_;RSmLKiGX>Vm%e|}%`tTiRy z<8+0i&?Cn}ct2*rxT%+6RwzM}nu=a#pR?&=v&n&hUbs%eJ@MCxo8(WDADF_?4a$XPZl z8+D^9U3zFvcO^7;8D4(l^~}?nC_-50M3bNMKLV;v&f*(m5>Z1n3+<-wIB}2|EHNK69KQZTZHoqch7TRKa~VeL>GxE~Kp{0F~~7O22LolqOrzng)+>pGVsPY#tEL zqd<_TocC1Lv)k{Kan)vzZMhGuV?qO3w0QAxo3we-A6Wp4A=UUoY41JvnG$Cy!|!9G_*g6Y^NFF*toYn< zA48qJi-z9bXp@+aQu5u(ud#AISi+}H&Bay=5{VxTj$DsUXZODKL3Y)a(j86vD`6ATq-oT ze9ObGmAqs%MzH5nhP^(UbfI>uq7Fvc3wz=$orTv zpkJaXZr694DoxmU>83fhJj#>5k;T$#)Sp6~f3W-&-_;X{Qn=~uH-_IYm^DBa0=eq> zIMpLedc^lIi9<)qu-{uO({o@)@K5a~4ZZ6GSZ^R*Sbbk6Y1U3;V}s_KoxBgWnSrl0 zLhnbC+Nf=~#C%d_WaCewfo-u{m8T5w7uC=}i;BiWpm8bRG_M1O3mGxxD1Z4*e$?CV z0chEeZe+cJ;f50n@3C-a$~IT3^j7>+61)?t?4=Vv8Y6lXr*}*U>5lU;U0szJ2)ECL z3;6Yj)?Qj@jvWAE+5v6dhqiu2pVX^#-{c2npmb05uVaH30-RG0d+;`*tWRTjRhtVN zh|3+9OplQTb76^vjp44?zEwZsgTw2L`%y(a<)@+y%NtuqwHrTt=IW?ZY%wCzN92C8 zoUWpb5O@M$LC738RCrgdI7txw;wd!Ij1N`yh;i-+I5iuq|XJtCTeWI(YOur zX~usse=tsIbBFy`=oz}@qb96w`^$QGASUJIL#^Q4&pl+Ns~pLn$dT8a984+%nmQI+ zU6XBK481PBEr3ZJPwoG)S|b4zu|M7KMS#JRbsV_TEcsOF%NO4d1bkivF@Mb^(`T0# z0NVESQEopdS>TZNwHzAgUuZ@ozEr3REue*lJ=>k~3B_hSeP`As7HVSkVON8VOq1Mg z>wDX#rWnMe;jil6_li?^j~AklmBy6E`;yA$@x*p*Z8T*Cb1M=Q9q!{)b^1N`nDGet z2TvXG&~bBKifR@K4s#_kIgv+CXxvg&lCAb)?xAq|j1Z1`2<62(hES%7>9&e`CwvQN zh96D?m~C>D1lgj{io1Zp)IOnIJ^rR9aU^rQZAZ$$-l^N#C5k+EEy>_(tSYsCFlST&IqOU20%*zYTDwZD+PMi>s zJ1Xh|e|HImGJFN&4JZa6<^4wcQ2c!$?Wd!2rr&uBX|U|UsSl-cmVRLuhY`;H>;uZY z6)-w>88X?^WS2o6d9oEnUv`rL;1J$k0fV=?Oc#S9Ni+RuNxQTday(iV=(4^NdIgN$ zzeY(#_=+|I^7g0F0}|ly6ohbpo2v*NnrI+e>6JXS1qPa~N?=+VEhBg0eNKvCSC!?% z5ZVpZ)kxp~zjH*%0XUN;4x>?TnX*BE%LUP=F}C8#JA{KxNPL@tL-+|u^it0SX{Dp# zR+M=9p}0?(d`6vto%>tW-h8h}2mcbObOuoH%=$4-Qn!5&uAyyXl(kq+D692YCbnBY zSzyMdf2cL&sU+0hx#DNsH0e%6V3q(UjRcXMwur+J5 zth04)BA`t%C}jF6w&6h`9yhp%@vtS#mhxVfXH1Q#DWw}!Di_4npg zJ?bQDs??eZNFI!Nq?&NcwvW~Ab@<&Q0)wxNWo`IZ;+0RqU=NG2CtJM6;o@6GpUSbY zwC+Vz&SB7iFo&7#3iq?*+B^9 z!^!$@ZLXsRm@NXRYrG`uPjZuAw}CxcpM%DjLriGe5l;7wgCQ8}SKeeZ5nEqAYiG~l z)xjA17`K~uC~`@P8k=_Ct&Ub`OpfmjCd(V9b<$c0eo)RMwBG1?tp7@N>rn#V#)Cs?(AglM&2EGb1*+1I^44K5r_t3XGZL=lmMg%eyVs!@qJL zx7}H0?Ns2cP1k7WSfIK*ny_RD3tJ3#`U%V^^+=UOQ9%$eMX!HQuWm}{!p>Fo>U_h{ z285ru*NgR3k2$@s`qks$^USb!V)PhD?pS4*guaet6`%yaW=Q=CVwuOfcQyPq%Z{kb zXQaNox7m}m!Zph`H9$h?59Gx+mApWf%7#fSb_Y-glNW|Jn3w@KzgoQ%P=cBtgW)te zXpreS`n{Cc^9QA#W5ah{zB4dx$HWQ@!@}pd2HZ@lA=!~OWb%r|-!L4a*tJZ!ike9# zJ`+XSNiTf}$-VwW62~X<7@D7z{aH%n0K_{=h9Q|>m)GEON98&WzFQ!TGMdL-5dO`d zXnDf9i~At&(+Txw+vDuDm`R3c{{c!d+^rR30p0wE?L971PQRgrs6)8YfG%5?{o8!k zH{=svRpB^{HphZ&(ipi!7FQ-ib`aCp{&>Q~3!T#>hQ#Xv}rbN%Jp>$*!3?~e8sgCQO z>hO3>25nb9&jbOr(7WBVeeL{jjv6--zlwBkIEi>G`W)fS72hd!{1wp-I>e&S#tRaK z&sujMF}IqvndC}DrVGnN^B3GRX=!n5T-i3qo#lQS&czhK0mhL2_QZzW!vc1r)1{fD zV_j_{?Wvn~t||A3j!N%p)Nwp<{!=$H%=xRX#T%d4529;uHWW$dbNc8kS}yIp3S(g> zS|!h-8u!aNMpefjXc_jqsS?0X+`32YqwpYy-93=3A=nE>ERu{NH>U)sP-ZZQ!Mi}%fRhRusQcm$I%WiiBle={_ z33Bo4IcpYaab9U@^f2}>sv?R(?nDyIu7_NNXiMa`(@~tKguKK#m2WYxnleved8jr5 zfwuX=n??0sH-8aXSvkFzIv6;n48tGo17EC8#@ijKOV_OVbjL@1apu`XuTA2;$UbAVgiw^>Ec(Nz)mmGt#n)MlULP*fZ)OWF9PTyFK4_|DwpgC#`O1 z3qdnQ2*rq~TU*vxl@H&Vm@5Y7LtD<`0*9>90Ig4V^GR~9kV#xmuY0Au&b2tc`$o@JqA}&$ zhg)GwS8XuVe|zL1O(GeB`6)zEs*2Z!HGfbxpF|LXZqpQJ zG~h#L{nKLx%+(D@8`~}{+olnq@^I`LBW3E#Zue{?CaZSM*n`pb9$fRgyY4@yW{$`w zuR|(NT%S@ul4~b)dCJ217>#dbG4eQL)VC!5Q4$(xI6b!}e#4PsniQq*l|2e!P-c2Q z8gTc{i#GwWZyl1+r?RN(q2zA)iB*w?O(JkIi}b#FuRSxA%S_onT1_TV#_m0Q1!`2FXy=!7E3a@Y>5lpK?L+8A|0Aq zzZ0JL?4DLIdIL3Qa9RE;xMzni>S;YS;&oEU)Pv*EGbvhJv?CId#;^i_y9|-{Xb*=Z~3x@SYJf!yZ2ocY$%aCb!;im4(+U%ZV9lq$Wch<>Irxy5*jzq zx*T!zJo}Pl)EBJ9pZ5#d*a&d6(EKlix+$^R^oGu$i|_bLKE5+S3YVM|^wb+8Hn^@k z9l?U$l>bIoVGoJrv;e>7vrv&q1pM%59-BP!#037ZNu6Db7Nr z-URL**#icVUMPQ20x!S?C7+SJ&OZ6H({ruLNb!4OsLg7AmLbqM^%0~cSh5i#F)alxekBYvE`I#MAkTc_bhsZn z8{5B5)5D;n(1&A&8=`j)Feyq_rVMt(-Xp_%{Jyy6m z$Ej5woG^ct@*kT}W`|mes-FYsFN_#S8I-W;kLzPq4Bl@wvM_SE}*=H+*V* zbcBwPvdEHN&xS|ATRaDs*81(_T+Ju7>l_Ad$fr^W8ypR%m|*Hch1IzwK7h?YUnDYU zV=!Wq5p(&{_8SdT3&dgDL(uEl=I41>v^iq!FY>$n9$5~ra!b04T)`izx$JUvhlEWo zwT=cDDt84IYpbdhXS*MvnBHo~H(z%|+k_E?@mhw`9yO4OW(Ic_oxG^^;ibZ=Eu<1r zFYCxj>%_4gV&>eP1GIEu#3&a0m~umCq@2Rd4hg`|qMg=8O5$?T&WPb3F1WjdL-#iT zZFAbWE|lKFb&>Nm_pYcx_SfC>{*8?bv@)OXeJ6ao1qfwn!XlI9w24a;_SJ%RyRenXorXf3aewoB&Rr4M;Cn#kh0CYI zrmzCMLA73&8UlnToRJ&v3m-J9mw_xgzZ}lmTLYW`xYmZ^(w7b=29ixt@G_|K@4D9M zgq$>QHpR;$D*@JjUKj0zgEAk-e2~(4?!k+N+Yr#4KXg)44a|8UG=C7xVG3BPzL)UIim%W^$+Ezz z=f2ys^WxM-R1&L)ERhb^`e}aSn4I`5GB<|}roqG-t9%`w+QS`Ku97haQlor4=t2mb zTP`GVL4wvl%$&DgxuV)eqApa~u+8honA$X)6$U-~{E~WNL8QANSV)O-Mgb&$&y?3; zeqd+SSc|pqQ$s?tl~qBE)Q>&gJ>_SX1Lih=ED(Cl<&4f;JpDEdPEmYOCfck!Q#RL< zbc(Ni=AF-CMAfU!RMoOpmHrmYEAe-i5^RyVl)vpLjlT?(d^E@}RR33d8X6MdIuv@z zT;fx?Y)|7?Zcy4k?Igd?>OjRt;@>ZI49AP3(XO zYwXR$Kn6H0{g*o#`iSb#L{W8;*J?Be&)!+ZLawLkJrz9BT@!jA6PMOQT{V^zOXX2S zTR(=~lHM1L5@CZ#w1=OBo$&KpAW_uvwmjMOvxg zVn6eIZ49cQQkc04E<$=sk{CS+Q<8qp-1`>Ut7{NilI;FJmVq^7l&GI?LgGig5K@ zLz;o!j>p`$h`ftCbCH58+;4K`dcq>s#4KCBfi?7?m|7{{_Zs)l@Di_bp=*df#hokZJG#-OT|+sOuLu}nZ}5SL+cWpRnl%}6LDbB~@#yT= zecPK1lVyp>)(oLfeoZj@J$S92arV4>)fxlcqUl|iZCr%YL=?md)XY@ewa0Tfk?LBHMZd8<*B6Uxcd?D>;lLI=#zA z+1QRmItpHjtn7yw9=^#BVu>*llYaCboXg0wHzo?OoVk;5 zP5IWuBD}WC?)446!{zYV^%Q0!v9;ZYy+eoGJ7v10( zj!36lBI>D@kpyF(FUkQDs3#-GSSPqpe09vjsR zZKn()d#-09`?K$-gC9-B-p{^Yt~CEu8BzyQ;0A7gCC?oHD;r~@0}<({tlaLUG&o}^ zel;Ga`gGjz*}pa-mw(oi|0pZd+c7K!h*eB^jA}Wax{&vm2GX}uh6vRs{j+=V-%X5v zd*FF$$U`D!OB8I=rpS-k?N0d5Px0R$=6@bcgPyA|ooqiPobCC~H~r6NzwjS_CEvl1 z9q9pz-2bk1|F4HYg|NRlLs@<@x&{7kZ`Mxu|6k|-e?R~4t)KSbcQ|!Rb9noI8l=)c zPMB>!{+|u@zuO)EdU#nzKrYau?$hL9>o|wC&n(?PiB`vNACm7ECb`R4`9d?sdFotK zK`(XtEBH3PyhWeY8Ia5^&fDA`Ld6yC{tNKtu3an#5*-wsEUaf?qXL>Y*$qwKY3t zmD~I}XC(GgM&#pfjcHrXGcrhFXw-x&w^~cziyIEtn2;^2eiJ1lC^y?^WwiN<)pqZ7 zYeNq~Zv~h2uKTzfwS(WtaovgNz430%(FR1;eU+p*rXPgOy_(TNX6KM%p_Cf;ulo(~ zJv_%qRw4CyR(h+UVe4B!npwp!wKh_&r#q?_Bk}~CuAi5L7-Fz$vbstwKGW0q+T!O) zKiybBNI9xvLm~cxx9>;yj*a7wCO+9}%CJ}3VQKTMd|{90s>yU%~!0U zd;wsa`l^?MutNciZV{X3&>ui%Jq8HD{N?9XL0yiOUWnQ?x3GCvwX+QIL$bo_{6MkL z>oMaUHxULOeUvqsP%N3y`fRiMz{gIP%Lzd=Rvwi33K}@fxo1xQ$1Lwq&*;D3CCCHc zwCIh5Gp+gXxXisVJ)UW{?~LGYMdMzHO^YLI!LZ z>U+xJ#V~6BrGL9?2j1D4SmwVx{h9xAA7*Fvi`=Wmu==N|?MKYChQBMhYddT6)UYQ< zQX0cPfE=M24A8lb_iCWB{Xe+ezWRBI7ez{7Mo(z>it)8rj^}=eUjj0{01m0eA>Dzs^Dcs-^uG0_CIwu5{b>j z19D*2c(-4(McIhYlMY}OB75%Cg?VQ-oP8EwX@CE31jL-!pdyHSG((5s1|irniUQkg zBS1?dNP~I`A!UW`<3&5Enu3T(Aqq|*Xx6Xz_!XY1xu_}5TqY)k&UBoZYQsI6&ZSO} zD%mX%pdqCxzR_^@(qk$lzi>l*+sny3MLq2yGpmls`?t?hMd~vM&XIv>Aetr!K#~{; z0#3_L0Ej~Uz`DDAh&TjJht^pk58a+-AaKy$?gQXPEZKh1w4Qj_#~5czu2>oX_%t%l z0g|WcnpO^ulL+~ZM6WlWF~jc?^7Od$2xhDr`R~BItc~qU@}#C7 z^vG1mY=?ngvDLx+cKcg~EC_i=g_rjP+DwX3`dEY6>y%<(uW?z^X7SlgQus;GRF+2I z*X(4FbOLE)VY~bYI7c16Kfvqj_Vq;o;zi3ON$q!F68WMTm{_j>NOi2~&`AtZ)-cm6$!&35WF-UtSsM7$p19ET%@Jw)m~$tdmOEbKx>Tf&kAAedz+PMqKq@r^M7 z5ykBj1#F4?qL2Iuu$~_qE3F&8S?xauDLPM6P_iD!@xIR8Sr1EO3O{@N>eRj8fW+X? zL6pOb`-NAOXgSR6mhG~BOKE`7S@=vCwIk{M(?g0H4l`va2cfB9&~?c&lHRO2?pQG3 zC+%vBU^kqzGSjVSf4nw!@avGWlyd@=K~t0}33Ca>Ap6x32dO>;7ZJruYgLIl zAWZP_JY5pPncXUkR&jzg4VZ+X+SLxE_EWmw%j`({=%B1wQhDr|>*ZNtBlpg}YgA?c zRa0kU1mKlaZ5i5dg{l)(0%!v>0C$85c+hPGfv^c}R1MG!2?OK;Jk0>3&kPvjW9u5Z zr#P7b5LLfdyCEQb`G%r>KqF)Zu<3sE`~q}zWB?*HOSnK`CA6?kXIGS}N9ELV=lX3B zRUEc)0aV(qtQ${oM=n;GXQolS!>CguvD0Q5U9)2^#_xsE_J(9md~X0{;Jyl*RI+WJ zkbUJ$LZz3-MgfSwb0B6-s zq{L4W7%msrk7qf3V}}Bv1#^oik9y!+inG@FfUHh==^W(;jp8N?%vs*cp6O?q&SZ&qTQ%;;G+@@GmN;)RQ2iGT6*=7N;Su;no0~ zNC^LPLKfS;OZ;e$>`Jm8!#scBvB%tKD3{DJ#d1Z-<)kGdrSTIW+iJ&sV$Z`jfRAiJ zJhvWYST9}e$R3h4oPP^QO z@g^hhH`KyZ?(w|uSz34pOrlU$EnHopVYke0+9fUZ zL*3lTt4um{F(+Xu7^E_aWILvTtFo*e-0qsMoJe6#G#HgMmV_~FUzFCHax&QCOa%}3 z17qFElC;-z8QPfFS*M!iSB;s}EykHf@$PZh_B9^|grhaHJv$pdS@SNPZUcmioQFO~ zJ!C&tw*b8>Sb4_2t`mSPQV3G+1AmbGaob=3jj6{K2?=fm)~ne=Ml4v1-gE7HxD1tDo`I!-*7I0`cNRPx-BDA_*F6kDQ}_?;=uZLtBoUNz1CHyMBE_wdi|+PE#x}p zxz{3F_XnRGwv2v!PC2l?=cYEIfuAsXC{ptZExDomA{A%KoITV5yzrDO@#kDwH^rPJ zXmCR9*STEsy){}|5jT#&A~W&W z@PyA?eDCHdx7#0UE~xSBEeNgDjaMbuNC)mKGLgb{KgLER>hK0Gj?|eGlrxj}(hYm@ za7nb(dErh`R$A$8Zc4W?On>yKcT-avn9SVq!8(o|ikXzN)#NrSc+b8;dLkbUW>cyL z^*>h1%P*Er2uYa~uuO@5ye6&jS4813dD(Ar6m3cOO2~+v&-v=sA|}na3BDU?xc1LWBPxlwlsAq^9B&n-n^vD^_=K?2ul?*<()s(5*o8 zykQG;2U%yrlCG!6qh`jYpk^X_+gBsQ!xU9fUA^9>h+GY~!GE3GU#rx_zkxoIZ#Nk) z&Y28BoAOm4(T*^;U1nuy9}NkET;^Zc?Jr_IF-h@JxKuAGH^-KVP#6FG_`J?(WjXtJ z7eqiyc18q-@_xYMYR6IJ#YVt*Q-?1-9Sce-K%rAW1Mce>9;A4^rQKt8u){ z^j-7Z3eBfRI5^DGY-Vopp@b!F!m=vOQ+BcR8D2jB)MX&PLWQm78F%&)IB!+-{J8=jb7UAK>_o$27lYtX27Dm-+m;-DF)+kpSk%ww#3R?Iozd8I&-V>YfD zG#ysV-Mi|3uu@-2Ph7?|O>OW3z~!}%_WxU9`$)>vbJOZ$uctIcAn((t+}=rEuT0I3 zUq2$N6F>KEbh=4p#8*D|s>W5?bcku|7wb!A=grW{W6$|cW5R;?Li^UDPedgT96RYC zWY?F<%?y6!=@XkMyXeGW#?u~zWnS6$c(LBtgr=*G{pDV* z;Lsl3xJy&}Y~2plq~v$WMiB6Fn9S0bnx4%;^O*N=u&0Wv^+qp(RmwhtVJ5~w+Lhj< z&fI}~AVT!DzNWw!czvQ~Y%@xEry{tjTb`o&&fes?JDY=Evd!$q>r@OcZy;FpbQ%D- zle_>jf5eb5+6{HWe8>Q2TI4FKUzxn<_Wn}mTRJo>AupyDN!Rs*L`qOUlq4g0J zL8KzF#WkBPHg=aS|FB0UK;-bOD7*7O|yLW^3X-8?3ZwLWb{YY}5t0(J|-oxepCHpslSM%4A(bSWpVPD`8{<^c`vnH=kq z+h8Y(x|iUzZpB8g+GfFw&yGCTfqx_5A*&CZaI;Ui{A2vVaoqnl4sv-KnHpyy8B%Eq zzH`AErn;PpEM*aJ-vp~>!{z_3wzlPBt0?uc;$bjIpPG{-c~fRZl*$_+qjK_0&lFE# z!OJp+b#pU4&w{}H-3U-J<4JarClj8 z<@5(y)zRJW0;E?<6_#KFnJQdTmfw}=^PdyTNIBSe@oTEJSGa~0r8Kl%$WDwF)wG1k z@MH0pp|7btaM5M~Tv;a&A(r17a!B(E5SxYpfWgK;Fu37bg++XF+1Z(y;pyahL8)d1 z@6l+H$&lheg(8+hP$#Q)dN{Auug}40zYx#xl(ISIS7lb!uIaqgkB3fizdN=)|4n3X z2zIn_?+>d~?yr|Cux@)gtKY!LH_Cp-BU6Nw@i>anl7&28X^`hSkp}&YWl8vfA6KjE zH%%h9-h-YX6h6w4H{j_;cUS&Kxjxs9A{c*w0|dQ*VO`LYZOAyp6yX#!zQTU80W9-M z8WA&n>$xxS!WCcJwHfUzvGekV+qOq58E59kcQ%x!;pvR|}4{gft6@khL$PKIJY z$gSN-$|EIz*#u_>(g+79<%mO4M$J(rsuKxD$p<%|A&o~>!sZq9U#uFxM!c0Ld=9_MWiWA_!T@wUf%RT`^P@<0O~D)8HCWE7My< zd6sc*G6niUwu}r(gOCs*Z^+8cHFKd=XHA+OUhKS${fEtgu5sM5nkB+{6>&g=tU(cw z-9ld1lRM8nBpByA4v|WQM$-NBmKiuB@HoRt-TBR{7x8G1t%uBi6yQZ9scFn?3`lB` zbwRo@;MJ?&TCS=YioH&UB(gxBgwD=1=1thkQO~<&98Rjp#(Pzfp+o zmlVj7*=}l%aKzTBtirl8M|JQ)X*mULJeP?T$3b8&*+qIh;vmO)>bmJ%JN0M4j z-K2CAb5i^~V2MpVax7#r@bi2!KPP*z&-BMSwYewg(GysX<&~p5F22WsQ&(!^BLPdT57z zZsyeQXmjPtLvRaQVzT;dK1rQPfdFq*s%p{kJsW3csrxbSt_Zjl8b!ssvuXla4*0@Z zfFJK2^ghbF7;jZ3VqTPEg>m0?`LBK@OEp0LvY_1{J>7>9wpUKAdWBj24w|M|op6U9 zR`(58HTm&WabO{H8}EQl4rL?di=Cw*FzN1Ls^ES}--}eS9c9Dh*>5rG$$IQRl5@Ch z7=8UZo&!~xC@F(b|0+X6<`&B+23v>m)!b%a7XsNy{51vL*GmjQOg<{!2bAaJcmS^` zX7mWa7UBVC47<-U{)eCFaDd2+PBs(ikf9c?SQ7)1L5O3NrgMsVrlJYyVy58?Y*YcN zkeyq0thM!5w0plC*OwDvJi&4<% z*g^l-Fe?2mp)C#`-p+@;A-7R%s>(Je=bq%V=Bv{LZo>^$^%kB3hB|PqYe9txzD0tt zn4N0B4}ZTw>q1h_dN~H9GkjI*_WP*;OZ`yx^9ucp@Lkq+rTVL6>%moh&_ax^%mGr# zA_e{P!e>xKitG%NUb*BxZo~w*M(|hW3^|c0bGPIP0I|dYe09Ib1y9q1W%%crNKa75y_@|VU&MtM$3cb8Wk6=kd6i6?So7jc!Rtho7EF5v5&s<|<5 zyztx<8>H=e4Wi{_RQ$_7f^_A}FZiJb=FU<&PynAPSpuP1M#~OCeyq+>#1&ixrXbcc z0+V5I_PbO4yldkKUK|TVPbVJ?OU=S@zYaDU^7vZi-@d3mj8k2nR|!h`3u^%}}rltf#j+a5HRl5_1HUDJe8NcnVd>!9tjgZXyypAIb$>R;l=e@z4a zG16))C?PUAd%zZT_5J~PdOG>yRh`LaPs2PlZ>$$ z>{3j;aQxQ?`_GYGdLV&I55Y)0@x5r$QIn2PSGQite{@U!^X;uL8aF@VP_+I2FQxRq z4H^IWbL}{>z~s;R5Ph%5?SC2WJd*p2^GFvbg?{bNKR2-d89_ei=KgEW*+J;iGlp~b zcZ=sgU;4kqp#T0XnSMDkpV#uH^?x6J@(BXN%FGVBYO>LPzVv^71Hdz&LcA&`_wJ%v zBsgwEL`NNLO}_sLjU_pfqPtS}+!9&ROKzTS2@DLZ23B7f&H>t{o&_CMicG>DXI1n23qY-2 z)do29{In>)zny!?UuiyyajrG+|L~N9@L~0Ju>wk_!|8_BI^IP~oV_|a3Z;x~WYpEi zwX>SMTd?C`9w0&7KmW4U(003j2&fOdrf$orOm25{yFRvE|14*#>x>ToIuF>ty+(ax zyXn+Wa+Ux~A@Z-$hRA_ViQ8>8^xiyxw20uiEW(Z&PKoT@dw`!hBBO`3Zy&s1MR@g)w{<+DQdV9mDbzB#o|~Dt^IHNU zFk^+{0(9KBT-WFoe%3+3&b^a*))~dG<{sQ)&UXR*__03=dV34NkFO-i(P9Gf|F`MF?)HMf zN#{Cu)RV{3)f-T|X(4_W)0J5o5?;)--PKhGl$wNr^lj-K2LauPHv|aiQxqDP8>9Om zWpXu<)~RFQsGY$y4Z7b7xRcvx17hGiaRnAWuf_3DtD(5!$}N=7%WK^`9}Yj&K=*Vy zLfCHYaCI5L6yrzB$Y_D?=9ljH53etf65=mzH4?xJRHNc!$FNM!lo%A--xNtpXJ0>} z&Am@C{}p9&V{T<2Aanzv3q&+&`r%o`p&TT5auG8WWJu%pYI-4Wv?VlCzRpzp$3~rM zYjeZAQ``|nd4Th-F2Dqc!s*A~S1DBZUfR~F)5eBdx96vMieA`GhI8Bz(FC16j zc;u@teY+{prXds56GP)g^|nV=;c(aFUKrF;wF00{oN*ULG$1zDe!N z>i_Y+j?8%lpiBzfV?QfAl5tA>Z4Wtavvvl4#B5p@zA^?1`z^;`?6SKFT0A)Z92fJwdb0}v}Fa~ zJ=%NH&&aRKK~-UGm+rau_VAF- z5o7tzhBgI5xUdeG(-*(MNDDY&_h6?c%gK z;JS~Sd|CEoAJ|gbGU*7zStF}nWjFUgg;ntHfox0lE~~fsUi}5~UW{}SoDC`P9kwUd z1}uhG*MK;ikHKU;ULeO&ue-kglN%~ArI*kFeHb5hp?7zz!yUtzQi5xev0R^!;~5&G zmCf(@=CBQb_Rk>>l_z!jRc1j3&~XrM@o})g4Hy@}I65{qh5;=~bjTJ)bSWh#a%3IV zF}|mCqOP&37dG=!=hq{z?MdWFsVY~6&}t)%cY@Pz>VRxm;~rdJpycg62Z-e911yx* zJqN%oLP1}kL-Uzb3~`bXs4)|7c_jd_8WlHJ3|N}g^6X?o4s5+W!!yc`33?n2lDn?} z6 zB={aUQ)Sd!jnvrL)|h)`PItB4Y;aSiZ7GPt566XdgMD)DGFsmnzmM+Y%WBJslku3) zsnfnHMF_u>^GK@PlW$_9>vpq()r+ee57>$^M1Qk(R|MT@fcvUcbMm1ww-~qNm;IJ< z8;k+HzH{LzA>!&V_ledZ|F__{Nte|KEBJB#PyKH<2}hr78Hk0;hkn06NnhW*Z+e24XSLX9g|72%aEeTMP7UFIg*#DByspv!Y*m&y~f=BYR}n zK6+g0T#7eu*jTO_&%$3qwNy|zZ1KhU239$j&8kyBE9wm3(4m0qP1~z04?e&Ct1d6R zpVkLx`XYN}G+gYBY7t;WAHx;(w!uEFAG+s&$NGo8;#?xyt{1K#QHU_vWdL8$)mVo?)EQrk>@!x4RQHHGROc== zyW2Q*t^EQ1634>sl#OR{r4=TpK|`MsIgLZx<*+lyNHk;eTjQZ$XTWY#v@%@^Hx5cq zN?YMEB9)ql*2G|0CcSzAHM5AM7hWji{p-krK4{t8ynNddTUwvME2`oT;>i(U;wb+E z!Lh~$%>8@~JyYMgGF5Tqj@r+FSwh*-GB*74U!s(Brw<~@uI>2r=7*^Cx%R(E5SYC9 zPlF`v(nU201iP8OP?^s-{R7`gF;M>Kls zzwhtVP9CwY7XEredmL8PZ;cfX>?5Tx9t~NRFGy;)=*_H3&cjfMavwkDM#pQx zE16eQ$sCa;>bA$ zEG&6tt2&%ofoG6GMwahpy>B>EGp@3|LW_W8nI2MXkP)~X#)azqTM*bf&ZB?P;fd_M zto%47mL%p;^qb*ss>pe(FX(w*tf0&%-m}blOly?K8*jL}wjl*ZN4Pi<(JsS=Nr(?D z;F)gt5ev7&oi`YPoU`XfY;ACUlQp9k&-(CalmW~9k+fki?+#%U=!(4J9T1o2LxMdq zQ^sd?i!neP-u&P(%}I7sF|pXFK3WHYx$XIc7>w_P#_``q_ou$_DWa=OdyKmFFb1i% zVbY4aZDMC$^yAo$XP@7hkYQ9=LU##(<(+g!$(8(PdET_W3lt03d^{dD8Of@2U&PKr2DV~ zNSkykm2ydIbSE5=e+8~oHqgM_efUxvKX*HYiQ}C{>4;XptVkZm8f+s*ljQO5Zx4Gw zZ_OV0uAKQAE!JO~`^^jVFWe}vo()#bT-F`23(s|CHd%P!*+=H5@9``|9S<#5loLR&RCBFvYx>`9$zPthjm<7dg!;h5vka{q^g0Ityg&q6+KA6M-`HkGz^rdD zoW$IhP(tw={~*;i%7X;%cOF}-*x}V#|uwR!jP>oo|Kl%k|Je(eaH|x02p!vg}ZEk*5 zE3er6`Q_5&JacK0ve#W{uN<5uiIC@!)*p?)RU#3id_eIy_n-A~%CqHoIyndWk8_0pcK(h2v`-n{vz1L0ylS ziI{IH_o@^x088_!P|`E#a8PZu-1x1qdkKt=r-uNWdu@0&$?v=`lTHczm8MK-2osuU z`DfqO@udhqgd7PG`QEn!yX#;1jOm3;N;sfeb; z6h3}yUG~subjMnGo@DJ*wUo;OBV;dV$3>&53Eh~-(BhW+y-6xtXym3M+g{mdw}o$s z)2ul{HRlWEWDio$425uedJNonf3O?;5XDC$Tf!T->et@Nh?bV|DPBeRHq@_jWWB8X4)=06Pu%oKP zpR37dqaa$5)H6o7D}HP9-^<1LYeL-3^ssD^L@3LZKyWt;K zOB>#S_8DruOn)%7(m;NY8r_@*m&aLpNiuz#GyRDM{}ttQ3@iz}q=8(;wO;$E3&xmQ zc@?`E8O|NjZ|N*e5L-fj^MnHM&?8=sxa#**8Ds+Sq@TdlvVxMyA&&8Z>Us*u&v)qI zjHyCqbG3HfOP1~M95(Y#K*d8Nom6>8ZfP2E0ROEsQhvdkF=N`L`fQ;5S7B$7B&j)T zPVyBbL80kDqkF9hhplje>}Py`{h~E@VM6n5hPvwKnlm&USZvQua7yXktWu6AFgvY; z%D5&WkYrEr#4dSNK>-=3C9Zo+EZ;xuJi@>6{i*QG@NAbU>hx>dLNKxCwk_B|EK}-Z z#(K1^+C&+8MG|kdo#A%d6g{QtCOyUJ6NJRs)Vn#_Cb^~vR+evuI*DwC>K`h&5o*4x z#CC=n=Fu+oBYdOcAEVf!2*i5u$;da#{-HNQyip$X0GbtC4wS0xe3EE>_}G;jW1#wT+dezc`WInGk)oGg$&=V9qkjz&h? z69hXH7hspTBe3G7u?48sYgi=J^G!-i_@UEzMKo*YL}y8`KW>(KTCE zsd};}{r5=`<~w;6BeRKW5-ne4IufmAej-cBNT>{c#SILM7~+OyTQyE^2dI2OG!fyw zIa+EzNeM}rR@3mcLqKv~E>cJJe$ZHarU$Vs+-`~~E_}=@u#?QiKbpj)@YcBgsaHb9 z8oug9#>sTPv1Oc?n^!-Ku82_PJ^3JYUF;1Aoz6`!a)r_%>aZYy2RH1yD`!EU5hbP+TJ4M-SgxG$ME0Xfg(-xu#}D{SMp$ zUoSMYo>e~Q4ydIw11FMYl`Tp8vhg0g6F3yJJV_{MMvroe-4f$C17faWL6eVLw*%U^ci`y6*qApBA7*$j* ztdY#(Qi$_a~VIF53qUd=z(Pg#%Ix}hZU+%1!ds%DHw{23)?HyA z6cxVe|hcuPXITm8nes}{tg?M9_ z?&H|RGHyf+-(imyBOlHiyHvk2^A&0hf;sfhFDx3U39{iem|x0&T|PA%Ms=xN1`Xjq(pehn7_LaCw|y(A z5L@#1Hgo|i6$L|CgSP8ffNU)0+EUu84(-!k(vRJnRa_kenuGL41iUm~ogGr0pFwOQ zQC__~>7Zx+xuBphXE$^VmcO^mH`<&dDH5~g4nh*dpea3l<^v`i8?eG`s$Y1o6w@V5 zfQ_+gqj1CZi#bU}n0isx8grO7>Gi7)uYyNJbh&-~UgCb@DiU9ZPeeDYmr0UTX-tos z^VAOl5pGGvP$;{S&9u6x?p(xC zKhlQ!OwpdXKGB#68I7&PzJbokFS@9ecl>`EL^0n$2Nhu$BC?{r+wxGqp(d(8Utn$-_=HRH3r~OXS;q`x zt{eI;d-7e?z=W7&2jhN zjUgFQ>e-+q0r6)DCPlEjH}pM91C(n=Yo044DXZbn9>stv*0e&EZkcwHJ$pXb<%_Z0 zJ#*mN9Z>~-D!WkQ(n_LTzZ8EPaa{8DB)+FnxM>7Qy5ADoh4h?D*s|Y_U`q1(DFR)g z?x0;n`JhfXP+YV=`zw!Dpi$R?#M}($PJ>KxpJtuyL=Ts`XJYog0d3Q4ghiEm&^P-= z2DURv;Ug`6uO~&v1~fy18qD9*X=6QEYB?z^H5U&%@1qF4HZB?QO)v+Rw)7VTzewOJ zjcP1r+Z*mY_YV%2qbgjg_K1i>I~Xir$g1U1EY`T}Yp?J*iAb*$;Y}E;^0lN;7uNt4 ziRnU>6hW_GRq*mFYKN%fXVBn#y7>ku`E-I2=(pbZhpOu0t#FA)zL@0w>%3ea zxoJiJ6Tm2`4n?~-jap)PzvTG-#pg9p~@k6HH3&J^vUFW+Or^F;q=2ACC+2;;P#0Q zF);L8e$w@IKRgeMDo&Yy^KCG4li2;r<|6qlkVOi`!(SgiazuFB`(a3eql2~u_ECjDkKyiVo3<{e=3*eHqH%xZqyBfMc-aH)`$=eorzWI!$ zg2tjzzZp?DeEs^#B`YYw(Nq5hl2evA>^WOQ%$W!T|G8Uo@8-oc3~NN~JaH|*N+@^5 zUsC9$f({|$#XcEt&9DTZG)Nwu%YWD_%#$;YGGYGS!`_wS;&ZUhZ&{xFadCXpF(2+8970M%wIHqcVY6u~Bxc$~ph_UqWd@S_*)QpB(Qiclne-(4 zUlo`oe+e<*ANP_yvDWumtt6XPo=|^>9qpUl?>#*KuC{Z6FuDxGwsM?daQ)@a--0Z% zRc{L*IbVp%=-h)EvLW~xW#-!cm(?67c;>3(BliVm+>>pemd#3bX9^yhUghspozyAk zz4Hnb%HI^qU3qe>sj&7FOd7gt3P+AZ#oEqXn|IxmJ#sk>M31Uorh1QaflwFgTu)l3 zDR%x3Uw<7JWxF-*!v+Wl0ulpAgLH>pi-mFk8hs69*XBM2k^O#@c@~IgM%Zh}0j4M*1x}I^ygR=_NMf=rJJWr{a zNy}b#ikDf2ykQpV6eS+4l{M;v|X z_p7AxMj9YChP8lyjut~;PhIWZb-1ksALk11A&d55VGFgnC>MzvY%OxE;)BW*zb?Sd zL?RuR(M~!j=4$M=KMXq|Bt9$CkMC%(_v~9A4!>|tvp9X$XHz^hKt)a5>85b%ac%!~ zYb=ORbdy`ObLe^sS6-fP>mjqiYL4OLPO9@eoqEHo$b)uafBDopZ+vht=Z|wub?kh% zCUy*UGx1WmJ;#V9;JNtybTV3rgIoN4vm=t>LnQW#l9`Y}7vgGmKK=(>k003Dw3`v( zn&6q+=4F0Xo1}YC-f_QKQ{nBjSG!qM4V0x#9|Zr@1DivImTiw5QAz@0)}GK z#hZv0x4(>b|HEmp4`UOiSU#u|`usyu<^wXv%rWO?4OUKt2LLG88?k@He@w_IyrW@e zJecK2RAG|On&YE21RPAev)YI4$l3bSO&1uv{C`U1MSLEpZ)J||MxONN2E>y z0F#8VH4XmyKi|m*Ed)`HzMTbY`QLy0_g92QNanSrQ7lzssy^iJKnaZh)n2o=$J2Ma zv8c=-fMpDFYvX*pKz~>Z=mnaG1@h(B4 zE?>)o?8cA4(9!nqpYtF5q!Z1jNe^QHq#PE(p~c&hr%%WGYIXtB==LzaE9aFc;1t@3 zEK)L>K?7}bbuxMegzQ)4tWHJdwDnWZ0H~yCM9DejA&==dq^Ix#E*8Qk^v!m-QAdC!P+Q z0GvsNovAi(JV+aUzi+07);g6RL`+8451P&zOI_TAGXIIQd3lB!W8+Z2j_-B7OdfzJ zqSO4)>8nBkXij9eggglENzTqacx2b?}7nx0xx^bZ%!t)5)lcN z{o_&P0MKZV|H*Rp*KKMX8UlK`TafPe1MOAmfqax@v4<`l1LW`DJv#vyfjfL9Ql=GP z0Ytk%ap(wY6k-|kMkHS-&+q&5enKz|cy040n80->?m2YR`auK{V1 zN{%*=MYdMY+6!*p0$zw{{@}AK5~QOMXVyozB(B1k(qqOduVCqsO)g-JILgXyz!xfA z{MBvvd=gk1@#8>=Q5j$#{7OAmnF^1^WKG|JS_(fMMiavBT6i}$VP0%jw)Ih)ZgA%7^a_2`K>)+>3zFNAN7H~;ONGyUQKWK%5 z`gcInRFGWGmy&MCaN3Q#$)#1Uy?J3KP@ zZy(3wVVNyq$o%;$W4&o$EG>DQyl}n7y9mHYHV>Nlo#%F+>Oos}=wr&yQxY# zcSYlFkjQKZs#%Cc?%lE(Rv(4r(*z~*&h5za4dZomDaPC59qcZLY~p3z8gW!d3Kvp z7SU?mlfta$;tZ3CL{?h37<6SWAnQRF6-+;Gr+b$?13G&1P&I63V(#8VG|Kr`l!0O6 zc&@5-zBp>_=r}dxju<|DW@LRg_FMgcJCLzUMzkz7ml0e&t19)hQ$Jl+v5iXmvpI%bXk9i&qsT#vh}R`CBy5XqYDw+)K{uv*tSu21I4j59j9Y zY7OI-j}Fu^PizA?Y0#RWCKc3uY~C008kh#2C*#zTro-W?p=`Ptj;%=#Xz=1>t5cse z%kXuGfJbV4)8CGdK5AcP3`?A&O_S%aTkuz>YC-7c(x3~!8PxqvT$xgM?3`=zqKBBO#)T063SWZOZT<4g?U%$8@*BN=A;Kw=Hcj*EbTreuKD?W)iZ2 zIgnWK$ROEc0|FE07?XZunl;4hq$ZW)~-#QLH<0eB^YgWR6CHZCFA%RdWU0|D~?F;lz%*3)2_b;VZv|r z3$^r1^(mmvJ{o>py0v7Oz*k2U-Nj%R zofJM*waD*!U9CUu(N#2PcC_#GPn!;(dBk}AgCctFBlppH@BupW7tHKwai{jDGTEvX zH~!?a;Zt56{1dd&w!)^#L`J-(vy)&JGDqLs08296BRo`Xw=eB)1o1AG2?+|R1rM4) z2iX7wDOz~_d*;vfx1kBO>Q+kLbjx*;ynfrp3-D-{=#`W`6SJyl$B_?xI}suZxjsu^ z?)<(BTl6Eq3;~Qs{vT~SqFtmx&|UR?sz#H>;^5@qYu$`F`b;3~){GVBBWVV0Be>-z zhTp0@`)&bcDdKAEwZ8~mC5&c)D5VMEZlX8qSfswdr~d1rSOQV&n1GsD4-{7Txp9oB zT2lP{q3IT}bHAm~R_N-Y%s*b3TM978V>e0fw|wh-X7h)K6Yu%=?TQdaX>5FNLEF@& zfVcibolb);$;=1*XCOU6i&)byoxj;mX%DG%1Aq%+P1COR{alX72yL0k3dGd<2&4$i zWWFo&AB4P{G7c!1o9jZWe7bI{*Ty?+m6w`p#4F(zL(^pPX!^9;Ry*|wFo3Mg)l()} znVCZDb7+#XEzVwo`b4`3E#L!)3Q341q5u?8%)gn1wmz!;bUcG_x3Sky#=n9OA**m} zTC?fh?b?)NCJ|X{?(=XW+N%c)RzIlsAOxGT=KMDJjQYgh1biZ~9(wf8VDbsJW#DS4 zwcw!8Swq?I<<^9}##3~33P_5rTKNtw{_qvqyB1`E{B&|cZ-A>38*lg`Kh~RjZT4lm zTdlMr>$)}L1kkH77A2D&c8@#4FCu!R>j6yk(1=5VD5|QWw=;2m9kg-Ltwr#lyiEsB zevxU%-7ST%eKmqhs6=Re*dMPL;F(p3z6Fv}HJdV_bVJzC(bnlD0BMyXi`IYc} ziC8jNMaIy0-tKGAH(hfR{Q)|0bg=Ks)P13d=Qb_wA2n3{But9+dOHD%{<)iBU6Q(5 zWJZ%M#>H)QLNc1bt*pDP5EGr{N_)IreecEi;T7fu;1K>Nw!%2$1PnJ)lc5_Q7*=phOGZI0R9EB zo2vue7I&724qN;`T)O}H8cz{QuKV2||NrpsDhU2P^wO+R|G!`T|K;r^0lfbji2}>z z|0M0-NK3tGW$>SIunRc7nx*U)%o5*Sefxj^x(NlleQ?I<+nt{?mH0FAfl+zr)^=l$ zC9W|2CS-ICvY##F@8m>PFpnDOTvBSdS1HZE>0xUqC)c-NC;LcQsRc>N-ldmz3irOa z)S(jryOIEaxeJrHtwb)f!GDpM<0|Ame>@`%%RIftxy@ZFqZsKlRo5fPpIS40%3FcnT?``P$__%3GuA1XCzH91(GARHQTlrR^U5(hEzjm!#*V0 zvt(LZ%>yYG71f=dua!NV5-m08W0zM7a3P)Uto>E1IO0_lU9B~3T5H}H_2 z@I_^O_gzc2lDsggRH@uSt-I8VgP{> zLB)7COkuN3E)Wmq%$7o!Ya^Ot=-x4^5!gqzfx`(YV3>UNGq5}@-c}Pju?`IBbS@8 z<3HN=(1u*?G0b4n8WmkqJ};Qj>Y2m>-n{HD>p2R!7Vqc(QV%_I7KhY_q2$bYV^6OV ztdv&O)2mO&;xQh^k=RJ%${Y995xbEr>s)#ZtFYh+9J+Z zn{qbI#xyz_o@4_h=Y#*Y4=w#5+f`brCTu%7nTM!+%Cqz1In!5tN_8TvX<%{_m`fM# z0KNRIZzPdIRK?P{f8_YzNt0gsi}wscqAixEE4_lCjV_^p^!y+sVH<0Qb@7n4wI;>- z&vIFQs7m&vHtF**L*}}gh1bAjeja#z{f^@(Ux5{>(xrE(@;sqP$T!E1!<3`oI-F6C zJy-&jD!mu;^iU`_l@W@|M1#si2`}gKFZ=&B57|lnU*@4h^JZ2C&HX(>mQNX}NTQJ_ zThH@xv|2lGLf3ugbazXG^$(fDHoG--=|W|D4#0^Sa|m=~NdWaIZ3vow9aK?F22LS1 zHveELvH)#j&=IsXd^J|96|_kr2br8P?j1nBVr+S_s?DMl|EqlXQVFKizvIt0R& z;};BP!&HLJebKv-J1XKkt5UC~m;A)7-?%P%8wE7?j0I`jk_(}T(oJ0(iPbQ<<NyOFv?J$OiY#66&LW=5eauoOE z)gTHc&UAY#s^P$Bz(E1c_x&$M_B%6fnw=v4MT>f;{b8W2yhNGSSz;yEP&`z*-i}2z zJjas=x z!$~`p-h~Fu%lzyTOYa!%{Ep4<8UYoT`qSahgY;%!rKZcX_RD?y;+6;n7n=}BrD|RR06r@@Tc9X z8OA592jMoTILA2Ge-lZIOa3d@|E+{V?(7~!9wlh@JifusNEdQri|#}I=|Nz_Bo048 z1e_OLnW0gK&oZT3w08_HHzMmrFWZ_di00n}oJ1z*USTpcdmS_m3bh9)?aver?S|rG zWad{koGVf#`OEg7e?Es=drKbvF1f~S?J667g?tC6zDVe9Gl7i{F6G_G_Q=4;e>F|& z8tr3GM<)A`>8+0NUJjv>7qf0FTD(owUHOo%9m0LfXayba6R*4BV7Q7?b@`L=-1F@; z{ADk)XdPCS7S0w{0s4*(G&xZ_K0kJfDz!}DPR&bprPCYd*4#kDr%2Z{@C0SZ&+e6W z%$Iu-vX91NONy1AQ^k^j7By{UV9y-j@|~2m_V)wf1#ldcY3~ZQ1lT#+w|-9fDW@Uf zHXjtS{N6MWpXEzI1WR+`4IhIbqCxFuVbMGEK2S!JwXqJ05gb8_v?5ijL}(luqDbkl zs3WLf6ZG}okW$q^b10c8(7NoGLdo;eUh!InxlLr!ODz_DQYP7S`K(Zo@T>EKFM-HI z(TGmt39h<#Iq~Su;_wMuhmq3`mdiMjs)?=c38C-b?d>fIRM>;xCYO}amrjYJCAOBs z;>YkW1wBZ_klkD#yuC9TG_YWM;&h3A$?O$$+sRHRa1zVY$F?(zid`7OWEUfXu|=ej zFvRF=l$5ww8rmaH%#9Qzjt7az`` z>atryx>#!32EQ_x~6!-1+TV*_&YE%+keaJnN)ep`R6KvR!Cl9}O2g|ps zp$9Hr=muDIcpr5cdy((seo$@c{fvyPXHoWH@yUA|V@)3NMg^mgreoR4@)!yI z0jdr4EBq&k>_Cx2rJHnI_!G`r!uc^T3B18v8*en8@i9Pe!E8n2K?iP#C2_sK@i! zDtPM9wLq_-_o>2GRl3GKH1QZDVXybOpM@a`Q;QA*r2c@yMQol0kE0*r`1PP)MeB=6 zecabCNnNIleR_^TGu1+4=evS*_Ub@1^?|l~Qm9b6=MkpAq}*-n=wYu-u;X+pE896S zkXat1{?epvsgz+JNowAsr(B&tRrO#Qb!;I7CZ7yw+ z42tm`k|n3dBPF=xWJJmjSJE$YaQv7hzwW7rhr`5uA0Ov3WJ$9Mf=+{z8Uh z=($GY$KRb0&XtKKuH<0eJ88CFv>lAzu@l0tsYt1Jh3ZkGojS-T$0BGigIME&sb8h> zKIXV4&A^}$W#%roTujvJnV*ql=R|+KG5T7lXvC27bx6)iV%(DMQDOkqbV+z*18Ds- zBBE3ydbsp}iO)v!#pV&JP*eygU7*`l`&UqFoW&{!TY0q&e3_J;utdS+V(YHL{EEK1?2Vm z`kmmzS$alXFpE#saBzn{A!_#&Kw~O3PEqIooV$DspLQ!GyPM`1QQ$!8_v86_<0yCB zLI@Pa`^P!e8@HN8b1{iw3Os8ghA7Q^ zLRBWS{Ezoe3rD`*(f?@QboVtd_8k1J`>ywttN6av-f;na8|CGnwdj%g9HVd5dH18s zSb&~#)hGRLMf}GEK8w@x;T|f|UocuS^A0MRM{?EKD|z?vRSw0%`ux`YISX{e4&M;R zDaa9fN4rNbsF{i9ddUd53f{gnGZygejBrhA;_8xP<2UY$$BE{cf0>mX$@@tT^m#8v z5kMD$wBXMwJu6)?+i~2uwlEIUh-vV_z;dzQ@cv7NME}2JNO;5zCtdMDO|j<5z41_- zAp9_fpT%?hjlR0BKbD{AT=&IifcU8yw{lqA*b~k5x?=^yi^9mutMdrvA2}G>-c@W7 z0x?z0yY1Bb7sD@ZpPE@Y=|dd#ORmu~Oca440}v3)glt#TYe3Fs!j z`3ZeMaG)Q3bA1e}WXD^D=4?|rO5>k!vs(KX;kKApBdxv6R(b`hfu+_v)J);+4-}7- z-#y()S;gEDAfdb1VLAXF5XtmWcz)I^Gju#XLKP7P=xlu(2eVFlVY$5h~=L@^HjOOUkJzOy8X5G2W7P{yz=eZ!DDS`{x2 z(Cu^WEyk>fUMh-BMv7mw4yGh|BoQnxW)$c^=?rInoIk>Yik`%uNekELndei&lku1i z`?DkyT5j@tOO}5%jX#{Nt!jcR0PJHAna53@qD$z+!7Jo@#7Y=KYlnS zGT)!=gXow&{jUBmOH$r_8amuMmd(k-G9;ECFIWb*%2{&#l$CIDYEQzg+&>>v=bZ2l ziMrd}6w!ZZ%WS*PSB&WpX+g8&SW(k~h_~97wLF^f-#=LW`xaL0izONl?Vv5Pgz-l; z%X#ZOO`#Wc1zZ-e>pneC)Q}Goz7-GZv}n01{A5`mlJ{eDX^k18wa2&}BBW*_+EZm9 ziY66dXuNUa4Ljs>^$t?ZtU>g?`|EA(HZzMAeBZD6}HuAZN7vAd&4XySXyj8Bos;(xa#@#X_tl5*HLDSto4$JL<^E$f~U zSR2xY+=llYy`(%T?EYYaE7R-{yR=8qTR8c;TH8liaHq0t($L+H`ZJ%nC%PRtgWac_ z0447*W-B3*BEcqsM?FWDo}TB4n|VD_$~h3&lAc_1LaY#zhUzOEJluj-NxTdR6q*Lf z_!o}aOQ8EqLqtdAU8EfCiQ+=p>?!&KxqMi8<<&S1c{L}E9#2rxO|Y@euh0EsL1stK!3gP~J0V;(*_#UUu)$ zQ;t=_eSXc$i_1}x}CUu04+?cXD-Zz+!f&hCTK@r6H zRf@-89liaqFl|Krmv$=Yzz(#@opC{QqTTWY-U>Uj_bd=HkCTtW*I*xy7OT+zP7LbM z5im^{(nNakHrlI6*G$X%v2Al?>Dd$n`=pP0i?Ma2#&3Ggrn__UU0KBIkoyExC?4Jp<=1TpiReT?L;$Ad&<=bu#Rs{XPknJo_ZYST6U z+n%&CjIbxk;{toqVDJG}*0Jvj%dP&oubd5C9o>WgJ>hx#UIP8YpxhxNiv(Y-OFycV zH{bkZs!{#iqh8&_u|&JxR`w?au$W01|G#Rb&JWE|diEFIr-KjXk_tDMlcRQbS*?&H zv(;#jkVI5pKF!g19qyBnhcNcR*XyKM+;l*I0AeZ|t|N8vd ze4n@Q5I^qsiQA!>D)XHet^t5C_*KCwug3iCP@q&M3|(#Zefuf({L64mi5An|LCZ#y z$G)}5Hrt~zH3KQCL(Hf$c{$4L;?sfRlipb;()PoL3$Mn3v#C>LxfxowN)bY~fP)l% z>&JbKbrND2coL>mu0o%TtY%Bxy*!mAy^ebo1;Y%4O3icSygu%M&hiuEjU}0Kf7ZSg z%Q}!EvclV2E}N*HZ)cxr;p=KYETm^!c;e`+-_M(@r^C}D*l7hE5_cxHbdjP?_T;gQ z9(62P{te$&iwBg6h@LwtiX4Ro4b!>lFR`Sh3sZkF^9WjQpF+6{Kht$1ONDNJkk|kW zipZBrATY6LLy!patq1+9)bZ!hA zDN3zz$?T!I?NOs6yM5h}A=GVjSmgscJ$FA3e;d8ygOb{gdMx{TN~BL8u(2PAzeGJo z_bKlrb=6O1P2t*XEjxI$b;1No?}iCGhU*m-163S2tF4!HlS^nPdz6W- z45!rQloy&8rKsK+q!2s1m!~1<-=9CV2LT8u0{LT~q_qD^2 zKzd(9_{{&FM}?<{#E?Y+ljSz<67g;=zHvUzVETX@17{%7IiKiVy5IfuIrIB^Qp?-V zSW<&U5()u|d9&DmMIn*1^zU~=y-!K;pWE^-^rgq%(MI!^_xJwo0-&uX481Y0S_&vF zdID|b#Z*c?C{jNrZl&AmN~%b@E1xgMBp!7p8*B)-+E#D+*WLYJ?}_S@iwY_cxmJd6 z-I9EHVwS=@O{!GU1FG9%{kitq@SP4={`2|&{ljz-B>&R2-=k;6>ZX7D2mkvEh=&O8 zK7;@J$9bH%55TMc^`n2i_^~hcGB{)LsJOl0pZ>A?;Emr0f54Lv_ESqlL%jNji}L22 zf}-Q+zMJNf`agXH;&~R9`jQu%anMQ3hUa~=Se+2JRo-Q90RuZaOmO0L@UE~65gg=O z{sd&=G%4UzXAD3YOLXE*f@IqYS%fQ2z}yLBTQTU;;F;r|6+N_DeCa-~_yE)vV067i z&^Zh6goV67&UxT-=s;`~XZHHJhPIkPj6ea`4P57L*DV!@pLFzYH?^8KYpzH@$#{C%PW9|*osp~Qda5fX=y?Ce zAV%7FzqyyO2+^$|o8|W9;k;%9>m$7TX%3_se%`(-2w^zl znSkrax#%5*`s%3(~4tz|2D{BQ@!Q{~h@G*ff-(m-W5e9+5I~6!U zA6pS@Wm-JfYoZE1;j8U$HsAJg$qNQ*Y4;Hh6019Dg740UN#6nk2cH z_fPW6%gJW4CSaSGpp~uaKnP_z?*Q&e29P67VsD`~pOs&I`GUFdQu*2E+W_zTOOzg+ z-^PQzv-L+ArcOwOYjOile}v3yZrZ^kW2V2|uqLMy@X|n3HU8^tnIXc*U6$LnHnz5a9$M z5XnXGi`HC)({DaLX$8V;VtWvy+wUZH_yihBmM}7X7qz#u6n&s_`vpD)L|PBS{;EF& zq#a5tVm5aO?y&}|8gEBCkWQtq3hmbJFxvtnme1$*4UnX$R)bgpieZIR;q>FPUEU-s?fvCez+{fcBLTLmoZf zK?s=o2s#D;j=PW-$~X@QgQXvP+0jazbz9Mn$6+Am#g35B+lAB>)_!zrCg9{qxW676WDQbK|{v#oK>G^@XqQE%XAw zf2KO#`zgyMN{vz=A&CX^Ak`ldfO>(8%K+=o5x(XjF?IVKgB2L)c)Jg|5lXVdrbI^NdN zd*D9#7!7x4#eaB*xWDrMy}vAdA9*@i^8qkAjPd*y$U@kz0kwkh7fFoRd5kuvz&eSl zZ!K;;fv$AcBY<-VeB%mciNN4QNVAG}-PC8VUmF}r@l{_eFCte7V%c5TlvwqKIiG(Y z8UUQ#$k$~ELkKQYqMsnvFjaf&XW(IEX14CsP4_sIby1u{n666l@ol7_>a#b1IPKf* zk_uSGjm2^y#h2GF*+R_G6jJ;lGT_&VVPAQ zV^K7(8?Mha*+Ovra;2JJzO%lrOZ+@4j=I0^N8XXT&J72n4>8-3E_|{BoM1_QMx{_s z^0m;DhPEMK+?w-O#Csbu`pNY$SWb3%;OKSH+uqRhVl0RNGmZ^(XlYjMzlVy zIOKOtT&{C#iV5?emciah6aaCfBb^yEx|A~fnjmvnMB}+RH9B2*p_d6r?^Sys5c2Ad zGXW=s9;d>8YnhHFKAj=7Oj|(9bQPIT@`AaW;LwGv#t`bfkxQPjBLt|=PTnC}-FsDr zZmY4(dqUFCbr2U#79OoAyA}pbJnsOb+%vmf>Eer`RrdB%J#oiXknJ4Yag?}mO7Bv8+XGm+ z_1BnZ-x^b@CJl+ptvc)$iD=0>_1n5u!E;g0LZV;#*)%fzY4?|K((H92AaY9c{#A}S zNqgfkt{=n^y#Bz;P{dP^bK7ZAAdy1RTH(y2@3Tm_*!;Ph-U+{Qp?!hd{AAN<)dZmJ z%-y0zO>2&Z?L;G&girdn;L2ekDlJwOf1DG6No$9Hq~=oi5_3OvHu76J0Y8n9U(vdX zv!r2!g@Z$7h$TmIY-&^@<9z0L<2bdbYcQK(nD-ua^1k7?sMdJbUf$)?rSUL#p?FKc zg%LaD)c&Gv^E>|4Uz$2pNPR@xDPcy6LFjFHMb;dAMqBF+3}OO_ZyHPuB9w`1R;so2 zt{TrrD)EhKq00h%UKf2vgRR1b<1mms9_VD<93m9xz*DQtu~0JNp)A*0YE4US{bSh$byQ1%%?QyHuSn{?L{c5kUm9H}!as30dqkD?;D zy{6WMO%xjuEp`d-c+=Fn94_j`l=QwPGk3IAMaWSYJo$P;hkn|x?~#RJUCynGSS-GK zrC>Oz=OAqJ=HBBAq(qblkq8?TCF(wQO|G^M%srqZL*J|E!_bkA^WbkK(;R(T@(Vcq z7YfI#PTrgkGIOC41d{}`cQC(0)hx7QE(JTbeSm((9QxxuQQ}>fX19H;mwGc zG*=aK$-0V**~NQE`@UaTI52&;p;uCR>2GP7qpw*NGDUK;Z<*s zD#YipLxO4*TMvIfOX=aF!G)d-ENp4g!VUNRGh;tPNOVHoiQbK2pJk1Q3cEYLq*ZI+ z8uo{iDd;Bt$OLuD$s|^$KTXS1rMHBWxhZ+Gq1XYgF@*2r=v7tdaa=%Za#k{w2Q_2= z*$e9!Vei()5;d)rM4v|{91?t-t)77*AGgkV*q2FHY1`k(HvW+y{4KlHTk8(y)4ZC@CF_zXPd!4%^d;dlAM_*VTg6$VZytgao|Ug({Ev<) zctR@9n{>C}mPntnGnuNiV@nCHTs3YFXFCL@m{zJw+X`f%5c)u5Y#32r1T}=^n1fXf z3~v|?`Ur1iVxbq(Dw^apV(Vq6I{3mfY_hE@TAsBoyJIB~-mxwzio`+d4!mt%V@8ix z_O9GC_-<(7`~8V*j=PWVLE=L#jz1o29P_p>ziKMDkSz4hEv^^&=~gN*5ynzbr)u4Q z%DIInaa>vn4diGYbu_z=$+5=q^bzkG1z8@LK=?Ge@V*w@#(N|dz3iw{ozt~w;M|2@ z9J?_e*D3WN!8SYJ4Sm~8NMg#_j7wVQ@D~M}%iPMBx34J#*}!tnFt0Y$@cC@4_K#`x zq+bVVyT|z6ueS zUNqD+zcmDFR`U>i-RfG3bh7vgZX8g|3GpTO#4&B?Dix#xKBkoxu9q1|q6ii_jI%^`eDTx2&$I+xd(*ouM<(Vh?1U^m_3 z_r-e_&-f~|r3hd9pCf!s>&ua%Ayki$y9rtqUQr6nGuk}U@>o6E+T+Ll&DarPDk0&o z-?9k(g4bH#R(d4kpm4#9f8j{`5#uG0p($*E+1|#M;WxV7BjKTN%szZCuW-!xD=!0~ zi36p%`cBDOrssWl64@t*@HG)MJ4W2JYWTJ^tp`U^xeD^)9?Ukqcv$ zDRShT^`S_#hw!=wBW;%9*bcZ2EOn|Ms_#2|eV#c`jw;o2pCj>y_=l^MXu4El$$&NJ z53cr?i)Yu}RN=CM5bv0wqfbp>%CLYH{Y%Is)O^iBGbGYeZ2gyzX-nE|Y`pK)0Yb<` zwU!2iOzSN9hsIv>vZAf+7&K|?K0<45XIC0B@%Q&;`QuJTS9C~Xj)0H}A0cEq{7cAW z$e|t}c%gMNG@o8y@q9@BpaFMY&F%#amvaNbMNz%vv}N!R-5bH54Vi zS=(N?i3OW7`W&E8erzYQg2BT z(~APVU;h>|d3$x3YKRU$*(97u-8RgPwPIPeZRPPTiD>iw?)}q zQgUQ`aioMV@#~nHVQ#VXtM}lMk*iX(LCVM6wOd8U(rAnIJbM#`1XpVk2m4T+%HS9H<)=aZY^mK24Ff>H2riXN^RbbK3aJEMz?+>9VLbtGylLbRcsljp}+iAC%mbIb?{#Aa18s(w+7B z-Q~{}n{*?4zl(CJO@za5h2-gGvd_W}p5#`g*1j13C?7uTTMRt41;EO*Y{uD+tduG=3!(Ek=BM40fNTTpBO5TJO`}62qHd#?V6|e4{vK8r(GA zt_lueMh6Lf?Uk(Qy6_y&2XA?k##mkqh3G|zdradjg#ZrDv2`e=2F=T=e3tO+Y)SsKtc%Qj3WZ$T=|BZL(1iql`xLobX;Qzy%ePd4v&-ZO>M+k? z%u*xfnTLqRx-+NPvzht$rsJF+lk=G-KRfZy5MHKWIcCArvv4-AZ%sE{qPN2f*~R&IepVq|26HBL?n!S z`o~$skW6ncSa<`SIPD|63DVD}>RI+lEY4<}|>+@L%kAgEmENCu8&xtK* z_{G3HZ95>H+$e@PO*o$}_)jebVt(}Rdw$Pi3j5;`U|iok!KaH;nY9#kC~g-kKpIZC znX?bQ4RK)I?xTe<1@dhk?K^5E=?!UT`IPY;x!}vctu-TUNGWiAK z)@;BmvuGQ#zN`{>zWj8qDa7vfGB-<_jqK=CCL59W`yFgv9P+peoEGbf z$_>h_r$e_?6ip?v=HqC4iZj-QzZvJ%HvSYPS{~_N;E;QAot(f1Myb^_(yh<vCI)P<}sUmo3IvVMhf$m zjOr2E;j5D&4bL}~uOD9*cE{E!cE%M7CC#0|vZL92G{brd%8_Y|f;S!QI9(#Vr}cxb zy0y7yYkK(ks8Mb!C~0uBT^Wf-4aAmUmre>{EQ)Jx9v%MVY?iM%+j&yc+U8Lg#&#+w2<>DW&RyHmnC$S&5V#T4N+fd@kzhg;X>*1PFoZb^G~c3z9khTQ0Far5KbX*t@hpn+4) zB^qR?n>SdvQvxs9P42)j;QP8-&3sWb+K9|n?1wC~6&m|x3=fX+o+l4qC#@P4!ue$I zKHc7@#~|{UmnURnYDp1T$3OnG8YEJ-{q0ZaRcMV;M>wf7V&I%{7F}AjZaJPELy!0z zj5M6?@OBy8PAj%1Dm1p@EMJ)Sc$Nfu`8f+1ZTVmGkKA2!8J!o>AFVN38!c*eSUaZs zVrv?)w|iE&80a@dYRvhL(+U-AThXH;qw{b(4NrzMFrOdmrV-|2zpHe*q2#uq7d-Fh za>)CswCtAJ!69kdg5%RdCXZD4*3GvRRIGO{u|I8p;Ct>Cd<)r*>Y*jYbf7-^WFFr0 zEa^AZ@Vy}AwEZ484o?n6wy(dAgig$Vhtj6<{J=XhA4b}9V|ubwJMj!_qZ|1n&f#xO zvl(=3-ilM=?i}ad?O6Jau*K#ls$oP@e;~dYy8DS|OAP z{oAEL0)>^Z*5J|w6ZVKa`^!k$+Vwt0!P2&0%kcxts{bB(1*X%war?mW5?6-(HrU>$ z3f(TC?n!%yx8d`0*5zp~R*nD{nsO<|+YZ#~q2k%ns73vP(4|@5I6=cfLGdtLypY{N zwO?HiF(0JnT}L){?j}Th+IBq^en%Ew3KLT?)k{Jd%*x>Oewdf;Rln2x4fTM{`UzL_ zbCsWVd$j>|2s4u!kI17#yjbnEEORPv~whb-%`uY!JA_^}3{oJkbUTkowv zYq9R9oL>rm<~s;O_o;R#8;s8^JSDCWb)mBcUanz_A;QuCCl5K zDp8;)`pgtcMNp1A1P^ie5b7P@LPhS}AT!!lZ6W?W_@hD`uiN5XM^HuZMH_H4G0v|G zG{M-tpQWXldN^5w!m4Z3r{O%(&5JuY5 zA`dqSVx@G*oNpxc&y&5gJuVwc%LUw&syfae6%X8n@9DWCKp!B)@I6$BBwb#sOZe=V z>-vu=#i?1eh~M`kgGteE0fGzRb?HLNedW0GvRadx?k($Rsdf^c*ClCd(uZf?p!oleG_KwXa&@mmj4 zehRL0ZmTe>8?ZB#-T*rjd3XvhuruYY;VNEQ92RUoObsYBwYH^9J?nuw(X^_W^1uj_ z6PR9lOb57o?Bs>+lZ)|rR$axdB$ZPwOl)>SmL_jhYk4-jx7Orh!l=yyo1UiQxOss= z0x#eYPS+ZD8`o#hs2LL)nvI++vHdz}CA#QbfQW0VHAH*=swJ!$nBrOvzd(yg7aetd z+5aR(OElN<1g;^Iex`T-fK6Ajx_fjv&n)*d?@(L1K_yksAx$yb9tbF`?>LQdx=|>B zJQnZnqF~R_BjPiTm7y=Q7ga|_&Y{8gyr1)&4iB}Jb|D@t^+lyxQP=&GbFX7|i!b!J z?MD~<#%Y7$=l4T24b$d2`8}Sx@ok~zE!DmvNx9{!dAr2F0*&GeZR}U{P{MP?*S;N2 zpt?FoaVt|AI$QXR<~Aw=td$0$QLVz`qJq`XT0s%8YPN2!-F})}OpCH$OGXUcE9Wi9 zHBr6SCkt`+mb{|%z9SR|x{0S`nl2*fM>rIOzD0s2K_0@_V6Xo1cg*%`xcMxVFQfyEygqojP*mgk|LN3j6Hd zl!~+|g^C>QruL?v!hRg?7A3DnF;gj_W|yF*S_8|=|Bt=1{)=*5+rElHBhoFRLe5_lad|uL%-xF4?)b&CW*;eRNxaDz6aL>CA&*HJX52=Mtrgrk~ zz4%Sey5bMYA8;REgS{%d4x74_jIX+sNn$ws`O38@D^XXO>37%#9b;GhKVYqix%7zu8n!Vx8dPrFF%9!6JxgSMxj8<9*&5 z7|2~~cg&-ym)GLm9EABp?EHhMP?IyA&gyuDCA}oaaFMd@*~rKIACd`$Jwv|Ce0sP) zdzs&6z5RzdQvzhp6!mod>NS(^PGLSlA+bHHNNHh#po-lZH`uYjv$<*U#-MiR^l}c0 zSwy!Y$G`B4fGp%oSZL^01*!F4lN~RwQ>$I>VEi_n_~q}&j^L(O@__zeK7Q7g{CBUp zN(l&(tCS{7JpX#{i~r7n1TZ53A0oFu6wd$e|NGxxLkPR1K}ZB^=y~#Ye25%n0O`S( zBQRR#LkB_mD3FH`i9TA2D5_uLVA>3L3RD!%La9uU?~cnT#74Ki7*V$NIfXomwt)l2 ztA(ABHps7+>S?ms)sGk;1EK|y<>{)LU>x^fpRDQKt#7W#Eb!N)Anzr!jk1pwvmo*O zkCD$!3JDMl)&l4c`$k9Kbwl4C=|}uS_sM>L8H{GFd&5fa>-yFv7Y``#{H+p1SJDLg zL>8hF=Vvaz+J64ASO<9w7?T@GfMs!rEIa80)=wRX4M65i>_Q1+YHvT`ZPov*uS9$9 z0T`cw7id%e12&DWCxf;89wQG?f7LW$qdXw zx5>UUO+zCgKYcTZqTPoX6zgQVd>JA?Fh(2qH2q42OIa?1(5>!2*TR}6G3|rpEehk; zRttvpuTp>&0t~WqitgDc>FWbuEnuJX#-;zd^#cMF-dRU7S1oLSZ!-@9$Oyr>yPU%$ zM(Pa92WLy z;y$7*{26_QHtzT_q`<^L2{J9v_1nI@kgGLc4v8Xd9vEKSR)X)eh4unZE;>DIhSypF zfIS=pO_jZon4luN3oVKq1MCk9DswuM1ipo0h!H??Qu>^1*8e@Rsyc`bR zv_!N-USqm@y$1?7?00 z2N;3^OJ*$Qqhrad5|u@l5^_tw{0t;$`TfI$$>-zn8xZ^h^A%=e7u12^ERZ;!e4YVX zPq3HAm&ue~Ss`<7)Kth@L&M80*I}mVvR4RjyR-t!rsSoa(Gou)Q_>dM3?>~-W^a>7~?yhMNJBJvR_K$C73qODoh< zchy6I;sMoKxQ#Mr(ub>!Z{|IHn4>SR^X+p2cAn)X6{l3s&)+HSS)YIc_^{ zBym;v=`RH-0VDz})>Lof0?^ev_VOj(kb`njv8 z%~wyh!SaR=))W`L=LI=^oLv;^cD$_bWo&y^q%$bECWM-bddPfLxlq z|JS9-x4c8+G7O4|tDrpYH8~q*QyGoUtN@6_)tE#>!l6E2bbeqt6v0mA|dy9!$#+&nw__43a| z1Uc~e*sENu399MWO#CvQn`+q%}9-AC#j9bPlM-C~Lq@s-9dhYd;Z@by7 zw`kPm0Jo>S*)9Sp%farc`-w^)S|l<@bqxD0JFF(Rg(cis1iSbXN^~2h174^2(1=m} z#ajMn`TF%rj+oz}bRY%Li2VU~4WB{0!&9SwcW6@imqQa+;5KERFsOo6=;fu0TqFt9 zc465*^b4}eo@}!~7)uU*Szb*)r_C3jHkjZrod21sTIm|2`Lt>l4nWDOQT&gj39P_f z$b`wd9&6F;AG?b}2ulnAb4Rl=ed|p!hL7Bx=}m(^%YyFdx(%cMYtZx_vYg2!Z<)vT z3(wi9V`7qehp`eRwuyZ&dcVFI>E?%?Q2_*N7eOOHe)ud{?vNEY4MGM@cT+ej7BM0a zjugrrcm1qs{3tX^l;}gBCym%&?fH(^!J>|9!h-#&58Ny4>1gm@1BR`ioTW6fk)cXu zM^3cWdO_6st8xZ5?HKHU^ji(b4#&0nl0_q~J*Y#Q<{uI)o3LFKxDoPK}|JUx2jB@gMzaj7t$E$ubS~+)QJOAk>M91Wa{w zGxOO==shl}YdAfbCe{r(hM1|B^5mTYlb{T00cAnz;j@;*yE^xk*+aam>xAdCI8`F6 zwLJMv4uqBtG{GIt#&j^Z)bItqoeRGGGGr?W!HoT8aC^>e58Inoxi&N8s((>5zGddq zsZ8Uy?-YH{LrCXXYFwcuR91Syyt(@x#hil%S^bI(Ktw|MChMauN>;6|p#tOV-=HSU)X$qIpKi=o zkc1v-4r8cObL6G;AcdR-Z6)x^ zoK7=sy=D@E>Q!wGfQn!=U^3rokEqSR;kINy^qEp)^O?8q~Dyl|iYZ!%)Q@gLh?Dtw{s^ueJZ58|77;0Ma~a zTEcHvv!eiA+()htZqsRL%M!Q(^(Ab$0dT17|8l6NRTa%wqs{Q&wRO0>=`^Wfg_%xS zAy9%B(VBa_y6y=OmsTjw^i_c_ypjgr^s+QQ<$te= z|Nm0_-;4JD?}~puw!z?1n6`0*CIN>{zU{i*{dI)$-J$#Qz*w~34|2<}Is)1yHamdq zC(h&0@cpOYg1RgFFIJ*IvJo_gwCQx5h61@PVBWQpO#|_Y6d_|^s0eBSaQ>Sj6u{&d zo@OAH`M|VslC=FBz>uE2b%0b8u|Q}bvXr2y*m@1a3Re~y)%xSn0lBUWM!p3gGtpPb zHgO)P5Ps=5^gR6Q$A)?mH;NjW1xCQ^Q9@&S7u)-RNQ5#M1VB3hWyoFG^Wy4Rd{CV~ z!~zGd^r%KCnRv5$PLihN2Pq|pasD_06blq;M!#Q&b+e|zfII|l2AKD4p{bs~+F`&= zM%{uNh1>oOL`T{r-G$s^Mb5Abt+D!J68v70iSH#i)W~=WxgV&P;@Go)t7vE$k?Lk^{={nOH zI?SC&HNg#B@GvN>*vNgt$_!A>1W4|x+&#npn)U z5DFb!;1ymngHutzKgk94As`oVBB%ryZN2oH?ehO!lm4;c5QF?2?ZMM3=q+Oi8>}!7aG*BLH}}>mf(kNT*qg9WwP__F zTwdnQheq5x!`5r_}(@WeG=7uqYu7B+C0~QqMoErEAH)wxllUm_R!ybzWz63{0S5rdE5v zem7apz9{h~+Bqa;<`)JEtlx-l1wWAW0Xnvgq=f?uyw>ekAgbT=n8^guio(+u1&F=9 zcZz)e;p1*X{Cv)ox8Oci=GUUwD%aGk3;fF)Aqw}hS1z^7m4_6Z1x~uRv~o(m`gbyT z=%J|qlI#SP*rHRtr5|MY?*hftl*FfX+>aEvA2W>O3^Re-KS=wf?%M{OS_kn|30*N$T3iYQek~0ram3XLEgpoj$%Jw;@GW|oxMma1$wbN*Ztf?GM{Bfz-usApuU?) z6LbW8r~+k1*5!#nrOA&spM@IEF0P0oY<6*Yd}QK3j0VC=%+k;d`9bQ(qTW!ItV zO@Po++3#NN#_5)ioF+4Waj=9+D6gQVa5ch1qihH919v36Yw}EKFCM$2m%FpNLM?p(TP*SFElZ)=ocX zGjRa3{NL|8t=B1ZG_coOVo43V(Bg|al342&#NCDvr?U-8B?M#lI)s!L>)NfFbES=d zUF@mIyfj^-yx!HN5izMl?+joi*pm;nUDl%J*vR!8ilgkEu)6`)rS}hmS?sHpBL4Cw z!v(!h)1qgm=EooZInlb>&~}mMVrP$D_s?KNew=?j;nL%hL?#iZ2W2g6^W97#S{Y7( z(N>AaK0RSVqHKd3plMk(!L9t+v5ET1Gk^Jwf-alnA^A2@e@ZY`9 zRVHX$!Q`6A{?|(~ZUA!tG_FALhvWVAPA82^C<%=#B$qkW|L&8@K^1;zo5gjq|E<0L zb;h^}y)(7XWv^^%S`e+?3T6YEJrW0a9w;BsFx~ClcnIHm6JizjTm`c#0RUy8M}QPC za_KJZ6X>nnnWi)geo|C}iiFCx&vT$btFQkRnv0wOsUJzalE5RYv;e|)Ct%~`|D%)z zVpzJa>`?95e@bOTDFz4ZXtp8IDQj%k60D*RHMBXdWjuA`HyZV$@yu=9eahZDdEvYq z@_cW(c#R(2NEhV!AT`?_as}(wfSM~}oj6E)`V}Xe)K((DdkY?$ z<>o4wI6T)UpIN^U02w~C{)S@gt%$9BjjR?KuK=_DM!ZyqTANsxb(4Gbc1V-M9^Ff> zufeWS=&uxo9tZpX;LB*48Cl^3gsn#PYF_4SM>9BIe|@y~X@PLb@3x8P=XN;lxj54R z#<;`#x!;VI@p;&{^MTw9ujjUgMN48?#xdOK2_|n?KRa~iai>aw9v)^Mh?`dR&f^9f z8&|CA&Q&c&=B8bCpvoe&de)1}W2G?|M)mCBot8L-yRg9a`C9XWTw45vZ= z#oyJ9r`*sYQ^5{3*0G@MlJhh72G!G4J(w2Fq3S@~fWFt@3RJ7z{Q!zIkJiO_)eMS5 zDD?tz2>1%=M7akVfgQLLr~t!2H(k(Y2WisR(z%Bh{~mHiUa@=kYhE;q&=9oVxpu9Y zYrrWxxFGj!p@53EbakC0sAcBC=0pfJow1-H!UR;cgIW}$+s8AQvF%IVX{NwA8ee>) zR4&$)A#J0_Qy~Qj=K-oyv(KYC>+h+bbC%#}2SM!^GqB||z1jfZejOd{=wl&`QLz#O z+k=70#QpgS;QR8YP)l5T7gAE*!#Qtjay#DNYpVX(81Fj>l7;9g$&B}!L%rMsKRqkozAXQ#(k#yQQm@i$s`I= z1~)l^+zg^#?rI}8?R=#Xj!%g+#4b(XOVTHk5y{iC&;C!6eEC0DzZye3t z9Viz5%Ak6&0+uSJDLgj!X|Su4>DR8ntamoG`H&>&%3r;!iZB2*{KgF{g5W!YvIN}Z zU>qfl^W+2A@g=~3gmymJB8ESQ5J%+hn4ZPN4%lC-Sp4faLg02_f>8;d12r>L%TI_B zcwRi9`llCwNbEI#NKV8}TU8bLs2SsrcNXis#ms6(tTKFe18|@UlMJ0kKZOl)k(RW&~12 zAY&z+mFfK|_}w|8;C?_T$g@;jP?y9y)}L{+DSH=4YS$ha_k8fa3~64QsH=dMIuuMZ zCDK3-wRz67q+&p9EQ8urzFzJ^(Q2N?f|)+kj|3#xUVDtk??%t{dRllH-H$^+EmHcT z2nq}THAz79<+fH(3i(N}Akns0c5V_%tbmgWZddE)5U5hXlj z9?VvCdCNbPmp*$K5yz%!tS9+!hfbb+i8{z&4+Sc8fBkykp|gYTck~;XHNY$*phLy6 z-cRW|A_eh~8==DAK_{(o=0IxJFPrcPLf{>0=0o|KFOvlWLE2cL2~amSO%0w*si}7E z0PQnA5dO=^;er&-c{ zy#ex7@Ea0=QRX}S-)fSMjuUS$^5;X+RCkhg3LQ;^9}e0Nc*e!?_ko-_O@d=sxh7YeVgB zdC29uGW-P^$I77x`uEVtZ(rM~DJ^+aIcC4*YC5vb)(No%} zMG7OecB(vGYQDNd6 zu&YbRxi-gYnD)(mWw+~19ItS@x8xJvL4PRSr!M4*FQLGCq-{?vsP6k*uBTkAh7?(e zQ;LX>;dSw`niN}%8Df}@tF{lYvbm9`GoYJG_v?+Px1veQU?zu8VhMGnzu2u+Ray;wHeHn?snW%g}CXNeARxz;xjq$Mv77D_2zNZy#Oh z(5p%q9zf`qgHFCMXLgK7hbuXg>DBEnmMMl^tskl{My{2IB&>v+_pSn`eB!++6*mhK z=URKDu?kzK7LzU;StUaT$0^5Vl&jxqnYr}gML)RsqWB!;R~oA3?9{5{mK(6+?dWf34x?46VVJd(rdsj5!3V0p#{HjqYh>z}7 zqeJKA?QiXGA_{G7_dd6Of!X+~T%79@YND|9o)la9W-Xi}Hv3DksSF6$q6+=mtX@_T zA`EN5ZoBcek$lTdpxJ8?M4TYI$$VXbpQKI`H5>?gFS=%Mv?1wBEgXgtH0;Y9Hr_>v zO-n`Fm#v=Ej8r9OTC8L`J3E;C(AizRx|W6zIVIfO-1a~Bo}&NUo&01p_Iv;C+oA#u z%rrOSuWN+#Ad4ES4IhWsPWT()$HOSBNeSx4`higm9PF~Yp zJeEP7i>J_FXWsho#y(ic^C&)#7pqDhexTsW4DmhL=`5~!RkmJJTtFetf82a+56IIi zD8vhO=-IhdrW>9fEXZ>92Guz8|A@rT+AucK)2|b;acI9-LctvX+W?Hl^Y(~O>G8{; z#ojxtHJV;4JqK+6kJ{>iX9IWC5j1`+ezr6mNvWc*{~@{o*8r;ZM2%B4;@4)KuN(t35Jn8FmA_{I}L7S>kuxYf7W%8oGrgN|FT_sv9!Bg zOX`ZDdsNRy$<3gupfoR^41c4$dfv#$)D6jb=i|T~`P2#EYpcBcg)~u-^=q1fysqKf zXHPmeb+n{upQb5<=q4?HojY|f^jUfD85JL=qqVgkfs6wE3I_Ma7>_}clpxgXlq7;Q zPtjPycVfs&M5U^z{+rGz&8@}{&?M7vDC||@W2UR^@F0$br!OSWw2)L7%t*snPo{|v^4S0)|dHMpfUl{O?L;vL2B zi}Uw{>fW2bqo9J_b4RB=T(K8Y@haW|-Hhr)Rk0Q*xyImJUMz$3l>NjjWd@xA@W|!j zPtLY4xEz8$`*AjeclEe4ib>pxbq2Shx=9BGyTN)@V)Je|GNa0yWA=SxfKDa3J$PKb ziopZaJ2B44Z3SaG(#bE(1o8tnx7_V8U=x}eWt}ksnsl$9{D_vAscILS#hCRyLiK)# zVk7yuzMvr>Bh^o>dVV8uV4_ACAjbzBoxQzGG&otm$i6MpFOr$eTG@bw;;TIpA=x`% z!}6U0VfCp)^Z?FtitEa7lnDl{-OJ&UpRVV9ihVp!OEpvsdMM0XNIxb_x#;kLoYig} zx#OWv|Db6JOvreCsLt$6F zqhs^8g&?C?13=tTH%?zC6W$lb4<*4g@ir*+dp@2wW+QVp3|m4L@$Vn%T`%S+Kl!*e z-Fu8P6#Fv1mtvji(*i+U$L~U0WI-8@-I~*RWmP-t?t;ox_Mp}J@;>}cZPl7U`dbs- z?vHuA;u<_{p5zo$_oNozy7BL5TDTW76@ayFOiOw3OOZ;uH=rqxG>;tfMf_uUXE*&` zjG9{zE|~Zgr>reR`n+&SUrFaS-B+tsCycvBlKM!TOq+G*V9vjh$ap9E{nDU$Mu;dr z14@dL>K+VR@6&SgLO^oearP@)$}a;V=}-JAfDb$VWsCwYCX%`5={ylHVWbixSWnQr~o>)0h-{YS@1Zatsq6ll9+H`2b&JFHpyQbJFGG)?m zJ1?&o?K%Y8qB9T@vtNg2Fr}iGoqJ<|QAWarU}gSxa@K0=H0KAIE_&=hu~{jxNZFXs*{z|(7d7H;0f*3y;0g;!u_{In@3hBhT&8|yBxKv%RXUc*%EQRHC! zfMJU6kz?s;MLR zZRNnAMVbGBt-muGN{b_~u6tHU?V=wZlTfi|OswGev2B6&&egV?8#_%2@)v%~I$u^6 znGdF%CEDhguAeh~oo3P}Vlu-Rr!dL4K;d%n323eA*Gu>>e$J;>+}X0B83DaaTurZd zDVIljK#Y@1VwX)_Naqc0y9eL-g=Bcv7vA<c)sv6GH9Z&KbHCpH9^YDOM252v^3Q7&uFZYRied za!O#JUwu9`*k>C|?{^1k%$kG`pVw;8T)B;~V=!@`FsVw~F>ou1s@6JBTT@^sXuqlj ztLE6!7H|duG1c`-i|yQ6q26U1#>OOCQZ30iWxuu(=E|$aUu@*J%peXcKg&;gJolTn zF|-q?_Lvq;`m9Z&+FzoHSvy>e?YgwsK@-d`<<{=^yiesf%c8FE;73DEp~Mv*-<|L)L#?Nb zbmFX2uLB}PrUdzXtqg~uBtg`z7MF-XQWUDWq2{H>i@q%1R9aF#raL@Sbf_kg+QsEC z5$UV+QWVv*rel;;b4luHrePv9f{fWWtF4UhzIP;uqH->?Fr3F6NCCO$q?Hl1W%a~x zo1YEe!;sEqvB$a|uTjN3_QGbK1+kGdQ&l&vy}EvFQgTYEw!4v&`)P{$FZ-#>XE|x( zlGIfF?%kA3mf_sj)fb+#B9(XcPTtZV;wxpmMJL6YxHHa;hd_ak--xqwf<^`1S*_HM zr(3%Xjc!+ordlB_jbO?Cx%or@{_vwax-a>RKwcp$>noX$o_avpa?ln9*7FvSmzFen@*GyY59?9p?+x=C#=TH&?gEnr8NlaC@~h?72uI+4 ztD{9fewypn8bt#~O-1|cM-S`{$SizlJ#xR%aj|n)Aw)ijWL_ChKQP<8@?L}^uc<8; zIh&%pC2SHngY@~(XnHloT%7k0a3)ww041vPB?_znwMjV=pToN<%H(jxhVaEsSRdch zp^k-Mp7>6!B#zlt@A3Tyh8Kk$#eZHM{Y_T?3rF(=>_PRUl73wDf!9LG*?jh)VJ!aagVXA~^*z0NKoH(xBqG0eU~)A4rtjd6 ztM-vYm0k|}=-9Yei%(#z$4}nS;ycds=7yyxg2%lXhZa5s*HOJ{$NaJ8#7&;#T!m|y z>ql`~6CBf;0y199p(;`8+Gj)(18Sng52Q4-e|#SwdeNYs=s$AYTFiYfg~?-*GDS0I zd0*L?q04j2AXH#n5@}+RzY0~CAC?hrwuK3Bx}YHR%9dPqR>-P2yTE9t5RKtc@6q_F zvKmFE3V!?bAR505dTAAWmi~fmEw9@NkuXlhFd}|4k4Va^%Z-7}$dhF0k>QyBL6uZ`?Ph~UbMlxa-2>MSXE;Gr>%m=G7 zmzp}K;2+$DjZN!U&Gj;Af>T;jxf4v#6F!)AQLHu|9ThH$3}W4;3>IPG`;%?#cl9ZkNlt@_`HCVQ|zYlj!vTL znWQ2)b_Up`^$Y9ze0{^Aw!70ap#H4XLoya`WkWY?+(U)V^7WwX>kx5<*T<3p{%dsH zoOUvg=`N431`kuo7PK$k_>$e4%d;Wss933;zsBX6-ecR~li`~|EWW{~N%<`{YtQU; zOdYw^RVnfz@=4b5Lm8eB?}nm6*V29Wt$}45U4+X--<+J}%>!4d3 zymk5f=Am=6vw%U{BuUP5f4m$btNUD$iaFPN7!s0!zA;7?>3+3DDXosgX?pD_!r@q& zwdQ)fJT9Z&x8(wdja7NWzBk%#DvdgeA2}V){1jQkkxCd$J{c+`mF)DQE77u6m#*-F zdA0ozVr?-TMV2kqec+t-e%yYtQ+vK=I+1^{n{Cl=Qy~Kpr%^|-@aD-vXDpSF^Hfzd zFS~cDT4C{FU|d;1SqMM!4Wf_KXo7KWGBw_Oc?^on++4b}yWRY*)~~HM?>x}QZtobn zr<)&B9*956a6V43PG|VKnOPC_T;*yZle3kiZK|=x^Nok|TXjB@ljiY<&cgQmLSTj0 z?EHRGtBJ@lTK=Kpd=L};*vLctY2H6>ZSlqei{~@16=Sn-O)Ra6x2}>DNb)3FkD%e( zfFtGS6a2=v`XHY=s-^*);Wxwi_(TtcC+SIpPuPC#QZ%)MKT;o}#R)4^QgJd)XPbTb zGe06A5sz=>%$|)frrpi{!DDXe|Nb{HUm!zDU;C;x{wada2(bpNwdgYFZWHHyT~gE zvLY|sI-}boTp|zPOsAqN%Fm`JpHeeIPt@C{XCRD{Ld; zDjx$ttVW;mMFfLmciVfGcQn@gG^g5?qEGHnMp{v1=ia0`VcN z_**S$av0&u1&YSI&PU!cw+I3~EDP2i`@VSBmNO^aFwN|Mf53Y3?W#UHJ6UEq`R;-# zT%P?(vZcHxw$#PwB!GW#C_Uj`G2NJ(55*>=x{2an+w{Q68axsT?r~<5H+df! zMWk)BsQY11FHMFNKXYUjct)kLzg$&CRmmVTQ0bEC?y*sV?pYrOH2+jPi`>);tP6LR zMpz@Yg!lKdxhZ?OzIKrE#T%BIPQUo_2~;4p%$H zT_?;CjC^*a-jQXj_UEC2|NBF8?SR!@NT~7CYhC|OZVJoxd&NcVh#j)(B>g>y&JEVx zx)pygSSeW|0lv(BtTBIkfEnt>BTr*bEFLvx_xUXAurKhzMk71Bx z;UZO)2B0;hP-P;x3wX!sDlu9gaeBCP*d8sdUHm=!qDq_~P zb@+%Lz+*f=HZ1n{oMmm)v&}ibQuQC$#eU91H$FOCF>gWWjeyl59`ijT1v%;~>7JbJ@E%BGxfaz+CldgAoc{ z)N^9^!BcgIg1c7Hm$1FNd^2uvH>~mcK~S)3`!j9J=I;b6mF?DAopfi;X((yyJP{su zzc?IRCQiS>SdLk^@eJuT-|IECY2GK}cm{eqv8VZM5sDc_TNz=;LlKdJk2}u1P#wbE z_LA)A%~x!bc*m;s8{hdkr(mMgKUc0qlGVa|BRvNF0gYF=B7c;x*E8(xnNsJaHxcL6 z-k!TeR{i1aISY!J#rc&$qr^~PEGo*J&3=I0qBAW~`KT^xp&BpJ1YRlPR`X^jp)stH z@F+R|dIfx*YtE7MO#{oIs-&-0o#o~afpCA3&D+G15o>G9lA(2uNaUs6ocmv8jL}0n z4>kzc{3oCIZF~AKe_NI#Zj?HkUi~;>$jBB#^XbqlA$_5h@LW;FG>C~9^#J&q?Y}Ul za{LIN@;P4ze`?0P*PCI>IbdRpn1hSwWOA)v@8=@c`-z6a;?QaE_x5PAGRjl-U?0S^ z*zEi4LLyh6Qt8Ua!+C%99G}-i2QroNmP5Ye8V#|X!Ee9`zEZxE&8@Bbh0lDVgay5O ze1{doEav|C^nKQ@Ad+i~yUpijkxVVkA$~1*6V?NZHeVU2zS70)lq6f5dNgD_P2EF`IQ zVQ6-z_<^^X--gxC6&BS5)eJ^s52c-?wM@;^@HhRm7rwmIqr;wxK|4`hPp07EgOIz| zTx+%uJw~Lw84DJq_gVVteN<$a-lB4-jYlchJ7UPUj63pxXa92NOlAA`X~|KY(=Sd% zso+d*E9tv4Jw#r(od)gV<^A(mmv{( zEy$g)9wEnf6AOdx;UeLLVupH`%;G571owLdo9KjQ7tM>u@XFdbi3{zIza7V`GB}=g z=f&65say4G8b!UmW3us#*1Fa3$}DGKfuZPK6?h-ZQI$sZ+Pb4#ZF72gX-Dgabm1;N z+uv_qdB8Y(hdm6d&oCNMB=;)W*4pWA!90)TDi!?d4!3ykIh!%?jl>Wvosp-sEAJSG zhz|;?ME2>%Hf9Y9Fx+C(u4`qqxFuOV&7_&J#Cm#P*!SkCFlC*?&THP(-S6Wg_J**e zA0OA7U*S1*zF|(PYj^%K=t^YGQN@ z=})SXy;$pUV|f?*C(G>8XEu{(HsK{I8Q$s#4w(G)h1%}wWSz*YTenz#y^Zi0D!Jd_ zb@!zTRpX(Lm}sZbmjOqThP3R^n)sry7qnLu54f~Dp83cbt?K5%8n*BP=3icz^3(fJ z&P}XoUbW^dk$aSRW_m9Tv8^gWanOiMxa920zMJ$qbH2~J(7|nfhudz`DAeB6%{8mG zj^f^3QtGu`_~&+)FY1P{PI-?owoB!# zX2BhZt!6a_pNi~e6dFDeX}E>jZ|Gsy9&<{>Bj;QE=SLvb__vQxPEDIJXlO(Lkr;mg zGrY6C{MLUtdp$cL;O_?g!A)wifRWAGyW58RyVqPLgJ>sZ6N^pR>;be(73^X|V9TOQL&0!O-DjLTGk{cz1x7(GO zI0Q{*ss?O3@6#WLWW&5*)Nckr{=qp1aW)C$Fl1)EDMd9q@qtqp>+OiE%z>cIQ7WO#2)s82R4wxwbLV|N=4 z06+b>#-q`amOuW;U|t#qdd$KQ^s2A7W(kN-5)!EsCuqFd0+br`#y~>>lR(}F+0u*g zkYKP<08*1m;*id93vjZDY0@0^%;9lvz=M-Z~yiGp`23x=~oXxVC zJpuA81!^bZpTP)Nja;!iPaY zc&lW~&M?^%oGHkadLGz0|KSGbwz^5LTz2WGXawNmCJn6en{4#%r;l_97B*w1m@d1F zH7Dhr&^|^VbaRK`;F9;;v9aX(%h$U_6$9l0cnU*tY%Q-eVVEWgdFZ8ic9X;4FH?W2 zLE&>POwFCSC&BLw{(RNhJ_rq7d*2iP08B0m#KJ=0Lgl?sSf=ZMsQyG66d61=_P;*W z`%$|+1GRo1K4so?Ji2z20}R~*AIJUY1Kf%W9$Xg^+k%{=@+%%&W3R;RKO5K^c8wcX z0YB@B7DBEo32cCU^eMpP772i6Y^eUFtb}Ahy4pDd}D;4Z%b7C{gU zd0fJrA_-IyxD)Uk5#|BD-(;?(2v~!$GZ7d>m+1?F5gZSteM$Ykz~ih|5-E5enB2|- zO!jV0f?+}FE8s8d+^XAnq+M~u?4JNv0W z2yPn>Q|I26xmBiftU@xlM_K`#Yk{BjN2+7NIN%Ie)zb22YjDH#1ww-fCxGdtzQ$>Y zq?F>A?fL~m4ZAR`=RmGEfKhnV@%cP|3ZxdABmHibCPQp9P7;S>`gWuFnAQY583Xk@Hic!oK$${ul z?9LQbAeXVDa{KZ!g42i%bl{u-#fEuUgJ9NL_AUA*gIF;yVf5^pCW#D{~ z?#I<)9Ut$RNP^xf_y-fgItL!7t_=s$-b z8t50?$$G_kUU3fq>A3k104Y^GQTWL6HKqsG`yL$m$9I~SM}-^iKvLnYzGHb3@1cdZ z+`(8KAu5+kS7J|`c@1*(jGZqUzjX&!yAoZ~Uv!tAF`FWKiK5uuKwW)A$1k$_S@dvZ zl3H=ilLGGa-Bc-v!xS<`$x0#DH?L0Q6fZ4!cn=6h;mh<28f5BEoFIHP4}XkCuUyy! z%u?|)v*EC9@=qMI*)F9N6p7qNEbN?2Q$68^SCy-tHL6wK>}i2Q;wI|zKU8{mk)NtH z^pDQRoG7&0B{2;WOoAC9UAHUakNmdE%C5S(lGf1$EI(%z>=dA14yy&ii=Hnf+>l8w zlo@LZZ}-XC)^lTB&)iP7Yhd)jL6*`2H)&oGKD>Gx=k>+zCetqIL0D)hr)lqX#{$Gu z|CGz@tKD2$l)d=8UXZCxz@1L8EL$ht3SJ<%YWpg`2v6^|=^fHUqJT{rWgD<82-{vb zu||(&aNn`}98hX(=KT$dLiRka2hE$X8j;VXV2U`|V_}O2*SIHDg(m~RRecCjw=?W# zO|`qh1JuPY-5w>XGCtPArn*ns^p{+N@4qe$G$X)sT%Yf)P8QuNC?|%ar7LjFzETbb z*(>S2FCG2x5PR{GAveqiM{^&@;TTstYOPy@?j{$NB)nH7qf_8ZWWdFBo`Zbko z=UQZ`q}kLo2wtIy5#Orm(}-A^PS9{WURCvfK1hpXn@rNg|3U5uF#q>vYljrEdO6I7 zR&8UV;a+lf(Jk4yw)gVHrYH6vo-ZxhGd!+i#cZsKoS~>1OCQ5#FbOTA3+D2;W-?dQ z9gnUa!H*jAZwei*h)M%Le5uo5t9+^dti3{sE^QveYE9|dFHP}`4+OtAr)0KMkV$C@ zWMHC(B`p{trjG8b+buaC?Zo=qA^ECYu&1^1$$4Ci`Y*G5IC;*TRHDj*+kGp&%H)Su zq|OnK2lny9?_$%s9cO+@A_Wt0+4&ew7k{52*Q+EuLV~KEd!nGYwp+T7ntQ<@zzAd%En>zvE}yH8YLU3 zS$Qy>71m`;+~4eE`g}dDhhoVb$^Gr*EItxV4XbH6EgnLJMegl3T|$EA2~R&s-^}Dx z+<74WE-L@@^S<;~=JPsCL>+=>D7$A(M_Z?4yOk_b;Gm)cZ2PGw{JytpPiCGe3~BV8 z%)#o=EmcpVPt>*4&dJ?+4WFEKk!<2#5mL0*{dC{9uGUhY+U4QQ#Pdf?vc|8D`4zh> ztb=d(1`*vWz1Oazk|$;a#K?>3#Zl}|6Ah~`K*X-TH?!knylvG-8SqmAMl*gEj})}Y5i?VG`mFUWyl=WvO!x<59L#Z zcM4P=e6~Dm;f)ORBPiESs*1&c9AcGl^$$NAFZXhWmwb?64=JS&B*BaW=z8*G)^w?f zsu7A;7(};jUk~PGK`(MWf)kKm#wO3x$Sl%SS53r)@F>!DCE9ioL~@?wUndD6Mq*E> z27ZRr&P!bldCe6~pIOu2xfU=;k*2+%ir0b(F0D!AHZ61gl@(@?9vMl8G{U?=MXy}( z)8ojpYeV62)!tHPOW;5Y=w04sFZ3MqDekwr*ls{p_>nGB0d}BvggJRK(dp_aJA={D zePFzb0P0hNxe(r4i`jTXNikw;`7aw87q3`R{dSwyz-(BVMu#uORg*QEgnjJHvO6+` zHK-MenYBl3v{2a-Wty>XmCXigoIZ^AYv~>SPo6noK16zuTu$$~>6gG8PeEb`0fa6R z;dyMWnY?J(v84g=;+jt-)c3o0%CXu9rLr8u5Uq}cH{iD=;ZZ7~m+BBclt1ep@!l|5 zlbr}G=Q?)<&PaX}Lg1OSSZvhLqAY1VC^ZhWrp$sVPTab(#O+zy(M-eLXny(>RIW~- zk(C@6BEJFENRPJ-%hm8n2Pg&Bny7j(!7WkktWxB1Z8(lG^0mNDLg_H<3TdzaX~@Gp zb;}=J*B5)JD8GxGSsh<@k$=JrW4PJybXk$}Q=C+OUkeTw({M%cHI%K@^(Arj^IMXP z%Pxs?oQq~wooDC=UgV5jdKqfDS$6>#e5PIdnU|@0Bduh_>@!MnqFlu4VEh5@GF)L1 zm+@w2x@%Fvt2|D5Ugxx)wPmxPm$m1&c235Fg=43>ccAE!^?Oyn%dAKb4;r`873_AY*G&c;8K2>|#nL`;__rjjOy%3n zCyS{-PQ4a^wKr8w*$e@au?T^_xTHv1bz({sEXC3Dli+beZ&m%E@0M$TPZv%~FiBN9 z#APQP01J?3WAu8ccOuQVBD};L*(I@dVv+aP%7A+d%_oOD@~rGtrESv9;o3wiT~wg$ zdh+gakV2^fO_&u!WD-2<;q7e!E4K&a@!s47D-lyiep^VWa5_w)iauSB=Y- z=iwzc&Azf@5~>xMl?xqA6@8oV^jo&c6XqK9!fYdj7wKSKIOYT_KOBCyRlz^ST?uc9 ztQBFluEfb8GE|7uO^{G=tJ#H>dbNs0*Jh2&G`Eh4vfmkG469Pps>yN6iGEKmE2=n$ z%%OtUl<==zVm_#3BmZuS((wdq=BLcksQ(g=HKFBi^7w3gyjzdu)Hfi58x9W5l-fLu2RLlO3U@C?i zsN>DIS7B?ZOnz{7L=zVnI$um^MIJ4kaCxEw0pQ7aj{S;b-!&$UpG1+VY6 zxVo$^lbjPx@KdK!w!7g&$L@Z~?YKt&=w5j(D71c%&s4J;WfK(R3oP$`sCs(E#IAm{q{%=Sz4%lT z@sASqo_{IU)qzWUr(aZyYaJ*HdFktm^OX!$K2hYk)Lk_$G-BBD6KR5NJS}>jt;S+ zG%+bW9@gOL!aQqo~g>Fpydw=n}x67%KVe-Ud#@HB} zweY%Rwj?e+%P+3`=ANT&g${P2izyiR_=Ds*V!cG`9lyLfid_!luW31uU zS;o3_R>a66PIIJO9>H88JZ#OEG7-xYfc_0qmZ=NtkR{FXFNdG) z+YH>32$!5l|4L$+(qs6a-J{u?d=8G~G&M%(^!S4vbr@dey-doM!T-nJTSryhZe7C) zNFyLANGl=TAl=dkh=jC&fPg5mY3T;(l5Uig?nXKVq`PZVo94atea?A~=f3YVzW=^4 z-tj(T@P`B0dtdwdU9r|&bIuj~9FoZ&g zYjFr~{>E5TZR9g%(f86As7x_9``EnM;Vtz1KwCGnKK9JWzco|9yn}#f%FYEG%KQOl z$lC`DBCbs@K?Z>a2lSdov828JB{r{+Dg;7cxV_ldP);0Az`k`@a0Iv^OyCj@V)lvL zUfmAPIen5>EVqK-?A$ATg;QrFR!Y=fq=~DJk8v7Awi9F|wbPIpkddK@Q#VQK@B*Lo z6d^BfGR9*c>TzTer$}382HWBHUvDV-7^z6h8RgQmC+K7r3DKRdw3_w8V2Ot`#?oy? z!hqmq;DsKuPUV*^LhG7U!a=+oAc^i#U$+-UlKjgLiGXJTnna;a6^KZyl8qO13qUhK zYwIXQ9)^=LXEYBGT5_rpO;I32hMH`XS!88>`qA;PL-Q41DiGhUWXk`cJsf#}g42391NaE64%nBrq_>AF-C=_<=a~s$An@5pI;u#dWf_o1x>4gDyLJbgkx9I{Ah+65^aHcoYeAvdp;b&=IS}XA9xqG^|0>~sA0SXb>kBd~?o{D9Mhf?{ zbRu@9D+SK}l{S6IqVFC+@{bYS1*J!Flz&ycv#HzVN#&Kq%Zcg;WzaD041wC-fTYnH zV0Zzk1Lfg#*yk-YxsiTVLjb|ub^sVt#xR(=u#_&Kuv;5c3;XsJF;1gU+sO~;d&7x7 z!5eo|AcxcM02PsavVi01qR92Jn#Z@u+kyngoax13o)0U}VPJ38f^9WwMi%j$7J-`b z&p)H+o$+DMBvb_IG7B>Yow{9b$XE{GfMZMo0Q1f?hHI4CGM9m3|D-Dbg&mPS{Z+A^H2}yRB>XS~TbCImru-j$ z2!KnBuk6?aRm+@f;6fr{n*b_X&mg3OS}mYap8a$e5w440hh_S3?orNt78y4!$Z7y$ zIX!jxAiTi@utu7LMS*=pOsck&=J;5t`KJ;SvJ|VT*>RvPaS3D4GyVB`rFP1x%Edsw zp*ataqNz94m!NJ147jCe|k^d`BkbIvFdIub(omnN}z}5>_==Fwy0m=&m8wR{M zgce4JMDD<6_FF3xzgidrcwG$@s*Fp`cfbNZ+9rgz9km|dUq9}$U`CG!lv{BFt@e(L zaP-tx749Ch9V`FM7A0Zu406IOvvNG6J4p}XEBHp^P1)20L-vvxh#wD0%c{!qRxLCEzMnbUaf4sL=tj$CLF8L^;ms(r`unG-T;4R@euNQIC}d- zz`)-O<=T z`vgX@aeZ-Wa7dxCQ$U&D``|>?S}gakx0z&`7~b1hJpP=|Z36zY>kd0*R=*NVa0aK7 zV>OM?D7t*m@UF@q&t1LQt~_}9eh$6!xF`^hZY{gRYwY^sq*tI5rQQ=L>F#-a;r0g2 z1qoQyDJ2h1IlqH*V-|}-c*dn^vedSQHwEf!kBN(t?k)8-Ayy-(bS_NsYmk1IIxS&` z^+ZuJTuDol9$*iFWD+fDXc!N_L&Bfy>8yReO1#t$Y(Em|SO9lRZCX>!pSO!@Ed*Eu z&Lf(arQpnoIbf}JJJtKK#dFw)R}~x9qusZqw^rZ`W+fjufvgAubCxHH69uMogZ%4{ zx}4>FPeJX}89E&HT@Qbom5PhD(9^`Qg5YmoIQS0Yf2nZG$WU$ETD%k1+alEC& z$#-#bw?^aTx-6%+1$65`w?j)-5T93ITYa?i6p4HosL@m~I96#Ry`p5|q$rdO<&2RSP)eq@=Bq&8l@+}(X0MMSNn}3>@y+cDc{n;$M%Xua23;oe_`8$#Z2?k_ zQ+Rrgc1bPkU*7+ZIYh#4}gmafjN=ahJ2O2k%DY2 z?C<|5Ks4$xWq3NR*0)-Q|METYKC|JQX5svoK|V$UgN*DbNP6(sl?8s|$#xe_!cZEW z>hGsOG4hko|9<%2%^d3g71Qqd4oSPhVzqMSL+?A!r0029Jd@4L0B2WRv9=@q^NLa7 zMNm{C)&`7&SdHW%>b{XWJqHooiGS;Cz?Dws>Zb~Yfg8kUokQ8g^~+R z6#`Qwg5d9^lI;t}Ai?^o=3uEs$FwZueEc3*SrxkVm4nVtG2G3_9xyCy zm(D*Zt9!Y`mRC(0VN`*1_lxO77%22 zpJE#wka9lqt^*cMv$LQ=NuWq>;{}4skqYzCPIz`l5L%Zm<45dAuSxXvWpbW;O3mp~ zFslRLnGVExgmSE+{tb zfrVrX%K4E*d>UFN1lY!aC2=w*={Rd2H&4AI2x74N%IV)a$NWKjaKS*YKo&#_UCM5s z2ZV&RgB?RrE58Fai!pjudRzCM$)jTrPNH&%lk<+-PTC={Y^Q5FAzD zJhvPWxpm#omLh5QltK0*x+lnY9|rp7joF53fspvxe&rf?6WN2zyCk`%+=OH-p53^9 zVo+J+dS#TI$9x7FNtFsw=>z5*?x}+y19}&|2kN>@;cBTN`ydr~l&t&}4_MeWq-sc} zR96851(pIl5VL;v7BI1tcB67buF}+=<5w1Du&h?yk2lpUCT#{n z7w!P%uLF4p?YeP2lq@Vig8wf)RwrdYqJzIt?P8|>{hIDsrLHEp&%7wS7@RIdbg zes9!G23C4boAAu2F(qaS#qT1bUNXovZ9t_7E?2AqT$M|=y)LH0)MkMP*eX5Im6AGd z%BUs)ijRls{-=p?{<1v|0B3OMIj1HR886PyG^zX`CN0rriycxrD{ z9HNRf;0hxcPO@hY%mqV=Y=$#@&0K&tT^*qK{FoO(WRm1X-uyP})3TZo%<=)yyHbeu z_>jMY<9Yyt6p(g`V17n&It9=8uwBKNh-l7GHHS@J^-9s-tu&H>FvClT*w1iU{;q6(hk zJW_N;w=K4G>%_1C#6L&Wn1H+;qVHe_j8@&-d-B!y&>Bjq&iPixu1$?bkH`GPeke^$ z4>iNR`6Jkdu-&dAWy|1W{xP%*j4dQL@ITw`XR_x?5rPnGHLBL$24&DuuWI_$Gy^_gE_CCV3Tb=bKKkURj}OG zI@BOe6%PI_spC>YAV`wyL?{-7vT&t{moCIMe+Mgm)CMa2JRQLH5uix9nyhPX8Eske(Dd;FnqX&9Qw z59k9UoE{29QXf)e`t*G4_O4o4xR*sZ_Tn8IOitv_n3a5f8(wjDom$j9xusaD7rZtY zgq#c)ejt=X%Go|sTT5bKvWE_?5__|yTo_}%XV>J+a|3BnW`!a>2J#2UV!WoP-hn~$ zQBc!|Z#q@hbJMLwShoIn9)b)qSI_Hge7KLu1Bzv$HRy=ny+8@1z-C7NrZBNQhZ}%% zsL6BzT00!<`du`OVq>f(Z^!cleu4oa>g5F&z?AAv6m+JZns`HA^wEFkl5jPiqU{vl z7!%?=^ke^#qr^VMg8^S5IlIGVDot$d2Gv9)Gi>!QG?Qq9!Sb+eMx??`hnyWOx|8L$ zy62QMeqc5to!9}r1caYTT1o0`4Fa^!Y?x@4y0wK2>f?+CGn$B=hMzvl3H$H>_2^9~}+Uhla;4$0pF~>%frPYVwGvLajVzzl;4pmO(6b zWyh9+wn!`YLE7H12i&FVQ4i<1^U`Gi3X*0$bJl7o$|LjnU#=)w$z2i{i#74Hz=DY& zl|`3{jO=%K<%|N3m@$4U@uD!eW!<_x1vw*jQc}hJL70h!bmXA?BK1n9TVOJr-#U*ar~9x{!@HVz7#PJhD_RwEE#O z_}r=+)q3qP;fuE-Lg4mp4A@J!iZ>vXqv>@@Q6NghlGGea5()9_S?P|t7M^_I^o2cCQ}#6~C6pWN%|C^&;DiVhfb1IA$NKG_{ge^PGXLZ)u3grfOAmKCaD)3C|p4dCG1d;T|R&;vB3+LDAGyyF-)HAw{)>UeTd)OSZKv zeloj9mp_noLgQdH5?j9M7%910UhmuZU1D8pnQ>D8VgDJ+Z`Xs076JjDAFybx z82jQoFzt+!AMyB0yTqO4?ph~1wgyaP62UicoWi5=K&DBA__E93A)|@2?9O3E9S_7z zE=KX!Q<9QC?*IWNax296*0-88USb*GmCYPft*uj{7-E@2kfqszmtQy7Fw}`SkDdjk zerM2y#6A}4*#G%8ZaF;v4P@jCWGPUOtF$bjE3SMnEq|!&LvGlldU7k@4yX69DyC;} ztsh^UItzq~{Ur3HAl@{9$k%D#=kNv~RF~!y3K3#w<@wRsD-k6D2_2GAOweZLZX9Fc z9ZtTi9q61P385uV!V}wKdAFP*>iY?(vf5BL`J`Pr#=@0`TjI1>3t6W@66Mm1o{C3R zjX{Hzgz-Ov%PW6O=_=gIV0qyYKcLYk?q*PG$rqbVAzRC1CkP%y-;z_1|C4hwH>#Y- zgfnZX8ViJikYxMbVuNYy7_F9m?vS`uDVuBQpt;-Yyha^YS$o<-ic-s{%Hv;b^4gz- zqN|1+9X14mn|gl-j7X3@X-hkC5MQ{rbC`rO@GC4EqKmrrr!!S22)8Y41IwfnHG-vW zRkjm95o8*OcZq(rl2j>IircA{h~{d{FA$dIQdCp+l{|NN62jn&N{VU(v7)qK$1$tL z^=oeZ6eQxqfD|uoY(g!XE?n% zdwvk^n?6JRCX0=Ye{}VfR;6RPzbrLIAVnGyR*H-sA}1?QsKjO;a$-e~;Uh3k(jq~> zC*)-&n>%wXu%%Tm>~m+@X{6b%owAXX1xwc}>vpTzOg1rU6yt*;iRG3QTWvexVTnxh_>i(OgBGnCLJ^z2dS~QNd(`7GMJW| z;JKQcL7unXvk@5A>9t6&Bo3k*>+;=lp?4pkJE8fKX*KGw_-e9JAkW@rJ83(XL<=UYTGwmu<)2?++v4JHzsi`>ASpCQH$GhwABD!pnh z$nmFsOvp#=T@=*Fh{~t^@_vwI+b&qbO>>m14-xVKgbT-}D~xQp8yUu2Tv>q;?`#iZ znhV}*wooK&1|OoMLqq2Wt%%-?gew(v3sAuaL`ztRNRpLj(G)3tQM77WnpHniICL&z zQ(MpY1}}&pA#iEJO^TBm&QgGotZ9VWcq-LkJH`aKA0}MNG_TT`Hwonh7#-)T{mif} zjhZ)rA9F}#ImC)I`Nyu$7EW2uDCZsH(9hK}h=RBzhQuC6I`sSBbbN4r;FIQv zvl}Qa;S7FU6c(qjLbheGX7aH*NnVb|P2KH>JPPJyP)NGxmA?$Jpu}9n^8JBZ^?1*| zaBziy-S;r7f#3+CfEwIK$r0Jcvy!>*QoI<=Nx5#<4=Iu?xAck zJr1qH1drBGaaL+$d5+=LNU3FTg<9AzC`34D*KAiNNLL5)?che@8cF;fOib4-G0lmX zptH@6cWyu?Ig^>D#{e}S#Py-;9H1EBQN*VFo<1a;Exl5cSb1^%A5o4>W6)~@_3{U4MM8?-szY_Lr< zOnd0jhMpH`R(;BywzbVnpTS1JN})kTR#?u@qT-|c#`cNY9huA4n6f!qK<9|TouyZp zTmrMN?EYhnWl79L5SKO_v{R0Ucs^1~|6$`gOCq2jXvJOQf7oUBG^a>~LdzygUA|X< z`U$nEEBm49ve{E~J^Yy0Ho<}=!e}N+b4#nq+#X<#$6i5*EX@Kk6{zGB#iO{xf1>+; z4oYjrA2Qly9wRjDQs-}fO-K}0tfM|5I8i}?mYq7L{GQBBAo$}lnRb}1(CA@Let1^g zIN|7F6kurogq5E$+TORJ^5K$v)}C4Y^O+5_{;mFR1&Fj~NQqzA)X5ZrULqyZ-bHr9 zgpg)@)@ELsVV$#FMMwJC^GbKwWS8Lxr$y%hHg3D-U#b9E0Lok%H4ohQ0#L=a$Iazm z&1La3@Z)PI@v*||3M;32ir3rK3qIuba7*#j()}k+==lcWkXX(%lk?AT&p!%wLs@8C z2_3mfb_|aUW_1la7_v8OD8UH)^|Nkt#G`ar)N}qNVz5VM_BzfjZONUtq z?q_Qt`*|982{*0T5#u5{suO z^R|!45n#xD(5c*kRkk^ldwzlP-ZC&F<(z1Aa{yQ1bz{C38JT}~z^PDbsQ5mbEQ1$WZN+GBfHHJ)ASWc|SRYbdIbXM;q918qj5kyf5$a=xZ1 ziKb)))6rvmfS{FMg2ZM9z@F=Ru23mn_bW)3=vU!yYPm|*{$vh6qSg7Ye~`QEEY{j@ z$1>cQv*WnU#Ob?l8pzMS8_iMdV59s2FGv#v7dO&a1X%qf&RS&-6fo&`TmbOwyJ4;b zD+WMVt}&kt_yd6zZNPi`VxK{Sp#^;L32w{rJ~D?%!y^0b@jcM=>I2+CP6r^?UJP(b zhThx7Kn`zzu4NhF#qDW`S0{Grzv0#tIxEntFY9*r3Xnh4x%T|X9~u#780db}u+Ly| zTAKpd+T=9=B=&#^uE0`VsyLUK9rYH}p@UM2*IEE9IqwD_J!@bE`W3xgj#^0(=5OI zk4rnW|2^i_K(-VIzwQ z1%O-`C|->-P!jIL6Sg(*(!AG-NT{}MAW(J{s;IOB-o}#Gl6eC|E6=L}(E#dy<@AF@th49+K}=9;l|o-$5bA__5BA0sa{)D@0pFyqURjl6p&m;nmbTS7+L#b%2NO_FjW>egD<0(P}Md#wK;X zSjVs@7C$axmS6n7iX)d*5HS8T%f$r%3TMZxR>Y75)TdJ-Y!~2cx;9JlBI|LPg3<0K zRG-gvOs)@ZeIzWBwd&tv+!dH@#h*4kw??b@nN_gud&6EOX0Le3e?|0W?N80D%Jl;&DaBYdTs2w>wt{aPdfBbNaU^N zL;%G)gOdjiNl#;d$^t?adm5WKE0{AJ%Sh#_MM#k7dAM4 znl>nzH~rwc!$k=@*_)kq*=H+h8#z=;dDo2mN;vMjHM&UaIaK@Y6;4PT|6<;#=?p3P zyQ@20G}vP7EG#Wi6hS_4(jS@q5YreT7@ABI@hKcTMbRs_T8anx1ar_>VFfnwQw6GY zg>%jp+E7MZ&QEU+-da9mQ|$6tP)YX0bK=f?y+AnV^2bIYG@FXOxM%5uR8IjKU3Ak! z@|Yj6;;E^J=iaU>bR~0`pyzsB`(Q^OV&6^wxIQp! zC$>d9>O}#J_cxyAkhHA>jrZ|f1TDGD-JVIqAQF?;d@;eE_pgPhlOJNU67$h)Jp$OR z(=K-*1-zwCy^7oyAW1eFGaC-;gOgoY#i7ZcczxY?C(pAAe<}+~_v5G(?)qP>tGKNS z=lctC8CZNq^N!Vcn>0=+F)^|~vX`Je;8=NrNIUL(m~z^{4?tH63IrZgTME!w@8)9w zqi5t4$-4ObrjKkH(>$}e6?b9k!d;}%oz3;7&g;?rVe*lX{pK@7B#hpDtj4CZ!l>9P z9LM1B{j3k}>)A0i9m$m@JzPz7pgFCBBhWHl&dUnswU>;K~cxb`1;bH&CDAoN%J8~ki`T(Bm z5oG>rb+Z{X4qh7>fIo*lzzO>!4u`22$jLY!Y+hD}$^7%Ds-zXThIM5&O>gr@D?8E%8M6m`4s|s3(I^Ty)A_*J9(_9K*0oP&%UKA@YAhP_ z=A(dCn8m7gfkU{^MT0i3nb(IKd2@4VQ`Jdgd3I$R`V*#l*lF+E2?Myu(kQ6XZJh~w zdY+v4$QXz{s$!6WgpB_L9564jfMq=cPsk5PLK884!wg)fOvQr(1Ay7<5nblmlMpQB=&)dmxN!Zar0zxDM553?GVh!v1UBgk=iLT-{AUXk!NDD%&Blv`pVWE{EW1j5O+0^Ar~5R7goW=e*HQHcb^K z2iJzkKg}+5-C@*xCtE*z z^=;f9QjAPdpCq7Ic3|EO+m9|k0^|ofu8(PK_kA3`I{L03YrzBWoR@Hv8DjC!L)%)^ zO3!1;NisZ(SN1U)JE4e1sf-o??;H40hDf|ofO+9oozJ1{7D^R$l`t@2?$BdX6z4Spumat6+XMx=n+3psXVafs>* zly?WsCzyA3Wku%Hu2jS&R~VieD&E0bCA%BxS$v(>f{~*x!L=y!6GY;ATiJ6TedzYD zs@KCW#UYY>-4?P|5p*$_DgBTU%^YNmMUlv*RuL<&GVD+H>c0QEn~O_&0}Ep&&B%#Cw)uW#IaEOwKq&ByDtgcHqW zn9T{K*B>EMHc@n=PF$hAo`BeJxZvfamRu{MI&NVo9-p6B2HKnP^~XHBj{3s`Mf; zdtmZJR;S+i4D>6$7AL0Nj@}&9)9Z_y~%3KjIMu@ z-Q_kq0kTW?#=WVi{nmp3DOA(?im+OfjHgEEdRZ&q@dpX(JvNl#;*;Ciw%8VY@{Aa^ zi+jj(<snNOD7Jbb;eejR?)eK^;+W#=~)^H#Cp<%OjzE7lW_-KszkU=_=uTst1tMNxjh7TuUKFCCj( zUI|}WSF6@weO~V^@YX828OuF&T7&89Zhu#NCG$9^Z#g!bdFfuFY5I}*#1;S<;p|0W z&tqI$_etc-K+mTlIq_wkqiC{BEJGOC7H{08Vt}?f~X5Fu}<2?~kq(#0F&wwh6%6k4Izh>h3QV;~Mx1*EXyYNOKZm6qdtYjf& zGAbr7hCYOBnvEs2wosn8Cbf=VmP%1GV~q!;3+C&<6(6k2e7swH@A^P^43!Xm1JIQy zRzzgl5Lg+vVxWyu=LYlA6Z%(-%8+9iVY~@&@CEJYQ#J zksk{7xA-}^CS{KYRVufS3W|?U$_*P?o!CAte96Y9#MYWN5^T!e@jpyib&29lH-fZK zj;Muc27CqKX!r-V(yU2G=br50{H%RKgsh66Dmv}c7%gAsF(A}Ovr>A&PTrCUfx8Q{ z{;%lC8C=7Ml^?_frkFc@e;Zjneg2_Jt49!@mz;&kRmsEa6@HUqDU&^Q;qCow(r2mT zgiZ$HBF)F>z6TLr_F%MDBjW*~Wc7L#!d!CYhFczUPDkO#f4~U@w4b-L zau0ZSZgAZ#Q%R?JV0P|u){38JCKp6{oh%i)v5>BWR&&_Ty@gy(L-yEVQhZO=JMi2p zFZ*limAi$`VT&J?-L9RM7)<$byHf|9Rurg&f@yf4{6MK1Tw#WlGqDEEs3p?Z`^rzR zt1)d2uhXF`QY{QL+H8a?JX&bdIVMp(M zSlrQ2;L>1W;liMr9zScy1|JkWze_6ej^sI_*3` z^CPm;K;fa>t!SIHmB>|;m7LUQ^eZ{?Qf#M}iH?4?BTB>UgPMEBwk$=jB4<#M@*kJ+ zl+e1ntBko?Q5FFZoV#}lZ<*o z^Eyrk_GBxmCjMq-iquVRuV4Q~%17^S^*6sp6sOh*{Z8HPKvm~AFLzzo;bEbrb((y6 zL<1@VozUw(fe}MAdLN zUoX>Gm|fXjPHR7_k>kfGcM22d6U3@5ITGb5i19sT(*O}z8#Sx5U|#%(xXZ&qfs_+O za*67Q^~Ry^dXYr;!BvF?Fvcij&J@b!bTRkc{Pg6nW0i?B5>9WXu!>+~GUGe+KSvJ3 zatTHsF9%1&k%)}mf7c(-YH2Rdf0whko(WSqltFDIEG{>>czZktw&-SzVK>1&aCTz; z+UX)ZH&lo{R6ovSeq8trsKLsRQlBd5ZegByZlc%R)iBagvRa(G=`B6?8k7Qq zNWc(`y|7OGtECQRc3iAuQDHC4lw?Ask&og+Y4CxJZmarN=J6-WC$?5KCIh{+2d1rz z5&7c^i>y}-_yu@c7yBO`zA+Dmpe+fhf3vy2DkR@{X8mrqwqm~x-GkR>$|&}XK>8n` zxAh-&I^IXM+DJLf2$;geT)dB|V(Lq1iA3-d5Pag}kB$>6(WM=Aijg#BXx81Lcz=G^ z<4kJ@fjbHJT|B?|$|wJ1^LTbXPcsTu=Iu;+l_F)JP1l^LjRh)pf060Bqp&DhKukZBK{hJv4yD(ua2vGU8BVN`1eH~E67~z4R z#p^qAdjEXKe^=oCs6<&vfhu0%4@TX;uj1vggOPHx+zgGB^b=xKIqy?%$bq|Nio#g+QrMK;V@9JK^)U z!Ew`q!FAqCTls6*2R;jF8lXb?GpK&#Z^StO)AJ+&QULX31eL@8GP8{EnU&Jp4En7& z{@dU}fkLCe_Ab5Cf0x2)k`cCwJk-7Z8{n)t}4D&!S4(@(t2b%tQ zCIO?wAdXqkn`jo0QC}Xvu0a8?vm38bJL)Yj~8q^EcD83El#xm<%)K>zfr#O2op<=OKLx%7HpzJg4E}7FG1D}xf zUh}{wvGH3)>xq^uj-Y~dc?5v3y}xL>3#8x*222h>3zmTa3R4Y0)+gP7(%HKC(_J-N zIP?E0&(QZD@a}_E@X{Mx*am*-;82}q1>2jQ1$gm`5pJv}2fjpl8vq`w^ovZEjtZBH zcH-Xp_~edhO_g7w{F0%Ul|7PuMPv5)*l*TH{i7tMsd-x18hBQ zF_=n3OVvy$;Dlx}4^TkTHL6Yj0ZMdEulO`kbw^bO04;jTU1d_`a8&c~MIcA9v|ABU z6BBG)<){%TUHFl=K>4K(E;X0$98Q-&;Wcdai7dA4BU(V~mR32_Yn_c}M+sxo8f?})j+feTD1GO&e#&c63kRGf766H=^yJ4xD!M%98 z6QFmu1I^|$>VV(pPRYDGpvvAP0_A9b1DLwGY1I8pU58&Csp||Z6NywzixK63={}u4 z#(bU#YFKbt=qw<0F6jXUg2=%N^%7+vT(!~FBJ6>xXqx=Y{*WAVC48I0?f3;R&=vgJ z9AkE(0Ahq??VAH1(I4Fw!1FWj54ApkPu*@7o7IJOK%Mf~sYBkA;Xy16UZ)C5as6-w zfKSKwwAikCrU@pl#Cu6%T<;8g;{3F<=Mp$11RZQ3LD!(NdUL~M9ZYAQ)Oi9-Chb5) zs=p3Dya*@`1fRvm!axDJw*d_QX0Y0Ecj~8pQg&aazP7sP0j1!5>xL5z7+8JhAI|sc_P?wqKOfnWjCBE=9jN|??k6u? zsPut?0mr`~+qQzuTxSc*L_XpDJ}8JqwoTt#Zp>3FSKa|5grz1Z#dZK+)Rz?Qpf$A} zC_hxp(+T^~ekWws#xKPCf^A#HH&O`@c7Nr#4<4X{{38=9X%A_w5Bt%~*O6MW!h4;h zHg<58{G8`&WkIb;%90kUJttqsCtZ<9uDx+qxXBwL8+7!%_2T{FGou#~V1*Yp>X1iP z9y9?ZxSPP^c~JJ#(o>mw`UuXWg)44u-+K?nBsRv!#S8!YWQSks2%fj0Bo7d{{MtYp zO)m;2cv%J;0xTAL^UL6yyN+DQxf-rL?*}#$PU|{AtOc49VtDKV%fAI=ERvOb{!vQL zy8YW+492z0LW{(946ri!*S~N+i>*8Y70*jgeoI_jI&-irg>E8&1hW<>Iy!Uv@1C9u z0QTRNlO+8(YwPK}hX<LQ(EvPb* z6g+t&=KmjO7bS>6)w+@IKibf=%pHQX_D+$QuY=ZzZvb|+PN26X!YK-D9e~szm|_MP zblB$x1VR)vD__evl6yz$WI| z7QIuZwL!o=b0<2?MO*`LI#c-5|M*0R5mSSWe@0X=_*!WWcN&M<51V373SoVL0P(<92Sv}L7x5n?ARRg(H}M?OXPhk@@>f2az!C(;(Myt2>z7OB_Q(zQ{F8uQ zgw_QmhD53_9lnw3YZdf=FB2otr1cxz0JcUK9O3?hfXtL3R-NnbAJeVkSae;_2{8N( zl(d1Pj9lqx*u7SUu5!41$$i+;UgfvAI&Bj-FP_bZNMYt{rwTNaSYBXIv`-LW=h-xv zyVT00S`!@q1J8igg-8b30AyOsY`rf6-Q@w@QFNCEn8H7J5hLV?MXnyYF1>7{B#Y=k z7Dzu+Y;V=+7^gHEGIzq#^#G^#nK`NFwY2Z_lQBq#71KA5MYh}bR?p@$~Lsg_eYMhveCJ`VRfP|W?Nx$!7 zIMj7*2+^3lGfI)??-3wQtd`5Bql3Zva4Y>`Mkbm>Nn4b6eWIo;Uk=WqmEX$(rL!OC zH&h4gF`d=JMYs!u041h>Q}fzNZUS6VWF05q1Uz?$c}XA2!t{}jVPC7-Ocr<`r-pb9 zJ8HXBRT*^T=5eeNV%MpL@Fh5F7A!)&*FzK&GE&zx2}$FQp0}%&0=ev5RLJRoH`0Ya zQ|x#+Wtl&aIV5j>gjV|btG*^i&rSvnH~?|#YVOSi>711q)~eRyrPS~5JH7`BvSp*O57sLL z&_%-_+On4#1HL9H_>HPvT9*L~GNw@OTw=RXKb-Z*o+t9j^su>wo=+1YEsXXA;X$<| zYFlg<)H-G%QvNmb-^8tA1yxYw31Ys#AB^OIsrKRcvR~Xyx*u3=o*^|Z%<_2bBL#4S zIa1dW)%0m9Om4$Kh#yb->3p)adS?9ep`InAz9j4sb)(h;7}NE0ZMS~ad1h>1oxLQ6 zWYcf{uNc~*BAPygZnpfc7ru-8so75PE+XO=5dP1ye(uG4uNT*cPhKzZuDPo@CEpq% zL1|Q?|87f%oxHO7sdB#7+jC$Z#X#7nJZON^tA5{yMH2gH+~8Aii5(ED$*8?tiYO6f z;4x^v)1^+|OBx)*v0$i(jYPKRo$mw;TEwpo+ue|r6jB$li*a-e_@G{1cr%Qf53q~9 zX<2>A`5`#(Z4}}tlUtAOy^y9z7!cPg89=s-Q*l65Ms?QIJtBXi{)X-!^z?aF6F+~A znQ7{17`3dDJ$-&(F1qH5s4j@X_ULJ3jX+s!_R}=|Z|32ncKTI!^Gqi}+K|KlKpjK5Md3#jO+0Hv9@tmuoTw;d# zHNQ>|i7_su{`ouS7^fJM-DPoe8bO+!VVPl+&U+j_FE1=^B6IE&1yd9!sVNKngkc9H z){m1h?wCbZn{CRBY+1%$=rPSdGOlGxDPN(u8+%IoyW|PS(@#207F9xl!ibFnNWJ&9 zn$sR&6O0eC8MC$2N+{?U8T1HyK#nLKvK~%w%=&Q)X!-|i%4;s#L)J>%(bRt76lgN~ zTLJ;BbyEuBC0OP#iNy*9-K9`-!53y}7IR`ueIdE`)y#?Q*!%s&oHei+$9oKiH3gB0 z@uzBWeK+Z5MQmPC>+U@?4B$m%PYWZpiD+%}X%X0LCraSP_A}aK=Udr*rJ%Un{p>YP zy=EHGSIfC&C#IRf)|e9+;sB14D$mRgydD7UDa(e|2uQl~d@^LOfZn8+!xc zzQ_dwp?7YG3v6#UGh0F2?X}@e@Tx!8#%26P2hScu5M`hYuE+7PR_MuGyo2AxW4tbc6i_$9n_LkyMUI>ZEvL!x*3RDku>a7?QX-s4rD^Tue|;t8 zhe@_p>v%b+mf85A*zOsGYhe~gA0sEyyu=!j{Q0;37X{E*`u0c2CaWY9M{D%ReY8p@ zp%`~VeCr=Z$5;q1(pgoE=Q%>}O@ZwYcO(Zz|X;a&DiP z&wTHUz`xI$bf4^5b*XWevtd2kYu$_L)@pQ-<(B~}ovp*DcG<+@q&9<@Hllea(dod0yq zJm!v`uWp^g$!LqFWYbv3cJ52-TATksb@H$g2y|R)g*m=*fyDT!#3xVwVwo-onXBuR ziHWKT6ZL@z!Z)=}F1B(0DEea&mZ?AO6*!e%g8tsB7}8dPC{V;~^GiM9WyUiYcK?%T z0LTP}9uuZo$G?qX{Erd*5483c-PUX3&K;_kvXWxzlW-3H&f$x_|47&WhmW6T0sj9b zRv|UvzgYYK^EU8*c={=Vaka5ftSbE$NBqyLMUe{NPAWf#o*Mm^q5OY;Jn(}9R4Laz z;2ic|o~cx_JK178+Kl_-{6ctpSnKux+#4H!sxS-a|EyL$>8cO#T z@nd5L?hL8Ih^b)L)`EoaDY^(iKF$w-{<`rJz!+qP)$R!shiO%~)JN;;#>k{K(W$7Q5#`qDrb;1!~+7 zYdGXXGjE&u2pCh7>Jt{%9|o}+7v-iHfatNI4kWmb7m; zSwb~3lo^z@MY5-&v1MtIJ>6x=z9lilWRNJ^h(gI$6fr1-WT_#>8igVW4MQU9j6G8C z`RjS!_qpr6pZ=PUt52ridY#949N&|QfQ{c)ZJ7pTZ=|RXa=1Y@cA*wD$o6afObJF1 ziBIIabSgfbdM?S;kL9tLx%`L7_t#ks_%{9+bawrTe!9 zg99!K5(6JI6-rs$>q?hYKI}1}8d+MQMr2RfKJ7{gyYQ_Jik2=+o@!kLw+~}*1}Iju z1gB4g4~F{taMYdvN^r~X(&y&*>Vale z^UpeoWsT1BI-mS# zji8mS{Aa(U2YNO=K+{9Cn&BoHL8D#^Y@Z){TlWSxk?#rj(X%?w<~VUr_%@5zZV5XT zF(7xKn|_4&Tx_=J<{OY9ra^0yi%fRx&OEZ|{vtw9gwZBD%3;*ts@C-lEEqYrK%~l` ztik2y&&p4SljTspJQS^}n*&5i+Kgm_*(A}D#;bv#4mH>63Y}AhmO>PRLIYjwnl#Sx zz?joW^H6b|cpM@|{783&>rIWt5kyrVgV?%cz6dca_U8AfuwcZ}%A@Joud)Ps*>X_f zOGpkpltwU+?Nf;V9PIkRzW34qu2>1*fyzTZ1FlWwa~)z3OIXgmC&)FN(Xju(_Nfr!}H2asIAL|w_Cm}=(b zAT_U}*D644D&b_k+vH@*%IzCjHvdjv-oFeH$FL%tD1kv_1k8QM?)9PDBw7JnJyvPj zhe3@Ow)}Asl^{iFeJm3J zYbvTxtw=1Ex9BOgIBnGO$5eHY8m^c)-}i_f3t_wk_)suc`}!~*j`KZ`j+o{YMxEjf zO9WhnvG<_XUgiuxvjnM&CoFGOW(S z1>+57a2j_xB>7>6kw={*>CwD}vN-F`=% zWX28BJZ|K;yh;7G=THPE|H3q6MwXhIxA@m~u6Mlu5(K}2;4cFpua1W|7#{psAJ|Z% zSUu)%Nt5Agxf|a2Mjz$f@{`?VVo4|?ur#IVigpFlg&k#5xGW5k0xI*(H z*6f4nyi(ofj@*%0ZmP#3_lDr%WTe(5hYa3vXf*r0)3M{! zBSdNU1b8STRFa}0P?3(XJyZWWZP9>-YwMC`hjUT1c?h-%!RRJ!H6}~Dp^l;-(xCIQ zr+4{^uY$d#J`GXNf9|9}Cy2J~JOJ^gfmy{++!wy7U26K{547fxHmY-uD^$_&H9LRs zgT|l90Y{9a!t8qrK$$9MHHgJxj9 z6UFAlG2gYJ40&YO@a-mvKWgBPl@3Fzl_B66bsKcXE#0R?+7Pp6MUm?SLnpW8e1fzY zk)bOEUNmB`x4PN*3B~1N%%*4+rJzZ;nHQ7#syfSZ@w*|!{HEq^c+1532IOItmGbLt zSE_~-Rvz)yyXAC~W)okUXlkqH6heG0iPIw>k>*QI01E)OS@8Q|Ry4Nhk9sdhg*TqZI#&SkzpKn+{cPU(EhcI-F0Y9Qqot+5djBn*hKat5~{p%{4V{o zG7Jigc01D9vGK`&hY4qQ(a9_Cjj<~e#l4Ig&vELHCDiIHu*Hdtz$Y&r@X zU`5RXdqj>^u4Yhp@s>f{?^8-IBdUW(JnrzP9NCld7CHr6^(T&92-xd<)XEVeeFub3eg^2p6S4gw|%63 zXI|MOWi9-NQNXJZPKk&*sz<NFWe4&M3$oD{hfl#b>;>MK~~0Lj%o$R z1jLQVyeZ7A)T^6^IM{r2CCI`(^I}vBjqBMS%$*+oR&gUYYB?p)_umX(rOejfmz>J7 zZ82lY_)FTNaJ;9JHy)HzCQyHoXxRufRM>~^Gqyn^RgcWo1f}PF^_~Z-d6>UWbo0s= zK6Tv`LtOOwiJD}dS8$Bukk&3OFrIY5dYf2ZH;Sc z4Bl&t3-^P@4|%A!DHIembh^g-t{iVE^Xh#pJMGyA|I%7knac-L7(>$QU1l+x-qo$L zS(Vr!*(on3A@2EmKlm^^l|6MN{n1LL>c4zXgblX5Tvs_+Xk4f+cl$+*9DDeRh=4*B z+gozK@5C*?dOi+a)N-ZY-EPz9eYw7=#G?vnsM@`9*W)*f9L}GjdUHf%3)$#$ohBX4 zHizu#THingW||~Tvbph!;p<>sR7!ASD~~{#)8!;RsWafpeou+Uf4mD+PB7|SRxdG6_8MM&_Av9Sm+z6DJ8prE_K{G zdq8LG&fnn&&;@joH1W3I6ZnpM$4(m&${XodjFUqIMrW#`O4(QGhUqk|9idHb?}tL) zyWP>E2R&|6k+&)77NmATBz8jm;+QSNNvf}#F@KK0I1m~{}X??<*2oX ztc_6bZ};8RmMzI&)FbxBo>KgyMErLb^zg8lNpVBYwx+4QNq<*U{{9)Xfw=gNf1;|x zQxZd-{skdm40768`d^$mZZTjha?7tFy!iVs{Lg1Q_PuhbH;{$%gu#G> zPQx?I+@N&8>`q|J?O0lWp6cuPmM7Otw1Xg%AFvIdTLEKGc**=VQFs9;j%Jey?Q=-! zkAW>p=IE4IKj2(FMV0WkAwlRb|Gjm)x7;9~z6>4koB9BOjNWBa29|&qfYsc^yj&?c z$g%_m>ZI*QiUZ{_dX@g|Cnc|ECoS|Kn0I7*im@Tm^W>x``BHvA?sm8iP^T6$GzwGwTWgEH1l!aXijIvHNK6lEV^w1kSK6_&L@=&= zLI8?zJ-nb)=!hC=uK5Prf-D~s2pi&GBLtxNS~RwgV+5&;S7GD&32C^_WPl>}Lv3jR zLG-H)z~<*yE*Fx=yv!Gd}qa$0Vwv=-VZ=AAsQ>;9XwPY zrSTFeU11DY`Zm=|`F9~{oXG&bXH`3rqWN6?^GBev*I>=q*~BzNVhMubDb=r`6CF>{ zM+@Zfcty%HePkXZ2s5)!%B)Ei*0Umywq&ea@IT%w;@hEBovuFLp)(Ch(%FS8$Ud_+ z58o9}tUTG~0`D@pg0_ytJ+9+QBRHtoC}sB&m0NXmK1u8y04QN~+q-r#YJvkHPbmWz z-yIv*WFmSdiE@W}*#5Ux>|yp)41)F|zS|BgziHr|`5_Ea?8!pPY)dBVam6s83VJtf z_ld!pstjZviKf`qMe_K8a`iZN72tec`m)awULd8Vg4-w)r*(EvPnB)_WK{~|CNdzi zAKCaJ$T_tB%F@gX#`2u_{U1lL)}PgXfxZwtWI*kCMDW@ksvee+ekdMQOkz1Cq5|hP zFu||SAB;BE0BfIgBzurlZB9VdNSKeTScFbDQN)6;0&2-m;F*~8N8)zBlI`$}noAnG zvkwZ{CD7%FPtt*7PzNI>K23p_#v=0)k~|x|Zm#UyvUTSD)|X!3VX7AK{raw9^u7Yu zsq7vo8AU&-ZqMaJnj6U3*#4YT_vE-?mx8PO zw@dyYJe$NKk_0ju_lj36Cs(=<$E*8yr*m0B^giwG+=*ih;xf^t+3Lu()&Dpxk&yDpstR?16Y&8h@BrToY3SF1AR~b_~Mn^rqBtIANH$L+K8RpATZL9|(^^Zp z%}@1xfa=Sq+JN^NgzaXUTOAN0B)BWl&pm zZZjvP5)So2KWJ$M;$_)S>t@2HaKHS1nk%u^8^4>#E0zE@=ZtBI2Ym8VBcP`(X3B`@ zTg)XUz2%s>?NHk|LdSCuW6uD2vMzmF;fB3sk@19(0EZtp)NOtLYukxt)f z;8D9R{HmG+7s4ra&Qt;UZ^rqQ384GY!-YG$7nBoV; z`RqZbdvRZ)agZBNhI+hJRK83OPGbHrS^<6GHKRoZ=3G$Df&EDHBi*3ySEqmavW(s!v@4CHpS#vCT;8))e~2!yB3L#Y6ZIiu8iyxXx2*vYNkQKc(qy}q6j zW!6xK%obhJ{au=D`;Anm_RCwEx}t?|#&HJ0TG8;;A7LDLyhyA-Ip^jCx5B&Mx-Jl`TSi7OgekL_ z?MF)|Kf1PDBbLbGX^qUCoiiQGn}r_oA@bvROhhvuZiemj-~iZ$W^x*VYBiLsShevj zGFE*KKU1QWx zo!eo;vw!-ov$ireH&Y^6{nen~KxuwvK3(8M(%7w0v`4X#^%a6U(QLz+plqb=v)s?3 z^^UVS1|$h;pN$n!znrE(zI5}eKj~=xsP4D8Cq`+wZ=Du%SKvxrUA6@SUGzcx-BXgY ztaq3!%lSO+c;;=q^7TWB5&TAV1}#>(ZAFb}53K!dDG!4)FJQ!u zg!f)qymSBghm|{#;}`L6B_3XVQ4U$D!V(=ZYKso1Om&%&ylMnvbvZe#NZ6Q$rQY;}cW4n!%m z6?5>I-7+^wK9Kwx?aJ`g3aK&I#W>=4GO_NNSr(8AyEC|++9jq$aVs%e7#1S)Dz3T1 zRKj`FQ{=D6_(UXO2Hb@Si!UQmsZ zyy)~*oc$J-U0kjA#H(%oQZ6zQ8nD+1pvN9*9B#Z@cY#|h?8|bgKGpPt`IvC1ZHCyG zaTne8B(0=7<>GB4sE>;$vowl&{iT=Eebav1*#r7Zk}}GK$f?PyT?434T!5xR~HcZfrhj+8ZYoSo}#6)FLu{uqfZ&MXkF857#7h4XR;{fn5qx@@l2T}r9F^oI?w8qk zcQbQSbW)`zdbz1fZB8MY^G11jDaAQYiAfw@&A?r?OY4e78|TJ8)~5}9>#F|!HmE5* z@*tCn9%IDO4@{#1I>`$O(J5Lx9850bPOBAmd?WUpm{F>5wRd7Ct(2X=*tE(qvj<~$ zbo<`@y5eC1!!Z}^Z)isvXNj4PRaW3JpI2d8(xFzc(-ZH^9{f6%l@~D+>-|D?^3>Q{O9F! ze28fv%Aw2f-^KnP@s`71Vf{{p~9a2fOd1j9}K)dZ|RnxtzMTj)j$- z3oUjy?J-Z@I2Xc!|#9jaL8e-z{VWS8!zk~me;`_y(31th1z!4 F{s&q6$)W%N diff --git a/examples/rbac/cleanup_feast.sh b/examples/rbac/cleanup_feast.sh deleted file mode 100755 index f6e80fa000..0000000000 --- a/examples/rbac/cleanup_feast.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/bash - -DEFAULT_HELM_RELEASES=("feast-feature-server" "feast-offline-server" "feast-registry-server") -NAMESPACE="feast-dev" - -HELM_RELEASES=(${1:-${DEFAULT_HELM_RELEASES[@]}}) -NAMESPACE=${2:-$NAMESPACE} - -echo "Deleting Helm releases..." -for release in "${HELM_RELEASES[@]}"; do - helm uninstall $release -n $NAMESPACE -done - -echo "Deleting Kubernetes roles, role bindings, and service accounts for clients" -kubectl delete -f client/admin_user_resources.yaml -kubectl delete -f client/readonly_user_resources.yaml -kubectl delete -f client/unauthorized_user_resources.yaml -kubectl delete -f server/server_resources.yaml -kubectl delete configmap client-feature-repo-config - - -echo "Cleanup completed." diff --git a/examples/rbac/client/admin_user_resources.yaml b/examples/rbac/client/admin_user_resources.yaml deleted file mode 100644 index a92098af1c..0000000000 --- a/examples/rbac/client/admin_user_resources.yaml +++ /dev/null @@ -1,64 +0,0 @@ -apiVersion: v1 -kind: ServiceAccount -metadata: - name: feast-admin-sa - namespace: feast-dev ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: feast-admin-role - namespace: feast-dev ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: feast-admin-rolebinding - namespace: feast-dev -subjects: - - kind: ServiceAccount - name: feast-admin-sa - namespace: feast-dev -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: feast-admin-role ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: client-admin-user - namespace: feast-dev - labels: - app: client-admin -spec: - replicas: 1 - selector: - matchLabels: - app: client-admin - template: - metadata: - labels: - app: client-admin - spec: - serviceAccountName: feast-admin-sa - initContainers: - - name: init-client-admin - image: quay.io/ahameed/feature-server:dev - imagePullPolicy: Always - command: ["python", "/app/feature_repo/test.py"] - volumeMounts: - - name: client-feature-repo-config - mountPath: /app/feature_repo - containers: - - name: client-admin-container - image: quay.io/ahameed/feature-server:dev - imagePullPolicy: Always - command: ["sleep", "infinity"] - volumeMounts: - - name: client-feature-repo-config - mountPath: /app/feature_repo - volumes: - - name: client-feature-repo-config - configMap: - name: client-feature-repo-config diff --git a/examples/rbac/client/feature_repo/feature_store.yaml b/examples/rbac/client/feature_repo/feature_store.yaml deleted file mode 100644 index 0af199fc39..0000000000 --- a/examples/rbac/client/feature_repo/feature_store.yaml +++ /dev/null @@ -1,14 +0,0 @@ -project: server -registry: - registry_type: remote - path: feast-registry-server-feast-feature-server.feast-dev.svc.cluster.local:80 -offline_store: - type: remote - host: feast-offline-server-feast-feature-server.feast-dev.svc.cluster.local - port: 80 -online_store: - type: remote - path: http://feast-feature-server.feast-dev.svc.cluster.local:80 -auth: - type: kubernetes -entity_key_serialization_version: 2 diff --git a/examples/rbac/client/feature_repo/test.py b/examples/rbac/client/feature_repo/test.py deleted file mode 100644 index 082061435e..0000000000 --- a/examples/rbac/client/feature_repo/test.py +++ /dev/null @@ -1,140 +0,0 @@ -import os -from datetime import datetime - -import pandas as pd -from feast import FeatureStore -from feast.data_source import PushMode - - -def run_demo(): - try: - os.environ["LOCAL_K8S_TOKEN"] = "" - - store = FeatureStore(repo_path="/app/feature_repo") - - print("\n--- Historical features for training ---") - fetch_historical_features_entity_df(store, for_batch_scoring=False) - - print("\n--- Historical features for batch scoring ---") - fetch_historical_features_entity_df(store, for_batch_scoring=True) - - try: - print("\n--- Load features into online store/materialize_incremental ---") - feature_views= store.list_feature_views() - if not feature_views: - raise PermissionError("No access to feature-views or no feature-views available.") - store.materialize_incremental(end_date=datetime.now()) - except PermissionError as pe: - print(f"Permission error: {pe}") - except Exception as e: - print(f"An occurred while performing materialize incremental: {e}") - - print("\n--- Online features ---") - fetch_online_features(store) - - print("\n--- Online features retrieved (instead) through a feature service---") - fetch_online_features(store, source="feature_service") - - print( - "\n--- Online features retrieved (using feature service v3, which uses a feature view with a push source---" - ) - fetch_online_features(store, source="push") - - print("\n--- Simulate a stream event ingestion of the hourly stats df ---") - event_df = pd.DataFrame.from_dict( - { - "driver_id": [1001], - "event_timestamp": [datetime.now()], - "created": [datetime.now()], - "conv_rate": [1.0], - "acc_rate": [1.0], - "avg_daily_trips": [1000], - } - ) - store.push("driver_stats_push_source", event_df, to=PushMode.ONLINE_AND_OFFLINE) - - print("\n--- Online features again with updated values from a stream push---") - fetch_online_features(store, source="push") - - except Exception as e: - print(f"An error occurred: {e}") - - -def fetch_historical_features_entity_df(store: FeatureStore, for_batch_scoring: bool): - try: - entity_df = pd.DataFrame.from_dict( - { - "driver_id": [1001, 1002, 1003], - "event_timestamp": [ - datetime(2021, 4, 12, 10, 59, 42), - datetime(2021, 4, 12, 8, 12, 10), - datetime(2021, 4, 12, 16, 40, 26), - ], - "label_driver_reported_satisfaction": [1, 5, 3], - # values we're using for an on-demand transformation - "val_to_add": [1, 2, 3], - "val_to_add_2": [10, 20, 30], - - } - - ) - if for_batch_scoring: - entity_df["event_timestamp"] = pd.to_datetime("now", utc=True) - - training_df = store.get_historical_features( - entity_df=entity_df, - features=[ - "driver_hourly_stats:conv_rate", - "driver_hourly_stats:acc_rate", - "driver_hourly_stats:avg_daily_trips", - "transformed_conv_rate:conv_rate_plus_val1", - "transformed_conv_rate:conv_rate_plus_val2", - ], - ).to_df() - print(training_df.head()) - - except Exception as e: - print(f"An error occurred while fetching historical features: {e}") - - -def fetch_online_features(store, source: str = ""): - try: - entity_rows = [ - # {join_key: entity_value} - { - "driver_id": 1001, - "val_to_add": 1000, - "val_to_add_2": 2000, - }, - { - "driver_id": 1002, - "val_to_add": 1001, - "val_to_add_2": 2002, - }, - ] - if source == "feature_service": - features_to_fetch = store.get_feature_service("driver_activity_v1") - elif source == "push": - features_to_fetch = store.get_feature_service("driver_activity_v3") - else: - features_to_fetch = [ - "driver_hourly_stats:acc_rate", - "transformed_conv_rate:conv_rate_plus_val1", - "transformed_conv_rate:conv_rate_plus_val2", - ] - returned_features = store.get_online_features( - features=features_to_fetch, - entity_rows=entity_rows, - ).to_dict() - for key, value in sorted(returned_features.items()): - print(key, " : ", value) - - except Exception as e: - print(f"An error occurred while fetching online features: {e}") - - -if __name__ == "__main__": - try: - run_demo() - except Exception as e: - print(f"An error occurred in the main execution: {e}") diff --git a/examples/rbac/client/readonly_user_resources.yaml b/examples/rbac/client/readonly_user_resources.yaml deleted file mode 100644 index 9caa543f22..0000000000 --- a/examples/rbac/client/readonly_user_resources.yaml +++ /dev/null @@ -1,65 +0,0 @@ -apiVersion: v1 -kind: ServiceAccount -metadata: - name: feast-user-sa - namespace: feast-dev ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: feast-user-role - namespace: feast-dev ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: feast-user-rolebinding - namespace: feast-dev -subjects: - - kind: ServiceAccount - name: feast-user-sa - namespace: feast-dev -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: feast-user-role ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: client-readonly-user - namespace: feast-dev - labels: - app: client-user -spec: - replicas: 1 - selector: - matchLabels: - app: client-user - template: - metadata: - labels: - app: client-user - spec: - serviceAccountName: feast-user-sa - initContainers: - - name: init-client-user - image: quay.io/ahameed/feature-server:dev - imagePullPolicy: Always - command: ["python", "/app/feature_repo/test.py"] - volumeMounts: - - name: client-feature-repo-config - mountPath: /app/feature_repo - containers: - - name: client-user-container - image: quay.io/ahameed/feature-server:dev - imagePullPolicy: Always - command: ["sleep", "infinity"] - volumeMounts: - - name: client-feature-repo-config - mountPath: /app/feature_repo - volumes: - - name: client-feature-repo-config - configMap: - name: client-feature-repo-config - diff --git a/examples/rbac/client/unauthorized_user_resources.yaml b/examples/rbac/client/unauthorized_user_resources.yaml deleted file mode 100644 index 9329d39a29..0000000000 --- a/examples/rbac/client/unauthorized_user_resources.yaml +++ /dev/null @@ -1,44 +0,0 @@ -apiVersion: v1 -kind: ServiceAccount -metadata: - name: feast-unauthorized-user-sa - namespace: feast-dev ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: client-unauthorized-user - namespace: feast-dev - labels: - app: client-unauthorized-user -spec: - replicas: 1 - selector: - matchLabels: - app: client-unauthorized-user - template: - metadata: - labels: - app: client-unauthorized-user - spec: - serviceAccountName: feast-unauthorized-user-sa - initContainers: - - name: init-client-unauthorized-user - image: quay.io/ahameed/feature-server:dev - imagePullPolicy: Always - command: ["python", "/app/feature_repo/test.py"] - volumeMounts: - - name: client-feature-repo-config - mountPath: /app/feature_repo - containers: - - name: client-unauthorized-user-container - image: quay.io/ahameed/feature-server:dev - imagePullPolicy: Always - command: ["sleep", "infinity"] - volumeMounts: - - name: client-feature-repo-config - mountPath: /app/feature_repo - volumes: - - name: client-feature-repo-config - configMap: - name: client-feature-repo-config diff --git a/examples/rbac/demo.jpg b/examples/rbac/demo.jpg deleted file mode 100644 index f7ee50d6b567b7de55f795c8a3def4761d9af2cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 111840 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

}hz1$Bmq&AQ_x}A{ z{xx54eNp(g>x4XIe<5j#rz63xxo1oHqi|av@+0lDRt@i+y1~{o2*@(xq|70k?ae~{ zN82H5^)nQQBb)HUpPN47xc!9n8Vd@V=@u8dJn?lJIxBPHbE@a9N!RN|MRaOF{lz>^ zPB*l<*I;s(3$ib|K$qYFNn-W&l{)Q9QVO{sIMS-++ifbfE_@c{)r_*nbs?7VL3O5H z@I3#AYhQL!OIGDr<-;j#V26ZEQ%>!bufyqY>7Yc+P!3{Q=g$r~C}bpGJ1UekhJPmk z5|Ce63M=0fb_#k?HZE1<8Vla${|m8$R9<;Y6tGq7eJiZVgR_vwsq`pI^bW7pYlxU8 z#5f}y8Fd6NdGQP8pQM_<;QRb@NUH94C(Z)JJ~y#qNauGlG~ta>>U6m-;#whY5|*Lr zZqXNfG9^o)FXFj#EG)Db2F@B;F>%nIjr8__x_9S8>x2M~M@E{OLLP;!spWxj|9nZ@ zcO+=#4bos!6voQWH=m zO|R$9>}OSzJ06__Wa3>ss-r4wqnT8C+w+?mOHEpIoTCvpHC9!^Te-2~@FRiQ4R2X! zwtC0##GEUYjdMrl>wr>kp=qbr?a{pQkp>0aLV|*IEEiTTX=z-&*fvi*ZP|IsFk(VZ zxYF)}*UXn0Jk4i$it037G6Pqrlg@{MI~xeni7w1-t=0e2gEog&^-H6K@BSG&FFwYA zs#ylvSc_R4%><>AZN$eo&r{OBT|PFwFRm+upc^sVc)hK*bIBJz0bI>jm&;%C^m6jB zG%etVGcN;UtZCnJTJ=~vVv9OUo`FU&*wRi8C-~{S(d{_#&=|_ z!{v2H_gR!AehUh^*tu*+UlJdQEC`{Tm8Wg!uhirnzXR@ge{`R{X|7B*lwBuj(yfLr z;DSfssug#yF;m>|o-UQ4%c7au)$Zsl^xw{qC8GV4sAeBQUic*tbvS`CpEkfmrN6eB zluhzz*KlBPDwazLl&uYfJ^Df3@4bO*P9=vGCt6eF_HPe}NZ<`i#1aD) zj2zpjRKs}r>P*k7YiBnzs(Ix}%l1Xih!+-3@55%~E+x0*((`^&9Vw8QI!p-IT}3-W zfxjRKxJ2!19%-Xfe+)r1N)kFcJ<2*dIqe~!iMERpa`BK)4)y&QS`b_VSr$Qrj_eQ8AirNxE3r(etb{lC*M71J1+l1|; z+KWgMW_MxJHPr@MkvIjw4YC!I_aIGgE=~9BIlBp<$ZJ}!X*eXTUY^^-z7 zZ|GLbflsv1mHdkS-(IiG7m8bEvOtA_u+*UB**!Y7o4~2y9q}~IBOS`IgD1J55qGYL z-CS3h{9pt9BTB4G>Z)iW|6m3D8^^eH_5I2pMUku32p9C$x<6M)7GR2B+OCw}58PZt z93svTy^)JfLciP3i>59nJ}cLA6zTrrGIT2wzPK;g8N1(U(wp&Eihj2z+9J^e?vCdE zW}hL`Ymw3T{3GZtQd^@$8?8KDt|q z7HBR=GDhpm-eIoTTh=i|(8cel0=#N?>90{|zjxyHmQmyJ63D zzx#f_y`STK_H!Q}|1EJXt~IY~&N=27IwO_VYO*Z(4smD?EhJ7_pBLh=Ll!Th$A6P517Al-+?YHpB zbPkM{ydoRN^8}=SAmba>huGVxiA7(@NxF%-9JfuS;BR!M)LSK8_6|3Br)fnQ9PN7$ zA>cL-n1s9>T6ZSHZ-~f89N@65$E^Qx+m;V&~4!CSMf}MV@;edlUOG z57eWbOsTs!WP@h!;g_%tPkE`*_va=$(~j?E^Gb7GUr>)p^F_EE-L%q#)cLZ7H*_KY6j$8GZNo@{>#X;;Ym7ABLNtiV$Ur}JIeTu6%@sitS<6)w=#D|G! z|BP=P)}nMSMlKWukVG12f4Sz7sd;ueqOts8?HJ?;ILbsgG8^mThPv7>d!rC%fVUPX4_E_z_|B>j>0ZBJpcC|?H;_Y?iBB>u$Mr1~@PdhDYT?qc#HS?6q-K>QlYuV=k;FY7Hl=3w(FGsm(v*Scnk7R*tb2~47t*GUY3^0_EYc&6t`_+xg&=C zQu$UnZ)Gd)itutNQmeTCS}hMbuuZ5W^$&uKdx6S?f z#G0dG_sw8ky2iSfyp3xC)7D_9FlG*G+Nkh*lE_o$)2Y|3gxQ!n=-iZYuTI)7Ge?BC z-fiuy3-!%=|Gh{CziO2g#wsqK)^s%p{s~z(W6ZIrA1|w$4;retsC)O_7U&V)b8p}K z*LuA7kL;ovXcUnkcEpUZGachRCkr6x`^KEUvMu()un!Ke3T~QhWk#(%Zs;@j?|tYI zb%mFm?yvF z#@D)3)NwNpnx|vLUMuMek8U@{EYVP}}A1h*f zf{$zMqnMV|IQRZjoZ^4BG9&IKyNzjua=%w!@1AL#oya+k9oMXPQ(B_4T8+5gyl0>|y4;>#pa>6a`xwaZA2@*-D<*3^)7fa9PF$mMkMsB>1 z!~1Oq5HI8k!+L2)PP8tEhPsvPG{AWriM-M7#pv>CCf_7f6}!0E*jK&G&eLs0jgo_7u%3n4*ebn>>7Cr(@) zxqof3*PwnMwVd9Rg(3>SCf05wKRGyjSv(B2>7a1Pb+i)ZLX1^G^9vQX=e5*Zfo_k$ zONns^(Sj@dDlGr<^CnkWq{~sV(`vwqyT}*Grej6zdT$i&Us@gv^+*S1FzKy6mmYLT z%idfL{^Cf7`&b(hua6JXxmZgnNW}+H6Cc%+_p*0u$~kw}asRB>RwrJ5 zO7S1ZNBtQz{Ci2#W2jr+L1PMw8R!FU4Wx05+rJTGU`8Ne<+uyi*W-G*=R@Mm+g@>O z3);T7LWGeefd#upO&iyvTSCntxR`dUJk*_D{Lr(PNMq@PcFSI{mpiGXZnQ_8<$GNh zQ1c+T{Nt&Xq_h>-hxh1Q-Qn$+7kX{EJjabS_9s6oyK#ZLbjUUQ3jL?(X;}3#Lf=$P z^V`j#W%k3!OQYP~aKkuUs!{?9mz0o38R z#{I)EL(_g6{uGwHSbWfuEdrs zV)rJYaI-t6WUJ9c8#3uWT$AX3`bCpg8Y671FDH0YlP);Z!-O9%Bf26Yt%@gatcuG9 zAujo1LoXZ8kM4B+aw6X#;#Inb)Ny4dJS0C>?-keo(Bd8Aimr;Pr%3!ke=^QEfS9Sw z@kiTx#A#(M@u5Z-D;p-k82<#_FEU#u5-(_`JVRrT4I}UW*m|PEKMICT|8O}%`}Onz#ss2Y~cd=D!PczgZVkj zPqaf+QmZnEpj&_-@``iQ_uDm%p77@#!IcD!HK5=`wY-Ggz`UWia+iSRZ~Fy>kP$o~ zoNlSm$rsHo+7zygHxK8_svM?Nt7wCRT^00WJ-f?ez6B9I7O1pbCBpVurE3KG=*;Du zAgX4RLsm^Wp)>jQ+z+-Mbt}u=baCb4pXW)n6mZpjrL+5*CRse{;u*EQLNNO138|dZ zd5;I^mpTsZO05O#loevOOEWX)$Tva+PI(NX!%50MMYG-OwE77l7f=cW3*vl)lH$h# ziPMvdgqhp{KtX{KILJIxJWztU8t?lNi_q81-6j=w+MNcw>zU#;d6RcM@sV{?0{lN!V&Mz;yCplE67H_kbK3U=<8iEtyrgW6FwZyupuix3I8KidkFxlrh7$i^M@$Mo( zv-f!WP$b(tN_U3WRey4tw^+wG`m~Edi(iwDv-L%={ZHYueC|Vdy)nz#o_ddbB(b?~ z_em-p)`YvJq9=+fa@bq1Bd*`4i+QBeeKz8}U^##lKsI*L4SmPT&g7(>H zjE*gLbXe3HwNWB8POhN-tW8YYwOZrUo$h0R1r76jT}(K4eywKJeV6Z)5kYA68-@W- zOgXP2$3c$jnIf_8meh@qxg5r@uOt63A65$bMvw!PNhU$Lme_8CI`w!3lZjavC4P6Ge)*~+qrd;lEu@8kky1_TcEcpF06A_O!Tl+DhyU?qfAM0~AW=k{P%-**gso0>xo`^!o-?Gwr7a~(oC%sR! z*D#KoCZ3W`WGuRColDq%_j3z3^!Dge3JtAU-rcXr%W_U?*aoVy%gq_gO0&6MmV+#M z8Cx~NSV{F{Ud67)YdW;$V5! zdaF#$VV@O&>6O4^YrMyipO8UU-i>;NAV|v-A=RY{2dh2e=IP7kgKF#(CU)D|BOntPG z{gOG*_*QlVCR;0j-{f{dJ|&}vjUuR1qM2bh`KU@ctB^>dGkP}>64rYZnP6CKbAYB)MC5$Pq{lX9!K#j-u9r~)`fFJR@j2d+?`bNlFX82 zo+vB$EY1VrdFqlM1Uo-!&^6h(BKRqn!j)VP^*l41J}zn92T}xj*9L!VD9>NvA!FfK z`qMj=)E4ULguJ<5&00F-M@+BN+U~YKfUGgSa32lQ)}nDy^(vSKCTGd=YISgP0Tp+# zw*E^hrS7Yg9wkb{#TGo8YpFMS{ANzB27(SloS428DEGHN@e%H*D!{iVT8foHzv*eV2M=)D<+|k^;M4;8TOL!}rvQ5-ge7bm7wOcwZXT*X1 zy8Y`|VXUdu$~%VDUD{3lm9r~D9X;7Duv9M5;KKG_x(m~1F>P4x80~3E&)jdE+~hyx zSE%^1a9AZrWyceaX@*ByK&0>f3Y1y;B2&sbvlL}jk&g&g%cSx;dIdwJ+Fsl@R(WAAIpG;uyJ zR_$HOORVtPMxG(T>sgAZKdtU4YB_DZ&wk=WIfdR~Cgpqd7AUlma_{(kE_s8NdgO*Y zyhyv+R(2$Zx?hw+O0=kgC157$B$6XSSmjY+yBQ*|dZo;l zHtCXKHLUtUyn?Q{+?CA3ig4WMT3w5Y3;#XfHB^Y~u*Z#sGN@Yy%L}kP1OtI<$+C+#?=R{Fv)zKUT zi*%3qS40PPyDS(}Cqg~-9b2%uzIuUkQxB!Qth^CR*D8i94?f>mygkUfAE?V#7AV_zAgY!h92_%H zKdc>U%-#*Zf9U95ckRzKmq0w?IE(DVxNH!&o#9!y|5F{-nLL|QgRwaL71P?r;!d;7 zi6`8suP@rYy<6m`N6nkzHM3s%zweV}XgT{L^WsHwVgw^DX6C%piu_(O81 zxqZ4yAa{BmOLEynt*gCb#V(LLW;p%U6fquu?v3Ljq4@p5GEZi^i@#6rbYtu9Cq?_z z6Slpo=$~VvyqdjXlPndHJFdOe7Ja)$C4z%(5te-@d*8Zu3VzEr8ZPOSJ>^$LT&T3h zGFC{eNa8gJaYzZ%9*La35yJ1FeH2>gXA`H|Ybi@Ll>*=PliE6-fdMjyRqd-WW6%42 zxEa2+MHzfnP+cSJxhU{3I1)*rxG=d#Ue7&6tTwiQIyIgT$wJ1dUYX4k+s1zTYWI%Y z`Hd26PEA{3VIl6Y@+pgs;sbsj`&*kR_x@GUC7F4v<=61f0b<7BO0J4R>)7q=(0)vL z@=9S#ouiX4m6FHuD*5nrxEF@AUlrS`5#C<=H}2OfJb#Mk2CDLj(x1@F9%DEcKP@47 zfWrmPQhvu5NC}C|ZSqQYH<5O7QQSSZn;`JAU`*MM$0nxoY~Mv>sk}z1k;nX_#A!kR z@qOe*Jy?<*PH8PrXC<>DZ=bEGw;j@?UPfQmmA6`THa;z?>ZCSvG&K(^1;68kWiy0* zV*Htu=WltEneZT$uQgySd&5+oCXVy`fHu#A3}wKoZvmX-ARS%Uow%t|Aj~D|W>dYy z)zKU0$0`yQeZjEEt}6gZqo#LwYX0 zij{%ps^O`wTa`V`hz4=ORzyKr_8KKhn@AR?P{z$Wo7!oEtM6@_oh-;t8Hi0)|6~wX z>wb%CM)`X_aG~JRIcI`QRfWl=+S2)w5To_89=kvz>9k>;@lx;TkwRBWB{J>~J9qY^ zYeA%FA)RPa!;qa8n2lO@}e3-$Zhr ztapuQWNNnv+2rie%=>l)mr9W~x<&7%8dGJi*PQigMR^K}FWlS~9L9%?KQHAio9D-J zT8h%@i3BK_7hs(qG^o!G4xco#)`xC9-xxK#p+?Y(P7S>8-YPxKZ5%gM`?>aZw#4O# z={919At9NPr3qzfqN3L6X=5+nt1y)({PLRr^zL9?g)T)$sL43{UAjl-?lZHSH&W+r zpU=9Xd-*(z?rrK#atp^%&Ivnp>NpLZwxcQ(Lyu)v8^!tLE;S1!jV5`LFUby+596y10MTX?_DpD;vj4zs|Y=7`5w)GsmO_#ZXj&5f?9~kl8 zQ2D*YnrBuur<^hT(=m}gJhD!6f2bPoH?zFwX0B4`LvY@M!%|?L9jcvr{_ZW^PD_Mj z1M$x$rGhqxwqQr~0(#dFQ__7?L_ zmIh1Zd8K+|jSE&_G#6!3(zN0?a_$AA&3Akp#>b_vLB$osc4tKil17BZkl4k|cJf9> zHoF<<77p`j3g-J43F(5x7y7ER+)+30s=&d}YpBF#7JFeudRkCqdyce1WIoK2gG93T zZQNIgP{qpu&b)F`S?3lNDCVPbb%t5nq~V#15gBX}@p?k<2c}#KU6%&@WMGlTpZ#8D zAxsldw44gID!u+K>e}G3qAig)MhZ2Eru|unySdNjw)l0Yh?-mG9%6TA5tvM{v_f z?*)S>ncl(omr&kgqTSlTt#SgH{^#RlmHLDR_b_t~cI&u(38{Syh0Ozn{DorN-1>~` z@uN1WMVfl0n?_N#1HamyjTjo(t#28Qf0};M?kQPYbuD}My-1zZ<)3qw!Qg zeXzd8G}+vG+fO~wr=Mm>^|oG+pNLVzUYAtzgRRC_3-#vwtXkqDMOhV1HJZ2IaA*20M;A z4M)ULYX5&GefkE6`D*(FD?(M$!4;$T@ZCf>G7SZy#7@>fd%K_%up_t`dp9OKH@g7D zxi-<+`cl-d#s7`C@n1-lY5s!4)B+Y}*i#Y6)8pf72jrDG`sh^2|5U6NE=X2L)tgm> zEZ|juU6MpFtE+)P`Ol!$JM)zb`+*r^T5&`Rc2vRPXH`j-3}hg^IfV!y9aYA&86ncoQcla~qsvWs#Ww z=Km7T{d;L2BNR3H4RMDVd09e~!q~R)KlOZI_bM*d3?|2l*e|QncbqGG3-!+=e9zIZ zBU)m)dk0jjdr#q9xh-*LzQPt`}K3RtF?nA{77ZMviP(Mx0Yd-tS%7 zR!h?4Y5a5Zg+hveYc=&R(`Y3z`@1m;<=6p_|3T09_iVQN{%pJorZa2FT`ef_Ju-LHqj~=IS^1Yo?(dh}V$XuJV$tk(pA8D|-B279DxkN-0!{=FA)m zcH^~xB{_%k(xBigK*-kuLCWx7W*k74W5t%xW(_@9d7MGW4L=9TYoi!&NY(&2NTV=Q zZsvO~w~c6(9KNa*@B2Ub8TKTnw)oWE6DP;{dgw;&022kAC!s*1Z(5oE{L~tvaB7^fgcn zXKL30TH^v>(j}hH75aH?&YHU?8Q@~U0py^5XO~9b;VI#C1OTHi ztSMCB@eiR*2YRbB@Jc|~*{sV-c9NDiT$!6`0=5+Z_F&TM-Yq!}p|#92Om97|NV$B3 zC|9ggD#9Ou-g1CJb@p|VqQ=SvsOGDGvIHbiYv7;a;V>}di>zjkkfc(8w@JTD50l+gg5&ZdfeiJT0TKugI;d^p=0#%}gJm%+y+JO&S&)X^8KsRkAXb%m(@4 zr@j8u>ezxqHL`I)t|k?cr|#p3i^PK)y;}3Zv`RNFbhB&ON?n+_#6ij zAsWy}CesClclCq?MUu)&viIQKVZ1y+8)8YJf!vgj4i2sF`y&@)SiPax9R0iHg|sP=U;On(T&x`)c? zSELa&bQJcz$HSi1@Tvi92!JzZ)dNsA!OcVB(tQqqojx!NDBZ+2e5{KB%c|pgxY!S7 z@7M2!pQRI&{@5t0UflHnT+2FetEjS`OMUu}8)3^IS#6)`YG)<=xVq>I@_LuLgv6!` zAOl6{tKmhUtB~XTRC@%z$sy3r_rfA~gSk{Q2im?67EY-kqDpPH9_J_(YS@p!>p;m7 z&?)OcD^lK4oo5aK0kCT-UE~JJT>^nfh+WQpM$rb|w3cThmoGg6USXGN$*cEj-FV*A zudHfTeprVH_@n~muM76kz|dt1(AoD(`EtXrq|tm?-uke3rBfd)+= zm}UyeS>oR?0WvPct=>H;y0QrAnKSHu66F`%A;Zs1M;2JhH_%(pE-EHeHOB289Gc!c5t_uT?bAG4-Sc z0>2~213<2x6?A!M8=Q{W9koS#1cnZRVpJaW5a%#!lKA2*Qvh_jt{ZsTLi|U;2iP~m}{jdM%ZkOf`1(eYf7fuH2 zVU_~nX4TbE=LL^!;B5Juu{%kEi1!f$3_O^Hs_!<(mAj%@yZ01hHqzg8vMHXtQGE%aGwTRE`R&Nu z=#X~X)zKE$=*oQqomy(nB_D}V^;1eaTIesN&z!?b?azX~651imoHrHQiX zmaHk(c23L}Gv8gVv*}CypV#|)VppT*B(=eII)j#R@jC6X>utThCv8cHTWtf7A3JQr zzkW9Nht5l6Yj?HA_0%onlH(UtdJ7k-($496%Tw~nU-*1OLxU0$goE>%dczoT<-lF) z9=0`q3#Bnk0M z?5Kv8E}?|mWrYUlbZK7oXjA;le zeqhq#z#|2#YEkdEeTKBhzE{9Y;%hl#ATa&IJo-IwErVN_FJKP#&hoV0{5J1aBa3|4 z@7}Uz1*Y4U*6ctdD(4XXIVs8iH(>wsi$>VzNU_KFGml$>TQd^VCv(K^iBYUlbhbta zqt^glTERoAq(YwW!K7#(YlJbFa#RXjuRg)NDkQnKv^&j z5WgxdfzuMgRcR18@u~*kGo&NU{~AQRD%nQXkpzSaKK721t<+i8G7tR{zRMAP)K;M9 zV^SqZKpX%cJO%=pUwo#FJ|Mt?XPLON}6upE#B91 z1@3)7$o_?KIoRxA8cTcTfmI$su~6@CqTas5>%pl2X6|qJmNt1*6Jp|K7~}o3USGE2 z@>w7(@?V}4?|rIToflJnRt~5A;#YTNeGn%m{5T9kD~1VKjR7LCU8g^y<)G8*txEj& zKX_YB)_ zp&#U$o(~r+R|S=&+z9{v^8foc?yz3XCDw6!OU=zxWUzIQi}q&O?MJj+tl<&vTk;Z$ zq>TDx-#VGenXtMcCJ-c9Hi>lTP>>P$?~nK&U)=ITvAjEykZ4ZT_j6p?eF*vig*<*0 znEeX8Z)6(n8lWPeaRU}r=}XGG@Z5{w##H{(CxV;O^S%XN?6I;kaf@tbv1paSKWgB) zRIKkev~B(u)|vn4x_(H%fI%_6x(r`5FvCC3LhSYsHk4O-`=6)W-`~;&%1g%&f9PUw zdbr-|;5a5CC9UvNl6Y^5)2lwkfAAgtS_hHR;VP<85k6!g{)n*9v685@A`~L7`bqKP zA3S-Gad&}wPDfT2VP4`yE76=wZmA(6dD#&um-6>T{-=-8h7(C!IHH-6KLHilO6TsP zMO}rgb+p@3CAxn)5+fLJ=X*;_CtB7^KPR)OsQ-UlL27}M&?`g<_UQY5-La>)RM##C z(+oVE)3sKw?%PntqmRhv86UYlgT)D!#sbdh6F0#j?+Ai;lHraGp2KdZ2TXj3?FOPJ zz~p?fLRD|;Y`?|ZRp&av= zLjVEMt>jl=fJMU5Zf!3!cR#?)^A#B4yV9rz=A2cGolml+!+ckEz^ZTHNed^)sDfq| z%Uw%y8y4$}-RP&%RtHbePj3$*)(7qW5)K2*W`NGP9rk=ww2%e33>js#FJ{lY8ZT!H ze(s@*5riiSDHF%y*NAYut67Gs24P$Ub>(e@iGjL?Mdc)cUIe6Lm!IOt@d!BXI#oA% zC-@d~>?!A%V|-+lcS41nKMcNe5aw`Pk=d+FVCk_wJ~c2*U(qcnuI-gyTs)!QKK-`o z!lkO9Z`!~MS8h_r>usi%*{!DtNo4cT)D57R2SBKa<9o3rkH)RRT}>;GBBazYKBd&X zQ4x1-_Rne;Ts-T`%?Xp;_PJPKWis4egAlO}2Pm_OxXLX3RB``n-V4f-EOYfrf~n1I z9A;)^b=9EXY4AG;w{O9Am=9v2bNJN=Fl%jrqe>zVIA9lCX*#XEyaMi4FTNMJjHX%- zJ_5o%)zz{$Y8`}h^x_7XT`YioVP#cf64I@&f$#7~M>x)^=_UtnX^fO%73~U)u{{!w zG+;R?UID|8KeE-Jf7h20fLE|C;H(k^9>f{}tdt1jmGROSLS2j^X`%fHz9#XGn z7~jeCZ5X3xR!Lc{69lwQ&hNjLa1`7Dw$(BbFxRODaT*VdF4zj)EHy6{jg_li&dltu z0i$TH2ymNTCzBi z7Q|LY#(n;2Y3Gq;mJNeUJLT2w^R`PYFOn~Y@dhq|+}=u|;FMN%yST=81M(c){*00E zlyM{#R4IGl$YB_3Z~n@wtec2u83L2{yVBMCs^+et`DbX^Dw#6;0eAm`vyVaGdAk@qk#`(e-V9b!*H5?-&1_uH*b`}vd zqJI1xGa91*vUA!KKdNHer@3kNl!}ZfX*m6A%=>__-3I)UV3Lf{$wOMrFKI8)0u{ddixl%z~^$oT0gU4v7;yy_?A zb|&;ofCR_>(O)-Hcqm=&34B{E3(LB`V#xBA-JSL`{4O`y{`|X+Ey@Iu4C0^);l-Kj z{PbqXqgzm$7j)MjNv1H^GgH?1VulQL4h>RRE@rP3-+m-J29EIc5L-yq8D@C*E?grY z_781g-4#@ewGmUKrQo@T(OC2SsFr7RVWYNEUJNX-q>JmRILc2qKFc;^tG%!X268V~ ztL6I>8pTtJNu`YMl_Fm)X&?M|;=J?#M zZJ~)WG4_(xc|-lKt(tp6JjR~MLVt|>%71N1+SDQ~krC$9@Z-~)PjRhuA0_d2{Mou7 zX`(_l)k*&g!tWFmZG8SMz!HkFW;qGuDBA7sw!o1S^#l0|L}jLp?l+0q##iX9ON$oR zjovRw2M_D4C`(7dp1{G#kOC3p(A!b55EHg zx&U?xEG?8R6%89-SKyc>+=LWW_PLetO_m}}6;KIdhjdg>m_ArO_ zn-O8uTCg$};SI@LE_puX%V=wpk3k%6<*@0K2+Q~>_)bMjv8tH8tZ=I{RO!1-RA&jw zT+)$AXcmOiEU&kK;ihew!3;Ps;O^492g4&`l;&@$eV+r1Vd7q2eDBv?o}IY$70WBd z?r>4OUY*X5>QMc&kB4AcwN?!n7aNT|HX26K-G!VuY-phE$*SHKgMLwqN~K@kfXZj8 zWN^!2mqGli5-WRA;J5`^r}bG~GgyD$Rk7==zy`wCbcg%WsS3nKgYcgHeDKoTDTMAr zz)Ou9SsuO>AB_BJ<9;71tH&1VDgqPbE6l?NE#L(ATQ1j0b9q8?#oZC)@#?`rh5;>t zZZ)rylA-y{0&r|zOyh_fC33o~!3oL!m1>-W+F`*m9PTSh2{45znM>?6E>~zdGgZbn ztY4)sY((t8R|#tgfb^-ai|J9LOAl9<=5qJ%Opk7hviPevs;uK!imDj}(S*auN!^I) z$4#v`!45Jrzc6fOe%{t#7M~Lb4NAv-gKby++2u^Luxe*I+&i}z>JaK^DDAS=7sKAe zV*1JiSa8WYe0aj9u@sbozBHEObq={SWlgf zhu^Y-K8A1(yK=JJJ~Q5$ZX!K3y^+ZgEmXe0;rH2Xc!rH;yjA`ucgviC4thL+>72ng z+P5zFPg%D$v)4tB$zzT2kM-iy%z7gk*Mo~@IjGV*i$D2Gw_Qu)x!YB<90poAw!leF z!MEa<%zCg`-=$YxnY&UzQe*~yh%<%t+He!>nsa6ndHV+Q8ah;lfZpq_*G^h2?Ffg_ zJ8N*U6nR`sU43OIFKxqu_QIkL4Vr4>?y@x0Y&F+MrDyyZ{yuJuY+gnB1nvK_s|j&< z+LGuS%OWqP4+EtXKIsfukn>ydS6XlJf^J_G zn%*hqtJnbR#22Kg<#k&-9a$s>248($TDUw#-84aI!prza93+H*rooM*MwnCA6@#f|c3|Kooj-DRzj6v<>ME65iB}-50*OgM*3#)^5FX+m=GqldM%a7>c`?`| z2<&Bd0c=A|Xj>4AshX~{7G&51s4sdew_sXe%sZ?!y=Y4zivgk6{a2Eh;G{|?qzoD| z=xvBu(>^_1I0TYi54_YT+ySQ#i}gzUE`1F^Nnh9bkP;>?(~mVubzo`YfaCE3$kP+t z65c{-RLU#g;w65|ZelU{UZBly9`~zfmL=qv7ZGMV3Yn&@(VWQ%Cd_ccy%17Xxt5W4 zo~nt?S(NvSHzy~^;?jo}dir@MQkbl}cUo?c84B@EZ`ZeI@TA0Ok3uJGWyYF)c@gLl zd@Hm>ESm(;B88wT__K&>mok_I48an9aC5yaEX6Qhm1}y z%S`l?eG(XzCKg{*d$4Gr&e>iV|5+8+RKOZa76t<+ zhzrNH1LO5z19qZCAkBj_s=Vf{(V|F_;*&J+!Yva_8x=SJ)qoZEfj>i8ze1%}5DZUT z!<(w6?!-np8L|_1;_US`gl13bF|ZpdxG=h)C(KIAeAOIEeifY@8h)=(K9+2I^PW<( zHH<(05uSnaezQ?Q`KMjxqnDoMlg30SBYO^tHd~;o`nN(Bi51OHR5){|k3ZJ4tOBvW ztKITBo97U>djFtTE%*JP8WI(qQ5E;E3j*%kna0oAw^#M*#(F_!YMeo|DqTL}GmZ|L z0t&1{Qtpb;dBcON3alPg6(`#r8I{p0nq13YK_TXcdLIAKs^fH-_?6+^(VJvNurAaT z)l5qh$Bi|gEM3H0isHue(#b>{vd^x~e?Zwuq?N+=iVWz@YHs{#}fC12cjTS6$`G6``U zno(QIqz7CiahMHKjT$L@t1-r}n3pjzg&Ml6h)~5-^c4EfBgdpUr)k5|r9S|gWWElR zKnUvSk777zxWsv*jPLLB;GNGD*mZk~yTvF+;*eN%z7n;CJ@@)J#`0cYIV0~*mHO0g z63hDsFGqoa9ZT{qmk_fTzNO-sk5Rv9);89jit<&19WKsUcb|KTRua37^~WCj6v8-W zub~h4F;#_5Mo=*Qs+1`tL1ou^7bIhamZafN5ADz9FYSHY-Ye8SFqm#W50t%p4w!(V zxCT)pRXEEDBOX1DfHJwgnt-VLLo_IxF(x{Ul~+u>5VGOxoCd#yg7bFV<#j%3eWs&- z7tVCu@hY1rkeyO=8y3yqj*?d*HI#~uH|))V@HfkQKjzcc_U~|Xm#Qb-`s5hpaDfQd z&%AxoQ=!E88Fh6=UmAdVq$5;1F1Ivs8r+r3rFIta2U$w$KcU#}x&>A#6t|z7wqf8U zc-#Q6wE%1PJbm8;Ha$3s2LB=e-U`d=cobLa=k{u?kO!Hnldf~f@&1kX`lfKOz^sLu z&UcvAu$P1t20qa2c{6XJ zo7%9Q3sK1)s}#7hH0L4GZ+f;TMysgnE(W!g!c zlw}=k`qtnmTQIAu#%J38`oboUTjzoPAgN60z_o>tC$ zz`?3cx-V;HCx3okiD@|O5k{mcKF`fw3zuR5=>{YPynP-SLGqH1!ySyjJ zBV2+C%VET`{7;~W5@iGQHA@MsL$aQ{y7$Q14GT&(YBs9AJp9q?1`U#_7+l0NlmPlS zLf<+BMC#Ng8Xjj(hw!Y99|Q?YABNU$1?vnTTYd%lELmVETGtvAJkh($WdX>xZ?J?L zlxbEb^}65}ea<3b))$|ZC~6gZ#6G4M|~^ zx(t?PoFBx&QgrcADTkjUP|WmR`Zj3Jx_W?T7HbIX%L$Y8ubagk3rd2|m-5`e9RGB0 zc*HRdn`39CL>za)_s2Xro&LRK`7d9QT37;W!8qaNItlq?YP`^>9q3*%D|4$GY(hnM zf;f86^N}t+5YEV;Dyp!CF6GTca7GVz21l2(s$OAEY_u~$q-d*Kxw5uoU>~}+o@_Me z%%)z|&|vrFf6wf9FSy@Yv@%EVQQTE3X>>kCQ&M;#yoq=nRLHISCRu5}X23g2kmMDv zekoouygQ{yJh{$yVh#kj$os-?Tba8MZ`A9+1y&|;KW(m&5>wp~`4Ywz6cc+;Yfk09tMN=(=RLxBj<^74IIpN&g@zbjmZddDHI<>qsv!i9Z^gAi+o7 z=Q>1`23h81Nnp@&Qm$G1N^{*R`+ALNQ;Na|uSS)3hj-(fmS*&2VXzlwwS`P?sT$E0j)cyx&LisYWulT?$_4=HV4 zyr>eX1|2(t=uJ=C>lMwa`7rx)GB{%P^XzjG8&BADB8&(hHihWSWJQ?5!EmtsdQw{W zkGfD)J?&qe!Iuig}lnY55X#uGY8h-y;H7W>8Xu>G}|!h%8VDf zt_^32m}5IPsv{P58pm)LJQZaNX{XsjT7*@mkn3i$NFyik%_+EGiq@2Lyd^3e*^wgQ zQ*-+Mr@kCS-y&eEX#THFwy$~g&O1{^a6Vp;`Q+UUgW zR!RC1-MA-5gd+i!SyJp+aPL*r^60k!=C0m-T#2PGo5_i$W}?caBmpmlg1qBc^;=`; z?Q~cA3}U}*9<#O*uTjGp-$p4*{Izvvoyx4FnoHkOBYXA<}J z#hL+M=a~~x&0B+#tI8@>L$`Tjbvl+RhCnmNA1us2c;kpmkM_%t_8UCN*@kFub0jCX z4m-$X=CGcG;MBMj-8JGJrIN%7h7)(d**L2!E$@24SwP7MCiYNm$$M}L7mNLruw#{4 zTw<5(OqmW%R>G85AqSNXZ!Y(g!8Y|qvdIi>^FBzG0i#+v&M6ROQGURi#Ne)m+4)>Q zZkDTrG|!wbpx_h>>aSGq*6p2hn8(B2O(S_@bXIEQX0yk|v-W%k+uFWeOBl+qSNlfZ z+SzR+-{3vk-oJQL!^Ng!9o&hEAydQXOS~KsfvfU*d$&Jknu3@KlX+M1}{ z5mj9EeFdQ3!I@Cnk-(WsX(RtYvyi6i^yDQgbp4|eh^kabJrc@U={?N5 zFz|KilEgqRg-UdD<{`=wt9To(R**XkyKvJFlkv2Pn&=A0T5$*mV`%W}kLaHhI)y2! zCqFuwr)=26D76abNw!ERxVl`=UvF4hLfK$w=Qu}Ioe~=Ou4j?FvKGWBeb{yQQ?aJoc_Z1ovQoIfwi1zWyW7;4AE`Bg z*W*yNkj$W8)Ky1`&K=X;hEE|dw=+A0G;EJj6lwM-Bl9BMuvHzCeUB(m{!gxO(gpfhCk-~(3lp}4o>s5H6e^nZ)z<%rKXyfF$F3m>S>SWZ6BxXn9Pm` zIJ)~>O7T)^4_wq%`ek^0cNKZC%{NzNC)sp?BQ&-u!)$c@Jc_l}a5_X9zgG4^vu1WL zkNdsTE;(W>9{Mc<#;r>iUKq|`6C@1HQ6v-7AR$vF>2N35sz@$(*B~lxP+a9UMC>xP z&$gVFl&qdTR%=#M8-7FD^)*PP?{ii5Y(n_!nm{u5#dcMLv8S1)9kiEDTsjTy^(mJ_ zoTk>|@&dXybKm`IhBq}4u0AEF@z42??v&w_D<>SJnvM70E_`|Lr*HVVXRrKtp()kK zqfn#nA*>E&48LU#eNNZq57*r|JS~pTTD`GH%oyUF1yX}ezZKUSGOXT?lUm)I-{yqm z9mRZdE1WJP8ZeZ z_Q)t~Xj^=qV`!nFONX2$VxvXINtZJ+4Vb#$txV3PxN~_q%>NM&fr3QF?n+{_>P&r6k%=q43VXtA0BXkouFD#A&>vMZ*En zA9GkJlE!dYlUi8Lp*nvUF%mn;ecUf!!QgE4h1Kij0o(8X%k4el(Cy>LP>#oyz3GUJ zlQePf1>@ON4#+`VtQzVvG-HK`2(MwC!QfIlo9cygf!<1pjbQ-_k(RL%&WBq&hLQF) zUfD#Q>s%)a3R&uJix>RJJLu_$>!QI?c%*VYU!B=cJA;q z-5pR^16i`yzypo5qdVUmv^Kz7Kw;Cnjg0d5!C|DSQZ47lM>k2A3cl#{{_|#m9`)4V z+u&lHwzjgPgFs2s?1N~CsIvT1o|I~U0sKLHT?pda%WkH5g&L!5CD&l~o^BHTH}4Fc zMO8<#UKD)hx6CU!XVV_A)n`!3GN0Lwobh|re~8Tfhor`ng5RanKIk!gsqz6$$IO?z z6?PbyC*TxXwMM(BE4O$%B3#6x>YsKDlDfO$t~fKDNb}_q;>)X3T1tXs(Zm=2O%v}1 zEpq{l9wUtN@6XBv>KFUSVr=(K0uqI=$UqWI4X)L;jXT5<`%iboE>*$~v|3t+ZM!MF zMlndYbM9Gdo*$ZssP9MUbiL%|D)mED9kEhv1QB501bn$}lJFOUQ8;@aU?}ahRW_Tn z)dhvnWg!0hsMByxSMA|lGn+8WWR z+TiLOs~_xjX2$^5wa0*vXk&trfCd0p*fxdF1bh{kG1u; z=(9Y-xUz50GaLLqlY)H@!Es#2*euYXt9!7bbK(!te1FB{#5Fg#eYW)6V?*2RYHqDH zLF_@ScSG-3hWhUyn_tFh$JJ?*dS6JY&2$hpe%A`5$+cZ~^b;}m*3y7;W*x`4XYTpO z;P><%DTfXMN~!c3eBGatX$oAe4xrVN`Z&K?iOTkU#?Cq}>UC}RE<^!ok&JxtdtmLT-H|py`gnDjF4iOmV7FhhP2g-3m!!b|}w=ybT?%#h`SF6Xl#l*m3bSpId zv-@dWa9uQ(UE_q-`5s13FcV7qSE@Bf`Qd{qlG4jh*TGB=AYK8w`Ik5M$VxBY$Pl*Z z=$@u$K(PMn2TB_cy&SfH}m+Fw<_>J%vw4ge! zVr}kuwR%l>R`wz>Z4Pd!`Y_vjbx)@9jBhyg=RPJiyIM@xDr^283&9^12oKEpug=ta zGriu=n z8EFZ#=ua4hBDGOq||E-0Wm)dQ4Yjt1J}Oh_XtHZwpIq{1{+ zBL|i$J^Ixpgz#uBjXcmGG?ig8Ud?Ln+g)6&QL}?|f6P6Weg4MFZROq=QL`?AwX}Rk zh11~zua2X2vJdV)zpQkpLXc-f*PF9cxda!=w#2zHn>_DY9@XysT^SOO=|o=&9B>$-eBewHsEL6({fCZ~1~+^Wgx4QRGq4b!ahMLeY6$haex_x-8gCOWT%FT@^ZE zzQ|)K9Ii29zDPTrkA5u5ZR6|ukfvJYz>E82^voKvy&CLTfY7F^=b!Z^-b#Gz*JW4b z7;!*6vGGi6(v8kjS93mP>uyLh8tj!x@zbn#UGSW32Xmq5?Yn9Qm(YZn&&hzQNb$ux0wx*J!WNK6VIjbh89%7{h*-_gO+H z)RUY#+gZ5FY)x~+d~vL z#QmK*)GR3AiEHv3n`yYGaB7Av#w3C9o7XmO$*pOPb9(qX5hIk-5ea9CO{Fqd{;}=s>bUK17VMq#xD^&7@n-d>L-iw>XQ|wSjmK5wmOhP?!j%5 zYGf1QddaJ+WT0$XggqBCJ{s;*N`c5O7>W;xA~ex&?2J$#az@n#-%-6wf<<%pG#zchZl8;X=!%XzzOvuW!|G4Lvmx?tKO2-ZUdA ziz!W-b+50t`s?%i)E#eu#)QT3HoSxbR#Rs&!Xf)9ZU#v(61oCF-tH$AXXB zQTn1ualXGW&LLX{(?X5SLWzjye1nw3`$ub^T&!YU6s7{iGNisWgxD49nuzM1u^Hgb zHH*ojxav$c4XYn!;L$y)B zrcU)HpP;5w*>+QgO6D_vi-)^v-NJ&Xi%HFn++0JImOSi#2&v6WbS!flmv)@*iyk;9 zF!{5cgWGo*10c6zihZh;2q7vn+W-7x ze`8URuYMtf;uCpN3Y!%aNOf7-P8B6)p5CA;dhi$T`_C6}$3^kGk7EzF4T!X~usF8X zntdUEmflUL^dCR>KY!j|Y*FUUWslc_r^TJ;uYW|(LLFh#`$$WR)9tfQtBE==K?9mZ#m}Uc! z|NN8eQ2hkQM<@a4p~7cBkaP6x?%v0Gf;B~K!#5kjqiTF{SbQ@-_BY0=A23$o@AmD5 zu70)8gD%8!C5v%bX-av%%;292a33@qi)oF0M9Q2gb5cp ztj>vre+mh_+3o>+^59{@2@=M&rQ$jQvKU8~d8Y&qfWyoooo5-745O8|;(i|jWVHS+ z&a-cWpc!Z#uW8IokjtRQH}9y107Go};wHgdn7v5=uYDZ*p%+Lo2d3BW$Aifh-5n~U zfeMnOJosi;hutm!%&PEX6|ZB?OUzO;cdL&O*!~g@7m^X#J~9MtNLDFNV(Z_R;i$|cO3t&;p&dzT zo8s3xEMWoGwHcer^Zkv)WRM#DT)ZbBys=C9y4Z(U0aMi?PBD%7hYdc8&x0ah+9AXn0Nsy}-G`JfZP&5AsL z+uj3NEeph;w}FPHwQc2k;oTljR&i7swf)O?HxUV&|TK zb;8E~ifsgyp=Z^=Pagz5_=b*w@7G{~IbVTyGqMIA(%TP***P+=!1%d(@Ov$?p9UL1 zwqKMz>Csi!M}krS7I7m!swXt(plS0Ly~aB=4j@#wJw4$p8OcoIp_WeMVTm>dr~+8H zuC3#5#YI5Vm?k-j0BjWxJuVHTlscsasMXl}h~`aN`+=(Lr@FS=I{RV$v4qQ+ z&t}?V$a+&1jkB3T=pS36A*lUy7cjXUydJOs*aNR(llPeF)eu|Pa0=Ky1I)0Epz{@44FWEb5L>*D*y^v?@7LtHj1$-6Bq(=ur>dvWp^Dg~S19;j^;N0oIagC5p%!I>LF#-$i188iLBo z0y_LMf$M`{;^+@%w);y^HU0TV{ouqVE#=+{T4Ic~h1>G_ytoFEHD4(v2o6}hjt%QS z!6(usZTEjZndV<5_Z-vzUVf*EK2ivVQ3uVG)yB&Nq{Q+}adEkCYBiPnCXLICS-w;7 zN6IC4F!IqqE)s;ZZ5R_A;1sp!IRG-+l=cS$M}gFQtWd#p$jcUhUyE&MCYD>Dav{(Pk~>9u>7*?tfHC{5D(^C< z`7mNb{-XGEiHxbi`14}#Ps58~))rB;?&vpA1S8qTbm#QZV^1(!JR#IVZnbvdl`g98 zR9M>TZ_Rpo~9I^4u;hv5|(hbrt zRDcI?Q1^-qi_{c-9s;fYU2O|vheALuUU<#>sn zMd9r6sccFzAA@0psigEfH-MUfcHW109t9CME&WV5Q}XyjXJP(l+UEh+tS{cmr#?vm zLF`0Lu-&Faes%e#s%%Sp6;g{45jQ3v2iZ<*^MM@DddR#)+nX2vmgS<5?{Dw*X!&j4 z?I0QCFns0fhYXAZitSDmOjbO0!U+tNoQ17;>&ekBPPf&@*V7;aC5mYTLg-A9*@oE@ z)7lK#t#tRFQuX-@A@H+2_GHjH+K^o|mso6dSep$fKZzSxqYo&`jdICp=1^~gU~NU; z0Iy{jc6uSVTm3R$l6{8(6Ol$_^J$ckzZS zNrz71GZX!xDXwLa{3J`heDOl_{Y#YjF-`#4a9uonhld$|aR{{pyP_n#r9f>7T5Za$ z9C8fK<(iBAtgA-JerwNGK@Q6PV+y%zKC@b?-uC%1@P>O{+}&9fqFY4E+Ib@Rj{TR` znZpuLaw*|w;9z{$sj~J%U!G`WbP_RbLWLMtQ+d;}xO$NMdZGU5zlO&3WIi_(d!;3w zk;gxyaeOP=$%>tB9$5I?f4?anN~na#C4M+0c;GL}*ct_fbnub`vGtbi8kNYSB-v0V zAK8>o6yX)WGCS6Y{hUxOh`kO#bh6BE?L|@^LsbNJ*{@bx!`pj?IZ@IN=${Y}S`=4& zq!XT-o?c_!TKwxUR22#44Qu74$%g_T#;e+iE6{@&qtNbI1-nv>#JiJ}})@{`) zF63B}LV|w0_iNp#_o!IoMg1c&4CixVl(&hrY{ma{<`?-)?T25S0*tQU9Id!CZGj2+ z@kF8rJ%$fae}Un%q(RamLFGa~DBUg*3z%Qg&Grs%|A4Ko7Y|jX5qKOMRIHLoruRkD zm(l4$Ut;$@cM90J?}H_W@;fYrk^T)+A;x+t4~*#xzYvV^6-{rVWh3CI3%}}lhTaqh z8%68qr#U}x!aici6^v;F%F*8)Hw+qu=@g#7kjWarQ!)3V z&uT$br$PM47B`Dz{`a>oE+P#{xGf)MJ@Ce6R796>t~~#6SUsd_qxZ_E7@$D#%n|3v9`xAhiX8daG(n*I$ z{7u9zGv|GiYH~pw-tOz~JYp(}GI@fJ>?s38343S7BhW}Z@o3)z&a*8p&qiW2*4bHF&X{m zAuyXBHO5w}vL_4Q$LSXSV3n>AI0XoFf}B94a)Ch1R79xIQBS6g-ZK96F^C2?f2KMN zZ3~j!qt4p$+q9t$cT<^YrYg955>q|Ms#h6@0ZT8#$F_qvUY=+yiF+DyVs1zqa>$v6 z*qClW8FdSsfL1LaM{V`f>)X`ry9U=)Lm>-np`2j&9F+NVXsEC3?6D{DDJ6LqfaH|x zG~ai@LtH4XMfRR*`@cM~-im$M74fLF;3k3oxJ!PiEz!5uy6qB^m>#bY^x0CgTO2sZ!c zF~3=ZU#P<0K6aBq&jmb+Kxiw8_pjNmS4P{4>DJW-=nOC{xtm5Z=EVT7(1_Sk;WBR= zj7L{7AeuZ7{*{Nj?(s*X8Che7VlsseOh8lS$T+k&OZdXZt2@UqYCl#mz(YO#uqI2O zwT{>m51yz?A=8Y$*unat)st@(sx@@9_Z*JGLA0qccH!{R0<@0ki{iw_%}WU)mngL0z_!{UcV8`JOa1v%L(4lH4f zgZfHBFT(g{O!Y*lwb$MC!+Url?;AM|hf%rV$3E&{ zaDBj4r_s|jJOPd^42)1-)QiYk;p}JcPS}e)$cKmI2o!_07LLTb9i+><#QAL%CNTQx z4tiu*#$?lUY2$kx86&JDh;|-V`Gy`F($4od(0!)n4B4(ya_2n!aPN*a^Y0>!ZwVN@ z7Wp0dO20-G1$BLWMQ3=3-t#^88Hy}X6p&;s|E3G%5?BPH(1b|Jbq3F34pVPM#pSG^ z3;ky=`OSB@_u>SkzsmacN*2#R*?@wYDUkN(DS>)fRSyPj-nN76+-=Mh(N~ouB2B|6 z+nh4JH}zoaqr(`#(x75H$V#AE=-xo*hdT_|*!|7&sPu4Y(ql?WKMsTw`$u|_(qI$7 z9Q9j5!cVHMI*E3P(!D|ilomr@G8I57){vWhYXkqHP&!u@!F8>eU7s+T5b%VxRIdX2 zn(Fky5pD&7YM!FqbD#E*_K+W%spCGs4lK4Dhi>5f3K=PM`OsAV5IA)G<@k+ zPe1;XN7Yr;jSkE+nv<(L8YMa>P5WX@iGXXqy+u zvcQt;D4miKxTkcb2L)bPAQl=<4Pcb2PjGuWsh^BUvCG`svR-^D1wXQ8HV?r=hj|~8C7`qZ)4B?F2s(oO4zj; z94IqLJwb0S=n~8^_y3AZlrSoNKIlTMk68(w8zk}XB#hjzSu;j2_Wnm=`FC*_F3pHf zu3;|QfSmeOFg)&GDN2j^Vhs(hSrJxfHj+k> zJz_n?wRWy5H&Bhnb!B{$6lwVIgPaeSKB{@>-NYGxlO&#cLB-wLM_AOOk+0KawLf3}_%}a6|O`-!PMv8sA+~eeI)j6i>=}VRB&iDzuq{F9$>39;w z!e$BL?W8X_qk{1gKIzN8K;^>jCqAy&%|pQA$BMu%F7 z`AcQZg+>)`2WZ*Oga#iH5l$Ri_sSdCYE^M!xh=boT-=N|1au0y8RZ`s(!2#CImKHG zqhT^g1;7vf5Yl0-E6Bi82%7L~6wots2))#72+v2IF)JbQdFLT~^DfV_z>bm++G1T84kSz?$y;p(1(z%@t3u#qpv*sSXSg86D}N=&#SLpoL_p1>5=?!8(s;Y2x|4?q4W8_k16j z@{1e~9R{;ffG3KTmk*Nvh8Ip0Sh{Nt`@#zZqU2kW1X}6w^w|}jn^Y3Mv%pwpW$oV_ zVllsgvPJOX5zr`}B;Mm9;>X)T-z((PDTP6YlzwF6=+UB0RWfHP9&(Ez67T3gOmik` zAme*S-DB{F!N;8o9I*J zx(#E!?dN$5Y(`yf)%R{T5j5IKyT;3ClU|H&*Dtv1^V8i(=SOkpD;GiZ=Ga`5!_3&`lmzU{)uXb-KWu~KzytK6eHtS{q%AY z+WuU~0mDKa;~JsD-?m6#eH4=v9F|&ar)9pI0eWv4YzJ93(_o`ibs1~<=we{2^EtPf zKg`_w#TH(E&Zm7vz`jlOZ{=z~^lI!??9kMW{;R8<&+-jLSSO3WPB;B5q_w_Pusqhw zeb%BG1%u#GpF;Z&qq?ZcD#LNrv?4i1^&pyTo~$k9uZshJ(X&J1NXsQt#cy<@z?fB; z`}V$EuS1Y3Db_4Xis(~z zfI|;)TlQUddu_57g&ZO+4t|wlR^zez8c~|RCGxTahlPl=YH4-BU9?6_WP!B%fiDz# z{}}%C$?F+W4C90;fzaK)SI+Bv9el%R5*dxd zKrR{?x5wRwyUjp=%X)`e(Na9jh%BCW{Q34Dmq9)3LE3 zRhfZmrsPz(W-qy3szu^f3Dln^AyU`e)=vvWg}hl$MxLhkR5d;x1xXs)UY0@BzSLnT zN9J%&T1QNZolr`m(XI6MYc?~|z_4M^SuYnbxMgJ>G95m_W!zLD)8z{H7$xCCqPx5%uEU#09^U=8E4E5yoUV=Hor4;Jy_1pFlc%-H6C)`fgVA9#)>=F0ATrk>u!_FeW1w zK4!ehKTsqI*~Y?D`L!uQxoNJ=GE$;BFGpvyJKRJo*MuOsl}H^4cV(>U(B)p;p>2W( zf>gY|wIRx;7OGlLP>b%ePwaUBN=GaD(-HTc)AL;yXc{=+PE`mQ5KSJY$+z@L2sU>r zeH-sOBR3GY@#iEwP+KTs6;ls zSi>{Q3(hA-k`PyG9&b!kP~QmoOfVGd@RA+TQz(277n&l`XgO+HdFSE$0PQTt%FaAO zsvhKgy;hhq{g)-HZvcF{f%2DgQU{q*V;n7$nn%H;^JAvFnPGBE%7tx*=>b3N5?z5FC zme`&Uv`(DJb~n5)at(}FL^=oMi&WkZ3grcvAw|P9nguPWZ1J9Y~ln_}r(=mE!Gocxec2(o09hnZYYG)qI zm%Oi$u|3A5C>$9xHiOjc&A<}gtkka(XE-u@Sj}9qtC<{K;4gfYor`!`cAfK<*QSf0 z#%h9~XX0{GEKTwX)hvJKgn67$rP{IHdR=zD&Nc_Xj=Yae#X@e#Ygyi9?5X?Hizf1-iKs)2hY=ZDf_Po`^NJ|c;BVoL*}ACsi$HXc+=db z&hM=*HYl1HGKHgm?Pq7m=pcEofZq1B%d@%GskYhC{UnqcCtq7Wk&X1us%)K(?_1Zt z`wOaNkHZhpV`dPvX09$R6BWG6u3dI%^jHVlU5q(l=S_~17hWpo4;EjcuX1-a*xgzs z+O|Y_(Fb@GdV`qCmj9}<%We+x_|l;T9r4<;w(&Vg>+G908`eRKyJ#rlm!j#@g?ApO zNyk^Mv;GG`&s5S9GIk!Sx5+z+{a^ol_SpXR2-8Z3wEUZMTrcsDJg(_0m?igxBA;v_JU$57fmg5N)yFZ4*=++fcHGOK=rm~L2u=pUTaF0O z0<4o+OQgf0-Ma6VnXbX`(U4iu7BQOLj8!JC?IFq{XbUwh)Y)(kH%UIyB#`VWYsf%Y za_82ccj1P-M;05e>eFKKF!J6M0l$C;MI{wKcG>ia-WT5iJ!@cdq-!CqF@rU^1Z7UF zdC9%iX%{kMPF^ZFr1>r)u3D3#Mj%3Z8|#{q=oHFgFxW#`huC*m#H9?I{%OgdUvt?!8uLYtcCw08R+8ht9A4oc`ejfcd0tVW#Hb;H><3J!R= z*9%7b$I9J%>;@-q_1-rIAv*kxa+!=QYt;V^dvw{lyb&=*i<%7e^tm?QbjiD}*tNI&>n>t`Aq zEuUL1$zN~7rb8d_2<5-E zTl&mT!!bIS(%=P^cbBf5zx8_+%F5vJogkY1zkY=Xx{=Y*R^#Xe?J=shg=jztozul# z{MSG3LURZI`3OOb)q?6nM2VG`L9bVnf|MEEfBL=u;o0{GG64|Nk^Za$6V*7(F>JVP zH?3^vjsc(Hh#+qNzy1sfG%pXsVS!tVi#5M*%ac1Iiq2wpjd10*|H4Y_f1ZXaPz)$U8d0~5(?I7570bSs z)rMUH)2CIWq3f@@A%Pv9VhtDRf$vR%$FFDp>Ko#4#ot`C0X6(B{`jkq)Dw2Clo>Vq z?Sgz~UeNVAg=IW*2{|9eFrn&=S zJ!k$oTS>h+kU9P7U=*NNzxp#T#d;ffuukmDzBN0;Lm8Z$qEv0zwIhvUP$juVc zUm18rAAjv6f)!hPs^Y&Lojh_>SueT#tKVV71#fe)EQ738w1fUq{${KcYj|OshrkTRC4{TQ)WWUaC8SOM_5UD+|8k1_^AGN* zKEW>2Gs`9PkY~218*%Pz4AcI|cXLFdHb@G9>z$Kz?Xm&Yui~E zmU9U#(N}=4gP-zmB&f6xc!Mw6v);GYMXu4e;D6F?a@i@Vt4I3IUS%!<L7%83Kyn?+l`ue>NxlUpT}J0h z^;gTyV`~6kz&#CcN4FM&ZF5GC?E#qe!EX^j2#R|jiLA$}v2JO5rUG=O$m&DocOvlL zhm{483j55`mnP?zo7oX_0QytK_9HW}XsC?E_+$+hkh4K3=SROrZc?NZ z+5(`1^r(M315kiNe4)kL8&lPl-p0|d#HeKeI`nK6iyu6E0rX*{;hi`a7<*n{^_0n) zSOYkDm`B4udIATAb{oeTunc`K-)Qwqu-c{q)TPaH1qWD7MkdC(b>Pc5qEWi)!n;L* z!Lo522?rO6#RwP5Z*(_608%wjd7aaw9+L?vmVyWOf$RbabUHsLmjQ&Q7`@n}7ZW(c34H<>O8Na2r_`SwpLzbDp(Y z=HIvy_evBC(oYIVQIy?4GMh*@_GM>z{%xkyNAJOs(?EbN`^>Spge+deMj(rS4~NSv zjCT^<=@XyetYy_b-U`?3J+WWnBC0a3UDe|LNBaQS@cEK6IF`N>_4n1J=ERt5@+wWX zM(RTBtgY$x=5ii6`+b{doz!7~Q*9bFOuY;v4?ahLhq5%2yur0s{r#h-2isv*t+C!w zxQfW{oD|?vU38itVtF=gQpOJL3F$uNvI?`Uz6C~6LMQDf6s*4IfG+sD9_*-6!>i@5 zhDH->C$5x+G$8q}))x)Rf=IEBs0~}MH^tt9d1X_xFvApJFF0DUD*PDeV+Pz%?8=Y& zAPvA6g^8SP4xCqea1BW0E9jBfOB$%9URt0LBMN7yKYs^CDMeCoAgbS{K5h-Pe89il z?~d**7wdc<`tpd?(l?)XzPGDXx99{bc)5VGlp^l$V#m+IWS$?55u)*p1g+j4;G<{j zle)yehWCQ`LXS6C3ML~X!(<`lg`DJ&IS}bcp!|&HmERoFzduTb5@Q3(ao8}azwIsF zKn^gh53x<~Qi zu@TZUyxp_P+<&u+E8g7&+28ko9s+ycq-1NTVKOUx$+tDx3fVH9e6xgXE6-SI3jZ z;os806Lo^2#i*#m6t}t@SPRPv1SFfKR9`cxTH!ZRPjBXz&ouz7Go*6c{^>+SIrI+1 z^vvH7A9eEUAxh9|*iN*bW9tQe6;B@9DCIyj=YyH`YDHL;?1|JaKUP7o6MF|e08AQd zjXN0W1tv!Tm-vdBkxk|An$!Qklj`RL8sL9?S##=eElhlvaN8GLWTDbaYLYtY3BIfe zRXw&2de8WdeW|K_lXt+U=!XJZ&1-5gY9(7(Fi8{-xXJ`&?-3MFC00kgOM4t;rk5#33qVZHKbXvTu!JUFrN(QX;`XX5;^A%6J*S!FqEg1Cy z-bjyyVrFKj4IgR0T{6eFzt=kR5D}sq%uAtOyctZGgTd}a!-x+YN$opUh!mK6@X;08 zyH*S-XliLz%MJZ3>DYZ43gptQoipgzb?}26dhqF(+B>x`aIMhm;Nuu`;}RUSAgFr# ztg`OO)QSLw_0<8@w%{rHSRrYzc?k1-@DW7KBzPsEfI!MBD&V0VRnR@25cEFTBrjA8 z={cqE$~|aY>792<@Gg21wB4B_Cvxg`EBk>2T>3>FE$)~ujb!#IV_8Xs?!A8PV$%#@ zc{qY&NBC|h8ve%UrNCc?HsmPj*LHDUB4P60Hjv-MGOfd7ZHCosh*%w@>xEoN>Bq0F&wuaHi z9KkoaeNuf$w9Inj$V(Y21oR(@E~t&Q@wtaO(Rq5MyrHm`nx4WcdU8}27|WV1NTjh_ z0|(*Qy@zeAFPQs*Zv+v#xR&KgDG`4yTwBYg=~SMWu&xA;d{^ZYgZkb=M1enYf`=}f z{BJkDLvFuKR0xM3NvNG-E;0r|RnX{bZ+@?<=*9#%e7v}()o)}d*i$V~K6}a#O$~8# zTyW{G4SUj6Ps>C(R*+l1D4$G4`apXnb_BkLK&lCTX&XjKab@T1OMZEn;fb|_kM5b? z4PfBMb4*oJrmVF#OnYc91G>0&W*&6D%){qk8V0r#j!Q29v$a!Sv~Mua%fi1j=WQ!S z>4WmYD;Vn23$_{B(}(>{?m1tmG6&E@sHjEkk`!RUxt6f@2~MXFlm44b_=7SfNsa?O+e-x{a?&ld7o2)v`HEaMTlLEn_1 zg0*;cP%kStSG0mdfJjm_PU$4u&6AttZ3v9RVdwZQS^j=iXyGm%grP@a%+Pnne{uKK zr^^ALMG(P@MOyp*5FBeuB#hY7o$4p2X;tLc(vZ-fwplp<6rInw-#M)}Yj2-C>AYNs zCo#?G4-agY07hU*^C7z!-h>J%o&)hyAdAlnw^gq0jrjZBNNY(vMd-pbrQhLomcyBE z#~|IhNyfLtL_g{~ML;MZ3Qysg`_aOoLfnrz=3gn19EGDEq{WRW!3$mrJ0(;%9}g?3 zo$1R8q@#a$X;lic2%n($E1#I!oPw0KB3FJ!If9t{NLScYV7fw0pH#FQ=VPpqO&7AD zBJXUBx@X^e6f`SK{={jq?d`M6Gy#39(A+if+fr^5I^C~uMCOp?Ow6a0Ss1&(X7sd> zmsQ;qt{w0rYiRk5+nFl0uLXGhI9633Z(9@&L9dDp3YDR$jkV~Un0eKmtKov|<4;#& zYj9Y%Wfl+~Yn4>2>)8vHRP5{;dr46$uVAaqz2Geol=EV+SF;m4CE`{pKLz-oNpa~JHmVjr$8ePn$ z9o@OeiPG^#q%QBTv=KsTWhmWpFf(7I8MLVM&2OJ+OV`ov25&3A658i|%f$N5p}-xO zsiJZ6VH44FSv)mH-j4;hKzN}nJrxsm~A#QwTW^sje|EypHYDLE^D5#OiH$0W` zO{}#;ZFadmQw z&29Lo1pWwaX{ggI^c6(kN7mS*Q+5HaBjRZ5@rPhR_BZkK%<0~?0^Osl=@auUuEHVs zOD1YMeAY8dn|Eh^NWGOqg<(c_`lGY>RQo>Wd7ukhSJyO(Q!YHI-Z!^MqYU)=i$V_& zBUPs;a_Ds>$em@ zrZoq&W~(B=IbGLTQ^fddI~Q6F+b z*3T3h5d^4qd_1b**ou6OUn=GHO8w?Z-StGgC&)LPkkRh+o?K|Po{j! zV(cCKnDxt3kb)*$UhI_31Kru%fUfN?!cPSsek-T&zB;^HnjInH{%xWZMr&l7KLm<= zzxIJPq1?3BfOP%~S{}Dd$4P%M)grFXX~bXcb#xyZa-Ua>se=i>o=R|)v!th9Sx7g9 z`yx#%eRN%sDlRYtY#&(;7^|R}P!`zA5#z&o%+mvkPF`s%U>4c2{F0Uo^??`h-S3kiYC;gTGE(z2_(9+Tqgd31oG-_t)tB6kuo|$Y9BE*>2E+dhDq&T#Afvr2C;qHTsOlMb zfF9+M^n1t*5*wg8$cb~#vxM{A5*QM?f49Del^YgHv)ZBjb_2;O9QfRS12emBAH;{F zQ8-4X0FYO57d(~WLE!3d4cvgSU$8DS<4P>xJ&m*hqYq;QK@2b1n0UvpM+-RjqqxbX z7Jg+BeW*%=2w|`92?GTf8s4fUd3p+K;;oNTkLmH&)_@R+N>-;B2U%m|l50Q?NJ|5U zu}^4cvL%Ru_8yg?PbvR_>4lWSSc4JKMK|IsbkJ%EV{v+A(d!eRM|sv(^;>!O3Y?mx zJeNqR4;|WR&mtvp?5YO1LS{i;e%A*lYLXaqoB~mW0AW4{yv%oy0RIQk7wbR)OZfRy z2I0n^sEx9)IQ1b?TKenCRed}O6sCCQRx=*$vvMpw|5J?$27x(4`vBGbb>du#X?zFT z0?MkQs1dVV#K_Sy=I}(+jRhdw&}@=d?&6@2g1KR= z2#}=QSEvQU0vMnW2~^J32*}j9=R==of0jl;!E_r4Y#*X!PJST=3)&j^_d0?Xb}p}M z_a&%|aipON6Z1L$=3A*=&Q6a*&s@0@47vaC80;$CoFAZenYx8i%SYjr(CV2PK=dGI z7gTrFk^atNcPKy^O0(DLt9pbrytXs?6wG3Ds4-Mb@V~xS40H3+^tUQ-B$+sV zI;`;9jt4{%sTToK^rz1hzRZG!WI(*a3$awuf%thug-gMwy8J?0K<8r)xGPf-F^n&C z`^KF~WJEJS1&^>~$n83cXERke=V(?7(1yXNjGFWc-47IcA~Ul{=^>-Pt!!}`$o$&b%m{N^On!FJLuK#%%^)W_mAy;BAUUUbPr*4;Z> zz#Ix)E}X0HNvkkq?a5>&xDnjpHxb@f*$VNSI7z1<(o{cKmgf1O-K2U$A0Sxz%#P*) z=&RAV>fZNx2NcWHfoXNjFIX(_gD@9Z$0i+F{UC;qT$$KW}&!qIn;Yb!7h(*Chl9F1w%0 z3d}ID$01*!;f=7w<6|xA9RnZ3yzr*qKT}$_f6VBSe>{FWXJ$|xFm0SNI1fmpOr>8} z$Vhn1_+XAH-8BnyS*ht`PDjly_(gv(o5{Lf$n{+{yX-yCWBIEr?GG9b9-5IwGW?o~ zeEQqVW4%U=4!!L^KJ+>ldxrywH<(ySiedI4PP0m%C;-_kX&5 zukWa6eK5xOonvd#@&Y{;Io<%C5%ztVv?9VJz7dq#tU=Z{SRdzx9nuFnUi47RXcI^d zRwu!Mahatlt%V5t+y1t*TnMt2FR+sq2NpGDM0+`n0T z4+Adwu`wIFL!v1laqa8K{XqsB@E};{blkTX0&92=X)=3>Emqy{sS@`0yV^{HQhL`i zW&8hQ)W^4Yeg^A!5F~f0j_0emLI=ckw&jZLZy1SG(6{pU13$2xZvZ7Z?i$gh zg1t2gb0?)6-dkiClmZ6AwX>mf6R=j=T0Ow`y=PQnAp_hRJKETXXCAfHp}U-XU^QHn znXA3ov+>64mFy7$<56*<`JYXT_Tr*g5=+!Rg!t}E&r7ObZZ3?xx=4Hd45RWgM zTel#5^1r6GvJv*;hwPFDiO~Z2`r}qED`0tC_O>f`pFc(PkcOs0u@M~lbN9(CN0{Y$ z*d5yk={?Zck$pmuQVM)@xw9YsFZ5a@w1(pei+7NNWCldh{|{wv9aYuZ^$mMC7+|sy zQBV+JQxejGf=DRcozl5MQjs!1M7kTLyV;utMM6NjTUr`PDgEX;_qoUSeeZZ4^!@9c zG0xenz1O+z|Ij>T^GQ*EAD$JxXYe0`$z(>xynYmmu3VPA2#fZWs-tLST`H6xhypcn}JT$(Fdb0$)%305NU*A0af5cw=PYsapX}qxqT@F8-_Rd)|4$l4>y0buo zZmpk$#Wh76ZJPL~%0sdhCU7KQd@VJCxPq-Jij`tRv|$%|JN+H`OlCg(pg~f#gb^I{zg5)QT_>)0{B?43E!e z-C?4B2-UZsn9#H5$NPNhJil-t6Dwa?K?2FCh^5EE|33D@9-kDGg7Z=HtIIP&{><^7Q0{MUIFbb zU*pp>37-rRvB*$aFpxT294S!YoZwlWa<#^2SENsXWA@ZEpW!+b6;~FnPLDxuJ$WMO zgw=j&VfypK>t-fBXZM(>FGzbOQtt|x>z7?SEwZeli6MDo)!ansdVTA{#~ij?gZbf8 zccAR_a-}OM4gF204=w9u^9!aM=&ee*8c05Qx85D{_pg2Rb0@Onk>N=fBAcF`ii1_0 zs$?ieSj6N@y#zuAsGrw&(QQ%@~RlY&-|X3 zJ+-4W>(EG*p~KZ~e2Y77pmN(G7qiWUeyy&ow&U3lIoel7NT)fZQcO4*whfuzz{X6mIyZwoc1z3Y}1 z_3PJlwbmO@Qy}j0Z*;mcvSBYd;RcqzlauFAWG^}z3fXY>b@hyw(gIu6C>!xE6`v;7 zqUnAp`18hV@6nQ^2{+*GU-MZwk51wuT)tc@_H4f+^m_7VSk?6i4f70{kNFawpst6WrRM^DyZ-=&>dphf?6 z+JcLz9l<8U%h!uf{xw)T?G}H!r^i(??T&xxmpTbfAFXBogGtT`@}1jxA6>`ja|6BA z>Lw;hPM2#~+|Is~k#)g<|NEB{JpNm={m`XrS;{s&IK`X&L_Kf~4z826xG`Iz_~V37 zH)s!#76$!rvdIsPLl}}Uy4+X`Pf^0sT~`Q75sDnz-(&ut;FJHiegu5zk=VmWiM%`; zqDyNmTKsJDI}w|1TIAGdFZ=gO0>3|l|J!Sj2|t>2w_ITydxbWn8Jvwma|F#onga zbtoK~eOZU_gWCY_ulK{7xo!)u^3u3xE8jy zsdstWivIBhGcBU4=+!l6PDEro)FzYbpyY!c|2p!f{^zPnzJg&&pEG@p$k++T%(1=L z+3BWj6X@6STfq(@dh=3*fZ^v0!!UC-M>S7Jw4XIxPE*t3)9bTEAg}4?b68NirTI?4 z)e?fS7$Z~pfOP8Pe*E>r%lR1=r8t06NwRWT+y+8Z57UdoJ}EnhXI7Nv=GPL2<>FZL zM#|}w8FQs+a`v6mA~YfO;T?ZLYkyBqq(HsYGS^V5FnQnl8Uwm&z)?b5;OW}eL|5+x zEa=oOG8I~nSG!d~%v3?W8_Ab1LPy=*50pWIveCj(^+BuqOZL~p!rRB=_9{?FJ z0U#)hi;HUzLXT8wR43|DsmP4Om|J=;b$>wvU>#%wfkoVoOKRj?=AnRKn{0!wL^Fa# z+tz8a3yyfZn7dAeFe%Z(5t!&bTO%YP>xG8n(5P?OKIzdgse`Xn0p{}NgJ+*E)B+|&)hWRd)OQQ z4&*#qg>CnlecY@7TJM>+S>{z0`{FBNxg`wXpj$30Qb*ZYRKf_XpIQh6=6Vgr7dL1{ z?@`9RT6ooS&!3#9jT<6ZwD>rVdPiSGy%41B{v(N^K1&+JW@iwf}V=hAm^wi?#!6 zlEbAcjcw|t9hiPC-WM395>3w_|2WDhoXx3(OLCB@b5l?^aS$43zR_sHzZr-Wh6BHL zg8u8B38<_#yOTG8IvP8D6-5X$sf}2JP3yn5emm{GOC7*M;J*Gc_~DfM&kf3V&Hw}N zbR+7~Y6#4_Gv&*1@Wk5O8Ii2;|U-d{jBEaXk<~0oEj+!^-AT*dUfc30CZDH_^u9q~Ag;zbr)Q zMDdWB1)jS|3q5BIgsN!ntc+qHk!79riVG}PM;OUBqeH9q=*95^b7b+#U`68Q%>LTxxCyOfr+I#kl(xFPXl|64^ za+*RUCU{Rr)yWJ3cs|KbGNVjSC6pjoINc5}*+LD2ufBy86)8G=1l~S32Lcj8 zhMP7@I&UE==Y=kXNXs{Fr6&YLtnk8G6?n7>O-ix|fBAwiFQObyUi<)Y@CH59kCRHc zy;?eTjy0We(=tOvVpL)#TIq@RopnBBhF8@oEZn303zdZ5$+Io`bK}!ecgL`B*Znj6 zBU0rh%~w;3y-mxO^{Qjb&tK!~S$%oetCtqdxLD~|ee5wH_0dA{5@M`|=8dRJPXII) zYSM`emm3)vFoiv^jP+);JVkGPm!uhSCp%Z(hC1u9&ypIfZZCbFa3UJO4 z(8YcgCC#Cmkj3+?tWje1W~PgTq6|4FFv)gvCLV#Nl9}d^^*uB{NEbQ%>zjMXl0YMPN$- z%L05!zxk&y4C1M^fm8MDFer8>gqd!-SWpF6I6Y{dQfK{(o@oh?ho#16anQNC$cxYK z4&R)qXw&r!?sdvp%R`#i~lL2WjCMavo&2@e+iXE21!(8;ODp z4z#RCE%5hMM4!1;@0`7EAbs{qixQ8TgS7HK5gIM{na1k#D+vSPW@2&Lk8BL1Cid=} z58`Sink&o^5vGr#ED{Ju*`PQjX)X|1N9>s$`k8jZ=yM>IfcQ)GTb_2;;Lsp0{vRzTTn!z$o1uz+Qzp&3sfJar_31fa~h07#V-c&M2L)im5?yl z&p>+P#*}nsyTY{@E(XQRCa%-2SrI2$VBntOWy2$@@>|^(OzqFPuk6-r@DwqYbSw9& zX#D8I;cvmS{xLc89kCxgJJ0B(f4sdk**=Hq`#kVzTNBb)D=OCPQrEy!3`BsQT18on zNcx$immdNw%I)Ot$u`aDmLl~sxgjLdpl8(VErfg(kR{sckj+LQ#NJQEZ}g7>P86Kt_k`o?58y)3jwu^6Xh@zS6V zjIvD^tW@!oZ~3ui1eWc6{*-r760#`*?u|v{JWfhcQ-~2$49DljE?=LX$xFJGCJ}Kt z&Ki{&mKspGEm6Sfz^cN7kxgAo{W#6cU?ZQHEHxKDlq7&6cF-}Uyy&lPR@BO^$)dg3 zL<}~fKykH*3}2z}P#x1a{T6$fCZVWk)rvEEuV8qq=<49j`wEvl#HvJstQRUS7HTXq zGO?XFs#K3uKV`_S-oj~;Q(o3=9zCkVQ@*S4#0|F15(wRDIDLWamF$LD{Z#@~a}6L7 zyR8zpd!9HoHT}JSRDpQUMYx^v#BX;CyQ(Xcd+-qiqwr|lEP+VFjXDm`+$D3RVskI{ z$8UlosNKt`w|tL2Hc4ti*l2wXn)4Kwp-47^N|WSU=gQZTtPG%2Hr?tX7>;E{WLR&1^&tlaE1Bvx! zj0F7pZMLNJ2-^)~KuN^;m@xb%}J`X1lA)Rp=L+P~EGiz;o9P{?tAbRWVV zkKIvAbTJKxZZ1-o%bP_THt+L9vvkVpL=g5eDgGD(B)-0msG3rN z+#Pss7e4nRTT70=U-+IL9a<7;qV*2BQqnlcm}MJp(q_Y6Wp+?gUS59brkEh%m@_kK zy_yLajLp(w_z`?I)zA{oB~8aV0rGYaV|ot3*AW(yRmJXj|J%sNH*ywS01lHSw1+hDYLswZo}bcr47zWh!o zv3a_lVS+WXcF$Z(JZ`@*d9#!|XjThxmtgAN5b@@x8)n9bQ0Dt zgz+E~#OD@Mr_$~CB5UttxmUo6TYDq*$cE(J-4{-(!vkKHT;9RkSr^p{>3ON?#Vv!@ zuCpZtqEkpU(iB>zuc58$FW|5WGpP&@bzTyZ??b9&_|<4`>0L||vYA`YOwdl0Bn_?( z(l#3@Ta9jYJ@=TDcy}JfPtvsoo~PpW(aV{;;i2*GYI;^tR~>R)0bWH~OWBh0+EXoe zI2Ss}*)y*B_y|=>B-b6iqR3zDzQ!!1e9k6DyJIcqJm z{$3~M`5!Rj2ngvIz64dr$k)3x7VK@BT~1PbvQ1KUC*%t+KA--R4^I+sa`9+(7aM2g zX5h$nGIDe8hx$Hzz<5+$@-Lnxhx%*o8Uq{q)Fh6(Oja6m)<7a0Kk&;@i}2t3FUa&l zDs|92D>J*#J0!eSqsXIaVPV0&E;lSf4L}$ey%Wt`xmLT~tE#JBWLJ}2oUw#7#2y61 zgqO6LMwfkZKo`$#|4ojZ!`N3kiaq7)Uj3!i!4d)2y#c61mthBs%#8%tz8{&^9m9=@ zK7@{?J0+sxy<(aS4!EEpgvIcG=Rdhgdjen*9jAB!?3U!~Ggl@D0X->k`=z0)Fu_&t z1`2CjJil`^u9K|0dQtIBE8)%TM+S}l*wob2;I}f}w2bmQ!HmiuzW|P4#W6JZ;f_?6 z)||o{*96kY-A3%;TY6eqk{JVUh^Q+&b^z5GhB3mALTIH6 z4FdSN9f(l927pK&J4W1a2L3EO2Yxb!%6LGLux z;Mc<3FNNwijq2P5!`yg82yUf*NW`c4;t!PS6KoD^^^e+~hx0Bfhlz91ZN&dTKYiF$ z#P{_gC;!w@4{5Cteaj+`qA$ZPr?)&m2g}u#(Ig&%_6|m!Lf2*kABBS=@tO4p2qbPg zaprR1+oAtLK%{4|FDp|Lw_#?y)A=SOn>e>@mMjJi?B$wYht@2TT6_Jv?ie6utN#H| zpq3m2gMc22)Sq`Ya%9hjLww&6FrYzwA7*2a!Nii{hw1K9hwy}p$a!1;7w?I00!k@n zI2k`0xadZo2o3tY!eZLh7I@~PAfuNjj`1d@8$wqVS_V!}ctbeRc&;~8Sg^G|u4r(`M z;zfmJFeOF#XADKujUWhJ$!U!6egWvvQWym?q?IyPG8h#nq>!hkXubpQg~LkH6fJ85 z4AuUSmx)Uw#Y39T5V@%FOChC*L$s_Ad(8>W!^s)h=B_?ePHIkE{XFuXxPz*D7eF$K zHEC`S@MgfF6Lg2vy3FjshQ)ug0A?-?15i@QgB^+*+Lz`Ty;vj~eB@E&eiyG7tK4VN zN5QSRs>3ZAV3oQ$A9l0R0O*me$;i8d)9B52zYZD|H9)YZ*vSVPj7n47Vs3>@ggZd1 zJ2#R&PI_BETVvG(4ZtBMgLb_4!)p$qReK9r+n^jAg!gf|KZNuVndDH(e_GWfeqUc*e6uj=JBh-vgZ?)LAbhXv>E<>lWLuG~*L54ffwhODTp`?di`_IAOF<7@{ zzPPXhZc%oE=1DrDohXy|?^j_oj8bYP7rMc5WrR0+daj*!?&`SCbQL-F)p>z|)8mtA zjzpD;*w*x>BI%h`7>M3k@4d_~J*s(ez`wc?!I`AYauQM3f&=)147lbg}?iDUxN1craL8qi*?|!81mCb)Wdm?LI$w2$g699+4cqQa}JbU8~ zXzLsu$w6*M(o|yrYb5Q2#5M>npR!6hkw}=HNw^)-C7b}@TP{CnY;}6%zI_Hhl8Yvc zvvs^=Wwc^{EgSW4CgpNvEg?Z+W`)NaQk|z%CDPud`n_Z^0BKd4(ps}Qxg*xF>dW5u z**%MtzA1Xw@7BgbQ=ArBe(l+}glbODG${kZk6HO8^_BpMZRw{p{8FNqy0!s$dXngN zu6D(<_~=>Zeu*!kx1R!V?%c^d78tru#t#X} z7OFqdeHxGNp1{GH@G4sz&i%|H$C2fO{ZqU)W(5Or8H@B1h7da5syy6Q;xuSWERoqH zhe+d^K+@uwBp1N$t+;+G*emYth9Sx)xXbmy&cpaH!YukA@kLVN`@%nkx`p;>CuAw~ z*C&yQ1WS;LznQhY*q#xS;4^ z|G=<5mbe%KJs)Q5G?E7pZAFY?*=RX4J|nI27Ew^r=1KVNr(;xVY1kPL^6;5G)5CZ& z8m{_A-@P)!KxZxO^!|bLjqJ)UM0NR1|K2@NWc-+irewKF>^$%E1$V7F4s%$jMXbNz zP4#23V$)5RPR?-l5gO`@C|>5xXhwad`I17CvC(p~j%zw-C#9A|a^NSDL$A+T+ZgBb z&mF&Mk_&Ljcu6{c^PP1MVwp9x=y6P(-DKehywg9b3%FPbiwmD+AK5RPlH&96#^vVX ze28yYv_@xIuD6G9s+Nl%Q%INeV^tSB!&oJOTPVsNgrf7f|P zKoLe*ME}=)yna9}t_2gP)o)8DJmk_z!Ouw$_8JPL5_VBXeRZV5?QuBO;)k(7(a zcs9Id$|)YVt$`ubKYi}bfXddDvdgYhl(f~U0iE(or7O=4jJvN$Pt-<+?#_EwH!jCC zaD)odx3l=EX9R{7er;vAuP`Mp@g^|Mm|?OJ5G3_TRVkvXeCeh0rdJ_-rLm zz6oc})A7viQ_EYoasx$rV$&Dl|D7^FhW|4kzwoSIxJ|Y5;4GjFPy=UY6tCs1cZFQv zg{2+UKs5rxAr2l=Np?pzc#RmxU@UX6ed~kh$Mep>=(?y$drtI}`k+Xrt7zGz&uGs}EA1@{TiIN;zRr#yT;lwkRPmWO9*OQbS@%6fP6iu+ zTz;>xkcHImnhsLEee2S2R@((o@E_cMAANp5vQF8^YU{01-qp% z%Rb_EHXDrt#pk~j;!EHxOkkD42;G=|fB)4ID0;W&e7X?gRX@gn_o%+|>-mT8t24$H zVit1>GRF$BXH`aXIx}O%LZmCwP+ti>@xtCG%La?vGfvAV7Yw!u>|3sSrrnBJ4-ah; zmYWO{K}U&v(Vs`XpH@c)iO>>B8&FD&h#83Q)3R0qku@BUl(9||+q5sU#embzEb)+t z67oH<%2@N&-JK>?+(Vk3z#RIIs&?A@3PRD5Gs7U^{dRl`LeiRP$WjVQ%aM66#}|=F zI(v_CX3eBGJtuslYg;AOLO;{zq9}}pcs#Ac9+ODnrPmrZPv5^%$sqhJ^27uAR8$FT z)n-@h$qbRCg908jnfR@UQb#bnc}!M*z1k1K{QRnFL06pY7?-l|o=uuUyfHwR5=61a)&~rGjTwwznk5=;<+03EqAZEPGlL-rauRaURYRuy^D@vjxlp2lWr(? z%wUiXjg|MH!O@Et6kJHJ??N+qvY}sz$<6agh6c(hh-u|);?`S2PT>|ZvxY#}A9Y$U z`dwO*TZC$C<>B;|mtSd*~vL<21EA--FThc+PAf2s<11o%1^2| zsm}Kyb$>uXbPeVD-M*HKh_XGVxa45@`;jbe$Ji;R>g|TUo&iI@Ha6A}GkX9fzA+4r zIlkFD5=8m8{$KX_;L?)2lw@G6;ij_eKbuyKWbWfmrjJ!M5k zar6uU;v!A{E+QFsj#~8p+3AL^ycnEan6ISHV(N~ynUXNh#-*NiF<|S=mrDApf^z#qA6vRWvWj7mi*- zGvfdLv*)B9nY+F+ioG!3BbL?7rz*}P`J?Zgi(m%dAKYZ}7qjMbR1C~r(uHlBg$)@X zU|L?Lm!~}H`2SCnVgCqk)OguEDm9x+29s~L)va||^)C9(+C=ig@9{2Ecl-tN)M%qj zX2qFGnniN}7YSvXwx2|%6aD^6^Rc|h*z&7h?`3(N^*S^=E8~9XQmI!+^pQv8Kdbru zAyIm61~!{qj(rMW{4A6DxK;rD;Lmf!T)!832{xhw&DzwIvFg%TMRZ)2p)`gL7PIs1 zj3amOe-|^=Uvv`2(M91H$67ET|f^{*d$8){`q{%$Ip!QN~Tm|*IdRI zr;{;ee-nId+f>2k_v@nA0IyZXcatJSS$RFK?)SeBKxC!Yf_?QCVI_tR%2?ie;;QNA zziC9(G8{h&Q~EFVELe0RDD;wFzh32jqUtc?Khnba3x+iWh0pE|Lzw$mv$%5;qB$|td=Z-8q3~rMPXp=pazmEO>VJHO(J}?rG>?sXy+pHRD|9lJRr2LoKRE-EmSG_`w7;paN|mny()_ENUUIlGHI=rew%DxO5{5uF z<$w~$zKaR znm4PyH8ea3(Fe5E{NCl?Z71+rcUW{VhC5gVU)gDI3YIy^$ldtGx^gc2n!#M1kMFcsbYQX0&b;xk)u;D?0~>AAijJX`1=UU0UTYQ2jhY zG6RtGKitO?nh zW5RJpByMV>=+fa&Ahd=dH*1=ofSim>ijp9%5CFwKP+{FvER|(;hv1KFP(`GEXP!ym zee~h^d~?`C{R>k{B}glAIzt125#m_f6OLoC*ll>K!{Ap8mqhH`((&(Otjf)-)C;b7 z(u7@L5Lj1o0Tg@*pwDgJw>cp-F3^yVbt_CfMo;=t-WvmNrrkT~2|JK`DpNA5TEfJy z3awM42eyQ+zku>sj<(2cLi0loi<_p#+82)Y0q9EjH-LU9f%fLfsx;bI4w6e~Q6W7EP}xOa zB3@KqEU6dvI=7{Zkft@P!1iEOb)4#bvTJ4-1?XO^0zkz{@EpZ~w1Y6-8~=dctP!mT0TYHHrjE-oxs0=A7f+7LRbGIB4X z=Ab_9$wE(45hb@}WE{*>s6LmKTb_vlU7|qM)s^aFKYv?z+SB9p_A1K+*w-d+=w;cs zFU0z*YR>a_{P486-6<;+!JYazB}JnlBLzjwb(Y(-<2vhGv&v>5dHPt9@F)yul-H*? zWk8FI@Lj9l5vTqT+`~tR=r8XR2$~~^xzS1zY9XcRvKk=~Q=+8WhDaz2IEWm#p${LR zjj;?icksl7F=Xd>s5o&*+(i_y%%{R_jyF-;BIu;h5;WDbMToJlOnKUq;d}>BE@P}< znBTPoEMaHTj8oUj6J;_j?gX3HFnoiRDjD<=qES^*R1CQ(ej|NboR+l*aX~x3HrMIX zSaCD@gIjYMZ|r_y13`$or*&(yNnzoHrl=5=07Nanhp<^qH#dM@z)&^UhfxtJ0mJvMg?3^^wWN1i_yT@o zEB7!{iJSccBSc_aCYqI9`1W1EO2sA9eNPd&?~A=zs#b?T5BKM0H%w?Q&7E#&rv6wM z8P-yzR>pKB^o}fdD0!zD7?#C;jl>eu-dtjE0*MQ9h8ly~3%HhmPIxLX_fL~B zu-1cMd;m9~e|nXOL7x37m5xKNvKujKj&p44$M-1=NTj|4(5MIbs>L8@?+1swj58Rn zmOwVWv)lbPn9&Y`Ki72pQHRCx4W3d4@NvKk2^h5AJD?^VC@mptcCTb zHoQbk_AcK>zdf7z646o>iz#CH-GTeTm+rbQH$jMPM@xApSy2?Bvjj`obg(0gh8}{i zZw-+`Sclayejc2`&}bN`4qILY|ISFamrNCC&6dD#`CU&0z1GB;nppc5QJxF@{9)h> zT)^QvqBNG>-&!<5;tLQok2Xlop=z!6bX8+=`-P2%wb2cdN}rYeOnA+E=vm*g!2NZE zJ6M;!s~HRerX=~TE4;SJePSdyu#ZZ8H-}pbzbHoXVdqP6##L#%OK274IQsxGiaFhzh7WL)O=Pa zq|-&?Qh3BCe#=)3zq?U_jZ}e$4=H}Bp>V?P8-}7UmCt`}MTz!4+ znmM9*B|Z6RT|x$pVyw%m`>60`IV(@o&aQ~`vZQ*6f)m$DO5G6nP|K7>&t1LUu?gF; ziH653WxaK|uv7Hk+1|WNu@s39Cfh0GT5Q13c{`sn%9=_n5c_>?;4k^eUsOf;Kt&Ye zpcC8{m6LHs-WEI*V>5*b2_NA!_3@YVjQ+KPPg7`~E$JPCD*B_px$UXSHpevYDZYAU zuC@d>q*yqm|9!mzi;}Fy@(1B?9F>6 z{!CBdWwHR4gYv}og2Uw{B-$&&bb_3A8^4%`@hB%pY9u76oI2BaCfqsFE%MtOQ5Q;Ii`xgedmth8w=sFm}ZSz>`I!m zEdHdDX!AJxLi=~+`aieSG`IQo_-9>DaXV@WWA>*KI1-EIBYCiY&h`&d;@202aeTkT z@+8YIBg)lb^-XqVKp(>rb+3u8?}gLX4Q=AINWv74X1Ol@&|l zes+S<69rc+X2>7@qbt_ziK=K85mV=6HbfU*fmL_bT;dOYPKK+fLV>5n?(zt1>;+?_R zDt48yD_->KRJe=3t&E{vzl}Henl^@W<>4a#+_4r;qwJ90GB(=ZZVCSYU?evJo0K#W zQGO$qZ*zRJ%WAXAVV2 zr&39DG5x{webG$xZLr9v*Kx)0Y@0!0Iio>Qdmms;e~ODNDjD$eIp9)R6mv4oqaES^ z1~()5lUsb8!1oHr$4rZbk|DX zUx?|&D69g?z{uuO$S`hUoD0CML(O4Es_RmKG>te2M#t^0m^lxH54Ei7A!f8?(Dc+a zrryN0;%@gds_-6d8a;SHAQg3YkSvCbDJISs>tGyL-s5mp-WJSR1$%qXkhpa_uWvvc zW6io#rRmm|A(I=?&CITcv2OqYKL~nBXEN>hXJcnuuM2KHuJH|Ib31pdUX`SQ%s5HCoLV`)B{^7?VTs{ zh7N7t^HUb}_A@LpqdzMugs(C?0sb%yBDI)I-vcR#NDDm#O~9_t&287|&q3Qry$)I~ zodWh5r;LE+@UMd!no#*xJsE>&iJ_qzZ*%+mw0x{e@d!S7o!?2>1djw685yJ8r0>l{ zYCF~l1Jw@(F|%fgT$-|u3vzS%x!DOhYzi?)*P^_&LXCp9o69o zlLb)yS!Y`3L-G2VRdrP97i8JAynGZ}r(8J(aF$#s5?Ib{Gg&wCq*d(kA>^Sg0X58J zBhP*SdidYQTc z%m&g4ces?F_9Mcl0@7DMQtu9>;!6`e%$x(|scpQ2L4$7rsBc>P3p7it`mh$NIl&yB zGTMOeEP*O89|kCN0a?2=A^?q8^=>NZ01b`VFCfrEV;@D|Ob+8fSl97!OKuCuEGc~# zkxmnG%K=mhKb)N2>o^V?2^427kV?hBLwP8>&xE~k0_OC`G)?Z|-c}I^emxSU3>apM zh|>)auYBAi!(`M?uWm&(299;r+>5S zMO(Yxr`LmsoT&tTUN6qBkVU(EK>p#i8Ba0nlkZUwwPEY95%uHfIs-)1;vux^$_{;e z4!K3MzCJ?gqgvosg1b5DW3#K-sTQzq`&P35)lb;;uDdJ$I)taYMWJ_`c;iyDo#fPh z6V3I{S&Wh4S?9=}*uFS^>6FhQr^jfv1DnN+S^9VSEdtsJaoX?ViLdWwBq9i_Q-Tm) zyd@}iISB5dsL=E$y7y4QoPHWe_qD{S@`y?kuqbIAH%3`nHhLKJz;C=KRyk;z@?Y&3hL)Cr zymhyjCRaeQ`5xoFr()(L1d=GW8Bt#FjO+*CYZ6$khlhB@NNx3h?{E{{X{Bp82pY&d z0EpJa>dHGZ%G?u(`ssi|G0o|L7Zfp{gj){Jc??wqdL%Y>vYNttKwx*C%qf;Z-*8{PPJX+(1Exzw8r|5b#$K6~diP0eqp^_5qJ36sMcdm`Tu7z=sum=pmj$nmk zM4vCpESP!O)FL|;x=TBu4`RA@=I|%)mmsXUmAPB$=hHXLC?A&~uQc2p`)?gDd0DD| z=-=Dc&eN%?e3V#l4x|q8R`MZ@nU&p)W>iv{wMCcK*?R`!2+@qJeBL;e8ajTaKj*Tl zcMK}wB_j0I!__MtY%squCgiPXVX2s=+h6_lbEig{k{}b6@atgi-u{J}ur)r57H%R( z+EY*WSa1_hlQG2grIKPg5R>T=)2$X3hP%CjS}|JRL)_MB!}c1vosWZvzmyV+1R6i0L!Cc%SL|Y&}nbcr} z%r0?_7Lm+hO%TyTpNFmD<#0Kau2q-QGwPVa6m!k89}wI|ZC(^m@!f&H^tgbveoSt@`b{~q>^ALjCq<`B2MZ^d1IBQQd2Vx%#m21Y80t?47T zR|rMR6GkZi`%mcr0^EBJ8`>!2$ zqz2RNKPV@eVhrHB_P0|mFrBRecQJ0R$|`P7%}J1pP8;(>u5w7#=`G`zoQAnGsZ*)X zyx-yHgS_mcv&`#F+f?M39#%0m@N-CaOv^6=nQ*i&GbV<6OqmZu}@sN0yc9R-#8NYQ;qb>h5|jF zdP*wCgf`}_XSV%@R%IZ#eNueKW7OPyF&mfL$4jrQ8AeP+*vKZOZv3#B_M<430@@hM zZJ1K~T;gl!vCAI566}F#(LxU-&h$jSk=KM0$JJEHJFmv8X}|Ev>X_R&dQ3z*0W))) zOepg~ch?t-abRC(JnK1kH#Wr1gr%j{4Y(wz8^lQ{g{c~AUM<2|5tH>RQrUjG?bYd; zClb@aOLbn202ekL^18y~i7RKHiCc`hMXtQR=j==z)A>cHF`GGG&%p_;LQmdubhG@K z`j%zNO5ai?O$ABk0Kp-k7PEsp*o|4~)cpUTdcq9fl>e5I_slfTy> zj;l+I%PChg4nO*}{8y7fA0}9$&NrN0)T*znZ0x|r#l8Kowj{hc@Zk6D{ByxGFA5AA zG*ipk3j3O($+EKD-m;|{o?$)Oj`E*B`~pSL(_>$-QuM_byQN8hv+l0Cj ze55w--y8OZs>3~gaCz<>-Jq7;4o*t(iAC(D*)v(N0GelIWH6{zhTr6moVBp9_|!k5 zv|C&$r@^B5MauqAPR721Eej{6VHBop363@9g^?SdD3@CPe}IPQjumJTzzR?@2)QW= zoU)p1Tjd zOhCE;4s*L@^E;i3ItgzPhP!OT4Eh$hBftX=KrXun%zO5nLynizF6^zo=e z{~%Pt$_Y?qrv}eW0=;ZdPFDs8n`BlU<=q`*%#d;ad)rRzTzSf12_zg0>z;(sMV*|3 zEp6TL`$6B@Y*-$c9dM5a4Lc{4(~at;Ve)E-_Apj$ymOm#;chM121X~0S?l&xpZMM= zO1q@va08NjED+ya);o8R7FLJqk@AT0Dv4RyOlJjWmK2uF7oKJ$=Ix$#Z9h`rd*ZT1 zp{8-6L}vNmW{h11?-EsQlr|Ys;(fm*h|-$w za$mi|A6Wq$@l72N&p#W`vTHRe|JZrfg$>LA|A0wrPChdXxXO`oO54v=kkXPDSa{-C3(dc2rIAaPFj@Nwi znulC@&5tPen-X_7clrO3f1IS&k2gdz+mRuW;)BL&dteeX8Rz+ue-@W?){mTr<;iHb zgDu!CXsMVY+t9A|S|Ddw&W|*U!hg22vRsy1I{7wrBO#JxVe0KntM1Q#5wX~s+utkp z(h>faO;_u6pAP9w2Nr~w|B0r-4nyTCkei84!-iWlk((!x(A+NRw{X+!#XzJz4*Z%W zM4jVruYtY4<{S$YoHfjrpUQA64`*Rm4Wcw^UfAa)_2GGrGheMQQ7a1-a*!>rkr~!G z-COAX>*voA4X82+(R3_XJy^7jaL(tz%?h-JVZy%2a?DD`ohK_-Tls`%TXLMEC2-2W z;*@rhw_{URnuRIVVwDoMweIftN;C8{Dkq+(A1cx@?^^u^-V+sl4$&6+xhS=Qa?;Vu z1pjVtSH$0E7IE-GWm8>A9yhE^3=qUBEb-JWvkCZECQsgkt0oujQ@3HbmC4J@D6~X22 zfW0u5O2RhtF-%>J2yfvev<;JQLq(}(h!K4PGRX3l(^4z!5>OmOsIP5yeqxD}EuYm7 zqkbO&DtuO+di4YW78Z9->Dtc_VMnUX`DxaDbum##EMyKx@lsXe`W}Co%H*+yXEji? zDJ7=Ajp$Ty&;-2e&_{wKZ*5iUk>(CHM0>={&vYC_R7ebB+Uh5Zhcc^3$Mt6v2z&YG zfAV3RbF`T6JP;SJ(M)vi99wy3A~HIh`AY`bA^a&KN}cvTOxh1=I{Wt(%Tba_TQ9q4 zV&{st80Mk|R<(DE_r(PM>Bk~@2@co`ni^!=H2Rv{d%5B)n~SBM$+N%lFSqFyzU>`K zxVn>e@35)6N7I-+Mf_AHyoyyHLVx9p>rg(s-~i^*r|q|^xCRgfPHq<`y{^xs_mEvejeS&b*F9gGtO0=ks8~fi~7pq}*I(?$s%}kT8(eRm~%rJsv zF2f`bf(a63@Ju%~XQ2x0>ZCQH;|7HV! zGMzLDg}RVe8@k}j>M8>Kb~{n!5pALOJPcAvIW~n}_l24KfD?6mvUO2m8w0~2b}(y* z@FKT)VO)uB>+ih+QZDR1c+vYB{I4yRssr##71O`IhPET-)2{T_0XNC?Dhh7sj8tzMLwP{jx$8) zCn_o-eBX14bQ5uxBmnX&xaqIaK;?05TD5FvJ9V`+{7Ys+9v$3!RM7%kvr*@!w~wp3-C{m#E!e3l#=$ z61>?Rf~{^=W1xT@^0Yd+zN)UyT1yrBa1p4Sm$W*~_%gcLD)4Ju%!qvq7!pUW<%3#1 z%)yKUlc0(N!yl9H0=$Y&P{)-B;k<#UfhIaAo**bbMb0N?AY@qx+6k_B!{)=I2~0`j5a}W@3RAzs?$=i znz0>g(QBtFX?K}nv!(F8(dPW1S2?3?In z$-J;0H{ANKTg|=-%*yGD>C)!J#C~ZHN!6ZSAVJhbq`TGE4-v#Pnuj_JK{CF8Znd0s zlKTcQLKBzho=o*a`6VozXZFC$8F$7se4nECYlqVrwkg$FBKvwvCQ! zx5h0t0=gtm68N^rMxTK)uO2OS6d;f?BPa3VF=Yh-c4(w@<`e-qx(e!kUDf27aD8Vg zI`%#_uV%DOyssO#R&%r6aV@vr0m+Sl_AP9h#4X)4%5ZhQ`4f5JZ4nk*S8*o;BNk&YIBm*O4Mw}AR-JzU%Z-;J@`)hCCi z9%FJ{Io2_Ht-gD`vw6EA+g(Ci;6leWa-0Y6j-T7S+Jtve-tmlp5xkt9;t|gZZ2N>J!rcMmSe3YM8L)t5t7M^vh2a|$b$>%@ zHjx`+$m$KB4cW|U$_~7@iWe@~F@?aqV93}h$(Xv&BUFfZd0cRigA(qxg0E-YfwJ&hSK`IdMOxaLI4!aOb)7gZH~#c_PV;RlOo zf^+raTJ>$Cf|A)D;UU=Cyqy+-=WX@^AGjWSHb5%b#3Jc(Pa$3jZ>Q!~qXwa^`)t5& zUSmhGxgdy>+mHe=wm@|&9szFmMoH7%g`E7AF~)*Ro5^nrPTn3HwlCQ91%K0euS+DQ zZt+R0tdjgC7{d$hzr6{pijs^2c=D=9Lnv_|9EkHdEPZ%CpgqK)6`0M1gDD53N;MVjTFa1;E3l|?a(Lzof>@Y?3iR{Z_U+OdSQFyxo`#=p);#pTN-h&!x9=lm35kLKs zIf?c}WBdiywc6}>udw?X(;s08m%rAdz6|R>Rd^Mz`txbJy~*=StG-knVpj6c~PNO^N4u<#%=a; zo9~dE0G77ph6spT7UODWHp}WHAP9g>WW9>Ef`Id`&c2eTqdQK0oA6T0M$0vS-Dj@kWa6P{5hfjq37H<4R%B+AZYR~2Q zZ=zgFWp2e!*jLsCWF_ECK|b;d(RTFYJL3@FQ@~xV89p ziMmm0rxVLEen{X-=%&hY9*b!%q$jmhmP9=y8F9O3zn98q!6bGNh~Zh*PBC@4oGWts z;)f0EvhHtwEH|>cvnFlhM-A(m^*#KeB-GAf?M#?~c1U8S<#l%N!w1D08APA`!N)-4 z%``)l)s!jm8BJJu##oK4>NvD|Z`6UnueVmgbof4|#f08GQUX zkBYImKyo25z+@^s55 zQK({(88DwgZCge(rI~N#l3h*M)OZf4PgpL4>T7 z7>*}WkfuijoK(c1Qc#IKf9{Fpai#P=ml@1z4LB$zU_6^QrJ9HeNVN~RKPS z)zJe~49Ajsws8*cT#rBgLyx@n^&%&!p3})L>BrHA*rw+r6%doNo$)%;ZGCuF@PJ3+ z0edZ;C6SszAN!}|ErD&uIbh5{Pj~z(|MKH~2a|*}%VLYS4k@Obf&lpgTh&-+nrs1& z9IH@Q%ZPM+bx!ViKjnLh`}wq8Ls+?wJ)RRKb;nK}J;J&b>z_^~OUu)rhg1h(LC38m z&ZmUMR66#|ryi_(QH}gu+F{amPs(x{CEnNGBs|6YJsiZ~WxH=FzBZxM(KESp=0Laa zIHdmP8R6F-Jag#c%MScbnc&^&QOP3PXPC5MB%>puF_^!F^k-*|TYM`7Uul?pa-!~U z;u=#;wNVw4Zvwkq#XvindA;~*9~-5@%H|^9t=keRIR@(;W{;kj2HkY;{$9Rli}%pu zC3xrkxG|8wYRgG_o^kbcC6F36ucIk{ExrAgjuz{e+tqz_!plt;(-(enKW+X|({2^Y ztumpXr#>BU(_VR@x`Li`m^-HCETi{eX)gfKo?P?diT{ahAKrgC!ovZM>DjpMIAT}Z1wbf~lO8}IE94}JSR)jr z?Yu8}H8>xWaa~T_!gNOe&WM_J3Z3$pU!|2Adrx!PMumvStFrGn!>oljJ-aPVyz1B_ zn`nd)4{)bKe&`nZQJ8%y=4LbCkxIOqKxIkX8n%|GR!t^fi@0bU!^F1#(4nS1!G~-4 zsF?>t!lEmNhzkYe;5-b_5Iy|6b#;lX(jclITtz${D2KCB+^*LKO~`S@CuacsM-svi z8dkRP2%r-*O1`vy_NvO$ZkZq_S9GT@_|{yA(}p|>tC4q7)+sSo6|;C+S-$i(7Ij=^ zI4)o;bTKWFZu!n9o(Sv9!3mgP`M4+d02^OP7F(Fa}`)obT5 zwi!aNLRVKO;neL_*(j?nAqH(HnpDG-xV~<=`W30-t~&NurT*Zj#UVwZ5iB}k>PddD zn|ZQrn}?}8*}E8+CHUvLgoa`efTM8dLIKON{DUq=dEj!Gg-w zbU=7laFM$3mC|LYESC4H;C`ixV~mnCYF3-H>gd<41tH~_x>ue3#lf*L&d%Gp>^ZA5 zzsOiovBiozb=pbW(tGy0?`AJ5&9dw?t2B$pFKycBqF;aU8oUsc^?w+$5Ir-$mq{}x(W*=Q}* z7CUM!R|gI+YO@6bNXfqaSMSPJ8fE||&)97BqO^xwgJy~u*IcD9QStqdNMlU4iK|mi zz2*hC!LU_62kE84vH1(sJa5D^%|06dB@J5;)62EqvsKoLo{FqyBh(Y1Gf?r`8cx#p ztn*(8GP zebrNl$$|QNfs)UE1@dNl!U&aa(>YcRKZ+_nA6Y}eFK9+uiooAdnsL1(=RN(jXx80) z{HYkWR+_vQU$H3{_Rvmt`)Z~z67*;@IUd-FX$aa5gw}=l00qLqXH>t?%4v1^#_Mrf ze$0C~Rzlj~2_ZJY37sjD?Z!w{xxK2sehNdXyqlS<{j(L7CNQ{FqkfiAFaCo%aj=y= z@~22$Ig&pUsAC%ROTO2GW&F4I|KA2C>rJdD%q)cyO;AHXY!aQ`h ze@EyzgK=(8LKi)Jin)S(bM+qrZ!cwXT1;+!b_rjC1gv5+VWKwjvEqkbTgmy}V0X#3 z!8mzhfuC&bs<{C)W}cM^QvGekrbK$N1+&eV|F`$ieCSdOpd6i?ZOj#_JKAX6KSJ)E z)7tfAdD>>6$+(b37yuF(6H$6>4H|Uw?COhgo?Z6Sf(u>8{h{DX_Kd>>K}hqs{P8sRk(d8sug8DT`kdhlpc=f)<&t zzSlW#nTc6!(c1puB*QuIW`)?72cjcx=kC0I_2+ACEc>ffrkd?5$}HxVb`SQ?Y0qL= zZqyI_`Y*bs@d}BIsA`{M%FNWz@>uC9Aq<$dp zEtK;q0sC%6c@Vh986mBEy<~ShhA3BFAx$#%To`;jU!Dyyf}dM$8o+QwveU5`X$^Yr zQ^3Z-Ko!s(gvRDePYs=|Hk1-oo+0Nl7&>(9VVV=+mAM;==X%AmDuUS`bTn4wxbCan zc(E7yW{@ER6zVn(8(~cdE=j9ilf8VOV@PR)j}cQYI}}Fz?nr!5my|Y_@vdMam%qK@ zpZoC1#%l_|tPaeOmvnkFxQJ7Kh z?;~si#oE);i&n&H;G{B2#Xr`X?jSp=P&0prdTp~(*gOopjc_e#Zpzr8TDw@lOgNvo zGJ9=Q8Y?wAN{7>Twdq!YEpD}2TZ-RCg9DFnaSxm5G=bf;AoCp^fm?k$8Un*R|O4^n^aYUF+b5>rq;jZd;?WiM#!i z**mKU9oJb;%Pn46G}?9X3*9?5{D}J4;=aT7$=Yb)>jO997T9$+QA*}SXw=&a?s07< zXLNDsXG)3lAS7hzdLo4jD9y$f_4Ehun}&DgLm^MsM(f*zpY*rhR^Z@Oexq>&4r74C z7ghvQucX*vX@tVg}+ zO5Xb)hePY|I7MC&5l$)9wj(oh`>R=N(wBy3i4DTofk{|FB*&5PiB?H_@bji~q1RD4My~63OBvibSjNr*+3d z@(Sr^7msfCa6wN1U^^`#-R2hPjAv9D;%YEl=S0B-p(dy=4>%hO`SNsP@*3!IjB1(d zDuy^7wF7V!KEnFDm16aI2JB-^!>0sU)3QzWwFm0X_7R;bQh!$Onzb)duBW6W456o- zqpInhSI-9t?>^}a;V>{eOnWElo1q3ONKW*#SJ+SZ)pNJIb2j7jdq}} zk$P(1_wbBpGpnHDC|!J?s$MDEd_slUdDnY1dLwj8ER(5+t|fkZFwR5~UxZ>Lr{`a_ zoWcfvOQkA&XQY}RlA@~KCpD-@=fav$b?_y3&lAMe>KprjcNOlx^B7_ynYNXuSfCT*}V){mxQ9FCybz`#dKD}f-5O|y-VTD@H1whocJav%54UU;Y# zn%L&S$4%qe(^2*k>YwWA`xjPHTA&;+W>q}>KKeIqjbn9#BEigitD-HOC~f5ApDKS~ zk86UiOlqka(75klHYsAlj{iKVZn4$3<~Pn-Yh!TU!^y5*Jla{mq1MXPo>F4beu}uf0A*{GC=BUE$>Dg@%0^Bz$sDB=TlOg&d*^82Ql_5&UKVKQ3z`E@2OQ@ z54IUbz@x0Ug-Q-4g8`J?C80Bkm zmDmf0Js}N@y&bM&3r4lQ^Ry0d#kKC2HP>1k*JAD#P><&=t(6h)1{+s_#^?z<)A3(Y z)=6Azi3uaY^O8%fYQqw*bvz1ql!hJpQA(4$rCKjhk8DNgrXVotD2rHoyUx|Q64UJA zLWa?`4Q#1t7m6~lRV7Sv6a5-JHxqVXwL%fl0apXX>_h%AARq6^nyCE#^|%nSBpE!v z|JfCHAQhBm0|&M4y194n_a21xcZf&tfoILpI~y_ORWgQ?eY0D4b?&+8&n~4<69Yh<+qtvNKs#(o*{kt&92V9^kI(fLAO~6hj)i)4=n7DJzigOsw2k`QkgwKu`U~+u3znxa`kipAD*rt;S4#^AT<*;-PATKi1M9?S0)7X5 zlOzuxE!n&e>|6ah2JyQ#&$eRAe4zs}rP|W{sE>7obvN{G$tuDiqApRWgjng;pD$`_ zur~!0FqQN+Z;sRQgdsEFqe~-@r(2_*sz&1nZJCo0KDEa!O^HB%Jho*Hc;Gubwp%3& z3;bUH*eyQ0#{HUZFq#kuF|uhXgAEVj-%M10EI!iY60~^p0tjr7SeS70)u$lJe)5( z?Ja@Jo9C-DFfm=S7E3A@?jKDGikhu0lMtw3OjUcGWM_Jr?2C&p|M6P%xX{TnG2ynq zZgvx!V4ZNc`lnz)MbEBh@#5Bvq``N*ko1t~rI`I)TY*V5VCDyJZ z*6=9FLTlJ5*+7=Dz`6$R@TmCrhbI1?KlDU3(s}KgXf=|(Mz7NvQTn4NEPcM#3-6h^X`=9DP<-e?8jJ^M65rLmJ9p#>GJ>n`cAz1NaL;#!E zKOfHj^5=BTi#N@zGWo7<0o}2a?dGah#a~qg%QEJjXBu;89zMA6zrT7lF6T*B0;(Y) zy{&pBJp>|LB>|#u_5brjv}sD_B_p750(GYE>WM83hFQA%0~G)Pd-RFd(68(toer6* z3rYsIfUyeG@g!F}+#2==fG`~cYHvFrJU)c9>5S#xU0bGt68nPJ0W(GptPAkR4FHLQ z48{lb9>>G+s;HOufSeg4K(+zL00ya&*9;0JfRu3f0FdGzPXS`}@h7U!rSO1&p~-E3 z^|q=d_l2Jq8T8+?jsr9o8$jatb7oN%=XM;b-=Pdm9K`yS*#fflEM9VVb;c=o1CR`w z0Q69o++7$)5QO+1K-}z>e7UtFb4tdx0GODGlD`{VDA+6U_qrDhr+A_lu|NPX69ElK z@SboJ!AsGEya*@UCXn?v7*r){v5zKa!2$Fq$Hck*zDufZI;+b9R7ZnJ8ie)!^ zrDZn9r!M^0xJXK+XDU*6HgF2v#O(D`kA*4iZx4qpjQzUzT@AebGVa;CSGgdHN=~2H z*w}S|Fv+Fliy)hPpw56dqrzXwjZA+a$lVbG5|g>Nb?-fVxa9*QLxUG2L(i;R*G}q*n*14*dQQB$l!RAP(P9kS7v~j z(v#f?$vjdRvnW_b-Ve(X!pcA^IgHTjzH7D;g4wRNcmqgCfLQCtR5{f1uKvb{plp{E zYR&*hr45j0X@}5YdJkl~5H&t`9Zw zRyfGh%klep5g&1{&P$<~#GSJ2I>~|A@&!Xt!4S;Yhg_W{WXi`2mN>=oOg*r99qA>i z13q7`SDSVfM*BI>GcDFBhju)Q&`fp$egvcpA7l@Ee7B~s*sUobwZP-7501K3H0hb9 z^V1*FIuz@vQ=76?VrgjzXsAR0w*=7ZZ?*1-;5s0#6-ImX)&X#)@vfhO8{{~zQ-Hi` zp|2^<|6fZ0!uQ3yCG$ApV*_TvMT$5Pk^yt|`i&u#DZt_veYZoJvi6R(I3NI82f(e{ zOVv&*v()8euVx%LeUn0GmG}H*~kAfXOx7+xzBh>x=|t2D=oI z_A;US-djVQ3|DH%Sx&5e_uc|FXqAZ8_&*KR;h(GB@P(fHxv{s3=Z^r5#2;>b06bOf z_VRsnrMpJ}05L~*#|r1ZX0a?0RPWjXgopcztvd8)s0&^Z%0LE!gMLVrBYC74(!29n zC^BczwcY(&@cJd?%P76KS5iSKlTWXcgJB0_@%MuL-kMJT`uy`~cp%vHar|7n94BDS zb%tdDZtXr0S*$@AA1$?rKGJ1*6DeZZpVl#e1X+|f1H-bX)j-hAH6LQ2tpWb~#}I3ZR4SCa^%V3E{Y zgG+5F9mN`p-5I70Z;Ka@)iy_W&cA^E(c)65apcAR#K;`wjEw31gPXuO3_X6U;;WOU ze8CkM(evVxrJF0r$C6X8pny^}(0GBW#pX&Hc|5@WV>~EW_O=`*Mbn)DYFdfo89J}` zUMF*)jR-B(VlwUur|t;I!idgqHap4W9C83i3zg?o`RM(y!{zw@*yeuKN+oSwsIzHI z8wH50qH9Chae*v?EnOb_@SKCCj1le`07ORLjEs^v#RD8KMOCp|2}^0mjyRC9%ZxAN z2a5IkiOghAY|C+#-%8sSaAA8=URL(9)khNOt1I?Ymk50r%qrOhR+C!j7GK(%oCZk`Bh%GynXUHE$1`!g(H)_RqJ6d&H)x zxUpUuZVuraU4!fWOfJ0*7^Ma(fQ%1+rj$EsMvy=wy4PpkBSG7f58vr%z)_rrfpIB zrIwX;+&X#xt_Tt31A$mpT84Vu?ddO{hsggO@u}Vea@C@xYceLu0>|i1F7aBB!-U^e zjnj2M@z!$cl`zr$I5(eENv%bIKJ?0AVo)}n3grIus>}q!J0TQmnYMouK(7U=5r9>K zpBmKBB?8=l%4I9Jy{SD+3^5N&fXO_n0i~$u4X(8ODM{Vm?E4YO+R2nN%gzKPZ#+-0 zkB+n21*G1Q%eXn~l7lILujr*x+BofZqHqFonf{!0zZ9hACvprF&R*{S1rjv&O{x-o zj)B!-Zq4up;UP)Tqe%|rp&exbJ}WW~SpVJqA-C+=e8KC32L@wNjvA1ABatZNGH@ft z7RnuJj7TTw0~S{VEW|ieT&60FNKbsWgP^d1Lw1%D)tIlCCDS=Y`D++UVgCXWSgsw8 z_|pFEm0nw!+74a1yDxRl z;zy_+N3weItxew83;-6E%t%Ayx95q~fohLILb)0y%Ebo~~ zsgpdEl04KZuDM+PEbbuhx1|5t1#Ae^LjvjY+Y9Ymx_Z%JXLE&hBF)AnD7k){+C~_> zJ0HorC5D5IMc`Y%Ky3P#ChyN@RiN9#CAVTN+7q3PoxBg~`M#D^u6!jS=j*Tc^f~|9 z1q{FYCfOr{S|_`eUxoTHgN%uh(x_CUO1k8f+TB&`|3pH65a3 zc2^m_r~F&;=_wBm^=MyWUc(L=28dhH!%(WThXx(-do;28>uS|7e88YZzdS0s8Ayd_ z?!NHbj89B9ZK=z{N1*Z!{A8Q#-X_VQTaIr8S?oLn-^w65JbiXkaOnJh{Cr+r`^CbB ziu%YjStI1$ZJSPVhLxA~#Y!sK6ht@;v!9wgr@8KUopQ)qGc4MJ5_Bt^Nc)W>l+ce&Dz5m zAf{So3)lISf}^LS6^q|~8cgk7T1zu6kA6;r-@fsM#@0q0JpxcbmYPENu}NV6&Yu|E zuN(aS^PRtR!S_1U?&0zJR_v7DTv)GAbVh`pFuj~L6Pc$A54q<3={X!e;Z(&Q!6|@!{cgsyYA!=y^CQRUf(bui$yLYAH;TJNHA0 zm9)AxjaQU%g>?t|XuH~i5RstI)}jf8YToajhnvF_EnyOZy9(Uf`(QNvFcTDNJnC2a{ z!jIOvgdf$Hs_yVG{k3=jElYpOsS@Kx47Cqj2JzLb3m9)@p`;FKc|90sWTtweAmsuq zCSjC5StDgCG0o%Ww}GpJIxbR*iK$O+Hh!pH4H|%gpV8>vBg84fxPz@iB@6S1*-+{3 z3ay--p4$P&E(`P&htDaeu5{M@aQpp9%tJX#OVVwx%}na#A@XrPNXo&FZA(i{a)|CS zLfQCc2mK}onKJSHvsmM6I0upS9%24Ee|+X2^s_~>N8WRZtq*wc zE|gbHN;Y{}mB&Pat>9-$)xe5mJ7&kvO-KNi7Zw5}2&lCI|6+x;yUb>?R1-eBleo+2 zXCTnP-Ie9#UVGg%`#;wd8p66d!!7FPiMmZ<#B29F=t1D^(?*6fZ~<#zS-yd00|DAo zo&CEt8gJaRD;Fvr&d$6Me{9{x>ly?a8RC|4OhTZyfNK~HM#jQDs8&*yHO)q(td z^|G%0=TBFH_}>9ZU7n57ZpHM-Xh+aaVU@k*#_i*>I$*W1W{GjNoRgk=5*bGGXIHZ+ zxB=35X-$c;TKba1Kr`{s!S|vu(>vLllxNa^ip)ap`hDSze;1JA!$^P2VWw3^(s;I| zDHKAnLnA-^<;K?r^?UpzOC2AnmAh(%V;+>o0})}LY57AdlMJa{lR|#y@ZM{!n33f> z_5FxPf0n0&svDAX9?kfFZrev5OSLzBQu;e*CdL`pBnCea0|jwcz)Eh4tjS(GOQKQJ zRJ zm~?W@vrO)uv4$V!)-BC4T2tz)ievY#UcY7ioU)|o$1M0btvx_ED0(G?N??vD?ebD1 z!zBuTZk~j8^xAiXma44D0PzZ?o&Db{E6o+alc2HBD3`sZ{FK^^4cc*cr!73;^Mgih z0lMwcMsZuQy9Dav@;x@1t0^z8S*nBPO8j;$$JME%r+P%P(T}@3&L_LX(qw2qVb@S? zzKz?{s;tx$2#{FG+{YzDY5l7!c_NR?+Y(1~fXyvxJ#r`ge(K+J+onJPFhDZsLq5J{ z?Y-cxe^+5CVDM*|=Oa$`J9~7Nh^_C&C{vZyGievhAbaAKWx3gZ5ei6B*h>#wLf!I$!a7{C4gjxU1nV(RjYcO=tEU{i@(hB~(lF%fnRpgtqETAkA#z zyIBB~EyQlDR5P^1OmZn%dAk0Kw16SD!$u#f5xnj?0&WXomoVwy446s0-+u-9NP(+e zj+xc)kGVs)RX|!pD@)qv6hS>rzcS!|mlUBK7U+EY-qqXvFSC_Nmsc#>SsK&!aSc$r zxZ&XW34(ldu<_yax6{aAUI#trSzX*N5)S>mFTw|A-lf07SGE8i-K|`D)|qqj_ks*F zk@cXd6yY*_g=Bl;D#nkkgl@@HKJ9#o=dU*o)+`zJd=xCPW44cTI4V6@so+LS?Iw}} z>~T3bsl+_z(J}(V?9LDGImx@N2(~%iL*MPIiJv){J!o+%wH&_gA z<+Wb_D!8ZgDY!?{@R;`u{~+m1mgDLs58xYHWEt-E$iCNXuXr0vNx^}S?p&;Yv1bx5 zn^JY&7Su!g@F@TI!w6m}zN%1f10V~hS2f5Xj5A`Hd-qNevuKpb!RW=0wjmig))Sq| z4xHMhgvu7p8p!nw6MMsLi8hlUfqqI(+7plGt z)%>`ceKU{#%e%nRX}A{&iG9pvRn&4MVJ3C?hRv=ixi%4q+|irD!KjXr;E4$AV&2_U zA^-J|Ya5R@8;Jq7pYro0tIl6CAm=Bmi@K};VQ8ZnYG_;AUjrb(x;{Z9Y;BFu(Aacw z#s9EpwFMV;cx0|ORgV`+l6^?8CRIP1A6|+cR`aR%DL3XaNaxl^mySL3kl~DD{Y zrba&slk1`FuXqdRvXE?5DA8Kd+Y*M4;Lp`oHT2|^qnQu9ig@ zF*M}!u{_uM-Hm20I#TiRuZD^Q7tozcKQ@YnHDgmxR9CF$rOvchc22mP{N~7T?=8Lx zykiU9k~#HLf>h`fuq9??dYMZaX1eShX`dpZ`aSdIds?f~Ck&p<;j-Tm`V=D~k3aFQ z9`A1Q7O8R{lQlXKf*bX^X=k+3>5|+IbV!isA*6?Ez@6lz$OhsqRP`wvZ8;vb_e_t} z5g4;fM_l#q(8>=Ai1^2uJ1H)%zaKwcfjv6`>WreI!gjf}VXA{{s7YaGf052`Nrepk z9tWE_K48x^c*Hw-M-MgRku>K8&b0CDTI7yMgIBm(c8?w}wW#;^ymbOcpoRP>>9HgDk`o)h4JK%3tCFwbY_x@!A`q?%1{)(2$wn))U1#A4Q#50hVg*3@ z7$dXF0hAg%t?0{Z0GrnFW#>YGK)Xlzmhs0gna5AYw^EAg04wrGJGV@vC~ z2H$G`FW}8Ls`@ng>E&jPnfo`%_0z(owvCL$9~>Km@lpt5s0R>)O(vsNgmHU*Au59g zqJqTbCT%|ya*mcYoN>MglrY5pZBXcYl!Y+)8~fZ=ydgy+)jnCRU>&WYJ;!+VhTUJg zSSw&%cI<*Yf(G(=xhL z=Soez@e8itRNjY-gbAM3bI&M7d)^igwW{u+@SXj)qFqldk5a(RVph4ofm5C9m&(0v z;Gn)#2Kfs_76^J;2A$s0ou3SgdKJ1m6YGezoIivj$4!Ak5|HjVtnDqE5eL!qSAk(PUkE8)6cWQNBGtT9nl*f6LI7mRA!IH5>n7;qZBLe$y&0oU)@}`tTgnVg%q? zG`^N;V6#HOjmBR2?SUrDPd@?rTq|-rm44s>qQyyRrQe|f&f(wFwoPKqNMxhV45+qj z_i4D#E(@C6zLnndp&z{jvj8xSe~&p`WTsZtmeK!FllyeJ%k08HrfS(@fy(fE(nehc zzS4LpTc^OagWf(=mf@MGS=O0iaFRP$&okqjy5jX01F@CbL|vBMuojsEz$3d!rS5v! z!k*W?{cd9omvwFWLyFL$N+2(xolZ4H`(4rffG$AW%B`96SGqBY$2H}t(*P!l9miPb zUfl6Xg#U}4*XwJuZ}0oham&I#7B_yApp=nE^S|M~&+p~Kp#tamQ~1O9P9|^Agi|2o z4rK~cnaMeSsdYs^f!m{1iw-~mb>v7!PvG)u#^Bz5g9_*loetsjwXV?u75AT=hYYI> zwbQqFyqIEUD!=tVE>xYrVx*Rk1mE2k^i~)YrA*I?=A`kj1dqB_$vUV?E_K4{U$!={ z-SU?&;KHUg_z8&>?flwt0G5pdn=e+se$4<_{&a_gT#7qy)6pS!8CZG50DQb>2<4! z#C5%A)!7DhDc-~vH8dr@B_{0OUSIcTAkMp-8K^;}C8hd0lO%K)^};cJ@9ZPb+pR*3 z-KpdzX!Zrmtaz*(-04-tvL*JK^v>z7l>j56$Sv6@xiYm-Ra1ZDAqsB5s~N;IS~~k~ z!~fm&u#Xq8k6M56kj_)+4|0uJ(2p=6DRUzM4qKns`WHufrTl62!#85z!-6rY2@PK! zZ>nE^hB|Ng`##d|W6%#h_Se9kuv(L`O&Q*Kt zFKD6a?}7Khq`Z>bu03<7N}vXshqhPE_}?yjdDoU7++_9a7a>pW1Seo>&s2SZ_yh|U z&F8e3Iq-&EBWMyYi$FD*+=M!i&$Qr#G*S{?>eVENi{1Ac@aUDe=KE*=oT!GIFrWq*cpqqgoYwiF z4DIzM90QMvu3ZvEwyVgkO*P9fO)fN+N`ewvj5sB5U3j&s!s=}0ROg)QQFMogE+K2@ z*b>|AIU5vEfFNvf*h?hB*g;nfs_BCQ7p9STHd)>K5r)g11BoQyBt5hg;yhNva|#I6 zW>Re?FEJTRPxxA}uU-kV>hQCwjdn0@^pA3WLj?a@J@(Ir^D^f};9xg5d42*VYhli` zwwP$b97r|NXmzb91Qmv$kn-F{p2WX>pcpK?WS>X%3OEh-fNB_HIhDa)nSY;D6<+pW zIxXh&MV;fPUZXr;2endbp8M({s<%N3AC7jUIQ6W%1o}ln&~5jLJLTCe)H7Uzd)852 zi#Pj;^AlE^?cq{a%6mq?Lu)|TxxO${pU1Q7?EM4s{n024$I;&Ko7T{!FvL$w=kT3q zpc0I@N&RO~m>o7EXyb8ZIMv=bh$xisFl(M?Sl<_E%!~5szvAe_J0kp>s;^$M!up=zUlc?`2OI1m)}^M--rHs)J|COivRL^H2#u=)OCZ-~(jU1* zvLk=U^+d09NJZ>UvxQ%I!(YVJb6DF)$7RomfxUb%t$5OF7=bTGz>m9?q90cb)jRZAO?l z^y%kkw-Pn-?%%#=HRihqtmVsA2?EU=YZ0`kZjL1BF+g9p=jd%#H8a6@%04C$dV!d6m;Hk)sjulGBIz-j9>e z&*FXvib}Jk6|Ks|JXS`F8wa~5GSB;y3h7!+I;&0hlpK~aJ`rYi5;^?$aP#5ARFrr6 zF|NP`&KDxK0=sfnixM%Z6x}xb3}9R%_-o=W2n9VFv#5JItA5s~KYLH2S)q(ltQAIJ zI4SjXH4NCp!f=Z78+m0OKbM)g(TEbDw!OQ#0yCrbBv;GLI#E5;8{Zl=FliQb`p4ga zOJ{*=;(8hyY3#&cq9Hkdbdk}^Gh^%5w)J&W+Hs)pWH=@QCLGh?p%xlzXbS1WTA=D= zAkSu4(}7$JXaml;eq~L9A2dB4DCX}kgI+Om&IZ%OwyUbw`ttabQhqzSbU-uy6Z;Y6{4%?q$O0vIMihs`(z+*(WR&~ zsG<4`MtdWo&YfK?p=swgt*Lf+K3xFvoUxT)zGjSmcI?Z_kApDLzq2C_KU!_Ji18c} zBgg?2(S5D4VNL#7v+R%P+KD&e=%^6!Tf=oZA_)hVK|F^=uUa*e?ov-Z+);<~jKWf> zxWh3{z-fwiS3$9pi>^+%in&N>r{LI-7x~pQ_?VUfn|CCSQhpaC?5DMN#PvP^Z=A&l zmg(j1lhgjkb_Q$J3w`R#W#(|Tq9h51yNO8gDp;D-)CsAwS6{13zdTZVS}{3mKJ?vf zpeF$R8dJLj<{2qwat7H(s#GOLTNoT!80`W>)AZNQ6qm97#MTm8v5_s|T(>kOlM}_Bu~J^Mxo??>vxA1_XgX&X=~|^+;j4J3JQt<{2lZ z`q(0t*M8USA-7Tz#c%2=e&u2qzsl-8TC;(PLw^xndG{TBh6$5d`LEmIe~O-dohZK< zQ9;2ndnnci`rhSPY`tO@FwG)uJ*3Am<-7lz1+Xi4JJRUljmwo>%O}-bSKz1G?h~bD zPXXD%?v3-qASW&8&$y^DFQgYBCv@U$u8G6+a-%l|k58i)tcDvU5i45M{A_kTT}|LM2wvVFGWP%ZuX z_2+Q9LA!bP`;zUs3|Qt7y-x?v|LGSz?1fwu7yeirCL9|nK3bM-TUcBX5w_v2pY8vj zkKup%`>zv)Hywit=CtO#yhb*}L38eMAtf#`FP%$~`v21P{g2<@KfcQ`zZdT;N_~lh z(#0rM5zkrExTo7zT$u7$nO`VBV6(K@0Qia}fF@w< zjEt>{UHE|eW?52Uk*H|!|M?BQ>AA7opWfiM$2t0i`eQ|pEwx(BSNfOI2Lf(#4-f*?qPbf>})(jgMk(nupIFd*G2Lk+DU-H1qsK{rx@ z(%-xGIcMK{&)L`Q{l4$Nad2c@?^^HsJiq4`daAKJsn+2&3Cy0|l6t>nH~P6}hy!sH z>YVYj&3<)4HA5e}-SFoJrB1d-WArC8SOI%hN;nNB_t5_DFOvQ*d?pM=FuM^1^R99~S4voP( zK%uD(PqqCxHe~jc(l5U7e>AZFzQZ)@GjQ3pUe+_;AGPUUHk?GVex33^J$hitI$5O2 z0&%-+m->_VtjE~j0ysdAd;#1F)liPNj%C^+xhHVBI{<_T*;&Zn^MfIPHG_9K>!8GG zX4Q24e0{-{%m6Q4$o;=X?R6u#@}j<&pT!OrNKIb~*8#(s!|mKtKvAGFewkMYTLz@T zb#qfsK=KJRJLN;z#VkPylVB0q_C5%8$DaD0E&BrZJyABrIbc*@1ALsNmsNmgc__=F zA+Q;X`3hWrZ0NnV{mvP_Cf+f{b8Tta2YGqlL!dx!%UysGU~ctq0x)8wjYs+^2v9f` zRe~61GCNWHbJ(2IP-r74aIKuvX-nHcaMx+|%oGFeP7zDpK$_4WsgidWhCiDWC_}#d z+>=-LAdZDO%O}9_>a&^#*t5582(4?P81o|^h|P3*=NxkGGBlKeQJV@JZ-nujK2&O?do9B5n2u`1T0kTA0nHWU3@Q zH~eK@KS!KZNXPb$YE8qDZtg&C=%T9S=!=FLxzFx^5hp^J*l@DjmrhJEFRgDN<_O|H z4?S?4jwT`BWhkXkO5U=%8m`t$kT3*>+BQj?rx@O{>1;z|asgE<(dGKVgkndo`UwE^ zngUPr^15?jG$2z&sA`}8djArn^BZ{Np{uEQFGaM{>}y1dNn~FB8Zs7j1(NJRIoek6 z9uO6pq?M-+OnvZz+Btm>6_2OCo>>4NnGc)b9*AtE1tx|vg226-y|Tg7V-T42PqP-J zk_3qWx>ZSiy})(3^DeQo*}aqDj59MpVW~<9alH?Y(CO@LI2)Lj(%>kvJ0?2bg=b|y zXB9$Tom9w+bO*=pjeoo{SGgvEm--!JzQHoEyi3gNUv7j2Fiuqm@V2A+4P zcQl#l0KDvzc^)Eml4Zyl#cC0PPrY>dLddL}Nb;jxlJPP40fPeW;?`52J!)Si0btX4 z56Zq|JV&KLfK`ZW#R;IN9(m6hI`+WS?~Y*wQSWBgMZCR2foNuXr*?oUZ^dy1wrLZ< z7KxPg*0*=ZcGKV=iR3VE1BQb!D&k^Nu-5bgrPP}vfTZt9!%h97_4^09>IT#e{dK1HGYM`SMlyt$IKEqBfO zUz57q#&`^1T?KP@B-G;9fQ$SXoSITIBp>uhE1A6vKN{*Xc9tRl&XX>_j9~ zu;<;c&nxjRrtL#Y&CQ)I1E*G(>cv-jV;;_Bj>_`+`W?GLE`ut-{!OeqRci#w!(^KT zNrb!H=F^ao|Idels8z^Xu`IKdFr0&oC0ckllrYTXN%QlI1`hsnq*o}zC~6!O88LhT z*{ahy2VQ&d#q;SgGc~;HKd2?!% zjfH5C=1d(X9$pF`G0>m!{*FK|(BeW9vITH{wcTtu7m46V~SQrhk*&9BmzO(FG z?$zpnPxYejDM%YpS2~ytMzi!7uZCja$u{~qHTj&L+@Y{Q+%t)(oeid*f*h9&U6I9g z!NHhK(#G%inSIo5Wiv@9*mL;XAowst7)fyl0E{-JXWHtJ<}!Bm%NHCT!#ohZSWaf*s-xrAmS`p6J)JXssKnxDC!c0&`15{H-= zLVA!ftZ{Hr%0Q2;4>dOfE@AbSEbwuq*^(5>7RmG)aFU+Vl?!+mN~om*=p5%e7sKTB zi6@7ruJ=2@->$NizWpZnmGC(3=zrGc|6cqJ&SE=neHq1MN0%!nbH8U+O4K+_js@)R zCrNWxtr;*^<7gC8pL_<97Yp%XaLsZV2`k4>4qb<4{)|@@OEYO&FRk-pZY72B)Ma+# zb?w_xVRyZbvZ4+!)s<$C469>A=P&`XcrGs=pNFDY{&jqAjc z7}WIeMfxz?e5SmCOdHcD2>oa}k?d<$Xz7ceRMfI__+t_fmlSch^ z@>N;2UY^f)6~vJz2pSWSNs1`ZT?mV(b)9Ho2^rmP0{-rD#GfhLUt$i=kLf-gn!0Yq z9eUS5nSN2s-{x_2lwMUDg3Stk!QQ}Yxz$*Vu{&0 zW?H{zfpLKOX7>|X%^Z`+XZ?4&+;DHRTO(5NejH3cJ?7AQrj&H;yrNX^QwKS6XRrEO z4w-mS=Yy~oAS!S)zV}Q|>LBjZ-6HskTB}JKh4xaWlB5GAC(khm(NMMf!XRFLCe@=J z-jkB5o9>oPszA~mL&6#jIjoitHuHw`x92Tl7k-q_n%s*G% zDy{{ZCb#n4){{%&&~o5M@v4Vq@!wjz4Y;6XQpUX>nO-eN4-vtXyad1GI^X(GaRBQz zbmIX2x~_nbe|#fr18zNgWtu5ux6Tn~KG)uTId;k<-6l6l%Mefp*ptFWUZ85^^ekR~ zoGJgtv9^0eoPWo_G?F)BwI~Ub{0f|=m6r_!4m{TOKKgD&9)!+97Koxt^o43428NMZ z*>cd~6|d<&($W*^R_;@#4kX3VV;7sZ&KyfFn0xW-T3*C2K_kHX^u62h551?;AJa5T6GRfh zEdcDMI8pJ1c6gLKaud{v=Fo5tJNB(~lD~gI^+b6)W8@PW3S&gLhEIN9q#+MkTDiZ@ zBJV(7K#_ihbDpr$YVVYT(uw7NC|q5eG?zs`{+1YfM`Cv{E-C30c2?w5r=LA=XA z0Kt)Q`{ap(Qe5AZ=lzOM#)?8yZxJ`sD=7=RCrPERej*68=har)Uetj^bj7Ot$8z(4 z23z?xh?l~t9MoLvIaV$@zH$4^Nec0TAtYyjSBd{|eQK#kW=?0Hw`{=dDnJ;_00A9D z?T&k|k(^#g@Eol}`7D4iyduEp&M4Vk=0!FTZ2y>yb)rQvQ0PtW_R1cR?3*#NPt^AdZaO@Ope$X z`iPVW<}t08RQS-ZpJt)36U=vtj#}%>BTe~1@b+m{pptSZP(B|d;qca#kI`CjyI9&I zR=8e9<&h;g@>uk54{LUE#QT%0YJ6cxtKv}LGMf$A#lK?4&rGl`m_70q9PM6bqlio7 zF=@hyv1EC4S~g1B*J#F+;O&VAvAhgPQF}mF!j(VKuKvX>Y5tf2zXl$!#%1i@HIh17 z2V^qCdUrK^7EIULXUd%eN4IC&8s`}7P4Qdr>PYDK2449FV$N3M(Ml{mE(8jyWMTSG z^D8@^Py}rPr;zK}$H11Y*LlVd>!`>u0Cv-QNnHgsFZXKIwSo?hJIGeYmj9`ucODAh&tX||bIG$3f=Z1M`-_lMjD;Q*6guKbksqXUJA4I9B-#|MYOdX{#0fDMfa0APmFN5 zTB(9>@#wRLLu8uee@$MmFPN#~Kx_e3k8$;@28ss0y>^522U zf4nwIXDMI$kx<*C*`?>yN47p)+Z1_t!dAj6@WJpQ`G5ZXzj{ZI$j>F=x{+pqauuDo z!r0R+Iu*1I(58xy%Vz&-8U9=nXg#d0VqI28jUpdWqx8oAfahFZ=RJ7z*0nm4Z>pP9 zMMv?Zfu9Xk?#}_@wToJIPc&~Xxj6&LCeZm9LmvFfC_-ViAftwg$6^AQ{1{xj zjuQ*~u$zHpu^E7qTmj_tssjY9n{R@eqXM+a!vI?{2dK{dBog)y^g(kVwc-gBgYklt zB_S{EnLSWV9y^MFYaa}Qz~ z0I!Hr2n`%7Gi-wUOx!oVTARdUnSV=Ea^fc+pu)mVYk*wHjil%pxd>Iv;39T>@j14I z0tReA&!`RsLw)T#2HFt!+mN_#LECH@czFSI>bT!<4_JcNu;cV@0+WKVbgy0cwx=M~ z!C>|gMPc*(>*F3~Kq?PNyowu*2UBc2$;ug`B4JupqCid=Aj)yA^O08CtZoztTLdm~ zw>^RJ^$G6;uz&ad&WP^VTa`Pm@;*ucOxJrP>)-+&EY}(6MDe%h*>+BU1JY5e`Oe6` zu(eZBVC7DK4%RQURpW>J9>}qb7|7cMbUWSTf0H5p=Yl!~H0KtP+J1j!D0Di>e!LdG z%D0yDVw4qDapMG%w1M!ELAbYN)&7q{yi1c>nJnZ-!st=DH0 zu-!&_Af9E1+S=JgA#Xt#c*778m4VNpx#^KEO&E$XYP}v3LTi=gQa|Hr-vSMHIo)+x~B17J+N0lJrq4V7kel^6x{q~3R9;3 z`7zoD3IB4u1qgO56cGsTHnCD?CQ*eWwQ*8Xd4Zm;3xHkEL-&0pC;C9E2qC>YZyIcr zr2tU7c`GZ!U(Pz|{c=yGQSq9l!_;cRD9Jhsy)(qdCKH4)p~HqBf|fa3`B63O>#_`_7Uvx8?KWEe7kkArYB9 zGJe%cebA^S6pH#iO|TMGui`3!g~k2+UMecyE0#ZFJ~hpRWk|+zpGqdt$oQaf%bPQ7 zC`Xp?L!511hYrPfHad=FoNa;DT)#q7hXwe5NRNDyB%4&C@&YLa(#CshJhns~*R}HF zOOpkMi?unM65!*aJ+PhxveKMX(=|)7_lQ$w0hCWP!0dCUhQUQtMZcQ*<^T zez(I!BY76cs@6M4df+l_wEK8hP5{KZT++GvRf1k}LU@vGc(~%1n8tH#XDN)xv^1B6 zI;(^IKnK3Z+Y)@0?oV74TbF7+HUYuoL;{En1Y)tcle>jXeRm@eFO55TMoPhq82Q0=F!R27eRil(uMV;d zYzBr4A-p%Od6`)iX5`)DeBhtM9A%TbtKPsd#6UVl#yx;CI17XX8QViKO&M=o!O_5% z?`v+WLes^M3`Et3aEG87H1+t$_{?Xu9S5ShOR(81X-)*YS)GiJn`z zB;nKyjWX()Uw4}S3E_IR$rf)`6tM1%eUx(Oe((X|TL$=x>RiaSD&wPC$i!37&^d&) zbd?ektXGBk!??LWX6)R*WQ#9tu0NR$^DMsXBJp?6zzsiDu?(ZQ{C-!DG#wQNfj)|r zrgE2385N`>-Vo2@ff>OtPBP>9uIMu6r1o+I_G~#*`&6h4ZiPu}j8A$K;RNQn+I8+o zmUYEW@=zs_-sCX2C-9GW1chFC+rj(&+dN*ba_LYL1YKHejv-Je0J&P-Y&=j7r0-d6 z(`iX<1UUW|HAjtA<2G&MEIL_LRT;N1zF?~ScwMpW@ut?D$+)r&Xu=D3au^Lz1>U@#J3i+8m^5eTE zUDv64L*)T`uUdY9fql!B#%B|bFPS}sX*a|FtXu!`g}5v;mytN3o>7bRM))1l)QYbU zjy*m>=Lu@G?)#A9@%}R6*seX4_+102vg|%D5`S& zFgi)CeWQd{+q-yvTn2xJq=n;_f#C*RaM$5|m>`+J!o7v2b>p*TvGW~uby1$rFalhu z-YE)#^^btOc}HOl3=R*D5o(y@AdKf}b?=?wq2OxPy*i3`DD~(^Zx&QG^C5Vw zx2=mD>DKi{T?_lgVxGN*QrsKDJA-D( z)}M$o9HD3=Kue!_Oe@F!R_%FKZp&2M{y}0d#iEURNNkd|-&|0U+oU0g*zRh8>TbKT7)`p zNpHiKZavcS&i@v8)Slqlc0FG*gkZmCVU!AKoEuG&XidE))Vn+b8DgPp;HE{IS&dz7 z8rnPawZOc)z41geta~OpyNNz1M&l!zb zV07!@O@4(U$c0DNn1hc@5HuvNSxn^!oP?kqYzRK{z7A(iQX#RHrx`PV6R0K6?4GC- zX{kI6b7VtttdPndz9M^-sl?Jp2wMhTFW(B@EC>&Cnh1n8SS?C?tCI+Ht7|4Q*YLs_ zJ>OS8qo12eX&34CLnm6Xh6|DfBT!k7+p|7-013#6b5Y9_Y2GXVikAx3VEv#lGXdv3 z?b{$46rz&rTX|sn5Jg8nJ=oH^!-droI!Z9rci(|b6;V7bJGfV@z7g57u9Pd8H2j)6 zUb;gkmHH6i)os2BIZ~29SaUbtTD(v7aFzdqU=m_V>rL*-@EXrPcHROYn_P#Hy4h!= z2bdm_wpPeIDHPK|6Z3rt5`Gz8%{qVEN13gjlpx3vLCC$H+%;@QA1;GZQGYV`lj{b; zSc5ZBBT0~AEX?dk3mH|l3AiKer9kHWls4R-CS>%ERtm`c$UHyGX=;7_ik`sy*3OEM zM4FM}RF=r#SfVK9w;b8%0c7K2!yQA1D&oI+EbC>ACc^N?K53v=c@)NSRJGZ3O!pP! zbGvl$ao>VU{8q9;C5K{AtN*G-fCh?t6JnOzx<_zd>M)FT{DaL`EK+Y89}HWVj~4qz z9v6RTdOw6D#szC0r>)n%nx-wz`UtcZHSSa0!|CX8jV}UJ1tRPHsqC_P%R%P1d%J6r zgX?q;A1f+lut}R%FOV7h@<28+xKaK^!NU94#l>{zb4i6F;qgiwCxGMzaD(C_{Q{)&s--r`gbde)J#j*eYaZ zIayk>@=l=gDN=Z+ZBE*O4kJs_nt zs^>>u=j{b(#-+0R_DZahYrBPr_n9Z?{-z;l4$3zRTA^WE>R?t!e z6;H!ltef;_$gh48s%5=T05MBAOu<9G2_P(jIC0ehyFdOCRYU$Ks>V`0U{m!`<^a%Y zARf```Y4P0!J+!P#fM;y|HK10W{d5v^`!_4-e101H-Y#n-4yp6%Cj!BlK8JZw%&7vW?J_hG z+1aX_kAh>nWZVV(k?s}!DHRcPL0-|`zdaKF{ztBR*!{^5!Tzpiv%8RF_ej1{<=T^n zH@p7@Fr8+KQ0P2*<6Ol221@xosLVL+?~I_DpTDwR`VzbM5<64vqy;tPF%B8$9e~b@ z*9|yLY8k?H)l{-aB$5KiCqU&u+wozl#p^pnw47}VnFc(HCkVka0N9nc1YjLMh76}l z8g_eK0Skf(=YFdu9gUXV|B9uR2N!o5dmpyZpAFJ^Zru5R*#QweDOptjc*X*e;d1D; zQY$Uq?>2-jIQJBK07`l5Kel<^d=O-8%s{(>^Abqii7c zzu{<&ueDZR+>qB_j~4-=v(aUC@%Bi=N(j4t53=%r?O#;1Oq#^~cOx2#^_l3b0XioKm214DK))8p(Ih6WkxsECG45u3-LCgVTFMR6%Z6{4m%A zuM3$CIv^;t)j%LXVi7R>?y@h~wXXu{CzzvZIJHJ=+ zlj%t7Yo+-y>|b5i`V&>t=<+uee1tMm?{r-s<4BFFvCJ{01q4umyDJywT`II3F3cyKB`wVU$Q7_??2EocnidYRTuq`)pkZ!>_|P^ZL8`0-O~&NmkBNYd1f6G#*X?>$eZ*;xn6lu%;t{x zm7t(cRai42HBlG~~WZn}Tp3@KcYOvQA<>Cp(_y;qHhqb4ou)rehvkkneG z)isiX*Uj>mP+FPN9)x>{k)xV!o$f`cD`Z}K0}`6O2mgtwjTz@%`v;~*_rG9jIuLS~ zjU9y5E1CbIJ*)e*v+vPx#!1mvV7eJ^kkkdAfwNiTW@one6W6Z2ESjFV+qSizDT1VR5*7<_;bZ08CC;NGNd}D`lOTO}xy;*KkcQ>=Ahw&&|9^wn z@Y4i^L{i)(`6Ffru^#3jZ9YicQHBxp!B9=*K>{62i~?7GKc1V zZy)g=c-xWQzu|59pUnRkyp5C%!QcJ}0zE4em{-NX@7~GnJBVA8(s?dOzy~;aISr%m z!3qqsLHNff^^eo;+lXE^x@D2?U*cTdt(DaIiGL~QGD<1w_M4%WNSC|nG~B$m zH8KASX`7k^vAI-foNwA5^i`>%YT0NLy1S)(JF)Pqc*)`&%sqjJ%jzoPmsLH0ni>5t zIUfYX>nf;p9W=?N358|;3reeI08m;am`CXmRb(th(??Z*N5m23eF6u~+J}dGgn10Z zZs>Pr`hKAluXxGT4^Uu?Qv>*eM`r4YS3>r03>%xohPC=R&d6cq4gbN%OJXan%N9Ea z{NFLXPUE};vwgW6WYKU*^{7mgc+veyHSt#1w8?TX*;eSmI>1Vq}h zValjBVCJMgIh=nOu^jh+#oxDa8l32#**Xger9T7G{S3M82+XHk(is0wm@TLM9Nu+Ya>tkT|=x0xf{eiY~U4HT>;{_2=y6R0bK!1+__%!zA z#Nyl>&KXftcLJ}p`gX^7JYei8MiwPPT<-XCAns4x;+**xwDt_tSzl1X-!f{WA#@F= zyUsLu;ocXwwz9llca+oNL>Bis)8zc> z$YMb`kN_6OTlDr$+Z%fX&Rn8h4C}+4HWI?VZZP8agwZObYN`lyEWZ#_(D(!hZ%$8> zf?Oz?xRhBGRFF*WQC4~mkYYPasvg4o%xT@PbUlc(#~aI=_4?upG}u0oLUWp>Q0_I* zq0p4jhM801a3Sv^Jkek1G$*rDIo8l?c!!Q9>i+5WtygP61K^qW)NAu2Fct1B>*`5P zEhhjTE?~idIYow#zJLN9Kx~Rdv8XPM1As7C(_C-tn-oKkN$HSrjN-A;du6i8jS%NT zp)ApgywByqtDtN1=5}|%G{3f*b9re>!|*W6i{Q3m4H2_-ICp{|`IM(Hy9>FPk2R`7 z=2PERPAJ|P{K(p&$`lo5^{OSP+DIoS!6#hw=6hof`Ojrl*-E(dV$qCypaA9QqxKcO zp7}M`P~d1Kr?Hinj&p;hhwh~6*CZt146b4noN~whD1ud`V5CP-Kt!%+!~|cZCGgbD zxT`7vB}VxSQGI2-@#kT$H+zD=x$&p1A5G_tX<$(Ng*$eYsUo4>cr$43Lf%yZm_@P} zV8RAHScRsTPhUK6f46&W(PZduff8jOVcy_B&^D&qH03l>=~a#l&-58ccBLw6L6zZ| z2LWy~8CCcW+ot%!WL8|bx4Zp@Vt)m?QLv)u+!u&}ndD}e#jH-=C>0qGG^x$0>LxYU z`Sj#vkt2}pkkezb-6Io~zs)5fPgzG1Ln}>;BSRJd2DdUuXJF~__FI-{9MM>^QkjCg zn#@DNfgHK6p_(DsVlaMO}cRdBozkNgBJWc*dSDtgV$~_{F)AUo_16=Z ze%#9mh*p%9Yj{?46~#Rl>*da5Dj0ZEjoMF#$MS97rT2*+E5h}b`b&6N^2}`EpJ6Ebi&_obvLy#%iFIyKfQy-UYm?ilsCWu7JYE4LQGhIm_iy%B0Nfd`fqp-8i{UqacO{+3^)wB12P;hR+c*T4mUpV8 z38p>3PlZ%zz`n@_VvT|O&2ns`D%EyV?ycpAbjUutJ$Lxzk&aCp{=F(dXBY<_&X&XZ z%8C$NCN~L8e;$K@Mm2=$JmiMNk&v2_&uK|1 zFrHPVt(6sP>IqPVn%$I*ssf_JX`q-RoyVu<>wkB+L~Z@#iNg1?eI~R<0m%C_1M%_h zB|TD$s&l%<8`5i1B^Yt8Cmt1F2WR>di&2yds=9T(byhCH<=)2!)g?7ky-#JM>E0K0 zSLfNNXHWeNgnp4YkrSJ}%07pq+=x@J?i@qq$H#^J7Xt`%oe(57%HH~SRBQIK+CLGq zP?L2q_~Q(RxUe31_*2ZEQ2Vc3HP1<86FctiCr#^s0vHAMn_DH-iF~`F}&lF8{wk$CQ$| zhnZEA%}txqH)`IWXEg3zc$vcg^+&Devv2v=0wP)Y8h?;@;1YSTR1NCEvn1hH1Fw4= zs$*mY4>Eiw(v@HtX{N`>`Vn=})c!5{=mXC|_nZCF+_#@Ax3+~2(yNjWRzE(@9W8#^ zsjHXj^hg%({*4B(a==+is}j1|JTIlY&As6B`nj#&@d;35YM?9L@)ED*Et{E)aI>T% z^bA3hVTg@Cxo(CuKA8c%UX%Z zzq|lGfkL}Xcp6fg0tq)Rq*9zav0}rbbIW`L9O4aDTEfeUii#fXLiWJp6@aPbb}T=v z{xJ@N&7oxU0L2$Gnm)bxc#?9LIU3^4t&8XZh7Ep3EMHKeD1ecuC179Kt_(;{VO`|x zBSKH%wNCf2WY_?OC6X3IH5#1A_OqBxQmm~+^)=6+DhI;e<8Dak)2P>w9Njb!|Ji4F zM$(1Jx!@)lPd-G<_(4WCvGDdRh5?aFPFCaPOCJ;5(0`kUWYk+s~gZHH916$y?!7H2(DGUv1B(S~& zLR;n!4bvBHAq5N)G}%C}h6k}ezj8Jx36Vgps~9_rNf)@8EH7aZe8(8M%91)0p49*; z6MYRlR$;)uA#_&c)xDXHph7H3DU09*{OsNqEcy*;Nt@>!ZQ~?F=-tav%b+o`cB@Yy z+{cxigPzQ`w-Mez+>RxzJrvSx-w1rw@3c<<@G0c|4*L3dLk$nj?L{a;#UTl0R{f&t z;8STPj$t7u4Nte0y07 z0t*Q^`hI|++C?8Xt#-i%vH)2<*nNs=;s~&PuhywZDF!w`Lfvp{2dSudf#uX;Txo2& z&=5RQdGYRBgl^#^Q2^NAEgadxwx^K|E|AXjyJ@`BLHR>5_)zMxF+wpgZehDr^nSb; zUQ1tjZ9Il;h$&e+*U;rV&PnD8FDk!pPLJ=I>3nlY=;STi9O>D?ap@v|Rf4PqOQD~@ zyT>NM*Tw+4ulEkR?dU3TJ#j=^UzM&WnZCyM}AeS@e~`h{0aKvY8enoo|B048dqo}8B=!!%y$mfBc{ThR+_hR)(H2K|IrRPW}EueIJPM$LsRrh#rVV%9LJ?`88d3`Pd0 zZwyQ2PbVHkH-8Go3&-6%KW;j&gfMbSA?KCBI=9Qr!eUffWCT4gp>^rclRt#Ac+e}Z z>+w@kZ!hzD=|IA~Q~b7qB~~0x@ue@H09=~CEe-<;E=gU3%SMPt!TubCX%!_65mq~= zzy)F7ARmwN5#3Cua58oXUS!|PmhV&yHwc^voYEKfs|eh6xJS5`mjU@X<zpVQ=Wu~8<$_1<*%z{VADaLS|nDINQU(LEOFz^|%vmfTw zGYDx-EsV7A5PrNs$SlimXra~L6ShW!xz5}6cxuGbQc zRR4_zP!z;zDCutiT-$)X0Za+zHYa4iG+bl|Ig(LICfoxApRx~O*uD0zE(;S?=sR~sIWTeSW=9(LQr6z*_q1K?h9{FOR;5SrOaFRF3&Rq@3r zY1`875N)X*IDwKhm67WB`SbVsnSk1o&iHN$^O_M)dhcZ^`G&0tO5w=8DyoJnuk`E$ z&i(Jh%H9o3E#W)*UNcA#xC6yI;qGMw^9vKTmFJ~mE$*QhW9Q=)<#0|IeA8i0VT{`q z(F`YG^2Hr&ayI$FXGwa(xGnf__T}s=JnWF~4tSA5J|}Ks{r23V*4_YCtpYRTDSnnX zKjT6nYY}S0NT}0p z56kqBBIo8jMDNd7etwByyUmI_mpOw=iG`7cQC`bvLaP-BUra;c5XZC8lGY`tSuM_9 zDsWY3t^0#di#-79c7$KLxiUOw7@FC9F@dYyKG|?FCTTumyH%|L#R-Z&QK5ZD zlq^5-chKR~+SW{VhQI4Eeg^saiqW$;IkpN0vX{EsiXBXtdLPO=AO+D=Qo5c5e3+%9 z?G8)d0&!dQ-4Vt?Qod%d$HB~!Tuk7WeiC`zH9f82R z(-O&5FcWrLoamNaaXnbn2MtAzhjg1k-9*uYUz5b?gS77~n`0Z_MhL&Q3c$`E#rP6i zb?V63`(!n4nwWdlGuDMPI^@ps1@9$@1owj{i4&!b7HPL){kzjELwwU7}l3cf>sKZekG8hIo}(-EhOj7NTh0KpBiVfHpQRhVbBjNe>N%OcUw36YdfU zZ$Gzf*y%(q;gp*Uw3;=Ol0>TpCIPS(7L~2ij?Nvw!MFvs;hEu?#o!rD*2^-X&VJT( z)5Kv!*N8DyfonwF3W`sCvo7R7>Assacl)j5fNKxwCRFtB+uWGv*+!!g)Jwfe`R2aF zuyI}M5;v!rmf&4J&DF%0Q34v0$MThtRXPkKevkT>bqCU%Q$HAsc2}9Ev&Zcx zBv5R*ggt}#QC{+=WZv|j^|dlJE|m**ly+YD^bQbcHb6sh@TCHK;c`RN&J?QiGfVRK zkTaYz1JTRv4|YF33*>8wMYkO`*LQB$+n)o zLJUK?ww)InOH`jO-P9GS6G59J-SK^qasvL1jLB)=S-P(4n)yHdw~f7h9PBR%Ibtqp=mL^DoILue*<9t zi#R2f>2x`}aD`jO&Z9m%zTbOFfdnQLqEY{wAHPKmr=UhvWVIwK#$;HO5mn10QI{2_ zfAiCVvYCj-&XP5J2u%j=0tMZy2hL})IDfPG{s}Ltv0!u*e$3WrdC$6v6LGC`)Lm(; z$cFsp-#qJo{_`pk?Dg(UdZ{;b?9ao;G`R7kV)K07x#=r_T@Q|#|lgBF!|Yt|g3$tCZT zOU|2RUc~OV703SOWyd5~vCbQETOS>n_EZ`W-0LTSjk5pdXV+wnMhZWUm1XEyuU|{a zGK`Bna?O?MIhuVa|L2AM^^3M8I=Od~du zahYn84Xwqd(?q4n$8cnj9=q>f?D(5kuit`}dqSbad$TVlgP*f!k|T_f?e5*XQvSbv z)9&9W?`=J`@zVR)SrbwHt`Q4iZCxx3TfeAf{+s^`C8j}7do!Nz>!x3$ttwi0@GD~s zy-EaNqx`@5pIDR4Jf~?yRa>Q2lPU1|wDN;;9SOd|@8AAXVicPpoLzc*6W#A@e~x+F zJBTm%zuf;3URzk!kFBbbEU!K8$nOq2Wpw|)+ymF{I#XENr5JIj7xV7lLX??2bys+; z^P87%BwD=fLZu9gjP8g9hn-4~Ok9E4>B?)S-$dfssuSax$x0?ZnKdd(vqf4BZH`roI7Od4M9vi_r+=W(4r^ z@=gMVC$LttBmJEbi65Pk(b6H~GHmj3N3cJ6YVAUxR;|tB$Dx9iswE{QqSGLu5(UU` z4#bU~KWacvJnied5F;Dm7SwYYnhpSpM-()qhdlCCqE=d~K}bL|lx<+xR;Zq10|>WU zty6*q&Ola6j&sG@+L~u7+W$AMoA?J<`C-i^jxYt4b1VB+GkR+Wv`Iz6X90j;+5+q$ zB7Ei;7zJ(sW3c@UdY_*yz>jK#-^asXb+{lJV#yr<2w@VKUYJ2t+BC;rR?RCt&3>0` zR|c~{wyz>JhWRsGXkr0+@5Z-DFwft43I*?H9)|F-ovM{5sFxhHS>|lMjczJaMz-s5 zyD6D`0HhRKNF2z4?q;lkY`*{!V+>)Ewx#t;Yk~D*CG1c{^B>p@7%ogh_%i?%A-<%k zra22>2WaU5QsV}ssCZCRmJ>f1ydC@C7c}-if3$LVxzk&>>La~0-_pE4Z}f)k$3ma# z7qN?SiG)N?dqA@}O*DJ$T|Ae~MEP#+!=@&naCU{%*Q%{cOBVA1gYpO6t0EH98F?Q#g{bj8d&wsvVGlq3e9)Jr9}DUF1_kz}0FffVIss&Uu3`P}4!7 z_tOk7;}{5%kFy+&_W*j^CApIDN^|uXVn71os|$?_kR~6#nb-!s&@^bS=92&ubR1$X zdmJ#FLWswtQ$IiE#1Ej;)%~cfdtJh^KIBCAcYH3s-@uqZ(lKrox2C$+%zQG~rQ5Y% zR0h9_6U^EO7O>%YEd;JRK-{7C%2wMmEj0joKB~V0Ay9wJr?6!%VjH$+093^le5dJF zTuvM8$2PJ*k4MXVMoa11+X3-*JUka-u0YWG0hswsfb!lPSYSmPK7EzdODWY1;e&*} z9)KI~cAS_)yt4@&rP5gI-6e=U@2dmsOHbcL09_(*X%pZ?tEfEm#`oKT!lfB5Fk09_ z1ZzN8_-p|Pvl*)Z{osspI43b_HV<{lP z8kj9qCt0RX0yh3;$4Hv%R8QBBwb8yxL!hqQjNlpA=0kz-<(g3~y~Cfnb;lUrWq)I0 zoGDBEIDOD!o*8N5r5F%t%SSDg)p32j5v$)YbR}f)A)M^QK99B}=fN%aJ2B?ifUD9( z*^yYb3)tCvDcU;bg0W8RCSdOx2rK7@^ElgIQSAk&Qy&N>z6<)R^5byB zlUB&6AeQL2tSfQ-ZzeAT&M%t97k=hqvKV;!v4`$rLUz^8+w z>4iH?5&^co2DhH=*ZtHl?lH6lb4Rd#@psdh? z)A+T3ui(zUwwz%aB`~+YOWr=`*phe`J7H9!tRcUC?FMfH~_YXc{mLWOFCmxkg6tQQb=hF>b7O=pN=85T4`_Ehp78 z6XXVkN#7z`PTbl71_ZUxJmbT$Tst(C2gV9f?*V!80EpEmz{<=HFO$PqoxmjXyFpYa zu<0`B7KSk6YA9!F3}K27nW5T(eRtmy^co@0<& zOf50D<$Lb=|4{bUVNtH_`tVXwKtMp05Cn!)Nl`i_L_k2Lq>+>uQgUFBkPzvXQUOuv z7&@doq!~I#VrUqe?|#<1-@W&7e0%TZ?>`O{W_ad~>pHJ9B>lOZtgn0)(B20*PP6Zx z#km6?6AX1YV%}5?aofJT1;u@jO zldwn6-qk~p9ec99FGS93sZND_sHym(nFVkxQBjLVl^Iwj;;t8h z(M}pxJra~$XR!Wc&^{vSK=zyFiIoYDMVz{|Qb zlHtDLPUXylnu>PX+`{a8Y8C(ezx^Ly4>0)HO+5TCoSnvBWy#oDQuWBus#UM~ zXU~9F{5my8w!L&|OOq2c$N^C|b%?IBX0--<^7_LEz|{B5rXaw8WVo!JWCFcb%|aV; zowe#}X~#eCGynB?eU>Ao>X6EsoRlf?rhZ9UMW&f;EQ%`OB#(~&ECoPc?o;ldmFDY` zrQs;KX5ZKe-n>wKjl@5DbwENoBly5Dy&}dsp5v;Pjw+2M)=~(L8ZZ>?qyL8y_`g63 zsd(}`!nccjW_6Q14n@#9x-5z=H1L~$_TC3zJ};8Sms@=K`5#tIu>Q^`O82IFy+6Xo6hi>HDQEks_%#He^wPSR|+^2r$<-!^2slAhuh(-~a zrAqs9{>?vJdY_00A6CM2b#-*R(de8^uI(?Tg+!}rzy51!|0izvKYcMk1DcTovA-&i8bi|MaEbIz`x&7#G$vSr>l=OMa%BjaBi-t3Ukd!B8oGI&CYIaeZ#Z zXI=c=jqF+7)yGjMv?Z(WDg4n=lQn8MFz2|z%n^5W7(Kic;26sC|AgQuWz$xoKEH;OL@HB1 zn7Vp7`v2v%KWVA?Q83ZwbOQ{eoRE!{7MxK35BTZNZZ^x%<}b5M+IPxd>7`_49Dn_v zR^W;n{YAosWY>JdAU(kJh&lqmeWD*1BBxu?sAnz-_7b-M0 z0DeIO0*o0jqG^ta9N3D3^eV`mr0Ek=0vkwD30kj1($*@SmmbTRSTJxxot++QDSi2a z@^dp9_RQvWiGi1gwwg(_8Z(imBVssRj1`JzINlvl&FZ+22rgzgXh$I%pCXw($if_I zz|lXl^Q?e+$2f4?oD~TXtTLiiIuwWD^Ek9M&p05OirP%;Idz*s4tu$PWOch|JeKA^ z*rxol@^~FquYf6A8D#pAl^bWSW3!Q`mvxzF=%2=XOaQmf<;oqNlQ3xwD|Rqpf2nJo zAq^#sJlj#tKuqOLaiy#fAzxASbl`z(bdv0^)21GClo zi5E8HB?KqmL{r_)9+EqO`U1#c5XCZJif~;NQ8xPa;-3l+pGxxA9I-jM6{aMia;uYr zrq7dTTTr%{u718C-^37#^-?p?wE+?(NN3%unOoAYxDOI2j>?CJHF?5r1Ja&@m`tO@ z$!4R#s|Gx4Tia4#79|wcS?o)N0hm;dR=&ZMb=Y3G#L*qldO-r`!|lQi&=`~ew1YDY z@{aSOD}}^O0J~FZWNQGz0s8pRGDfqVdYN#00E>(R1ZHLA&mwYdIDKo+a%Sm}J2sK=vFF;B<@FO6q|AwWRxgDF(`m30PSA@S|`vwh(I3iJb| zy2$~jZV>ke2Zoe=8#vHakhk&xo9_LsRt7|skga_Jm@>~Dg9i7m-y&i&`Rqco3| zyQ{z`rYLA|5A@U{W$ybV0)scD#mgNhjCO#J&(ZdG=FRM(eWR?n|8c|p_iu`aOPQGX z@r$Hn7mgZHw3NNnRX46$7^$cyP__Y zO>rpIm914Khw<*- zGfM>wQ5WD$OKV^S{ywLm{nR&sbdEuQz~Eun%x&XrM7@)4WSes4xBMb7KEw? z4dwtdeI0*!TprL=2|}R;WN&q(7m7#`BAJQ>W6|>Su-j`m;D$!k3X)jq#YTI80az78 zg#}h(Va>xr&tqdRk&5*}kr=&OpZug zont%R1t8XeOAW9uIM|EGqSu@CdlL4nfhw*E2KKb9UIY(7ytA2@{`6}_}^ zR8yqP?e?-;Ys;Gee_uek7JW-NgPpET;k(S{^Zl~A+!eEZfOn06sF$E^W6|B)h2Ngt zaVx}vjm2NRQb2TJ6&$B~1`%%35E@nrap;~q0#InrmqdCRfHw=5Vm8y1D50?d9EP+%6?36iwqaQ^Gqb z{Z|I6V#?9Z4>s5vrT~s*4Y^?T7J)G6reztLp}3$L`@e}Zt4II`tO54Kp0R=Bx>A!k zUITc(U1eJk$C)QPmbSE5a)E=&SVl}~=}Ggo1}L!s{^~Z2Y6*f~Ig`D?p<$rjnws-= zgz0l(;V*=>0RZt@*!?{m7Dr*F#l*9KLi@V}3tT9lSxNe|TJqaz9Fd2;+BSP@M4{9) z3$hpPRVe%u0f+ITz7(TlYUFeEqNw8=DVnpj&QD`xWgDY&#qch$a3Q}Yn)BfWD#8}> zZ^XOmCfF5B9NPn|epe2<^QM?dw)|nzB2YFI3{-1Yg};&bGq6cjp*R z=)F%IHee&#q8&Rxn(n%_CDkXV*F({;iE4kPK%NN>8wsA4S?!OMo4Y12$NDJA;>hm` zv$d0nQIg9My15Q>oB&89B*eJ3@0p-4$At|A2|PT@fcT3r8J$)eNcD|E#?pA+W zb&j{%N{8n5tfIKWqbNt~LhHr<&1mA)9)hZCkRxpG)Te+uPuIj|7EhLaP*k|W3KXLFZ##88@ zb5FQIJ$uDTb~Ox7%(3w#?RI;7oB(ldXGE>SMqi28qC;1Ay9HEbfMc^4NuU#;Z6@&o z9PxaDX71mbU8;SHkAia!cuk!u^#75@%EaqTP=XSERCGgI#xI&JW&efEo&9QIR`O}; zDE`AoO++$kd}WMGHyg$F0YJU!#=@w>^cyAy>0Y+P-dzAbe^VoIPGTw~k zwQYb1Z%UKNOz?%nTzEgMLDr@rrc;s)5G|Xa>Tfp%gR?-GA!HUPxv>DQHe(oZVKJC> z8Qd}bJ&+-2?oP8fU2MZF{^hO<*t!U$fl4W>+_T!O%Qo{eM$_6GPmum_1K80s;cM<`NM%$ZwG+l=?DO0WC=L&Ij|G1^tQ~G;kWtE}D+y6n}fVmmBx;Q0OrD zKhreC9HuX!1HegmJRT$CLj?=T@rs9j9ToVe22Bu z1F%cbe4U*0fqAkS_4Axv!R^nI3E=E0Z=%i_jhOn086+m+dn3MdX|>UPAc%9nG)FTx z3?^@r+(go_#IRVyOeibJxqH*o7V~@oe7(5BwU`&pSHzmf{m-;zLi4))V zwdh4d25t=f$-qR+fL8_G<5JC^=tTaAl&6i+im8E#Nr0a}vWv8}vPWd~!0|NTgQVLM zt2h_=dq2Td2o!tQV?@*##l*;rWTIrdG*v-N{uB)f3y`U8pgx)^t1}fDwqyWGn|P`p z!rZUu)v8TtYWaimph&RUJ*pLU9_f1*Z8RB4obFt))2;UBsaoSp?=t=NjzcEXF^qNm z^_?opaT%I_9y#qkz4(B{v9XMj$(jo#3~%*Fy_1M9I!9xC+n0U^7Ke{_M{GHvs_@0n zfotSIUgiRDHCK(eaCzxxhx*fAdPi^+6L>m5! zPS-Z(@f6qE~CL|6X$bA78r@mY`&9uPZq1D16*W;4Ie& zj&dKnoAL*P5$J7SyU3NxrOA1N)5@kqy8dqTbylZmYS;hiss9H?c8$z_=SkGZ3f2^% zZi&U@&gKFy<3ApcK?Kzsqfl73^RA^u|xG9!Wp0`z81yrofCV5t*4&Wv>g zCJC?#!zFk=mTzdQ6N;3qJM6Ywc{#W61!6Bi=GJU>3Gc0w)sl4~wYqsOR4V5JW-WUFL4=OlQfhCl>m2UW-Bn_6$Wg3{bp08CKRnfD0wWwobtajXm?Q?Jf2 zg>Xi(yLVewI!Q)N2&aT7+=?DSI3n^*5yPj>Q~M%`eG4eyX*-mrdlI+$^cx11`Cu<= zvHfT=s!Mkn#Cw4&8nTT{L7qi&)}^na&{MyTRuUyT_jC3q$aM$tHNR?n7uQk|-Ye5w znXl}B53)gj;T!;QTu)1LzH|6NA-8bX^)j+vI5#Ix|S;2!_hphb&xNT*E8G zN)qZdK(cpQ3jAyiAA&)@esUV$!80oNwvgKsy#AX&DKHA0%Nw--xuwzbmVX4qtA>o~ zK|!=PcVJo5;8y|KzpQn0VmhI|fNQs{CT8p}8FJ;+9<4yrwxg1ve)VyKY%J8hK_jD< z@P24OegJ!s|12B6SCn47*jMX1={(Y7p7!ERF*v0S)9h-63d!%nC;X za>IjxOxE9P&V>e;IY{woDE(y;hzQ?XesvMbE7lX$droC0Wxt*`a*|gB2b1zr(5)7S z1gUVl0R0GVq#i&(j@vEVdaEl)Q@}zg0(+zEYpo&1c<)M|2DZi{bT8!le=H=O_6{I| zY)sPy0j)Nfzq{ajm8GVdgTZ*(b-Gb)8$#froxqPSzSASXkYBHi^h418A21$ zV=k^{K`dpmA?5QyZsOjzuU0fDF^X(+#8AhLf3ptNBLBj< zkTm=9S7xfQbB^C)gJ#$4=ZW}+V@cO#Jf>F3~cnR0W!3DSNbb+>x~PGSqjoQboc zO>(DDefR4!rbXe&`=ojzz9u*{UjMdS#`!yq^|pk`N=1o$U%Jx&~hGBf|25Wgy%;dcixekf+B8`+$DX|`{CXv%+3sUmCI~?7|@4De9U`c znp+CA5UCKQ$o+YuNrOj?bZ+TTXIM|16JQX~l72=Qe=`;3xztBb3Sv{=SH+aoXm;g< zI>V$S?STSqB$M;z3sE0vS}QPNFVkpZ2mHQDz*Fw>%_1eO5=x^^(*KOaa|ro2R;)&oB0E$5)9Ijf+ra53KyyH>hbjYE~~2Up*7CL*%B#il=Af zOmnr@{Ie?cJuh2SjnhIm7x5F3pf1dYr1pf8M^$Lnf0V5!5VDwVowRQxspV=R zWY4wFdrt36u}OLD7;jpv@%$)xr1I_`pr^QymonBfgv4j7_-+KzMt>hdIkWYhcRqUkIn0Mx>3yT zt(>8K&UGl?&I`b4Q?_AL$tyI!spvg^!=Rv3OtZ1UV12f@>XYJ>`1b|0w!E0p2Tk^T z8G96{T_57{E{6$#a?Y&)OjgEQnUJo}RVxzu5{@={3v zDxXz8nx2?6DE*$v;ByF4X;$w;s_#_YVWk^BcRO>O?qku9&K|B0%vU7f&dQ51#@qC? zXRw&*@vM|=n5q^xl&&z{YhMdxwPM$w@8}h0?=f5A+})9CW+;qKV#cIoe0+CA!tUPe z8GCj(N3Y?=hIZ*lzjxNyM-2T#F7I3i@KC{b(n+5li@#J#nl;EcN%fgd7PBLOH)Z%DJp22+JgU*2(2Onl&`&2s`y7b+Z9QnZsQQ1 zJ5a%}7>O9YF6=Yd>IHE6NW?SjNc+5P!<^XAexetwJg`nJ1LBx@(H&#NG`>LYsFlEx zb-uD~wWTaPxo;VF3aZlgoj>EOwt8rp(ZJc3*|nHl_*ZxS&SbEu19DBdI2V1!QdSiR zPgQlKU0rA6bG#_KVEg9e3?hbNSKg(p2$$vj+Y10;e;Z!8{B=q|u*rrlZDfC2q!Egi zo`@$*0{|iCl&cL>Xw~etz^|~0B$G%Ad1hA%>XCC0eZb{72VcP3{!QwAAR|kA?0vp* zet5t+-XnSLY3NeWJc)O-u?~B#CxLxCV{5}K$na#rpRTUUME6cve?MV?S~5ejXu-8* z;j?x8Y{}_lH%dG9v%g~_LY!JAZH@(c12iD}ZLGKY6Nn3Pfbx3;x(0tD6!!ZtBP z7%QQG62t9sDo!Tc3;+Chi4QY)W20AII^{*D&Z{J)OETNt!YS^@*f~kQ@bW5oj!vYF zs+_#fF78RVtF>NVQWjdJ444xbicAlRHKr}$kbV-Tmp zvI!3p!l0(Od&IlUi#Mi)Mt)BVpGzaxzMMLS+LQWt>GUj7D%m5r77UR3WxnHnM5M#2lS&9wR$K z@yJGQ+x%XO+W#$!Z%BXK>HKbnKBy$yZ+`ai)z@WQoi2jOFBh76UV~*84nnG&Ksa&0ujA#Nrr_pM&#I z@K&$V1QE&E1TlsicjWV22cc5M&_00wb#grLXduqgiw@_Gm#Sv(wJ;TQ#+h497Vj*1 z9a&~?=sXw9e&iyrKT-Dlu_go6%JozI3lT=ls7X5RhX*~Q*! ztI0B>;<&@qs*q@*?yCSG|e?`*CBt|y|?<&<@dg`5s zn2=9Ntxb|b4t7gNL`>4x1%-oxGccb;jMe^9r1ME~xJVl2$5`)*7iT};9x5v@r+~zR z89bMel#2So;>>(xL_})p#@iei=us~bCpHMdp3JuD(c{{rq}jgZn=5|v|7~`#GXhosb6O;48f-#>gXw|(Wx!Cy~T9*VIVfBYvP$m zFBi{WI|Z>b0o3o|4vjTOfyx9Ig8F8!aK$|DF5SE&l%YhyN}exWSpbfqC%TrweLuTJ z9iU->U0F|~*?SLq2h!zEIfWi^wD1?VgTAQ=S_HWm!FsOodA*A5Of(N!GN@7{LU#m` zq^omGtsQAG7cku8WK5GuedMG?g{|&yN{j2Fu%C16^8zIpZAd$F_HXsG#s@{s!Z_jg z2nN?|in@RL1>%*^thwxTwYW5Xto6h8Q2gA`{l*-McoJPo47jBXWVD2%6x+YpgyJ6A z6OE4vUX;Ajct0yQz6@t|OnC%DCX@I3KbYePj%sIc+1;2$xLGcK3E_T^^IMfOc+OXH z88b`Bl(2de>q};^t`Mh+;G$wJwjn*N_$sVwea;-SZ5iKW_ID{X+vPWigA<~buCYc;Bn8FI=^{TW29w~AF?MzDZgzh3Kv8c6OrqlfmRQfHPQRl7;_fm!A`dUQ-W=g`|LVH<{WJ?=2 zqK)N`iPr0Gda6i8Jn1K?s!;Ny`E!~UQ@mYu| z>pdy;b`B?(iMVtC8x~SvG&8m0% zl-n<~+#U&LhZDIM#SNtfX9h=o?&2IDKsvocw1YZl1!Y&S!nL~dL5i;VIa~_)0j@^16gb`qQn@Gk>tD=?Gdp-MNgj{&p0tV&hIAW^-pBnMouG|elI?IqOxT^g8)06py3tC2yScajCB%)e?^j&4^Pv z$hvc?0*{bFMsv#pQ9j5JN1!afMhk{9c7{z^4ysG4x~`HfClNUr4m^Abh?ld0zIPdn zhfkl_YIOmT%0}IT5+(*;iXSIrB{`T$!6OT|@-nyf;mGRVxhO_WjK{T~t^YTXR4s36RLGwfWDsWOy zwcK2IwqB^LF`}w=`_{R=gwqrVnbAcaJUXfpgLS$b(Fe4C&As15jvv59XGzp5%cc=P(-sN4QLH$nW!eOWTql1ZN35L;U!tU_-+Q`~~ z9Y)pj$;8TN_j{8Vv#}Q5HtqW0RwVioZob~oZjuPUBCkRl^O3?H3sN&nL8fOj>3NTR z7yw{u89Gv5^$_T-((pyhDjnK0G}{MouHO8y*K2wDL~~Mmq8ROu2pY8wb41#09;dVW zfBzM(J|E$XZ9~*O&poLgN1(x;{=08UMI2Y_Rq^RN5Wyz6poa^sz*!iA-DvCU5j zGgH??(+|k65c!AZ97GU)ejBJUBpnAI+J1*6C>~nsA+o&3mFQ#(joB}9lfEG%=)By| zInEKAgbEEj=9N{qPi4nStmleLdf(Zxf;m2*!hqXoC0zBe+k$_*!S9q8XYsM`qvu~A zCbdh=u(VrU6bc9tfU(!yS)BS1(tMnA(xdik+BDv24Co0wHJ7^Q^xg#{(tAVNf}V$0 zR*({m)-_z^IB>$d9~Jm>oy&|Neh&k<2Ac|QWF423dzcNFj11kVQw7TfrMzB*>1Xzh z?SJG9F-arlW#Bb>OQqp1Q~+vU_pn8HK>XDN9{<3qu3!pjN?ZgtoN(1XmH9CR*-134 zK*2Vhl$nv2J^UEVZ&%B}&g-E%x_-=aSBJ@%`Xxo2yLRcjYD=Yc*X3jP!ytqyhBYZpEUZ&x#P?;rr&LV% zlWw|S6C1)CmWJ1yNUym%DfRO>g?C=k%Db$_oUzCJ`E2vA`+BsE;6%}e`yOvBpn~FI zoie$nPVVlpwXPbH*U?rMN8c1(0^r&sVVvuqlb5l2#5i?JTq`O$L>ss7gBa!mC3P`2 z)}t|mD`%&Qxg=93e@q+aUZSv;x0`ft^cnVyMt8^G-p&B)s-#J?du;p7J3ar}j<3a@ zgSOdH=td6q?@ekp=@)RKU21{CJX4X6(}uISY@O?yGs~LU0 z7;F{EqRNoqVwct$kf)-CMY0Tb-p{>Zg`K|_n>f+pCDA)CO~51UzrmRe5C%c5J6R`* zRO35qv^*_aqVcL0-s5<*B{%*alpR=J|2?@t*L#a--QA@9s!Gb6M%tHwvI=b2B^bWs zwtGZ-(i2b2D{>{<(!+ZHK%)bD@_BfXVtqG!o=0c)v%(WU3>0?Jx89&cXNRnsJ@TZd zH!3n%zHn(ON-rjQN>!fDLH4BJN_`~$HbKmy55oie+ixNOd(M3Exkeqc(PlwNScp z#cW>nlaTln+813^iJk?m0i5GrUsX=(5yYf~wsD2=Ca%DshK4lqbvRzNj9URVz<0-2 z&7FV9#-xtmq~O!-ttA6_>5p*t&RMu<^|i^(co!&er?W+dE$mWj;7*9Mgg-dJr|cRB z!b+Ex)V4m9!&rE=MI=8SZv6~5?8y4?4BwzTD3Z=ZP||1iRUGb06#l26bFn)vGI7*) zay&rRN?FbOU9#I{j&QJ(MBpOLMMlZ6sLwhG<*&=XD`}_NEgrR{bJgd+Fgh2iwM|t{ z0wlT`cDm)Fa;Ay^KdJ9?Ej*;`cIkr=SdYAP z9JZRE-l2gzPv3TQ*yZcLD(LD@O%C%3YLZ?G?oU7wJ+H@^pWlyzSc7Np*k0OC5@SUG zCOE+ME##OEeUC@J&qWx2=Su&8q{D<8AxHIz`s&~JZT@L&Kdk>34$5*pJHoR*s)Q0j z*n7uYHRj)sw!62BQ%+4P*mWuHvy_>Q#XZ%9i@UMgPn2J?SB)ngr92|pPua82k9E$g zfOVemC$eHly#6Bn-KfN0{e(bCjHqJYk*j^64F9;_hRE^fz9(JV$SnFx3OK)&JW4 z_PtJd=97k6*7>vLU%7;Pe>YZ?wK@^>-j&WBSrfy#5B&`ymYgcIXdF*Q;m#5f+y|RB z{;RjXz`+%rQx~__gEmkCVaTcSW8jM$2GqiaT;4YldFHBq= zF`@=|ZjLjqU~IBZ z7RfEpFOn~OK1mp{bt1Gb|D-3t<;|=eRU(r?Iuby%2(EFcs<;vL$o^1)>3edgZ=b0xM*smNY6v)uWt=E@_ zy9io4)ROgz8La#C+!zmbmBAfuOOJIeH=f*r*=dR`Cm+mWeiNCM3&Q75nzDe|X1fmG zMkeCzY_`4NyIN1&W3_KZlTpG#QG3^yo2K6HB$|z-n#I#b<<2EXtzQU9qqu9CfMDiJ z#YMT3y%xpW?<9F7)O=sDxLdp+B*ewQ8#(E|(lTL*kGIstF&)S`-Z7wcv>wp6yV%HI zvJ;W_0>NIm^LVGU{ImC*mxZXAzdOYwslI?*SC*{%dT6hUQ`r4@Ek65HUJLneqSozr z+j!Kx`3&`w)vbr1@mzfHTnuxgKKP!)8JXetnt*aerTxy+^6f=lJI2=dHznjtibkoA zaYb+Q!zEQdg}hb;-d}opf``H*GKW1?gITUJwTE!a37J$Yr6u`!F&E<;9*U}{Q_92N zqEY)SosQD_o@YlF!2|uvqpE1XJ9tDw>G$}=B}++HHVg^&ov=H{<)z4vUdnN{!)s;x8Q?zhWR?Ef0TyOB8gHNHXtUfaL*S$s zuv4lzK2UB4X1LfMnHA%_VIz)C-jVD3m(SV{N}SQmBNZhNn}m4=f{-y%$5)pJY%B~C zS)7)PVfF@5lG$nBP^52CNouFRsGy19zX;_Ev9llLJu|IUxiH2v(Wo~(KV{d=vJa@M zUKQ4Oea;0ocYTr=ONznH8l@sS_NZoni&5$QW|#hib?UvbJ?NpIv#3WbV9F(2XKA>& zJZyk~Pg6G37H06U>jRjm<3~%Z$ufOcliYwLxwJ$a!166iSv#NTy7D|a6scfiA8-iQ zyX)^HysGC!`pwg&#}&uhmd4YLYz)@IzRyB-JVif)i+7ghoC#+$5bkZ$zIAytQ}$>y zwM9Hz+1~JG*n>q8y9<MZ%q62$*>pwe#YrnMeE+h z0S9#Bv;mj{epI@UQpL-dl?Pacon4g^JRz6BgKU=9zwW# zv9YDO{ii{+UL9$zUER00w`sW!t5|dY-Ho5FXw_}^3i0|{OB}b0D}$N{zo6xM4R2%c@$5qbkjdKrf%44wcx%P zjnO=k^YFA1u%T;krrJ@1`SqRj8^6Mev;i@=2E&bUvH%z0P`Q)XmgnLLQK~}9_d1Rp z_2Lw;pytLHmZrhTG%M{}CTYfbi}l!PkcuX4zJ)%*N}Ou`{Yo_-KN@dhvQc?sZ;k#3 zYTQpJKjemHXT@kwf{G{2x){ciide2A3D^G2nn50cq0db}RVsjWmqvWejzc9|yDj#S z&RiZE^V(QLE-uR#b*Rjz4zW=`_pSYcu5s6#9Jq(H+GW;0j)PWRszzx~^LKA<^V`uL zO%KE#sGV_?%eJ{tK(fX zG^$d~H5tFTH;8UE8*ADr02AX%wchz6q?6gu9}7snt|vmYE2B ze+*HU0)mXJv9F>Xt3&0J`t7G?kolyl8kK%Fk3_^v+`Ezc@{Zf{qC(8Z@NNx$kVjXhCRg>w z5>1k3J<0iOYizz|9WA;{M?HM1M~nh!pQVSq>}6;*Le=~UcGWMsRo<7UrN0XtBTLi6 zM1IH5{k#;Ohlo#HoTfG0 z*2y$MKQn^+ zltmGgjHi7E2%M8@wX5lN43kw$9N zj;P|#3{Xj zlfrZUJ)r$E25Nklp@Wj3|IWVCDLQK1bMW20Xgf1CruU2PRK@>FmN^5EN`drd+*qVM z{aEmIWTm#1C53og2jj?BN=LX=z&*qaTKi!`GcJ#8!?PqfB%sP|f3r(n907b!t z!S5@DlEA2u-+{pb2wzm3TwUHqM=Q!k{%ryL})!p7Z9juEDrDT(DHT6p+~pfq(XQdO2lolY*p}eSwiM zTYLD*#gVVJ4oV{}Ha{0wer-phPAB1YgU!>6=y9Luaov*qkSbSWz2%}{_yhDC$CHH@ zU5c2B1Ml(@t%~iPD{GCV+4=?}!(K&Q;qTl9|QZu?+By?P>8}F5cV~9;1}_ z>;-XWzgOP1$J#CnIm;&R?oU1(li)dOc_;eZrYuHB6(MYigx@i}{Ite4?~!VT1@iuhf4!0(d%r=C*~Zw@!XWBt$BavT`1U z$+A~gHOUkDUv`a;C!V5h`EVOybS`||-L~FKuXN&zsmXlPGCKx9$58qlF}WQCK=T); z3U&dZA{0lU{)@*>d#L|52x%<^=#*wiUbz>DpD68&L`7s^3DDs=II6Ah zCD~TCOD>#(L;*+4cm7uo+d?OfW1K>2zQ2Cwno`yKR7FVmZW;l_%F^te)^#wIMtQ%~ z>BS#XOIP*>E@)<4@GsdmUnT(AuOBFt4l6au_mU3&symSS^}ei<+cbs(zT`@Z3r`sQ znk=Zhj90e)2>N|K6ihd-zKqOY&tS-wXZzs^Cm;g9|u9=+0YFX@D%vLr7|5vJ39e`*Sw#8Gun z;J2!&gs80io`31{tq~oYUK@&aYAOlW33_LEi`Q$~OjI&fG;S;`i}hG-NuQQ$cHc|B ztdaZ1l&fC5_lIK%1%mu$myW0K2Q=8k6ZcCanLrODXtymi`8PW*Ay{zGJ(J@oSR`qb zzqwnYutu&k4%L|Voy+z6hp#_R+a!Uas7q{e3%#RO{?)=)>*D{m9BeMW`+}-~=_#p5 za|-b5d~O$K=;;}fXojSgzznMhb`q-yEZSUbl8r#vTMox?-=i&KdOMs+WX&fPv!hER}_c0xGU2FLN=?psA5OZoJf>`KuqcERA^ z?JBYrEx{MrpNcGqb@hH`#UJ0yfHAfhGs~0*6tuG?QDc2g0kCTGJ1%&|MLT#>F^g(eID7gwH+1iDwV_zG>GEl)**a{$!Jv(^kLfc{N4oq#R z_pWaq$W;e$K#V)IUGEMCP^odP!IhheO9@+q^m)V#Perd{Zng4kL^KhEl8irmIV;A# zuD^^PbdE+3>QQio47-pXkbh2gQ=b??RjIPyd;hD2g5iWp_08>Ga@%7K?z0>5xK;(k z!;J-TnNOTptSmdb+fjtp1N%l4Qv}l}|JoY*RFWO7d34C~XceY~nax8=$SW6(YdkBr z{t_B(m0fv9Z*`kt&Bpb(r$U`t_^#n}u(sl=YEISxg35I)<204)JR&n@vLMzZ}Uq~Fuh7ia<-i}Zmjau#W4%AO;63MJ*i-iPa9&pdfq!$l~sKF zX2g6V>)?Q8-}dFQY0$81>+N2Cc4;=5%?z{Y5c#TViu<~+)hcXU8?hc$x077F3?ChYO~e1LovD28%q#V(J2S4uIA-yc2SI z^GthWkVm>3U);UqA|T(k!hXk>D(c=CE(dici;=+_z?j*G*diW97p8uVuBqqi&OB|`E64kt}0uJaw{*t z1V3t}#!X*YYxk2^%%t7BuPLA@gvb*!A1LIiz%)`@!!9Hs+&j^K$nE{5TkWZilxF~b z>tzW*rbHwszv`<9b68vU)2;)$&A9_H4$F~Lh(lY>4vu(0G^E2U)Tncf$k~`YF5B@KkmVXyh2_kq`x`h1pl0MfR?-rjuATDW3S9bAK*DH~5f+-0?{~v34ozfTr#= zARv1lo*wNb&3)$C@rMKT`vT56UH1qxlsoaV>dIIO5bv;EyCoo6`}OCMdp zsAm+UszS8$kM}ug0c8n@b3eRt3WDp@b49M2jqAuz$a+OWT;!qo6 zZSN49*T3Fo?q>_+P_d>MLO&pNAm0@P>gu~sUxI<}8t|{ejSI`arUem96%bp^U@e77 zCYA(bnN&%th&=>UUZ9X}4fSH`YXKu(nmSWAtuP8-1+s?h8@dioCF@OBG!J@NVDPZu z_RS8n*8^?`{hu1y$C>9SE>;X&Ae@ zkdR>@99c4PiTnbw!=(!an;jXI53KD8C*Bko0-wcg|>fpS9f9ue-<{AE9I|+ zjxzVTsH~TXUzDFJJ{Ph5;41 zAwJJUR{Hx=FOYZ7A9d})GQue|wA)wM+XR4-mS#z)&`~6$KH;JHNJ+j1;$va=3}>z{ zh28$*_%K^EKAGx4D`l^)_u1JL97BhwPcbo>6h_5~BI&&2KY0EkqiU_FEw^5spDab% zj`vWEi%;cGiH^s%c3z51YK(goa_T;?R$6g(m+~BNvFjd0{e@xlWn;=%mAPtH{$|&# z$GYlGUT4~CQEs#5pG0@NtV3tqMqdSv0hK@I_!tu4XJOnNNDF`(b^LQ6{fgWoU?JDZ zoZ6vLfrv|wi$0z9)jg=Z43BuW>P+qsP0l(6f{Erm-rdd#jBr-&9Wba``ABaw_~L)D zBQaVbOPDDkOU2#yTs;70MeotuVg}ZB6AWjY_&iTwJ)68MKp7oOAqHr)ErEeCw06~n zRQSLs;Q9H?)mQ$3&xtAIe=KL>fa!p;`1ckdC3j9oGpzDVFAA}>z`Myg(V&v3dLqsj$Nn{RuM~Jn_2$2+dun= zU7FJ1^CQp4>W!V@`0?5k18CV&=V&!`D+)-J`U4*Aq-9_-jRcaHbMO70OH#ITN9XA^ z#rJDyY@UYr_^S}$t+5RD5t51EU8E+UJ{UOs^)&x;p#QBOGS07IB~px^Wq!}}(TRK& z^t&riYPWZeoL>K3QmHXEE`CfrU5HcvD(l)Wav1#bP7vS&V8RsKUwBVAiaa1KdR+5d#Dk@wAJ?+a^|^ui)fT%(abZhzIRIE+!$p3nDd8y*Vw~}>K7{Z zG8hzDUZ9s>`gLnf&Pn#sAu7I~FK7K|Okh7~6n}_zBI4lXFK#I|WJZ=c0@CZGZqeZ( ze;82!%E+Bsp?YLECwT4-b6_58_{+A1TRR_nqQwvXa>g~^cPAZrd0Q_xn_}o;%SD+I zz6A1*R~Uu%V#D)(Um$r#JX_nBvh}jnofAu1u5pPoupqNG*0$Mwl3IkH_Dz27&WTxv zN;-E1ZP&-;}7j;tY=p*&vn z$347N__hLUWqb1S9-%PEN&&ug3cnLEwg*I~rjVU$^1)H_Jq*w=ht;$(`%>rP10Oav zqN+b!tC!<=GkW&ttuhM9%Ui&=a3YhG&Xk`-woa$yaZ(hZbep4v87ADv75p7i}+y%|T)jK%%UnmGskiHzP8MR@UCv{Ok?c*sZ$;PI!un zIRDwu-xn-=;E_4Qn1YF~&vpm@zaG>AIp*%dr`U->Z2NYl!+4cSIJG6O{2<93K(Z(d zOQg;|=T1qIyB5tm7jZXRm7eI$#xK2~^qdiP`*uw)RiW}1&TM9|i9`S!w7d{z74Ilh zW0p5{jPv#m=E^QZ*RC4&cs6-5bSLesd7??`-um?jz|f#%xk|4N>;*OmC&ELd901u82 zN1&hV`Xdq7018G6L^@MC_|YXqD^gy++;Nd5bBOs(4dof~U4<`)uyY?M94!ekgfb@) zdz{Od>A(p#kym!krA^JRj!;gsQ!A8Z;r!-@6 z-=y2_`za@!?S=H!SQK%#YMKq1=N~*-`iy)`m}$LH8Haukqazoe84CRBPHz8*(4Xp( z)ycYbLg%C^Coe^&&B>h+_Slbv9M&5Agq|>*sx20`^A(D>s_cTz)Ff{-w(Uh#YSm_@ zVV(OQ;$K24iZd0|OA@7OGsL)bocECP0tI-5Ib7V_qC-Wu7Yp}{_16C&WbuICJlE@Y z5+`}E{}eAL=^RbnE%rPyaL&1^bJizOra&tvcL2;Yco8mXTSCqJ@ZA5&-aHQ=oV2Ey z=A{^XTZ8)kl(N1`FooAd7tlhbe-t=)x=3+%g?5dw%~SBF>aF@Gy(HXfPwJnu74@bW zCU`4M%?db`=}vk=K;a-Oh}F!*$Lgs1XI>r@J*aX@>Vn>U8gp^Dq3Zt!ah zJVF3rS?3$o&W9_8PUS$lrd|(UIsikb8MC^safxq>Y|?-C(UouoawN3+zj(MhDDC?= z)DqA+y=XP2KZ%Q$JR2b}UJTX=%9fF*r{$JSA0Az4wG4Y1&Rv9)5tT z_QfSEu`Wrie1PNsaw)W3&*gN#X7No!jIN93g9ogH&RxV}l>NWmJa>H|uWCK_0`UkYY5i1!SUQ#``N~o-a6v6U!D%dS zZArgx)hmPe`R(VJjJbeUzWqi7JL3d>X+|cQ+%ZeH>3MACz2COUqxY02zWoRf-TGZn z-3+|vX8wqmI6r6bH|Q+Ge!7M7PyXjf;zb!8vLKsG$|v+ody>9S>q!@v`ATSld=ST6 zpWR!Z)I11k5y0C6s6}kPB1`sOtn7gscfPVR*Y+BIYbBt0iAtK4kM;in{d{FZP}d15A>UO0la1p^7e>UBsWZ# zh3;&VIR%qMce_&j=;H&bk7NEdLW>)+gJvm}Ofd(k#;Fem3LSw7jxz{Z2iNKTZenLtAkiIN5MPMF6y&XN@qXiwRsO>sN^O}esvZe+X z&!^4rk$*T=Bj8F3b}FfV`1s9MsvnH;Gc)Blb8yJ5z-7cYZS%i?G z`Vz&?@$-ZwKbk$B3^-dTGHkUHaC7U@1F+P5x7lRw&*5o;EU*W_^<9f~B2w;FVIsfw z@U=*SwQ(>0rsXn!=KYO?D~dWO{N-JbkE_W>SEllSZgbs4hKleBFV%H3&0wAH-jI2o zq5orlPZJ>`RF@qv^R4MWnw4Pl5o1zJMTFxHG`IXNH7gi4=LJ}<382l6MIkScl(CTz z(YN-#DWGoAb)8s+N>qz!(ulm&sKDaSb7pRW7VWGy=azRXF2`e2kgW%v?48%s(-rWC z`z^qDp~a!yPn|x-75}N8ZnM3EgH(S893fA^+qx%oJ>6d*!Ws#LiB}Owg$!^%S%332 zhet_p`4LOaf7~=Tc~v7QgYBt?IJcz|nB0@C;3wdIK`0ynrJ<0u_;En1z_fo5mo&WD zWMXz1%s*pJQ$cmgZ}VuW$Sbii@Jv9RMRH1fW4S{M;6o+wA<+N?*r@f%8IesNTW8wm zU+7JZ%Pm_kOE+cWzPkGbH>m@9M>PDr2c6bq1CsAx)4k`PYmrSh>NMg3URf^e-9%Bm}ZSsI64Mm-H^ZLQe)WO=7uibr+eP1yOM`PX^vwFk&1+Lztg z>g(*&l$PsuiUSIv&6LMhzLSY&?3y;t3C=Mbuj0;wn|46wo|?~QFKShNz=FkEGbNis zm$xJz2K`zoj^m^{Jq_>P-%)v5ptvJQPNOn!G?T#Gz2MT^@HUJHSB@a#VP@VpC->AK zT^8i35l=OpiVCXRJ3JilUJ-VfEhH~MSilED ztBzpQ4~y97+y%(twESLB4wa6_dj3}e zOg`Jm-qF?rIB_;Wmix#Z7<93MT-j-;XPKcu#=osy zxG}Nh3&=JPPqF&7*c8dMlDB<4xoA0qJ8f6LWd<|2a9c%B^%ao_sB)4sN1*;G!@;`n z!GPrSEdo{pN$k)-`$;Lx6CB`Bm`&27to)KsHBCW?BcJv4A(uN>hE3Su zAuv(Y-Nb|2y+hyVPJ7^t;PK{eB}>2K`wiMQ)h4_;tRgQU@TCWfhIa`r)3~BahQ~WL z!X(?di>!zgyHDDHc|sx?dO@^zMz*6(>@S`#y@M;xUHzr_{gN2=^uY(MKe;1q{Lz$k zi{vffoUNN6Nj&4>Q9BH7wRDLN{?`VT-7Nte?Kp@|1wh zm^NNvAKpQNjhAQPY=Ep;OyR4y61U0^X=v5pBKc|@tePMH+yLhdb$g={Q!-5*PP^?}G=r>4xU&x@#j_MTfPZCdZf zI2zOaO3$W*u*4E)%&>~}p#)ZeDXmUfhy;%#BgD%HGWi@t*b~auf(j$mYhMWq-iU#3 z#cNZa6=#ymE8B(wvN!CA{ zXSG+7byS0O$e@jooEqAlNVp{;D6q*UtSY#v1Lf^bIuYDaE17~(Yi?+km@HdL>F}Js z-jSm~tZ~Kj;#W%W5fOGPnI@M;$MpM|-Uqotj2Qb%e?7*FU^UX)JjNA+DVFojl@Q>~ zRW&r(H+L7`YqXym zi196tCq#)Tm}xAR{XtV192hM6Klk)(NnBzJUO{x7lYhnB*dH4be-Fk#^01o``z`Ig z^Yr67vaW1Cuj5QFpzjYuL20w07h1xz!icbfk+*L@gV_zg9o<&&wwo6ngjz$1B0MI}s*WsZ zzph&)-teFK!4*Ca|$@NJpmH3M1!IRbrW4x#R?+ zdic*k(XUct9>(tWzQP`=&$hhfw)2=ct#ZHvMby7j`}WU1o{m%ZA->N2+uxyfZ=beW zKD6YPSBha$mH0>4Ch;8xPRUtOzLX_?eMLL#E$@xV%EF-Vddxey=YJ`+{VQSrpDFxU z(YpuUv?V=)jK!=`6IQy8@=7UaRn>p?;e`wXGinZupjj=SMh0{QNW$Ow|I6(A*T;{;I8*X0 z|8^Vv?WLBC!M&g`+Dqrit^z8*f_h!)&e6etEV)~uM$Kdw63j6QTI@57ae@8h?Em38 zy6>&_U{(07euBc#pgwnAq}Ipx^Uwc@(d9o*+3C?54u@PUtpej%JEKof_z=NAx}xuU zM?YZB`0=DE<-V6sI7>`7MMJrX)BErL4eFKrtknKrEP($&m;Z&^wGqqR_NC~x(%R}L zU2a}mx!z~b+Wze_{M$=&u=lfw?pOtGClhi89C9XMd2gVL3atB>;UBF@bT^1QJE_V? z%IB5w;7y#*l;xiJ{kH@7e|%~2Zv4n@@`}gF;f4d-K1EAe1_J6}Ms2@;%tG%O=r>f7 z1I^!CG_KCre7cB-l>6s5HK8}y%*t`g0|zEQr2P;hj|=?xFO1&@{Il===|L=STx+F} z`tv&l%Cj!y%zFu>RxJ?mfRiKwJ#Wo}3=3NC^}iJ$|Lshy-n~U$J`yE4e$zLcWp8YB zW@1t^UM+#GWOiz>vShNsY>$vys@QN`%v>NrZ$ zEB7!%pv>k9w8G@q0{n$*qV}k8NSqPf)qS*;-dA7CTs?fW9T zd?GZmygihD=+;KBFp~wmdbYdQg!|DzoN;u#b!1%U3yy}YA|Xlvn|(P#_}(wDyFmI4 zb=|;eD4ynN4_&Q0TYKA{^KYzuJ=mjf`0kWt{zdXLO^fC&C~AKJlhau}%6%wUXw~-D zWnG+@ggItX7a7^47)Mpp8Ie_WS6|tD=&i$h4Z*RN-;oi6-B+_T(GA&w5FaBH2suQI z+&5NMR|AG9Ey-m`H+gSGZa=S{vpgD5s=sdo0(*vVdF+66?7SA8{m4u&dyec zh|RyfK~4i+1?!xOt&UZW8%%xqn$VWMsl5AqfmrffJ?X59bQ_=k(#2#Fb;P1^BP?I` zE84L`Pv~*U`+jSr*gBc&1f|6j8NJnG;eB@_`Ys~9Pn%}qN5m|GlH}NKWa&_s%Nk!K z!8G&39s`)bfyIL&DNmNO)Q>Njn--MwRw=s)W(pk6SQ`)Qo^?1&XX`-8GG%Bd*S_Zm zFi`pNYO4>wmOg*{wXq>}GxuddlCTMjZg8Et%S!J^T%u&hVmw)jCiGn{g3jrb>3xzP zP4toP`K4Q5U_Wc!LwF}+Ocj9Ft^zU_RpRRlat_t&T4k2sUQyPNIv!NVS#o*0ELy*> z3$~O_!8oO#pT!nPl2_0-XC8};!t2{jUKgM{qsdZO3r&T0w7Q4T@jhk$LV^9CZFa*U z;$Ym)kY{Nd%o!Z)thFH_0|}t4f;X88b6M~wLbZlB-ikBrh0PV?1+nw0Ddra44ie#& zW*ri_*(I4vUFYb;;iXpqF!)D+7C#vq0DbOyEyl@5FR!f~+p&`yLi}D@J#spEvC17X z4YD5z=ti~_N%=Aan+Q}Mblk<}kt15-o-0tKDvT{owWiA9n4MgGXChr)UL_2#sGVb! z+%ZYvfZ@cwkvg%9)P3QD+nz7{IIiF?MlC^ z2iL(Yc+5ZRwqyF!$#h@Y^^0{>K-ye|E6(tz$5f;*cGYGBYxwvSYshS6^l7H!BarHmM#1oC#GYuvC zQ#=rO{cKU_@{@-Q{S}80#$Ws0LfxR>nuU2$iCWH&Ql(Zgwe_8<$0muv+y>uwX{U0u z+Pyhhb>1kt;)DoUuf9&rv-`H*Fx(9s{4$zD=dnpsEh~&fB<;O2TM9DTz-IqbCS)|K)kEtf#wA)m zf~k7mgvmWIG$i3oA%9EWdp65ndClcsmY!|_QG&AW#BUyvF>v@c%3k~MGQ*$2WN&hr z;W5E*A%bI>I5jfB!Sb=rxrlPrz5T%fOOIk}=jD z5>(1-_d7xt=ZaDH%c&&B@bdiKn>+mU5vy7hMhdkOS#O)D8;5X4ggARLzNAInslH?O zRRlQ&d&oVDu~REmziq z8cQyjl={_c&8Mzeo!H-PHBDtt?ne${{fJI0Zg{NdEY^hw<4Z`A`imLkpM9XFxvhJv zF0sc5)Sf@5?R4Hs$&y$aZ$l-twWczvC%0%CyzE&KU-+@iK9S&~)KY7rJTF76%6Dm5 z@+F@b751*Qv`}ePmQbm|V_Dl5P6hs$C)DdJ58MiQpLP;Jv*rRndXV>x7|uX(-JZr~ zlXVe@zMNkD$#HdaFYziYDfTD-roM<0g+P@EbGuplx+pC23rj}G)jWB78V#s58qE3m z!|t=8W_;O0%1h3)ml|VOQRfMuA%7F+VfC9vG1;#UJ5*VDk8cLMwL+La3V ztL_-x1o2JSdCME`f?+Ssx;NBs+7rEk-C&fga(QtvoP>_Vbz6V8X3U8J7|THxlQX7g z_nfe@e}d^)d&XW!!iNK_nw^uJT@^>1m8;l7Ht5Jv#1fw8#03Q_DUIQy1u8$jtuRpy zln2$gHx(9mCw~)hq#>SsaG8T79ceYLI_gRg=Q~e7x_Rco4DqfCJ1(yG9^^lEfA8W& zJy6v%hjuloB_){mi`u95^C-9*@v)-D26plw;!j+`Hxl>#s+BhNK!qr3>wA*BN^be}t0iv+q+8!`b#cm4FW!$1$QCshg5=O+&PHk<(5 zY~EX~BwetMGn?9kxnAMm3)KUyo*}dTx^I?TrNNeJDfNgqF=dv){p3_DBcgdPYldd+ zIp40YsynCyHI2QI{TfF$(h)Py->vR+JE4EgNYin$;oB9BJ|qmwbcv0BE-mM>Mn;rK z|1IsnojjYSMWaZ))$Pq;tOBWoa@t(kM;S3fE_|x(u*Q8APE|&cAan9X&KTZ?K^`;v z?gfEY8InlzD$%1sl0fO2MztgZLWUqtqdt*}Px=GIHN4A63wdtUpFg25is89@Q zPXkpf->L$CPp(RC^OJS|GTsbKvS$_AcG3!U_53+L_bid*yv27=kN`(<%_fl_hJ1B1 zdmOrDj+n1*FHQ(s@Q-@bOxO_$sTTx85<{&id_8uN$Qp|q^>_9l$OVs@$YlWKxOAK# zV4n_G8Kf`KV>WudAVsSA+kUO}S9bEc&l5YKDYvM0A%JBHxP*%B}9Aqy6uSx{BpD6%+eOe;}7=XU3KVF znEjS+i=~7-hTD5@H(-@>bpLgqUd|%t!-;;C{WT<4$KZ3zWFQs18Q-?x? zPHcW$z32l6#WnB$M7n=KilrLFRfXs*Kpk8M-zb~4=r-q0^bOF5x8qevf|{)jl94Ys zW(d@kU3le0BeB1W7Z-04rC27y65)HIj$Pq1TIbjN$ZHw~Z~qEx2!L6FjRO2_0Me+- zbTA;xzGg$4rcPO8CoRbFjBVI2`?HY(AyAGbS7C7Xh-=~9!vhr3P*a@=0TmSrkcJvi z?z%CitLq0wJ#7xk*2I#|u$&kY$=rDJZ(F$k{nFdwWonS9{wXhKr2ML*Uwsx=hH<&C zD0y&C5l1Z3qZR8M%H)8pBr5HGjpa81E9K?50s22wZS08GKajuEEXpWBB<@7zZe#36 z6nO&RlAra}7WYX#iRwC1n`zfc^JwUW*~ETD-VgF_z9ro$TTtiY0VQOddD7`|XFRqT zUz(m$-X8DI-MAk5y^-gX`Yv7JG*-N?2gfOafn_}Ln+D9!7r-(ZQN8+YCEuv^Oh8ig z%D!GLw=0O&vn%Ipm<{+lh+295MXXJ({iGj3;jHd}^;oS<|LSz?=W{WR%-NS5z)ty< zKpl&}pULW2p?;Z-u9gn4oUCnx{;scle_@iabf z(csVZ_Ui_jz%@%o=hN9aXe1A4xpi^;;K6%J0^3JzPwT%5{K;TPfD;IybGyzdbJ8slXesIaskQP8FR6Y_1_cJ*93cP z-T#Du=faeSPVI~3&g^CZ%@d1y>P$`r5V zJG7o{>+x(@09|BoJo*n#RU7C-b zTQk1vmGHf`nabeS)8HRn^Ns=mJnQ7G2?JlkDPY9VYJ=BvfK!uWpqqQ!LX$%gq5o%| zu=Z&v7q=|k1OKK2S^*L(PmMdTDb1Z>O&w3ZoiHk#iNnd!IL>#Q-I>%YibQTNf3ml@ z{g9zAD)Uz|MXj14epXoU*mpvsuG>4O;YEqW%kTXSvMO_lo2S2{qjGL|nmL2(zBrW~ z!t1?zR@(SMCVTOjuN#Q;8qss(xk5{#KS_s{d=h<)a`zYFm!O3p`^$q5WrAx}DPsZZ zsH)9l@lUv3+?gu3GS#}kUtXM(x74TY>}mvysuk6bD=XW=G^^F$NaMIA{^Bv46M9i4 z@U*AC%TZ&Z9s~Wn@y?k!*z)D}FQ7hoQ_^}3_s`wdYRFUWkAeFOxmG2lyqCiSf?$Ck z8wkux+FV0Ggu=stz8(VE>C!O;qFM9P*^Pp>oR8V%_EM8!ydHf+ci%ppCEayP=NA$q z_qm+hU9UgZDw|)12FdPPxBcT0($ojjQrQl`*4!6>jvVzb8SGkC!j)jdolY&?zkm z&L6bMT|u3^NfHaR`1y{3IPC5r@h7gExIGoKPFqVhuL`Ehs3yW4HP{1a={bCg=XCRi znLGP>+-b=`JPnei2<{*o*|8*XUu6Nj;}%T80lAwMGW~r0O*vJ|i1k~xsKXiWEg$ch zutc0cK}?%469a$F{sw;b_ghZO`f1yO&!z7YF@BUZY3UBfi2Ef-@R3Vz;JST3l8MLp zegw{I1c9%-7n`Ttsakkopnat#Pl_OmseB@ifN~lFdYKTX#N6wGs3TB8cXr<__P;J< z)B>c$gu)1#+Jo=LO*xt#Fo{#4257WO$Z-o^Z9p5 zNhl`f7tedJutKhGH;_i!QBa6T(#t=ZZ;hU-;8XSe0zXO5H|q$jd?n~b<9TdY2~18@ zUxUS_f$0<*pr?=T3eZ5$tVe5oeC7&F1yuo?+?l-zlewbq>X&05`gH@TR0R}MY^}Dn zdaM^=wrm3-e@4*Iq)!2*iYAn%j;|bzamg9-FWl-TNR65GX3C?x8+cl0EfE% zqy^GE@NO%QUF()eNYDM&KC#<8R0gYEc3T04pU&j5&H;}Ir@QcB+mRs>R8$KBDOCQ2 zAaxm0p^m|UwgJu8CbeI@){-oc3d;BX^a}|FWkLGNokT_l2Rp0gT7{D0?--ZP)2|hK zpKNqlE*^90n>;cn&+l6%gZl6a;s!B8)W1jPb-BNXGQf!xy!`5lxqT8+AM!pQWX6#s z?tkpNerqyHAC8N61t0 z(>mn2rB@9Loz&Q2%@7GDZafN<^7 zY{sXD9y9hyw0SWmx!Wa=N}iAH_j|mVcwX{}@A;e+yA+%r zb?I(;MS;$mXA(x1QQ9B1$v7wv{f{-gPkI;Q_TM?Tt{AeV@?74RkMUMN^u65}N>dRB zZ6JG12eb<2!A)iV`@uF4 zs5<}?o4?!v5Hz(2V<9k=!|td&$`X;>sxnYMK4i)DHsx+TkPj{V&s3<7B1Ci>Kc=}n zq~h}!s~Gfo67I5cS#kZIR!?2!I}ThgFU#L&jq&gQUNthm>wW*i&agw&l!9S!Iz<0d z+QCEJVL@kFF9CdN7{s8BQr@AY3>q)V^MPFfv$8K89jzX&`UJ!|pZD`j#7Fi=8lHjJ zxp|p|vp9-+?3O@~X6A)q5iE|W#9O?T2;|3yV1>?85EjLEuEvF? zYE+ErHCL&t0cv;cV1`UBFuYh4mX|LVXjEBEoLy0%>P8L`bh7EL#v~5G1bDhuz87>_ zdOJJvPX>e*4<*efYD&v|I+B|COFin8e!=9v!lJoltzG)6Q9wDPm_u=vH>5 zMij2_4@#-2Sd!H-B4S!MxrIVVRe72qqx%(Ymh3Tk9YNzJ?~=3Jp=yjs{YN}>QQ5p0 zSE#9-bN(K0)#J03oM|#L(PLH-_GG31zn1U%um&h@#Xh`WDjV$+VEE9e(#7a_bW}E7 z^>2mNfBSob?`_j{kCD&c!_3!`o&j0(%RQ`wNw!SYPws-JR zJXK)y@5DEW+ze)t=l(}poT}cDYM~=tz|kM&tKi|NY086SxGowzk+$ zEI-?Fb5ttCu5#0;XXvP}eFz15=e&H!QTrUc0%_CxV@_ z2`mQkz_kFEVKl@8Xr0|~5fllt2RH)u*W!%MYvh2-uk_?ipw+se7Le_1VX=)@^$IkN zzHngT){P(No;}mm3J`zl4J>5c) z;jt4+yv=%T4`kTYdhH!&0eO<`bVmpyV-q{dT0d)DsZWtgC^67PLn9{Z6K7KT4Zb z&;5v$gB-Gm>#`aULiP`8NT5hHjl<%NUPpM0YMMFY;1QK!I$~;-YXHAZ&rnuo z9O;>M8p*K4wuLTJ;Tcf#?Y%Zrv5|eD-YTry4>()R2&EG4)dxxot^j(gtS&kE`FFoC zAijT5dTcro*5kuN2dHmQHCw`y&bWHW^NR(t#tvv z226FLmeBivoV5Hbl%t5r1nX?fhB5B%(q`BO+>fEcm&c2N3`sV_yI_-+&v!$x>29=a zmnm20*&eHs^}2vpcEe;V%tHi)>*igW95u9!;uYU@(*PRCx3p-Wup*9v?r?}l9+1t_ zJ+hR+-u)rM;@tRqK`_CZ$xZc$4%@aMlM@+yzvH6}#k1_eviv%ZYp9+LV6?V*_jyO> z6i{btpNTrHzBw~5WFjg8uGm`c#~vXYHYb`V0S(<*QTBifwi@VZZ=VK;0Na4z*a6_$ z6r7~G1Aad{V8AWk{dnG=?GiX0vMlmv|D%t~ApSmch8hv-Bad9m6HTHCor+0ui5|dR z(ln^iL1gQ~M-5*J+Xloj6&?W4wfGOFU#!u?+6~CCzN(Ix!2|S)pRP#&kFKuAw@wxL zrlf(1MN=lCzX{1IQ*us1r)$NUGg*JSFyy7lFOeLBtY)E(FXiM z6AeH~KKez!^u>KaFA=)5JXQ$;hIMNbcr8?8gocdGWVpNl*%Wt%QB2SXbx?NL8n9u0 zt-!5#R4Kuf^=)prN>#7b3a3PS;~6-* zH?K0zg`spV5pY|U05g!IKioEpkyh^4=H%t2&Irqe2+9L_N-`C|7txKh>FKmbvqZQ7s-en~8h=3445;)&#f@!lPc<6F!u6SNm8L zYr|+;k+dp@3Y;RVbsp%7lzUQ0-Pto`Y&0Y{EZ4O69C!1+ZE&3$1Az&f`kv@h&(Qn!f!_l;q-PDn-EwGN(eUKiW| zz`9If)dKhE@JlKo2bA`nUTg_dR^Ljd;ja|&Yr+X(XZYrG7A zVO+BVj9N2`b^D{U+lVRode$ZU>!K7-jxorsP%caOz)L($R2~+%qYHk;ILr}r-q)A) z%k$kJUw9$kdXX2JcZ@k~9j24V@hyxBq_vjp>I2|*ewhTFzTV4?z!QiTl%O)hS`DrQ z7Md>rUL-TBvqUqwUlR39Sw=>NkP=jBZV}MYSF$T%R&wHS5$+Hkchwe(+W1`Pi}X`k zyN`Py+rXN%3#=LmgLj?MzwFYyuvx+^1akNRC3$^@$=5u+#+wE@p-vI3^A;a1_KmL= zAy?)n_{qx|jsnkxH)0V~gHg!x-R`JCi70>}>+_Po2K-DKMw_CX>38K5_3Nf>Q zp=q#~cQ|Bs!dqo_X{8ztRCFaO(DrKt_LIfMz;nO+?h zdP%t*1NB>Ntz_jacc5ur5xs8DF(g`Q4Feo~mg_-dJ7cx=H64=8(x|w7uF|QD2Vd! zdCKZC;mml!w$2VLO33E70nDQ5+U*@z1jkqO^{|~5hP48a$Gz&G{qx@8bGDgcGVF5c zlyB0CWV#l1Ugy8inizkM$STCX{_SpXu9>_O_QzHqI3QUHSA9>dv(3doR(Q{0^2^fX z3r!nREHI+LJv3tijyam~QTYUmmn5eP=Gmc#;s))0n7notww>_>?+dBkIpn zyGiRa%$+eFE}pwcCA;L;up>pt>GBb1TsGmZ6fwq>SV%ox7(;Ta*g~E%zM_ zG@!wHQ+lRxCal!mCI)7Fkg1ae7uG$gu)~r?mgJCjWn70=9ZOo_ug4M#!qM=cywD_B zMBL$F#5WHAq)#9Oyv?qfHkfSY1_F4zPjnNl|Ex4NduWpOG6sDK zJVHy{I=-!07-vB9QkLCNb$j_=H(8msq(YD#eS?5GZ)!bw<6gI^fefD?rkuM2@TN?F{k=k!hp@#OhXTJhbr?BUiF^~ zPdgVb=*j}wv=N*n+ziMPs?w9|-rL+F?oY z!1s030qL8PXx$`J$j2ma?fhchd?m}`ZXbR0wdd%z~Xs*J@D^F&Sp>02N>&U_(lMFM99;bPX&c4>{ z-E)GeToJ$(FdTnwAuX4jaqLJv`*;yj_+mI@$sTQ=S>CUSOblAwV@i36Nxr~Tq1Q@d zXt#8u_bhhUf-(yBt79%ebt@<5^C>bg4wJcyI~ktiwc!4{lkfElqmy?0KhTo?*E;fq z`a7_!WCar)q-5yJwk|aZni8TDjH2y4^D3u+)x%1Z6O$Rt6i;grY3whe|MA$!3^EMg zQE+jB-)Xihjux}|K1bGmkiM7XC7Q2a5)to>%hwpHKp}rjCn1@5wU?HxztBEhjBx2F zmGo(*G#m$aHN{-=a!A-Z1;>o73JL2E2ZbjS>eGSi?0d&v0u{rFa~H&#{?dZJIdT#8 zptFydqTt$cA0N{Lt68ey-!E!yL++WNC=)J38#WyqXO-AXjm;+V$OPNnjbI`f44BhX zSf2-;xk}P5JfhpwsfAKvf!b?^esFA2m@|SEoWfMQ1Iu`s{$R1HFhRjZEi8uL^GrZ5 z6m%Xip|3FWq|MT|1dhX4C`ci0ZeU~}Ln@L{m9oJa!7&O##2q=mF~xOJJ@)XF!@(g` zKX5X=fTn=R9iGc4j4Bmj{Jaqe_?}6!=owL8nPnL6Q*I2h{S=mWeNUqv{N|Ng5fzIu zrp8hQBTo*u%jh>B{kVyWdFc_YPZKF zfYv6mXQ6L@c*1Np*-cVcCwj@v)wsV_4de7w;phj#Vv_e*wX!o9X$Lf~%An)m9i#4j z*-MqAGK;HfyO>nUD!c_xmpw}y#ogDVY;0fHurdpr(q`74C=EA@aP9BomOth0_?fK2 zeVK-vLU!RYQ~yPXN^Is>2)+!^uDqVPj+Q#R}r`SBMBRk6o1G8%NSZLGu7KL+2rU0(@4FXa-WGu$0>078!`OsvV;ZOpzT zWrd^;w!iOE6IofihhDBbUD!iFKI~?^{=K-c(M!%)I|&OC%hq5duJ$qi zo=fcci#i1{*<)vdU1v@92_4ts0GX8DJDsy>aE+O&E3rB}G%mU+|G#uK7?q=<- zioF+ZWho@BJaYh1`P^4Y{7g#tUO^9#93mp#Aku#>BWUohSdhF5N1t67;cad)7q&Xk zY`r${%~%0ZzOnldz56(K66lSf7J^VWymnq4C_DbOhsV*Q7HsCP6z`YQ*8N)71@_Wq zm(y>T1`eqYTVPEdW-upIi6EY%!yPH_D1x@V~59;mePa@O^TcPV=f!C?uxlc%=C(QlSN6g1a&4oWeO}T z-fbf>+y7?rt;6($86ewS;69 z-n8b5$Qjzce;7^2ompSm^yH(XTnXVkV$aI1T(5N3K4wj zM)ORya_E0#ZN-&Intph)GyC_IN9q3h%sA@)oB3N|)-;e%GvVlwA`VC*0s#f|a=ecP z8~`%TG|xa&l+zO^XI6x$!77fYs})?@hdRC${@BP`ZWSebwi%oK02fm>9_V@BZeP(% zI_cU1uJ>?nImc-F_?EDniZO-l*VMt^g^rEHyCqJ!1vNRv%>z(R>^tp!DR%I+L>dch zk;eh{jAmGKK%RW2s-kK`(@^Z^!lNw{qzup@pq<%#1W@uSoU<|vOQLQ{;yQ=@GC$#k zjS#?vR5+9o5MhGaToM2yd6mZuz5<0jo}fA3 zvG)`mi{3q&q{8__1twX_mQ0s`8aW~Ptqn*7%rP#~Q1w&KX9-4|vj)cBMVsfs_FG(s^@uz<=J0Ub0$QDJeayIBei+-ycgE zgzm1|UhXLS0CRtnWtc;8aPPg%C#EudP|{k&=5Lo!Yzc3xi5^0$o;R7hX)?z~I2;RY zuCq!wQLs!Io@lymH{FXN9Z%+dR9*Q4ShO0&vg>9mpD#^o^UWeKQ#mD7q}8rPxB5jj z!G%nsEY}^WqT{I{Ev?<*%WJRd^4zdaqB}19!21KB=p?VplMpcqCv$}EHBPU_n@pQQ zO-uMc?zp60v8DmY(EK#<|7>oYP zJ>J7n%(grEoz@GWFyMThyEZ|~Ji0c?rMr_X?`&h7^@MMRau3_W;ss}}BCxSgRB4qv zspgKmrcm=a@cDTj_r*Ol0rGH$D@*(TqU^2Xs@m4JVMP&bXkK{fQ>eJsWkZ&HjT{+iEDbv?U zJcQ>|rq>-*gy}P@(nRDHpmmkrdbJ|T!#{oSl8npLoGIRtS$`XbupeRZa*v3V>G)wT0-?Yti>oIp zHRGw$@bUdNiOy)wMo%EUQ8z)1cgH$v5Yt&+7WA56ZQG#`PZmh+#%Ul-&Cog8GI69< zoS&c*Ys~qP@wPiUmARH9MHzOn!r1)ABybBCEm9!wdUVVEZM2UL*|Gb~$6?u>q~E-H zT??G!TG4U2#=@nqH_y?yXY?H0NL!(_ihNBnl}p|__hOiLU(3R{Tp>zp-;lO3Nr7F4 zp+qQ#+0Mh}z%>bU3lrzCN-a;wC;bt|!uZ_0V_tbjS5|{{RrZex}JzN>*t?PTllh1Dv zuyKFJwEIIkp+qTxjvB{Id2xwJ)o%E<%lL=LrS2#}2H{3+!U^P_E#K=+M92OLLA?Nc zhv0FO$X`!VGsk-Yuxvp7{a4*vc_wnx{miu&VeZheeD>pvAS9wd9@qPQfk>O^rS`pV zOLHLIA@W}%tcSn7qI?|2ZE@v1d*J!IG3GFhCb$ZwVW|f%vn$WyATDOp?&tu6zZZs6FB|rf14)`4VvvfT6AI>-2IV zh|*1ce=v>a#Z)C?vi@4qhsJ-_A!al}>Gfn%Y^qU?;1&BzhUM9_^XooEY3Jqz-h~?) zvLu(L@OWkGSz;$z%6XdeIcyA<3U*6;r%sc`y*~=uw3Cgz^ajdsp4K@x=ZGV3omzpe z>$31iR-4%V+0{Hd3mx07k)shvK;jza85p1oJ}{%m1$`R?yMTe>2UT*$fuVGvY~ z&z0NoAZYzt6Nx1?0f33(E|8TL&bi_{r8mvlr&#w5|4&<5%KtxY>20=U6H1x2_ufl) z)vPp@{glHt&ZhW-rZ>#*n;umDRQ?ko$9qmB15LF%3PtOalYvmPV~cnX(s-*qx(&sd z>wVJKTo-&xdQSs;ms0FeQ!qkLep3z99EjlL290C*s0EfjWY`%T`~p3H>R91#w&5NK6E?p7L7EGBnNXNZLl| zi97EHqgG7ZR>NZH_wLme2aH{P3-JP_Lc%z*33Opmvw5Nct{mx) zbli&>QDr~aQQg^;kfC0fe&=oWXMVsO{#@WXYX^YmE<0 z*2(kqp2ghTk|QF+?+c~U1Nj{{z*83@tMgI(V?I)+M{-CI@>0VC(X0)1=shxB_kp@1 zM+D{_E^=dmJCE{uqsn96z4z_$cbrFpSw}qu3#>#6 zHzzv!S~7*wsWOJ5ISRSlx=*@D4{Z1iRLmTow+b(x479kazuYPza2HscSk@A;FgZ6Q zZfoInP7sdx9xqtvv6>=y;Mflf**>zHB%MrT-g(?3fEWvrGBfO73{vO*lNp3yr z;ay&oxpvio%6G9%j9pnaFGC>~@r(CGTQnP>Ye5t{>|2uN4;oR;`am^(biq|WSBbrJ zv^y!&=7y8b@Dy%X%I}DJpGX3`*uIHnHS_kOzP%o;O_BqNw-&(Pp|HypTc)8~V?l;; zD`&H5)^bZ3p*09-CRb;NE5m1s--_n2`$8UR1CXB8zWueAyfAmHNdO1v z)_92*=V8c1kA_2L&wl?SxM*=BpLW?j+Ngw_nGMyk&!syZ zo^0F9Uv6KDek~ zZj6UfGbVcNFeTwOBU7qC1yKWmm5Zo|_CM4?=e?1iqCOL)TPsJNh zD|;I@iaQscM|(lX=ChOHEE4OI(^8^+maL?Uk-+@Sjv7+{U%;tV~8tdR&FvzZxnH>hfA$TwE# z32=7VT34i^+v2Xw2?6~51-?HmNetpU|N3{9k3xnJ%mHhbom@gY*{h3;$ zDgEI-r&aty&f*Imjt|*wpE{1rwI8|?-*^5op=GwsV}wM9Mo*%%`$ZIe124;NK+!SI zKF}EbqDTMc+WlRlNXuR(=FfGR8QP5ibqhQZM`LTiL*RO7-55c2xTr}L(ED$_CcO99 zy}c`kXeU>-6gr=k#O8ZJVy=bEeZvJ~@2$OGfYO-+P;l;~%_14!}q>0-g#gMF@4l?FD;6zIY)r1S(8RXg7RiO3=#x`?1zLOX&U}ruH(pXFYckuW9GtgwqX;#c1O~q^3N!AWYF%bH}gJ0kx>&EbI zKxo=}gic~=7e>U{E1SfTKi+fhfo%$m%N*fenW9aAn>EuOgwre^P-=+xzYOF*l|cXe zr1u`j{R9eaJ;T~oWo(`36}#V3v%HH<9#;*z*NX%t@1$U!y>xkXfY+19-?6sJ3#O#A zM)BIl&8`k0d9?jxYrNEoR}4~`T;5<0##LdcStmnG08zL4fk;q9FnTN$_Z>(nA$ED* zCcs(IqTpqk+WWE)e;hfU=X~Vw(9>B9vASB3(}q~XHPABP^wh0qg^a!Ei)Q+V;S8l2IsTmyzb9cYN*hm;vh&`t>jT!26^K~21Ijs@cl~g^ zW7Ey4=GlH5#`n^u%idX=HZ(;NwcuWz==_G)l(Qg*V-^S_*U~&M&A0&oQ47R&;*tcK z7OZFRqL@I(`9~vQV(gBp>B@43iYGoPsj990UT)a+zMgybWAsw_k@}_|AlS?RzPhV+ z7SVznY#6XwGNcL3_-p1|&G`vd{WWP66?cojG|HU}mH>cjVA&mR73<+rvC<)dII7Vz z90Wb*6T_byeUdt9SvxzEz-stpbn@H4^=~9$8$kN;$gGHc`&ax@y-Ny(tUY41C`%)? z4;b3%LTIj1c8~jk>TMEEb+Yn7wpVVz-IA|KCGe5AI<)FO6C!f zE67QJE?cR^T!EpvVcUnak3*8$y>F*~*ni<7`9L`Xe92^mn$yLH>r&vWb!9gk2fwq@ zRjnd#ihm`-Q>UmJrM53Jv&&$7l;Jp$3>ah=mcio2c2ZUfq zx`N4~U)iob5Q~d$rPS-j{0umJe23eBBEJ3&EbtNny8+3=>4;+a5K!sDPwoB0`{6Ll zDV(RZ3wV@P-IS$Y%i22unZ(3jviH0lNB+&D?_kZxmGC1|kwNB_b~J;T!mRUBn5-(g zbl<3THp2`L5U)#joHE-5{4ys%)^~i@4yYw2M~-r70+R=4fT1p7>%st@PN`D? z4KTL^>sBd%-Y6wVy#yyg7Es9390HnqL;XP|gpVlX z@_55g+Ukm>kFhf0jB06v^b)vbf2WF5Zw>XEGduwA)rsWuM}YjWT6a?D7&l#K^?_BH z_itLc4k2M14geC**>IPUZ;Fwx$GY%VnpWa8r+DF3k{+s>hg!BgT143!c=h0FjLJ9hQc&cSazze@aa~1!_?41e7O~Gdu7-o?- zyvEnG(2ufNUxch9r%H}xTK)-n`hV=+-WwsW))B@By_@$F7-JC#7Ij6%C0$ns*X=g* z^O7PXI=k-xHfja#yuh~tSKE~U4XlXr7VieHeZbLvSInxG9zM%a9g+7u#F2nCfeHOI zsa^N;60f`4n&!Z58E0^!@Wq_~x6k)NcLDam(I_*^^$Hf2V=ZBfR!|C?J+r4gCzNc-qJV~JnK_Xh=@mhu(1cZY&_Gl!#yg=nq z%wp6>*^3^U^a(klKzJ@f9iX7XRy)K+pNlF^I!zi896fel&kSHpziZ>&=TV~yD*(aE z`paQ&vvC8+jh;o*DSw^Nit|kSsalb#MzkiD!);vn04?npHRlH}Avii%410JvHmKYH zZ}vrWjupX5+WS`+;>*CeMt+bdhDq=(uNNJx5d*#@?e&=fruC*wWmnPlKi|l|`(QZk z6*Bc(p0@_eV=ahAFYEKX_rXRu0S$v&f53?pnt(aT#9bTmXh5`=sS^T#|a8FLReGB+?`3|6o}D{FGW0$zn%c2(ZfX#-eil4pbeQJ z_OY%tK<*>lWEH)xTRb_58ED`7)$rFlip0HvNaHUSC{iWGBjG=^h&iNOnHxYt-v}BJ zN4GX$2(Q*VwIb8J;V?~Ditx7Iwr$jH_EfxvOXy7@i!3?Ee8=`e;>Zp4tuFLtZ!(>x zTf864!YQepF@V_#lVYUc#|a16`wrkohIeK-XCP5O2uq1^OSY`BJswzQsUq1u1c!LV zg6sy!eV_gP!)F%cm5?*H3T&eDtv_=D)+s8tJO$?HPGF-C?dX7+$u72wlbsnG$-f)_Wej&sC`y`(1S}ZF>{>O&L+7Z|(o?hWh8{ z8-deJrBo{};cq1C9_-rRh+>9D3$G04K{k>325$^)nDbnMSX&%<9GlLwFh5(^Ti3ZA zP?s8WEPsi&HIx(3ow{tkJz=he+X8_ju$me<%sZto%KxQ5$S3TB2j&J3L3(y^Z0ppB zj)1rKTPILvp3fTVkqWw2T@6NfLawM~67^gWyMW z!bo2u7%G-$Ji&A$ZfiJCUiJ{qxwQ=(1=i++eSLKtyYN!32Pd7FLnqFp)gwhMs;hqL zLt#hs1Yg)sHC>NtVlE4HSuK39oTd4+hCYv$fg9KG&2gS^v1BY2G0tiSNLf4F1=~Uu zn@OS(KDX^+`?qU=jfa@L9;t_yD}o>qCep<2-D{Bl;NYJYmy*Z%D*FIP0UO{a%Lhxp z0h?|;Fq5CqdyrgM-LgO%^p|(<$5(nbUQeIvYnrmR<@o4hr$vVmQMsgWP}rR-p|5NN zIHx3a$!F(~^Tqi$iK6qqC`fxG*(rE3qRd5NhO4M;rs_zfvr*iwuepUtl+QE55XRNB zKVuI|%shlE2yFL;APxETjf3LE^>7A0Dag{~dSU&3mLtP^+v%B%Yb z!a0f+59NFAb-vBPAVH0pJ&0jch>se1&I0Mil*lGU%YQ=gMdDN2V+`O85A|GXySKKY z4E?L0`{}WaG=enR_7Xz)WbnlcA52OcN2l{KGZ)MP&A+PB|IvkJoMEdQH#wrtZfYTg zM!w9k9jZT_V<>rn^RH#L6FWHyzmU2Cq_&u2Zl7v)wwUx9kf2#$~Ai$v= zlpU(Br(=;*C8Yw=td2G5tiLDC`Y4g1_4Rc{n}Z%-4|=ptTGa5YWK7FHcc1_C!LMXw z8E;lQsrqH=Hu@ejsy=n*6Ju|xfc&%SKj-?71h2jR6bk;1{(h9kXivM>D(xDYwNw00EPqC;1Y|H+`Nm19UF&P}Kn$&U4kK8u-in?O2nxwtE?7=zw9gM=;;L)Cb=u8oA z0z&c_Y8pm(wF7)xRYgpxpab7gSJkrZ5a~M9mi;*EFkTO;{>pK(IpFxUEx-iiPfW44 zAQZzEl;KvQMpktT{=0FSR%Wyj*#Fk{5G=?mEQIHs7H9`1QeBYo`=yfpRvOl~V1nNe zghP{*nftaw>S>tOH;34}(56l94*wrT=+PDev_`m;VvI&1wP>v~r;qXw7FquH7m? zClZpr4hD|vdI|E)Nk&uG!~5SIAOa4kIQWTYsfq&T|y!i%PqO*Fh>m_n{x8w*8?2ocZMPZ;6X`gl7 zD%OtrHBk+qj|R96owU{DCfI))3KVkpYI_N4K$vw|AV_!4BU|s^Esa;crjOTjS=Ld>H%)j>++L-QuF^}m~UENU4DBbWwFumH-3e>12$NoKoPuX?_0yE zTuQWXn$SmT?t`k%gCWgPhJjA+4}Ch1-}{+n2QD*!c%(5Aey3lw4=uyeWQ$+IstppxX zl`7qP3qYyl@GCZ27`O#?El}ad0;vvB}4gRm_af7&~F_Jf_VMXSHTcBk+BJY!=9tm46AEo1(itR`ZS`QyM zvI7be2{Jdh=yN4+{KXLlzyObfcP2ntxTWK|k^AksDi$z{dLb)i={HwrwGO=lTkK@( ztmC8}fG*`s+T&0oRs<5O&Z=ljjtH!m4#6XOv*K_Gk|Gjc9=YZeF{Zn?>s@s^rjAd+ zQ6;D8s2!eZT+g~!+9t#}XL5~j)54ng@hPx{kZYHU)xp!iRk>kI)0rsDP?m!99kgkQ zxIRZ=7gBL#90rer6@|tt+~@;J)H&;?rpLw&@aIY!1WMGv?&v7^hmB_|;c3Z+va3*e zxLA_~ygSjTmb-GA<8@1)zq#2x zE;^apOVgJ(_kv9=O_}e>n?cog+<~AZqH!G}plQU$8|*g-d<6<{8l78%qt9ra6il;z z8zhTT`^{erI2B+=^sEEnFHe~u6~6Srg}M3+7MW9xs(Tmz9F`Tx4Glj|CQBHhx})Xb zwLd^)c77d@<-@);cQtoLPpxi(#eGhAvrHpAc(hWsuYdIeqwRwOR5*_sJUtG{o z7|T8_LIJxves6*Z*Jy=7=OFmgVeGMi--lj7KYnMp?Lh$)L7uu-HeZeUC3kzoe58e9 z?-{7=7#!HhbAMKu4Rc`FUQ^Zws5wu$AN_0#qDgz&bd7w+}Pnx;D>m4rPm)&SvaSf<;m| z6n(LogB5XkEDn$}Cn)6g!jwXw&zQ?o6!DQwgdrT%%N|v|22whPWShInMv>P2PJAmd z${g!J=~@gsCEZ#ycU22;8)Y^kHPBQG+`B(e<5kmSaREZV!xeRqBkWS#_eC!Vai(j- z-^|$`lH@5iu4#!lv#yjJh&Q4ra<44&s@y4!XJ(izJd$FI8KZq_`TB|3C(bo`indY2 z=T%hjlO`=aur;mY5iNF@0<}_2*=?SHz@7_ixXK2$Fc4P_x0$rk{0;y?Kk%s114|B3 zJeY4l9#hQ(1*k9ZlBib-&@x-vKRW_NbV?up!Se^0Cn#pmrek^%?4Zf>?~-L3#RPjD zss_q9g|0Ur^B{zOqWt~u{yIWO82&1wNZMYNuiQ35r`%Tcr#%7Mp*Lsy`j@jM52!?!tZ zFliqWi6)R4h~5nW|1-*((KU2Gf?{-l8WQF8q6#2*F~Qyq`zmK7yB2=kaWN@DkBtFk zG5-DNyCreL8ZgW71$9T&=E%8>PNIS?Koe9JT53g}e-e8qyaCQ4bXtmM)R*)7{@mZR z3>w=pwpz!VPOIsy!P)#Y%;{m(b`WmjK-J<7>;sbx3a~OM5qQlmx7tZh0e&K>$@cv1TX+ zIyPYU)xv>zgJdtxqTuHvZhXTp5=DZkB=;p+uxuXw`@c+mT1N5>2zzRZGrtth$lxrs za^3%lp?Q>f@5j^=#7C+)v`b}L`otoX$&6x(4-$&LZ0k?P?Q7K<|GDNd`AKoTAs z<#pahF4d8C5mM?9%*yyy;Za7+r!sNFs8Q;)rG1NzNwh>GZRiT^69LBUmd6YvHWfXa zA7*|BeWpd%JsDmlq>9p@AH68Ghb=S#wKM(LGLlG;nuL0wqqN@VMStY$t2g(<+fz2&Q(|0;!s(_p}s4GhTQrY)0!Uzg2BJ2!$p^K?hQuvNiCx zmaBs>+^pvrUrLWwn0iXM{#*zb&>sw-BFC@NgZL_S;bxtd%#TO*x;0+}E}2upR-5y0 z5uJ*TpKscgZFkx+&r!r5VvgU`&N?Q)WO-E|d`Py!dg4g@-mZtL8a-&b7z|`YI(v4K#lI?%Eg5c_Un><1o ze&o}iithJ(lH;SP^VfcJxh<+^GM)a(14ChT}%e~5eC_<=`JHc19sd^ULL5ypS7?OowWMPmjdCV8W+p53u z`E!gV!Peus=hIPTl3-`25p&q(ol%_23e>Tz9_84iCIk92>sjpK8gbbJeJhI}flAn0 zZ)=<&{E9K?>KghElgtRye2W&`kf&li_~PorBHf6P-WM_VWFZMz?dx$ocVYYLFAd5A zNfPYlYvxva zDC4ZWt#$#fqHn;|NVBZVwLI$VO~;`fm~9MNwrM~=8&UA63+k0~E)1ytJ`d}oJ5#?9 z>CR#D{Y{8ysA-UF64-!TD6z><)U*KWwM(u`a<;~a6C<*4>My<2p7wPT{!g1d_}YH| z8@)12%GZO@Xg`w(jeBNREgU^9P!NOZa3d{f0uVE9624S3T}^eWtYK`4<0@Gs_TWdW zx3FkjSC@Je54er*ZCgk(c1_qFfmz}p&o*jP31ujPUXUN+H1I7bm3odVNlP{P0rprL zx5nWO2v#4nF3&~jrL8#;RrIIAv&}5>36+>h_!SO2s5*z=>u|BP`H00`5Z-&}ibV?b zv~mUFGm{`kQT096p70@@#LKbTrd-XvtTJ;^5I-K4wiF00L!>w1t4TeUKz_@!eBVgt zMC)};oEY+_)>wN&#m#aRLwBneQrfr=Q%ocTEDB8_0-5ar3c+oL0_71Z#BmBKnWk(( zx&ta=k)JrJR_;+@#r4vp*dPqpW5ucM>(BQIOw{M6%_f4REi;vZYSrpf0d!s0ueHrRUwL>8#w<%uK6G_O( z8upF2o8d$j59w&Q{d;|0iMon%?UA9aPxQY({Qu`(DaOR~%Q2-gl5=N~F=S9HuQn@= zX+I3;`A98pXi$N(h0QoyFvf6dG0vlPLWYt|>NxSbHbDS@nkW5IHDjSLR7%vb0NI1Y zSh-Yw6F~!w&qKqw2($uAl`zH>?LvXCX}lq*xs*7+(yy0k94K7CM#bR6k{N=4$skcv zZFDF+w~MhdO$${BzLeq%JWF8;TttQP!f=8wmW4c3F$UAA!Ktrqmi0?y z5D7y@VLaDxZ<~l}_A-tgC9%7!z;sxa+Y%3*ie2h{3j*AkH2VAbSC<#f9|sSQ_J8ZSb7K51_)nz<4jsdNZB z7NTH`Sqz3Cpt|TsBAK9d){Xmx%%?gp26;1a!iQaj{aJPXjLfVU(8@Djms*ab<;fZ4 zaS(N`c;t8TGS0*J=Xe+(^J>0#*y|5tKq02pyneQ+x$6a*jV*SsMV`7^lTEdnM&sv? zgEfodKtsMTG)rOH3g7d`_@X*^M|RZPDp>q>@}Cd%=2{sR8ch*Pk2i&M%zqRUe-@Ke zL;GSbi$LR9=}00iEgDjd1J{SeS!Y(SQwudWYc+=P(`~iCIQeZJCSg8JVSDC}`@lef z_35gvUQ)lV9NGgmLY?MXBV|Uzea}%9H8gef%=RGI;-<`tYQmPwjpH0j3lbEt{PW8df4paw4^}K*yqRs9 zG)~@FM4T!qK!`v@JkKvYlZZ+S_={8YzJwkHW!YH8QNW~u0#%&GYZ)rh1h&_)Q8)&li64N>8>th9oZV{AX0Ny+2BA%r;UPS-@XzSpWLN zu93X;%fI0AOIF8`;M(`l`TU5DdP(xH-|?RtAn={PgdZCJOr+GTMfdgo@k0R>_w~o9 z%Prj}WPiPN{_F1%$i||5gw*{V2>9*rpbH_W`4{>xTHPzWjVovj*Svxe>~E=0fIO8q;L_H$iO71U4h7 z3BY4(17Iova0K#}MCu&@jUPC=$+;%_D^0#I2LxGF3GPz-v<9o!QQHE;WybxHrK_Wz%|Cm|j)fik!|(|{ILhVYd) ze(SrzvrzFzK;P791915;+D$Nx6~4YbYbIBmI6ys)tA$cs0}qZT@IdLhyK)m$fN)eB>a5=jKI;gtO2mT-%S}Ya{l4$1BeesSJ$Vt&7{TyDH;tw!CEXdUG1XC z3!c2I13qY@^WdfFHrR{0gVC?p#V#-lLIZ63x=uvqycE0Oh8tk_f(E)#wGEh+&}n%D zofq%if3q@cn3!nGUo2+%G>>1l8PL$t_YNvbl>n13ec%;Cjs+j3syYwYr?F?1E#W;b ztRI%+XA-zv&;CFKcWMj(mCNUj8`rp9ZohBiIUS>06DX*4IvE8^xy9r1tW9*qO#T}`VoSskHMb=KDh0Sy@o?l z?h>%yAksN0Q1b&QB^C7cq!a@Vpz@sm_Gtr?Wn$p(y0BklBG{M3TnclWI}%aE)jm*t zbV~ep@7z`7hmb4Pp01Qk{ptjg7<;PkH8JfH5_Z!3^(yxVrodP@ z`j~sBj*->wJqIpq0DS83VZonj5>UYjP6DQN+;(zrF~B&VtglSHicoOB<-tOq?rnvj zKRH18768`Fm|mU$K<>JW%oijm27Pc)iUp3%VF+LJ$iE}Jh>UQ5vF|gryo2F&?(_b{ zn*rZNoiPdFWdOsNHyDUWB#yRW2n$>THVR{UeLVok+rWG~a~@6l2e?1$KT0e(0w-&K zLUv={05VrvEkKUa2Uc+Ovj7=s*$0w4ZB{Bq{6JO@VEm+#_JgD&{lL;w2q=K#&7x~z z9=rCdBS&~mabRBX3DF1#F7;agxzmbXz$#1{&cT!_^%Xv7$LU);U;Xp|T>;89WtzR8 zy5~+~0n7k5WjxEGv;YO`_yP=<(V8zuOF8CgbI`81pdA|*jemE4JwiYbV%`2voV4({>l;9mGXkA-MlMM{AizW z)?kFy-f##zs4*_dL~1lQVUp%zJOPQ8{b;VOJW*2KNksoxR=v1k zvw$evQlXp#da;^(;@%Mf?js_>`D5S;rhs?^=2}_jT~d-YMS`2(vOh}e9NK~!CI9ef zh1sjVe0&(sXfyrpdQISt?`c?qEopji|OWLX4E?Hk)(js8dAnMH=*@ZL`yJN(QDL?FYpO#r<2Xm4~U+R8Y;A zH$=yKVm{%H`K)edpb{ASLQ3p$i0b3QVLk(XrNCmdFa^Dr;IX@`1He^5R``x|CjF{9 zah9)p2ZN5{?SxddByvII8!rXZF|1$+C8M;WBN^DMP79VAz+h&Rt8KplPWjQpRZ8nwp2g97V0`YDfcm`CifCJne8#xf8)hr%okw>(w)_)vyFirw#W z34@=&aGM4`8`Iut6X7cj!F0@Ae3vNz#*SXHbow19*@*G>bF;n&lkXkXQd(0u%jcxc zv5r;-ew;hB*k^>clF zQ{PznU;$5+dhfII)Rkx^4a3$a*bHL0t11nEtvP}~kkXRGPHVUb?FMsP-P**k`D~sr zyj2SaX`RV9y#7FpqDaGeMtPK#*A74A(E`q0|OsT&}B1gKDY7PKcuV``dZ ztp_g|n=8b;Qg0#!@p!JC5R$YVv2xXRY>d8F-7)Ir&6|yMO$weWUbdH`HmA_mCk)>V zp7=3Mzy}buHXTDRYu3$slj%&xK_K(Wo!k6Xn%JzZW$OtT4XdRnwAiH?sr+yTwu2j! zDYUN4-?!Oj$+%RHe~bel40iyOQm=Gsz|z{Gs7|L5gs9_s>Yld}eEdGdPzqIYX}iRu zV4Q|6lHu%K+%5+($^HnaQ+Px49LZe`T=X}PQ0v~BrWEU-YMNe+%Ka)Hg(sioi>kP| zOWaY46!K(~@qtu(b3$@2sFo-W`e_mzJDjptttiazn#nJ^C60qT=v*Es+pzIUC=x4& z*G`nq|J{MS21|mccTWY6fpgU$k+3Wp?S2=12v_mL}7- zOf&(w1T=NQe$N#{jP{64BYgQ&cK7h9~^<=jRq$H2r%3T+Hp|c3x|lq z>Slnb;(=xekv5oRf4KQDk8gpdRz$zE{q`DO9FOn$un~yl2U)ywf8e}UB#xVdxeI9f z_H^9t!~;oi{rd=M2epZsNC;y^V46lg#vzgzjcT6yxQMS9UAOh=_GE!O*UBki_-Bum zoVO9-YQR|$(j?AafTcjk?9R+c4rk2VsMeJWvQCdu6m~QE<}#Z2inyyeub@h;gK~P* zp0&K6igEfj>s_jlhie>nn;hlgUqPDxY%ZPa%O>6^r zma?hY;3nwln)n5p;N}3vX(Bz7Vg`lqET(Eqio6Su*nCt^cf{#>d-IvJcOm^|+r%*K z^sURO&Hrwr|6x-1$G3zMAoMZQ^mZGl$3_}dQ=3TlmJ&<%92m?DJN#$R{?FZ+caL|A zU7x{oIw{HWxa$ZdyRz@>R5TJ?snUPUl+RK}Xx`R; z1pypALwMkGH(8-lW2v%|qb}Q^WJh*AkVf@iybe7m=9eW(DldhRS1H{+s?=A2GRc>jy$eaXLN|5wUg8Z}}2d%I^ciG1sE zQA?+s0{Z{WyCHj{7b!;YL^)3eMIM#}Z$%0HL-f_827KlxE0_O^#SJA!sPy-5?awpm zEsrvI&TCmle8!Ez z%9-EjJYc1}%VqYE^n#nBZ|9uB4>*Ko+(vk-3}>RrlI`ju7gg4>(PKa~-`6N6fQ6+P!wwquc@d(`@CJ5wRhu7aj`oXETgD*+drQPrB1 z4S>KAAbfiep%2#V1L@aITaY)0QtCFl)e5?>@r8EwW?8PuoV;^>ik;!MP(t?B>G@m7 zFiT(`j%@9|MBEn4Q1T51a~ZJzC_I~&?#b8Q3{0aksv5z3m@aQj=lf_M=p5S)_tl`(33^&Z<`2zmn~~LH&aGB zrOX_Mu5!X#?M=Rd!Ru9R_TjaA*{QV$B@*I8@gE-83iocB9*p_l^(+VY8IO5YHrxR^ zKY2W3Xsy5*|FGp1<&9kJ%O)_xVSo<;?Rgs)(5xR{C#};6Uq}M-KT1{UMMZpLQIF>Q zeC>|(3FQKqCva{9FMMqY&cWsC=@^zp4RqRfS70*Ocx#L~nx!>**~p-u4GxT&0u~g*qqn z9%+JZj$Kzlw=69C=)s&ZOCLdN6rie-V$5MwLQG}?7x8P8Ggb!x%3BRq;M+X(JJwy zWVK!lXjqg)}hCq+kAqtp-%K#%}r$a zJ(tz~M7A$ck?-Pt4+B$;;Pl>?qNl5kmbwMC?_5y?|8ZHYdC41p9U15bkw%>lmXx!& zaF}MD9VHzKOdXMjnu{y#aUN{#{Tanfb9sykdk(8GD(p|jkRw#R*H94yaVvoPr+*mj z@@3InSJ?n$QX4R*q4{W#R*58ZRu7BSfeYjOfs43gI-GIV(y|9cJTGT8{3M?8HKSg` zXEI2tZbY{7GwSavnB=yNJ(b3l<#?&!ED<8%YhC-FoOFAJyZ#94-{)_vF4&7opodZ` zZb4Ko1CW1u0mLb!CCuClfPu!GDgp!!Xub*x5{a9K;}Le%l$zyQVEVrRxMf37xXKIz z+y~Z#an?3~GPHj7j1fPH_T4kpyQ9>JtoYH*nWL+93E}tt5*rA@+`wn-96V5(O|{9) zUKf2UP93@eue(k~0bp8t`!-pi9jZZ+zXh-sg%+>ys^o4CtT?@C_#q;NUyJ=of}TYW%^KT9a;JH zvX;CqK1jvti)B;SYa~)!h3l;4l?y=bR7>a8vbRLBgJ*9Pd>flM;40I?UP$M{S#Vi%S6h8P44&od7%5HYyspHLor}{+`$T?tBuq0L__0yV>HNlMxyDW;Up4ZF||11&Oge3UFD=;iE*E$5h0Bem!XyN3bQ zFKYR7|P9<@mPi_R}fbA`4sXS(`>FA=*ab>gPctsX&MLFQCMR)gW0OH z{K1OV|4~oB62^R*#7?r>jbGC7tBjT!$%sMi`Q+EHrdQE&<^8n;eiowd;4B_`NY=ab z-0V_Y=#HiJ@EV*|joA@(x#VZTp1oV@v11p% zp?Cnu4b@+c^!cvaZQIW(q`p5JXdrh9yWyG*sgPrBBej4W=EGAnIE!RH(^<2bGDBM4 z-M)FAv1|7=+JNc7xrnMD0bAKi$QSKTNC%DUV$4c&kgO(5qj%3WY4O1MW&V7+{@Zud zevVt9c-~5~9{O@Wy#Y(-kxB0N6ms?MS7n%p*$r*P^OBF;{7`?Nq?shXWp1-?2HOPz z+c^W|bC$dOjKM;dE!b9s$E}%rl|14`zirCn!Y*Z8yE_5WtW&ZNIsr;fD$mv7iFt49XFn)zY+$E>hPYgE1g|4}d@tE(l$sBvW!W%i!e65-n zUn+UtrA3lMW)|_yb#LO>f)oO=LusE(CRKdo_Hs~Dbi~U#r-u;h-OTA>^em_O#|J(2 z@B}pbCyMWJ;eN6wlTFFA(Bs6t&+e4`db+Y9)^I?r|3pX)|KiaX+7T3uL9M`8JzL;_ zU?#vjXMgfg;Hyo1P?<=KgP)8AfgZ;0aNT7C&xl-rV& zW>&$scX;N&{D$;Zsx0Z<4-C(;ey`o+vj_z1G($(N0(X6{fGIUznQ&woUPEDnjDedY!x>$pSy! z{@6Pb=Ff%HBoY<^ZVB>Q-bz|!11e0%7MO_+;mL*B0c zx3+J(X2TE@%oX8L$M%EK6N%2xPR<$W4|_x+(EG!Lr(`cl0EeKHxJo64wNq~92>py? zufB$I+&EhGL%)##m$vea$#RMSYuYokt?3Xu`6F>RDMI*aX4J7#w_)5eHO4?s`M5H+ zMfPb!Tw)|H-D0dke#ZR&N7-9OMcKE1zbXnSbs;S+EhXLEB{9Iz9TG!I3@L(i58cuo zLpRb40!la1GBk+55bl%fe)hBX{a<^nXYIwSc{gh~&tDwJ=leMf|IVW-{A4y`96)Ol zU>wqD~*D$ckL${-iDC7P4L8}h3a=hP5yCN|6WR?37Z z1`e)nc!37{5pZ}D>{t_+uomQxjT!y;zyEr8q|j509BaL2e+OBl+p4jrnA+RdEhmB^ ztCJEf%BH@2v*@MfE~1C+dBps4{Z-+xMqAJFSasWQMX3^9`a-OlPoEoIez5eOtP=M;EG*fh2v(db$ z5j%929h*p^+xhk@#Lt)r8bTdE62@P&QMr$42$G29D;amRIP!ld>J$}GpOc%ew*zHG zCA76-No#I&i{98;RZ$wco$*J6e_cDueBaUqV%uciay<`n!%TmD^q?&5bDruC9!PZ` zqSh`+3XzDyV1S7gybT=(L|D89h#j`vHo_vrmsMFtXkfd5-N9h0UWp_L z$ILufol%_D>c_^;i*65PrSmCm;s}u(KkmP$jS*hATgc~87&(^9Rcr$=95|{)dpSKZ zl-tskCa?~kcKP!ZIOv!%!M~YivYz2`Em%jQF&e3Lxmzdjrlox>DOUw`=d%sqU2(IF zU4CW@*sQB&+d)ba4t)pmC%U!&^lp@!>~}%CU22MT{B3$+Zd(3p=yTdjy@d>}!>!%r z+NFaN?!X(#k=5yt=*2h|zI4078l`^KB^s!oBr**E%>whUDZ5}ZYsA$@z>e+}Rp2u= zLjZBf{dK0A^W{gWLb>;%do^crUvk^P;>(TbC1RCe2V;G?Vj9NTs@zcQ#Vtr|v*3NP zuTY?Ja%Mwo@qAMgde?|)V?aHytqZN*Xb%102VG8ul1>a7BJGuxkWO@r!|bsX$7~t- z%j6slGa3TQN}F*mb)ri*#c<#)533l+ZCeZx1F$E~InVxpeH5MLR}s;zq(rV3n*nLrlZ;n4v?F1{?EIXwF%7*_b)p3+ZAa%v$^x=TN(^g zySm6vvZ9ERhO-% z`}r$becL#5K%$8~Ns9~LX!m1!5fl5iNM;PjaB3vdai#h*51lo)LbG$(>EZ=z6Rm|W zaUC0$#Y*YY>qzNROV%I7iVO1cN!X3!jx{r!i9!1DL|+8KHgPXA~UOo=zdC=p<|ug-Zy@(7P3>vr{ejJIQeOq-1ts43LmUT!EX~IgmE}o z6NA4=JoMv>qSYB$l)chFXql)CeZ$$^9uBEQ7|&GbvHs$3g6A7H@0nLHDl)28m?#|T zCn;Jl=V!e+XAgGvpO`h2Z)s-GH?KB4(^{RUnm9?0NQ-3#iZZYL8J#qpo{D&dq&iwN zz*vzSFu9n3t=9CBcI`8eEJp_` z-|GltCvSb#cTwSycJx{QbE>ZbA>eaYb zto-`(|MVlJCS(eXw5Ug{eAOJYYfztkZ7UCR7Jp_q7!LF7A`tZD_oa9Xx}4P{ORhZ4 zHAx+Guqe(h@9=%6^ynG)RCY$zf+W{;!I?R~KxAW666{i2RPExaZDEt0VffN^E5W+9 zX?ct&fgxyVGJSGc-J!BBv`VX zX}Wf>pK|ZGEQk#r0-#PMDAfq{cp@Q|V3iC2m*2suCQiG6$hDp62-3f)Cc3$e`Z=eE zITB&IT!XjE!`Q#~53 zx3+(ZM}hWZI*^#55W#=P8qR)PL3pW2it#-#;>KL(@62v-omA|lAXO8ndJ?!iRo85E z;aI*KFCW)jLJ5&fc(*jK`}5u?Q=n|C6{yvTO{e7{P=TQ~R4WOTVYR7)953L17K7!{9*e0YhFgn+nw^rngIDN3 z0A$Q(@3VWLlMPjHNfKwKvyyWhat4qO=DUT$H!p_L1iKvoCiywsUSonIDfzSTV->%Z zmoQ-<$qxt-ZHc&{>IT@7Yv(zaNxK~5+d@8EmV?;Yissx!sP>ayEV^943QR02Y-V|O z0!Vz_A6oB-{xm@|H*Y{t#JskEgGO~?mS2T3wz7sp_tT!*{v7s-BuZ5M1e0&>htixj zOYVIWkV}}wv&gpuCaYD(M4q#g05kG>tf&JXd`oKWZ$NNioxTFes)8(EY$rC+ZuNLW$WXDB|F#~_qKDR~kuDWLDI@Osz@B&cp79WuBzw1I0SS3C1Ph`lz*PzoJ2B0FNHOJHB{Y|{CC*W0OML8LBZwA8?!wbl-d z^0U7gT(DCmo+2LLofLk{a6C+}EK!HzgmKGhUcYV|8G&pyZh983hZmLsH$f_%pJx;W z_|oN^GdR`Rbxpn&>v;6KNtFJdE@lnY*GjxWcp*0H#M<(0tk?9qZ*1d85pR9re73%cCCOzbrw+SpVCp zyfBN=(wX_8&p|h2Nh+=Fepv66>U_E8hT^!a35{y8VIdUSNImqL7ZvLvv9M?|5vG2T zt8b?G*OgDRM@H>V%p*ynvq6eD%-FpnQ=&SHNuPmysTOlI{J#5u*)q1ni z$INSN6%usn??9W0^k?R8D=e__*9qU=-Efye<4c)@MNW&?6sm_qZ|pFiVIdw1IVdJO z=yiS(g?}YUdH&A}t+Q{w3tdGYQrQ`1q~n}}$kAkO;jb1IoA{@{o;tN367vJ)#53Qt zcE`PP0!Qqh4}1_Vs|uq?558Yo;m=hUIb!dym$6C>fU-)VpdmsyDzFf|kk35qY5Tb1 zi52d(xz<1M5e-Je5uT3e1jjE0FIa_!l(wI4%c`m!&2;4drdu;|57DA{#zT;*XJ-u5 zkc_KnY~x?7n!T~*FMm?Wp~mPOPrbmelx^)WK1mMi*9+rH50OK!SY#pRG6uqFj~4`g zi&cf6;QLV!9&e7b7D8h6FssrCX5Hj-;>oQ?S?6X5=lU&o#<5}va*qrCqqT{66MN!7phJW>6 z$4%Tpf4!EGgvVvScHH*mOm-tHM@jf`%~fUplCIhvYibWnPhTE41~B3fIQ$(_{x>`@*#VJ-SgDECc41otyegU;W87-vph0lid&QmK zh7!2y=P2|;po(Pw2vSJrkfw^~Gja$r= z93{1H#)?#LjZG2_0QG*jo1I$%Yg7mNUGdoGj{#)FJI*BLX-tWf=sWcz6LdLmh_x5qg|i7oIg27{hH}S-Z91?a;QEo;a)Cm+OdAs_81vFu}6wDo}|jEB0t1J+Yz8mHHcM zV^IBF>BL>I-~STHr-36x<^Ks7@Yqmq{e{Hd1%=^}WwxQR-k>b%!WakMSR5ptN>O zydYD7#bW&Vl=;RRl&6~A-*Zz3%#ojYvRy4JgM8na_)?N)ugv#Vs)C z!e3%>e7hKcJ67jbX@vg&{N?O%*KTN?lZ>+S7wHAmeYJSj$|2yNNBStq$)ie-s_vyJ zZb%JIfKruZuF zdE%xwsg9fsFdRx-mkW_QlZ{|6vR`{%5ACpNA2`IX@@()${2|nGgH5K1lF=!BezN{_ z15&AnKZdjz{{sj-*e|dLe_U}CN}=?E2lo0L2##IFeOiawf)AU^&%Uc<-Mv`SCcYsG z1c|l^|D!_Dgkv>u4Y1a0glcDZ-Wxf+d~;1M#BYeH^)@w_{$#qHy<5RP($iEYv^P{Q zbfF&WQ1yh4UlhrcgSWD)p6@y9Sc?xC9<{?69!4AF8LG}+t2HiMO|%M}iW75drsg`W z@}0h;&^vQEV)W;2+K~VnFCIhqQMo=L{8gyVZ=G`v1kOT6zG|r_olTSlBR3BqXnR!; z({B4YB}z%H114X7_)8%(8=+ABm+gh{NrIOg^MyJNWMMlof>51Wgtc{a$ z*6FCP6*IR`NTz?6>0##Go^zS%wyOPKDl;)b5veOMK^Woac|x?iU8=lrw-l;VqvmW8 z>li*PSp`a$FpvE@@?R~$9{gX#LE9<+tPE8OP1azWOY$b@sl+O>EI@jX0xjrzKE@rY z1FXt!#Mm#WF@{v^LAau)8g)zSZ&NAH9oi!y9*b zLl4?{*_{<=rZ;A|T<)8tHX)UOjqP3`pJJMipVHVInJtS1}M-tk(zNJ z@~A5Falj%=B-?%{*DfvEHo#hCBbHKr5JsZzdq&rT%aBEe+`?2vf11YR;`To%8XqY$ z#fJFLdP>B7`7ufL475N*<(Vel|3Ais64UHBuTAlqhnXWdKlOvk2yXc8*Z=Wf{eJ-8 z|0Z?*^9lGG?^`e}n90zEKw7vd6iG};uy_BX$MJtchkic`TDK4+49bnyQz1TcR~hM& z+)wy#eB=M{=@BM2_U#;pRzqT+Xq3++JA*O*f2U6V51;a!F|iRTRgP=r-A_EW2!WrH zyp1a1Kc|hJ5CyY`n#x16#2c8X-uKYbdp=Ra^Z$`3>amjgcsdIdI;##$0DBDH{w~)n#6M)7RF#@_LFn;RsE78c0j&qT366@&!Izo~VCZ?}k4MZK* z!z6Caz1Oi!=U>#}`Tay&--4+-ZO@6th&}m0^)JK@G}FBg2&l~?9~g4U>O3Hj!RmKW zVfwE?LmUqmHx%$o{_4D2Prrnea)=%mzdLlA+XQ!P5Sarbw2_L5g2<~R~*Z}a?;L2UA}0?40m6|>6g8t|Al**)(f#fD1n2pEu|Q|pcvKg8R8tYlX+*fl zVS4g5W7p8e-2)smnEjix<>!+_9yWmYv3$InRxFh{ez~7ASkLA;>d<_@YYjz@O8ArO zF8D`=Q9i1f;utozGB`c`cT;K8SRzh-b?J|SJRKwoCL}=|cvc_av;>U>P7sC^^CX8EKG$Y3Np;Yr-Ocmw?~#O^c>3?F#NuIF;(cr3>Xivl4!O|9yu8O z;|=&#Yc2rmPo7uDCgnQdrecGpV|y$=_?-b$aZBQE8~I}Gk7`@wB;}q6y2@|-ob#;R z5P%n=*GRF*5ch9u195)IbIc!^Uwe;;>ck)k_?d`|iqTz~ET$I3cYT;XX7WeJW+I33 z2*}WWv@ol*;~m}b-nf5Aa*%93;Nt5HoKU4!7iYE;2tf1%#{uNPSdeKmuYq-)p}2hC z-;OsEp)-m%6U1G6i+Jgz?5i2xIhDtN-zf)vl*{LkGJEIjyR&f9FfE+lwzq(*OS9t)L z*Y8Z`xaGu3xY44Wor>TyJoLxPHV>t8_$Fk?p zy+b<>td}QkD8yg6OUwa_5qY&}MY zbnl9N$*B?f(~(R1t{T5>R&$^)KkE&(8PFw%i*_ITA7f#oqK{fOaoaB((1QT?rEKyr znX~0l^eqkbgKx=MVvzxb{V5kkD4D>|_?NSS|= z{qaEXwdz@Z!IeM}u({diL#w)_#7%+lnVqNI8i>~bqLLZ#Q+6PGz(Q5L7C{gd`4ClE z29)pX55(>ZL|0pkjXs6?@){ryuwTnrfedCWP6t_zfwETLCl3h5oVMkHx1kNES*g|* z4Rz#7w~n060P={QL}V66G&BL&wOoKSc?^9U{%5iY6jT*8j1`> z$8td+Oy(l;dskmTf*ZBIZr+(1TKwTJ0D&2WyOsKN{hm~bTDv>)+CB&TYZ}9m_Bf*# zKs-*ybqUg(eAMb!=uKBy8OqWRuZ%xrM2G@{y+D>t5(dyIu#6DGtu1INX|~a*p0iRW zN$Wc9iS*e3&o^h^#x4*}V&?$1HfdqYNa}kltU+7}HK-r}oWH0`1Q|VNQm*69`tU26 zn!=h}_59JGs}akpb-wiZX!AOg!9Di@P=pqZ!Rz`O>Kq8Pln94E4R9vger?{#jC`Vc zopi{n>~${i3Veoj)bC$3%=mOdlukwCmQr@lAbh}r79r(v1FYk^C*$6m+dw?DWCE@w zcmA3x=G|1lz7>XFVchs&-j^pk7G}9Q{Fd-S|lSfCSd9pqmFmLApHrX9VY|8xX+W#u)&-=tE5aLM03m_k#t!|XrX)i+f*M%n%L7T86wE~ly6 z1;Y*0C+VTSXk)IP5gQP(ev)%dHA|h3OJh6Bl#un&G1|N;zZ^aXMC&j(hop_fMVY$Yt;IHYcHu-_?DPws zf2r!yM&by4R#Y0N`{tWSrEQ6TA^-C3AYTsW&ffxVXR2%HWJNX4j*>u#xNTbSP`X4f z;!{3%R;PL+`<2oR0l=Kx^-vuBrhTunP6>^#@>03KzVBCG3R89CB;YG*-;O&A&H~@i z?W}%a=xV7^@5G?=nAXgYFK2scTOP1uIO+V_v{1@GhYC=ZT?PKB&$Sc!$W)s^RA#+u zml`p*XpO)+jM(;Ib7^iU2k$q-yZ~Q@KD9&`>mAggzI1I*V95WkHn0QZR-Tbd>~3Xy zP9P<^I1htkp8YybCqJaL&hQbWGA%|}7((N&V~*V~WO2PxcmKv%TNt_D?Gjec1~zdA z8G(o3Ea@NPw5j?2SEbZ&KeI2BZIF2=^GdyO0kRD0AQ0CXYIIFi@~tvGx;t)3c?${n zt+wgPek%C@oQ|HbtnRV?z$@?zrgoQ}{%XOHzwUmn+=>#?As#V}6j%n`?ekxKWa2gy za84o*GrXO?^SDc(I2KB;y#j$Z^2VxA33988O~X%*jGT7B#C{cQ!yART64Mh6)_(58 zi;WLJ9FkK2cLLyE_>GgaGN{r9?WQ>SxZF@1&`L-c}Y+=y28w(uOObr%dRM<>jnSZqjNd)(;pu&ICCMFk|K-Q57yRq=<{{Dr(>uY1R*mrq8ttX z@{jn&dZ8LZ)J{`jUiyMYBDe~~Ro#Bp)<>erCgcKxm=;wf7d#%k?qm%k78k}l44)mG zC~)!0gjOlyfF<9}8h@eKPsU6Y8g;?ddaoEMFbZCB<#!j>C?AIlE}4K@yq3TQo)JM7 z&#tQ)fd05!)H~J`V{DuvzvU*01z|OwVXG967vAPT=;JBK>uEgVX<&RBiNmYn{-i24 ztc7=q7zvo=MH52>PwH)N2MC5$!#8pxem|VdUo{iG0g`uPr}BblPiYmI#Y(@m7-XqF zkyh1?U~DscWU0)A-i4X($Wnr4D$I5o!tDBX9qq^SlGjq#N)*I_Q^_OpzkvH1J1{8K zU8g7Sfa~uAOoyefUmfr;e&N$Dxa%yrNaS9tW3;PpG0*RM)O1$xJw4kI3Ba_WVmn4W z6NG;ZV==m)((S4vtuPSe-ZakfYV?Mp9$qe50lr z!u3zRv&uk>gi9W_q@RlL%OtvGWKyE;HEnweE;zHc#4nGx)>M=>H}Uy~;)uh$)x9j~ ztuU$A@UQe9qAb+shMnrCp)W}jXJibBhsoE5Hu9#>xHO0JF}faGV|WSQnyDE-QD>f5 z=hDsRF%R=Au!4=Gut?O>rE#_KnGd`aO9e-;tSB!;LR=>!NYt#>R-{N^g+(Bf!= z7Q!P&*tE)4_8@+~rJVock;n`<_9pd$?LRiBCDm7-uQ*P^4;Ib1!+a%>yM)dynl+jx z@4@8(?hut1VB%Ft)c{cL+w`Xk{hXA%i(DsPaPutDdc5AmUqcvoo8gk zF~EQ-hz&?%-_miavKb2N{^f0C$4>hBIOkek_4njELvNVvq6}f34ip`HRZK^xyM(~H z((|qkC9xI{P|sHOA2$oTRMq-nlaXsgsX!LmLm~I3W8ulmjlAWPSZ5h=&6lIlg3pf7 zBD+FwTZ_jVnfV8WoxzSYs<{}It|j-IIk{>{3F00YqGxIq{?CMe|Kq_3`!FrzrvSn{ z!J%0cTpq!IB$&h6&pN-bTECUfl%(p3a50l3msKEEEyeg^zp}!M+1QYolvs9;ZVrO( z7j;W53qj=*o}7yP%B3OqqaFp7$MQ%RT~m3$K9&LXYV|E|g|5=MFKq#4FT5Coe=Z>3 z!tfmCGy|tOWc^QwQB_QgY8hAhb84hvX6DMvV=bT~npm384jOogokvR!j z)20j)xzk=`A*T9{_i;m5aHgrD46WjJa02lB@Mi|Zk5t59Y%^n3aaM5-&rdDBQK8cz zUP81F=ydKNBPfnICN9oj{=or|9Tp>ZOZ_f$WkxsuX$of@vNG|h0MJ}5X%v69tNb#U zkF3U_K7w^S2Y{xBwwIN1ou6->aA>T}AC*Yw|1J;to$zyqmIu_AQ$H7N+r%wX( zOVtbq(}Ip6hZ*cY$7A|{$FE#1)mWNWY^Q@1Pk)hr)d9E|PF&Q0E-)>*N`Y1L6${h} zgz+j@4NM+537E%}+&77%>XnpW<=xMh;$g+DnMV5G zMjXm3^O+eA0mrng_0U%1p@n;`N+WwHWXk&lI5#)OvVNn!Qy9(xS+fJ*_&P4B;}u?+ zgFOeg0G|En?1(Sp-fSh^m7zPD}Rzx^c`#UoVfH$ z?<>pPD4BIlidBl}E3`L80zs&>Jg$EV&t;f?1U!;1dHP6|#qQCU_+Upk>qT7}bI8Wb z0&gTg=Gfz`&6pEiD4$xdA#EgBiXisg3qtiji{(veoWiL;HM55!?xt7jeW)xx<(1K{ zi^*>4k|+=y*O`L8FPJ?N*zfPBR5&vu$YU)0gQJ-t4M|G;K%-Bjak;M$*1I(&T)q|d zPTi43sjnw5eDIkUv##=)BLQ~Z%dbg^gwl+KrG9FA!IKo*yjBFrel@yBUmi)*$_Way zXiF!NGd9vNUefBWa((Z`5ntyr(NxY-t*t{)FGHJh)#iC<1Bz5dmpK2V!Xg-<5V~Vs zp#g%xLBmXkNC6kid{XOwF0kR4ToJ0vA0C~6z~f!FYwyH@i7N`yym!FcSl`N(l|b@o z&oHvx5WzSf-8&L+VYex>o$wba#|{&a>gncxU?e(!S(e8TDIWVthF@>e z7o0my@xgHVAbBEVXbaQskL%cVVW5CAt$j!-w`;UBd|$I?rDdyc`y=TLdvZf3zQLDq zf)P|1-UzpuEo7#MAwjAj-wM0^sUB-oqYQIHe>&yZTTswFNmL@E@r$5s=1}2EB_YeYznX%vQ@1s=HLB^8SZYxzq zg{RtcYd!4A%_b=F6er~zwFR5A7)R*_Xo&iZE3pLlqza^*k=xcZaH2Xxz_J=4GKbf% zPI;u8@++7$ZfnM>KZ$oXS4tm82V+$24nL}XFS29GGoP?X>~ke`3Tsqhtpl z59?;pxJ>c>;%yr|yqBtXgQ2>ajq`V%V(@3kEZ*DZE8&cmp}pyqDNhZ7At#8-fQ0{( ztv+H+V<2l}En3zzFbSl0GS-ldN~={dMFGuk{m{tqCUa{CIFsZUd*A2M?*G+mX@k$} zuCm7>`E=A9zOHOv2U@0+E@}T23UhE`BQF6l5wwciM>Y!{O^aFT?9ehh{ASt^elurN zvh3cmi)_gff#!EhO2oGDCl8gA`;!bK{g2YE1OT~?T|wnC!60#io^e(N7|z==J2TOt zo;*O|3_;Ct;dxwkM)$FIwcRVmUh=OkZ>SpsJ3@%mf>bBYV3}aXa++;^byXXIt$pmH zziJRHC&=Q5LGHR|(WgCE>2m%vrlJzzYsL2-ot@kO{Z9Tz@n1`>-5tKfw=9v^QiEC-2rC z3KlA|%7oAMi)=qu9@{P2YK-X+7?W#C$KZ2BZgt`uhuFpz3458JHnsAzFf4^omQf?# zSF*ydv9{JW9D9i_mjx+A%Qp9SyxH%k8|PeA%GnZ~>?v~g;~Lhh#srssWAcNudkd-z zaW9>2lvOx{P3xv#gCZG7a0lE}LNWuUvy_i3@SC1zZ9R%^GW4)17g}qaA@RubYh#AzNx$Sm+nFF*$c`M@{$++=U zG_OQz)dlGphqm{DA~V?MJ~x~5JuZB^(!vUOX+shs%4uL|Qf!zPG@w5jM=3~eXYw#r z*(8$)1>M?T^}Lc9)SBME>b2#Ix|d_L4Wt;q*av3a%(5yK>5zYJFsD3zV9b7z`A^T}FbnRL&b0P?$)V6R6tiq=tnC zE9vtC2db)x?q(p7NnIW4u*c#`N03{@>XFR5D#hp~gL@e;Ghw}voC)M6)h4>p(8l#+ z$}*dZaKTYgK9BN^Uoz-HyRwo=kS7W8GnRf>h^PHtFr`$s>Z|0SqyUWcw_06RkDt{f zyFo?)G?J=x6L9JiitUdfc@U&$-}E_7g&N^*WBIs17`|(@ujJx+JOkNBk6{W3na4c9 zUZrz83J8=5#|j&xBcz0Dd}@6uYAO+PaGI1~fDGArRK#|bOeu_g_!E`y!5(7aksmqT zW`cNHf@<4R6(UOyKV_nf96@(syKEY97nPifh)}%>0pukdm4MC($woOozXVvHx2sa` z(XmUm7Pvz?4ATj=les4b^k&;V6Y?dl{T?dvgYs;0`|3S ztX3&Tn*D-d`Zn>UT%*AL+Zkg!-vGd<^sMgXiw2BoG7SLHTPsFgKLp`?uq7ITe(#t2 zyDuXZ8HX?Yc=UPkf6a}^7UrB=1VA~lFh8jdI=q?=nq5uLEq3U3agLO@5D#O$czy?1 zJcPrg1%{=iVq*DMm}i>OauZBIXB@iAuMPoYiKe`|1P5amm#iUKU?6h#f03*HfLqx$ zi(}%i4BcFyQGW0fLB6PuE%2fo@d${x*Qj&1p=L}QrqgN$^1=(FY`>d z6DUq^t-(pO^m)V8ls3kWcU(brCKH6mDPlAHcxiU6fR=}gy3BXsRN*ErI_yTN6`ls0 zGeNv@H`mc`wB4z2gQ(O9{??kU%w4e&uX$&(gz#N4DvX)iaQ!gV5l9J;si^~p=0(Z6 zFW?25#=Hb)l~bGVzc>xtWZ z`eIOo1*XN@nG_qqCW%Id&ND+D_Tf?)?xR)k)|v+I1FC#YQg`$hZ7n?CteQTZ+47|W zP&e0YP1Xr?zm}4c!$=r$r9)4Pca*THc@oAKOouUU@a35RW0oee8mMW%!n1p&$;G4D z@?e;}Y`*mTY%8qTFZL2KB1^*RRpP z_foEpzEp%Q@rz;OO};691mrpF_hiH3oE3$>t*_RgT2(vTWXLQ}v0w;S@=pRF#=+yv#S~#9 zc9w+{1?RF7GEzfIGXw*nbEnpY@0JULSdxE3g&!XAORja9l0o3Dd8-*RiT|0<%|TgV z3msZqIS|RcC`Jcj`yt~6!%TS}umW-I#_3O@gJb}PZ_ zcDLKq;%Rsv6Z}w&%N+Re!P;ozD$Xa^Csj!d>Bj2N$}h5;vq72T=3z9REl9er_4kYR zVajlY9w-EuRK)bQE5F+kRx7ls|2@iLlKCk3EY^97x5mnR(P$sQ-UT*_)Ktb+8kCk$ z26byrgX{lR;UHbmZxf0~`gy~>;tS9(1dTtZUAj>*YHnqgj;?Anqj%do?p$9$ebICIQ@1^JBjj!+>f864RO4??B6AWr;8tB2 z4EXM!?(+Y=)MdgE6b#zQ`hzPEi_8M0=B{&mYVm2lxtWKyhv;y=8B&5SleKA=-?}Q| zlK-4Kmhx5wFPiq}>QG$nwwx8l0YcNL(68!H>QD5Cm6DO@{T@MkfA z%2?QFjGYfxeeBfWYP#{?OI>31c7?&vddkB|ik)xV<~Dl$nGYHYq=PKNb&T>|>Y6;M zWu}*78Tl|O4KEG=ban^tSd?rNBHk>#P^hZ5+Aog1MToBor}uqKKqswu@q!Q*EB^tW z{kADKq9nL(SqnF?(x^tL`i2vtiIur+)w`YCjK1_QK4f^QHs6AD{=62a9{ETDPf12Iw-O!U;h*>0?1sQ`a&wC-+ zQzk=(_YK&n1n>g70nsh*D`wbU>8n%RYXy#L#^rOK#PdR4++K~NGLjg#jxVLs5i<|SoaASUzb?1q9+PZIJfT?K5X78rM?S)NZQID+|CH%g zL*XsgJnsmgbY@mR38xr75{!jMcu#UjuZV@gnvPG@#=-q@}6lwnSM~*rtm3V%oYc^#k7@sRn8E#F4f~zmQb?^3 zm`7p(ezL<|8JMz3sX{aupi0cW${)qLNy}FglB<2^=*kPk54KTrYCyMjZA`GES|V|? zb4*opEGRnD)FV@^HiS1Tp_lko!vCgaY^XB=I7OKt@h1=Dax%T0 zZn_RzK2zepr%vD+L_b*u@(o()U*b+yFT21)yv6iRnF8lS9eA+wZ>E2u+^o5nY9NU6 zG0;eByE&i!i8A#U_M%1Nr~*6DVQH<&jm$dMx)T^jH^rE0`-LNx;#ODfdZ63 z2MgB*BL} zaiOqyGRr$I4uDP`zLI0uBq!kFqT3U|GoVccG?qZ;*)2sM(szu1Mk^^_VB_SfrK;Z2^ z&niN9@ph$#x88-Bu8tJGA8K#=P<~ukuoA@L`_jEj4LBcl1e4Qeqi`I6*xF@{ez>Ocn=5t~VvntBL&%ycG+A-WOmNo91mIiMyb%txl2HaJ0oglAZ zy0lRKM|>!gnHeD*i&@&o%t_oeMsz@1w~@|jgzJS%6sPp+MNIHH3+-O%zEH8*BTfso zVhpY3^(bKl-O=P9AnM4;;w`Q)-p#rEe#aX%E3cKS zpRKrr7FTF~N(UbHR=wi#s-6te+D)sO@7x0#cM&hOy4{yom3Q@~9)qIJA29nR4vG<0 zYf|8U)sHs-h0U0MW_B5Ei3n~JtyZ^^EI#_Ft6-)msCi`ncj)#++$p&1xF6N5s={cF za8F=&E@M5+Y4l1#hcK8A8?seoJ%2JYv)xgk{&aAPCAh+&{4QZ$eMJml%x79pIdq6!)n_LBc+#(!WxrO7 zj#{PVKx3l`_`$?woEG^xySEgZGpHv!3c8Z19+&}xPrNpZ_LN0T#6T~*S&Xbt42FA^ zM^k1!lEzxzH6F*5*e_Xh@XiDQ-P*Ac5xDIcA{j0x9ue1}#pH%(nq(Wp+t)|X z0q3^=6zENfee8|Dw){Ao-cb&$6|UaKc2o4EoooS`Wce*{JZaL&Fj5#Sz{!LKEK!1Z zeOlr@dQr3Vb81v@c>`!x6nZNjo1JI3YEV@7&%yq=aBl;P!xdyhOyF-qB6yS5Lv2iMXGe;Cl@U5|>a^a2{AP9V0^f0@`-8N{+U?Z= z{M1VIMI@qtaGoX^l~(_0I|!Rics&1=JEJ_y*B^xQS43M z50&t^Uj;;yLZwUn%C&`m5JfmyzbqQ0Pi-$LszXO{Nlb znZSvZyf$)+Pg&e<5TY{P>sIR7x&HTWj z0s70DB4?wMdM%3!!$Yt?_RWE~CIhOqfm09kHsF9{dvLw1sc4R0EH%vNZ(FJled?e0 z?U%w%cA&sGS({p?qyg17G0x2#6GdXJr%kcNHLIM;Kn)q_E=wTnIjDjDBndIpma4is za5)a1lJR%=bhg5m^Mcc^d7W}!P~WIzHj%<>Hq`2Cs6qZ00kePt!$diQS4RV!0d=zz zE1}KVUuws#kE+=5T3uUCrJzbb>MI3OB=TO^2jh& zQVpUqCF}SNT$vQT*4%1q)@POfltJ&Cjn*^d1Cw1!JRn zgVd}H36v#uGG@FtEV#Zq=Xjk{A3*!P>Rau6?DN0?c&4vy}hK@ookCPY1?)(Hkk4H z^;9pu_mqvoy>C9FfM!v{iDH#-s3T9^4q@26dRdQqkX&*xn@MFeb`K^crt5n~lEwK= zB9~%!&Y{qfENAAH5SNW_VJb61ozYR~dwp2}8t@v;>%kXv3}ESAqs&CZ55{|h;+xmw zPQVloUrcvw8fO|ikC+vSS(g=lwKrn6_k|c-Y0r7c8Z%&yUfxBr#udwn#f;uulROF z(c=%xDxR^{dIjJ6^>yF;(uDUmXE{InawmRs5bQEgxB2>I&dF5Go7N0+%_w^k32k-g zQDa)Y&PG5iq9CHLS?AD{mCT718Z8Ge`doNihPJ^2@0JBnATMg;VLs|0F-!NS+&ud; zGmQ;)Zp*JttJOQdmINmm{1k}Dn7A@A<6OZEWv`PDlgeh8daqGak2jl>jIuWd+vX2s zC(c;G!Q&U{prhJ;_`{r;iLV|^F-UD(S-0$o%ioA|s2ex&2a&`(|qS7 z&BzvDR(o}OyWgGjPv?+wm@CjZOQ*$YoS9=PGq0+uFXy4up$iupv{lvbr<3 zi5U?mcYgKj%?c3lbY8IXGq2x?)c3WU?9RPOf9u=8z{teHA)w&!;J@~V=kbwTD%}#b zC5BRb$!6ZsJN15-w`U%zu<3jK`t^Auz7yLXTN{ad?d&mNa)sT+6i{{8m+Jz;Dn zz|6c5+;}#=`$V_et2D92y+(C6eddR6w6M4DZ*Om}0Ny2e`SRt8s;aKZlPBM}eLFf; zGMN*rgP_L!@MQgW<6g(ExkoZWj^{^5*8JMD^Ut@nhaVcKP4=|0vpaV6YG_PcoZIbf z_L@^SVfP!%D1D~-|C!ipjsngQZ0?+Th z>U2`{eYyoSWns|)G|X1`#Vps!PZk9mu}<=p^_|OfYMvxsTNoNkxt7>$dVPs)-Ak>{ zMyDG6PL>u$&&J~}hxaUOi;cSWbZpDKeAOki)$imzTUIVLY(9sYvca!Wr*&fNu3KiC zMEs_u>P?ARzI`jc$ot~EVAZUWz7&^fT<1Su(X`BOom5-Ram5?EpTT)2VJ=hiraw|{ zdQK-ZK4qLP+4jULKO+}!M);*VAvN;KOPP~5*K`||dX>eBRqp2q!DmUs0V~#7%X$}i z+@1JR=j1luzmsMft6qPZi`SmL!WlsVGhHV-oiw`@^0#0|;_quj1X!Mg?`)=%TUxV2 fuN(gUB>11nYbS$Ez$gE!3_#%N>gTe~DWM4fOs8fv literal 0 HcmV?d00001 diff --git a/sdk/python/feast/permissions/client/kubernetes_auth_client_manager.py b/sdk/python/feast/permissions/client/kubernetes_auth_client_manager.py index 9121603d8c..1ca3c5a2ae 100644 --- a/sdk/python/feast/permissions/client/kubernetes_auth_client_manager.py +++ b/sdk/python/feast/permissions/client/kubernetes_auth_client_manager.py @@ -17,7 +17,7 @@ def get_token(self): token = self._read_token_from_file() return token except Exception as e: - logger.exception(f"Error reading token from file: {e}") + logger.info(f"Error reading token from file: {e}") logger.info("Attempting to read token from environment variable.") try: token = self._read_token_from_env() @@ -39,5 +39,5 @@ def _read_token_from_file(self): def _read_token_from_env(self): token = os.getenv("LOCAL_K8S_TOKEN") if not token: - raise FileNotFoundError("LOCAL_K8S_TOKEN environment variable is not set.") + raise KeyError("LOCAL_K8S_TOKEN environment variable is not set.") return token diff --git a/sdk/python/feast/permissions/client/utils.py b/sdk/python/feast/permissions/client/utils.py index 88c38a18fc..02c69c9d6e 100644 --- a/sdk/python/feast/permissions/client/utils.py +++ b/sdk/python/feast/permissions/client/utils.py @@ -16,8 +16,6 @@ def create_auth_header( def create_flight_call_options(auth_config: AuthConfig) -> fl.FlightCallOptions: if auth_config.type != AuthType.NONE.value: - auth_client_manager = get_auth_client_manager(auth_config) - token = auth_client_manager.get_token() - headers = [(b"authorization", b"Bearer " + token.encode("utf-8"))] + headers = create_auth_header(auth_config) return fl.FlightCallOptions(headers=headers) return fl.FlightCallOptions() From d7defc1fbcbb9d997ca8c50b396c0f797693cbca Mon Sep 17 00:00:00 2001 From: Abdul Hameed Date: Wed, 31 Jul 2024 15:44:24 -0400 Subject: [PATCH 107/169] rebased with master Signed-off-by: Abdul Hameed --- setup.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/setup.py b/setup.py index 610b50ed76..84d9354a20 100644 --- a/setup.py +++ b/setup.py @@ -22,8 +22,10 @@ from pathlib import Path from setuptools import find_packages, setup, Command +from setuptools.command.build_ext import build_ext as _build_ext from setuptools.command.build_py import build_py from setuptools.command.develop import develop +from setuptools.command.install import install NAME = "feast" DESCRIPTION = "Python SDK for Feast" From 190e609998f785bd52a59ff9bf6ab354ea837fbb Mon Sep 17 00:00:00 2001 From: lokeshrangineni Date: Thu, 25 Jul 2024 17:32:25 -0400 Subject: [PATCH 108/169] Moved the common fixtures to the root conftest.py or auth_permissions_util.py (#54) * Moved the common fixtures to the root conftest.py or auth_permissions_util.py Signed-off-by: Lokesh Rangineni Signed-off-by: Lokesh Rangineni * Adding missed dependency and regenerated the requirements files. Signed-off-by: Lokesh Rangineni Signed-off-by: Lokesh Rangineni * Addinig missing changes from the original PR. Signed-off-by: Lokesh Rangineni Signed-off-by: Lokesh Rangineni --------- Signed-off-by: Lokesh Rangineni Signed-off-by: Abdul Hameed --- .../unit/permissions/auth/server/test_auth_registry_server.py | 1 + setup.py | 2 -- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/sdk/python/tests/unit/permissions/auth/server/test_auth_registry_server.py b/sdk/python/tests/unit/permissions/auth/server/test_auth_registry_server.py index af50d48ad4..3488197211 100644 --- a/sdk/python/tests/unit/permissions/auth/server/test_auth_registry_server.py +++ b/sdk/python/tests/unit/permissions/auth/server/test_auth_registry_server.py @@ -19,6 +19,7 @@ list_permissions_perm, list_sfv_perm, ) +from tests.utils.auth_permissions_util import get_remote_registry_store from tests.utils.http_server import check_port_open # noqa: E402 diff --git a/setup.py b/setup.py index 84d9354a20..610b50ed76 100644 --- a/setup.py +++ b/setup.py @@ -22,10 +22,8 @@ from pathlib import Path from setuptools import find_packages, setup, Command -from setuptools.command.build_ext import build_ext as _build_ext from setuptools.command.build_py import build_py from setuptools.command.develop import develop -from setuptools.command.install import install NAME = "feast" DESCRIPTION = "Python SDK for Feast" From 542f38926ebecad7c890a291727def2c028fbaac Mon Sep 17 00:00:00 2001 From: Theodor Mihalache Date: Fri, 26 Jul 2024 20:34:45 -0400 Subject: [PATCH 109/169] Fixed DecisionStrategy not persisted Signed-off-by: Theodor Mihalache Signed-off-by: Abdul Hameed --- protos/feast/core/Registry.proto | 9 ++++++ sdk/python/feast/cli.py | 7 ++--- sdk/python/feast/cli_utils.py | 9 ++++-- sdk/python/feast/infra/registry/snowflake.py | 13 ++++++-- sdk/python/feast/infra/registry/sql.py | 30 ++++++++++++++----- sdk/python/feast/permissions/enforcer.py | 8 ++--- sdk/python/feast/permissions/permission.py | 17 ----------- .../feast/permissions/security_manager.py | 12 ++++++++ sdk/python/feast/project_metadata.py | 19 ++++++++++-- .../registration/test_universal_registry.py | 16 ++++++---- sdk/python/tests/unit/permissions/conftest.py | 3 ++ .../tests/unit/permissions/test_permission.py | 13 -------- .../unit/permissions/test_security_manager.py | 7 ----- 13 files changed, 99 insertions(+), 64 deletions(-) diff --git a/protos/feast/core/Registry.proto b/protos/feast/core/Registry.proto index b4f1ffb0a3..8f434ef76a 100644 --- a/protos/feast/core/Registry.proto +++ b/protos/feast/core/Registry.proto @@ -56,6 +56,15 @@ message Registry { } message ProjectMetadata { + enum DecisionStrategy{ + UNANIMOUS = 0; + AFFIRMATIVE = 1; + CONSENSUS = 2; + } + string project = 1; string project_uuid = 2; + DecisionStrategy decision_strategy = 3; } + + diff --git a/sdk/python/feast/cli.py b/sdk/python/feast/cli.py index b5e3dcc37c..b0a701d49c 100644 --- a/sdk/python/feast/cli.py +++ b/sdk/python/feast/cli.py @@ -36,7 +36,6 @@ from feast.errors import FeastObjectNotFoundException, FeastProviderLoginError from feast.feature_view import FeatureView from feast.on_demand_feature_view import OnDemandFeatureView -from feast.permissions.permission import Permission from feast.permissions.policy import RoleBasedPolicy from feast.repo_config import load_repo_config from feast.repo_operations import ( @@ -999,7 +998,7 @@ def feast_permissions_list_command(ctx: click.Context, verbose: bool, tags: list ) ) print( - f"{Style.BRIGHT}Note:{Style.RESET_ALL}The configured decision strategy is {Permission.get_global_decision_strategy().value.upper()}" + f"{Style.BRIGHT}Note:{Style.RESET_ALL}The configured decision strategy is {store.registry.list_project_metadata(project=store.project)[0].decision_strategy.value.upper()}" ) else: cli_utils.print_permission_verbose_example() @@ -1120,7 +1119,7 @@ def feast_permissions_list_roles_command(ctx: click.Context, verbose: bool): store=store, ) cli_utils.handler_list_all_permissions_roles_verbose( - objects=objects, permissions=permissions, table=table + store=store, objects=objects, permissions=permissions, table=table ) print( tabulate( @@ -1136,7 +1135,7 @@ def feast_permissions_list_roles_command(ctx: click.Context, verbose: bool): ) print( - f"{Style.BRIGHT}Note:{Style.RESET_ALL}The configured decision strategy is {Permission.get_global_decision_strategy().value.upper()}" + f"{Style.BRIGHT}Note:{Style.RESET_ALL}The configured decision strategy is {store.registry.list_project_metadata(project=store.project)[0].decision_strategy.value.upper()}" ) diff --git a/sdk/python/feast/cli_utils.py b/sdk/python/feast/cli_utils.py index 5155eb814f..8f5b91334d 100644 --- a/sdk/python/feast/cli_utils.py +++ b/sdk/python/feast/cli_utils.py @@ -271,7 +271,10 @@ def handler_list_all_permissions_roles(permissions: list[Permission], table: lis def handler_list_all_permissions_roles_verbose( - objects: list[FeastObject], permissions: list[Permission], table: list[Any] + store: FeatureStore, + objects: list[FeastObject], + permissions: list[Permission], + table: list[Any], ): all_roles = fetch_all_permission_roles(permissions) @@ -288,7 +291,9 @@ def handler_list_all_permissions_roles_verbose( if matching_permissions: evaluator = DecisionEvaluator( - Permission.get_global_decision_strategy(), + store.registry.list_project_metadata(project=store.project)[ + 0 + ].decision_strategy, len(matching_permissions), ) for p in matching_permissions: diff --git a/sdk/python/feast/infra/registry/snowflake.py b/sdk/python/feast/infra/registry/snowflake.py index 801b90afe3..96430819ef 100644 --- a/sdk/python/feast/infra/registry/snowflake.py +++ b/sdk/python/feast/infra/registry/snowflake.py @@ -32,6 +32,7 @@ execute_snowflake_statement, ) from feast.on_demand_feature_view import OnDemandFeatureView +from feast.permissions.decision import DecisionStrategy from feast.permissions.permission import Permission from feast.project_metadata import ProjectMetadata from feast.protos.feast.core.DataSource_pb2 import DataSource as DataSourceProto @@ -64,6 +65,7 @@ class FeastMetadataKeys(Enum): LAST_UPDATED_TIMESTAMP = "last_updated_timestamp" PROJECT_UUID = "project_uuid" + PERMISSIONS_DECISION_STRATEGY = "permissions_decision_strategy" class SnowflakeRegistryConfig(RegistryConfig): @@ -923,7 +925,13 @@ def list_project_metadata( for row in df.iterrows(): if row[1]["METADATA_KEY"] == FeastMetadataKeys.PROJECT_UUID.value: project_metadata.project_uuid = row[1]["METADATA_VALUE"] - break + elif ( + row[1]["METADATA_KEY"] + == FeastMetadataKeys.PERMISSIONS_DECISION_STRATEGY.value + ): + project_metadata.decision_strategy = DecisionStrategy( + row[1]["METADATA_VALUE"] + ) # TODO(adchia): Add other project metadata in a structured way return [project_metadata] return [] @@ -1110,7 +1118,8 @@ def _maybe_init_project_metadata(self, project): query = f""" INSERT INTO {self.registry_path}."FEAST_METADATA" VALUES - ('{project}', '{FeastMetadataKeys.PROJECT_UUID.value}', '{new_project_uuid}', CURRENT_TIMESTAMP()) + ('{project}', '{FeastMetadataKeys.PROJECT_UUID.value}', '{new_project_uuid}', CURRENT_TIMESTAMP()), + ('{project}', '{FeastMetadataKeys.PERMISSIONS_DECISION_STRATEGY.value}', '{DecisionStrategy.UNANIMOUS.value}', CURRENT_TIMESTAMP()) """ execute_snowflake_statement(conn, query) diff --git a/sdk/python/feast/infra/registry/sql.py b/sdk/python/feast/infra/registry/sql.py index cd6d2e2bb3..33fc016a7f 100644 --- a/sdk/python/feast/infra/registry/sql.py +++ b/sdk/python/feast/infra/registry/sql.py @@ -39,6 +39,7 @@ from feast.infra.infra_object import Infra from feast.infra.registry.caching_registry import CachingRegistry from feast.on_demand_feature_view import OnDemandFeatureView +from feast.permissions.decision import DecisionStrategy from feast.permissions.permission import Permission from feast.project_metadata import ProjectMetadata from feast.protos.feast.core.DataSource_pb2 import DataSource as DataSourceProto @@ -165,6 +166,7 @@ class FeastMetadataKeys(Enum): LAST_UPDATED_TIMESTAMP = "last_updated_timestamp" PROJECT_UUID = "project_uuid" + PERMISSIONS_DECISION_STRATEGY = "permissions_decision_strategy" feast_metadata = Table( @@ -501,7 +503,13 @@ def _list_project_metadata(self, project: str) -> List[ProjectMetadata]: == FeastMetadataKeys.PROJECT_UUID.value ): project_metadata.project_uuid = row._mapping["metadata_value"] - break + elif ( + row._mapping["metadata_key"] + == FeastMetadataKeys.PERMISSIONS_DECISION_STRATEGY.value + ): + project_metadata.decision_strategy = DecisionStrategy( + row._mapping["metadata_value"] + ) # TODO(adchia): Add other project metadata in a structured way return [project_metadata] return [] @@ -802,12 +810,20 @@ def _maybe_init_project_metadata(self, project): row = conn.execute(stmt).first() if not row: new_project_uuid = f"{uuid.uuid4()}" - values = { - "metadata_key": FeastMetadataKeys.PROJECT_UUID.value, - "metadata_value": new_project_uuid, - "last_updated_timestamp": update_time, - "project_id": project, - } + values = [ + { + "metadata_key": FeastMetadataKeys.PROJECT_UUID.value, + "metadata_value": new_project_uuid, + "last_updated_timestamp": update_time, + "project_id": project, + }, + { + "metadata_key": FeastMetadataKeys.PERMISSIONS_DECISION_STRATEGY.value, + "metadata_value": DecisionStrategy.UNANIMOUS.value, + "last_updated_timestamp": update_time, + "project_id": project, + }, + ] insert_stmt = insert(feast_metadata).values(values) conn.execute(insert_stmt) diff --git a/sdk/python/feast/permissions/enforcer.py b/sdk/python/feast/permissions/enforcer.py index 11db7bace0..5f1dd7f908 100644 --- a/sdk/python/feast/permissions/enforcer.py +++ b/sdk/python/feast/permissions/enforcer.py @@ -1,7 +1,7 @@ import logging from feast.feast_object import FeastObject -from feast.permissions.decision import DecisionEvaluator +from feast.permissions.decision import DecisionEvaluator, DecisionStrategy from feast.permissions.permission import ( AuthzedAction, Permission, @@ -16,6 +16,7 @@ def enforce_policy( user: User, resources: list[FeastObject], actions: list[AuthzedAction], + decision_strategy: DecisionStrategy, filter_only: bool = False, ) -> list[FeastObject]: """ @@ -29,6 +30,7 @@ def enforce_policy( user: The current user. resources: The resources for which we need to enforce authorized permission. actions: The requested actions to be authorized. + decision_strategy: The decision strategy to be applied when multiple permissions match an execution request. filter_only: If `True`, it removes unauthorized resources from the returned value, otherwise it raises a `PermissionError` the first unauthorized resource. Defaults to `False`. @@ -53,9 +55,7 @@ def enforce_policy( ] if matching_permissions: - evaluator = DecisionEvaluator( - Permission.get_global_decision_strategy(), len(matching_permissions) - ) + evaluator = DecisionEvaluator(decision_strategy, len(matching_permissions)) for p in matching_permissions: permission_grant, permission_explanation = p.policy.validate_user( user=user diff --git a/sdk/python/feast/permissions/permission.py b/sdk/python/feast/permissions/permission.py index ec7e86b6cf..cb2e1250f5 100644 --- a/sdk/python/feast/permissions/permission.py +++ b/sdk/python/feast/permissions/permission.py @@ -7,7 +7,6 @@ from feast.importer import import_class from feast.permissions.action import ALL_ACTIONS, AuthzedAction -from feast.permissions.decision import DecisionStrategy from feast.permissions.matcher import actions_match_config, resource_match_config from feast.permissions.policy import AllowAll, Policy from feast.protos.feast.core.Permission_pb2 import Permission as PermissionProto @@ -102,22 +101,6 @@ def __hash__(self): def __str__(self): return str(MessageToJson(self.to_proto())) - _global_decision_strategy: DecisionStrategy = DecisionStrategy.UNANIMOUS - - @staticmethod - def get_global_decision_strategy() -> DecisionStrategy: - """ - The global decision strategy to be applied when multiple permissions match an execution request. - """ - return Permission._global_decision_strategy - - @staticmethod - def set_global_decision_strategy(global_decision_strategy: DecisionStrategy): - """ - Define the global decision strategy to be applied when multiple permissions match an execution request. - """ - Permission._global_decision_strategy = global_decision_strategy - @property def name(self) -> str: return self._name diff --git a/sdk/python/feast/permissions/security_manager.py b/sdk/python/feast/permissions/security_manager.py index 178db6e6e9..8a6d2d3581 100644 --- a/sdk/python/feast/permissions/security_manager.py +++ b/sdk/python/feast/permissions/security_manager.py @@ -5,6 +5,7 @@ from feast.feast_object import FeastObject from feast.infra.registry.base_registry import BaseRegistry from feast.permissions.action import AuthzedAction +from feast.permissions.decision import DecisionStrategy from feast.permissions.enforcer import enforce_policy from feast.permissions.permission import Permission from feast.permissions.user import User @@ -52,6 +53,16 @@ def permissions(self) -> list[Permission]: """ return self._registry.list_permissions(project=self._project) + @property + def decision_strategy(self) -> DecisionStrategy: + """ + Returns: + DecisionStrategy: the DecisionStrategy configured in the Feast registry. + """ + return self._registry.list_project_metadata(project=self._project)[ + 0 + ].decision_strategy + def assert_permissions( self, resources: list[FeastObject], @@ -80,6 +91,7 @@ def assert_permissions( user=self.current_user if self.current_user is not None else User("", []), resources=resources, actions=actions if isinstance(actions, list) else [actions], + decision_strategy=self.decision_strategy, filter_only=filter_only, ) diff --git a/sdk/python/feast/project_metadata.py b/sdk/python/feast/project_metadata.py index 64488a0362..ad4f622c82 100644 --- a/sdk/python/feast/project_metadata.py +++ b/sdk/python/feast/project_metadata.py @@ -17,6 +17,7 @@ from google.protobuf.json_format import MessageToJson from typeguard import typechecked +from feast.permissions.decision import DecisionStrategy from feast.protos.feast.core.Registry_pb2 import ProjectMetadata as ProjectMetadataProto @@ -32,12 +33,14 @@ class ProjectMetadata: project_name: str project_uuid: str + decision_strategy: DecisionStrategy def __init__( self, *args, project_name: Optional[str] = None, project_uuid: Optional[str] = None, + decision_strategy: Optional[DecisionStrategy] = None, ): """ Creates an Project metadata object. @@ -45,6 +48,7 @@ def __init__( Args: project_name: The registry-scoped unique name of the project. project_uuid: The UUID for this project + decision_strategy: The projects decision strategy to be applied when multiple permissions match an execution request. Raises: ValueError: Parameters are specified incorrectly. @@ -54,9 +58,10 @@ def __init__( self.project_name = project_name self.project_uuid = project_uuid or f"{uuid.uuid4()}" + self.decision_strategy = decision_strategy or DecisionStrategy.UNANIMOUS def __hash__(self) -> int: - return hash((self.project_name, self.project_uuid)) + return hash((self.project_name, self.project_uuid, self.decision_strategy)) def __eq__(self, other): if not isinstance(other, ProjectMetadata): @@ -67,6 +72,7 @@ def __eq__(self, other): if ( self.project_name != other.project_name or self.project_uuid != other.project_uuid + or self.decision_strategy != other.decision_strategy ): return False @@ -92,6 +98,11 @@ def from_proto(cls, project_metadata_proto: ProjectMetadataProto): entity = cls( project_name=project_metadata_proto.project, project_uuid=project_metadata_proto.project_uuid, + decision_strategy=DecisionStrategy[ + ProjectMetadataProto.DecisionStrategy.Name( + project_metadata_proto.decision_strategy + ) + ], ) return entity @@ -105,5 +116,9 @@ def to_proto(self) -> ProjectMetadataProto: """ return ProjectMetadataProto( - project=self.project_name, project_uuid=self.project_uuid + project=self.project_name, + project_uuid=self.project_uuid, + decision_strategy=ProjectMetadataProto.DecisionStrategy.Value( + self.decision_strategy.name + ), ) diff --git a/sdk/python/tests/integration/registration/test_universal_registry.py b/sdk/python/tests/integration/registration/test_universal_registry.py index 09e2f9744e..199fb8acac 100644 --- a/sdk/python/tests/integration/registration/test_universal_registry.py +++ b/sdk/python/tests/integration/registration/test_universal_registry.py @@ -41,6 +41,7 @@ from feast.infra.registry.sql import SqlRegistry from feast.on_demand_feature_view import on_demand_feature_view from feast.permissions.action import AuthzedAction +from feast.permissions.decision import DecisionStrategy from feast.permissions.permission import Permission from feast.permissions.policy import RoleBasedPolicy from feast.protos.feast.registry import RegistryServer_pb2, RegistryServer_pb2_grpc @@ -400,6 +401,7 @@ def assert_project_uuid(project, project_uuid, test_registry): project_metadata = test_registry.list_project_metadata(project=project) assert len(project_metadata) == 1 assert project_metadata[0].project_uuid == project_uuid + assert project_metadata[0].decision_strategy == DecisionStrategy.UNANIMOUS @pytest.mark.integration @@ -1282,7 +1284,7 @@ def test_commit(): project_metadata = test_registry.cached_registry_proto.project_metadata[0] project_uuid = project_metadata.project_uuid assert len(project_uuid) == 36 - validate_project_uuid(project_uuid, test_registry) + validate_project_metadata(project_uuid, test_registry) # Retrieving the entity should still succeed entities = test_registry.list_entities(project, allow_cache=True, tags=entity.tags) @@ -1294,7 +1296,7 @@ def test_commit(): and "team" in entity.tags and entity.tags["team"] == "matchmaking" ) - validate_project_uuid(project_uuid, test_registry) + validate_project_metadata(project_uuid, test_registry) entity = test_registry.get_entity("driver_car_id", project, allow_cache=True) assert ( @@ -1303,7 +1305,7 @@ def test_commit(): and "team" in entity.tags and entity.tags["team"] == "matchmaking" ) - validate_project_uuid(project_uuid, test_registry) + validate_project_metadata(project_uuid, test_registry) # Create new registry that points to the same store registry_with_same_store = Registry("project", registry_config, None) @@ -1311,7 +1313,7 @@ def test_commit(): # Retrieving the entity should fail since the store is empty entities = registry_with_same_store.list_entities(project) assert len(entities) == 0 - validate_project_uuid(project_uuid, registry_with_same_store) + validate_project_metadata(project_uuid, registry_with_same_store) # commit from the original registry test_registry.commit() @@ -1329,7 +1331,7 @@ def test_commit(): and "team" in entity.tags and entity.tags["team"] == "matchmaking" ) - validate_project_uuid(project_uuid, registry_with_same_store) + validate_project_metadata(project_uuid, registry_with_same_store) entity = test_registry.get_entity("driver_car_id", project) assert ( @@ -1346,10 +1348,12 @@ def test_commit(): test_registry._get_registry_proto(project=project) -def validate_project_uuid(project_uuid, test_registry): +def validate_project_metadata(project_uuid, test_registry): assert len(test_registry.cached_registry_proto.project_metadata) == 1 project_metadata = test_registry.cached_registry_proto.project_metadata[0] assert project_metadata.project_uuid == project_uuid + print(project_metadata.decision_strategy) + # assert project_metadata.decision_strategy == DecisionStrategy.UNANIMOUS @pytest.mark.integration diff --git a/sdk/python/tests/unit/permissions/conftest.py b/sdk/python/tests/unit/permissions/conftest.py index c85ebb1596..75117fc78c 100644 --- a/sdk/python/tests/unit/permissions/conftest.py +++ b/sdk/python/tests/unit/permissions/conftest.py @@ -12,6 +12,7 @@ set_security_manager, ) from feast.permissions.user import User +from feast.project_metadata import ProjectMetadata class SecuredFeatureView(FeatureView): @@ -84,8 +85,10 @@ def security_manager() -> SecurityManager: ) ) + project_metadata = ProjectMetadata(project_name="test_project") registry = Mock(spec=BaseRegistry) registry.list_permissions = Mock(return_value=permissions) + registry.list_project_metadata = Mock(return_value=[project_metadata]) sm = SecurityManager(project="any", registry=registry) set_security_manager(sm) return sm diff --git a/sdk/python/tests/unit/permissions/test_permission.py b/sdk/python/tests/unit/permissions/test_permission.py index 8bb473952e..dd0e0ae411 100644 --- a/sdk/python/tests/unit/permissions/test_permission.py +++ b/sdk/python/tests/unit/permissions/test_permission.py @@ -12,7 +12,6 @@ from feast.on_demand_feature_view import OnDemandFeatureView from feast.permissions.action import ALL_ACTIONS, AuthzedAction from feast.permissions.permission import ( - DecisionStrategy, Permission, ) from feast.permissions.policy import AllowAll, Policy @@ -20,18 +19,6 @@ from feast.stream_feature_view import StreamFeatureView -def test_global_decision_strategy(): - assertpy.assert_that(Permission.get_global_decision_strategy()).is_equal_to( - DecisionStrategy.UNANIMOUS - ) - - for value in DecisionStrategy.__members__.values(): - Permission.set_global_decision_strategy(value) - assertpy.assert_that(Permission.get_global_decision_strategy()).is_equal_to( - value - ) - - def test_defaults(): p = Permission(name="test") assertpy.assert_that(type(p.types)).is_equal_to(list) diff --git a/sdk/python/tests/unit/permissions/test_security_manager.py b/sdk/python/tests/unit/permissions/test_security_manager.py index 5dd0261c26..617d3346b8 100644 --- a/sdk/python/tests/unit/permissions/test_security_manager.py +++ b/sdk/python/tests/unit/permissions/test_security_manager.py @@ -2,16 +2,9 @@ import pytest from feast.permissions.action import QUERY, AuthzedAction -from feast.permissions.decision import DecisionStrategy -from feast.permissions.permission import Permission from feast.permissions.security_manager import assert_permissions, permitted_resources -@pytest.fixture(scope="module", autouse=True) -def setup_module(): - Permission.set_global_decision_strategy(DecisionStrategy.UNANIMOUS) - - @pytest.mark.parametrize( "username, requested_actions, allowed, allowed_single, raise_error_in_assert, raise_error_in_permit", [ From bdd4fd66ae1abbdc992b35bd7f69c4f57bd6d53b Mon Sep 17 00:00:00 2001 From: Theodor Mihalache Date: Wed, 31 Jul 2024 19:33:35 -0400 Subject: [PATCH 110/169] Fixed DecisionStrategy not persisted Signed-off-by: Theodor Mihalache Signed-off-by: Abdul Hameed --- protos/feast/registry/RegistryServer.proto | 7 ++ sdk/python/feast/feature_store.py | 10 +++ .../feast/infra/registry/base_registry.py | 12 +++ sdk/python/feast/infra/registry/registry.py | 21 +++++ sdk/python/feast/infra/registry/remote.py | 17 ++++ sdk/python/feast/infra/registry/snowflake.py | 15 ++++ sdk/python/feast/infra/registry/sql.py | 21 +++++ sdk/python/feast/registry_server.py | 13 ++++ .../registration/test_universal_registry.py | 78 ++++++++++++++++--- .../auth/server/test_auth_registry_server.py | 1 - 10 files changed, 182 insertions(+), 13 deletions(-) diff --git a/protos/feast/registry/RegistryServer.proto b/protos/feast/registry/RegistryServer.proto index 928354077b..6e5ad5c952 100644 --- a/protos/feast/registry/RegistryServer.proto +++ b/protos/feast/registry/RegistryServer.proto @@ -74,6 +74,7 @@ service RegistryServer{ rpc Commit (google.protobuf.Empty) returns (google.protobuf.Empty) {} rpc Refresh (RefreshRequest) returns (google.protobuf.Empty) {} rpc Proto (google.protobuf.Empty) returns (feast.core.Registry) {} + rpc SetDecisionStrategy (SetDecisionStrategyRequest) returns (google.protobuf.Empty) {} } @@ -356,3 +357,9 @@ message DeletePermissionRequest { string project = 2; bool commit = 3; } + +message SetDecisionStrategyRequest { + feast.core.ProjectMetadata.DecisionStrategy decision_strategy = 1; + string project = 2; + bool commit = 3; +} diff --git a/sdk/python/feast/feature_store.py b/sdk/python/feast/feature_store.py index a03706e56f..7bdae32fff 100644 --- a/sdk/python/feast/feature_store.py +++ b/sdk/python/feast/feature_store.py @@ -76,6 +76,7 @@ from feast.infra.registry.sql import SqlRegistry from feast.on_demand_feature_view import OnDemandFeatureView from feast.online_response import OnlineResponse +from feast.permissions.decision import DecisionStrategy from feast.permissions.permission import Permission from feast.protos.feast.core.InfraObject_pb2 import Infra as InfraProto from feast.protos.feast.serving.ServingService_pb2 import ( @@ -2007,6 +2008,15 @@ def list_saved_datasets( self.project, allow_cache=allow_cache, tags=tags ) + def set_decision_strategy(self, decision_strategy: DecisionStrategy): + """ + Set the project decision strategy. + + Args: + decision_strategy: The decision strategy to set to. + """ + return self._registry.set_decision_strategy(self.project, decision_strategy) + def _print_materialization_log( start_date, end_date, num_feature_views: int, online_store: str diff --git a/sdk/python/feast/infra/registry/base_registry.py b/sdk/python/feast/infra/registry/base_registry.py index 5ba9cbedb9..01f090b3fc 100644 --- a/sdk/python/feast/infra/registry/base_registry.py +++ b/sdk/python/feast/infra/registry/base_registry.py @@ -28,6 +28,7 @@ from feast.feature_view import FeatureView from feast.infra.infra_object import Infra from feast.on_demand_feature_view import OnDemandFeatureView +from feast.permissions.decision import DecisionStrategy from feast.permissions.permission import Permission from feast.project_metadata import ProjectMetadata from feast.protos.feast.core.Entity_pb2 import Entity as EntityProto @@ -812,3 +813,14 @@ def deserialize_registry_values(serialized_proto, feast_obj_type) -> Any: if feast_obj_type == FeatureService: return FeatureServiceProto.FromString(serialized_proto) return None + + @abstractmethod + def set_decision_strategy(self, project: str, decision_strategy: DecisionStrategy): + """ + Set the project decision strategy. + + Args: + project: Feast project to set the decision strategy for + decision_strategy: The decision strategy to set for the project + """ + raise NotImplementedError diff --git a/sdk/python/feast/infra/registry/registry.py b/sdk/python/feast/infra/registry/registry.py index fa9d436400..89703db0c9 100644 --- a/sdk/python/feast/infra/registry/registry.py +++ b/sdk/python/feast/infra/registry/registry.py @@ -43,8 +43,10 @@ from feast.infra.registry.registry_store import NoopRegistryStore from feast.on_demand_feature_view import OnDemandFeatureView from feast.permissions.auth_model import AuthConfig, NoAuthConfig +from feast.permissions.decision import DecisionStrategy from feast.permissions.permission import Permission from feast.project_metadata import ProjectMetadata +from feast.protos.feast.core.Registry_pb2 import ProjectMetadata as ProjectMetadataProto from feast.protos.feast.core.Registry_pb2 import Registry as RegistryProto from feast.repo_config import RegistryConfig from feast.repo_contents import RepoContents @@ -966,3 +968,22 @@ def delete_permission(self, name: str, project: str, commit: bool = True): self.commit() return raise PermissionNotFoundException(name, project) + + def set_decision_strategy(self, project: str, decision_strategy: DecisionStrategy): + registry = self._prepare_registry_for_changes(project) + + project_metadata = None + for idx, existing_project_metadata in enumerate(registry.project_metadata): + if existing_project_metadata.project == project: + del registry.project_metadata[idx] + project_metadata = existing_project_metadata + break + + if project_metadata: + project_metadata.decision_strategy = ( + ProjectMetadataProto.DecisionStrategy.Value(decision_strategy.name) + ) + + registry.project_metadata.append(project_metadata) + + self.commit() diff --git a/sdk/python/feast/infra/registry/remote.py b/sdk/python/feast/infra/registry/remote.py index 70c2af4c40..d88d8819b9 100644 --- a/sdk/python/feast/infra/registry/remote.py +++ b/sdk/python/feast/infra/registry/remote.py @@ -23,8 +23,10 @@ from feast.permissions.client.utils import ( create_auth_header, ) +from feast.permissions.decision import DecisionStrategy from feast.permissions.permission import Permission from feast.project_metadata import ProjectMetadata +from feast.protos.feast.core.Registry_pb2 import ProjectMetadata as ProjectMetadataProto from feast.protos.feast.core.Registry_pb2 import Registry as RegistryProto from feast.protos.feast.registry import RegistryServer_pb2, RegistryServer_pb2_grpc from feast.repo_config import RegistryConfig @@ -681,3 +683,18 @@ def refresh(self, project: Optional[str] = None): def teardown(self): pass + + def set_decision_strategy(self, project: str, decision_strategy: DecisionStrategy): + decision_strategy_proto = ProjectMetadataProto.DecisionStrategy.Value( + decision_strategy.name + ) + + request = RegistryServer_pb2.SetDecisionStrategyRequest( + decision_strategy=decision_strategy_proto, project=project + ) + + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_auth_header(self.auth_config) + self.stub.SetDecisionStrategy(request=request, metadata=metadata) + else: + self.stub.SetDecisionStrategy(request) diff --git a/sdk/python/feast/infra/registry/snowflake.py b/sdk/python/feast/infra/registry/snowflake.py index 96430819ef..808e382c46 100644 --- a/sdk/python/feast/infra/registry/snowflake.py +++ b/sdk/python/feast/infra/registry/snowflake.py @@ -1162,3 +1162,18 @@ def _set_last_updated_metadata(self, last_updated: datetime, project: str): def commit(self): pass + + def set_decision_strategy(self, project: str, decision_strategy: DecisionStrategy): + with GetSnowflakeConnection(self.registry_config) as conn: + query = f""" + UPDATE {self.registry_path}."FEAST_METADATA" + SET + project_id = '{project}', + metadata_key = '{FeastMetadataKeys.PERMISSIONS_DECISION_STRATEGY.value}', + metadata_value = '{decision_strategy.value}', + last_updated_timestamp = CURRENT_TIMESTAMP() + WHERE + project_id = '{project}' + AND metadata_key = '{FeastMetadataKeys.PERMISSIONS_DECISION_STRATEGY.value}', + """ + execute_snowflake_statement(conn, query) diff --git a/sdk/python/feast/infra/registry/sql.py b/sdk/python/feast/infra/registry/sql.py index 33fc016a7f..868951c1f3 100644 --- a/sdk/python/feast/infra/registry/sql.py +++ b/sdk/python/feast/infra/registry/sql.py @@ -1002,3 +1002,24 @@ def delete_permission(self, name: str, project: str, commit: bool = True): rows = conn.execute(stmt) if rows.rowcount < 1: raise PermissionNotFoundException(name, project) + + def set_decision_strategy(self, project: str, decision_strategy: DecisionStrategy): + with self.engine.begin() as conn: + values = { + "metadata_key": FeastMetadataKeys.PERMISSIONS_DECISION_STRATEGY.value, + "metadata_value": f"{decision_strategy.value}", + "last_updated_timestamp": int(_utc_now().timestamp()), + "project_id": project, + } + + update_stmt = ( + update(feast_metadata) + .where( + feast_metadata.c.metadata_key + == FeastMetadataKeys.PERMISSIONS_DECISION_STRATEGY.value, + feast_metadata.c.project_id == project, + ) + .values(values) + ) + + conn.execute(update_stmt) diff --git a/sdk/python/feast/registry_server.py b/sdk/python/feast/registry_server.py index 7b88a29c41..629581f03f 100644 --- a/sdk/python/feast/registry_server.py +++ b/sdk/python/feast/registry_server.py @@ -15,6 +15,7 @@ from feast.infra.registry.base_registry import BaseRegistry from feast.on_demand_feature_view import OnDemandFeatureView from feast.permissions.action import CRUD, AuthzedAction +from feast.permissions.decision import DecisionStrategy from feast.permissions.permission import Permission from feast.permissions.security_manager import assert_permissions, permitted_resources from feast.permissions.server.grpc import grpc_interceptors @@ -24,6 +25,7 @@ init_security_manager, str_to_auth_manager_type, ) +from feast.protos.feast.core.Registry_pb2 import ProjectMetadata as ProjectMetadataProto from feast.protos.feast.registry import RegistryServer_pb2, RegistryServer_pb2_grpc from feast.saved_dataset import SavedDataset, ValidationReference from feast.stream_feature_view import StreamFeatureView @@ -581,6 +583,17 @@ def Refresh(self, request, context): def Proto(self, request, context): return self.proxied_registry.proto() + def SetDecisionStrategy( + self, request: RegistryServer_pb2.SetDecisionStrategyRequest, context + ): + self.proxied_registry.set_decision_strategy( + project=request.project, + decision_strategy=DecisionStrategy[ + ProjectMetadataProto.DecisionStrategy.Name(request.decision_strategy) + ], + ) + return Empty() + def start_server(store: FeatureStore, port: int, wait_for_termination: bool = True): auth_manager_type = str_to_auth_manager_type(store.config.auth_config.type) diff --git a/sdk/python/tests/integration/registration/test_universal_registry.py b/sdk/python/tests/integration/registration/test_universal_registry.py index 199fb8acac..7757e668bc 100644 --- a/sdk/python/tests/integration/registration/test_universal_registry.py +++ b/sdk/python/tests/integration/registration/test_universal_registry.py @@ -347,10 +347,14 @@ def test_apply_entity_success(test_registry): assert len(project_metadata) == 1 project_uuid = project_metadata[0].project_uuid assert len(project_metadata[0].project_uuid) == 36 - assert_project_uuid(project, project_uuid, test_registry) + assert_project_uuid( + project, project_uuid, DecisionStrategy.UNANIMOUS, test_registry + ) entities = test_registry.list_entities(project, tags=entity.tags) - assert_project_uuid(project, project_uuid, test_registry) + assert_project_uuid( + project, project_uuid, DecisionStrategy.UNANIMOUS, test_registry + ) entity = entities[0] assert ( @@ -389,19 +393,23 @@ def test_apply_entity_success(test_registry): ) test_registry.delete_entity("driver_car_id", project) - assert_project_uuid(project, project_uuid, test_registry) + assert_project_uuid( + project, project_uuid, DecisionStrategy.UNANIMOUS, test_registry + ) entities = test_registry.list_entities(project) - assert_project_uuid(project, project_uuid, test_registry) + assert_project_uuid( + project, project_uuid, DecisionStrategy.UNANIMOUS, test_registry + ) assert len(entities) == 0 test_registry.teardown() -def assert_project_uuid(project, project_uuid, test_registry): +def assert_project_uuid(project, project_uuid, decision_strategy, test_registry): project_metadata = test_registry.list_project_metadata(project=project) assert len(project_metadata) == 1 assert project_metadata[0].project_uuid == project_uuid - assert project_metadata[0].decision_strategy == DecisionStrategy.UNANIMOUS + assert project_metadata[0].decision_strategy == decision_strategy @pytest.mark.integration @@ -1374,10 +1382,14 @@ def test_apply_permission_success(test_registry): assert len(project_metadata) == 1 project_uuid = project_metadata[0].project_uuid assert len(project_metadata[0].project_uuid) == 36 - assert_project_uuid(project, project_uuid, test_registry) + assert_project_uuid( + project, project_uuid, DecisionStrategy.UNANIMOUS, test_registry + ) permissions = test_registry.list_permissions(project) - assert_project_uuid(project, project_uuid, test_registry) + assert_project_uuid( + project, project_uuid, DecisionStrategy.UNANIMOUS, test_registry + ) permission = permissions[0] assert ( @@ -1424,7 +1436,9 @@ def test_apply_permission_success(test_registry): test_registry.apply_permission(updated_permission, project) permissions = test_registry.list_permissions(project) - assert_project_uuid(project, project_uuid, test_registry) + assert_project_uuid( + project, project_uuid, DecisionStrategy.UNANIMOUS, test_registry + ) assert len(permissions) == 1 updated_permission = test_registry.get_permission("read_permission", project) @@ -1463,7 +1477,9 @@ def test_apply_permission_success(test_registry): test_registry.apply_permission(updated_permission, project) permissions = test_registry.list_permissions(project) - assert_project_uuid(project, project_uuid, test_registry) + assert_project_uuid( + project, project_uuid, DecisionStrategy.UNANIMOUS, test_registry + ) assert len(permissions) == 1 updated_permission = test_registry.get_permission("read_permission", project) @@ -1485,9 +1501,47 @@ def test_apply_permission_success(test_registry): ) test_registry.delete_permission("read_permission", project) - assert_project_uuid(project, project_uuid, test_registry) + assert_project_uuid( + project, project_uuid, DecisionStrategy.UNANIMOUS, test_registry + ) permissions = test_registry.list_permissions(project) - assert_project_uuid(project, project_uuid, test_registry) + assert_project_uuid( + project, project_uuid, DecisionStrategy.UNANIMOUS, test_registry + ) assert len(permissions) == 0 test_registry.teardown() + + +@pytest.mark.integration +@pytest.mark.parametrize("test_registry", all_fixtures) +def test_set_decision_strategy_success(test_registry): + project = "project" + + entity = Entity( + name="driver_car_id", + description="Car driver id", + tags={"team": "matchmaking"}, + ) + + # Register Entity + test_registry.apply_entity(entity, project) + + project_metadata = test_registry.list_project_metadata(project=project) + assert len(project_metadata) == 1 + project_uuid = project_metadata[0].project_uuid + assert len(project_metadata[0].project_uuid) == 36 + assert_project_uuid( + project, project_uuid, DecisionStrategy.UNANIMOUS, test_registry + ) + + test_registry.set_decision_strategy(project, DecisionStrategy.AFFIRMATIVE) + project_metadata = test_registry.list_project_metadata(project=project) + assert len(project_metadata) == 1 + project_uuid = project_metadata[0].project_uuid + assert len(project_metadata[0].project_uuid) == 36 + assert_project_uuid( + project, project_uuid, DecisionStrategy.AFFIRMATIVE, test_registry + ) + + test_registry.teardown() diff --git a/sdk/python/tests/unit/permissions/auth/server/test_auth_registry_server.py b/sdk/python/tests/unit/permissions/auth/server/test_auth_registry_server.py index 3488197211..af50d48ad4 100644 --- a/sdk/python/tests/unit/permissions/auth/server/test_auth_registry_server.py +++ b/sdk/python/tests/unit/permissions/auth/server/test_auth_registry_server.py @@ -19,7 +19,6 @@ list_permissions_perm, list_sfv_perm, ) -from tests.utils.auth_permissions_util import get_remote_registry_store from tests.utils.http_server import check_port_open # noqa: E402 From 571d9c6e43b2d4a2f02438e5e641471f37443db2 Mon Sep 17 00:00:00 2001 From: Theodor Mihalache Date: Thu, 1 Aug 2024 16:51:12 -0400 Subject: [PATCH 111/169] Fixed DecisionStrategy not persisted - Implemented review comments Signed-off-by: Theodor Mihalache Signed-off-by: Abdul Hameed --- docs/getting-started/concepts/permission.md | 5 ++++ protos/feast/registry/RegistryServer.proto | 10 +++++++- sdk/python/feast/cli_utils.py | 10 ++++---- sdk/python/feast/errors.py | 5 ++++ sdk/python/feast/feature_store.py | 12 ++++++++++ .../feast/infra/registry/base_registry.py | 12 ++++++++++ sdk/python/feast/infra/registry/registry.py | 16 +++++++++++++ sdk/python/feast/infra/registry/remote.py | 11 +++++++++ sdk/python/feast/infra/registry/snowflake.py | 23 +++++++++++++++++++ sdk/python/feast/infra/registry/sql.py | 16 +++++++++++++ sdk/python/feast/permissions/decision.py | 4 ++-- .../feast/permissions/security_manager.py | 4 +--- sdk/python/feast/registry_server.py | 5 ++++ .../registration/test_universal_registry.py | 19 ++++----------- sdk/python/tests/unit/permissions/conftest.py | 2 ++ 15 files changed, 130 insertions(+), 24 deletions(-) diff --git a/docs/getting-started/concepts/permission.md b/docs/getting-started/concepts/permission.md index 71e9efc629..ee25ef973e 100644 --- a/docs/getting-started/concepts/permission.md +++ b/docs/getting-started/concepts/permission.md @@ -42,6 +42,11 @@ The `Permission` class identifies a single permission configured on the feature - `actions`: The actions authorized by this permission. Defaults to `ALL_VALUES`, an alias defined in the `action` module. - `policy`: The policy to be applied to validate a client request. +The `decision strategy` parameter defines the strategy to be applied when multiple permissions match an execution request, it defaults to `UNANIMOUS`. and the possible values are: +- `UNANIMOUS`: All policies must evaluate to a positive decision for the final decision to be also positive. +- `AFFIRMATIVE`: At least one policy must evaluate to a positive decision +- `UNANIMOUS`: The number of positive decisions must be greater than the number of negative decisions. + Given the above definitions, the feature store can be configured with granular control over each resource, enabling partitioned access by teams to meet organizational requirements for service and data sharing, and protection of sensitive information. diff --git a/protos/feast/registry/RegistryServer.proto b/protos/feast/registry/RegistryServer.proto index 6e5ad5c952..d4927be5bf 100644 --- a/protos/feast/registry/RegistryServer.proto +++ b/protos/feast/registry/RegistryServer.proto @@ -75,7 +75,7 @@ service RegistryServer{ rpc Refresh (RefreshRequest) returns (google.protobuf.Empty) {} rpc Proto (google.protobuf.Empty) returns (feast.core.Registry) {} rpc SetDecisionStrategy (SetDecisionStrategyRequest) returns (google.protobuf.Empty) {} - + rpc GetDecisionStrategy (GetDecisionStrategyRequest) returns (GetDecisionStrategyResponse) {} } message RefreshRequest { @@ -363,3 +363,11 @@ message SetDecisionStrategyRequest { string project = 2; bool commit = 3; } + +message GetDecisionStrategyRequest { + string project = 1; +} + +message GetDecisionStrategyResponse { + feast.core.ProjectMetadata.DecisionStrategy decision_strategy = 1; +} diff --git a/sdk/python/feast/cli_utils.py b/sdk/python/feast/cli_utils.py index 8f5b91334d..e5cf6e4340 100644 --- a/sdk/python/feast/cli_utils.py +++ b/sdk/python/feast/cli_utils.py @@ -13,7 +13,7 @@ ) from feast.feast_object import FeastObject from feast.permissions.action import ALL_ACTIONS -from feast.permissions.decision import DecisionEvaluator +from feast.permissions.decision import DecisionEvaluator, DecisionStrategy from feast.permissions.permission import Permission from feast.permissions.policy import Policy, RoleBasedPolicy from feast.permissions.user import User @@ -291,9 +291,7 @@ def handler_list_all_permissions_roles_verbose( if matching_permissions: evaluator = DecisionEvaluator( - store.registry.list_project_metadata(project=store.project)[ - 0 - ].decision_strategy, + get_global_decision_strategy(store), len(matching_permissions), ) for p in matching_permissions: @@ -321,3 +319,7 @@ def handler_list_all_permissions_roles_verbose( [a.value.upper() for a in permitted_actions], ] ) + + +def get_global_decision_strategy(store: FeatureStore) -> DecisionStrategy: + return store.get_decision_strategy(store.project) diff --git a/sdk/python/feast/errors.py b/sdk/python/feast/errors.py index ffafe31125..7be687c752 100644 --- a/sdk/python/feast/errors.py +++ b/sdk/python/feast/errors.py @@ -419,3 +419,8 @@ def __init__(self, query: str): class ZeroColumnQueryResult(Exception): def __init__(self, query: str): super().__init__(f"This query returned zero columns:\n{query}") + + +class DecisionStrategyNotFound(FeastObjectNotFoundException): + def __init__(self, project: str): + super().__init__(f"DecisionStrategy does not exist in project {project}") diff --git a/sdk/python/feast/feature_store.py b/sdk/python/feast/feature_store.py index 7bdae32fff..af3773c2eb 100644 --- a/sdk/python/feast/feature_store.py +++ b/sdk/python/feast/feature_store.py @@ -2017,6 +2017,18 @@ def set_decision_strategy(self, decision_strategy: DecisionStrategy): """ return self._registry.set_decision_strategy(self.project, decision_strategy) + def get_decision_strategy(self, project: str) -> DecisionStrategy: + """ + Get the project decision strategy. + + Args: + project: The project to get the decision strategy for. + + Returns: + The decision strategy or None. + """ + return self._registry.get_decision_strategy(project) + def _print_materialization_log( start_date, end_date, num_feature_views: int, online_store: str diff --git a/sdk/python/feast/infra/registry/base_registry.py b/sdk/python/feast/infra/registry/base_registry.py index 01f090b3fc..2fa59970a9 100644 --- a/sdk/python/feast/infra/registry/base_registry.py +++ b/sdk/python/feast/infra/registry/base_registry.py @@ -824,3 +824,15 @@ def set_decision_strategy(self, project: str, decision_strategy: DecisionStrateg decision_strategy: The decision strategy to set for the project """ raise NotImplementedError + + def get_decision_strategy(self, project: str) -> DecisionStrategy: + """ + Get the project decision strategy. + + Args: + project: The project to get the decision strategy for. + + Returns: + The decision strategy or None. + """ + raise NotImplementedError diff --git a/sdk/python/feast/infra/registry/registry.py b/sdk/python/feast/infra/registry/registry.py index 89703db0c9..16cefb5510 100644 --- a/sdk/python/feast/infra/registry/registry.py +++ b/sdk/python/feast/infra/registry/registry.py @@ -28,6 +28,7 @@ from feast.errors import ( ConflictingFeatureViewNames, DataSourceNotFoundException, + DecisionStrategyNotFound, EntityNotFoundException, FeatureServiceNotFoundException, FeatureViewNotFoundException, @@ -987,3 +988,18 @@ def set_decision_strategy(self, project: str, decision_strategy: DecisionStrateg registry.project_metadata.append(project_metadata) self.commit() + + def get_decision_strategy(self, project: str) -> DecisionStrategy: + registry_proto = self._get_registry_proto(project=project) + + for idx, existing_project_metadata in enumerate( + registry_proto.project_metadata + ): + if existing_project_metadata.project == project: + return DecisionStrategy[ + ProjectMetadataProto.DecisionStrategy.Name( + existing_project_metadata.decision_strategy + ) + ] + + raise DecisionStrategyNotFound(project=project) diff --git a/sdk/python/feast/infra/registry/remote.py b/sdk/python/feast/infra/registry/remote.py index d88d8819b9..0bba7026ff 100644 --- a/sdk/python/feast/infra/registry/remote.py +++ b/sdk/python/feast/infra/registry/remote.py @@ -698,3 +698,14 @@ def set_decision_strategy(self, project: str, decision_strategy: DecisionStrateg self.stub.SetDecisionStrategy(request=request, metadata=metadata) else: self.stub.SetDecisionStrategy(request) + + def get_decision_strategy(self, project: str) -> DecisionStrategy: + request = RegistryServer_pb2.GetDecisionStrategyRequest(project=project) + + if self.auth_config.type is not AuthType.NONE.value: + metadata = create_auth_header(self.auth_config) + response = self.stub.GetDecisionStrategy(request=request, metadata=metadata) + else: + response = self.stub.GetDecisionStrategy(request) + + return DecisionStrategy(response) diff --git a/sdk/python/feast/infra/registry/snowflake.py b/sdk/python/feast/infra/registry/snowflake.py index 808e382c46..46a8ff0ea0 100644 --- a/sdk/python/feast/infra/registry/snowflake.py +++ b/sdk/python/feast/infra/registry/snowflake.py @@ -15,6 +15,7 @@ from feast.entity import Entity from feast.errors import ( DataSourceObjectNotFoundException, + DecisionStrategyNotFound, EntityNotFoundException, FeatureServiceNotFoundException, FeatureViewNotFoundException, @@ -1164,6 +1165,8 @@ def commit(self): pass def set_decision_strategy(self, project: str, decision_strategy: DecisionStrategy): + self._maybe_init_project_metadata(project) + with GetSnowflakeConnection(self.registry_config) as conn: query = f""" UPDATE {self.registry_path}."FEAST_METADATA" @@ -1177,3 +1180,23 @@ def set_decision_strategy(self, project: str, decision_strategy: DecisionStrateg AND metadata_key = '{FeastMetadataKeys.PERMISSIONS_DECISION_STRATEGY.value}', """ execute_snowflake_statement(conn, query) + + def get_decision_strategy(self, project: str) -> DecisionStrategy: + with GetSnowflakeConnection(self.registry_config) as conn: + query = f""" + SELECT + metadata_value + FROM + {self.registry_path}."FEAST_METADATA" + WHERE + project_id = '{project}' + AND metadata_key = '{FeastMetadataKeys.PERMISSIONS_DECISION_STRATEGY.value}' + LIMIT 1 + """ + df = execute_snowflake_statement(conn, query).fetch_pandas_all() + + if not df.empty: + for row in df.iterrows(): + return DecisionStrategy(row[1]["METADATA_VALUE"]) + + raise DecisionStrategyNotFound(project=project) diff --git a/sdk/python/feast/infra/registry/sql.py b/sdk/python/feast/infra/registry/sql.py index 868951c1f3..4c43d0a5a9 100644 --- a/sdk/python/feast/infra/registry/sql.py +++ b/sdk/python/feast/infra/registry/sql.py @@ -27,6 +27,7 @@ from feast.entity import Entity from feast.errors import ( DataSourceObjectNotFoundException, + DecisionStrategyNotFound, EntityNotFoundException, FeatureServiceNotFoundException, FeatureViewNotFoundException, @@ -1004,6 +1005,8 @@ def delete_permission(self, name: str, project: str, commit: bool = True): raise PermissionNotFoundException(name, project) def set_decision_strategy(self, project: str, decision_strategy: DecisionStrategy): + self._maybe_init_project_metadata(project) + with self.engine.begin() as conn: values = { "metadata_key": FeastMetadataKeys.PERMISSIONS_DECISION_STRATEGY.value, @@ -1023,3 +1026,16 @@ def set_decision_strategy(self, project: str, decision_strategy: DecisionStrateg ) conn.execute(update_stmt) + + def get_decision_strategy(self, project: str) -> DecisionStrategy: + with self.engine.begin() as conn: + stmt = select(feast_metadata).where( + feast_metadata.c.metadata_key + == FeastMetadataKeys.PERMISSIONS_DECISION_STRATEGY.value, + feast_metadata.c.project_id == project, + ) + row = conn.execute(stmt).first() + if row: + return DecisionStrategy(row._mapping["metadata_value"]) + + raise DecisionStrategyNotFound(project=project) diff --git a/sdk/python/feast/permissions/decision.py b/sdk/python/feast/permissions/decision.py index 35099e10ed..d5217cb125 100644 --- a/sdk/python/feast/permissions/decision.py +++ b/sdk/python/feast/permissions/decision.py @@ -29,7 +29,7 @@ class DecisionEvaluator: Create the instance and specify the strategy and number of decisions: `evaluator = DecisionEvaluator(DecisionStrategy.UNANIMOUS, 3) - For each vote that you receivem, add a decision grant: `evaluator.add_grant(vote, message)` + For each vote that you receive, add a decision grant: `evaluator.add_grant(vote, message)` and check if the decision process ended: `if evaluator.is_decided():` Once decided, get the result and the failure explanations using: `grant, explanations = evaluator.grant()` @@ -86,7 +86,7 @@ def grant(self) -> tuple[bool, list[str]]: def add_grant(self, grant: bool, explanation: str): """ Add a single vote to the decision computation, with a possible denial reason. - If the evalluation process already ended, additional votes are discarded. + If the evaluation process already ended, additional votes are discarded. Args: grant: `True` is the decision is accepted, `False` otherwise. diff --git a/sdk/python/feast/permissions/security_manager.py b/sdk/python/feast/permissions/security_manager.py index 8a6d2d3581..fc59800f7a 100644 --- a/sdk/python/feast/permissions/security_manager.py +++ b/sdk/python/feast/permissions/security_manager.py @@ -59,9 +59,7 @@ def decision_strategy(self) -> DecisionStrategy: Returns: DecisionStrategy: the DecisionStrategy configured in the Feast registry. """ - return self._registry.list_project_metadata(project=self._project)[ - 0 - ].decision_strategy + return self._registry.get_decision_strategy(project=self._project) def assert_permissions( self, diff --git a/sdk/python/feast/registry_server.py b/sdk/python/feast/registry_server.py index 629581f03f..db5bd02fb0 100644 --- a/sdk/python/feast/registry_server.py +++ b/sdk/python/feast/registry_server.py @@ -594,6 +594,11 @@ def SetDecisionStrategy( ) return Empty() + def GetDecisionStrategy( + self, request: RegistryServer_pb2.GetDecisionStrategyRequest, context + ): + return self.proxied_registry.get_decision_strategy(project=request.project) + def start_server(store: FeatureStore, port: int, wait_for_termination: bool = True): auth_manager_type = str_to_auth_manager_type(store.config.auth_config.type) diff --git a/sdk/python/tests/integration/registration/test_universal_registry.py b/sdk/python/tests/integration/registration/test_universal_registry.py index 7757e668bc..5dd40f9e66 100644 --- a/sdk/python/tests/integration/registration/test_universal_registry.py +++ b/sdk/python/tests/integration/registration/test_universal_registry.py @@ -1527,21 +1527,12 @@ def test_set_decision_strategy_success(test_registry): # Register Entity test_registry.apply_entity(entity, project) - project_metadata = test_registry.list_project_metadata(project=project) - assert len(project_metadata) == 1 - project_uuid = project_metadata[0].project_uuid - assert len(project_metadata[0].project_uuid) == 36 - assert_project_uuid( - project, project_uuid, DecisionStrategy.UNANIMOUS, test_registry - ) + decision_strategy = test_registry.get_decision_strategy(project=project) + assert decision_strategy == DecisionStrategy.UNANIMOUS test_registry.set_decision_strategy(project, DecisionStrategy.AFFIRMATIVE) - project_metadata = test_registry.list_project_metadata(project=project) - assert len(project_metadata) == 1 - project_uuid = project_metadata[0].project_uuid - assert len(project_metadata[0].project_uuid) == 36 - assert_project_uuid( - project, project_uuid, DecisionStrategy.AFFIRMATIVE, test_registry - ) + + decision_strategy = test_registry.get_decision_strategy(project=project) + assert decision_strategy == DecisionStrategy.AFFIRMATIVE test_registry.teardown() diff --git a/sdk/python/tests/unit/permissions/conftest.py b/sdk/python/tests/unit/permissions/conftest.py index 75117fc78c..d40d29e1af 100644 --- a/sdk/python/tests/unit/permissions/conftest.py +++ b/sdk/python/tests/unit/permissions/conftest.py @@ -4,6 +4,7 @@ from feast import FeatureView from feast.infra.registry.base_registry import BaseRegistry +from feast.permissions.decision import DecisionStrategy from feast.permissions.decorator import require_permissions from feast.permissions.permission import AuthzedAction, Permission from feast.permissions.policy import RoleBasedPolicy @@ -89,6 +90,7 @@ def security_manager() -> SecurityManager: registry = Mock(spec=BaseRegistry) registry.list_permissions = Mock(return_value=permissions) registry.list_project_metadata = Mock(return_value=[project_metadata]) + registry.get_decision_strategy = Mock(return_value=DecisionStrategy.UNANIMOUS) sm = SecurityManager(project="any", registry=registry) set_security_manager(sm) return sm From de34a11cc77acd6ccfa25ff1f1e336d16374b88c Mon Sep 17 00:00:00 2001 From: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Date: Fri, 2 Aug 2024 17:41:29 +0200 Subject: [PATCH 112/169] Revert "Fix decision strategy not saved" Signed-off-by: Abdul Hameed --- docs/getting-started/concepts/permission.md | 5 -- protos/feast/core/Registry.proto | 9 -- protos/feast/registry/RegistryServer.proto | 17 +--- sdk/python/feast/cli.py | 7 +- sdk/python/feast/cli_utils.py | 13 +-- sdk/python/feast/errors.py | 5 -- sdk/python/feast/feature_store.py | 22 ----- .../feast/infra/registry/base_registry.py | 24 ------ sdk/python/feast/infra/registry/registry.py | 37 --------- sdk/python/feast/infra/registry/remote.py | 28 ------- sdk/python/feast/infra/registry/snowflake.py | 51 +----------- sdk/python/feast/infra/registry/sql.py | 67 ++------------- sdk/python/feast/permissions/decision.py | 4 +- sdk/python/feast/permissions/enforcer.py | 8 +- sdk/python/feast/permissions/permission.py | 17 ++++ .../feast/permissions/security_manager.py | 10 --- sdk/python/feast/project_metadata.py | 19 +---- sdk/python/feast/registry_server.py | 18 ---- .../registration/test_universal_registry.py | 83 ++++--------------- sdk/python/tests/unit/permissions/conftest.py | 5 -- .../tests/unit/permissions/test_permission.py | 13 +++ .../unit/permissions/test_security_manager.py | 7 ++ setup.py | 2 + 23 files changed, 81 insertions(+), 390 deletions(-) diff --git a/docs/getting-started/concepts/permission.md b/docs/getting-started/concepts/permission.md index ee25ef973e..71e9efc629 100644 --- a/docs/getting-started/concepts/permission.md +++ b/docs/getting-started/concepts/permission.md @@ -42,11 +42,6 @@ The `Permission` class identifies a single permission configured on the feature - `actions`: The actions authorized by this permission. Defaults to `ALL_VALUES`, an alias defined in the `action` module. - `policy`: The policy to be applied to validate a client request. -The `decision strategy` parameter defines the strategy to be applied when multiple permissions match an execution request, it defaults to `UNANIMOUS`. and the possible values are: -- `UNANIMOUS`: All policies must evaluate to a positive decision for the final decision to be also positive. -- `AFFIRMATIVE`: At least one policy must evaluate to a positive decision -- `UNANIMOUS`: The number of positive decisions must be greater than the number of negative decisions. - Given the above definitions, the feature store can be configured with granular control over each resource, enabling partitioned access by teams to meet organizational requirements for service and data sharing, and protection of sensitive information. diff --git a/protos/feast/core/Registry.proto b/protos/feast/core/Registry.proto index 8f434ef76a..b4f1ffb0a3 100644 --- a/protos/feast/core/Registry.proto +++ b/protos/feast/core/Registry.proto @@ -56,15 +56,6 @@ message Registry { } message ProjectMetadata { - enum DecisionStrategy{ - UNANIMOUS = 0; - AFFIRMATIVE = 1; - CONSENSUS = 2; - } - string project = 1; string project_uuid = 2; - DecisionStrategy decision_strategy = 3; } - - diff --git a/protos/feast/registry/RegistryServer.proto b/protos/feast/registry/RegistryServer.proto index d4927be5bf..928354077b 100644 --- a/protos/feast/registry/RegistryServer.proto +++ b/protos/feast/registry/RegistryServer.proto @@ -74,8 +74,7 @@ service RegistryServer{ rpc Commit (google.protobuf.Empty) returns (google.protobuf.Empty) {} rpc Refresh (RefreshRequest) returns (google.protobuf.Empty) {} rpc Proto (google.protobuf.Empty) returns (feast.core.Registry) {} - rpc SetDecisionStrategy (SetDecisionStrategyRequest) returns (google.protobuf.Empty) {} - rpc GetDecisionStrategy (GetDecisionStrategyRequest) returns (GetDecisionStrategyResponse) {} + } message RefreshRequest { @@ -357,17 +356,3 @@ message DeletePermissionRequest { string project = 2; bool commit = 3; } - -message SetDecisionStrategyRequest { - feast.core.ProjectMetadata.DecisionStrategy decision_strategy = 1; - string project = 2; - bool commit = 3; -} - -message GetDecisionStrategyRequest { - string project = 1; -} - -message GetDecisionStrategyResponse { - feast.core.ProjectMetadata.DecisionStrategy decision_strategy = 1; -} diff --git a/sdk/python/feast/cli.py b/sdk/python/feast/cli.py index b0a701d49c..b5e3dcc37c 100644 --- a/sdk/python/feast/cli.py +++ b/sdk/python/feast/cli.py @@ -36,6 +36,7 @@ from feast.errors import FeastObjectNotFoundException, FeastProviderLoginError from feast.feature_view import FeatureView from feast.on_demand_feature_view import OnDemandFeatureView +from feast.permissions.permission import Permission from feast.permissions.policy import RoleBasedPolicy from feast.repo_config import load_repo_config from feast.repo_operations import ( @@ -998,7 +999,7 @@ def feast_permissions_list_command(ctx: click.Context, verbose: bool, tags: list ) ) print( - f"{Style.BRIGHT}Note:{Style.RESET_ALL}The configured decision strategy is {store.registry.list_project_metadata(project=store.project)[0].decision_strategy.value.upper()}" + f"{Style.BRIGHT}Note:{Style.RESET_ALL}The configured decision strategy is {Permission.get_global_decision_strategy().value.upper()}" ) else: cli_utils.print_permission_verbose_example() @@ -1119,7 +1120,7 @@ def feast_permissions_list_roles_command(ctx: click.Context, verbose: bool): store=store, ) cli_utils.handler_list_all_permissions_roles_verbose( - store=store, objects=objects, permissions=permissions, table=table + objects=objects, permissions=permissions, table=table ) print( tabulate( @@ -1135,7 +1136,7 @@ def feast_permissions_list_roles_command(ctx: click.Context, verbose: bool): ) print( - f"{Style.BRIGHT}Note:{Style.RESET_ALL}The configured decision strategy is {store.registry.list_project_metadata(project=store.project)[0].decision_strategy.value.upper()}" + f"{Style.BRIGHT}Note:{Style.RESET_ALL}The configured decision strategy is {Permission.get_global_decision_strategy().value.upper()}" ) diff --git a/sdk/python/feast/cli_utils.py b/sdk/python/feast/cli_utils.py index e5cf6e4340..5155eb814f 100644 --- a/sdk/python/feast/cli_utils.py +++ b/sdk/python/feast/cli_utils.py @@ -13,7 +13,7 @@ ) from feast.feast_object import FeastObject from feast.permissions.action import ALL_ACTIONS -from feast.permissions.decision import DecisionEvaluator, DecisionStrategy +from feast.permissions.decision import DecisionEvaluator from feast.permissions.permission import Permission from feast.permissions.policy import Policy, RoleBasedPolicy from feast.permissions.user import User @@ -271,10 +271,7 @@ def handler_list_all_permissions_roles(permissions: list[Permission], table: lis def handler_list_all_permissions_roles_verbose( - store: FeatureStore, - objects: list[FeastObject], - permissions: list[Permission], - table: list[Any], + objects: list[FeastObject], permissions: list[Permission], table: list[Any] ): all_roles = fetch_all_permission_roles(permissions) @@ -291,7 +288,7 @@ def handler_list_all_permissions_roles_verbose( if matching_permissions: evaluator = DecisionEvaluator( - get_global_decision_strategy(store), + Permission.get_global_decision_strategy(), len(matching_permissions), ) for p in matching_permissions: @@ -319,7 +316,3 @@ def handler_list_all_permissions_roles_verbose( [a.value.upper() for a in permitted_actions], ] ) - - -def get_global_decision_strategy(store: FeatureStore) -> DecisionStrategy: - return store.get_decision_strategy(store.project) diff --git a/sdk/python/feast/errors.py b/sdk/python/feast/errors.py index 7be687c752..ffafe31125 100644 --- a/sdk/python/feast/errors.py +++ b/sdk/python/feast/errors.py @@ -419,8 +419,3 @@ def __init__(self, query: str): class ZeroColumnQueryResult(Exception): def __init__(self, query: str): super().__init__(f"This query returned zero columns:\n{query}") - - -class DecisionStrategyNotFound(FeastObjectNotFoundException): - def __init__(self, project: str): - super().__init__(f"DecisionStrategy does not exist in project {project}") diff --git a/sdk/python/feast/feature_store.py b/sdk/python/feast/feature_store.py index af3773c2eb..a03706e56f 100644 --- a/sdk/python/feast/feature_store.py +++ b/sdk/python/feast/feature_store.py @@ -76,7 +76,6 @@ from feast.infra.registry.sql import SqlRegistry from feast.on_demand_feature_view import OnDemandFeatureView from feast.online_response import OnlineResponse -from feast.permissions.decision import DecisionStrategy from feast.permissions.permission import Permission from feast.protos.feast.core.InfraObject_pb2 import Infra as InfraProto from feast.protos.feast.serving.ServingService_pb2 import ( @@ -2008,27 +2007,6 @@ def list_saved_datasets( self.project, allow_cache=allow_cache, tags=tags ) - def set_decision_strategy(self, decision_strategy: DecisionStrategy): - """ - Set the project decision strategy. - - Args: - decision_strategy: The decision strategy to set to. - """ - return self._registry.set_decision_strategy(self.project, decision_strategy) - - def get_decision_strategy(self, project: str) -> DecisionStrategy: - """ - Get the project decision strategy. - - Args: - project: The project to get the decision strategy for. - - Returns: - The decision strategy or None. - """ - return self._registry.get_decision_strategy(project) - def _print_materialization_log( start_date, end_date, num_feature_views: int, online_store: str diff --git a/sdk/python/feast/infra/registry/base_registry.py b/sdk/python/feast/infra/registry/base_registry.py index 2fa59970a9..5ba9cbedb9 100644 --- a/sdk/python/feast/infra/registry/base_registry.py +++ b/sdk/python/feast/infra/registry/base_registry.py @@ -28,7 +28,6 @@ from feast.feature_view import FeatureView from feast.infra.infra_object import Infra from feast.on_demand_feature_view import OnDemandFeatureView -from feast.permissions.decision import DecisionStrategy from feast.permissions.permission import Permission from feast.project_metadata import ProjectMetadata from feast.protos.feast.core.Entity_pb2 import Entity as EntityProto @@ -813,26 +812,3 @@ def deserialize_registry_values(serialized_proto, feast_obj_type) -> Any: if feast_obj_type == FeatureService: return FeatureServiceProto.FromString(serialized_proto) return None - - @abstractmethod - def set_decision_strategy(self, project: str, decision_strategy: DecisionStrategy): - """ - Set the project decision strategy. - - Args: - project: Feast project to set the decision strategy for - decision_strategy: The decision strategy to set for the project - """ - raise NotImplementedError - - def get_decision_strategy(self, project: str) -> DecisionStrategy: - """ - Get the project decision strategy. - - Args: - project: The project to get the decision strategy for. - - Returns: - The decision strategy or None. - """ - raise NotImplementedError diff --git a/sdk/python/feast/infra/registry/registry.py b/sdk/python/feast/infra/registry/registry.py index 16cefb5510..fa9d436400 100644 --- a/sdk/python/feast/infra/registry/registry.py +++ b/sdk/python/feast/infra/registry/registry.py @@ -28,7 +28,6 @@ from feast.errors import ( ConflictingFeatureViewNames, DataSourceNotFoundException, - DecisionStrategyNotFound, EntityNotFoundException, FeatureServiceNotFoundException, FeatureViewNotFoundException, @@ -44,10 +43,8 @@ from feast.infra.registry.registry_store import NoopRegistryStore from feast.on_demand_feature_view import OnDemandFeatureView from feast.permissions.auth_model import AuthConfig, NoAuthConfig -from feast.permissions.decision import DecisionStrategy from feast.permissions.permission import Permission from feast.project_metadata import ProjectMetadata -from feast.protos.feast.core.Registry_pb2 import ProjectMetadata as ProjectMetadataProto from feast.protos.feast.core.Registry_pb2 import Registry as RegistryProto from feast.repo_config import RegistryConfig from feast.repo_contents import RepoContents @@ -969,37 +966,3 @@ def delete_permission(self, name: str, project: str, commit: bool = True): self.commit() return raise PermissionNotFoundException(name, project) - - def set_decision_strategy(self, project: str, decision_strategy: DecisionStrategy): - registry = self._prepare_registry_for_changes(project) - - project_metadata = None - for idx, existing_project_metadata in enumerate(registry.project_metadata): - if existing_project_metadata.project == project: - del registry.project_metadata[idx] - project_metadata = existing_project_metadata - break - - if project_metadata: - project_metadata.decision_strategy = ( - ProjectMetadataProto.DecisionStrategy.Value(decision_strategy.name) - ) - - registry.project_metadata.append(project_metadata) - - self.commit() - - def get_decision_strategy(self, project: str) -> DecisionStrategy: - registry_proto = self._get_registry_proto(project=project) - - for idx, existing_project_metadata in enumerate( - registry_proto.project_metadata - ): - if existing_project_metadata.project == project: - return DecisionStrategy[ - ProjectMetadataProto.DecisionStrategy.Name( - existing_project_metadata.decision_strategy - ) - ] - - raise DecisionStrategyNotFound(project=project) diff --git a/sdk/python/feast/infra/registry/remote.py b/sdk/python/feast/infra/registry/remote.py index 0bba7026ff..70c2af4c40 100644 --- a/sdk/python/feast/infra/registry/remote.py +++ b/sdk/python/feast/infra/registry/remote.py @@ -23,10 +23,8 @@ from feast.permissions.client.utils import ( create_auth_header, ) -from feast.permissions.decision import DecisionStrategy from feast.permissions.permission import Permission from feast.project_metadata import ProjectMetadata -from feast.protos.feast.core.Registry_pb2 import ProjectMetadata as ProjectMetadataProto from feast.protos.feast.core.Registry_pb2 import Registry as RegistryProto from feast.protos.feast.registry import RegistryServer_pb2, RegistryServer_pb2_grpc from feast.repo_config import RegistryConfig @@ -683,29 +681,3 @@ def refresh(self, project: Optional[str] = None): def teardown(self): pass - - def set_decision_strategy(self, project: str, decision_strategy: DecisionStrategy): - decision_strategy_proto = ProjectMetadataProto.DecisionStrategy.Value( - decision_strategy.name - ) - - request = RegistryServer_pb2.SetDecisionStrategyRequest( - decision_strategy=decision_strategy_proto, project=project - ) - - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_auth_header(self.auth_config) - self.stub.SetDecisionStrategy(request=request, metadata=metadata) - else: - self.stub.SetDecisionStrategy(request) - - def get_decision_strategy(self, project: str) -> DecisionStrategy: - request = RegistryServer_pb2.GetDecisionStrategyRequest(project=project) - - if self.auth_config.type is not AuthType.NONE.value: - metadata = create_auth_header(self.auth_config) - response = self.stub.GetDecisionStrategy(request=request, metadata=metadata) - else: - response = self.stub.GetDecisionStrategy(request) - - return DecisionStrategy(response) diff --git a/sdk/python/feast/infra/registry/snowflake.py b/sdk/python/feast/infra/registry/snowflake.py index 46a8ff0ea0..801b90afe3 100644 --- a/sdk/python/feast/infra/registry/snowflake.py +++ b/sdk/python/feast/infra/registry/snowflake.py @@ -15,7 +15,6 @@ from feast.entity import Entity from feast.errors import ( DataSourceObjectNotFoundException, - DecisionStrategyNotFound, EntityNotFoundException, FeatureServiceNotFoundException, FeatureViewNotFoundException, @@ -33,7 +32,6 @@ execute_snowflake_statement, ) from feast.on_demand_feature_view import OnDemandFeatureView -from feast.permissions.decision import DecisionStrategy from feast.permissions.permission import Permission from feast.project_metadata import ProjectMetadata from feast.protos.feast.core.DataSource_pb2 import DataSource as DataSourceProto @@ -66,7 +64,6 @@ class FeastMetadataKeys(Enum): LAST_UPDATED_TIMESTAMP = "last_updated_timestamp" PROJECT_UUID = "project_uuid" - PERMISSIONS_DECISION_STRATEGY = "permissions_decision_strategy" class SnowflakeRegistryConfig(RegistryConfig): @@ -926,13 +923,7 @@ def list_project_metadata( for row in df.iterrows(): if row[1]["METADATA_KEY"] == FeastMetadataKeys.PROJECT_UUID.value: project_metadata.project_uuid = row[1]["METADATA_VALUE"] - elif ( - row[1]["METADATA_KEY"] - == FeastMetadataKeys.PERMISSIONS_DECISION_STRATEGY.value - ): - project_metadata.decision_strategy = DecisionStrategy( - row[1]["METADATA_VALUE"] - ) + break # TODO(adchia): Add other project metadata in a structured way return [project_metadata] return [] @@ -1119,8 +1110,7 @@ def _maybe_init_project_metadata(self, project): query = f""" INSERT INTO {self.registry_path}."FEAST_METADATA" VALUES - ('{project}', '{FeastMetadataKeys.PROJECT_UUID.value}', '{new_project_uuid}', CURRENT_TIMESTAMP()), - ('{project}', '{FeastMetadataKeys.PERMISSIONS_DECISION_STRATEGY.value}', '{DecisionStrategy.UNANIMOUS.value}', CURRENT_TIMESTAMP()) + ('{project}', '{FeastMetadataKeys.PROJECT_UUID.value}', '{new_project_uuid}', CURRENT_TIMESTAMP()) """ execute_snowflake_statement(conn, query) @@ -1163,40 +1153,3 @@ def _set_last_updated_metadata(self, last_updated: datetime, project: str): def commit(self): pass - - def set_decision_strategy(self, project: str, decision_strategy: DecisionStrategy): - self._maybe_init_project_metadata(project) - - with GetSnowflakeConnection(self.registry_config) as conn: - query = f""" - UPDATE {self.registry_path}."FEAST_METADATA" - SET - project_id = '{project}', - metadata_key = '{FeastMetadataKeys.PERMISSIONS_DECISION_STRATEGY.value}', - metadata_value = '{decision_strategy.value}', - last_updated_timestamp = CURRENT_TIMESTAMP() - WHERE - project_id = '{project}' - AND metadata_key = '{FeastMetadataKeys.PERMISSIONS_DECISION_STRATEGY.value}', - """ - execute_snowflake_statement(conn, query) - - def get_decision_strategy(self, project: str) -> DecisionStrategy: - with GetSnowflakeConnection(self.registry_config) as conn: - query = f""" - SELECT - metadata_value - FROM - {self.registry_path}."FEAST_METADATA" - WHERE - project_id = '{project}' - AND metadata_key = '{FeastMetadataKeys.PERMISSIONS_DECISION_STRATEGY.value}' - LIMIT 1 - """ - df = execute_snowflake_statement(conn, query).fetch_pandas_all() - - if not df.empty: - for row in df.iterrows(): - return DecisionStrategy(row[1]["METADATA_VALUE"]) - - raise DecisionStrategyNotFound(project=project) diff --git a/sdk/python/feast/infra/registry/sql.py b/sdk/python/feast/infra/registry/sql.py index 4c43d0a5a9..cd6d2e2bb3 100644 --- a/sdk/python/feast/infra/registry/sql.py +++ b/sdk/python/feast/infra/registry/sql.py @@ -27,7 +27,6 @@ from feast.entity import Entity from feast.errors import ( DataSourceObjectNotFoundException, - DecisionStrategyNotFound, EntityNotFoundException, FeatureServiceNotFoundException, FeatureViewNotFoundException, @@ -40,7 +39,6 @@ from feast.infra.infra_object import Infra from feast.infra.registry.caching_registry import CachingRegistry from feast.on_demand_feature_view import OnDemandFeatureView -from feast.permissions.decision import DecisionStrategy from feast.permissions.permission import Permission from feast.project_metadata import ProjectMetadata from feast.protos.feast.core.DataSource_pb2 import DataSource as DataSourceProto @@ -167,7 +165,6 @@ class FeastMetadataKeys(Enum): LAST_UPDATED_TIMESTAMP = "last_updated_timestamp" PROJECT_UUID = "project_uuid" - PERMISSIONS_DECISION_STRATEGY = "permissions_decision_strategy" feast_metadata = Table( @@ -504,13 +501,7 @@ def _list_project_metadata(self, project: str) -> List[ProjectMetadata]: == FeastMetadataKeys.PROJECT_UUID.value ): project_metadata.project_uuid = row._mapping["metadata_value"] - elif ( - row._mapping["metadata_key"] - == FeastMetadataKeys.PERMISSIONS_DECISION_STRATEGY.value - ): - project_metadata.decision_strategy = DecisionStrategy( - row._mapping["metadata_value"] - ) + break # TODO(adchia): Add other project metadata in a structured way return [project_metadata] return [] @@ -811,20 +802,12 @@ def _maybe_init_project_metadata(self, project): row = conn.execute(stmt).first() if not row: new_project_uuid = f"{uuid.uuid4()}" - values = [ - { - "metadata_key": FeastMetadataKeys.PROJECT_UUID.value, - "metadata_value": new_project_uuid, - "last_updated_timestamp": update_time, - "project_id": project, - }, - { - "metadata_key": FeastMetadataKeys.PERMISSIONS_DECISION_STRATEGY.value, - "metadata_value": DecisionStrategy.UNANIMOUS.value, - "last_updated_timestamp": update_time, - "project_id": project, - }, - ] + values = { + "metadata_key": FeastMetadataKeys.PROJECT_UUID.value, + "metadata_value": new_project_uuid, + "last_updated_timestamp": update_time, + "project_id": project, + } insert_stmt = insert(feast_metadata).values(values) conn.execute(insert_stmt) @@ -1003,39 +986,3 @@ def delete_permission(self, name: str, project: str, commit: bool = True): rows = conn.execute(stmt) if rows.rowcount < 1: raise PermissionNotFoundException(name, project) - - def set_decision_strategy(self, project: str, decision_strategy: DecisionStrategy): - self._maybe_init_project_metadata(project) - - with self.engine.begin() as conn: - values = { - "metadata_key": FeastMetadataKeys.PERMISSIONS_DECISION_STRATEGY.value, - "metadata_value": f"{decision_strategy.value}", - "last_updated_timestamp": int(_utc_now().timestamp()), - "project_id": project, - } - - update_stmt = ( - update(feast_metadata) - .where( - feast_metadata.c.metadata_key - == FeastMetadataKeys.PERMISSIONS_DECISION_STRATEGY.value, - feast_metadata.c.project_id == project, - ) - .values(values) - ) - - conn.execute(update_stmt) - - def get_decision_strategy(self, project: str) -> DecisionStrategy: - with self.engine.begin() as conn: - stmt = select(feast_metadata).where( - feast_metadata.c.metadata_key - == FeastMetadataKeys.PERMISSIONS_DECISION_STRATEGY.value, - feast_metadata.c.project_id == project, - ) - row = conn.execute(stmt).first() - if row: - return DecisionStrategy(row._mapping["metadata_value"]) - - raise DecisionStrategyNotFound(project=project) diff --git a/sdk/python/feast/permissions/decision.py b/sdk/python/feast/permissions/decision.py index d5217cb125..35099e10ed 100644 --- a/sdk/python/feast/permissions/decision.py +++ b/sdk/python/feast/permissions/decision.py @@ -29,7 +29,7 @@ class DecisionEvaluator: Create the instance and specify the strategy and number of decisions: `evaluator = DecisionEvaluator(DecisionStrategy.UNANIMOUS, 3) - For each vote that you receive, add a decision grant: `evaluator.add_grant(vote, message)` + For each vote that you receivem, add a decision grant: `evaluator.add_grant(vote, message)` and check if the decision process ended: `if evaluator.is_decided():` Once decided, get the result and the failure explanations using: `grant, explanations = evaluator.grant()` @@ -86,7 +86,7 @@ def grant(self) -> tuple[bool, list[str]]: def add_grant(self, grant: bool, explanation: str): """ Add a single vote to the decision computation, with a possible denial reason. - If the evaluation process already ended, additional votes are discarded. + If the evalluation process already ended, additional votes are discarded. Args: grant: `True` is the decision is accepted, `False` otherwise. diff --git a/sdk/python/feast/permissions/enforcer.py b/sdk/python/feast/permissions/enforcer.py index 5f1dd7f908..11db7bace0 100644 --- a/sdk/python/feast/permissions/enforcer.py +++ b/sdk/python/feast/permissions/enforcer.py @@ -1,7 +1,7 @@ import logging from feast.feast_object import FeastObject -from feast.permissions.decision import DecisionEvaluator, DecisionStrategy +from feast.permissions.decision import DecisionEvaluator from feast.permissions.permission import ( AuthzedAction, Permission, @@ -16,7 +16,6 @@ def enforce_policy( user: User, resources: list[FeastObject], actions: list[AuthzedAction], - decision_strategy: DecisionStrategy, filter_only: bool = False, ) -> list[FeastObject]: """ @@ -30,7 +29,6 @@ def enforce_policy( user: The current user. resources: The resources for which we need to enforce authorized permission. actions: The requested actions to be authorized. - decision_strategy: The decision strategy to be applied when multiple permissions match an execution request. filter_only: If `True`, it removes unauthorized resources from the returned value, otherwise it raises a `PermissionError` the first unauthorized resource. Defaults to `False`. @@ -55,7 +53,9 @@ def enforce_policy( ] if matching_permissions: - evaluator = DecisionEvaluator(decision_strategy, len(matching_permissions)) + evaluator = DecisionEvaluator( + Permission.get_global_decision_strategy(), len(matching_permissions) + ) for p in matching_permissions: permission_grant, permission_explanation = p.policy.validate_user( user=user diff --git a/sdk/python/feast/permissions/permission.py b/sdk/python/feast/permissions/permission.py index cb2e1250f5..ec7e86b6cf 100644 --- a/sdk/python/feast/permissions/permission.py +++ b/sdk/python/feast/permissions/permission.py @@ -7,6 +7,7 @@ from feast.importer import import_class from feast.permissions.action import ALL_ACTIONS, AuthzedAction +from feast.permissions.decision import DecisionStrategy from feast.permissions.matcher import actions_match_config, resource_match_config from feast.permissions.policy import AllowAll, Policy from feast.protos.feast.core.Permission_pb2 import Permission as PermissionProto @@ -101,6 +102,22 @@ def __hash__(self): def __str__(self): return str(MessageToJson(self.to_proto())) + _global_decision_strategy: DecisionStrategy = DecisionStrategy.UNANIMOUS + + @staticmethod + def get_global_decision_strategy() -> DecisionStrategy: + """ + The global decision strategy to be applied when multiple permissions match an execution request. + """ + return Permission._global_decision_strategy + + @staticmethod + def set_global_decision_strategy(global_decision_strategy: DecisionStrategy): + """ + Define the global decision strategy to be applied when multiple permissions match an execution request. + """ + Permission._global_decision_strategy = global_decision_strategy + @property def name(self) -> str: return self._name diff --git a/sdk/python/feast/permissions/security_manager.py b/sdk/python/feast/permissions/security_manager.py index fc59800f7a..178db6e6e9 100644 --- a/sdk/python/feast/permissions/security_manager.py +++ b/sdk/python/feast/permissions/security_manager.py @@ -5,7 +5,6 @@ from feast.feast_object import FeastObject from feast.infra.registry.base_registry import BaseRegistry from feast.permissions.action import AuthzedAction -from feast.permissions.decision import DecisionStrategy from feast.permissions.enforcer import enforce_policy from feast.permissions.permission import Permission from feast.permissions.user import User @@ -53,14 +52,6 @@ def permissions(self) -> list[Permission]: """ return self._registry.list_permissions(project=self._project) - @property - def decision_strategy(self) -> DecisionStrategy: - """ - Returns: - DecisionStrategy: the DecisionStrategy configured in the Feast registry. - """ - return self._registry.get_decision_strategy(project=self._project) - def assert_permissions( self, resources: list[FeastObject], @@ -89,7 +80,6 @@ def assert_permissions( user=self.current_user if self.current_user is not None else User("", []), resources=resources, actions=actions if isinstance(actions, list) else [actions], - decision_strategy=self.decision_strategy, filter_only=filter_only, ) diff --git a/sdk/python/feast/project_metadata.py b/sdk/python/feast/project_metadata.py index ad4f622c82..64488a0362 100644 --- a/sdk/python/feast/project_metadata.py +++ b/sdk/python/feast/project_metadata.py @@ -17,7 +17,6 @@ from google.protobuf.json_format import MessageToJson from typeguard import typechecked -from feast.permissions.decision import DecisionStrategy from feast.protos.feast.core.Registry_pb2 import ProjectMetadata as ProjectMetadataProto @@ -33,14 +32,12 @@ class ProjectMetadata: project_name: str project_uuid: str - decision_strategy: DecisionStrategy def __init__( self, *args, project_name: Optional[str] = None, project_uuid: Optional[str] = None, - decision_strategy: Optional[DecisionStrategy] = None, ): """ Creates an Project metadata object. @@ -48,7 +45,6 @@ def __init__( Args: project_name: The registry-scoped unique name of the project. project_uuid: The UUID for this project - decision_strategy: The projects decision strategy to be applied when multiple permissions match an execution request. Raises: ValueError: Parameters are specified incorrectly. @@ -58,10 +54,9 @@ def __init__( self.project_name = project_name self.project_uuid = project_uuid or f"{uuid.uuid4()}" - self.decision_strategy = decision_strategy or DecisionStrategy.UNANIMOUS def __hash__(self) -> int: - return hash((self.project_name, self.project_uuid, self.decision_strategy)) + return hash((self.project_name, self.project_uuid)) def __eq__(self, other): if not isinstance(other, ProjectMetadata): @@ -72,7 +67,6 @@ def __eq__(self, other): if ( self.project_name != other.project_name or self.project_uuid != other.project_uuid - or self.decision_strategy != other.decision_strategy ): return False @@ -98,11 +92,6 @@ def from_proto(cls, project_metadata_proto: ProjectMetadataProto): entity = cls( project_name=project_metadata_proto.project, project_uuid=project_metadata_proto.project_uuid, - decision_strategy=DecisionStrategy[ - ProjectMetadataProto.DecisionStrategy.Name( - project_metadata_proto.decision_strategy - ) - ], ) return entity @@ -116,9 +105,5 @@ def to_proto(self) -> ProjectMetadataProto: """ return ProjectMetadataProto( - project=self.project_name, - project_uuid=self.project_uuid, - decision_strategy=ProjectMetadataProto.DecisionStrategy.Value( - self.decision_strategy.name - ), + project=self.project_name, project_uuid=self.project_uuid ) diff --git a/sdk/python/feast/registry_server.py b/sdk/python/feast/registry_server.py index db5bd02fb0..7b88a29c41 100644 --- a/sdk/python/feast/registry_server.py +++ b/sdk/python/feast/registry_server.py @@ -15,7 +15,6 @@ from feast.infra.registry.base_registry import BaseRegistry from feast.on_demand_feature_view import OnDemandFeatureView from feast.permissions.action import CRUD, AuthzedAction -from feast.permissions.decision import DecisionStrategy from feast.permissions.permission import Permission from feast.permissions.security_manager import assert_permissions, permitted_resources from feast.permissions.server.grpc import grpc_interceptors @@ -25,7 +24,6 @@ init_security_manager, str_to_auth_manager_type, ) -from feast.protos.feast.core.Registry_pb2 import ProjectMetadata as ProjectMetadataProto from feast.protos.feast.registry import RegistryServer_pb2, RegistryServer_pb2_grpc from feast.saved_dataset import SavedDataset, ValidationReference from feast.stream_feature_view import StreamFeatureView @@ -583,22 +581,6 @@ def Refresh(self, request, context): def Proto(self, request, context): return self.proxied_registry.proto() - def SetDecisionStrategy( - self, request: RegistryServer_pb2.SetDecisionStrategyRequest, context - ): - self.proxied_registry.set_decision_strategy( - project=request.project, - decision_strategy=DecisionStrategy[ - ProjectMetadataProto.DecisionStrategy.Name(request.decision_strategy) - ], - ) - return Empty() - - def GetDecisionStrategy( - self, request: RegistryServer_pb2.GetDecisionStrategyRequest, context - ): - return self.proxied_registry.get_decision_strategy(project=request.project) - def start_server(store: FeatureStore, port: int, wait_for_termination: bool = True): auth_manager_type = str_to_auth_manager_type(store.config.auth_config.type) diff --git a/sdk/python/tests/integration/registration/test_universal_registry.py b/sdk/python/tests/integration/registration/test_universal_registry.py index 5dd40f9e66..09e2f9744e 100644 --- a/sdk/python/tests/integration/registration/test_universal_registry.py +++ b/sdk/python/tests/integration/registration/test_universal_registry.py @@ -41,7 +41,6 @@ from feast.infra.registry.sql import SqlRegistry from feast.on_demand_feature_view import on_demand_feature_view from feast.permissions.action import AuthzedAction -from feast.permissions.decision import DecisionStrategy from feast.permissions.permission import Permission from feast.permissions.policy import RoleBasedPolicy from feast.protos.feast.registry import RegistryServer_pb2, RegistryServer_pb2_grpc @@ -347,14 +346,10 @@ def test_apply_entity_success(test_registry): assert len(project_metadata) == 1 project_uuid = project_metadata[0].project_uuid assert len(project_metadata[0].project_uuid) == 36 - assert_project_uuid( - project, project_uuid, DecisionStrategy.UNANIMOUS, test_registry - ) + assert_project_uuid(project, project_uuid, test_registry) entities = test_registry.list_entities(project, tags=entity.tags) - assert_project_uuid( - project, project_uuid, DecisionStrategy.UNANIMOUS, test_registry - ) + assert_project_uuid(project, project_uuid, test_registry) entity = entities[0] assert ( @@ -393,23 +388,18 @@ def test_apply_entity_success(test_registry): ) test_registry.delete_entity("driver_car_id", project) - assert_project_uuid( - project, project_uuid, DecisionStrategy.UNANIMOUS, test_registry - ) + assert_project_uuid(project, project_uuid, test_registry) entities = test_registry.list_entities(project) - assert_project_uuid( - project, project_uuid, DecisionStrategy.UNANIMOUS, test_registry - ) + assert_project_uuid(project, project_uuid, test_registry) assert len(entities) == 0 test_registry.teardown() -def assert_project_uuid(project, project_uuid, decision_strategy, test_registry): +def assert_project_uuid(project, project_uuid, test_registry): project_metadata = test_registry.list_project_metadata(project=project) assert len(project_metadata) == 1 assert project_metadata[0].project_uuid == project_uuid - assert project_metadata[0].decision_strategy == decision_strategy @pytest.mark.integration @@ -1292,7 +1282,7 @@ def test_commit(): project_metadata = test_registry.cached_registry_proto.project_metadata[0] project_uuid = project_metadata.project_uuid assert len(project_uuid) == 36 - validate_project_metadata(project_uuid, test_registry) + validate_project_uuid(project_uuid, test_registry) # Retrieving the entity should still succeed entities = test_registry.list_entities(project, allow_cache=True, tags=entity.tags) @@ -1304,7 +1294,7 @@ def test_commit(): and "team" in entity.tags and entity.tags["team"] == "matchmaking" ) - validate_project_metadata(project_uuid, test_registry) + validate_project_uuid(project_uuid, test_registry) entity = test_registry.get_entity("driver_car_id", project, allow_cache=True) assert ( @@ -1313,7 +1303,7 @@ def test_commit(): and "team" in entity.tags and entity.tags["team"] == "matchmaking" ) - validate_project_metadata(project_uuid, test_registry) + validate_project_uuid(project_uuid, test_registry) # Create new registry that points to the same store registry_with_same_store = Registry("project", registry_config, None) @@ -1321,7 +1311,7 @@ def test_commit(): # Retrieving the entity should fail since the store is empty entities = registry_with_same_store.list_entities(project) assert len(entities) == 0 - validate_project_metadata(project_uuid, registry_with_same_store) + validate_project_uuid(project_uuid, registry_with_same_store) # commit from the original registry test_registry.commit() @@ -1339,7 +1329,7 @@ def test_commit(): and "team" in entity.tags and entity.tags["team"] == "matchmaking" ) - validate_project_metadata(project_uuid, registry_with_same_store) + validate_project_uuid(project_uuid, registry_with_same_store) entity = test_registry.get_entity("driver_car_id", project) assert ( @@ -1356,12 +1346,10 @@ def test_commit(): test_registry._get_registry_proto(project=project) -def validate_project_metadata(project_uuid, test_registry): +def validate_project_uuid(project_uuid, test_registry): assert len(test_registry.cached_registry_proto.project_metadata) == 1 project_metadata = test_registry.cached_registry_proto.project_metadata[0] assert project_metadata.project_uuid == project_uuid - print(project_metadata.decision_strategy) - # assert project_metadata.decision_strategy == DecisionStrategy.UNANIMOUS @pytest.mark.integration @@ -1382,14 +1370,10 @@ def test_apply_permission_success(test_registry): assert len(project_metadata) == 1 project_uuid = project_metadata[0].project_uuid assert len(project_metadata[0].project_uuid) == 36 - assert_project_uuid( - project, project_uuid, DecisionStrategy.UNANIMOUS, test_registry - ) + assert_project_uuid(project, project_uuid, test_registry) permissions = test_registry.list_permissions(project) - assert_project_uuid( - project, project_uuid, DecisionStrategy.UNANIMOUS, test_registry - ) + assert_project_uuid(project, project_uuid, test_registry) permission = permissions[0] assert ( @@ -1436,9 +1420,7 @@ def test_apply_permission_success(test_registry): test_registry.apply_permission(updated_permission, project) permissions = test_registry.list_permissions(project) - assert_project_uuid( - project, project_uuid, DecisionStrategy.UNANIMOUS, test_registry - ) + assert_project_uuid(project, project_uuid, test_registry) assert len(permissions) == 1 updated_permission = test_registry.get_permission("read_permission", project) @@ -1477,9 +1459,7 @@ def test_apply_permission_success(test_registry): test_registry.apply_permission(updated_permission, project) permissions = test_registry.list_permissions(project) - assert_project_uuid( - project, project_uuid, DecisionStrategy.UNANIMOUS, test_registry - ) + assert_project_uuid(project, project_uuid, test_registry) assert len(permissions) == 1 updated_permission = test_registry.get_permission("read_permission", project) @@ -1501,38 +1481,9 @@ def test_apply_permission_success(test_registry): ) test_registry.delete_permission("read_permission", project) - assert_project_uuid( - project, project_uuid, DecisionStrategy.UNANIMOUS, test_registry - ) + assert_project_uuid(project, project_uuid, test_registry) permissions = test_registry.list_permissions(project) - assert_project_uuid( - project, project_uuid, DecisionStrategy.UNANIMOUS, test_registry - ) + assert_project_uuid(project, project_uuid, test_registry) assert len(permissions) == 0 test_registry.teardown() - - -@pytest.mark.integration -@pytest.mark.parametrize("test_registry", all_fixtures) -def test_set_decision_strategy_success(test_registry): - project = "project" - - entity = Entity( - name="driver_car_id", - description="Car driver id", - tags={"team": "matchmaking"}, - ) - - # Register Entity - test_registry.apply_entity(entity, project) - - decision_strategy = test_registry.get_decision_strategy(project=project) - assert decision_strategy == DecisionStrategy.UNANIMOUS - - test_registry.set_decision_strategy(project, DecisionStrategy.AFFIRMATIVE) - - decision_strategy = test_registry.get_decision_strategy(project=project) - assert decision_strategy == DecisionStrategy.AFFIRMATIVE - - test_registry.teardown() diff --git a/sdk/python/tests/unit/permissions/conftest.py b/sdk/python/tests/unit/permissions/conftest.py index d40d29e1af..c85ebb1596 100644 --- a/sdk/python/tests/unit/permissions/conftest.py +++ b/sdk/python/tests/unit/permissions/conftest.py @@ -4,7 +4,6 @@ from feast import FeatureView from feast.infra.registry.base_registry import BaseRegistry -from feast.permissions.decision import DecisionStrategy from feast.permissions.decorator import require_permissions from feast.permissions.permission import AuthzedAction, Permission from feast.permissions.policy import RoleBasedPolicy @@ -13,7 +12,6 @@ set_security_manager, ) from feast.permissions.user import User -from feast.project_metadata import ProjectMetadata class SecuredFeatureView(FeatureView): @@ -86,11 +84,8 @@ def security_manager() -> SecurityManager: ) ) - project_metadata = ProjectMetadata(project_name="test_project") registry = Mock(spec=BaseRegistry) registry.list_permissions = Mock(return_value=permissions) - registry.list_project_metadata = Mock(return_value=[project_metadata]) - registry.get_decision_strategy = Mock(return_value=DecisionStrategy.UNANIMOUS) sm = SecurityManager(project="any", registry=registry) set_security_manager(sm) return sm diff --git a/sdk/python/tests/unit/permissions/test_permission.py b/sdk/python/tests/unit/permissions/test_permission.py index dd0e0ae411..8bb473952e 100644 --- a/sdk/python/tests/unit/permissions/test_permission.py +++ b/sdk/python/tests/unit/permissions/test_permission.py @@ -12,6 +12,7 @@ from feast.on_demand_feature_view import OnDemandFeatureView from feast.permissions.action import ALL_ACTIONS, AuthzedAction from feast.permissions.permission import ( + DecisionStrategy, Permission, ) from feast.permissions.policy import AllowAll, Policy @@ -19,6 +20,18 @@ from feast.stream_feature_view import StreamFeatureView +def test_global_decision_strategy(): + assertpy.assert_that(Permission.get_global_decision_strategy()).is_equal_to( + DecisionStrategy.UNANIMOUS + ) + + for value in DecisionStrategy.__members__.values(): + Permission.set_global_decision_strategy(value) + assertpy.assert_that(Permission.get_global_decision_strategy()).is_equal_to( + value + ) + + def test_defaults(): p = Permission(name="test") assertpy.assert_that(type(p.types)).is_equal_to(list) diff --git a/sdk/python/tests/unit/permissions/test_security_manager.py b/sdk/python/tests/unit/permissions/test_security_manager.py index 617d3346b8..5dd0261c26 100644 --- a/sdk/python/tests/unit/permissions/test_security_manager.py +++ b/sdk/python/tests/unit/permissions/test_security_manager.py @@ -2,9 +2,16 @@ import pytest from feast.permissions.action import QUERY, AuthzedAction +from feast.permissions.decision import DecisionStrategy +from feast.permissions.permission import Permission from feast.permissions.security_manager import assert_permissions, permitted_resources +@pytest.fixture(scope="module", autouse=True) +def setup_module(): + Permission.set_global_decision_strategy(DecisionStrategy.UNANIMOUS) + + @pytest.mark.parametrize( "username, requested_actions, allowed, allowed_single, raise_error_in_assert, raise_error_in_permit", [ diff --git a/setup.py b/setup.py index 610b50ed76..84d9354a20 100644 --- a/setup.py +++ b/setup.py @@ -22,8 +22,10 @@ from pathlib import Path from setuptools import find_packages, setup, Command +from setuptools.command.build_ext import build_ext as _build_ext from setuptools.command.build_py import build_py from setuptools.command.develop import develop +from setuptools.command.install import install NAME = "feast" DESCRIPTION = "Python SDK for Feast" From 900bc86463cceb8b58f0ec08f523d4d44f50b0ef Mon Sep 17 00:00:00 2001 From: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Date: Fri, 2 Aug 2024 18:51:10 +0200 Subject: [PATCH 113/169] Dropped global decision strategy Signed-off-by: Daniele Martinoli <86618610+dmartinol@users.noreply.github.com> Signed-off-by: Abdul Hameed --- docs/reference/feast-cli-commands.md | 55 ++++++++++++++----- .../server/feature_repo/permissions_apply.py | 9 +-- sdk/python/feast/cli.py | 8 --- sdk/python/feast/cli_utils.py | 17 ++++-- sdk/python/feast/permissions/decision.py | 9 ++- sdk/python/feast/permissions/enforcer.py | 4 +- sdk/python/feast/permissions/permission.py | 17 ------ .../tests/unit/permissions/test_decision.py | 52 ++---------------- .../tests/unit/permissions/test_permission.py | 13 ----- .../unit/permissions/test_security_manager.py | 15 ++--- 10 files changed, 69 insertions(+), 130 deletions(-) diff --git a/docs/reference/feast-cli-commands.md b/docs/reference/feast-cli-commands.md index 4b6452623f..e3f08936d0 100644 --- a/docs/reference/feast-cli-commands.md +++ b/docs/reference/feast-cli-commands.md @@ -171,10 +171,10 @@ Options: ``` ```text -NAME TYPES WITH_SUBCLASS NAME_PATTERN ACTIONS ROLES -reader_permission1234 ['FeatureView'] True transformed_conv_rate ['READ] ['reader'] -writer_permission1234 ['FeatureView'] True transformed_conv_rate ['CREATE'] ['writer'] -Note:The configured decision strategy is UNANIMOUS +NAME TYPES WITH_SUBCLASS NAME_PATTERN ACTIONS ROLES +reader_permission1234 FeatureView True transformed_conv_rate READ reader + FeaduteService +writer_permission1234 FeatureView True transformed_conv_rate CREATE writer ``` `verbose` option describes the resources matching each configured permission: @@ -240,16 +240,45 @@ feast permissions list-roles -v ```text ROLE NAME RESOURCE NAME RESOURCE TYPE PERMITTED ACTIONS -admin driver_hourly_stats_source FileSource ['CREATE', 'DELETE', 'QUERY_OFFLINE', 'QUERY_ONLINE', 'READ', 'UPDATE'] -admin vals_to_add RequestSource ['CREATE', 'DELETE', 'QUERY_OFFLINE', 'QUERY_ONLINE', 'READ', 'UPDATE'] -admin driver_stats_push_source PushSource ['CREATE', 'DELETE', 'QUERY_OFFLINE', 'QUERY_ONLINE', 'READ', 'UPDATE'] -admin driver_hourly_stats_source FileSource ['CREATE', 'DELETE', 'QUERY_OFFLINE', 'QUERY_ONLINE', 'READ', 'UPDATE'] -admin vals_to_add RequestSource ['CREATE', 'DELETE', 'QUERY_OFFLINE', 'QUERY_ONLINE', 'READ', 'UPDATE'] -admin driver_stats_push_source PushSource ['CREATE', 'DELETE', 'QUERY_OFFLINE', 'QUERY_ONLINE', 'READ', 'UPDATE'] -reader driver_hourly_stats FeatureView ['READ'] -reader driver_hourly_stats_fresh FeatureView ['READ'] +admin driver_hourly_stats_source FileSource CREATE + DELETE + QUERY_OFFLINE + QUERY_ONLINE + READ + UPDATE +admin vals_to_add RequestSource CREATE + DELETE + QUERY_OFFLINE + QUERY_ONLINE + READ + UPDATE +admin driver_stats_push_source PushSource CREATE + DELETE + QUERY_OFFLINE + QUERY_ONLINE + READ + UPDATE +admin driver_hourly_stats_source FileSource CREATE + DELETE + QUERY_OFFLINE + QUERY_ONLINE + READ + UPDATE +admin vals_to_add RequestSource CREATE + DELETE + QUERY_OFFLINE + QUERY_ONLINE + READ + UPDATE +admin driver_stats_push_source PushSource CREATE + DELETE + QUERY_OFFLINE + QUERY_ONLINE + READ + UPDATE +reader driver_hourly_stats FeatureView READ +reader driver_hourly_stats_fresh FeatureView READ ... -Note:The configured decision strategy is UNANIMOUS ``` diff --git a/examples/rbac/server/feature_repo/permissions_apply.py b/examples/rbac/server/feature_repo/permissions_apply.py index 011e93f863..4cd133a6fe 100644 --- a/examples/rbac/server/feature_repo/permissions_apply.py +++ b/examples/rbac/server/feature_repo/permissions_apply.py @@ -1,7 +1,6 @@ from feast import FeatureStore from feast.feast_object import ALL_RESOURCE_TYPES from feast.permissions.action import QUERY, AuthzedAction, ALL_ACTIONS -from feast.permissions.decision import DecisionStrategy from feast.permissions.permission import Permission from feast.permissions.policy import RoleBasedPolicy @@ -26,10 +25,4 @@ types=ALL_RESOURCE_TYPES, policy=RoleBasedPolicy(roles=admin_roles + cluster_roles), actions=ALL_ACTIONS -) - - -#Permission.set_global_decision_strategy(DecisionStrategy.AFFIRMATIVE) -#store.apply([user_perm, admin_perm]) -#store.refresh_registry() -#print("Global decision strategy:", Permission.get_global_decision_strategy()) +) \ No newline at end of file diff --git a/sdk/python/feast/cli.py b/sdk/python/feast/cli.py index b5e3dcc37c..349130d8b4 100644 --- a/sdk/python/feast/cli.py +++ b/sdk/python/feast/cli.py @@ -36,7 +36,6 @@ from feast.errors import FeastObjectNotFoundException, FeastProviderLoginError from feast.feature_view import FeatureView from feast.on_demand_feature_view import OnDemandFeatureView -from feast.permissions.permission import Permission from feast.permissions.policy import RoleBasedPolicy from feast.repo_config import load_repo_config from feast.repo_operations import ( @@ -998,9 +997,6 @@ def feast_permissions_list_command(ctx: click.Context, verbose: bool, tags: list tablefmt="plain", ) ) - print( - f"{Style.BRIGHT}Note:{Style.RESET_ALL}The configured decision strategy is {Permission.get_global_decision_strategy().value.upper()}" - ) else: cli_utils.print_permission_verbose_example() @@ -1135,10 +1131,6 @@ def feast_permissions_list_roles_command(ctx: click.Context, verbose: bool): ) ) - print( - f"{Style.BRIGHT}Note:{Style.RESET_ALL}The configured decision strategy is {Permission.get_global_decision_strategy().value.upper()}" - ) - if __name__ == "__main__": cli() diff --git a/sdk/python/feast/cli_utils.py b/sdk/python/feast/cli_utils.py index 5155eb814f..b7711c2ff4 100644 --- a/sdk/python/feast/cli_utils.py +++ b/sdk/python/feast/cli_utils.py @@ -195,11 +195,11 @@ def handle_not_verbose_permissions_command( table.append( [ p.name, - [t.__name__ for t in p.types], # type: ignore[union-attr, attr-defined] + _to_multi_line([t.__name__ for t in p.types]), # type: ignore[union-attr, attr-defined] p.with_subclasses, p.name_pattern, - [a.value.upper() for a in p.actions], - sorted(roles), + _to_multi_line([a.value.upper() for a in p.actions]), + _to_multi_line(sorted(roles)), ] ) @@ -246,7 +246,7 @@ def handle_permissions_check_command_with_actions( [ object.name, type(object).__name__, - [a.value.upper() for a in unmatched_actions], + _to_multi_line([a.value.upper() for a in unmatched_actions]), ] ) @@ -288,7 +288,6 @@ def handler_list_all_permissions_roles_verbose( if matching_permissions: evaluator = DecisionEvaluator( - Permission.get_global_decision_strategy(), len(matching_permissions), ) for p in matching_permissions: @@ -313,6 +312,12 @@ def handler_list_all_permissions_roles_verbose( role, o.name, type(o).__name__, - [a.value.upper() for a in permitted_actions], + _to_multi_line([a.value.upper() for a in permitted_actions]), ] ) + + +def _to_multi_line(values: list[str]) -> str: + if not values: + return "-" + return "\n".join(values) diff --git a/sdk/python/feast/permissions/decision.py b/sdk/python/feast/permissions/decision.py index 35099e10ed..4467f0e809 100644 --- a/sdk/python/feast/permissions/decision.py +++ b/sdk/python/feast/permissions/decision.py @@ -14,7 +14,9 @@ class DecisionStrategy(enum.Enum): AFFIRMATIVE = ( "affirmative" # At least one policy must evaluate to a positive decision ) - CONSENSUS = "consensus" # The number of positive decisions must be greater than the number of negative decisions. + # The number of positive decisions must be greater than the number of negative decisions. + # If the number of positive and negative decisions is the same, the final decision will be negative. + CONSENSUS = "consensus" class DecisionEvaluator: @@ -37,9 +39,10 @@ class DecisionEvaluator: def __init__( self, - decision_strategy: DecisionStrategy, num_of_voters: int, ): + # Only AFFIRMATIVE strategy is managed available + decision_strategy = DecisionStrategy.AFFIRMATIVE self.num_of_voters = num_of_voters self.grant_count = 0 @@ -57,7 +60,7 @@ def __init__( if decision_strategy == DecisionStrategy.AFFIRMATIVE else 1 if decision_strategy == DecisionStrategy.UNANIMOUS - else num_of_voters // 2 + 1 + else num_of_voters // 2 + (num_of_voters % 2) ) self.grant_decision: Optional[bool] = None self.explanations: list[str] = [] diff --git a/sdk/python/feast/permissions/enforcer.py b/sdk/python/feast/permissions/enforcer.py index 11db7bace0..f2b700b01d 100644 --- a/sdk/python/feast/permissions/enforcer.py +++ b/sdk/python/feast/permissions/enforcer.py @@ -53,9 +53,7 @@ def enforce_policy( ] if matching_permissions: - evaluator = DecisionEvaluator( - Permission.get_global_decision_strategy(), len(matching_permissions) - ) + evaluator = DecisionEvaluator(len(matching_permissions)) for p in matching_permissions: permission_grant, permission_explanation = p.policy.validate_user( user=user diff --git a/sdk/python/feast/permissions/permission.py b/sdk/python/feast/permissions/permission.py index ec7e86b6cf..cb2e1250f5 100644 --- a/sdk/python/feast/permissions/permission.py +++ b/sdk/python/feast/permissions/permission.py @@ -7,7 +7,6 @@ from feast.importer import import_class from feast.permissions.action import ALL_ACTIONS, AuthzedAction -from feast.permissions.decision import DecisionStrategy from feast.permissions.matcher import actions_match_config, resource_match_config from feast.permissions.policy import AllowAll, Policy from feast.protos.feast.core.Permission_pb2 import Permission as PermissionProto @@ -102,22 +101,6 @@ def __hash__(self): def __str__(self): return str(MessageToJson(self.to_proto())) - _global_decision_strategy: DecisionStrategy = DecisionStrategy.UNANIMOUS - - @staticmethod - def get_global_decision_strategy() -> DecisionStrategy: - """ - The global decision strategy to be applied when multiple permissions match an execution request. - """ - return Permission._global_decision_strategy - - @staticmethod - def set_global_decision_strategy(global_decision_strategy: DecisionStrategy): - """ - Define the global decision strategy to be applied when multiple permissions match an execution request. - """ - Permission._global_decision_strategy = global_decision_strategy - @property def name(self) -> str: return self._name diff --git a/sdk/python/tests/unit/permissions/test_decision.py b/sdk/python/tests/unit/permissions/test_decision.py index 38522343fc..23bafedeab 100644 --- a/sdk/python/tests/unit/permissions/test_decision.py +++ b/sdk/python/tests/unit/permissions/test_decision.py @@ -1,7 +1,7 @@ import assertpy import pytest -from feast.permissions.decision import DecisionEvaluator, DecisionStrategy +from feast.permissions.decision import DecisionEvaluator # Each vote is a tuple of `current_vote` and expected output of `is_decided` @@ -9,58 +9,14 @@ @pytest.mark.parametrize( "evaluator, votes, decision, no_of_explanations", [ - (DecisionEvaluator(DecisionStrategy.AFFIRMATIVE, 3), [(True, True)], True, 0), - (DecisionEvaluator(DecisionStrategy.AFFIRMATIVE, 3), [(True, True)], True, 0), + (DecisionEvaluator(3), [(True, True)], True, 0), + (DecisionEvaluator(3), [(True, True)], True, 0), ( - DecisionEvaluator(DecisionStrategy.AFFIRMATIVE, 3), + DecisionEvaluator(3), [(False, False), (False, False), (False, True)], False, 3, ), - ( - DecisionEvaluator(DecisionStrategy.UNANIMOUS, 3), - [(True, False), (True, False), (True, True)], - True, - 0, - ), - ( - DecisionEvaluator(DecisionStrategy.UNANIMOUS, 3), - [(True, False), (False, True)], - False, - 1, - ), - (DecisionEvaluator(DecisionStrategy.CONSENSUS, 1), [(True, True)], True, 0), - (DecisionEvaluator(DecisionStrategy.CONSENSUS, 1), [(False, True)], False, 1), - ( - DecisionEvaluator(DecisionStrategy.CONSENSUS, 5), - [ - (True, False), - (False, False), - (False, False), - (True, False), - (True, True), - ], - True, - 2, - ), - ( - DecisionEvaluator(DecisionStrategy.CONSENSUS, 5), - [(True, False), (False, False), (False, False), (False, True)], - False, - 3, - ), - ( - DecisionEvaluator(DecisionStrategy.UNANIMOUS, 2), - [(True, False), (True, True), (False, True), (False, True), (False, True)], - True, - 0, - ), - ( - DecisionEvaluator(DecisionStrategy.UNANIMOUS, 2), - [(False, True), (False, True), (False, True), (False, True), (False, True)], - False, - 1, - ), ], ) def test_decision_evaluator(evaluator, votes, decision, no_of_explanations): diff --git a/sdk/python/tests/unit/permissions/test_permission.py b/sdk/python/tests/unit/permissions/test_permission.py index 8bb473952e..dd0e0ae411 100644 --- a/sdk/python/tests/unit/permissions/test_permission.py +++ b/sdk/python/tests/unit/permissions/test_permission.py @@ -12,7 +12,6 @@ from feast.on_demand_feature_view import OnDemandFeatureView from feast.permissions.action import ALL_ACTIONS, AuthzedAction from feast.permissions.permission import ( - DecisionStrategy, Permission, ) from feast.permissions.policy import AllowAll, Policy @@ -20,18 +19,6 @@ from feast.stream_feature_view import StreamFeatureView -def test_global_decision_strategy(): - assertpy.assert_that(Permission.get_global_decision_strategy()).is_equal_to( - DecisionStrategy.UNANIMOUS - ) - - for value in DecisionStrategy.__members__.values(): - Permission.set_global_decision_strategy(value) - assertpy.assert_that(Permission.get_global_decision_strategy()).is_equal_to( - value - ) - - def test_defaults(): p = Permission(name="test") assertpy.assert_that(type(p.types)).is_equal_to(list) diff --git a/sdk/python/tests/unit/permissions/test_security_manager.py b/sdk/python/tests/unit/permissions/test_security_manager.py index 5dd0261c26..0380d4772c 100644 --- a/sdk/python/tests/unit/permissions/test_security_manager.py +++ b/sdk/python/tests/unit/permissions/test_security_manager.py @@ -2,26 +2,19 @@ import pytest from feast.permissions.action import QUERY, AuthzedAction -from feast.permissions.decision import DecisionStrategy -from feast.permissions.permission import Permission from feast.permissions.security_manager import assert_permissions, permitted_resources -@pytest.fixture(scope="module", autouse=True) -def setup_module(): - Permission.set_global_decision_strategy(DecisionStrategy.UNANIMOUS) - - @pytest.mark.parametrize( "username, requested_actions, allowed, allowed_single, raise_error_in_assert, raise_error_in_permit", [ (None, [], False, [False, False], [True, True], False), - ("r", [AuthzedAction.READ], False, [True, False], [True, True], False), + ("r", [AuthzedAction.READ], True, [True, True], [False, False], False), ("r", [AuthzedAction.UPDATE], False, [False, False], [True, True], False), ("w", [AuthzedAction.READ], False, [False, False], [True, True], False), - ("w", [AuthzedAction.UPDATE], False, [True, False], [True, True], False), - ("rw", [AuthzedAction.READ], False, [True, False], [True, True], False), - ("rw", [AuthzedAction.UPDATE], False, [True, False], [True, True], False), + ("w", [AuthzedAction.UPDATE], False, [True, True], [False, False], False), + ("rw", [AuthzedAction.READ], False, [True, True], [False, False], False), + ("rw", [AuthzedAction.UPDATE], False, [True, True], [False, False], False), ( "rw", [AuthzedAction.READ, AuthzedAction.UPDATE], From 065c99c4b641c91070153d990c0d7fbabf42199d Mon Sep 17 00:00:00 2001 From: Abdul Hameed Date: Thu, 1 Aug 2024 16:27:45 -0400 Subject: [PATCH 114/169] updated rbac demo example Signed-off-by: Abdul Hameed --- examples/rbac/README.md | 31 +++-- examples/rbac/cleanup_feast.sh | 7 +- ...sources.yaml => admin_user_resources.yaml} | 4 +- .../feature_repo/{test_admin.py => test.py} | 16 ++- .../rbac/client/feature_repo/test_user.py | 126 ----------------- ...rces.yaml => readonly_user_resources.yaml} | 4 +- .../client/unauthorized_user_resources.yaml | 44 ++++++ examples/rbac/deployment.png | Bin 227907 -> 98226 bytes examples/rbac/install_feast.sh | 6 +- examples/rbac/pod.png | Bin 183379 -> 0 bytes .../server/feature_repo/permissions_apply.py | 5 +- .../rbac/server/feature_repo/test_workflow.py | 128 ------------------ examples/rbac/unauthorized-user.png | Bin 0 -> 223108 bytes 13 files changed, 86 insertions(+), 285 deletions(-) rename examples/rbac/client/{admin_resources.yaml => admin_user_resources.yaml} (93%) rename examples/rbac/client/feature_repo/{test_admin.py => test.py} (87%) delete mode 100644 examples/rbac/client/feature_repo/test_user.py rename examples/rbac/client/{user_resources.yaml => readonly_user_resources.yaml} (93%) create mode 100644 examples/rbac/client/unauthorized_user_resources.yaml delete mode 100644 examples/rbac/pod.png delete mode 100644 examples/rbac/server/feature_repo/test_workflow.py create mode 100644 examples/rbac/unauthorized-user.png diff --git a/examples/rbac/README.md b/examples/rbac/README.md index b3dd0ab031..a62787e984 100644 --- a/examples/rbac/README.md +++ b/examples/rbac/README.md @@ -89,14 +89,14 @@ auth: #### 2. **Deploy the Client Examples** -* As an examples, we created two users: 1. admin and 2. user, and assigned the following roles and actions on the Feast object as shown in the table below. +* As an examples, we created different users: 1. admin-user, 2. readonly-user and 3. unauthorized-user and assigned the following roles and actions on the Feast object as shown in the table below. ##### Roles and Permissions for Examples (Admin and User) -| **User** | **Service Account** | **Roles** | **Permission** | **Feast Resources** | **Actions** | -|-----------------|---------------------|------------------|-------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------| -| admin | feast-admin-sa | feast-admin-role | feast_admin_permission | FeatureView, OnDemandFeatureView, BatchFeatureView, StreamFeatureView, Entity, FeatureService, DataSource, ValidationReference, SavedDataset, Permission | CREATE, READ, UPDATE, DELETE, QUERY_ONLINE, QUERY_OFFLINE, WRITE_ONLINE, WRITE_OFFLINE | -| user | feast-user-sa | feast-user-role | feast_user_permission | FeatureView, OnDemandFeatureView, BatchFeatureView, StreamFeatureView, Entity, FeatureService, DataSource, ValidationReference, SavedDataset, Permission | READ, QUERY_OFFLINE, QUERY_ONLINE | - +| **User** | **Service Account** | **Roles** | **Permission** | **Feast Resources** | **Actions** | +|-----------------|----------------------------|------------------|--------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------| +| admin | feast-admin-sa | feast-admin-role | feast_admin_permission | FeatureView, OnDemandFeatureView, BatchFeatureView, StreamFeatureView, Entity, FeatureService, DataSource, ValidationReference, SavedDataset, Permission | CREATE, READ, UPDATE, DELETE, QUERY_ONLINE, QUERY_OFFLINE, WRITE_ONLINE, WRITE_OFFLINE | +| user | feast-user-sa | feast-user-role | feast_user_permission | FeatureView, OnDemandFeatureView, BatchFeatureView, StreamFeatureView, Entity, FeatureService, DataSource, ValidationReference, SavedDataset, Permission | READ, QUERY_OFFLINE, QUERY_ONLINE | +|unauthorized-user| feast-unauthorized-user-sa | | | | | * For deploying client examples, the script will create a Deployment, roles, role bindings, and service accounts for each user. See roles configuration for admin [admin_resources.yaml](client/admin_resources.yaml) and user [user_resources.yaml](client/user_resources.yaml) * It will also create a ConfigMap on the client side that contains the test script and client-side feature store configuration. @@ -106,7 +106,7 @@ auth: ./install_feast.sh ``` -* We defined two examples under the client folder: `test_admin.py` and `test_user.py`. Both examples aim to perform actions related to Historical Features, Materialize Incremental, and Online Features. +* We defined example under the client/feature_repo with file [test.py](client/feature_repo/test.py) here test example try to fetch Historical Features, do Materialize Incremental, and fetch Online Features and push to online/offline. * The applications should work without permissions setting at this point. Verify the client applications of user and admin and able to do Historical Features, Materialize Incremental, and Online Features @@ -114,7 +114,6 @@ The Deployment of the overall setup looks like : ![Deployment.png](deployment.png) -![pod.png](pod.png) #### Apply Permissions @@ -131,20 +130,24 @@ The Deployment of the overall setup looks like : #### **Validating Permissions examples.** -As we created two examples under the client folder: `test_admin.py` and `test_user.py`. Both examples aim to perform actions related to Historical Features, Materialize Incremental, and Online Features. -According to the roles: +* As in the [test.py](client/feature_repo/test.py), the try example attempts to fetch Historical Features, perform Materialize Incremental, fetch Online Features, and push to online/offline storage based on user roles. -- The admin can perform all actions on all objects. -- The user can only read or query on all objects. +- The admin-user can perform all actions on all objects. +- The readonly-user can only read or query on all objects. +- unauthorized should not able to fetch or query any resources as there no role define. The below screenshots show that the admin can perform all actions, including Materialize. However, the user can only read offline and encounters an permissions error when attempting the Materialization step because the user does not have the required role. +While Unauthorized User shows feature view not found and permission error mean can't perform any action. -**Admin Example** +**Admin User Example** ![admin_output.png](admin_output.png) -**User Example** +**Readonly User Example** ![user_output.png](user_output.png) +**Unauthorized User** +![unauthorized-user.png](unauthorized-user.png) + For local testing, port forward the services PostgreSQL Service and Feast Servers with the commands below: ```sh diff --git a/examples/rbac/cleanup_feast.sh b/examples/rbac/cleanup_feast.sh index 8d2d9dc863..f6e80fa000 100755 --- a/examples/rbac/cleanup_feast.sh +++ b/examples/rbac/cleanup_feast.sh @@ -12,10 +12,11 @@ for release in "${HELM_RELEASES[@]}"; do done echo "Deleting Kubernetes roles, role bindings, and service accounts for clients" -kubectl delete -f client/admin_resources.yaml -kubectl delete -f client/user_resources.yaml +kubectl delete -f client/admin_user_resources.yaml +kubectl delete -f client/readonly_user_resources.yaml +kubectl delete -f client/unauthorized_user_resources.yaml kubectl delete -f server/server_resources.yaml - kubectl delete configmap client-feature-repo-config +kubectl delete configmap client-feature-repo-config echo "Cleanup completed." diff --git a/examples/rbac/client/admin_resources.yaml b/examples/rbac/client/admin_user_resources.yaml similarity index 93% rename from examples/rbac/client/admin_resources.yaml rename to examples/rbac/client/admin_user_resources.yaml index 07993c320b..a92098af1c 100644 --- a/examples/rbac/client/admin_resources.yaml +++ b/examples/rbac/client/admin_user_resources.yaml @@ -27,7 +27,7 @@ roleRef: apiVersion: apps/v1 kind: Deployment metadata: - name: client-admin-deployment + name: client-admin-user namespace: feast-dev labels: app: client-admin @@ -46,7 +46,7 @@ spec: - name: init-client-admin image: quay.io/ahameed/feature-server:dev imagePullPolicy: Always - command: ["python", "/app/feature_repo/test_admin.py"] + command: ["python", "/app/feature_repo/test.py"] volumeMounts: - name: client-feature-repo-config mountPath: /app/feature_repo diff --git a/examples/rbac/client/feature_repo/test_admin.py b/examples/rbac/client/feature_repo/test.py similarity index 87% rename from examples/rbac/client/feature_repo/test_admin.py rename to examples/rbac/client/feature_repo/test.py index 831364c236..8ea2c559fe 100644 --- a/examples/rbac/client/feature_repo/test_admin.py +++ b/examples/rbac/client/feature_repo/test.py @@ -7,7 +7,6 @@ def run_demo(): - print("\n--- This is Admin Example ---") try: os.environ["LOCAL_K8S_TOKEN"] = "" @@ -26,12 +25,12 @@ def run_demo(): fetch_online_features(store) print("\n--- Online features retrieved (instead) through a feature service---") - # fetch_online_features(store, source="feature_service") + fetch_online_features(store, source="feature_service") print( "\n--- Online features retrieved (using feature service v3, which uses a feature view with a push source---" ) - # fetch_online_features(store, source="push") + fetch_online_features(store, source="push") print("\n--- Simulate a stream event ingestion of the hourly stats df ---") event_df = pd.DataFrame.from_dict( @@ -45,10 +44,10 @@ def run_demo(): } ) print(event_df) - # store.push("driver_stats_push_source", event_df, to=PushMode.ONLINE_AND_OFFLINE) + store.push("driver_stats_push_source", event_df, to=PushMode.ONLINE_AND_OFFLINE) print("\n--- Online features again with updated values from a stream push---") - # fetch_online_features(store, source="push") + fetch_online_features(store, source="push") except Exception as e: print(f"An error occurred: {e}") @@ -65,7 +64,12 @@ def fetch_historical_features_entity_df(store: FeatureStore, for_batch_scoring: datetime(2021, 4, 12, 16, 40, 26), ], "label_driver_reported_satisfaction": [1, 5, 3], + # values we're using for an on-demand transformation + # "val_to_add": [1, 2, 3], + # "val_to_add_2": [10, 20, 30], + } + ) if for_batch_scoring: entity_df["event_timestamp"] = pd.to_datetime("now", utc=True) @@ -76,6 +80,8 @@ def fetch_historical_features_entity_df(store: FeatureStore, for_batch_scoring: "driver_hourly_stats:conv_rate", "driver_hourly_stats:acc_rate", "driver_hourly_stats:avg_daily_trips", + # "transformed_conv_rate:conv_rate_plus_val1", + # "transformed_conv_rate:conv_rate_plus_val2", ], ).to_df() print(training_df.head()) diff --git a/examples/rbac/client/feature_repo/test_user.py b/examples/rbac/client/feature_repo/test_user.py deleted file mode 100644 index 779bff9195..0000000000 --- a/examples/rbac/client/feature_repo/test_user.py +++ /dev/null @@ -1,126 +0,0 @@ -import os -from datetime import datetime - -import pandas as pd -from feast import FeatureStore -from feast.data_source import PushMode - - -def run_demo(): - try: - os.environ["LOCAL_K8S_TOKEN"] = "" - print("\n--- This is User Example ---") - - store = FeatureStore(repo_path="/app/feature_repo") - - print("\n--- Historical features for training ---") - fetch_historical_features_entity_df(store, for_batch_scoring=False) - - print("\n--- Historical features for batch scoring ---") - fetch_historical_features_entity_df(store, for_batch_scoring=True) - - print("\n--- Load features into online store ---") - store.materialize_incremental(end_date=datetime.now()) - - print("\n--- Online features ---") - fetch_online_features(store) - - print("\n--- Online features retrieved (instead) through a feature service---") - # fetch_online_features(store, source="feature_service") - - print( - "\n--- Online features retrieved (using feature service v3, which uses a feature view with a push source---" - ) - # fetch_online_features(store, source="push") - - print("\n--- Simulate a stream event ingestion of the hourly stats df ---") - event_df = pd.DataFrame.from_dict( - { - "driver_id": [1001], - "event_timestamp": [datetime.now()], - "created": [datetime.now()], - "conv_rate": [1.0], - "acc_rate": [1.0], - "avg_daily_trips": [1000], - } - ) - print(event_df) - # store.push("driver_stats_push_source", event_df, to=PushMode.ONLINE_AND_OFFLINE) - - print("\n--- Online features again with updated values from a stream push---") - # fetch_online_features(store, source="push") - - except Exception as e: - print(f"An error occurred: {e}") - - -def fetch_historical_features_entity_df(store: FeatureStore, for_batch_scoring: bool): - try: - entity_df = pd.DataFrame.from_dict( - { - "driver_id": [1001, 1002, 1003], - "event_timestamp": [ - datetime(2021, 4, 12, 10, 59, 42), - datetime(2021, 4, 12, 8, 12, 10), - datetime(2021, 4, 12, 16, 40, 26), - ], - "label_driver_reported_satisfaction": [1, 5, 3], - } - ) - if for_batch_scoring: - entity_df["event_timestamp"] = pd.to_datetime("now", utc=True) - - training_df = store.get_historical_features( - entity_df=entity_df, - features=[ - "driver_hourly_stats:conv_rate", - "driver_hourly_stats:acc_rate", - "driver_hourly_stats:avg_daily_trips", - ], - ).to_df() - print(training_df.head()) - - except Exception as e: - print(f"An error occurred while fetching historical features: {e}") - - -def fetch_online_features(store, source: str = ""): - try: - entity_rows = [ - { - "driver_id": 1001, - "val_to_add": 1000, - "val_to_add_2": 2000, - }, - { - "driver_id": 1002, - "val_to_add": 1001, - "val_to_add_2": 2002, - }, - ] - if source == "feature_service": - features_to_fetch = store.get_feature_service("driver_activity_v1") - elif source == "push": - features_to_fetch = store.get_feature_service("driver_activity_v3") - else: - features_to_fetch = [ - "driver_hourly_stats:acc_rate", - "transformed_conv_rate:conv_rate_plus_val1", - "transformed_conv_rate:conv_rate_plus_val2", - ] - returned_features = store.get_online_features( - features=features_to_fetch, - entity_rows=entity_rows, - ).to_dict() - for key, value in sorted(returned_features.items()): - print(key, " : ", value) - - except Exception as e: - print(f"An error occurred while fetching online features: {e}") - - -if __name__ == "__main__": - try: - run_demo() - except Exception as e: - print(f"An error occurred in the main execution: {e}") diff --git a/examples/rbac/client/user_resources.yaml b/examples/rbac/client/readonly_user_resources.yaml similarity index 93% rename from examples/rbac/client/user_resources.yaml rename to examples/rbac/client/readonly_user_resources.yaml index 9c74f01073..9caa543f22 100644 --- a/examples/rbac/client/user_resources.yaml +++ b/examples/rbac/client/readonly_user_resources.yaml @@ -27,7 +27,7 @@ roleRef: apiVersion: apps/v1 kind: Deployment metadata: - name: client-user-deployment + name: client-readonly-user namespace: feast-dev labels: app: client-user @@ -46,7 +46,7 @@ spec: - name: init-client-user image: quay.io/ahameed/feature-server:dev imagePullPolicy: Always - command: ["python", "/app/feature_repo/test_user.py"] + command: ["python", "/app/feature_repo/test.py"] volumeMounts: - name: client-feature-repo-config mountPath: /app/feature_repo diff --git a/examples/rbac/client/unauthorized_user_resources.yaml b/examples/rbac/client/unauthorized_user_resources.yaml new file mode 100644 index 0000000000..9329d39a29 --- /dev/null +++ b/examples/rbac/client/unauthorized_user_resources.yaml @@ -0,0 +1,44 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + name: feast-unauthorized-user-sa + namespace: feast-dev +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: client-unauthorized-user + namespace: feast-dev + labels: + app: client-unauthorized-user +spec: + replicas: 1 + selector: + matchLabels: + app: client-unauthorized-user + template: + metadata: + labels: + app: client-unauthorized-user + spec: + serviceAccountName: feast-unauthorized-user-sa + initContainers: + - name: init-client-unauthorized-user + image: quay.io/ahameed/feature-server:dev + imagePullPolicy: Always + command: ["python", "/app/feature_repo/test.py"] + volumeMounts: + - name: client-feature-repo-config + mountPath: /app/feature_repo + containers: + - name: client-unauthorized-user-container + image: quay.io/ahameed/feature-server:dev + imagePullPolicy: Always + command: ["sleep", "infinity"] + volumeMounts: + - name: client-feature-repo-config + mountPath: /app/feature_repo + volumes: + - name: client-feature-repo-config + configMap: + name: client-feature-repo-config diff --git a/examples/rbac/deployment.png b/examples/rbac/deployment.png index db21954d57e391cdf00daf2f3b99a4278f45753a..9b9a0d7b2a48039a1e716be1a12ab81ff87d68dd 100644 GIT binary patch literal 98226 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 literal 227907 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 ctk+8!hX-Na+#+|&7(Tb(j+{kZ=7 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 diff --git a/examples/rbac/install_feast.sh b/examples/rbac/install_feast.sh index 96c14fe545..10c2728d22 100755 --- a/examples/rbac/install_feast.sh +++ b/examples/rbac/install_feast.sh @@ -61,8 +61,10 @@ read -p "Apply client creation examples (admin and user)? (y/n) " confirm_client if [[ $confirm_clients == [yY] ]]; then kubectl delete configmap client-feature-repo-config --ignore-not-found kubectl create configmap client-feature-repo-config --from-file=$CONFIG_DIR - kubectl apply -f client/admin_resources.yaml - kubectl apply -f client/user_resources.yaml + kubectl apply -f client/admin_user_resources.yaml + kubectl apply -f client/readonly_user_resources.yaml + kubectl apply -f client/unauthorized_user_resources.yaml + echo "Client resources applied." else echo "Client resources not applied." diff --git a/examples/rbac/pod.png b/examples/rbac/pod.png deleted file mode 100644 index e82aa66dc9bf3dea56a0acfcf85b4fbfe1dbb402..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 183379 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 SKU6UPU+MUN*NEJ&ng0j+dA(8q literal 0 HcmV?d00001 diff --git a/examples/rbac/deployment.png b/examples/rbac/deployment.png new file mode 100644 index 0000000000000000000000000000000000000000..db21954d57e391cdf00daf2f3b99a4278f45753a GIT binary patch literal 227907 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 ctk+8!hX-Na+#+|&7(Tb(j+{kZ=7 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 literal 0 HcmV?d00001 diff --git a/examples/rbac/feature_store_remote.yaml b/examples/rbac/feature_store_remote.yaml deleted file mode 100644 index 107a771d5a..0000000000 --- a/examples/rbac/feature_store_remote.yaml +++ /dev/null @@ -1,28 +0,0 @@ -project: server -provider: local -registry: - registry_type: sql - path: postgresql://feast:feast@postgresql.feast-qe.svc.cluster.local:5432/feast - cache_ttl_seconds: 60 - sqlalchemy_config_kwargs: - echo: false - pool_pre_ping: true -online_store: - type: postgres - host: postgresql.feast-qe.svc.cluster.local - port: 5432 - database: feast - db_schema: public - user: feast - password: feast -offline_store: - type: postgres - host: postgresql.feast-qe.svc.cluster.local - port: 5432 - database: feast - db_schema: public - user: feast - password: feast -auth: - type: kubernetes -entity_key_serialization_version: 2 diff --git a/examples/rbac/install_feast.sh b/examples/rbac/install_feast.sh index 52e4d4a809..96c14fe545 100755 --- a/examples/rbac/install_feast.sh +++ b/examples/rbac/install_feast.sh @@ -1,57 +1,71 @@ #!/bin/bash # Default paths -DEFAULT_FEATURE_STORE_YAML_PATH="feature_store_remote.yaml" -DEFAULT_HELM_CHART_PATH="../../infra/charts/feast-feature-server" -DEFAULT_SERVICE_ACCOUNT_NAME="feast-sa" - -# Accept parameters or use default values -FEATURE_STORE_YAML_PATH=${1:-$DEFAULT_FEATURE_STORE_YAML_PATH} -HELM_CHART_PATH=${2:-$DEFAULT_HELM_CHART_PATH} -SERVICE_ACCOUNT_NAME=${3:-$DEFAULT_SERVICE_ACCOUNT_NAME} - -# Check if the feature_store.yaml file exists -if [ ! -f "$FEATURE_STORE_YAML_PATH" ]; then - echo "Error: File not found at $FEATURE_STORE_YAML_PATH" - exit 1 -fi +FEATURE_STORE_OFFLINE_YAML_PATH="server/feature_store_offline.yaml" +FEATURE_STORE_ONLINE_YAML_PATH="server/feature_store_online.yaml" +FEATURE_STORE_REGISTRY_YAML_PATH="server/feature_store_registry.yaml" +HELM_CHART_PATH="../../infra/charts/feast-feature-server" +SERVICE_ACCOUNT_NAME="feast-sa" +CONFIG_DIR="client/feature_repo" -echo "File found at $FEATURE_STORE_YAML_PATH" +# Function to check if a file exists and encode it to base64 +encode_to_base64() { + local file_path=$1 + if [ ! -f "$file_path" ]; then + echo "Error: File not found at $file_path" + exit 1 + fi + base64 < "$file_path" +} -# Base64 encode the feature_store.yaml file and store it in a variable -FEATURE_STORE_YAML_BASE64=$(base64 < "$FEATURE_STORE_YAML_PATH") +# Encode the YAML files to base64 +FEATURE_STORE_OFFLINE_YAML_BASE64=$(encode_to_base64 "$FEATURE_STORE_OFFLINE_YAML_PATH") +FEATURE_STORE_ONLINE_YAML_BASE64=$(encode_to_base64 "$FEATURE_STORE_ONLINE_YAML_PATH") +FEATURE_STORE_REGISTRY_YAML_BASE64=$(encode_to_base64 "$FEATURE_STORE_REGISTRY_YAML_PATH") # Check if base64 encoding was successful -if [ -z "$FEATURE_STORE_YAML_BASE64" ]; then - echo "Error: Failed to base64 encode the feature_store.yaml file." +if [ -z "$FEATURE_STORE_OFFLINE_YAML_BASE64" ] || [ -z "$FEATURE_STORE_ONLINE_YAML_BASE64" ] || [ -z "$FEATURE_STORE_REGISTRY_YAML_BASE64" ]; then + echo "Error: Failed to base64 encode one or more feature_store.yaml files." exit 1 fi -# echo "Base64 Encoded Content: $FEATURE_STORE_YAML_BASE64" +# Upgrade or install Feast components +read -p "Deploy server components? (y/n) " confirm_server +if [[ $confirm_server == [yY] ]]; then + # Apply the server service accounts and role bindings + kubectl apply -f server/server_resources.yaml + + # Upgrade or install Feast components + echo "Upgrading or installing Feast server components" -# Apply Kubernetes configurations -echo "Applying service account, roles, and role bindings" -kubectl apply -f service_account.yaml -kubectl apply -f role.yaml -kubectl apply -f role_binding.yaml + helm upgrade --install feast-registry-server $HELM_CHART_PATH \ + --set feast_mode=registry \ + --set feature_store_yaml_base64=$FEATURE_STORE_REGISTRY_YAML_BASE64 \ + --set serviceAccount.name=$SERVICE_ACCOUNT_NAME -# Upgrade or install Feast components -echo "Upgrading or installing Feast components" -helm upgrade --install feast-feature-server $HELM_CHART_PATH \ - --set feature_store_yaml_base64=$FEATURE_STORE_YAML_BASE64 \ - --set serviceAccount.name=$SERVICE_ACCOUNT_NAME - -helm upgrade --install feast-offline-server $HELM_CHART_PATH \ - --set feast_mode=offline \ - --set feature_store_yaml_base64=$FEATURE_STORE_YAML_BASE64 \ - --set serviceAccount.name=$SERVICE_ACCOUNT_NAME - -helm upgrade --install feast-ui-server $HELM_CHART_PATH \ - --set feast_mode=ui \ - --set feature_store_yaml_base64=$FEATURE_STORE_YAML_BASE64 \ - --set serviceAccount.name=$SERVICE_ACCOUNT_NAME - -helm upgrade --install feast-registry-server $HELM_CHART_PATH \ - --set feast_mode=registry \ - --set feature_store_yaml_base64=$FEATURE_STORE_YAML_BASE64 \ - --set serviceAccount.name=$SERVICE_ACCOUNT_NAME + helm upgrade --install feast-feature-server $HELM_CHART_PATH \ + --set feature_store_yaml_base64=$FEATURE_STORE_ONLINE_YAML_BASE64 \ + --set serviceAccount.name=$SERVICE_ACCOUNT_NAME + + helm upgrade --install feast-offline-server $HELM_CHART_PATH \ + --set feast_mode=offline \ + --set feature_store_yaml_base64=$FEATURE_STORE_OFFLINE_YAML_BASE64 \ + --set serviceAccount.name=$SERVICE_ACCOUNT_NAME + + echo "Server components deployed." +else + echo "Server components not deployed." +fi + +read -p "Apply client creation examples (admin and user)? (y/n) " confirm_clients +if [[ $confirm_clients == [yY] ]]; then + kubectl delete configmap client-feature-repo-config --ignore-not-found + kubectl create configmap client-feature-repo-config --from-file=$CONFIG_DIR + kubectl apply -f client/admin_resources.yaml + kubectl apply -f client/user_resources.yaml + echo "Client resources applied." +else + echo "Client resources not applied." +fi + +echo "Setup completed." diff --git a/examples/rbac/permission1.png b/examples/rbac/permission1.png new file mode 100644 index 0000000000000000000000000000000000000000..8ed8cca600ec75d7f552788dfc12d865e005f52e GIT binary patch literal 535376 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˱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