diff --git a/.gitignore b/.gitignore index d8e2290d..05e52e03 100644 --- a/.gitignore +++ b/.gitignore @@ -31,6 +31,7 @@ static/buildinfo.* # local log files log/* +*.log config/dev.ini .env* @@ -74,3 +75,7 @@ celerybeat-schedule js/test_templates .mypy_cache/ + +# terraform +*.tfstate +*.backup diff --git a/.secrets.baseline b/.secrets.baseline index bd9bdadc..258ea89e 100644 --- a/.secrets.baseline +++ b/.secrets.baseline @@ -3,7 +3,7 @@ "files": "^.secrets.baseline$|^.*pgsslrootcert.yml$", "lines": null }, - "generated_at": "2020-01-09T16:55:07Z", + "generated_at": "2020-01-19T20:21:20Z", "plugins_used": [ { "base64_limit": 4.5, @@ -32,13 +32,6 @@ "is_verified": false, "line_number": 156, "type": "Secret Keyword" - }, - { - "hashed_secret": "81b127e2222d9bfc4609053faec85300f7525463", - "is_secret": false, - "is_verified": false, - "line_number": 290, - "type": "Secret Keyword" } ], "alembic.ini": [ @@ -89,7 +82,7 @@ "hashed_secret": "afc848c316af1a89d49826c5ae9d00ed769415f3", "is_secret": false, "is_verified": false, - "line_number": 30, + "line_number": 31, "type": "Secret Keyword" } ], @@ -152,7 +145,7 @@ "hashed_secret": "e4f14805dfd1e6af030359090c535e149e6b4207", "is_secret": false, "is_verified": false, - "line_number": 665, + "line_number": 649, "type": "Hex High Entropy String" } ] diff --git a/Dockerfile b/Dockerfile index 1785b5d8..6f29d300 100644 --- a/Dockerfile +++ b/Dockerfile @@ -73,7 +73,8 @@ RUN apk update && \ postgresql-client \ postgresql-dev \ postgresql-libs \ - uwsgi-logfile + uwsgi-logfile \ + uwsgi-python3 COPY --from=builder /install/.venv/ ./.venv/ COPY --from=builder /install/alembic/ ./alembic/ diff --git a/README.md b/README.md index 5fdbf6d3..2681346e 100644 --- a/README.md +++ b/README.md @@ -255,6 +255,7 @@ To generate coverage reports for the Javascript tests: - `SERVER_NAME`: Hostname for ATAT. Only needs to be specified in contexts where the hostname cannot be inferred from the request, such as Celery workers. https://flask.palletsprojects.com/en/1.1.x/config/#SERVER_NAME - `SESSION_COOKIE_NAME`: String value specifying the name to use for the session cookie. https://flask.palletsprojects.com/en/1.1.x/config/#SESSION_COOKIE_NAME - `SESSION_COOKIE_DOMAIN`: String value specifying the name to use for the session cookie. This should be set to the root domain so that it is valid for both the main site and the authentication subdomain. https://flask.palletsprojects.com/en/1.1.x/config/#SESSION_COOKIE_DOMAIN +- `SESSION_KEY_PREFIX`: A prefix that is added before all session keys: https://pythonhosted.org/Flask-Session/#configuration - `SESSION_TYPE`: String value specifying the cookie storage backend. https://pythonhosted.org/Flask-Session/ - `SESSION_USE_SIGNER`: Boolean value specifying if the cookie sid should be signed. - `SQLALCHEMY_ECHO`: Boolean value specifying if SQLAlchemy should log queries to stdout. @@ -362,50 +363,3 @@ fi Also note that if the line number of a previously whitelisted secret changes, the whitelist file, `.secrets.baseline`, will be updated and needs to be committed. -## Local Kubernetes Setup - -A modified version of the Kubernetes cluster can be deployed locally for -testing and development purposes. - -It is strongly recommended that you backup your local K8s config (usually -`~/.kube/config`) before launching Minikube for the first time. - -Before beginning: - -- install the [Docker CLI](https://docs.docker.com/v17.12/install/) -- install [Minikube](https://kubernetes.io/docs/tasks/tools/install-minikube/) - (this will also require installing a Hypervisor, such as VirtualBox) - -### Setup - -Run - -``` -script/minikube_setup -``` - -Once the script exits successfully, run - -``` -minikube service list -``` - -### Access the site - -One of the two URLs given for the `atat-auth` service will load an HTTP version -of the application. - -For HTTP basic auth, the username and password are both `minikube`. - -### Differences from the main config - -As of the time of writing, this setup does not include the following: - -- SSL/TLS or the complete DoD PKI -- the cronjob for syncing CRLs and the peristent storage -- production configuration - -In order for the application to run, the K8s config for Minikube includes an -additional deployment resource called `datastores`. This includes Postgres -and Redis containers. It also includes hard-coded versions of the K8s secrets -used in the regular clusters. diff --git a/atst/app.py b/atst/app.py index e9daabd6..29476ed8 100644 --- a/atst/app.py +++ b/atst/app.py @@ -159,6 +159,7 @@ def map_config(config): "ENV": config["default"]["ENVIRONMENT"], "BROKER_URL": config["default"]["REDIS_URI"], "DEBUG": config["default"].getboolean("DEBUG"), + "DEBUG_MAILER": config["default"].getboolean("DEBUG_MAILER"), "SQLALCHEMY_ECHO": config["default"].getboolean("SQLALCHEMY_ECHO"), "PORT": int(config["default"]["PORT"]), "SQLALCHEMY_DATABASE_URI": config["default"]["DATABASE_URI"], @@ -221,7 +222,7 @@ def make_config(direct_config=None): config.read_dict({"default": direct_config}) # Assemble DATABASE_URI value - database_uri = "postgres://{}:{}@{}:{}/{}".format( # pragma: allowlist secret + database_uri = "postgresql://{}:{}@{}:{}/{}".format( # pragma: allowlist secret config.get("default", "PGUSER"), config.get("default", "PGPASSWORD"), config.get("default", "PGHOST"), @@ -289,7 +290,7 @@ def make_crl_validator(app): def make_mailer(app): - if app.config["DEBUG"]: + if app.config["DEBUG"] or app.config["DEBUG_MAILER"]: mailer_connection = mailer.RedisConnection(app.redis) else: mailer_connection = mailer.SMTPConnection( diff --git a/atst/domain/auth.py b/atst/domain/auth.py index 73bb1db1..77c22438 100644 --- a/atst/domain/auth.py +++ b/atst/domain/auth.py @@ -1,4 +1,13 @@ -from flask import g, redirect, url_for, session, request, current_app as app +from flask import ( + g, + redirect, + url_for, + session, + request, + current_app as app, + _request_ctx_stack as request_ctx_stack, +) +from werkzeug.datastructures import ImmutableTypeConversionDict from atst.domain.users import Users @@ -10,7 +19,6 @@ UNPROTECTED_ROUTES = [ "atst.login_redirect", "atst.logout", "atst.unauthorized", - "atst.helpdocs", "static", "atst.about", ] @@ -57,12 +65,26 @@ def get_last_login(): return session.get("user_id") and session.get("last_login") +def _nullify_session(session): + session_key = f"{app.config.get('SESSION_KEY_PREFIX')}{session.sid}" + app.redis.delete(session_key) + request.cookies = ImmutableTypeConversionDict() + request_ctx_stack.top.session = app.session_interface.open_session(app, request) + + +def _current_dod_id(): + return g.current_user.dod_id if session.get("user_id") else None + + def logout(): - if session.get("user_id"): # pragma: no branch - dod_id = g.current_user.dod_id - del session["user_id"] - del session["last_login"] + dod_id = _current_dod_id() + + _nullify_session(session) + + if dod_id: app.logger.info(f"user with EDIPI {dod_id} has logged out") + else: + app.logger.info("unauthenticated user has logged out") def _unprotected_route(request): diff --git a/atst/domain/csp/cloud.py b/atst/domain/csp/cloud.py index b46b03b4..104e3e0e 100644 --- a/atst/domain/csp/cloud.py +++ b/atst/domain/csp/cloud.py @@ -490,6 +490,12 @@ class CloudProviderInterface: """ raise NotImplementedError() + def create_subscription(self, environment): + """Returns True if a new subscription has been created or raises an + exception if an error occurs while creating a subscription. + """ + raise NotImplementedError() + class MockCloudProvider(CloudProviderInterface): @@ -763,6 +769,11 @@ class MockCloudProvider(CloudProviderInterface): return self._maybe(12) + def create_subscription(self, environment): + self._maybe_raise(self.UNAUTHORIZED_RATE, GeneralCSPException) + + return True + def get_calculator_url(self): return "https://www.rackspace.com/en-us/calculator" diff --git a/atst/forms/application.py b/atst/forms/application.py index de6294cd..3fda8f8f 100644 --- a/atst/forms/application.py +++ b/atst/forms/application.py @@ -1,14 +1,14 @@ from .forms import BaseForm, remove_empty_string from wtforms.fields import StringField, TextAreaField, FieldList -from wtforms.validators import Required, Optional -from atst.forms.validators import ListItemRequired, ListItemsUnique +from wtforms.validators import Required, Optional, Length +from atst.forms.validators import ListItemRequired, ListItemsUnique, Name, AlphaNumeric from atst.utils.localization import translate class EditEnvironmentForm(BaseForm): name = StringField( label=translate("forms.environments.name_label"), - validators=[Required()], + validators=[Required(), Name(), Length(max=100)], filters=[remove_empty_string], ) @@ -16,12 +16,12 @@ class EditEnvironmentForm(BaseForm): class NameAndDescriptionForm(BaseForm): name = StringField( label=translate("forms.application.name_label"), - validators=[Required()], + validators=[Required(), Name(), Length(max=100)], filters=[remove_empty_string], ) description = TextAreaField( label=translate("forms.application.description_label"), - validators=[Optional()], + validators=[Optional(), Length(max=1_000)], filters=[remove_empty_string], ) @@ -31,6 +31,7 @@ class EnvironmentsForm(BaseForm): StringField( label=translate("forms.application.environment_names_label"), filters=[remove_empty_string], + validators=[AlphaNumeric(), Length(max=100)], ), validators=[ ListItemRequired( diff --git a/atst/forms/application_member.py b/atst/forms/application_member.py index ec873f77..a1a4f704 100644 --- a/atst/forms/application_member.py +++ b/atst/forms/application_member.py @@ -1,5 +1,6 @@ from flask_wtf import FlaskForm from wtforms.fields import FormField, FieldList, HiddenField, BooleanField +from wtforms.validators import UUID from wtforms import Form from .member import NewForm as BaseNewMemberForm @@ -7,11 +8,13 @@ from .data import ENV_ROLES, ENV_ROLE_NO_ACCESS as NO_ACCESS from atst.forms.fields import SelectField from atst.domain.permission_sets import PermissionSets from atst.utils.localization import translate +from atst.forms.validators import AlphaNumeric +from wtforms.validators import Length class EnvironmentForm(Form): - environment_id = HiddenField() - environment_name = HiddenField() + environment_id = HiddenField(validators=[UUID()]) + environment_name = HiddenField(validators=[AlphaNumeric(), Length(max=100)]) role = SelectField( environment_name, choices=ENV_ROLES, @@ -43,13 +46,6 @@ class PermissionsForm(FlaskForm): "portfolios.applications.members.form.team_mgmt.description" ), ) - perms_del_env = BooleanField( - translate("portfolios.applications.members.form.del_env.label"), - default=False, - description=translate( - "portfolios.applications.members.form.del_env.description" - ), - ) @property def data(self): @@ -63,9 +59,6 @@ class PermissionsForm(FlaskForm): if _data["perms_team_mgmt"]: perm_sets.append(PermissionSets.EDIT_APPLICATION_TEAM) - if _data["perms_del_env"]: - perm_sets.append(PermissionSets.DELETE_APPLICATION_ENVIRONMENTS) - _data["permission_sets"] = perm_sets return _data diff --git a/atst/forms/ccpo_user.py b/atst/forms/ccpo_user.py index e9e07ec2..7fafb88c 100644 --- a/atst/forms/ccpo_user.py +++ b/atst/forms/ccpo_user.py @@ -2,12 +2,12 @@ from flask_wtf import FlaskForm from wtforms.validators import Required, Length from wtforms.fields import StringField -from atst.forms.validators import IsNumber +from atst.forms.validators import Number from atst.utils.localization import translate class CCPOUserForm(FlaskForm): dod_id = StringField( translate("forms.new_member.dod_id_label"), - validators=[Required(), Length(min=10, max=10), IsNumber()], + validators=[Required(), Length(min=10, max=10), Number()], ) diff --git a/atst/forms/edit_user.py b/atst/forms/edit_user.py index 835db7e3..9d2a8ffc 100644 --- a/atst/forms/edit_user.py +++ b/atst/forms/edit_user.py @@ -9,22 +9,26 @@ from .forms import BaseForm from .data import SERVICE_BRANCHES from atst.models.user import User from atst.utils.localization import translate +from wtforms.validators import Length +from atst.forms.validators import Number from .validators import Name, DateRange, PhoneNumber USER_FIELDS = { "first_name": StringField( - translate("forms.edit_user.first_name_label"), validators=[Name()] + translate("forms.edit_user.first_name_label"), + validators=[Name(), Length(max=100)], ), "last_name": StringField( - translate("forms.edit_user.last_name_label"), validators=[Name()] + translate("forms.edit_user.last_name_label"), + validators=[Name(), Length(max=100)], ), "email": EmailField(translate("forms.edit_user.email_label"), validators=[Email()]), "phone_number": TelField( translate("forms.edit_user.phone_number_label"), validators=[PhoneNumber()] ), - "phone_ext": StringField("Extension"), + "phone_ext": StringField("Extension", validators=[Number(), Length(max=10)]), "service_branch": SelectField( translate("forms.edit_user.service_branch_label"), choices=SERVICE_BRANCHES ), diff --git a/atst/forms/member.py b/atst/forms/member.py index a97d5852..4bfb2269 100644 --- a/atst/forms/member.py +++ b/atst/forms/member.py @@ -3,16 +3,18 @@ from wtforms.fields.html5 import EmailField, TelField from wtforms.validators import Required, Email, Length, Optional from wtforms.fields import StringField -from atst.forms.validators import IsNumber, PhoneNumber +from atst.forms.validators import Number, PhoneNumber, Name from atst.utils.localization import translate class NewForm(FlaskForm): first_name = StringField( - label=translate("forms.new_member.first_name_label"), validators=[Required()] + label=translate("forms.new_member.first_name_label"), + validators=[Required(), Name(), Length(max=100)], ) last_name = StringField( - label=translate("forms.new_member.last_name_label"), validators=[Required()] + label=translate("forms.new_member.last_name_label"), + validators=[Required(), Name(), Length(max=100)], ) email = EmailField( translate("forms.new_member.email_label"), validators=[Required(), Email()] @@ -21,8 +23,8 @@ class NewForm(FlaskForm): translate("forms.new_member.phone_number_label"), validators=[Optional(), PhoneNumber()], ) - phone_ext = StringField("Extension") + phone_ext = StringField("Extension", validators=[Number(), Length(max=10)]) dod_id = StringField( translate("forms.new_member.dod_id_label"), - validators=[Required(), Length(min=10), IsNumber()], + validators=[Required(), Length(min=10), Number()], ) diff --git a/atst/forms/portfolio.py b/atst/forms/portfolio.py index 069659bb..7c4e6644 100644 --- a/atst/forms/portfolio.py +++ b/atst/forms/portfolio.py @@ -4,6 +4,7 @@ from wtforms.fields import ( TextAreaField, ) from wtforms.validators import Length, InputRequired +from atst.forms.validators import Name from wtforms.widgets import ListWidget, CheckboxInput from .forms import BaseForm @@ -20,14 +21,18 @@ class PortfolioForm(BaseForm): min=4, max=100, message=translate("forms.portfolio.name.length_validation_message"), - ) + ), + Name(), ], ) - description = TextAreaField(translate("forms.portfolio.description.label"),) + description = TextAreaField( + translate("forms.portfolio.description.label"), validators=[Length(max=1_000)] + ) class PortfolioCreationForm(PortfolioForm): defense_component = SelectMultipleField( + translate("forms.portfolio.defense_component.title"), choices=SERVICE_BRANCHES, widget=ListWidget(prefix_label=False), option_widget=CheckboxInput(), diff --git a/atst/forms/task_order.py b/atst/forms/task_order.py index 1c324736..6b209bf8 100644 --- a/atst/forms/task_order.py +++ b/atst/forms/task_order.py @@ -7,9 +7,15 @@ from wtforms.fields import ( HiddenField, ) from wtforms.fields.html5 import DateField -from wtforms.validators import Required, Length, NumberRange, ValidationError +from wtforms.validators import ( + Required, + Length, + NumberRange, + ValidationError, +) from flask_wtf import FlaskForm -from numbers import Number +import numbers +from atst.forms.validators import Number, AlphaNumeric from .data import JEDI_CLIN_TYPES from .fields import SelectField @@ -17,7 +23,7 @@ from .forms import BaseForm, remove_empty_string from atst.utils.localization import translate from flask import current_app as app -MAX_CLIN_AMOUNT = 1000000000 +MAX_CLIN_AMOUNT = 1_000_000_000 def coerce_enum(enum_inst): @@ -29,8 +35,8 @@ def coerce_enum(enum_inst): def validate_funding(form, field): if ( - isinstance(form.total_amount.data, Number) - and isinstance(field.data, Number) + isinstance(form.total_amount.data, numbers.Number) + and isinstance(field.data, numbers.Number) and form.total_amount.data < field.data ): raise ValidationError( @@ -61,7 +67,10 @@ class CLINForm(FlaskForm): coerce=coerce_enum, ) - number = StringField(label=translate("task_orders.form.clin_number_label")) + number = StringField( + label=translate("task_orders.form.clin_number_label"), + validators=[Number(), Length(max=4)], + ) start_date = DateField( translate("task_orders.form.pop_start"), description=translate("task_orders.form.pop_example"), @@ -116,7 +125,10 @@ class AttachmentForm(BaseForm): filename = HiddenField( id="attachment_filename", validators=[ - Length(max=100, message=translate("forms.attachment.filename.length_error")) + Length( + max=100, message=translate("forms.attachment.filename.length_error") + ), + AlphaNumeric(), ], ) object_name = HiddenField( @@ -124,7 +136,8 @@ class AttachmentForm(BaseForm): validators=[ Length( max=40, message=translate("forms.attachment.object_name.length_error") - ) + ), + AlphaNumeric(), ], ) accept = ".pdf,application/pdf" @@ -137,6 +150,7 @@ class TaskOrderForm(BaseForm): number = StringField( label=translate("forms.task_order.number_description"), filters=[remove_empty_string], + validators=[Number(), Length(max=13)], ) pdf = FormField( AttachmentForm, diff --git a/atst/forms/validators.py b/atst/forms/validators.py index a16bf4f5..1bbcd645 100644 --- a/atst/forms/validators.py +++ b/atst/forms/validators.py @@ -2,7 +2,7 @@ from datetime import datetime import re from werkzeug.datastructures import FileStorage -from wtforms.validators import ValidationError +from wtforms.validators import ValidationError, Regexp import pendulum from atst.utils.localization import translate @@ -31,12 +31,13 @@ def DateRange(lower_bound=None, upper_bound=None, message=None): return _date_range -def IsNumber(message=translate("forms.validators.is_number_message")): +def Number(message=translate("forms.validators.is_number_message")): def _is_number(form, field): - try: - int(field.data) - except (ValueError, TypeError): - raise ValidationError(message) + if field.data: + try: + int(field.data) + except (ValueError, TypeError): + raise ValidationError(message) return _is_number @@ -97,3 +98,7 @@ def FileLength(max_length=50000000, message=None): field.data.seek(0) return _file_length + + +def AlphaNumeric(message=translate("forms.validators.alpha_numeric_message")): + return Regexp(regex=r"^[A-Za-z0-9\-_ \.]*$", message=message) diff --git a/atst/routes/__init__.py b/atst/routes/__init__.py index 4e366a08..78934400 100644 --- a/atst/routes/__init__.py +++ b/atst/routes/__init__.py @@ -42,29 +42,11 @@ def root(): return render_template("login.html", redirect_url=redirect_url) -@bp.route("/help") -@bp.route("/help/") -def helpdocs(doc=None): - docs = [os.path.splitext(file)[0] for file in os.listdir("templates/help/docs")] - if doc: - return render_template("help/docs/{}.html".format(doc), docs=docs, doc=doc) - else: - return render_template("help/index.html", docs=docs, doc=doc) - - @bp.route("/home") def home(): return render_template("home.html") -@bp.route("/") -def catch_all(path): - try: - return render_template("{}.html".format(path)) - except TemplateNotFound: - raise NotFound() - - def _client_s_dn(): return request.environ.get("HTTP_X_SSL_CLIENT_S_DN") diff --git a/atst/routes/applications/index.py b/atst/routes/applications/index.py index 92b65398..8b249faa 100644 --- a/atst/routes/applications/index.py +++ b/atst/routes/applications/index.py @@ -26,7 +26,7 @@ def has_portfolio_applications(_user, portfolio=None, **_kwargs): def portfolio_applications(portfolio_id): user_env_roles = EnvironmentRoles.for_user(g.current_user.id, portfolio_id) environment_access = { - env_role.environment_id: env_role.role for env_role in user_env_roles + env_role.environment_id: env_role.role.value for env_role in user_env_roles } return render_template( diff --git a/atst/routes/applications/settings.py b/atst/routes/applications/settings.py index 91676cfb..b4e75fc1 100644 --- a/atst/routes/applications/settings.py +++ b/atst/routes/applications/settings.py @@ -1,9 +1,10 @@ from flask import ( + current_app as app, + g, redirect, render_template, request as http_request, url_for, - g, ) from .blueprint import applications_bp @@ -64,9 +65,6 @@ def filter_perm_sets_data(member): "perms_env_mgmt": bool( member.has_permission_set(PermissionSets.EDIT_APPLICATION_ENVIRONMENTS) ), - "perms_del_env": bool( - member.has_permission_set(PermissionSets.DELETE_APPLICATION_ENVIRONMENTS) - ), } return perm_sets_data @@ -509,11 +507,7 @@ def resend_invite(application_id, application_role_id): token=new_invite.token, ) - flash( - "application_invite_resent", - user_name=new_invite.user_name, - application_name=app_role.application.name, - ) + flash("application_invite_resent", email=new_invite.email) else: flash( "application_invite_error", @@ -529,3 +523,31 @@ def resend_invite(application_id, application_role_id): _anchor="application-members", ) ) + + +@applications_bp.route( + "/environments//add_subscription", methods=["POST"] +) +@user_can(Permissions.EDIT_ENVIRONMENT, message="create new environment subscription") +def create_subscription(environment_id): + environment = Environments.get(environment_id) + + try: + app.csp.cloud.create_subscription(environment) + flash("environment_subscription_success", name=environment.displayname) + + except GeneralCSPException: + flash("environment_subscription_failure") + return ( + render_settings_page(application=environment.application, show_flash=True), + 400, + ) + + return redirect( + url_for( + "applications.settings", + application_id=environment.application.id, + fragment="application-environments", + _anchor="application-environments", + ) + ) diff --git a/atst/routes/portfolios/admin.py b/atst/routes/portfolios/admin.py index 699bdfab..4318a47c 100644 --- a/atst/routes/portfolios/admin.py +++ b/atst/routes/portfolios/admin.py @@ -19,9 +19,6 @@ from atst.domain.exceptions import UnauthorizedError def filter_perm_sets_data(member): perm_sets_data = { - "perms_portfolio_mgmt": bool( - member.has_permission_set(PermissionSets.EDIT_PORTFOLIO_ADMIN) - ), "perms_app_mgmt": bool( member.has_permission_set( PermissionSets.EDIT_PORTFOLIO_APPLICATION_MANAGEMENT @@ -33,24 +30,43 @@ def filter_perm_sets_data(member): "perms_reporting": bool( member.has_permission_set(PermissionSets.EDIT_PORTFOLIO_REPORTS) ), + "perms_portfolio_mgmt": bool( + member.has_permission_set(PermissionSets.EDIT_PORTFOLIO_ADMIN) + ), } return perm_sets_data -def filter_members_data(members_list, portfolio): +def filter_members_data(members_list): members_data = [] for member in members_list: - members_data.append( - { - "role_id": member.id, - "user_name": member.user_name, - "permission_sets": filter_perm_sets_data(member), - "status": member.display_status, - "ppoc": PermissionSets.PORTFOLIO_POC in member.permission_sets, - # add in stuff here for forms - } + permission_sets = filter_perm_sets_data(member) + ppoc = ( + PermissionSets.get(PermissionSets.PORTFOLIO_POC) in member.permission_sets ) + member_data = { + "role_id": member.id, + "user_name": member.user_name, + "permission_sets": filter_perm_sets_data(member), + "status": member.display_status, + "ppoc": ppoc, + "form": member_forms.PermissionsForm(permission_sets), + } + + if not ppoc: + member_data["update_invite_form"] = ( + member_forms.NewForm(user_data=member.latest_invitation) + if member.latest_invitation and member.latest_invitation.can_resend + else member_forms.NewForm() + ) + member_data["invite_token"] = ( + member.latest_invitation.token + if member.latest_invitation and member.latest_invitation.can_resend + else None + ) + + members_data.append(member_data) return sorted(members_data, key=lambda member: member["user_name"]) @@ -75,7 +91,7 @@ def render_admin_page(portfolio, form=None): "portfolios/admin.html", form=form, portfolio_form=portfolio_form, - members=filter_members_data(member_list, portfolio), + members=filter_members_data(member_list), new_manager_form=member_forms.NewForm(), assign_ppoc_form=assign_ppoc_form, portfolio=portfolio, @@ -93,26 +109,27 @@ def admin(portfolio_id): return render_admin_page(portfolio) -@portfolios_bp.route("/portfolios//update_ppoc", methods=["POST"]) -@user_can(Permissions.EDIT_PORTFOLIO_POC, message="update portfolio ppoc") -def update_ppoc(portfolio_id): - role_id = http_request.form.get("role_id") - - portfolio = Portfolios.get(g.current_user, portfolio_id) - new_ppoc_role = PortfolioRoles.get_by_id(role_id) - - PortfolioRoles.make_ppoc(portfolio_role=new_ppoc_role) - - flash("primary_point_of_contact_changed", ppoc_name=new_ppoc_role.full_name) - - return redirect( - url_for( - "portfolios.admin", - portfolio_id=portfolio.id, - fragment="primary-point-of-contact", - _anchor="primary-point-of-contact", - ) - ) +# Updating PPoC is a post-MVP feature +# @portfolios_bp.route("/portfolios//update_ppoc", methods=["POST"]) +# @user_can(Permissions.EDIT_PORTFOLIO_POC, message="update portfolio ppoc") +# def update_ppoc(portfolio_id): # pragma: no cover +# role_id = http_request.form.get("role_id") +# +# portfolio = Portfolios.get(g.current_user, portfolio_id) +# new_ppoc_role = PortfolioRoles.get_by_id(role_id) +# +# PortfolioRoles.make_ppoc(portfolio_role=new_ppoc_role) +# +# flash("primary_point_of_contact_changed", ppoc_name=new_ppoc_role.full_name) +# +# return redirect( +# url_for( +# "portfolios.admin", +# portfolio_id=portfolio.id, +# fragment="primary-point-of-contact", +# _anchor="primary-point-of-contact", +# ) +# ) @portfolios_bp.route("/portfolios//edit", methods=["POST"]) @@ -166,3 +183,30 @@ def remove_member(portfolio_id, portfolio_role_id): fragment="portfolio-members", ) ) + + +@portfolios_bp.route( + "/portfolios//members/", methods=["POST"] +) +@user_can(Permissions.EDIT_PORTFOLIO_USERS, message="update portfolio members") +def update_member(portfolio_id, portfolio_role_id): + form_data = http_request.form + form = member_forms.PermissionsForm(formdata=form_data) + portfolio_role = PortfolioRoles.get_by_id(portfolio_role_id) + portfolio = Portfolios.get(user=g.current_user, portfolio_id=portfolio_id) + + if form.validate() and portfolio.owner_role != portfolio_role: + PortfolioRoles.update(portfolio_role, form.data["permission_sets"]) + flash("update_portfolio_member", member_name=portfolio_role.full_name) + + return redirect( + url_for( + "portfolios.admin", + portfolio_id=portfolio_id, + _anchor="portfolio-members", + fragment="portfolio-members", + ) + ) + else: + flash("update_portfolio_member_error", member_name=portfolio_role.full_name) + return (render_admin_page(portfolio), 400) diff --git a/atst/routes/portfolios/invitations.py b/atst/routes/portfolios/invitations.py index 09a22d1f..9ec56aa3 100644 --- a/atst/routes/portfolios/invitations.py +++ b/atst/routes/portfolios/invitations.py @@ -54,13 +54,22 @@ def revoke_invitation(portfolio_id, portfolio_token): ) @user_can(Permissions.EDIT_PORTFOLIO_USERS, message="resend invitation") def resend_invitation(portfolio_id, portfolio_token): - invite = PortfolioInvitations.resend(g.current_user, portfolio_token) - send_portfolio_invitation( - invitee_email=invite.email, - inviter_name=g.current_user.full_name, - token=invite.token, - ) - flash("resend_portfolio_invitation", user_name=invite.user_name) + form = member_forms.NewForm(http_request.form) + + if form.validate(): + invite = PortfolioInvitations.resend( + g.current_user, portfolio_token, form.data["user_data"] + ) + send_portfolio_invitation( + invitee_email=invite.email, + inviter_name=g.current_user.full_name, + token=invite.token, + ) + flash("resend_portfolio_invitation", email=invite.email) + else: + user_name = f"{form['user_data']['first_name'].data} {form['user_data']['last_name'].data}" + flash("resend_portfolio_invitation_error", user_name=user_name) + return redirect( url_for( "portfolios.admin", diff --git a/atst/utils/flash.py b/atst/utils/flash.py index da2c9253..ea85f1ef 100644 --- a/atst/utils/flash.py +++ b/atst/utils/flash.py @@ -29,7 +29,7 @@ MESSAGES = { "category": "error", }, "application_invite_resent": { - "title": "flash.application_invite.resent.title", + "title": None, "message": "flash.application_invite.resent.message", "category": "success", }, @@ -83,6 +83,16 @@ MESSAGES = { "message": "flash.environment.deleted.message", "category": "success", }, + "environment_subscription_failure": { + "title": "flash.environment.subscription_failure.title", + "message": "flash.environment.subscription_failure.message", + "category": "error", + }, + "environment_subscription_success": { + "title": "flash.environment.subscription_success.title", + "message": "flash.environment.subscription_success.message", + "category": "success", + }, "form_errors": { "title": "flash.form.errors.title", "message": "flash.form.errors.message", @@ -90,7 +100,7 @@ MESSAGES = { }, "insufficient_funds": { "title": "flash.task_order.insufficient_funds.title", - "message": "", + "message": None, "category": "warning", }, "logged_out": { @@ -109,8 +119,8 @@ MESSAGES = { "category": "success", }, "new_portfolio_member": { - "title": "flash.success", - "message": "flash.new_portfolio_member", + "title": "flash.new_portfolio_member.title", + "message": "flash.new_portfolio_member.message", "category": "success", }, "portfolio_member_removed": { @@ -124,10 +134,15 @@ MESSAGES = { "category": "success", }, "resend_portfolio_invitation": { - "title": "flash.portfolio_invite.resent.title", + "title": None, "message": "flash.portfolio_invite.resent.message", "category": "success", }, + "resend_portfolio_invitation_error": { + "title": "flash.portfolio_invite.error.title", + "message": "flash.portfolio_invite.error.message", + "category": "error", + }, "revoked_portfolio_access": { "title": "flash.portfolio_member.revoked.title", "message": "flash.portfolio_member.revoked.message", @@ -153,6 +168,16 @@ MESSAGES = { "message": "flash.task_order.submitted.message", "category": "success", }, + "update_portfolio_member": { + "title": "flash.portfolio_member.update.title", + "message": "flash.portfolio_member.update.message", + "category": "success", + }, + "update_portfolio_member_error": { + "title": "flash.portfolio_member.update_error.title", + "message": "flash.portfolio_member.update_error.message", + "category": "error", + }, "updated_application_team_settings": { "title": "flash.success", "message": "flash.updated_application_team_settings", diff --git a/atst/utils/session_limiter.py b/atst/utils/session_limiter.py index cae43c5d..e0c02e0d 100644 --- a/atst/utils/session_limiter.py +++ b/atst/utils/session_limiter.py @@ -4,6 +4,7 @@ from atst.domain.users import Users class SessionLimiter(object): def __init__(self, config, session, redis): self.limit_logins = config["LIMIT_CONCURRENT_SESSIONS"] + self.session_prefix = config.get("SESSION_KEY_PREFIX", "session:") self.session = session self.redis = redis @@ -16,4 +17,4 @@ class SessionLimiter(object): Users.update_last_session_id(user, session_id) def _delete_session(self, session_id): - self.redis.delete("session:{}".format(session_id)) + self.redis.delete(f"{self.session_prefix}{session_id}") diff --git a/config/base.ini b/config/base.ini index 9233ef21..6fbcce73 100644 --- a/config/base.ini +++ b/config/base.ini @@ -15,6 +15,7 @@ CRL_FAIL_OPEN = false CRL_STORAGE_CONTAINER = crls CSP=mock DEBUG = true +DEBUG_MAILER = false DISABLE_CRL_CHECK = false ENVIRONMENT = dev LIMIT_CONCURRENT_SESSIONS = false @@ -41,6 +42,7 @@ SECRET_KEY = change_me_into_something_secret SERVER_NAME SESSION_COOKIE_NAME=atat SESSION_COOKIE_DOMAIN +SESSION_KEY_PREFIX=session: SESSION_TYPE = redis SESSION_USE_SIGNER = True SQLALCHEMY_ECHO = False diff --git a/deploy/azure/atst-envvars-configmap.yml b/deploy/azure/atst-envvars-configmap.yml index 6f412a3d..edd049a7 100644 --- a/deploy/azure/atst-envvars-configmap.yml +++ b/deploy/azure/atst-envvars-configmap.yml @@ -15,6 +15,7 @@ data: CSP: azure DEBUG: "0" FLASK_ENV: master + LIMIT_CONCURRENT_SESSIONS: "true" LOG_JSON: "true" MAIL_PORT: "587" MAIL_SENDER: postmaster@atat.code.mil diff --git a/deploy/azure/autoscaling.yml b/deploy/azure/autoscaling.yml new file mode 100644 index 00000000..e208d943 --- /dev/null +++ b/deploy/azure/autoscaling.yml @@ -0,0 +1,40 @@ +--- +apiVersion: autoscaling/v2beta1 +kind: HorizontalPodAutoscaler +metadata: + labels: + app: atst + name: atst + namespace: atat +spec: + minReplicas: 2 + maxReplicas: 10 + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: atst + metrics: + - type: Resource + resource: + name: cpu + targetAverageUtilization: 60 +--- +apiVersion: autoscaling/v2beta1 +kind: HorizontalPodAutoscaler +metadata: + labels: + app: atst + name: atst-worker + namespace: atat +spec: + minReplicas: 1 + maxReplicas: 10 + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: atst-worker + metrics: + - type: Resource + resource: + name: cpu + targetAverageUtilization: 60 diff --git a/deploy/azure/azure.yml b/deploy/azure/azure.yml index aa13b67e..f988d5fc 100644 --- a/deploy/azure/azure.yml +++ b/deploy/azure/azure.yml @@ -15,7 +15,6 @@ spec: selector: matchLabels: role: web - replicas: 4 strategy: type: RollingUpdate template: @@ -30,6 +29,13 @@ spec: containers: - name: atst image: $CONTAINER_IMAGE + env: + - name: UWSGI_PROCESSES + value: "2" + - name: UWSGI_THREADS + value: "2" + - name: UWSGI_ENABLE_THREADS + value: "1" envFrom: - configMapRef: name: atst-envvars @@ -51,11 +57,11 @@ spec: mountPath: "/config" resources: requests: - memory: 200Mi - cpu: 400m + memory: 400Mi + cpu: 940m limits: - memory: 200Mi - cpu: 400m + memory: 400Mi + cpu: 940m - name: nginx image: nginx:alpine ports: @@ -87,10 +93,10 @@ spec: resources: requests: memory: 20Mi - cpu: 10m + cpu: 25m limits: memory: 20Mi - cpu: 10m + cpu: 25m volumes: - name: nginx-client-ca-bundle configMap: @@ -169,7 +175,6 @@ spec: selector: matchLabels: role: worker - replicas: 2 strategy: type: RollingUpdate template: @@ -207,10 +212,10 @@ spec: resources: requests: memory: 280Mi - cpu: 20m + cpu: 400m limits: memory: 280Mi - cpu: 20m + cpu: 400m volumes: - name: pgsslrootcert configMap: @@ -311,6 +316,7 @@ metadata: namespace: atat spec: loadBalancerIP: 13.92.235.6 + externalTrafficPolicy: Local ports: - port: 80 targetPort: 8342 @@ -331,6 +337,7 @@ metadata: namespace: atat spec: loadBalancerIP: 23.100.24.41 + externalTrafficPolicy: Local ports: - port: 80 targetPort: 8343 diff --git a/deploy/azure/kustomization.yaml b/deploy/azure/kustomization.yaml index 9dee809c..d0162394 100644 --- a/deploy/azure/kustomization.yaml +++ b/deploy/azure/kustomization.yaml @@ -12,3 +12,4 @@ resources: - acme-challenges.yml - aadpodidentity.yml - nginx-snippets.yml + - autoscaling.yml diff --git a/deploy/azure/uwsgi-config.yml b/deploy/azure/uwsgi-config.yml index 553ea973..0c239637 100644 --- a/deploy/azure/uwsgi-config.yml +++ b/deploy/azure/uwsgi-config.yml @@ -10,6 +10,7 @@ data: callable = app module = app socket = /var/run/uwsgi/uwsgi.socket + plugins-dir = /usr/lib/uwsgi plugin = python3 plugin = logfile virtualenv = /opt/atat/atst/.venv diff --git a/deploy/minikube/atst-configmap.yml b/deploy/minikube/atst-configmap.yml deleted file mode 100644 index 79f9a61b..00000000 --- a/deploy/minikube/atst-configmap.yml +++ /dev/null @@ -1,35 +0,0 @@ ---- -apiVersion: v1 -kind: ConfigMap -metadata: - name: atst-config - namespace: atat -data: - uwsgi-config: |- - [uwsgi] - callable = app - module = app - socket = /var/run/uwsgi/uwsgi.socket - plugin = python3 - plugin = logfile - virtualenv = /opt/atat/atst/.venv - chmod-socket = 666 - - ; logger config - - ; application logs: log without modifying - logger = secondlogger stdio - log-route = secondlogger atst - log-encoder = format:secondlogger ${msg} - - ; default uWSGI messages (start, stop, etc.) - logger = default stdio - log-route = default ^((?!atst).)*$ - log-encoder = json:default {"timestamp":"${strftime:%%FT%%T}","source":"uwsgi","severity":"DEBUG","message":"${msg}"} - log-encoder = nl - - ; uWSGI request logs - logger-req = stdio - log-format = request_id=%(var.HTTP_X_REQUEST_ID), pid=%(pid), remote_add=%(addr), request=%(method) %(uri), status=%(status), body_bytes_sent=%(rsize), referer=%(referer), user_agent=%(uagent), http_x_forwarded_for=%(var.HTTP_X_FORWARDED_FOR) - log-req-encoder = json {"timestamp":"${strftime:%%FT%%T}","source":"req","severity":"INFO","message":"${msg}"} - log-req-encoder = nl diff --git a/deploy/minikube/atst-envvars-configmap.yml b/deploy/minikube/atst-envvars-configmap.yml deleted file mode 100644 index 997ce16a..00000000 --- a/deploy/minikube/atst-envvars-configmap.yml +++ /dev/null @@ -1,15 +0,0 @@ ---- -apiVersion: v1 -kind: ConfigMap -metadata: - name: atst-envvars - namespace: atat -data: - TZ: UTC - FLASK_ENV: dev - OVERRIDE_CONFIG_FULLPATH: /opt/atat/atst/atst-overrides.ini - UWSGI_CONFIG_FULLPATH: /opt/atat/atst/uwsgi.ini - CRL_STORAGE_PROVIDER: CLOUDFILES - LOG_JSON: "true" - REDIS_URI: "redis://redis-svc:6379" - PGHOST: postgres-svc diff --git a/deploy/minikube/atst-nginx-configmap.yml b/deploy/minikube/atst-nginx-configmap.yml deleted file mode 100644 index 7c0d7506..00000000 --- a/deploy/minikube/atst-nginx-configmap.yml +++ /dev/null @@ -1,73 +0,0 @@ ---- -apiVersion: v1 -kind: ConfigMap -metadata: - name: atst-nginx - namespace: atat -data: - nginx-config: |- - server { - listen 8342; - server_name aws.atat.code.mil; - return 301 https://$host$request_uri; - } - server { - listen 8343; - server_name auth-aws.atat.code.mil; - return 301 https://$host$request_uri; - } - server { - server_name aws.atat.code.mil; - # access_log /var/log/nginx/access.log json; - listen 8442; - location /login-redirect { - return 301 https://auth-aws.atat.code.mil$request_uri; - } - location /login-dev { - try_files $uri @appbasicauth; - } - location / { - try_files $uri @app; - } - location @app { - include uwsgi_params; - uwsgi_pass unix:///var/run/uwsgi/uwsgi.socket; - uwsgi_param HTTP_X_REQUEST_ID $request_id; - } - location @appbasicauth { - include uwsgi_params; - uwsgi_pass unix:///var/run/uwsgi/uwsgi.socket; - auth_basic "Developer Access"; - auth_basic_user_file /etc/nginx/.htpasswd; - uwsgi_param HTTP_X_REQUEST_ID $request_id; - } - } - server { - # access_log /var/log/nginx/access.log json; - server_name auth-aws.atat.code.mil; - listen 8443; - listen [::]:8443 ipv6only=on; - # Request and validate client certificate - ssl_verify_client on; - ssl_verify_depth 10; - ssl_client_certificate /etc/ssl/client-ca-bundle.pem; - # Guard against HTTPS -> HTTP downgrade - add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; always"; - location / { - return 301 https://aws.atat.code.mil$request_uri; - } - location /login-redirect { - try_files $uri @app; - } - location @app { - include uwsgi_params; - uwsgi_pass unix:///var/run/uwsgi/uwsgi.socket; - uwsgi_param HTTP_X_SSL_CLIENT_VERIFY $ssl_client_verify; - uwsgi_param HTTP_X_SSL_CLIENT_CERT $ssl_client_raw_cert; - uwsgi_param HTTP_X_SSL_CLIENT_S_DN $ssl_client_s_dn; - uwsgi_param HTTP_X_SSL_CLIENT_S_DN_LEGACY $ssl_client_s_dn_legacy; - uwsgi_param HTTP_X_SSL_CLIENT_I_DN $ssl_client_i_dn; - uwsgi_param HTTP_X_SSL_CLIENT_I_DN_LEGACY $ssl_client_i_dn_legacy; - uwsgi_param HTTP_X_REQUEST_ID $request_id; - } - } diff --git a/deploy/minikube/atst-worker-envvars-configmap.yml b/deploy/minikube/atst-worker-envvars-configmap.yml deleted file mode 100644 index 9d477597..00000000 --- a/deploy/minikube/atst-worker-envvars-configmap.yml +++ /dev/null @@ -1,12 +0,0 @@ ---- -apiVersion: v1 -kind: ConfigMap -metadata: - name: atst-worker-envvars - namespace: atat -data: - TZ: UTC - DISABLE_CRL_CHECK: "True" - CRL_STORAGE_PROVIDER: CLOUDFILES - REDIS_URI: "redis://redis-svc:6379" - PGHOST: postgres-svc diff --git a/deploy/minikube/datastores.yml b/deploy/minikube/datastores.yml deleted file mode 100644 index a3eeda7e..00000000 --- a/deploy/minikube/datastores.yml +++ /dev/null @@ -1,61 +0,0 @@ ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: - app: db-cache - name: datastores - namespace: atat -spec: - selector: - matchLabels: - app: db-cache - replicas: 1 - strategy: - type: RollingUpdate - template: - metadata: - labels: - app: db-cache - spec: - securityContext: - fsGroup: 101 - containers: - - name: postgres - image: postgres:11-alpine - imagePullPolicy: Never - ports: - - containerPort: 5432 - - name: redis - image: redis:5.0-alpine - imagePullPolicy: Never - ports: - - containerPort: 6379 ---- -apiVersion: v1 -kind: Service -metadata: - name: postgres-svc - namespace: atat -spec: - ports: - - name: db-port - protocol: "TCP" - port: 5432 - targetPort: 5432 - selector: - app: db-cache ---- -apiVersion: v1 -kind: Service -metadata: - name: redis-svc - namespace: atat -spec: - ports: - - name: cache-port - protocol: "TCP" - port: 6379 - targetPort: 6379 - selector: - app: db-cache diff --git a/deploy/minikube/minikube.yml b/deploy/minikube/minikube.yml deleted file mode 100644 index c78d663b..00000000 --- a/deploy/minikube/minikube.yml +++ /dev/null @@ -1,232 +0,0 @@ ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: - app: atst - name: atst - namespace: atat -spec: - selector: - matchLabels: - role: web - replicas: 1 - strategy: - type: RollingUpdate - template: - metadata: - labels: - app: atst - role: web - spec: - securityContext: - fsGroup: 101 - containers: - - name: atst - image: atat:latest - imagePullPolicy: Never - envFrom: - - configMapRef: - name: atst-envvars - volumeMounts: - - name: atst-config - mountPath: "/opt/atat/atst/atst-overrides.ini" - subPath: atst-overrides.ini - - name: nginx-client-ca-bundle - mountPath: "/opt/atat/atst/ssl/server-certs/ca-chain.pem" - subPath: client-ca-bundle.pem - - name: uwsgi-socket-dir - mountPath: "/var/run/uwsgi" - - name: nginx - image: nginx:alpine - imagePullPolicy: Never - ports: - - containerPort: 8342 - name: main-upgrade - - containerPort: 8442 - name: main - - containerPort: 8343 - name: auth-upgrade - - containerPort: 8443 - name: auth - volumeMounts: - - name: nginx-config - mountPath: "/etc/nginx/conf.d/atst.conf" - subPath: atst.conf - - name: uwsgi-socket-dir - mountPath: "/var/run/uwsgi" - - name: nginx-htpasswd - mountPath: "/etc/nginx/.htpasswd" - subPath: .htpasswd - - name: nginx-client-ca-bundle - mountPath: "/etc/ssl/" - volumes: - - name: atst-config - secret: - secretName: atst-config-ini - items: - - key: override.ini - path: atst-overrides.ini - mode: 0644 - - name: nginx-client-ca-bundle - configMap: - name: nginx-client-ca-bundle - defaultMode: 0666 - - name: nginx-config - configMap: - name: atst-nginx - items: - - key: nginx-config - path: atst.conf - - name: uwsgi-socket-dir - emptyDir: - medium: Memory - - name: nginx-htpasswd - secret: - secretName: atst-nginx-htpasswd - items: - - key: htpasswd - path: .htpasswd - mode: 0640 ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: - app: atst - name: atst-worker - namespace: atat -spec: - selector: - matchLabels: - role: worker - replicas: 1 - strategy: - type: RollingUpdate - template: - metadata: - labels: - app: atst - role: worker - spec: - securityContext: - fsGroup: 101 - containers: - - name: atst-worker - image: atat:latest - imagePullPolicy: Never - args: [ - "/opt/atat/atst/.venv/bin/python", - "/opt/atat/atst/.venv/bin/celery", - "-A", - "celery_worker.celery", - "worker", - "--loglevel=info" - ] - envFrom: - - configMapRef: - name: atst-envvars - - configMapRef: - name: atst-worker-envvars - volumeMounts: - - name: atst-config - mountPath: "/opt/atat/atst/atst-overrides.ini" - subPath: atst-overrides.ini - volumes: - - name: atst-config - secret: - secretName: atst-config-ini - items: - - key: override.ini - path: atst-overrides.ini - mode: 0644 ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: - app: atst - name: atst-beat - namespace: atat -spec: - selector: - matchLabels: - role: beat - replicas: 1 - strategy: - type: RollingUpdate - template: - metadata: - labels: - app: atst - role: beat - spec: - securityContext: - fsGroup: 101 - containers: - - name: atst-beat - image: atat:latest - imagePullPolicy: Never - args: [ - "/opt/atat/atst/.venv/bin/python", - "/opt/atat/atst/.venv/bin/celery", - "-A", - "celery_worker.celery", - "beat", - "--loglevel=info" - ] - envFrom: - - configMapRef: - name: atst-envvars - - configMapRef: - name: atst-worker-envvars - volumeMounts: - - name: atst-config - mountPath: "/opt/atat/atst/atst-overrides.ini" - subPath: atst-overrides.ini - volumes: - - name: atst-config - secret: - secretName: atst-config-ini - items: - - key: override.ini - path: atst-overrides.ini - mode: 0644 ---- -apiVersion: v1 -kind: Service -metadata: - labels: - app: atst - name: atst-main - namespace: atat -spec: - ports: - - port: 80 - targetPort: 8342 - name: http-main - - port: 443 - targetPort: 8442 - name: https-main - selector: - role: web - type: LoadBalancer ---- -apiVersion: v1 -kind: Service -metadata: - labels: - app: atst - name: atst-auth - namespace: atat -spec: - ports: - - port: 80 - targetPort: 8343 - name: http-auth - - port: 443 - targetPort: 8443 - name: https-auth - selector: - role: web - type: LoadBalancer diff --git a/deploy/minikube/nginx-client-ca-bundle.yml b/deploy/minikube/nginx-client-ca-bundle.yml deleted file mode 100644 index 40fac25f..00000000 --- a/deploy/minikube/nginx-client-ca-bundle.yml +++ /dev/null @@ -1,1359 +0,0 @@ -apiVersion: v1 -data: - client-ca-bundle.pem: |+ - -----BEGIN CERTIFICATE----- - MIIElTCCA32gAwIBAgIJAN5qDki+VlfPMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYD - VQQGEwJVUzEVMBMGA1UECBMMUGVubnN5bHZhbmlhMRUwEwYDVQQHEwxQaGlsYWRl - bHBoaWExEDAOBgNVBAoTB0ZhdXhEb0QxCzAJBgNVBAsTAlBXMREwDwYDVQQDEwhG - YXV4IERvRDEeMBwGCSqGSIb3DQEJARYPZmF1eGRvZEBkb2QuY29tMB4XDTE4MDYy - MDIwMzg0N1oXDTE5MDYyMDIwMzg0N1owgY0xCzAJBgNVBAYTAlVTMRUwEwYDVQQI - EwxQZW5uc3lsdmFuaWExFTATBgNVBAcTDFBoaWxhZGVscGhpYTEQMA4GA1UEChMH - RmF1eERvRDELMAkGA1UECxMCUFcxETAPBgNVBAMTCEZhdXggRG9EMR4wHAYJKoZI - hvcNAQkBFg9mYXV4ZG9kQGRvZC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw - ggEKAoIBAQDyQUFcuQ+YKOEJtv4XjKOTpOLp8IdbsaFwU8YgenMdvAc1ONZRL/2o - jaCZx+kB2QSCVH2jaLUQ/2i4uz4rE21Ngpx+EHa1hgDQANle3d5CWrn2Q10/pdPe - rJHYkMSiZ3cNWfFPBfHDtJrLlRUwJkgy+lUSLnOaipmBZMYXbV8/qUh69nWJQNXi - AvmSUw8jwUPfTrpQVzftkOYz+0HVJyvKijTsj1LaPZTR3D8OhbFnvZWIlhIUjJZO - jap/xQ3YEOcNF+gfx8hDQG2SnltWgecPsgiBRXmZK2IqDv39DE2DNiukEclZLhbN - SpTibNZwkVzcTSRV2mSOHKXqTcH0wTvpAgMBAAGjgfUwgfIwHQYDVR0OBBYEFAo/ - 6auHcKMK1ItTElg1Kk4MyoB5MIHCBgNVHSMEgbowgbeAFAo/6auHcKMK1ItTElg1 - Kk4MyoB5oYGTpIGQMIGNMQswCQYDVQQGEwJVUzEVMBMGA1UECBMMUGVubnN5bHZh - bmlhMRUwEwYDVQQHEwxQaGlsYWRlbHBoaWExEDAOBgNVBAoTB0ZhdXhEb0QxCzAJ - BgNVBAsTAlBXMREwDwYDVQQDEwhGYXV4IERvRDEeMBwGCSqGSIb3DQEJARYPZmF1 - eGRvZEBkb2QuY29tggkA3moOSL5WV88wDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0B - AQUFAAOCAQEAp4fVYeSKYJICBQt37NOF6qZ+dv8GBDI+oZy7vC+VcjiRaODkiz9w - IO5dBZxx/ldH5sD24Oc2SH+48S6UjE/D5kDpM/nIddfVfL2f222sE14RsqgrhmbG - qRaEB8NXWiSQyKOKX63v8scioUqb9hFY+gtwb8HDFiOZFx+67L/NaXSh6VA8BbLj - o55EafjTgr+Yad7SrZI5f6Q2iQ+uuHcJsf7fEe3Kts5Uwt5KXBBfMxeaSyQRxNX+ - JBBmy6MaxddPtus3MH+eIgI2Wp2rofH/PtGnSoizBj5IZXBkc18x1DG5pAJL4205 - EKQoicsafE27XBw45dK3cRBLXPWt8JrCBg== - -----END CERTIFICATE----- - subject=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DOD SW CA-58 - issuer=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DoD Root CA 5 - -----BEGIN CERTIFICATE----- - MIIDHTCCAqOgAwIBAgIBETAKBggqhkjOPQQDAzBbMQswCQYDVQQGEwJVUzEYMBYG - A1UEChMPVS5TLiBHb3Zlcm5tZW50MQwwCgYDVQQLEwNEb0QxDDAKBgNVBAsTA1BL - STEWMBQGA1UEAxMNRG9EIFJvb3QgQ0EgNTAeFw0xNjEyMTMxNDQwNTJaFw0yMjEy - MTIxNDQwNTJaMFoxCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9VLlMuIEdvdmVybm1l - bnQxDDAKBgNVBAsTA0RvRDEMMAoGA1UECxMDUEtJMRUwEwYDVQQDEwxET0QgU1cg - Q0EtNTgwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASi6z3lLSwaqQ6FPQrMxlIW2VBf - xYzA7f+z3pBb2AzNVnMVsRMbMe2f3LCLaAK3kVHbf2MFvd00UCQTaJNoBLrsL7pz - SA3jHtBglzOwI5755VNZydC2aK5Ozw+a2yMQrv+jggE6MIIBNjAfBgNVHSMEGDAW - gBSGwBVC+3F23D4tEVshEEQ1ysHcFDAdBgNVHQ4EFgQUJFUaC5AhLNYjqojSnum4 - raKAfdwwDgYDVR0PAQH/BAQDAgEGMD0GA1UdIAQ2MDQwCwYJYIZIAWUCAQsmMAsG - CWCGSAFlAgELKTALBglghkgBZQIBCywwCwYJYIZIAWUCAQs7MBIGA1UdEwEB/wQI - MAYBAf8CAQAwDAYDVR0kBAUwA4ABADA3BgNVHR8EMDAuMCygKqAohiZodHRwOi8v - Y3JsLmRpc2EubWlsL2NybC9ET0RST09UQ0E1LmNybDBKBggrBgEFBQcBAQQ+MDww - OgYIKwYBBQUHMAKGLmh0dHA6Ly9jcmwuZGlzYS5taWwvaXNzdWVkdG8vRE9EUk9P - VENBNV9JVC5wN2MwCgYIKoZIzj0EAwMDaAAwZQIxAKil1qozXdz7E7kAOhaZ7rOG - 81/dVR5o2KGPFavrto3g9eBE1SboimiKKiiveNnhtQIwLNAaeZukpj9sDs2e16vu - s4rRqS3tuansdH1Fy8j9InJojBLaYeJR60j0AchyqvaG - -----END CERTIFICATE----- - - subject=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DOD SW CA-57 - issuer=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DoD Root CA 5 - -----BEGIN CERTIFICATE----- - MIIDHTCCAqOgAwIBAgIBEDAKBggqhkjOPQQDAzBbMQswCQYDVQQGEwJVUzEYMBYG - A1UEChMPVS5TLiBHb3Zlcm5tZW50MQwwCgYDVQQLEwNEb0QxDDAKBgNVBAsTA1BL - STEWMBQGA1UEAxMNRG9EIFJvb3QgQ0EgNTAeFw0xNjEyMTMxNDM5NDlaFw0yMjEy - MTIxNDM5NDlaMFoxCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9VLlMuIEdvdmVybm1l - bnQxDDAKBgNVBAsTA0RvRDEMMAoGA1UECxMDUEtJMRUwEwYDVQQDEwxET0QgU1cg - Q0EtNTcwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARnTnlhX1XAyZxEwrGRe6CpxNu/ - /EDg3NjbHIEknhq5sh7gCEwtpy3+B37ss64mWq88JTWrtjdmmsuWDQgU6Y6x6QUM - 8NnU/iEILAdH+d8YC/OCoxxUdz13Hhkdlt1JB/6jggE6MIIBNjAfBgNVHSMEGDAW - gBSGwBVC+3F23D4tEVshEEQ1ysHcFDAdBgNVHQ4EFgQUWhIprDfUjj71jVO1IvA6 - BAnRo+swDgYDVR0PAQH/BAQDAgEGMD0GA1UdIAQ2MDQwCwYJYIZIAWUCAQsmMAsG - CWCGSAFlAgELKTALBglghkgBZQIBCywwCwYJYIZIAWUCAQs7MBIGA1UdEwEB/wQI - MAYBAf8CAQAwDAYDVR0kBAUwA4ABADA3BgNVHR8EMDAuMCygKqAohiZodHRwOi8v - Y3JsLmRpc2EubWlsL2NybC9ET0RST09UQ0E1LmNybDBKBggrBgEFBQcBAQQ+MDww - OgYIKwYBBQUHMAKGLmh0dHA6Ly9jcmwuZGlzYS5taWwvaXNzdWVkdG8vRE9EUk9P - VENBNV9JVC5wN2MwCgYIKoZIzj0EAwMDaAAwZQIxAJ0s/tXCmJaEmNjh96qg3PQR - JidParsm6DRIOPgL2umoWx9QQP5mCHebRXk/KBOvpwIwUEw7/IxrYi5bF+kZNnw0 - qansI3GZB9080HFde2/owhIWZ5GMDV8mKKhoNVn3kY/D - -----END CERTIFICATE----- - - subject=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DoD Root CA 5 - issuer=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DoD Root CA 5 - -----BEGIN CERTIFICATE----- - MIICJDCCAaqgAwIBAgIBDzAKBggqhkjOPQQDAzBbMQswCQYDVQQGEwJVUzEYMBYG - A1UEChMPVS5TLiBHb3Zlcm5tZW50MQwwCgYDVQQLEwNEb0QxDDAKBgNVBAsTA1BL - STEWMBQGA1UEAxMNRG9EIFJvb3QgQ0EgNTAeFw0xNjA2MTQxNzE3MjdaFw00MTA2 - MTQxNzE3MjdaMFsxCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9VLlMuIEdvdmVybm1l - bnQxDDAKBgNVBAsTA0RvRDEMMAoGA1UECxMDUEtJMRYwFAYDVQQDEw1Eb0QgUm9v - dCBDQSA1MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAENmLeC07Ax9cpRTp/HJnmKiF2 - sQDdjEf/wLG0+s46TlL7p+02LRweHJCNl6orpuLTc3N8XBzQZ/QKKdOQhOtR5fFe - HMDShoTFbdEkSQ7sF4nkaMjeGlwaBtA4GTMpARqBo0IwQDAdBgNVHQ4EFgQUhsAV - Qvtxdtw+LRFbIRBENcrB3BQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMB - Af8wCgYIKoZIzj0EAwMDaAAwZQIwQQbk3t5iNJ3fuKoW2W2iOB85IlfJcIQfkw9X - fgUvpUszzRXqV9XSKx+bjXzOarbMAjEAt4HS4TuTzxFk3AsvF9Jt1dgF5FByYmXc - pDzKYaUGmsn77cQwyXuJ4KW+Y1XmnBHj - -----END CERTIFICATE----- - - subject=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DOD SW CA-56 - issuer=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DoD Root CA 4 - -----BEGIN CERTIFICATE----- - MIIC4zCCAoigAwIBAgIBSTAMBggqhkjOPQQDAgUAMFsxCzAJBgNVBAYTAlVTMRgw - FgYDVQQKEw9VLlMuIEdvdmVybm1lbnQxDDAKBgNVBAsTA0RvRDEMMAoGA1UECxMD - UEtJMRYwFAYDVQQDEw1Eb0QgUm9vdCBDQSA0MB4XDTE2MTEyMjE1NDgyMloXDTIy - MTEyMzE1NDgyMlowWjELMAkGA1UEBhMCVVMxGDAWBgNVBAoMD1UuUy4gR292ZXJu - bWVudDEMMAoGA1UECwwDRG9EMQwwCgYDVQQLDANQS0kxFTATBgNVBAMMDERPRCBT - VyBDQS01NjBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJ8P6wqfbu85tSo6iiVb - QpyTzVfDbEcUuojsnZxa2ZviI59J9fOB6LkSxvoaclcIDG2CQHb/cTFRlYnmny28 - qhajggE6MIIBNjAfBgNVHSMEGDAWgBS9wblrTfQd7DCQv2JzwIQz8nEkhTAdBgNV - HQ4EFgQUvPL0UZ0qy+OdEFZjBXZWyd261FswDgYDVR0PAQH/BAQDAgGGMD0GA1Ud - IAQ2MDQwCwYJYIZIAWUCAQslMAsGCWCGSAFlAgELKDALBglghkgBZQIBCyswCwYJ - YIZIAWUCAQs7MBIGA1UdEwEB/wQIMAYBAf8CAQAwDAYDVR0kBAUwA4ABADA3BgNV - HR8EMDAuMCygKqAohiZodHRwOi8vY3JsLmRpc2EubWlsL2NybC9ET0RST09UQ0E0 - LmNybDBKBggrBgEFBQcBAQQ+MDwwOgYIKwYBBQUHMAKGLmh0dHA6Ly9jcmwuZGlz - YS5taWwvaXNzdWVkdG8vRE9EUk9PVENBNF9JVC5wN2MwDAYIKoZIzj0EAwIFAANH - ADBEAiBjgR3FzwuqcKfmIAyyghC85+C4WZWLlLV/pnA+KF16igIgdT3W8YPHEMGh - WPpqVeBR1xJfFBl4H+a8OxmJ8RTZdUQ= - -----END CERTIFICATE----- - - subject=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DOD SW CA-55 - issuer=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DoD Root CA 4 - -----BEGIN CERTIFICATE----- - MIIC5TCCAoigAwIBAgIBSDAMBggqhkjOPQQDAgUAMFsxCzAJBgNVBAYTAlVTMRgw - FgYDVQQKEw9VLlMuIEdvdmVybm1lbnQxDDAKBgNVBAsTA0RvRDEMMAoGA1UECxMD - UEtJMRYwFAYDVQQDEw1Eb0QgUm9vdCBDQSA0MB4XDTE2MTEyMjE1NDY0NloXDTIy - MTEyMzE1NDY0NlowWjELMAkGA1UEBhMCVVMxGDAWBgNVBAoMD1UuUy4gR292ZXJu - bWVudDEMMAoGA1UECwwDRG9EMQwwCgYDVQQLDANQS0kxFTATBgNVBAMMDERPRCBT - VyBDQS01NTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABDmzh2HFjUhGEaKxXU5E - jVU66fMJbN52tWk4QsBIU8rCcuKdzyoY3DTULRv5WdF4mjPHBTfycuWOmxztrU64 - N+ajggE6MIIBNjAfBgNVHSMEGDAWgBS9wblrTfQd7DCQv2JzwIQz8nEkhTAdBgNV - HQ4EFgQUpW9LHZK1y9132ba9SAa+BkgJNBgwDgYDVR0PAQH/BAQDAgGGMD0GA1Ud - IAQ2MDQwCwYJYIZIAWUCAQslMAsGCWCGSAFlAgELKDALBglghkgBZQIBCyswCwYJ - YIZIAWUCAQs7MBIGA1UdEwEB/wQIMAYBAf8CAQAwDAYDVR0kBAUwA4ABADA3BgNV - HR8EMDAuMCygKqAohiZodHRwOi8vY3JsLmRpc2EubWlsL2NybC9ET0RST09UQ0E0 - LmNybDBKBggrBgEFBQcBAQQ+MDwwOgYIKwYBBQUHMAKGLmh0dHA6Ly9jcmwuZGlz - YS5taWwvaXNzdWVkdG8vRE9EUk9PVENBNF9JVC5wN2MwDAYIKoZIzj0EAwIFAANJ - ADBGAiEA8zQA+T3anaM0b1QsYSEvu8Y95S03GGy8fG2Hoi661FICIQCDCbwQZD1Z - 8NhnjbOBDEonqzFEdiXgGiq26ss/1ejDaw== - -----END CERTIFICATE----- - - subject=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DOD ID SW CA-48 - issuer=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DoD Root CA 4 - -----BEGIN CERTIFICATE----- - MIIC2jCCAn6gAwIBAgIBCjAMBggqhkjOPQQDAgUAMFsxCzAJBgNVBAYTAlVTMRgw - FgYDVQQKEw9VLlMuIEdvdmVybm1lbnQxDDAKBgNVBAsTA0RvRDEMMAoGA1UECxMD - UEtJMRYwFAYDVQQDEw1Eb0QgUm9vdCBDQSA0MB4XDTE2MDQxMjEzMTk0OVoXDTIy - MDQxMzEzMTk0OVowXTELMAkGA1UEBhMCVVMxGDAWBgNVBAoTD1UuUy4gR292ZXJu - bWVudDEMMAoGA1UECxMDRG9EMQwwCgYDVQQLEwNQS0kxGDAWBgNVBAMTD0RPRCBJ - RCBTVyBDQS00ODBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABHP3gMIrM5XHrtPg - Np7Bm42eqJiheI0fMNe9WDJkFdJbJeTrdxUtYQJfb4nYmLlnGG7Bw3RLHhLhS0vi - MO0inc2jggEtMIIBKTAfBgNVHSMEGDAWgBS9wblrTfQd7DCQv2JzwIQz8nEkhTAd - BgNVHQ4EFgQUtraXanDTuzYAuelFdC8nlSryWQkwDgYDVR0PAQH/BAQDAgGGMDAG - A1UdIAQpMCcwCwYJYIZIAWUCAQsoMAsGCWCGSAFlAgELKzALBglghkgBZQIBCyUw - EgYDVR0TAQH/BAgwBgEB/wIBADAMBgNVHSQEBTADgAEAMDcGA1UdHwQwMC4wLKAq - oCiGJmh0dHA6Ly9jcmwuZGlzYS5taWwvY3JsL0RPRFJPT1RDQTQuY3JsMEoGCCsG - AQUFBwEBBD4wPDA6BggrBgEFBQcwAoYuaHR0cDovL2NybC5kaXNhLm1pbC9pc3N1 - ZWR0by9ET0RST09UQ0E0X0lULnA3YzAMBggqhkjOPQQDAgUAA0gAMEUCIQC+iGG8 - kjbV/VNcKlxuuufzU0hVa3nbY+AH1G/019EVGgIgOBioOJjL2DEOswswow0z0Way - O+Dq52y9IIt1LNiEuQw= - -----END CERTIFICATE----- - - subject=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DOD ID SW CA-47 - issuer=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DoD Root CA 4 - -----BEGIN CERTIFICATE----- - MIIC2zCCAn6gAwIBAgIBCTAMBggqhkjOPQQDAgUAMFsxCzAJBgNVBAYTAlVTMRgw - FgYDVQQKEw9VLlMuIEdvdmVybm1lbnQxDDAKBgNVBAsTA0RvRDEMMAoGA1UECxMD - UEtJMRYwFAYDVQQDEw1Eb0QgUm9vdCBDQSA0MB4XDTE2MDQxMjEzMTI0M1oXDTIy - MDQxMzEzMTI0M1owXTELMAkGA1UEBhMCVVMxGDAWBgNVBAoTD1UuUy4gR292ZXJu - bWVudDEMMAoGA1UECxMDRG9EMQwwCgYDVQQLEwNQS0kxGDAWBgNVBAMTD0RPRCBJ - RCBTVyBDQS00NzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABIXYA5Gtzjuc8KIc - kgMu3+mgBPldfBkOr9i+4whQzY84FDKvzsc78BbuQicWDsbJDXN45N5ACoAkwrIz - MP1NRZyjggEtMIIBKTAfBgNVHSMEGDAWgBS9wblrTfQd7DCQv2JzwIQz8nEkhTAd - BgNVHQ4EFgQUowEMSwGcEB8madmOXGcnxdqsNnowDgYDVR0PAQH/BAQDAgGGMDAG - A1UdIAQpMCcwCwYJYIZIAWUCAQsoMAsGCWCGSAFlAgELKzALBglghkgBZQIBCyUw - EgYDVR0TAQH/BAgwBgEB/wIBADAMBgNVHSQEBTADgAEAMDcGA1UdHwQwMC4wLKAq - oCiGJmh0dHA6Ly9jcmwuZGlzYS5taWwvY3JsL0RPRFJPT1RDQTQuY3JsMEoGCCsG - AQUFBwEBBD4wPDA6BggrBgEFBQcwAoYuaHR0cDovL2NybC5kaXNhLm1pbC9pc3N1 - ZWR0by9ET0RST09UQ0E0X0lULnA3YzAMBggqhkjOPQQDAgUAA0kAMEYCIQCN7jJe - h0KGZ05OTCbxZKgvqR7N3hco4qTXcETpm1mPmAIhAPZWclBf54lOCDQku0UBz8gW - lYdeVXmiuKz7DveFthis - -----END CERTIFICATE----- - - subject=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DoD Root CA 4 - issuer=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DoD Root CA 4 - -----BEGIN CERTIFICATE----- - MIIB6zCCAY+gAwIBAgIBATAMBggqhkjOPQQDAgUAMFsxCzAJBgNVBAYTAlVTMRgw - FgYDVQQKEw9VLlMuIEdvdmVybm1lbnQxDDAKBgNVBAsTA0RvRDEMMAoGA1UECxMD - UEtJMRYwFAYDVQQDEw1Eb0QgUm9vdCBDQSA0MB4XDTEyMDczMDE5NDgyM1oXDTMy - MDcyNTE5NDgyM1owWzELMAkGA1UEBhMCVVMxGDAWBgNVBAoTD1UuUy4gR292ZXJu - bWVudDEMMAoGA1UECxMDRG9EMQwwCgYDVQQLEwNQS0kxFjAUBgNVBAMTDURvRCBS - b290IENBIDQwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAR2yNhDyw8H0iwPKtA4 - 8YLNQlXn3B1agLcIkUtU1k+yZoU0lo0uPvTgSpF8zM2GnxHgUqFmgsbLkCPsX1/1 - 8DxFo0IwQDAdBgNVHQ4EFgQUvcG5a030HewwkL9ic8CEM/JxJIUwDgYDVR0PAQH/ - BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wDAYIKoZIzj0EAwIFAANIADBFAiEA6GGK - 99yqCaUH0kSeggNaRFNHhCOZz1zT3kpe1rs1NUYCIHYPuMR8FjV/1BLtiD2AEWtk - B0xFZd9Trl8B7fFD0vW3 - -----END CERTIFICATE----- - - subject=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DOD ID SW CA-46 - issuer=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DoD Root CA 3 - -----BEGIN CERTIFICATE----- - MIIErjCCA5agAwIBAgIBZDANBgkqhkiG9w0BAQsFADBbMQswCQYDVQQGEwJVUzEY - MBYGA1UEChMPVS5TLiBHb3Zlcm5tZW50MQwwCgYDVQQLEwNEb0QxDDAKBgNVBAsT - A1BLSTEWMBQGA1UEAxMNRG9EIFJvb3QgQ0EgMzAeFw0xNjAzMDgxNDIyMjdaFw0y - MjAzMDkxNDIyMjdaMF0xCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9VLlMuIEdvdmVy - bm1lbnQxDDAKBgNVBAsTA0RvRDEMMAoGA1UECxMDUEtJMRgwFgYDVQQDEw9ET0Qg - SUQgU1cgQ0EtNDYwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDB8t7O - izHtqCLUKXdNcAOYlJDNyNoqW22ZB75KiU3GJna5ww499SOnBaEU4OvRSMI3FcKS - lZRvJJIbNpcUbn6X/4cEH6g64lCGSXcm8nl/rU1W0onf7l/fk8tcaVRG0hP9iTbe - 7fjlJ7hEWwKEXSk7Xkr/3e09bvKIHVtiCsV6cOlNsK6H7JbEhRw4yPOkqdXtrpQX - mNh9Y6OGya91I1vzYO+zcexr2+MOoHFJyADBVF/+LrMWdRqVI0Fl8r8NXKnGXpC7 - yPns28gz1egmxJ5NsJtQ8p4WHMQnA6J3wPr+7na+5MKzLgCIoMxD2vIJ0FU28ODE - WrAb9clqWqv/Jte/AgMBAAGjggF5MIIBdTAfBgNVHSMEGDAWgBRsipSid7GAch2B - ehaq8tzOZu5FwDAdBgNVHQ4EFgQUW2dpXrVYC5wfCdw1fZvWJ+5iqpwwDgYDVR0P - AQH/BAQDAgGGMFoGA1UdIARTMFEwCwYJYIZIAWUCAQskMAsGCWCGSAFlAgELJzAL - BglghkgBZQIBCyowDAYKYIZIAWUDAgEDDTAMBgpghkgBZQMCAQMRMAwGCmCGSAFl - AwIBAycwEgYDVR0TAQH/BAgwBgEB/wIBADAMBgNVHSQEBTADgAEAMDcGA1UdHwQw - MC4wLKAqoCiGJmh0dHA6Ly9jcmwuZGlzYS5taWwvY3JsL0RPRFJPT1RDQTMuY3Js - MGwGCCsGAQUFBwEBBGAwXjA6BggrBgEFBQcwAoYuaHR0cDovL2NybC5kaXNhLm1p - bC9pc3N1ZWR0by9ET0RST09UQ0EzX0lULnA3YzAgBggrBgEFBQcwAYYUaHR0cDov - L29jc3AuZGlzYS5taWwwDQYJKoZIhvcNAQELBQADggEBAHrAmFSy86ZAscEU5KID - UdXtfC3+OV/I1BYnYiZHJKJj8zRuqvdWvsulKtCGKZo1wFv446n/14YRbI3TKno2 - Q/c4J6uz+MOsIGLyPvPmwO5Y6Gaqj5EDD6rgyYSRdHrmBlLE1aUmedc86UOMKAz6 - OwmUFRru8aXF/YSEWQmkeIWX4saImbv8Evb2vqjDPFERjH6BebYDRI7ZpMWg8jJt - LnQFoKOhCOTnHJz0vd/vnh4IC+7+KNgbg+RZ0O3H9dnBeULcLGeHtw2F2jBMrlyW - d0Iyn7vj9cOGkdrkggSpdGqqlXiNkVsYhyPXztL8jOqmyY7ndXubEQCsYxMIIXur - SEQ= - -----END CERTIFICATE----- - - subject=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DOD ID SW CA-45 - issuer=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DoD Root CA 3 - -----BEGIN CERTIFICATE----- - MIIErjCCA5agAwIBAgIBYzANBgkqhkiG9w0BAQsFADBbMQswCQYDVQQGEwJVUzEY - MBYGA1UEChMPVS5TLiBHb3Zlcm5tZW50MQwwCgYDVQQLEwNEb0QxDDAKBgNVBAsT - A1BLSTEWMBQGA1UEAxMNRG9EIFJvb3QgQ0EgMzAeFw0xNjAzMDgxMzI4NTZaFw0y - MjAzMDkxMzI4NTZaMF0xCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9VLlMuIEdvdmVy - bm1lbnQxDDAKBgNVBAsTA0RvRDEMMAoGA1UECxMDUEtJMRgwFgYDVQQDEw9ET0Qg - SUQgU1cgQ0EtNDUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCVVtcp - RJMdLbl4C4dfjcBCfAqUMLRbXiKiDRnAMXn3c5IrYEND7uJKJTCrQklQ8YC570Za - YXxhSaKiFbcR0MA7oHEF8HWglB53GSmFowqtAiERS/AWbMJoXlh/MBJweeSVUzat - CPO8V3q56Y/5OFglW5YV3tA3Kgv+BvlqjYCzWNeBwfyeglkB8EWi58llAiyjsGPd - QpN71LOyqHK16SCv22E6mIyrxfFgeaWIxIBeXzgVxDzZ2djbsqYyrJlAdUCbGzh/ - O9N0MhEC0mMRcgo7uER0olnWri1oOWtJl2Ok8ZvMqGQbdkxkkmxCthUWyxFoVq7P - xU7IYmBiBn27SyF7AgMBAAGjggF5MIIBdTAfBgNVHSMEGDAWgBRsipSid7GAch2B - ehaq8tzOZu5FwDAdBgNVHQ4EFgQUy/0Vpppg8S5OW5UcjD8djcKjIhswDgYDVR0P - AQH/BAQDAgGGMFoGA1UdIARTMFEwCwYJYIZIAWUCAQskMAsGCWCGSAFlAgELJzAL - BglghkgBZQIBCyowDAYKYIZIAWUDAgEDDTAMBgpghkgBZQMCAQMRMAwGCmCGSAFl - AwIBAycwEgYDVR0TAQH/BAgwBgEB/wIBADAMBgNVHSQEBTADgAEAMDcGA1UdHwQw - MC4wLKAqoCiGJmh0dHA6Ly9jcmwuZGlzYS5taWwvY3JsL0RPRFJPT1RDQTMuY3Js - MGwGCCsGAQUFBwEBBGAwXjA6BggrBgEFBQcwAoYuaHR0cDovL2NybC5kaXNhLm1p - bC9pc3N1ZWR0by9ET0RST09UQ0EzX0lULnA3YzAgBggrBgEFBQcwAYYUaHR0cDov - L29jc3AuZGlzYS5taWwwDQYJKoZIhvcNAQELBQADggEBADPubZ/kZNDB/hkuGuuK - OmiGZJC2C1dBGkuM0SXewWzGHEPKapa4rNDrgDSTQMOLeMUCmr4XbHbMo1mqIDBc - SioVFiq+CooCskj3D+gj1Y+dbfi+IW8/IlbHVDxlApDlJ11v3nvNJNHp7gA0hFVD - Da2Upj9wVsYr0ReXvHRz0Zb6a1/7R6to41c8wwg3hWCGCXsPvnILaQK5JmxNVX1i - HT95UKDxnysb+vw+GxxJgaIH87HkgxZtOc7WUnP+GFALfKQyLsR8J3vkIkI2DJfP - FjtBblgXWn9lCI5lYgeH3VbKjVvowcUWuw2F8PJaaNHpVpWwv+XfzLmUCdLGjZrB - zBQ= - -----END CERTIFICATE----- - - subject=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DOD ID CA-44 - issuer=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DoD Root CA 3 - -----BEGIN CERTIFICATE----- - MIIEnTCCA4WgAwIBAgIBGzANBgkqhkiG9w0BAQsFADBbMQswCQYDVQQGEwJVUzEY - MBYGA1UEChMPVS5TLiBHb3Zlcm5tZW50MQwwCgYDVQQLEwNEb0QxDDAKBgNVBAsT - A1BLSTEWMBQGA1UEAxMNRG9EIFJvb3QgQ0EgMzAeFw0xNTExMDkxNjE4MTRaFw0y - MTExMDkxNjE4MTRaMFoxCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9VLlMuIEdvdmVy - bm1lbnQxDDAKBgNVBAsTA0RvRDEMMAoGA1UECxMDUEtJMRUwEwYDVQQDEwxET0Qg - SUQgQ0EtNDQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDG3+Tty+pD - oTJGbJvbL/uQUD5vXkR1G6vSxNSbFskImmrpLV2hr8uCGAFDL+Kb3dPaYLTEeaK9 - 34LqDC02+Cw4mLamoXKtfBGlFT1T3AHzpS4wJAhfrSGFGRBdY76jpTn1eiaWs+nb - CLiJjpxQOQhp7caytsZnGvLNOFUc+QZJFsyAf06cpWEmo/iAx7KXLMPV6sbGTLqm - kyqNxYPvqd1Ryyq2vi5Pqyw0swg2+wvkMhGIZ39ryJhgaU5vcAhd39z53tNU1ttp - xP506Z4uDG9TmBciUFfs4uZbz9aOzT9YYs6enlh172PU48WfCFIQSOXjRcB9/XkD - btghMxTcmzgRAgMBAAGjggFrMIIBZzAfBgNVHSMEGDAWgBRsipSid7GAch2Behaq - 8tzOZu5FwDAdBgNVHQ4EFgQUMPnNVHOQG4Lyco6N7lZGokQpv/owDgYDVR0PAQH/ - BAQDAgGGMEwGA1UdIARFMEMwCwYJYIZIAWUCAQskMAsGCWCGSAFlAgELJzALBglg - hkgBZQIBCyowDAYKYIZIAWUDAgEDDTAMBgpghkgBZQMCAQMRMBIGA1UdEwEB/wQI - MAYBAf8CAQAwDAYDVR0kBAUwA4ABADA3BgNVHR8EMDAuMCygKqAohiZodHRwOi8v - Y3JsLmRpc2EubWlsL2NybC9ET0RST09UQ0EzLmNybDBsBggrBgEFBQcBAQRgMF4w - OgYIKwYBBQUHMAKGLmh0dHA6Ly9jcmwuZGlzYS5taWwvaXNzdWVkdG8vRE9EUk9P - VENBM19JVC5wN2MwIAYIKwYBBQUHMAGGFGh0dHA6Ly9vY3NwLmRpc2EubWlsMA0G - CSqGSIb3DQEBCwUAA4IBAQCnFaVDUuNpbT4YazfYL4qKc/e0Zqd1wM10uqo+ayjz - zP5HXLL2frAudguRVxFDC1WzjB16tc1GODUWY4OOxPCyUNKUJTU3G8qcXMabjEvC - y9wLu/5FTvE0iumpvdpSGJb2v/pBc+Tofe17SgCTpOW+METZM5fiV6e8VrYaZalg - YXrHg+DvdBpGSteccLFLORhZoq0ZpHh7QoHNVOi9sxLhEuhRTSGebRhTkYN99PzC - BdD6ljQ0uShqB3r8uX1pVpBskdovm2JWSX40/QahFVDMwJPImlJ7lXRNvRrkqLHH - PaTJ4R5spBJULmUEbqVfFXG5p/I9vNVF7YZCE5nzegTf - -----END CERTIFICATE----- - - subject=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DOD ID CA-43 - issuer=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DoD Root CA 3 - -----BEGIN CERTIFICATE----- - MIIEnTCCA4WgAwIBAgIBGjANBgkqhkiG9w0BAQsFADBbMQswCQYDVQQGEwJVUzEY - MBYGA1UEChMPVS5TLiBHb3Zlcm5tZW50MQwwCgYDVQQLEwNEb0QxDDAKBgNVBAsT - A1BLSTEWMBQGA1UEAxMNRG9EIFJvb3QgQ0EgMzAeFw0xNTExMDkxNjE2MDFaFw0y - MTExMDkxNjE2MDFaMFoxCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9VLlMuIEdvdmVy - bm1lbnQxDDAKBgNVBAsTA0RvRDEMMAoGA1UECxMDUEtJMRUwEwYDVQQDEwxET0Qg - SUQgQ0EtNDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCib5WKgEkw - yV+HYIReCPRrFLoBoue/va3ODbll8dZITF5Dkj/Qpn/aE3cCVXkd1Oy38k+7MFGo - I93xCKkxq+gdkeLGXEZ8tuwpuqeVHW7rjgd+2DgDuNWsXkN8UqfJvaMccLSjLfTI - MS420x3sMtE5aOC+Zib6Ei7YlT5GUatw33BKSTZIsXqWa9tag6daktv1JonQOs9W - z+zCwZ806AmJhygNzv5scv0+Wtbns91UzwyTBSpYi8Go03YXU1znT/hciQC6uXRY - xUWbBRkuJyc4AsGb2mwfcfG7Tv3LoO1sv1VUV0FswWGP9dFRX3DqjIzs5ylk58oo - CXTCrwOYIXGPAgMBAAGjggFrMIIBZzAfBgNVHSMEGDAWgBRsipSid7GAch2Behaq - 8tzOZu5FwDAdBgNVHQ4EFgQUN6mSY1xcxJ27IUhTKKrUZFBmmkUwDgYDVR0PAQH/ - BAQDAgGGMEwGA1UdIARFMEMwCwYJYIZIAWUCAQskMAsGCWCGSAFlAgELJzALBglg - hkgBZQIBCyowDAYKYIZIAWUDAgEDDTAMBgpghkgBZQMCAQMRMBIGA1UdEwEB/wQI - MAYBAf8CAQAwDAYDVR0kBAUwA4ABADA3BgNVHR8EMDAuMCygKqAohiZodHRwOi8v - Y3JsLmRpc2EubWlsL2NybC9ET0RST09UQ0EzLmNybDBsBggrBgEFBQcBAQRgMF4w - OgYIKwYBBQUHMAKGLmh0dHA6Ly9jcmwuZGlzYS5taWwvaXNzdWVkdG8vRE9EUk9P - VENBM19JVC5wN2MwIAYIKwYBBQUHMAGGFGh0dHA6Ly9vY3NwLmRpc2EubWlsMA0G - CSqGSIb3DQEBCwUAA4IBAQBqUrzdeqnC2ohoGUExkxayPe+h3TKunmYUBgFHOLtT - w89DiGAypywUHgjSOqb1DQD7Z2JohlU2rRRn0ajIAii5DtPgGN4mB9Z5HsmdfZ8L - +CMr/Jw7oYeaRLnyWoRW6cvGiM3opBewNo1192dqv7JYHaAGIVKSdLcESJNwp347 - nDD5MauXa8/2a20lsOOrcU8PgpBHhyRPDQoBaxjjSFtH+aA7KwvFaqsUpvgiTqNp - 5j41K0ayV0rdd/K3zRKcA2weMONqDXagcvDSCMOu3S6jS/M7oc3Sv4kKk8Vjhcom - hCvw6EHyLSiUMqNzlO71q5q3qMj9QOD6T4PK6/UxRD7D - -----END CERTIFICATE----- - - subject=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DOD ID CA-42 - issuer=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DoD Root CA 3 - -----BEGIN CERTIFICATE----- - MIIEnTCCA4WgAwIBAgIBGTANBgkqhkiG9w0BAQsFADBbMQswCQYDVQQGEwJVUzEY - MBYGA1UEChMPVS5TLiBHb3Zlcm5tZW50MQwwCgYDVQQLEwNEb0QxDDAKBgNVBAsT - A1BLSTEWMBQGA1UEAxMNRG9EIFJvb3QgQ0EgMzAeFw0xNTExMDkxNjE1MDJaFw0y - MTExMDkxNjE1MDJaMFoxCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9VLlMuIEdvdmVy - bm1lbnQxDDAKBgNVBAsTA0RvRDEMMAoGA1UECxMDUEtJMRUwEwYDVQQDEwxET0Qg - SUQgQ0EtNDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCt4/+9beDb - 3g9kGg2MlznUY93COtiDLetMCks4aQ5/MYaSti6eoDw5L7EHlkNfnrO5XXKbQHZ7 - HqipwyE6uZ36WPEvU6ufin57Fr++aIYNk3xLAH4me6jT8qyrzn9FUBXh2UsnqCMo - 5jHl+6FJbsTq2/sSpIZl8SMUS4w6wNi/gRSrhdVfmJibhQgEj6QbvUr8aASzlyS9 - +zvMRTZq7JBDEPlbdsfE3mbGWvO0+PD8HMsNrj5rKL7wdoAzQDB/YisF/9ffJw8L - cFPsUisUdZsFTk9L7qMCcgSfCtGfw5AEw4lcmIAiHRX0Apd/iJM4kADuHUFPYzM2 - EN4ngjDxK6jVAgMBAAGjggFrMIIBZzAfBgNVHSMEGDAWgBRsipSid7GAch2Behaq - 8tzOZu5FwDAdBgNVHQ4EFgQUMqAAylmLxM58e9veGSoQioZB0eMwDgYDVR0PAQH/ - BAQDAgGGMEwGA1UdIARFMEMwCwYJYIZIAWUCAQskMAsGCWCGSAFlAgELJzALBglg - hkgBZQIBCyowDAYKYIZIAWUDAgEDDTAMBgpghkgBZQMCAQMRMBIGA1UdEwEB/wQI - MAYBAf8CAQAwDAYDVR0kBAUwA4ABADA3BgNVHR8EMDAuMCygKqAohiZodHRwOi8v - Y3JsLmRpc2EubWlsL2NybC9ET0RST09UQ0EzLmNybDBsBggrBgEFBQcBAQRgMF4w - OgYIKwYBBQUHMAKGLmh0dHA6Ly9jcmwuZGlzYS5taWwvaXNzdWVkdG8vRE9EUk9P - VENBM19JVC5wN2MwIAYIKwYBBQUHMAGGFGh0dHA6Ly9vY3NwLmRpc2EubWlsMA0G - CSqGSIb3DQEBCwUAA4IBAQA5hIjoPl6je1176wDm7i4FNGehuKkrM6KOqEZLyze2 - bkSRZXV8wIve6CkMxL89PLEa9BPXF/PpF5Wn2to4YZgZmx0j+3M9kIuIzDxKHAHB - tfLoOXHiT/g9U9Scl09RiWVfhul13R7+Q6CQdKO1yu69bNtvL1Uxsz2LaGP3pFaS - QklM+Ns56N3a2YJ3qNyjGnMoksBDFSkitYJJrWteHSv1iBv9FVge/d3SE9+Pq/WD - Q22yK/0ph3gTEw61e9EYZ/TAeNb01Ju56bNo5lVHAz2UawrwGhRklJQhf/i9JRda - gykYg4Zkczl+ZXN+0bfJDZ+kpis0wlcPrVzNKNpAVnzf - -----END CERTIFICATE----- - - subject=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DOD ID CA-41 - issuer=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DoD Root CA 3 - -----BEGIN CERTIFICATE----- - MIIEnTCCA4WgAwIBAgIBGDANBgkqhkiG9w0BAQsFADBbMQswCQYDVQQGEwJVUzEY - MBYGA1UEChMPVS5TLiBHb3Zlcm5tZW50MQwwCgYDVQQLEwNEb0QxDDAKBgNVBAsT - A1BLSTEWMBQGA1UEAxMNRG9EIFJvb3QgQ0EgMzAeFw0xNTExMDkxNjEzNTZaFw0y - MTExMDkxNjEzNTZaMFoxCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9VLlMuIEdvdmVy - bm1lbnQxDDAKBgNVBAsTA0RvRDEMMAoGA1UECxMDUEtJMRUwEwYDVQQDEwxET0Qg - SUQgQ0EtNDEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3yXSI2Ca+ - LJHgzmhn2NH9Xk02+QoEPtO4K3oHa+XKeP2Mdk4ooFy3SLvizf84zDWzqVPoofEd - pF1NpDT89rm5JOjaI5PBm9ct4rV0ZqH34DlARMVjthW6ySUp2YDDK5dGkZTACqkn - E2AaL777RyPLRESDp1p/J2yInUMvCc3wsJmqteSW5dUDpl7+S9SV2D+urf7zB5oB - 06D9i4YknSh3nnthtqHSCvNF0QtpynTydycBrZZ2Cv4lF/iVPpi89WDTAjwWc3u7 - HVxHqCi9Z6zB7eIIXtIRcKBJrqL7oExvAGu0C/1D6/dQfOqHa4cPEgllXfy38Zxf - nUrFCih4TjD1AgMBAAGjggFrMIIBZzAfBgNVHSMEGDAWgBRsipSid7GAch2Behaq - 8tzOZu5FwDAdBgNVHQ4EFgQUW5HGRDbyKPL4z7LCyMpjSWGbIAowDgYDVR0PAQH/ - BAQDAgGGMEwGA1UdIARFMEMwCwYJYIZIAWUCAQskMAsGCWCGSAFlAgELJzALBglg - hkgBZQIBCyowDAYKYIZIAWUDAgEDDTAMBgpghkgBZQMCAQMRMBIGA1UdEwEB/wQI - MAYBAf8CAQAwDAYDVR0kBAUwA4ABADA3BgNVHR8EMDAuMCygKqAohiZodHRwOi8v - Y3JsLmRpc2EubWlsL2NybC9ET0RST09UQ0EzLmNybDBsBggrBgEFBQcBAQRgMF4w - OgYIKwYBBQUHMAKGLmh0dHA6Ly9jcmwuZGlzYS5taWwvaXNzdWVkdG8vRE9EUk9P - VENBM19JVC5wN2MwIAYIKwYBBQUHMAGGFGh0dHA6Ly9vY3NwLmRpc2EubWlsMA0G - CSqGSIb3DQEBCwUAA4IBAQCh4rRiX98I1sgwJ/wFaLDtM3GlKTulDu7VGpGllllh - bUpZiaHQ8pMV2goFboAOPXxMnl2N2UM/U4/9S2uW4mosQo2gbcNT7rbi/QhlEk4Z - u6tZek3SvhFIq+fn/XhMqiMwIOUNqroh5BnvPGLQcMqfnLebTJmkcG4I6OmXP6en - jh/JcdNnxMhZ1ZUju61+Sw8g14fKV6kAUdrGhQPZAceZyLvUajDRXLdxFX7LWip0 - IIFPD4eM2pLx94MPpbwFo4/l+rO8LK5BLxG4YV7hIiyauwtcREoNwjRyE0TJ8qTf - mzXUzM7YyjBQytyeKHaEyDbULAe0vfUb9p1joxoGSOue - -----END CERTIFICATE----- - - subject=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DOD EMAIL CA-44 - issuer=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DoD Root CA 3 - -----BEGIN CERTIFICATE----- - MIIEoDCCA4igAwIBAgIBFzANBgkqhkiG9w0BAQsFADBbMQswCQYDVQQGEwJVUzEY - MBYGA1UEChMPVS5TLiBHb3Zlcm5tZW50MQwwCgYDVQQLEwNEb0QxDDAKBgNVBAsT - A1BLSTEWMBQGA1UEAxMNRG9EIFJvb3QgQ0EgMzAeFw0xNTExMDkxNjEyMTZaFw0y - MTExMDkxNjEyMTZaMF0xCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9VLlMuIEdvdmVy - bm1lbnQxDDAKBgNVBAsTA0RvRDEMMAoGA1UECxMDUEtJMRgwFgYDVQQDEw9ET0Qg - RU1BSUwgQ0EtNDQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC5wjjc - RPtz4s4DzWJURVpAl0MhxzRT1SHv3Sju/LkVaagrEfNxEZbnkTHKciFhScbCIco4 - 458+LtRXmwMZiXSPSVquEuhYjpmQggqVUs8eozfV4uMnI88FBEGUhwA8zfgwRMLF - RQnJ4SCB3oGbZHh4sV1MutprCDwd6qrG0k8b8/GF9h1vyPZbNNBHODlfdDraBD5/ - bdX5lQ4L6J7uT5vYtTQQIRM+fk1Nlmxr2okKH4wcwK5FQ9I/kYAs7QoF9My8nAOO - sAAYPBxq+V5UWwRqqdSSxX72YEHAyitxmwng3VMHu5pNCnmEsYSVH7C7FfQaXk/e - Q4+o36slG0x/jys7AgMBAAGjggFrMIIBZzAfBgNVHSMEGDAWgBRsipSid7GAch2B - ehaq8tzOZu5FwDAdBgNVHQ4EFgQUoItn0eFgZHWnOazJuDWNmJJ0c6UwDgYDVR0P - AQH/BAQDAgGGMEwGA1UdIARFMEMwCwYJYIZIAWUCAQskMAsGCWCGSAFlAgELJzAL - BglghkgBZQIBCyowDAYKYIZIAWUDAgEDDTAMBgpghkgBZQMCAQMRMBIGA1UdEwEB - /wQIMAYBAf8CAQAwDAYDVR0kBAUwA4ABADA3BgNVHR8EMDAuMCygKqAohiZodHRw - Oi8vY3JsLmRpc2EubWlsL2NybC9ET0RST09UQ0EzLmNybDBsBggrBgEFBQcBAQRg - MF4wOgYIKwYBBQUHMAKGLmh0dHA6Ly9jcmwuZGlzYS5taWwvaXNzdWVkdG8vRE9E - Uk9PVENBM19JVC5wN2MwIAYIKwYBBQUHMAGGFGh0dHA6Ly9vY3NwLmRpc2EubWls - MA0GCSqGSIb3DQEBCwUAA4IBAQCSY9dTLozPHVTcrSBDSPRiAts6kmKFip1T2qP+ - zDqETUs7FpS/EkLka8n0qjmYMtNWD9zsWKi8FbZeZ1se5tSFxL9waupfibMFsJT4 - Mnvmk3ihhUfTZYpERBmgeX7cd80+WO9SB1P+dCLw/7MjTdN8j0aOcjh+I6KLWLjA - LfVNhpZ7/8LgsOl3sHgZ7537YsA6Ti+yezGD0jM7nKpfyg78nbK2imWutiuEyHui - OdwcJOQpsKuoyNa5yzyuXK5ygG/PMEzJr6rfJykd6UMpADgaCZmSWueJqzMxfrI2 - ZoXlZzmX0xG2CuhOEhcqwLLvKgqu+dUKwzE4VxQYgtRtzzJf - -----END CERTIFICATE----- - - subject=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DOD EMAIL CA-43 - issuer=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DoD Root CA 3 - -----BEGIN CERTIFICATE----- - MIIEoDCCA4igAwIBAgIBFjANBgkqhkiG9w0BAQsFADBbMQswCQYDVQQGEwJVUzEY - MBYGA1UEChMPVS5TLiBHb3Zlcm5tZW50MQwwCgYDVQQLEwNEb0QxDDAKBgNVBAsT - A1BLSTEWMBQGA1UEAxMNRG9EIFJvb3QgQ0EgMzAeFw0xNTExMDkxNjExMDJaFw0y - MTExMDkxNjExMDJaMF0xCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9VLlMuIEdvdmVy - bm1lbnQxDDAKBgNVBAsTA0RvRDEMMAoGA1UECxMDUEtJMRgwFgYDVQQDEw9ET0Qg - RU1BSUwgQ0EtNDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCr3inR - YhAew1kjGebIpt5eR5BSz/xqDhz6KvPNiri3gbRar7lAu7XVGAn+LYB+NyuJt3Wu - 6tSmXvvqxLPKXr47tFAkjpX2My1IGM+Y59iMsuvK+T1xeFvbZFtnC8EgntEwR0Uo - UWtUZAdb5IdKGquolt89RTt6W1mgMhbuYEewydSknxxUI+yNvMQ6NGeaRzu9IRIm - AmtSHUpkE5vxto8lmxRtF09LcmLSiElx7InsL3olAQSjzw2AWbHEMr4WDVTugJXn - VLfmC8/fuTENvmLRDGnTA+li0fjORzMqmGIok5eoU3X24Qv3Ii7/XvGFyNGAKPy4 - oKAXEGn5eZtar4kvAgMBAAGjggFrMIIBZzAfBgNVHSMEGDAWgBRsipSid7GAch2B - ehaq8tzOZu5FwDAdBgNVHQ4EFgQU9x/xRjhVv7xxi7IGO44rGLJeu7QwDgYDVR0P - AQH/BAQDAgGGMEwGA1UdIARFMEMwCwYJYIZIAWUCAQskMAsGCWCGSAFlAgELJzAL - BglghkgBZQIBCyowDAYKYIZIAWUDAgEDDTAMBgpghkgBZQMCAQMRMBIGA1UdEwEB - /wQIMAYBAf8CAQAwDAYDVR0kBAUwA4ABADA3BgNVHR8EMDAuMCygKqAohiZodHRw - Oi8vY3JsLmRpc2EubWlsL2NybC9ET0RST09UQ0EzLmNybDBsBggrBgEFBQcBAQRg - MF4wOgYIKwYBBQUHMAKGLmh0dHA6Ly9jcmwuZGlzYS5taWwvaXNzdWVkdG8vRE9E - Uk9PVENBM19JVC5wN2MwIAYIKwYBBQUHMAGGFGh0dHA6Ly9vY3NwLmRpc2EubWls - MA0GCSqGSIb3DQEBCwUAA4IBAQBb0OxJQPngXOTSzqqxRWBYjiK+4vEf/nwj7cj0 - OT07FIrRsRpyZwpENffCtMU5yv2GHqlS8JKiqw9oGNMtqoW4BtXEE0Oo7W0dnQGk - wLv55eRN1FDI0JgpTu4zixq7NMpYx7XVADi6+3E11efmOesF20po7+Gg2MGsJTNR - EMXh7yHcDqs6nMkPtcl1u4qivfohdRcKsIvwC1Z4cV+bjZ9A5KOBZeWsa86FzNBl - jKTdLxebUz091aA6tjUZ/k576OPKiR1k8awlDsz5j/S9xK1Ht5KV2x8Edvgreiw4 - Dt8Disz/fX0T330P2n6GbPOcgL/wiktRjCq2BnnlmDLFwxJe - -----END CERTIFICATE----- - - subject=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DOD EMAIL CA-42 - issuer=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DoD Root CA 3 - -----BEGIN CERTIFICATE----- - MIIEoDCCA4igAwIBAgIBFTANBgkqhkiG9w0BAQsFADBbMQswCQYDVQQGEwJVUzEY - MBYGA1UEChMPVS5TLiBHb3Zlcm5tZW50MQwwCgYDVQQLEwNEb0QxDDAKBgNVBAsT - A1BLSTEWMBQGA1UEAxMNRG9EIFJvb3QgQ0EgMzAeFw0xNTExMDkxNjA5NDJaFw0y - MTExMDkxNjA5NDJaMF0xCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9VLlMuIEdvdmVy - bm1lbnQxDDAKBgNVBAsTA0RvRDEMMAoGA1UECxMDUEtJMRgwFgYDVQQDEw9ET0Qg - RU1BSUwgQ0EtNDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCmnSX1 - j25X0lrlxl7FTi65DxzSaXlUQwPPILHxQh4pWMbA7Rff4r+duETma3mrPmaej45H - KYPF+1jFiV+jLiPFXzQKcsrrImratXcABFus0lA8xBtvhjZTE/vmGSXZpBPFAkyb - jof3OJBzzWwo+kPrK/je0Kbrlq4jekNcpXDeR4Qp2FXtwMgeS9RnMGUWbO7sv/iJ - ceUkXD9WG6IY2GW3EMsx5MJtxe6M7ACsMb0J3eN+2BAxAZZGjMRjPa2C+2kc922j - Bsr4mfQ9hEbWEu5wWLwiJLBH+9NaTBxlqcGS8yyX0xQktvLHlrmnIUpQksH3x/6F - UnzXQ1CKhaENi4lvAgMBAAGjggFrMIIBZzAfBgNVHSMEGDAWgBRsipSid7GAch2B - ehaq8tzOZu5FwDAdBgNVHQ4EFgQUbwWkXaLEr5VbQZHfC3gLFu8cCW4wDgYDVR0P - AQH/BAQDAgGGMEwGA1UdIARFMEMwCwYJYIZIAWUCAQskMAsGCWCGSAFlAgELJzAL - BglghkgBZQIBCyowDAYKYIZIAWUDAgEDDTAMBgpghkgBZQMCAQMRMBIGA1UdEwEB - /wQIMAYBAf8CAQAwDAYDVR0kBAUwA4ABADA3BgNVHR8EMDAuMCygKqAohiZodHRw - Oi8vY3JsLmRpc2EubWlsL2NybC9ET0RST09UQ0EzLmNybDBsBggrBgEFBQcBAQRg - MF4wOgYIKwYBBQUHMAKGLmh0dHA6Ly9jcmwuZGlzYS5taWwvaXNzdWVkdG8vRE9E - Uk9PVENBM19JVC5wN2MwIAYIKwYBBQUHMAGGFGh0dHA6Ly9vY3NwLmRpc2EubWls - MA0GCSqGSIb3DQEBCwUAA4IBAQB+0vQGArx8bB3kLkQtlSq/JQdzYG9ZxTu1W+nv - eaBUzXyhUyBP1OEA0ZvyiAt7km95y3/H65mZqtBRQuz+jYf0Hxxd0fFw2cXrU8oN - pf9of8SIit3g7H/lPvCzQrixjBPJyIZiuF/1tGqS7OmQP/4jU3+R8uvVhUi3AX2D - XAm4VTcBpCsG3ozOCpJykAQZJxaOgqSJHFLNdPByr1fMvpsFOkSWwlGzmWObh4Xw - ud0+naP4pbqKYjue/MeAGqgmxMJTn4hFXS5bHMViscJpnZtJz1J6XsA8aSiZO/ul - iO/vQx3CzdEWCMB1ZCGP0xdzfDipKEMDPRpA3ucPj3dgb3Mr - -----END CERTIFICATE----- - - subject=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DOD EMAIL CA-41 - issuer=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DoD Root CA 3 - -----BEGIN CERTIFICATE----- - MIIEoDCCA4igAwIBAgIBFDANBgkqhkiG9w0BAQsFADBbMQswCQYDVQQGEwJVUzEY - MBYGA1UEChMPVS5TLiBHb3Zlcm5tZW50MQwwCgYDVQQLEwNEb0QxDDAKBgNVBAsT - A1BLSTEWMBQGA1UEAxMNRG9EIFJvb3QgQ0EgMzAeFw0xNTExMDkxNjA1MjdaFw0y - MTExMDkxNjA1MjdaMF0xCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9VLlMuIEdvdmVy - bm1lbnQxDDAKBgNVBAsTA0RvRDEMMAoGA1UECxMDUEtJMRgwFgYDVQQDEw9ET0Qg - RU1BSUwgQ0EtNDEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCUuycR - DCMw4iPGIbeq1Yuw/9S+tkQnTdtDE1RSp/AhVU+sIILIH0Ay5GiJYuZ1L4NdUGnJ - rsAeRJIFUZae/eMfzARtUtnHyPteXJB1DYh8eK5b5E7RFUz5lae4AdhuUtPSRDm0 - YdH8nXJ8Fgm0w+pMCltZJLIGhfgphXbcZleyFJrRk/k30PIfNdZSoxI0dn8tJRui - 8H50cXpDbCd5Ksi+jEsdYR3Mcza6VTZRmvepwAiF9fpEqlyVqltq2OWLg8ky628V - ODeDZ188HSx8rgpZfOxHQJpMnIyOKHH35WeXEMGC7spvrRP+d/BZsIRGmVx25FTi - jbCFfTQeD91cb6ifAgMBAAGjggFrMIIBZzAfBgNVHSMEGDAWgBRsipSid7GAch2B - ehaq8tzOZu5FwDAdBgNVHQ4EFgQUOSmoCGTij4OqgWFHEZEz+Fo3puQwDgYDVR0P - AQH/BAQDAgGGMEwGA1UdIARFMEMwCwYJYIZIAWUCAQskMAsGCWCGSAFlAgELJzAL - BglghkgBZQIBCyowDAYKYIZIAWUDAgEDDTAMBgpghkgBZQMCAQMRMBIGA1UdEwEB - /wQIMAYBAf8CAQAwDAYDVR0kBAUwA4ABADA3BgNVHR8EMDAuMCygKqAohiZodHRw - Oi8vY3JsLmRpc2EubWlsL2NybC9ET0RST09UQ0EzLmNybDBsBggrBgEFBQcBAQRg - MF4wOgYIKwYBBQUHMAKGLmh0dHA6Ly9jcmwuZGlzYS5taWwvaXNzdWVkdG8vRE9E - Uk9PVENBM19JVC5wN2MwIAYIKwYBBQUHMAGGFGh0dHA6Ly9vY3NwLmRpc2EubWls - MA0GCSqGSIb3DQEBCwUAA4IBAQAhEvHTWyebz05Ox9hW+neUMYI1686yzQA3er3T - lmapTCnxNyNeGP0dcLuFqHZu7wiw6n362ygHDB4e2GQm/IFHsdPXBEQiDBtBOe24 - EOxXMEp4Ku0znOFgZEV/kng/ST4rsoyb4MVCzhCR/5lfzk0zWD5oUgnJ5YwWIITN - zCO10fxQYiCBFDGPcMGJ/biBdcXFtzvPmrzIHDgitll91kI4Rtq5Z8K7988yqqsM - Dm/Ec1t7aL+A+PH9CSLMLNYfllANDvpS2qGV9vh4RGjO4d8P8WAejNczrcuQ4GEA - 1aInA29sNdhLFOKAt3BDKvSjxJM/b3J3jkg6CDzmccXolN/y - -----END CERTIFICATE----- - - subject=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DOD ID SW CA-38 - issuer=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DoD Root CA 3 - -----BEGIN CERTIFICATE----- - MIIEoDCCA4igAwIBAgIBEzANBgkqhkiG9w0BAQsFADBbMQswCQYDVQQGEwJVUzEY - MBYGA1UEChMPVS5TLiBHb3Zlcm5tZW50MQwwCgYDVQQLEwNEb0QxDDAKBgNVBAsT - A1BLSTEWMBQGA1UEAxMNRG9EIFJvb3QgQ0EgMzAeFw0xNTA5MjMxNTI0NTFaFw0y - MTA5MjMxNTI0NTFaMF0xCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9VLlMuIEdvdmVy - bm1lbnQxDDAKBgNVBAsTA0RvRDEMMAoGA1UECxMDUEtJMRgwFgYDVQQDEw9ET0Qg - SUQgU1cgQ0EtMzgwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDMtw2M - Q24eg6nE7h/ZXMiN0GTHnybtceAlYm5NmOWZNzr1/s22At1aN3NSilt5T2MAq7IJ - OOPVqtQ4e8YjvwnZMl/vhk6Z4rwAePshr9HvlO8CXl257RP3uN8HgRBRyiBzJh08 - Q8W+Hrb77XMn0CzdQ7h+0+hJjdwRjSAgHfHBagAFIilYBUHtresJNB7zk/jedaIu - v6xoTkJttS+USSWJ91Rqn1hvAZfd4XbweSqCPNFXXWvudII7DZ9G3ViymCXqXJDZ - KXW+iEOFewY9K1BMnI+NOV/qOv335oitPYeRqnIOiQmV0J2ArCYoWfQputQuHD6Y - y3dzTEj6dFH9CbuXAgMBAAGjggFrMIIBZzAfBgNVHSMEGDAWgBRsipSid7GAch2B - ehaq8tzOZu5FwDAdBgNVHQ4EFgQUjsW5zPzOjlO0Ks7oESrPmylsZ8owDgYDVR0P - AQH/BAQDAgGGMEwGA1UdIARFMEMwCwYJYIZIAWUCAQskMAsGCWCGSAFlAgELJzAL - BglghkgBZQIBCyowDAYKYIZIAWUDAgEDDTAMBgpghkgBZQMCAQMRMBIGA1UdEwEB - /wQIMAYBAf8CAQAwDAYDVR0kBAUwA4ABADA3BgNVHR8EMDAuMCygKqAohiZodHRw - Oi8vY3JsLmRpc2EubWlsL2NybC9ET0RST09UQ0EzLmNybDBsBggrBgEFBQcBAQRg - MF4wOgYIKwYBBQUHMAKGLmh0dHA6Ly9jcmwuZGlzYS5taWwvaXNzdWVkdG8vRE9E - Uk9PVENBM19JVC5wN2MwIAYIKwYBBQUHMAGGFGh0dHA6Ly9vY3NwLmRpc2EubWls - MA0GCSqGSIb3DQEBCwUAA4IBAQChLaZGtZEevrRh4hyMrywIePJ1h8t8K766TTUB - 8AY2y5/BolEoHxKTOis7BRolriRFsa4PVFUSIXUsGQxrA2h8pa0v2irrEE2ixZGN - h5rSXXhC+UtALDF8PlWUvD/M1WLOIW277YHQ4JNjMl5OEhsrVoxJZ3I32bTG8EZp - EDmBbVPsBINRf1kjBd69xb7kk67DfUEs4fUjTHRDOflV388bX2877//UaADPfjGK - 6g9AxY++pf/4can/DhxhJ40+oKiDN29apuwmeNrfAi+CqL9uFu6JSxSUGOy4ZDLA - vmAQHGI6r+mRBcu8U/9xuaYpkO8jAoDNn7yS4H0STEoDorrR - -----END CERTIFICATE----- - - subject=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DOD ID SW CA-37 - issuer=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DoD Root CA 3 - -----BEGIN CERTIFICATE----- - MIIEoDCCA4igAwIBAgIBEjANBgkqhkiG9w0BAQsFADBbMQswCQYDVQQGEwJVUzEY - MBYGA1UEChMPVS5TLiBHb3Zlcm5tZW50MQwwCgYDVQQLEwNEb0QxDDAKBgNVBAsT - A1BLSTEWMBQGA1UEAxMNRG9EIFJvb3QgQ0EgMzAeFw0xNTA5MjMxNTIzMDVaFw0y - MTA5MjMxNTIzMDVaMF0xCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9VLlMuIEdvdmVy - bm1lbnQxDDAKBgNVBAsTA0RvRDEMMAoGA1UECxMDUEtJMRgwFgYDVQQDEw9ET0Qg - SUQgU1cgQ0EtMzcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsrnKi - qfWUYvBZ5poN5GMO6qotl7XJ4GGfg/lr8ipbPcgYScw8HLXrxakW0wA+uEk3Yka/ - /bfUgtiLCqr2/SMYVISjXisglAHUiK1pnXl6ANJ3FGX4eio9XdbvifXjcMu462T3 - XoZAcbbwkk7j5G2P4uJn88h2GmprYJzePNLC38yMgi4FMRsPchVYpX3Fxk2wXEOg - hyeSYvueXWOzEtEDCEyrumQxHfW3Oru0b6JrTZMpztOlaTd9ngKLrIcKaXEyGtrj - lCokBmTALc6xnyKmUNf4R9Imo+lVbwSIycGnePOTrJccRTUbZsfXsFeD0lIWGnHY - rws1w9xarvIN7Gm9AgMBAAGjggFrMIIBZzAfBgNVHSMEGDAWgBRsipSid7GAch2B - ehaq8tzOZu5FwDAdBgNVHQ4EFgQUFiR+9y3B75I/vkTnVF7p/he686EwDgYDVR0P - AQH/BAQDAgGGMEwGA1UdIARFMEMwCwYJYIZIAWUCAQskMAsGCWCGSAFlAgELJzAL - BglghkgBZQIBCyowDAYKYIZIAWUDAgEDDTAMBgpghkgBZQMCAQMRMBIGA1UdEwEB - /wQIMAYBAf8CAQAwDAYDVR0kBAUwA4ABADA3BgNVHR8EMDAuMCygKqAohiZodHRw - Oi8vY3JsLmRpc2EubWlsL2NybC9ET0RST09UQ0EzLmNybDBsBggrBgEFBQcBAQRg - MF4wOgYIKwYBBQUHMAKGLmh0dHA6Ly9jcmwuZGlzYS5taWwvaXNzdWVkdG8vRE9E - Uk9PVENBM19JVC5wN2MwIAYIKwYBBQUHMAGGFGh0dHA6Ly9vY3NwLmRpc2EubWls - MA0GCSqGSIb3DQEBCwUAA4IBAQBZDRYy0oP+yD3OiDqM3liOggDDqJidDSkqmPMB - pxTL9iyXCAqS5OUhzKQ2/N8gRYzO1o7JNIqez7kuwj1HJ0LH94jbjyMnvrWV34mh - m1OzbG1y/88FvheQXLgld+tjojxYVhErbFGHnxMPw1X0VpbRTWrAcetlfMNKdwPU - AH1GDfFmczuSfqwqZcapgJal9BWMIJoCXH1sUOHXmg/6anXx1d30OH9iTYV0to76 - oHTg6PEw7nwxNDgGcVgLDVyDAyTpfQCfhV4fSLI9cDTs4nA0SUgUga01d2h1Sp4r - 0PtksjJINJlYvLggvRWucI/MokLw5F6m+w6BN+t+kEggLn6T - -----END CERTIFICATE----- - - subject=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DoD Root CA 3 - issuer=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DoD Root CA 3 - -----BEGIN CERTIFICATE----- - MIIDczCCAlugAwIBAgIBATANBgkqhkiG9w0BAQsFADBbMQswCQYDVQQGEwJVUzEY - MBYGA1UEChMPVS5TLiBHb3Zlcm5tZW50MQwwCgYDVQQLEwNEb0QxDDAKBgNVBAsT - A1BLSTEWMBQGA1UEAxMNRG9EIFJvb3QgQ0EgMzAeFw0xMjAzMjAxODQ2NDFaFw0y - OTEyMzAxODQ2NDFaMFsxCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9VLlMuIEdvdmVy - bm1lbnQxDDAKBgNVBAsTA0RvRDEMMAoGA1UECxMDUEtJMRYwFAYDVQQDEw1Eb0Qg - Um9vdCBDQSAzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqewUcoro - S3Cj2hADhKb7pzYNKjpSFr8wFVKGBUcgz6qmzXXEZG7v8WAjywpmQK60yGgqAFFo - STfpWTJNlbxDJ+lAjToQzhS8Qxih+d7M54V2c14YGiNbvT8f8u2NGcwD0UCkj6cg - AkwnWnk29qM3IY4AWgYWytNVlm8xKbtyDsviSFHy1DekNdZv7hezsQarCxmG6CNt - MRsoeGXF3mJSvMF96+6gXVQE+7LLK7IjVJGCTPC/unRAOwwERYBnXMXrolfDGn8K - Lb1/udzBmbDIB+QMhjaUOiUv8n3mlzwblLSXWQbJOuQL2erp/DtzNG/955jk86HC - kF8c9T8u1xnTfwIDAQABo0IwQDAdBgNVHQ4EFgQUbIqUonexgHIdgXoWqvLczmbu - RcAwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL - BQADggEBAJ9xpMC2ltKAQ6BI6R92BPnFPK1mGFhjm8O26GiKhVpCZhK00uaLiH+H - 9Jj1qMYJyR/wLB/sgrj0pUc4wTMr30x+mr4LC7HLD3xQKBDPio2i6bqshtfUsZNf - Io+WBbRODHWRfdPy55TClBR2T48MqxCHWDKFB3WGEgte6lO0CshMhJIf6+hBhjy6 - 9E5BStFsWEdBw4Za8u7p8pgnguouNtb4Bl6C8aBSk0QJutKpGVpYo6hdIG1PZPgw - hxuQE0iBzcqQxw3B1Jg/jvIOV2gzEo6ZCbHw5PYQ9DbySb3qozjIVkEjg5rfoRs1 - fOs/QbP1b0s6Xq5vk3aY0vGZnUXEjnI= - -----END CERTIFICATE----- - - subject=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DOD SW CA-54 - issuer=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DoD Root CA 3 - -----BEGIN CERTIFICATE----- - MIIEjzCCA3egAwIBAgICASwwDQYJKoZIhvcNAQELBQAwWzELMAkGA1UEBhMCVVMx - GDAWBgNVBAoTD1UuUy4gR292ZXJubWVudDEMMAoGA1UECxMDRG9EMQwwCgYDVQQL - EwNQS0kxFjAUBgNVBAMTDURvRCBSb290IENBIDMwHhcNMTYxMTIyMTM1MTI4WhcN - MjIxMTIzMTM1MTI4WjBaMQswCQYDVQQGEwJVUzEYMBYGA1UECgwPVS5TLiBHb3Zl - cm5tZW50MQwwCgYDVQQLDANEb0QxDDAKBgNVBAsMA1BLSTEVMBMGA1UEAwwMRE9E - IFNXIENBLTU0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAq0wnaj/j - ZzXRnZnNDN5rMZW7OmPPcrG+8IQW6oHretQqvj/HCnAyX3sl5TvT6bLCG4UfLBAx - 4VRCvpsVW9fME/43E+N8pyUDjlhYe8BHO9e0RfbVjMgDh6tLagvjN3MfThg8E94C - 6TRisdifkP6WonplO1sbv8YD49GjmBWLs8KtU3xzw/StQrwNfymY8aW4lXJQa/Ca - +FXzz/tRh7Mclrlz6QCzgdHAliWK4s5tsXDxeZls2/tvTaZQCVCiyccDdc//lYzL - UIwg3lnPcoV6CPhhw+QW4q42Y4oSu48Z9g/fAvqhrK1U0S9mHl1vWLDTHI3hkwmd - T/O2WgKh8nvx8wIDAQABo4IBXDCCAVgwHwYDVR0jBBgwFoAUbIqUonexgHIdgXoW - qvLczmbuRcAwHQYDVR0OBBYEFLC3KL8sBImKdCavqhOMAhBVgXmxMA4GA1UdDwEB - /wQEAwIBhjA9BgNVHSAENjA0MAsGCWCGSAFlAgELJDALBglghkgBZQIBCycwCwYJ - YIZIAWUCAQsqMAsGCWCGSAFlAgELOzASBgNVHRMBAf8ECDAGAQH/AgEAMAwGA1Ud - JAQFMAOAAQAwNwYDVR0fBDAwLjAsoCqgKIYmaHR0cDovL2NybC5kaXNhLm1pbC9j - cmwvRE9EUk9PVENBMy5jcmwwbAYIKwYBBQUHAQEEYDBeMDoGCCsGAQUFBzAChi5o - dHRwOi8vY3JsLmRpc2EubWlsL2lzc3VlZHRvL0RPRFJPT1RDQTNfSVQucDdjMCAG - CCsGAQUFBzABhhRodHRwOi8vb2NzcC5kaXNhLm1pbDANBgkqhkiG9w0BAQsFAAOC - AQEAZF047yS8bq8lkMpoxFrJjmbdD1TNpjnWRmImQ32uPwNkrDbspNJ4GdqAh3N6 - ueIMcPUSmrIEs9GRZGJzOeTQ6tcQKCyWy+npsI1DQ/k5Xz0H375Bw17gnq2Bpjdy - s8zeg8I+2lDOjSNr7RgVWWB+2sVWXdvILx4Wkh6vX57uEud046HBmc4NeDiHAer8 - NIac5A7e379NRyuusNGXkAm3g7GsE/Y7MrFsKKsMlHb+gFXVgD0DBhtF22YqmA/R - QvTz7Ij1AD++Gv5I4IIzJFMryN6ED6XduWcTtk9Cnf0uY0z+VY8RFw9nOkECFc2b - BA8L2LlruBOzMWbFy4kH7G/hrA== - -----END CERTIFICATE----- - - subject=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DOD SW CA-53 - issuer=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DoD Root CA 3 - -----BEGIN CERTIFICATE----- - MIIEjzCCA3egAwIBAgICASswDQYJKoZIhvcNAQELBQAwWzELMAkGA1UEBhMCVVMx - GDAWBgNVBAoTD1UuUy4gR292ZXJubWVudDEMMAoGA1UECxMDRG9EMQwwCgYDVQQL - EwNQS0kxFjAUBgNVBAMTDURvRCBSb290IENBIDMwHhcNMTYxMTIyMTM1MDM1WhcN - MjIxMTIzMTM1MDM1WjBaMQswCQYDVQQGEwJVUzEYMBYGA1UECgwPVS5TLiBHb3Zl - cm5tZW50MQwwCgYDVQQLDANEb0QxDDAKBgNVBAsMA1BLSTEVMBMGA1UEAwwMRE9E - IFNXIENBLTUzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwTewS9iv - ChYtMvNBYEOjVcVqr+3VOAEgyjt7ieJUVPrFDgtL9Sz+eXX+uBXkJwYjS0gtex6L - RuNtdcLkukoJu34ZxnfUwc8rgTwNV8VtIyI2GJq/u/FjGwK8fHkzslOzwF8KoA6N - NTYvKy9XohBDrrYGpRq/RuDttVfiJ4Yvcii5J6+uZTvT9035EksqjV7A+sJkFVqI - 3MZ83kN9O0ZJf4dEj4h4DKqQYHTRrpy/BL4pTGxmSpnQHne63ToqsoZntTYCYhB5 - 6izOakbsUTYVauwYqlNVf0j20IwcZibztp7wqV2NgGzA81LndhYLQh+8KsDabTSV - sZMvLHfEAeLdhwIDAQABo4IBXDCCAVgwHwYDVR0jBBgwFoAUbIqUonexgHIdgXoW - qvLczmbuRcAwHQYDVR0OBBYEFFHEizOZlMB+uzYd4+I6Bb0ydJ1TMA4GA1UdDwEB - /wQEAwIBhjA9BgNVHSAENjA0MAsGCWCGSAFlAgELJDALBglghkgBZQIBCycwCwYJ - YIZIAWUCAQsqMAsGCWCGSAFlAgELOzASBgNVHRMBAf8ECDAGAQH/AgEAMAwGA1Ud - JAQFMAOAAQAwNwYDVR0fBDAwLjAsoCqgKIYmaHR0cDovL2NybC5kaXNhLm1pbC9j - cmwvRE9EUk9PVENBMy5jcmwwbAYIKwYBBQUHAQEEYDBeMDoGCCsGAQUFBzAChi5o - dHRwOi8vY3JsLmRpc2EubWlsL2lzc3VlZHRvL0RPRFJPT1RDQTNfSVQucDdjMCAG - CCsGAQUFBzABhhRodHRwOi8vb2NzcC5kaXNhLm1pbDANBgkqhkiG9w0BAQsFAAOC - AQEACZtxX9lr6sye0RUSOLYzLCU4jVDNSQgz3qq8Kk7dJ97GdsuBzACcCIwFDpNd - tjMtD+mwNjgfeRY5ovyMEH3ZzVhIqGpQo4WLeE+bjy3fNcU3rsb2SHNaEpRddWQ3 - jnOc3jlyg/sHaR6Jg4JfQ1G9za46AReVa1nJLHjt/BO5m/3D4iJmpJvq2Qp6N4eF - a2VL6s8uAZKnLCocjZU2B3wYZMyaSgppaE4TOe/Hc5HJw245/cFLUL8I02iYfv9E - KQDuTGqNzGrBuKp9LMpRrBWb0boFrZaONcVXjtCqi05fo1Fd/JhuvfraTpgxmVXi - 1OvgVGwq5lsxW2pbjSpBFebaRw== - -----END CERTIFICATE----- - - subject=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DOD ID CA-52 - issuer=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DoD Root CA 3 - -----BEGIN CERTIFICATE----- - MIIEuTCCA6GgAwIBAgICASowDQYJKoZIhvcNAQELBQAwWzELMAkGA1UEBhMCVVMx - GDAWBgNVBAoTD1UuUy4gR292ZXJubWVudDEMMAoGA1UECxMDRG9EMQwwCgYDVQQL - EwNQS0kxFjAUBgNVBAMTDURvRCBSb290IENBIDMwHhcNMTYxMTIyMTM0OTU3WhcN - MjIxMTIzMTM0OTU3WjBaMQswCQYDVQQGEwJVUzEYMBYGA1UECgwPVS5TLiBHb3Zl - cm5tZW50MQwwCgYDVQQLDANEb0QxDDAKBgNVBAsMA1BLSTEVMBMGA1UEAwwMRE9E - IElEIENBLTUyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAltzcMp2O - 02t+fwd7rTlugoKqYF8eo/3M+JVdppPAHTiJVaVt0JSeM4xyZsKNoPBoFW/yshnx - lRv/LyNx0VBbn+4mJ7Ea1U4FBPxCSZ68VYqKdV64UMhndawVBJM3Oy8Y3ZxPldTD - f9ApCg4dZXSEiSnShO8YuphrNbYAd6YrdUn1IhDAhw90VTU3GMLru4vx60vFHscW - eZHpHfET8AsClbAyqu65bsa1+o0XvGLQy2GTMzEVaR1NhYVWKRSwgqW57gbE8pV+ - 63WYNwi8XIr/2TaJ5GvgBVCbgJWAwsSfFTz21ZqOou0d5xYu79iIIue5DEoRW1bm - qserHNG7gsMvHwIDAQABo4IBhjCCAYIwHwYDVR0jBBgwFoAUbIqUonexgHIdgXoW - qvLczmbuRcAwHQYDVR0OBBYEFJroUayRVNeUmgRI+iJ5/8bV7oYrMA4GA1UdDwEB - /wQEAwIBhjBnBgNVHSAEYDBeMAsGCWCGSAFlAgELJDALBglghkgBZQIBCycwCwYJ - YIZIAWUCAQsqMAsGCWCGSAFlAgELOzAMBgpghkgBZQMCAQMNMAwGCmCGSAFlAwIB - AxEwDAYKYIZIAWUDAgEDJzASBgNVHRMBAf8ECDAGAQH/AgEAMAwGA1UdJAQFMAOA - AQAwNwYDVR0fBDAwLjAsoCqgKIYmaHR0cDovL2NybC5kaXNhLm1pbC9jcmwvRE9E - Uk9PVENBMy5jcmwwbAYIKwYBBQUHAQEEYDBeMDoGCCsGAQUFBzAChi5odHRwOi8v - Y3JsLmRpc2EubWlsL2lzc3VlZHRvL0RPRFJPT1RDQTNfSVQucDdjMCAGCCsGAQUF - BzABhhRodHRwOi8vb2NzcC5kaXNhLm1pbDANBgkqhkiG9w0BAQsFAAOCAQEAkxvd - sbOh2zGZCsj3nu9fHEMClJVtK4kJzPJZPi44gdSn+U8X5lbtT0kxsRrqCAZntlgQ - mp+DxnQClr35fjao3wF79nQaIOP2789a9VWZgyJfPrV2KLsxAH4/oOd2ZYdUtHfC - lbfZwbpxFulBqPWxysKQOx3XC/3LszCR0YFqbV/c5hBRB1A4sWBlF8KRGQyKdAyc - K7PrLcSMnLq04ugd5MfYWuJjJx/USNNWlil/LzqyCFzxPp4nGBB8y8s2LcZyvofh - HIBN9qxl3+EXcJyeyqyNiVZcgJi+DLSmBCckb2J6lN9tbGWV02WK+8OiAiZ31CfJ - /sezZ58EZayGYS031Q== - -----END CERTIFICATE----- - - subject=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DOD ID CA-51 - issuer=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DoD Root CA 3 - -----BEGIN CERTIFICATE----- - MIIEuTCCA6GgAwIBAgICASkwDQYJKoZIhvcNAQELBQAwWzELMAkGA1UEBhMCVVMx - GDAWBgNVBAoTD1UuUy4gR292ZXJubWVudDEMMAoGA1UECxMDRG9EMQwwCgYDVQQL - EwNQS0kxFjAUBgNVBAMTDURvRCBSb290IENBIDMwHhcNMTYxMTIyMTM0OTI3WhcN - MjIxMTIzMTM0OTI3WjBaMQswCQYDVQQGEwJVUzEYMBYGA1UECgwPVS5TLiBHb3Zl - cm5tZW50MQwwCgYDVQQLDANEb0QxDDAKBgNVBAsMA1BLSTEVMBMGA1UEAwwMRE9E - IElEIENBLTUxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjjtDs/iL - TIf25t9SGGMP49gCFIYXcEtvTtc/vh+Cghf7qVwiNvUYCaGMq5q7F/pgL5xsw6Bn - iCMau2bZtLfl5xnMk2VMl2GRwUayHQ/0lyteeKid6fa8sfnlyNLh8lvPuHqQFJZX - 5vpfAC24NDQCrr8YIkkNRyxJihCpj8HHYuzTplDRIpMljahhAWCsQkUqlq/5Lite - XHYA/+EnT2hspkitSU+FUIWo0FKK95oo+i2uXX8x3cXWEUCXoR23Slk5NrGTwAsf - TUd16xWA1acvksunx8eK3uOVCV02Q0sldVN19NaGm8lpoBfbtiNz3lo/j1VT558q - 35LmOYWI6KzSTwIDAQABo4IBhjCCAYIwHwYDVR0jBBgwFoAUbIqUonexgHIdgXoW - qvLczmbuRcAwHQYDVR0OBBYEFJ2kwVzT+WZxSaiEIwO24a8pdy2uMA4GA1UdDwEB - /wQEAwIBhjBnBgNVHSAEYDBeMAsGCWCGSAFlAgELJDALBglghkgBZQIBCycwCwYJ - YIZIAWUCAQsqMAsGCWCGSAFlAgELOzAMBgpghkgBZQMCAQMNMAwGCmCGSAFlAwIB - AxEwDAYKYIZIAWUDAgEDJzASBgNVHRMBAf8ECDAGAQH/AgEAMAwGA1UdJAQFMAOA - AQAwNwYDVR0fBDAwLjAsoCqgKIYmaHR0cDovL2NybC5kaXNhLm1pbC9jcmwvRE9E - Uk9PVENBMy5jcmwwbAYIKwYBBQUHAQEEYDBeMDoGCCsGAQUFBzAChi5odHRwOi8v - Y3JsLmRpc2EubWlsL2lzc3VlZHRvL0RPRFJPT1RDQTNfSVQucDdjMCAGCCsGAQUF - BzABhhRodHRwOi8vb2NzcC5kaXNhLm1pbDANBgkqhkiG9w0BAQsFAAOCAQEAigQ4 - aOduTUCpDvC0ue0B0GV49B0aek8HXWKc10bPb1iUCQL2DT4aIf0u+yQqrzVpTw/x - 5mVPRn2Zi2iEV5A8PsN4dReF3lblQSrSVvKFw7cq66Z8ab2ijXjpAMTJCUIOir8w - KoOV03cnVcaW0VDTH+gOslXnm95kPqdfbxJMh06Q00XfvWfRjfnB9D8ZDXbytM5X - mkZRyuUvWY+DKyJUy1HAuardaFpgA5WowjeQm9sAvx72LzaS7zmv+hxOliGXYOn7 - gbJATcT+zt1Ffwa9M19FjoQDSzWihW8P5cFRt6xVEwZHeD8VG++jcQfAujwX0v7U - hFKu8gxm3wlNXOalzA== - -----END CERTIFICATE----- - - subject=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DOD ID CA-50 - issuer=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DoD Root CA 3 - -----BEGIN CERTIFICATE----- - MIIEuTCCA6GgAwIBAgICASgwDQYJKoZIhvcNAQELBQAwWzELMAkGA1UEBhMCVVMx - GDAWBgNVBAoTD1UuUy4gR292ZXJubWVudDEMMAoGA1UECxMDRG9EMQwwCgYDVQQL - EwNQS0kxFjAUBgNVBAMTDURvRCBSb290IENBIDMwHhcNMTYxMTIyMTM0ODQ3WhcN - MjIxMTIzMTM0ODQ3WjBaMQswCQYDVQQGEwJVUzEYMBYGA1UECgwPVS5TLiBHb3Zl - cm5tZW50MQwwCgYDVQQLDANEb0QxDDAKBgNVBAsMA1BLSTEVMBMGA1UEAwwMRE9E - IElEIENBLTUwMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy1ncM1bN - JJHiu1Bh5jQ8r+Y1L2pvw+6YDLGE71z5gquBqisOC6XLKffKdBSF2U55vvp0m5J8 - WdF5DSfyfdAJ7S1HlzFYVW+0KjGLELKV5tWZh/aXu8V85ZaaYkvJeeEU5cIYWLKK - RAr1iygwnslhy1Kb7xhYV7gLYc29Wm1EgZiJ2Xm9M11FIauo40EXmQFniz4FLE/S - 4JB1lbYiP1jGa4zJrdnec1k65tZk/K4hdi2diS+9mEUz3PWrzNqjrHKxFocnh9qS - NGqJfyfXxXgKTrZw2UG83IxHKvIpMPodX4SYUwRm5HRbrG6c1Fx12NC2go16w3dD - ilH+aUduTNpmFQIDAQABo4IBhjCCAYIwHwYDVR0jBBgwFoAUbIqUonexgHIdgXoW - qvLczmbuRcAwHQYDVR0OBBYEFDYuUt50qp7sux+T0b62ULXGaQv5MA4GA1UdDwEB - /wQEAwIBhjBnBgNVHSAEYDBeMAsGCWCGSAFlAgELJDALBglghkgBZQIBCycwCwYJ - YIZIAWUCAQsqMAsGCWCGSAFlAgELOzAMBgpghkgBZQMCAQMNMAwGCmCGSAFlAwIB - AxEwDAYKYIZIAWUDAgEDJzASBgNVHRMBAf8ECDAGAQH/AgEAMAwGA1UdJAQFMAOA - AQAwNwYDVR0fBDAwLjAsoCqgKIYmaHR0cDovL2NybC5kaXNhLm1pbC9jcmwvRE9E - Uk9PVENBMy5jcmwwbAYIKwYBBQUHAQEEYDBeMDoGCCsGAQUFBzAChi5odHRwOi8v - Y3JsLmRpc2EubWlsL2lzc3VlZHRvL0RPRFJPT1RDQTNfSVQucDdjMCAGCCsGAQUF - BzABhhRodHRwOi8vb2NzcC5kaXNhLm1pbDANBgkqhkiG9w0BAQsFAAOCAQEAbAli - o7+gWX5YytmPMD9ic+aX2s0NaSdSauFYmb6khtN0CCocIqTI/TyfRJTjhI6wRNoa - ckcjVa5H3EOp4vOrtLN4TxbhNqdE+IHafWE4/btDstI5PrA2hlFZb1zvM5EQC8u0 - BZQ/DqyShOjypvxldvol6UGjys7wecPxt3cBJC7uroY+nqfxHnOIxRFoJGdC7pSm - f90/uDcX87oCbK/FrzJBO+/V2lGHiByC7ahcP59a4Xd69lHSMtRWquclAyBEy1Mx - p7Bx/v5kCpv14JE6SBlYEwhFrTt4aT49FQEQ9aJFKRv7j20sS/6wxPzGx24HE0Gb - XwusK9jo5skGLLUC3g== - -----END CERTIFICATE----- - - subject=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DOD ID CA-49 - issuer=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DoD Root CA 3 - -----BEGIN CERTIFICATE----- - MIIEuTCCA6GgAwIBAgICAScwDQYJKoZIhvcNAQELBQAwWzELMAkGA1UEBhMCVVMx - GDAWBgNVBAoTD1UuUy4gR292ZXJubWVudDEMMAoGA1UECxMDRG9EMQwwCgYDVQQL - EwNQS0kxFjAUBgNVBAMTDURvRCBSb290IENBIDMwHhcNMTYxMTIyMTM0ODE1WhcN - MjIxMTIzMTM0ODE1WjBaMQswCQYDVQQGEwJVUzEYMBYGA1UECgwPVS5TLiBHb3Zl - cm5tZW50MQwwCgYDVQQLDANEb0QxDDAKBgNVBAsMA1BLSTEVMBMGA1UEAwwMRE9E - IElEIENBLTQ5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2EngKIwP - Cl9+dsIByO2uONNLKhpnFypBAE+LM8+kekt4/HG6StaU/fmqFTRiVI0Uh+td9BWe - 8NXOYrhQRo6FVSxBkLtWZX8Px2IHxiqQ1lnrZK9UlCo8h3MPpiN8VEjH2bP/WSa0 - oZEWzEDKLB5tSKerddc+QL2uEHb+Gfym6i+5qPOLXjV00FY24FdNOyHaRjQTM/Lf - sjWoFItHTKp5B9QogdKnyg+WkAARYtbd1nqtDXv6Fph5HaT39SEnRhc+lkrRDpDY - c+HAU6Xywik+stgv2yFk1MhFpF5/rndEwMLIST0+lSpahJKGmYtg1VKcnDcq5CER - C31gl6Yr7ffjAwIDAQABo4IBhjCCAYIwHwYDVR0jBBgwFoAUbIqUonexgHIdgXoW - qvLczmbuRcAwHQYDVR0OBBYEFNhnk8pG3MmVppSzBBicziU6lhxNMA4GA1UdDwEB - /wQEAwIBhjBnBgNVHSAEYDBeMAsGCWCGSAFlAgELJDALBglghkgBZQIBCycwCwYJ - YIZIAWUCAQsqMAsGCWCGSAFlAgELOzAMBgpghkgBZQMCAQMNMAwGCmCGSAFlAwIB - AxEwDAYKYIZIAWUDAgEDJzASBgNVHRMBAf8ECDAGAQH/AgEAMAwGA1UdJAQFMAOA - AQAwNwYDVR0fBDAwLjAsoCqgKIYmaHR0cDovL2NybC5kaXNhLm1pbC9jcmwvRE9E - Uk9PVENBMy5jcmwwbAYIKwYBBQUHAQEEYDBeMDoGCCsGAQUFBzAChi5odHRwOi8v - Y3JsLmRpc2EubWlsL2lzc3VlZHRvL0RPRFJPT1RDQTNfSVQucDdjMCAGCCsGAQUF - BzABhhRodHRwOi8vb2NzcC5kaXNhLm1pbDANBgkqhkiG9w0BAQsFAAOCAQEATmfP - QPkolF5PB0fS/9DrngX0tmdSwlidBtrkY6vL/V7IMKqJk7r+hHW6k9+nxijHFj6Y - J1+4ElpH/PwWPsqwVIshQxECvJKfo3OfN3a8Mn6Hog5kXJl5dMb0vJOpWQ9UhmG2 - m9UUZ9847wSlbW0vMHL0puuTso0365vilPO5JkapEXcFXdc3LDxXW8BR5NHyaN3V - mvfD/qAqe4BiBx2+WAxsolTJQ5IMjG5tIN7WE6VJdUAm6EIgbuFfvG1KiWQJLHkL - XdTvwdUTqX9JQYswfvoCwvHRh+I2mZX+/iH5HKLcaxqW8b9JnHCtfMSBZqLdI3nG - IBw48tRul8lbrg0mJw== - -----END CERTIFICATE----- - - subject=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DOD EMAIL CA-52 - issuer=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DoD Root CA 3 - -----BEGIN CERTIFICATE----- - MIIEvDCCA6SgAwIBAgICASYwDQYJKoZIhvcNAQELBQAwWzELMAkGA1UEBhMCVVMx - GDAWBgNVBAoTD1UuUy4gR292ZXJubWVudDEMMAoGA1UECxMDRG9EMQwwCgYDVQQL - EwNQS0kxFjAUBgNVBAMTDURvRCBSb290IENBIDMwHhcNMTYxMTIyMTM0NzI4WhcN - MjIxMTIzMTM0NzI4WjBdMQswCQYDVQQGEwJVUzEYMBYGA1UECgwPVS5TLiBHb3Zl - cm5tZW50MQwwCgYDVQQLDANEb0QxDDAKBgNVBAsMA1BLSTEYMBYGA1UEAwwPRE9E - IEVNQUlMIENBLTUyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAw4pb - qFZ5LPm9gcWT24lCj8yLQHYdzntTWgMqPVyveG88rA+bXiAWO6zWUsjPlYQHfxiN - qTZemKgK8OUkVQA4oiQ59EzcNiRsZp1hy7nvDpFcW/0WJzHY5M84ThI57zRH20Ac - iNw1DB7XmR5yJFKTFusipWgsqwWRTtpJlLGJXhTHyG6aNxP6HEXbTLAM4x/0LM9Z - Q2yYihUufgtJYGeLapNb1pPLsPVchhJOQjLFyp3Kx9W1xfjUFftE9FQAwCBJHyC7 - tFMk6DlITy4s7ptst1nNbPYdzGmiix/P7+I702Yn8H3YbmhFD3d+fkhCXqsjio0y - 0wWFDaa6vmm3RqF1GQIDAQABo4IBhjCCAYIwHwYDVR0jBBgwFoAUbIqUonexgHId - gXoWqvLczmbuRcAwHQYDVR0OBBYEFOlmDFyb4lpKsgM2NP18yab4qwc5MA4GA1Ud - DwEB/wQEAwIBhjBnBgNVHSAEYDBeMAsGCWCGSAFlAgELJDALBglghkgBZQIBCycw - CwYJYIZIAWUCAQsqMAsGCWCGSAFlAgELOzAMBgpghkgBZQMCAQMNMAwGCmCGSAFl - AwIBAxEwDAYKYIZIAWUDAgEDJzASBgNVHRMBAf8ECDAGAQH/AgEAMAwGA1UdJAQF - MAOAAQAwNwYDVR0fBDAwLjAsoCqgKIYmaHR0cDovL2NybC5kaXNhLm1pbC9jcmwv - RE9EUk9PVENBMy5jcmwwbAYIKwYBBQUHAQEEYDBeMDoGCCsGAQUFBzAChi5odHRw - Oi8vY3JsLmRpc2EubWlsL2lzc3VlZHRvL0RPRFJPT1RDQTNfSVQucDdjMCAGCCsG - AQUFBzABhhRodHRwOi8vb2NzcC5kaXNhLm1pbDANBgkqhkiG9w0BAQsFAAOCAQEA - dYEfuTkBoJLwzyIZ/lrxB3ECCes2zWMLe1RsRrQ3QUhkeLcqxxwG1z+UbbmWkrSS - JS0Q1XeLRiT7P1x+ycs1Gvoy5V4CFOryb5eNaDpOclJdXOiRjOGvS0wSeSLGnT/d - lRPrQZcoEm+DFvtSMasu/zR8DnaepKpWLvyFXwvoimvsQVvz4tOS2o4u400KLPBo - MQbTwpDmk39wxf4Aq4m8hznf2BhAy20YH6jY08gXg0pNDVh4CZIxyF2gmE0TDXPv - sx77lxYKW3Bx0ZxHIcfBKifjSiTrGlLeEP9LfEQdpCjJqhG/3BFy6flzwJDEHqHH - swhN9DCJn+3xTeq25PUXPg== - -----END CERTIFICATE----- - - subject=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DOD EMAIL CA-51 - issuer=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DoD Root CA 3 - -----BEGIN CERTIFICATE----- - MIIEvDCCA6SgAwIBAgICASUwDQYJKoZIhvcNAQELBQAwWzELMAkGA1UEBhMCVVMx - GDAWBgNVBAoTD1UuUy4gR292ZXJubWVudDEMMAoGA1UECxMDRG9EMQwwCgYDVQQL - EwNQS0kxFjAUBgNVBAMTDURvRCBSb290IENBIDMwHhcNMTYxMTIyMTM0NjQ5WhcN - MjIxMTIzMTM0NjQ5WjBdMQswCQYDVQQGEwJVUzEYMBYGA1UECgwPVS5TLiBHb3Zl - cm5tZW50MQwwCgYDVQQLDANEb0QxDDAKBgNVBAsMA1BLSTEYMBYGA1UEAwwPRE9E - IEVNQUlMIENBLTUxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnw7P - Taj5UGSMi8whxGpPsoChGMjVQRk1Fzp9J/mPjx/oXc2MwMahK3xpE3YB86q/SeH1 - Cv5hc9Pa99HtSF/RaHAo3frFoPnRNoPDLj6ihPGmEWwMKywUgOCnTQcGSlNqR0es - tYrMTxti9bKE3uc0hgWibZYlukiGYg0UygYPS4+afMtzaBljiUWeQFrmCaEgeG3B - UvX/zgNdSqtG9KX1LjqtNZB91hIDrRUNohX5xSLxPMpojC5d391u/0GfAEXeKyAy - bPN8BdVjqJ7FlyueVKUgIAB/t/k6NO3lKEiC+QsrhrwaFI3Yme9JfRsZU8/Yhv0L - wKeJhoz3552oT0e4PwIDAQABo4IBhjCCAYIwHwYDVR0jBBgwFoAUbIqUonexgHId - gXoWqvLczmbuRcAwHQYDVR0OBBYEFDXvECJsuhIPvcJNGeTOfY8FV1w0MA4GA1Ud - DwEB/wQEAwIBhjBnBgNVHSAEYDBeMAsGCWCGSAFlAgELJDALBglghkgBZQIBCycw - CwYJYIZIAWUCAQsqMAsGCWCGSAFlAgELOzAMBgpghkgBZQMCAQMNMAwGCmCGSAFl - AwIBAxEwDAYKYIZIAWUDAgEDJzASBgNVHRMBAf8ECDAGAQH/AgEAMAwGA1UdJAQF - MAOAAQAwNwYDVR0fBDAwLjAsoCqgKIYmaHR0cDovL2NybC5kaXNhLm1pbC9jcmwv - RE9EUk9PVENBMy5jcmwwbAYIKwYBBQUHAQEEYDBeMDoGCCsGAQUFBzAChi5odHRw - Oi8vY3JsLmRpc2EubWlsL2lzc3VlZHRvL0RPRFJPT1RDQTNfSVQucDdjMCAGCCsG - AQUFBzABhhRodHRwOi8vb2NzcC5kaXNhLm1pbDANBgkqhkiG9w0BAQsFAAOCAQEA - Y2UKHMi98mslNJ9qUBT8ZNGKim+nYkfLfBgdP136smJYYDcwUOXwHt3b1aOy4sXI - 0BkNNS6tO5fdvZ7W4/zYFouIVnImaa8hjDiJNoAi5dYKDxkB8iOWYlAP8TZwpKNy - sbGh4EQHWWQ8wDuFcdA5/9ElnxpQ/JJzSgUOHhtGm8vrEQmmJKW0FvbGXhGydHx2 - I5GtDvGHqlpF8GFIAA5HNAaw1s5De2StEYCTS/y95naqZafCxYG62cGbHir8dp0U - KQOUQt88tTh0TAqzcLKz1OJIoIkbfpzV6XiXuL0VSob+W0peZeqTVq+w7nWP1cNr - 44ligwwVjeF04L3sZKA54w== - -----END CERTIFICATE----- - - subject=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DOD EMAIL CA-50 - issuer=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DoD Root CA 3 - -----BEGIN CERTIFICATE----- - MIIEvDCCA6SgAwIBAgICASQwDQYJKoZIhvcNAQELBQAwWzELMAkGA1UEBhMCVVMx - GDAWBgNVBAoTD1UuUy4gR292ZXJubWVudDEMMAoGA1UECxMDRG9EMQwwCgYDVQQL - EwNQS0kxFjAUBgNVBAMTDURvRCBSb290IENBIDMwHhcNMTYxMTIyMTM0NTAwWhcN - MjIxMTIzMTM0NTAwWjBdMQswCQYDVQQGEwJVUzEYMBYGA1UECgwPVS5TLiBHb3Zl - cm5tZW50MQwwCgYDVQQLDANEb0QxDDAKBgNVBAsMA1BLSTEYMBYGA1UEAwwPRE9E - IEVNQUlMIENBLTUwMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAorU5 - fwMKXKwK4SrttozvWb8Zx9g+7pGrzD+cbaZbISrTvNTi9MhDYASMo23nzG/ShHQM - c0qCc10AVUqpAfwRhm9FbphD3r30SWKQsrKeObBW63iMeB6gfhg/+zScvkJxlqj6 - x5cHglMCFQfdqjgmjtcuWIGr7cDf1WQJLGfCz6ilKH/H2no0a3AyoFEAglrUyhC5 - n0IVsmyrWY4Hy9A/0xe84hl+68cJfB4VD+8A+YrUqEgspiqzocvzcuN/GNdeD9Lw - XPqylqnF8SN0HYoHmjbimscIn86wCxARO0siWZ7hStrcbkb+cgFoY5aScdldUkni - YI2cmRy0C5jv+wAfXwIDAQABo4IBhjCCAYIwHwYDVR0jBBgwFoAUbIqUonexgHId - gXoWqvLczmbuRcAwHQYDVR0OBBYEFGUKe10mGzDKLdz81nPHHsF/BIzIMA4GA1Ud - DwEB/wQEAwIBhjBnBgNVHSAEYDBeMAsGCWCGSAFlAgELJDALBglghkgBZQIBCycw - CwYJYIZIAWUCAQsqMAsGCWCGSAFlAgELOzAMBgpghkgBZQMCAQMNMAwGCmCGSAFl - AwIBAxEwDAYKYIZIAWUDAgEDJzASBgNVHRMBAf8ECDAGAQH/AgEAMAwGA1UdJAQF - MAOAAQAwNwYDVR0fBDAwLjAsoCqgKIYmaHR0cDovL2NybC5kaXNhLm1pbC9jcmwv - RE9EUk9PVENBMy5jcmwwbAYIKwYBBQUHAQEEYDBeMDoGCCsGAQUFBzAChi5odHRw - Oi8vY3JsLmRpc2EubWlsL2lzc3VlZHRvL0RPRFJPT1RDQTNfSVQucDdjMCAGCCsG - AQUFBzABhhRodHRwOi8vb2NzcC5kaXNhLm1pbDANBgkqhkiG9w0BAQsFAAOCAQEA - VnLKwRdYBaPnEONJnTpHoC4znIQMHBsEpQbR8P5j49IXtHRjCpl5PKRIwuAc+Ff3 - ixM3jv/G+LBi26G0ZNGZ4iI11rJ3TLxUqHT12/WXTuS91jePA/f3WIHkGBEFeRs+ - wiROXSAveyMAt1ThK9Bil7BYlLmpgfci7eiKHC6OlA7VZo4OrS03VZTlaaBaU5Te - +tX8XYQ7Kllh9LreXZ2Cks14oNBlS4vzOcZOpw1bamaEbIA13IsGyY/kF7LqSPW2 - b7Jy628ObLeU3a+0lm+nIkjH25FDvtfxD9+2qQHEpRaRclskwIGTmA/Tg/YrrS2Z - am9RD+6E/tsgIIlQE09NEA== - -----END CERTIFICATE----- - - subject=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DOD EMAIL CA-49 - issuer=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DoD Root CA 3 - -----BEGIN CERTIFICATE----- - MIIEvDCCA6SgAwIBAgICASMwDQYJKoZIhvcNAQELBQAwWzELMAkGA1UEBhMCVVMx - GDAWBgNVBAoTD1UuUy4gR292ZXJubWVudDEMMAoGA1UECxMDRG9EMQwwCgYDVQQL - EwNQS0kxFjAUBgNVBAMTDURvRCBSb290IENBIDMwHhcNMTYxMTIyMTM0MzE0WhcN - MjIxMTIzMTM0MzE0WjBdMQswCQYDVQQGEwJVUzEYMBYGA1UECgwPVS5TLiBHb3Zl - cm5tZW50MQwwCgYDVQQLDANEb0QxDDAKBgNVBAsMA1BLSTEYMBYGA1UEAwwPRE9E - IEVNQUlMIENBLTQ5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAus23 - xtOAbfLxPh+OS8U3N/c7ZsnTNZGki6KjnEg4EVHnUKwBB1pWLeQbZTVp01dHWlxR - KyvANnk+8ozM8tucowx0q6fo5J/YteD9qHFAoWjJQpRB6Hvn2vvHvUbu7iAY5Pel - 0B6A0NN/lKW26tTlim6NkV1MuCcvpCGrwH0f2TOCzkDf7IPqQDvLWOjPQP9nmNMG - nS+qCvF5F0iGFXTH1NDeI8EPvKMBQE+LgJ4PAF8eFdDo0mDE6iLfPAIXBzfYUdFk - MS3eVpJOWPzOEYeRLcWQkORvczfxN0obxSH3TGoBLB3ubELOoiqgsTF7rLKE1Kyz - Wrao15uoYf29O9jatQIDAQABo4IBhjCCAYIwHwYDVR0jBBgwFoAUbIqUonexgHId - gXoWqvLczmbuRcAwHQYDVR0OBBYEFGlEHxqVTqUaf4g6zHsSOSwfzxoxMA4GA1Ud - DwEB/wQEAwIBhjBnBgNVHSAEYDBeMAsGCWCGSAFlAgELJDALBglghkgBZQIBCycw - CwYJYIZIAWUCAQsqMAsGCWCGSAFlAgELOzAMBgpghkgBZQMCAQMNMAwGCmCGSAFl - AwIBAxEwDAYKYIZIAWUDAgEDJzASBgNVHRMBAf8ECDAGAQH/AgEAMAwGA1UdJAQF - MAOAAQAwNwYDVR0fBDAwLjAsoCqgKIYmaHR0cDovL2NybC5kaXNhLm1pbC9jcmwv - RE9EUk9PVENBMy5jcmwwbAYIKwYBBQUHAQEEYDBeMDoGCCsGAQUFBzAChi5odHRw - Oi8vY3JsLmRpc2EubWlsL2lzc3VlZHRvL0RPRFJPT1RDQTNfSVQucDdjMCAGCCsG - AQUFBzABhhRodHRwOi8vb2NzcC5kaXNhLm1pbDANBgkqhkiG9w0BAQsFAAOCAQEA - XDNkaD2Gwe4ZoWklwvAvveoOYK5s8fJbjZOjI2V1tZjIP5edw8YSvLDGTqsaDlao - 28hCVhoOU0+V234p0CAGKNKID6WCR46s7uAALaaWfd4aHDzf20qYsnMrl0eKCv6F - sUtKBkIYJBjxpoaIpudRCnSmQkxweKzCGCtjWCT2MGSJro2Q0eQWTDxnJX9/v8z7 - dZ8ddZO1zgoU1xnAx9LxdrVl6H2VcB17z6t2d5TqSLM/OnuSHT7LWqYbVJERf38D - U0WSQ7VOp2x1SkInJqpewvi+0rl/yh97UoDZuS/GUkVIMFbpJkbcadiEGBINErRl - R5vQZDesBpGqUxNYuIIJbA== - -----END CERTIFICATE----- - - subject=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DOD ID CA-40 - issuer=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DoD Root CA 2 - -----BEGIN CERTIFICATE----- - MIIEuDCCA6CgAwIBAgICB8QwDQYJKoZIhvcNAQEFBQAwWzELMAkGA1UEBhMCVVMx - GDAWBgNVBAoTD1UuUy4gR292ZXJubWVudDEMMAoGA1UECxMDRG9EMQwwCgYDVQQL - EwNQS0kxFjAUBgNVBAMTDURvRCBSb290IENBIDIwHhcNMTUxMTA5MTQyMjU0WhcN - MjExMTA4MTQyMjU0WjBaMQswCQYDVQQGEwJVUzEYMBYGA1UEChMPVS5TLiBHb3Zl - cm5tZW50MQwwCgYDVQQLEwNEb0QxDDAKBgNVBAsTA1BLSTEVMBMGA1UEAxMMRE9E - IElEIENBLTQwMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsC0FbWsI - la6+NfHD63GReLt85F4jdzs5mlNrXkjVlXJzksaIkmlHfqAWyo6ea8ShhqwdNnXg - PlIb7ej4RoXFqXJIwsCrxQ7rev+sCdkL5UtxOxPq40wbjV+AcjF8Qmp9xoPyImxz - lLebWWJ8HDgJl2HSLrIFibrRFeD0t6GLsT8JhOdQmqE8wRNypZH6oDIhygX3lhBe - RDxuK/6zLMJ+srqG8DMJFJhz0kHh36ugbJJOPLyEGxwjyEicBqk44NFcmr8YWC24 - RM28QjruqwotlsI3woCaTHkVm37fc0xmbAPg4eggxrzXn3dFQE+cw40WBLpy0d0G - 05PMAC1LKPdccwIDAQABo4IBhTCCAYEwHQYDVR0OBBYEFM1bl5X91Ceq5yXxnIfW - 8gfX0Yc+MB8GA1UdIwQYMBaAFEl0uwxeunr+AlTve6DGlcYJgHCWMBIGA1UdEwEB - /wQIMAYBAf8CAQAwDAYDVR0kBAUwA4ABADAOBgNVHQ8BAf8EBAMCAYYwZgYDVR0g - BF8wXTALBglghkgBZQIBCwUwCwYJYIZIAWUCAQsJMAsGCWCGSAFlAgELETALBglg - hkgBZQIBCxIwCwYJYIZIAWUCAQsTMAwGCmCGSAFlAwIBAxowDAYKYIZIAWUDAgED - GzA3BgNVHR8EMDAuMCygKqAohiZodHRwOi8vY3JsLmRpc2EubWlsL2NybC9ET0RS - T09UQ0EyLmNybDBsBggrBgEFBQcBAQRgMF4wOgYIKwYBBQUHMAKGLmh0dHA6Ly9j - cmwuZGlzYS5taWwvaXNzdWVkdG8vRE9EUk9PVENBMl9JVC5wN2MwIAYIKwYBBQUH - MAGGFGh0dHA6Ly9vY3NwLmRpc2EubWlsMA0GCSqGSIb3DQEBBQUAA4IBAQBFRhX2 - izaXm5Yu4omDw2mbNo59EYAaITQCcUKbK6pwkmRYICu8DsjLMVhciOgeK4fn4OFA - mYbLXWAtgSknNc+Hugb4WFoLWSb3EKZs8ocb/fR4eJLOKoY1PuRCuozS4yZFPet8 - RFInX8l7NQ41Zyu4O4QNzmcMz4pct0E+7nOisGEjh7/29Q0UmITPek60iVGEBIzz - skjlclPzu7+qJseMF+cIV+DU5hFtEjXZ5HPn4fS2B/Fa15vkbnA9MvkxjFYjgLa6 - Xb/3zH5yYN2b20FluCxWyWD29UKXS5vwnXVGn4d+LIt5LPXbkgYt7uxgGCIkX2ha - hR0L51Yz9q3/sVvm - -----END CERTIFICATE----- - - subject=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DOD ID CA-39 - issuer=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DoD Root CA 2 - -----BEGIN CERTIFICATE----- - MIIEuDCCA6CgAwIBAgICB8MwDQYJKoZIhvcNAQEFBQAwWzELMAkGA1UEBhMCVVMx - GDAWBgNVBAoTD1UuUy4gR292ZXJubWVudDEMMAoGA1UECxMDRG9EMQwwCgYDVQQL - EwNQS0kxFjAUBgNVBAMTDURvRCBSb290IENBIDIwHhcNMTUxMTA5MTQyMTU3WhcN - MjExMTA4MTQyMTU3WjBaMQswCQYDVQQGEwJVUzEYMBYGA1UEChMPVS5TLiBHb3Zl - cm5tZW50MQwwCgYDVQQLEwNEb0QxDDAKBgNVBAsTA1BLSTEVMBMGA1UEAxMMRE9E - IElEIENBLTM5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyHukMtcV - I9MuUvhC55JlteAPugFH0iElnuOH1uST9FQVwCueIgZEXFQ1HtQyK/N/Dt2nM89Q - FT6lJ55kAPhJtqYpGZYdfrirxWRTNzisQI2GoDTzID9iMYxd4wTikDvuTpV4H0s1 - sU6r9UqdouRFMZ+PrClHyTji8P9PrHY6+YSSLXu76fJgfKNdDBtIGaUhTA9CMOXv - TJGJLiZTuViJobP9hAEWtgd/8C2GIdTwbQPb/R7fsM/joH94HX59A00Q6q2COz1J - G6LB/GqvfIGpIx2NmLx6beRDQ1OpCs3mzqUTXmfQpZD6vweTXkyIGqlEgav5yahv - vjm2Pp7O3VjbEwIDAQABo4IBhTCCAYEwHQYDVR0OBBYEFKrDk9xwD3lROQQd5f8p - 6BbIrpPGMB8GA1UdIwQYMBaAFEl0uwxeunr+AlTve6DGlcYJgHCWMBIGA1UdEwEB - /wQIMAYBAf8CAQAwDAYDVR0kBAUwA4ABADAOBgNVHQ8BAf8EBAMCAYYwZgYDVR0g - BF8wXTALBglghkgBZQIBCwUwCwYJYIZIAWUCAQsJMAsGCWCGSAFlAgELETALBglg - hkgBZQIBCxIwCwYJYIZIAWUCAQsTMAwGCmCGSAFlAwIBAxowDAYKYIZIAWUDAgED - GzA3BgNVHR8EMDAuMCygKqAohiZodHRwOi8vY3JsLmRpc2EubWlsL2NybC9ET0RS - T09UQ0EyLmNybDBsBggrBgEFBQcBAQRgMF4wOgYIKwYBBQUHMAKGLmh0dHA6Ly9j - cmwuZGlzYS5taWwvaXNzdWVkdG8vRE9EUk9PVENBMl9JVC5wN2MwIAYIKwYBBQUH - MAGGFGh0dHA6Ly9vY3NwLmRpc2EubWlsMA0GCSqGSIb3DQEBBQUAA4IBAQCvxzdd - +7fyM+exiin8pLYIADkJ4pUEnO3xxayqEviFgD/kqy6VInSIWP+eajXsTAHQwsUi - aV9i8ba+ejpZpkU83XgyWR873P0Vycg4o2pUdx1jhXzoMqEq/iZBvV6SEKqHRmK3 - 8eZ0mzAevAE8vEfr8o1RtwoPO+4Uh6pZpBcj4NWYgL9l+CDotlKivAMIy0nN+NFJ - 4SqPWXODhmFlBsCtGY0sJWRWn9sGi0kaEU0sOyqfSnGwchTS34D7MuaDYk7Usgx3 - Sto/Cpp7scmHsVq56evon9YHVxclT3NoWKy9HHxsMIjVVAEGpXOZ05LYW6O02Eds - oZ/0UDsa8A8aV5aL - -----END CERTIFICATE----- - - subject=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DOD EMAIL CA-40 - issuer=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DoD Root CA 2 - -----BEGIN CERTIFICATE----- - MIIEuzCCA6OgAwIBAgICB8IwDQYJKoZIhvcNAQEFBQAwWzELMAkGA1UEBhMCVVMx - GDAWBgNVBAoTD1UuUy4gR292ZXJubWVudDEMMAoGA1UECxMDRG9EMQwwCgYDVQQL - EwNQS0kxFjAUBgNVBAMTDURvRCBSb290IENBIDIwHhcNMTUxMTA5MTQxODQzWhcN - MjExMTA4MTQxODQzWjBdMQswCQYDVQQGEwJVUzEYMBYGA1UEChMPVS5TLiBHb3Zl - cm5tZW50MQwwCgYDVQQLEwNEb0QxDDAKBgNVBAsTA1BLSTEYMBYGA1UEAxMPRE9E - IEVNQUlMIENBLTQwMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzNjg - O6XMNXsXqOPEk9Q7ZmS8o3JNb1NhmvC5hpfRuA7GUDT0eFJYt0uWgMqFdSvMTrRs - JW86RfWnuAz9dnszgUPcfimp+6LNy3yEb/NUWQXiiYCKmuDLo8YWkkfzoMIAzVH+ - Dy++wzc7lOngm5ZgDzdVuGd/QRQ880HyJ9HYnJFkMT9vXvlbYDN7HopIWJntpeaa - tqudwm29Iz3wq6/wba8tDd6aWnOwfRfL9uCe8EGuw4xJh1uvpFfMq2N5GhUIb6kS - q4gai+t+b2cfNJ2OIwKQnysfcO5kJne1Za4oI7GP03IDtRyygvBANOTrBnxKUhMX - MjbCxRxNGm6/GJCz5QIDAQABo4IBhTCCAYEwHQYDVR0OBBYEFJuBtqJZi+3pgB/w - Jz1XBT6JL7bMMB8GA1UdIwQYMBaAFEl0uwxeunr+AlTve6DGlcYJgHCWMBIGA1Ud - EwEB/wQIMAYBAf8CAQAwDAYDVR0kBAUwA4ABADAOBgNVHQ8BAf8EBAMCAYYwZgYD - VR0gBF8wXTALBglghkgBZQIBCwUwCwYJYIZIAWUCAQsJMAsGCWCGSAFlAgELETAL - BglghkgBZQIBCxIwCwYJYIZIAWUCAQsTMAwGCmCGSAFlAwIBAxowDAYKYIZIAWUD - AgEDGzA3BgNVHR8EMDAuMCygKqAohiZodHRwOi8vY3JsLmRpc2EubWlsL2NybC9E - T0RST09UQ0EyLmNybDBsBggrBgEFBQcBAQRgMF4wOgYIKwYBBQUHMAKGLmh0dHA6 - Ly9jcmwuZGlzYS5taWwvaXNzdWVkdG8vRE9EUk9PVENBMl9JVC5wN2MwIAYIKwYB - BQUHMAGGFGh0dHA6Ly9vY3NwLmRpc2EubWlsMA0GCSqGSIb3DQEBBQUAA4IBAQAv - ty5uG7qcbmzT2hU1riC3WUF7fYN6qCRBGRe1beziZqr7NWsJYUWDu9iIvHTRsXdI - SgYgtqseBl9zCmY49iyXWBOs26RF6CyVOOi9cDPMzzuXHfsrFRrlgotvgI/IxJkt - DH41GbkFmx/yZXkCd8wEM5Ud7Gy61zquEvD1qsYM8qUuDCcT0sB70njKQ+ETKQBW - uQdqRDyUSHbnFZaHS8/uGpCL93ie9vVRJEBuGl0fgJXblXDcJsM0YOVgLImGCxnk - lfWCaIA7QtkWmd249PPR+KgM0WW+QXHLEsULo5iUrZxOgPUoo4auLR/Alk4KFmql - 8AJej2z9iMmg6Jb1BbG1 - -----END CERTIFICATE----- - - subject=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DOD EMAIL CA-39 - issuer=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DoD Root CA 2 - -----BEGIN CERTIFICATE----- - MIIEuzCCA6OgAwIBAgICB8EwDQYJKoZIhvcNAQEFBQAwWzELMAkGA1UEBhMCVVMx - GDAWBgNVBAoTD1UuUy4gR292ZXJubWVudDEMMAoGA1UECxMDRG9EMQwwCgYDVQQL - EwNQS0kxFjAUBgNVBAMTDURvRCBSb290IENBIDIwHhcNMTUxMTA5MTQxNDQ3WhcN - MjExMTA4MTQxNDQ3WjBdMQswCQYDVQQGEwJVUzEYMBYGA1UEChMPVS5TLiBHb3Zl - cm5tZW50MQwwCgYDVQQLEwNEb0QxDDAKBgNVBAsTA1BLSTEYMBYGA1UEAxMPRE9E - IEVNQUlMIENBLTM5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAs/Gg - vdig7X8ajfgi1iqHWM3n+GGoqt9cQwGfORbowgjHwIDb7tNQqMPRG2pVYSlST5nl - Nkoe+XRTI/vhExMRYvTDkBmxcFpHAmi4lVFeYHfGYvYn7Ai9SndbTlK4G8tx9BPu - rYjrI7z+TYdlNfcxcqU9Zus3L7VSjo4Nz/oGu1QPdZ3e5W27mrBrGVodhYrGd9zb - vclzDGKpANfrrF6Wm0/t07/j2opYuXDrp3CSVPgHXRCLueDJ+xyIth8oZ/uq7l1u - O2a+4xixCQpuGnTjVfBkC19jSG8WylKn8crduVPLCmRTp65IXgTBAV6gpjta1veA - 8+hFLGswsSKzVTy2YwIDAQABo4IBhTCCAYEwHQYDVR0OBBYEFKyd+MRMc6BDXwgl - fUYPZRvLoLCAMB8GA1UdIwQYMBaAFEl0uwxeunr+AlTve6DGlcYJgHCWMBIGA1Ud - EwEB/wQIMAYBAf8CAQAwDAYDVR0kBAUwA4ABADAOBgNVHQ8BAf8EBAMCAYYwZgYD - VR0gBF8wXTALBglghkgBZQIBCwUwCwYJYIZIAWUCAQsJMAsGCWCGSAFlAgELETAL - BglghkgBZQIBCxIwCwYJYIZIAWUCAQsTMAwGCmCGSAFlAwIBAxowDAYKYIZIAWUD - AgEDGzA3BgNVHR8EMDAuMCygKqAohiZodHRwOi8vY3JsLmRpc2EubWlsL2NybC9E - T0RST09UQ0EyLmNybDBsBggrBgEFBQcBAQRgMF4wOgYIKwYBBQUHMAKGLmh0dHA6 - Ly9jcmwuZGlzYS5taWwvaXNzdWVkdG8vRE9EUk9PVENBMl9JVC5wN2MwIAYIKwYB - BQUHMAGGFGh0dHA6Ly9vY3NwLmRpc2EubWlsMA0GCSqGSIb3DQEBBQUAA4IBAQCa - 8QoBL1IVhci+xe1rnO2hJlMnKKWwsRXmxC0qq+sSqdEcq0hmwDFlQeKyI7hByp60 - 9J+i5yhu5ebOHGsQuU71/ENMAMOczUYt+MYJocGcwe1g1b/XZtZshgo9N6Gwrlny - WFwbr5CnX6yswooBmUl0xdYvcd/ZZ6/5djuVUu4n6/bIwbWcqkkyEDPGGFNXxenT - DuS3BgRAaggyMcNhQNdH3gcc8DbQ57lB57uBNO0cHcaVa2Nk+TGt3eRoLTeqNHoS - 4ZQbg9v4OhAZJtwhKydCtxZAcHcxL2qFXMiT2ots/NmWZyS3sJqSgWcz77a2xREb - is7L2sM8/f9lDnpymyuz - -----END CERTIFICATE----- - - subject=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DOD ID SW CA-36 - issuer=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DoD Root CA 2 - -----BEGIN CERTIFICATE----- - MIIEuzCCA6OgAwIBAgICB6EwDQYJKoZIhvcNAQEFBQAwWzELMAkGA1UEBhMCVVMx - GDAWBgNVBAoTD1UuUy4gR292ZXJubWVudDEMMAoGA1UECxMDRG9EMQwwCgYDVQQL - EwNQS0kxFjAUBgNVBAMTDURvRCBSb290IENBIDIwHhcNMTUwOTIzMTM0NDQyWhcN - MjEwOTIyMTM0NDQyWjBdMQswCQYDVQQGEwJVUzEYMBYGA1UEChMPVS5TLiBHb3Zl - cm5tZW50MQwwCgYDVQQLEwNEb0QxDDAKBgNVBAsTA1BLSTEYMBYGA1UEAxMPRE9E - IElEIFNXIENBLTM2MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtnkW - Y6AlD+M3jiVf9vhsodsLFGnoiYi3dQoseibOrPSU555Ft/5GHGmj+nCXW9twRmGp - AckwzWakNR6nyDh56c5OhJxWKEg594B2i9SBmTXicTzBPa3tZNoJh6Ml6/Ofch+G - XR9u/FFdDWs7ubEF2K7u82MQUsYif+tePRAssI0CToGPF5SPw3+CcijFwY73JFFy - my55gZtb9jiEEp1aWrIgJ9nJczyWbFOV15I5tZPQiWlaXq0BGFh1hJiTGhgGs3fZ - H+yqMmOL91Msb9u99TAr4R4A6yDV/s313JkV4kWIJ1CNSPZHsXOY5WXj6zq/CDhM - JqozUbreJREFadAfwwIDAQABo4IBhTCCAYEwHQYDVR0OBBYEFGcaNjy6u2+FA+cj - iK3FZ5ClTLqEMB8GA1UdIwQYMBaAFEl0uwxeunr+AlTve6DGlcYJgHCWMBIGA1Ud - EwEB/wQIMAYBAf8CAQAwDAYDVR0kBAUwA4ABADAOBgNVHQ8BAf8EBAMCAYYwZgYD - VR0gBF8wXTALBglghkgBZQIBCwUwCwYJYIZIAWUCAQsJMAsGCWCGSAFlAgELETAL - BglghkgBZQIBCxIwCwYJYIZIAWUCAQsTMAwGCmCGSAFlAwIBAxowDAYKYIZIAWUD - AgEDGzA3BgNVHR8EMDAuMCygKqAohiZodHRwOi8vY3JsLmRpc2EubWlsL2NybC9E - T0RST09UQ0EyLmNybDBsBggrBgEFBQcBAQRgMF4wOgYIKwYBBQUHMAKGLmh0dHA6 - Ly9jcmwuZGlzYS5taWwvaXNzdWVkdG8vRE9EUk9PVENBMl9JVC5wN2MwIAYIKwYB - BQUHMAGGFGh0dHA6Ly9vY3NwLmRpc2EubWlsMA0GCSqGSIb3DQEBBQUAA4IBAQB7 - r4RGlVKvdqeCAoErpvW10WRPIn4mmMJbOwzwfgLPzGKvnNQR0CWPWgb8Y7QZYtIT - cbBcWE8awZwB+OWDgTOoxrD0+euOw2CvZg36Z0P7mbS4IF6ElxDd/tzw5Hqr8vkw - hH/F2f6k7+tRznt4+cMQwJmIDKGwoZ+3Atd7CKcouBzXZLcNEbbohJF5z54EYwRU - J5agPcnTZMBDkQfSs9ku1nPrGQfATEBybLTAe31untM6oMzMHw8PYn3Sh7xWTCDG - SFSnPYhzlNKdMb8BKi3spVOxt6t3VHzNXDo8FXRbNpBY/fS7RAmHPPrz5pa9KNtJ - cKENmIqQ5QbjB/P8UX3i - -----END CERTIFICATE----- - - subject=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DOD EMAIL CA-34 - issuer=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DoD Root CA 2 - -----BEGIN CERTIFICATE----- - MIIEuzCCA6OgAwIBAgICB6AwDQYJKoZIhvcNAQEFBQAwWzELMAkGA1UEBhMCVVMx - GDAWBgNVBAoTD1UuUy4gR292ZXJubWVudDEMMAoGA1UECxMDRG9EMQwwCgYDVQQL - EwNQS0kxFjAUBgNVBAMTDURvRCBSb290IENBIDIwHhcNMTUwOTIzMTM0MTU0WhcN - MjEwOTIyMTM0MTU0WjBdMQswCQYDVQQGEwJVUzEYMBYGA1UEChMPVS5TLiBHb3Zl - cm5tZW50MQwwCgYDVQQLEwNEb0QxDDAKBgNVBAsTA1BLSTEYMBYGA1UEAxMPRE9E - IEVNQUlMIENBLTM0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAl9rP - JyF3FMlTkbUCbyRbHPGfd9K7RKdmnCE257ehsNm7nM7Q9zxc8SpbTSDbOaP3Wqov - S5bmsSE+leWR/MhTGV4VMKztZmkGea8WYd5zooz+OrmfuoxEoCy5Ciya+RT+wLOw - H0ApD4doIkrkZd2Q2ZJeL/8pDDj1hPAMLpTfJbekNsQ3hsWnKp7AWVsliY4lR8u0 - RYmX4LHYM5hN+qf6uiOLK6U/pcXcyRa3ymxiqq0gkVKqzybqKjlF4JucUU9zTc/R - cm2XSQEFl5niGI1YRRcrwGdl88TEYqcD8LfqAfKtVHvKy6nQ49L2S8qXQi7p9DmB - bGf0c9gZFxG2SAo19wIDAQABo4IBhTCCAYEwHQYDVR0OBBYEFA+GWX7j+ucT+zE7 - wTkMfGCLQMLdMB8GA1UdIwQYMBaAFEl0uwxeunr+AlTve6DGlcYJgHCWMBIGA1Ud - EwEB/wQIMAYBAf8CAQAwDAYDVR0kBAUwA4ABADAOBgNVHQ8BAf8EBAMCAYYwZgYD - VR0gBF8wXTALBglghkgBZQIBCwUwCwYJYIZIAWUCAQsJMAsGCWCGSAFlAgELETAL - BglghkgBZQIBCxIwCwYJYIZIAWUCAQsTMAwGCmCGSAFlAwIBAxowDAYKYIZIAWUD - AgEDGzA3BgNVHR8EMDAuMCygKqAohiZodHRwOi8vY3JsLmRpc2EubWlsL2NybC9E - T0RST09UQ0EyLmNybDBsBggrBgEFBQcBAQRgMF4wOgYIKwYBBQUHMAKGLmh0dHA6 - Ly9jcmwuZGlzYS5taWwvaXNzdWVkdG8vRE9EUk9PVENBMl9JVC5wN2MwIAYIKwYB - BQUHMAGGFGh0dHA6Ly9vY3NwLmRpc2EubWlsMA0GCSqGSIb3DQEBBQUAA4IBAQBU - 9C9y03/5bT/I09cfBTJDhgP5zoFm45xTzfA47ENg9zj7VntEUG9KH4lkgnIxrD+p - hx5kGZgpxK218MWlQKWutYtrFeeS+RBisyVEGEtF2JjYEmQ4dUAOfVEy2iE/6jlg - 7JWB3nPNCVYjWsvYAwrtciclM/xdAbuBm1valn5TFGwp3UQNMfkbiYs6luVubPmO - 760ruzCJyDwcOopbraZJ3BNqMVbPHL68axpk8mKE83k6WgqMYIEsolA2F95OSPuB - +3jjC6U0fehSz5Ud4xmFdFV4AiW6mgCYy1RZxwPO7HovxjRs+tg8UtwcOjnVBPpM - 5Qh8+8BEUs7sjKlow1tH - -----END CERTIFICATE----- - - subject=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DOD ID CA-34 - issuer=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DoD Root CA 2 - -----BEGIN CERTIFICATE----- - MIIEuDCCA6CgAwIBAgICB58wDQYJKoZIhvcNAQEFBQAwWzELMAkGA1UEBhMCVVMx - GDAWBgNVBAoTD1UuUy4gR292ZXJubWVudDEMMAoGA1UECxMDRG9EMQwwCgYDVQQL - EwNQS0kxFjAUBgNVBAMTDURvRCBSb290IENBIDIwHhcNMTUwOTIzMTM0MDMwWhcN - MjEwOTIyMTM0MDMwWjBaMQswCQYDVQQGEwJVUzEYMBYGA1UEChMPVS5TLiBHb3Zl - cm5tZW50MQwwCgYDVQQLEwNEb0QxDDAKBgNVBAsTA1BLSTEVMBMGA1UEAxMMRE9E - IElEIENBLTM0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz7At/wMM - qpI56sRrQlphyt7hTUYitQma2jYHROcUqaROcqW7Q+sZQuH5lENLlRP6xd/mIYac - +w390E2kPbMQwA46yb399LTve7pJoeukdfNUhgLtBJ1R9Kg3IRJhgr8J9vnY5m5S - y+MsGKhwA5XHcGtJtC0NiKYuxnqZpHpa4pDHNFaRQFl+nka12K15qxPgyf6+ro4m - LHJcD2Mk/KE82ETlBgI5TRxxSVLeO9PnFPcNyLMxD2IKe/1zdoHTpDU6lIEjln2v - 22QN2Ibr1HBwOACwITWeMMr9tUg2fQtIBzLkybJbWxgo9J5kPpoqQih2Eo6ZKky5 - dSdcuOQrwr2OYwIDAQABo4IBhTCCAYEwHQYDVR0OBBYEFBgkTL1Wlo/EyOP9BWWL - mIjjiHDGMB8GA1UdIwQYMBaAFEl0uwxeunr+AlTve6DGlcYJgHCWMBIGA1UdEwEB - /wQIMAYBAf8CAQAwDAYDVR0kBAUwA4ABADAOBgNVHQ8BAf8EBAMCAYYwZgYDVR0g - BF8wXTALBglghkgBZQIBCwUwCwYJYIZIAWUCAQsJMAsGCWCGSAFlAgELETALBglg - hkgBZQIBCxIwCwYJYIZIAWUCAQsTMAwGCmCGSAFlAwIBAxowDAYKYIZIAWUDAgED - GzA3BgNVHR8EMDAuMCygKqAohiZodHRwOi8vY3JsLmRpc2EubWlsL2NybC9ET0RS - T09UQ0EyLmNybDBsBggrBgEFBQcBAQRgMF4wOgYIKwYBBQUHMAKGLmh0dHA6Ly9j - cmwuZGlzYS5taWwvaXNzdWVkdG8vRE9EUk9PVENBMl9JVC5wN2MwIAYIKwYBBQUH - MAGGFGh0dHA6Ly9vY3NwLmRpc2EubWlsMA0GCSqGSIb3DQEBBQUAA4IBAQAGxypr - 9mbQvdY2thCJ3ANDuIn1MK8IhiX3We5joBshmTcfh71DFKsNvUps4BPdjfNGcHng - CTlgHwe4MEsNzUpSkD3e2nm7jPriXh4tRL5RJFEK6yxDL+k3LTL0c/gVjjhsnZoi - mr2a8JoWyDUVdUJmHly4M6GtDWw2l6CiEro3Lv3pEuURrgE+demq3WMhb5IZw7+N - Zi4GapdONX/a+e3028H9KVOC2IbfH9FZGhL96g5YtASd+twKydAen61NE49wYZqZ - rn0E2PywQSqZjiuiEM9F3QNzGVd9geux4TIYvzyQl0ywWkimZlCQPkQUe/hOUdZW - MFJfAy8EW8z4XsPc - -----END CERTIFICATE----- - - subject=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DOD ID SW CA-35 - issuer=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DoD Root CA 2 - -----BEGIN CERTIFICATE----- - MIIEuzCCA6OgAwIBAgICB54wDQYJKoZIhvcNAQEFBQAwWzELMAkGA1UEBhMCVVMx - GDAWBgNVBAoTD1UuUy4gR292ZXJubWVudDEMMAoGA1UECxMDRG9EMQwwCgYDVQQL - EwNQS0kxFjAUBgNVBAMTDURvRCBSb290IENBIDIwHhcNMTUwOTIzMTMzNzUwWhcN - MjEwOTIyMTMzNzUwWjBdMQswCQYDVQQGEwJVUzEYMBYGA1UEChMPVS5TLiBHb3Zl - cm5tZW50MQwwCgYDVQQLEwNEb0QxDDAKBgNVBAsTA1BLSTEYMBYGA1UEAxMPRE9E - IElEIFNXIENBLTM1MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAivXY - eDP8GJB+ao4zla/UEtJDKEflwOSda8kGxkfbz9mMLQFB0iamHa+g/ldgulIUr/pr - upUb959Q2i26GrWHRozgWniOdLU6/X4ZQnic2cM8ejit9TK45jGmr9Krk7+Gvt+i - XtDHTVAQKyVJOKBZyexFE/zBeGjEv5d4tnLy2rjqrgfskXTAYTBJfOkJvHogmuP2 - hrMcEkC/b6LYAAFy7obVdmZcv7B9c4brzml6ZdW/Hjp/S9Z+qY+WnDr+hnbN0Oc+ - qxAaxZxY7kMBMBCEMXH9wBnGFEVQ0CFW918zYKXaIDizkcMCC7GlORKGnQh3gxKn - r7NOc5mSlVK6W5az9wIDAQABo4IBhTCCAYEwHQYDVR0OBBYEFN7CRmPJB/WsEhyq - mREdH+pT5lQyMB8GA1UdIwQYMBaAFEl0uwxeunr+AlTve6DGlcYJgHCWMBIGA1Ud - EwEB/wQIMAYBAf8CAQAwDAYDVR0kBAUwA4ABADAOBgNVHQ8BAf8EBAMCAYYwZgYD - VR0gBF8wXTALBglghkgBZQIBCwUwCwYJYIZIAWUCAQsJMAsGCWCGSAFlAgELETAL - BglghkgBZQIBCxIwCwYJYIZIAWUCAQsTMAwGCmCGSAFlAwIBAxowDAYKYIZIAWUD - AgEDGzA3BgNVHR8EMDAuMCygKqAohiZodHRwOi8vY3JsLmRpc2EubWlsL2NybC9E - T0RST09UQ0EyLmNybDBsBggrBgEFBQcBAQRgMF4wOgYIKwYBBQUHMAKGLmh0dHA6 - Ly9jcmwuZGlzYS5taWwvaXNzdWVkdG8vRE9EUk9PVENBMl9JVC5wN2MwIAYIKwYB - BQUHMAGGFGh0dHA6Ly9vY3NwLmRpc2EubWlsMA0GCSqGSIb3DQEBBQUAA4IBAQCW - F8rvKyx7YtnMtonV/LyPXUHpCnFbGeg8drZ7qNKLVxxLraVBSs6rQz1XiKTcyzpu - zYfPyDIHvxaugkJg3cL/oruKJ3GZ/wxQdNzcljfhAcpuz0BCv3nGzHy2khAoFbds - ZbjTeeP189okGF8hV9Wv0jImfvgAyQJV4Sve7KBQvwwBJRRLA92WTPmkbSi/LtO7 - 2FyOiuoaRA68xmptPiL1xjap0fHJfovs6imAGl8DuVERDsuPiNoQzsDDkPaNQ9j+ - /sAFszlaatFIBKTmZ0hWk9PHnSLb5vlP1zyFJuUSK6Ab5s0jWUFed/YGCPalQSys - aBRL9SJlA8HhG84Ywl2q - -----END CERTIFICATE----- - - subject=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DOD EMAIL CA-33 - issuer=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DoD Root CA 2 - -----BEGIN CERTIFICATE----- - MIIEuzCCA6OgAwIBAgICB50wDQYJKoZIhvcNAQEFBQAwWzELMAkGA1UEBhMCVVMx - GDAWBgNVBAoTD1UuUy4gR292ZXJubWVudDEMMAoGA1UECxMDRG9EMQwwCgYDVQQL - EwNQS0kxFjAUBgNVBAMTDURvRCBSb290IENBIDIwHhcNMTUwOTIzMTMzNDU3WhcN - MjEwOTIyMTMzNDU3WjBdMQswCQYDVQQGEwJVUzEYMBYGA1UEChMPVS5TLiBHb3Zl - cm5tZW50MQwwCgYDVQQLEwNEb0QxDDAKBgNVBAsTA1BLSTEYMBYGA1UEAxMPRE9E - IEVNQUlMIENBLTMzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwSKS - bVjWCG5J6MNxhYf1FAiXnHuZFVMZ0b3XTV9rE944yOfKBGT76dCBIAvegMB2HqB2 - ijX/ME5JB6o/YKHHq1DfWTKKiBc++0Pu2L/5EGQfqMMEr7e44hmydzjVrIfM+1/s - wV8C+kTqDtK6CnQio/E4sKnALwcMKi6QhdNotGRuHPQzYFvu3CXWhekic6hD4rFK - jKKhi92f00nMGs2uKtkHZZ/zfqZqi0B1ngDMIO2nklz8MIlHtuyy6aVe1kjd7j/z - 7rYBISC0u7MtH7nDWXTS9H/jer7/NPH6Jv84euHwYZoiW+XJsV+n39N6fUz6A3DH - VEjdltOveeCBC1LI8QIDAQABo4IBhTCCAYEwHQYDVR0OBBYEFBVlzf0tkBZKr/w4 - lwDc6kOw3yCXMB8GA1UdIwQYMBaAFEl0uwxeunr+AlTve6DGlcYJgHCWMBIGA1Ud - EwEB/wQIMAYBAf8CAQAwDAYDVR0kBAUwA4ABADAOBgNVHQ8BAf8EBAMCAYYwZgYD - VR0gBF8wXTALBglghkgBZQIBCwUwCwYJYIZIAWUCAQsJMAsGCWCGSAFlAgELETAL - BglghkgBZQIBCxIwCwYJYIZIAWUCAQsTMAwGCmCGSAFlAwIBAxowDAYKYIZIAWUD - AgEDGzA3BgNVHR8EMDAuMCygKqAohiZodHRwOi8vY3JsLmRpc2EubWlsL2NybC9E - T0RST09UQ0EyLmNybDBsBggrBgEFBQcBAQRgMF4wOgYIKwYBBQUHMAKGLmh0dHA6 - Ly9jcmwuZGlzYS5taWwvaXNzdWVkdG8vRE9EUk9PVENBMl9JVC5wN2MwIAYIKwYB - BQUHMAGGFGh0dHA6Ly9vY3NwLmRpc2EubWlsMA0GCSqGSIb3DQEBBQUAA4IBAQA0 - aN8RNdEAXOx0WqWKmJoBt2y8LJv1EYbhSWoUP+U0OLTPpkrz0nH4/vR/EYtpkbHV - KOAlXWzlyCigMI8spRUKuAtpyq4BFE4kppL8jBc977oLPTFu/Xw+Hw1U2W07fL8n - VbxxYQZltrMu6yYztK/GuNpXnSWD17ZgtypvkefzttygHUfyVTqMsYBpYWncSu9E - ju6VtYJVikCqDfevloX6tX+4pUPsyyxkUMe0xm8YvO4iN/OX3ABW0IGPtGxhIMWz - /aE9BFtgUY45gnpcAagoqN8I1FYq+zaeflPb0h3yevoypAzRqAt3FftEXDHlcEdj - P6LrZrEWHn3iSLihEODb - -----END CERTIFICATE----- - - subject=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DOD ID CA-33 - issuer=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DoD Root CA 2 - -----BEGIN CERTIFICATE----- - MIIEuDCCA6CgAwIBAgICB5wwDQYJKoZIhvcNAQEFBQAwWzELMAkGA1UEBhMCVVMx - GDAWBgNVBAoTD1UuUy4gR292ZXJubWVudDEMMAoGA1UECxMDRG9EMQwwCgYDVQQL - EwNQS0kxFjAUBgNVBAMTDURvRCBSb290IENBIDIwHhcNMTUwOTIzMTMzMjMyWhcN - MjEwOTIyMTMzMjMyWjBaMQswCQYDVQQGEwJVUzEYMBYGA1UEChMPVS5TLiBHb3Zl - cm5tZW50MQwwCgYDVQQLEwNEb0QxDDAKBgNVBAsTA1BLSTEVMBMGA1UEAxMMRE9E - IElEIENBLTMzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx3397Vyy - U8iwnti8z0835m6o5N6b9ZbPg2AwbGZsBHEA0aW9LrgWqVNdRrFN+L73IVfYhrpd - B9SO72ZGsBfekTPAK4/g0WPwoxDeO+jpBDDbrp/mOrxWlZseY6jpSvETmYdBHuql - dnh+HbnuM7/c863NrUHZvq9T5+wEJekvhJOkta92+WPQhTmoRGDz/C0k7EYVIxWB - XqNDSqbb4eT+9kavdZKMuALhV/Qvij1UC7EyxYGT5GPclNvCDtRxmo397vmiZMpr - LuXqy8DJNnQmQfRSEknYRG13+UAQsYs2GmBc2M7nUXhzmfmAjG3DQNs7F6D0mwym - PurM27FE6rQx8wIDAQABo4IBhTCCAYEwHQYDVR0OBBYEFC2O2dSD8uKQjEufb/lG - 52pLzbwnMB8GA1UdIwQYMBaAFEl0uwxeunr+AlTve6DGlcYJgHCWMBIGA1UdEwEB - /wQIMAYBAf8CAQAwDAYDVR0kBAUwA4ABADAOBgNVHQ8BAf8EBAMCAYYwZgYDVR0g - BF8wXTALBglghkgBZQIBCwUwCwYJYIZIAWUCAQsJMAsGCWCGSAFlAgELETALBglg - hkgBZQIBCxIwCwYJYIZIAWUCAQsTMAwGCmCGSAFlAwIBAxowDAYKYIZIAWUDAgED - GzA3BgNVHR8EMDAuMCygKqAohiZodHRwOi8vY3JsLmRpc2EubWlsL2NybC9ET0RS - T09UQ0EyLmNybDBsBggrBgEFBQcBAQRgMF4wOgYIKwYBBQUHMAKGLmh0dHA6Ly9j - cmwuZGlzYS5taWwvaXNzdWVkdG8vRE9EUk9PVENBMl9JVC5wN2MwIAYIKwYBBQUH - MAGGFGh0dHA6Ly9vY3NwLmRpc2EubWlsMA0GCSqGSIb3DQEBBQUAA4IBAQCzqB2z - CqvPEhgEgFD9/ebtFDm6a3c5JtW+1GRgvw2Bm0rVQ3NNecr+C1YnwTv4fut+75rd - a2R77MDyszJYzM6i0nO6f30xm5dGKPgGS7HiPD3Ph47XLY/N+cuAj0mowXCOWK56 - n0uvXU5DKxrAeqlbaUOYakyCw67Pzz+FBNSWlTxrjEkG8rqzUIY7VXX8MtectJ65 - rahntartTt+gsOzECELWFwoRvPzV7pUrY9VSnKR8sjusnxK4J/b0cRk2RblXUe3G - Un9fXfDDnUQ3CgQtbScfDWOeAbPJdLYWW75YSzsyW03amrOi2aBJZU1E+7hvJkm7 - cw8ckAW5tJD5SRim - -----END CERTIFICATE----- - - subject=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DoD Root CA 2 - issuer=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DoD Root CA 2 - -----BEGIN CERTIFICATE----- - MIIDcDCCAligAwIBAgIBBTANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQGEwJVUzEY - MBYGA1UEChMPVS5TLiBHb3Zlcm5tZW50MQwwCgYDVQQLEwNEb0QxDDAKBgNVBAsT - A1BLSTEWMBQGA1UEAxMNRG9EIFJvb3QgQ0EgMjAeFw0wNDEyMTMxNTAwMTBaFw0y - OTEyMDUxNTAwMTBaMFsxCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9VLlMuIEdvdmVy - bm1lbnQxDDAKBgNVBAsTA0RvRDEMMAoGA1UECxMDUEtJMRYwFAYDVQQDEw1Eb0Qg - Um9vdCBDQSAyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwCzB9o07 - rP8/PNZxvrh0IgfscEEV/KtA4weqwcPYn/7aTDq/P8jYKHtLNgHArEUlw9IOCo+F - GGQQPRoTcCpvjtfcjZOzQQ84Ic2tq8I9KgXTVxE3Dc2MUfmT48xGSSGOFLTNyxQ+ - OM1yMe6rEvJl6jQuVl3/7mN1y226kTT8nvP0LRy+UMRC31mI/2qz+qhsPctWcXEF - lrufgOWARVlnQbDrw61gpIB1BhecDvRD4JkOG/t/9bPMsoGCsf0ywbi+QaRktWA6 - WlEwjM7eQSwZR1xJEGS5dKmHQa99brrBuKG/ZTE6BGf5tbuOkooAY7ix5ow4X4P/ - UNU7ol1rshDMYwIDAQABoz8wPTAdBgNVHQ4EFgQUSXS7DF66ev4CVO97oMaVxgmA - cJYwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD - ggEBAJiRjT+JyLv1wGlzKTs1rLqzCHY9cAmS6YREIQF9FHYb7lFsHY0VNy17MWn0 - mkS4r0bMNPojywMnGdKDIXUr5+AbmSbchECV6KjSzPZYXGbvP0qXEIIdugqi3VsG - K52nZE7rLgE1pLQ/E61V5NVzqGmbEfGY8jEeb0DU+HifjpGgb3AEkGaqBivO4XqS - tX3h4NGW56E6LcyxnR8FRO2HmdNNGnA5wQQM5X7Z8a/XIA7xInolpHOZzD+kByeW - qKKV7YK5FtOeC4fCwfKI9WLfaN/HvGlR7bFc3FRUKQ8JOZqsA8HbDE2ubwp6Fknx - v5HSOJTT9pUst2zJQraNypCNhdk= - -----END CERTIFICATE----- - - subject=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DOD EMAIL CA-32 - issuer=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DoD Root CA 2 - -----BEGIN CERTIFICATE----- - MIIFUjCCBDqgAwIBAgICA6IwDQYJKoZIhvcNAQEFBQAwWzELMAkGA1UEBhMCVVMx - GDAWBgNVBAoTD1UuUy4gR292ZXJubWVudDEMMAoGA1UECxMDRG9EMQwwCgYDVQQL - EwNQS0kxFjAUBgNVBAMTDURvRCBSb290IENBIDIwHhcNMTMwMjA0MjA0ODEyWhcN - MTkwMjA0MjA0ODEyWjBdMQswCQYDVQQGEwJVUzEYMBYGA1UEChMPVS5TLiBHb3Zl - cm5tZW50MQwwCgYDVQQLEwNEb0QxDDAKBgNVBAsTA1BLSTEYMBYGA1UEAxMPRE9E - IEVNQUlMIENBLTMyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAo/qq - hsqKGhsDTnFtQbbZZZpu/zYqPwLTfJVliFqk969jt1LHGvu7lXMHQmGLSqZ76VYH - NhuqNwIgHKTO+7bQaav8OEzI20ZW96JefucxtO7B/81kv3mCQSt30vh9q0yP98Ye - PPiOLz0Ug9qSmAnY0MZaWTaLh6KJ3b5KXsvNtkd+QaYJVGxBlnRbBsPUwS5GfV42 - 342iRnGsSrrEsffJFwov3aPshCHPqAXqueMub59+fbsdFnVPkh0D5hE4mDZ6odQA - PK0QWK8VxzZL4zubTbW0kL6tq9PAhLP83BWICYwRUFAv5HDstwquSlPiNsQFboB1 - Eo03RvJLDDgcSR+sgwIDAQABo4ICHDCCAhgwHQYDVR0OBBYEFAqwqjhWR3sWfb6r - k5a8VN2F++0sMB8GA1UdIwQYMBaAFEl0uwxeunr+AlTve6DGlcYJgHCWMBIGA1Ud - EwEB/wQIMAYBAf8CAQAwDAYDVR0kBAUwA4ABADAOBgNVHQ8BAf8EBAMCAYYwZgYD - VR0gBF8wXTALBglghkgBZQIBCwUwCwYJYIZIAWUCAQsJMAsGCWCGSAFlAgELETAL - BglghkgBZQIBCxIwCwYJYIZIAWUCAQsTMAwGCmCGSAFlAwIBAxowDAYKYIZIAWUD - AgEDGzA3BgNVHR8EMDAuMCygKqAohiZodHRwOi8vY3JsLmRpc2EubWlsL2NybC9E - T0RST09UQ0EyLmNybDCCAQEGCCsGAQUFBwEBBIH0MIHxMDoGCCsGAQUFBzAChi5o - dHRwOi8vY3JsLmRpc2EubWlsL2lzc3VlZHRvL0RPRFJPT1RDQTJfSVQucDdjMCAG - CCsGAQUFBzABhhRodHRwOi8vb2NzcC5kaXNhLm1pbDCBkAYIKwYBBQUHMAKGgYNs - ZGFwOi8vY3JsLmdkcy5kaXNhLm1pbC9jbiUzZERvRCUyMFJvb3QlMjBDQSUyMDIl - MmNvdSUzZFBLSSUyY291JTNkRG9EJTJjbyUzZFUuUy4lMjBHb3Zlcm5tZW50JTJj - YyUzZFVTP2Nyb3NzQ2VydGlmaWNhdGVQYWlyO2JpbmFyeTANBgkqhkiG9w0BAQUF - AAOCAQEAD72PR/+5yb1D5c6+tfM5y0UWWaPftlIkPAlVS9m/lXq9dtngMIfNSqmj - LZ7ZKATGlq4BFIDQJVbxWANV79KoIlKrge8A/q/HSdKMIC6kcYH3JssOpW3VQXd7 - LTO7m7N8nD89/8LuefKJChCMkHRdNGdwvgL+gEYZB859L5aoxBPQ758psTSpuYyl - iTSzjD5H+GaMkdHuq8HqcYXJX7Cp7tsA1DAqQs5XYxAiMKichkESXb5QfBP66yhz - X3IziV9/DWikPf0WJugKk/57H4aBgCe+Z3GGG33Hb7epcQHGY7NzfQFrMyLteYmK - DuZyAnM3P8sxge2k+wtqO1KEukz3jg== - -----END CERTIFICATE----- - - subject=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DOD CA-32 - issuer=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DoD Root CA 2 - -----BEGIN CERTIFICATE----- - MIIFTDCCBDSgAwIBAgICA6EwDQYJKoZIhvcNAQEFBQAwWzELMAkGA1UEBhMCVVMx - GDAWBgNVBAoTD1UuUy4gR292ZXJubWVudDEMMAoGA1UECxMDRG9EMQwwCgYDVQQL - EwNQS0kxFjAUBgNVBAMTDURvRCBSb290IENBIDIwHhcNMTMwMjA0MjA0NDA1WhcN - MTkwMjA0MjA0NDA1WjBXMQswCQYDVQQGEwJVUzEYMBYGA1UEChMPVS5TLiBHb3Zl - cm5tZW50MQwwCgYDVQQLEwNEb0QxDDAKBgNVBAsTA1BLSTESMBAGA1UEAxMJRE9E - IENBLTMyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAs+KVHZM2LSWl - Dv146e/qk9E6ydhXvRnf0cei0ejZ/dKOFajdvT5k9Lb+nAPfS7Blt6sEGDIZbBMB - UtHmtchBEre+O8tNQBCIyp62/TV3bSb2ZK0RhwypJXpYn7C9mPaTXxvv77KXrfgV - 59zmoGp1DVHfVR1oQVJJLsecaFdWR4/e9lIugW9WvAaJEpSfI70/gceGAnUwXjOh - 3OETu/15VgE8Shn0LOuQZGTX6AovUYbVCJuE+/npi0LKZdKQBxyCl4xEI1cGLHVp - KHCy7T5M1eOWdxX9upXPW5ZpAnfWgNmPhynj5wV2r8qNEmA0cseznThuTJYynpA1 - rXWL0WJACQIDAQABo4ICHDCCAhgwHQYDVR0OBBYEFC/Kk1MDrG919Xb6vv6O6hCL - t+eQMB8GA1UdIwQYMBaAFEl0uwxeunr+AlTve6DGlcYJgHCWMBIGA1UdEwEB/wQI - MAYBAf8CAQAwDAYDVR0kBAUwA4ABADAOBgNVHQ8BAf8EBAMCAYYwZgYDVR0gBF8w - XTALBglghkgBZQIBCwUwCwYJYIZIAWUCAQsJMAsGCWCGSAFlAgELETALBglghkgB - ZQIBCxIwCwYJYIZIAWUCAQsTMAwGCmCGSAFlAwIBAxowDAYKYIZIAWUDAgEDGzA3 - BgNVHR8EMDAuMCygKqAohiZodHRwOi8vY3JsLmRpc2EubWlsL2NybC9ET0RST09U - Q0EyLmNybDCCAQEGCCsGAQUFBwEBBIH0MIHxMDoGCCsGAQUFBzAChi5odHRwOi8v - Y3JsLmRpc2EubWlsL2lzc3VlZHRvL0RPRFJPT1RDQTJfSVQucDdjMCAGCCsGAQUF - BzABhhRodHRwOi8vb2NzcC5kaXNhLm1pbDCBkAYIKwYBBQUHMAKGgYNsZGFwOi8v - Y3JsLmdkcy5kaXNhLm1pbC9jbiUzZERvRCUyMFJvb3QlMjBDQSUyMDIlMmNvdSUz - ZFBLSSUyY291JTNkRG9EJTJjbyUzZFUuUy4lMjBHb3Zlcm5tZW50JTJjYyUzZFVT - P2Nyb3NzQ2VydGlmaWNhdGVQYWlyO2JpbmFyeTANBgkqhkiG9w0BAQUFAAOCAQEA - MI3VVmO9mQaLTbbSDgO5xoTSm3dBGojS/8Pa4uZnYb3Zeu04OV6rC1g0+droYnmv - OXLzSqfjTjkQzenSCOrUnpqnNTWTkwJZ4kwAHPP8ayFTSoxh52HL0EYL0T+cafXv - UIrwQLMrVloda2JZBbOPJxgFCkNbAu/dUl5bwKkcVuOVbJdPAYNWcl3XfVHjWlQu - uJj9ck4lj4sW0bDhM+OSfBBVMyRmrw8zBlNIA4eftGR0tdI9InK30Y43ERM5357n - 0AwLilkRMmX/9rlGvT82nqeUAFfwwBnhLNxM9y9MkB1D764I43OeOr+Z7CK5B1iu - 2TVSS1G7gTaPn24hCqaOhw== - -----END CERTIFICATE----- - - subject=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DOD EMAIL CA-31 - issuer=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DoD Root CA 2 - -----BEGIN CERTIFICATE----- - MIIFUjCCBDqgAwIBAgICA58wDQYJKoZIhvcNAQEFBQAwWzELMAkGA1UEBhMCVVMx - GDAWBgNVBAoTD1UuUy4gR292ZXJubWVudDEMMAoGA1UECxMDRG9EMQwwCgYDVQQL - EwNQS0kxFjAUBgNVBAMTDURvRCBSb290IENBIDIwHhcNMTMwMTE2MTQ1MjQzWhcN - MTkwMTE2MTQ1MjQzWjBdMQswCQYDVQQGEwJVUzEYMBYGA1UEChMPVS5TLiBHb3Zl - cm5tZW50MQwwCgYDVQQLEwNEb0QxDDAKBgNVBAsTA1BLSTEYMBYGA1UEAxMPRE9E - IEVNQUlMIENBLTMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6K4C - LEBMOlLoi3OStHfnOEvA8KpKGFzH9zXDSvDwlnell74n78REIYDqFjS3MNFEOH8q - zgTGkWWpblB8yE7+vcC1SxbkOFIV27O391M98rEH25FmXcG38ndmxFGaY5QRSwId - DUt8swBHB3kY+nizkx/Udm2ZBMUeNkb8BjQL42hvHnyfLM9huEv/tN8Gn6BflF7r - Nf8JXTVAB/Kd7ZYJ2Xbq/m4x/sv0ResweEhobKEpPoZ9k0FK6ucMTOWRUCqlQ2a8 - IsD8Gyzk8y9iHgTUIb+sHyZ3NdAdvOK7RsLy6+QUrviza7P6cTiwcSnt0Ysb1wIb - 3srsfu6h3Eil8T6UqQIDAQABo4ICHDCCAhgwHQYDVR0OBBYEFIbxW2hv3TDzlIJo - 1Ez3RB24ymiBMB8GA1UdIwQYMBaAFEl0uwxeunr+AlTve6DGlcYJgHCWMBIGA1Ud - EwEB/wQIMAYBAf8CAQAwDAYDVR0kBAUwA4ABADAOBgNVHQ8BAf8EBAMCAYYwZgYD - VR0gBF8wXTALBglghkgBZQIBCwUwCwYJYIZIAWUCAQsJMAsGCWCGSAFlAgELETAL - BglghkgBZQIBCxIwCwYJYIZIAWUCAQsTMAwGCmCGSAFlAwIBAxowDAYKYIZIAWUD - AgEDGzA3BgNVHR8EMDAuMCygKqAohiZodHRwOi8vY3JsLmRpc2EubWlsL2NybC9E - T0RST09UQ0EyLmNybDCCAQEGCCsGAQUFBwEBBIH0MIHxMDoGCCsGAQUFBzAChi5o - dHRwOi8vY3JsLmRpc2EubWlsL2lzc3VlZHRvL0RPRFJPT1RDQTJfSVQucDdjMCAG - CCsGAQUFBzABhhRodHRwOi8vb2NzcC5kaXNhLm1pbDCBkAYIKwYBBQUHMAKGgYNs - ZGFwOi8vY3JsLmdkcy5kaXNhLm1pbC9jbiUzZERvRCUyMFJvb3QlMjBDQSUyMDIl - MmNvdSUzZFBLSSUyY291JTNkRG9EJTJjbyUzZFUuUy4lMjBHb3Zlcm5tZW50JTJj - YyUzZFVTP2Nyb3NzQ2VydGlmaWNhdGVQYWlyO2JpbmFyeTANBgkqhkiG9w0BAQUF - AAOCAQEAWTKtqsP435xknHEJNMG9vGMAHi3b7anICOO5GOSvyq4Uwd27+XODg1eO - lMmgqgMHzmecteUXWT8ouBc22rqNw5YRAWpQ1gbaaKRK0guFfM2I3/9ed+b1pEiR - 0E6iZ2r4aO+qF0Xv2JYK3c/wPoe2v4g/01S+PhLOofkLbzLRVL+EWzWg2wdktavp - eR7i8qp0cueREvfHu27u5XSQECSLt+fNnIWQR+Tib38gvSy7g5YjTahM2H4uXhUp - uCV9VzULLRVUjKnc4OU3nahPIJWDK8USNj2oc+FOiEmlubv6CUooWjO55JJ5W3v4 - pU/zyTTNmYywumB+n4Q+5jz6flrr5g== - -----END CERTIFICATE----- - - subject=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DOD CA-31 - issuer=/C=US/O=U.S. Government/OU=DoD/OU=PKI/CN=DoD Root CA 2 - -----BEGIN CERTIFICATE----- - MIIFTDCCBDSgAwIBAgICA50wDQYJKoZIhvcNAQEFBQAwWzELMAkGA1UEBhMCVVMx - GDAWBgNVBAoTD1UuUy4gR292ZXJubWVudDEMMAoGA1UECxMDRG9EMQwwCgYDVQQL - EwNQS0kxFjAUBgNVBAMTDURvRCBSb290IENBIDIwHhcNMTMwMTE2MTQ0OTMwWhcN - MTkwMTE2MTQ0OTMwWjBXMQswCQYDVQQGEwJVUzEYMBYGA1UEChMPVS5TLiBHb3Zl - cm5tZW50MQwwCgYDVQQLEwNEb0QxDDAKBgNVBAsTA1BLSTESMBAGA1UEAxMJRE9E - IENBLTMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxicQL5CWONnf - 5l8/uon7ZoLrtqXt8FaQFkDnbKKweWZZ15hiMdEzIlPjHlykVmamTVb7w+JCEqv5 - wEpLQO+RE4Y5MFHWbo4nt0GJKQHuWEZzBHFEXGlDPjLmZN+za5kscKLQPk3YWBJt - RfA9k1S+3+L7zxH//IoBN++nLrpADGo+HOQKMoBpvSI57Et2ybFakzwhhDjdcxOC - +V0MgQqpslN02QuOwOiXuz1fE4y1uTvs9rudjiD2a7ydFDLcfrniY7BqwYC5FvyR - 76yyCZ9SR1gTXmJ+mhKGW8UgH+GOZgB2U+znIokhTF+56b6gUpMOpsjezLeCrSJt - i9AwUzZVVwIDAQABo4ICHDCCAhgwHQYDVR0OBBYEFETjRqNB7mCxXqeTJfSgU+63 - Sb67MB8GA1UdIwQYMBaAFEl0uwxeunr+AlTve6DGlcYJgHCWMBIGA1UdEwEB/wQI - MAYBAf8CAQAwDAYDVR0kBAUwA4ABADAOBgNVHQ8BAf8EBAMCAYYwZgYDVR0gBF8w - XTALBglghkgBZQIBCwUwCwYJYIZIAWUCAQsJMAsGCWCGSAFlAgELETALBglghkgB - ZQIBCxIwCwYJYIZIAWUCAQsTMAwGCmCGSAFlAwIBAxowDAYKYIZIAWUDAgEDGzA3 - BgNVHR8EMDAuMCygKqAohiZodHRwOi8vY3JsLmRpc2EubWlsL2NybC9ET0RST09U - Q0EyLmNybDCCAQEGCCsGAQUFBwEBBIH0MIHxMDoGCCsGAQUFBzAChi5odHRwOi8v - Y3JsLmRpc2EubWlsL2lzc3VlZHRvL0RPRFJPT1RDQTJfSVQucDdjMCAGCCsGAQUF - BzABhhRodHRwOi8vb2NzcC5kaXNhLm1pbDCBkAYIKwYBBQUHMAKGgYNsZGFwOi8v - Y3JsLmdkcy5kaXNhLm1pbC9jbiUzZERvRCUyMFJvb3QlMjBDQSUyMDIlMmNvdSUz - ZFBLSSUyY291JTNkRG9EJTJjbyUzZFUuUy4lMjBHb3Zlcm5tZW50JTJjYyUzZFVT - P2Nyb3NzQ2VydGlmaWNhdGVQYWlyO2JpbmFyeTANBgkqhkiG9w0BAQUFAAOCAQEA - R1FS3PSgc5pC5wvsI5GNJXW0RII0qvlGdVHD9g745+MvtCDD76FlNOCdh8HmLmLw - J+jrxc81ldJAgIuSCbamG9USZDHbtdQO3wqKtlb1vHaSkxl8v2V9coHYZHs5NIp2 - WMwdQ/cHzxyDA3O+OBfbdK1pCRF87djWAo1mPatryjPbx3pmxd6nJ0gPZhLuaCTA - 75HqBhkqUFgT4CL8DrEk++uOQgIPd4gVi+by9VO3fOBVmxPWtnDKc3DjUyXBKB57 - xCxJbpDbqstbAxvCh4f1q75RcXNtJmZ7mx0X4O3jwN4dJ7HtDTRGPt0uXvSCcNrR - kxt53dZK5875P3MfzormFg== - -----END CERTIFICATE----- - -kind: ConfigMap -metadata: - name: nginx-client-ca-bundle - namespace: atat diff --git a/deploy/minikube/secrets.yml b/deploy/minikube/secrets.yml deleted file mode 100644 index d5aa9807..00000000 --- a/deploy/minikube/secrets.yml +++ /dev/null @@ -1,26 +0,0 @@ -apiVersion: v1 -data: - override.ini: W2RlZmF1bHRdCkVOVklST05NRU5UID0gZGV2Cg== -kind: Secret -metadata: - name: atst-config-ini - namespace: atat -type: Opaque ---- -apiVersion: v1 -data: - htpasswd: bWluaWt1YmU6JGFwcjEkRFNrbXhtNGYkcEVjTzEyYUpWcTcyREFSL0I2cmlvLgo= -kind: Secret -metadata: - name: atst-nginx-htpasswd - namespace: atat -type: Opaque ---- -apiVersion: v1 -data: - client-ca-bundle.pem: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVsVENDQTMyZ0F3SUJBZ0lKQU41cURraStWbGZQTUEwR0NTcUdTSWIzRFFFQkJRVUFNSUdOTVFzd0NRWUQKVlFRR0V3SlZVekVWTUJNR0ExVUVDQk1NVUdWdWJuTjViSFpoYm1saE1SVXdFd1lEVlFRSEV3eFFhR2xzWVdSbApiSEJvYVdFeEVEQU9CZ05WQkFvVEIwWmhkWGhFYjBReEN6QUpCZ05WQkFzVEFsQlhNUkV3RHdZRFZRUURFd2hHCllYVjRJRVJ2UkRFZU1Cd0dDU3FHU0liM0RRRUpBUllQWm1GMWVHUnZaRUJrYjJRdVkyOXRNQjRYRFRFNE1EWXkKTURJd016ZzBOMW9YRFRFNU1EWXlNREl3TXpnME4xb3dnWTB4Q3pBSkJnTlZCQVlUQWxWVE1SVXdFd1lEVlFRSQpFd3hRWlc1dWMzbHNkbUZ1YVdFeEZUQVRCZ05WQkFjVERGQm9hV3hoWkdWc2NHaHBZVEVRTUE0R0ExVUVDaE1IClJtRjFlRVJ2UkRFTE1Ba0dBMVVFQ3hNQ1VGY3hFVEFQQmdOVkJBTVRDRVpoZFhnZ1JHOUVNUjR3SEFZSktvWkkKaHZjTkFRa0JGZzltWVhWNFpHOWtRR1J2WkM1amIyMHdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBdwpnZ0VLQW9JQkFRRHlRVUZjdVErWUtPRUp0djRYaktPVHBPTHA4SWRic2FGd1U4WWdlbk1kdkFjMU9OWlJMLzJvCmphQ1p4K2tCMlFTQ1ZIMmphTFVRLzJpNHV6NHJFMjFOZ3B4K0VIYTFoZ0RRQU5sZTNkNUNXcm4yUTEwL3BkUGUKckpIWWtNU2laM2NOV2ZGUEJmSER0SnJMbFJVd0prZ3krbFVTTG5PYWlwbUJaTVlYYlY4L3FVaDY5bldKUU5YaQpBdm1TVXc4andVUGZUcnBRVnpmdGtPWXorMEhWSnl2S2lqVHNqMUxhUFpUUjNEOE9oYkZudlpXSWxoSVVqSlpPCmphcC94UTNZRU9jTkYrZ2Z4OGhEUUcyU25sdFdnZWNQc2dpQlJYbVpLMklxRHYzOURFMkROaXVrRWNsWkxoYk4KU3BUaWJOWndrVnpjVFNSVjJtU09IS1hxVGNIMHdUdnBBZ01CQUFHamdmVXdnZkl3SFFZRFZSME9CQllFRkFvLwo2YXVIY0tNSzFJdFRFbGcxS2s0TXlvQjVNSUhDQmdOVkhTTUVnYm93Z2JlQUZBby82YXVIY0tNSzFJdFRFbGcxCktrNE15b0I1b1lHVHBJR1FNSUdOTVFzd0NRWURWUVFHRXdKVlV6RVZNQk1HQTFVRUNCTU1VR1Z1Ym5ONWJIWmgKYm1saE1SVXdFd1lEVlFRSEV3eFFhR2xzWVdSbGJIQm9hV0V4RURBT0JnTlZCQW9UQjBaaGRYaEViMFF4Q3pBSgpCZ05WQkFzVEFsQlhNUkV3RHdZRFZRUURFd2hHWVhWNElFUnZSREVlTUJ3R0NTcUdTSWIzRFFFSkFSWVBabUYxCmVHUnZaRUJrYjJRdVkyOXRnZ2tBM21vT1NMNVdWODh3REFZRFZSMFRCQVV3QXdFQi96QU5CZ2txaGtpRzl3MEIKQVFVRkFBT0NBUUVBcDRmVlllU0tZSklDQlF0MzdOT0Y2cVorZHY4R0JESStvWnk3dkMrVmNqaVJhT0RraXo5dwpJTzVkQlp4eC9sZEg1c0QyNE9jMlNIKzQ4UzZVakUvRDVrRHBNL25JZGRmVmZMMmYyMjJzRTE0UnNxZ3JobWJHCnFSYUVCOE5YV2lTUXlLT0tYNjN2OHNjaW9VcWI5aEZZK2d0d2I4SERGaU9aRngrNjdML05hWFNoNlZBOEJiTGoKbzU1RWFmalRncitZYWQ3U3JaSTVmNlEyaVErdXVIY0pzZjdmRWUzS3RzNVV3dDVLWEJCZk14ZWFTeVFSeE5YKwpKQkJteTZNYXhkZFB0dXMzTUgrZUlnSTJXcDJyb2ZIL1B0R25Tb2l6Qmo1SVpYQmtjMTh4MURHNXBBSkw0MjA1CkVLUW9pY3NhZkUyN1hCdzQ1ZEszY1JCTFhQV3Q4SnJDQmc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCnN1YmplY3Q9L0M9VVMvTz1VLlMuIEdvdmVybm1lbnQvT1U9RG9EL09VPVBLSS9DTj1ET0QgU1cgQ0EtNTgKaXNzdWVyPS9DPVVTL089VS5TLiBHb3Zlcm5tZW50L09VPURvRC9PVT1QS0kvQ049RG9EIFJvb3QgQ0EgNQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJREhUQ0NBcU9nQXdJQkFnSUJFVEFLQmdncWhrak9QUVFEQXpCYk1Rc3dDUVlEVlFRR0V3SlZVekVZTUJZRwpBMVVFQ2hNUFZTNVRMaUJIYjNabGNtNXRaVzUwTVF3d0NnWURWUVFMRXdORWIwUXhEREFLQmdOVkJBc1RBMUJMClNURVdNQlFHQTFVRUF4TU5SRzlFSUZKdmIzUWdRMEVnTlRBZUZ3MHhOakV5TVRNeE5EUXdOVEphRncweU1qRXkKTVRJeE5EUXdOVEphTUZveEN6QUpCZ05WQkFZVEFsVlRNUmd3RmdZRFZRUUtFdzlWTGxNdUlFZHZkbVZ5Ym0xbApiblF4RERBS0JnTlZCQXNUQTBSdlJERU1NQW9HQTFVRUN4TURVRXRKTVJVd0V3WURWUVFERXd4RVQwUWdVMWNnClEwRXROVGd3ZGpBUUJnY3Foa2pPUFFJQkJnVXJnUVFBSWdOaUFBU2k2ejNsTFN3YXFRNkZQUXJNeGxJVzJWQmYKeFl6QTdmK3ozcEJiMkF6TlZuTVZzUk1iTWUyZjNMQ0xhQUsza1ZIYmYyTUZ2ZDAwVUNRVGFKTm9CTHJzTDdwegpTQTNqSHRCZ2x6T3dJNTc1NVZOWnlkQzJhSzVPencrYTJ5TVFyditqZ2dFNk1JSUJOakFmQmdOVkhTTUVHREFXCmdCU0d3QlZDKzNGMjNENHRFVnNoRUVRMXlzSGNGREFkQmdOVkhRNEVGZ1FVSkZVYUM1QWhMTllqcW9qU251bTQKcmFLQWZkd3dEZ1lEVlIwUEFRSC9CQVFEQWdFR01EMEdBMVVkSUFRMk1EUXdDd1lKWUlaSUFXVUNBUXNtTUFzRwpDV0NHU0FGbEFnRUxLVEFMQmdsZ2hrZ0JaUUlCQ3l3d0N3WUpZSVpJQVdVQ0FRczdNQklHQTFVZEV3RUIvd1FJCk1BWUJBZjhDQVFBd0RBWURWUjBrQkFVd0E0QUJBREEzQmdOVkhSOEVNREF1TUN5Z0txQW9oaVpvZEhSd09pOHYKWTNKc0xtUnBjMkV1Yldsc0wyTnliQzlFVDBSU1QwOVVRMEUxTG1OeWJEQktCZ2dyQmdFRkJRY0JBUVErTUR3dwpPZ1lJS3dZQkJRVUhNQUtHTG1oMGRIQTZMeTlqY213dVpHbHpZUzV0YVd3dmFYTnpkV1ZrZEc4dlJFOUVVazlQClZFTkJOVjlKVkM1d04yTXdDZ1lJS29aSXpqMEVBd01EYUFBd1pRSXhBS2lsMXFvelhkejdFN2tBT2hhWjdyT0cKODEvZFZSNW8yS0dQRmF2cnRvM2c5ZUJFMVNib2ltaUtLaWl2ZU5uaHRRSXdMTkFhZVp1a3BqOXNEczJlMTZ2dQpzNHJScVMzdHVhbnNkSDFGeThqOUluSm9qQkxhWWVKUjYwajBBY2h5cXZhRwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpzdWJqZWN0PS9DPVVTL089VS5TLiBHb3Zlcm5tZW50L09VPURvRC9PVT1QS0kvQ049RE9EIFNXIENBLTU3Cmlzc3Vlcj0vQz1VUy9PPVUuUy4gR292ZXJubWVudC9PVT1Eb0QvT1U9UEtJL0NOPURvRCBSb290IENBIDUKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURIVENDQXFPZ0F3SUJBZ0lCRURBS0JnZ3Foa2pPUFFRREF6QmJNUXN3Q1FZRFZRUUdFd0pWVXpFWU1CWUcKQTFVRUNoTVBWUzVUTGlCSGIzWmxjbTV0Wlc1ME1Rd3dDZ1lEVlFRTEV3TkViMFF4RERBS0JnTlZCQXNUQTFCTApTVEVXTUJRR0ExVUVBeE1OUkc5RUlGSnZiM1FnUTBFZ05UQWVGdzB4TmpFeU1UTXhORE01TkRsYUZ3MHlNakV5Ck1USXhORE01TkRsYU1Gb3hDekFKQmdOVkJBWVRBbFZUTVJnd0ZnWURWUVFLRXc5VkxsTXVJRWR2ZG1WeWJtMWwKYm5ReEREQUtCZ05WQkFzVEEwUnZSREVNTUFvR0ExVUVDeE1EVUV0Sk1SVXdFd1lEVlFRREV3eEVUMFFnVTFjZwpRMEV0TlRjd2RqQVFCZ2NxaGtqT1BRSUJCZ1VyZ1FRQUlnTmlBQVJuVG5saFgxWEF5WnhFd3JHUmU2Q3B4TnUvCi9FRGczTmpiSElFa25ocTVzaDdnQ0V3dHB5MytCMzdzczY0bVdxODhKVFdydGpkbW1zdVdEUWdVNlk2eDZRVU0KOE5uVS9pRUlMQWRIK2Q4WUMvT0NveHhVZHoxM0hoa2RsdDFKQi82amdnRTZNSUlCTmpBZkJnTlZIU01FR0RBVwpnQlNHd0JWQyszRjIzRDR0RVZzaEVFUTF5c0hjRkRBZEJnTlZIUTRFRmdRVVdoSXByRGZVamo3MWpWTzFJdkE2CkJBblJvK3N3RGdZRFZSMFBBUUgvQkFRREFnRUdNRDBHQTFVZElBUTJNRFF3Q3dZSllJWklBV1VDQVFzbU1Bc0cKQ1dDR1NBRmxBZ0VMS1RBTEJnbGdoa2dCWlFJQkN5d3dDd1lKWUlaSUFXVUNBUXM3TUJJR0ExVWRFd0VCL3dRSQpNQVlCQWY4Q0FRQXdEQVlEVlIwa0JBVXdBNEFCQURBM0JnTlZIUjhFTURBdU1DeWdLcUFvaGlab2RIUndPaTh2ClkzSnNMbVJwYzJFdWJXbHNMMk55YkM5RVQwUlNUMDlVUTBFMUxtTnliREJLQmdnckJnRUZCUWNCQVFRK01Ed3cKT2dZSUt3WUJCUVVITUFLR0xtaDBkSEE2THk5amNtd3VaR2x6WVM1dGFXd3ZhWE56ZFdWa2RHOHZSRTlFVWs5UApWRU5CTlY5SlZDNXdOMk13Q2dZSUtvWkl6ajBFQXdNRGFBQXdaUUl4QUowcy90WENtSmFFbU5qaDk2cWczUFFSCkppZFBhcnNtNkRSSU9QZ0wydW1vV3g5UVFQNW1DSGViUlhrL0tCT3Zwd0l3VUV3Ny9JeHJZaTViRitrWk5udzAKcWFuc0kzR1pCOTA4MEhGZGUyL293aElXWjVHTURWOG1LS2hvTlZuM2tZL0QKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKc3ViamVjdD0vQz1VUy9PPVUuUy4gR292ZXJubWVudC9PVT1Eb0QvT1U9UEtJL0NOPURvRCBSb290IENBIDUKaXNzdWVyPS9DPVVTL089VS5TLiBHb3Zlcm5tZW50L09VPURvRC9PVT1QS0kvQ049RG9EIFJvb3QgQ0EgNQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ0pEQ0NBYXFnQXdJQkFnSUJEekFLQmdncWhrak9QUVFEQXpCYk1Rc3dDUVlEVlFRR0V3SlZVekVZTUJZRwpBMVVFQ2hNUFZTNVRMaUJIYjNabGNtNXRaVzUwTVF3d0NnWURWUVFMRXdORWIwUXhEREFLQmdOVkJBc1RBMUJMClNURVdNQlFHQTFVRUF4TU5SRzlFSUZKdmIzUWdRMEVnTlRBZUZ3MHhOakEyTVRReE56RTNNamRhRncwME1UQTIKTVRReE56RTNNamRhTUZzeEN6QUpCZ05WQkFZVEFsVlRNUmd3RmdZRFZRUUtFdzlWTGxNdUlFZHZkbVZ5Ym0xbApiblF4RERBS0JnTlZCQXNUQTBSdlJERU1NQW9HQTFVRUN4TURVRXRKTVJZd0ZBWURWUVFERXcxRWIwUWdVbTl2CmRDQkRRU0ExTUhZd0VBWUhLb1pJemowQ0FRWUZLNEVFQUNJRFlnQUVObUxlQzA3QXg5Y3BSVHAvSEpubUtpRjIKc1FEZGpFZi93TEcwK3M0NlRsTDdwKzAyTFJ3ZUhKQ05sNm9ycHVMVGMzTjhYQnpRWi9RS0tkT1FoT3RSNWZGZQpITURTaG9URmJkRWtTUTdzRjRua2FNamVHbHdhQnRBNEdUTXBBUnFCbzBJd1FEQWRCZ05WSFE0RUZnUVVoc0FWClF2dHhkdHcrTFJGYklSQkVOY3JCM0JRd0RnWURWUjBQQVFIL0JBUURBZ0VHTUE4R0ExVWRFd0VCL3dRRk1BTUIKQWY4d0NnWUlLb1pJemowRUF3TURhQUF3WlFJd1FRYmszdDVpTkozZnVLb1cyVzJpT0I4NUlsZkpjSVFma3c5WApmZ1V2cFVzenpSWHFWOVhTS3grYmpYek9hcmJNQWpFQXQ0SFM0VHVUenhGazNBc3ZGOUp0MWRnRjVGQnlZbVhjCnBEektZYVVHbXNuNzdjUXd5WHVKNEtXK1kxWG1uQkhqCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCnN1YmplY3Q9L0M9VVMvTz1VLlMuIEdvdmVybm1lbnQvT1U9RG9EL09VPVBLSS9DTj1ET0QgU1cgQ0EtNTYKaXNzdWVyPS9DPVVTL089VS5TLiBHb3Zlcm5tZW50L09VPURvRC9PVT1QS0kvQ049RG9EIFJvb3QgQ0EgNAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQzR6Q0NBb2lnQXdJQkFnSUJTVEFNQmdncWhrak9QUVFEQWdVQU1Gc3hDekFKQmdOVkJBWVRBbFZUTVJndwpGZ1lEVlFRS0V3OVZMbE11SUVkdmRtVnlibTFsYm5ReEREQUtCZ05WQkFzVEEwUnZSREVNTUFvR0ExVUVDeE1EClVFdEpNUll3RkFZRFZRUURFdzFFYjBRZ1VtOXZkQ0JEUVNBME1CNFhEVEUyTVRFeU1qRTFORGd5TWxvWERUSXkKTVRFeU16RTFORGd5TWxvd1dqRUxNQWtHQTFVRUJoTUNWVk14R0RBV0JnTlZCQW9NRDFVdVV5NGdSMjkyWlhKdQpiV1Z1ZERFTU1Bb0dBMVVFQ3d3RFJHOUVNUXd3Q2dZRFZRUUxEQU5RUzBreEZUQVRCZ05WQkFNTURFUlBSQ0JUClZ5QkRRUzAxTmpCWk1CTUdCeXFHU000OUFnRUdDQ3FHU000OUF3RUhBMElBQko4UDZ3cWZidTg1dFNvNmlpVmIKUXB5VHpWZkRiRWNVdW9qc25aeGEyWnZpSTU5SjlmT0I2TGtTeHZvYWNsY0lERzJDUUhiL2NURlJsWW5tbnkyOApxaGFqZ2dFNk1JSUJOakFmQmdOVkhTTUVHREFXZ0JTOXdibHJUZlFkN0RDUXYySnp3SVF6OG5Fa2hUQWRCZ05WCkhRNEVGZ1FVdlBMMFVaMHF5K09kRUZaakJYWld5ZDI2MUZzd0RnWURWUjBQQVFIL0JBUURBZ0dHTUQwR0ExVWQKSUFRMk1EUXdDd1lKWUlaSUFXVUNBUXNsTUFzR0NXQ0dTQUZsQWdFTEtEQUxCZ2xnaGtnQlpRSUJDeXN3Q3dZSgpZSVpJQVdVQ0FRczdNQklHQTFVZEV3RUIvd1FJTUFZQkFmOENBUUF3REFZRFZSMGtCQVV3QTRBQkFEQTNCZ05WCkhSOEVNREF1TUN5Z0txQW9oaVpvZEhSd09pOHZZM0pzTG1ScGMyRXViV2xzTDJOeWJDOUVUMFJTVDA5VVEwRTAKTG1OeWJEQktCZ2dyQmdFRkJRY0JBUVErTUR3d09nWUlLd1lCQlFVSE1BS0dMbWgwZEhBNkx5OWpjbXd1WkdsegpZUzV0YVd3dmFYTnpkV1ZrZEc4dlJFOUVVazlQVkVOQk5GOUpWQzV3TjJNd0RBWUlLb1pJemowRUF3SUZBQU5ICkFEQkVBaUJqZ1IzRnp3dXFjS2ZtSUF5eWdoQzg1K0M0V1pXTGxMVi9wbkErS0YxNmlnSWdkVDNXOFlQSEVNR2gKV1BwcVZlQlIxeEpmRkJsNEgrYThPeG1KOFJUWmRVUT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKc3ViamVjdD0vQz1VUy9PPVUuUy4gR292ZXJubWVudC9PVT1Eb0QvT1U9UEtJL0NOPURPRCBTVyBDQS01NQppc3N1ZXI9L0M9VVMvTz1VLlMuIEdvdmVybm1lbnQvT1U9RG9EL09VPVBLSS9DTj1Eb0QgUm9vdCBDQSA0Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDNVRDQ0FvaWdBd0lCQWdJQlNEQU1CZ2dxaGtqT1BRUURBZ1VBTUZzeEN6QUpCZ05WQkFZVEFsVlRNUmd3CkZnWURWUVFLRXc5VkxsTXVJRWR2ZG1WeWJtMWxiblF4RERBS0JnTlZCQXNUQTBSdlJERU1NQW9HQTFVRUN4TUQKVUV0Sk1SWXdGQVlEVlFRREV3MUViMFFnVW05dmRDQkRRU0EwTUI0WERURTJNVEV5TWpFMU5EWTBObG9YRFRJeQpNVEV5TXpFMU5EWTBObG93V2pFTE1Ba0dBMVVFQmhNQ1ZWTXhHREFXQmdOVkJBb01EMVV1VXk0Z1IyOTJaWEp1CmJXVnVkREVNTUFvR0ExVUVDd3dEUkc5RU1Rd3dDZ1lEVlFRTERBTlFTMGt4RlRBVEJnTlZCQU1NREVSUFJDQlQKVnlCRFFTMDFOVEJaTUJNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5QXdFSEEwSUFCRG16aDJIRmpVaEdFYUt4WFU1RQpqVlU2NmZNSmJONTJ0V2s0UXNCSVU4ckNjdUtkenlvWTNEVFVMUnY1V2RGNG1qUEhCVGZ5Y3VXT214enRyVTY0Ck4rYWpnZ0U2TUlJQk5qQWZCZ05WSFNNRUdEQVdnQlM5d2JsclRmUWQ3RENRdjJKendJUXo4bkVraFRBZEJnTlYKSFE0RUZnUVVwVzlMSFpLMXk5MTMyYmE5U0FhK0JrZ0pOQmd3RGdZRFZSMFBBUUgvQkFRREFnR0dNRDBHQTFVZApJQVEyTURRd0N3WUpZSVpJQVdVQ0FRc2xNQXNHQ1dDR1NBRmxBZ0VMS0RBTEJnbGdoa2dCWlFJQkN5c3dDd1lKCllJWklBV1VDQVFzN01CSUdBMVVkRXdFQi93UUlNQVlCQWY4Q0FRQXdEQVlEVlIwa0JBVXdBNEFCQURBM0JnTlYKSFI4RU1EQXVNQ3lnS3FBb2hpWm9kSFJ3T2k4dlkzSnNMbVJwYzJFdWJXbHNMMk55YkM5RVQwUlNUMDlVUTBFMApMbU55YkRCS0JnZ3JCZ0VGQlFjQkFRUStNRHd3T2dZSUt3WUJCUVVITUFLR0xtaDBkSEE2THk5amNtd3VaR2x6CllTNXRhV3d2YVhOemRXVmtkRzh2UkU5RVVrOVBWRU5CTkY5SlZDNXdOMk13REFZSUtvWkl6ajBFQXdJRkFBTkoKQURCR0FpRUE4elFBK1QzYW5hTTBiMVFzWVNFdnU4WTk1UzAzR0d5OGZHMkhvaTY2MUZJQ0lRQ0RDYndRWkQxWgo4TmhuamJPQkRFb25xekZFZGlYZ0dpcTI2c3MvMWVqRGF3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKc3ViamVjdD0vQz1VUy9PPVUuUy4gR292ZXJubWVudC9PVT1Eb0QvT1U9UEtJL0NOPURPRCBJRCBTVyBDQS00OAppc3N1ZXI9L0M9VVMvTz1VLlMuIEdvdmVybm1lbnQvT1U9RG9EL09VPVBLSS9DTj1Eb0QgUm9vdCBDQSA0Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDMmpDQ0FuNmdBd0lCQWdJQkNqQU1CZ2dxaGtqT1BRUURBZ1VBTUZzeEN6QUpCZ05WQkFZVEFsVlRNUmd3CkZnWURWUVFLRXc5VkxsTXVJRWR2ZG1WeWJtMWxiblF4RERBS0JnTlZCQXNUQTBSdlJERU1NQW9HQTFVRUN4TUQKVUV0Sk1SWXdGQVlEVlFRREV3MUViMFFnVW05dmRDQkRRU0EwTUI0WERURTJNRFF4TWpFek1UazBPVm9YRFRJeQpNRFF4TXpFek1UazBPVm93WFRFTE1Ba0dBMVVFQmhNQ1ZWTXhHREFXQmdOVkJBb1REMVV1VXk0Z1IyOTJaWEp1CmJXVnVkREVNTUFvR0ExVUVDeE1EUkc5RU1Rd3dDZ1lEVlFRTEV3TlFTMGt4R0RBV0JnTlZCQU1URDBSUFJDQkoKUkNCVFZ5QkRRUzAwT0RCWk1CTUdCeXFHU000OUFnRUdDQ3FHU000OUF3RUhBMElBQkhQM2dNSXJNNVhIcnRQZwpOcDdCbTQyZXFKaWhlSTBmTU5lOVdESmtGZEpiSmVUcmR4VXRZUUpmYjRuWW1MbG5HRzdCdzNSTEhoTGhTMHZpCk1PMGluYzJqZ2dFdE1JSUJLVEFmQmdOVkhTTUVHREFXZ0JTOXdibHJUZlFkN0RDUXYySnp3SVF6OG5Fa2hUQWQKQmdOVkhRNEVGZ1FVdHJhWGFuRFR1ellBdWVsRmRDOG5sU3J5V1Frd0RnWURWUjBQQVFIL0JBUURBZ0dHTURBRwpBMVVkSUFRcE1DY3dDd1lKWUlaSUFXVUNBUXNvTUFzR0NXQ0dTQUZsQWdFTEt6QUxCZ2xnaGtnQlpRSUJDeVV3CkVnWURWUjBUQVFIL0JBZ3dCZ0VCL3dJQkFEQU1CZ05WSFNRRUJUQURnQUVBTURjR0ExVWRId1F3TUM0d0xLQXEKb0NpR0ptaDBkSEE2THk5amNtd3VaR2x6WVM1dGFXd3ZZM0pzTDBSUFJGSlBUMVJEUVRRdVkzSnNNRW9HQ0NzRwpBUVVGQndFQkJENHdQREE2QmdnckJnRUZCUWN3QW9ZdWFIUjBjRG92TDJOeWJDNWthWE5oTG0xcGJDOXBjM04xClpXUjBieTlFVDBSU1QwOVVRMEUwWDBsVUxuQTNZekFNQmdncWhrak9QUVFEQWdVQUEwZ0FNRVVDSVFDK2lHRzgKa2piVi9WTmNLbHh1dXVmelUwaFZhM25iWStBSDFHLzAxOUVWR2dJZ09CaW9PSmpMMkRFT3N3c3dvdzB6MFdheQpPK0RxNTJ5OUlJdDFMTmlFdVF3PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpzdWJqZWN0PS9DPVVTL089VS5TLiBHb3Zlcm5tZW50L09VPURvRC9PVT1QS0kvQ049RE9EIElEIFNXIENBLTQ3Cmlzc3Vlcj0vQz1VUy9PPVUuUy4gR292ZXJubWVudC9PVT1Eb0QvT1U9UEtJL0NOPURvRCBSb290IENBIDQKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUMyekNDQW42Z0F3SUJBZ0lCQ1RBTUJnZ3Foa2pPUFFRREFnVUFNRnN4Q3pBSkJnTlZCQVlUQWxWVE1SZ3cKRmdZRFZRUUtFdzlWTGxNdUlFZHZkbVZ5Ym0xbGJuUXhEREFLQmdOVkJBc1RBMFJ2UkRFTU1Bb0dBMVVFQ3hNRApVRXRKTVJZd0ZBWURWUVFERXcxRWIwUWdVbTl2ZENCRFFTQTBNQjRYRFRFMk1EUXhNakV6TVRJME0xb1hEVEl5Ck1EUXhNekV6TVRJME0xb3dYVEVMTUFrR0ExVUVCaE1DVlZNeEdEQVdCZ05WQkFvVEQxVXVVeTRnUjI5MlpYSnUKYldWdWRERU1NQW9HQTFVRUN4TURSRzlFTVF3d0NnWURWUVFMRXdOUVMwa3hHREFXQmdOVkJBTVREMFJQUkNCSgpSQ0JUVnlCRFFTMDBOekJaTUJNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5QXdFSEEwSUFCSVhZQTVHdHpqdWM4S0ljCmtnTXUzK21nQlBsZGZCa09yOWkrNHdoUXpZODRGREt2enNjNzhCYnVRaWNXRHNiSkRYTjQ1TjVBQ29Ba3dySXoKTVAxTlJaeWpnZ0V0TUlJQktUQWZCZ05WSFNNRUdEQVdnQlM5d2JsclRmUWQ3RENRdjJKendJUXo4bkVraFRBZApCZ05WSFE0RUZnUVVvd0VNU3dHY0VCOG1hZG1PWEdjbnhkcXNObm93RGdZRFZSMFBBUUgvQkFRREFnR0dNREFHCkExVWRJQVFwTUNjd0N3WUpZSVpJQVdVQ0FRc29NQXNHQ1dDR1NBRmxBZ0VMS3pBTEJnbGdoa2dCWlFJQkN5VXcKRWdZRFZSMFRBUUgvQkFnd0JnRUIvd0lCQURBTUJnTlZIU1FFQlRBRGdBRUFNRGNHQTFVZEh3UXdNQzR3TEtBcQpvQ2lHSm1oMGRIQTZMeTlqY213dVpHbHpZUzV0YVd3dlkzSnNMMFJQUkZKUFQxUkRRVFF1WTNKc01Fb0dDQ3NHCkFRVUZCd0VCQkQ0d1BEQTZCZ2dyQmdFRkJRY3dBb1l1YUhSMGNEb3ZMMk55YkM1a2FYTmhMbTFwYkM5cGMzTjEKWldSMGJ5OUVUMFJTVDA5VVEwRTBYMGxVTG5BM1l6QU1CZ2dxaGtqT1BRUURBZ1VBQTBrQU1FWUNJUUNON2pKZQpoMEtHWjA1T1RDYnhaS2d2cVI3TjNoY280cVRYY0VUcG0xbVBtQUloQVBaV2NsQmY1NGxPQ0RRa3UwVUJ6OGdXCmxZZGVWWG1pdUt6N0R2ZUZ0aGlzCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCnN1YmplY3Q9L0M9VVMvTz1VLlMuIEdvdmVybm1lbnQvT1U9RG9EL09VPVBLSS9DTj1Eb0QgUm9vdCBDQSA0Cmlzc3Vlcj0vQz1VUy9PPVUuUy4gR292ZXJubWVudC9PVT1Eb0QvT1U9UEtJL0NOPURvRCBSb290IENBIDQKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUI2ekNDQVkrZ0F3SUJBZ0lCQVRBTUJnZ3Foa2pPUFFRREFnVUFNRnN4Q3pBSkJnTlZCQVlUQWxWVE1SZ3cKRmdZRFZRUUtFdzlWTGxNdUlFZHZkbVZ5Ym0xbGJuUXhEREFLQmdOVkJBc1RBMFJ2UkRFTU1Bb0dBMVVFQ3hNRApVRXRKTVJZd0ZBWURWUVFERXcxRWIwUWdVbTl2ZENCRFFTQTBNQjRYRFRFeU1EY3pNREU1TkRneU0xb1hEVE15Ck1EY3lOVEU1TkRneU0xb3dXekVMTUFrR0ExVUVCaE1DVlZNeEdEQVdCZ05WQkFvVEQxVXVVeTRnUjI5MlpYSnUKYldWdWRERU1NQW9HQTFVRUN4TURSRzlFTVF3d0NnWURWUVFMRXdOUVMwa3hGakFVQmdOVkJBTVREVVJ2UkNCUwpiMjkwSUVOQklEUXdXVEFUQmdjcWhrak9QUUlCQmdncWhrak9QUU1CQndOQ0FBUjJ5TmhEeXc4SDBpd1BLdEE0CjhZTE5RbFhuM0IxYWdMY0lrVXRVMWsreVpvVTBsbzB1UHZUZ1NwRjh6TTJHbnhIZ1VxRm1nc2JMa0NQc1gxLzEKOER4Rm8wSXdRREFkQmdOVkhRNEVGZ1FVdmNHNWEwMzBIZXd3a0w5aWM4Q0VNL0p4SklVd0RnWURWUjBQQVFILwpCQVFEQWdHR01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RBWUlLb1pJemowRUF3SUZBQU5JQURCRkFpRUE2R0dLCjk5eXFDYVVIMGtTZWdnTmFSRk5IaENPWnoxelQza3BlMXJzMU5VWUNJSFlQdU1SOEZqVi8xQkx0aUQyQUVXdGsKQjB4RlpkOVRybDhCN2ZGRDB2VzMKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKc3ViamVjdD0vQz1VUy9PPVUuUy4gR292ZXJubWVudC9PVT1Eb0QvT1U9UEtJL0NOPURPRCBJRCBTVyBDQS00Ngppc3N1ZXI9L0M9VVMvTz1VLlMuIEdvdmVybm1lbnQvT1U9RG9EL09VPVBLSS9DTj1Eb0QgUm9vdCBDQSAzCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFcmpDQ0E1YWdBd0lCQWdJQlpEQU5CZ2txaGtpRzl3MEJBUXNGQURCYk1Rc3dDUVlEVlFRR0V3SlZVekVZCk1CWUdBMVVFQ2hNUFZTNVRMaUJIYjNabGNtNXRaVzUwTVF3d0NnWURWUVFMRXdORWIwUXhEREFLQmdOVkJBc1QKQTFCTFNURVdNQlFHQTFVRUF4TU5SRzlFSUZKdmIzUWdRMEVnTXpBZUZ3MHhOakF6TURneE5ESXlNamRhRncweQpNakF6TURreE5ESXlNamRhTUYweEN6QUpCZ05WQkFZVEFsVlRNUmd3RmdZRFZRUUtFdzlWTGxNdUlFZHZkbVZ5CmJtMWxiblF4RERBS0JnTlZCQXNUQTBSdlJERU1NQW9HQTFVRUN4TURVRXRKTVJnd0ZnWURWUVFERXc5RVQwUWcKU1VRZ1UxY2dRMEV0TkRZd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUURCOHQ3Twppekh0cUNMVUtYZE5jQU9ZbEpETnlOb3FXMjJaQjc1S2lVM0dKbmE1d3c0OTlTT25CYUVVNE92UlNNSTNGY0tTCmxaUnZKSkliTnBjVWJuNlgvNGNFSDZnNjRsQ0dTWGNtOG5sL3JVMVcwb25mN2wvZms4dGNhVlJHMGhQOWlUYmUKN2ZqbEo3aEVXd0tFWFNrN1hrci8zZTA5YnZLSUhWdGlDc1Y2Y09sTnNLNkg3SmJFaFJ3NHlQT2txZFh0cnBRWAptTmg5WTZPR3lhOTFJMXZ6WU8remNleHIyK01Pb0hGSnlBREJWRi8rTHJNV2RScVZJMEZsOHI4TlhLbkdYcEM3CnlQbnMyOGd6MWVnbXhKNU5zSnRROHA0V0hNUW5BNkozd1ByKzduYSs1TUt6TGdDSW9NeEQydklKMEZVMjhPREUKV3JBYjljbHFXcXYvSnRlL0FnTUJBQUdqZ2dGNU1JSUJkVEFmQmdOVkhTTUVHREFXZ0JSc2lwU2lkN0dBY2gyQgplaGFxOHR6T1p1NUZ3REFkQmdOVkhRNEVGZ1FVVzJkcFhyVllDNXdmQ2R3MWZadldKKzVpcXB3d0RnWURWUjBQCkFRSC9CQVFEQWdHR01Gb0dBMVVkSUFSVE1GRXdDd1lKWUlaSUFXVUNBUXNrTUFzR0NXQ0dTQUZsQWdFTEp6QUwKQmdsZ2hrZ0JaUUlCQ3lvd0RBWUtZSVpJQVdVREFnRUREVEFNQmdwZ2hrZ0JaUU1DQVFNUk1Bd0dDbUNHU0FGbApBd0lCQXljd0VnWURWUjBUQVFIL0JBZ3dCZ0VCL3dJQkFEQU1CZ05WSFNRRUJUQURnQUVBTURjR0ExVWRId1F3Ck1DNHdMS0Fxb0NpR0ptaDBkSEE2THk5amNtd3VaR2x6WVM1dGFXd3ZZM0pzTDBSUFJGSlBUMVJEUVRNdVkzSnMKTUd3R0NDc0dBUVVGQndFQkJHQXdYakE2QmdnckJnRUZCUWN3QW9ZdWFIUjBjRG92TDJOeWJDNWthWE5oTG0xcApiQzlwYzNOMVpXUjBieTlFVDBSU1QwOVVRMEV6WDBsVUxuQTNZekFnQmdnckJnRUZCUWN3QVlZVWFIUjBjRG92CkwyOWpjM0F1WkdsellTNXRhV3d3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQUhyQW1GU3k4NlpBc2NFVTVLSUQKVWRYdGZDMytPVi9JMUJZbllpWkhKS0pqOHpSdXF2ZFd2c3VsS3RDR0tabzF3RnY0NDZuLzE0WVJiSTNUS25vMgpRL2M0SjZ1eitNT3NJR0x5UHZQbXdPNVk2R2FxajVFREQ2cmd5WVNSZEhybUJsTEUxYVVtZWRjODZVT01LQXo2Ck93bVVGUnJ1OGFYRi9ZU0VXUW1rZUlXWDRzYUltYnY4RXZiMnZxakRQRkVSakg2QmViWURSSTdacE1XZzhqSnQKTG5RRm9LT2hDT1RuSEp6MHZkL3ZuaDRJQys3K0tOZ2JnK1JaME8zSDlkbkJlVUxjTEdlSHR3MkYyakJNcmx5VwpkMEl5bjd2ajljT0drZHJrZ2dTcGRHcXFsWGlOa1ZzWWh5UFh6dEw4ak9xbXlZN25kWHViRVFDc1l4TUlJWHVyClNFUT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKc3ViamVjdD0vQz1VUy9PPVUuUy4gR292ZXJubWVudC9PVT1Eb0QvT1U9UEtJL0NOPURPRCBJRCBTVyBDQS00NQppc3N1ZXI9L0M9VVMvTz1VLlMuIEdvdmVybm1lbnQvT1U9RG9EL09VPVBLSS9DTj1Eb0QgUm9vdCBDQSAzCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFcmpDQ0E1YWdBd0lCQWdJQll6QU5CZ2txaGtpRzl3MEJBUXNGQURCYk1Rc3dDUVlEVlFRR0V3SlZVekVZCk1CWUdBMVVFQ2hNUFZTNVRMaUJIYjNabGNtNXRaVzUwTVF3d0NnWURWUVFMRXdORWIwUXhEREFLQmdOVkJBc1QKQTFCTFNURVdNQlFHQTFVRUF4TU5SRzlFSUZKdmIzUWdRMEVnTXpBZUZ3MHhOakF6TURneE16STROVFphRncweQpNakF6TURreE16STROVFphTUYweEN6QUpCZ05WQkFZVEFsVlRNUmd3RmdZRFZRUUtFdzlWTGxNdUlFZHZkbVZ5CmJtMWxiblF4RERBS0JnTlZCQXNUQTBSdlJERU1NQW9HQTFVRUN4TURVRXRKTVJnd0ZnWURWUVFERXc5RVQwUWcKU1VRZ1UxY2dRMEV0TkRVd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUNWVnRjcApSSk1kTGJsNEM0ZGZqY0JDZkFxVU1MUmJYaUtpRFJuQU1YbjNjNUlyWUVORDd1SktKVENyUWtsUThZQzU3MFphCllYeGhTYUtpRmJjUjBNQTdvSEVGOEhXZ2xCNTNHU21Gb3dxdEFpRVJTL0FXYk1Kb1hsaC9NQkp3ZWVTVlV6YXQKQ1BPOFYzcTU2WS81T0ZnbFc1WVYzdEEzS2d2K0J2bHFqWUN6V05lQndmeWVnbGtCOEVXaTU4bGxBaXlqc0dQZApRcE43MUxPeXFISzE2U0N2MjJFNm1JeXJ4ZkZnZWFXSXhJQmVYemdWeER6WjJkamJzcVl5ckpsQWRVQ2JHemgvCk85TjBNaEVDMG1NUmNnbzd1RVIwb2xuV3JpMW9PV3RKbDJPazhadk1xR1FiZGt4a2tteEN0aFVXeXhGb1ZxN1AKeFU3SVltQmlCbjI3U3lGN0FnTUJBQUdqZ2dGNU1JSUJkVEFmQmdOVkhTTUVHREFXZ0JSc2lwU2lkN0dBY2gyQgplaGFxOHR6T1p1NUZ3REFkQmdOVkhRNEVGZ1FVeS8wVnBwcGc4UzVPVzVVY2pEOGRqY0tqSWhzd0RnWURWUjBQCkFRSC9CQVFEQWdHR01Gb0dBMVVkSUFSVE1GRXdDd1lKWUlaSUFXVUNBUXNrTUFzR0NXQ0dTQUZsQWdFTEp6QUwKQmdsZ2hrZ0JaUUlCQ3lvd0RBWUtZSVpJQVdVREFnRUREVEFNQmdwZ2hrZ0JaUU1DQVFNUk1Bd0dDbUNHU0FGbApBd0lCQXljd0VnWURWUjBUQVFIL0JBZ3dCZ0VCL3dJQkFEQU1CZ05WSFNRRUJUQURnQUVBTURjR0ExVWRId1F3Ck1DNHdMS0Fxb0NpR0ptaDBkSEE2THk5amNtd3VaR2x6WVM1dGFXd3ZZM0pzTDBSUFJGSlBUMVJEUVRNdVkzSnMKTUd3R0NDc0dBUVVGQndFQkJHQXdYakE2QmdnckJnRUZCUWN3QW9ZdWFIUjBjRG92TDJOeWJDNWthWE5oTG0xcApiQzlwYzNOMVpXUjBieTlFVDBSU1QwOVVRMEV6WDBsVUxuQTNZekFnQmdnckJnRUZCUWN3QVlZVWFIUjBjRG92CkwyOWpjM0F1WkdsellTNXRhV3d3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQURQdWJaL2taTkRCL2hrdUd1dUsKT21pR1pKQzJDMWRCR2t1TTBTWGV3V3pHSEVQS2FwYTRyTkRyZ0RTVFFNT0xlTVVDbXI0WGJIYk1vMW1xSURCYwpTaW9WRmlxK0Nvb0Nza2ozRCtnajFZK2RiZmkrSVc4L0lsYkhWRHhsQXBEbEoxMXYzbnZOSk5IcDdnQTBoRlZECkRhMlVwajl3VnNZcjBSZVh2SFJ6MFpiNmExLzdSNnRvNDFjOHd3ZzNoV0NHQ1hzUHZuSUxhUUs1Sm14TlZYMWkKSFQ5NVVLRHhueXNiK3Z3K0d4eEpnYUlIODdIa2d4WnRPYzdXVW5QK0dGQUxmS1F5THNSOEozdmtJa0kyREpmUApGanRCYmxnWFduOWxDSTVsWWdlSDNWYktqVnZvd2NVV3V3MkY4UEphYU5IcFZwV3d2K1hmekxtVUNkTEdqWnJCCnpCUT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKc3ViamVjdD0vQz1VUy9PPVUuUy4gR292ZXJubWVudC9PVT1Eb0QvT1U9UEtJL0NOPURPRCBJRCBDQS00NAppc3N1ZXI9L0M9VVMvTz1VLlMuIEdvdmVybm1lbnQvT1U9RG9EL09VPVBLSS9DTj1Eb0QgUm9vdCBDQSAzCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFblRDQ0E0V2dBd0lCQWdJQkd6QU5CZ2txaGtpRzl3MEJBUXNGQURCYk1Rc3dDUVlEVlFRR0V3SlZVekVZCk1CWUdBMVVFQ2hNUFZTNVRMaUJIYjNabGNtNXRaVzUwTVF3d0NnWURWUVFMRXdORWIwUXhEREFLQmdOVkJBc1QKQTFCTFNURVdNQlFHQTFVRUF4TU5SRzlFSUZKdmIzUWdRMEVnTXpBZUZ3MHhOVEV4TURreE5qRTRNVFJhRncweQpNVEV4TURreE5qRTRNVFJhTUZveEN6QUpCZ05WQkFZVEFsVlRNUmd3RmdZRFZRUUtFdzlWTGxNdUlFZHZkbVZ5CmJtMWxiblF4RERBS0JnTlZCQXNUQTBSdlJERU1NQW9HQTFVRUN4TURVRXRKTVJVd0V3WURWUVFERXd4RVQwUWcKU1VRZ1EwRXRORFF3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRREczK1R0eStwRApvVEpHYkp2YkwvdVFVRDV2WGtSMUc2dlN4TlNiRnNrSW1tcnBMVjJocjh1Q0dBRkRMK0tiM2RQYVlMVEVlYUs5CjM0THFEQzAyK0N3NG1MYW1vWEt0ZkJHbEZUMVQzQUh6cFM0d0pBaGZyU0dGR1JCZFk3NmpwVG4xZWlhV3MrbmIKQ0xpSmpweFFPUWhwN2NheXRzWm5HdkxOT0ZVYytRWkpGc3lBZjA2Y3BXRW1vL2lBeDdLWExNUFY2c2JHVExxbQpreXFOeFlQdnFkMVJ5eXEydmk1UHF5dzBzd2cyK3d2a01oR0laMzlyeUpoZ2FVNXZjQWhkMzl6NTN0TlUxdHRwCnhQNTA2WjR1REc5VG1CY2lVRmZzNHVaYno5YU96VDlZWXM2ZW5saDE3MlBVNDhXZkNGSVFTT1hqUmNCOS9Ya0QKYnRnaE14VGNtemdSQWdNQkFBR2pnZ0ZyTUlJQlp6QWZCZ05WSFNNRUdEQVdnQlJzaXBTaWQ3R0FjaDJCZWhhcQo4dHpPWnU1RndEQWRCZ05WSFE0RUZnUVVNUG5OVkhPUUc0THljbzZON2xaR29rUXB2L293RGdZRFZSMFBBUUgvCkJBUURBZ0dHTUV3R0ExVWRJQVJGTUVNd0N3WUpZSVpJQVdVQ0FRc2tNQXNHQ1dDR1NBRmxBZ0VMSnpBTEJnbGcKaGtnQlpRSUJDeW93REFZS1lJWklBV1VEQWdFRERUQU1CZ3BnaGtnQlpRTUNBUU1STUJJR0ExVWRFd0VCL3dRSQpNQVlCQWY4Q0FRQXdEQVlEVlIwa0JBVXdBNEFCQURBM0JnTlZIUjhFTURBdU1DeWdLcUFvaGlab2RIUndPaTh2ClkzSnNMbVJwYzJFdWJXbHNMMk55YkM5RVQwUlNUMDlVUTBFekxtTnliREJzQmdnckJnRUZCUWNCQVFSZ01GNHcKT2dZSUt3WUJCUVVITUFLR0xtaDBkSEE2THk5amNtd3VaR2x6WVM1dGFXd3ZhWE56ZFdWa2RHOHZSRTlFVWs5UApWRU5CTTE5SlZDNXdOMk13SUFZSUt3WUJCUVVITUFHR0ZHaDBkSEE2THk5dlkzTndMbVJwYzJFdWJXbHNNQTBHCkNTcUdTSWIzRFFFQkN3VUFBNElCQVFDbkZhVkRVdU5wYlQ0WWF6ZllMNHFLYy9lMFpxZDF3TTEwdXFvK2F5anoKelA1SFhMTDJmckF1ZGd1UlZ4RkRDMVd6akIxNnRjMUdPRFVXWTRPT3hQQ3lVTktVSlRVM0c4cWNYTWFiakV2Qwp5OXdMdS81RlR2RTBpdW1wdmRwU0dKYjJ2L3BCYytUb2ZlMTdTZ0NUcE9XK01FVFpNNWZpVjZlOFZyWWFaYWxnCllYckhnK0R2ZEJwR1N0ZWNjTEZMT1JoWm9xMFpwSGg3UW9ITlZPaTlzeExoRXVoUlRTR2ViUmhUa1lOOTlQekMKQmRENmxqUTB1U2hxQjNyOHVYMXBWcEJza2Rvdm0ySldTWDQwL1FhaEZWRE13SlBJbWxKN2xYUk52UnJrcUxISApQYVRKNFI1c3BCSlVMbVVFYnFWZkZYRzVwL0k5dk5WRjdZWkNFNW56ZWdUZgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpzdWJqZWN0PS9DPVVTL089VS5TLiBHb3Zlcm5tZW50L09VPURvRC9PVT1QS0kvQ049RE9EIElEIENBLTQzCmlzc3Vlcj0vQz1VUy9PPVUuUy4gR292ZXJubWVudC9PVT1Eb0QvT1U9UEtJL0NOPURvRCBSb290IENBIDMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVuVENDQTRXZ0F3SUJBZ0lCR2pBTkJna3Foa2lHOXcwQkFRc0ZBREJiTVFzd0NRWURWUVFHRXdKVlV6RVkKTUJZR0ExVUVDaE1QVlM1VExpQkhiM1psY201dFpXNTBNUXd3Q2dZRFZRUUxFd05FYjBReEREQUtCZ05WQkFzVApBMUJMU1RFV01CUUdBMVVFQXhNTlJHOUVJRkp2YjNRZ1EwRWdNekFlRncweE5URXhNRGt4TmpFMk1ERmFGdzB5Ck1URXhNRGt4TmpFMk1ERmFNRm94Q3pBSkJnTlZCQVlUQWxWVE1SZ3dGZ1lEVlFRS0V3OVZMbE11SUVkdmRtVnkKYm0xbGJuUXhEREFLQmdOVkJBc1RBMFJ2UkRFTU1Bb0dBMVVFQ3hNRFVFdEpNUlV3RXdZRFZRUURFd3hFVDBRZwpTVVFnUTBFdE5ETXdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDaWI1V0tnRWt3CnlWK0hZSVJlQ1BSckZMb0JvdWUvdmEzT0RibGw4ZFpJVEY1RGtqL1Fwbi9hRTNjQ1ZYa2QxT3kzOGsrN01GR28KSTkzeENLa3hxK2dka2VMR1hFWjh0dXdwdXFlVkhXN3JqZ2QrMkRnRHVOV3NYa044VXFmSnZhTWNjTFNqTGZUSQpNUzQyMHgzc010RTVhT0MrWmliNkVpN1lsVDVHVWF0dzMzQktTVFpJc1hxV2E5dGFnNmRha3R2MUpvblFPczlXCnorekN3WjgwNkFtSmh5Z056djVzY3YwK1d0Ym5zOTFVend5VEJTcFlpOEdvMDNZWFUxem5UL2hjaVFDNnVYUlkKeFVXYkJSa3VKeWM0QXNHYjJtd2ZjZkc3VHYzTG9PMXN2MVZVVjBGc3dXR1A5ZEZSWDNEcWpJenM1eWxrNThvbwpDWFRDcndPWUlYR1BBZ01CQUFHamdnRnJNSUlCWnpBZkJnTlZIU01FR0RBV2dCUnNpcFNpZDdHQWNoMkJlaGFxCjh0ek9adTVGd0RBZEJnTlZIUTRFRmdRVU42bVNZMXhjeEoyN0lVaFRLS3JVWkZCbW1rVXdEZ1lEVlIwUEFRSC8KQkFRREFnR0dNRXdHQTFVZElBUkZNRU13Q3dZSllJWklBV1VDQVFza01Bc0dDV0NHU0FGbEFnRUxKekFMQmdsZwpoa2dCWlFJQkN5b3dEQVlLWUlaSUFXVURBZ0VERFRBTUJncGdoa2dCWlFNQ0FRTVJNQklHQTFVZEV3RUIvd1FJCk1BWUJBZjhDQVFBd0RBWURWUjBrQkFVd0E0QUJBREEzQmdOVkhSOEVNREF1TUN5Z0txQW9oaVpvZEhSd09pOHYKWTNKc0xtUnBjMkV1Yldsc0wyTnliQzlFVDBSU1QwOVVRMEV6TG1OeWJEQnNCZ2dyQmdFRkJRY0JBUVJnTUY0dwpPZ1lJS3dZQkJRVUhNQUtHTG1oMGRIQTZMeTlqY213dVpHbHpZUzV0YVd3dmFYTnpkV1ZrZEc4dlJFOUVVazlQClZFTkJNMTlKVkM1d04yTXdJQVlJS3dZQkJRVUhNQUdHRkdoMGRIQTZMeTl2WTNOd0xtUnBjMkV1Yldsc01BMEcKQ1NxR1NJYjNEUUVCQ3dVQUE0SUJBUUJxVXJ6ZGVxbkMyb2hvR1VFeGt4YXlQZStoM1RLdW5tWVVCZ0ZIT0x0VAp3ODlEaUdBeXB5d1VIZ2pTT3FiMURRRDdaMkpvaGxVMnJSUm4wYWpJQWlpNUR0UGdHTjRtQjlaNUhzbWRmWjhMCitDTXIvSnc3b1llYVJMbnlXb1JXNmN2R2lNM29wQmV3Tm8xMTkyZHF2N0pZSGFBR0lWS1NkTGNFU0pOd3AzNDcKbkRENU1hdVhhOC8yYTIwbHNPT3JjVThQZ3BCSGh5UlBEUW9CYXhqalNGdEgrYUE3S3d2RmFxc1VwdmdpVHFOcAo1ajQxSzBheVYwcmRkL0szelJLY0Eyd2VNT05xRFhhZ2N2RFNDTU91M1M2alMvTTdvYzNTdjRrS2s4VmpoY29tCmhDdnc2RUh5TFNpVU1xTnpsTzcxcTVxM3FNajlRT0Q2VDRQSzYvVXhSRDdECi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCnN1YmplY3Q9L0M9VVMvTz1VLlMuIEdvdmVybm1lbnQvT1U9RG9EL09VPVBLSS9DTj1ET0QgSUQgQ0EtNDIKaXNzdWVyPS9DPVVTL089VS5TLiBHb3Zlcm5tZW50L09VPURvRC9PVT1QS0kvQ049RG9EIFJvb3QgQ0EgMwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRW5UQ0NBNFdnQXdJQkFnSUJHVEFOQmdrcWhraUc5dzBCQVFzRkFEQmJNUXN3Q1FZRFZRUUdFd0pWVXpFWQpNQllHQTFVRUNoTVBWUzVUTGlCSGIzWmxjbTV0Wlc1ME1Rd3dDZ1lEVlFRTEV3TkViMFF4RERBS0JnTlZCQXNUCkExQkxTVEVXTUJRR0ExVUVBeE1OUkc5RUlGSnZiM1FnUTBFZ016QWVGdzB4TlRFeE1Ea3hOakUxTURKYUZ3MHkKTVRFeE1Ea3hOakUxTURKYU1Gb3hDekFKQmdOVkJBWVRBbFZUTVJnd0ZnWURWUVFLRXc5VkxsTXVJRWR2ZG1WeQpibTFsYm5ReEREQUtCZ05WQkFzVEEwUnZSREVNTUFvR0ExVUVDeE1EVUV0Sk1SVXdFd1lEVlFRREV3eEVUMFFnClNVUWdRMEV0TkRJd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUN0NC8rOWJlRGIKM2c5a0dnMk1sem5VWTkzQ090aURMZXRNQ2tzNGFRNS9NWWFTdGk2ZW9EdzVMN0VIbGtOZm5yTzVYWEtiUUhaNwpIcWlwd3lFNnVaMzZXUEV2VTZ1ZmluNTdGcisrYUlZTmszeExBSDRtZTZqVDhxeXJ6bjlGVUJYaDJVc25xQ01vCjVqSGwrNkZKYnNUcTIvc1NwSVpsOFNNVVM0dzZ3TmkvZ1JTcmhkVmZtSmliaFFnRWo2UWJ2VXI4YUFTemx5UzkKK3p2TVJUWnE3SkJERVBsYmRzZkUzbWJHV3ZPMCtQRDhITXNOcmo1cktMN3dkb0F6UURCL1lpc0YvOWZmSnc4TApjRlBzVWlzVWRac0ZUazlMN3FNQ2NnU2ZDdEdmdzVBRXc0bGNtSUFpSFJYMEFwZC9pSk00a0FEdUhVRlBZek0yCkVONG5nakR4SzZqVkFnTUJBQUdqZ2dGck1JSUJaekFmQmdOVkhTTUVHREFXZ0JSc2lwU2lkN0dBY2gyQmVoYXEKOHR6T1p1NUZ3REFkQmdOVkhRNEVGZ1FVTXFBQXlsbUx4TTU4ZTl2ZUdTb1Fpb1pCMGVNd0RnWURWUjBQQVFILwpCQVFEQWdHR01Fd0dBMVVkSUFSRk1FTXdDd1lKWUlaSUFXVUNBUXNrTUFzR0NXQ0dTQUZsQWdFTEp6QUxCZ2xnCmhrZ0JaUUlCQ3lvd0RBWUtZSVpJQVdVREFnRUREVEFNQmdwZ2hrZ0JaUU1DQVFNUk1CSUdBMVVkRXdFQi93UUkKTUFZQkFmOENBUUF3REFZRFZSMGtCQVV3QTRBQkFEQTNCZ05WSFI4RU1EQXVNQ3lnS3FBb2hpWm9kSFJ3T2k4dgpZM0pzTG1ScGMyRXViV2xzTDJOeWJDOUVUMFJTVDA5VVEwRXpMbU55YkRCc0JnZ3JCZ0VGQlFjQkFRUmdNRjR3Ck9nWUlLd1lCQlFVSE1BS0dMbWgwZEhBNkx5OWpjbXd1WkdsellTNXRhV3d2YVhOemRXVmtkRzh2UkU5RVVrOVAKVkVOQk0xOUpWQzV3TjJNd0lBWUlLd1lCQlFVSE1BR0dGR2gwZEhBNkx5OXZZM053TG1ScGMyRXViV2xzTUEwRwpDU3FHU0liM0RRRUJDd1VBQTRJQkFRQTVoSWpvUGw2amUxMTc2d0RtN2k0Rk5HZWh1S2tyTTZLT3FFWkx5emUyCmJrU1JaWFY4d0l2ZTZDa014TDg5UExFYTlCUFhGL1BwRjVXbjJ0bzRZWmdabXgwaiszTTlrSXVJekR4S0hBSEIKdGZMb09YSGlUL2c5VTlTY2wwOVJpV1ZmaHVsMTNSNytRNkNRZEtPMXl1NjliTnR2TDFVeHN6MkxhR1AzcEZhUwpRa2xNK05zNTZOM2EyWUozcU55akduTW9rc0JERlNraXRZSkpyV3RlSFN2MWlCdjlGVmdlL2QzU0U5K1BxL1dEClEyMnlLLzBwaDNnVEV3NjFlOUVZWi9UQWVOYjAxSnU1NmJObzVsVkhBejJVYXdyd0doUmtsSlFoZi9pOUpSZGEKZ3lrWWc0WmtjemwrWlhOKzBiZkpEWitrcGlzMHdsY1ByVnpOS05wQVZuemYKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKc3ViamVjdD0vQz1VUy9PPVUuUy4gR292ZXJubWVudC9PVT1Eb0QvT1U9UEtJL0NOPURPRCBJRCBDQS00MQppc3N1ZXI9L0M9VVMvTz1VLlMuIEdvdmVybm1lbnQvT1U9RG9EL09VPVBLSS9DTj1Eb0QgUm9vdCBDQSAzCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFblRDQ0E0V2dBd0lCQWdJQkdEQU5CZ2txaGtpRzl3MEJBUXNGQURCYk1Rc3dDUVlEVlFRR0V3SlZVekVZCk1CWUdBMVVFQ2hNUFZTNVRMaUJIYjNabGNtNXRaVzUwTVF3d0NnWURWUVFMRXdORWIwUXhEREFLQmdOVkJBc1QKQTFCTFNURVdNQlFHQTFVRUF4TU5SRzlFSUZKdmIzUWdRMEVnTXpBZUZ3MHhOVEV4TURreE5qRXpOVFphRncweQpNVEV4TURreE5qRXpOVFphTUZveEN6QUpCZ05WQkFZVEFsVlRNUmd3RmdZRFZRUUtFdzlWTGxNdUlFZHZkbVZ5CmJtMWxiblF4RERBS0JnTlZCQXNUQTBSdlJERU1NQW9HQTFVRUN4TURVRXRKTVJVd0V3WURWUVFERXd4RVQwUWcKU1VRZ1EwRXROREV3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQzN5WFNJMkNhKwpMSkhnem1objJOSDlYazAyK1FvRVB0TzRLM29IYStYS2VQMk1kazRvb0Z5M1NMdml6Zjg0ekRXenFWUG9vZkVkCnBGMU5wRFQ4OXJtNUpPamFJNVBCbTljdDRyVjBacUgzNERsQVJNVmp0aFc2eVNVcDJZRERLNWRHa1pUQUNxa24KRTJBYUw3NzdSeVBMUkVTRHAxcC9KMnlJblVNdkNjM3dzSm1xdGVTVzVkVURwbDcrUzlTVjJEK3VyZjd6QjVvQgowNkQ5aTRZa25TaDNubnRodHFIU0N2TkYwUXRweW5UeWR5Y0JyWloyQ3Y0bEYvaVZQcGk4OVdEVEFqd1djM3U3CkhWeEhxQ2k5WjZ6QjdlSUlYdElSY0tCSnJxTDdvRXh2QUd1MEMvMUQ2L2RRZk9xSGE0Y1BFZ2xsWGZ5MzhaeGYKblVyRkNpaDRUakQxQWdNQkFBR2pnZ0ZyTUlJQlp6QWZCZ05WSFNNRUdEQVdnQlJzaXBTaWQ3R0FjaDJCZWhhcQo4dHpPWnU1RndEQWRCZ05WSFE0RUZnUVVXNUhHUkRieUtQTDR6N0xDeU1walNXR2JJQW93RGdZRFZSMFBBUUgvCkJBUURBZ0dHTUV3R0ExVWRJQVJGTUVNd0N3WUpZSVpJQVdVQ0FRc2tNQXNHQ1dDR1NBRmxBZ0VMSnpBTEJnbGcKaGtnQlpRSUJDeW93REFZS1lJWklBV1VEQWdFRERUQU1CZ3BnaGtnQlpRTUNBUU1STUJJR0ExVWRFd0VCL3dRSQpNQVlCQWY4Q0FRQXdEQVlEVlIwa0JBVXdBNEFCQURBM0JnTlZIUjhFTURBdU1DeWdLcUFvaGlab2RIUndPaTh2ClkzSnNMbVJwYzJFdWJXbHNMMk55YkM5RVQwUlNUMDlVUTBFekxtTnliREJzQmdnckJnRUZCUWNCQVFSZ01GNHcKT2dZSUt3WUJCUVVITUFLR0xtaDBkSEE2THk5amNtd3VaR2x6WVM1dGFXd3ZhWE56ZFdWa2RHOHZSRTlFVWs5UApWRU5CTTE5SlZDNXdOMk13SUFZSUt3WUJCUVVITUFHR0ZHaDBkSEE2THk5dlkzTndMbVJwYzJFdWJXbHNNQTBHCkNTcUdTSWIzRFFFQkN3VUFBNElCQVFDaDRyUmlYOThJMXNnd0ovd0ZhTER0TTNHbEtUdWxEdTdWR3BHbGxsbGgKYlVwWmlhSFE4cE1WMmdvRmJvQU9QWHhNbmwyTjJVTS9VNC85UzJ1VzRtb3NRbzJnYmNOVDdyYmkvUWhsRWs0Wgp1NnRaZWszU3ZoRklxK2ZuL1hoTXFpTXdJT1VOcXJvaDVCbnZQR0xRY01xZm5MZWJUSm1rY0c0STZPbVhQNmVuCmpoL0pjZE5ueE1oWjFaVWp1NjErU3c4ZzE0ZktWNmtBVWRyR2hRUFpBY2VaeUx2VWFqRFJYTGR4Rlg3TFdpcDAKSUlGUEQ0ZU0ycEx4OTRNUHBid0ZvNC9sK3JPOExLNUJMeEc0WVY3aElpeWF1d3RjUkVvTndqUnlFMFRKOHFUZgptelhVek03WXlqQlF5dHllS0hhRXlEYlVMQWUwdmZVYjlwMWpveG9HU091ZQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpzdWJqZWN0PS9DPVVTL089VS5TLiBHb3Zlcm5tZW50L09VPURvRC9PVT1QS0kvQ049RE9EIEVNQUlMIENBLTQ0Cmlzc3Vlcj0vQz1VUy9PPVUuUy4gR292ZXJubWVudC9PVT1Eb0QvT1U9UEtJL0NOPURvRCBSb290IENBIDMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVvRENDQTRpZ0F3SUJBZ0lCRnpBTkJna3Foa2lHOXcwQkFRc0ZBREJiTVFzd0NRWURWUVFHRXdKVlV6RVkKTUJZR0ExVUVDaE1QVlM1VExpQkhiM1psY201dFpXNTBNUXd3Q2dZRFZRUUxFd05FYjBReEREQUtCZ05WQkFzVApBMUJMU1RFV01CUUdBMVVFQXhNTlJHOUVJRkp2YjNRZ1EwRWdNekFlRncweE5URXhNRGt4TmpFeU1UWmFGdzB5Ck1URXhNRGt4TmpFeU1UWmFNRjB4Q3pBSkJnTlZCQVlUQWxWVE1SZ3dGZ1lEVlFRS0V3OVZMbE11SUVkdmRtVnkKYm0xbGJuUXhEREFLQmdOVkJBc1RBMFJ2UkRFTU1Bb0dBMVVFQ3hNRFVFdEpNUmd3RmdZRFZRUURFdzlFVDBRZwpSVTFCU1V3Z1EwRXRORFF3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQzV3ampjClJQdHo0czREeldKVVJWcEFsME1oeHpSVDFTSHYzU2p1L0xrVmFhZ3JFZk54RVpibmtUSEtjaUZoU2NiQ0ljbzQKNDU4K0x0Ulhtd01aaVhTUFNWcXVFdWhZanBtUWdncVZVczhlb3pmVjR1TW5JODhGQkVHVWh3QTh6Zmd3Uk1MRgpSUW5KNFNDQjNvR2JaSGg0c1YxTXV0cHJDRHdkNnFyRzBrOGI4L0dGOWgxdnlQWmJOTkJIT0RsZmREcmFCRDUvCmJkWDVsUTRMNko3dVQ1dll0VFFRSVJNK2ZrMU5sbXhyMm9rS0g0d2N3SzVGUTlJL2tZQXM3UW9GOU15OG5BT08Kc0FBWVBCeHErVjVVV3dScXFkU1N4WDcyWUVIQXlpdHhtd25nM1ZNSHU1cE5Dbm1Fc1lTVkg3QzdGZlFhWGsvZQpRNCtvMzZzbEcweC9qeXM3QWdNQkFBR2pnZ0ZyTUlJQlp6QWZCZ05WSFNNRUdEQVdnQlJzaXBTaWQ3R0FjaDJCCmVoYXE4dHpPWnU1RndEQWRCZ05WSFE0RUZnUVVvSXRuMGVGZ1pIV25PYXpKdURXTm1KSjBjNlV3RGdZRFZSMFAKQVFIL0JBUURBZ0dHTUV3R0ExVWRJQVJGTUVNd0N3WUpZSVpJQVdVQ0FRc2tNQXNHQ1dDR1NBRmxBZ0VMSnpBTApCZ2xnaGtnQlpRSUJDeW93REFZS1lJWklBV1VEQWdFRERUQU1CZ3BnaGtnQlpRTUNBUU1STUJJR0ExVWRFd0VCCi93UUlNQVlCQWY4Q0FRQXdEQVlEVlIwa0JBVXdBNEFCQURBM0JnTlZIUjhFTURBdU1DeWdLcUFvaGlab2RIUncKT2k4dlkzSnNMbVJwYzJFdWJXbHNMMk55YkM5RVQwUlNUMDlVUTBFekxtTnliREJzQmdnckJnRUZCUWNCQVFSZwpNRjR3T2dZSUt3WUJCUVVITUFLR0xtaDBkSEE2THk5amNtd3VaR2x6WVM1dGFXd3ZhWE56ZFdWa2RHOHZSRTlFClVrOVBWRU5CTTE5SlZDNXdOMk13SUFZSUt3WUJCUVVITUFHR0ZHaDBkSEE2THk5dlkzTndMbVJwYzJFdWJXbHMKTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElCQVFDU1k5ZFRMb3pQSFZUY3JTQkRTUFJpQXRzNmttS0ZpcDFUMnFQKwp6RHFFVFVzN0ZwUy9Fa0xrYThuMHFqbVlNdE5XRDl6c1dLaThGYlplWjFzZTV0U0Z4TDl3YXVwZmliTUZzSlQ0Ck1udm1rM2loaFVmVFpZcEVSQm1nZVg3Y2Q4MCtXTzlTQjFQK2RDTHcvN01qVGROOGowYU9jamgrSTZLTFdMakEKTGZWTmhwWjcvOExnc09sM3NIZ1o3NTM3WXNBNlRpK3llekdEMGpNN25LcGZ5Zzc4bmJLMmltV3V0aXVFeUh1aQpPZHdjSk9RcHNLdW95TmE1eXp5dVhLNXlnRy9QTUV6SnI2cmZKeWtkNlVNcEFEZ2FDWm1TV3VlSnF6TXhmckkyClpvWGxaem1YMHhHMkN1aE9FaGNxd0xMdktncXUrZFVLd3pFNFZ4UVlndFJ0enpKZgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpzdWJqZWN0PS9DPVVTL089VS5TLiBHb3Zlcm5tZW50L09VPURvRC9PVT1QS0kvQ049RE9EIEVNQUlMIENBLTQzCmlzc3Vlcj0vQz1VUy9PPVUuUy4gR292ZXJubWVudC9PVT1Eb0QvT1U9UEtJL0NOPURvRCBSb290IENBIDMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVvRENDQTRpZ0F3SUJBZ0lCRmpBTkJna3Foa2lHOXcwQkFRc0ZBREJiTVFzd0NRWURWUVFHRXdKVlV6RVkKTUJZR0ExVUVDaE1QVlM1VExpQkhiM1psY201dFpXNTBNUXd3Q2dZRFZRUUxFd05FYjBReEREQUtCZ05WQkFzVApBMUJMU1RFV01CUUdBMVVFQXhNTlJHOUVJRkp2YjNRZ1EwRWdNekFlRncweE5URXhNRGt4TmpFeE1ESmFGdzB5Ck1URXhNRGt4TmpFeE1ESmFNRjB4Q3pBSkJnTlZCQVlUQWxWVE1SZ3dGZ1lEVlFRS0V3OVZMbE11SUVkdmRtVnkKYm0xbGJuUXhEREFLQmdOVkJBc1RBMFJ2UkRFTU1Bb0dBMVVFQ3hNRFVFdEpNUmd3RmdZRFZRUURFdzlFVDBRZwpSVTFCU1V3Z1EwRXRORE13Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ3IzaW5SClloQWV3MWtqR2ViSXB0NWVSNUJTei94cURoejZLdlBOaXJpM2diUmFyN2xBdTdYVkdBbitMWUIrTnl1SnQzV3UKNnRTbVh2dnF4TFBLWHI0N3RGQWtqcFgyTXkxSUdNK1k1OWlNc3V2SytUMXhlRnZiWkZ0bkM4RWdudEV3UjBVbwpVV3RVWkFkYjVJZEtHcXVvbHQ4OVJUdDZXMW1nTWhidVlFZXd5ZFNrbnh4VUkreU52TVE2TkdlYVJ6dTlJUkltCkFtdFNIVXBrRTV2eHRvOGxteFJ0RjA5TGNtTFNpRWx4N0luc0wzb2xBUVNqencyQVdiSEVNcjRXRFZUdWdKWG4KVkxmbUM4L2Z1VEVOdm1MUkRHblRBK2xpMGZqT1J6TXFtR0lvazVlb1UzWDI0UXYzSWk3L1h2R0Z5TkdBS1B5NApvS0FYRUduNWVadGFyNGt2QWdNQkFBR2pnZ0ZyTUlJQlp6QWZCZ05WSFNNRUdEQVdnQlJzaXBTaWQ3R0FjaDJCCmVoYXE4dHpPWnU1RndEQWRCZ05WSFE0RUZnUVU5eC94UmpoVnY3eHhpN0lHTzQ0ckdMSmV1N1F3RGdZRFZSMFAKQVFIL0JBUURBZ0dHTUV3R0ExVWRJQVJGTUVNd0N3WUpZSVpJQVdVQ0FRc2tNQXNHQ1dDR1NBRmxBZ0VMSnpBTApCZ2xnaGtnQlpRSUJDeW93REFZS1lJWklBV1VEQWdFRERUQU1CZ3BnaGtnQlpRTUNBUU1STUJJR0ExVWRFd0VCCi93UUlNQVlCQWY4Q0FRQXdEQVlEVlIwa0JBVXdBNEFCQURBM0JnTlZIUjhFTURBdU1DeWdLcUFvaGlab2RIUncKT2k4dlkzSnNMbVJwYzJFdWJXbHNMMk55YkM5RVQwUlNUMDlVUTBFekxtTnliREJzQmdnckJnRUZCUWNCQVFSZwpNRjR3T2dZSUt3WUJCUVVITUFLR0xtaDBkSEE2THk5amNtd3VaR2x6WVM1dGFXd3ZhWE56ZFdWa2RHOHZSRTlFClVrOVBWRU5CTTE5SlZDNXdOMk13SUFZSUt3WUJCUVVITUFHR0ZHaDBkSEE2THk5dlkzTndMbVJwYzJFdWJXbHMKTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElCQVFCYjBPeEpRUG5nWE9UU3pxcXhSV0JZamlLKzR2RWYvbndqN2NqMApPVDA3RklyUnNScHlad3BFTmZmQ3RNVTV5djJHSHFsUzhKS2lxdzlvR05NdHFvVzRCdFhFRTBPbzdXMGRuUUdrCndMdjU1ZVJOMUZESTBKZ3BUdTR6aXhxN05NcFl4N1hWQURpNiszRTExZWZtT2VzRjIwcG83K0dnMk1Hc0pUTlIKRU1YaDd5SGNEcXM2bk1rUHRjbDF1NHFpdmZvaGRSY0tzSXZ3QzFaNGNWK2JqWjlBNUtPQlplV3NhODZGek5CbApqS1RkTHhlYlV6MDkxYUE2dGpVWi9rNTc2T1BLaVIxazhhd2xEc3o1ai9TOXhLMUh0NUtWMng4RWR2Z3JlaXc0CkR0OERpc3ovZlgwVDMzMFAybjZHYlBPY2dML3dpa3RSakNxMkJubmxtRExGd3hKZQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpzdWJqZWN0PS9DPVVTL089VS5TLiBHb3Zlcm5tZW50L09VPURvRC9PVT1QS0kvQ049RE9EIEVNQUlMIENBLTQyCmlzc3Vlcj0vQz1VUy9PPVUuUy4gR292ZXJubWVudC9PVT1Eb0QvT1U9UEtJL0NOPURvRCBSb290IENBIDMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVvRENDQTRpZ0F3SUJBZ0lCRlRBTkJna3Foa2lHOXcwQkFRc0ZBREJiTVFzd0NRWURWUVFHRXdKVlV6RVkKTUJZR0ExVUVDaE1QVlM1VExpQkhiM1psY201dFpXNTBNUXd3Q2dZRFZRUUxFd05FYjBReEREQUtCZ05WQkFzVApBMUJMU1RFV01CUUdBMVVFQXhNTlJHOUVJRkp2YjNRZ1EwRWdNekFlRncweE5URXhNRGt4TmpBNU5ESmFGdzB5Ck1URXhNRGt4TmpBNU5ESmFNRjB4Q3pBSkJnTlZCQVlUQWxWVE1SZ3dGZ1lEVlFRS0V3OVZMbE11SUVkdmRtVnkKYm0xbGJuUXhEREFLQmdOVkJBc1RBMFJ2UkRFTU1Bb0dBMVVFQ3hNRFVFdEpNUmd3RmdZRFZRUURFdzlFVDBRZwpSVTFCU1V3Z1EwRXROREl3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ21uU1gxCmoyNVgwbHJseGw3RlRpNjVEeHpTYVhsVVF3UFBJTEh4UWg0cFdNYkE3UmZmNHIrZHVFVG1hM21yUG1hZWo0NUgKS1lQRisxakZpVitqTGlQRlh6UUtjc3JySW1yYXRYY0FCRnVzMGxBOHhCdHZoalpURS92bUdTWFpwQlBGQWt5Ygpqb2YzT0pCenpXd28ra1BySy9qZTBLYnJscTRqZWtOY3BYRGVSNFFwMkZYdHdNZ2VTOVJuTUdVV2JPN3N2L2lKCmNlVWtYRDlXRzZJWTJHVzNFTXN4NU1KdHhlNk03QUNzTWIwSjNlTisyQkF4QVpaR2pNUmpQYTJDKzJrYzkyMmoKQnNyNG1mUTloRWJXRXU1d1dMd2lKTEJIKzlOYVRCeGxxY0dTOHl5WDB4UWt0dkxIbHJtbklVcFFrc0gzeC82RgpVbnpYUTFDS2hhRU5pNGx2QWdNQkFBR2pnZ0ZyTUlJQlp6QWZCZ05WSFNNRUdEQVdnQlJzaXBTaWQ3R0FjaDJCCmVoYXE4dHpPWnU1RndEQWRCZ05WSFE0RUZnUVVid1drWGFMRXI1VmJRWkhmQzNnTEZ1OGNDVzR3RGdZRFZSMFAKQVFIL0JBUURBZ0dHTUV3R0ExVWRJQVJGTUVNd0N3WUpZSVpJQVdVQ0FRc2tNQXNHQ1dDR1NBRmxBZ0VMSnpBTApCZ2xnaGtnQlpRSUJDeW93REFZS1lJWklBV1VEQWdFRERUQU1CZ3BnaGtnQlpRTUNBUU1STUJJR0ExVWRFd0VCCi93UUlNQVlCQWY4Q0FRQXdEQVlEVlIwa0JBVXdBNEFCQURBM0JnTlZIUjhFTURBdU1DeWdLcUFvaGlab2RIUncKT2k4dlkzSnNMbVJwYzJFdWJXbHNMMk55YkM5RVQwUlNUMDlVUTBFekxtTnliREJzQmdnckJnRUZCUWNCQVFSZwpNRjR3T2dZSUt3WUJCUVVITUFLR0xtaDBkSEE2THk5amNtd3VaR2x6WVM1dGFXd3ZhWE56ZFdWa2RHOHZSRTlFClVrOVBWRU5CTTE5SlZDNXdOMk13SUFZSUt3WUJCUVVITUFHR0ZHaDBkSEE2THk5dlkzTndMbVJwYzJFdWJXbHMKTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElCQVFCKzB2UUdBcng4YkIza0xrUXRsU3EvSlFkellHOVp4VHUxVytudgplYUJVelh5aFV5QlAxT0VBMFp2eWlBdDdrbTk1eTMvSDY1bVpxdEJSUXV6K2pZZjBIeHhkMGZGdzJjWHJVOG9OCnBmOW9mOFNJaXQzZzdIL2xQdkN6UXJpeGpCUEp5SVppdUYvMXRHcVM3T21RUC80alUzK1I4dXZWaFVpM0FYMkQKWEFtNFZUY0JwQ3NHM296T0NwSnlrQVFaSnhhT2dxU0pIRkxOZFBCeXIxZk12cHNGT2tTV3dsR3ptV09iaDRYdwp1ZDArbmFQNHBicUtZanVlL01lQUdxZ214TUpUbjRoRlhTNWJITVZpc2NKcG5adEp6MUo2WHNBOGFTaVpPL3VsCmlPL3ZReDNDemRFV0NNQjFaQ0dQMHhkemZEaXBLRU1EUFJwQTN1Y1BqM2RnYjNNcgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpzdWJqZWN0PS9DPVVTL089VS5TLiBHb3Zlcm5tZW50L09VPURvRC9PVT1QS0kvQ049RE9EIEVNQUlMIENBLTQxCmlzc3Vlcj0vQz1VUy9PPVUuUy4gR292ZXJubWVudC9PVT1Eb0QvT1U9UEtJL0NOPURvRCBSb290IENBIDMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVvRENDQTRpZ0F3SUJBZ0lCRkRBTkJna3Foa2lHOXcwQkFRc0ZBREJiTVFzd0NRWURWUVFHRXdKVlV6RVkKTUJZR0ExVUVDaE1QVlM1VExpQkhiM1psY201dFpXNTBNUXd3Q2dZRFZRUUxFd05FYjBReEREQUtCZ05WQkFzVApBMUJMU1RFV01CUUdBMVVFQXhNTlJHOUVJRkp2YjNRZ1EwRWdNekFlRncweE5URXhNRGt4TmpBMU1qZGFGdzB5Ck1URXhNRGt4TmpBMU1qZGFNRjB4Q3pBSkJnTlZCQVlUQWxWVE1SZ3dGZ1lEVlFRS0V3OVZMbE11SUVkdmRtVnkKYm0xbGJuUXhEREFLQmdOVkJBc1RBMFJ2UkRFTU1Bb0dBMVVFQ3hNRFVFdEpNUmd3RmdZRFZRUURFdzlFVDBRZwpSVTFCU1V3Z1EwRXROREV3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ1V1eWNSCkRDTXc0aVBHSWJlcTFZdXcvOVMrdGtRblRkdERFMVJTcC9BaFZVK3NJSUxJSDBBeTVHaUpZdVoxTDROZFVHbkoKcnNBZVJKSUZVWmFlL2VNZnpBUnRVdG5IeVB0ZVhKQjFEWWg4ZUs1YjVFN1JGVXo1bGFlNEFkaHVVdFBTUkRtMApZZEg4blhKOEZnbTB3K3BNQ2x0WkpMSUdoZmdwaFhiY1psZXlGSnJSay9rMzBQSWZOZFpTb3hJMGRuOHRKUnVpCjhINTBjWHBEYkNkNUtzaStqRXNkWVIzTWN6YTZWVFpSbXZlcHdBaUY5ZnBFcWx5VnFsdHEyT1dMZzhreTYyOFYKT0RlRFoxODhIU3g4cmdwWmZPeEhRSnBNbkl5T0tISDM1V2VYRU1HQzdzcHZyUlArZC9CWnNJUkdtVngyNUZUaQpqYkNGZlRRZUQ5MWNiNmlmQWdNQkFBR2pnZ0ZyTUlJQlp6QWZCZ05WSFNNRUdEQVdnQlJzaXBTaWQ3R0FjaDJCCmVoYXE4dHpPWnU1RndEQWRCZ05WSFE0RUZnUVVPU21vQ0dUaWo0T3FnV0ZIRVpFeitGbzNwdVF3RGdZRFZSMFAKQVFIL0JBUURBZ0dHTUV3R0ExVWRJQVJGTUVNd0N3WUpZSVpJQVdVQ0FRc2tNQXNHQ1dDR1NBRmxBZ0VMSnpBTApCZ2xnaGtnQlpRSUJDeW93REFZS1lJWklBV1VEQWdFRERUQU1CZ3BnaGtnQlpRTUNBUU1STUJJR0ExVWRFd0VCCi93UUlNQVlCQWY4Q0FRQXdEQVlEVlIwa0JBVXdBNEFCQURBM0JnTlZIUjhFTURBdU1DeWdLcUFvaGlab2RIUncKT2k4dlkzSnNMbVJwYzJFdWJXbHNMMk55YkM5RVQwUlNUMDlVUTBFekxtTnliREJzQmdnckJnRUZCUWNCQVFSZwpNRjR3T2dZSUt3WUJCUVVITUFLR0xtaDBkSEE2THk5amNtd3VaR2x6WVM1dGFXd3ZhWE56ZFdWa2RHOHZSRTlFClVrOVBWRU5CTTE5SlZDNXdOMk13SUFZSUt3WUJCUVVITUFHR0ZHaDBkSEE2THk5dlkzTndMbVJwYzJFdWJXbHMKTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElCQVFBaEV2SFRXeWViejA1T3g5aFcrbmVVTVlJMTY4Nnl6UUEzZXIzVApsbWFwVENueE55TmVHUDBkY0x1RnFIWnU3d2l3Nm4zNjJ5Z0hEQjRlMkdRbS9JRkhzZFBYQkVRaURCdEJPZTI0CkVPeFhNRXA0S3Uwem5PRmdaRVYva25nL1NUNHJzb3liNE1WQ3poQ1IvNWxmemsweldENW9VZ25KNVl3V0lJVE4KekNPMTBmeFFZaUNCRkRHUGNNR0ovYmlCZGNYRnR6dlBtcnpJSERnaXRsbDkxa0k0UnRxNVo4Szc5ODh5cXFzTQpEbS9FYzF0N2FMK0ErUEg5Q1NMTUxOWWZsbEFORHZwUzJxR1Y5dmg0UkdqTzRkOFA4V0Flak5jenJjdVE0R0VBCjFhSW5BMjlzTmRoTEZPS0F0M0JES3ZTanhKTS9iM0ozamtnNkNEem1jY1hvbE4veQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpzdWJqZWN0PS9DPVVTL089VS5TLiBHb3Zlcm5tZW50L09VPURvRC9PVT1QS0kvQ049RE9EIElEIFNXIENBLTM4Cmlzc3Vlcj0vQz1VUy9PPVUuUy4gR292ZXJubWVudC9PVT1Eb0QvT1U9UEtJL0NOPURvRCBSb290IENBIDMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVvRENDQTRpZ0F3SUJBZ0lCRXpBTkJna3Foa2lHOXcwQkFRc0ZBREJiTVFzd0NRWURWUVFHRXdKVlV6RVkKTUJZR0ExVUVDaE1QVlM1VExpQkhiM1psY201dFpXNTBNUXd3Q2dZRFZRUUxFd05FYjBReEREQUtCZ05WQkFzVApBMUJMU1RFV01CUUdBMVVFQXhNTlJHOUVJRkp2YjNRZ1EwRWdNekFlRncweE5UQTVNak14TlRJME5URmFGdzB5Ck1UQTVNak14TlRJME5URmFNRjB4Q3pBSkJnTlZCQVlUQWxWVE1SZ3dGZ1lEVlFRS0V3OVZMbE11SUVkdmRtVnkKYm0xbGJuUXhEREFLQmdOVkJBc1RBMFJ2UkRFTU1Bb0dBMVVFQ3hNRFVFdEpNUmd3RmdZRFZRUURFdzlFVDBRZwpTVVFnVTFjZ1EwRXRNemd3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRRE10dzJNClEyNGVnNm5FN2gvWlhNaU4wR1RIbnlidGNlQWxZbTVObU9XWk56cjEvczIyQXQxYU4zTlNpbHQ1VDJNQXE3SUoKT09QVnF0UTRlOFlqdnduWk1sL3ZoazZaNHJ3QWVQc2hyOUh2bE84Q1hsMjU3UlAzdU44SGdSQlJ5aUJ6SmgwOApROFcrSHJiNzdYTW4wQ3pkUTdoKzAraEpqZHdSalNBZ0hmSEJhZ0FGSWlsWUJVSHRyZXNKTkI3emsvamVkYUl1CnY2eG9Ua0p0dFMrVVNTV0o5MVJxbjFodkFaZmQ0WGJ3ZVNxQ1BORlhYV3Z1ZElJN0RaOUczVml5bUNYcVhKRFoKS1hXK2lFT0Zld1k5SzFCTW5JK05PVi9xT3YzMzVvaXRQWWVScW5JT2lRbVYwSjJBckNZb1dmUXB1dFF1SEQ2WQp5M2R6VEVqNmRGSDlDYnVYQWdNQkFBR2pnZ0ZyTUlJQlp6QWZCZ05WSFNNRUdEQVdnQlJzaXBTaWQ3R0FjaDJCCmVoYXE4dHpPWnU1RndEQWRCZ05WSFE0RUZnUVVqc1c1elB6T2psTzBLczdvRVNyUG15bHNaOG93RGdZRFZSMFAKQVFIL0JBUURBZ0dHTUV3R0ExVWRJQVJGTUVNd0N3WUpZSVpJQVdVQ0FRc2tNQXNHQ1dDR1NBRmxBZ0VMSnpBTApCZ2xnaGtnQlpRSUJDeW93REFZS1lJWklBV1VEQWdFRERUQU1CZ3BnaGtnQlpRTUNBUU1STUJJR0ExVWRFd0VCCi93UUlNQVlCQWY4Q0FRQXdEQVlEVlIwa0JBVXdBNEFCQURBM0JnTlZIUjhFTURBdU1DeWdLcUFvaGlab2RIUncKT2k4dlkzSnNMbVJwYzJFdWJXbHNMMk55YkM5RVQwUlNUMDlVUTBFekxtTnliREJzQmdnckJnRUZCUWNCQVFSZwpNRjR3T2dZSUt3WUJCUVVITUFLR0xtaDBkSEE2THk5amNtd3VaR2x6WVM1dGFXd3ZhWE56ZFdWa2RHOHZSRTlFClVrOVBWRU5CTTE5SlZDNXdOMk13SUFZSUt3WUJCUVVITUFHR0ZHaDBkSEE2THk5dlkzTndMbVJwYzJFdWJXbHMKTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElCQVFDaExhWkd0WkVldnJSaDRoeU1yeXdJZVBKMWg4dDhLNzY2VFRVQgo4QVkyeTUvQm9sRW9IeEtUT2lzN0JSb2xyaVJGc2E0UFZGVVNJWFVzR1F4ckEyaDhwYTB2MmlyckVFMml4WkdOCmg1clNYWGhDK1V0QUxERjhQbFdVdkQvTTFXTE9JVzI3N1lIUTRKTmpNbDVPRWhzclZveEpaM0kzMmJURzhFWnAKRURtQmJWUHNCSU5SZjFrakJkNjl4YjdrazY3RGZVRXM0ZlVqVEhSRE9mbFYzODhiWDI4NzcvL1VhQURQZmpHSwo2ZzlBeFkrK3BmLzRjYW4vRGh4aEo0MCtvS2lETjI5YXB1d21lTnJmQWkrQ3FMOXVGdTZKU3hTVUdPeTRaRExBCnZtQVFIR0k2cittUkJjdThVLzl4dWFZcGtPOGpBb0RObjd5UzRIMFNURW9Eb3JyUgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpzdWJqZWN0PS9DPVVTL089VS5TLiBHb3Zlcm5tZW50L09VPURvRC9PVT1QS0kvQ049RE9EIElEIFNXIENBLTM3Cmlzc3Vlcj0vQz1VUy9PPVUuUy4gR292ZXJubWVudC9PVT1Eb0QvT1U9UEtJL0NOPURvRCBSb290IENBIDMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVvRENDQTRpZ0F3SUJBZ0lCRWpBTkJna3Foa2lHOXcwQkFRc0ZBREJiTVFzd0NRWURWUVFHRXdKVlV6RVkKTUJZR0ExVUVDaE1QVlM1VExpQkhiM1psY201dFpXNTBNUXd3Q2dZRFZRUUxFd05FYjBReEREQUtCZ05WQkFzVApBMUJMU1RFV01CUUdBMVVFQXhNTlJHOUVJRkp2YjNRZ1EwRWdNekFlRncweE5UQTVNak14TlRJek1EVmFGdzB5Ck1UQTVNak14TlRJek1EVmFNRjB4Q3pBSkJnTlZCQVlUQWxWVE1SZ3dGZ1lEVlFRS0V3OVZMbE11SUVkdmRtVnkKYm0xbGJuUXhEREFLQmdOVkJBc1RBMFJ2UkRFTU1Bb0dBMVVFQ3hNRFVFdEpNUmd3RmdZRFZRUURFdzlFVDBRZwpTVVFnVTFjZ1EwRXRNemN3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ3NybktpCnFmV1VZdkJaNXBvTjVHTU82cW90bDdYSjRHR2ZnL2xyOGlwYlBjZ1lTY3c4SExYcnhha1cwd0ErdUVrM1lrYS8KL2JmVWd0aUxDcXIyL1NNWVZJU2pYaXNnbEFIVWlLMXBuWGw2QU5KM0ZHWDRlaW85WGRidmlmWGpjTXU0NjJUMwpYb1pBY2Jid2trN2o1RzJQNHVKbjg4aDJHbXByWUp6ZVBOTEMzOHlNZ2k0Rk1Sc1BjaFZZcFgzRnhrMndYRU9nCmh5ZVNZdnVlWFdPekV0RURDRXlydW1ReEhmVzNPcnUwYjZKclRaTXB6dE9sYVRkOW5nS0xySWNLYVhFeUd0cmoKbENva0JtVEFMYzZ4bnlLbVVOZjRSOUltbytsVmJ3U0l5Y0duZVBPVHJKY2NSVFViWnNmWHNGZUQwbElXR25IWQpyd3Mxdzl4YXJ2SU43R205QWdNQkFBR2pnZ0ZyTUlJQlp6QWZCZ05WSFNNRUdEQVdnQlJzaXBTaWQ3R0FjaDJCCmVoYXE4dHpPWnU1RndEQWRCZ05WSFE0RUZnUVVGaVIrOXkzQjc1SS92a1RuVkY3cC9oZTY4NkV3RGdZRFZSMFAKQVFIL0JBUURBZ0dHTUV3R0ExVWRJQVJGTUVNd0N3WUpZSVpJQVdVQ0FRc2tNQXNHQ1dDR1NBRmxBZ0VMSnpBTApCZ2xnaGtnQlpRSUJDeW93REFZS1lJWklBV1VEQWdFRERUQU1CZ3BnaGtnQlpRTUNBUU1STUJJR0ExVWRFd0VCCi93UUlNQVlCQWY4Q0FRQXdEQVlEVlIwa0JBVXdBNEFCQURBM0JnTlZIUjhFTURBdU1DeWdLcUFvaGlab2RIUncKT2k4dlkzSnNMbVJwYzJFdWJXbHNMMk55YkM5RVQwUlNUMDlVUTBFekxtTnliREJzQmdnckJnRUZCUWNCQVFSZwpNRjR3T2dZSUt3WUJCUVVITUFLR0xtaDBkSEE2THk5amNtd3VaR2x6WVM1dGFXd3ZhWE56ZFdWa2RHOHZSRTlFClVrOVBWRU5CTTE5SlZDNXdOMk13SUFZSUt3WUJCUVVITUFHR0ZHaDBkSEE2THk5dlkzTndMbVJwYzJFdWJXbHMKTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElCQVFCWkRSWXkwb1AreUQzT2lEcU0zbGlPZ2dERHFKaWREU2txbVBNQgpweFRMOWl5WENBcVM1T1VoektRMi9OOGdSWXpPMW83Sk5JcWV6N2t1d2oxSEowTEg5NGpianlNbnZyV1YzNG1oCm0xT3piRzF5Lzg4RnZoZVFYTGdsZCt0am9qeFlWaEVyYkZHSG54TVB3MVgwVnBiUlRXckFjZXRsZk1OS2R3UFUKQUgxR0RmRm1jenVTZnF3cVpjYXBnSmFsOUJXTUlKb0NYSDFzVU9IWG1nLzZhblh4MWQzME9IOWlUWVYwdG83NgpvSFRnNlBFdzdud3hORGdHY1ZnTERWeURBeVRwZlFDZmhWNGZTTEk5Y0RUczRuQTBTVWdVZ2EwMWQyaDFTcDRyCjBQdGtzakpJTkpsWXZMZ2d2Uld1Y0kvTW9rTHc1RjZtK3c2Qk4rdCtrRWdnTG42VAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpzdWJqZWN0PS9DPVVTL089VS5TLiBHb3Zlcm5tZW50L09VPURvRC9PVT1QS0kvQ049RG9EIFJvb3QgQ0EgMwppc3N1ZXI9L0M9VVMvTz1VLlMuIEdvdmVybm1lbnQvT1U9RG9EL09VPVBLSS9DTj1Eb0QgUm9vdCBDQSAzCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEY3pDQ0FsdWdBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUXNGQURCYk1Rc3dDUVlEVlFRR0V3SlZVekVZCk1CWUdBMVVFQ2hNUFZTNVRMaUJIYjNabGNtNXRaVzUwTVF3d0NnWURWUVFMRXdORWIwUXhEREFLQmdOVkJBc1QKQTFCTFNURVdNQlFHQTFVRUF4TU5SRzlFSUZKdmIzUWdRMEVnTXpBZUZ3MHhNakF6TWpBeE9EUTJOREZhRncweQpPVEV5TXpBeE9EUTJOREZhTUZzeEN6QUpCZ05WQkFZVEFsVlRNUmd3RmdZRFZRUUtFdzlWTGxNdUlFZHZkbVZ5CmJtMWxiblF4RERBS0JnTlZCQXNUQTBSdlJERU1NQW9HQTFVRUN4TURVRXRKTVJZd0ZBWURWUVFERXcxRWIwUWcKVW05dmRDQkRRU0F6TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUFxZXdVY29ybwpTM0NqMmhBRGhLYjdwellOS2pwU0ZyOHdGVktHQlVjZ3o2cW16WFhFWkc3djhXQWp5d3BtUUs2MHlHZ3FBRkZvClNUZnBXVEpObGJ4REorbEFqVG9RemhTOFF4aWgrZDdNNTRWMmMxNFlHaU5idlQ4Zjh1Mk5HY3dEMFVDa2o2Y2cKQWt3blduazI5cU0zSVk0QVdnWVd5dE5WbG04eEtidHlEc3ZpU0ZIeTFEZWtOZFp2N2hlenNRYXJDeG1HNkNOdApNUnNvZUdYRjNtSlN2TUY5Nis2Z1hWUUUrN0xMSzdJalZKR0NUUEMvdW5SQU93d0VSWUJuWE1Ycm9sZkRHbjhLCkxiMS91ZHpCbWJESUIrUU1oamFVT2lVdjhuM21sendibExTWFdRYkpPdVFMMmVycC9EdHpORy85NTVqazg2SEMKa0Y4YzlUOHUxeG5UZndJREFRQUJvMEl3UURBZEJnTlZIUTRFRmdRVWJJcVVvbmV4Z0hJZGdYb1dxdkxjem1idQpSY0F3RGdZRFZSMFBBUUgvQkFRREFnR0dNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVMCkJRQURnZ0VCQUo5eHBNQzJsdEtBUTZCSTZSOTJCUG5GUEsxbUdGaGptOE8yNkdpS2hWcENaaEswMHVhTGlIK0gKOUpqMXFNWUp5Ui93TEIvc2dyajBwVWM0d1RNcjMweCttcjRMQzdITEQzeFFLQkRQaW8yaTZicXNodGZVc1pOZgpJbytXQmJST0RIV1JmZFB5NTVUQ2xCUjJUNDhNcXhDSFdES0ZCM1dHRWd0ZTZsTzBDc2hNaEpJZjYraEJoank2CjlFNUJTdEZzV0VkQnc0WmE4dTdwOHBnbmd1b3VOdGI0Qmw2QzhhQlNrMFFKdXRLcEdWcFlvNmhkSUcxUFpQZ3cKaHh1UUUwaUJ6Y3FReHczQjFKZy9qdklPVjJnekVvNlpDYkh3NVBZUTlEYnlTYjNxb3pqSVZrRWpnNXJmb1JzMQpmT3MvUWJQMWIwczZYcTV2azNhWTB2R1puVVhFam5JPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpzdWJqZWN0PS9DPVVTL089VS5TLiBHb3Zlcm5tZW50L09VPURvRC9PVT1QS0kvQ049RE9EIFNXIENBLTU0Cmlzc3Vlcj0vQz1VUy9PPVUuUy4gR292ZXJubWVudC9PVT1Eb0QvT1U9UEtJL0NOPURvRCBSb290IENBIDMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVqekNDQTNlZ0F3SUJBZ0lDQVN3d0RRWUpLb1pJaHZjTkFRRUxCUUF3V3pFTE1Ba0dBMVVFQmhNQ1ZWTXgKR0RBV0JnTlZCQW9URDFVdVV5NGdSMjkyWlhKdWJXVnVkREVNTUFvR0ExVUVDeE1EUkc5RU1Rd3dDZ1lEVlFRTApFd05RUzBreEZqQVVCZ05WQkFNVERVUnZSQ0JTYjI5MElFTkJJRE13SGhjTk1UWXhNVEl5TVRNMU1USTRXaGNOCk1qSXhNVEl6TVRNMU1USTRXakJhTVFzd0NRWURWUVFHRXdKVlV6RVlNQllHQTFVRUNnd1BWUzVUTGlCSGIzWmwKY201dFpXNTBNUXd3Q2dZRFZRUUxEQU5FYjBReEREQUtCZ05WQkFzTUExQkxTVEVWTUJNR0ExVUVBd3dNUkU5RQpJRk5YSUVOQkxUVTBNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXEwd25hai9qClp6WFJuWm5ORE41ck1aVzdPbVBQY3JHKzhJUVc2b0hyZXRRcXZqL0hDbkF5WDNzbDVUdlQ2YkxDRzRVZkxCQXgKNFZSQ3Zwc1ZXOWZNRS80M0UrTjhweVVEamxoWWU4QkhPOWUwUmZiVmpNZ0RoNnRMYWd2ak4zTWZUaGc4RTk0Qwo2VFJpc2RpZmtQNldvbnBsTzFzYnY4WUQ0OUdqbUJXTHM4S3RVM3h6dy9TdFFyd05meW1ZOGFXNGxYSlFhL0NhCitGWHp6L3RSaDdNY2xybHo2UUN6Z2RIQWxpV0s0czV0c1hEeGVabHMyL3R2VGFaUUNWQ2l5Y2NEZGMvL2xZekwKVUl3ZzNsblBjb1Y2Q1BoaHcrUVc0cTQyWTRvU3U0OFo5Zy9mQXZxaHJLMVUwUzltSGwxdldMRFRISTNoa3dtZApUL08yV2dLaDhudng4d0lEQVFBQm80SUJYRENDQVZnd0h3WURWUjBqQkJnd0ZvQVViSXFVb25leGdISWRnWG9XCnF2TGN6bWJ1UmNBd0hRWURWUjBPQkJZRUZMQzNLTDhzQkltS2RDYXZxaE9NQWhCVmdYbXhNQTRHQTFVZER3RUIKL3dRRUF3SUJoakE5QmdOVkhTQUVOakEwTUFzR0NXQ0dTQUZsQWdFTEpEQUxCZ2xnaGtnQlpRSUJDeWN3Q3dZSgpZSVpJQVdVQ0FRc3FNQXNHQ1dDR1NBRmxBZ0VMT3pBU0JnTlZIUk1CQWY4RUNEQUdBUUgvQWdFQU1Bd0dBMVVkCkpBUUZNQU9BQVFBd053WURWUjBmQkRBd0xqQXNvQ3FnS0lZbWFIUjBjRG92TDJOeWJDNWthWE5oTG0xcGJDOWoKY213dlJFOUVVazlQVkVOQk15NWpjbXd3YkFZSUt3WUJCUVVIQVFFRVlEQmVNRG9HQ0NzR0FRVUZCekFDaGk1bwpkSFJ3T2k4dlkzSnNMbVJwYzJFdWJXbHNMMmx6YzNWbFpIUnZMMFJQUkZKUFQxUkRRVE5mU1ZRdWNEZGpNQ0FHCkNDc0dBUVVGQnpBQmhoUm9kSFJ3T2k4dmIyTnpjQzVrYVhOaExtMXBiREFOQmdrcWhraUc5dzBCQVFzRkFBT0MKQVFFQVpGMDQ3eVM4YnE4bGtNcG94RnJKam1iZEQxVE5wam5XUm1JbVEzMnVQd05rckRic3BOSjRHZHFBaDNONgp1ZUlNY1BVU21ySUVzOUdSWkdKek9lVFE2dGNRS0N5V3krbnBzSTFEUS9rNVh6MEgzNzVCdzE3Z25xMkJwamR5CnM4emVnOEkrMmxET2pTTnI3UmdWV1dCKzJzVldYZHZJTHg0V2toNnZYNTd1RXVkMDQ2SEJtYzROZURpSEFlcjgKTklhYzVBN2UzNzlOUnl1dXNOR1hrQW0zZzdHc0UvWTdNckZzS0tzTWxIYitnRlhWZ0QwREJodEYyMllxbUEvUgpRdlR6N0lqMUFEKytHdjVJNElJekpGTXJ5TjZFRDZYZHVXY1R0azlDbmYwdVkweitWWThSRnc5bk9rRUNGYzJiCkJBOEwyTGxydUJPek1XYkZ5NGtIN0cvaHJBPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKc3ViamVjdD0vQz1VUy9PPVUuUy4gR292ZXJubWVudC9PVT1Eb0QvT1U9UEtJL0NOPURPRCBTVyBDQS01Mwppc3N1ZXI9L0M9VVMvTz1VLlMuIEdvdmVybm1lbnQvT1U9RG9EL09VPVBLSS9DTj1Eb0QgUm9vdCBDQSAzCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFanpDQ0EzZWdBd0lCQWdJQ0FTc3dEUVlKS29aSWh2Y05BUUVMQlFBd1d6RUxNQWtHQTFVRUJoTUNWVk14CkdEQVdCZ05WQkFvVEQxVXVVeTRnUjI5MlpYSnViV1Z1ZERFTU1Bb0dBMVVFQ3hNRFJHOUVNUXd3Q2dZRFZRUUwKRXdOUVMwa3hGakFVQmdOVkJBTVREVVJ2UkNCU2IyOTBJRU5CSURNd0hoY05NVFl4TVRJeU1UTTFNRE0xV2hjTgpNakl4TVRJek1UTTFNRE0xV2pCYU1Rc3dDUVlEVlFRR0V3SlZVekVZTUJZR0ExVUVDZ3dQVlM1VExpQkhiM1psCmNtNXRaVzUwTVF3d0NnWURWUVFMREFORWIwUXhEREFLQmdOVkJBc01BMUJMU1RFVk1CTUdBMVVFQXd3TVJFOUUKSUZOWElFTkJMVFV6TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUF3VGV3UzlpdgpDaFl0TXZOQllFT2pWY1ZxciszVk9BRWd5anQ3aWVKVVZQckZEZ3RMOVN6K2VYWCt1QlhrSndZalMwZ3RleDZMClJ1TnRkY0xrdWtvSnUzNFp4bmZVd2M4cmdUd05WOFZ0SXlJMkdKcS91L0ZqR3dLOGZIa3pzbE96d0Y4S29BNk4KTlRZdkt5OVhvaEJEcnJZR3BScS9SdUR0dFZmaUo0WXZjaWk1SjYrdVpUdlQ5MDM1RWtzcWpWN0Erc0prRlZxSQozTVo4M2tOOU8wWkpmNGRFajRoNERLcVFZSFRScnB5L0JMNHBUR3htU3BuUUhuZTYzVG9xc29abnRUWUNZaEI1CjZpek9ha2JzVVRZVmF1d1lxbE5WZjBqMjBJd2NaaWJ6dHA3d3FWMk5nR3pBODFMbmRoWUxRaCs4S3NEYWJUU1YKc1pNdkxIZkVBZUxkaHdJREFRQUJvNElCWERDQ0FWZ3dId1lEVlIwakJCZ3dGb0FVYklxVW9uZXhnSElkZ1hvVwpxdkxjem1idVJjQXdIUVlEVlIwT0JCWUVGRkhFaXpPWmxNQit1ellkNCtJNkJiMHlkSjFUTUE0R0ExVWREd0VCCi93UUVBd0lCaGpBOUJnTlZIU0FFTmpBME1Bc0dDV0NHU0FGbEFnRUxKREFMQmdsZ2hrZ0JaUUlCQ3ljd0N3WUoKWUlaSUFXVUNBUXNxTUFzR0NXQ0dTQUZsQWdFTE96QVNCZ05WSFJNQkFmOEVDREFHQVFIL0FnRUFNQXdHQTFVZApKQVFGTUFPQUFRQXdOd1lEVlIwZkJEQXdMakFzb0NxZ0tJWW1hSFIwY0RvdkwyTnliQzVrYVhOaExtMXBiQzlqCmNtd3ZSRTlFVWs5UFZFTkJNeTVqY213d2JBWUlLd1lCQlFVSEFRRUVZREJlTURvR0NDc0dBUVVGQnpBQ2hpNW8KZEhSd09pOHZZM0pzTG1ScGMyRXViV2xzTDJsemMzVmxaSFJ2TDBSUFJGSlBUMVJEUVROZlNWUXVjRGRqTUNBRwpDQ3NHQVFVRkJ6QUJoaFJvZEhSd09pOHZiMk56Y0M1a2FYTmhMbTFwYkRBTkJna3Foa2lHOXcwQkFRc0ZBQU9DCkFRRUFDWnR4WDlscjZzeWUwUlVTT0xZekxDVTRqVkROU1FnejNxcThLazdkSjk3R2RzdUJ6QUNjQ0l3RkRwTmQKdGpNdEQrbXdOamdmZVJZNW92eU1FSDNaelZoSXFHcFFvNFdMZUUrYmp5M2ZOY1UzcnNiMlNITmFFcFJkZFdRMwpqbk9jM2pseWcvc0hhUjZKZzRKZlExRzl6YTQ2QVJlVmExbkpMSGp0L0JPNW0vM0Q0aUptcEp2cTJRcDZONGVGCmEyVkw2czh1QVpLbkxDb2NqWlUyQjN3WVpNeWFTZ3BwYUU0VE9lL0hjNUhKdzI0NS9jRkxVTDhJMDJpWWZ2OUUKS1FEdVRHcU56R3JCdUtwOUxNcFJyQldiMGJvRnJaYU9OY1ZYanRDcWkwNWZvMUZkL0podXZmcmFUcGd4bVZYaQoxT3ZnVkd3cTVsc3hXMnBialNwQkZlYmFSdz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCnN1YmplY3Q9L0M9VVMvTz1VLlMuIEdvdmVybm1lbnQvT1U9RG9EL09VPVBLSS9DTj1ET0QgSUQgQ0EtNTIKaXNzdWVyPS9DPVVTL089VS5TLiBHb3Zlcm5tZW50L09VPURvRC9PVT1QS0kvQ049RG9EIFJvb3QgQ0EgMwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRXVUQ0NBNkdnQXdJQkFnSUNBU293RFFZSktvWklodmNOQVFFTEJRQXdXekVMTUFrR0ExVUVCaE1DVlZNeApHREFXQmdOVkJBb1REMVV1VXk0Z1IyOTJaWEp1YldWdWRERU1NQW9HQTFVRUN4TURSRzlFTVF3d0NnWURWUVFMCkV3TlFTMGt4RmpBVUJnTlZCQU1URFVSdlJDQlNiMjkwSUVOQklETXdIaGNOTVRZeE1USXlNVE0wT1RVM1doY04KTWpJeE1USXpNVE0wT1RVM1dqQmFNUXN3Q1FZRFZRUUdFd0pWVXpFWU1CWUdBMVVFQ2d3UFZTNVRMaUJIYjNabApjbTV0Wlc1ME1Rd3dDZ1lEVlFRTERBTkViMFF4RERBS0JnTlZCQXNNQTFCTFNURVZNQk1HQTFVRUF3d01SRTlFCklFbEVJRU5CTFRVeU1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBbHR6Y01wMk8KMDJ0K2Z3ZDdyVGx1Z29LcVlGOGVvLzNNK0pWZHBwUEFIVGlKVmFWdDBKU2VNNHh5WnNLTm9QQm9GVy95c2hueApsUnYvTHlOeDBWQmJuKzRtSjdFYTFVNEZCUHhDU1o2OFZZcUtkVjY0VU1obmRhd1ZCSk0zT3k4WTNaeFBsZFRECmY5QXBDZzRkWlhTRWlTblNoTzhZdXBock5iWUFkNllyZFVuMUloREFodzkwVlRVM0dNTHJ1NHZ4NjB2RkhzY1cKZVpIcEhmRVQ4QXNDbGJBeXF1NjVic2ExK28wWHZHTFF5MkdUTXpFVmFSMU5oWVZXS1JTd2dxVzU3Z2JFOHBWKwo2M1dZTndpOFhJci8yVGFKNUd2Z0JWQ2JnSldBd3NTZkZUejIxWnFPb3UwZDV4WXU3OWlJSXVlNURFb1JXMWJtCnFzZXJITkc3Z3NNdkh3SURBUUFCbzRJQmhqQ0NBWUl3SHdZRFZSMGpCQmd3Rm9BVWJJcVVvbmV4Z0hJZGdYb1cKcXZMY3ptYnVSY0F3SFFZRFZSME9CQllFRkpyb1VheVJWTmVVbWdSSStpSjUvOGJWN29Zck1BNEdBMVVkRHdFQgovd1FFQXdJQmhqQm5CZ05WSFNBRVlEQmVNQXNHQ1dDR1NBRmxBZ0VMSkRBTEJnbGdoa2dCWlFJQkN5Y3dDd1lKCllJWklBV1VDQVFzcU1Bc0dDV0NHU0FGbEFnRUxPekFNQmdwZ2hrZ0JaUU1DQVFNTk1Bd0dDbUNHU0FGbEF3SUIKQXhFd0RBWUtZSVpJQVdVREFnRURKekFTQmdOVkhSTUJBZjhFQ0RBR0FRSC9BZ0VBTUF3R0ExVWRKQVFGTUFPQQpBUUF3TndZRFZSMGZCREF3TGpBc29DcWdLSVltYUhSMGNEb3ZMMk55YkM1a2FYTmhMbTFwYkM5amNtd3ZSRTlFClVrOVBWRU5CTXk1amNtd3diQVlJS3dZQkJRVUhBUUVFWURCZU1Eb0dDQ3NHQVFVRkJ6QUNoaTVvZEhSd09pOHYKWTNKc0xtUnBjMkV1Yldsc0wybHpjM1ZsWkhSdkwwUlBSRkpQVDFSRFFUTmZTVlF1Y0Rkak1DQUdDQ3NHQVFVRgpCekFCaGhSb2RIUndPaTh2YjJOemNDNWthWE5oTG0xcGJEQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FRRUFreHZkCnNiT2gyekdaQ3NqM251OWZIRU1DbEpWdEs0a0p6UEpaUGk0NGdkU24rVThYNWxidFQwa3hzUnJxQ0FabnRsZ1EKbXArRHhuUUNscjM1ZmphbzN3Rjc5blFhSU9QMjc4OWE5VldaZ3lKZlByVjJLTHN4QUg0L29PZDJaWWRVdEhmQwpsYmZad2JweEZ1bEJxUFd4eXNLUU94M1hDLzNMc3pDUjBZRnFiVi9jNWhCUkIxQTRzV0JsRjhLUkdReUtkQXljCks3UHJMY1NNbkxxMDR1Z2Q1TWZZV3VKakp4L1VTTk5XbGlsL0x6cXlDRnp4UHA0bkdCQjh5OHMyTGNaeXZvZmgKSElCTjlxeGwzK0VYY0p5ZXlxeU5pVlpjZ0ppK0RMU21CQ2NrYjJKNmxOOXRiR1dWMDJXSys4T2lBaVozMUNmSgovc2V6WjU4RVpheUdZUzAzMVE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpzdWJqZWN0PS9DPVVTL089VS5TLiBHb3Zlcm5tZW50L09VPURvRC9PVT1QS0kvQ049RE9EIElEIENBLTUxCmlzc3Vlcj0vQz1VUy9PPVUuUy4gR292ZXJubWVudC9PVT1Eb0QvT1U9UEtJL0NOPURvRCBSb290IENBIDMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUV1VENDQTZHZ0F3SUJBZ0lDQVNrd0RRWUpLb1pJaHZjTkFRRUxCUUF3V3pFTE1Ba0dBMVVFQmhNQ1ZWTXgKR0RBV0JnTlZCQW9URDFVdVV5NGdSMjkyWlhKdWJXVnVkREVNTUFvR0ExVUVDeE1EUkc5RU1Rd3dDZ1lEVlFRTApFd05RUzBreEZqQVVCZ05WQkFNVERVUnZSQ0JTYjI5MElFTkJJRE13SGhjTk1UWXhNVEl5TVRNME9USTNXaGNOCk1qSXhNVEl6TVRNME9USTNXakJhTVFzd0NRWURWUVFHRXdKVlV6RVlNQllHQTFVRUNnd1BWUzVUTGlCSGIzWmwKY201dFpXNTBNUXd3Q2dZRFZRUUxEQU5FYjBReEREQUtCZ05WQkFzTUExQkxTVEVWTUJNR0ExVUVBd3dNUkU5RQpJRWxFSUVOQkxUVXhNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQWpqdERzL2lMClRJZjI1dDlTR0dNUDQ5Z0NGSVlYY0V0dlR0Yy92aCtDZ2hmN3FWd2lOdlVZQ2FHTXE1cTdGL3BnTDV4c3c2Qm4KaUNNYXUyYlp0TGZsNXhuTWsyVk1sMkdSd1VheUhRLzBseXRlZUtpZDZmYThzZm5seU5MaDhsdlB1SHFRRkpaWAo1dnBmQUMyNE5EUUNycjhZSWtrTlJ5eEppaENwajhISFl1elRwbERSSXBNbGphaGhBV0NzUWtVcWxxLzVMaXRlClhIWUEvK0VuVDJoc3BraXRTVStGVUlXbzBGS0s5NW9vK2kydVhYOHgzY1hXRVVDWG9SMjNTbGs1TnJHVHdBc2YKVFVkMTZ4V0ExYWN2a3N1bng4ZUszdU9WQ1YwMlEwc2xkVk4xOU5hR204bHBvQmZidGlOejNsby9qMVZUNTU4cQozNUxtT1lXSTZLelNUd0lEQVFBQm80SUJoakNDQVlJd0h3WURWUjBqQkJnd0ZvQVViSXFVb25leGdISWRnWG9XCnF2TGN6bWJ1UmNBd0hRWURWUjBPQkJZRUZKMmt3VnpUK1daeFNhaUVJd08yNGE4cGR5MnVNQTRHQTFVZER3RUIKL3dRRUF3SUJoakJuQmdOVkhTQUVZREJlTUFzR0NXQ0dTQUZsQWdFTEpEQUxCZ2xnaGtnQlpRSUJDeWN3Q3dZSgpZSVpJQVdVQ0FRc3FNQXNHQ1dDR1NBRmxBZ0VMT3pBTUJncGdoa2dCWlFNQ0FRTU5NQXdHQ21DR1NBRmxBd0lCCkF4RXdEQVlLWUlaSUFXVURBZ0VESnpBU0JnTlZIUk1CQWY4RUNEQUdBUUgvQWdFQU1Bd0dBMVVkSkFRRk1BT0EKQVFBd053WURWUjBmQkRBd0xqQXNvQ3FnS0lZbWFIUjBjRG92TDJOeWJDNWthWE5oTG0xcGJDOWpjbXd2UkU5RQpVazlQVkVOQk15NWpjbXd3YkFZSUt3WUJCUVVIQVFFRVlEQmVNRG9HQ0NzR0FRVUZCekFDaGk1b2RIUndPaTh2ClkzSnNMbVJwYzJFdWJXbHNMMmx6YzNWbFpIUnZMMFJQUkZKUFQxUkRRVE5mU1ZRdWNEZGpNQ0FHQ0NzR0FRVUYKQnpBQmhoUm9kSFJ3T2k4dmIyTnpjQzVrYVhOaExtMXBiREFOQmdrcWhraUc5dzBCQVFzRkFBT0NBUUVBaWdRNAphT2R1VFVDcER2QzB1ZTBCMEdWNDlCMGFlazhIWFdLYzEwYlBiMWlVQ1FMMkRUNGFJZjB1K3lRcXJ6VnBUdy94CjVtVlBSbjJaaTJpRVY1QThQc040ZFJlRjNsYmxRU3JTVnZLRnc3Y3E2Nlo4YWIyaWpYanBBTVRKQ1VJT2lyOHcKS29PVjAzY25WY2FXMFZEVEgrZ09zbFhubTk1a1BxZGZieEpNaDA2UTAwWGZ2V2ZSamZuQjlEOFpEWGJ5dE01WApta1pSeXVVdldZK0RLeUpVeTFIQXVhcmRhRnBnQTVXb3dqZVFtOXNBdng3Mkx6YVM3em12K2h4T2xpR1hZT243CmdiSkFUY1QrenQxRmZ3YTlNMTlGam9RRFN6V2loVzhQNWNGUnQ2eFZFd1pIZUQ4VkcrK2pjUWZBdWp3WDB2N1UKaEZLdThneG0zd2xOWE9hbHpBPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKc3ViamVjdD0vQz1VUy9PPVUuUy4gR292ZXJubWVudC9PVT1Eb0QvT1U9UEtJL0NOPURPRCBJRCBDQS01MAppc3N1ZXI9L0M9VVMvTz1VLlMuIEdvdmVybm1lbnQvT1U9RG9EL09VPVBLSS9DTj1Eb0QgUm9vdCBDQSAzCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFdVRDQ0E2R2dBd0lCQWdJQ0FTZ3dEUVlKS29aSWh2Y05BUUVMQlFBd1d6RUxNQWtHQTFVRUJoTUNWVk14CkdEQVdCZ05WQkFvVEQxVXVVeTRnUjI5MlpYSnViV1Z1ZERFTU1Bb0dBMVVFQ3hNRFJHOUVNUXd3Q2dZRFZRUUwKRXdOUVMwa3hGakFVQmdOVkJBTVREVVJ2UkNCU2IyOTBJRU5CSURNd0hoY05NVFl4TVRJeU1UTTBPRFEzV2hjTgpNakl4TVRJek1UTTBPRFEzV2pCYU1Rc3dDUVlEVlFRR0V3SlZVekVZTUJZR0ExVUVDZ3dQVlM1VExpQkhiM1psCmNtNXRaVzUwTVF3d0NnWURWUVFMREFORWIwUXhEREFLQmdOVkJBc01BMUJMU1RFVk1CTUdBMVVFQXd3TVJFOUUKSUVsRUlFTkJMVFV3TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUF5MW5jTTFiTgpKSkhpdTFCaDVqUThyK1kxTDJwdncrNllETEdFNzF6NWdxdUJxaXNPQzZYTEtmZktkQlNGMlU1NXZ2cDBtNUo4CldkRjVEU2Z5ZmRBSjdTMUhsekZZVlcrMEtqR0xFTEtWNXRXWmgvYVh1OFY4NVphYVlrdkplZUVVNWNJWVdMS0sKUkFyMWl5Z3duc2xoeTFLYjd4aFlWN2dMWWMyOVdtMUVnWmlKMlhtOU0xMUZJYXVvNDBFWG1RRm5pejRGTEUvUwo0SkIxbGJZaVAxakdhNHpKcmRuZWMxazY1dFprL0s0aGRpMmRpUys5bUVVejNQV3J6TnFqckhLeEZvY25oOXFTCk5HcUpmeWZYeFhnS1RyWncyVUc4M0l4SEt2SXBNUG9kWDRTWVV3Um01SFJickc2YzFGeDEyTkMyZ28xNnczZEQKaWxIK2FVZHVUTnBtRlFJREFRQUJvNElCaGpDQ0FZSXdId1lEVlIwakJCZ3dGb0FVYklxVW9uZXhnSElkZ1hvVwpxdkxjem1idVJjQXdIUVlEVlIwT0JCWUVGRFl1VXQ1MHFwN3N1eCtUMGI2MlVMWEdhUXY1TUE0R0ExVWREd0VCCi93UUVBd0lCaGpCbkJnTlZIU0FFWURCZU1Bc0dDV0NHU0FGbEFnRUxKREFMQmdsZ2hrZ0JaUUlCQ3ljd0N3WUoKWUlaSUFXVUNBUXNxTUFzR0NXQ0dTQUZsQWdFTE96QU1CZ3BnaGtnQlpRTUNBUU1OTUF3R0NtQ0dTQUZsQXdJQgpBeEV3REFZS1lJWklBV1VEQWdFREp6QVNCZ05WSFJNQkFmOEVDREFHQVFIL0FnRUFNQXdHQTFVZEpBUUZNQU9BCkFRQXdOd1lEVlIwZkJEQXdMakFzb0NxZ0tJWW1hSFIwY0RvdkwyTnliQzVrYVhOaExtMXBiQzlqY213dlJFOUUKVWs5UFZFTkJNeTVqY213d2JBWUlLd1lCQlFVSEFRRUVZREJlTURvR0NDc0dBUVVGQnpBQ2hpNW9kSFJ3T2k4dgpZM0pzTG1ScGMyRXViV2xzTDJsemMzVmxaSFJ2TDBSUFJGSlBUMVJEUVROZlNWUXVjRGRqTUNBR0NDc0dBUVVGCkJ6QUJoaFJvZEhSd09pOHZiMk56Y0M1a2FYTmhMbTFwYkRBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQVFFQWJBbGkKbzcrZ1dYNVl5dG1QTUQ5aWMrYVgyczBOYVNkU2F1RlltYjZraHROMENDb2NJcVRJL1R5ZlJKVGpoSTZ3Uk5vYQpja2NqVmE1SDNFT3A0dk9ydExONFR4YmhOcWRFK0lIYWZXRTQvYnREc3RJNVByQTJobEZaYjF6dk01RVFDOHUwCkJaUS9EcXlTaE9qeXB2eGxkdm9sNlVHanlzN3dlY1B4dDNjQkpDN3Vyb1krbnFmeEhuT0l4UkZvSkdkQzdwU20KZjkwL3VEY1g4N29DYksvRnJ6SkJPKy9WMmxHSGlCeUM3YWhjUDU5YTRYZDY5bEhTTXRSV3F1Y2xBeUJFeTFNeApwN0J4L3Y1a0NwdjE0SkU2U0JsWUV3aEZyVHQ0YVQ0OUZRRVE5YUpGS1J2N2oyMHNTLzZ3eFB6R3gyNEhFMEdiClh3dXNLOWpvNXNrR0xMVUMzZz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCnN1YmplY3Q9L0M9VVMvTz1VLlMuIEdvdmVybm1lbnQvT1U9RG9EL09VPVBLSS9DTj1ET0QgSUQgQ0EtNDkKaXNzdWVyPS9DPVVTL089VS5TLiBHb3Zlcm5tZW50L09VPURvRC9PVT1QS0kvQ049RG9EIFJvb3QgQ0EgMwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRXVUQ0NBNkdnQXdJQkFnSUNBU2N3RFFZSktvWklodmNOQVFFTEJRQXdXekVMTUFrR0ExVUVCaE1DVlZNeApHREFXQmdOVkJBb1REMVV1VXk0Z1IyOTJaWEp1YldWdWRERU1NQW9HQTFVRUN4TURSRzlFTVF3d0NnWURWUVFMCkV3TlFTMGt4RmpBVUJnTlZCQU1URFVSdlJDQlNiMjkwSUVOQklETXdIaGNOTVRZeE1USXlNVE0wT0RFMVdoY04KTWpJeE1USXpNVE0wT0RFMVdqQmFNUXN3Q1FZRFZRUUdFd0pWVXpFWU1CWUdBMVVFQ2d3UFZTNVRMaUJIYjNabApjbTV0Wlc1ME1Rd3dDZ1lEVlFRTERBTkViMFF4RERBS0JnTlZCQXNNQTFCTFNURVZNQk1HQTFVRUF3d01SRTlFCklFbEVJRU5CTFRRNU1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBMkVuZ0tJd1AKQ2w5K2RzSUJ5TzJ1T05OTEtocG5GeXBCQUUrTE04K2tla3Q0L0hHNlN0YVUvZm1xRlRSaVZJMFVoK3RkOUJXZQo4TlhPWXJoUVJvNkZWU3hCa0x0V1pYOFB4MklIeGlxUTFsbnJaSzlVbENvOGgzTVBwaU44VkVqSDJiUC9XU2EwCm9aRVd6RURLTEI1dFNLZXJkZGMrUUwydUVIYitHZnltNmkrNXFQT0xYalYwMEZZMjRGZE5PeUhhUmpRVE0vTGYKc2pXb0ZJdEhUS3A1QjlRb2dkS255ZytXa0FBUll0YmQxbnF0RFh2NkZwaDVIYVQzOVNFblJoYytsa3JSRHBEWQpjK0hBVTZYeXdpaytzdGd2MnlGazFNaEZwRjUvcm5kRXdNTElTVDArbFNwYWhKS0dtWXRnMVZLY25EY3E1Q0VSCkMzMWdsNllyN2ZmakF3SURBUUFCbzRJQmhqQ0NBWUl3SHdZRFZSMGpCQmd3Rm9BVWJJcVVvbmV4Z0hJZGdYb1cKcXZMY3ptYnVSY0F3SFFZRFZSME9CQllFRk5obms4cEczTW1WcHBTekJCaWN6aVU2bGh4Tk1BNEdBMVVkRHdFQgovd1FFQXdJQmhqQm5CZ05WSFNBRVlEQmVNQXNHQ1dDR1NBRmxBZ0VMSkRBTEJnbGdoa2dCWlFJQkN5Y3dDd1lKCllJWklBV1VDQVFzcU1Bc0dDV0NHU0FGbEFnRUxPekFNQmdwZ2hrZ0JaUU1DQVFNTk1Bd0dDbUNHU0FGbEF3SUIKQXhFd0RBWUtZSVpJQVdVREFnRURKekFTQmdOVkhSTUJBZjhFQ0RBR0FRSC9BZ0VBTUF3R0ExVWRKQVFGTUFPQQpBUUF3TndZRFZSMGZCREF3TGpBc29DcWdLSVltYUhSMGNEb3ZMMk55YkM1a2FYTmhMbTFwYkM5amNtd3ZSRTlFClVrOVBWRU5CTXk1amNtd3diQVlJS3dZQkJRVUhBUUVFWURCZU1Eb0dDQ3NHQVFVRkJ6QUNoaTVvZEhSd09pOHYKWTNKc0xtUnBjMkV1Yldsc0wybHpjM1ZsWkhSdkwwUlBSRkpQVDFSRFFUTmZTVlF1Y0Rkak1DQUdDQ3NHQVFVRgpCekFCaGhSb2RIUndPaTh2YjJOemNDNWthWE5oTG0xcGJEQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FRRUFUbWZQClFQa29sRjVQQjBmUy85RHJuZ1gwdG1kU3dsaWRCdHJrWTZ2TC9WN0lNS3FKazdyK2hIVzZrOStueGlqSEZqNlkKSjErNEVscEgvUHdXUHNxd1ZJc2hReEVDdkpLZm8zT2ZOM2E4TW42SG9nNWtYSmw1ZE1iMHZKT3BXUTlVaG1HMgptOVVVWjk4NDd3U2xiVzB2TUhMMHB1dVRzbzAzNjV2aWxQTzVKa2FwRVhjRlhkYzNMRHhYVzhCUjVOSHlhTjNWCm12ZkQvcUFxZTRCaUJ4MitXQXhzb2xUSlE1SU1qRzV0SU43V0U2VkpkVUFtNkVJZ2J1RmZ2RzFLaVdRSkxIa0wKWGRUdndkVVRxWDlKUVlzd2Z2b0N3dkhSaCtJMm1aWCsvaUg1SEtMY2F4cVc4YjlKbkhDdGZNU0JacUxkSTNuRwpJQnc0OHRSdWw4bGJyZzBtSnc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpzdWJqZWN0PS9DPVVTL089VS5TLiBHb3Zlcm5tZW50L09VPURvRC9PVT1QS0kvQ049RE9EIEVNQUlMIENBLTUyCmlzc3Vlcj0vQz1VUy9PPVUuUy4gR292ZXJubWVudC9PVT1Eb0QvT1U9UEtJL0NOPURvRCBSb290IENBIDMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUV2RENDQTZTZ0F3SUJBZ0lDQVNZd0RRWUpLb1pJaHZjTkFRRUxCUUF3V3pFTE1Ba0dBMVVFQmhNQ1ZWTXgKR0RBV0JnTlZCQW9URDFVdVV5NGdSMjkyWlhKdWJXVnVkREVNTUFvR0ExVUVDeE1EUkc5RU1Rd3dDZ1lEVlFRTApFd05RUzBreEZqQVVCZ05WQkFNVERVUnZSQ0JTYjI5MElFTkJJRE13SGhjTk1UWXhNVEl5TVRNME56STRXaGNOCk1qSXhNVEl6TVRNME56STRXakJkTVFzd0NRWURWUVFHRXdKVlV6RVlNQllHQTFVRUNnd1BWUzVUTGlCSGIzWmwKY201dFpXNTBNUXd3Q2dZRFZRUUxEQU5FYjBReEREQUtCZ05WQkFzTUExQkxTVEVZTUJZR0ExVUVBd3dQUkU5RQpJRVZOUVVsTUlFTkJMVFV5TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUF3NHBiCnFGWjVMUG05Z2NXVDI0bENqOHlMUUhZZHpudFRXZ01xUFZ5dmVHODhyQStiWGlBV082eldVc2pQbFlRSGZ4aU4KcVRaZW1LZ0s4T1VrVlFBNG9pUTU5RXpjTmlSc1pwMWh5N252RHBGY1cvMFdKekhZNU04NFRoSTU3elJIMjBBYwppTncxREI3WG1SNXlKRktURnVzaXBXZ3Nxd1dSVHRwSmxMR0pYaFRIeUc2YU54UDZIRVhiVExBTTR4LzBMTTlaClEyeVlpaFV1Zmd0SllHZUxhcE5iMXBQTHNQVmNoaEpPUWpMRnlwM0t4OVcxeGZqVUZmdEU5RlFBd0NCSkh5QzcKdEZNazZEbElUeTRzN3B0c3Qxbk5iUFlkekdtaWl4L1A3K0k3MDJZbjhIM1libWhGRDNkK2ZraENYcXNqaW8weQowd1dGRGFhNnZtbTNScUYxR1FJREFRQUJvNElCaGpDQ0FZSXdId1lEVlIwakJCZ3dGb0FVYklxVW9uZXhnSElkCmdYb1dxdkxjem1idVJjQXdIUVlEVlIwT0JCWUVGT2xtREZ5YjRscEtzZ00yTlAxOHlhYjRxd2M1TUE0R0ExVWQKRHdFQi93UUVBd0lCaGpCbkJnTlZIU0FFWURCZU1Bc0dDV0NHU0FGbEFnRUxKREFMQmdsZ2hrZ0JaUUlCQ3ljdwpDd1lKWUlaSUFXVUNBUXNxTUFzR0NXQ0dTQUZsQWdFTE96QU1CZ3BnaGtnQlpRTUNBUU1OTUF3R0NtQ0dTQUZsCkF3SUJBeEV3REFZS1lJWklBV1VEQWdFREp6QVNCZ05WSFJNQkFmOEVDREFHQVFIL0FnRUFNQXdHQTFVZEpBUUYKTUFPQUFRQXdOd1lEVlIwZkJEQXdMakFzb0NxZ0tJWW1hSFIwY0RvdkwyTnliQzVrYVhOaExtMXBiQzlqY213dgpSRTlFVWs5UFZFTkJNeTVqY213d2JBWUlLd1lCQlFVSEFRRUVZREJlTURvR0NDc0dBUVVGQnpBQ2hpNW9kSFJ3Ck9pOHZZM0pzTG1ScGMyRXViV2xzTDJsemMzVmxaSFJ2TDBSUFJGSlBUMVJEUVROZlNWUXVjRGRqTUNBR0NDc0cKQVFVRkJ6QUJoaFJvZEhSd09pOHZiMk56Y0M1a2FYTmhMbTFwYkRBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQVFFQQpkWUVmdVRrQm9KTHd6eUlaL2xyeEIzRUNDZXMyeldNTGUxUnNSclEzUVVoa2VMY3F4eHdHMXorVWJibVdrclNTCkpTMFExWGVMUmlUN1AxeCt5Y3MxR3ZveTVWNENGT3J5YjVlTmFEcE9jbEpkWE9pUmpPR3ZTMHdTZVNMR25UL2QKbFJQclFaY29FbStERnZ0U01hc3UvelI4RG5hZXBLcFdMdnlGWHd2b2ltdnNRVnZ6NHRPUzJvNHU0MDBLTFBCbwpNUWJUd3BEbWszOXd4ZjRBcTRtOGh6bmYyQmhBeTIwWUg2alkwOGdYZzBwTkRWaDRDWkl4eUYyZ21FMFREWFB2CnN4NzdseFlLVzNCeDBaeEhJY2ZCS2lmalNpVHJHbExlRVA5TGZFUWRwQ2pKcWhHLzNCRnk2Zmx6d0pERUhxSEgKc3doTjlEQ0puKzN4VGVxMjVQVVhQZz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCnN1YmplY3Q9L0M9VVMvTz1VLlMuIEdvdmVybm1lbnQvT1U9RG9EL09VPVBLSS9DTj1ET0QgRU1BSUwgQ0EtNTEKaXNzdWVyPS9DPVVTL089VS5TLiBHb3Zlcm5tZW50L09VPURvRC9PVT1QS0kvQ049RG9EIFJvb3QgQ0EgMwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRXZEQ0NBNlNnQXdJQkFnSUNBU1V3RFFZSktvWklodmNOQVFFTEJRQXdXekVMTUFrR0ExVUVCaE1DVlZNeApHREFXQmdOVkJBb1REMVV1VXk0Z1IyOTJaWEp1YldWdWRERU1NQW9HQTFVRUN4TURSRzlFTVF3d0NnWURWUVFMCkV3TlFTMGt4RmpBVUJnTlZCQU1URFVSdlJDQlNiMjkwSUVOQklETXdIaGNOTVRZeE1USXlNVE0wTmpRNVdoY04KTWpJeE1USXpNVE0wTmpRNVdqQmRNUXN3Q1FZRFZRUUdFd0pWVXpFWU1CWUdBMVVFQ2d3UFZTNVRMaUJIYjNabApjbTV0Wlc1ME1Rd3dDZ1lEVlFRTERBTkViMFF4RERBS0JnTlZCQXNNQTFCTFNURVlNQllHQTFVRUF3d1BSRTlFCklFVk5RVWxNSUVOQkxUVXhNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQW53N1AKVGFqNVVHU01pOHdoeEdwUHNvQ2hHTWpWUVJrMUZ6cDlKL21Qangvb1hjMk13TWFoSzN4cEUzWUI4NnEvU2VIMQpDdjVoYzlQYTk5SHRTRi9SYUhBbzNmckZvUG5STm9QRExqNmloUEdtRVd3TUt5d1VnT0NuVFFjR1NsTnFSMGVzCnRZck1UeHRpOWJLRTN1YzBoZ1dpYlpZbHVraUdZZzBVeWdZUFM0K2FmTXR6YUJsamlVV2VRRnJtQ2FFZ2VHM0IKVXZYL3pnTmRTcXRHOUtYMUxqcXROWkI5MWhJRHJSVU5vaFg1eFNMeFBNcG9qQzVkMzkxdS8wR2ZBRVhlS3lBeQpiUE44QmRWanFKN0ZseXVlVktVZ0lBQi90L2s2Tk8zbEtFaUMrUXNyaHJ3YUZJM1ltZTlKZlJzWlU4L1lodjBMCndLZUpob3ozNTUyb1QwZTRQd0lEQVFBQm80SUJoakNDQVlJd0h3WURWUjBqQkJnd0ZvQVViSXFVb25leGdISWQKZ1hvV3F2TGN6bWJ1UmNBd0hRWURWUjBPQkJZRUZEWHZFQ0pzdWhJUHZjSk5HZVRPZlk4RlYxdzBNQTRHQTFVZApEd0VCL3dRRUF3SUJoakJuQmdOVkhTQUVZREJlTUFzR0NXQ0dTQUZsQWdFTEpEQUxCZ2xnaGtnQlpRSUJDeWN3CkN3WUpZSVpJQVdVQ0FRc3FNQXNHQ1dDR1NBRmxBZ0VMT3pBTUJncGdoa2dCWlFNQ0FRTU5NQXdHQ21DR1NBRmwKQXdJQkF4RXdEQVlLWUlaSUFXVURBZ0VESnpBU0JnTlZIUk1CQWY4RUNEQUdBUUgvQWdFQU1Bd0dBMVVkSkFRRgpNQU9BQVFBd053WURWUjBmQkRBd0xqQXNvQ3FnS0lZbWFIUjBjRG92TDJOeWJDNWthWE5oTG0xcGJDOWpjbXd2ClJFOUVVazlQVkVOQk15NWpjbXd3YkFZSUt3WUJCUVVIQVFFRVlEQmVNRG9HQ0NzR0FRVUZCekFDaGk1b2RIUncKT2k4dlkzSnNMbVJwYzJFdWJXbHNMMmx6YzNWbFpIUnZMMFJQUkZKUFQxUkRRVE5mU1ZRdWNEZGpNQ0FHQ0NzRwpBUVVGQnpBQmhoUm9kSFJ3T2k4dmIyTnpjQzVrYVhOaExtMXBiREFOQmdrcWhraUc5dzBCQVFzRkFBT0NBUUVBClkyVUtITWk5OG1zbE5KOXFVQlQ4Wk5HS2ltK25Za2ZMZkJnZFAxMzZzbUpZWURjd1VPWHdIdDNiMWFPeTRzWEkKMEJrTk5TNnRPNWZkdlo3VzQvellGb3VJVm5JbWFhOGhqRGlKTm9BaTVkWUtEeGtCOGlPV1lsQVA4VFp3cEtOeQpzYkdoNEVRSFdXUTh3RHVGY2RBNS85RWxueHBRL0pKelNnVU9IaHRHbTh2ckVRbW1KS1cwRnZiR1hoR3lkSHgyCkk1R3REdkdIcWxwRjhHRklBQTVITkFhdzFzNURlMlN0RVlDVFMveTk1bmFxWmFmQ3hZRzYyY0diSGlyOGRwMFUKS1FPVVF0ODh0VGgwVEFxemNMS3oxT0pJb0lrYmZwelY2WGlYdUwwVlNvYitXMHBlWmVxVFZxK3c3bldQMWNOcgo0NGxpZ3d3VmplRjA0TDNzWktBNTR3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKc3ViamVjdD0vQz1VUy9PPVUuUy4gR292ZXJubWVudC9PVT1Eb0QvT1U9UEtJL0NOPURPRCBFTUFJTCBDQS01MAppc3N1ZXI9L0M9VVMvTz1VLlMuIEdvdmVybm1lbnQvT1U9RG9EL09VPVBLSS9DTj1Eb0QgUm9vdCBDQSAzCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFdkRDQ0E2U2dBd0lCQWdJQ0FTUXdEUVlKS29aSWh2Y05BUUVMQlFBd1d6RUxNQWtHQTFVRUJoTUNWVk14CkdEQVdCZ05WQkFvVEQxVXVVeTRnUjI5MlpYSnViV1Z1ZERFTU1Bb0dBMVVFQ3hNRFJHOUVNUXd3Q2dZRFZRUUwKRXdOUVMwa3hGakFVQmdOVkJBTVREVVJ2UkNCU2IyOTBJRU5CSURNd0hoY05NVFl4TVRJeU1UTTBOVEF3V2hjTgpNakl4TVRJek1UTTBOVEF3V2pCZE1Rc3dDUVlEVlFRR0V3SlZVekVZTUJZR0ExVUVDZ3dQVlM1VExpQkhiM1psCmNtNXRaVzUwTVF3d0NnWURWUVFMREFORWIwUXhEREFLQmdOVkJBc01BMUJMU1RFWU1CWUdBMVVFQXd3UFJFOUUKSUVWTlFVbE1JRU5CTFRVd01JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBb3JVNQpmd01LWEt3SzRTcnR0b3p2V2I4Wng5Zys3cEdyekQrY2JhWmJJU3JUdk5UaTlNaERZQVNNbzIzbnpHL1NoSFFNCmMwcUNjMTBBVlVxcEFmd1JobTlGYnBoRDNyMzBTV0tRc3JLZU9iQlc2M2lNZUI2Z2ZoZy8relNjdmtKeGxxajYKeDVjSGdsTUNGUWZkcWpnbWp0Y3VXSUdyN2NEZjFXUUpMR2ZDejZpbEtIL0gybm8wYTNBeW9GRUFnbHJVeWhDNQpuMElWc215cldZNEh5OUEvMHhlODRobCs2OGNKZkI0VkQrOEErWXJVcUVnc3BpcXpvY3Z6Y3VOL0dOZGVEOUx3ClhQcXlscW5GOFNOMEhZb0htamJpbXNjSW44NndDeEFSTzBzaVdaN2hTdHJjYmtiK2NnRm9ZNWFTY2RsZFVrbmkKWUkyY21SeTBDNWp2K3dBZlh3SURBUUFCbzRJQmhqQ0NBWUl3SHdZRFZSMGpCQmd3Rm9BVWJJcVVvbmV4Z0hJZApnWG9XcXZMY3ptYnVSY0F3SFFZRFZSME9CQllFRkdVS2UxMG1HekRLTGR6ODFuUEhIc0YvQkl6SU1BNEdBMVVkCkR3RUIvd1FFQXdJQmhqQm5CZ05WSFNBRVlEQmVNQXNHQ1dDR1NBRmxBZ0VMSkRBTEJnbGdoa2dCWlFJQkN5Y3cKQ3dZSllJWklBV1VDQVFzcU1Bc0dDV0NHU0FGbEFnRUxPekFNQmdwZ2hrZ0JaUU1DQVFNTk1Bd0dDbUNHU0FGbApBd0lCQXhFd0RBWUtZSVpJQVdVREFnRURKekFTQmdOVkhSTUJBZjhFQ0RBR0FRSC9BZ0VBTUF3R0ExVWRKQVFGCk1BT0FBUUF3TndZRFZSMGZCREF3TGpBc29DcWdLSVltYUhSMGNEb3ZMMk55YkM1a2FYTmhMbTFwYkM5amNtd3YKUkU5RVVrOVBWRU5CTXk1amNtd3diQVlJS3dZQkJRVUhBUUVFWURCZU1Eb0dDQ3NHQVFVRkJ6QUNoaTVvZEhSdwpPaTh2WTNKc0xtUnBjMkV1Yldsc0wybHpjM1ZsWkhSdkwwUlBSRkpQVDFSRFFUTmZTVlF1Y0Rkak1DQUdDQ3NHCkFRVUZCekFCaGhSb2RIUndPaTh2YjJOemNDNWthWE5oTG0xcGJEQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FRRUEKVm5MS3dSZFlCYVBuRU9OSm5UcEhvQzR6bklRTUhCc0VwUWJSOFA1ajQ5SVh0SFJqQ3BsNVBLUkl3dUFjK0ZmMwppeE0zanYvRytMQmkyNkcwWk5HWjRpSTExckozVEx4VXFIVDEyL1dYVHVTOTFqZVBBL2YzV0lIa0dCRUZlUnMrCndpUk9YU0F2ZXlNQXQxVGhLOUJpbDdCWWxMbXBnZmNpN2VpS0hDNk9sQTdWWm80T3JTMDNWWlRsYWFCYVU1VGUKK3RYOFhZUTdLbGxoOUxyZVhaMkNrczE0b05CbFM0dnpPY1pPcHcxYmFtYUViSUExM0lzR3lZL2tGN0xxU1BXMgpiN0p5NjI4T2JMZVUzYSswbG0rbklrakgyNUZEdnRmeEQ5KzJxUUhFcFJhUmNsc2t3SUdUbUEvVGcvWXJyUzJaCmFtOVJEKzZFL3RzZ0lJbFFFMDlORUE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpzdWJqZWN0PS9DPVVTL089VS5TLiBHb3Zlcm5tZW50L09VPURvRC9PVT1QS0kvQ049RE9EIEVNQUlMIENBLTQ5Cmlzc3Vlcj0vQz1VUy9PPVUuUy4gR292ZXJubWVudC9PVT1Eb0QvT1U9UEtJL0NOPURvRCBSb290IENBIDMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUV2RENDQTZTZ0F3SUJBZ0lDQVNNd0RRWUpLb1pJaHZjTkFRRUxCUUF3V3pFTE1Ba0dBMVVFQmhNQ1ZWTXgKR0RBV0JnTlZCQW9URDFVdVV5NGdSMjkyWlhKdWJXVnVkREVNTUFvR0ExVUVDeE1EUkc5RU1Rd3dDZ1lEVlFRTApFd05RUzBreEZqQVVCZ05WQkFNVERVUnZSQ0JTYjI5MElFTkJJRE13SGhjTk1UWXhNVEl5TVRNME16RTBXaGNOCk1qSXhNVEl6TVRNME16RTBXakJkTVFzd0NRWURWUVFHRXdKVlV6RVlNQllHQTFVRUNnd1BWUzVUTGlCSGIzWmwKY201dFpXNTBNUXd3Q2dZRFZRUUxEQU5FYjBReEREQUtCZ05WQkFzTUExQkxTVEVZTUJZR0ExVUVBd3dQUkU5RQpJRVZOUVVsTUlFTkJMVFE1TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUF1czIzCnh0T0FiZkx4UGgrT1M4VTNOL2M3WnNuVE5aR2tpNktqbkVnNEVWSG5VS3dCQjFwV0xlUWJaVFZwMDFkSFdseFIKS3l2QU5uays4b3pNOHR1Y293eDBxNmZvNUovWXRlRDlxSEZBb1dqSlFwUkI2SHZuMnZ2SHZVYnU3aUFZNVBlbAowQjZBME5OL2xLVzI2dFRsaW02TmtWMU11Q2N2cENHcndIMGYyVE9DemtEZjdJUHFRRHZMV09qUFFQOW5tTk1HCm5TK3FDdkY1RjBpR0ZYVEgxTkRlSThFUHZLTUJRRStMZ0o0UEFGOGVGZERvMG1ERTZpTGZQQUlYQnpmWVVkRmsKTVMzZVZwSk9XUHpPRVllUkxjV1FrT1J2Y3pmeE4wb2J4U0gzVEdvQkxCM3ViRUxPb2lxZ3NURjdyTEtFMUt5egpXcmFvMTV1b1lmMjlPOWphdFFJREFRQUJvNElCaGpDQ0FZSXdId1lEVlIwakJCZ3dGb0FVYklxVW9uZXhnSElkCmdYb1dxdkxjem1idVJjQXdIUVlEVlIwT0JCWUVGR2xFSHhxVlRxVWFmNGc2ekhzU09Td2Z6eG94TUE0R0ExVWQKRHdFQi93UUVBd0lCaGpCbkJnTlZIU0FFWURCZU1Bc0dDV0NHU0FGbEFnRUxKREFMQmdsZ2hrZ0JaUUlCQ3ljdwpDd1lKWUlaSUFXVUNBUXNxTUFzR0NXQ0dTQUZsQWdFTE96QU1CZ3BnaGtnQlpRTUNBUU1OTUF3R0NtQ0dTQUZsCkF3SUJBeEV3REFZS1lJWklBV1VEQWdFREp6QVNCZ05WSFJNQkFmOEVDREFHQVFIL0FnRUFNQXdHQTFVZEpBUUYKTUFPQUFRQXdOd1lEVlIwZkJEQXdMakFzb0NxZ0tJWW1hSFIwY0RvdkwyTnliQzVrYVhOaExtMXBiQzlqY213dgpSRTlFVWs5UFZFTkJNeTVqY213d2JBWUlLd1lCQlFVSEFRRUVZREJlTURvR0NDc0dBUVVGQnpBQ2hpNW9kSFJ3Ck9pOHZZM0pzTG1ScGMyRXViV2xzTDJsemMzVmxaSFJ2TDBSUFJGSlBUMVJEUVROZlNWUXVjRGRqTUNBR0NDc0cKQVFVRkJ6QUJoaFJvZEhSd09pOHZiMk56Y0M1a2FYTmhMbTFwYkRBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQVFFQQpYRE5rYUQyR3dlNFpvV2tsd3ZBdnZlb09ZSzVzOGZKYmpaT2pJMlYxdFpqSVA1ZWR3OFlTdkxER1Rxc2FEbGFvCjI4aENWaG9PVTArVjIzNHAwQ0FHS05LSUQ2V0NSNDZzN3VBQUxhYVdmZDRhSER6ZjIwcVlzbk1ybDBlS0N2NkYKc1V0S0JrSVlKQmp4cG9hSXB1ZFJDblNtUWt4d2VLekNHQ3RqV0NUMk1HU0pybzJRMGVRV1REeG5KWDkvdjh6NwpkWjhkZFpPMXpnb1UxeG5BeDlMeGRyVmw2SDJWY0IxN3o2dDJkNVRxU0xNL09udVNIVDdMV3FZYlZKRVJmMzhEClUwV1NRN1ZPcDJ4MVNrSW5KcXBld3ZpKzBybC95aDk3VW9EWnVTL0dVa1ZJTUZicEprYmNhZGlFR0JJTkVyUmwKUjV2UVpEZXNCcEdxVXhOWXVJSUpiQT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCnN1YmplY3Q9L0M9VVMvTz1VLlMuIEdvdmVybm1lbnQvT1U9RG9EL09VPVBLSS9DTj1ET0QgSUQgQ0EtNDAKaXNzdWVyPS9DPVVTL089VS5TLiBHb3Zlcm5tZW50L09VPURvRC9PVT1QS0kvQ049RG9EIFJvb3QgQ0EgMgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRXVEQ0NBNkNnQXdJQkFnSUNCOFF3RFFZSktvWklodmNOQVFFRkJRQXdXekVMTUFrR0ExVUVCaE1DVlZNeApHREFXQmdOVkJBb1REMVV1VXk0Z1IyOTJaWEp1YldWdWRERU1NQW9HQTFVRUN4TURSRzlFTVF3d0NnWURWUVFMCkV3TlFTMGt4RmpBVUJnTlZCQU1URFVSdlJDQlNiMjkwSUVOQklESXdIaGNOTVRVeE1UQTVNVFF5TWpVMFdoY04KTWpFeE1UQTRNVFF5TWpVMFdqQmFNUXN3Q1FZRFZRUUdFd0pWVXpFWU1CWUdBMVVFQ2hNUFZTNVRMaUJIYjNabApjbTV0Wlc1ME1Rd3dDZ1lEVlFRTEV3TkViMFF4RERBS0JnTlZCQXNUQTFCTFNURVZNQk1HQTFVRUF4TU1SRTlFCklFbEVJRU5CTFRRd01JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBc0MwRmJXc0kKbGE2K05mSEQ2M0dSZUx0ODVGNGpkenM1bWxOclhralZsWEp6a3NhSWttbEhmcUFXeW82ZWE4U2hocXdkTm5YZwpQbEliN2VqNFJvWEZxWEpJd3NDcnhRN3JlditzQ2RrTDVVdHhPeFBxNDB3YmpWK0FjakY4UW1wOXhvUHlJbXh6CmxMZWJXV0o4SERnSmwySFNMcklGaWJyUkZlRDB0NkdMc1Q4SmhPZFFtcUU4d1JOeXBaSDZvREloeWdYM2xoQmUKUkR4dUsvNnpMTUorc3JxRzhETUpGSmh6MGtIaDM2dWdiSkpPUEx5RUd4d2p5RWljQnFrNDRORmNtcjhZV0MyNApSTTI4UWpydXF3b3Rsc0kzd29DYVRIa1ZtMzdmYzB4bWJBUGc0ZWdneHJ6WG4zZEZRRStjdzQwV0JMcHkwZDBHCjA1UE1BQzFMS1BkY2N3SURBUUFCbzRJQmhUQ0NBWUV3SFFZRFZSME9CQllFRk0xYmw1WDkxQ2VxNXlYeG5JZlcKOGdmWDBZYytNQjhHQTFVZEl3UVlNQmFBRkVsMHV3eGV1bnIrQWxUdmU2REdsY1lKZ0hDV01CSUdBMVVkRXdFQgovd1FJTUFZQkFmOENBUUF3REFZRFZSMGtCQVV3QTRBQkFEQU9CZ05WSFE4QkFmOEVCQU1DQVlZd1pnWURWUjBnCkJGOHdYVEFMQmdsZ2hrZ0JaUUlCQ3dVd0N3WUpZSVpJQVdVQ0FRc0pNQXNHQ1dDR1NBRmxBZ0VMRVRBTEJnbGcKaGtnQlpRSUJDeEl3Q3dZSllJWklBV1VDQVFzVE1Bd0dDbUNHU0FGbEF3SUJBeG93REFZS1lJWklBV1VEQWdFRApHekEzQmdOVkhSOEVNREF1TUN5Z0txQW9oaVpvZEhSd09pOHZZM0pzTG1ScGMyRXViV2xzTDJOeWJDOUVUMFJTClQwOVVRMEV5TG1OeWJEQnNCZ2dyQmdFRkJRY0JBUVJnTUY0d09nWUlLd1lCQlFVSE1BS0dMbWgwZEhBNkx5OWoKY213dVpHbHpZUzV0YVd3dmFYTnpkV1ZrZEc4dlJFOUVVazlQVkVOQk1sOUpWQzV3TjJNd0lBWUlLd1lCQlFVSApNQUdHRkdoMGRIQTZMeTl2WTNOd0xtUnBjMkV1Yldsc01BMEdDU3FHU0liM0RRRUJCUVVBQTRJQkFRQkZSaFgyCml6YVhtNVl1NG9tRHcybWJObzU5RVlBYUlUUUNjVUtiSzZwd2ttUllJQ3U4RHNqTE1WaGNpT2dlSzRmbjRPRkEKbVliTFhXQXRnU2tuTmMrSHVnYjRXRm9MV1NiM0VLWnM4b2NiL2ZSNGVKTE9Lb1kxUHVSQ3VvelM0eVpGUGV0OApSRkluWDhsN05RNDFaeXU0TzRRTnptY016NHBjdDBFKzduT2lzR0VqaDcvMjlRMFVtSVRQZWs2MGlWR0VCSXp6CnNramxjbFB6dTcrcUpzZU1GK2NJVitEVTVoRnRFalhaNUhQbjRmUzJCL0ZhMTV2a2JuQTlNdmt4akZZamdMYTYKWGIvM3pINXlZTjJiMjBGbHVDeFd5V0QyOVVLWFM1dnduWFZHbjRkK0xJdDVMUFhia2dZdDd1eGdHQ0lrWDJoYQpoUjBMNTFZejlxMy9zVnZtCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCnN1YmplY3Q9L0M9VVMvTz1VLlMuIEdvdmVybm1lbnQvT1U9RG9EL09VPVBLSS9DTj1ET0QgSUQgQ0EtMzkKaXNzdWVyPS9DPVVTL089VS5TLiBHb3Zlcm5tZW50L09VPURvRC9PVT1QS0kvQ049RG9EIFJvb3QgQ0EgMgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRXVEQ0NBNkNnQXdJQkFnSUNCOE13RFFZSktvWklodmNOQVFFRkJRQXdXekVMTUFrR0ExVUVCaE1DVlZNeApHREFXQmdOVkJBb1REMVV1VXk0Z1IyOTJaWEp1YldWdWRERU1NQW9HQTFVRUN4TURSRzlFTVF3d0NnWURWUVFMCkV3TlFTMGt4RmpBVUJnTlZCQU1URFVSdlJDQlNiMjkwSUVOQklESXdIaGNOTVRVeE1UQTVNVFF5TVRVM1doY04KTWpFeE1UQTRNVFF5TVRVM1dqQmFNUXN3Q1FZRFZRUUdFd0pWVXpFWU1CWUdBMVVFQ2hNUFZTNVRMaUJIYjNabApjbTV0Wlc1ME1Rd3dDZ1lEVlFRTEV3TkViMFF4RERBS0JnTlZCQXNUQTFCTFNURVZNQk1HQTFVRUF4TU1SRTlFCklFbEVJRU5CTFRNNU1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBeUh1a010Y1YKSTlNdVV2aEM1NUpsdGVBUHVnRkgwaUVsbnVPSDF1U1Q5RlFWd0N1ZUlnWkVYRlExSHRReUsvTi9EdDJuTTg5UQpGVDZsSjU1a0FQaEp0cVlwR1pZZGZyaXJ4V1JUTnppc1FJMkdvRFR6SUQ5aU1ZeGQ0d1Rpa0R2dVRwVjRIMHMxCnNVNnI5VXFkb3VSRk1aK1ByQ2xIeVRqaThQOVBySFk2K1lTU0xYdTc2ZkpnZktOZERCdElHYVVoVEE5Q01PWHYKVEpHSkxpWlR1VmlKb2JQOWhBRVd0Z2QvOEMyR0lkVHdiUVBiL1I3ZnNNL2pvSDk0SFg1OUEwMFE2cTJDT3oxSgpHNkxCL0dxdmZJR3BJeDJObUx4NmJlUkRRMU9wQ3MzbXpxVVRYbWZRcFpENnZ3ZVRYa3lJR3FsRWdhdjV5YWh2CnZqbTJQcDdPM1ZqYkV3SURBUUFCbzRJQmhUQ0NBWUV3SFFZRFZSME9CQllFRktyRGs5eHdEM2xST1FRZDVmOHAKNkJiSXJwUEdNQjhHQTFVZEl3UVlNQmFBRkVsMHV3eGV1bnIrQWxUdmU2REdsY1lKZ0hDV01CSUdBMVVkRXdFQgovd1FJTUFZQkFmOENBUUF3REFZRFZSMGtCQVV3QTRBQkFEQU9CZ05WSFE4QkFmOEVCQU1DQVlZd1pnWURWUjBnCkJGOHdYVEFMQmdsZ2hrZ0JaUUlCQ3dVd0N3WUpZSVpJQVdVQ0FRc0pNQXNHQ1dDR1NBRmxBZ0VMRVRBTEJnbGcKaGtnQlpRSUJDeEl3Q3dZSllJWklBV1VDQVFzVE1Bd0dDbUNHU0FGbEF3SUJBeG93REFZS1lJWklBV1VEQWdFRApHekEzQmdOVkhSOEVNREF1TUN5Z0txQW9oaVpvZEhSd09pOHZZM0pzTG1ScGMyRXViV2xzTDJOeWJDOUVUMFJTClQwOVVRMEV5TG1OeWJEQnNCZ2dyQmdFRkJRY0JBUVJnTUY0d09nWUlLd1lCQlFVSE1BS0dMbWgwZEhBNkx5OWoKY213dVpHbHpZUzV0YVd3dmFYTnpkV1ZrZEc4dlJFOUVVazlQVkVOQk1sOUpWQzV3TjJNd0lBWUlLd1lCQlFVSApNQUdHRkdoMGRIQTZMeTl2WTNOd0xtUnBjMkV1Yldsc01BMEdDU3FHU0liM0RRRUJCUVVBQTRJQkFRQ3Z4emRkCis3ZnlNK2V4aWluOHBMWUlBRGtKNHBVRW5PM3h4YXlxRXZpRmdEL2txeTZWSW5TSVdQK2VhalhzVEFIUXdzVWkKYVY5aThiYStlanBacGtVODNYZ3lXUjg3M1AwVnljZzRvMnBVZHgxamhYem9NcUVxL2laQnZWNlNFS3FIUm1LMwo4ZVowbXpBZXZBRTh2RWZyOG8xUnR3b1BPKzRVaDZwWnBCY2o0TldZZ0w5bCtDRG90bEtpdkFNSXkwbk4rTkZKCjRTcVBXWE9EaG1GbEJzQ3RHWTBzSldSV245c0dpMGthRVUwc095cWZTbkd3Y2hUUzM0RDdNdWFEWWs3VXNneDMKU3RvL0NwcDdzY21Ic1ZxNTZldm9uOVlIVnhjbFQzTm9XS3k5SEh4c01JalZWQUVHcFhPWjA1TFlXNk8wMkVkcwpvWi8wVURzYThBOGFWNWFMCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCnN1YmplY3Q9L0M9VVMvTz1VLlMuIEdvdmVybm1lbnQvT1U9RG9EL09VPVBLSS9DTj1ET0QgRU1BSUwgQ0EtNDAKaXNzdWVyPS9DPVVTL089VS5TLiBHb3Zlcm5tZW50L09VPURvRC9PVT1QS0kvQ049RG9EIFJvb3QgQ0EgMgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRXV6Q0NBNk9nQXdJQkFnSUNCOEl3RFFZSktvWklodmNOQVFFRkJRQXdXekVMTUFrR0ExVUVCaE1DVlZNeApHREFXQmdOVkJBb1REMVV1VXk0Z1IyOTJaWEp1YldWdWRERU1NQW9HQTFVRUN4TURSRzlFTVF3d0NnWURWUVFMCkV3TlFTMGt4RmpBVUJnTlZCQU1URFVSdlJDQlNiMjkwSUVOQklESXdIaGNOTVRVeE1UQTVNVFF4T0RReldoY04KTWpFeE1UQTRNVFF4T0RReldqQmRNUXN3Q1FZRFZRUUdFd0pWVXpFWU1CWUdBMVVFQ2hNUFZTNVRMaUJIYjNabApjbTV0Wlc1ME1Rd3dDZ1lEVlFRTEV3TkViMFF4RERBS0JnTlZCQXNUQTFCTFNURVlNQllHQTFVRUF4TVBSRTlFCklFVk5RVWxNSUVOQkxUUXdNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXpOamcKTzZYTU5Yc1hxT1BFazlRN1ptUzhvM0pOYjFOaG12QzVocGZSdUE3R1VEVDBlRkpZdDB1V2dNcUZkU3ZNVHJScwpKVzg2UmZXbnVBejlkbnN6Z1VQY2ZpbXArNkxOeTN5RWIvTlVXUVhpaVlDS211RExvOFlXa2tmem9NSUF6VkgrCkR5Kyt3emM3bE9uZ201WmdEemRWdUdkL1FSUTg4MEh5SjlIWW5KRmtNVDl2WHZsYllETjdIb3BJV0pudHBlYWEKdHF1ZHdtMjlJejN3cTYvd2JhOHREZDZhV25Pd2ZSZkw5dUNlOEVHdXc0eEpoMXV2cEZmTXEyTjVHaFVJYjZrUwpxNGdhaSt0K2IyY2ZOSjJPSXdLUW55c2ZjTzVrSm5lMVphNG9JN0dQMDNJRHRSeXlndkJBTk9UckJueEtVaE1YCk1qYkN4UnhOR202L0dKQ3o1UUlEQVFBQm80SUJoVENDQVlFd0hRWURWUjBPQkJZRUZKdUJ0cUpaaSszcGdCL3cKSnoxWEJUNkpMN2JNTUI4R0ExVWRJd1FZTUJhQUZFbDB1d3hldW5yK0FsVHZlNkRHbGNZSmdIQ1dNQklHQTFVZApFd0VCL3dRSU1BWUJBZjhDQVFBd0RBWURWUjBrQkFVd0E0QUJBREFPQmdOVkhROEJBZjhFQkFNQ0FZWXdaZ1lEClZSMGdCRjh3WFRBTEJnbGdoa2dCWlFJQkN3VXdDd1lKWUlaSUFXVUNBUXNKTUFzR0NXQ0dTQUZsQWdFTEVUQUwKQmdsZ2hrZ0JaUUlCQ3hJd0N3WUpZSVpJQVdVQ0FRc1RNQXdHQ21DR1NBRmxBd0lCQXhvd0RBWUtZSVpJQVdVRApBZ0VER3pBM0JnTlZIUjhFTURBdU1DeWdLcUFvaGlab2RIUndPaTh2WTNKc0xtUnBjMkV1Yldsc0wyTnliQzlFClQwUlNUMDlVUTBFeUxtTnliREJzQmdnckJnRUZCUWNCQVFSZ01GNHdPZ1lJS3dZQkJRVUhNQUtHTG1oMGRIQTYKTHk5amNtd3VaR2x6WVM1dGFXd3ZhWE56ZFdWa2RHOHZSRTlFVWs5UFZFTkJNbDlKVkM1d04yTXdJQVlJS3dZQgpCUVVITUFHR0ZHaDBkSEE2THk5dlkzTndMbVJwYzJFdWJXbHNNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUJBUUF2CnR5NXVHN3FjYm16VDJoVTFyaUMzV1VGN2ZZTjZxQ1JCR1JlMWJlemlacXI3TldzSllVV0R1OWlJdkhUUnNYZEkKU2dZZ3Rxc2VCbDl6Q21ZNDlpeVhXQk9zMjZSRjZDeVZPT2k5Y0RQTXp6dVhIZnNyRlJybGdvdHZnSS9JeEprdApESDQxR2JrRm14L3laWGtDZDh3RU01VWQ3R3k2MXpxdUV2RDFxc1lNOHFVdURDY1Qwc0I3MG5qS1ErRVRLUUJXCnVRZHFSRHlVU0hibkZaYUhTOC91R3BDTDkzaWU5dlZSSkVCdUdsMGZnSlhibFhEY0pzTTBZT1ZnTEltR0N4bmsKbGZXQ2FJQTdRdGtXbWQyNDlQUFIrS2dNMFdXK1FYSExFc1VMbzVpVXJaeE9nUFVvbzRhdUxSL0FsazRLRm1xbAo4QUplajJ6OWlNbWc2SmIxQmJHMQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpzdWJqZWN0PS9DPVVTL089VS5TLiBHb3Zlcm5tZW50L09VPURvRC9PVT1QS0kvQ049RE9EIEVNQUlMIENBLTM5Cmlzc3Vlcj0vQz1VUy9PPVUuUy4gR292ZXJubWVudC9PVT1Eb0QvT1U9UEtJL0NOPURvRCBSb290IENBIDIKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUV1ekNDQTZPZ0F3SUJBZ0lDQjhFd0RRWUpLb1pJaHZjTkFRRUZCUUF3V3pFTE1Ba0dBMVVFQmhNQ1ZWTXgKR0RBV0JnTlZCQW9URDFVdVV5NGdSMjkyWlhKdWJXVnVkREVNTUFvR0ExVUVDeE1EUkc5RU1Rd3dDZ1lEVlFRTApFd05RUzBreEZqQVVCZ05WQkFNVERVUnZSQ0JTYjI5MElFTkJJREl3SGhjTk1UVXhNVEE1TVRReE5EUTNXaGNOCk1qRXhNVEE0TVRReE5EUTNXakJkTVFzd0NRWURWUVFHRXdKVlV6RVlNQllHQTFVRUNoTVBWUzVUTGlCSGIzWmwKY201dFpXNTBNUXd3Q2dZRFZRUUxFd05FYjBReEREQUtCZ05WQkFzVEExQkxTVEVZTUJZR0ExVUVBeE1QUkU5RQpJRVZOUVVsTUlFTkJMVE01TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUFzL0dnCnZkaWc3WDhhamZnaTFpcUhXTTNuK0dHb3F0OWNRd0dmT1Jib3dnakh3SURiN3ROUXFNUFJHMnBWWVNsU1Q1bmwKTmtvZStYUlRJL3ZoRXhNUll2VERrQm14Y0ZwSEFtaTRsVkZlWUhmR1l2WW43QWk5U25kYlRsSzRHOHR4OUJQdQpyWWpySTd6K1RZZGxOZmN4Y3FVOVp1czNMN1ZTam80Tnovb0d1MVFQZFozZTVXMjdtckJyR1ZvZGhZckdkOXpiCnZjbHpER0twQU5mcnJGNldtMC90MDcvajJvcFl1WERycDNDU1ZQZ0hYUkNMdWVESit4eUl0aDhvWi91cTdsMXUKTzJhKzR4aXhDUXB1R25UalZmQmtDMTlqU0c4V3lsS244Y3JkdVZQTENtUlRwNjVJWGdUQkFWNmdwanRhMXZlQQo4K2hGTEdzd3NTS3pWVHkyWXdJREFRQUJvNElCaFRDQ0FZRXdIUVlEVlIwT0JCWUVGS3lkK01STWM2QkRYd2dsCmZVWVBaUnZMb0xDQU1COEdBMVVkSXdRWU1CYUFGRWwwdXd4ZXVucitBbFR2ZTZER2xjWUpnSENXTUJJR0ExVWQKRXdFQi93UUlNQVlCQWY4Q0FRQXdEQVlEVlIwa0JBVXdBNEFCQURBT0JnTlZIUThCQWY4RUJBTUNBWVl3WmdZRApWUjBnQkY4d1hUQUxCZ2xnaGtnQlpRSUJDd1V3Q3dZSllJWklBV1VDQVFzSk1Bc0dDV0NHU0FGbEFnRUxFVEFMCkJnbGdoa2dCWlFJQkN4SXdDd1lKWUlaSUFXVUNBUXNUTUF3R0NtQ0dTQUZsQXdJQkF4b3dEQVlLWUlaSUFXVUQKQWdFREd6QTNCZ05WSFI4RU1EQXVNQ3lnS3FBb2hpWm9kSFJ3T2k4dlkzSnNMbVJwYzJFdWJXbHNMMk55YkM5RQpUMFJTVDA5VVEwRXlMbU55YkRCc0JnZ3JCZ0VGQlFjQkFRUmdNRjR3T2dZSUt3WUJCUVVITUFLR0xtaDBkSEE2Ckx5OWpjbXd1WkdsellTNXRhV3d2YVhOemRXVmtkRzh2UkU5RVVrOVBWRU5CTWw5SlZDNXdOMk13SUFZSUt3WUIKQlFVSE1BR0dGR2gwZEhBNkx5OXZZM053TG1ScGMyRXViV2xzTUEwR0NTcUdTSWIzRFFFQkJRVUFBNElCQVFDYQo4UW9CTDFJVmhjaSt4ZTFybk8yaEpsTW5LS1d3c1JYbXhDMHFxK3NTcWRFY3EwaG13REZsUWVLeUk3aEJ5cDYwCjlKK2k1eWh1NWViT0hHc1F1VTcxL0VOTUFNT2N6VVl0K01ZSm9jR2N3ZTFnMWIvWFp0WnNoZ285TjZHd3JsbnkKV0Z3YnI1Q25YNnlzd29vQm1VbDB4ZFl2Y2QvWlo2LzVkanVWVXU0bjYvYkl3YldjcWtreUVEUEdHRk5YeGVuVApEdVMzQmdSQWFnZ3lNY05oUU5kSDNnY2M4RGJRNTdsQjU3dUJOTzBjSGNhVmEyTmsrVEd0M2VSb0xUZXFOSG9TCjRaUWJnOXY0T2hBWkp0d2hLeWRDdHhaQWNIY3hMMnFGWE1pVDJvdHMvTm1XWnlTM3NKcVNnV2N6NzdhMnhSRWIKaXM3TDJzTTgvZjlsRG5weW15dXoKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKc3ViamVjdD0vQz1VUy9PPVUuUy4gR292ZXJubWVudC9PVT1Eb0QvT1U9UEtJL0NOPURPRCBJRCBTVyBDQS0zNgppc3N1ZXI9L0M9VVMvTz1VLlMuIEdvdmVybm1lbnQvT1U9RG9EL09VPVBLSS9DTj1Eb0QgUm9vdCBDQSAyCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFdXpDQ0E2T2dBd0lCQWdJQ0I2RXdEUVlKS29aSWh2Y05BUUVGQlFBd1d6RUxNQWtHQTFVRUJoTUNWVk14CkdEQVdCZ05WQkFvVEQxVXVVeTRnUjI5MlpYSnViV1Z1ZERFTU1Bb0dBMVVFQ3hNRFJHOUVNUXd3Q2dZRFZRUUwKRXdOUVMwa3hGakFVQmdOVkJBTVREVVJ2UkNCU2IyOTBJRU5CSURJd0hoY05NVFV3T1RJek1UTTBORFF5V2hjTgpNakV3T1RJeU1UTTBORFF5V2pCZE1Rc3dDUVlEVlFRR0V3SlZVekVZTUJZR0ExVUVDaE1QVlM1VExpQkhiM1psCmNtNXRaVzUwTVF3d0NnWURWUVFMRXdORWIwUXhEREFLQmdOVkJBc1RBMUJMU1RFWU1CWUdBMVVFQXhNUFJFOUUKSUVsRUlGTlhJRU5CTFRNMk1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBdG5rVwpZNkFsRCtNM2ppVmY5dmhzb2RzTEZHbm9pWWkzZFFvc2VpYk9yUFNVNTU1RnQvNUdIR21qK25DWFc5dHdSbUdwCkFja3d6V2FrTlI2bnlEaDU2YzVPaEp4V0tFZzU5NEIyaTlTQm1UWGljVHpCUGEzdFpOb0poNk1sNi9PZmNoK0cKWFI5dS9GRmREV3M3dWJFRjJLN3U4Mk1RVXNZaWYrdGVQUkFzc0kwQ1RvR1BGNVNQdzMrQ2NpakZ3WTczSkZGeQpteTU1Z1p0YjlqaUVFcDFhV3JJZ0o5bkpjenlXYkZPVjE1STV0WlBRaVdsYVhxMEJHRmgxaEppVEdoZ0dzM2ZaCkgreXFNbU9MOTFNc2I5dTk5VEFyNFI0QTZ5RFYvczMxM0prVjRrV0lKMUNOU1BaSHNYT1k1V1hqNnpxL0NEaE0KSnFvelVicmVKUkVGYWRBZnd3SURBUUFCbzRJQmhUQ0NBWUV3SFFZRFZSME9CQllFRkdjYU5qeTZ1MitGQStjagppSzNGWjVDbFRMcUVNQjhHQTFVZEl3UVlNQmFBRkVsMHV3eGV1bnIrQWxUdmU2REdsY1lKZ0hDV01CSUdBMVVkCkV3RUIvd1FJTUFZQkFmOENBUUF3REFZRFZSMGtCQVV3QTRBQkFEQU9CZ05WSFE4QkFmOEVCQU1DQVlZd1pnWUQKVlIwZ0JGOHdYVEFMQmdsZ2hrZ0JaUUlCQ3dVd0N3WUpZSVpJQVdVQ0FRc0pNQXNHQ1dDR1NBRmxBZ0VMRVRBTApCZ2xnaGtnQlpRSUJDeEl3Q3dZSllJWklBV1VDQVFzVE1Bd0dDbUNHU0FGbEF3SUJBeG93REFZS1lJWklBV1VECkFnRURHekEzQmdOVkhSOEVNREF1TUN5Z0txQW9oaVpvZEhSd09pOHZZM0pzTG1ScGMyRXViV2xzTDJOeWJDOUUKVDBSU1QwOVVRMEV5TG1OeWJEQnNCZ2dyQmdFRkJRY0JBUVJnTUY0d09nWUlLd1lCQlFVSE1BS0dMbWgwZEhBNgpMeTlqY213dVpHbHpZUzV0YVd3dmFYTnpkV1ZrZEc4dlJFOUVVazlQVkVOQk1sOUpWQzV3TjJNd0lBWUlLd1lCCkJRVUhNQUdHRkdoMGRIQTZMeTl2WTNOd0xtUnBjMkV1Yldsc01BMEdDU3FHU0liM0RRRUJCUVVBQTRJQkFRQjcKcjRSR2xWS3ZkcWVDQW9FcnB2VzEwV1JQSW40bW1NSmJPd3p3ZmdMUHpHS3ZuTlFSMENXUFdnYjhZN1FaWXRJVApjYkJjV0U4YXdad0IrT1dEZ1RPb3hyRDArZXVPdzJDdlpnMzZaMFA3bWJTNElGNkVseERkL3R6dzVIcXI4dmt3CmhIL0YyZjZrNyt0UnpudDQrY01Rd0ptSURLR3dvWiszQXRkN0NLY291QnpYWkxjTkViYm9oSkY1ejU0RVl3UlUKSjVhZ1BjblRaTUJEa1FmU3M5a3UxblByR1FmQVRFQnliTFRBZTMxdW50TTZvTXpNSHc4UFluM1NoN3hXVENERwpTRlNuUFloemxOS2RNYjhCS2kzc3BWT3h0NnQzVkh6TlhEbzhGWFJiTnBCWS9mUzdSQW1IUFByejVwYTlLTnRKCmNLRU5tSXFRNVFiakIvUDhVWDNpCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCnN1YmplY3Q9L0M9VVMvTz1VLlMuIEdvdmVybm1lbnQvT1U9RG9EL09VPVBLSS9DTj1ET0QgRU1BSUwgQ0EtMzQKaXNzdWVyPS9DPVVTL089VS5TLiBHb3Zlcm5tZW50L09VPURvRC9PVT1QS0kvQ049RG9EIFJvb3QgQ0EgMgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRXV6Q0NBNk9nQXdJQkFnSUNCNkF3RFFZSktvWklodmNOQVFFRkJRQXdXekVMTUFrR0ExVUVCaE1DVlZNeApHREFXQmdOVkJBb1REMVV1VXk0Z1IyOTJaWEp1YldWdWRERU1NQW9HQTFVRUN4TURSRzlFTVF3d0NnWURWUVFMCkV3TlFTMGt4RmpBVUJnTlZCQU1URFVSdlJDQlNiMjkwSUVOQklESXdIaGNOTVRVd09USXpNVE0wTVRVMFdoY04KTWpFd09USXlNVE0wTVRVMFdqQmRNUXN3Q1FZRFZRUUdFd0pWVXpFWU1CWUdBMVVFQ2hNUFZTNVRMaUJIYjNabApjbTV0Wlc1ME1Rd3dDZ1lEVlFRTEV3TkViMFF4RERBS0JnTlZCQXNUQTFCTFNURVlNQllHQTFVRUF4TVBSRTlFCklFVk5RVWxNSUVOQkxUTTBNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQWw5clAKSnlGM0ZNbFRrYlVDYnlSYkhQR2ZkOUs3UktkbW5DRTI1N2Voc05tN25NN1E5enhjOFNwYlRTRGJPYVAzV3FvdgpTNWJtc1NFK2xlV1IvTWhUR1Y0Vk1LenRabWtHZWE4V1lkNXpvb3orT3JtZnVveEVvQ3k1Q2l5YStSVCt3TE93CkgwQXBENGRvSWtya1pkMlEyWkplTC84cEREajFoUEFNTHBUZkpiZWtOc1EzaHNXbktwN0FXVnNsaVk0bFI4dTAKUlltWDRMSFlNNWhOK3FmNnVpT0xLNlUvcGNYY3lSYTN5bXhpcXEwZ2tWS3F6eWJxS2psRjRKdWNVVTl6VGMvUgpjbTJYU1FFRmw1bmlHSTFZUlJjcndHZGw4OFRFWXFjRDhMZnFBZkt0Vkh2S3k2blE0OUwyUzhxWFFpN3A5RG1CCmJHZjBjOWdaRnhHMlNBbzE5d0lEQVFBQm80SUJoVENDQVlFd0hRWURWUjBPQkJZRUZBK0dXWDdqK3VjVCt6RTcKd1RrTWZHQ0xRTUxkTUI4R0ExVWRJd1FZTUJhQUZFbDB1d3hldW5yK0FsVHZlNkRHbGNZSmdIQ1dNQklHQTFVZApFd0VCL3dRSU1BWUJBZjhDQVFBd0RBWURWUjBrQkFVd0E0QUJBREFPQmdOVkhROEJBZjhFQkFNQ0FZWXdaZ1lEClZSMGdCRjh3WFRBTEJnbGdoa2dCWlFJQkN3VXdDd1lKWUlaSUFXVUNBUXNKTUFzR0NXQ0dTQUZsQWdFTEVUQUwKQmdsZ2hrZ0JaUUlCQ3hJd0N3WUpZSVpJQVdVQ0FRc1RNQXdHQ21DR1NBRmxBd0lCQXhvd0RBWUtZSVpJQVdVRApBZ0VER3pBM0JnTlZIUjhFTURBdU1DeWdLcUFvaGlab2RIUndPaTh2WTNKc0xtUnBjMkV1Yldsc0wyTnliQzlFClQwUlNUMDlVUTBFeUxtTnliREJzQmdnckJnRUZCUWNCQVFSZ01GNHdPZ1lJS3dZQkJRVUhNQUtHTG1oMGRIQTYKTHk5amNtd3VaR2x6WVM1dGFXd3ZhWE56ZFdWa2RHOHZSRTlFVWs5UFZFTkJNbDlKVkM1d04yTXdJQVlJS3dZQgpCUVVITUFHR0ZHaDBkSEE2THk5dlkzTndMbVJwYzJFdWJXbHNNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUJBUUJVCjlDOXkwMy81YlQvSTA5Y2ZCVEpEaGdQNXpvRm00NXhUemZBNDdFTmc5emo3Vm50RVVHOUtINGxrZ25JeHJEK3AKaHg1a0daZ3B4SzIxOE1XbFFLV3V0WXRyRmVlUytSQmlzeVZFR0V0RjJKallFbVE0ZFVBT2ZWRXkyaUUvNmpsZwo3SldCM25QTkNWWWpXc3ZZQXdydGNpY2xNL3hkQWJ1Qm0xdmFsbjVURkd3cDNVUU5NZmtiaVlzNmx1VnViUG1PCjc2MHJ1ekNKeUR3Y09vcGJyYVpKM0JOcU1WYlBITDY4YXhwazhtS0U4M2s2V2dxTVlJRXNvbEEyRjk1T1NQdUIKKzNqakM2VTBmZWhTejVVZDR4bUZkRlY0QWlXNm1nQ1l5MVJaeHdQTzdIb3Z4alJzK3RnOFV0d2NPam5WQlBwTQo1UWg4KzhCRVVzN3NqS2xvdzF0SAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpzdWJqZWN0PS9DPVVTL089VS5TLiBHb3Zlcm5tZW50L09VPURvRC9PVT1QS0kvQ049RE9EIElEIENBLTM0Cmlzc3Vlcj0vQz1VUy9PPVUuUy4gR292ZXJubWVudC9PVT1Eb0QvT1U9UEtJL0NOPURvRCBSb290IENBIDIKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUV1RENDQTZDZ0F3SUJBZ0lDQjU4d0RRWUpLb1pJaHZjTkFRRUZCUUF3V3pFTE1Ba0dBMVVFQmhNQ1ZWTXgKR0RBV0JnTlZCQW9URDFVdVV5NGdSMjkyWlhKdWJXVnVkREVNTUFvR0ExVUVDeE1EUkc5RU1Rd3dDZ1lEVlFRTApFd05RUzBreEZqQVVCZ05WQkFNVERVUnZSQ0JTYjI5MElFTkJJREl3SGhjTk1UVXdPVEl6TVRNME1ETXdXaGNOCk1qRXdPVEl5TVRNME1ETXdXakJhTVFzd0NRWURWUVFHRXdKVlV6RVlNQllHQTFVRUNoTVBWUzVUTGlCSGIzWmwKY201dFpXNTBNUXd3Q2dZRFZRUUxFd05FYjBReEREQUtCZ05WQkFzVEExQkxTVEVWTUJNR0ExVUVBeE1NUkU5RQpJRWxFSUVOQkxUTTBNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXo3QXQvd01NCnFwSTU2c1JyUWxwaHl0N2hUVVlpdFFtYTJqWUhST2NVcWFST2NxVzdRK3NaUXVINWxFTkxsUlA2eGQvbUlZYWMKK3czOTBFMmtQYk1Rd0E0NnliMzk5TFR2ZTdwSm9ldWtkZk5VaGdMdEJKMVI5S2czSVJKaGdyOEo5dm5ZNW01Uwp5K01zR0tod0E1WEhjR3RKdEMwTmlLWXV4bnFacEhwYTRwREhORmFSUUZsK25rYTEySzE1cXhQZ3lmNitybzRtCkxISmNEMk1rL0tFODJFVGxCZ0k1VFJ4eFNWTGVPOVBuRlBjTnlMTXhEMklLZS8xemRvSFRwRFU2bElFamxuMnYKMjJRTjJJYnIxSEJ3T0FDd0lUV2VNTXI5dFVnMmZRdElCekxreWJKYld4Z285SjVrUHBvcVFpaDJFbzZaS2t5NQpkU2RjdU9RcndyMk9Zd0lEQVFBQm80SUJoVENDQVlFd0hRWURWUjBPQkJZRUZCZ2tUTDFXbG8vRXlPUDlCV1dMCm1JamppSERHTUI4R0ExVWRJd1FZTUJhQUZFbDB1d3hldW5yK0FsVHZlNkRHbGNZSmdIQ1dNQklHQTFVZEV3RUIKL3dRSU1BWUJBZjhDQVFBd0RBWURWUjBrQkFVd0E0QUJBREFPQmdOVkhROEJBZjhFQkFNQ0FZWXdaZ1lEVlIwZwpCRjh3WFRBTEJnbGdoa2dCWlFJQkN3VXdDd1lKWUlaSUFXVUNBUXNKTUFzR0NXQ0dTQUZsQWdFTEVUQUxCZ2xnCmhrZ0JaUUlCQ3hJd0N3WUpZSVpJQVdVQ0FRc1RNQXdHQ21DR1NBRmxBd0lCQXhvd0RBWUtZSVpJQVdVREFnRUQKR3pBM0JnTlZIUjhFTURBdU1DeWdLcUFvaGlab2RIUndPaTh2WTNKc0xtUnBjMkV1Yldsc0wyTnliQzlFVDBSUwpUMDlVUTBFeUxtTnliREJzQmdnckJnRUZCUWNCQVFSZ01GNHdPZ1lJS3dZQkJRVUhNQUtHTG1oMGRIQTZMeTlqCmNtd3VaR2x6WVM1dGFXd3ZhWE56ZFdWa2RHOHZSRTlFVWs5UFZFTkJNbDlKVkM1d04yTXdJQVlJS3dZQkJRVUgKTUFHR0ZHaDBkSEE2THk5dlkzTndMbVJwYzJFdWJXbHNNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUJBUUFHeHlwcgo5bWJRdmRZMnRoQ0ozQU5EdUluMU1LOEloaVgzV2U1am9Cc2htVGNmaDcxREZLc052VXBzNEJQZGpmTkdjSG5nCkNUbGdId2U0TUVzTnpVcFNrRDNlMm5tN2pQcmlYaDR0Ukw1UkpGRUs2eXhETCtrM0xUTDBjL2dWampoc25ab2kKbXIyYThKb1d5RFVWZFVKbUhseTRNNkd0RFd3Mmw2Q2lFcm8zTHYzcEV1VVJyZ0UrZGVtcTNXTWhiNUladzcrTgpaaTRHYXBkT05YL2ErZTMwMjhIOUtWT0MySWJmSDlGWkdoTDk2ZzVZdEFTZCt0d0t5ZEFlbjYxTkU0OXdZWnFaCnJuMEUyUHl3UVNxWmppdWlFTTlGM1FOekdWZDlnZXV4NFRJWXZ6eVFsMHl3V2tpbVpsQ1FQa1FVZS9oT1VkWlcKTUZKZkF5OEVXOHo0WHNQYwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpzdWJqZWN0PS9DPVVTL089VS5TLiBHb3Zlcm5tZW50L09VPURvRC9PVT1QS0kvQ049RE9EIElEIFNXIENBLTM1Cmlzc3Vlcj0vQz1VUy9PPVUuUy4gR292ZXJubWVudC9PVT1Eb0QvT1U9UEtJL0NOPURvRCBSb290IENBIDIKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUV1ekNDQTZPZ0F3SUJBZ0lDQjU0d0RRWUpLb1pJaHZjTkFRRUZCUUF3V3pFTE1Ba0dBMVVFQmhNQ1ZWTXgKR0RBV0JnTlZCQW9URDFVdVV5NGdSMjkyWlhKdWJXVnVkREVNTUFvR0ExVUVDeE1EUkc5RU1Rd3dDZ1lEVlFRTApFd05RUzBreEZqQVVCZ05WQkFNVERVUnZSQ0JTYjI5MElFTkJJREl3SGhjTk1UVXdPVEl6TVRNek56VXdXaGNOCk1qRXdPVEl5TVRNek56VXdXakJkTVFzd0NRWURWUVFHRXdKVlV6RVlNQllHQTFVRUNoTVBWUzVUTGlCSGIzWmwKY201dFpXNTBNUXd3Q2dZRFZRUUxFd05FYjBReEREQUtCZ05WQkFzVEExQkxTVEVZTUJZR0ExVUVBeE1QUkU5RQpJRWxFSUZOWElFTkJMVE0xTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUFpdlhZCmVEUDhHSkIrYW80emxhL1VFdEpES0VmbHdPU2RhOGtHeGtmYno5bU1MUUZCMGlhbUhhK2cvbGRndWxJVXIvcHIKdXBVYjk1OVEyaTI2R3JXSFJvemdXbmlPZExVNi9YNFpRbmljMmNNOGVqaXQ5VEs0NWpHbXI5S3JrNytHdnQraQpYdERIVFZBUUt5VkpPS0JaeWV4RkUvekJlR2pFdjVkNHRuTHkycmpxcmdmc2tYVEFZVEJKZk9rSnZIb2dtdVAyCmhyTWNFa0MvYjZMWUFBRnk3b2JWZG1aY3Y3QjljNGJyem1sNlpkVy9IanAvUzlaK3FZK1duRHIraG5iTjBPYysKcXhBYXhaeFk3a01CTUJDRU1YSDl3Qm5HRkVWUTBDRlc5MTh6WUtYYUlEaXprY01DQzdHbE9SS0duUWgzZ3hLbgpyN05PYzVtU2xWSzZXNWF6OXdJREFRQUJvNElCaFRDQ0FZRXdIUVlEVlIwT0JCWUVGTjdDUm1QSkIvV3NFaHlxCm1SRWRIK3BUNWxReU1COEdBMVVkSXdRWU1CYUFGRWwwdXd4ZXVucitBbFR2ZTZER2xjWUpnSENXTUJJR0ExVWQKRXdFQi93UUlNQVlCQWY4Q0FRQXdEQVlEVlIwa0JBVXdBNEFCQURBT0JnTlZIUThCQWY4RUJBTUNBWVl3WmdZRApWUjBnQkY4d1hUQUxCZ2xnaGtnQlpRSUJDd1V3Q3dZSllJWklBV1VDQVFzSk1Bc0dDV0NHU0FGbEFnRUxFVEFMCkJnbGdoa2dCWlFJQkN4SXdDd1lKWUlaSUFXVUNBUXNUTUF3R0NtQ0dTQUZsQXdJQkF4b3dEQVlLWUlaSUFXVUQKQWdFREd6QTNCZ05WSFI4RU1EQXVNQ3lnS3FBb2hpWm9kSFJ3T2k4dlkzSnNMbVJwYzJFdWJXbHNMMk55YkM5RQpUMFJTVDA5VVEwRXlMbU55YkRCc0JnZ3JCZ0VGQlFjQkFRUmdNRjR3T2dZSUt3WUJCUVVITUFLR0xtaDBkSEE2Ckx5OWpjbXd1WkdsellTNXRhV3d2YVhOemRXVmtkRzh2UkU5RVVrOVBWRU5CTWw5SlZDNXdOMk13SUFZSUt3WUIKQlFVSE1BR0dGR2gwZEhBNkx5OXZZM053TG1ScGMyRXViV2xzTUEwR0NTcUdTSWIzRFFFQkJRVUFBNElCQVFDVwpGOHJ2S3l4N1l0bk10b25WL0x5UFhVSHBDbkZiR2VnOGRyWjdxTktMVnh4THJhVkJTczZyUXoxWGlLVGN5enB1CnpZZlB5RElIdnhhdWdrSmczY0wvb3J1S0ozR1ovd3hRZE56Y2xqZmhBY3B1ejBCQ3Yzbkd6SHkya2hBb0ZiZHMKWmJqVGVlUDE4OW9rR0Y4aFY5V3YwakltZnZnQXlRSlY0U3ZlN0tCUXZ3d0JKUlJMQTkyV1RQbWtiU2kvTHRPNwoyRnlPaXVvYVJBNjh4bXB0UGlMMXhqYXAwZkhKZm92czZpbUFHbDhEdVZFUkRzdVBpTm9RenNERGtQYU5ROWorCi9zQUZzemxhYXRGSUJLVG1aMGhXazlQSG5TTGI1dmxQMXp5Rkp1VVNLNkFiNXMwaldVRmVkL1lHQ1BhbFFTeXMKYUJSTDlTSmxBOEhoRzg0WXdsMnEKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKc3ViamVjdD0vQz1VUy9PPVUuUy4gR292ZXJubWVudC9PVT1Eb0QvT1U9UEtJL0NOPURPRCBFTUFJTCBDQS0zMwppc3N1ZXI9L0M9VVMvTz1VLlMuIEdvdmVybm1lbnQvT1U9RG9EL09VPVBLSS9DTj1Eb0QgUm9vdCBDQSAyCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFdXpDQ0E2T2dBd0lCQWdJQ0I1MHdEUVlKS29aSWh2Y05BUUVGQlFBd1d6RUxNQWtHQTFVRUJoTUNWVk14CkdEQVdCZ05WQkFvVEQxVXVVeTRnUjI5MlpYSnViV1Z1ZERFTU1Bb0dBMVVFQ3hNRFJHOUVNUXd3Q2dZRFZRUUwKRXdOUVMwa3hGakFVQmdOVkJBTVREVVJ2UkNCU2IyOTBJRU5CSURJd0hoY05NVFV3T1RJek1UTXpORFUzV2hjTgpNakV3T1RJeU1UTXpORFUzV2pCZE1Rc3dDUVlEVlFRR0V3SlZVekVZTUJZR0ExVUVDaE1QVlM1VExpQkhiM1psCmNtNXRaVzUwTVF3d0NnWURWUVFMRXdORWIwUXhEREFLQmdOVkJBc1RBMUJMU1RFWU1CWUdBMVVFQXhNUFJFOUUKSUVWTlFVbE1JRU5CTFRNek1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBd1NLUwpiVmpXQ0c1SjZNTnhoWWYxRkFpWG5IdVpGVk1aMGIzWFRWOXJFOTQ0eU9mS0JHVDc2ZENCSUF2ZWdNQjJIcUIyCmlqWC9NRTVKQjZvL1lLSEhxMURmV1RLS2lCYysrMFB1MkwvNUVHUWZxTU1FcjdlNDRobXlkempWcklmTSsxL3MKd1Y4QytrVHFEdEs2Q25RaW8vRTRzS25BTHdjTUtpNlFoZE5vdEdSdUhQUXpZRnZ1M0NYV2hla2ljNmhENHJGSwpqS0toaTkyZjAwbk1HczJ1S3RrSFpaL3pmcVpxaTBCMW5nRE1JTzJua2x6OE1JbEh0dXl5NmFWZTFramQ3ai96CjdyWUJJU0MwdTdNdEg3bkRXWFRTOUgvamVyNy9OUEg2SnY4NGV1SHdZWm9pVytYSnNWK24zOU42ZlV6NkEzREgKVkVqZGx0T3ZlZUNCQzFMSThRSURBUUFCbzRJQmhUQ0NBWUV3SFFZRFZSME9CQllFRkJWbHpmMHRrQlpLci93NApsd0RjNmtPdzN5Q1hNQjhHQTFVZEl3UVlNQmFBRkVsMHV3eGV1bnIrQWxUdmU2REdsY1lKZ0hDV01CSUdBMVVkCkV3RUIvd1FJTUFZQkFmOENBUUF3REFZRFZSMGtCQVV3QTRBQkFEQU9CZ05WSFE4QkFmOEVCQU1DQVlZd1pnWUQKVlIwZ0JGOHdYVEFMQmdsZ2hrZ0JaUUlCQ3dVd0N3WUpZSVpJQVdVQ0FRc0pNQXNHQ1dDR1NBRmxBZ0VMRVRBTApCZ2xnaGtnQlpRSUJDeEl3Q3dZSllJWklBV1VDQVFzVE1Bd0dDbUNHU0FGbEF3SUJBeG93REFZS1lJWklBV1VECkFnRURHekEzQmdOVkhSOEVNREF1TUN5Z0txQW9oaVpvZEhSd09pOHZZM0pzTG1ScGMyRXViV2xzTDJOeWJDOUUKVDBSU1QwOVVRMEV5TG1OeWJEQnNCZ2dyQmdFRkJRY0JBUVJnTUY0d09nWUlLd1lCQlFVSE1BS0dMbWgwZEhBNgpMeTlqY213dVpHbHpZUzV0YVd3dmFYTnpkV1ZrZEc4dlJFOUVVazlQVkVOQk1sOUpWQzV3TjJNd0lBWUlLd1lCCkJRVUhNQUdHRkdoMGRIQTZMeTl2WTNOd0xtUnBjMkV1Yldsc01BMEdDU3FHU0liM0RRRUJCUVVBQTRJQkFRQTAKYU44Uk5kRUFYT3gwV3FXS21Kb0J0Mnk4TEp2MUVZYmhTV29VUCtVME9MVFBwa3J6MG5INC92Ui9FWXRwa2JIVgpLT0FsWFd6bHlDaWdNSThzcFJVS3VBdHB5cTRCRkU0a3BwTDhqQmM5NzdvTFBURnUvWHcrSHcxVTJXMDdmTDhuClZieHhZUVpsdHJNdTZ5WXp0Sy9HdU5wWG5TV0QxN1pndHlwdmtlZnp0dHlnSFVmeVZUcU1zWUJwWVduY1N1OUUKanU2VnRZSlZpa0NxRGZldmxvWDZ0WCs0cFVQc3l5eGtVTWUweG04WXZPNGlOL09YM0FCVzBJR1B0R3hoSU1XegovYUU5QkZ0Z1VZNDVnbnBjQWFnb3FOOEkxRllxK3phZWZsUGIwaDN5ZXZveXBBelJxQXQzRmZ0RVhESGxjRWRqClA2THJackVXSG4zaVNMaWhFT0RiCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCnN1YmplY3Q9L0M9VVMvTz1VLlMuIEdvdmVybm1lbnQvT1U9RG9EL09VPVBLSS9DTj1ET0QgSUQgQ0EtMzMKaXNzdWVyPS9DPVVTL089VS5TLiBHb3Zlcm5tZW50L09VPURvRC9PVT1QS0kvQ049RG9EIFJvb3QgQ0EgMgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRXVEQ0NBNkNnQXdJQkFnSUNCNXd3RFFZSktvWklodmNOQVFFRkJRQXdXekVMTUFrR0ExVUVCaE1DVlZNeApHREFXQmdOVkJBb1REMVV1VXk0Z1IyOTJaWEp1YldWdWRERU1NQW9HQTFVRUN4TURSRzlFTVF3d0NnWURWUVFMCkV3TlFTMGt4RmpBVUJnTlZCQU1URFVSdlJDQlNiMjkwSUVOQklESXdIaGNOTVRVd09USXpNVE16TWpNeVdoY04KTWpFd09USXlNVE16TWpNeVdqQmFNUXN3Q1FZRFZRUUdFd0pWVXpFWU1CWUdBMVVFQ2hNUFZTNVRMaUJIYjNabApjbTV0Wlc1ME1Rd3dDZ1lEVlFRTEV3TkViMFF4RERBS0JnTlZCQXNUQTFCTFNURVZNQk1HQTFVRUF4TU1SRTlFCklFbEVJRU5CTFRNek1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBeDMzOTdWeXkKVThpd250aTh6MDgzNW02bzVONmI5WmJQZzJBd2JHWnNCSEVBMGFXOUxyZ1dxVk5kUnJGTitMNzNJVmZZaHJwZApCOVNPNzJaR3NCZmVrVFBBSzQvZzBXUHdveERlTytqcEJERGJycC9tT3J4V2xac2VZNmpwU3ZFVG1ZZEJIdXFsCmRuaCtIYm51TTcvYzg2M05yVUhadnE5VDUrd0VKZWt2aEpPa3RhOTIrV1BRaFRtb1JHRHovQzBrN0VZVkl4V0IKWHFORFNxYmI0ZVQrOWthdmRaS011QUxoVi9RdmlqMVVDN0V5eFlHVDVHUGNsTnZDRHRSeG1vMzk3dm1pWk1wcgpMdVhxeThESk5uUW1RZlJTRWtuWVJHMTMrVUFRc1lzMkdtQmMyTTduVVhoem1mbUFqRzNEUU5zN0Y2RDBtd3ltClB1ck0yN0ZFNnJReDh3SURBUUFCbzRJQmhUQ0NBWUV3SFFZRFZSME9CQllFRkMyTzJkU0Q4dUtRakV1ZmIvbEcKNTJwTHpid25NQjhHQTFVZEl3UVlNQmFBRkVsMHV3eGV1bnIrQWxUdmU2REdsY1lKZ0hDV01CSUdBMVVkRXdFQgovd1FJTUFZQkFmOENBUUF3REFZRFZSMGtCQVV3QTRBQkFEQU9CZ05WSFE4QkFmOEVCQU1DQVlZd1pnWURWUjBnCkJGOHdYVEFMQmdsZ2hrZ0JaUUlCQ3dVd0N3WUpZSVpJQVdVQ0FRc0pNQXNHQ1dDR1NBRmxBZ0VMRVRBTEJnbGcKaGtnQlpRSUJDeEl3Q3dZSllJWklBV1VDQVFzVE1Bd0dDbUNHU0FGbEF3SUJBeG93REFZS1lJWklBV1VEQWdFRApHekEzQmdOVkhSOEVNREF1TUN5Z0txQW9oaVpvZEhSd09pOHZZM0pzTG1ScGMyRXViV2xzTDJOeWJDOUVUMFJTClQwOVVRMEV5TG1OeWJEQnNCZ2dyQmdFRkJRY0JBUVJnTUY0d09nWUlLd1lCQlFVSE1BS0dMbWgwZEhBNkx5OWoKY213dVpHbHpZUzV0YVd3dmFYTnpkV1ZrZEc4dlJFOUVVazlQVkVOQk1sOUpWQzV3TjJNd0lBWUlLd1lCQlFVSApNQUdHRkdoMGRIQTZMeTl2WTNOd0xtUnBjMkV1Yldsc01BMEdDU3FHU0liM0RRRUJCUVVBQTRJQkFRQ3pxQjJ6CkNxdlBFaGdFZ0ZEOS9lYnRGRG02YTNjNUp0VysxR1JndncyQm0wclZRM05OZWNyK0MxWW53VHY0ZnV0Kzc1cmQKYTJSNzdNRHlzekpZek02aTBuTzZmMzB4bTVkR0tQZ0dTN0hpUEQzUGg0N1hMWS9OK2N1QWowbW93WENPV0s1NgpuMHV2WFU1REt4ckFlcWxiYVVPWWFreUN3NjdQenorRkJOU1dsVHhyakVrRzhycXpVSVk3VlhYOE10ZWN0SjY1CnJhaG50YXJ0VHQrZ3NPekVDRUxXRndvUnZQelY3cFVyWTlWU25LUjhzanVzbnhLNEovYjBjUmsyUmJsWFVlM0cKVW45ZlhmRERuVVEzQ2dRdGJTY2ZEV09lQWJQSmRMWVdXNzVZU3pzeVcwM2Ftck9pMmFCSlpVMUUrN2h2SmttNwpjdzhja0FXNXRKRDVTUmltCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCnN1YmplY3Q9L0M9VVMvTz1VLlMuIEdvdmVybm1lbnQvT1U9RG9EL09VPVBLSS9DTj1Eb0QgUm9vdCBDQSAyCmlzc3Vlcj0vQz1VUy9PPVUuUy4gR292ZXJubWVudC9PVT1Eb0QvT1U9UEtJL0NOPURvRCBSb290IENBIDIKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURjRENDQWxpZ0F3SUJBZ0lCQlRBTkJna3Foa2lHOXcwQkFRVUZBREJiTVFzd0NRWURWUVFHRXdKVlV6RVkKTUJZR0ExVUVDaE1QVlM1VExpQkhiM1psY201dFpXNTBNUXd3Q2dZRFZRUUxFd05FYjBReEREQUtCZ05WQkFzVApBMUJMU1RFV01CUUdBMVVFQXhNTlJHOUVJRkp2YjNRZ1EwRWdNakFlRncwd05ERXlNVE14TlRBd01UQmFGdzB5Ck9URXlNRFV4TlRBd01UQmFNRnN4Q3pBSkJnTlZCQVlUQWxWVE1SZ3dGZ1lEVlFRS0V3OVZMbE11SUVkdmRtVnkKYm0xbGJuUXhEREFLQmdOVkJBc1RBMFJ2UkRFTU1Bb0dBMVVFQ3hNRFVFdEpNUll3RkFZRFZRUURFdzFFYjBRZwpVbTl2ZENCRFFTQXlNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXdDekI5bzA3CnJQOC9QTlp4dnJoMElnZnNjRUVWL0t0QTR3ZXF3Y1BZbi83YVREcS9QOGpZS0h0TE5nSEFyRVVsdzlJT0NvK0YKR0dRUVBSb1RjQ3B2anRmY2paT3pRUTg0SWMydHE4STlLZ1hUVnhFM0RjMk1VZm1UNDh4R1NTR09GTFROeXhRKwpPTTF5TWU2ckV2Smw2alF1VmwzLzdtTjF5MjI2a1RUOG52UDBMUnkrVU1SQzMxbUkvMnF6K3Foc1BjdFdjWEVGCmxydWZnT1dBUlZsblFiRHJ3NjFncElCMUJoZWNEdlJENEprT0cvdC85YlBNc29HQ3NmMHl3YmkrUWFSa3RXQTYKV2xFd2pNN2VRU3daUjF4SkVHUzVkS21IUWE5OWJyckJ1S0cvWlRFNkJHZjV0YnVPa29vQVk3aXg1b3c0WDRQLwpVTlU3b2wxcnNoRE1Zd0lEQVFBQm96OHdQVEFkQmdOVkhRNEVGZ1FVU1hTN0RGNjZldjRDVk85N29NYVZ4Z21BCmNKWXdDd1lEVlIwUEJBUURBZ0dHTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RFFZSktvWklodmNOQVFFRkJRQUQKZ2dFQkFKaVJqVCtKeUx2MXdHbHpLVHMxckxxekNIWTljQW1TNllSRUlRRjlGSFliN2xGc0hZMFZOeTE3TVduMApta1M0cjBiTU5Qb2p5d01uR2RLRElYVXI1K0FibVNiY2hFQ1Y2S2pTelBaWVhHYnZQMHFYRUlJZHVncWkzVnNHCks1Mm5aRTdyTGdFMXBMUS9FNjFWNU5WenFHbWJFZkdZOGpFZWIwRFUrSGlmanBHZ2IzQUVrR2FxQml2TzRYcVMKdFgzaDROR1c1NkU2TGN5eG5SOEZSTzJIbWROTkduQTV3UVFNNVg3WjhhL1hJQTd4SW5vbHBIT1p6RCtrQnllVwpxS0tWN1lLNUZ0T2VDNGZDd2ZLSTlXTGZhTi9IdkdsUjdiRmMzRlJVS1E4Sk9acXNBOEhiREUydWJ3cDZGa254CnY1SFNPSlRUOXBVc3QyekpRcmFOeXBDTmhkaz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKc3ViamVjdD0vQz1VUy9PPVUuUy4gR292ZXJubWVudC9PVT1Eb0QvT1U9UEtJL0NOPURPRCBFTUFJTCBDQS0zMgppc3N1ZXI9L0M9VVMvTz1VLlMuIEdvdmVybm1lbnQvT1U9RG9EL09VPVBLSS9DTj1Eb0QgUm9vdCBDQSAyCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGVWpDQ0JEcWdBd0lCQWdJQ0E2SXdEUVlKS29aSWh2Y05BUUVGQlFBd1d6RUxNQWtHQTFVRUJoTUNWVk14CkdEQVdCZ05WQkFvVEQxVXVVeTRnUjI5MlpYSnViV1Z1ZERFTU1Bb0dBMVVFQ3hNRFJHOUVNUXd3Q2dZRFZRUUwKRXdOUVMwa3hGakFVQmdOVkJBTVREVVJ2UkNCU2IyOTBJRU5CSURJd0hoY05NVE13TWpBME1qQTBPREV5V2hjTgpNVGt3TWpBME1qQTBPREV5V2pCZE1Rc3dDUVlEVlFRR0V3SlZVekVZTUJZR0ExVUVDaE1QVlM1VExpQkhiM1psCmNtNXRaVzUwTVF3d0NnWURWUVFMRXdORWIwUXhEREFLQmdOVkJBc1RBMUJMU1RFWU1CWUdBMVVFQXhNUFJFOUUKSUVWTlFVbE1JRU5CTFRNeU1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBby9xcQpoc3FLR2hzRFRuRnRRYmJaWlpwdS96WXFQd0xUZkpWbGlGcWs5NjlqdDFMSEd2dTdsWE1IUW1HTFNxWjc2VllICk5odXFOd0lnSEtUTys3YlFhYXY4T0V6STIwWlc5NkplZnVjeHRPN0IvODFrdjNtQ1FTdDMwdmg5cTB5UDk4WWUKUFBpT0x6MFVnOXFTbUFuWTBNWmFXVGFMaDZLSjNiNUtYc3ZOdGtkK1FhWUpWR3hCbG5SYkJzUFV3UzVHZlY0MgozNDJpUm5Hc1NyckVzZmZKRndvdjNhUHNoQ0hQcUFYcXVlTXViNTkrZmJzZEZuVlBraDBENWhFNG1EWjZvZFFBClBLMFFXSzhWeHpaTDR6dWJUYlcwa0w2dHE5UEFoTFA4M0JXSUNZd1JVRkF2NUhEc3R3cXVTbFBpTnNRRmJvQjEKRW8wM1J2SkxERGdjU1Irc2d3SURBUUFCbzRJQ0hEQ0NBaGd3SFFZRFZSME9CQllFRkFxd3FqaFdSM3NXZmI2cgprNWE4Vk4yRisrMHNNQjhHQTFVZEl3UVlNQmFBRkVsMHV3eGV1bnIrQWxUdmU2REdsY1lKZ0hDV01CSUdBMVVkCkV3RUIvd1FJTUFZQkFmOENBUUF3REFZRFZSMGtCQVV3QTRBQkFEQU9CZ05WSFE4QkFmOEVCQU1DQVlZd1pnWUQKVlIwZ0JGOHdYVEFMQmdsZ2hrZ0JaUUlCQ3dVd0N3WUpZSVpJQVdVQ0FRc0pNQXNHQ1dDR1NBRmxBZ0VMRVRBTApCZ2xnaGtnQlpRSUJDeEl3Q3dZSllJWklBV1VDQVFzVE1Bd0dDbUNHU0FGbEF3SUJBeG93REFZS1lJWklBV1VECkFnRURHekEzQmdOVkhSOEVNREF1TUN5Z0txQW9oaVpvZEhSd09pOHZZM0pzTG1ScGMyRXViV2xzTDJOeWJDOUUKVDBSU1QwOVVRMEV5TG1OeWJEQ0NBUUVHQ0NzR0FRVUZCd0VCQklIME1JSHhNRG9HQ0NzR0FRVUZCekFDaGk1bwpkSFJ3T2k4dlkzSnNMbVJwYzJFdWJXbHNMMmx6YzNWbFpIUnZMMFJQUkZKUFQxUkRRVEpmU1ZRdWNEZGpNQ0FHCkNDc0dBUVVGQnpBQmhoUm9kSFJ3T2k4dmIyTnpjQzVrYVhOaExtMXBiRENCa0FZSUt3WUJCUVVITUFLR2dZTnMKWkdGd09pOHZZM0pzTG1ka2N5NWthWE5oTG0xcGJDOWpiaVV6WkVSdlJDVXlNRkp2YjNRbE1qQkRRU1V5TURJbApNbU52ZFNVelpGQkxTU1V5WTI5MUpUTmtSRzlFSlRKamJ5VXpaRlV1VXk0bE1qQkhiM1psY201dFpXNTBKVEpqCll5VXpaRlZUUDJOeWIzTnpRMlZ5ZEdsbWFXTmhkR1ZRWVdseU8ySnBibUZ5ZVRBTkJna3Foa2lHOXcwQkFRVUYKQUFPQ0FRRUFENzJQUi8rNXliMUQ1YzYrdGZNNXkwVVdXYVBmdGxJa1BBbFZTOW0vbFhxOWR0bmdNSWZOU3FtagpMWjdaS0FUR2xxNEJGSURRSlZieFdBTlY3OUtvSWxLcmdlOEEvcS9IU2RLTUlDNmtjWUgzSnNzT3BXM1ZRWGQ3CkxUTzdtN044bkQ4OS84THVlZktKQ2hDTWtIUmROR2R3dmdMK2dFWVpCODU5TDVhb3hCUFE3NThwc1RTcHVZeWwKaVRTempENUgrR2FNa2RIdXE4SHFjWVhKWDdDcDd0c0ExREFxUXM1WFl4QWlNS2ljaGtFU1hiNVFmQlA2NnloegpYM0l6aVY5L0RXaWtQZjBXSnVnS2svNTdINGFCZ0NlK1ozR0dHMzNIYjdlcGNRSEdZN056ZlFGck15THRlWW1LCkR1WnlBbk0zUDhzeGdlMmsrd3RxTzFLRXVrejNqZz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCnN1YmplY3Q9L0M9VVMvTz1VLlMuIEdvdmVybm1lbnQvT1U9RG9EL09VPVBLSS9DTj1ET0QgQ0EtMzIKaXNzdWVyPS9DPVVTL089VS5TLiBHb3Zlcm5tZW50L09VPURvRC9PVT1QS0kvQ049RG9EIFJvb3QgQ0EgMgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRlREQ0NCRFNnQXdJQkFnSUNBNkV3RFFZSktvWklodmNOQVFFRkJRQXdXekVMTUFrR0ExVUVCaE1DVlZNeApHREFXQmdOVkJBb1REMVV1VXk0Z1IyOTJaWEp1YldWdWRERU1NQW9HQTFVRUN4TURSRzlFTVF3d0NnWURWUVFMCkV3TlFTMGt4RmpBVUJnTlZCQU1URFVSdlJDQlNiMjkwSUVOQklESXdIaGNOTVRNd01qQTBNakEwTkRBMVdoY04KTVRrd01qQTBNakEwTkRBMVdqQlhNUXN3Q1FZRFZRUUdFd0pWVXpFWU1CWUdBMVVFQ2hNUFZTNVRMaUJIYjNabApjbTV0Wlc1ME1Rd3dDZ1lEVlFRTEV3TkViMFF4RERBS0JnTlZCQXNUQTFCTFNURVNNQkFHQTFVRUF4TUpSRTlFCklFTkJMVE15TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUFzK0tWSFpNMkxTV2wKRHYxNDZlL3FrOUU2eWRoWHZSbmYwY2VpMGVqWi9kS09GYWpkdlQ1azlMYituQVBmUzdCbHQ2c0VHRElaYkJNQgpVdEhtdGNoQkVyZStPOHROUUJDSXlwNjIvVFYzYlNiMlpLMFJod3lwSlhwWW43QzltUGFUWHh2djc3S1hyZmdWCjU5em1vR3AxRFZIZlZSMW9RVkpKTHNlY2FGZFdSNC9lOWxJdWdXOVd2QWFKRXBTZkk3MC9nY2VHQW5Vd1hqT2gKM09FVHUvMTVWZ0U4U2huMExPdVFaR1RYNkFvdlVZYlZDSnVFKy9ucGkwTEtaZEtRQnh5Q2w0eEVJMWNHTEhWcApLSEN5N1Q1TTFlT1dkeFg5dXBYUFc1WnBBbmZXZ05tUGh5bmo1d1YycjhxTkVtQTBjc2V6blRodVRKWXlucEExCnJYV0wwV0pBQ1FJREFRQUJvNElDSERDQ0FoZ3dIUVlEVlIwT0JCWUVGQy9LazFNRHJHOTE5WGI2dnY2TzZoQ0wKdCtlUU1COEdBMVVkSXdRWU1CYUFGRWwwdXd4ZXVucitBbFR2ZTZER2xjWUpnSENXTUJJR0ExVWRFd0VCL3dRSQpNQVlCQWY4Q0FRQXdEQVlEVlIwa0JBVXdBNEFCQURBT0JnTlZIUThCQWY4RUJBTUNBWVl3WmdZRFZSMGdCRjh3ClhUQUxCZ2xnaGtnQlpRSUJDd1V3Q3dZSllJWklBV1VDQVFzSk1Bc0dDV0NHU0FGbEFnRUxFVEFMQmdsZ2hrZ0IKWlFJQkN4SXdDd1lKWUlaSUFXVUNBUXNUTUF3R0NtQ0dTQUZsQXdJQkF4b3dEQVlLWUlaSUFXVURBZ0VER3pBMwpCZ05WSFI4RU1EQXVNQ3lnS3FBb2hpWm9kSFJ3T2k4dlkzSnNMbVJwYzJFdWJXbHNMMk55YkM5RVQwUlNUMDlVClEwRXlMbU55YkRDQ0FRRUdDQ3NHQVFVRkJ3RUJCSUgwTUlIeE1Eb0dDQ3NHQVFVRkJ6QUNoaTVvZEhSd09pOHYKWTNKc0xtUnBjMkV1Yldsc0wybHpjM1ZsWkhSdkwwUlBSRkpQVDFSRFFUSmZTVlF1Y0Rkak1DQUdDQ3NHQVFVRgpCekFCaGhSb2RIUndPaTh2YjJOemNDNWthWE5oTG0xcGJEQ0JrQVlJS3dZQkJRVUhNQUtHZ1lOc1pHRndPaTh2ClkzSnNMbWRrY3k1a2FYTmhMbTFwYkM5amJpVXpaRVJ2UkNVeU1GSnZiM1FsTWpCRFFTVXlNRElsTW1OdmRTVXoKWkZCTFNTVXlZMjkxSlROa1JHOUVKVEpqYnlVelpGVXVVeTRsTWpCSGIzWmxjbTV0Wlc1MEpUSmpZeVV6WkZWVApQMk55YjNOelEyVnlkR2xtYVdOaGRHVlFZV2x5TzJKcGJtRnllVEFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBCk1JM1ZWbU85bVFhTFRiYlNEZ081eG9UU20zZEJHb2pTLzhQYTR1Wm5ZYjNaZXUwNE9WNnJDMWcwK2Ryb1lubXYKT1hMelNxZmpUamtRemVuU0NPclVucHFuTlRXVGt3Slo0a3dBSFBQOGF5RlRTb3hoNTJITDBFWUwwVCtjYWZYdgpVSXJ3UUxNclZsb2RhMkpaQmJPUEp4Z0ZDa05iQXUvZFVsNWJ3S2tjVnVPVmJKZFBBWU5XY2wzWGZWSGpXbFF1CnVKajljazRsajRzVzBiRGhNK09TZkJCVk15Um1ydzh6QmxOSUE0ZWZ0R1IwdGRJOUluSzMwWTQzRVJNNTM1N24KMEF3TGlsa1JNbVgvOXJsR3ZUODJucWVVQUZmd3dCbmhMTnhNOXk5TWtCMUQ3NjRJNDNPZU9yK1o3Q0s1QjFpdQoyVFZTUzFHN2dUYVBuMjRoQ3FhT2h3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKc3ViamVjdD0vQz1VUy9PPVUuUy4gR292ZXJubWVudC9PVT1Eb0QvT1U9UEtJL0NOPURPRCBFTUFJTCBDQS0zMQppc3N1ZXI9L0M9VVMvTz1VLlMuIEdvdmVybm1lbnQvT1U9RG9EL09VPVBLSS9DTj1Eb0QgUm9vdCBDQSAyCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGVWpDQ0JEcWdBd0lCQWdJQ0E1OHdEUVlKS29aSWh2Y05BUUVGQlFBd1d6RUxNQWtHQTFVRUJoTUNWVk14CkdEQVdCZ05WQkFvVEQxVXVVeTRnUjI5MlpYSnViV1Z1ZERFTU1Bb0dBMVVFQ3hNRFJHOUVNUXd3Q2dZRFZRUUwKRXdOUVMwa3hGakFVQmdOVkJBTVREVVJ2UkNCU2IyOTBJRU5CSURJd0hoY05NVE13TVRFMk1UUTFNalF6V2hjTgpNVGt3TVRFMk1UUTFNalF6V2pCZE1Rc3dDUVlEVlFRR0V3SlZVekVZTUJZR0ExVUVDaE1QVlM1VExpQkhiM1psCmNtNXRaVzUwTVF3d0NnWURWUVFMRXdORWIwUXhEREFLQmdOVkJBc1RBMUJMU1RFWU1CWUdBMVVFQXhNUFJFOUUKSUVWTlFVbE1JRU5CTFRNeE1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBNks0QwpMRUJNT2xMb2kzT1N0SGZuT0V2QThLcEtHRnpIOXpYRFN2RHdsbmVsbDc0bjc4UkVJWURxRmpTM01ORkVPSDhxCnpnVEdrV1dwYmxCOHlFNyt2Y0MxU3hia09GSVYyN08zOTFNOThyRUgyNUZtWGNHMzhuZG14RkdhWTVRUlN3SWQKRFV0OHN3QkhCM2tZK25pemt4L1VkbTJaQk1VZU5rYjhCalFMNDJodkhueWZMTTlodUV2L3ROOEduNkJmbEY3cgpOZjhKWFRWQUIvS2Q3WllKMlhicS9tNHgvc3YwUmVzd2VFaG9iS0VwUG9aOWswRks2dWNNVE9XUlVDcWxRMmE4CklzRDhHeXprOHk5aUhnVFVJYitzSHlaM05kQWR2T0s3UnNMeTYrUVVydml6YTdQNmNUaXdjU250MFlzYjF3SWIKM3Nyc2Z1NmgzRWlsOFQ2VXFRSURBUUFCbzRJQ0hEQ0NBaGd3SFFZRFZSME9CQllFRklieFcyaHYzVER6bElKbwoxRXozUkIyNHltaUJNQjhHQTFVZEl3UVlNQmFBRkVsMHV3eGV1bnIrQWxUdmU2REdsY1lKZ0hDV01CSUdBMVVkCkV3RUIvd1FJTUFZQkFmOENBUUF3REFZRFZSMGtCQVV3QTRBQkFEQU9CZ05WSFE4QkFmOEVCQU1DQVlZd1pnWUQKVlIwZ0JGOHdYVEFMQmdsZ2hrZ0JaUUlCQ3dVd0N3WUpZSVpJQVdVQ0FRc0pNQXNHQ1dDR1NBRmxBZ0VMRVRBTApCZ2xnaGtnQlpRSUJDeEl3Q3dZSllJWklBV1VDQVFzVE1Bd0dDbUNHU0FGbEF3SUJBeG93REFZS1lJWklBV1VECkFnRURHekEzQmdOVkhSOEVNREF1TUN5Z0txQW9oaVpvZEhSd09pOHZZM0pzTG1ScGMyRXViV2xzTDJOeWJDOUUKVDBSU1QwOVVRMEV5TG1OeWJEQ0NBUUVHQ0NzR0FRVUZCd0VCQklIME1JSHhNRG9HQ0NzR0FRVUZCekFDaGk1bwpkSFJ3T2k4dlkzSnNMbVJwYzJFdWJXbHNMMmx6YzNWbFpIUnZMMFJQUkZKUFQxUkRRVEpmU1ZRdWNEZGpNQ0FHCkNDc0dBUVVGQnpBQmhoUm9kSFJ3T2k4dmIyTnpjQzVrYVhOaExtMXBiRENCa0FZSUt3WUJCUVVITUFLR2dZTnMKWkdGd09pOHZZM0pzTG1ka2N5NWthWE5oTG0xcGJDOWpiaVV6WkVSdlJDVXlNRkp2YjNRbE1qQkRRU1V5TURJbApNbU52ZFNVelpGQkxTU1V5WTI5MUpUTmtSRzlFSlRKamJ5VXpaRlV1VXk0bE1qQkhiM1psY201dFpXNTBKVEpqCll5VXpaRlZUUDJOeWIzTnpRMlZ5ZEdsbWFXTmhkR1ZRWVdseU8ySnBibUZ5ZVRBTkJna3Foa2lHOXcwQkFRVUYKQUFPQ0FRRUFXVEt0cXNQNDM1eGtuSEVKTk1HOXZHTUFIaTNiN2FuSUNPTzVHT1N2eXE0VXdkMjcrWE9EZzFlTwpsTW1ncWdNSHptZWN0ZVVYV1Q4b3VCYzIycnFOdzVZUkFXcFExZ2JhYUtSSzBndUZmTTJJMy85ZWQrYjFwRWlSCjBFNmlaMnI0YU8rcUYwWHYySllLM2Mvd1BvZTJ2NGcvMDFTK1BoTE9vZmtMYnpMUlZMK0VXeldnMndka3RhdnAKZVI3aThxcDBjdWVSRXZmSHUyN3U1WFNRRUNTTHQrZk5uSVdRUitUaWIzOGd2U3k3ZzVZalRhaE0ySDR1WGhVcAp1Q1Y5VnpVTExSVlVqS25jNE9VM25haFBJSldESzhVU05qMm9jK0ZPaUVtbHVidjZDVW9vV2pPNTVKSjVXM3Y0CnBVL3p5VFRObVl5d3VtQituNFErNWp6NmZscnI1Zz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCnN1YmplY3Q9L0M9VVMvTz1VLlMuIEdvdmVybm1lbnQvT1U9RG9EL09VPVBLSS9DTj1ET0QgQ0EtMzEKaXNzdWVyPS9DPVVTL089VS5TLiBHb3Zlcm5tZW50L09VPURvRC9PVT1QS0kvQ049RG9EIFJvb3QgQ0EgMgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRlREQ0NCRFNnQXdJQkFnSUNBNTB3RFFZSktvWklodmNOQVFFRkJRQXdXekVMTUFrR0ExVUVCaE1DVlZNeApHREFXQmdOVkJBb1REMVV1VXk0Z1IyOTJaWEp1YldWdWRERU1NQW9HQTFVRUN4TURSRzlFTVF3d0NnWURWUVFMCkV3TlFTMGt4RmpBVUJnTlZCQU1URFVSdlJDQlNiMjkwSUVOQklESXdIaGNOTVRNd01URTJNVFEwT1RNd1doY04KTVRrd01URTJNVFEwT1RNd1dqQlhNUXN3Q1FZRFZRUUdFd0pWVXpFWU1CWUdBMVVFQ2hNUFZTNVRMaUJIYjNabApjbTV0Wlc1ME1Rd3dDZ1lEVlFRTEV3TkViMFF4RERBS0JnTlZCQXNUQTFCTFNURVNNQkFHQTFVRUF4TUpSRTlFCklFTkJMVE14TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUF4aWNRTDVDV09ObmYKNWw4L3Vvbjdab0xydHFYdDhGYVFGa0RuYktLd2VXWloxNWhpTWRFeklsUGpIbHlrVm1hbVRWYjd3K0pDRXF2NQp3RXBMUU8rUkU0WTVNRkhXYm80bnQwR0pLUUh1V0VaekJIRkVYR2xEUGpMbVpOK3phNWtzY0tMUVBrM1lXQkp0ClJmQTlrMVMrMytMN3p4SC8vSW9CTisrbkxycEFER28rSE9RS01vQnB2U0k1N0V0MnliRmFrendoaERqZGN4T0MKK1YwTWdRcXBzbE4wMlF1T3dPaVh1ejFmRTR5MXVUdnM5cnVkamlEMmE3eWRGRExjZnJuaVk3QnF3WUM1RnZ5Ugo3Nnl5Q1o5U1IxZ1RYbUorbWhLR1c4VWdIK0dPWmdCMlUrem5Jb2toVEYrNTZiNmdVcE1PcHNqZXpMZUNyU0p0Cmk5QXdVelpWVndJREFRQUJvNElDSERDQ0FoZ3dIUVlEVlIwT0JCWUVGRVRqUnFOQjdtQ3hYcWVUSmZTZ1UrNjMKU2I2N01COEdBMVVkSXdRWU1CYUFGRWwwdXd4ZXVucitBbFR2ZTZER2xjWUpnSENXTUJJR0ExVWRFd0VCL3dRSQpNQVlCQWY4Q0FRQXdEQVlEVlIwa0JBVXdBNEFCQURBT0JnTlZIUThCQWY4RUJBTUNBWVl3WmdZRFZSMGdCRjh3ClhUQUxCZ2xnaGtnQlpRSUJDd1V3Q3dZSllJWklBV1VDQVFzSk1Bc0dDV0NHU0FGbEFnRUxFVEFMQmdsZ2hrZ0IKWlFJQkN4SXdDd1lKWUlaSUFXVUNBUXNUTUF3R0NtQ0dTQUZsQXdJQkF4b3dEQVlLWUlaSUFXVURBZ0VER3pBMwpCZ05WSFI4RU1EQXVNQ3lnS3FBb2hpWm9kSFJ3T2k4dlkzSnNMbVJwYzJFdWJXbHNMMk55YkM5RVQwUlNUMDlVClEwRXlMbU55YkRDQ0FRRUdDQ3NHQVFVRkJ3RUJCSUgwTUlIeE1Eb0dDQ3NHQVFVRkJ6QUNoaTVvZEhSd09pOHYKWTNKc0xtUnBjMkV1Yldsc0wybHpjM1ZsWkhSdkwwUlBSRkpQVDFSRFFUSmZTVlF1Y0Rkak1DQUdDQ3NHQVFVRgpCekFCaGhSb2RIUndPaTh2YjJOemNDNWthWE5oTG0xcGJEQ0JrQVlJS3dZQkJRVUhNQUtHZ1lOc1pHRndPaTh2ClkzSnNMbWRrY3k1a2FYTmhMbTFwYkM5amJpVXpaRVJ2UkNVeU1GSnZiM1FsTWpCRFFTVXlNRElsTW1OdmRTVXoKWkZCTFNTVXlZMjkxSlROa1JHOUVKVEpqYnlVelpGVXVVeTRsTWpCSGIzWmxjbTV0Wlc1MEpUSmpZeVV6WkZWVApQMk55YjNOelEyVnlkR2xtYVdOaGRHVlFZV2x5TzJKcGJtRnllVEFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBClIxRlMzUFNnYzVwQzV3dnNJNUdOSlhXMFJJSTBxdmxHZFZIRDlnNzQ1K012dENERDc2RmxOT0NkaDhIbUxtTHcKSitqcnhjODFsZEpBZ0l1U0NiYW1HOVVTWkRIYnRkUU8zd3FLdGxiMXZIYVNreGw4djJWOWNvSFlaSHM1TklwMgpXTXdkUS9jSHp4eURBM08rT0JmYmRLMXBDUkY4N2RqV0FvMW1QYXRyeWpQYngzcG14ZDZuSjBnUFpoTHVhQ1RBCjc1SHFCaGtxVUZnVDRDTDhEckVrKyt1T1FnSVBkNGdWaStieTlWTzNmT0JWbXhQV3RuREtjM0RqVXlYQktCNTcKeEN4SmJwRGJxc3RiQXh2Q2g0ZjFxNzVSY1hOdEptWjdteDBYNE8zandONGRKN0h0RFRSR1B0MHVYdlNDY05yUgpreHQ1M2RaSzU4NzVQM01mem9ybUZnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoK -kind: Secret -metadata: - name: nginx-client-ca-bundle - namespace: atat -type: Opaque diff --git a/deploy/overlays/cloudzero-dev/flex_vol.yml b/deploy/overlays/cloudzero-dev/flex_vol.yml index 1da24f7a..a3c65df7 100644 --- a/deploy/overlays/cloudzero-dev/flex_vol.yml +++ b/deploy/overlays/cloudzero-dev/flex_vol.yml @@ -9,13 +9,23 @@ spec: - name: nginx-secret flexVolume: options: - keyvaultname: "atat-vault-test" - keyvaultobjectnames: "dhparam4096;cert;cert" + keyvaultname: "cloudzero-dev-keyvault" + # keyvaultobjectnames: "dhparam4096;cert;cert" + keyvaultobjectnames: "foo" + keyvaultobjectaliases: "FOO" + keyvaultobjecttypes: "secret" + usevmmanagedidentity: "true" + usepodidentity: "false" - name: flask-secret flexVolume: options: - keyvaultname: "atat-vault-test" - keyvaultobjectnames: "AZURE-STORAGE-KEY;MAIL-PASSWORD;PGPASSWORD;REDIS-PASSWORD;SECRET-KEY" + keyvaultname: "cloudzero-dev-keyvault" + # keyvaultobjectnames: "AZURE-STORAGE-KEY;MAIL-PASSWORD;PGPASSWORD;REDIS-PASSWORD;SECRET-KEY" + keyvaultobjectnames: "master-PGPASSWORD" + keyvaultobjectaliases: "PGPASSWORD" + keyvaultobjecttypes: "secret" + usevmmanagedidentity: "true" + usepodidentity: "false" --- apiVersion: extensions/v1beta1 kind: Deployment @@ -28,8 +38,10 @@ spec: - name: flask-secret flexVolume: options: - keyvaultname: "atat-vault-test" + keyvaultname: "cloudzero-dev-keyvault" keyvaultobjectnames: "AZURE-STORAGE-KEY;MAIL-PASSWORD;PGPASSWORD;REDIS-PASSWORD;SECRET-KEY" + usevmmanagedidentity: "true" + usepodidentity: "false" --- apiVersion: extensions/v1beta1 kind: Deployment @@ -42,8 +54,10 @@ spec: - name: flask-secret flexVolume: options: - keyvaultname: "atat-vault-test" + keyvaultname: "cloudzero-dev-keyvault" keyvaultobjectnames: "AZURE-STORAGE-KEY;MAIL-PASSWORD;PGPASSWORD;REDIS-PASSWORD;SECRET-KEY" + usevmmanagedidentity: "true" + usepodidentity: "false" --- apiVersion: batch/v1beta1 kind: CronJob @@ -58,5 +72,7 @@ spec: - name: flask-secret flexVolume: options: - keyvaultname: "atat-vault-test" + keyvaultname: "cloudzero-dev-keyvault" keyvaultobjectnames: "AZURE-STORAGE-KEY;MAIL-PASSWORD;PGPASSWORD;REDIS-PASSWORD;SECRET-KEY" + usevmmanagedidentity: "true" + usepodidentity: "false" diff --git a/deploy/overlays/cloudzero-dev/kustomization.yaml b/deploy/overlays/cloudzero-dev/kustomization.yaml index ee6f3a0c..24705531 100644 --- a/deploy/overlays/cloudzero-dev/kustomization.yaml +++ b/deploy/overlays/cloudzero-dev/kustomization.yaml @@ -5,7 +5,6 @@ resources: - namespace.yml - reset-cron-job.yml patchesStrategicMerge: - - replica_count.yml - ports.yml - envvars.yml - flex_vol.yml diff --git a/deploy/overlays/cloudzero-dev/ports.yml b/deploy/overlays/cloudzero-dev/ports.yml index 8f4ff72c..8dbbd0f1 100644 --- a/deploy/overlays/cloudzero-dev/ports.yml +++ b/deploy/overlays/cloudzero-dev/ports.yml @@ -3,6 +3,9 @@ apiVersion: v1 kind: Service metadata: name: atst-main + annotations: + service.beta.kubernetes.io/azure-load-balancer-internal: "true" + service.beta.kubernetes.io/azure-load-balancer-internal-subnet: "cloudzero-dev-public" spec: loadBalancerIP: "" ports: @@ -17,6 +20,9 @@ apiVersion: v1 kind: Service metadata: name: atst-auth + annotations: + service.beta.kubernetes.io/azure-load-balancer-internal: "true" + service.beta.kubernetes.io/azure-load-balancer-internal-subnet: "cloudzero-dev-public" spec: loadBalancerIP: "" ports: diff --git a/deploy/overlays/cloudzero-dev/replica_count.yml b/deploy/overlays/cloudzero-dev/replica_count.yml deleted file mode 100644 index 272286f7..00000000 --- a/deploy/overlays/cloudzero-dev/replica_count.yml +++ /dev/null @@ -1,14 +0,0 @@ ---- -apiVersion: extensions/v1beta1 -kind: Deployment -metadata: - name: atst -spec: - replicas: 2 ---- -apiVersion: extensions/v1beta1 -kind: Deployment -metadata: - name: atst-worker -spec: - replicas: 1 diff --git a/deploy/overlays/staging/autoscaling.yml b/deploy/overlays/staging/autoscaling.yml new file mode 100644 index 00000000..b7500c09 --- /dev/null +++ b/deploy/overlays/staging/autoscaling.yml @@ -0,0 +1,16 @@ +--- +apiVersion: autoscaling/v2beta1 +kind: HorizontalPodAutoscaler +metadata: + name: atst +spec: + minReplicas: 1 + maxReplicas: 2 +--- +apiVersion: autoscaling/v2beta1 +kind: HorizontalPodAutoscaler +metadata: + name: atst-worker +spec: + minReplicas: 1 + maxReplicas: 2 diff --git a/deploy/overlays/staging/kustomization.yaml b/deploy/overlays/staging/kustomization.yaml index ee6f3a0c..c1ef8fd2 100644 --- a/deploy/overlays/staging/kustomization.yaml +++ b/deploy/overlays/staging/kustomization.yaml @@ -5,7 +5,7 @@ resources: - namespace.yml - reset-cron-job.yml patchesStrategicMerge: - - replica_count.yml + - autoscaling.yml - ports.yml - envvars.yml - flex_vol.yml diff --git a/deploy/overlays/staging/replica_count.yml b/deploy/overlays/staging/replica_count.yml deleted file mode 100644 index 272286f7..00000000 --- a/deploy/overlays/staging/replica_count.yml +++ /dev/null @@ -1,14 +0,0 @@ ---- -apiVersion: extensions/v1beta1 -kind: Deployment -metadata: - name: atst -spec: - replicas: 2 ---- -apiVersion: extensions/v1beta1 -kind: Deployment -metadata: - name: atst-worker -spec: - replicas: 1 diff --git a/docs/ATATArchitecture.md b/docs/ATATArchitecture.md new file mode 100644 index 00000000..e69de29b diff --git a/docs/EdgeControls.md b/docs/EdgeControls.md new file mode 100644 index 00000000..b9b409f6 --- /dev/null +++ b/docs/EdgeControls.md @@ -0,0 +1,32 @@ +# Edge Control +This document describes the expected connections and listening services. + +## Transient Connections +| Service | Direction | Ports | Protocol | Encrypted? | Ciphers | +| --------|-----------|-------|----------|------------|--------------| +| Azure Container Registry | Egress | 443 | HTTP | Yes | MSFT Managed | +| DOD CRL Service | Egress | 443 | HTTP | Yes | DOD Managed | +| Azure Storage | Egress | 443 | HTTP | Yes | MSFT Managed| +| Redis | Egress | 6380 | HTTP | Yes | MSFT Managed| +| Postgres | Egress | 5432 | HTTP | Yes | MSFT Managed| + +# Listening Ports / Services +| Service/App | Port | Protocol| Encrypted? | Accessible | +|-------------|---------|---------|------------|--------| +| ATAT App | 80, 443 | HTTP | Both | Load Balancer Only +| ATAT Auth | 80, 443 | HTTP | Both | Load Balancer Only + +# Host List +## Dev +| Service| Host | +|--------|------| +| Redis | cloudzero-dev-redis.redis.cache.windows.net | +| Postgres| cloudzero-dev-sql.postgres.database.azure.com | +| Docker Container Registry | cloudzerodevregistry.azurecr.io | + +## Production +| Service | Host | +|---------|------| +| Redis | | +| Postgres| | +| Docker Container Registry | | \ No newline at end of file diff --git a/js/components/__tests__/upload_input.test.js b/js/components/__tests__/upload_input.test.js index 43ae48a8..5d613b14 100644 --- a/js/components/__tests__/upload_input.test.js +++ b/js/components/__tests__/upload_input.test.js @@ -70,7 +70,7 @@ describe('UploadInput Test', () => { }) const component = wrapper.find(uploadinput) - const event = { target: { value: '', files: [{ name: '' }] } } + const event = { target: { value: '', files: [{ name: 'sample.pdf' }] } } component.setMethods({ getUploader: async () => new MockUploader('token', 'objectName'), diff --git a/js/components/clin_fields.js b/js/components/clin_fields.js index 327bedf0..a43d321f 100644 --- a/js/components/clin_fields.js +++ b/js/components/clin_fields.js @@ -101,7 +101,7 @@ export default { if (!!this.clinNumber) { return `CLIN ${this.clinNumber}` } else { - return `CLIN` + return `New CLIN` } }, percentObligated: function() { diff --git a/js/components/upload_input.js b/js/components/upload_input.js index cdd9b15e..d7c90bf5 100644 --- a/js/components/upload_input.js +++ b/js/components/upload_input.js @@ -1,5 +1,6 @@ import { buildUploader } from '../lib/upload' import { emitFieldChange } from '../lib/emitters' +import inputValidations from '../lib/input_validations' export default { name: 'uploadinput', @@ -28,6 +29,7 @@ export default { changed: false, uploadError: false, sizeError: false, + filenameError: false, downloadLink: '', } }, @@ -50,6 +52,10 @@ export default { this.sizeError = true return } + if (!this.validateFileName(file.name)) { + this.filenameError = true + return + } const uploader = await this.getUploader() const response = await uploader.upload(file) @@ -71,6 +77,10 @@ export default { this.uploadError = true } }, + validateFileName: function(name) { + const regex = inputValidations.restrictedFileName.match + return regex.test(name) + }, removeAttachment: function(e) { e.preventDefault() this.attachment = null @@ -118,7 +128,8 @@ export default { return ( (!this.changed && this.initialErrors) || this.uploadError || - this.sizeError + this.sizeError || + this.filenameError ) }, valid: function() { diff --git a/js/lib/input_validations.js b/js/lib/input_validations.js index af74f211..e2dc03b7 100644 --- a/js/lib/input_validations.js +++ b/js/lib/input_validations.js @@ -9,6 +9,12 @@ export default { unmask: [], validationError: 'Please enter a response', }, + clinNumber: { + mask: false, + match: /^\d{4}$/, + unmask: [], + validationError: 'Please enter a 4-digit CLIN number', + }, date: { mask: [/\d/, /\d/, '/', /\d/, /\d/, '/', /\d/, /\d/, /\d/, /\d/], match: /(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.](19|20)\d\d/, @@ -34,6 +40,20 @@ export default { unmask: ['$', ','], validationError: 'Please enter a dollar amount', }, + defaultStringField: { + mask: false, + match: /^[A-Za-z0-9\-_ \.]{1,100}$/, + unmask: [], + validationError: + 'Please enter a response of no more than 100 alphanumeric characters', + }, + defaultTextAreaField: { + mask: false, + match: /^[A-Za-z0-9\-_ \.]{1,1000}$/, + unmask: [], + validationError: + 'Please enter a response of no more than 1000 alphanumeric characters', + }, clinDollars: { mask: createNumberMask({ prefix: '$', allowDecimal: true }), match: /^-?\d+\.?\d*$/, @@ -53,6 +73,13 @@ export default { unmask: [','], validationError: 'Please enter a number', }, + name: { + mask: false, + match: /.{1,100}/, + unmask: [], + validationError: + 'This field accepts letters, numbers, commas, apostrophes, hyphens, and periods.', + }, phoneExt: { mask: createNumberMask({ prefix: '', @@ -71,7 +98,7 @@ export default { unmask: [], validationError: 'Portfolio names can be between 4-100 characters', }, - requiredField: { + required: { mask: false, match: /.+/, unmask: [], @@ -104,4 +131,11 @@ export default { unmask: ['(', ')', '-', ' '], validationError: 'Please enter a 10-digit phone number', }, + restrictedFileName: { + mask: false, + match: /^[A-Za-z0-9\-_ \.]+$/, + unmask: [], + validationError: + 'File names can only contain the characters A-Z, 0-9, space, hyphen, underscore, and period.', + }, } diff --git a/load-test/locustfile.py b/load-test/locustfile.py index 15b89db6..4fe678bf 100644 --- a/load-test/locustfile.py +++ b/load-test/locustfile.py @@ -15,7 +15,7 @@ PASSWORD = os.getenv("ATAT_BA_PASSWORD", "") DISABLE_VERIFY = os.getenv("DISABLE_VERIFY", "true").lower() == "true" # Alpha numerics for random entity names -LETTERS = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890" #pragma: allowlist secret +LETTERS = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890" # pragma: allowlist secret NEW_PORTFOLIO_CHANCE = 10 NEW_APPLICATION_CHANCE = 10 @@ -29,10 +29,6 @@ def logout(l): l.client.get("/logout") -def get_index(l): - l.client.get("/") - - def get_csrf_token(response): d = pq(response.text) return d("#csrf_token").val() @@ -52,14 +48,9 @@ def extract_id(path): def get_portfolios(l): - response = l.client.get("/portfolios") + response = l.client.get("/home") d = pq(response.text) - portfolio_links = [ - p.attr("href") - for p in d( - ".global-panel-container .atat-table tbody tr td:first-child a" - ).items() - ] + portfolio_links = [p.attr("href") for p in d(".sidenav__link").items()] force_new_portfolio = randrange(0, 100) < NEW_PORTFOLIO_CHANCE if len(portfolio_links) == 0 or force_new_portfolio: portfolio_links += [create_portfolio(l)] @@ -73,7 +64,7 @@ def get_portfolio(l): d = pq(response.text) application_links = [ p.attr("href") - for p in d(".application-list .accordion__actions a:first-child").items() + for p in d(".portfolio-applications .accordion__header-text a").items() ] if len(application_links) > 0: portfolio_id = extract_id(portfolio_link) @@ -161,18 +152,14 @@ class UserBehavior(TaskSequence): login(self) @seq_task(1) - def home(l): - get_index(l) - - @seq_task(2) def portfolios(l): get_portfolios(l) - @seq_task(3) + @seq_task(2) def pick_a_portfolio(l): get_portfolio(l) - @seq_task(4) + @seq_task(3) def pick_an_app(l): get_app(l) @@ -189,4 +176,3 @@ class WebsiteUser(HttpLocust): if __name__ == "__main__": # if run as the main file, will spin up a single locust WebsiteUser().run() - diff --git a/script/include/helper_functions.inc.sh b/script/include/helper_functions.inc.sh index 0df1323a..9f5de990 100644 --- a/script/include/helper_functions.inc.sh +++ b/script/include/helper_functions.inc.sh @@ -40,9 +40,7 @@ reset_db() { local database_name="${1}" # If the DB exists, drop it - set +e - dropdb "${database_name}" - set -e + dropdb --if-exists "${database_name}" # Create a fresh DB createdb "${database_name}" diff --git a/script/include/setup_functions.inc.sh b/script/include/setup_functions.inc.sh index 92c5dfa5..97ab9e4b 100644 --- a/script/include/setup_functions.inc.sh +++ b/script/include/setup_functions.inc.sh @@ -22,7 +22,7 @@ check_for_existing_virtual_environment() { local target_python_version_regex="^Python ${python_version}" # Check for existing venv, and if one exists, save the Python version string - existing_venv_version=$($(pipenv --py) --version) + existing_venv_version=$($(pipenv --py 2> /dev/null) --version 2> /dev/null) if [ "$?" = "0" ]; then # Existing venv; see if the Python version matches if [[ "${existing_venv_version}" =~ ${target_python_version_regex} ]]; then diff --git a/script/minikube_setup b/script/minikube_setup deleted file mode 100755 index 6a1e9760..00000000 --- a/script/minikube_setup +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/bash - -# script/minikube_setup: Set up local AT-AT cluster on Minikube - -source "$(dirname "${0}")"/../script/include/global_header.inc.sh - -output_divider "Start Minikube" -minikube start - -output_divider "Use Minikube Docker environment" -eval $(minikube docker-env) - -output_divider "Build AT-AT Docker image for Minikube registry" -docker build . -t atat:latest - -output_divider "Pull images for AT-AT cluster" -docker pull redis:5.0-alpine -docker pull postgres:11-alpine -docker pull nginx:alpine - -output_divider "Apply AT-AT Kubernetes config to Minikube cluster" -kubectl --context=minikube create namespace atat -kubectl --context=minikube apply -f deploy/minikube/ - -output_divider "Create database and apply migrations" -# wait for the datastore deployment to become available -kubectl --context=minikube -n atat wait --for=condition=Available deployment/datastores -# postgres isn't necessarily running as soon as the pod is available, so wait a few -sleep 3 -DB_POD=$(kubectl --context=minikube -n atat get pods -l app=db-cache -o custom-columns=NAME:.metadata.name --no-headers | sed -n 1p) -ATST_POD=$(kubectl --context=minikube -n atat get pods -l app=atst -o custom-columns=NAME:.metadata.name --no-headers | sed -n 1p) -kubectl --context=minikube -n atat exec -it $DB_POD -c postgres -- createdb -U postgres atat -kubectl --context=minikube -n atat exec -it $ATST_POD -c atst -- .venv/bin/python .venv/bin/alembic upgrade head diff --git a/script/setup b/script/setup index 2e2dbcc6..a79c7be4 100755 --- a/script/setup +++ b/script/setup @@ -6,7 +6,7 @@ source "$(dirname "${0}")"/../script/include/global_header.inc.sh # create upload directory for app -mkdir uploads | true +mkdir -p uploads # Enable database resetting RESET_DB="true" diff --git a/styles/atat.scss b/styles/atat.scss index 0134dd89..72c7af40 100644 --- a/styles/atat.scss +++ b/styles/atat.scss @@ -39,6 +39,7 @@ @import "components/sticky_cta.scss"; @import "components/error_page.scss"; @import "components/member_form.scss"; +@import "components/toggle_menu.scss"; @import "sections/login"; @import "sections/home"; diff --git a/styles/components/_accordion_table.scss b/styles/components/_accordion_table.scss index 9a32c009..67e6fb0a 100644 --- a/styles/components/_accordion_table.scss +++ b/styles/components/_accordion_table.scss @@ -106,7 +106,7 @@ &__expanded { font-size: $small-font-size; font-weight: $font-normal; - background-color: $color-gray-lightest; + background-color: $color-offwhite; padding: $gap; &:last-child { diff --git a/styles/components/_portfolio_layout.scss b/styles/components/_portfolio_layout.scss index fffc468f..d01c1427 100644 --- a/styles/components/_portfolio_layout.scss +++ b/styles/components/_portfolio_layout.scss @@ -130,10 +130,6 @@ &--th { width: 50%; } - - &--td { - position: relative; - } } .row { @@ -154,55 +150,6 @@ margin-right: $gap * 6; } } - - .app-member-menu { - position: absolute; - top: $gap; - right: $gap * 2; - - .accordion-table__item__toggler { - padding: $gap / 3; - border: 1px solid $color-gray-lighter; - border-radius: 3px; - cursor: pointer; - - &:hover, - &--active { - background-color: $color-aqua-lightest; - } - - .icon { - margin: $gap / 2; - } - } - - &__toggle { - position: absolute; - right: 0; - top: 30px; - background-color: $color-white; - border: 1px solid $color-gray-light; - z-index: 1; - margin-top: 0; - - a { - display: block; - padding: $gap; - border-bottom: 1px solid $color-gray-lighter; - text-decoration: none; - color: $color-black; - cursor: pointer; - - &:last-child { - border-bottom: 0; - } - - &:hover { - background-color: $color-aqua-lightest; - } - } - } - } } #add-new-env { @@ -275,14 +222,21 @@ span.accordion-table__item__toggler { font-weight: $font-normal; + text-decoration: underline; + font-size: $small-font-size; &.environment-list__item__members { float: unset; - font-size: $small-font-size; + margin-left: -$gap; } } } + li.environment-list__edit { + border: 1px solid $color-gray-lighter; + padding: 0 $gap * 3 $gap * 2; + } + .activity-log { border-top: 3px solid $color-blue; diff --git a/styles/components/_toggle_menu.scss b/styles/components/_toggle_menu.scss new file mode 100644 index 00000000..b99bd75b --- /dev/null +++ b/styles/components/_toggle_menu.scss @@ -0,0 +1,58 @@ +.toggle-menu { + position: absolute; + top: $gap; + right: $gap * 2; + + &__container { + position: relative; + } + + .accordion-table__item__toggler { + padding: $gap / 3; + border: 1px solid $color-gray-lighter; + border-radius: 3px; + cursor: pointer; + + &:hover, + &--active { + background-color: $color-aqua-lightest; + } + + .icon { + margin: $gap / 2; + } + } + + &__toggle { + position: absolute; + right: 0; + top: 30px; + background-color: $color-white; + border: 1px solid $color-gray-light; + z-index: 1; + margin-top: 0; + + a { + display: block; + padding: $gap; + border-bottom: 1px solid $color-gray-lighter; + text-decoration: none; + color: $color-black; + cursor: pointer; + white-space: nowrap; + + &:last-child { + border-bottom: 0; + } + + &:hover { + background-color: $color-aqua-lightest; + } + + &.disabled { + color: $color-gray; + pointer-events: none; + } + } + } +} diff --git a/styles/components/_topbar.scss b/styles/components/_topbar.scss index 1f5db0ff..a64a1344 100644 --- a/styles/components/_topbar.scss +++ b/styles/components/_topbar.scss @@ -12,10 +12,13 @@ flex-direction: row; align-items: stretch; justify-content: space-between; + + a { + color: $color-white; + } } &__link { - color: $color-white !important; display: inline-flex; align-items: center; height: $topbar-height; @@ -23,20 +26,28 @@ text-decoration: none; &-label { - @include h5; - text-decoration: underline; - padding-left: $gap; + font-size: $h5-font-size; + font-weight: $font-semibold; text-decoration: none; } &-icon { - margin-left: $gap; - + margin: 0 $gap 0 0; @include icon-color($color-white); } + .icon--logout { + margin: 0 0 0 $gap; + } + &--home { - padding-left: $gap / 2; + padding: 0 ($gap * 2); + + .topbar__link-label { + font-size: $base-font-size; + font-weight: $font-bold; + text-transform: uppercase; + } } &:hover { diff --git a/styles/core/_variables.scss b/styles/core/_variables.scss index 44fc53c8..122739c4 100644 --- a/styles/core/_variables.scss +++ b/styles/core/_variables.scss @@ -33,7 +33,7 @@ $title-font-size: 5.2rem; $h1-font-size: 4rem; $h2-font-size: 3rem; $h3-font-size: 2.3rem; -$h4-font-size: 1.7rem; +$h4-font-size: 1.9rem; $h5-font-size: 1.5rem; $h6-font-size: 1.3rem; $base-line-height: 1.5; @@ -44,6 +44,7 @@ $font-sans: "Source Sans Pro", sans-serif; $font-serif: "Merriweather", serif; $font-normal: 400; +$font-semibold: 600; $font-bold: 700; // Color diff --git a/styles/elements/_inputs.scss b/styles/elements/_inputs.scss index a5040e41..195d0a2b 100644 --- a/styles/elements/_inputs.scss +++ b/styles/elements/_inputs.scss @@ -230,6 +230,8 @@ &--anything, &--portfolioName, &--requiredField, + &--defaultStringField, + &--defaultTextAreaField, &--taskOrderNumber, &--email { input { diff --git a/templates/applications/fragments/add_new_environment.html b/templates/applications/fragments/add_new_environment.html index 9cbc507a..9947a854 100644 --- a/templates/applications/fragments/add_new_environment.html +++ b/templates/applications/fragments/add_new_environment.html @@ -13,7 +13,7 @@ ) }}
{{ "portfolios.applications.enter_env_name" | translate }}
- {{ TextInput(new_env_form.name, label="", validation="requiredField", optional=False) }} + {{ TextInput(new_env_form.name, label="", validation="defaultStringField", optional=False) }}
{{ SaveButton(text=('common.save' | translate), element="input", form="add-new-env") }} diff --git a/templates/applications/fragments/environments.html b/templates/applications/fragments/environments.html index 9e9a3ef8..fa4e5959 100644 --- a/templates/applications/fragments/environments.html +++ b/templates/applications/fragments/environments.html @@ -17,7 +17,7 @@ {% if 0 == environments_obj | length -%}

- This Application has no environments + {{ 'portfolios.applications.environments.blank_slate' | translate }}

{% else %} @@ -31,8 +31,23 @@
- {{ env['name'] }} + + {{ env['name'] }} {{ Icon('link', classes='icon--medium icon--primary') }} + + {% if user_can(permissions.EDIT_ENVIRONMENT) -%} + {{ + ToggleButton( + open_html="common.edit"|translate, + close_html="common.close"|translate, + section_name="edit" + ) + }} + {%- endif %} +
{% set members_button = "portfolios.applications.member_count" | translate({'count': env['member_count']}) %} {{ ToggleButton( @@ -42,23 +57,9 @@ classes="environment-list__item__members" ) }} - {% if user_can(permissions.EDIT_ENVIRONMENT) -%} - {% set edit_environment_button = "Edit" %} - {{ - ToggleButton( - open_html=edit_environment_button, - close_html=edit_environment_button, - section_name="edit" - ) - }} - {%- endif %}
{% if env['pending'] -%} {{ Label(type="changes_pending", classes='label--below')}} - {% else %} - - {{ "portfolios.applications.csp_link" | translate }} {{ Icon('link', classes="icon--tiny") }} - {%- endif %}
@@ -66,7 +67,7 @@ {% call ToggleSection(section_name="members") %}
    {% for member in env['members'] %} - {% set status = ": Access Suspended" if member['status'] == 'disabled' %} + {% set status = "portfolios.applications.environments.disabled"|translate if member['status'] == 'disabled' %}
  • {{ member['user_name'] }}{{ status }}
  • @@ -77,16 +78,28 @@ {% if user_can(permissions.EDIT_ENVIRONMENT) -%} {% call ToggleSection(section_name="edit") %}
      -
    • +
    • -
      + {{ edit_form.csrf_token }} - {{ TextInput(edit_form.name, validation='requiredField', optional=False) }} - {{ - SaveButton( - text=("common.save" | translate) - ) - }} + {{ TextInput(edit_form.name, validation='defaultStringField', optional=False) }} +
      + {{ + SaveButton( + text=("common.save_changes" | translate) + ) + }} +
      +
    • diff --git a/templates/applications/fragments/member_form_fields.html b/templates/applications/fragments/member_form_fields.html index 707653fa..dd91dd5d 100644 --- a/templates/applications/fragments/member_form_fields.html +++ b/templates/applications/fragments/member_form_fields.html @@ -21,7 +21,7 @@ {{ sub_form.environment_name.data }}
- {{ role }} + {{ "portfolios.applications.members.roles.{}".format(role) | translate }}
@@ -89,16 +89,13 @@ {% if new %} {% set team_mgmt = form.perms_team_mgmt.name %} {% set env_mgmt = form.perms_env_mgmt.name %} - {% set del_env = form.perms_del_env.name %} {% else %} {% set team_mgmt = "perms_team_mgmt-{}".format(member_role_id) %} {% set env_mgmt = "perms_env_mgmt-{}".format(member_role_id) %} - {% set del_env = "perms_del_env-{}".format(member_role_id) %} {% endif %} {{ CheckboxInput(form.perms_team_mgmt, classes="input__inline-fields", key=team_mgmt, id=team_mgmt, optional=True) }} {{ CheckboxInput(form.perms_env_mgmt, classes="input__inline-fields", key=env_mgmt, id=env_mgmt, optional=True) }} - {{ CheckboxInput(form.perms_del_env, classes="input__inline-fields", key=del_env, id=del_env, optional=True) }}

@@ -119,11 +116,11 @@ {% macro InfoFields(member_form) %} {% endmacro %} diff --git a/templates/applications/fragments/members.html b/templates/applications/fragments/members.html index d6fb7290..5cae077f 100644 --- a/templates/applications/fragments/members.html +++ b/templates/applications/fragments/members.html @@ -5,6 +5,7 @@ {% from "components/modal.html" import Modal %} {% from "components/multi_step_modal_form.html" import MultiStepModalForm %} {% from "components/save_button.html" import SaveButton %} +{% from "components/toggle_menu.html" import ToggleMenu %} {% macro MemberManagementTemplate( application, @@ -38,16 +39,17 @@ {% call Modal(modal_name, classes="form-content--app-mem") %} {% endcall %} @@ -57,16 +59,17 @@ {% call Modal(resend_invite_modal, classes="form-content--app-mem") %}
{{ member.update_invite_form.csrf_token }} - {{ member_fields.InfoFields(member.update_invite_form) }} -
- {{ SaveButton(text="Resend Invite")}} - {{ "common.cancel" | translate }} -
+ {{ member_form.SubmitStep( + name=resend_invite_modal, + form=member_fields.InfoFields(member.update_invite_form), + submit_text="Resend Invite", + previous=False, + modal=resend_invite_modal, + ) }}
{% endcall %} @@ -119,7 +122,7 @@
{% endfor %} - + {% for env in member.environment_roles %}
@@ -131,32 +134,21 @@
{% endfor %} {% if user_can(permissions.EDIT_APPLICATION_MEMBER) -%} - -
- - {{ Icon('ellipsis')}} - - - {{ Icon('ellipsis')}} - - -
- - {{ "portfolios.applications.members.menu.edit" | translate }} - - {% if invite_pending or invite_expired -%} - {% set revoke_invite_modal = "revoke_invite_{}".format(member.role_id) %} - {% set resend_invite_modal = "resend_invite-{}".format(member.role_id) %} - - {{ "portfolios.applications.members.menu.resend" | translate }} - - {% if user_can(permissions.DELETE_APPLICATION_MEMBER) -%} - {{ 'invites.revoke' | translate }} - {%- endif %} - {%- endif %} -
-
-
+ {% call ToggleMenu() %} + + {{ "portfolios.applications.members.menu.edit" | translate }} + + {% if invite_pending or invite_expired -%} + {% set revoke_invite_modal = "revoke_invite_{}".format(member.role_id) %} + {% set resend_invite_modal = "resend_invite-{}".format(member.role_id) %} + + {{ "portfolios.applications.members.menu.resend" | translate }} + + {% if user_can(permissions.DELETE_APPLICATION_MEMBER) -%} + {{ 'invites.revoke' | translate }} + {%- endif %} + {%- endif %} + {% endcall %} {%- endif %} @@ -187,7 +179,7 @@ member_form.SubmitStep( name=new_member_modal_name, form=member_fields.PermsFields(form=new_member_form, new=True), - submit_text="portfolios.applications.members.form.add_member"|translate, + submit_text="common.save_changes"|translate, modal=new_member_modal_name, ) ], diff --git a/templates/applications/new/step_1.html b/templates/applications/new/step_1.html index 8f115c22..d06ddee0 100644 --- a/templates/applications/new/step_1.html +++ b/templates/applications/new/step_1.html @@ -26,14 +26,14 @@ {{ form.csrf_token }}
- {{ TextInput(form.name, optional=False) }} + {{ TextInput(form.name, validation="name", optional=False) }} {{ ('portfolios.applications.new.step_1_form_help_text.name' | translate | safe) }}

- {{ TextInput(form.description, paragraph=True, optional=True) }} + {{ TextInput(form.description, validation="defaultTextAreaField", paragraph=True, optional=True) }} {{ ('portfolios.applications.new.step_1_form_help_text.description' | translate | safe) }}
diff --git a/templates/applications/new/step_3.html b/templates/applications/new/step_3.html index a4e1aa53..d88a704c 100644 --- a/templates/applications/new/step_3.html +++ b/templates/applications/new/step_3.html @@ -27,13 +27,13 @@ - Return to Application Settings + {{ "portfolios.applications.new.step_3_button_text" | translate }} - Previous + {{ "common.previous" | translate }} - Cancel + {{ "common.cancel" | translate }} diff --git a/templates/applications/settings.html b/templates/applications/settings.html index e10c5a50..2c641e27 100644 --- a/templates/applications/settings.html +++ b/templates/applications/settings.html @@ -22,8 +22,8 @@
{{ application_form.csrf_token }} - {{ TextInput(application_form.name, optional=False) }} - {{ TextInput(application_form.description, paragraph=True, optional=True, showOptional=False) }} + {{ TextInput(application_form.name, validation="name", optional=False) }} + {{ TextInput(application_form.description, validation="defaultTextAreaField", paragraph=True, optional=True, showOptional=False) }}
{{ SaveButton(text='common.save_changes'|translate) }}
diff --git a/templates/components/alert.html b/templates/components/alert.html index 49f148b9..78ffe717 100644 --- a/templates/components/alert.html +++ b/templates/components/alert.html @@ -25,7 +25,7 @@
{% if vue_template %} -

+

{% elif title %}

{{ title | safe }}

{% endif %} diff --git a/templates/components/clin_dollar_amount.html b/templates/components/clin_dollar_amount.html index c39d3ef6..43973cc3 100644 --- a/templates/components/clin_dollar_amount.html +++ b/templates/components/clin_dollar_amount.html @@ -57,7 +57,7 @@ {{ "forms.task_order.clin_funding_errors.obligated_amount_error" | translate }}